Screen one is coded straight off the hoop-chat-list frame: 72pt row pitch, 48pt avatar,
text edge and hairline both at 80, gutter 20. The other four are built from the same measurements and
the same tokens, so the set reads as one product rather than five screenshots. Every colour comes from
design system v1.2; nothing below hardcodes a green.
Three rules carry the whole set. Shape classifies before colour does. A circle is a person, a rounded square is a place with people in it, and an AI room keeps a ring inside the square. Volt is a fill, never a word, so the outgoing bubble is a tint and the one saturated green per screen is the thing you are meant to press. Nothing states meaning in colour alone: presence is a dot and a word, the agent is a ring and a label, the receipt is a tick and a time.
| role | px | wt | track | lead | colour |
|---|---|---|---|---|---|
| Header title | 18 | 700 | -0.2 | 25pxa | #141E20 text |
| Search placeholder | 14 | 400 | 0 | 20pxa | #596667 text-muted |
| Filter chip | 14 | 600 | 0 | 20pxa | #0F773D text-brand |
| Archived label | 16 | 400 | 0 | 23pxa | #3E4A4C text-secondary |
| Row · name | 16 | 600 | 0 | 23pxa | #141E20 text |
| Row · preview | 14 | 400 | -0.5 | 21.7px | #596667 text-muted |
| Row · time | 12 | 400 | 0 | 17pxa | #596667 text-muted |
| Unread badge | 12 | 600 | 0 | 17pxa | #FFFFFF text-on-fill |
| Nav badge | 10.5 | 700 | 0 | 15pxa | #010304 text-on-brand |
| element | height | pad t/r/b/l | gap | radius |
|---|---|---|---|---|
| Chat row | 74.7 min 72 | 12/20/12/20 | 12px | 0px |
| Avatar | 48 | 0/0/0/0 | — | 14px |
| Search field | 44 | 0/12/0/12 | 8px | 999px |
| Filter chip | 39 min 36 | 8/16/8/16 | 6px | 16px |
| Nav bar | 63 | 0/24/0/24 | — | 999px |
| Row pitch | 74 – 74.7 px · content-driven, above the min | |||
| Divider | 1px · #ECEFEE · inset 80px | |||
| Gutter | 20px | |||
a leading resolved from line-height:normal — the px value is
what a Flutter build must reproduce, because "normal" is not portable across engines.
Colour names are the design-system token each ink now resolves to; six inks cover the whole app.
| role | px | wt | track | lead | colour |
|---|---|---|---|---|---|
| Header name | 16 | 600 | 0 | 20px | #141E20 text |
| Header sub | 12 | 400 | 0 | 15px | #596667 text-muted |
| Sender name | 11 | 600 | 0 | 16pxa | #C4562E sender-colour |
| Bubble text | 14 | 400 | 0 | 20.3px | #141E20 text |
| Bubble time | 11 | 400 | 0 | 15.95px | #596667 text-muted |
| Day marker | 11 | 600 | 0 | 16pxa | #3E4A4C text-secondary |
| Composer placeholder | 14 | 400 | 0 | 20pxa | #596667 text-muted |
| element | height | pad t/r/b/l | gap | radius |
|---|---|---|---|---|
| Bubble | 82.5 | 10/14/10/14 | — | 16px |
| Turn | 82.5 | 0/0/0/0 | 8px | 0px |
| Thread pad | 711 | 14/14/4/14 | 8px | 0px |
| Composer field | 44 min 44 | 0/12/0/12 | 8px | 999px |
| Turn avatar | 34 | 0/0/0/0 | — | 10px |
| Row pitch | 90.5 – 265.9 px · taller rows carry a subtitle | |||
| Divider | — | |||
| Gutter | 20px | |||
a leading resolved from line-height:normal — the px value is
what a Flutter build must reproduce, because "normal" is not portable across engines.
Colour names are the design-system token each ink now resolves to; six inks cover the whole app.
| role | px | wt | track | lead | colour |
|---|---|---|---|---|---|
| Header title | 18 | 700 | -0.2 | 25pxa | #141E20 text |
| Section label | 12 | 600 | +0.1 | 17pxa | #3E4A4C text-secondary |
| Search placeholder | 14 | 400 | 0 | 20pxa | #596667 text-muted |
| Row · name | 16 | 600 | 0 | 23pxa | #141E20 text |
| Row · state | 12 | 400 | 0 | 17pxa | #596667 text-muted |
| Invite button | 12 | 600 | 0 | 17pxa | #010304 text-on-brand |
| element | height | pad t/r/b/l | gap | radius |
|---|---|---|---|---|
| Contact row | 67 min 64 | 11/14/11/14 | 12px | 0px |
| Avatar | 44 | 0/0/0/0 | — | 999px |
| Card | 536 | 0/0/0/0 | — | 20px |
| Search field | 44 | 0/12/0/12 | 8px | 999px |
| Row pitch | 67 px | |||
| Divider | 1px · #ECEFEE · inset 70px | |||
| Gutter | 20px | |||
a leading resolved from line-height:normal — the px value is
what a Flutter build must reproduce, because "normal" is not portable across engines.
Colour names are the design-system token each ink now resolves to; six inks cover the whole app.
8 friends · 36 reachable
Nothing here yet
Share your first post
New post| role | px | wt | track | lead | colour |
|---|---|---|---|---|---|
| Header title | 18 | 700 | -0.2 | 25pxa | #141E20 text |
| Profile name | 22 | 700 | -0.4 | 31pxa | #141E20 text |
| Profile sub | 14 | 400 | 0 | 20pxa | #596667 text-muted |
| Stat value | 18 | 700 | 0 | 25pxa | #141E20 text |
| Stat label | 12 | 400 | 0 | 17pxa | #596667 text-muted |
| Filter chip | 14 | 600 | 0 | 20pxa | #FFFFFF text-on-fill |
| Empty title | 16 | 600 | 0 | 23pxa | #141E20 text |
| Empty sub | 14 | 400 | 0 | 20pxa | #596667 text-muted |
| Primary CTA | 14 | 600 | 0 | 20pxa | #010304 text-on-brand |
| element | height | pad t/r/b/l | gap | radius |
|---|---|---|---|---|
| Identity block | 194 | 14/20/18/20 | 6px | 0px |
| Avatar | 88 | 0/0/0/0 | — | 999px |
| Stat card | 80 | 16/0/16/0 | — | 20px |
| Stat cell | 48 | 0/0/0/0 | 3px | 0px |
| Empty state | 377 | 40/20/90/20 | 6px | 0px |
| Row pitch | — | |||
| Divider | — | |||
| Gutter | 20px | |||
a leading resolved from line-height:normal — the px value is
what a Flutter build must reproduce, because "normal" is not portable across engines.
Colour names are the design-system token each ink now resolves to; six inks cover the whole app.
| role | px | wt | track | lead | colour |
|---|---|---|---|---|---|
| Header title | 18 | 700 | -0.2 | 25pxa | #141E20 text |
| Row · label | 16 | 400 | 0 | 23pxa | #141E20 text |
| Row · sub | 12 | 400 | 0 | 17pxa | #596667 text-muted |
| Row · value | 14 | 400 | 0 | 20pxa | #596667 text-muted |
| element | height | pad t/r/b/l | gap | radius |
|---|---|---|---|---|
| Setting row | 60 min 60 | 13/16/13/16 | 14px | 0px |
| Icon column | 21 | 0/0/0/0 | — | 0px |
| Card | 273 | 0/0/0/0 | — | 20px |
| Trailing avatar | 30 | 0/0/0/0 | — | 999px |
| Row pitch | 60 – 85 px · taller rows carry a subtitle | |||
| Divider | 1px · #ECEFEE · inset 51px | |||
| Gutter | 20px | |||
a leading resolved from line-height:normal — the px value is
what a Flutter build must reproduce, because "normal" is not portable across engines.
Colour names are the design-system token each ink now resolves to; six inks cover the whole app.