Layouts: settings, forms, flows, auth, public and kiosk
L5. SettingsLayout — sub-nav + sections of rows + sticky Discard/Save + DangerZone (R5, R6, R16, R17)
Section titled “L5. SettingsLayout — sub-nav + sections of rows + sticky Discard/Save + DangerZone (R5, R6, R16, R17)”SettingsLayout({ header: { title: string; subtitle: string /* scope + "Changes go live when you save." */ }; tabs?: Tab[]; // Profile | Security style (≤4) subnav?: "auto" | false; // auto when ≥5 sections: sticky list 200 (≥1280) / chip row (<1280), scroll-spy sections: Array<{ id: string; title?: string; description?: string; rows: Array<SettingsRowProps> | ReactNode; save?: { dirty: boolean; pending: boolean; error?: string; onDiscard: () => void; onSave: () => void } }>; danger?: DangerZoneProps[]; state: QueryState;})SettingsRow({ label: string; helper?: string; control: ReactNode; status?: StatusPill; readOnly?: { reason: string }; action?: Action /* independent row action, e.g. "Update password" */ })DangerZone({ title: string; consequence: string; action: Action & { confirms: true } })| 375 | 768 | 1280 |
|---|---|---|
| rows stacked (label/helper above control); sub-nav = chip row; dirty save bar fixed bottom | rows split 220 / rest; chip-row sub-nav | rows split 300 / rest; sub-nav 200 sticky left |
Used by: Makerspace settings (S9), Account/MFA, member Account tab, Machine type › Settings tab content, item Details tab content (rows only), API access, Email settings, Modules, Usage & limits, Backup & restore, Data export, Platform settings, Evidence retention.
L6. FormPageLayout — create/edit form + optional live preview (R3, R6 form card)
Section titled “L6. FormPageLayout — create/edit form + optional live preview (R3, R6 form card)”FormPageLayout({ back?: { label: string; href: string }; header: { title: string; subtitle?: string }; form: ReactNode; // Field/Fieldset primitives; optional fields marked "Optional" preview?: { label: string /* "PUBLIC PAGE PREVIEW" */; content: ReactNode }; submit: Action; cancel?: Action; // "Create X" primary left + "Cancel" text width?: "default" | "narrow"; // narrow = 720 single column (tools)})| 375 | 768 | 1280 |
|---|---|---|
| single column; preview collapses into a “Preview” disclosure under the form; submit sticky bottom | preview below form | form 1fr + preview 300 gap 32 |
Used by: New event / New series, Add item, Create makerspace, New organization, Create bookable space, New API client, Add staff (full page variant), QR tools, staff Scanner, Bulk import, Email template editor.
L7. FlowLayout — step rail + work panel + guarded footer (R8/R28 visual, SpaceWorks wizards)
Section titled “L7. FlowLayout — step rail + work panel + guarded footer (R8/R28 visual, SpaceWorks wizards)”FlowLayout({ title: string; subject?: string; // "Issue request #1042 · Meera Nair" steps: Array<{ key: string; label: string; state: "done" | "current" | "todo"; summary?: string /* captured value, e.g. "BOX-0042" */; required?: boolean; missing?: boolean }>; current: string; onStepSelect?: (key: string) => void; // only done steps selectable work: ReactNode; // camera block, evidence tile, item steppers footer: { back?: Action; next: Action }; // next.disabledReason mandatory when disabled onCancel: () => void; leaveGuard?: string; // confirm copy when evidence captured result?: ResultCardProps; // final step: tone, title, summary rows, actions; replaces work error?: CalloutProps; // partial-failure danger callout above footer compact?: boolean; // all steps on one scroll page (expert mode) presentation: "task" | "kiosk"; // task: hides sidebar; kiosk: rendered inside L11})| 375 | 768 | 1280 |
|---|---|---|
| full screen; rail → “Step 3 of 5 · Items” bar; camera full width; footer sticky | rail → top stepper; work full width | rail 300 + work panel; footer in work panel |
Used by: request issue/return (S3), direct handout (S4), job pickup (HandoverConsole), kiosk handover, offline replay correction, stocktake count session, tenant migration / backup restore wizards, create-makerspace onboarding.
L8. AuthLayout (R11) and CenteredCardLayout (R12–R15)
Section titled “L8. AuthLayout (R11) and CenteredCardLayout (R12–R15)”AuthLayout({ brand: { headline: string /* the one accent phrase */; showcase?: ReactNode /* aria-hidden */; tenant?: TenantBranding /* member auth: tenant colour + logo */ }; eyebrow?: string; title: string; // "Welcome back." modeSwitch?: { options: [string, string]; value; onChange }; // Sign in | Create account social?: ReactNode; dividerLabel?: string; // "or with email" form: ReactNode; legal?: ReactNode;})CenteredCardLayout({ media?: { icon: IconName; tone: Tone } | { avatars: [Identity, Identity] } | { banner: Tone }; eyebrow?: string; title: string; body: ReactNode; // names the identity in bold content?: ReactNode; // fields, code boxes, strength meter primary: Action; escape?: Action; // one underlined escape link footer?: ReactNode; // "Signed in as … · Switch account" width?: 440 | 480;})| 375 | 768 | 1280 | |
|---|---|---|---|
| Auth | form only, 16 gutter; brand hidden | brand → 120 band above form | 50/50 split, form 400 wide |
| Centred | card becomes full-width sheet (no border), logo top | card 440 centred | card 440/480 centred |
Used by: staff sign-in, member sign-in/sign-up (Auth); reset password, verify email, MFA challenge, staff/organization invitation accept, change-password gate, access denied, “event not found” (Centred).
L9. PublicLayout (R18–R25 chrome) and PublicDetailLayout (R18, R19, R21, R23)
Section titled “L9. PublicLayout (R18–R25 chrome) and PublicDetailLayout (R18, R19, R21, R23)”PublicLayout({ makerspace: { name: string; logo?: string; slug: string; branding?: TenantBranding }; nav: Array<{ label: string; href: string }>; // only modules that are on headerAction?: Action; // "Sign in" or the page primary when no action card liveStatus?: StatusPill; // "● Live · updates automatically" width: "wide" /*1110*/ | "default" /*960*/ | "narrow" /*600*/; breadcrumb?: Array<{ label: string; href?: string }>; aside?: ActionCardProps; // sticky right card (catalogue cart) children: ReactNode; footer: { credit: "Powered by space works"; links: Action[] };})PublicDetailLayout({ // always rendered inside PublicLayout width="wide" cover?: { src: string; alt: "" }; chips: Chip[]; title: string; tagline?: string; facts: Array<{ identity: Identity; primary: string; secondary?: string }>; // date block, venue block sections: Array<{ id: string; label: string; content: ReactNode }>; // anchor tabs actionCard: ActionCardProps; host?: { identity: Identity; name: string; href: string };})type ActionCardProps = { title: string; summary?: ReactNode /* counts + bar, avatars */; form?: ReactNode; primary?: Action; secondary?: Action[]; note?: string; state: "open" | "closed" | "done"; doneContent?: ReactNode; mobileBar: { summary: string; label: string } };| 375 | 768 | 1280 |
|---|---|---|
| action card → sticky bottom bar opening a sheet; chips scroll; title 36 | action card below title block (static); title 48 | main 545–760 + sticky card 318–340 |
Used by: catalogue (PublicLayout + aside), item detail, public event, events list, programme, session, feedback (narrow), running order (narrow, liveStatus), ticket (narrow), public machines, public bookings, public stats, organization page, about/landing.
L10. KioskLayout — full screen, large targets (R27, R28)
Section titled “L10. KioskLayout — full screen, large targets (R27, R28)”KioskLayout({ context: { identity: Identity; title: string; subtitle: string }; // "Door check-in · Station 1" connection: { online: boolean; queued?: number }; progress?: { done: number; of: number; label: string }; // "3 / 5 checked in" headerActions: Action[]; // Full screen, Lock station mode: "lock" | "ready" | "work"; lock?: { title: string; helper: string; pinLength: number; onSubmit: (pin: string) => void; pending: boolean; error?: string; disabledReason?: string }; ready?: { primary: Action }; // "Start operator shift" work?: { capture: ReactNode /* camera */; panel: ReactNode /* result card or FlowLayout kiosk */; recent?: ReactNode }; idleCountdown?: { seconds: number; onKeep: () => void }; confirmLock?: { pendingCount: number; onDiscard: () => void; onKeep: () => void };})| 375 (phone door station) | 768 (portrait tablet) | 1280 (landscape tablet/desktop) |
|---|---|---|
| PIN: boxes above keypad, single column; work: camera 50 vh top, panel below | same stacked; keys 96×72 | PIN two-column; work: camera left 1fr + panel 1fr |
All targets ≥56 px, text ≥18, no hover-only affordances. Used by: kiosk handover station, event door check-in station, public desk kiosk, ScannerPage (standalone).
1A.11 Pattern → screen-type → layout map (shared with ux-screens-longtail.md)
Section titled “1A.11 Pattern → screen-type → layout map (shared with ux-screens-longtail.md)”| Screen type | Layout | Reference | Patterns it composes | SpaceWorks screens (examples) |
|---|---|---|---|---|
| Dashboard home | L1 + L2 DashboardLayout | R1, R2 | P2 eyebrow header, P5 banner, P4 stats, P6 rows, P12 rail | Staff Home, member Home, organizations home, Platform dashboard |
| List + stats | L1 + L3 ListLayout | R2, R4 | P2, P5, P4, P8 tabs, P6 rows or P14/§5.1 table, P17 empty, P30 undo | Requests, Inventory, Members, Events, Bookings, Audit, Payments, every long-tail table tab |
| Detail with tabs | L1 + L4 DetailLayout (page or drawer) | R7–R10 | P3, P7, P4, P13 aside, P5 CTA card, P16 | Request, item, machine type, machine, event, series, space, member, role |
| Settings rows | L1 + L5 SettingsLayout | R5, R6, R16, R17 | P15, P16, P5 panel, P19, P24 | Makerspace settings, account, API access, modules, backups, exports |
| Create / tool form | L1 + L6 FormPageLayout | R3, R6 | P18 preview, P19 cards, P17 dropzone | New event/item/makerspace/space/client, QR tools, bulk import, template editor |
| Wizard / flow | L7 FlowLayout (task mode over L1, or inside L10) | R8, R28 (visual) | P21 camera, evidence tile (§5.2), P29 result card | Issue/return, direct handout, job pickup, stocktake session, restore/migration |
| Scanner / kiosk | L10 KioskLayout | R27, R28 | P28 PIN, P29 station, P30 undo, P5 panel | Kiosk station, door check-in, desk kiosk, scanner page |
| Public list | L9 PublicLayout | R18 chrome, R20 | P6 rows, P10 chips, P9 segmented | Catalogue (with aside cart), events list, machines, bookings |
| Public detail | L9 + PublicDetailLayout | R18, R19, R21, R23 | P25, P10, action card | Event page, item page, session, speaker, organization page |
| Public narrow task | L9 width="narrow" |
R24, R25, R26 | P26, P27 | Feedback, running order, ticket, self-checkout result |
| Auth | L8 AuthLayout | R11 | P22, P9 | Staff sign-in, member sign-in/up |
| Centred task card | L8 CenteredCardLayout | R12–R15 | P23 | Reset, verify, MFA, invitations, access denied, not found |
Part of Space Works UX spec, published from docs/ux-spec.md. Edit it there.