#336 Design-system foundation and card anatomy
rubas/inbox#336 · epics #143, #144 · head 11e583b feat/ui-foundation-cards (captures predate it; body read at 70ba250) · base 667d217
- Search pill below 840 px no longer sits half off screen (bug on
main). - New tokens for the focus ring, the search pill geometry, and the spread rise.
- The pointer cursor now covers checkboxes, radios, and their labels. The local
cursor-pointerfixes in six components are gone. - One
CountPillfor thread and pile counts, attext-meta. - One
LoginCodeunit for the Logins row and the reader. The reader usesRowPill. - Enter or Space on a control inside a row no longer opens the reader (bug on
main). - Reader Details shows Date and Message-ID.
- The Worker rejects avatar lookups for reserved domains with a 400.
DESIGN.mddocuments the tokens, the count pill,LoginCode, and the measured row heights.
Search pill at 390 px
main.Login panel in the reader at 390 px
main.RowPill buttons with a 16 px row gap. Chromium, 390 px, branch round 2.Reader Details at 1440 px
main.de-CH with weekday, seconds, and zone, then Message-ID. Chromium, 1440 px, cropped, branch round 2.Pile count pill at 390 px
text-micro, 19 by 15 px. Chromium, 390 px, main.CountPill at text-meta, 20 by 19 px; row height unchanged. Chromium, 390 px, branch round 2.#335 Shell, touch targets, and mobile chrome
rubas/inbox#335 · epics #145, #150 · head 390694d feat/ui-shell-mobile · base 8cfa3fd
- 44 px hits on the tabs, More, the wordmark, the top-bar icons, select-all, the address filters, and the composer controls. The visuals keep their size.
- Folder menu rows are 44 px tall, and the panel opens below the trigger pill.
viewport-fit=coverandsafe-area-inset-*on the top bar, gutters, agent drawer, and composer footer.interactive-widget=resizes-content. The composer scrolls with a sticky footer, so Send stays above the keyboard.- Open sign-in link asks first when the link's site differs from the sender's, or sender authentication failed. It uses a modal
<dialog>, notconfirm(). theme-colorand the manifest use theheaderandpagetokens.client/DESIGN.mdrecords the hits, safe area, keyboard, PWA colors, and the link confirm.
The list screens show no visual change, by design. The hit areas grow, and the visuals keep their size. The before and after list captures also use different seed data, so the page leaves them out. The two screens below are new.
#333 Keyboard, accessibility, and realtime
rubas/inbox#333 · epics #148, #149 · head 5f9092d feat/ui-keyboard-realtime · base 8cfa3fd
- One key table,
client/src/lib/keymap.ts, drives dispatch and help. ?opens a shortcut map as a native modal<dialog>. The palette lists it too.- The map names
#per folder: Delete forever, Discard draft, or Move to Trash. - After archive, spam, Trash, bulk actions, and undo, focus follows the cursor row.
- On landing, the first Imbox row takes cursor and focus.
- Closing the composer returns focus to its opener or to the cursor row.
- One polite announcer reads toasts, the selection count, new mail, and stream health. Each modal carries its own region.
- The replay buffer drops removed rows, applies patches, and empties on
reset. Rows a reset adds get the arrival wash. docs/realtime.md,client/DESIGN.md, andclient/WRITING.mdupdated.
Landing at 1440 px
main.Shortcut map
#334 Compose recovery, copy, and empty states
rubas/inbox#334 · epics #146, #151 · head 42b6dc1 feat/ui-compose-copy · base 667d217
- A failed send shows copy for its cause (429, 400, server, no response), never the server payload, with Send again beside it.
- A failed autosave shows Try save again in the header.
flush()retries it. - Close after a failed save asks first and focuses Close anyway.
- A save that fails after close raises a toast. The local copy stays and a reopen restores it.
- Attachment failures use fixed copy, not the
FileReadererror text. - Fields, editor, attachments, and notices scroll in one lane between a fixed header and footer. The editor floor is 96 px.
- Empty states name the next step. Imbox search names its scope; an empty search drops the 0-count heading.
- Star, read, unsubscribe, and discard failure toasts get exact verbs and a spaced hyphen instead of an em dash.
Failed send at 1440 px
main.Empty search at 1440 px
main.Short viewport, 390 by 500 px
#332 Search paging, scope, failure states, and recipient role
rubas/inbox#332 · epics #152, #147 (both stay open) · head 14deedb feat/ui-search-stack · base 667d217
search()pages by server offset and returns the mailbox-widetotalCount. The Worker takesoffset.- A row that leaves through Archive, Spam, or Trash hides with its conversation. Paging does not skip a match.
- The Results heading shows the full match count and the scope.
- Show more results fetches the next page. Before, search stopped at 50 hits per mailbox without a sign.
- A failed mailbox gets a notice with Try again. The other mailboxes' rows stay.
- A pending search shows a three-row skeleton, pulsing only under
motion-safe. - Loaded rows take their server rank.
- Bug fix: an archived loaded result now leaves the list.
- Collapsed thread rows show the recipient role:
to you,cc you, orto Alice Meier +1. - The compact
AccentPillhas a 44 px hit. scripts/dev-seedadds a sender pile and a Cc reply.
Results heading at 1440 px
main.The round-2 capture after2-1440.png shows a later state (9 results left after a bulk Trash). The page uses round 1 for this pair.
Recipient role at 1440 px
main.to you after the sender. Chromium, 1440 px, cropped, branch round 1.New result states at 1440 px
Open in the PRs
| Where | What remains | Why | Needs |
|---|---|---|---|
| #336 | The count pill loses its fill on a hovered row. | The row hover fill and the pill wash have the same lightness. This already happens on main. | A decision from Dominic |
| #335 | Restore actions in the folder reader (#145). | DESIGN.md says star only; adding more changes the reader contract. | A decision from Dominic, or the reader work |
| #334 | The bulk bar keeps the short Spam label. | "Mark as spam" does not fit the one-line bar at 402 px. | A decision from Dominic |
| #332 | Server search in Feed, Logins, and folder views. | Those rows act through the folder store and need their own mutation path. It would double the PR. | A follow-up PR |
| #332 | Every inbound conversation shows as two rows. | In workers/index.ts the root gets its own UUID as thread_id, and replies get the root's Message-ID. | A separate PR on receiveEmail |
No PR was tested in a real Safari, in Firefox for #336, on iOS, or with a screen reader. The client has no dark theme, so every capture is light only.