Five screens, one language

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.

Tokens app design system v1.2 Identity visual identity v1.8 Reference Figma · UI Screen & Screenshot Brand green #26E463 Type Poppins Frame 430 × 932 Revision v2.4 · composer
Appearance
Chats
11:28 75

Chat

2
Search chats, people, groups
AllUnread GroupsChannels
Archived1
这是我们发现Bug的群11:28 AM
mike.ng: @NOVA 最近upload的app icon, ...2
T
TGC BUG ARMY · ALPHA10:57 AM
Jaster 第 1 条查清楚了,而且比「缩略图没做」...12
jeffchoongYesterday
good mike2
Li Min Chia 1491Friday
test share file from laptop directly
?
Music RoomThursday
Priya reacted to your track
G
GCallThursday
mike.ng started a call
C
ChenThursday
How are you?
Li Min Chia 1491Friday
test share file from laptop directly
The frame this file is measured from. 72pt rows, 48pt avatars, text edge at 80, hairline inset to match. Circle is a person, rounded square is a place with people in it.
Spec — Chats measured off the frame above

Type

rolepxwttrackleadcolour
Header title18700-0.225pxa#141E20 text
Search placeholder14400020pxa#596667 text-muted
Filter chip14600020pxa#0F773D text-brand
Archived label16400023pxa#3E4A4C text-secondary
Row · name16600023pxa#141E20 text
Row · preview14400-0.521.7px#596667 text-muted
Row · time12400017pxa#596667 text-muted
Unread badge12600017pxa#FFFFFF text-on-fill
Nav badge10.5700015pxa#010304 text-on-brand

Rows & spacing

elementheightpad t/r/b/lgapradius
Chat row74.7 min 7212/20/12/2012px0px
Avatar480/0/0/014px
Search field440/12/0/128px999px
Filter chip39 min 368/16/8/166px16px
Nav bar630/24/0/24999px
Row pitch74 – 74.7 px · content-driven, above the min
Divider1px · #ECEFEE · inset 80px
Gutter20px

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.

Chat
16:30 54
1 T TGC BUG ARMY · ALPHA(7) Tap here for group info
N 1
Today
Committed and pushed. Full measurement log is in CHANGELOG.md.15:59
C
CalvinSY
@Navi why are some of the game windows being affected? Can you analyse what the matter is for me and solve it later16:26
N
Navi agent
CalvinSY 收到,这个问题问得对。它不是某一个游戏的毛病,是一整类。

我先做两件事,然后给你一份能看的分析:
1) 先把喵图 v2 和 One Line v2 部署上去
2) 然后我去把 53 个游戏挨个扫一遍,告诉你哪些中招、为什么中招

大概十几分钟。分析我会写成「你以后自己也能照着查」的样子。16:27
Testing purpose only, don't reply to my message 16:28
Message
The only screen that drops the mint canvas. Outgoing bubbles use the corrected tint gradient, never a Volt fill. The composer is a row of outline icons - attach, camera, mic - so the resting thread has no saturated green at all; the green arrives with intent, when the mic turns into the send key.
Spec — Chat thread measured off the frame above

Type

rolepxwttrackleadcolour
Header name16600020px#141E20 text
Header sub12400015px#596667 text-muted
Sender name11600016pxa#C4562E sender-colour
Bubble text14400020.3px#141E20 text
Bubble time11400015.95px#596667 text-muted
Day marker11600016pxa#3E4A4C text-secondary
Composer placeholder14400020pxa#596667 text-muted

Rows & spacing

elementheightpad t/r/b/lgapradius
Bubble82.510/14/10/1416px
Turn82.50/0/0/08px0px
Thread pad71114/14/4/148px0px
Composer field44 min 440/12/0/128px999px
Turn avatar340/0/0/010px
Row pitch90.5 – 265.9 px · taller rows carry a subtitle
Divider
Gutter20px

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.

Contacts
16:29 55

Contacts

Search friends / contacts
All
Friends (8)
Jaster Offline
J Jen Yng Tan Offline
Li Min Chia 1491 Online
T Tash Offline
B bruce.kong Offline
C chen Offline
1 jeffchoong Online
雷霆大脚 Offline
Invite to HOOP (343)
+ +60 16 360 6029 In your phone book Invite
Grouped cards on the mint canvas. Presence is a dot plus a word, never colour alone, so it survives greyscale and colour-blindness.
Spec — Contacts measured off the frame above

Type

rolepxwttrackleadcolour
Header title18700-0.225pxa#141E20 text
Section label12600+0.117pxa#3E4A4C text-secondary
Search placeholder14400020pxa#596667 text-muted
Row · name16600023pxa#141E20 text
Row · state12400017pxa#596667 text-muted
Invite button12600017pxa#010304 text-on-brand

Rows & spacing

elementheightpad t/r/b/lgapradius
Contact row67 min 6411/14/11/1412px0px
Avatar440/0/0/0999px
Card5360/0/0/020px
Search field440/12/0/128px999px
Row pitch67 px
Divider1px · #ECEFEE · inset 70px
Gutter20px

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.

Me
16:29 55

Me

mike.ng

8 friends · 36 reachable

0Posts
0Following
0Followers
All Private Friends Diary

Nothing here yet

Share your first post

New post
Same grouped language, one screen up the hierarchy. The empty state carries an action instead of only an apology.
Spec — Me measured off the frame above

Type

rolepxwttrackleadcolour
Header title18700-0.225pxa#141E20 text
Profile name22700-0.431pxa#141E20 text
Profile sub14400020pxa#596667 text-muted
Stat value18700025pxa#141E20 text
Stat label12400017pxa#596667 text-muted
Filter chip14600020pxa#FFFFFF text-on-fill
Empty title16600023pxa#141E20 text
Empty sub14400020pxa#596667 text-muted
Primary CTA14600020pxa#010304 text-on-brand

Rows & spacing

elementheightpad t/r/b/lgapradius
Identity block19414/20/18/206px0px
Avatar880/0/0/0999px
Stat card8016/0/16/020px
Stat cell480/0/0/03px0px
Empty state37740/20/90/206px0px
Row pitch
Divider
Gutter20px

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.

Personal Center
16:29 55

Personal Center

Avatar
Nicknamemike.ng
UsernameNot set
BioNot set
PersonasDifferent circles see a different you
Starred messages 0
My Games
Game CenterMini games · circle leaderboards
Developer CenterBuild a game, plug into HOOP
Virtual AvatarCreate your game-world character
HOOP AvatarAvatar · Beta
Contribution WallYour rooms, in one grid
A sub-page, so it loses the nav bar and gains a back affordance. Three cards group eleven rows by what they are for, not by what they look like.
Spec — Personal Center measured off the frame above

Type

rolepxwttrackleadcolour
Header title18700-0.225pxa#141E20 text
Row · label16400023pxa#141E20 text
Row · sub12400017pxa#596667 text-muted
Row · value14400020pxa#596667 text-muted

Rows & spacing

elementheightpad t/r/b/lgapradius
Setting row60 min 6013/16/13/1614px0px
Icon column210/0/0/00px
Card2730/0/0/020px
Trailing avatar300/0/0/0999px
Row pitch60 – 85 px · taller rows carry a subtitle
Divider1px · #ECEFEE · inset 51px
Gutter20px

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.