Lane 0, third PR: the design system's shell — app bar, Contents, footer, live bar, banners, account menu, bell, search (#364) #741
Loading…
Reference in a new issue
No description provided.
Delete branch "build/lane0-shell"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Lane 0's third and last PR: the shell. Thirty-five components and 160 states on
/designnow, each with a test (1,127 in all). Nothing in the app uses the library yet; lane 1 (#727) puts the first pages inside this frame.The frame:
AppShell(the.approot, and the container every phone rule queries) andBook(the rail slot and the one<main>);AppBar— one markup, and@container app (max-width: 640px)makes it the phone bar: the wordmark's tails hide to leave "QB", the breadcrumb gives way to the page title and its campaign, the identity disc goes and the Contents button arrives, and a bar carrying a search box drops the wordmark and the title with it (SH-1, settled 15 September). There is nophoneprop anywhere in the library, and the README now says so as a rule.Contentsis the desktop rail;ContentsSheetis the phone's bottom sheet with the You group at its foot (the person, their entries, the theme as three choices, Sign out last) — Escape closes it, focus goes in on open and back on close, and a sheet rendered already open never takes focus.Footer(the version first, tabular; hidden in Table mode by the stylesheet).LiveBarin SH-6's three states, each in its own words, the pulsing dot only where something is being captured and still underprefers-reduced-motion.Banners: SH-8's stack, one at a time, worst first (live>warn>gm>quiet, or an item's ownrank), the rest named behind a fold rather than counted.The three popovers:
AccountMenu(the disc opens aMenu: a person's name and pronouns, never a character's; Profile, Plan & billing, Help; the theme strip; Sign out).Bell— arole="dialog"panel, not a menu, because its head and foot have controls of their own (Mark all read; Notification settings) and Tab has to reach them; unread is a dot and heavier text and the word; each row can be marked read on its own (IS-160); empty, loading and did-not-load states.Search(SH-9): grouped by kind in the kit's order with the query marked where it fell (CA-096), "Spoken" and "GM only" chips on a row, three of a group and "All N in Sessions", CA-095's second letter, "Search is not answering", D16's transcript switch in the foot for the GM alone. No combobox, on purpose: the rows are places to go and the box keeps what you typed, so it is a search box that says it has a dialog, and a live region says "3 results" in words because a text box may not carryaria-expanded.Decisions for the record, from the review of the delegates' work against the kit:
CRUMB): you are in the campaign, and the page is where in it. The last item still carriesaria-current="page".--chrome-accentthen--chrome-ink), not the kit's base rule (--accenton the chrome would be two dark blues).documentlistener: arole="dialog"is not an interactive element, so a key handler on it is what jsx-a11y stops, and the key has to work while focus is on the scrim anyway.Button href) had its label in the page's link colour on the accent, invisible, because.qb aoutweighs.btn--primary.Button.cssnow restates the link forms' colours at a link's specificity./designgrew?only=<slug>(one component at a time, for the headless render check) and a full-width state (width: "full") so a desktop frame gets the whole row and the container query draws its desktop form.Lint clean under jsx-a11y at error and the React Compiler rules; render-checked at
/designin both themes with headless Edge.Closes nothing yet: #364 stays open until lane 1 has used the shell in anger and the sheet pieces for lane 11 are added.
🤖 Generated with Claude Code