Design systemDraft
Composer
The input at the foot of every session. Typing while the agent works steers it; ⌥⏎ queues for after the turn; Esc stops; Esc Esc rewinds; ⇧Tab cycles the mode. Drawn on "Session · the composer, like Claude Code", "Session, phone and desktop" and "Plan approval and modes".
| Surface | Implementing file | Status |
|---|---|---|
| Deck | deck/chat/composer.js, deck/chat/core/composer-state.js, deck/chat/tray.js, deck/chat/pickers.js (work/chat) | partial |
| App | apps/app/src/session/Composer.tsx (work/mobile) | partial |
| Lumen | local/capsule/native/Sources/UI/CapsuleView.swift bar, Extensions/sight/SessionPanel.swift prompt (work/capsule-pro) | partial |
Anatomy
Above the box, bottom up, gap 8: the queued row, the background task pill, and on the
phone the todos pill. Then the box: --panel, 1 px --rule-strong, radius 12.
- Input: padding 12 14 4, read size, min height 40 (phone 44), grows to 8 lines then scrolls.
Placeholder
--label: idle "Reply to kit, @ to mention, / for commands"; running "Steer kit, or ⌥⏎ to queue for after". Caret 1.5 wide in--focus. - Bar, padding 6 8 8, gap 4, left to right: Attach (plus, icon chip 28), provider chip
("Claude · opus", chev-d), vault chip (tag, vault icon, "vault: northwind orders", when a grant
is live), spacer, mode chip ("Asks first" with "⇧Tab" in
--label; see mode-chip), Dictate (mic, 28), then StopEsc(secondary, 28, stop icon; only while running) and Send (send icon, 28;--hoverfill with--textwhile running, where it steers;--primary-bgwhen idle with text). - Queued row: 1 px
--rule, radius 8, padding 4 4 4 12: clock icon, "Queued for after" (meta--label), the text (--text-2, ellipsis), then Edit and Take back (ghost 28) and Steer now (outline 28). Editable or taken back until the turn ends. - Background task pill: height 32, radius 16, 1 px
--rule: terminal icon, "1 background task" (meta 600), "npm run dev · 4m" (mono 12--text-2), View output (ghost 24), Stop (outline 24). ⌃B opens the list: one row per task, run dot or done dot, mono command, "running · 4m" or "exit 0 · 2m ago", View output, Stop. - Todos pill (phone): 44 tall, radius 22,
--panel, 1 px--rule: todo icon, "Todos 3 of 5" (base 600), the running ring, the current item (--text-2), chev-d. Opens the list as a sheet. On the desktop the todos live in the side panel instead.
Variants: the first character
| Prefix | Mode | What shows |
|---|---|---|
/ | Commands and skills | A popover above the box: groups "Built in", the project, "Plugins and skills"; rows 28, command mono 13 (116 wide) and description; footer "Type to filter · ↑↓ move · ⏎ run · Tab complete · Esc close" |
@ (anywhere) | Files | "Files in harlow-legal · recent first", rows 30, file icon, path mono 13 with the match in 600, "edited 2m"; ⏎ inserts a quoted path chip (tag, mono) |
! | Shell | Input turns mono; the bar shows a "Shell" tag and the folder in mono 12; "⏎ run · Esc leave shell"; output lands as a tool row |
# | Memory | A "Memory" tag; ⏎ opens "Save this to": This project (Harlow Legal only) or About you (every project and chat); then "Saved to memory · Harlow Legal" with Undo |
⌘V pastes an image: a 56 thumbnail row above the input with name, "PNG · 1170 x 2532" and Remove (44 on the phone). ↑ in an empty box recalls your last message ("Recalled from 14:32 · ↑ again for older · Esc clears"), or the newest queued message to edit.
Sizes
Desktop chips and buttons 28. Phone: Attach, Stop and Send are 44 circles (radius 22); Stop on
--hover, Send (steer) on --primary-bg with --primary-ink; the mode chip is 44 tall. Input
text never under 16 on the phone (read 17).
States
- Idle, empty: Send disabled (label ink, no fill). Idle, text: Send primary.
- Running: Stop shows; ⏎ steers. On send the transcript draws "steering · kit reads it at its next step" at once; thread.steered confirms it (see turn).
- Queue (⌥⏎, or a long press on the phone's Send, which opens "Steer now · kit reads it at its next step" and "Queue for after · Waits for this turn to end"): the queued row appears.
- Stopping (Esc): open asks for that turn close; the turn ends "Stopped by you".
- Rewind (Esc Esc on an empty box): a popover "Rewind to an earlier message", your messages
newest first with "14:32 · 3 file changes after this"; "Also undo file changes" checkbox ("3
files go back to 14:32"; needs File checkpoints on, else disabled with "Needs File checkpoints on
(Settings, Sessions)"). The action is Rewind (secondary); with the checkbox it becomes the hold
button "Rewind and undo 3 files" (0.6 s). Cancel
Esc. The text comes back: "Prefilled from 14:32". - Mode change (⇧Tab): the chip changes in place; Plan first, Asks first, Edits allowed, Doesn't ask. Only the person switches into Doesn't ask; its chip is the inverse neutral chip.
- Plan waiting: on the phone the composer tucks away until the plan is answered.
- Offline: sends go to the outbox; the send stays drawn with "Sends when back online".
Keyboard and touch
Esc stop · Esc Esc rewind · ⇧Tab next mode · ⏎ send or steer · ⌥⏎ queue · ⇧⏎ new line · ↑ recall · ⌃B background tasks · ⌘V paste image · / @ ! #. On a touch keyboard Return is a new line and Send sends; hold Send to queue. The composer moves with the keyboard by transform in the same frame.
Motion
Popovers open at --motion-tap (120) from 4 px below; the hold fill runs --motion-hold (600).
Steer, queue and memory saves draw on send and confirm in place. Menus filter from a cached index
on the next frame.
Copy
As quoted above. Never "Accepts edits", "Plan mode", "bypass" in the chip; never "Submit".
Accessibility
Input aria-label="Message kit"; Stop "Stop kit (Esc)"; Send "Steer kit (Return)" while running,
"Steer kit, hold to queue for after" on the phone. Popovers are listbox with aria-activedescendant.
Gaps
Deck (work/chat)
- No Attach, vault chip or Dictate; placeholder "Steer kit, or Alt+Enter to queue for after".
- Mode labels "Accepts edits" and "Plan mode"; ⇧Tab walks three modes and never Doesn't ask.
- Rewind offers three restores; spec: one list, the "Also undo file changes" checkbox, the hold.
- Todos pinned above the composer on the desktop; spec: side panel.
- Stop is ghost; spec: secondary.
App (work/mobile)
- Text only: no chips, attach, prefixes, queued row, pills or rewind; input 16 not 17.
Lumen (work/capsule-pro)
- Plain field; no steer, queue, Stop, modes or prefixes.