Design systemDraft
Tabs
Tabs switch between views of the same thing inside a detail pane: a session's Session, Terminal and Files; a teammate's Now, Inbox, Results, Notes and Setup; an agent's Watch and Files. They are not navigation between places (that is the rail and the phone pages). Drawn on "Session, phone and desktop", "Plan approval and modes, phone and desktop", "Agents place, teammates" and "Agents and their computers".
| Surface | Implementing file | Status |
|---|---|---|
| Deck | deck/css/deck.css .seg, deck/glass/index.js .gl-tabs (main); deck/css/views/memory.css .mem-tab | partial |
| App | none (work/mobile) | not built |
| Lumen | not used (the Mac Lumen has no detail pane) | not used |
Anatomy
Segmented tabs (desktop, and the phone with three or fewer tabs). The segmented control's
shape with tab semantics: container fill --hover, padding 2, gap 2, radius 8; tabs height 28,
padding 0 12, radius 6, base 13/18, --text-2. Selected: fill --panel, ink --text, weight
600, 1 px --rule-strong ring. Left aligned under the detail header, never full width on desktop.
Tab strip (phone, four or more tabs). A row 44 tall under the header, padding 0 16, gap 18,
bottom border 1 px --rule, scrolls sideways. Tabs base 13/18 --text-2; selected --text
weight 600 with a 2 px --text underline at the bottom edge.
Each tab: label, then an optional count as plain text ("Inbox 3"), or a status mark before the
label when something under it needs you (the 8 --beacon-dot) or is running (the ring).
Variants
| Set | Tabs | Where |
|---|---|---|
| Session | Session, Terminal, Files | Session detail, desktop and phone |
| Teammate | Now, Inbox, Results, Notes, Setup | Teammate detail (Agents place) |
| Agent computer | Watch, Files | Agent detail with a computer |
| Usage | Roster, Limits, Budget | Project settings |
Sizes
| Desktop | Phone | |
|---|---|---|
| Segmented | 28 tabs, 32 overall | full width, tabs share it equally, 40 tabs, 44 overall |
| Strip | not used | 44 row |
States
- Default. Ink
--text-2. - Hover (pointer). Ink
--text. - Selected. As above; exactly one.
- Focus. 2 px outline
--focus, offset 2 (inside the strip: offset -2). - Needs you. The beacon dot before the label, even when not selected.
- Disabled (a view not available, e.g. Terminal with no pty). Ink
--label, not focusable; the pane says why if chosen from a link. - Loading. The tab switches at once; the pane shows its skeleton rows, never a spinner over the tabs.
Keyboard and touch
- Tab moves into the tablist, landing on the selected tab. ← → move and select (automatic activation); Home and End jump to the ends.
- Phone: tap. No swipe between tabs; horizontal swipes belong to the phone's pages. The key bar shows only in Terminal.
- The selected tab is remembered per item and restored when the item reopens.
Motion
The selected fill moves instantly; the pane content swaps with no slide. The strip scrolls the
selected tab into view over --motion-panel. Reduced motion: instant.
Copy
One or two words, sentence case, nouns: "Session", "Terminal", "Files", "Inbox 3". Counts are plain numbers after the word. Never icons alone, never caps.
Accessibility
role="tablist"witharia-label("Session views"); tabsrole="tab"witharia-selectedandaria-controls; panesrole="tabpanel".- The count and mark join the name: "Inbox, 3", "Setup, needs you".
- Selected
--texton--paneland default--text-2on--hoverpass AA in both themes.
Gaps
- Deck: no Session, Terminal, Files tabs or teammate tabs;
.segis used witharia-pressedorrole="group"in places androle="tablist"only in Glass. - Deck:
.segdraws a--ruleborder, 26 tabs and--hoverfor the selected fill; use the--hovercontainer and the--panelselected tab. - Deck:
.mem-tabin Memory is a third tab style (34 tall, text only); fold into these two. - App: no tabs; build
Tabswith the segmented and strip forms. - System: the teammate phone strip is drawn 40 tall; this spec makes it 44.