Skip to content

Layout gaps, overlays and merges

No screen in this doc needs a new page layout. These are the places where the closed set needs a variant or a shared section:

  1. FlowLayout needs a dialog presentation besides page. It is used by New transfer (A3), Start count (A4), Add item (A5), Add device + enrollment (A13), Send announcement (A7). Proposal: the same stepper/footer contract rendered inside Modal. Single-step dialogs simply hide the stepper.
  2. ScanWorkbench shared section (not a layout). Camera frame + paste/search field + Resolve/Find + result panel + recent list. It is used inside ListLayout (staff Scanner, Member cards › Scan), DetailLayout (Stocktake session), FlowLayout (Self-checkout scan step) and KioskLayout (Scanner page, Event check-in station). It wraps the existing QrScanner. Proposed home: components/ui/ScanWorkbench.tsx, ≤200 lines, with ResultPanel (success / warn / danger + “Next” + optional “Undo”) split out.
  3. DetailLayout drawer presentation. Container detail (B3), Device detail (A13), Warranty manage (A10), Procurement edit (A5) and Organized event (A11, already EventDrawer) open as side drawers. This assumes the restyled DetailDrawer can host DetailLayout slots (back → close, tabs, body). If the core spec defines drawers differently, follow it.
  4. AppShell no-workspace mode for the superadmin makerspace picker (D4) and global routes (Organizations, Platform dashboard) before a space is chosen. The sidebar shows only global items and the switcher reads “Choose a space”. This needs StaffApp’s gate order to render the picker inside the shell. That touches shell-contracts.md §1A (gate order), so raise it with the shell owner. Fallback: CenteredCardLayout wide variant.
  5. CenteredCardLayout wide variant (max-width ~ 720 px) for card grids that sit outside any shell (D4 fallback, G11 archived payments if the deployment shell is not used).
  6. Static offline page (I4) cannot consume layouts. It mirrors KioskLayout by hand in offline.css. This is a constraint for the token phase, not a layout gap.

12. Batch J — Overlays and global chrome (no page layout)

Section titled “12. Batch J — Overlays and global chrome (no page layout)”
  • Component staff/CommandPalette.tsx. Keep: name “Search and commands”, Ctrl/⌘K, combobox/listbox semantics, dialog-stack guard.
  • Change: the trigger moves to the sidebar top as a search-looking field “Search or jump to…” with a ⌘K hint (PLAN §3.4). Results are grouped with small headers: Go to (tabs), Create (quick-create commands), Results (entity hits, with entity-type icon and tab name as meta). Each item has a leading icon; the selected item uses the active-pill style. Footer hint: “↑↓ to move · Enter to open · Esc to close”.
  • States: searching: “Searching…” (live) · none: “No matches for ‘{q}’.” · search error: “Search isn’t available right now. You can still jump to pages.”
  • Component components/ui/JobTray.tsx (jobStore). Today it is a <details> strip under the header.
  • Change: a compact pill pinned at the bottom of the sidebar (above the user chip): “2 jobs running” with a spinner. Clicking opens a popover list. Each job has a label, a status pill (Queued / Building / Ready / Failed), “Open” (to its source panel), and “Dismiss”. When a job finishes: toast “Your export is ready.” with “Download”/“Open”. Keep the aria-live summary.
  • States: check error: row text “Couldn’t check progress.” + “Retry”.
  • Component staff/SetupChecklist.tsx (setupChecklistState.ts). Shown on Dashboard to space managers.
  • Change (coordinate with the core Dashboard spec): a callout card (P5) at the top of Home: “Finish setting up {space} — 3 of 5 done” + progress bar + the next undone step as the action link (“Set opening hours →”). It expands to the full list (Done ✓ / To do rows linking to their tabs) and a “Hide” control that persists per browser (unchanged).
  • Payment Settlement / Refund / Amend (A1), Category delete, Restrict requester (A9), Reissue/Revoke card (A12), Device revoke + enrollment (A13), Bulk-import mapping (now a step, E1), Create QR batch (E2), Org link change (C5), Reset email template (B1). All follow: title as a question or verb (“Revoke this card?”), one sentence of consequence, then Cancel (outline) + verb button (danger tint when destructive). Required-reason fields autofocus.

13. Cross-cutting merges and moves (summary)

Section titled “13. Cross-cutting merges and moves (summary)”
Move From → to Why Needs
Telegram chat ID / bot token API access → Makerspace settings › Notifications/Integrations not an API-client concern core settings owner
Broadcast composer pinned above inbox → “Send announcement” dialog on Notifications one primary; inbox is the job —
Stocktake policy & schedules top of Stocktake → More › “Count policy and schedule” drawer config ≠ daily work —
Suppressions below delivery log → tab “Suppressed addresses” one list per view —
Space packs Makerspace settings → stays (core); referenced from Create makerspace step 3 — core settings owner
Usage & limits own tab → optionally Settings › Plan & usage fewer admin tabs owner decision
Member directory Account tab → own member nav item it’s community, not account memberTabs change, owner decision
Member account (2 pages) /member/account + account-portal tab → one cross-linked area user sees one “account” —
Platform settings (3 stacked panels) → sub-nav sections — —
Accountability (4 stacked panels) → tabs — —
Member cards (4 stacked sections) → tabs — —
QR tools (3 stacked forms) → batch list + batch detail with segmented “Add labels” — —
Organizations select + pager → org cards index + org settings sub-nav reference organiser workspace —
Dead code panels/EmailLogPanel.tsx (exported, not routed) — separate cleanup