{
  "captured": "2026-11-13",
  "purpose": "Additive extraction baseline; originals remain canonical. Batch 3 must account for every source item when publishing.",
  "sources": [
    {
      "path": "docs/ux-spec.md",
      "sha256": "a047a6f9fb2dc68f7165eea535349f4acd7da3f25d7d76e874053cfa2f32312f",
      "headings": [
        {
          "line": 1,
          "text": "Space Works UX spec",
          "anchor": "space-works-ux-spec"
        },
        {
          "line": 53,
          "text": "1. Pattern catalogue",
          "anchor": "1-pattern-catalogue"
        },
        {
          "line": 55,
          "text": "1.0 Observed scale (use these, not ad-hoc values)",
          "anchor": "10-observed-scale-use-these-not-ad-hoc-values"
        },
        {
          "line": 77,
          "text": "P1. App shell and sidebar (R1–R10, R16, R17)",
          "anchor": "p1-app-shell-and-sidebar-r1r10-r16-r17"
        },
        {
          "line": 120,
          "text": "P2. Page header (R1, R2, R4–R6, R16)",
          "anchor": "p2-page-header-r1-r2-r4r6-r16"
        },
        {
          "line": 137,
          "text": "P3. Detail header with back link, identity chip and underline tabs (R7–R10)",
          "anchor": "p3-detail-header-with-back-link-identity-chip-and-underline-tabs-r7r10"
        },
        {
          "line": 164,
          "text": "P4. Stat-card row (R2, R7, R8)",
          "anchor": "p4-stat-card-row-r2-r7-r8"
        },
        {
          "line": 177,
          "text": "P5. Contextual callout (R2, R6, R8, R17, R7 CTA card)",
          "anchor": "p5-contextual-callout-r2-r6-r8-r17-r7-cta-card"
        },
        {
          "line": 197,
          "text": "P6. List rows as bordered cards (R1, R2)",
          "anchor": "p6-list-rows-as-bordered-cards-r1-r2"
        },
        {
          "line": 223,
          "text": "P7. Date chip / identity tile",
          "anchor": "p7-date-chip--identity-tile"
        },
        {
          "line": 232,
          "text": "P8. Underline tabs with inline counts (R2, R7, R16)",
          "anchor": "p8-underline-tabs-with-inline-counts-r2-r7-r16"
        },
        {
          "line": 240,
          "text": "P9. Segmented control (R9, R11)",
          "anchor": "p9-segmented-control-r9-r11"
        },
        {
          "line": 246,
          "text": "P10. Pills and chips",
          "anchor": "p10-pills-and-chips"
        },
        {
          "line": 257,
          "text": "P11. Buttons",
          "anchor": "p11-buttons"
        },
        {
          "line": 273,
          "text": "P12. Recent-activity rail (R1, R2)",
          "anchor": "p12-recent-activity-rail-r1-r2"
        },
        {
          "line": 284,
          "text": "P13. Key–value \"At a glance\" card (R7)",
          "anchor": "p13-keyvalue-at-a-glance-card-r7"
        },
        {
          "line": 289,
          "text": "P14. Tables inside a card (R4, R8, R10)",
          "anchor": "p14-tables-inside-a-card-r4-r8-r10"
        },
        {
          "line": 298,
          "text": "P15. Settings rows (R5, R16, R17)",
          "anchor": "p15-settings-rows-r5-r16-r17"
        },
        {
          "line": 330,
          "text": "P16. Danger zone (R5, R10)",
          "anchor": "p16-danger-zone-r5-r10"
        },
        {
          "line": 337,
          "text": "P17. Empty states (R4, R6, R3 preview)",
          "anchor": "p17-empty-states-r4-r6-r3-preview"
        },
        {
          "line": 347,
          "text": "P18. Create form with live preview (R3)",
          "anchor": "p18-create-form-with-live-preview-r3"
        },
        {
          "line": 358,
          "text": "P19. Form card with checkbox cards and developer reference (R6)",
          "anchor": "p19-form-card-with-checkbox-cards-and-developer-reference-r6"
        },
        {
          "line": 368,
          "text": "P20. Session/track board (R9)",
          "anchor": "p20-sessiontrack-board-r9"
        },
        {
          "line": 379,
          "text": "P21. Check-in workspace (R8)",
          "anchor": "p21-check-in-workspace-r8"
        },
        {
          "line": 392,
          "text": "P22. Auth split screen (R11)",
          "anchor": "p22-auth-split-screen-r11"
        },
        {
          "line": 420,
          "text": "P23. Centred task card (R12–R15)",
          "anchor": "p23-centred-task-card-r12r15"
        },
        {
          "line": 439,
          "text": "P24. Account tabs (R16, R17)",
          "anchor": "p24-account-tabs-r16-r17"
        },
        {
          "line": 446,
          "text": "P25. Public event page (R18, R19, R23)",
          "anchor": "p25-public-event-page-r18-r19-r23"
        },
        {
          "line": 484,
          "text": "P26. Live and status pages (R24) and feedback (R25)",
          "anchor": "p26-live-and-status-pages-r24-and-feedback-r25"
        },
        {
          "line": 499,
          "text": "P27. Mobile ticket (R26, 390 px)",
          "anchor": "p27-mobile-ticket-r26-390-px"
        },
        {
          "line": 509,
          "text": "P28. Kiosk PIN (R27)",
          "anchor": "p28-kiosk-pin-r27"
        },
        {
          "line": 519,
          "text": "P29. Kiosk station (R28)",
          "anchor": "p29-kiosk-station-r28"
        },
        {
          "line": 530,
          "text": "P30. Undo and confirmation behaviour (R8, R28)",
          "anchor": "p30-undo-and-confirmation-behaviour-r8-r28"
        },
        {
          "line": 544,
          "text": "1.31 Interaction model summary",
          "anchor": "131-interaction-model-summary"
        },
        {
          "line": 557,
          "text": "1.32 Microcopy style",
          "anchor": "132-microcopy-style"
        },
        {
          "line": 582,
          "text": "1A. Reusable layouts (closed set — every screen composes exactly one)",
          "anchor": "1a-reusable-layouts-closed-set--every-screen-composes-exactly-one"
        },
        {
          "line": 591,
          "text": "1A.0 Shared slot types",
          "anchor": "1a0-shared-slot-types"
        },
        {
          "line": 614,
          "text": "L1. `AppShell` — sidebar + content (R1–R10, R16–R17)",
          "anchor": "l1-appshell--sidebar--content-r1r10-r16r17"
        },
        {
          "line": 642,
          "text": "L2. `DashboardLayout` — greeting header + stat row + main + right rail (R1, R2)",
          "anchor": "l2-dashboardlayout--greeting-header--stat-row--main--right-rail-r1-r2"
        },
        {
          "line": 663,
          "text": "L3. `ListLayout` — header + callout + stats/tabs + filters + list/table + pagination (R2, R4)",
          "anchor": "l3-listlayout--header--callout--statstabs--filters--listtable--pagination-r2-r4"
        },
        {
          "line": 689,
          "text": "L4. `DetailLayout` — back + identity + title/status/meta + actions + underline tabs + main/aside (R7–R10)",
          "anchor": "l4-detaillayout--back--identity--titlestatusmeta--actions--underline-tabs--mainaside-r7r10"
        },
        {
          "line": 713,
          "text": "L5. `SettingsLayout` — sub-nav + sections of rows + sticky Discard/Save + DangerZone (R5, R6, R16, R17)",
          "anchor": "l5-settingslayout--sub-nav--sections-of-rows--sticky-discardsave--dangerzone-r5-r6-r16-r17"
        },
        {
          "line": 737,
          "text": "L6. `FormPageLayout` — create/edit form + optional live preview (R3, R6 form card)",
          "anchor": "l6-formpagelayout--createedit-form--optional-live-preview-r3-r6-form-card"
        },
        {
          "line": 756,
          "text": "L7. `FlowLayout` — step rail + work panel + guarded footer (R8/R28 visual, SpaceWorks wizards)",
          "anchor": "l7-flowlayout--step-rail--work-panel--guarded-footer-r8r28-visual-spaceworks-wizards"
        },
        {
          "line": 780,
          "text": "L8. `AuthLayout` (R11) and `CenteredCardLayout` (R12–R15)",
          "anchor": "l8-authlayout-r11-and-centeredcardlayout-r12r15"
        },
        {
          "line": 808,
          "text": "L9. `PublicLayout` (R18–R25 chrome) and `PublicDetailLayout` (R18, R19, R21, R23)",
          "anchor": "l9-publiclayout-r18r25-chrome-and-publicdetaillayout-r18-r19-r21-r23"
        },
        {
          "line": 842,
          "text": "L10. `KioskLayout` — full screen, large targets (R27, R28)",
          "anchor": "l10-kiosklayout--full-screen-large-targets-r27-r28"
        },
        {
          "line": 867,
          "text": "1A.11 Pattern → screen-type → layout map (shared with `ux-screens-longtail.md`)",
          "anchor": "1a11-pattern--screen-type--layout-map-shared-with-ux-screens-longtailmd"
        },
        {
          "line": 886,
          "text": "2. Staff console sidebar IA",
          "anchor": "2-staff-console-sidebar-ia"
        },
        {
          "line": 888,
          "text": "2.0 App-wide navigation rules (all shells)",
          "anchor": "20-app-wide-navigation-rules-all-shells"
        },
        {
          "line": 912,
          "text": "2.1 What exists",
          "anchor": "21-what-exists"
        },
        {
          "line": 932,
          "text": "2.2 Proposed sections (desktop ≥1024, 264 px sidebar)",
          "anchor": "22-proposed-sections-desktop-1024-264-px-sidebar"
        },
        {
          "line": 952,
          "text": "2.3 Collapse and disclosure rules",
          "anchor": "23-collapse-and-disclosure-rules"
        },
        {
          "line": 973,
          "text": "2.4 Top and bottom of the sidebar",
          "anchor": "24-top-and-bottom-of-the-sidebar"
        },
        {
          "line": 988,
          "text": "2.5 Narrow consoles",
          "anchor": "25-narrow-consoles"
        },
        {
          "line": 1016,
          "text": "2.6 Below 1024 px (non-handout)",
          "anchor": "26-below-1024-px-non-handout"
        },
        {
          "line": 1024,
          "text": "3. Screen-by-screen spec",
          "anchor": "3-screen-by-screen-spec"
        },
        {
          "line": 1037,
          "text": "S1. Staff Home / Dashboard (`dashboard`) ← R1 + R2",
          "anchor": "s1-staff-home--dashboard-dashboard--r1--r2"
        },
        {
          "line": 1088,
          "text": "S2. Requests list (`requests`) ← R2 (tabs + rows) + R8 (inline actions)",
          "anchor": "s2-requests-list-requests--r2-tabs--rows--r8-inline-actions"
        },
        {
          "line": 1135,
          "text": "S3. Request detail + issue/return flow ← R7 (detail header, at-a-glance) + R8/R28 (scan workspace)",
          "anchor": "s3-request-detail--issuereturn-flow--r7-detail-header-at-a-glance--r8r28-scan-workspace"
        },
        {
          "line": 1224,
          "text": "S4. Direct handout (`direct`) ← R2 list + S3 flow",
          "anchor": "s4-direct-handout-direct--r2-list--s3-flow"
        },
        {
          "line": 1248,
          "text": "S5. Inventory list (`inventory`) ← R2 header/stat cards + adapted dense table (§5)",
          "anchor": "s5-inventory-list-inventory--r2-headerstat-cards--adapted-dense-table-5"
        },
        {
          "line": 1287,
          "text": "S6. Inventory item detail ← R7 (detail header + tabs) + R5 (settings rows, danger zone)",
          "anchor": "s6-inventory-item-detail--r7-detail-header--tabs--r5-settings-rows-danger-zone"
        },
        {
          "line": 1322,
          "text": "S7. Members (`members`) ← R4",
          "anchor": "s7-members-members--r4"
        },
        {
          "line": 1357,
          "text": "S8. Staff & roles (`users`) ← R4 (table) + R6 (checkbox cards for permissions)",
          "anchor": "s8-staff--roles-users--r4-table--r6-checkbox-cards-for-permissions"
        },
        {
          "line": 1382,
          "text": "S9. Makerspace settings (`settings`) ← R5 + R6 + R17",
          "anchor": "s9-makerspace-settings-settings--r5--r6--r17"
        },
        {
          "line": 1424,
          "text": "S10. Machines ← R1 cards (index), R7 detail header + tabs (type page), R5 rows (machine detail)",
          "anchor": "s10-machines--r1-cards-index-r7-detail-header--tabs-type-page-r5-rows-machine-detail"
        },
        {
          "line": 1479,
          "text": "S11. Events list (`events`) ← R2 exactly",
          "anchor": "s11-events-list-events--r2-exactly"
        },
        {
          "line": 1510,
          "text": "S12. Event detail ← R7, R8, R9, R10",
          "anchor": "s12-event-detail--r7-r8-r9-r10"
        },
        {
          "line": 1544,
          "text": "S13. Bookings (`bookings`) ← R2 + R7",
          "anchor": "s13-bookings-bookings--r2--r7"
        },
        {
          "line": 1565,
          "text": "S14. Reports (`reports`) ← R6 (form card) + P4",
          "anchor": "s14-reports-reports--r6-form-card--p4"
        },
        {
          "line": 1592,
          "text": "S15. Audit log (`audit`) ← R1/R2 activity rail as a full list + P14",
          "anchor": "s15-audit-log-audit--r1r2-activity-rail-as-a-full-list--p14"
        },
        {
          "line": 1618,
          "text": "S16. Member area home and tabs (`/member`, `/member/:tab`) ← R1 (home), R26 (card), R16 (account)",
          "anchor": "s16-member-area-home-and-tabs-member-membertab--r1-home-r26-card-r16-account"
        },
        {
          "line": 1661,
          "text": "S17. Public catalogue (`/m/:slug`) ← R18 (sticky right card) + P10 chips",
          "anchor": "s17-public-catalogue-mslug--r18-sticky-right-card--p10-chips"
        },
        {
          "line": 1700,
          "text": "S18. Public item detail (`/items/:itemId`) ← R21 (detail with right rail) + R18 sticky card",
          "anchor": "s18-public-item-detail-itemsitemid--r21-detail-with-right-rail--r18-sticky-card"
        },
        {
          "line": 1721,
          "text": "S19. Public event page (`/events/:publicToken`) ← R18, R19, R23, plus R26 confirmation",
          "anchor": "s19-public-event-page-eventspublictoken--r18-r19-r23-plus-r26-confirmation"
        },
        {
          "line": 1748,
          "text": "S20. Staff sign-in (`LoginPanel`) ← R11",
          "anchor": "s20-staff-sign-in-loginpanel--r11"
        },
        {
          "line": 1768,
          "text": "S21. Member sign-in / sign-up (`MemberAuthPanel`) ← R11, R12, R13",
          "anchor": "s21-member-sign-in--sign-up-memberauthpanel--r11-r12-r13"
        },
        {
          "line": 1787,
          "text": "S22. Invitation accept (`StaffInvitationAcceptPage`, `OrganizationInvitationRedeemPage`) ← R14, R15",
          "anchor": "s22-invitation-accept-staffinvitationacceptpage-organizationinvitationredeempage--r14-r15"
        },
        {
          "line": 1820,
          "text": "S23. Kiosk station (`/kiosk/:stationToken`, `KioskStationPage`) ← R27, R28",
          "anchor": "s23-kiosk-station-kioskstationtoken-kioskstationpage--r27-r28"
        },
        {
          "line": 1853,
          "text": "S24. Remaining staff tabs (Phase 6 sweep), pattern assignment",
          "anchor": "s24-remaining-staff-tabs-phase-6-sweep-pattern-assignment"
        },
        {
          "line": 1874,
          "text": "4. UX quality bar (every screen, app-wide; implementation must pass every applicable item)",
          "anchor": "4-ux-quality-bar-every-screen-app-wide-implementation-must-pass-every-applicable-item"
        },
        {
          "line": 1940,
          "text": "5. Where the reference boards don't scale, and our adaptation",
          "anchor": "5-where-the-reference-boards-dont-scale-and-our-adaptation"
        },
        {
          "line": 1942,
          "text": "5.1 Dense operational tables (Inventory, Ledger, Stocktake, Transfers, Audit, Reports, Payments)",
          "anchor": "51-dense-operational-tables-inventory-ledger-stocktake-transfers-audit-reports-payments"
        },
        {
          "line": 1958,
          "text": "5.2 Evidence capture (issue/return photo, remark, box and asset QR)",
          "anchor": "52-evidence-capture-issuereturn-photo-remark-box-and-asset-qr"
        },
        {
          "line": 1974,
          "text": "5.3 Multi-step guided flows",
          "anchor": "53-multi-step-guided-flows"
        },
        {
          "line": 1981,
          "text": "5.4 Permission and module density",
          "anchor": "54-permission-and-module-density"
        },
        {
          "line": 1989,
          "text": "5.5 Settings scale",
          "anchor": "55-settings-scale"
        },
        {
          "line": 1994,
          "text": "5.6 Dashboard breadth",
          "anchor": "56-dashboard-breadth"
        },
        {
          "line": 1999,
          "text": "5.7 Multi-tenant switching",
          "anchor": "57-multi-tenant-switching"
        },
        {
          "line": 2005,
          "text": "5.8 Offline and kiosk integrity",
          "anchor": "58-offline-and-kiosk-integrity"
        },
        {
          "line": 2012,
          "text": "5.9 Money",
          "anchor": "59-money"
        },
        {
          "line": 2019,
          "text": "5.10 Activity rail data",
          "anchor": "510-activity-rail-data"
        },
        {
          "line": 2028,
          "text": "6. Items that need a decision or data before implementation",
          "anchor": "6-items-that-need-a-decision-or-data-before-implementation"
        }
      ],
      "tables": [
        {
          "line": 20,
          "cells": [
            "Ref",
            "Reference screen",
            "Board"
          ]
        },
        {
          "line": 21,
          "cells": [
            "---",
            "---",
            "---"
          ]
        },
        {
          "line": 22,
          "cells": [
            "R1",
            "Organiser home (\"Good morning, Priya\", org cards, Coming up, Recent activity)",
            "Organiser workspace"
          ]
        },
        {
          "line": 23,
          "cells": [
            "R2",
            "Org Events list (callout, 4 stat cards, tabs, date-chip rows, activity rail)",
            "Organiser workspace"
          ]
        },
        {
          "line": 24,
          "cells": [
            "R3",
            "New organisation form + live public-page preview",
            "Organiser workspace"
          ]
        },
        {
          "line": 25,
          "cells": [
            "R4",
            "Members (invite-link card, table, dashed empty state)",
            "Organiser workspace"
          ]
        },
        {
          "line": 26,
          "cells": [
            "R5",
            "Settings › General (settings rows, Discard/Save, danger zone)",
            "Organiser workspace"
          ]
        },
        {
          "line": 27,
          "cells": [
            "R6",
            "Settings › API access (form card, checkbox cards, code block, accordions)",
            "Organiser workspace"
          ]
        },
        {
          "line": 28,
          "cells": [
            "R7",
            "Event › Overview (detail header, 8 tabs, stat cards, latest list, At a glance, CTA card)",
            "Managing an event"
          ]
        },
        {
          "line": 29,
          "cells": [
            "R8",
            "Event › Check-in (progress stat, offline callout, camera, find, toggles, recent + Undo, door station)",
            "Managing an event"
          ]
        },
        {
          "line": 30,
          "cells": [
            "R9",
            "Event › Page & programme (segmented control, track chips, session cards, delay stepper)",
            "Managing an event"
          ]
        },
        {
          "line": 31,
          "cells": [
            "R10",
            "Series › Overview (upcoming-date cards, details form, radio chips, agenda, danger zone)",
            "Managing an event"
          ]
        },
        {
          "line": 32,
          "cells": [
            "R11",
            "Sign in (split screen)",
            "Sign in, invites & account"
          ]
        },
        {
          "line": 33,
          "cells": [
            "R12",
            "Set a new password (centred card, strength meter)",
            "idem"
          ]
        },
        {
          "line": 34,
          "cells": [
            "R13",
            "Confirm your email (centred card)",
            "idem"
          ]
        },
        {
          "line": 35,
          "cells": [
            "R14",
            "Org invite accept (avatar pair, role pill)",
            "idem"
          ]
        },
        {
          "line": 36,
          "cells": [
            "R15",
            "Event co-organiser invite (banner card)",
            "idem"
          ]
        },
        {
          "line": 37,
          "cells": [
            "R16",
            "Account › Profile (settings rows, verified pill)",
            "idem"
          ]
        },
        {
          "line": 38,
          "cells": [
            "R17",
            "Account › Security (big callout with button, destructive outline)",
            "idem"
          ]
        },
        {
          "line": 39,
          "cells": [
            "R18",
            "Public event page with cover + sticky \"Join this event\" card",
            "Attending an event"
          ]
        },
        {
          "line": 40,
          "cells": [
            "R19",
            "Same page, no cover, tenant accent colour",
            "idem"
          ]
        },
        {
          "line": 41,
          "cells": [
            "R20",
            "Public programme (time grid, track filter pills)",
            "idem"
          ]
        },
        {
          "line": 42,
          "cells": [
            "R21",
            "Public session detail (right rail \"Next on main stage\")",
            "idem"
          ]
        },
        {
          "line": 43,
          "cells": [
            "R22",
            "Speaker page",
            "idem"
          ]
        },
        {
          "line": 44,
          "cells": [
            "R23",
            "Series event page (inline register form inside sticky card, date pills)",
            "idem"
          ]
        },
        {
          "line": 45,
          "cells": [
            "R24",
            "Live running order (NOW / NEXT / LATER, delay pill)",
            "idem"
          ]
        },
        {
          "line": 46,
          "cells": [
            "R25",
            "Feedback form (rating tiles)",
            "idem"
          ]
        },
        {
          "line": 47,
          "cells": [
            "R26",
            "Mobile ticket with QR (390 px)",
            "idem"
          ]
        },
        {
          "line": 48,
          "cells": [
            "R27",
            "Kiosk: enter station PIN (digit boxes + keypad)",
            "idem"
          ]
        },
        {
          "line": 49,
          "cells": [
            "R28",
            "Kiosk: door check-in station (camera + big result card + Undo + recent)",
            "idem"
          ]
        },
        {
          "line": 546,
          "cells": [
            "Concern",
            "Space Works rule"
          ]
        },
        {
          "line": 547,
          "cells": [
            "---",
            "---"
          ]
        },
        {
          "line": 548,
          "cells": [
            "Primary action",
            "One per page header, one per sticky card, one per callout. Never points at the current screen."
          ]
        },
        {
          "line": 549,
          "cells": [
            "Secondary",
            "Outline pill beside the primary; everything else is a text link or a row menu."
          ]
        },
        {
          "line": 550,
          "cells": [
            "Where counts live",
            "Stat cards (overview numbers), tab labels (queue sizes), row right slots (\"5 / 120\"), header meta, the kiosk header. **Never** in the sidebar on the reference boards (SpaceWorks keeps its unread count there, see §2)."
          ]
        },
        {
          "line": 551,
          "cells": [
            "Progressive disclosure",
            "Sub-nav only under the active parent; accordions for reference; the camera off until \"Start scanning\"; the live preview beside the create form; optional fields labelled rather than hidden."
          ]
        },
        {
          "line": 552,
          "cells": [
            "Inline vs menu",
            "The **next step** is inline (pill or link in the row); rare or destructive actions go in \"⋯\" / \"—\" menus; destructive-irreversible actions go in the danger zone."
          ]
        },
        {
          "line": 553,
          "cells": [
            "Navigation",
            "Back link on detail pages; breadcrumb only on public sub-pages; tabs are URLs."
          ]
        },
        {
          "line": 554,
          "cells": [
            "Feedback",
            "Inline status (\"✓ Available\", \"Unused\", \"Verified\"), progress bars, an Undo in place; the result card in kiosk mode."
          ]
        },
        {
          "line": 555,
          "cells": [
            "States",
            "Dashed empty cards that point at a visible control; disabled = grey fill; zero shown as \"0\"."
          ]
        },
        {
          "line": 636,
          "cells": [
            "375",
            "768",
            "1280"
          ]
        },
        {
          "line": 637,
          "cells": [
            "---",
            "---",
            "---"
          ]
        },
        {
          "line": 638,
          "cells": [
            "56 px top bar (menu, space name, search icon, avatar) **or** 64 px bottom tabs when `compactNav=\"bottom-tabs\"`; drawer full-height 85 vw",
            "same top bar; drawer 320",
            "fixed 264 sidebar, own scroll region between switcher and pinned block"
          ]
        },
        {
          "line": 657,
          "cells": [
            "375",
            "768",
            "1280"
          ]
        },
        {
          "line": 658,
          "cells": [
            "---",
            "---",
            "---"
          ]
        },
        {
          "line": 659,
          "cells": [
            "stats 2×2; rail below main, 3 items",
            "stats 2×2 (4-up ≥900); rail below main",
            "stats 4-up; main 1fr + rail 260, gap 28"
          ]
        },
        {
          "line": 683,
          "cells": [
            "375",
            "768",
            "1280"
          ]
        },
        {
          "line": 684,
          "cells": [
            "---",
            "---",
            "---"
          ]
        },
        {
          "line": 685,
          "cells": [
            "tabs scroll; filters collapse to search + \"Filters\" sheet; tables → stacked cards; bulk bar fixed bottom",
            "tables keep ≤5 priority columns, rest via column picker",
            "full table/rows; optional rail 260"
          ]
        },
        {
          "line": 707,
          "cells": [
            "375",
            "768",
            "1280"
          ]
        },
        {
          "line": 708,
          "cells": [
            "---",
            "---",
            "---"
          ]
        },
        {
          "line": 709,
          "cells": [
            "identity 40, title 24; actions → full-width primary + ⋯; tabs scroll with fades; aside below main; drawer full-screen",
            "aside below main; drawer full-screen",
            "main 1fr + aside 280 gap 24; tab hairline full-bleed"
          ]
        },
        {
          "line": 731,
          "cells": [
            "375",
            "768",
            "1280"
          ]
        },
        {
          "line": 732,
          "cells": [
            "---",
            "---",
            "---"
          ]
        },
        {
          "line": 733,
          "cells": [
            "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"
          ]
        },
        {
          "line": 750,
          "cells": [
            "375",
            "768",
            "1280"
          ]
        },
        {
          "line": 751,
          "cells": [
            "---",
            "---",
            "---"
          ]
        },
        {
          "line": 752,
          "cells": [
            "single column; preview collapses into a \"Preview\" disclosure under the form; submit sticky bottom",
            "preview below form",
            "form 1fr + preview 300 gap 32"
          ]
        },
        {
          "line": 774,
          "cells": [
            "375",
            "768",
            "1280"
          ]
        },
        {
          "line": 775,
          "cells": [
            "---",
            "---",
            "---"
          ]
        },
        {
          "line": 776,
          "cells": [
            "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"
          ]
        },
        {
          "line": 801,
          "cells": [
            "",
            "375",
            "768",
            "1280"
          ]
        },
        {
          "line": 802,
          "cells": [
            "---",
            "---",
            "---",
            "---"
          ]
        },
        {
          "line": 803,
          "cells": [
            "Auth",
            "form only, 16 gutter; brand hidden",
            "brand → 120 band above form",
            "50/50 split, form 400 wide"
          ]
        },
        {
          "line": 804,
          "cells": [
            "Centred",
            "card becomes full-width sheet (no border), logo top",
            "card 440 centred",
            "card 440/480 centred"
          ]
        },
        {
          "line": 836,
          "cells": [
            "375",
            "768",
            "1280"
          ]
        },
        {
          "line": 837,
          "cells": [
            "---",
            "---",
            "---"
          ]
        },
        {
          "line": 838,
          "cells": [
            "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"
          ]
        },
        {
          "line": 861,
          "cells": [
            "375 (phone door station)",
            "768 (portrait tablet)",
            "1280 (landscape tablet/desktop)"
          ]
        },
        {
          "line": 862,
          "cells": [
            "---",
            "---",
            "---"
          ]
        },
        {
          "line": 863,
          "cells": [
            "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"
          ]
        },
        {
          "line": 869,
          "cells": [
            "Screen type",
            "Layout",
            "Reference",
            "Patterns it composes",
            "SpaceWorks screens (examples)"
          ]
        },
        {
          "line": 870,
          "cells": [
            "---",
            "---",
            "---",
            "---",
            "---"
          ]
        },
        {
          "line": 871,
          "cells": [
            "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"
          ]
        },
        {
          "line": 872,
          "cells": [
            "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"
          ]
        },
        {
          "line": 873,
          "cells": [
            "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"
          ]
        },
        {
          "line": 874,
          "cells": [
            "Settings rows",
            "L1 + **L5 SettingsLayout**",
            "R5, R6, R16, R17",
            "P15, P16, P5 panel, P19, P24",
            "Makerspace settings, account, API access, modules, backups, exports"
          ]
        },
        {
          "line": 875,
          "cells": [
            "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"
          ]
        },
        {
          "line": 876,
          "cells": [
            "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"
          ]
        },
        {
          "line": 877,
          "cells": [
            "Scanner / kiosk",
            "**L10 KioskLayout**",
            "R27, R28",
            "P28 PIN, P29 station, P30 undo, P5 panel",
            "Kiosk station, door check-in, desk kiosk, scanner page"
          ]
        },
        {
          "line": 878,
          "cells": [
            "Public list",
            "**L9 PublicLayout**",
            "R18 chrome, R20",
            "P6 rows, P10 chips, P9 segmented",
            "Catalogue (with `aside` cart), events list, machines, bookings"
          ]
        },
        {
          "line": 879,
          "cells": [
            "Public detail",
            "L9 + **PublicDetailLayout**",
            "R18, R19, R21, R23",
            "P25, P10, action card",
            "Event page, item page, session, speaker, organization page"
          ]
        },
        {
          "line": 880,
          "cells": [
            "Public narrow task",
            "L9 `width=\"narrow\"`",
            "R24, R25, R26",
            "P26, P27",
            "Feedback, running order, ticket, self-checkout result"
          ]
        },
        {
          "line": 881,
          "cells": [
            "Auth",
            "**L8 AuthLayout**",
            "R11",
            "P22, P9",
            "Staff sign-in, member sign-in/up"
          ]
        },
        {
          "line": 882,
          "cells": [
            "Centred task card",
            "**L8 CenteredCardLayout**",
            "R12–R15",
            "P23",
            "Reset, verify, MFA, invitations, access denied, not found"
          ]
        },
        {
          "line": 938,
          "cells": [
            "#",
            "Section header",
            "Items (key → label)",
            "Notes"
          ]
        },
        {
          "line": 939,
          "cells": [
            "---",
            "---",
            "---",
            "---"
          ]
        },
        {
          "line": 940,
          "cells": [
            "0",
            "*(no header)*",
            "**dashboard → \"Home\"**, **notifications → \"Inbox\"** (unread badge)",
            "The \"Home\" pattern. The unread count stays in the accessible name (\"Inbox, 3 unread\")."
          ]
        },
        {
          "line": 941,
          "cells": [
            "1",
            "Front desk",
            "**requests → \"Requests\"** (count badge: pending + ready), **direct → \"Direct handout\"**, **handover → \"Job pickups\"**, **payments → \"Payments\"**",
            "The daily loop. Payments sits here because `record_payment` is a handout action and front-desk staff take money at the desk."
          ]
        },
        {
          "line": 942,
          "cells": [
            "2",
            "Inventory",
            "**inventory → \"Items\"**, **needsfix → \"Repair shelf\"**, **stocktake → \"Stocktake\"**, **transfers → \"Transfers\"**, **tobuy → \"To buy\"**; *categories → \"Categories\"*, *containers → \"Containers\"*, *ledger → \"Stock ledger\"*, *warranty → \"Warranties\"*, *qr → \"QR tools\"*, *scanner → \"Scanner\"*, *bulk → \"Bulk import\"*",
            "Page `h1` stays \"Inventory\" (the test pin is the panel heading, not the nav label). \"Ledger\" gains \"Stock\" so it is not mistaken for money."
          ]
        },
        {
          "line": 943,
          "cells": [
            "3",
            "Machines",
            "**machines → \"Machines\"** + dynamic sub-items per machine type when active, **devices → \"Devices\"**",
            "Sub-items come from the machine-type list already fetched by `MachinesPanel`, linked with `staffTabPath(\"machines\", …, machineTypeSegment(type))`. This uses the existing `TABS_WITH_SUBPATHS` route, so it is the \"Settings › General\" sub-nav pattern on an existing route."
          ]
        },
        {
          "line": 944,
          "cells": [
            "4",
            "Community",
            "**members → \"Members\"**, **events → \"Events\"**, **bookings → \"Bookings\"**, *cards → \"Member cards\"*",
            ""
          ]
        },
        {
          "line": 945,
          "cells": [
            "5",
            "Insights",
            "**reports → \"Reports\"**, **audit → \"Audit log\"**, *accountability → \"Accountability\"*",
            ""
          ]
        },
        {
          "line": 946,
          "cells": [
            "6",
            "Organizations",
            "**organizations → \"Organizations\"**, **organized → \"Organized events\"**, **organization-analytics → \"Org analytics\"**",
            "All three are cross-venue. The section shows a muted caption \"Across venues\" so the user knows the selected makerspace does not scope it. In single-tenant mode all three are hidden by gating, so the section disappears. For a governance-only actor this is the only section (see 2.5)."
          ]
        },
        {
          "line": 947,
          "cells": [
            "—",
            "*(bottom block, above the user chip)*",
            "**settings → \"Settings\"** with sub-items when any Settings-family tab is active: settings → \"General\", users → \"Staff & roles\", emailtemplates → \"Email templates\", email-logs → \"Delivery log\", api → \"API access\", exports → \"Data export\", backups → \"Backup & restore\", usage → \"Usage & limits\", modules → \"Modules\", migration → \"Tenant migration\"",
            "The Settings › General / API access sub-nav (R5, R6). \"Admin\" becomes one item that expands in place. If `settings` itself is not allowed but a child is (e.g. a role with only `edit_inventory` sees Email templates), the parent link goes to the **first allowed child**."
          ]
        },
        {
          "line": 948,
          "cells": [
            "—",
            "Platform *(bottom, superadmin only)*",
            "**platform-dashboard → \"Platform dashboard\"**, **platform → \"Platform settings\"**",
            "Rendered under a hairline with a muted \"Platform\" label so it is visibly a different scope."
          ]
        },
        {
          "line": 1394,
          "cells": [
            "Sub-nav section",
            "Existing components"
          ]
        },
        {
          "line": 1395,
          "cells": [
            "---",
            "---"
          ]
        },
        {
          "line": 1396,
          "cells": [
            "General",
            "`MakerspaceGeneralSettings`, `MakerspaceProfileSettings`, `MakerspaceLocationSettings` (incl. hours)"
          ]
        },
        {
          "line": 1397,
          "cells": [
            "Branding & public site",
            "`MakerspaceBrandingSettings`, `MakerspacePublicStatsSettings`, public print status lookup policy, `MakerspaceSubdomainSettings`, `MakerspaceCustomDomainSettings`"
          ]
        },
        {
          "line": 1398,
          "cells": [
            "Features",
            "`MakerspaceFeatureSettings`, `SpacePacksPanel`"
          ]
        },
        {
          "line": 1399,
          "cells": [
            "Lending",
            "loan, reminder and kit settings inside `MakerspaceReminderSettings`, `KioskStationSettings`"
          ]
        },
        {
          "line": 1400,
          "cells": [
            "Membership",
            "`MakerspaceMembershipSettings`, `MakerspaceGeofenceSettings`"
          ]
        },
        {
          "line": 1401,
          "cells": [
            "Bookings",
            "`MakerspaceBookingSettings`, `MakerspaceBookingRulesSettings`"
          ]
        },
        {
          "line": 1402,
          "cells": [
            "Machines & materials",
            "`MakerspaceFilamentSettings`"
          ]
        },
        {
          "line": 1403,
          "cells": [
            "Money",
            "`MakerspacePaymentSettings`, `BillingDocumentsSettings`"
          ]
        },
        {
          "line": 1404,
          "cells": [
            "Notifications",
            "staff email toggle, `NotificationTimingSettings`, `NotificationMuteMatrix`, `NotificationRecipientPicker`, `NotificationDestinations`"
          ]
        },
        {
          "line": 1405,
          "cells": [
            "Email & integrations",
            "`MakerspaceEmailSettings`, `MakerspaceWebhookSettings`, `IntegrationHealthPanel`"
          ]
        },
        {
          "line": 1406,
          "cells": [
            "Privacy & evidence",
            "Superadmin access, `EvidenceRetentionPanel` (and `AbandonedUploadCleanupSection` where it lives)"
          ]
        },
        {
          "line": 1407,
          "cells": [
            "Danger zone",
            "`MakerspaceArchiveRequestPanel` (the two-key archive request) as a P16 card"
          ]
        },
        {
          "line": 1528,
          "cells": [
            "Tab",
            "Content (existing components)"
          ]
        },
        {
          "line": 1529,
          "cells": [
            "---",
            "---"
          ]
        },
        {
          "line": 1530,
          "cells": [
            "Overview",
            "Stat cards (Going n/cap with bar · Waitlist · Awaiting approval · Invites sent), \"Latest registrations\" list (5 rows + \"All registrations →\"), an \"At a glance\" card (When, Where, Who can join, Price), and the door-ready CTA card when tomorrow or today and offline check-in is enabled."
          ]
        },
        {
          "line": 1531,
          "cells": [
            "Registrations",
            "`EventRegistrationRoster` as a P14 table with status pills (Going, Waitlist, Pending) and inline Approve / Decline… for pending; `EventRegisterMember` as \"+ Add registration\" (outline)."
          ]
        },
        {
          "line": 1532,
          "cells": [
            "Check-in",
            "The R8 layout: progress stat plus offline callout (`OfflineCheckInOperator`), camera and Start scanning (`EventCheckInScanner`), find a guest, toggles, Recent check-ins with **inline Undo only if the backend supports reversing a check-in** (otherwise omit; do not fake it), and the door-station card (`EventStationSettings`)."
          ]
        },
        {
          "line": 1533,
          "cells": [
            "Tickets & invites",
            "`EventTicketsPanel`, `EventPromosPanel`, `EventInvitesPanel`, each a section; shown only for enabled `ticketing_features`."
          ]
        },
        {
          "line": 1534,
          "cells": [
            "Feedback",
            "`EventFeedbackPanel` and responses; certificates (`EventCertificateActions`)."
          ]
        },
        {
          "line": 1535,
          "cells": [
            "Team",
            "`EventOrganizers`, `EventCollaborators`."
          ]
        },
        {
          "line": 1536,
          "cells": [
            "Settings",
            "Image (`ImageUploader`), `EventFields` as settings rows, `EventCategoriesField`, series overrides (\"Reset to series value\" per field), Discard/Save; lifecycle at the end: Complete (outline) and a danger card \"Cancel event… Registrants are notified and registration closes.\""
          ]
        },
        {
          "line": 1858,
          "cells": [
            "Tab",
            "Layout · pattern"
          ]
        },
        {
          "line": 1859,
          "cells": [
            "---",
            "---"
          ]
        },
        {
          "line": 1860,
          "cells": [
            "notifications (Inbox)",
            "L3 · P12 rows grouped by day, unread dot, \"Mark all read\" outline, filter tabs All / Unread; empty \"You're all caught up.\""
          ]
        },
        {
          "line": 1861,
          "cells": [
            "handover (Job pickups)",
            "L3 + L7 · S2 row pattern: tabs Ready / Collected; inline \"Hand over\" opens `HandoverConsole` in S3 task mode (photo rules as today)."
          ]
        },
        {
          "line": 1862,
          "cells": [
            "payments",
            "L3 · Stat cards (Outstanding, Collected this month, Awaiting settlement), tabs Outstanding / Settled / Refunds, P14 table with inline \"Record payment…\" (`SettlementDialog`); never Undo (append-only receipts; corrections are `amends`)."
          ]
        },
        {
          "line": 1863,
          "cells": [
            "ledger, transfers, stocktake, needsfix, tobuy, containers, categories",
            "L3 (stocktake session = L7) · Dense-table adaptation (§5.1) with PageHeader plus one primary each: \"+ New transfer\", \"Start stocktake\", \"+ Add to list\", \"+ New container\", \"+ New category\"; needsfix rows get inline \"Back in stock\" / \"Write off…\"."
          ]
        },
        {
          "line": 1864,
          "cells": [
            "qr, scanner, bulk",
            "L6 `width=\"narrow\"` · Tool pages: centred 720 column, P21 camera block for the scanner, P18 dropzone for bulk import with a validation preview table."
          ]
        },
        {
          "line": 1865,
          "cells": [
            "warranty, devices",
            "L3 + L4 drawer · Table plus drawer detail with P15 rows."
          ]
        },
        {
          "line": 1866,
          "cells": [
            "cards (Member cards)",
            "L3 · Camera scan block plus the card list; the scan result as a P29 result card."
          ]
        },
        {
          "line": 1867,
          "cells": [
            "accountability",
            "L3 · Table of borrowers with restriction status pills; row menu Restrict… / Restore."
          ]
        },
        {
          "line": 1868,
          "cells": [
            "organized, organization-analytics, organizations",
            "L2 / L3 / L4-report · R1 org cards for organizations; organized events reuse S11 rows; analytics reuses S14."
          ]
        },
        {
          "line": 1869,
          "cells": [
            "emailtemplates, email-logs, api",
            "L6 / L3 / L5 · R6 patterns (form card, empty state, code/accordion) for api; logs as a P14 table with status pills; templates as a list plus an editor page with a live preview (P18)."
          ]
        },
        {
          "line": 1870,
          "cells": [
            "exports, backups, migration, usage, modules, platform*",
            "L5 (restore/migration runs = L7) · P15 settings rows plus P16 danger cards for restore/purge; jobs show progress rows (JobTray)."
          ]
        }
      ],
      "links": [
        {
          "line": 5,
          "label": "Yuyu",
          "target": "https://github.com/twilighty-abhi/yuyu",
          "image": false
        }
      ],
      "code": [
        {
          "line": 79,
          "language": "",
          "endLine": 97,
          "body": "┌──────────── 240–300 ────────────┬───────────────────── main ─────────────────────┐\n│ [S] Space Works                  │  36px gutter                                   │\n│ ┌─────────────────────────────┐ │                                                │\n│ │[SD] Screenshot Demo Coll… ⇕ │ │                                                │\n│ │     Owner                    │ │                                                │\n│ └─────────────────────────────┘ │                                                │\n│ ▣ Events            (active)    │                                                │\n│ ◌ Series                         │                                                │\n│ ◌ Members                        │                                                │\n│ ◌ Settings                       │                                                │\n│     General      (sub-items     │                                                │\n│     API access    when active)  │                                                │\n│                                  │                                                │\n│ View public page ↗               │                                                │\n│ (PO) Priya Organiser             │                                                │\n│ Sign out                         │                                                │\n└──────────────────────────────────┴────────────────────────────────────────────────┘"
        },
        {
          "line": 122,
          "language": "",
          "endLine": 126,
          "body": "Good morning, Priya                       ← 15 muted (greeting or date line)   y+40\nEvents                         [ New series ] [■ + New event ]  ← title 40 bold; buttons 44h\nPeople who can work on this organisation's events.   ← optional 15 muted subtitle, 8 below"
        },
        {
          "line": 139,
          "language": "",
          "endLine": 146,
          "body": "← All events                                              13 semibold link\n┌OCT┐ Demo Summit 2026                     [ View page ↗ ] [■ Open check-in ]\n│14 │ (Published) Public · Tomorrow, 9:30 AM\n└───┘\nOverview  Guests  Page & programme  Registration form  Invites  Check-in  Feedback  Settings\n━━━━━━━━──────────────────────────────────────────────────────────────────────── (full bleed)"
        },
        {
          "line": 199,
          "language": "",
          "endLine": 209,
          "body": "┌──────────────────────────────────────────────────────────────────────────┐\n│ ┌OCT┐  Demo Summit 2026                                   5 / 120 going   │ 82 tall\n│ │14 │  Tomorrow, 9:30 AM · Bangalore International Centre ▬───────────    │\n│ └───┘                                                                     │\n└──────────────────────────────────────────────────────────────────────────┘ 12 gap\n┌ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─┐\n  ┌NOV┐  Volunteer onboarding                              (Finish & publish)   ← draft: dashed,\n  │12 │  Draft · only your team can see it                                        grey fill/chip\n└ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─┘"
        },
        {
          "line": 300,
          "language": "",
          "endLine": 318,
          "body": "Logo                               [SD]  ( Upload logo )\nSquare works best. JPEG, PNG or…\n───────────────────────────────────────────────────────────────── hairline\nName & description                 Name\nShown at the top of your public    [ Screenshot Demo Collective          ]\npage.                              Description\n                                   [ A demo organisation used to…        ]\n───────────────────────────────────────────────────────────────── hairline\nWeb address                        [ space-works.tech/  shots-org   Copy ]  (read-only: grey fill)\nSet when the organisation was created.\n─────────────────────────────────────────────────────────────────\n                                              ( Discard ) [■ Save changes ]\n┌───────────────────────────────────────────────────────────────────────────┐\n│ Delete organisation                                 ( Delete organisation… )│ red border\n│ Permanently removes every event, registration and membership. This can't  │\n│ be undone.                                                                 │\n└───────────────────────────────────────────────────────────────────────────┘"
        },
        {
          "line": 394,
          "language": "",
          "endLine": 409,
          "body": "┌──────────────── 640 ────────────────┬──────────── 604 (16 inset) ────────────┐\n│ [S] Space Works                      │  Free events.                           │\n│                                      │  Your community's                       │\n│        Welcome back.        (44 bold)│  data stays yours.        (40 bold)     │\n│        [ Sign in | Create account ]  │                                         │\n│        ( G  Continue with Google )   │        ╭ OCT 14 Demo Summit ╮ (rot −3°) │\n│        ───── or with email ─────     │             ╭ OCT 20 Weekly call ╮ (+2°)│\n│        Email                         │      (✓ Meera checked in)               │\n│        [                        ]    │                                         │\n│        Password            Forgot?   │                                         │\n│        [                     👁 ]    │                                         │\n│        [■■■■■■ Sign in ■■■■■■■]      │                                         │\n│        By continuing you agree to…   │                                         │\n└──────────────────────────────────────┴─────────────────────────────────────────┘"
        },
        {
          "line": 448,
          "language": "",
          "endLine": 468,
          "body": "[SD] Screenshot Demo Collective                     Discover events  ( Sign in )   48h header\n──────────────────────────────────────────────────────────────────────────────────\n┌──────────────────── cover 1110×316 r16 ───────────────────────┐\n└───────────────────────────────────────────────────────────────┘\n(Free)(In person)(3 sessions · 2 speakers)            ┌ Join this event ──────────┐ 318w\nDemo Summit 2026              (~70 bold, brand ink)   │ 5 going      115 spots left│ sticky\nBuild the tools your community needs.  (20)           │ ▬──────────────────────── │\n┌OCT┐ Wednesday, 14 October   [⌖] Bangalore Intl Ctr  │ (MN)(DP)(SK) Meera, Dev +3 │\n│14 │ 9:30 AM – 5:30 PM IST       Domlur, Bengaluru   │ [■ Register — it's free ■] │\nAbout  Schedule  Speakers  Venue  FAQ  (anchor tabs)  │ (Add to calendar)( Share ) │\n━━━━━─────────────────────────────────────────        └───────────────────────────┘\nbody 17/1.6, max 600                                  ┌ Hosted by  [SD] Screenshot…→┐\n[18 talks][Hands-on workshops][Free lunch]  3 highlight tiles, first brand-tinted\nSchedule ............................ Live schedule →\n9:30 AM  Opening keynote: tools that outlast…            (Main stage)\n60 min   Asha Menon\nSpeakers (2-col cards) · Partners (2-col) · Venue (map | text, Get directions ↗) · FAQ (disclosure)\n──────────────────────────────────────────────────────────────────────────────────\n[S] Powered by Space Works                                Privacy · Terms"
        },
        {
          "line": 593,
          "language": "ts",
          "endLine": 609,
          "body": "type Action = { label: string; href?: string; onClick?: () => void; icon?: IconName;\n  pending?: boolean; pendingLabel?: string; disabled?: boolean; disabledReason?: string; // required when disabled\n  tone?: \"default\" | \"danger\"; external?: boolean; confirms?: boolean };              // confirms → label gets \"…\"\ntype SecondaryAction = Action | { label: string; menu: Action[] };\ntype Tab = { key: string; label: string; href: string; count?: number };              // gated tabs are omitted, never disabled\ntype Stat = { label: string; value: number | string; of?: number; progress?: number;   // 0–1\n  tone?: \"neutral\" | \"attention\" | \"danger\" | \"success\"; href?: string };               // tone colours the number only\ntype CalloutProps = { size: \"banner\" | \"panel\" | \"card\" | \"inline\"; tone: \"warn\" | \"danger\" | \"success\";\n  lead: string; body?: string; action?: Action };                                       // ≤1 per screen\ntype Identity = { kind: \"date\"; date: string } | { kind: \"image\"; src: string } |\n  { kind: \"icon\"; icon: IconName; tone: Tone } | { kind: \"avatar\"; name: string; seed: string };\ntype QueryState = { status: \"loading\" | \"error\" | \"ready\"; error?: string; onRetry?: () => void };\ntype EmptyProps = { message: string; action?: Action };                                 // P17 dashed card\ntype PageHeaderProps = { eyebrow?: string; title: string; subtitle?: string; meta?: ReactNode;\n  primary?: Action; secondary?: SecondaryAction; overflow?: Action[] };"
        },
        {
          "line": 616,
          "language": "ts",
          "endLine": 634,
          "body": "AppShell({\n  variant: \"staff\" | \"member\";\n  workspace: { name: string; subtitle: string /* role or membership status */; avatar: Identity;\n    menu?: Action[]; locked?: boolean /* single-tenant: static card, no chevron */ };\n  search?: { label: \"Search and commands\"; shortcut: \"mod+k\"; onOpen: () => void };\n  nav: Array<{ label?: string /* section header; omit for flat */; caption?: string;\n    items: Array<{ key: string; label: string; href: string; icon: IconName; badge?: number;\n      badgeLabel?: string /* accessible-name suffix */; children?: Array<{ key; label; href }> }>;\n    more?: Array<…same item shape…> }>;\n  activeKey: string;\n  pinned?: Array<SidebarSection>;          // bottom block: Settings family, Platform\n  footerLinks?: Action[];                  // \"View public page ↗\"\n  user: { name: string; role?: string; menu: Action[]; onSignOut: () => void };\n  compactNav: \"drawer\" | \"bottom-tabs\";    // bottom-tabs only when ≤5 top-level items\n  status?: ReactNode;                      // JobTray row\n  children: ReactNode;                     // exactly one page layout (L2–L6)\n})"
        },
        {
          "line": 644,
          "language": "ts",
          "endLine": 655,
          "body": "DashboardLayout({\n  header: PageHeaderProps & { eyebrow: string /* date or greeting */ };\n  callout?: CalloutProps;\n  progress?: ReactNode;                    // setup checklist card\n  stats: Stat[];                           // renders ≤4; rest go to overflow\n  overflowStats?: { label: \"Everything else\"; stats: Stat[] };\n  main: Array<{ title: string; action?: Action; content: ReactNode /* ListRow[] */; empty: EmptyProps }>;\n  rail?: { title: string; items: ActivityItem[]; seeAll?: Action } ;  // omit → main goes full width\n  state: QueryState;\n})"
        },
        {
          "line": 665,
          "language": "ts",
          "endLine": 681,
          "body": "ListLayout({\n  header: PageHeaderProps;\n  callout?: CalloutProps;\n  stats?: Stat[];                          // ≤4, only when they summarise or act as filters\n  tabs?: Tab[]; activeTab?: string;        // filter tabs with counts (P8)\n  filters?: { search?: { label: string; value: string; onChange };\n    controls?: ReactNode /* sort, saved views, column picker */; chips?: FilterChip[]; onClear?: () => void };\n  body: { kind: \"rows\"; rows: ReactNode /* ListRow[] */ } | { kind: \"table\"; table: ReactNode /* DataTable */ };\n  bulkBar?: { count: number; actions: Action[]; onClear: () => void };\n  empty: EmptyProps; filteredEmpty?: EmptyProps;\n  pagination?: { page: number; pageSize: number; count: number; onChange };\n  rail?: ReactNode;                        // optional activity rail (Events)\n  detail?: ReactNode;                      // a DetailLayout presentation=\"drawer\"\n  state: QueryState;\n})"
        },
        {
          "line": 691,
          "language": "ts",
          "endLine": 705,
          "body": "DetailLayout({\n  presentation: \"page\" | \"drawer\";         // drawer: 640 (default) | 720 (wide); full-screen <768\n  back: { label: string; href: string };   // \"← All events\"\n  identity: Identity; title: string; status?: StatusPill; meta?: Array<string | ReactNode>;\n  actions?: { primary?: Action & { targetsTab?: string } /* auto-hidden when targetsTab === activeTab */;\n    secondary?: SecondaryAction; overflow?: Action[] };\n  banner?: CalloutProps;                   // e.g. read-only/terminal state\n  tabs?: Tab[]; activeTab?: string;        // URL-driven (?tab= or subpath)\n  main: ReactNode; aside?: ReactNode;      // aside 280: \"At a glance\", CTA card\n  footer?: { primary?: Action; secondary?: Action[] };   // sticky; drawers only\n  danger?: DangerZoneProps[];              // rendered last in main\n  state: QueryState;\n})"
        },
        {
          "line": 715,
          "language": "ts",
          "endLine": 729,
          "body": "SettingsLayout({\n  header: { title: string; subtitle: string /* scope + \"Changes go live when you save.\" */ };\n  tabs?: Tab[];                            // Profile | Security style (≤4)\n  subnav?: \"auto\" | false;                 // auto when ≥5 sections: sticky list 200 (≥1280) / chip row (<1280), scroll-spy\n  sections: Array<{ id: string; title?: string; description?: string;\n    rows: Array<SettingsRowProps> | ReactNode;\n    save?: { dirty: boolean; pending: boolean; error?: string; onDiscard: () => void; onSave: () => void } }>;\n  danger?: DangerZoneProps[];\n  state: QueryState;\n})\nSettingsRow({ label: string; helper?: string; control: ReactNode; status?: StatusPill;\n  readOnly?: { reason: string }; action?: Action /* independent row action, e.g. \"Update password\" */ })\nDangerZone({ title: string; consequence: string; action: Action & { confirms: true } })"
        },
        {
          "line": 739,
          "language": "ts",
          "endLine": 748,
          "body": "FormPageLayout({\n  back?: { label: string; href: string };\n  header: { title: string; subtitle?: string };\n  form: ReactNode;                         // Field/Fieldset primitives; optional fields marked \"Optional\"\n  preview?: { label: string /* \"PUBLIC PAGE PREVIEW\" */; content: ReactNode };\n  submit: Action; cancel?: Action;         // \"Create X\" primary left + \"Cancel\" text\n  width?: \"default\" | \"narrow\";            // narrow = 720 single column (tools)\n})"
        },
        {
          "line": 758,
          "language": "ts",
          "endLine": 772,
          "body": "FlowLayout({\n  title: string; subject?: string;         // \"Issue request #1042 · Meera Nair\"\n  steps: Array<{ key: string; label: string; state: \"done\" | \"current\" | \"todo\";\n    summary?: string /* captured value, e.g. \"BOX-0042\" */; required?: boolean; missing?: boolean }>;\n  current: string; onStepSelect?: (key: string) => void;   // only done steps selectable\n  work: ReactNode;                         // camera block, evidence tile, item steppers\n  footer: { back?: Action; next: Action };  // next.disabledReason mandatory when disabled\n  onCancel: () => void; leaveGuard?: string;   // confirm copy when evidence captured\n  result?: ResultCardProps;                // final step: tone, title, summary rows, actions; replaces work\n  error?: CalloutProps;                    // partial-failure danger callout above footer\n  compact?: boolean;                       // all steps on one scroll page (expert mode)\n  presentation: \"task\" | \"kiosk\";          // task: hides sidebar; kiosk: rendered inside L11\n})"
        },
        {
          "line": 782,
          "language": "ts",
          "endLine": 799,
          "body": "AuthLayout({\n  brand: { headline: string /* the one accent phrase */; showcase?: ReactNode /* aria-hidden */;\n    tenant?: TenantBranding /* member auth: tenant colour + logo */ };\n  eyebrow?: string; title: string;          // \"Welcome back.\"\n  modeSwitch?: { options: [string, string]; value; onChange };   // Sign in | Create account\n  social?: ReactNode; dividerLabel?: string; // \"or with email\"\n  form: ReactNode; legal?: ReactNode;\n})\nCenteredCardLayout({\n  media?: { icon: IconName; tone: Tone } | { avatars: [Identity, Identity] } | { banner: Tone };\n  eyebrow?: string; title: string; body: ReactNode;   // names the identity in bold\n  content?: ReactNode;                     // fields, code boxes, strength meter\n  primary: Action; escape?: Action;        // one underlined escape link\n  footer?: ReactNode;                      // \"Signed in as … · Switch account\"\n  width?: 440 | 480;\n})"
        },
        {
          "line": 810,
          "language": "ts",
          "endLine": 834,
          "body": "PublicLayout({\n  makerspace: { name: string; logo?: string; slug: string; branding?: TenantBranding };\n  nav: Array<{ label: string; href: string }>;     // only modules that are on\n  headerAction?: Action;                   // \"Sign in\" or the page primary when no action card\n  liveStatus?: StatusPill;                 // \"● Live · updates automatically\"\n  width: \"wide\" /*1110*/ | \"default\" /*960*/ | \"narrow\" /*600*/;\n  breadcrumb?: Array<{ label: string; href?: string }>;\n  aside?: ActionCardProps;                 // sticky right card (catalogue cart)\n  children: ReactNode;\n  footer: { credit: \"Powered by space works\"; links: Action[] };\n})\nPublicDetailLayout({                       // always rendered inside PublicLayout width=\"wide\"\n  cover?: { src: string; alt: \"\" };\n  chips: Chip[]; title: string; tagline?: string;\n  facts: Array<{ identity: Identity; primary: string; secondary?: string }>;  // date block, venue block\n  sections: Array<{ id: string; label: string; content: ReactNode }>;         // anchor tabs\n  actionCard: ActionCardProps;\n  host?: { identity: Identity; name: string; href: string };\n})\ntype ActionCardProps = { title: string; summary?: ReactNode /* counts + bar, avatars */;\n  form?: ReactNode; primary?: Action; secondary?: Action[]; note?: string;\n  state: \"open\" | \"closed\" | \"done\"; doneContent?: ReactNode;\n  mobileBar: { summary: string; label: string } };"
        },
        {
          "line": 844,
          "language": "ts",
          "endLine": 859,
          "body": "KioskLayout({\n  context: { identity: Identity; title: string; subtitle: string };   // \"Door check-in · Station 1\"\n  connection: { online: boolean; queued?: number };\n  progress?: { done: number; of: number; label: string };            // \"3 / 5 checked in\"\n  headerActions: Action[];                 // Full screen, Lock station\n  mode: \"lock\" | \"ready\" | \"work\";\n  lock?: { title: string; helper: string; pinLength: number; onSubmit: (pin: string) => void;\n    pending: boolean; error?: string; disabledReason?: string };\n  ready?: { primary: Action };             // \"Start operator shift\"\n  work?: { capture: ReactNode /* camera */; panel: ReactNode /* result card or FlowLayout kiosk */;\n    recent?: ReactNode };\n  idleCountdown?: { seconds: number; onKeep: () => void };\n  confirmLock?: { pendingCount: number; onDiscard: () => void; onKeep: () => void };\n})"
        },
        {
          "line": 1045,
          "language": "",
          "endLine": 1062,
          "body": "Wednesday, 14 October\nGood morning, Priya                                   ( View public page ↗ ) [■ + Quick add ▾]\n┌ ! 3 loans are overdue. Remind borrowers or record a return.        Review overdue → ┐  (only if >0)\n└─────────────────────────────────────────────────────────────────────────────────────┘\n┌Pending requests┐┌Ready for handover┐┌Overdue loans┐┌Bookings to approve┐   ← max 4 \"needs action\"\n│ 4              ││ 2                ││ 3           ││ 1                 │\n└────────────────┘└──────────────────┘└─────────────┘└───────────────────┘\nComing up                                                     Recent activity\n┌OCT┐ Meera Nair returns 3 items        Due tomorrow (Remind)   (PO) Priya accepted request\n│15 │ Request #1042 · Arduino kit ×2…                              #1042 · 2 min ago\n┌OCT┐ Laser cutter induction            12 / 16 going           (DP) Dev returned Multimeter\n│16 │ Event · 6:30 PM · Main hall                                  · 1 hr ago\n┌OCT┐ Woodshop bench booked              Awaiting approval         …\n│17 │ Booking · 10:00–12:00 · Sana Khan        (Review)           See all activity →\nEverything else ▸  (disclosure: remaining non-zero tiles as a compact 2-col list)\n[ Setup checklist card — only while incomplete, above \"Coming up\" ]"
        },
        {
          "line": 1096,
          "language": "",
          "endLine": 1107,
          "body": "Requests                                                   ( Export ) [■ Start handover ]*\nBorrow requests from members, from review to return.\nPending 4 │ Ready 2 │ On loan 7 │ History                 [ Search name, email, purpose  ⌕ ] [Sort ▾] [Views ▾]\n━━━━━━━━━\n┌ (MN) Meera Nair                              ⏱ Requested 2 h ago     (Pending)   [ Review ] ⋯ ┐\n│      #1042 · 3 items · Arduino kit ×2, Multimeter ×1 · \"Robotics club demo\"                │\n└─────────────────────────────────────────────────────────────────────────────────────────────┘\n┌OCT┐ Dev Patel   (Ready tab)                   Box not assigned yet    [■ Start handover ] ⋯ ┐\n│15 │ #1039 · 1 item · Soldering station · due back 22 Oct                                      │\n┌OCT┐ Sana Khan   (On loan tab; chip = due date, band red if overdue)  Overdue 2 days  [ Return ] ⋯"
        },
        {
          "line": 1147,
          "language": "",
          "endLine": 1161,
          "body": "← Requests                                                             ✕\n(MN)  Request #1042                          (Ready for handover)\n      Meera Nair · requested 14 Oct, 9:12 · due back 22 Oct\n○──●──○──○  Requested · Accepted · Issued · Returned            (StatusStepper)\nOverview  Evidence  Timeline\n──────────────────────────────────────────────────\nItems                                        At a glance\n┌ Arduino kit        ×2   Shelf B3  (QR-tracked) ┐   Purpose   Robotics club demo\n│ Multimeter         ×1   Shelf A1               │   Contact   meera@… · +91…\n└────────────────────────────────────────────────┘   Box       Not assigned\n                                                     Accepted  by Priya (Space Manager)\n─────────────────────────────────── sticky footer ─────────────────────\n( Set due date )                                  [■ Start handover ]"
        },
        {
          "line": 1179,
          "language": "",
          "endLine": 1191,
          "body": "Desktop: full-screen task mode (no sidebar), 2 columns\n┌ Issue request #1042 · Meera Nair ─────────────────────────────── ( Cancel ) ┐\n│ ① Scan box        ✓ BOX-0042   │                                            │\n│ ② Check borrower  ✓            │   ┌──────── camera (dark, r16) ────────┐   │\n│ ③ Items           2 / 3 assets │   │        ⌜            ⌝              │   │\n│ ④ Photo & remark  ● required   │   │   Hold the asset QR in the frame   │   │\n│ ⑤ Receipt                      │   └────────────────────────────────────┘   │\n│                                │   Can't scan? [ Type the QR code   ] (Check)│\n│                                │   Scanned  ✓ ARD-0091  ✓ ARD-0092   Remove  │\n│                                │                         ( Back ) [■ Next ]  │\n└────────────────────────────────┴────────────────────────────────────────────┘"
        },
        {
          "line": 1230,
          "language": "",
          "endLine": 1236,
          "body": "Direct handout                                                    [■ + New handout ]\nLend tools straight from the shelf, without a request.\nOn loan 5 │ Returned │ Claim codes\n┌OCT┐ Arjun Rao                                       Due 20 Oct     [ Return ] ⋯\n│20 │ Handout #88 · Multimeter, Probe set · 2 tool QRs · by Priya"
        },
        {
          "line": 1256,
          "language": "",
          "endLine": 1268,
          "body": "Inventory                                                 ( Export ▾ ) [■ + Add item ]\n248 items · 12 low stock · 3 on the repair shelf\n┌ ! 6 items are at or below their reorder point.                       Review suggestions → ┐ (only if >0)\nAll 248 │ Low stock 12 │ Out of stock 4 │ Archived            [ Search items ⌕ ] [Views ▾] [Columns ▾]\n┌──────────────────────────────────────────────────────────────────────────────────────────────┐\n│ ☐  Item                          Mode         Total  Available     Issued  Damaged  Lost   ⋯ │ 40h header\n│ ☐  [img] Arduino Uno R3          Count        20     (Limited) 3   15      1        1      ⋯ │ 56h rows\n│ ☐  [img] Multimeter Fluke 101    Individual   6      (Available) 5 1       0        0      ⋯ │\n└──────────────────────────────────────────────────────────────────────────────────────────────┘\n                                             1–24 of 248   ‹ 1 2 3 … 11 ›\n╭ 3 selected   ( Enable QR ) ( Disable QR ) ( Export 3 )                     Clear ╮  ← sticky bulk bar"
        },
        {
          "line": 1298,
          "language": "",
          "endLine": 1307,
          "body": "← Inventory\n[img] Arduino Uno R3                                 ( View public page ↗ )\n      (Limited) Count-tracked · Electronics · Public: status only\nDetails  Stock  QR & assets  History  Custody\n───────────────────────────────────────────────\nDetails: settings rows (Name & description │ Photo │ Category │ Public visibility │ Kit components │ Borrowing terms)\n                                              ( Discard ) [■ Save changes ]   ← appears when dirty\n┌ Archive item ─ Hides it from active inventory and the public catalogue. ( Archive… ) ┐ red"
        },
        {
          "line": 1328,
          "language": "",
          "endLine": 1338,
          "body": "Members                                                         [■ Invite member ]\nPeople who belong to this makerspace and what they can do here.\n┌ ! 3 people are waiting for approval.                                   Review requests → ┐\nMembers 128 │ Requests 3 │ Present now 4 │ Plans │ Waivers          [ Search ⌕ ] [Status ▾]\n┌──────────────────────────────────────────────────────────────────────────────────────┐\n│ Person                        Role             Status        Waiver      Joined    ⋯ │\n│ (MN) Meera Nair  (Verified)   (Member)         (Active)      Current     13 Oct    ⋯ │\n│      meera@example.test                                                              │\n└──────────────────────────────────────────────────────────────────────────────────────┘"
        },
        {
          "line": 1364,
          "language": "",
          "endLine": 1369,
          "body": "Staff & roles                                   ( Create makerspace )* [■ Add staff ]\nWho can work in this makerspace and what each role is allowed to do.\n[Makerspace ▾]*  Staff 9 │ Roles 6 │ Invitations 1\nStaff table: Person · Role (pill) · Makerspace* · Status (Restricted pill if any) · ⋯ (Change role, Reset password…, Restrict…, Restore, Revoke role…)"
        },
        {
          "line": 1435,
          "language": "",
          "endLine": 1444,
          "body": "Machines                                                    [■ + Add machine type ]*\n24 machines across 5 types · 3 running · 1 in maintenance\n┌ ! Maintenance is overdue on 2 machines.                           Review → ┐ (only if >0)\n┌[🖨] 3D printers ─────────┐ ┌[⚡] Laser cutters ───────┐ ┌ + Add machine type ┄┄┐ (dashed, if allowed)\n│ 8 machines · 3 running    │ │ 2 machines · idle        │\n│ 4 jobs in queue  (Review) │ │ Next maintenance 3 Nov   │\n└───────────────────────────┘ └──────────────────────────┘\nType settings ▸ (MachineTypesPanel, shared consumables, delegated recipients) — disclosure"
        },
        {
          "line": 1449,
          "language": "",
          "endLine": 1455,
          "body": "← All machine types\n[🖨] 3D printers                                    ( Public page ↗ ) [■ + Add machine ]\n     8 machines · 3 running · 1 maintenance\nMachines 8 │ Service queue 4 │ Consumables │ Certifications │ Settings\nMachines tab: table rows [img] Name / model · location | (Running) pill | 312 h | ⋯   + status filter tabs (All · Idle · Running · Reserved · Maintenance · Offline)"
        },
        {
          "line": 1464,
          "language": "",
          "endLine": 1470,
          "body": "[img] Prusa MK4 #2                         (Running) · 3D printer · 312 h total\n      [■ Mark idle ]  ( Log maintenance )   ⋯ (Retire…)\nOverview  Operators  Consumables  Usage  Maintenance  Documents  Errors  Warranty\nOverview: stat cards (Usage hours · Jobs this month · Next maintenance · Open errors), then settings rows (photo, details, public detail)\n┌ Retire machine ─ Takes it out of service and off the public page. ( Retire… ) ┐ (danger, can_retire)"
        },
        {
          "line": 1487,
          "language": "",
          "endLine": 1494,
          "body": "Good morning, Priya\nEvents                                                   ( New series ) [■ + New event ]\n┌ ! Laser workshop is tomorrow. Download the guest list for offline check-in.  Prepare check-in → ┐\n┌Upcoming 3┐┌Going 46┐┌Awaiting approval 2┐┌Drafts 1┐\nUpcoming │ Drafts 1 │ Past │ Series 2                              Recent registrations\ndate-chip rows: right slot = \"12 / 30 going\" bar │ \"Finish & publish\" pill │ \"No guests yet · Share\""
        },
        {
          "line": 1521,
          "language": "",
          "endLine": 1526,
          "body": "← All events\n┌OCT┐ Laser cutter induction                   ( View page ↗ ) [■ Open check-in ]\n│16 │ (Published) Public · Tomorrow, 6:30 PM · 12 / 16 places\nOverview  Registrations 14  Check-in  Tickets & invites  Feedback  Team  Settings"
        },
        {
          "line": 1550,
          "language": "",
          "endLine": 1555,
          "body": "Bookings                                                   ( + New booking ) [■ + New space ]\n┌Awaiting approval 1┐┌Today 4┐┌This week 19┐┌Spaces 6┐   ← approval count from dashboard; others only if available\nRequests 1 │ Upcoming │ Spaces 6\nSpaces tab rows: [tile] Woodshop bench · Workshop · (Staff approval) (Public) (Active) · \"3 today\" ⋯"
        },
        {
          "line": 1572,
          "language": "",
          "endLine": 1582,
          "body": "Reports                                          ( Schedule… ) [■ Export ▾ ]\nOperations reporting for Fab Lab Kochi.\n┌ Report list (240) ────────┐  Loan throughput\n│ LENDING                   │  [7 days | 30 days | Quarter | Custom ▾]  Grain [Day ▾]  ☐ All makerspaces*\n│ ▣ Summary                 │  ┌Products┐┌Active loans┐┌Damaged┐┌Missing┐\n│   Taken items  Active…    │  chart (existing hand SVG)\n│ INVENTORY …  MACHINES …   │  table (OperationsReportTable)  Saved views ▾  Columns ▾\n│ COMMUNITY … MONEY … SYSTEM│\n└───────────────────────────┘"
        },
        {
          "line": 1598,
          "language": "",
          "endLine": 1607,
          "body": "Audit log                                                        ( Export )†\nEvery state change in this makerspace, append-only.\n(✓ Chain verified · checked 2 min ago)  ← AuditVerificationStatus as a status pill/callout (danger callout if broken)\n[Actor ▾] [Action ▾] [Target ▾] [Date range]  Sort ▾   (AuditLogFilters as a filter bar; active filters as removable chips)\nTODAY\n(PO) Priya accepted request #1042 · Meera Nair                  10:57 · request:1042  ▸ details\n(DP) Dev uploaded return photo #182 · request #1039             10:47\nYESTERDAY …"
        },
        {
          "line": 1626,
          "language": "",
          "endLine": 1638,
          "body": "Desktop: member sidebar (logo, space switcher card = makerspace + membership status, nav: Home · Loans · Bookings · Events · Payments · Inbox · Account, bottom: user chip / Sign out)\nMobile:  top bar + bottom tabs: Home · Loans · Bookings · Events · More (Payments, Inbox, Account)\n\nHi Meera                                                   [■ Start visit ]*  ← presence, when module on\nFab Lab Kochi · Member since March 2026  (Active)\n┌ ! Accept the updated waiver (v3) to keep borrowing.                       Read and accept → ┐\n┌On loan 2┐┌Due this week 1┐┌Bookings 1┐┌Payments due ₹500┐\nComing up                                         Notices\n┌OCT┐ Return Multimeter          Due Fri (Renew)    • Your request #1042 was accepted\n┌OCT┐ Woodshop bench 10:00–12:00 (Confirmed)        • Booking confirmed\nYour member card ▸ (ticket card with QR — opens the full card)"
        },
        {
          "line": 1668,
          "language": "",
          "endLine": 1682,
          "body": "[logo] Fab Lab Kochi          Catalogue  Events  Machines  Book a space          ( Sign in )\n──────────────────────────────────────────────────────────────────────────────────────────\nBorrow tools from Fab Lab Kochi                         ┌ Your request ─────────────────┐ 340w sticky\n248 tools and kits · members borrow free                │ 2 items                        │\n[ Search tools, machines, kits, materials        ⌕ ]   │ Arduino Uno        − 1 +       │\n(All)(Electronics)(Woodwork)(Textiles)(3D printing)…    │ Multimeter         − 1 +       │\nSort: Name ▾                                            │ What's it for?  [            ] │\n┌card┐┌card┐┌card┐                                     │ [■ Send request — 2 items ]    │\n│img │ │img │ │img │  name, availability pill (word),   │ Staff review every request     │\n│    │ │    │ │    │  \"Add\" stepper                      │ before anything is handed over.│\n└────┘ └────┘ └────┘                                    │ ( Borrow | Scan a tool )  seg. │\n‹ Prev  Page 2 of 11  Next ›                            └────────────────────────────────┘\nfooter: [logo] Powered by space works · Privacy · Terms"
        },
        {
          "line": 1706,
          "language": "",
          "endLine": 1713,
          "body": "Fab Lab Kochi / Catalogue / Arduino Uno R3            (breadcrumb)\n[ image 16:10, r16 ]                                  ┌ (Available) ────────────────┐\n(Electronics)(Kit)                                    │ 3 available  (only if exact)│\nArduino Uno R3   (48 bold)                            │ [■ Add to request ]         │\ndescription…                                          │ ( Notify me when it's back )│ (when unavailable + feature)\nBorrowing terms (grey inset box)                      └─────────────────────────────┘"
        },
        {
          "line": 1793,
          "language": "",
          "endLine": 1807,
          "body": "              ┌──────────────────────────────────────┐\n              │        [FK][PO]  (tile + avatar)      │\n              │   You've been invited to join          │\n              │        Fab Lab Kochi                    │\n              │        (as Inventory Manager)           │\n              │ You'll manage this space's inventory.   │\n              │ Password                                │\n              │ [                                   👁] │\n              │ ▸ My account uses two-step sign-in      │ (reveals code field)\n              │ [■■■■■■■ Accept invitation ■■■■■■■■]   │\n              │ Already have an account? Use its        │\n              │ current password.                       │\n              └──────────────────────────────────────┘"
        }
      ]
    },
    {
      "path": "docs/ui-brand-spec.md",
      "sha256": "3977c28f12249af4b2fd43ec87ac28efcb56aa9fff93fe12fa655808851cf966",
      "headings": [
        {
          "line": 1,
          "text": "Space Works brand → SpaceWorks UI: design-system spec",
          "anchor": "space-works-brand--spaceworks-ui-design-system-spec"
        },
        {
          "line": 54,
          "text": "0. Key decisions",
          "anchor": "0-key-decisions"
        },
        {
          "line": 73,
          "text": "A. Tokens",
          "anchor": "a-tokens"
        },
        {
          "line": 75,
          "text": "A.1 Full token table, with the source of every value",
          "anchor": "a1-full-token-table-with-the-source-of-every-value"
        },
        {
          "line": 138,
          "text": "A.2 Computed contrast (text tokens must reach ≥4.5 on every surface they can sit on)",
          "anchor": "a2-computed-contrast-text-tokens-must-reach-45-on-every-surface-they-can-sit-on"
        },
        {
          "line": 178,
          "text": "A.3 Paste-ready `index.css` block",
          "anchor": "a3-paste-ready-indexcss-block"
        },
        {
          "line": 316,
          "text": "B. Interaction states",
          "anchor": "b-interaction-states"
        },
        {
          "line": 351,
          "text": "C. Status pills",
          "anchor": "c-status-pills"
        },
        {
          "line": 398,
          "text": "D. Typography",
          "anchor": "d-typography"
        },
        {
          "line": 400,
          "text": "D.1 Faces and roles",
          "anchor": "d1-faces-and-roles"
        },
        {
          "line": 412,
          "text": "D.2 Self-hosted CSS",
          "anchor": "d2-self-hosted-css"
        },
        {
          "line": 419,
          "text": "D.3 Type scale tokens (family + weight)",
          "anchor": "d3-type-scale-tokens-family--weight"
        },
        {
          "line": 441,
          "text": "D.4 `font-mono` decision (Codex 4)",
          "anchor": "d4-font-mono-decision-codex-4"
        },
        {
          "line": 448,
          "text": "E. Shape, borders, shadow, spacing, motion",
          "anchor": "e-shape-borders-shadow-spacing-motion"
        },
        {
          "line": 477,
          "text": "F. Logo: exact extraction and in-product use",
          "anchor": "f-logo-exact-extraction-and-in-product-use"
        },
        {
          "line": 479,
          "text": "F.1 Current master exports",
          "anchor": "f1-current-master-exports"
        },
        {
          "line": 493,
          "text": "F.2 Usage",
          "anchor": "f2-usage"
        },
        {
          "line": 502,
          "text": "F.3 In-product sizes (rules: symbol ≥48 px; primary lockup ≥180 px wide; clear space H÷4)",
          "anchor": "f3-in-product-sizes-rules-symbol-48-px-primary-lockup-180-px-wide-clear-space-h4"
        },
        {
          "line": 526,
          "text": "G. Icons",
          "anchor": "g-icons"
        },
        {
          "line": 556,
          "text": "H. Migration lists",
          "anchor": "h-migration-lists"
        },
        {
          "line": 558,
          "text": "H.1 Translucency bans (Codex 1)",
          "anchor": "h1-translucency-bans-codex-1"
        },
        {
          "line": 574,
          "text": "H.2 Fill tokens used as text, and undefined tokens (Codex 2)",
          "anchor": "h2-fill-tokens-used-as-text-and-undefined-tokens-codex-2"
        },
        {
          "line": 589,
          "text": "H.3 `text-bg` on a danger fill → `text-on-danger` (9 sites)",
          "anchor": "h3-text-bg-on-a-danger-fill--text-on-danger-9-sites"
        },
        {
          "line": 597,
          "text": "H.4 Rename `secondary` → `brand`",
          "anchor": "h4-rename-secondary--brand"
        },
        {
          "line": 626,
          "text": "H.5 Tenant-branding contract (Codex 3)",
          "anchor": "h5-tenant-branding-contract-codex-3"
        },
        {
          "line": 655,
          "text": "H.6 `font-mono` migration (Codex 4)",
          "anchor": "h6-font-mono-migration-codex-4"
        },
        {
          "line": 678,
          "text": "H.7 Other corrections",
          "anchor": "h7-other-corrections"
        },
        {
          "line": 691,
          "text": "I. Contrast-guard changes",
          "anchor": "i-contrast-guard-changes"
        },
        {
          "line": 736,
          "text": "K. Brand fidelity checklist (rule → where → how enforced)",
          "anchor": "k-brand-fidelity-checklist-rule--where--how-enforced"
        },
        {
          "line": 777,
          "text": "J. Owner decisions still open",
          "anchor": "j-owner-decisions-still-open"
        }
      ],
      "tables": [
        {
          "line": 20,
          "cells": [
            "Script",
            "Job"
          ]
        },
        {
          "line": 21,
          "cells": [
            "---",
            "---"
          ]
        },
        {
          "line": 22,
          "cells": [
            "`pdfx2.py`",
            "inflate the PDF objects and page streams"
          ]
        },
        {
          "line": 23,
          "cells": [
            "`pdf2svg.py`, `logo_list.py`, `logo_build.py`",
            "vector extraction to SVG"
          ]
        },
        {
          "line": 24,
          "cells": [
            "`brand_tokens_v2.py`",
            "the token derivation and every contrast ratio"
          ]
        },
        {
          "line": 25,
          "cells": [
            "`brand_contract_v2.py`",
            "the tenant contract plus a 4,096-colour sweep"
          ]
        },
        {
          "line": 26,
          "cells": [
            "`png.py`, `sample_reference.py`",
            "reference-board pixel sampling"
          ]
        },
        {
          "line": 27,
          "cells": [
            "`otfinfo.py`",
            "font metrics"
          ]
        },
        {
          "line": 31,
          "cells": [
            "Pair",
            "Ratio"
          ]
        },
        {
          "line": 32,
          "cells": [
            "---",
            "---"
          ]
        },
        {
          "line": 33,
          "cells": [
            "cream on teal",
            "5.68"
          ]
        },
        {
          "line": 34,
          "cells": [
            "ink on cream",
            "13.60"
          ]
        },
        {
          "line": 35,
          "cells": [
            "ink on orange",
            "5.51"
          ]
        },
        {
          "line": 36,
          "cells": [
            "ink on yellow",
            "10.37"
          ]
        },
        {
          "line": 37,
          "cells": [
            "ink on citron",
            "13.23"
          ]
        },
        {
          "line": 38,
          "cells": [
            "ink on sky",
            "9.23"
          ]
        },
        {
          "line": 39,
          "cells": [
            "orange on cream",
            "2.47"
          ]
        },
        {
          "line": 56,
          "cells": [
            "#",
            "Decision",
            "Source / why"
          ]
        },
        {
          "line": 57,
          "cells": [
            "---",
            "---",
            "---"
          ]
        },
        {
          "line": 58,
          "cells": [
            "D1",
            "The light canvas is Warm Cream with white cards. **Superseded 11 November 2026 (SpaceWorks decisions 225, 316):** dark is one solid black neutral family: a `#000000` page and neutral grey layers (`surface` `#0B0B0B`, `panel` `#141414`, `hover` `#1C1C1C`) with no green-tinted surfaces. Teal, Citron and Orange are accents only, never a surface. Text is Cream, focus is Citron. Token names are unchanged. The Deep Ink set survives only as the light-mode `.sw-island-dark` subtree; in dark, `:root.dark .sw-island-dark` re-joins the black family so a dark page never shows a green field.",
            "owner: \"single solid black everywhere, no mixing of pure black and green dark\" (decision 316)"
          ]
        },
        {
          "line": 59,
          "cells": [
            "D2",
            "`accent` = **Maker Teal** in light. In dark it stays **Maker Teal** `#006E63` with Cream labels (5.68:1); it is 3.41:1 on the black page, 3.20:1 on `surface` and 2.99:1 on `panel`, so a selected teal fill on `panel` is paired with a label, not relied on alone.",
            "brand-mix."
          ]
        },
        {
          "line": 60,
          "cells": [
            "D3",
            "`secondary` is renamed **`brand`** (the action colour of a stranger-facing surface; default = accent; tenant-overridable). **`emphasis` = Workshop Orange**: Space Works' own, never tenant-overridable, one bold moment per layout.",
            "brand p.9 \"teal = primary · actions; orange = energy · emphasis\"; p.13 \"use one bold moment\""
          ]
        },
        {
          "line": 61,
          "cells": [
            "D4",
            "**Danger is sampled from the UX reference boards**, because the brand has no red: `#B91C1C` text/fill, `#991B1B` hover, `#FCA5A5` card border (dark text).",
            "reference org5 danger zone (sampled, C.0)"
          ]
        },
        {
          "line": 62,
          "cells": [
            "D5",
            "Solid `*-soft` tokens replace every `bg-{tone}/NN`. **Translucent text is banned.**",
            "Codex (1): `text-on-accent/75` on teal = 3.90:1"
          ]
        },
        {
          "line": 63,
          "cells": [
            "D6",
            "Status = **word** (mandatory) on a soft pill. Light mode uses the brand-tested solid pastel + ink pairs; dark mode uses soft + tone-ink. Icons are optional.",
            "brand p.10 \"add a word or icon to every status\"; UX spec P10 tinted pills"
          ]
        },
        {
          "line": 64,
          "cells": [
            "D7",
            "**Typography, superseded 11 November 2026 (decision 299):** only the FREE Gilroy weights ship, Light 300 and ExtraBold 800. Display headings use Gilroy ExtraBold, light display text uses Gilroy Light, and everything else (body, labels, controls, IDs) uses Outfit 400–700 (OFL). Unbounded 500–600 (OFL) for one short accent phrase. The paid Gilroy Regular/Medium/Semibold/Bold are never shipped. The 15 October 2026 four-weight arrangement is withdrawn.",
            "owner: \"I am not planning to buy a licence\""
          ]
        },
        {
          "line": 65,
          "cells": [
            "D8",
            "Shape follows the brand's own product mock (p.16, measured): controls r 10, window/cards r 16, tags fully round, **no shadows**, hairlines = Deep Ink @ 18 % in light; in dark the `line` hairline is neutral `#2C2C2C` and is **decorative, about 1.3 to 1.5:1** (1.50 on black, 1.41 on `surface`, 1.32 on `panel`), never the only thing that identifies a control. The UX reference uses pill buttons; one token switches it.",
            "brand p.16 vector; UX spec P11"
          ]
        },
        {
          "line": 66,
          "cells": [
            "D9",
            "Light-mode sidebar = **Citron field** with Deep Ink labels and a filled teal active item. Dark-mode sidebar = solid near-black `#0B0B0B` (decision 316). **The nav is text-only.** Neither the brand mock (p.16) nor the UX reference (org5) puts icons in the sidebar.",
            "brand p.16; reference org5"
          ]
        },
        {
          "line": 67,
          "cells": [
            "D10",
            "Attention counters and low-stock tags use `emphasis` (orange + ink; p.16 \"2 left\" is an orange tag). `danger` is reserved for destructive actions and errors.",
            "brand p.16"
          ]
        },
        {
          "line": 68,
          "cells": [
            "D11",
            "**No \"System\" theme option.** The existing Light/Dark toggle stays as it is.",
            "owner"
          ]
        },
        {
          "line": 69,
          "cells": [
            "D12",
            "Logo masters are exported directly from the Figma component library into `logo/`. All three horizontal variants are supplied as masters, including reversed and one-colour ink.",
            "current Figma component library"
          ]
        },
        {
          "line": 77,
          "cells": [
            "Token",
            "Light",
            "Source (light)",
            "Dark",
            "Source (dark)"
          ]
        },
        {
          "line": 78,
          "cells": [
            "---",
            "---",
            "---",
            "---",
            "---"
          ]
        },
        {
          "line": 79,
          "cells": [
            "`bg`",
            "`255 244 232` #FFF4E8",
            "brand",
            "`0 0 0` #000000",
            "release 0.12 recipe (decisions 275, 300)"
          ]
        },
        {
          "line": 80,
          "cells": [
            "`surface`",
            "`246 236 224` #F6ECE0",
            "brand-mix: Cream + 4% Ink",
            "`11 11 11` #0B0B0B",
            "release 0.12 recipe (decisions 275, 300)"
          ]
        },
        {
          "line": 81,
          "cells": [
            "`panel`",
            "`255 255 255` #FFFFFF",
            "brand (white card, p.4/p.16)",
            "`20 20 20` #141414",
            "release 0.12 recipe (decisions 275, 300)"
          ]
        },
        {
          "line": 82,
          "cells": [
            "`hover`",
            "`239 230 219` #EFE6DB",
            "brand-mix: Cream + 7% Ink",
            "`28 28 28` #1C1C1C",
            "release 0.12 recipe (decisions 275, 300)"
          ]
        },
        {
          "line": 83,
          "cells": [
            "`line`",
            "`213 208 198` #D5D0C6",
            "brand-mix: Cream + 18% Ink (p.16 rules = Ink @ 18%)",
            "`44 44 44` #2C2C2C",
            "release 0.12 recipe (decisions 275, 300)"
          ]
        },
        {
          "line": 84,
          "cells": [
            "`outline`",
            "`130 138 131` #828A83",
            "brand-mix: Cream + 53% Ink",
            "`120 120 120` #787878",
            "release 0.12 recipe (decisions 275, 300)"
          ]
        },
        {
          "line": 85,
          "cells": [
            "`ink`",
            "`20 44 42` #142C2A",
            "brand",
            "`255 244 232` #FFF4E8",
            "brand (reversed text)"
          ]
        },
        {
          "line": 86,
          "cells": [
            "`muted`",
            "`91 104 99` #5B6863",
            "brand-mix: Ink + 30% Cream",
            "`172 172 172` #ACACAC",
            "release 0.12 recipe (decisions 275, 300)"
          ]
        },
        {
          "line": 87,
          "cells": [
            "`focus`",
            "`0 110 99` #006E63",
            "= accent-ink",
            "`223 255 143` #DFFF8F",
            "release 0.12 recipe (decisions 275, 300)"
          ]
        },
        {
          "line": 88,
          "cells": [
            "`accent`",
            "`0 110 99` #006E63",
            "brand",
            "`0 110 99` #006E63",
            "release 0.12 recipe (decisions 275, 300)"
          ]
        },
        {
          "line": 89,
          "cells": [
            "`accent-hover`",
            "`2 103 93` #02675D",
            "brand-mix: accent + 10% Ink",
            "`2 103 93` #02675D",
            "release 0.12 recipe (decisions 275, 300)"
          ]
        },
        {
          "line": 90,
          "cells": [
            "`accent-active`",
            "`4 97 88` #046158",
            "brand-mix: accent + 20% Ink",
            "`4 97 88` #046158",
            "release 0.12 recipe (decisions 275, 300)"
          ]
        },
        {
          "line": 91,
          "cells": [
            "`on-accent`",
            "`255 244 232` #FFF4E8",
            "brand (tested pair 5.68)",
            "`255 244 232` #FFF4E8",
            "release 0.12 recipe (decisions 275, 300)"
          ]
        },
        {
          "line": 92,
          "cells": [
            "`accent-soft`",
            "`224 238 236` #E0EEEC",
            "brand-mix: panel + 12% accent",
            "`18 29 28` #121D1C",
            "release 0.12 recipe (decisions 275, 300)"
          ]
        },
        {
          "line": 93,
          "cells": [
            "`accent-ink`",
            "`0 110 99` #006E63",
            "brand",
            "`128 177 166` #80B1A6",
            "release 0.12 recipe (decisions 275, 300)"
          ]
        },
        {
          "line": 94,
          "cells": [
            "`brand`",
            "`0 110 99` #006E63",
            "= accent (tenant-overridable)",
            "`0 110 99` #006E63",
            "release 0.12 recipe (decisions 275, 300)"
          ]
        },
        {
          "line": 95,
          "cells": [
            "`brand-hover`",
            "`2 103 93` #02675D",
            "= accent-hover (tenant-overridable)",
            "`2 103 93` #02675D",
            "release 0.12 recipe (decisions 275, 300)"
          ]
        },
        {
          "line": 96,
          "cells": [
            "`brand-active`",
            "`4 97 88` #046158",
            "= accent-active (tenant-overridable)",
            "`4 97 88` #046158",
            "release 0.12 recipe (decisions 275, 300)"
          ]
        },
        {
          "line": 97,
          "cells": [
            "`on-brand`",
            "`255 244 232` #FFF4E8",
            "= on-accent",
            "`255 244 232` #FFF4E8",
            "release 0.12 recipe (decisions 275, 300)"
          ]
        },
        {
          "line": 98,
          "cells": [
            "`brand-soft`",
            "`224 238 236` #E0EEEC",
            "= accent-soft (tenant-overridable)",
            "`18 29 28` #121D1C",
            "release 0.12 recipe (decisions 275, 300)"
          ]
        },
        {
          "line": 99,
          "cells": [
            "`brand-ink`",
            "`0 110 99` #006E63",
            "= accent-ink (tenant-overridable)",
            "`128 177 166` #80B1A6",
            "release 0.12 recipe (decisions 275, 300)"
          ]
        },
        {
          "line": 100,
          "cells": [
            "`brand-boundary`",
            "`0 110 99` #006E63",
            "= brand-ink",
            "`128 177 166` #80B1A6",
            "release 0.12 recipe (decisions 275, 300)"
          ]
        },
        {
          "line": 101,
          "cells": [
            "`emphasis`",
            "`255 116 71` #FF7447",
            "brand",
            "`255 116 71` #FF7447",
            "brand"
          ]
        },
        {
          "line": 102,
          "cells": [
            "`emphasis-hover`",
            "`255 129 87` #FF8157",
            "brand-mix: emphasis + 10% Cream",
            "`255 129 87` #FF8157",
            "brand-mix: emphasis + 10% Cream"
          ]
        },
        {
          "line": 103,
          "cells": [
            "`emphasis-active`",
            "`255 142 103` #FF8E67",
            "brand-mix: emphasis + 20% Cream",
            "`255 142 103` #FF8E67",
            "brand-mix: emphasis + 20% Cream"
          ]
        },
        {
          "line": 104,
          "cells": [
            "`on-emphasis`",
            "`20 44 42` #142C2A",
            "brand (tested pair)",
            "`20 44 42` #142C2A",
            "brand (tested pair)"
          ]
        },
        {
          "line": 105,
          "cells": [
            "`emphasis-soft`",
            "`255 238 233` #FFEEE9",
            "brand-mix: panel + 12% emphasis",
            "`34 26 23` #221A17",
            "release 0.12 recipe (decisions 275, 300)"
          ]
        },
        {
          "line": 106,
          "cells": [
            "`success`",
            "`223 255 143` #DFFF8F",
            "brand",
            "`223 255 143` #DFFF8F",
            "brand"
          ]
        },
        {
          "line": 107,
          "cells": [
            "`success-hover`",
            "`203 234 133` #CBEA85",
            "brand-mix: success + 10% Ink",
            "`203 234 133` #CBEA85",
            "brand-mix: success + 10% Ink"
          ]
        },
        {
          "line": 108,
          "cells": [
            "`success-active`",
            "`182 213 123` #B6D57B",
            "brand-mix: success + 20% Ink",
            "`182 213 123` #B6D57B",
            "brand-mix: success + 20% Ink"
          ]
        },
        {
          "line": 109,
          "cells": [
            "`on-success`",
            "`20 44 42` #142C2A",
            "brand (tested pair)",
            "`20 44 42` #142C2A",
            "brand (tested pair)"
          ]
        },
        {
          "line": 110,
          "cells": [
            "`success-soft`",
            "`251 255 242` #FBFFF2",
            "brand-mix: panel + 12% success",
            "`32 34 27` #20221B",
            "release 0.12 recipe (decisions 275, 300)"
          ]
        },
        {
          "line": 111,
          "cells": [
            "`success-ink`",
            "`83 109 73` #536D49",
            "brand-mix: Citron + 69% Ink",
            "`233 252 170` #E9FCAA",
            "release 0.12 recipe (decisions 275, 300)"
          ]
        },
        {
          "line": 112,
          "cells": [
            "`warn`",
            "`255 212 71` #FFD447",
            "brand",
            "`255 212 71` #FFD447",
            "brand"
          ]
        },
        {
          "line": 113,
          "cells": [
            "`warn-hover`",
            "`232 195 68` #E8C344",
            "brand-mix: warn + 10% Ink",
            "`232 195 68` #E8C344",
            "brand-mix: warn + 10% Ink"
          ]
        },
        {
          "line": 114,
          "cells": [
            "`warn-active`",
            "`208 178 65` #D0B241",
            "brand-mix: warn + 20% Ink",
            "`208 178 65` #D0B241",
            "brand-mix: warn + 20% Ink"
          ]
        },
        {
          "line": 115,
          "cells": [
            "`on-warn`",
            "`20 44 42` #142C2A",
            "brand (tested pair)",
            "`20 44 42` #142C2A",
            "brand (tested pair)"
          ]
        },
        {
          "line": 116,
          "cells": [
            "`warn-soft`",
            "`255 250 233` #FFFAE9",
            "brand-mix: panel + 12% warn",
            "`34 32 23` #222017",
            "release 0.12 recipe (decisions 275, 300)"
          ]
        },
        {
          "line": 117,
          "cells": [
            "`warn-ink`",
            "`105 104 52` #696834",
            "brand-mix: Yellow + 64% Ink",
            "`255 222 119` #FFDE77",
            "release 0.12 recipe (decisions 275, 300)"
          ]
        },
        {
          "line": 118,
          "cells": [
            "`info`",
            "`181 205 255` #B5CDFF",
            "brand",
            "`181 205 255` #B5CDFF",
            "brand"
          ]
        },
        {
          "line": 119,
          "cells": [
            "`info-hover`",
            "`165 189 234` #A5BDEA",
            "brand-mix: info + 10% Ink",
            "`165 189 234` #A5BDEA",
            "brand-mix: info + 10% Ink"
          ]
        },
        {
          "line": 120,
          "cells": [
            "`info-active`",
            "`149 173 212` #95ADD4",
            "brand-mix: info + 20% Ink",
            "`149 173 212` #95ADD4",
            "brand-mix: info + 20% Ink"
          ]
        },
        {
          "line": 121,
          "cells": [
            "`on-info`",
            "`20 44 42` #142C2A",
            "brand (tested pair)",
            "`20 44 42` #142C2A",
            "brand (tested pair)"
          ]
        },
        {
          "line": 122,
          "cells": [
            "`info-soft`",
            "`246 249 255` #F6F9FF",
            "brand-mix: panel + 12% info",
            "`30 31 34` #1E1F22",
            "release 0.12 recipe (decisions 275, 300)"
          ]
        },
        {
          "line": 123,
          "cells": [
            "`info-ink`",
            "`81 105 123` #51697B",
            "brand-mix: Sky + 62% Ink",
            "`203 217 248` #CBD9F8",
            "release 0.12 recipe (decisions 275, 300)"
          ]
        },
        {
          "line": 124,
          "cells": [
            "`danger`",
            "`185 28 28` #B91C1C",
            "Ref (sampled #B91C1C)",
            "`252 165 165` #FCA5A5",
            "Ref (sampled #FCA5A5)"
          ]
        },
        {
          "line": 125,
          "cells": [
            "`danger-hover`",
            "`153 27 27` #991B1B",
            "Ref (sampled #991B1B)",
            "`253 185 182` #FDB9B6",
            "Ref-mix: #FCA5A5 + 25% Cream"
          ]
        },
        {
          "line": 126,
          "cells": [
            "`danger-active`",
            "`133 30 29` #851E1D",
            "Ref-mix: #991B1B + 15% Ink",
            "`253 201 195` #FDC9C3",
            "Ref-mix: #FCA5A5 + 45% Cream"
          ]
        },
        {
          "line": 127,
          "cells": [
            "`on-danger`",
            "`255 244 232` #FFF4E8",
            "brand",
            "`20 44 42` #142C2A",
            "brand"
          ]
        },
        {
          "line": 128,
          "cells": [
            "`danger-line`",
            "`252 165 165` #FCA5A5",
            "Ref (sampled, danger-zone card border)",
            "`124 98 97` #7C6261",
            "Ref-mix: Ink + 45% #FCA5A5"
          ]
        },
        {
          "line": 129,
          "cells": [
            "`sidebar`",
            "`223 255 143` #DFFF8F",
            "brand (p.16 sidebar)",
            "`11 11 11` #0B0B0B",
            "release 0.12 recipe (decisions 275, 300)"
          ]
        },
        {
          "line": 130,
          "cells": [
            "`sidebar-hover`",
            "`242 255 210` #F2FFD2",
            "brand-mix: Citron + 60% white",
            "`28 28 28` #1C1C1C",
            "release 0.12 recipe (decisions 275, 300)"
          ]
        },
        {
          "line": 131,
          "cells": [
            "`sidebar-active`",
            "`0 110 99` #006E63",
            "brand (p.16 active item)",
            "`0 110 99` #006E63",
            "release 0.12 recipe (decisions 275, 300)"
          ]
        },
        {
          "line": 132,
          "cells": [
            "`--shadow-color`",
            "`20 44 42`",
            "brand (overlays only)",
            "`20 44 42`",
            "brand"
          ]
        },
        {
          "line": 142,
          "cells": [
            "Text token",
            "Light: bg / surface / panel / hover · worst soft",
            "Dark: bg / surface / panel / hover · worst soft"
          ]
        },
        {
          "line": 143,
          "cells": [
            "---",
            "---",
            "---"
          ]
        },
        {
          "line": 144,
          "cells": [
            "`ink`",
            "13.60 / 12.64 / 14.75 / 11.95 · 12.37",
            "19.36 / 18.14 / 16.98 / 15.71 · 14.82"
          ]
        },
        {
          "line": 145,
          "cells": [
            "`muted`",
            "5.37 / 4.99 / 5.83 / 4.72 · 4.88",
            "9.25 / 8.67 / 8.12 / 7.51 · 7.08"
          ]
        },
        {
          "line": 146,
          "cells": [
            "`accent-ink` (= default `brand-ink`, `focus`)",
            "5.68 / 5.28 / 6.16 / 4.99 · 5.16",
            "8.76 / 8.21 / 7.68 / 7.11 · 6.71"
          ]
        },
        {
          "line": 147,
          "cells": [
            "`success-ink`",
            "5.30 / 4.93 / 5.75 / 4.66 · 4.82",
            "18.97 / 17.78 / 16.64 / 15.39 · 14.52"
          ]
        },
        {
          "line": 148,
          "cells": [
            "`warn-ink`",
            "5.33 / 4.96 / 5.78 / 4.69 · 4.85",
            "15.97 / 14.97 / 14.01 / 12.96 · 12.23"
          ]
        },
        {
          "line": 149,
          "cells": [
            "`info-ink`",
            "5.29 / 4.92 / 5.74 / 4.65 · 4.82",
            "14.82 / 13.89 / 13.00 / 12.03 · 11.35"
          ]
        },
        {
          "line": 150,
          "cells": [
            "`danger` (text and fill)",
            "5.96 / 5.54 / 6.47 / 5.24 · 5.43",
            "11.06 / 10.37 / 9.71 / 8.98 · 8.47"
          ]
        },
        {
          "line": 158,
          "cells": [
            "Fill · label",
            "Light rest / hover / active",
            "Dark rest / hover / active"
          ]
        },
        {
          "line": 159,
          "cells": [
            "---",
            "---",
            "---"
          ]
        },
        {
          "line": 160,
          "cells": [
            "`accent` · `on-accent`",
            "5.68 / 6.24 / 6.78",
            "5.68 / 6.24 / 6.78"
          ]
        },
        {
          "line": 161,
          "cells": [
            "`emphasis` · ink",
            "5.51 / 5.99 / 6.55",
            "same"
          ]
        },
        {
          "line": 162,
          "cells": [
            "`success` · ink",
            "13.23 / 10.99 / 8.99",
            "same"
          ]
        },
        {
          "line": 163,
          "cells": [
            "`warn` · ink",
            "10.37 / 8.66 / 7.11",
            "same"
          ]
        },
        {
          "line": 164,
          "cells": [
            "`info` · ink",
            "9.23 / 7.77 / 6.47",
            "same"
          ]
        },
        {
          "line": 165,
          "cells": [
            "`danger` · `on-danger`",
            "5.96 / 7.66 / 8.80",
            "7.77 / 8.99 / 10.06"
          ]
        },
        {
          "line": 167,
          "cells": [
            "Non-text (≥3:1)",
            "Light vs bg / surface / panel (/ sidebar)",
            "Dark"
          ]
        },
        {
          "line": 168,
          "cells": [
            "---",
            "---",
            "---"
          ]
        },
        {
          "line": 169,
          "cells": [
            "`focus`",
            "5.68 / 5.28 / 6.16 / 5.52",
            "18.84 / 17.66 / 16.53 / 17.66"
          ]
        },
        {
          "line": 170,
          "cells": [
            "`outline` (form-control boundary, needs ≥3:1)",
            "3.27 / 3.04 / 3.55",
            "4.76 / 4.46 / 4.17"
          ]
        },
        {
          "line": 171,
          "cells": [
            "`accent` as a selected fill (nav pill, tab underline)",
            "5.68 / 5.28 / 6.16 / 5.52",
            "3.41 / 3.20 / 2.99 / 3.20"
          ]
        },
        {
          "line": 172,
          "cells": [
            "`danger-line` (decorative card border)",
            "1.90 vs panel",
            "3.31 vs panel"
          ]
        },
        {
          "line": 173,
          "cells": [
            "`line` (decorative hairline, about 1.3 to 1.5:1 in dark; control edges use `outline`, not `line`)",
            "1.42 / 1.32 / 1.54",
            "1.50 / 1.41 / 1.32 (ink on line 12.87)"
          ]
        },
        {
          "line": 306,
          "cells": [
            "File",
            "Change"
          ]
        },
        {
          "line": 307,
          "cells": [
            "---",
            "---"
          ]
        },
        {
          "line": 308,
          "cells": [
            "`public/member-pwa/offline.css`",
            "`#1e333f` → `#142C2A`, focus `#f9cd68` → `#A3C4B8`"
          ]
        },
        {
          "line": 309,
          "cells": [
            "`scripts/member-pwa.ts`, `scripts/kiosk-pwa.ts`",
            "icon rasters come from `app-icon.svg`"
          ]
        },
        {
          "line": 310,
          "cells": [
            "`public/spaceworks-logo.svg`",
            "replace with `symbol.svg`"
          ]
        },
        {
          "line": 311,
          "cells": [
            "`index.html`",
            "`theme-color` `#FFF4E8` (light) / `#000000` (dark, true black)"
          ]
        },
        {
          "line": 312,
          "cells": [
            "`backend/config/unfold.py` `COLORS.primary`",
            "a brand-mix ramp: 50–400 = Teal + 90/75/55/35/15 % Cream, 500 = Teal, 600–950 = Teal + 15/30/45/60/75 % Ink"
          ]
        },
        {
          "line": 323,
          "cells": [
            "Variant",
            "Rest",
            "Hover",
            "Active",
            "Light r/h/a",
            "Dark r/h/a"
          ]
        },
        {
          "line": 324,
          "cells": [
            "---",
            "---",
            "---",
            "---",
            "---",
            "---"
          ]
        },
        {
          "line": 325,
          "cells": [
            "`desk-button-primary` (staff main)",
            "`bg-accent text-on-accent`",
            "`bg-accent-hover`",
            "`bg-accent-active`",
            "5.68 / 6.24 / 6.78",
            "5.68 / 6.24 / 6.78"
          ]
        },
        {
          "line": 326,
          "cells": [
            "`desk-button-brand` (ex `-secondary`; public/member main)",
            "`bg-brand text-on-brand border-brand-boundary`",
            "`bg-brand-hover`",
            "`bg-brand-active`",
            "default = primary; tenants proven by H.5",
            ""
          ]
        },
        {
          "line": 327,
          "cells": [
            "`desk-button` (neutral; the outline \"secondary\")",
            "`bg-panel text-ink border-line`",
            "`bg-hover`",
            "`bg-line`",
            "14.75 / 11.95 / 9.60",
            "16.98 / 15.71 / 12.87"
          ]
        },
        {
          "line": 328,
          "cells": [
            "`desk-button-ghost`",
            "`text-accent-ink`, no fill",
            "`bg-accent-soft`",
            "`bg-accent-soft text-ink`",
            "6.16 / 5.16 / 12.37",
            "7.68 / 7.19 / 15.89"
          ]
        },
        {
          "line": 329,
          "cells": [
            "`desk-button-emphasis` (new; the one bold public CTA, never in staff chrome)",
            "`bg-emphasis text-on-emphasis`",
            "`-hover`",
            "`-active`",
            "5.51 / 5.99 / 6.55",
            "same"
          ]
        },
        {
          "line": 330,
          "cells": [
            "`desk-button-danger` (final confirm)",
            "`bg-danger text-on-danger`",
            "`bg-danger-hover`",
            "`bg-danger-active`",
            "5.96 / 7.66 / 8.80",
            "7.77 / 8.99 / 10.06"
          ]
        },
        {
          "line": 331,
          "cells": [
            "`desk-button-danger-outline` (new; \"Delete organisation…\")",
            "`bg-panel text-danger border-danger`",
            "`text-danger-hover border-danger-hover`",
            "same + `bg-hover`",
            "6.47 / 8.31 / 6.73",
            "9.71 / 11.22 / 10.38"
          ]
        },
        {
          "line": 332,
          "cells": [
            "`desk-button-success` / `-warn` (kept in Phase 1, folded into primary/neutral in Phase 6)",
            "`bg-success\\|warn text-on-*`",
            "`-hover`",
            "`-active`",
            "13.23/10.99/8.99 · 10.37/8.66/7.11",
            "same"
          ]
        },
        {
          "line": 334,
          "cells": [
            "Element",
            "Rest",
            "Hover",
            "Selected / current",
            "Ratios (light · dark)"
          ]
        },
        {
          "line": 335,
          "cells": [
            "---",
            "---",
            "---",
            "---",
            "---"
          ]
        },
        {
          "line": 336,
          "cells": [
            "Sidebar item (text-only, D9)",
            "`text-ink` on `sidebar`",
            "`bg-sidebar-hover`",
            "`bg-sidebar-active text-on-accent font-semibold`, `aria-current=\"page\"`",
            "13.23 / 14.06 / 5.68 (pill vs field 5.52) · 18.14 / 15.71 / 5.68 (pill vs field 3.20)"
          ]
        },
        {
          "line": 337,
          "cells": [
            "Sidebar sub-item (reference org5: indented, smaller)",
            "`text-muted` 14/20",
            "`text-ink`",
            "`text-ink font-semibold`, no fill",
            "5.23 · 8.67"
          ]
        },
        {
          "line": 338,
          "cells": [
            "Underline tab",
            "`text-muted`",
            "`text-ink`",
            "`text-ink font-semibold` + 2 px `accent` underline",
            "underline 5.68 · 3.41 on bg, 2.99 on panel"
          ]
        },
        {
          "line": 339,
          "cells": [
            "Segmented control",
            "track `bg-surface border-line`",
            "`text-ink`",
            "thumb `bg-panel border-outline text-ink`",
            "thumb boundary 3.55 · 4.17"
          ]
        },
        {
          "line": 340,
          "cells": [
            "Table / list row",
            "`bg-panel`",
            "`bg-hover`",
            "`bg-accent-soft` + checked box",
            "14.75 / 11.95 / 12.37 · 16.98 / 15.71 / 15.89"
          ]
        },
        {
          "line": 341,
          "cells": [
            "Input",
            "`bg-panel border-outline text-ink`, placeholder `text-muted`",
            "`border-ink`",
            "focus: `border-accent` + ring",
            "boundary 3.55 · 4.17"
          ]
        },
        {
          "line": 342,
          "cells": [
            "Search field (p.16 citron field)",
            "`bg-sidebar border-transparent`, `Search` icon",
            "`bg-sidebar-hover`",
            "ring",
            "text 13.23, placeholder 5.23 · dark `bg-surface`"
          ]
        },
        {
          "line": 343,
          "cells": [
            "Invalid field",
            "`border-danger` + message `text-danger`",
            "",
            "",
            "6.47 · 9.71"
          ]
        },
        {
          "line": 344,
          "cells": [
            "Link",
            "`text-accent-ink`, underline on hover",
            "",
            "",
            "5.68 · 8.76"
          ]
        },
        {
          "line": 345,
          "cells": [
            "Theme toggle",
            "**Light / Dark only** (D11)",
            "",
            "",
            ""
          ]
        },
        {
          "line": 355,
          "cells": [
            "Colour",
            "Where",
            "Matches"
          ]
        },
        {
          "line": 356,
          "cells": [
            "---",
            "---",
            "---"
          ]
        },
        {
          "line": 357,
          "cells": [
            "**#991B1B** (153,27,27)",
            "\"Delete organisation\" heading",
            "Tailwind red-800"
          ]
        },
        {
          "line": 358,
          "cells": [
            "**#B91C1C** (185,28,28)",
            "button text and 1 px border",
            "red-700"
          ]
        },
        {
          "line": 359,
          "cells": [
            "**#FCA5A5** (252,165,165)",
            "1 px card border",
            "red-300"
          ]
        },
        {
          "line": 360,
          "cells": [
            "**#15803D** (21,128,61) and **#DCFCE7**",
            "the dominant greens in `full-att11.png`",
            "green-700 / green-100"
          ]
        },
        {
          "line": 367,
          "cells": [
            "Tone",
            "Light",
            "Dark"
          ]
        },
        {
          "line": 368,
          "cells": [
            "---",
            "---",
            "---"
          ]
        },
        {
          "line": 369,
          "cells": [
            "success",
            "`bg-success text-on-success` (13.23)",
            "`bg-success-soft text-success-ink` (14.52)"
          ]
        },
        {
          "line": 370,
          "cells": [
            "warn",
            "`bg-warn text-on-warn` (10.37)",
            "`bg-warn-soft text-warn-ink` (12.41)"
          ]
        },
        {
          "line": 371,
          "cells": [
            "info",
            "`bg-info text-on-info` (9.23)",
            "`bg-info-soft text-info-ink` (11.63)"
          ]
        },
        {
          "line": 372,
          "cells": [
            "emphasis",
            "`bg-emphasis text-on-emphasis` (5.51)",
            "same"
          ]
        },
        {
          "line": 373,
          "cells": [
            "accent",
            "`bg-accent-soft text-accent-ink` (5.16)",
            "same (7.19)"
          ]
        },
        {
          "line": 374,
          "cells": [
            "danger (danger-zone vocabulary)",
            "`bg-panel border border-danger-line text-danger` (6.47)",
            "same (9.71)"
          ]
        },
        {
          "line": 375,
          "cells": [
            "neutral",
            "`bg-surface border border-line text-ink` (12.64)",
            "same (18.14)"
          ]
        },
        {
          "line": 377,
          "cells": [
            "Domain · status (backend value) → tone · word"
          ]
        },
        {
          "line": 378,
          "cells": [
            "---"
          ]
        },
        {
          "line": 379,
          "cells": [
            "**Request:** `draft` neutral \"Draft\" · `pending_approval` warn \"Pending approval\" · `accepted` info \"Accepted\" · `rejected` danger \"Rejected\" · `issued` **accent** \"Issued\" (today `danger`, must be fixed) · `partially_returned` warn \"Partly returned\" · `returned` success \"Returned\" · `closed_with_issue` danger \"Closed with issue\""
          ]
        },
        {
          "line": 380,
          "cells": [
            "**Loan / self-checkout:** `checked_out` accent \"Checked out\" (today danger) · `returned` success. **Return condition:** `no_issue` success · `needs_fix` warn · `damaged` danger · `missing` danger"
          ]
        },
        {
          "line": 381,
          "cells": [
            "**Asset:** `available` success · `reserved` info · `issued` accent · `maintenance` warn · `damaged` danger · `lost` danger · `retired` neutral"
          ]
        },
        {
          "line": 382,
          "cells": [
            "**Public availability:** Available success \"N available\" · Limited **emphasis** \"N left\" (p.16) · Unavailable neutral"
          ]
        },
        {
          "line": 383,
          "cells": [
            "**Event:** `draft` neutral · `published` success · `cancelled` danger · `completed` info"
          ]
        },
        {
          "line": 384,
          "cells": [
            "**Registration:** `pending_approval` warn · `registered` success · `waitlisted` info · `rejected` danger · `cancelled` neutral · `attended` accent"
          ]
        },
        {
          "line": 385,
          "cells": [
            "**Booking:** `pending` warn · `confirmed` success · `rejected` danger · `cancelled` neutral · `completed` info · `no_show` danger \"No-show\""
          ]
        },
        {
          "line": 386,
          "cells": [
            "**Payment:** `pending` warn \"Unpaid\" · `paid_online` success \"Paid online\" · `paid_offline` success \"Paid offline\" · `waived` info · `canceled` neutral \"Cancelled\""
          ]
        },
        {
          "line": 387,
          "cells": [
            "**Refund:** `pending` warn · `succeeded` success · `failed` danger"
          ]
        },
        {
          "line": 388,
          "cells": [
            "**Machine:** `idle` success \"Available\" · `running` accent · `reserved` info · `maintenance` warn · `offline` neutral"
          ]
        },
        {
          "line": 389,
          "cells": [
            "**Service request:** `pending` warn · `accepted` info · `in_progress` accent · `completed` success · `collected` neutral · `rejected` danger · `failed` danger"
          ]
        },
        {
          "line": 390,
          "cells": [
            "**Certificate:** `pending` warn · `rendering` info · `active` success · `failed` danger · `revoked` neutral"
          ]
        },
        {
          "line": 402,
          "cells": [
            "Role",
            "Family",
            "Weights",
            "Files"
          ]
        },
        {
          "line": 403,
          "cells": [
            "---",
            "---",
            "---",
            "---"
          ]
        },
        {
          "line": 404,
          "cells": [
            "Display headings",
            "Gilroy",
            "800",
            "`Gilroy-ExtraBold.woff2`"
          ]
        },
        {
          "line": 405,
          "cells": [
            "Light display text",
            "Gilroy",
            "300",
            "`Gilroy-Light.woff2`"
          ]
        },
        {
          "line": 406,
          "cells": [
            "Body, labels, controls, IDs and every other weight",
            "Outfit",
            "400–700",
            "`Outfit-Variable.woff2`"
          ]
        },
        {
          "line": 407,
          "cells": [
            "One short expressive accent",
            "Unbounded",
            "500, 600",
            "`Unbounded-Variable.woff2`"
          ]
        },
        {
          "line": 421,
          "cells": [
            "Token / class",
            "Size / line",
            "Family · weight",
            "Tracking",
            "Use"
          ]
        },
        {
          "line": 422,
          "cells": [
            "---",
            "---",
            "---",
            "---",
            "---"
          ]
        },
        {
          "line": 423,
          "cells": [
            "`text-display`",
            "72/76 (mobile 44/48)",
            "Gilroy 800",
            "−0.02em",
            "public landing hero"
          ]
        },
        {
          "line": 424,
          "cells": [
            "`text-display-sub`",
            "32/38 (mobile 24/30)",
            "Outfit 400",
            "0",
            "optional sub-line under a display/heading on public and auth only"
          ]
        },
        {
          "line": 425,
          "cells": [
            "`text-heading`",
            "48/52 (mobile 34/40)",
            "Gilroy 800",
            "−0.015em",
            "public section heads, auth brand panel"
          ]
        },
        {
          "line": 426,
          "cells": [
            "`.title-page` (brand Subheading)",
            "32/38 (mobile 26/32)",
            "Outfit 600",
            "−0.01em",
            "one h1 per page"
          ]
        },
        {
          "line": 427,
          "cells": [
            "`.title-panel` (between Body and Subheading)",
            "20/28",
            "Outfit 600",
            "−0.005em",
            "card and panel titles"
          ]
        },
        {
          "line": 428,
          "cells": [
            "`.title-section`",
            "16/24",
            "Outfit 600",
            "0",
            "section titles, list-row titles"
          ]
        },
        {
          "line": 429,
          "cells": [
            "Stat number / big display number",
            "32/38 (hero stats 48/52)",
            "Outfit 600 + `tabular-nums`",
            "−0.01em",
            "`StatCard`, report totals"
          ]
        },
        {
          "line": 430,
          "cells": [
            "Date-chip numeral",
            "20/24",
            "Outfit 600 + `tabular-nums`",
            "0",
            "`DateChip`"
          ]
        },
        {
          "line": 431,
          "cells": [
            "`text-body`",
            "16/24",
            "Outfit 400",
            "0",
            "body, descriptions, inputs"
          ]
        },
        {
          "line": 432,
          "cells": [
            "`text-label`",
            "14/20",
            "Outfit 500",
            "0",
            "nav items, form labels, meta, dense table cells"
          ]
        },
        {
          "line": 433,
          "cells": [
            "Button label",
            "14/20 (large 16/24)",
            "Outfit 600",
            "0",
            "`desk-button*`"
          ]
        },
        {
          "line": 434,
          "cells": [
            "`.col-header`",
            "14/20",
            "Outfit 600, sentence case, `text-accent-ink`",
            "0",
            "table headers (p.16)"
          ]
        },
        {
          "line": 435,
          "cells": [
            "Inline strong / pill emphasis",
            "inherit",
            "Outfit 700",
            "0",
            "`<strong>`, pill counts"
          ]
        },
        {
          "line": 436,
          "cells": [
            "`text-caption`",
            "12/16",
            "Outfit 500",
            "0.01em",
            "pills, timestamps, helper text"
          ]
        },
        {
          "line": 437,
          "cells": [
            "`.eyebrow`",
            "12/16",
            "Outfit 600 uppercase",
            "0.08em",
            "category kicker, `text-muted` (p.17)"
          ]
        },
        {
          "line": 438,
          "cells": [
            "IDs / shelf codes",
            "inherit",
            "Outfit 500 + `tabular-nums`",
            "0",
            "`text-accent-ink` under a title (p.17), `text-ink` in cells"
          ]
        },
        {
          "line": 439,
          "cells": [
            "`text-accent`",
            "48/56 (mobile 32/40)",
            "Unbounded 500 (600 allowed)",
            "−0.01em",
            "**one** phrase per layout: landing hero, auth brand panel, the empty-state hero; never in staff chrome"
          ]
        },
        {
          "line": 452,
          "cells": [
            "Element",
            "Measurement"
          ]
        },
        {
          "line": 453,
          "cells": [
            "---",
            "---"
          ]
        },
        {
          "line": 454,
          "cells": [
            "Window radius",
            "16"
          ]
        },
        {
          "line": 455,
          "cells": [
            "Nav item",
            "205×49, r 10"
          ]
        },
        {
          "line": 456,
          "cells": [
            "Primary button",
            "197×47, r 9"
          ]
        },
        {
          "line": 457,
          "cells": [
            "Search field",
            "997×49, r 8, Citron"
          ]
        },
        {
          "line": 458,
          "cells": [
            "Status tags",
            "34 tall, fully round"
          ]
        },
        {
          "line": 459,
          "cells": [
            "Row rules",
            "Deep Ink 1 px at opacity 0.18"
          ]
        },
        {
          "line": 460,
          "cells": [
            "Shadows",
            "none anywhere"
          ]
        },
        {
          "line": 461,
          "cells": [
            "Sidebar",
            "245 wide, 20 px inset, labels inset 19"
          ]
        },
        {
          "line": 462,
          "cells": [
            "Nav",
            "text-only"
          ]
        },
        {
          "line": 466,
          "cells": [
            "Token",
            "Value",
            "Notes"
          ]
        },
        {
          "line": 467,
          "cells": [
            "---",
            "---",
            "---"
          ]
        },
        {
          "line": 468,
          "cells": [
            "`--radius-control`",
            "**10px** (brand). Owner may switch it to `9999px` for pill buttons.",
            "buttons, nav items, inputs, segmented thumb"
          ]
        },
        {
          "line": 469,
          "cells": [
            "`borderRadius` sm / DEFAULT / md / lg / xl / 2xl / full",
            "6 / 8 / 10 / 12 / **16** / 20 / 9999",
            "`xl` = cards and panels (was 18). `md` (273 uses) 12→10. `lg` (93) 14→12."
          ]
        },
        {
          "line": 470,
          "cells": [
            "Borders",
            "1px `line` on cards and dividers. 1px `outline` on form controls. 2px only for the tab underline and the focus ring.",
            ""
          ]
        },
        {
          "line": 471,
          "cells": [
            "Shadow",
            "cards none. `shadow-overlay` = `0 2px 6px rgb(var(--shadow-color)/.06), 0 12px 32px rgb(var(--shadow-color)/.10)` for popovers, menus, modals, drawers and toasts only.",
            "`soft`, `soft-lg`, `brutal*` and `elev-*` deleted"
          ]
        },
        {
          "line": 472,
          "cells": [
            "Spacing",
            "4 px grid: 4/8/12/16/20/24/32/40/48/64. Page gutter 16 / 24 / 32. Sidebar 256 wide, 20 inset, items 44 tall with a 4 px gap. Card padding 20 (24 on settings). Rows 56 (list) / 48 (table). Every control is 44 tall.",
            ""
          ]
        },
        {
          "line": 473,
          "cells": [
            "Motion",
            "Shipped 0.12.0 tokens (`tokens/tokens.css`, `motion` in `tokens.json`): durations `--sw-dur-fast` 120 ms (press, hover, exit), `--sw-dur-base` 180 ms (overlays, indicators), `--sw-dur-slow` 240 ms (route settle); curves `--sw-ease-standard` `cubic-bezier(0.2,0,0,1)`, `--sw-ease-enter` `cubic-bezier(0.16,1,0.3,1)`, `--sw-ease-exit` `cubic-bezier(0.4,0,1,1)`; distances `--sw-enter-y` 8px, `--sw-pop-scale` 0.98, `--sw-pop-offset` 4px, `--sw-slide-x` 100%. Kiosk and TV zero the distances (fade only); `prefers-reduced-motion` zeroes durations and distances. Transform and opacity only; no translate or scale on hover, with **one exception: the Space Works mark's box-open** (the box folds shut and opens back on hover and keyboard focus, 2200 ms, never on touch or under reduced motion; see [`motion.md`](motion.md)).",
            "Supersedes the earlier 200 / 240 / 160 ms proposal"
          ]
        },
        {
          "line": 485,
          "cells": [
            "Variant",
            "Full color",
            "Deep Ink",
            "Reversed cream"
          ]
        },
        {
          "line": 486,
          "cells": [
            "---",
            "---",
            "---",
            "---"
          ]
        },
        {
          "line": 487,
          "cells": [
            "Primary / stacked wordmark",
            "`lockup-stacked`",
            "`lockup-stacked-one-colour-ink`",
            "`lockup-stacked-reversed`"
          ]
        },
        {
          "line": 488,
          "cells": [
            "Horizontal",
            "`lockup-horizontal`",
            "`lockup-horizontal-one-colour-ink`",
            "`lockup-horizontal-reversed`"
          ]
        },
        {
          "line": 489,
          "cells": [
            "Symbol",
            "`symbol`",
            "`symbol-one-colour-ink`",
            "`symbol-reversed`"
          ]
        },
        {
          "line": 504,
          "cells": [
            "Placement",
            "Artwork",
            "Size",
            "Clear space",
            "Compliance"
          ]
        },
        {
          "line": 505,
          "cells": [
            "---",
            "---",
            "---",
            "---",
            "---"
          ]
        },
        {
          "line": 506,
          "cells": [
            "Staff/member **sidebar** (≥1024)",
            "`lockup-stacked.svg` (dark: `lockup-stacked-reversed.svg`)",
            "**180 px wide** → H 63.7",
            "16 → logo block 96 px tall",
            "meets both minimums. The horizontal lockup cannot fit: at H 48 it is 288 px, wider than the 256 sidebar."
          ]
        },
        {
          "line": 507,
          "cells": [
            "Mobile top bar (<1024)",
            "`symbol.svg` (dark: `symbol-reversed.svg`)",
            "**48 px**",
            "12 → bar 72 px",
            "the brand symbol variant \"recognition at a glance\""
          ]
        },
        {
          "line": 508,
          "cells": [
            "Public header ≥ 768",
            "`lockup-horizontal.svg` (dark: `lockup-horizontal-reversed.svg`)",
            "symbol 48 → **300 × 48**",
            "12 → header 72",
            ""
          ]
        },
        {
          "line": 509,
          "cells": [
            "Public header < 768",
            "`symbol.svg`",
            "48",
            "12",
            ""
          ]
        },
        {
          "line": 510,
          "cells": [
            "Auth brand panel",
            "`lockup-stacked.svg` on Cream",
            "240–320 px wide",
            "≥ H÷4",
            ""
          ]
        },
        {
          "line": 511,
          "cells": [
            "Favicon 16 / 32",
            "below 48 → **p.6 \"test a dedicated small-size asset\"**: owner to supply. Interim: `app-icon.svg` rasterised and proofed.",
            "16, 32",
            "",
            "**open item**"
          ]
        },
        {
          "line": 512,
          "cells": [
            "`favicon.svg`",
            "`app-icon.svg`",
            "—",
            "",
            ""
          ]
        },
        {
          "line": 513,
          "cells": [
            "apple-touch-icon",
            "`app-icon.svg` → PNG",
            "180",
            "",
            ""
          ]
        },
        {
          "line": 514,
          "cells": [
            "PWA member + kiosk",
            "`app-icon.svg` → PNG, `purpose: \"any maskable\"`",
            "192, 512",
            "",
            "maskable-safe (F.2)"
          ]
        },
        {
          "line": 515,
          "cells": [
            "OG / Twitter",
            "Cream 1200×630, `lockup-stacked.svg` 600 px wide centred",
            "",
            "H÷4",
            ""
          ]
        },
        {
          "line": 516,
          "cells": [
            "Django `/control/` (Unfold)",
            "`SITE_LOGO` = `lockup-horizontal.svg` at symbol 48 (288 px, fits Unfold's 288 px sidebar) with the dark variant for dark mode; `SITE_ICON` = `symbol.svg`; `SITE_TITLE` \"Space Works\"",
            "",
            "",
            "replaces the violet `COLORS` with the A.3 brand-mix ramp"
          ]
        },
        {
          "line": 517,
          "cells": [
            "Email header (if templates show one)",
            "`lockup-stacked.svg` PNG @2x, 180 px wide",
            "",
            "",
            ""
          ]
        },
        {
          "line": 539,
          "cells": [
            "Use",
            "Icon"
          ]
        },
        {
          "line": 540,
          "cells": [
            "---",
            "---"
          ]
        },
        {
          "line": 541,
          "cells": [
            "Search field (p.14 / p.16)",
            "`Search`"
          ]
        },
        {
          "line": 542,
          "cells": [
            "p.14 brand set",
            "Storage `Archive`, Parts `Cpu`, Location `MapPin`"
          ]
        },
        {
          "line": 543,
          "cells": [
            "Create actions (\"+ Add item\", p.16)",
            "`Plus`"
          ]
        },
        {
          "line": 544,
          "cells": [
            "Back link \"← All x\"",
            "`ArrowLeft`"
          ]
        },
        {
          "line": 545,
          "cells": [
            "\"View public page ↗\"",
            "`ArrowUpRight`"
          ]
        },
        {
          "line": 546,
          "cells": [
            "Workspace switcher",
            "`ChevronsUpDown`"
          ]
        },
        {
          "line": 547,
          "cells": [
            "Callouts",
            "`Info` / `TriangleAlert` / `CircleCheck`"
          ]
        },
        {
          "line": 548,
          "cells": [
            "Overflow",
            "`Ellipsis`"
          ]
        },
        {
          "line": 549,
          "cells": [
            "Theme toggle",
            "`Sun` / `Moon`"
          ]
        },
        {
          "line": 550,
          "cells": [
            "Sign out",
            "`LogOut`"
          ]
        },
        {
          "line": 560,
          "cells": [
            "Site",
            "Today → measured",
            "Replacement"
          ]
        },
        {
          "line": 561,
          "cells": [
            "---",
            "---",
            "---"
          ]
        },
        {
          "line": 562,
          "cells": [
            "`features/staff/panels/DashboardPanel.tsx:77–80,83,91`",
            "`text-on-accent/75` (3.90), `text-on-secondary/75`, `text-on-success/75`, `text-on-warn/75`, `text-bg/80` on danger (3.90), `text-bg`",
            "`StatCard`: a neutral panel with Outfit-600 number in `text-{tone}-ink` and a full-opacity label. The secondary tone becomes `emphasis`."
          ]
        },
        {
          "line": 563,
          "cells": [
            "`features/inventory/PublicInventoryParts.tsx:67`",
            "`text-on-secondary/80` counter (4.22)",
            "`text-on-brand`"
          ]
        },
        {
          "line": 564,
          "cells": [
            "`components/ui/StatusStepper.tsx:55`",
            "`opacity-70` on fills",
            "full opacity, `text-caption`"
          ]
        },
        {
          "line": 565,
          "cells": [
            "`features/inventory/RequestSummary.tsx:23,30`",
            "`opacity-80`",
            "`text-muted`"
          ]
        },
        {
          "line": 566,
          "cells": [
            "`features/staff/panels/OperationsReportState.tsx:74`, `features/stats/StatsParts.tsx:33`",
            "`eyebrow opacity-70` on fills",
            "`StatCard`"
          ]
        },
        {
          "line": 567,
          "cells": [
            "`features/inventory/ProductCard.tsx:71`, `ProductQuickViewModal.tsx:52`",
            "`text-ink/15` decorative initials",
            "`text-line` + `aria-hidden`"
          ]
        },
        {
          "line": 568,
          "cells": [
            "`styles/chrome.css` `.material-chrome`",
            "panel @0.8 + blur",
            "delete"
          ]
        },
        {
          "line": 569,
          "cells": [
            "`components.css` ghost/nav `hover:bg-accent/15`; the `.desk-shell .bg-secondary/10\\|15` color-mix block",
            "alpha tints",
            "`hover:bg-accent-soft`; `bg-brand-soft`; delete the color-mix block"
          ]
        },
        {
          "line": 570,
          "cells": [
            "**119 `bg-{tone}/NN` occurrences in 58 files** (12 of them `hover:`)",
            "alpha tints",
            "`/5`, `/10`, `/15` → `bg-{tone}-soft` (`secondary` → `brand-soft`). **`bg-danger/NN` → `bg-panel border border-danger-line`** (the danger card; there is no danger-soft)"
          ]
        },
        {
          "line": 571,
          "cells": [
            "`border-{tone}/20–40` (≈40)",
            "decorative",
            "allowed; `border-danger/40` → `border-danger-line`"
          ]
        },
        {
          "line": 572,
          "cells": [
            "`disabled:opacity-50` (14)",
            "WCAG-exempt",
            "allowed outside the button family"
          ]
        },
        {
          "line": 576,
          "cells": [
            "File:line",
            "Today",
            "Replacement"
          ]
        },
        {
          "line": 577,
          "cells": [
            "---",
            "---",
            "---"
          ]
        },
        {
          "line": 578,
          "cells": [
            "`features/members/MemberAdmission.tsx:44`, `MemberArea.tsx:149`, `MemberReferrals.tsx:67,80`, `MemberVerifierPanel.tsx:20`",
            "`text-success`",
            "`text-success-ink`"
          ]
        },
        {
          "line": 579,
          "cells": [
            "`features/staff/MembershipAdmissionSettings.tsx:70`, `panels/MachineTypesPanel.tsx:100`, `SetupChecklist.tsx:22`, `StaffBookingForm.tsx:63`",
            "`text-success`",
            "`text-success-ink`"
          ]
        },
        {
          "line": 580,
          "cells": [
            "`features/members/MemberCertifications.tsx:18`, `MemberDashboardSections.tsx:122`, `features/staff/MembershipAdmissionSettings.tsx:56`",
            "`text-warn`",
            "`text-warn-ink`"
          ]
        },
        {
          "line": 581,
          "cells": [
            "`features/staff/handover/IssueDialog.tsx:59`",
            "`border-warn/40 bg-warn/10 text-warn`",
            "`border-warn bg-warn-soft text-warn-ink` (5.54 light / 12.41 dark)"
          ]
        },
        {
          "line": 582,
          "cells": [
            "`styles/components.css:191–192`",
            "`hover:text-accent`",
            "`hover:text-accent-ink`"
          ]
        },
        {
          "line": 583,
          "cells": [
            "`features/staff/PlatformDashboardPanel.tsx` (×5)",
            "`text-brand` (**undefined today**)",
            "`text-accent-ink`. After the rename, `text-brand` would otherwise become a fill used as text."
          ]
        },
        {
          "line": 584,
          "cells": [
            "`features/staff/panels/QueuesReturnRequestModal.tsx`, `features/staff/EvidenceRetentionPanel.tsx`",
            "`text-warning` (undefined)",
            "`text-warn-ink`"
          ]
        },
        {
          "line": 585,
          "cells": [
            "`features/staff/OfflineCheckInOperator.tsx`, `features/staff/EventStationSettings.tsx:44`",
            "`border-warning bg-warning-soft text-warning-ink` (undefined)",
            "`border-warn bg-warn-soft text-warn-ink`"
          ]
        },
        {
          "line": 586,
          "cells": [
            "`text-danger` (475)",
            "stays",
            "`danger` is text-capable (A.2)"
          ]
        },
        {
          "line": 587,
          "cells": [
            "`text-info`, `text-secondary`, `text-accent-bright`",
            "0 sites",
            "—"
          ]
        },
        {
          "line": 601,
          "cells": [
            "Old",
            "New"
          ]
        },
        {
          "line": 602,
          "cells": [
            "---",
            "---"
          ]
        },
        {
          "line": 603,
          "cells": [
            "`--color-secondary`, `-hover`, `-active`, `-boundary`",
            "`--color-brand`, `-hover`, `-active`, `-boundary`"
          ]
        },
        {
          "line": 604,
          "cells": [
            "`--color-on-secondary`",
            "`--color-on-brand`"
          ]
        },
        {
          "line": 605,
          "cells": [
            "`--color-secondary-ink`",
            "`--color-brand-ink`"
          ]
        },
        {
          "line": 606,
          "cells": [
            "`--brand-tint-*-alpha`",
            "removed (replaced by `--color-brand-soft`)"
          ]
        },
        {
          "line": 607,
          "cells": [
            "`bg-secondary`",
            "`bg-brand`"
          ]
        },
        {
          "line": 608,
          "cells": [
            "`text-on-secondary`",
            "`text-on-brand`"
          ]
        },
        {
          "line": 609,
          "cells": [
            "`text-secondary-ink`",
            "`text-brand-ink`"
          ]
        },
        {
          "line": 610,
          "cells": [
            "`border-secondary`",
            "`border-brand`"
          ]
        },
        {
          "line": 611,
          "cells": [
            "`bg-secondary/10\\|15`",
            "`bg-brand-soft`"
          ]
        },
        {
          "line": 612,
          "cells": [
            "`desk-button-secondary` (113 / 65 files)",
            "`desk-button-brand` on stranger-facing surfaces; staff sites per the table below"
          ]
        },
        {
          "line": 613,
          "cells": [
            "Badge `\"secondary\"`, StatTone `\"pink\"`",
            "`\"emphasis\"`"
          ]
        },
        {
          "line": 615,
          "cells": [
            "Staff/shared site using `secondary` today",
            "Remap (staff never takes the tenant colour)"
          ]
        },
        {
          "line": 616,
          "cells": [
            "---",
            "---"
          ]
        },
        {
          "line": 617,
          "cells": [
            "`DashboardPanel.tsx:78,88`, `OperationsReportState.tsx:68`, `stats/StatsParts.tsx:18,105`, `StatusStepper.tsx:6`, `Badge.tsx:18`",
            "`emphasis` / `StatCard` / pill tones"
          ]
        },
        {
          "line": 618,
          "cells": [
            "`InventoryPanelParts.tsx:198`, `OperationsReportsFablab.tsx:69`, `forms/CustomAnswersView.tsx:5`, `forms/CustomFormBuilder.tsx:16`",
            "`border-line bg-accent-soft`"
          ]
        },
        {
          "line": 619,
          "cells": [
            "`EventDrawer.tsx:61`, `MakerspaceLocationSettings.tsx:104`, `StaffDock.tsx:29,33`",
            "`text-accent-ink` / `border-accent`"
          ]
        },
        {
          "line": 620,
          "cells": [
            "`components/MakerspaceMapLink.tsx:17` (shared)",
            "prop-driven: `text-brand-ink` on public pages, `text-accent-ink` on staff pages"
          ]
        },
        {
          "line": 621,
          "cells": [
            "`desk-button-secondary` in `BillingDocumentsSettings:30`, `KioskStationSettings:82,83,90`, `AccountabilityPanel:191`, `DashboardMachineQueue:34`, `CapabilityPresetListEditor:46`, `MachineCreateForm:199`, `PoolColourSelector:192`, `SharedConsumablesSection:168`, `CardTemplateForm:153`, `DeliveryLogScreen:59,69`, `SuppressionAdmin:27`",
            "`desk-button`, or `desk-button-primary` when it is the screen's main action"
          ]
        },
        {
          "line": 622,
          "cells": [
            "`LoginPanel.tsx:100`",
            "`desk-button-primary`"
          ]
        },
        {
          "line": 623,
          "cells": [
            "`MakerspaceThemeSettings.tsx:64`",
            "stays `desk-button-brand` (it previews the tenant colour)"
          ]
        },
        {
          "line": 624,
          "cells": [
            "Shared `ToastHost:28`, `AnnouncementFeed:18`, `PersonalInbox:62`, `PaymentDocuments:39–52`",
            "`desk-button` (neutral)"
          ]
        },
        {
          "line": 628,
          "cells": [
            "Aspect",
            "Contract"
          ]
        },
        {
          "line": 629,
          "cells": [
            "---",
            "---"
          ]
        },
        {
          "line": 630,
          "cells": [
            "What a tenant sets",
            "`primary_color` → the `brand` fill; optional `accent_color` → the seed for `brand-ink`. Nothing else."
          ]
        },
        {
          "line": 631,
          "cells": [
            "Where it applies",
            "stranger-facing surfaces only: the 10 `useTenantBranding` callers (public inventory, item, events, event feedback, machines, bookings, self-checkout, print request, stats, `MemberArea`) and the Phase-5 `PublicShell`."
          ]
        },
        {
          "line": 632,
          "cells": [
            "What it never touches",
            "`accent`, `focus`, `emphasis`, status tones, neutrals, `sidebar`. Staff screens contain zero `brand-*` classes (guard I)."
          ]
        },
        {
          "line": 633,
          "cells": [
            "Default",
            "`brand` = `accent` per mode."
          ]
        },
        {
          "line": 634,
          "cells": [
            "Label",
            "**PLAN v2 §10.1 overrides (owner rule \"keep all functionality\")**: candidates Deep Ink, Warm Cream, white, then **black** (black is today's label, kept as a functional fallback for tenant-chosen colours only)."
          ]
        },
        {
          "line": 635,
          "cells": [
            "Hover / active / soft / link ink",
            "the same rules as the product: shift away from the label; soft = strongest ≤12 % mix over `panel` that keeps every fixed text ≥4.55; link ink = `accent_color` (or the fill) mixed toward Ink (light) or Cream (dark) until ≥4.5 on 10 backgrounds. All of these are mixes with brand neutrals."
          ]
        },
        {
          "line": 636,
          "cells": [
            "Pairs checked",
            "`on-brand` on brand/hover/active; `brand-ink` on bg, surface, panel, hover, brand-soft and the 5 softs; ink, muted and 5 fixed inks on `brand-soft`; boundary ≥3. **The `on-secondary/80` pair is removed** together with its only call site."
          ]
        },
        {
          "line": 637,
          "cells": [
            "Emitted vars (`brandPaletteStyle`)",
            "`--color-brand`, `--color-on-brand`, `--color-brand-ink`, `--color-brand-hover`, `--color-brand-active`, `--color-brand-soft`, `--color-brand-boundary` (7 keys; 8 today)"
          ]
        },
        {
          "line": 638,
          "cells": [
            "Acceptance (PLAN §10.1)",
            "**Never reject a well-formed colour that today's validator accepts.** Acceptance set ⊇ today's: if a derived pair fails, degrade the derived token (soft → `panel`, link ink → `accent-ink`, hover/active → today's algorithm) instead of rejecting. Rejection only for malformed values. Proven by a sweep test over all 4,096 `#RGB` (with and without `accent_color`) asserting `valid` in both modes, plus a parity test: every colour today's validator accepts is still accepted."
          ]
        },
        {
          "line": 659,
          "cells": [
            "Kind",
            "Sites"
          ]
        },
        {
          "line": 660,
          "cells": [
            "---",
            "---"
          ]
        },
        {
          "line": 661,
          "cells": [
            "Inputs",
            "`KioskOfflineHandover:70,72`, `KioskOnlineScanner:26`, `MemberCalendarActions:83`, `MemberClaimRedemption:22`, `BillingDocumentsSettings:37`, `DirectLoanIssueFields:214`, `DirectLoanReturnModal:221`, `BulkImport:126`, `EmailTemplateEditor:180,184`, `MaterialCataloguePanel:34`, `ScanCardBox:41`, `ScannerPanel:190`, `PlatformSocialAuthPanel:91`, `SpacePacksPanel:43`, `TenantMigrationExports:107,152`, `TenantMigrationImports:41,162`, `TenantMigrationPairings:64,73,74,75,78,79`, `tenantMigrationUi:63`"
          ]
        },
        {
          "line": 662,
          "cells": [
            "Display",
            "`BorrowRequestCard:180`, `PublicToolScanPanel:21`, `ApiClientCreateCard:93`, `ApiClientListCard:144`, `ApiClientsAccessSummary:37`, `EventInvitesPanel:20`, `EventPromosPanel:24`, `KioskStationSettings:75`, `MakerspaceCustomDomainSettings:228,230,232`, `MemberClaimCodes:113`, `ModulesPanel:147`, `OrganizationInvitations:51`, `SuppressionAdmin:33`, `AuditLog:55`, `TenantMigrationDisclosure:69,76`, `TenantMigrationExports:128`, `TenantMigrationPairings:60,61,93`, `ResetPasswordModal:64`, `MemberCalendarActions:79`, `EmailTemplateEditor:237`, `OrganizationMemberships:28,29`, `KioskReplayDetail:18`, `EventOrganizers:34`, `OrganizedEventsPanel:85`"
          ]
        },
        {
          "line": 695,
          "cells": [
            "Change",
            "Detail"
          ]
        },
        {
          "line": 696,
          "cells": [
            "---",
            "---"
          ]
        },
        {
          "line": 697,
          "cells": [
            "`TEXT_TOKENS`",
            "`ink, muted, accent-ink, brand-ink, success-ink, warn-ink, info-ink, danger`"
          ]
        },
        {
          "line": 698,
          "cells": [
            "`BACKGROUNDS`",
            "`bg, surface, panel, hover, accent-soft, brand-soft, emphasis-soft, success-soft, warn-soft, info-soft` (7 × 10 × 2 assertions)"
          ]
        },
        {
          "line": 699,
          "cells": [
            "new `test_fill_labels`",
            "`on-X` on X / X-hover / X-active ≥4.5 for accent, brand, emphasis, success, warn, info, danger"
          ]
        },
        {
          "line": 700,
          "cells": [
            "new `test_sidebar`",
            "ink, muted and accent-ink on `sidebar` and `sidebar-hover` ≥4.5; `sidebar-active` vs `sidebar` ≥3; `on-accent` on `sidebar-active` ≥4.5"
          ]
        },
        {
          "line": 701,
          "cells": [
            "`test_focus…`",
            "≥3 on bg, surface, panel, hover and sidebar"
          ]
        },
        {
          "line": 702,
          "cells": [
            "new `test_control_boundary`",
            "`outline` ≥3 on bg, surface and panel"
          ]
        },
        {
          "line": 703,
          "cells": [
            "new `test_token_provenance`",
            "parse the A.1 values. Every neutral must equal an integer-percent mix of `20 44 42` with `255 244 232` or white (re-derive and compare). Every fill must be a brand hex or one of the 3 sampled danger reds. Fails on any off-source colour."
          ]
        },
        {
          "line": 704,
          "cells": [
            "new source guards (scan `frontend/src`, excluding `*.test.*`)",
            "`\\btext-[\\w-]+/\\d+`; `\\bbg-(accent\\|brand\\|emphasis\\|success\\|warn\\|info\\|danger)/\\d+`; `\\btext-(accent\\|brand\\|emphasis\\|success\\|warn\\|info)(?![\\w-])`; `\\bfont-mono\\b`; `warning\\|accent-bright\\|secondary` colour utilities; `brand-` utilities under `features/staff/` (except `MakerspaceThemeSettings.tsx`); `#[0-9a-fA-F]{6}` hex literals outside `lib/brandColours.ts`, `SpaceWorksLogo` and the filament swatches"
          ]
        },
        {
          "line": 705,
          "cells": [
            "Parser",
            "unchanged (`:root {` / `:root.dark {`, comments stripped)"
          ]
        },
        {
          "line": 709,
          "cells": [
            "Test",
            "Change"
          ]
        },
        {
          "line": 710,
          "cells": [
            "---",
            "---"
          ]
        },
        {
          "line": 711,
          "cells": [
            "imports",
            "`SURFACES` (4 per mode), `PRODUCT_FILL` (per mode), `BODY_TEXT`, `FIXED_INKS` (5), `FIXED_SOFTS`"
          ]
        },
        {
          "line": 712,
          "cells": [
            "`test_custom_palette_passes…` (`#000 #fff #f3c3dd #004400 #abc` + `#5a1633`)",
            "unchanged; all pass"
          ]
        },
        {
          "line": 713,
          "cells": [
            "`test_dark_derivation_matches_frontend_golden_values`",
            "`#f3c3dd/#5a1633`: fill (243,195,221) in both modes; **fg (20,44,42)** (was 0,0,0); light ink (90,22,51); **dark ink (207,180,180)** (was 194,169,180). `#004400`: **hover (26,86,23), active (51,103,46), fg (255,244,232)**"
          ]
        },
        {
          "line": 714,
          "cells": [
            "`test_opaque_aa_is_not_enough_for_existing_translucent_counters`",
            "**replace** (PLAN §10.1) with `test_mid_tone_is_accepted_with_black_label`: `#777` is **valid** in both modes, `on-brand` = black, every emitted pair ≥4.5 or degraded per §10.1"
          ]
        },
        {
          "line": 715,
          "cells": [
            "`test_serializer…`, `test_theme_patch_contrast_400…`",
            "`#777` now **saves** (200); exercise the 400 path with malformed values only (`\"#77\"`, `\"red\"`, `\"#gggggg\"`)"
          ]
        },
        {
          "line": 716,
          "cells": [
            "`test_validation_surfaces_match_rendered_css…`",
            "4 surfaces; `--color-brand` = `PRODUCT_FILL[mode]`; BODY_TEXT, FIXED_INKS and FIXED_SOFTS mirror index.css and brandColours.ts. **Replace the tint-alpha assertions** with: `--color-brand-soft/-hover/-active == derive_palette({}, mode)`. Light (224,238,236)/(2,103,93)/(4,97,88); dark (40,68,64)/(104,165,153)/(121,174,162)."
          ]
        },
        {
          "line": 717,
          "cells": [
            "`test_tint_strength_protects…`",
            "becomes a soft golden: `#fff` dark soft = (60,79,77); `#000` light soft = (229,229,229)"
          ]
        },
        {
          "line": 718,
          "cells": [
            "bootstrap fallback tests",
            "stored-colour fallback is exercised with a **malformed** stored value (`\"red\"`), not `#777` (which is now valid)"
          ]
        },
        {
          "line": 719,
          "cells": [
            "`test_links_and_semantic_inks…`",
            "the mint card becomes `success-soft` dark (57,80,64)"
          ]
        },
        {
          "line": 720,
          "cells": [
            "`test_secondary_tints_have_an_opaque_base…`",
            "replace with: no `color-mix(` tenant tint and no `--brand-tint-` in components.css; `MemberDirectory.tsx` contains `desk-panel mt-2 border-brand p-3`"
          ]
        },
        {
          "line": 721,
          "cells": [
            "new",
            "`#e91e63` is **accepted** with a black label; sweep over all 4,096 `#RGB` (± `accent_color`) asserts `valid` in both modes; parity test: every colour the pre-revamp validator accepts is still accepted; `#004400` dark ink = (179,191,162)"
          ]
        },
        {
          "line": 738,
          "cells": [
            "#",
            "Rule (PDF page)",
            "Where it applies in the app",
            "Enforcement"
          ]
        },
        {
          "line": 739,
          "cells": [
            "---",
            "---",
            "---",
            "---"
          ]
        },
        {
          "line": 740,
          "cells": [
            "1",
            "Use the supplied masters; one recognisable unit (p.4, p.8)",
            "every logo render",
            "`SpaceWorksLogo` imports only the `logo-extract` files; guard: no `<svg>` with the brand panel colours outside that component"
          ]
        },
        {
          "line": 741,
          "cells": [
            "2",
            "Clear space **H÷4** on every side (p.5)",
            "sidebar, top bar, headers, auth, OG",
            "the component wraps the artwork in `padding: calc(var(--logo-h) / 4)`; the OG/PWA build script asserts the margin"
          ]
        },
        {
          "line": 742,
          "cells": [
            "3",
            "Symbol↔wordmark gap **H÷6**; wordmark height = H÷1.25 (p.5)",
            "lockups",
            "baked into the extracted masters (measured 0.171 H / 0.81 H); never re-composed in CSS"
          ]
        },
        {
          "line": 743,
          "cells": [
            "4",
            "Symbol ≥ **48 px** (p.6)",
            "top bar, public header, Unfold, favicon",
            "`height` prop typed `48 \\| 52 \\| 64 \\| …`; runtime clamp; unit test renders every variant and asserts the symbol box ≥48"
          ]
        },
        {
          "line": 744,
          "cells": [
            "5",
            "Primary lockup ≥ **180 px** wide (p.6)",
            "sidebar (180), auth (240–320), OG (600), email (180)",
            "`variant=\"stacked\"` clamps `width >= 180`; test"
          ]
        },
        {
          "line": 745,
          "cells": [
            "6",
            "Below 48 px: a dedicated small-size asset (p.6)",
            "favicon 16/32, PWA badge",
            "**open owner item**; interim raster proofed; tracked in PLAN §8"
          ]
        },
        {
          "line": 746,
          "cells": [
            "7",
            "App icon: symbol at 62 % on a Warm Cream tile (p.6)",
            "`favicon.svg`, apple-touch 180, PWA 192/512 (maskable), kiosk PWA",
            "`app-icon.svg` extracted from p.6 (measured 61.1 %); PWA script rasterises only this file; `verify-pwa-build` checks sizes"
          ]
        },
        {
          "line": 747,
          "cells": [
            "8",
            "Background pairings 01 full colour / Cream, 02 one-colour ink / white, 03 reverse / Ink, 04 reversed / Teal (p.7)",
            "light ground → full colour; dark mode (Ink) → reversed; any teal surface → reversed",
            "`ground` prop selects the file; guard forbids `filter`, `opacity` and `fill` overrides on the logo"
          ]
        },
        {
          "line": 748,
          "cells": [
            "9",
            "Don't stretch / rotate / recolour panels / lose dark panels / add effects / change the type (p.8)",
            "all logo uses",
            "component props have no `className` or `style` passthrough; preserveAspectRatio default; lint bans `transform`, `filter` and `box-shadow` on `[data-logo]`; the wordmark is outlines, never live text"
          ]
        },
        {
          "line": 749,
          "cells": [
            "10",
            "Wordmark lowercase \"space works\"; copy \"Space Works\" (p.4, p.15)",
            "`aria-label`, `<title>`, meta, Unfold `SITE_TITLE`, emails, UI copy",
            "i18n/copy grep: `/\\bSpaceWorks\\b/` banned in user-facing strings (the code identifiers `SpaceWorks*` are exempt) and `/space works/` banned in prose (wordmark artwork only)"
          ]
        },
        {
          "line": 750,
          "cells": [
            "11",
            "Seven exact sRGB colours; neutral first, accent second (p.9, p.13)",
            "all tokens",
            "A.1 provenance; `test_token_provenance`; hex-literal guard"
          ]
        },
        {
          "line": 751,
          "cells": [
            "12",
            "Tested text pairs; **orange text on cream banned** (p.10)",
            "all text",
            "no `emphasis-ink` token exists; guard bans `text-emphasis`; contrast guard ≥4.5 universal matrix"
          ]
        },
        {
          "line": 752,
          "cells": [
            "13",
            "Every status = colour + word or icon (p.10)",
            "`StatusPill`, stepper, availability, machine states",
            "`StatusPill` requires a `label: string` prop (TS non-optional, non-empty); axe; test that every C status maps to a word"
          ]
        },
        {
          "line": 753,
          "cells": [
            "14",
            "Gilroy ExtraBold leads display, Outfit does UI text; Unbounded **one accent per layout** (p.11–12)",
            "Gilroy 800 on display headings, Outfit 600 on other headings and numbers; Outfit for UI text; accent on landing, auth, empty hero",
            "`font-accent` only through `<AccentHeadline>`; a test mounts each page and asserts ≤1 `[data-accent]`; guard bans raw `font-accent` outside that component"
          ]
        },
        {
          "line": 754,
          "cells": [
            "15",
            "Type scale 72/76, 48/52, 32/38, 16/24, 14/20, accent 48/56 (p.12)",
            "D.3",
            "Tailwind `fontSize` defines only these (+ derived 20/28, 12/16); guard bans arbitrary `text-[NNpx]`"
          ]
        },
        {
          "line": 755,
          "cells": [
            "16",
            "Clear IDs and shelf codes (p.17)",
            "tables, labels, item pages",
            "`font-mono` removed (H.6); Outfit 500 + `tabular-nums` (use Outfit Medium for clear IDs)"
          ]
        },
        {
          "line": 756,
          "cells": [
            "17",
            "Icons on a 24 grid, 2 px, rounded; label unfamiliar ones (p.14)",
            "the G list only",
            "lucide defaults; an `IconButton` with a required `label` prop; axe `button-name`"
          ]
        },
        {
          "line": 757,
          "cells": [
            "18",
            "One bold moment; align to a simple grid; let empty space work (p.13)",
            "page layouts",
            "one `desk-button-emphasis` per page (test); 4 px spacing scale only; no shadows or decoration (E)"
          ]
        },
        {
          "line": 758,
          "cells": [
            "19",
            "Voice: say \"No parts added yet. Add your first item.\" / \"Couldn't save. Try again.\" and skip \"Oops! …\", \"Inventory database is empty\" (p.15)",
            "empty states, errors, toasts",
            "`EmptyState` takes `nextStep` (required); a copy-lint list bans \"Oops\", \"Something went wrong\", \"database is empty\" and \"asset ecosystem\""
          ]
        },
        {
          "line": 759,
          "cells": [
            "20",
            "Calm in-product: quiet sidebar, one \"+ Add item\" primary, search + table (p.16)",
            "staff shell, list pages",
            "`PageHeader` accepts at most one `primary` action (TS tuple); text-only nav; Citron search field"
          ]
        },
        {
          "line": 760,
          "cells": [
            "21",
            "Theme: existing Light/Dark only (owner)",
            "`ThemeToggle`",
            "no \"System\" option; test pins the two options"
          ]
        },
        {
          "line": 764,
          "cells": [
            "Placement",
            "Spec"
          ]
        },
        {
          "line": 765,
          "cells": [
            "---",
            "---"
          ]
        },
        {
          "line": 766,
          "cells": [
            "Sidebar",
            "stacked 180 × 63.7, clear space 16"
          ]
        },
        {
          "line": 767,
          "cells": [
            "Mobile bar",
            "symbol 48 (bar 72)"
          ]
        },
        {
          "line": 768,
          "cells": [
            "Public header",
            "horizontal 288 × 48 (≥768), else symbol 48"
          ]
        },
        {
          "line": 769,
          "cells": [
            "Auth panel",
            "stacked 240–320"
          ]
        },
        {
          "line": 770,
          "cells": [
            "Favicon 16/32",
            "small-size master (open item)"
          ]
        },
        {
          "line": 771,
          "cells": [
            "PWA 192/512 and apple-touch 180",
            "`app-icon.svg`"
          ]
        },
        {
          "line": 772,
          "cells": [
            "OG 1200×630",
            "Cream, stacked 600 wide"
          ]
        },
        {
          "line": 773,
          "cells": [
            "Django `/control/`",
            "horizontal at symbol 48 (288 px) + `SITE_ICON` symbol"
          ]
        }
      ],
      "links": [
        {
          "line": 473,
          "label": "`motion.md`",
          "target": "motion.md",
          "image": false
        }
      ],
      "code": [
        {
          "line": 183,
          "language": "css",
          "endLine": 299,
          "body": "  :root {\n    color-scheme: light;\n    --color-bg: 255 244 232;\n    --color-surface: 246 236 224;\n    --color-panel: 255 255 255;\n    --color-hover: 239 230 219;\n    --color-line: 213 208 198;\n    --color-outline: 130 138 131;\n    --color-ink: 20 44 42;\n    --color-muted: 91 104 99;\n    --color-focus: 0 110 99;\n    --color-accent: 0 110 99;\n    --color-accent-hover: 2 103 93;\n    --color-accent-active: 4 97 88;\n    --color-on-accent: 255 244 232;\n    --color-accent-soft: 224 238 236;\n    --color-accent-ink: 0 110 99;\n    --color-brand: 0 110 99;\n    --color-brand-hover: 2 103 93;\n    --color-brand-active: 4 97 88;\n    --color-on-brand: 255 244 232;\n    --color-brand-soft: 224 238 236;\n    --color-brand-ink: 0 110 99;\n    --color-brand-boundary: 0 110 99;\n    --color-emphasis: 255 116 71;\n    --color-emphasis-hover: 255 129 87;\n    --color-emphasis-active: 255 142 103;\n    --color-on-emphasis: 20 44 42;\n    --color-emphasis-soft: 255 238 233;\n    --color-success: 223 255 143;\n    --color-success-hover: 203 234 133;\n    --color-success-active: 182 213 123;\n    --color-on-success: 20 44 42;\n    --color-success-soft: 251 255 242;\n    --color-success-ink: 83 109 73;\n    --color-warn: 255 212 71;\n    --color-warn-hover: 232 195 68;\n    --color-warn-active: 208 178 65;\n    --color-on-warn: 20 44 42;\n    --color-warn-soft: 255 250 233;\n    --color-warn-ink: 105 104 52;\n    --color-info: 181 205 255;\n    --color-info-hover: 165 189 234;\n    --color-info-active: 149 173 212;\n    --color-on-info: 20 44 42;\n    --color-info-soft: 246 249 255;\n    --color-info-ink: 81 105 123;\n    --color-danger: 185 28 28;\n    --color-danger-hover: 153 27 27;\n    --color-danger-active: 133 30 29;\n    --color-on-danger: 255 244 232;\n    --color-danger-line: 252 165 165;\n    --color-sidebar: 223 255 143;\n    --color-sidebar-hover: 242 255 210;\n    --color-sidebar-active: 0 110 99;\n    --shadow-color: 20 44 42;\n  }\n  :root.dark {\n    color-scheme: dark;\n    --color-bg: 0 0 0;\n    --color-surface: 11 11 11;\n    --color-panel: 20 20 20;\n    --color-hover: 28 28 28;\n    --color-line: 44 44 44;\n    --color-outline: 120 120 120;\n    --color-ink: 255 244 232;\n    --color-muted: 172 172 172;\n    --color-focus: 223 255 143;\n    --color-accent: 0 110 99;\n    --color-accent-hover: 2 103 93;\n    --color-accent-active: 4 97 88;\n    --color-on-accent: 255 244 232;\n    --color-accent-soft: 18 29 28;\n    --color-accent-ink: 128 177 166;\n    --color-brand: 0 110 99;\n    --color-brand-hover: 2 103 93;\n    --color-brand-active: 4 97 88;\n    --color-on-brand: 255 244 232;\n    --color-brand-soft: 18 29 28;\n    --color-brand-ink: 128 177 166;\n    --color-brand-boundary: 128 177 166;\n    --color-emphasis: 255 116 71;\n    --color-emphasis-hover: 255 129 87;\n    --color-emphasis-active: 255 142 103;\n    --color-on-emphasis: 20 44 42;\n    --color-emphasis-soft: 34 26 23;\n    --color-success: 223 255 143;\n    --color-success-hover: 203 234 133;\n    --color-success-active: 182 213 123;\n    --color-on-success: 20 44 42;\n    --color-success-soft: 32 34 27;\n    --color-success-ink: 233 252 170;\n    --color-warn: 255 212 71;\n    --color-warn-hover: 232 195 68;\n    --color-warn-active: 208 178 65;\n    --color-on-warn: 20 44 42;\n    --color-warn-soft: 34 32 23;\n    --color-warn-ink: 255 222 119;\n    --color-info: 181 205 255;\n    --color-info-hover: 165 189 234;\n    --color-info-active: 149 173 212;\n    --color-on-info: 20 44 42;\n    --color-info-soft: 30 31 34;\n    --color-info-ink: 203 217 248;\n    --color-danger: 252 165 165;\n    --color-danger-hover: 253 185 182;\n    --color-danger-active: 253 201 195;\n    --color-on-danger: 20 44 42;\n    --color-danger-line: 124 98 97;\n    --color-sidebar: 11 11 11;\n    --color-sidebar-hover: 28 28 28;\n    --color-sidebar-active: 0 110 99;\n    --color-scrim: 0 0 0;\n    --shadow-color: 0 0 0;\n  }"
        }
      ]
    },
    {
      "path": "docs/ux-screens-longtail.md",
      "sha256": "87bf36ceaa0504f1d3f8df0c3a4418beb0654f6a4cd96f0fb3f4975513d1cf39",
      "headings": [
        {
          "line": 1,
          "text": "UX spec: long-tail screens (Space Works UX across all of SpaceWorks)",
          "anchor": "ux-spec-long-tail-screens-space-works-ux-across-all-of-spaceworks"
        },
        {
          "line": 12,
          "text": "0. How to read this doc",
          "anchor": "0-how-to-read-this-doc"
        },
        {
          "line": 14,
          "text": "0.1 Layouts are the closed set from `ux-spec.md`",
          "anchor": "01-layouts-are-the-closed-set-from-ux-specmd"
        },
        {
          "line": 39,
          "text": "0.2 Conventions used by every screen here (so they are not repeated per screen)",
          "anchor": "02-conventions-used-by-every-screen-here-so-they-are-not-repeated-per-screen"
        },
        {
          "line": 84,
          "text": "0.3 Reference screens cited",
          "anchor": "03-reference-screens-cited"
        },
        {
          "line": 110,
          "text": "1. Batch index (implementation order)",
          "anchor": "1-batch-index-implementation-order"
        },
        {
          "line": 129,
          "text": "2. Batch A — Operational lists (`ListLayout`)",
          "anchor": "2-batch-a--operational-lists-listlayout"
        },
        {
          "line": 131,
          "text": "A1. Payments — tab `payments`",
          "anchor": "a1-payments--tab-payments"
        },
        {
          "line": 189,
          "text": "A2. Ledger — tab `ledger`",
          "anchor": "a2-ledger--tab-ledger"
        },
        {
          "line": 220,
          "text": "A3. Transfers — tab `transfers`",
          "anchor": "a3-transfers--tab-transfers"
        },
        {
          "line": 241,
          "text": "A4. Stocktake — tab `stocktake`",
          "anchor": "a4-stocktake--tab-stocktake"
        },
        {
          "line": 264,
          "text": "A5. To buy (procurement) — tab `tobuy`",
          "anchor": "a5-to-buy-procurement--tab-tobuy"
        },
        {
          "line": 292,
          "text": "A6. To-be-fixed shelf — tab `needsfix`",
          "anchor": "a6-to-be-fixed-shelf--tab-needsfix"
        },
        {
          "line": 308,
          "text": "A7. Notifications (personal inbox + broadcast) — tab `notifications`",
          "anchor": "a7-notifications-personal-inbox--broadcast--tab-notifications"
        },
        {
          "line": 330,
          "text": "A8. Delivery logs (+ suppressions) — tab `email-logs`",
          "anchor": "a8-delivery-logs--suppressions--tab-email-logs"
        },
        {
          "line": 354,
          "text": "A9. Accountability — tab `accountability`",
          "anchor": "a9-accountability--tab-accountability"
        },
        {
          "line": 373,
          "text": "A10. Warranties — tab `warranty`",
          "anchor": "a10-warranties--tab-warranty"
        },
        {
          "line": 389,
          "text": "A11. Organized events — tab `organized`",
          "anchor": "a11-organized-events--tab-organized"
        },
        {
          "line": 404,
          "text": "A12. Member cards — tab `cards`",
          "anchor": "a12-member-cards--tab-cards"
        },
        {
          "line": 425,
          "text": "A13. Devices — tab `devices`",
          "anchor": "a13-devices--tab-devices"
        },
        {
          "line": 445,
          "text": "A14. Data export — tab `exports`",
          "anchor": "a14-data-export--tab-exports"
        },
        {
          "line": 462,
          "text": "A15. Categories — tab `categories`",
          "anchor": "a15-categories--tab-categories"
        },
        {
          "line": 475,
          "text": "A16. Containers — tab `containers`",
          "anchor": "a16-containers--tab-containers"
        },
        {
          "line": 489,
          "text": "A17. Job handover (machine service) — tab `handover`",
          "anchor": "a17-job-handover-machine-service--tab-handover"
        },
        {
          "line": 509,
          "text": "A18. Email templates (index) — tab `emailtemplates`",
          "anchor": "a18-email-templates-index--tab-emailtemplates"
        },
        {
          "line": 525,
          "text": "3. Batch B — Detail and editor (`DetailLayout`)",
          "anchor": "3-batch-b--detail-and-editor-detaillayout"
        },
        {
          "line": 527,
          "text": "B1. Email template editor",
          "anchor": "b1-email-template-editor"
        },
        {
          "line": 545,
          "text": "B2. Stocktake session (count)",
          "anchor": "b2-stocktake-session-count"
        },
        {
          "line": 558,
          "text": "B3. Container detail (drawer)",
          "anchor": "b3-container-detail-drawer"
        },
        {
          "line": 567,
          "text": "B4. Device detail (drawer)",
          "anchor": "b4-device-detail-drawer"
        },
        {
          "line": 570,
          "text": "B5. Machine service console / printer service console (tab body)",
          "anchor": "b5-machine-service-console--printer-service-console-tab-body"
        },
        {
          "line": 589,
          "text": "4. Batch C — Configuration (`SettingsLayout`)",
          "anchor": "4-batch-c--configuration-settingslayout"
        },
        {
          "line": 591,
          "text": "C1. API access — tab `api`",
          "anchor": "c1-api-access--tab-api"
        },
        {
          "line": 617,
          "text": "C2. Modules — tab `modules`",
          "anchor": "c2-modules--tab-modules"
        },
        {
          "line": 637,
          "text": "C3. Platform settings — tab `platform`",
          "anchor": "c3-platform-settings--tab-platform"
        },
        {
          "line": 654,
          "text": "C4. Backup & restore — tab `backups`",
          "anchor": "c4-backup--restore--tab-backups"
        },
        {
          "line": 674,
          "text": "C5. Organizations — tab `organizations` (global)",
          "anchor": "c5-organizations--tab-organizations-global"
        },
        {
          "line": 704,
          "text": "C6. Member account — `/member/account`, `/m/:slug/member/account`",
          "anchor": "c6-member-account--memberaccount-mslugmemberaccount"
        },
        {
          "line": 733,
          "text": "C7. Staff/member MFA management — `/mfa`",
          "anchor": "c7-staffmember-mfa-management--mfa"
        },
        {
          "line": 751,
          "text": "5. Batch D — Read-only analytics (`DashboardLayout`)",
          "anchor": "5-batch-d--read-only-analytics-dashboardlayout"
        },
        {
          "line": 753,
          "text": "D1. Platform dashboard — tab `platform-dashboard` (global, superadmin)",
          "anchor": "d1-platform-dashboard--tab-platform-dashboard-global-superadmin"
        },
        {
          "line": 772,
          "text": "D2. Usage & limits — tab `usage`",
          "anchor": "d2-usage--limits--tab-usage"
        },
        {
          "line": 789,
          "text": "D3. Organization analytics — tab `organization-analytics`",
          "anchor": "d3-organization-analytics--tab-organization-analytics"
        },
        {
          "line": 803,
          "text": "D4. Makerspace picker (superadmin, pre-workspace)",
          "anchor": "d4-makerspace-picker-superadmin-pre-workspace"
        },
        {
          "line": 822,
          "text": "6. Batch E — Flows (`FlowLayout`)",
          "anchor": "6-batch-e--flows-flowlayout"
        },
        {
          "line": 824,
          "text": "E1. Bulk import — tab `bulk`",
          "anchor": "e1-bulk-import--tab-bulk"
        },
        {
          "line": 846,
          "text": "E2. QR tools (print batch builder) — tab `qr`",
          "anchor": "e2-qr-tools-print-batch-builder--tab-qr"
        },
        {
          "line": 863,
          "text": "E3. Create makerspace — inside Users (core page), superadmin",
          "anchor": "e3-create-makerspace--inside-users-core-page-superadmin"
        },
        {
          "line": 882,
          "text": "E4. Tenant migration — tab `migration` (superadmin)",
          "anchor": "e4-tenant-migration--tab-migration-superadmin"
        },
        {
          "line": 905,
          "text": "E5. Password recovery — `/reset-password`",
          "anchor": "e5-password-recovery--reset-password"
        },
        {
          "line": 926,
          "text": "7. Batch F — Gates and system cards (`CenteredCardLayout`)",
          "anchor": "7-batch-f--gates-and-system-cards-centeredcardlayout"
        },
        {
          "line": 945,
          "text": "8. Batch G — Public pages (`PublicLayout` / `PublicDetailLayout`)",
          "anchor": "8-batch-g--public-pages-publiclayout--publicdetaillayout"
        },
        {
          "line": 952,
          "text": "G1. Landing directory (central mode) — `/`",
          "anchor": "g1-landing-directory-central-mode--"
        },
        {
          "line": 966,
          "text": "G2. About — `/about`",
          "anchor": "g2-about--about"
        },
        {
          "line": 972,
          "text": "G3. Public machines — `/machines`, `/m/:slug/machines`",
          "anchor": "g3-public-machines--machines-mslugmachines"
        },
        {
          "line": 986,
          "text": "G4. Public bookings — `/bookings`, `/m/:slug/bookings`",
          "anchor": "g4-public-bookings--bookings-mslugbookings"
        },
        {
          "line": 1001,
          "text": "G5. Public events list — `/events`, `/m/:slug/events` (only if `ux-spec.md` leaves it out)",
          "anchor": "g5-public-events-list--events-mslugevents-only-if-ux-specmd-leaves-it-out"
        },
        {
          "line": 1008,
          "text": "G6. Print request — `/print`, `/m/:slug/print`",
          "anchor": "g6-print-request--print-mslugprint"
        },
        {
          "line": 1028,
          "text": "G7. Public stats — `/stats`, `/m/:slug/stats`",
          "anchor": "g7-public-stats--stats-mslugstats"
        },
        {
          "line": 1039,
          "text": "G8. Public organization — `/o/:organizationSlug`",
          "anchor": "g8-public-organization--oorganizationslug"
        },
        {
          "line": 1049,
          "text": "G9. Event feedback — `/events/:token/feedback`",
          "anchor": "g9-event-feedback--eventstokenfeedback"
        },
        {
          "line": 1061,
          "text": "G10. Self-checkout — `/checkout`, `/m/:slug/checkout`",
          "anchor": "g10-self-checkout--checkout-mslugcheckout"
        },
        {
          "line": 1079,
          "text": "G11. Archived payments — `/member/archived`",
          "anchor": "g11-archived-payments--memberarchived"
        },
        {
          "line": 1089,
          "text": "9. Batch H — Member area tab bodies (member `AppShell`)",
          "anchor": "9-batch-h--member-area-tab-bodies-member-appshell"
        },
        {
          "line": 1095,
          "text": "H1. Loans — `/member/loans`",
          "anchor": "h1-loans--memberloans"
        },
        {
          "line": 1102,
          "text": "H2. Bookings — `/member/bookings`",
          "anchor": "h2-bookings--memberbookings"
        },
        {
          "line": 1109,
          "text": "H3. Events — `/member/events` (+ partner events)",
          "anchor": "h3-events--memberevents--partner-events"
        },
        {
          "line": 1121,
          "text": "H4. Payments — `/member/payments`",
          "anchor": "h4-payments--memberpayments"
        },
        {
          "line": 1129,
          "text": "H5. Inbox — `/member/inbox`",
          "anchor": "h5-inbox--memberinbox"
        },
        {
          "line": 1136,
          "text": "H6. Account portal — `/member/account-portal`",
          "anchor": "h6-account-portal--memberaccount-portal"
        },
        {
          "line": 1162,
          "text": "10. Batch I — Stations (`KioskLayout`)",
          "anchor": "10-batch-i--stations-kiosklayout"
        },
        {
          "line": 1164,
          "text": "I1. Event check-in station — `/event-check-in/:stationToken`, `/m/:slug/event-check-in/:stationToken`",
          "anchor": "i1-event-check-in-station--event-check-instationtoken-mslugevent-check-instationtoken"
        },
        {
          "line": 1185,
          "text": "I2. Public desk kiosk — `/kiosk/:slug` (central)",
          "anchor": "i2-public-desk-kiosk--kioskslug-central"
        },
        {
          "line": 1194,
          "text": "I3. Scanner page — `/scanner`",
          "anchor": "i3-scanner-page--scanner"
        },
        {
          "line": 1207,
          "text": "I4. Member PWA offline page — `public/member-pwa/offline.html` (+ `offline.css`, `offline.js`)",
          "anchor": "i4-member-pwa-offline-page--publicmember-pwaofflinehtml--offlinecss-offlinejs"
        },
        {
          "line": 1217,
          "text": "Staff Scanner tab — tab `scanner` (listed here because it shares I3's parts)",
          "anchor": "staff-scanner-tab--tab-scanner-listed-here-because-it-shares-i3s-parts"
        },
        {
          "line": 1228,
          "text": "11. Layout gaps and shared sections",
          "anchor": "11-layout-gaps-and-shared-sections"
        },
        {
          "line": 1258,
          "text": "12. Batch J — Overlays and global chrome (no page layout)",
          "anchor": "12-batch-j--overlays-and-global-chrome-no-page-layout"
        },
        {
          "line": 1260,
          "text": "J1. Command palette",
          "anchor": "j1-command-palette"
        },
        {
          "line": 1271,
          "text": "J2. Job tray",
          "anchor": "j2-job-tray"
        },
        {
          "line": 1280,
          "text": "J3. Setup checklist",
          "anchor": "j3-setup-checklist"
        },
        {
          "line": 1288,
          "text": "J4. Shared dialogs restyled once",
          "anchor": "j4-shared-dialogs-restyled-once"
        },
        {
          "line": 1297,
          "text": "13. Cross-cutting merges and moves (summary)",
          "anchor": "13-cross-cutting-merges-and-moves-summary"
        },
        {
          "line": 1318,
          "text": "14. Coverage table",
          "anchor": "14-coverage-table"
        },
        {
          "line": 1320,
          "text": "14.1 Staff tab keys (all 42 in `ALL_TABS`)",
          "anchor": "141-staff-tab-keys-all-42-in-all_tabs"
        },
        {
          "line": 1371,
          "text": "14.2 Routes (`AppRoutes.tsx`, both modes)",
          "anchor": "142-routes-approutestsx-both-modes"
        },
        {
          "line": 1415,
          "text": "14.3 Non-route surfaces",
          "anchor": "143-non-route-surfaces"
        },
        {
          "line": 1433,
          "text": "15. Appendix: wireframes and mobile notes per screen",
          "anchor": "15-appendix-wireframes-and-mobile-notes-per-screen"
        },
        {
          "line": 1443,
          "text": "Batch A",
          "anchor": "batch-a"
        },
        {
          "line": 1587,
          "text": "Batch B",
          "anchor": "batch-b"
        },
        {
          "line": 1630,
          "text": "Batch C",
          "anchor": "batch-c"
        },
        {
          "line": 1686,
          "text": "Batch D",
          "anchor": "batch-d"
        },
        {
          "line": 1726,
          "text": "Batch E",
          "anchor": "batch-e"
        },
        {
          "line": 1769,
          "text": "Batch F (one template)",
          "anchor": "batch-f-one-template"
        },
        {
          "line": 1785,
          "text": "Batch G",
          "anchor": "batch-g"
        },
        {
          "line": 1862,
          "text": "Batch H (inside the member shell)",
          "anchor": "batch-h-inside-the-member-shell"
        },
        {
          "line": 1870,
          "text": "Batch I",
          "anchor": "batch-i"
        }
      ],
      "tables": [
        {
          "line": 26,
          "cells": [
            "Layout",
            "Slots assumed here"
          ]
        },
        {
          "line": 27,
          "cells": [
            "---",
            "---"
          ]
        },
        {
          "line": 28,
          "cells": [
            "`DashboardLayout`",
            "`greeting` (muted date/line), `title`, `actions` (1 primary pill + 1 outline), `callouts[]`, `stats[]`, `main` (sections), `rail` (activity / at-a-glance)"
          ]
        },
        {
          "line": 29,
          "cells": [
            "`ListLayout`",
            "`title`, `subtitle`, `actions`, `callouts[]`, `stats[]`, `tabs` (underline, with count badges), `toolbar` (search, filters, saved views, bulk bar), `list` (card rows or `DataTable`), `pagination`, `rail?`"
          ]
        },
        {
          "line": 30,
          "cells": [
            "`DetailLayout`",
            "`back` (\"← All x\"), `identity` (date/identity chip), `title`, `status` (pill), `meta` line, `actions`, `tabs`, `body`, `rail?` (at-a-glance, callout card)"
          ]
        },
        {
          "line": 31,
          "cells": [
            "`SettingsLayout`",
            "`title`, `subtitle`, `subnav?` (in-page section list), `sections[]` of `SettingsRow` (label + helper left, field right, hairlines), `footer` (Discard / Save), `dangerZone?`"
          ]
        },
        {
          "line": 32,
          "cells": [
            "`FlowLayout`",
            "`back`, `title`, `stepper` (\"Step 2 of 4 · Map columns\"), `step` body, `aside?` (live preview / summary), `footer` (Back · Next/Finish), **presentation `page` or `dialog`** (see §11 gaps)"
          ]
        },
        {
          "line": 33,
          "cells": [
            "`AuthLayout`",
            "`form` (left), `brand` panel (right)"
          ]
        },
        {
          "line": 34,
          "cells": [
            "`CenteredCardLayout`",
            "`logo` (top-left), `icon` tile, `eyebrow`, `title`, `body`, `primary` (full-width pill), `secondary` link, `footnote` (\"Signed in as … · Switch account\")"
          ]
        },
        {
          "line": 35,
          "cells": [
            "`PublicLayout`",
            "`PublicShell` header (space brand, nav, Sign in), `hero` (eyebrow, title, intro), `toolbar?`, `content`, footer"
          ]
        },
        {
          "line": 36,
          "cells": [
            "`PublicDetailLayout`",
            "`PublicShell` header, `hero`, `main`, `aside` (sticky action card), footer"
          ]
        },
        {
          "line": 37,
          "cells": [
            "`KioskLayout`",
            "`station bar` (space avatar, station name, counter, online pill, \"Lock station\"), `stage` (scanner / PIN pad / result), `side` (result panel / recent list), no app chrome"
          ]
        },
        {
          "line": 86,
          "cells": [
            "ID",
            "Reference board / screen",
            "Pattern it contributes"
          ]
        },
        {
          "line": 87,
          "cells": [
            "---",
            "---",
            "---"
          ]
        },
        {
          "line": 88,
          "cells": [
            "org1",
            "Organiser workspace · Home",
            "greeting + date, \"Your organisations\" cards, dashed \"+ New\" card, \"Coming up\" date-chip rows, Recent activity rail"
          ]
        },
        {
          "line": 89,
          "cells": [
            "org2",
            "Organiser workspace · Events",
            "title + 1 primary + 1 outline, yellow callout with link, 4 stat cards, underline tabs with counts, date-chip card rows, inline row action, dashed draft row, activity rail + \"See all →\""
          ]
        },
        {
          "line": 90,
          "cells": [
            "org3",
            "Organiser workspace · New organisation",
            "form left, **live public-page preview** right, primary + text \"Cancel\""
          ]
        },
        {
          "line": 91,
          "cells": [
            "org4",
            "Organiser workspace · Members",
            "\"Invite someone\" card (link field + status pill, Copy / New link / Revoke), person table with avatar, dashed empty \"It's just you so far…\""
          ]
        },
        {
          "line": 92,
          "cells": [
            "org5",
            "Organiser workspace · Settings",
            "settings sub-nav under the active item, label + helper left / field right, hairlines, Discard / Save, red danger-zone card"
          ]
        },
        {
          "line": 93,
          "cells": [
            "org6",
            "Organiser workspace · API access",
            "\"New API client\" card with scope check-cards, dashed empty list, yellow \"Keep keys in a secret manager\" strip, dark code block with Copy, accordion reference"
          ]
        },
        {
          "line": 94,
          "cells": [
            "mgr1",
            "Managing an event · Overview",
            "\"← All events\", date chip + title + status pill + meta, outline + primary pill, underline tabs, stat cards, \"Latest …\" list + \"All guests →\", \"At a glance\" key-value card, yellow callout card"
          ]
        },
        {
          "line": 95,
          "cells": [
            "mgr2",
            "Managing an event · Check-in",
            "progress stat card, yellow callout with dark action, camera block + \"Start scanning\", \"Find a guest\" search, toggle rows, \"Recent check-ins\" with **Undo**, door-station card (Copy link / Show PIN / New PIN / red \"Turn off station\")"
          ]
        },
        {
          "line": 96,
          "cells": [
            "mgr3",
            "Managing an event · Page & programme",
            "segmented control, column cards, dashed \"+ Add session\""
          ]
        },
        {
          "line": 97,
          "cells": [
            "mgr4",
            "Managing an event · Series",
            "upcoming-date cards (first highlighted), details form, agenda list, danger zone"
          ]
        },
        {
          "line": 98,
          "cells": [
            "auth2",
            "Sign in, invites & account · Set new password",
            "small centred card, icon tile, strength meter + rule check, \"Back to sign in\""
          ]
        },
        {
          "line": 99,
          "cells": [
            "auth3",
            "Confirm email",
            "centred card, icon tile, bold address in body, full-width primary, \"Not you? Use another account\""
          ]
        },
        {
          "line": 100,
          "cells": [
            "auth4",
            "Join organisation invite",
            "overlapping avatar tiles, \"You've been invited to join\", role pill, one-time-link note, \"Accept invite\", \"Signed in as … · Switch account\""
          ]
        },
        {
          "line": 101,
          "cells": [
            "auth5",
            "Co-organiser invite",
            "coloured header band, scoped-permission note box, \"Accept & open event\""
          ]
        },
        {
          "line": 102,
          "cells": [
            "auth6",
            "Account · Profile",
            "title + subtitle, underline tabs Profile / Security, settings rows, \"Member since …\" + Save"
          ]
        },
        {
          "line": 103,
          "cells": [
            "auth7",
            "Account · Security",
            "yellow \"Two-step sign-in is off\" callout with dark action, password rows, \"Sign out everywhere\" red-outline"
          ]
        },
        {
          "line": 104,
          "cells": [
            "att9",
            "Attending · You're in",
            "ticket card with QR, \"Add to calendar\" + \"Save ticket\", cancel link"
          ]
        },
        {
          "line": 105,
          "cells": [
            "att10",
            "Attending · Station PIN",
            "big title, 8 PIN boxes, numeric pad, disabled \"Open check-in\" until complete"
          ]
        },
        {
          "line": 106,
          "cells": [
            "att11",
            "Attending · Door scanner",
            "station bar (counter, Online pill, Lock station), scanner frame, big green result panel with \"Next guest\" + \"Undo\", recent list, search + Find"
          ]
        },
        {
          "line": 114,
          "cells": [
            "Batch",
            "Layout",
            "Screens"
          ]
        },
        {
          "line": 115,
          "cells": [
            "---",
            "---",
            "---"
          ]
        },
        {
          "line": 116,
          "cells": [
            "**A** Operational lists",
            "`ListLayout`",
            "Payments, Ledger, Transfers, Stocktake, To buy, To-be-fixed, Notifications, Delivery logs, Accountability, Warranties, Organized events, Member cards, Devices, Data export, Categories, Containers, Job handover, Email templates (index)"
          ]
        },
        {
          "line": 117,
          "cells": [
            "**B** Detail / editor",
            "`DetailLayout`",
            "Email template editor, Stocktake session, Container detail (drawer), Device detail (drawer), Machine service / printer queue (tab body inside the core machine-type page)"
          ]
        },
        {
          "line": 118,
          "cells": [
            "**C** Configuration",
            "`SettingsLayout`",
            "API access, Modules, Platform settings, Backup & restore, Organizations (org workspace), Member account (`/member/account`), Staff MFA (`/mfa`)"
          ]
        },
        {
          "line": 119,
          "cells": [
            "**D** Read-only analytics",
            "`DashboardLayout`",
            "Platform dashboard, Usage & limits, Organization analytics, Makerspace picker (superadmin)"
          ]
        },
        {
          "line": 120,
          "cells": [
            "**E** Flows",
            "`FlowLayout`",
            "Bulk import, QR tools (print batch), Create makerspace, Tenant migration, Password recovery"
          ]
        },
        {
          "line": 121,
          "cells": [
            "**F** Gates and system cards",
            "`CenteredCardLayout`",
            "Change-password gate, MFA challenge, Access denied, Recovery quarantine, Reset password (legacy link), Org invitation redeem, 404, route/session loading, \"No makerspace\""
          ]
        },
        {
          "line": 122,
          "cells": [
            "**G** Public pages",
            "`PublicLayout` / `PublicDetailLayout`",
            "Landing directory, About, Public machines, Public bookings, Public events list (only if the core spec leaves it out), Print request, Public stats, Public organization, Event feedback, Self-checkout, Archived payments, FamilyHome fallbacks"
          ]
        },
        {
          "line": 123,
          "cells": [
            "**H** Member tab bodies",
            "`AppShell` (member) + `ListLayout` / `SettingsLayout`",
            "Loans, Bookings, Events (+ partner events), Payments, Inbox, Account portal (profile, card, directory, referrals, certifications)"
          ]
        },
        {
          "line": 124,
          "cells": [
            "**I** Stations",
            "`KioskLayout`",
            "Event check-in station, Public desk kiosk, Scanner page, PWA offline page"
          ]
        },
        {
          "line": 125,
          "cells": [
            "**J** Overlays (no layout)",
            "dialog / popover",
            "Command palette, Job tray, Setup checklist, payment dialogs, device enrollment, column mapping, panel error boundary"
          ]
        },
        {
          "line": 930,
          "cells": [
            "#",
            "Screen",
            "Component · trigger",
            "Icon · title · body",
            "Primary / secondary"
          ]
        },
        {
          "line": 931,
          "cells": [
            "---",
            "---",
            "---",
            "---",
            "---"
          ]
        },
        {
          "line": 932,
          "cells": [
            "F1",
            "**Change-password gate**",
            "`staff/ChangePasswordGate.tsx` · `must_change_password`",
            "lock · \"Set a new password\" · \"**{username}** is using a temporary password. Choose your own to continue.\" · fields Current / New (meter + rules) / Confirm",
            "**Save new password** / \"Sign out\" (text)"
          ]
        },
        {
          "line": 933,
          "cells": [
            "F2",
            "**MFA challenge / enrol**",
            "`auth/MfaFlow.tsx` · login returns a challenge",
            "shield · Enrol: \"Set up two-step sign-in\" + QR (white tile) + \"Can't scan? Enter this key\" (mono, Copy) · Verify: \"Enter your 6-digit code\" + \"Use a recovery code instead\" link · Codes: grid + Copy all / Download",
            "**Verify** / \"Back to sign in\"; codes: **I've saved my codes** · footnote \"This sign-in expires in {n} minutes.\""
          ]
        },
        {
          "line": 934,
          "cells": [
            "F3",
            "**Access denied (single-tenant)**",
            "`staff/StaffAccessDenied.tsx`",
            "lock · \"You don't have access to {space}\" · \"This console is only for {space}'s team. Sign in with an account that's a member here.\"",
            "**Sign out** / theme toggle moves to footer"
          ]
        },
        {
          "line": 935,
          "cells": [
            "F4",
            "**Recovery quarantine** (superadmin)",
            "`staff/RecoveryQuarantinePanel.tsx`",
            "danger tile · eyebrow \"Recovery quarantine\" · \"Staff access is paused\" · reason · residual risk in a bordered danger box · confirm checkbox",
            "**Lift quarantine** (danger pill, disabled until ticked)"
          ]
        },
        {
          "line": 936,
          "cells": [
            "F5",
            "**Org invitation redeem**",
            "`organizations/OrganizationInvitationRedeemPage.tsx` · `/organization-invitations/redeem/:token`",
            "**auth4**: overlapping avatar tiles (org + you) · \"You've been invited to join\" · org name (if known) · scope pill · \"This link works once.\" · Not signed in: Username or email + Password + **Sign in and continue** · Redeemed: success state \"You're in\" + **Open organizations**",
            "footnote \"Signed in as {user} · Switch account\". **Owner decision:** today redemption fires automatically once signed in. The UX spec asks for an explicit **Accept invite** click. Recommended (frontend-only: call the mutation on click), but it is a behaviour change."
          ]
        },
        {
          "line": 937,
          "cells": [
            "F6",
            "**404**",
            "`AppRoutes.NotFoundPage`",
            "compass · eyebrow \"404\" · \"We couldn't find that page\" · \"The link may be old, or the page moved.\"",
            "**Go to home** (`/` or tenant home) / \"Staff sign-in\" (only on `/admin*`-like paths)"
          ]
        },
        {
          "line": 938,
          "cells": [
            "F7",
            "**Session / route loading**",
            "`StaffApp.StaffLoading`, `AppRoutes.RouteFallback`",
            "logo + spinner · \"Restoring your session…\" / \"Opening {space}…\"",
            "none. Keep these messages in a `role=status` region"
          ]
        },
        {
          "line": 939,
          "cells": [
            "F8",
            "**No makerspace assigned**",
            "`StaffTabContent` `Panel title=\"No makerspace\"`",
            "empty tile · \"No space assigned yet\" · \"Ask a space manager to add you to their team.\"",
            "**Sign out**"
          ]
        },
        {
          "line": 940,
          "cells": [
            "F9",
            "**Panel crashed**",
            "`StaffPanelErrorBoundary`",
            "in-page (not full-screen) danger-tinted empty card inside the current layout's body · \"This page couldn't load\" · \"Something went wrong on our side. Reloading usually fixes it.\"",
            "**Reload** / \"Report details\" (copies the error id if one exists)"
          ]
        },
        {
          "line": 941,
          "cells": [
            "F10",
            "**Tenant home unavailable**",
            "`AppRoutes.FamilyHome` error / no public programme",
            "public variant inside `PublicLayout`: \"We couldn't load this space\" + Try again · \"{Space} hasn't published anything yet. Check back soon.\"",
            "—"
          ]
        },
        {
          "line": 1299,
          "cells": [
            "Move",
            "From → to",
            "Why",
            "Needs"
          ]
        },
        {
          "line": 1300,
          "cells": [
            "---",
            "---",
            "---",
            "---"
          ]
        },
        {
          "line": 1301,
          "cells": [
            "Telegram chat ID / bot token",
            "API access → Makerspace settings › Notifications/Integrations",
            "not an API-client concern",
            "core settings owner"
          ]
        },
        {
          "line": 1302,
          "cells": [
            "Broadcast composer",
            "pinned above inbox → \"Send announcement\" dialog on Notifications",
            "one primary; inbox is the job",
            "—"
          ]
        },
        {
          "line": 1303,
          "cells": [
            "Stocktake policy & schedules",
            "top of Stocktake → More › \"Count policy and schedule\" drawer",
            "config ≠ daily work",
            "—"
          ]
        },
        {
          "line": 1304,
          "cells": [
            "Suppressions",
            "below delivery log → tab \"Suppressed addresses\"",
            "one list per view",
            "—"
          ]
        },
        {
          "line": 1305,
          "cells": [
            "Space packs",
            "Makerspace settings → stays (core); referenced from Create makerspace step 3",
            "—",
            "core settings owner"
          ]
        },
        {
          "line": 1306,
          "cells": [
            "Usage & limits",
            "own tab → optionally Settings › Plan & usage",
            "fewer admin tabs",
            "owner decision"
          ]
        },
        {
          "line": 1307,
          "cells": [
            "Member directory",
            "Account tab → own member nav item",
            "it's community, not account",
            "`memberTabs` change, owner decision"
          ]
        },
        {
          "line": 1308,
          "cells": [
            "Member account (2 pages)",
            "`/member/account` + account-portal tab → one cross-linked area",
            "user sees one \"account\"",
            "—"
          ]
        },
        {
          "line": 1309,
          "cells": [
            "Platform settings (3 stacked panels)",
            "→ sub-nav sections",
            "—",
            "—"
          ]
        },
        {
          "line": 1310,
          "cells": [
            "Accountability (4 stacked panels)",
            "→ tabs",
            "—",
            "—"
          ]
        },
        {
          "line": 1311,
          "cells": [
            "Member cards (4 stacked sections)",
            "→ tabs",
            "—",
            "—"
          ]
        },
        {
          "line": 1312,
          "cells": [
            "QR tools (3 stacked forms)",
            "→ batch list + batch detail with segmented \"Add labels\"",
            "—",
            "—"
          ]
        },
        {
          "line": 1313,
          "cells": [
            "Organizations select + pager",
            "→ org cards index + org settings sub-nav",
            "reference organiser workspace",
            "—"
          ]
        },
        {
          "line": 1314,
          "cells": [
            "Dead code",
            "`panels/EmailLogPanel.tsx` (exported, not routed)",
            "—",
            "separate cleanup"
          ]
        },
        {
          "line": 1324,
          "cells": [
            "Tab key",
            "Label",
            "Component",
            "Spec",
            "Section",
            "Layout"
          ]
        },
        {
          "line": 1325,
          "cells": [
            "---",
            "---",
            "---",
            "---",
            "---",
            "---"
          ]
        },
        {
          "line": 1326,
          "cells": [
            "`platform-dashboard`",
            "Platform dashboard",
            "`PlatformDashboardPanel`",
            "longtail",
            "D1",
            "DashboardLayout"
          ]
        },
        {
          "line": 1327,
          "cells": [
            "`usage`",
            "Usage & limits",
            "`TenantUsagePanel`",
            "longtail",
            "D2",
            "DashboardLayout"
          ]
        },
        {
          "line": 1328,
          "cells": [
            "`dashboard`",
            "Dashboard",
            "`panels/DashboardPanel`",
            "ux-spec",
            "Staff Home",
            "DashboardLayout"
          ]
        },
        {
          "line": 1329,
          "cells": [
            "`notifications`",
            "Notifications",
            "`panels/NotificationInbox`",
            "longtail",
            "A7",
            "ListLayout"
          ]
        },
        {
          "line": 1330,
          "cells": [
            "`requests`",
            "Requests",
            "`panels/RequestsPanel`",
            "ux-spec",
            "Requests",
            "ListLayout / DetailLayout"
          ]
        },
        {
          "line": 1331,
          "cells": [
            "`direct`",
            "Direct handout",
            "`DirectLoans`",
            "ux-spec",
            "Direct handout",
            "(core)"
          ]
        },
        {
          "line": 1332,
          "cells": [
            "`handover`",
            "Job handover",
            "`panels/machine/HandoverConsole`",
            "longtail",
            "A17",
            "ListLayout"
          ]
        },
        {
          "line": 1333,
          "cells": [
            "`inventory`",
            "Inventory",
            "`panels/Inventory`",
            "ux-spec",
            "Inventory",
            "ListLayout / DetailLayout"
          ]
        },
        {
          "line": 1334,
          "cells": [
            "`needsfix`",
            "To-be-fixed",
            "`panels/NeedsFixShelf`",
            "longtail",
            "A6",
            "ListLayout"
          ]
        },
        {
          "line": 1335,
          "cells": [
            "`categories`",
            "Categories",
            "`panels/Categories`",
            "longtail",
            "A15",
            "ListLayout"
          ]
        },
        {
          "line": 1336,
          "cells": [
            "`machines`",
            "Machines",
            "`panels/MachinesPanel`",
            "ux-spec (+ longtail B5 for service-console tab bodies)",
            "Machines",
            "(core) DetailLayout"
          ]
        },
        {
          "line": 1337,
          "cells": [
            "`events`",
            "Events",
            "`EventsPanel`",
            "ux-spec (+ longtail §13 note: collaboration inbox → callout)",
            "Events",
            "(core)"
          ]
        },
        {
          "line": 1338,
          "cells": [
            "`organized`",
            "Organized events",
            "`panels/OrganizedEventsPanel`",
            "longtail",
            "A11",
            "ListLayout"
          ]
        },
        {
          "line": 1339,
          "cells": [
            "`bookings`",
            "Bookings",
            "`BookingsPanel`",
            "ux-spec",
            "Bookings",
            "(core)"
          ]
        },
        {
          "line": 1340,
          "cells": [
            "`members`",
            "Members",
            "`MembersPanel`",
            "ux-spec",
            "Members",
            "(core)"
          ]
        },
        {
          "line": 1341,
          "cells": [
            "`cards`",
            "Member cards",
            "`panels/MemberCardsPanel`",
            "longtail",
            "A12",
            "ListLayout"
          ]
        },
        {
          "line": 1342,
          "cells": [
            "`tobuy`",
            "To Buy",
            "`panels/ProcurementPanel`",
            "longtail",
            "A5",
            "ListLayout"
          ]
        },
        {
          "line": 1343,
          "cells": [
            "`transfers`",
            "Transfers",
            "`panels/StockTransferPanel`",
            "longtail",
            "A3",
            "ListLayout + FlowLayout(dialog)"
          ]
        },
        {
          "line": 1344,
          "cells": [
            "`stocktake`",
            "Stocktake",
            "`panels/StocktakeSessionPanel`",
            "longtail",
            "A4, B2",
            "ListLayout / DetailLayout"
          ]
        },
        {
          "line": 1345,
          "cells": [
            "`containers`",
            "Containers",
            "`panels/ContainersPanel`",
            "longtail",
            "A16, B3",
            "ListLayout / DetailLayout(drawer)"
          ]
        },
        {
          "line": 1346,
          "cells": [
            "`ledger`",
            "Ledger",
            "`panels/Ledger`",
            "longtail",
            "A2",
            "ListLayout"
          ]
        },
        {
          "line": 1347,
          "cells": [
            "`reports`",
            "Reports",
            "`panels/OperationsReports`",
            "ux-spec",
            "Reports",
            "(core)"
          ]
        },
        {
          "line": 1348,
          "cells": [
            "`accountability`",
            "Accountability",
            "`panels/AccountabilityPanel`",
            "longtail",
            "A9",
            "ListLayout"
          ]
        },
        {
          "line": 1349,
          "cells": [
            "`warranty`",
            "Warranties",
            "`panels/WarrantyPanel`",
            "longtail",
            "A10",
            "ListLayout"
          ]
        },
        {
          "line": 1350,
          "cells": [
            "`bulk`",
            "Bulk import",
            "`panels/BulkImport`",
            "longtail",
            "E1",
            "FlowLayout"
          ]
        },
        {
          "line": 1351,
          "cells": [
            "`qr`",
            "QR Tools",
            "`panels/QrTools`",
            "longtail",
            "E2",
            "ListLayout / DetailLayout"
          ]
        },
        {
          "line": 1352,
          "cells": [
            "`scanner`",
            "Scanner",
            "`panels/ScannerPanel`",
            "longtail",
            "§10 \"Staff Scanner tab\"",
            "ListLayout + ScanWorkbench"
          ]
        },
        {
          "line": 1353,
          "cells": [
            "`api`",
            "API access",
            "`ApiClientsPanel`",
            "longtail",
            "C1",
            "SettingsLayout"
          ]
        },
        {
          "line": 1354,
          "cells": [
            "`settings`",
            "Settings",
            "`MakerspaceSettingsPanel`",
            "ux-spec",
            "Makerspace settings",
            "(core) SettingsLayout"
          ]
        },
        {
          "line": 1355,
          "cells": [
            "`emailtemplates`",
            "Email templates",
            "`panels/EmailTemplatesPanel`",
            "longtail",
            "A18, B1",
            "ListLayout / DetailLayout"
          ]
        },
        {
          "line": 1356,
          "cells": [
            "`users`",
            "Users",
            "`panels/Users`",
            "ux-spec (+ longtail E3 for Create makerspace)",
            "Staff & roles",
            "(core)"
          ]
        },
        {
          "line": 1357,
          "cells": [
            "`platform`",
            "Platform settings",
            "`PlatformEmail/SocialAuth/StripeConnect`",
            "longtail",
            "C3",
            "SettingsLayout"
          ]
        },
        {
          "line": 1358,
          "cells": [
            "`audit`",
            "Audit log",
            "`panels/AuditLog`",
            "ux-spec",
            "Audit log",
            "(core)"
          ]
        },
        {
          "line": 1359,
          "cells": [
            "`devices`",
            "Devices",
            "`panels/DevicesPanel`",
            "longtail",
            "A13",
            "ListLayout"
          ]
        },
        {
          "line": 1360,
          "cells": [
            "`email-logs`",
            "Delivery logs",
            "`panels/DeliveryLogPanel`",
            "longtail",
            "A8",
            "ListLayout"
          ]
        },
        {
          "line": 1361,
          "cells": [
            "`payments`",
            "Payments",
            "`PaymentsPanel`",
            "longtail",
            "A1",
            "ListLayout"
          ]
        },
        {
          "line": 1362,
          "cells": [
            "`organizations`",
            "Organizations",
            "`panels/OrganizationsPanel`",
            "longtail",
            "C5",
            "DashboardLayout(index) / SettingsLayout"
          ]
        },
        {
          "line": 1363,
          "cells": [
            "`organization-analytics`",
            "Organization analytics",
            "`panels/OrganizationAnalyticsPanel`",
            "longtail",
            "D3",
            "DashboardLayout"
          ]
        },
        {
          "line": 1364,
          "cells": [
            "`modules`",
            "Modules",
            "`ModulesPanel`",
            "longtail",
            "C2",
            "SettingsLayout"
          ]
        },
        {
          "line": 1365,
          "cells": [
            "`exports`",
            "Data export",
            "`DataExportsPanel`",
            "longtail",
            "A14",
            "ListLayout"
          ]
        },
        {
          "line": 1366,
          "cells": [
            "`backups`",
            "Backup & restore",
            "`BackupRestorePanel`",
            "longtail",
            "C4",
            "SettingsLayout"
          ]
        },
        {
          "line": 1367,
          "cells": [
            "`migration`",
            "Tenant migration",
            "`TenantMigrationPanel`",
            "longtail",
            "E4",
            "FlowLayout"
          ]
        },
        {
          "line": 1373,
          "cells": [
            "Route (single · central)",
            "Component",
            "Spec",
            "Section",
            "Layout"
          ]
        },
        {
          "line": 1374,
          "cells": [
            "---",
            "---",
            "---",
            "---",
            "---"
          ]
        },
        {
          "line": 1375,
          "cells": [
            "`/` · `/m/:slug` → `FamilyHome` → inventory/events/bookings/machines/membership",
            "per `publicHome()`",
            "ux-spec (catalogue, event, member home), longtail (machines G3, bookings G4)",
            "—",
            "PublicLayout"
          ]
        },
        {
          "line": 1376,
          "cells": [
            "`FamilyHome` error / \"No public programme\"",
            "`AppRoutes.FamilyHome`",
            "longtail",
            "F10",
            "PublicLayout"
          ]
        },
        {
          "line": 1377,
          "cells": [
            "`/` (central)",
            "`LandingPage`",
            "longtail",
            "G1",
            "PublicLayout"
          ]
        },
        {
          "line": 1378,
          "cells": [
            "`/about`",
            "`AboutPage`",
            "longtail",
            "G2",
            "PublicLayout"
          ]
        },
        {
          "line": 1379,
          "cells": [
            "`/o/:organizationSlug`",
            "`PublicOrganizationPage`",
            "longtail",
            "G8",
            "PublicLayout"
          ]
        },
        {
          "line": 1380,
          "cells": [
            "`/items/:itemId` · `/m/:slug/items/:itemId`",
            "`PublicItemPage`",
            "ux-spec",
            "Public item",
            "PublicDetailLayout"
          ]
        },
        {
          "line": 1381,
          "cells": [
            "`/checkout` · `/m/:slug/checkout`",
            "`PublicSelfCheckoutPage`",
            "longtail",
            "G10",
            "PublicLayout + FlowLayout body"
          ]
        },
        {
          "line": 1382,
          "cells": [
            "`/events` · `/m/:slug/events`",
            "`PublicEventsPage`",
            "ux-spec if covered, else longtail",
            "G5",
            "PublicLayout"
          ]
        },
        {
          "line": 1383,
          "cells": [
            "`/events/:publicToken` · `/m/:slug/events/:publicToken`",
            "`PublicEventDetailPage`",
            "ux-spec",
            "Public event page",
            "PublicDetailLayout"
          ]
        },
        {
          "line": 1384,
          "cells": [
            "`/events/:publicToken/feedback` · `/m/:slug/…/feedback`",
            "`PublicEventFeedbackPage`",
            "longtail",
            "G9",
            "PublicLayout / CenteredCardLayout"
          ]
        },
        {
          "line": 1385,
          "cells": [
            "`/event-check-in/:stationToken` · `/m/:slug/event-check-in/:stationToken`",
            "`EventCheckInStationPage`",
            "longtail",
            "I1",
            "KioskLayout"
          ]
        },
        {
          "line": 1386,
          "cells": [
            "`/machines` · `/m/:slug/machines`",
            "`PublicMachinesPage`",
            "longtail",
            "G3",
            "PublicLayout"
          ]
        },
        {
          "line": 1387,
          "cells": [
            "`/bookings` · `/m/:slug/bookings`",
            "`PublicBookingsPage`",
            "longtail",
            "G4",
            "PublicLayout / PublicDetailLayout"
          ]
        },
        {
          "line": 1388,
          "cells": [
            "`/print` · `/m/:slug/print`",
            "`PublicPrintRequestPage`",
            "longtail",
            "G6",
            "PublicDetailLayout"
          ]
        },
        {
          "line": 1389,
          "cells": [
            "`/member` · `/m/:slug/member` (overview, sign-in)",
            "`MemberArea`",
            "ux-spec",
            "Member home / Member sign-in",
            "AppShell / AuthLayout"
          ]
        },
        {
          "line": 1390,
          "cells": [
            "`/member/:memberTab` · `/m/:slug/member/:memberTab` — `loans`",
            "`MemberArea`",
            "longtail",
            "H1",
            "AppShell + ListLayout"
          ]
        },
        {
          "line": 1391,
          "cells": [
            "— `bookings`",
            "`MemberArea` → `MyBookings`",
            "longtail",
            "H2",
            "AppShell + ListLayout"
          ]
        },
        {
          "line": 1392,
          "cells": [
            "— `events`",
            "`MemberArea` → activity + `PartnerEvents`",
            "longtail",
            "H3",
            "AppShell + ListLayout"
          ]
        },
        {
          "line": 1393,
          "cells": [
            "— `payments`",
            "`MemberArea` → `MemberPayments`",
            "longtail",
            "H4",
            "AppShell + ListLayout"
          ]
        },
        {
          "line": 1394,
          "cells": [
            "— `inbox`",
            "`MemberArea` → notifications",
            "longtail",
            "H5",
            "AppShell + ListLayout / SettingsLayout"
          ]
        },
        {
          "line": 1395,
          "cells": [
            "— `account-portal`",
            "`MemberArea` → profile, card, directory, referrals",
            "longtail",
            "H6",
            "AppShell + SettingsLayout"
          ]
        },
        {
          "line": 1396,
          "cells": [
            "— `overview`",
            "`MemberArea`",
            "ux-spec",
            "Member home",
            "AppShell + DashboardLayout"
          ]
        },
        {
          "line": 1397,
          "cells": [
            "`/member/account` · `/m/:slug/member/account`",
            "`MemberAccountPage`",
            "longtail",
            "C6",
            "AppShell + SettingsLayout"
          ]
        },
        {
          "line": 1398,
          "cells": [
            "`/member/archived`",
            "`ArchivedPayments`",
            "longtail",
            "G11",
            "PublicLayout"
          ]
        },
        {
          "line": 1399,
          "cells": [
            "`/stats` · `/m/:slug/stats`",
            "`PublicStatsPage`",
            "longtail",
            "G7",
            "PublicLayout"
          ]
        },
        {
          "line": 1400,
          "cells": [
            "`/reset-password`",
            "`ResetPasswordPage`",
            "longtail",
            "E5",
            "CenteredCardLayout"
          ]
        },
        {
          "line": 1401,
          "cells": [
            "`/mfa`",
            "`MfaAccountPage`",
            "longtail",
            "C7",
            "CenteredCardLayout"
          ]
        },
        {
          "line": 1402,
          "cells": [
            "`/staff-invitations/accept`",
            "`StaffInvitationAcceptPage`",
            "ux-spec",
            "Invitation accept",
            "CenteredCardLayout"
          ]
        },
        {
          "line": 1403,
          "cells": [
            "`/organization-invitations/redeem/:token`",
            "`OrganizationInvitationRedeemPage`",
            "longtail",
            "F5",
            "CenteredCardLayout"
          ]
        },
        {
          "line": 1404,
          "cells": [
            "`/admin/*` · `/m/:slug/admin/*` (sign-in)",
            "`StaffApp` → `LoginPanel`",
            "ux-spec",
            "Staff sign-in",
            "AuthLayout"
          ]
        },
        {
          "line": 1405,
          "cells": [
            "`/admin/*` gates: MFA, change password, quarantine, access denied, picker, loading",
            "`StaffApp`",
            "longtail",
            "F1–F4, F7, D4",
            "CenteredCardLayout / DashboardLayout"
          ]
        },
        {
          "line": 1406,
          "cells": [
            "`/admin/{tab}`",
            "`StaffWorkspace` → tab",
            "per 14.1",
            "—",
            "AppShell + per 14.1"
          ]
        },
        {
          "line": 1407,
          "cells": [
            "`/guest-admin/*`",
            "`StaffApp guestOnly`",
            "same as `/admin/*` (narrow tab set, same layouts)",
            "—",
            "—"
          ]
        },
        {
          "line": 1408,
          "cells": [
            "`/scanner`",
            "`ScannerPage`",
            "longtail",
            "I3",
            "KioskLayout"
          ]
        },
        {
          "line": 1409,
          "cells": [
            "`/kiosk/:stationToken` · `/m/:slug/kiosk/:stationToken`",
            "`KioskStationPage`",
            "ux-spec",
            "Kiosk station",
            "KioskLayout"
          ]
        },
        {
          "line": 1410,
          "cells": [
            "`/kiosk/:slug` (central)",
            "`PublicDeskKioskPage`",
            "longtail",
            "I2",
            "KioskLayout"
          ]
        },
        {
          "line": 1411,
          "cells": [
            "`/superadmin` (central)",
            "`SuperadminPage` → `StaffApp`",
            "same as `/admin/*` (D4 picker)",
            "D4",
            "—"
          ]
        },
        {
          "line": 1412,
          "cells": [
            "`*`",
            "`NotFoundPage`",
            "longtail",
            "F6",
            "CenteredCardLayout"
          ]
        },
        {
          "line": 1413,
          "cells": [
            "(static) `/member-pwa/offline.html`",
            "PWA offline",
            "longtail",
            "I4",
            "KioskLayout (static mirror)"
          ]
        },
        {
          "line": 1417,
          "cells": [
            "Surface",
            "Component",
            "Spec",
            "Section"
          ]
        },
        {
          "line": 1418,
          "cells": [
            "---",
            "---",
            "---",
            "---"
          ]
        },
        {
          "line": 1419,
          "cells": [
            "Command palette",
            "`CommandPalette`",
            "longtail",
            "J1"
          ]
        },
        {
          "line": 1420,
          "cells": [
            "Job tray",
            "`components/ui/JobTray`",
            "longtail",
            "J2"
          ]
        },
        {
          "line": 1421,
          "cells": [
            "Setup checklist",
            "`SetupChecklist`",
            "longtail (coordinate with core Dashboard)",
            "J3"
          ]
        },
        {
          "line": 1422,
          "cells": [
            "Create makerspace wizard",
            "`usersModals/CreateMakerspaceModal`",
            "longtail",
            "E3"
          ]
        },
        {
          "line": 1423,
          "cells": [
            "MFA challenge (inside staff sign-in)",
            "`auth/MfaFlow`",
            "longtail",
            "F2"
          ]
        },
        {
          "line": 1424,
          "cells": [
            "Panel error boundary",
            "`StaffPanelErrorBoundary`",
            "longtail",
            "F9"
          ]
        },
        {
          "line": 1425,
          "cells": [
            "Payment dialogs",
            "`SettlementDialog`, `PaymentRefundDialog`, `RefundReceiptAmendDialog`",
            "longtail",
            "A1, J4"
          ]
        },
        {
          "line": 1426,
          "cells": [
            "Payment reconcile actions (embedded in bookings/events/admissions)",
            "`PaymentReconcileActions`",
            "host screen's spec (core); restyle per A1 dialogs",
            "A1"
          ]
        },
        {
          "line": 1427,
          "cells": [
            "Event collaboration inboxes (inside Events)",
            "`CollaborationInbox`, `EventSeriesCollaborationInbox`",
            "ux-spec Events page; recommended as a yellow callout \"{n} spaces invited you to co-host\" → review list",
            "§13"
          ]
        },
        {
          "line": 1428,
          "cells": [
            "Integration health (inside Settings)",
            "`IntegrationHealthPanel`",
            "ux-spec (Settings)",
            "—"
          ]
        },
        {
          "line": 1429,
          "cells": [
            "Machine service / printer consoles (inside machine type)",
            "`MachineServiceConsole`, `PrinterServiceConsole`",
            "longtail",
            "B5"
          ]
        }
      ],
      "links": [],
      "code": [
        {
          "line": 160,
          "language": "",
          "endLine": 174,
          "body": "Payments                                            [Receipts & credit notes]\nMoney owed to Fab Lab, and how it was paid.\n┌ ! 3 charges are overdue. Oldest is 12 days old.            Show overdue → ┐\n┌Pending──┐┌Overdue──┐┌Waived───┐\n│ 14      ││ 3       ││ 2       │\n└─────────┘└─────────┘└─────────┘\n To collect 14 | Paid online | Paid in person | Waived | All\n [Due: All · Today · Upcoming · Overdue]  [Subject v]  [Sort v]  [Views v]\n┌──────────────────────────────────────────────────────────────────────────┐\n│[ ] Laser job #A12 · Machine service   Due in 2 days   ₹450    Mark paid [...]│\n│[ ] Monthly dues · Membership          Overdue 12 d    ₹800    Mark paid [...]│\n└──────────────────────────────────────────────────────────────────────────┘\n                                              ‹ 1 2 3 ›"
        },
        {
          "line": 207,
          "language": "",
          "endLine": 216,
          "body": "Ledger                                                              [More v]\nEverything that's out right now.\n┌Items out┐┌Records┐┌Overdue┐\n│ 37      ││ 21    ││ 4     │\n All | Reviewed | Self-checkout | Direct\n [Search holder, email, item or box........]  (Overdue only)\n┌ (AK) Arduino Uno ×2 · Box B-04           Out since 3 Oct   Due Fri ┐\n┌ (RM) Soldering station                   Out since 1 Oct   Overdue 3 d ┐"
        },
        {
          "line": 1448,
          "language": "",
          "endLine": 1455,
          "body": "Transfers                                                    [New transfer]\nStock moved between boxes and spaces.\n┌ (→) 4 × Jumper kit             Box A-02 → Box C-11 · restock      3 Oct  (SK) ┐\n┌ (→) 1 × Oscilloscope           Fab Lab → Uni Lab · loan pool      1 Oct  (RM) ┐\n                    dialog: New transfer — Step 1 of 2 · From and to\n                    [Source v] [Destination v]      (Back) [Next]"
        },
        {
          "line": 1459,
          "language": "",
          "endLine": 1466,
          "body": "Stocktake                                         [Start count]  [More v]\nCount what's on the shelves and fix the numbers.\n┌ ! Monthly cycle count is due today.                         Start it → ┐\n┌In progress┐┌Needs approval┐┌Applied this month┐\n Active 1 | Needs approval 2 | Ready to apply | Done\n┌ (#14) Count of Box B (all)   Counting · 23 lines · started 2 Oct   Continue ┐"
        },
        {
          "line": 1469,
          "language": "",
          "endLine": 1476,
          "body": "To buy                                            [Add item]  [More v]\n┌ ! 3 items are running low.                          Review suggestions → ┐\n┌Estimated total┐┌Open budget┐┌Spent┐\n Requested 4 | Approved 2 | Ordered 3 | Received 1 | Cancelled | All\n ── Laser cutter ───────────────────────────────────────────────\n┌ Honeycomb bed ×1   Vendor X · est ₹4,200 · Asha     [Requested]  Approve [...] ┐"
        },
        {
          "line": 1480,
          "language": "",
          "endLine": 1485,
          "body": "To be fixed\nUnits returned broken. Repair them back into stock, or scrap them.\n┌Units to fix┐┌Products┐\n┌ Multimeter   (3 to fix)  5 available · 9 total   [– 3 +]  Repaired [...] ┐"
        },
        {
          "line": 1488,
          "language": "",
          "endLine": 1495,
          "body": "Notifications · 4 unread               (Send announcement)  [Mark all read]\n Unread 4 | All\n (Hardware)(Printing)(Events)(Bookings)(Members)(Payments)…\n Today\n┃(▣) Request accepted · Arduino kit — Asha's request was…      2 min ago   Open\n (◷) Booking cancelled · Bench 2 — …                           1 h ago"
        },
        {
          "line": 1498,
          "language": "",
          "endLine": 1505,
          "body": "Delivery logs                                                   [Send test]\n┌ ! 2 deliveries failed.                                      Show failed → ┐\n Deliveries | Suppressed addresses\n (All)(Sent)(Failed)(Pending)(Skipped)  [Channel v] [Destination v] [More filters]\n┌ (✉) Requests · accepted   asha@… · 3 attempts · 10:02     [Failed]  Retry ┐\n     SMTP 550 mailbox unavailable"
        },
        {
          "line": 1508,
          "language": "",
          "endLine": 1513,
          "body": "Accountability\n┌Overdue 4┐┌Open problems 1┐┌Repeat offenders 2┐┌Restricted 1┐\n Overdue | Problems | Repeat offenders | Restricted\n┌ (RM) Soldering station · Ravi M.                 [Overdue 6 d]  Open loan ┐"
        },
        {
          "line": 1516,
          "language": "",
          "endLine": 1520,
          "body": "Warranties                         Coverage for machines and assets in Fab Lab.\n All | Active | Expiring soon | Expired | Not covered     [Expires before ▢] (Missing docs)\n┌ (LC) Laser cutter · Trotec   bought 2024 → expires Mar 2027   [Active] 2 docs  Manage ┐"
        },
        {
          "line": 1523,
          "language": "",
          "endLine": 1527,
          "body": "Organized events\n Upcoming | Past\n┌[OCT|14] Robotics meetup     Fab Lab · Bengaluru            12 / 40 going ▬▬──  [Published] ┐"
        },
        {
          "line": 1530,
          "language": "",
          "endLine": 1536,
          "body": "Member cards                                  (Scan a card)  [Print all active]\n┌Active cards 120┐┌Without a card 8┐\n Cards | Issue | Scan | Card layout\n (Active)(Revoked)\n┌[ ] MC-0012  Asha K.   [Active]  printed 2×  photo ✓        Print [...] ┐"
        },
        {
          "line": 1539,
          "language": "",
          "endLine": 1544,
          "body": "Devices                                                       [Add device]\n┌Online 2┐┌Offline 1┐┌Revoked 0┐\n┌ (printer) Bambu X1 · Printer     Last seen 4 min ago            [Online]  ┐\n┌ (label) Label printer · Label    Offline since 09:12            [Offline] ┐"
        },
        {
          "line": 1547,
          "language": "",
          "endLine": 1552,
          "body": "Data export                                                 [Request export]\nA readable copy of your space's records. Not a backup.\n┌ ! Exports include member names, emails and phone numbers.   Read what's included ┐\n┌ (⇩) Export · 3 Oct 10:02     4,812 rows                 [Ready]   Download ┐"
        },
        {
          "line": 1555,
          "language": "",
          "endLine": 1559,
          "body": "Categories                                                  [Add category]\n┌ Name          Products   Order   Icon                          ┐\n│ Electronics      42        1      cpu            Edit  [...]   │"
        },
        {
          "line": 1562,
          "language": "",
          "endLine": 1566,
          "body": "Containers                                           [Create in QR tools]\n [Search……]  (Active)(Inactive)\n┌[B-04] Electronics bin · Shelf 2                         12 items ┐"
        },
        {
          "line": 1569,
          "language": "",
          "endLine": 1575,
          "body": "Ready to collect\nFinished jobs waiting for their owners.\n┌Waiting 5┐┌Unpaid 2┐\n [Search requester……]\n┌ (AK) Bracket v2 · Bambu X1 · finished 20 min ago   [Unpaid ₹120]  Hand over ┐"
        },
        {
          "line": 1578,
          "language": "",
          "endLine": 1585,
          "body": "Email templates\n Hardware | Printing | Events | Bookings\n To members\n┌ Request accepted        Sent when a request is accepted          [Edited] ┐\n To staff\n┌ New request             Sent when someone submits a request               ┐"
        },
        {
          "line": 1590,
          "language": "",
          "endLine": 1600,
          "body": "← All templates\nRequest accepted  [Edited]                         (Preview)  [Save]  [More v]\nHardware · to members\n[ Space default | Laser cutter | 3D printer ]\n Edit | Preview | Default\n┌ Subject  [………………………………]            ┐  ┌ Merge fields      ┐\n│ Plain text                          │  │ {{member_name}}   │\n│ [……………………………………………………]          │  │ {{item_name}} …   │\n└─────────────────────────────────────┘  └───────────────────┘"
        },
        {
          "line": 1604,
          "language": "",
          "endLine": 1612,
          "body": "← All counts\n[#14] Count of Box B  [Counting]                         [Complete count]\nStarted 2 Oct · Blind count\n┌Lines counted 23┐┌Variances 2┐\n┌ camera / paste ┐ [Product v] [Qty] [Record count]\n Counted so far\n┌ Multimeter    counted 9        [–1]                           ┐"
        },
        {
          "line": 1615,
          "language": "",
          "endLine": 1621,
          "body": "│ Electronics bin   [Active]        × │\n│ B-04 · Shelf 2                       │\n│ Contents | History | Details         │\n│ Products: Arduino Uno · 6 avail      │\n│ Units: MM-03 [Out]   Show QR  [...]  │"
        },
        {
          "line": 1624,
          "language": "",
          "endLine": 1628,
          "body": " Overview | Queue | Manual usage | Printer reports | …\n Pending 3 | Accepted 1 | Printing 2 | Ready 1 | Failed\n┌ (AK) Bracket v2   planned 40 g · actual —        [Pending]  Accept [...] ┐"
        },
        {
          "line": 1633,
          "language": "",
          "endLine": 1645,
          "body": "API access\n┌ New API client ──────────────────────────────────────────────┐\n│ [Client label] [Allowed origins]                               │\n│ What can it do?  ┌☑ Inventory   ┐┌☐ Requests  ┐┌☐ Events    ┐ │\n│                  └inventory:read ┘└requests:…  ┘└events:read ┘ │\n│ [Create client]                                                │\n└────────────────────────────────────────────────────────────────┘\n Clients\n┌┄ No clients yet. The secret appears once, right after you create one. ┄┐\n Developer reference\n┌ ! Keep keys in a secret manager. Never put them in browser code or URLs. ┐"
        },
        {
          "line": 1648,
          "language": "",
          "endLine": 1655,
          "body": "Modules                          Switch features on for Fab Lab…\n Lending 3/4 │ Loans · Borrowing with evidence…           [● on ]\n Machines 2/3│ ─────────────────────────────────────────────\n Events 1/2  │ Events · Public events, registration…      [○ off]\n Money 1/3   │ Payments · Online card payments…  Needed by: Memberships [● locked]\n Platform    │"
        },
        {
          "line": 1659,
          "language": "",
          "endLine": 1667,
          "body": "Platform settings\n Email  │ SMTP host           [………………]\n Sign-in│ ─────────────────────────────\n Stripe │ SMTP password       [••••••] (Saved)\n        │                         (Discard) [Save]\n        │ ┌ Danger zone ───────────────────────────────────────┐\n        │ │ Clear secret key   Removes the saved key.  (Clear…) │"
        },
        {
          "line": 1670,
          "language": "",
          "endLine": 1680,
          "body": "Organizations\n┌[MC] Maker Collective    ┐ ┌┄ + New organisation ┄┐\n│ Owner · 3 spaces        │ │ A home for a group…  │\n└─────────────────────────┘ └┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┘\n→ Maker Collective          (View public page ↗)\n Profile │ Name        [Maker Collective]\n People  │ Public slug  …/o/maker-collective   Copy\n Invites │ …                              (Discard) [Save]\n Spaces  │"
        },
        {
          "line": 1689,
          "language": "",
          "endLine": 1698,
          "body": "Checked 2 min ago\nPlatform                                                    (Run checks now)\n┌ ! Offsite backup \"b2\" failed verification.                    Inspect → ┐\n┌Live 12┐┌Hidden 1┐┌Failed emails 3┐┌Failed alerts 0┐\n Problems                                      │ Backups\n┌[Error] Scheduler: reports didn't run   Inspect│ Last success 02:00\n┌[Warn ] Fab Lab near storage limit      Inspect│ Offsite b2 [Needs attention]\n Tenant usage · Scheduler freshness            │ Delivery …"
        },
        {
          "line": 1701,
          "language": "",
          "endLine": 1706,
          "body": "Usage & limits                                                  (Refresh)\n┌Members         ┐┌Storage          ┐┌API calls today ┐\n│ 340 of 500     ││ 4.1 of 5 GB     ││ 1,204          │\n│ ▬▬▬▬▬▬▬───     ││ ▬▬▬▬▬▬▬▬▬─ (82%)││ Unlimited      │"
        },
        {
          "line": 1709,
          "language": "",
          "endLine": 1715,
          "body": "Organization analytics\n[Organization: Maker Collective v]  [Report: Loans v]\n┌Total loans 812┐┌Overdue 9┐┌…┐\n Breakdown by space\n┌ Fab Lab ─ table ┐ ┌ Uni Lab ─ table ┐"
        },
        {
          "line": 1718,
          "language": "",
          "endLine": 1724,
          "body": "Wednesday, 15 October\nGood morning, Shaan                       [Search spaces……]\nChoose a space to work in.\n┌[FL] Fab Lab        ┐┌[UL] Uni Lab        ┐┌[TS] Tinker Space         ┐\n│ FLAB · /m/fab-lab  ││ ULAB               ││ [Superadmin access: off] │"
        },
        {
          "line": 1729,
          "language": "",
          "endLine": 1735,
          "body": "Bulk import                         Step 2 of 4 · Match columns\n ● Upload ─ ● Match columns ─ ○ Review ─ ○ Import\n┌ Name       ← [Item name v]    Quantity ← [Qty v]                 ┐\n│ Category   ← [Don't import v] Location ← [Shelf v]               │\n                                                   (Back) [Preview]"
        },
        {
          "line": 1738,
          "language": "",
          "endLine": 1743,
          "body": "← All batches\nOctober labels · 24 labels                         [Download all (ZIP)]\n┌ Add labels  [ Item | Units | Reprint a unit ] ┐  ┌QR┐┌QR┐┌QR┐┌┄+┄┐\n│ [Item v]                     [Add to batch]   │  │A1││A2││B4││add│"
        },
        {
          "line": 1746,
          "language": "",
          "endLine": 1754,
          "body": "New makerspace                    Step 1 of 5 · Identity\n ● Identity ─ ○ Profile & hours ─ ○ Modules ─ ○ First staff ─ ○ Review\n[Name……………]                                     PUBLIC PAGE PREVIEW\n[Public code ▢▢▢▢]  Shown on labels and receipts  ┌[TS] Tinker Space ┐\n[Slug …/m/ tinker-space]                          │ /m/tinker-space  │\n[Location……]                                      │┄ Catalogue here ┄│\nCancel                                        (Back) [Next]"
        },
        {
          "line": 1757,
          "language": "",
          "endLine": 1764,
          "body": "Tenant migration\n┌ ! This is one-way. Cut-over archives the source space…            ┐\n ✓ Review disclosure ─ ✓ Pin deployments ─ ● Encrypt export ─ ○ … ─ ○ Cut over\n┌ Step 3 · Encrypt export (source)        ┐ ┌ Status         ┐\n│ [Recipient key……]  [Create export]      │ │ 1 Done ✓       │\n│ export 3 Oct  [Ready] Download one-use  │ │ 4 Needs step 3 │"
        },
        {
          "line": 1770,
          "language": "",
          "endLine": 1782,
          "body": " space works\n                 ┌──────────────────────────────┐\n                 │          ( icon )            │\n                 │   Set a new password         │\n                 │   asha is using a temporary… │\n                 │   [Current password]         │\n                 │   [New password] ▬▬▬─  ✓ 12+ │\n                 │   [Confirm]                  │\n                 │   [   Save new password    ] │\n                 │        Sign out              │\n                 └──────────────────────────────┘"
        },
        {
          "line": 1788,
          "language": "",
          "endLine": 1795,
          "body": "space works                                         About   Sign in\nSpace Works\nFind a space. Borrow the tool.            (Unbounded accent, once)\n[Search by name, code or place………………………]   12 spaces\n┌ cover ┐┌ cover ┐┌ cover ┐\n│[FL] Fab Lab · Bengaluru   FLAB   Open catalogue → │"
        },
        {
          "line": 1798,
          "language": "",
          "endLine": 1804,
          "body": "{Fab Lab}  Catalogue  Machines  Events  Bookings         Sign in\nWhat you can use at Fab Lab\n(All)(3D printers)(Laser)(CNC)  (Training required)\n┌ img ┐┌ img ┐┌ img ┐\n│ Bambu X1 [Available] 312 h · 3 jobs queued · ~2 h   [Request a job] │"
        },
        {
          "line": 1807,
          "language": "",
          "endLine": 1815,
          "body": "← All spaces\n┌ hero image ───────────────────────────────┐\nBench 2 · Workshop · Ground floor            ┌ Book this space ──────────┐\nDescription…                                 │ [Date] [From][To]         │\nAvailability calendar                        │ [Your details…]           │\n                                             │ [Request booking]         │\n                                             │ Staff confirm within a day│"
        },
        {
          "line": 1818,
          "language": "",
          "endLine": 1826,
          "body": "3D printing\nSend a print job to Fab Lab\n Your print   [Title] [Project brief]          ┌ Track your job ─────┐\n Material     [Filament v] [Qty] [Grams]       │ After you send it…  │\n Files        ┌┄ Drop model files ┄┐           │ ○ Requested         │\n              ┌┄ Drop screenshots ┄┐           │ ○ Accepted …        │\n [Send print request]                          └─────────────────────┘"
        },
        {
          "line": 1830,
          "language": "",
          "endLine": 1836,
          "body": "Live stats\nFab Lab in numbers\n Printing  ┌Busiest printer┐┌Queue 4┐  [bar: by brand] [trend]\n Lending   ┌Most popular┐┌Tools out 37┐┌Recently added┐\n Out right now  rows…"
        },
        {
          "line": 1839,
          "language": "",
          "endLine": 1844,
          "body": "[MC] Maker Collective                                   (Visit website ↗)\nDescription…\nUpcoming events across spaces\n┌[OCT|14] Robotics meetup   Fab Lab · 6 pm · Free   [6 spots left]  Register at Fab Lab ┐"
        },
        {
          "line": 1849,
          "language": "",
          "endLine": 1858,
          "body": "[ Borrow | Return ]\nStep 2 of 4 · Scan\n┌───────────────┐\n│ ┌─┐       ┌─┐ │\n│               │   Hold the tool's QR inside the frame\n│ └─┘       └─┘ │\n└───────────────┘\n(Back)                       [Next]"
        },
        {
          "line": 1863,
          "language": "",
          "endLine": 1867,
          "body": "Bookings                                                   [Book a space]\n Upcoming | Past\n┌[OCT|16] Bench 2 · 10:00–12:00                    [Confirmed]  Move [...] ┐"
        }
      ]
    },
    {
      "path": "docs/decisions.md",
      "sha256": "879d041b4e95e8d44560c511a74ad93e1344a6dd944b96beeae31e752ddd8299",
      "headings": [
        {
          "line": 1,
          "text": "Design decisions, with the reason for each",
          "anchor": "design-decisions-with-the-reason-for-each"
        },
        {
          "line": 20,
          "text": "Index",
          "anchor": "index"
        },
        {
          "line": 97,
          "text": "Decisions, newest first",
          "anchor": "decisions-newest-first"
        },
        {
          "line": 99,
          "text": "SW-385 — Design site v2.0: grouped sections, long pages split, wide layout",
          "anchor": "sw-385--design-site-v20-grouped-sections-long-pages-split-wide-layout"
        },
        {
          "line": 118,
          "text": "SW-383 — Pipelines, versions and releases page",
          "anchor": "sw-383--pipelines-versions-and-releases-page"
        },
        {
          "line": 133,
          "text": "SW-382 — This release is \"Space Works Design System v2.0\"",
          "anchor": "sw-382--this-release-is-space-works-design-system-v20"
        },
        {
          "line": 146,
          "text": "SW-381 — Logo box animation: one orange face when shut, no holes in dark, frame-checked",
          "anchor": "sw-381--logo-box-animation-one-orange-face-when-shut-no-holes-in-dark-frame-checked"
        },
        {
          "line": 168,
          "text": "SW-380 — One bright chart palette in light and dark; contrast from edges",
          "anchor": "sw-380--one-bright-chart-palette-in-light-and-dark-contrast-from-edges"
        },
        {
          "line": 183,
          "text": "SW-379 — Push to main now; every change ships with tests; this decisions file",
          "anchor": "sw-379--push-to-main-now-every-change-ships-with-tests-this-decisions-file"
        },
        {
          "line": 193,
          "text": "SW-378 — Search field animation",
          "anchor": "sw-378--search-field-animation"
        },
        {
          "line": 205,
          "text": "SW-377 — Every animation becomes a reusable template",
          "anchor": "sw-377--every-animation-becomes-a-reusable-template"
        },
        {
          "line": 217,
          "text": "SW-376 — Theme-switch animation as a template",
          "anchor": "sw-376--theme-switch-animation-as-a-template"
        },
        {
          "line": 229,
          "text": "SW-375 — Org-wide rules: hybrid per part, mobile analytics SDKs",
          "anchor": "sw-375--org-wide-rules-hybrid-per-part-mobile-analytics-sdks"
        },
        {
          "line": 241,
          "text": "SW-374 — Rename to SpaceWorks-Design-System; dev, then PR, then main; owner-only commits",
          "anchor": "sw-374--rename-to-spaceworks-design-system-dev-then-pr-then-main-owner-only-commits"
        },
        {
          "line": 255,
          "text": "SW-373 — Brand guidelines v2",
          "anchor": "sw-373--brand-guidelines-v2"
        },
        {
          "line": 266,
          "text": "SW-372 — README banner with rounded corners and the logo",
          "anchor": "sw-372--readme-banner-with-rounded-corners-and-the-logo"
        },
        {
          "line": 276,
          "text": "DS-1 — Banner text is outlined, not live fonts",
          "anchor": "ds-1--banner-text-is-outlined-not-live-fonts"
        },
        {
          "line": 286,
          "text": "SW-371 — Preview freshness check",
          "anchor": "sw-371--preview-freshness-check"
        },
        {
          "line": 297,
          "text": "SW-370 — Design images follow the new palette",
          "anchor": "sw-370--design-images-follow-the-new-palette"
        },
        {
          "line": 309,
          "text": "SW-369 — Product rules apply to every SpaceWorks-Labs product",
          "anchor": "sw-369--product-rules-apply-to-every-spaceworks-labs-product"
        },
        {
          "line": 321,
          "text": "SW-368 — Product and engineering rules page",
          "anchor": "sw-368--product-and-engineering-rules-page"
        },
        {
          "line": 332,
          "text": "SW-367 — Logo hover: fold shut, then open",
          "anchor": "sw-367--logo-hover-fold-shut-then-open"
        },
        {
          "line": 342,
          "text": "SW-366 — \"What changed in 0.12.0\" page",
          "anchor": "sw-366--what-changed-in-0120-page"
        },
        {
          "line": 350,
          "text": "SW-365 — Lessons-learned page",
          "anchor": "sw-365--lessons-learned-page"
        },
        {
          "line": 360,
          "text": "SW-364 — Motion guide and theming guide",
          "anchor": "sw-364--motion-guide-and-theming-guide"
        },
        {
          "line": 372,
          "text": "SW-363 — Design site shows the real palette, generated from tokens",
          "anchor": "sw-363--design-site-shows-the-real-palette-generated-from-tokens"
        },
        {
          "line": 383,
          "text": "SW-362 — The logo opens on hover and focus, everywhere",
          "anchor": "sw-362--the-logo-opens-on-hover-and-focus-everywhere"
        },
        {
          "line": 394,
          "text": "SW-323 — Motion pass across the app",
          "anchor": "sw-323--motion-pass-across-the-app"
        },
        {
          "line": 408,
          "text": "SW-322 — One loader everywhere: the opening box",
          "anchor": "sw-322--one-loader-everywhere-the-opening-box"
        },
        {
          "line": 420,
          "text": "SW-317 — Aurora ID card uses brand colours; loader built from the storyboard",
          "anchor": "sw-317--aurora-id-card-uses-brand-colours-loader-built-from-the-storyboard"
        },
        {
          "line": 429,
          "text": "SW-316 — Dark theme is one solid black family",
          "anchor": "sw-316--dark-theme-is-one-solid-black-family"
        },
        {
          "line": 443,
          "text": "SW-313 — Cold-start splash: the box opens and flies to the navbar",
          "anchor": "sw-313--cold-start-splash-the-box-opens-and-flies-to-the-navbar"
        },
        {
          "line": 453,
          "text": "SW-306 — Patch on landing pages (rules)",
          "anchor": "sw-306--patch-on-landing-pages-rules"
        },
        {
          "line": 464,
          "text": "SW-300 — Landing scroll story, symbol background, restrained motion",
          "anchor": "sw-300--landing-scroll-story-symbol-background-restrained-motion"
        },
        {
          "line": 476,
          "text": "SW-299 — Only the free Gilroy weights ship",
          "anchor": "sw-299--only-the-free-gilroy-weights-ship"
        },
        {
          "line": 492,
          "text": "SW-277 — The landing page is original, in the app's own design language",
          "anchor": "sw-277--the-landing-page-is-original-in-the-apps-own-design-language"
        },
        {
          "line": 502,
          "text": "SW-275 — Spaces home and directory with brand character; richer dark palette",
          "anchor": "sw-275--spaces-home-and-directory-with-brand-character-richer-dark-palette"
        },
        {
          "line": 514,
          "text": "SW-273 — Settings grouped by task (senior UX pass outcome)",
          "anchor": "sw-273--settings-grouped-by-task-senior-ux-pass-outcome"
        },
        {
          "line": 524,
          "text": "SW-255 — A senior UX and product review before release",
          "anchor": "sw-255--a-senior-ux-and-product-review-before-release"
        },
        {
          "line": 533,
          "text": "SW-247 — Tagline \"Run the space, not spreadsheets.\"; \"Lending\" becomes \"Inventory\"",
          "anchor": "sw-247--tagline-run-the-space-not-spreadsheets-lending-becomes-inventory"
        },
        {
          "line": 543,
          "text": "SW-245 — Professional README banner in the main repo",
          "anchor": "sw-245--professional-readme-banner-in-the-main-repo"
        },
        {
          "line": 551,
          "text": "SW-235 — Ease-of-use pass; design repo synced to the black palette",
          "anchor": "sw-235--ease-of-use-pass-design-repo-synced-to-the-black-palette"
        },
        {
          "line": 562,
          "text": "SW-225 — Dark mode becomes true black",
          "anchor": "sw-225--dark-mode-becomes-true-black"
        },
        {
          "line": 573,
          "text": "SW-222 — Free Gilroy weights: licence risk accepted",
          "anchor": "sw-222--free-gilroy-weights-licence-risk-accepted"
        },
        {
          "line": 582,
          "text": "SW-220 — Designer font is a real Outfit family",
          "anchor": "sw-220--designer-font-is-a-real-outfit-family"
        },
        {
          "line": 591,
          "text": "SW-219 — Release 0.12.0 owner choices: fonts",
          "anchor": "sw-219--release-0120-owner-choices-fonts"
        },
        {
          "line": 599,
          "text": "SW-210 — Public makerspace header shows the space's own logo",
          "anchor": "sw-210--public-makerspace-header-shows-the-spaces-own-logo"
        },
        {
          "line": 609,
          "text": "SW-204 — Light mode is the default",
          "anchor": "sw-204--light-mode-is-the-default"
        },
        {
          "line": 619,
          "text": "SW-168 — README in the Events style, with Patch peeking from a corner",
          "anchor": "sw-168--readme-in-the-events-style-with-patch-peeking-from-a-corner"
        },
        {
          "line": 628,
          "text": "SW-152 — README banner: Patch only if it still looks professional",
          "anchor": "sw-152--readme-banner-patch-only-if-it-still-looks-professional"
        },
        {
          "line": 636,
          "text": "SW-151 — README banner: no mascot",
          "anchor": "sw-151--readme-banner-no-mascot"
        },
        {
          "line": 643,
          "text": "SW-128 — Card font library (cards only)",
          "anchor": "sw-128--card-font-library-cards-only"
        },
        {
          "line": 651,
          "text": "SW-106 — README poster banner and screenshots",
          "anchor": "sw-106--readme-poster-banner-and-screenshots"
        },
        {
          "line": 659,
          "text": "SW-57 — Patch on the 404 page only; delight effects",
          "anchor": "sw-57--patch-on-the-404-page-only-delight-effects"
        },
        {
          "line": 671,
          "text": "SW-56 — Patch for dark surfaces: Warm Cream sticker border",
          "anchor": "sw-56--patch-for-dark-surfaces-warm-cream-sticker-border"
        },
        {
          "line": 682,
          "text": "SW-55 — Patch keeps a Warm Cream card in dark mode",
          "anchor": "sw-55--patch-keeps-a-warm-cream-card-in-dark-mode"
        },
        {
          "line": 689,
          "text": "SW-54 — Patch is sourced only from this repo; left-facing walk approved",
          "anchor": "sw-54--patch-is-sourced-only-from-this-repo-left-facing-walk-approved"
        },
        {
          "line": 698,
          "text": "SW-51 — Delight effects on by default; dark transition always on",
          "anchor": "sw-51--delight-effects-on-by-default-dark-transition-always-on"
        },
        {
          "line": 706,
          "text": "SW-32 — Original Space Works artwork only",
          "anchor": "sw-32--original-space-works-artwork-only"
        },
        {
          "line": 716,
          "text": "SW-31 — Everything is built only in the Space Works theme",
          "anchor": "sw-31--everything-is-built-only-in-the-space-works-theme"
        },
        {
          "line": 727,
          "text": "SW-22 — Event accent: brand-palette presets only",
          "anchor": "sw-22--event-accent-brand-palette-presets-only"
        },
        {
          "line": 735,
          "text": "SW-12 — Adopt Yuyu's fun elements, redone in our brand",
          "anchor": "sw-12--adopt-yuyus-fun-elements-redone-in-our-brand"
        },
        {
          "line": 742,
          "text": "DS-9 — Links and Pages move to the SpaceWorks-Labs organisation",
          "anchor": "ds-9--links-and-pages-move-to-the-spaceworks-labs-organisation"
        },
        {
          "line": 750,
          "text": "DS-6 — Patch, the painted wolf mascot",
          "anchor": "ds-6--patch-the-painted-wolf-mascot"
        },
        {
          "line": 763,
          "text": "DS-5 — Space Works UX is our own spec, inspired by Yuyu",
          "anchor": "ds-5--space-works-ux-is-our-own-spec-inspired-by-yuyu"
        },
        {
          "line": 775,
          "text": "DS-4 — Mobile UX spec and mobile motion stay in the app repos",
          "anchor": "ds-4--mobile-ux-spec-and-mobile-motion-stay-in-the-app-repos"
        },
        {
          "line": 784,
          "text": "DS-3 — Starlight design site on GitHub Pages",
          "anchor": "ds-3--starlight-design-site-on-github-pages"
        },
        {
          "line": 794,
          "text": "DS-2 — AGPL-3.0-or-later licence",
          "anchor": "ds-2--agpl-30-or-later-licence"
        },
        {
          "line": 801,
          "text": "DS-7 — Brand kit v1 and Figma exports are the source of truth",
          "anchor": "ds-7--brand-kit-v1-and-figma-exports-are-the-source-of-truth"
        },
        {
          "line": 814,
          "text": "Superseded decisions",
          "anchor": "superseded-decisions"
        },
        {
          "line": 818,
          "text": "The dark theme chain: grey-green, teal-lit, true black, solid black",
          "anchor": "the-dark-theme-chain-grey-green-teal-lit-true-black-solid-black"
        },
        {
          "line": 840,
          "text": "The font chain: paid Gilroy weights removed",
          "anchor": "the-font-chain-paid-gilroy-weights-removed"
        },
        {
          "line": 848,
          "text": "The mascot and banner chain",
          "anchor": "the-mascot-and-banner-chain"
        },
        {
          "line": 856,
          "text": "Other replaced details",
          "anchor": "other-replaced-details"
        },
        {
          "line": 870,
          "text": "How to record a decision",
          "anchor": "how-to-record-a-decision"
        },
        {
          "line": 906,
          "text": "SW-389 ? Four visible flaps keep their own colours when shut",
          "anchor": "sw-389--four-visible-flaps-keep-their-own-colours-when-shut"
        }
      ],
      "tables": [
        {
          "line": 22,
          "cells": [
            "Number",
            "Title",
            "Status"
          ]
        },
        {
          "line": 23,
          "cells": [
            "---",
            "---",
            "---"
          ]
        },
        {
          "line": 24,
          "cells": [
            "SW-385",
            "Design site v2.0: grouped sections, long pages split, wide layout",
            "current"
          ]
        },
        {
          "line": 25,
          "cells": [
            "SW-383",
            "Pipelines, versions and releases page (`docs/delivery.md`)",
            "current"
          ]
        },
        {
          "line": 26,
          "cells": [
            "SW-382",
            "This release is \"Space Works Design System v2.0\"",
            "current"
          ]
        },
        {
          "line": 27,
          "cells": [
            "SW-381",
            "Logo box animation: one orange face when shut, no holes in dark, frame-checked",
            "current"
          ]
        },
        {
          "line": 28,
          "cells": [
            "SW-380",
            "One bright chart palette in light and dark; contrast from edges",
            "current"
          ]
        },
        {
          "line": 29,
          "cells": [
            "SW-379",
            "Push to main now; every change ships with tests; this decisions file",
            "current"
          ]
        },
        {
          "line": 30,
          "cells": [
            "SW-378",
            "Search field animation",
            "current (template in progress)"
          ]
        },
        {
          "line": 31,
          "cells": [
            "SW-377",
            "Every animation becomes a reusable template",
            "current (in progress)"
          ]
        },
        {
          "line": 32,
          "cells": [
            "SW-376",
            "Theme-switch animation as a template",
            "current"
          ]
        },
        {
          "line": 33,
          "cells": [
            "SW-375",
            "Org-wide rules: hybrid per part, mobile analytics SDKs",
            "current"
          ]
        },
        {
          "line": 34,
          "cells": [
            "SW-374",
            "Rename to SpaceWorks-Design-System; dev, then PR, then main; owner-only commits",
            "current"
          ]
        },
        {
          "line": 35,
          "cells": [
            "SW-373",
            "Brand guidelines v2",
            "current"
          ]
        },
        {
          "line": 36,
          "cells": [
            "SW-372",
            "README banner with rounded corners and the logo",
            "current"
          ]
        },
        {
          "line": 37,
          "cells": [
            "DS-1",
            "Banner text is outlined, not live fonts",
            "current"
          ]
        },
        {
          "line": 38,
          "cells": [
            "SW-371",
            "Preview freshness check",
            "current"
          ]
        },
        {
          "line": 39,
          "cells": [
            "SW-370",
            "Design images follow the new palette",
            "current (screenshots in progress)"
          ]
        },
        {
          "line": 40,
          "cells": [
            "SW-369",
            "Product rules apply to every SpaceWorks-Labs product",
            "current"
          ]
        },
        {
          "line": 41,
          "cells": [
            "SW-368",
            "Product and engineering rules page",
            "current"
          ]
        },
        {
          "line": 42,
          "cells": [
            "SW-367",
            "Logo hover: fold shut, then open",
            "current"
          ]
        },
        {
          "line": 43,
          "cells": [
            "SW-366",
            "\"What changed in 0.12.0\" page",
            "current"
          ]
        },
        {
          "line": 44,
          "cells": [
            "SW-365",
            "Lessons-learned page",
            "current"
          ]
        },
        {
          "line": 45,
          "cells": [
            "SW-364",
            "Motion guide and theming guide",
            "current"
          ]
        },
        {
          "line": 46,
          "cells": [
            "SW-363",
            "Design site shows the real palette, generated from tokens",
            "current"
          ]
        },
        {
          "line": 47,
          "cells": [
            "SW-362",
            "The logo opens on hover and focus, everywhere",
            "current (refined by SW-367)"
          ]
        },
        {
          "line": 48,
          "cells": [
            "SW-323",
            "Motion pass across the app",
            "current"
          ]
        },
        {
          "line": 49,
          "cells": [
            "SW-322",
            "One loader everywhere: the opening box",
            "current"
          ]
        },
        {
          "line": 50,
          "cells": [
            "SW-317",
            "Aurora ID card uses brand colours; loader built from the storyboard",
            "current"
          ]
        },
        {
          "line": 51,
          "cells": [
            "SW-316",
            "Dark theme is one solid black family",
            "current"
          ]
        },
        {
          "line": 52,
          "cells": [
            "SW-313",
            "Cold-start splash: the box opens and flies to the navbar",
            "current"
          ]
        },
        {
          "line": 53,
          "cells": [
            "SW-306",
            "Patch on landing pages (rules)",
            "current"
          ]
        },
        {
          "line": 54,
          "cells": [
            "SW-300",
            "Landing scroll story, symbol background, restrained motion",
            "current (dark values superseded by SW-316)"
          ]
        },
        {
          "line": 55,
          "cells": [
            "SW-299",
            "Only the free Gilroy weights ship",
            "current"
          ]
        },
        {
          "line": 56,
          "cells": [
            "SW-277",
            "The landing page is original, in the app's own design language",
            "current"
          ]
        },
        {
          "line": 57,
          "cells": [
            "SW-275",
            "Spaces home and directory with brand character; richer dark palette",
            "partly superseded by SW-316"
          ]
        },
        {
          "line": 58,
          "cells": [
            "SW-273",
            "Settings grouped by task (senior UX pass outcome)",
            "current"
          ]
        },
        {
          "line": 59,
          "cells": [
            "SW-255",
            "A senior UX and product review before release",
            "current"
          ]
        },
        {
          "line": 60,
          "cells": [
            "SW-247",
            "Tagline \"Run the space, not spreadsheets.\"; \"Lending\" becomes \"Inventory\"",
            "current"
          ]
        },
        {
          "line": 61,
          "cells": [
            "SW-245",
            "Professional README banner in the main repo",
            "current"
          ]
        },
        {
          "line": 62,
          "cells": [
            "SW-235",
            "Ease-of-use pass; design repo synced to the black palette",
            "current"
          ]
        },
        {
          "line": 63,
          "cells": [
            "SW-225",
            "Dark mode becomes true black",
            "partly superseded by SW-316"
          ]
        },
        {
          "line": 64,
          "cells": [
            "SW-222",
            "Free Gilroy weights: licence risk accepted",
            "current (restated by SW-299)"
          ]
        },
        {
          "line": 65,
          "cells": [
            "SW-220",
            "Designer font is a real Outfit family",
            "current"
          ]
        },
        {
          "line": 66,
          "cells": [
            "SW-219",
            "Release 0.12.0 owner choices: fonts",
            "current (dark clause superseded by SW-225)"
          ]
        },
        {
          "line": 67,
          "cells": [
            "SW-210",
            "Public makerspace header shows the space's own logo",
            "current"
          ]
        },
        {
          "line": 68,
          "cells": [
            "SW-204",
            "Light mode is the default",
            "current"
          ]
        },
        {
          "line": 69,
          "cells": [
            "SW-168",
            "README in the Events style, with Patch peeking from a corner",
            "current"
          ]
        },
        {
          "line": 70,
          "cells": [
            "SW-152",
            "README banner: Patch only if it still looks professional",
            "superseded by SW-168"
          ]
        },
        {
          "line": 71,
          "cells": [
            "SW-151",
            "README banner: no mascot",
            "superseded by SW-152"
          ]
        },
        {
          "line": 72,
          "cells": [
            "SW-128",
            "Card font library (cards only)",
            "current"
          ]
        },
        {
          "line": 73,
          "cells": [
            "SW-106",
            "README poster banner and screenshots",
            "partly superseded"
          ]
        },
        {
          "line": 74,
          "cells": [
            "SW-57",
            "Patch on the 404 page only; delight effects",
            "partly superseded by SW-306 and SW-362"
          ]
        },
        {
          "line": 75,
          "cells": [
            "SW-56",
            "Patch for dark surfaces: Warm Cream sticker border",
            "current"
          ]
        },
        {
          "line": 76,
          "cells": [
            "SW-55",
            "Patch keeps a Warm Cream card in dark mode",
            "superseded by SW-56"
          ]
        },
        {
          "line": 77,
          "cells": [
            "SW-54",
            "Patch is sourced only from this repo; left-facing walk approved",
            "current"
          ]
        },
        {
          "line": 78,
          "cells": [
            "SW-51",
            "Delight effects on by default; dark transition always on",
            "current"
          ]
        },
        {
          "line": 79,
          "cells": [
            "SW-32",
            "Original Space Works artwork only",
            "current"
          ]
        },
        {
          "line": 80,
          "cells": [
            "SW-31",
            "Everything is built only in the Space Works theme",
            "current (Gilroy 400 to 700 clause superseded by SW-299)"
          ]
        },
        {
          "line": 81,
          "cells": [
            "SW-22",
            "Event accent: brand-palette presets only",
            "current"
          ]
        },
        {
          "line": 82,
          "cells": [
            "SW-12",
            "Adopt Yuyu's fun elements, redone in our brand",
            "current"
          ]
        },
        {
          "line": 83,
          "cells": [
            "DS-2",
            "AGPL-3.0-or-later licence",
            "current"
          ]
        },
        {
          "line": 84,
          "cells": [
            "DS-3",
            "Starlight design site on GitHub Pages",
            "current"
          ]
        },
        {
          "line": 85,
          "cells": [
            "DS-4",
            "Mobile UX spec and mobile motion stay in the app repos",
            "current"
          ]
        },
        {
          "line": 86,
          "cells": [
            "DS-5",
            "Space Works UX is our own spec, inspired by Yuyu",
            "current"
          ]
        },
        {
          "line": 87,
          "cells": [
            "DS-6",
            "Patch, the painted wolf mascot",
            "current"
          ]
        },
        {
          "line": 88,
          "cells": [
            "DS-7",
            "Brand kit v1 and Figma exports are the source of truth",
            "current"
          ]
        },
        {
          "line": 89,
          "cells": [
            "DS-8",
            "Dark token retune, then \"teal-lit\" dark",
            "superseded by SW-225 then SW-316"
          ]
        },
        {
          "line": 90,
          "cells": [
            "DS-9",
            "Links and Pages move to the SpaceWorks-Labs organisation",
            "current"
          ]
        },
        {
          "line": 820,
          "cells": [
            "Step",
            "Decision",
            "What it was",
            "Replaced by"
          ]
        },
        {
          "line": 821,
          "cells": [
            "---",
            "---",
            "---",
            "---"
          ]
        },
        {
          "line": 822,
          "cells": [
            "1",
            "Early tokens (before 15 October)",
            "A grey-green dark palette",
            "the DS-8 retune"
          ]
        },
        {
          "line": 823,
          "cells": [
            "2",
            "DS-8 (15 October, `894cf8c`)",
            "Dark tokens retuned for contrast",
            "the teal-lit set"
          ]
        },
        {
          "line": 824,
          "cells": [
            "3",
            "DS-8 (16 October, `5cf062e`)",
            "\"Teal-lit\" dark: Deep Ink `#142C2A` page, lit teal panels `#193935` and `#1F433F`, Citron focus",
            "SW-225"
          ]
        },
        {
          "line": 825,
          "cells": [
            "4",
            "SW-225 (10 November)",
            "Page goes true black `#000`, but layers above it stay teal-tinted",
            "SW-316"
          ]
        },
        {
          "line": 826,
          "cells": [
            "5",
            "SW-275 and SW-300 addendum (11 November, morning)",
            "Black page with teal-tinted surfaces and borders, desaturated accents",
            "SW-316"
          ]
        },
        {
          "line": 827,
          "cells": [
            "6",
            "**SW-316 (11 November)**",
            "**One solid black neutral family (current)**",
            "nothing"
          ]
        }
      ],
      "links": [
        {
          "line": 11,
          "label": "Superseded decisions",
          "target": "#superseded-decisions",
          "image": false
        },
        {
          "line": 892,
          "label": "Index",
          "target": "#index",
          "image": false
        },
        {
          "line": 897,
          "label": "Superseded decisions",
          "target": "#superseded-decisions",
          "image": false
        },
        {
          "line": 921,
          "label": "SW-389 ? Four visible flaps keep their own colours when shut",
          "target": "#sw-389--four-visible-flaps-keep-their-own-colours-when-shut",
          "image": false
        }
      ],
      "code": [
        {
          "line": 877,
          "language": "",
          "endLine": 885,
          "body": "### SW-nnn or DS-n — Short title\n- **Date:** day and month (all dates are in the current year; add the year if not)\n- **Decision:** one or two plain sentences. What is now true.\n- **Why:** the reason. This is the point of the file. If you do not know the reason, write\n  \"Reason not recorded\" instead of guessing.\n- **Status:** current, or \"superseded by SW-xxx / DS-n\", or \"partly superseded by ...\".\n- **Implemented in:** design repo paths, and app paths if the app changed too."
        }
      ]
    }
  ]
}
