{
  "system": {
    "name": "Poesía",
    "package": "@rrios-forge/ui",
    "version": "0.16.1",
    "canon": "Material-first: vibrant glass is the system's material (ADR-027, J-01).",
    "build": {
      "commit": "9aa2fe8c",
      "branch": "main",
      "committedAt": "2026-10-21T10:08:16+02:00",
      "generatedAt": "2026-10-21T08:14:37.860Z",
      "gatesRanAt": "2026-10-21T08:14:37.855Z"
    },
    "principles": [
      {
        "id": "P01",
        "title": "Semantic First",
        "summary": "Every entity is named and organized by intent, not appearance."
      },
      {
        "id": "P02",
        "title": "Accessible by Default",
        "summary": "Accessibility is an input condition, not a final audit."
      },
      {
        "id": "P03",
        "title": "Technology Agnostic Core",
        "summary": "The Core is expressed as contracts and data, not as React/Tailwind/shadcn implementation."
      },
      {
        "id": "P04",
        "title": "Theme-Native",
        "summary": "The system is designed for modes, brands and visual flavors without breaking semantics."
      },
      {
        "id": "P05",
        "title": "Composable by Design",
        "summary": "Complex solutions should be composed from reusable pieces and rules."
      },
      {
        "id": "P06",
        "title": "Constraint over Preference",
        "summary": "Decisions are justified by constraints, context and objectives, not subjective taste."
      },
      {
        "id": "P07",
        "title": "Explicit Decision",
        "summary": "Every relevant change must have a traceable decision, validation and rationale."
      },
      {
        "id": "P08",
        "title": "Progressive Complexity",
        "summary": "No layer, rule, token or pattern is added unless it solves a real need."
      },
      {
        "id": "P09",
        "title": "Resilient Versioning",
        "summary": "The system must evolve without breaking consumers unless an explicit decision allows it."
      },
      {
        "id": "P10",
        "title": "Calm Interface",
        "summary": "The interface does not compete with the content for attention; decoration comes last."
      },
      {
        "id": "P11",
        "title": "Hierarchy by Restraint",
        "summary": "Hierarchy comes from few, consistent means — size, weight, position — not from more of everything."
      }
    ],
    "rules": [
      {
        "id": "R01",
        "title": "Declared intent",
        "summary": "Every core entity must declare intent."
      },
      {
        "id": "R02",
        "title": "No appearance-only naming",
        "summary": "No core entity may be named only by visual appearance."
      },
      {
        "id": "R03",
        "title": "Agnostic core",
        "summary": "The Core must not contain code or syntax dependent on React, Tailwind, shadcn or any other implementation."
      },
      {
        "id": "R04",
        "title": "Tokens for visual values",
        "summary": "Every visual value consumed by implementation must go through a token."
      },
      {
        "id": "R05",
        "title": "WCAG AA contrast",
        "summary": "Every token-defined text/background pair must be able to validate minimum WCAG 2.1 AA contrast. AAA is recommended for high-contrast themes but not required as the global baseline."
      },
      {
        "id": "R06",
        "title": "Themes override values, not semantics",
        "summary": "A theme/flavor may override values, but must not create new semantics."
      },
      {
        "id": "R07",
        "title": "Rule contract",
        "summary": "Every rule must declare scope, severity, validation type and exception policy."
      },
      {
        "id": "R08",
        "title": "Documented exceptions",
        "summary": "Every exception must declare reason, affected rule, scope and review date."
      },
      {
        "id": "R09",
        "title": "Decisions cite contracts",
        "summary": "Every relevant decision must link to at least one principle or rule."
      },
      {
        "id": "R10",
        "title": "Extend before creating",
        "summary": "A new entity must not be created if an existing one can be extended without breaking semantics."
      },
      {
        "id": "R11",
        "title": "Pattern contract",
        "summary": "Every pattern must declare problem, context, intent, applied rules and limits."
      },
      {
        "id": "R12",
        "title": "Token contract",
        "summary": "Every token must have category, purpose, lifecycle state and source."
      },
      {
        "id": "R13",
        "title": "No circular references",
        "summary": "References between tokens, themes and semantic roles must not be circular."
      },
      {
        "id": "R14",
        "title": "Aesthetics never override safety",
        "summary": "Aesthetic rules must never outrank semantic, accessibility or functional rules."
      },
      {
        "id": "R15",
        "title": "Experimental entities are bounded",
        "summary": "Every experimental entity must declare usage limits and stabilization or removal criteria."
      }
    ],
    "axes": {
      "intent": {
        "meaning": "What an action does.",
        "values": [
          "primary",
          "secondary",
          "neutral",
          "danger"
        ]
      },
      "tone": {
        "meaning": "Which semantic colour family the element speaks in.",
        "values": [
          "neutral",
          "muted",
          "inverse",
          "info",
          "success",
          "warning",
          "danger"
        ]
      },
      "emphasis": {
        "meaning": "How strongly a control or chip asserts itself, quiet to loud.",
        "values": [
          "ghost",
          "outline",
          "soft",
          "solid"
        ]
      },
      "prominence": {
        "meaning": "How a surface stands among its siblings.",
        "values": [
          "subtle",
          "default",
          "featured"
        ]
      },
      "surface": {
        "meaning": "Which surface level a container paints.",
        "values": [
          "default",
          "muted",
          "raised"
        ]
      },
      "material": {
        "meaning": "The layer's material (ADR-022, ADR-027).",
        "values": [
          "vibrant",
          "solid"
        ]
      },
      "size": {
        "meaning": "Ergonomic scale, in three families (control, text, container).",
        "values": [
          "xs",
          "sm",
          "md",
          "lg",
          "xl",
          "full",
          "prose",
          "fluid",
          "display"
        ]
      },
      "kind": {
        "meaning": "What an avatar stands for — a person (round) or an entity such as a workspace or brand (rounded square) (ADR-039).",
        "values": [
          "person",
          "entity"
        ]
      },
      "shape": {
        "meaning": "Geometry, where geometry is the meaning.",
        "values": [
          "circle",
          "rounded",
          "text",
          "rectangle"
        ]
      },
      "presentation": {
        "meaning": "How the same thing is staged.",
        "values": "open"
      },
      "lockup": {
        "meaning": "Which form of the brand mark.",
        "values": [
          "full",
          "mark"
        ]
      },
      "ground": {
        "meaning": "Which ground a brand mark sits on.",
        "values": [
          "auto",
          "light",
          "dark"
        ]
      },
      "palette": {
        "meaning": "Brand colour or monochrome for a brand mark.",
        "values": [
          "brand",
          "mono"
        ]
      },
      "form": {
        "meaning": "Which chart form encodes the data — chosen by the data's job, never by the look (ADR-036).",
        "values": [
          "line",
          "area",
          "column"
        ]
      },
      "orientation": {
        "meaning": "The direction the parts run: a row (horizontal) or a column (vertical); responsive stacks on phones and runs in a row from sm.",
        "values": [
          "horizontal",
          "vertical",
          "responsive"
        ]
      },
      "layout": {
        "meaning": "Arrangement of a composite.",
        "values": "open"
      },
      "align": {
        "meaning": "Distribution along the main axis.",
        "values": [
          "start",
          "center",
          "end",
          "between"
        ]
      },
      "side": {
        "meaning": "Which side something belongs to.",
        "values": "open"
      },
      "position": {
        "meaning": "Placement of a docked element.",
        "values": "open"
      },
      "placement": {
        "meaning": "Where an attached element sits.",
        "values": "open"
      },
      "gap": {
        "meaning": "Spacing between grid items.",
        "values": [
          "none",
          "xs",
          "sm",
          "md",
          "lg",
          "xl"
        ]
      },
      "rowGap": {
        "meaning": "Spacing between grid rows.",
        "values": [
          "none",
          "xs",
          "sm",
          "md",
          "lg",
          "xl"
        ]
      },
      "alignX": {
        "meaning": "Inline-axis alignment of grid items.",
        "values": [
          "start",
          "center",
          "end",
          "stretch"
        ]
      },
      "alignY": {
        "meaning": "Block-axis alignment of grid items.",
        "values": [
          "start",
          "center",
          "end",
          "stretch",
          "baseline"
        ]
      },
      "padding": {
        "meaning": "Inner spacing of a container.",
        "values": [
          "none",
          "sm",
          "md",
          "lg"
        ]
      },
      "inset": {
        "meaning": "Inner spacing of a sheet section.",
        "values": [
          "sm",
          "md",
          "lg"
        ]
      },
      "weight": {
        "meaning": "Type weight within the ramp.",
        "values": [
          "regular",
          "medium",
          "semibold"
        ]
      },
      "status": {
        "meaning": "Progress state of a step.",
        "values": "open"
      },
      "type": {
        "meaning": "Which loading indicator.",
        "values": "open"
      },
      "display": {
        "meaning": "What a selector shows.",
        "values": "open"
      },
      "visibility": {
        "meaning": "When an affordance shows.",
        "values": "open"
      },
      "motion": {
        "meaning": "Ambient motion of the atmosphere (ADR-023).",
        "values": [
          "drift",
          "still"
        ]
      },
      "energy": {
        "meaning": "Resting tempo of the atmosphere (ADR-023).",
        "values": [
          "calm",
          "lively"
        ]
      },
      "signal": {
        "meaning": "Ambient escalation (ADR-023).",
        "values": [
          "none",
          "raised",
          "urgent"
        ]
      },
      "frame": {
        "meaning": "PageShell editorial frame.",
        "values": "open"
      },
      "scroll": {
        "meaning": "PageShell scroll owner.",
        "values": "open"
      },
      "stage": {
        "meaning": "PageShell stage paint.",
        "values": "open"
      },
      "sidebarMode": {
        "meaning": "How the app frame shows its navigation: rail, the default, is a column of icons whose rows preview their page; auto and panel show the labelled panel instead.",
        "values": "open"
      },
      "mainPadding": {
        "meaning": "PageShell main padding.",
        "values": "open"
      },
      "columns": {
        "meaning": "How many columns a grid layout takes from its widest breakpoint (ADR-039).",
        "values": "open"
      },
      "disabled": {
        "meaning": "Not available: dimmed, skipped by the keyboard, ignores the pointer.",
        "values": "boolean"
      },
      "invalid": {
        "meaning": "Fails validation: a danger edge, announced as invalid; pair it with an error message.",
        "values": "boolean"
      },
      "selected": {
        "meaning": "Chosen in a set: the selected wash plus a non-colour cue (weight, check).",
        "values": "boolean"
      },
      "active": {
        "meaning": "The current destination or item: marked as current to assistive tech.",
        "values": "boolean"
      },
      "interactive": {
        "meaning": "Responds to the pointer: hover and press feedback, a pointer cursor.",
        "values": "boolean"
      },
      "unread": {
        "meaning": "Not yet seen: a dot and stronger weight until opened.",
        "values": "boolean"
      },
      "today": {
        "meaning": "Marks the current day in a calendar.",
        "values": "boolean"
      },
      "dragging": {
        "meaning": "Something is being dragged over it: the drop target lights up.",
        "values": "boolean"
      },
      "filled": {
        "meaning": "Holds a value: the label stays raised over the field.",
        "values": "boolean"
      },
      "collapsed": {
        "meaning": "Folded to its compact form (an icon rail, a closed group).",
        "values": "boolean"
      },
      "idle": {
        "meaning": "Waiting, with nothing to show yet.",
        "values": "boolean"
      },
      "fill": {
        "meaning": "Card grows to its row's tallest sibling (ADR-012).",
        "values": "boolean"
      },
      "bleed": {
        "meaning": "Sheet section runs edge to edge.",
        "values": "boolean"
      },
      "centered": {
        "meaning": "Container centres itself.",
        "values": "boolean"
      },
      "dense": {
        "meaning": "Grid packs items densely.",
        "values": "boolean"
      },
      "lead": {
        "meaning": "AvatarGroup leading avatar emphasis.",
        "values": "boolean"
      },
      "overlap": {
        "meaning": "ProfileHeader avatar overlaps the cover (ADR-039).",
        "values": "boolean"
      }
    },
    "layers": [
      {
        "name": "dark",
        "description": "Dark mode theme. Inverts neutrals and lifts brand/status colors to remain WCAG AA compliant on dark backgrounds.",
        "layer": "mode",
        "attributes": {
          "data-color-scheme": "dark"
        }
      },
      {
        "name": "desktop-density",
        "description": "Opt-in density theme for desktop applications. Tightens spacing, switches the UI face to the platform system font and shortens the default transition, so that information-dense panels read at a glance. (A one-notch smaller type scale is planned with the typography roles; until then the type ramp is not themeable.) Overrides values only: every semantic name keeps its meaning, so a component authored against the base scale needs no change. Web surfaces are unaffected unless they set data-theme=\"desktop-density\" explicitly.",
        "layer": "density",
        "attributes": {
          "data-density": "desktop"
        }
      },
      {
        "name": "full-transparency-dark",
        "description": "The default material at night, restated for a data-transparency=\"full\" subtree (J-44). Overrides values only.",
        "layer": "accessibility",
        "attributes": {
          "data-color-scheme": "dark",
          "data-transparency": "full"
        }
      },
      {
        "name": "full-transparency",
        "description": "The default material restated (ADR-042 revision, J-44): a subtree marked data-transparency=\"full\" shows the glass and content materials as designed whatever the page's material layer says — for a specimen that compares materials side by side. The OS-level prefers-reduced-transparency still wins. Overrides values only.",
        "layer": "accessibility",
        "attributes": {
          "data-transparency": "full"
        }
      },
      {
        "name": "high-contrast-dark",
        "description": "High contrast at night: applies where dark mode and high contrast meet (data-mode=\"dark\" with data-contrast=\"more\", or a dark page whose reader asked the OS for more contrast). Black surfaces, white text and boundaries, the action labels and the focus ring lifted to the 200 step, and the vibrant material collapsed to an opaque pane. Overrides values only.",
        "layer": "accessibility",
        "attributes": {
          "data-color-scheme": "dark",
          "data-contrast": "more"
        }
      },
      {
        "name": "high-contrast",
        "description": "High-contrast accessibility theme. Lifts foreground/background pairs to AAA where it matters; minimal overrides for Phase 2.",
        "layer": "accessibility",
        "attributes": {
          "data-contrast": "more"
        }
      },
      {
        "name": "less-transparency-dark",
        "description": "'Content' material at night (ADR-042): the glass layer takes the night content material. Overrides values only.",
        "layer": "accessibility",
        "attributes": {
          "data-color-scheme": "dark",
          "data-transparency": "less"
        }
      },
      {
        "name": "less-transparency",
        "description": "The reader's material choice 'content' (ADR-042): the glass layer takes the thick content material — the sky diffused into colour, no sheen, rim or halo. Overrides values only.",
        "layer": "accessibility",
        "attributes": {
          "data-transparency": "less"
        }
      },
      {
        "name": "light",
        "description": "Default light theme. Semantic tokens already encode the light palette, so this theme intentionally has no overrides — including the action LABEL split (action.*-quiet), whose light value lives in the reference layer as brand.*-quiet.",
        "layer": "base",
        "attributes": {
          "data-color-scheme": "light"
        }
      },
      {
        "name": "reduced-motion",
        "description": "Accessibility theme that minimizes motion. Reduces transition durations near zero. Keeps easing semantics intact.",
        "layer": "accessibility",
        "attributes": {
          "data-motion": "reduce"
        }
      },
      {
        "name": "reduced-transparency-dark",
        "description": "'Solid' material at night (ADR-042): panes opaque on the night raised surface. Overrides values only.",
        "layer": "accessibility",
        "attributes": {
          "data-color-scheme": "dark",
          "data-transparency": "reduce"
        }
      },
      {
        "name": "reduced-transparency",
        "description": "The reader's material choice 'solid' (ADR-042), the same collapse prefers-reduced-transparency gives: every pane opaque on the raised surface, no blur, sheen or halo. Overrides values only.",
        "layer": "accessibility",
        "attributes": {
          "data-transparency": "reduce"
        }
      }
    ],
    "gates": [
      {
        "check": "Types",
        "command": "bun run check-types",
        "inCi": "yes",
        "state": "not-run",
        "note": "Checked by the CI job packages, not by the Atlas."
      },
      {
        "check": "Lint",
        "command": "bun run lint",
        "inCi": "yes",
        "state": "not-run",
        "note": "Checked by the CI job packages, not by the Atlas."
      },
      {
        "check": "R02 / R04 / atoms-only",
        "command": "bash .claude/hooks/poesia-lint-forbidden.sh --tree",
        "inCi": "yes (`guards`)",
        "state": "pass",
        "note": "poesia-lint-forbidden: árbol limpio.",
        "durationMs": 16145
      },
      {
        "check": "Token tiers, references, cycles",
        "command": "bun run tokens:validate",
        "inCi": "yes",
        "state": "pass",
        "note": "@rrios-forge/design-system-tokens validate: tokens: validation passed (primitives=313, reference=203, semantic=191 leaves).",
        "durationMs": 54
      },
      {
        "check": "Contrast per theme",
        "command": "bun run tokens:contrast",
        "inCi": "yes",
        "state": "pass",
        "note": "@rrios-forge/design-system-tokens contrast: tokens contrast: 158 pair-checks pass WCAG AA across light, dark, high-contrast, high-contrast-dark.",
        "durationMs": 58
      },
      {
        "check": "Themes override existing semantics only",
        "command": "bun run themes:validate",
        "inCi": "yes",
        "state": "pass",
        "note": "@rrios-forge/design-system-themes validate: themes: validation passed.",
        "durationMs": 41
      },
      {
        "check": "Theme tests (density order, OS reduce-motion last)",
        "command": "bun --filter @rrios-forge/design-system-themes test",
        "inCi": "yes",
        "state": "pass",
        "note": "@rrios-forge/design-system-themes test: themes: check OK — 5 theme(s), 707 token paths",
        "durationMs": 57
      },
      {
        "check": "Generated output in sync",
        "command": "bun run ds:build && git diff --exit-code -- packages/design-system-tokens/generated packages/design-system-themes/generated",
        "inCi": "yes",
        "state": "not-run",
        "note": "Runs as part of the build that publishes this Atlas."
      },
      {
        "check": "Inventory, story metadata, server boundary, ADR citations",
        "command": "cd tooling/storybook && bun run check:inventory && bun run check:story-meta && bun run check:server-boundary && bun run check:citations",
        "inCi": "yes",
        "state": "pass",
        "note": "check-citations: 374 citations in 46 ADRs match principles.yaml (P01–P11) and rules.yaml (15 rules).",
        "durationMs": 161
      },
      {
        "check": "Storybook builds",
        "command": "bun run storybook:build",
        "inCi": "yes",
        "state": "not-run",
        "note": "Runs as part of the build that publishes this Atlas."
      },
      {
        "check": "Axis vocabulary, focus ring",
        "command": "cd tooling/storybook && bun run check:axes -- --strict && bun run check:focus-ring",
        "inCi": "yes",
        "state": "pass",
        "note": "check-focus-ring: 507 files in packages/ui/src; every focus ring comes from lib/focus-ring.ts.",
        "durationMs": 126
      },
      {
        "check": "Taste: generic-AI tells in source (`taste.yaml`, J-13)",
        "command": "cd tooling/storybook && bun run check:taste",
        "inCi": "reported, not blocking (C-30)",
        "state": "pass",
        "note": "check-taste: 80 finding(s) in 36 of 847 files, 7 of 11 lint tells (report mode, C-30).",
        "durationMs": 193
      },
      {
        "check": "Visual snapshots + axe + play tests",
        "command": "bun run storybook:test (needs Playwright's Chromium)",
        "inCi": "job `poesia-visual`, off until `POESIA_VISUAL=true`",
        "state": "off",
        "note": "Browser gates are off in CI until the runner has Playwright (POESIA_VISUAL)."
      },
      {
        "check": "Glass gate",
        "command": "cd tooling/storybook && bun run test:glass (headed)",
        "inCi": "job `poesia-visual`, same switch",
        "state": "off",
        "note": "Browser gates are off in CI until the runner has Playwright (POESIA_VISUAL)."
      },
      {
        "check": "Legibility, gutters",
        "command": "cd tooling/storybook && bun run check:legibility && bun run check:gutters (headed)",
        "inCi": "no — run locally",
        "state": "not-run",
        "note": "Headed browser check, run locally."
      }
    ],
    "decisions": [
      {
        "id": "ADR-001",
        "title": "Token sources are JSON, not TypeScript",
        "status": "accepted",
        "date": "2026-04-25",
        "url": "https://git.rrios.dev/rrios-forge/forge/src/branch/main/docs/poesia/DECISION_LOGS/ADR-001-token-sources-are-json.md"
      },
      {
        "id": "ADR-002",
        "title": "Component variants live in `variants.ts` and export their option metadata",
        "status": "accepted",
        "date": "2026-04-26",
        "url": "https://git.rrios.dev/rrios-forge/forge/src/branch/main/docs/poesia/DECISION_LOGS/ADR-002-component-variants-in-variants-ts.md"
      },
      {
        "id": "ADR-003",
        "title": "Storybook editorial convention and pattern↔component bidirectionality",
        "status": "accepted",
        "date": "2026-04-27",
        "url": "https://git.rrios.dev/rrios-forge/forge/src/branch/main/docs/poesia/DECISION_LOGS/ADR-003-storybook-editorial-convention.md"
      },
      {
        "id": "ADR-004",
        "title": "Migrate boolean configuration props to semantic axes",
        "status": "accepted",
        "date": "2026-04-27",
        "url": "https://git.rrios.dev/rrios-forge/forge/src/branch/main/docs/poesia/DECISION_LOGS/ADR-004-boolean-props-to-semantic-axes.md"
      },
      {
        "id": "ADR-005",
        "title": "Visual operational rules: surfaces, interaction, motion",
        "status": "accepted",
        "date": "2026-04-27",
        "url": "https://git.rrios.dev/rrios-forge/forge/src/branch/main/docs/poesia/DECISION_LOGS/ADR-005-visual-operational-rules.md"
      },
      {
        "id": "ADR-006",
        "title": "Geometry and typography signature",
        "status": "accepted",
        "date": "2026-04-27",
        "url": "https://git.rrios.dev/rrios-forge/forge/src/branch/main/docs/poesia/DECISION_LOGS/ADR-006-geometry-and-typography-signature.md"
      },
      {
        "id": "ADR-007",
        "title": "Material highlight on raised surfaces",
        "status": "accepted",
        "date": "2026-04-27",
        "url": "https://git.rrios.dev/rrios-forge/forge/src/branch/main/docs/poesia/DECISION_LOGS/ADR-007-material-highlight-on-raised-surfaces.md"
      },
      {
        "id": "ADR-008",
        "title": "Layout layer: refined `Grid` + new `Container`",
        "status": "accepted",
        "date": "2026-04-28",
        "url": "https://git.rrios.dev/rrios-forge/forge/src/branch/main/docs/poesia/DECISION_LOGS/ADR-008-layout-layer-grid-and-container.md"
      },
      {
        "id": "ADR-009",
        "title": "Editorial Frame: PageShell v3 + new `TopBar` molecule",
        "status": "accepted · amended in part by ADR-011",
        "date": "2026-04-28",
        "url": "https://git.rrios.dev/rrios-forge/forge/src/branch/main/docs/poesia/DECISION_LOGS/ADR-009-editorial-frame-page-shell.md"
      },
      {
        "id": "ADR-010",
        "title": "PageShell v4: bottom dock + mobile floating bubble",
        "status": "accepted · superseded in part by ADR-011 (navigation)",
        "date": "2026-04-28",
        "url": "https://git.rrios.dev/rrios-forge/forge/src/branch/main/docs/poesia/DECISION_LOGS/ADR-010-page-shell-bottom-dock.md"
      },
      {
        "id": "ADR-011",
        "title": "PageShell v5: adaptive lateral sidebar + mobile nav bubble",
        "status": "accepted · amended by ADR-013 (mobile nav) and ADR-014 (rail at md)",
        "date": "2026-04-29",
        "url": "https://git.rrios.dev/rrios-forge/forge/src/branch/main/docs/poesia/DECISION_LOGS/ADR-011-pageshell-v5-mobile-nav-bubble.md"
      },
      {
        "id": "ADR-012",
        "title": "Card.fill axis for symmetric growth in grids",
        "status": "accepted",
        "date": "2026-04-29",
        "url": "https://git.rrios.dev/rrios-forge/forge/src/branch/main/docs/poesia/DECISION_LOGS/ADR-012-card-fill-axis.md"
      },
      {
        "id": "ADR-013",
        "title": "PageShell: mobile-nav polymorphism",
        "status": "accepted",
        "date": "2026-05-06",
        "url": "https://git.rrios.dev/rrios-forge/forge/src/branch/main/docs/poesia/DECISION_LOGS/ADR-013-pageshell-mobile-nav-polymorphism.md"
      },
      {
        "id": "ADR-014",
        "title": "PageShell: Apple Mail / macOS Big Sur visual register",
        "status": "accepted · amended by ADR-022 §5",
        "date": "2026-05-06",
        "url": "https://git.rrios.dev/rrios-forge/forge/src/branch/main/docs/poesia/DECISION_LOGS/ADR-014-pageshell-apple-mail-register.md"
      },
      {
        "id": "ADR-015",
        "title": "Drawer molecule on top of Radix Dialog",
        "status": "accepted",
        "date": "2026-05-08",
        "url": "https://git.rrios.dev/rrios-forge/forge/src/branch/main/docs/poesia/DECISION_LOGS/ADR-015-drawer-molecule.md"
      },
      {
        "id": "ADR-016",
        "title": "NotificationCenter v2: Popover → Drawer + Provider/Hooks",
        "status": "accepted",
        "date": "2026-05-08",
        "url": "https://git.rrios.dev/rrios-forge/forge/src/branch/main/docs/poesia/DECISION_LOGS/ADR-016-notification-center-drawer-provider.md"
      },
      {
        "id": "ADR-017",
        "title": "Actionable components adopt the `asChild` slot pattern for framework-aware routing",
        "status": "accepted",
        "date": "2026-05-08",
        "url": "https://git.rrios.dev/rrios-forge/forge/src/branch/main/docs/poesia/DECISION_LOGS/ADR-017-actionable-as-child-pattern.md"
      },
      {
        "id": "ADR-018",
        "title": "Motion language as a Pattern Layer contract",
        "status": "accepted",
        "date": "2026-05-09",
        "url": "https://git.rrios.dev/rrios-forge/forge/src/branch/main/docs/poesia/DECISION_LOGS/ADR-018-motion-language-pattern.md"
      },
      {
        "id": "ADR-019",
        "title": "Composer organism (message/post authoring surface)",
        "status": "accepted",
        "date": "2026-07-22",
        "url": "https://git.rrios.dev/rrios-forge/forge/src/branch/main/docs/poesia/DECISION_LOGS/ADR-019-composer-organism.md"
      },
      {
        "id": "ADR-020",
        "title": "Feed `anchor=\"bottom\"` (conversation mode) instead of a ChatThread organism",
        "status": "accepted",
        "date": "2026-07-22",
        "url": "https://git.rrios.dev/rrios-forge/forge/src/branch/main/docs/poesia/DECISION_LOGS/ADR-020-feed-anchor-bottom.md"
      },
      {
        "id": "ADR-021",
        "title": "ProfileHeader organism and the `cover` slot contract",
        "status": "accepted",
        "date": "2026-07-22",
        "url": "https://git.rrios.dev/rrios-forge/forge/src/branch/main/docs/poesia/DECISION_LOGS/ADR-021-profile-header-organism.md"
      },
      {
        "id": "ADR-022",
        "title": "The material family: `solid` and `vibrant`",
        "status": "accepted · amended by ADR-027 (vibrant becomes the default)",
        "date": "2026-08-06",
        "url": "https://git.rrios.dev/rrios-forge/forge/src/branch/main/docs/poesia/DECISION_LOGS/ADR-022-material-family-vibrant.md"
      },
      {
        "id": "ADR-023",
        "title": "Atmosphere grammar: colour, motion, and meaning",
        "status": "accepted · 2026-08-07",
        "date": null,
        "url": "https://git.rrios.dev/rrios-forge/forge/src/branch/main/docs/poesia/DECISION_LOGS/ADR-023-atmosphere-grammar.md"
      },
      {
        "id": "ADR-024",
        "title": "`LocaleSelector` is a new molecule, not an extension of `Combobox`",
        "status": "accepted (renumbered 2026-08-08: born as a second ADR-008, colliding with the Layout Layer ADR; IDs must be unique)",
        "date": "2026-05-06",
        "url": "https://git.rrios.dev/rrios-forge/forge/src/branch/main/docs/poesia/DECISION_LOGS/ADR-024-locale-selector.md"
      },
      {
        "id": "ADR-025",
        "title": "The sidebar is an island, not a wall (amended: two stagings)",
        "status": "accepted · amended 2026-08-08 (M-11: production audit added the `column` staging + absorbed RailTooltip / icon-cell)",
        "date": "2026-08-08",
        "url": "https://git.rrios.dev/rrios-forge/forge/src/branch/main/docs/poesia/DECISION_LOGS/ADR-025-sidebar-island.md"
      },
      {
        "id": "ADR-026",
        "title": "Sunset functional palette + the stage field",
        "status": "accepted",
        "date": "2026-08-08",
        "url": "https://git.rrios.dev/rrios-forge/forge/src/branch/main/docs/poesia/DECISION_LOGS/ADR-026-sunset-functional-palette.md"
      },
      {
        "id": "ADR-027",
        "title": "Vibrant is the system's material, not one of its members",
        "status": "accepted · amended by ADR-029 (reading sheets)",
        "date": "2026-08-08",
        "url": "https://git.rrios.dev/rrios-forge/forge/src/branch/main/docs/poesia/DECISION_LOGS/ADR-027-vibrant-is-the-system.md"
      },
      {
        "id": "ADR-028",
        "title": "The label is not the fill",
        "status": "accepted",
        "date": "2026-08-09",
        "url": "https://git.rrios.dev/rrios-forge/forge/src/branch/main/docs/poesia/DECISION_LOGS/ADR-028-label-is-not-the-fill.md"
      },
      {
        "id": "ADR-029",
        "title": "The page gutter belongs outside the frame",
        "status": "accepted",
        "date": "2026-08-09",
        "url": "https://git.rrios.dev/rrios-forge/forge/src/branch/main/docs/poesia/DECISION_LOGS/ADR-029-the-page-gutter.md"
      },
      {
        "id": "ADR-030",
        "title": "Axis vocabulary: one name, one meaning",
        "status": "accepted 2026-10-17 (J-09) — migrated in `packages/ui`, Storybook, hydra, lente and proto; Lunántica and Sissificate (submodules) run on the deprecated aliases until slice S7",
        "date": "2026-10-16",
        "url": "https://git.rrios.dev/rrios-forge/forge/src/branch/main/docs/poesia/DECISION_LOGS/ADR-030-axis-vocabulary.md"
      },
      {
        "id": "ADR-031",
        "title": "Tokens that cover the system: type roles, focus, ambient motion, control heights",
        "status": "accepted 2026-10-17 (audit slice S3, owner go \"Sigue con S3\")",
        "date": "2026-10-17",
        "url": "https://git.rrios.dev/rrios-forge/forge/src/branch/main/docs/poesia/DECISION_LOGS/ADR-031-token-coverage.md"
      },
      {
        "id": "ADR-032",
        "title": "Themes compose by layers; brands are a checked layer",
        "status": "accepted 2026-10-17 (J-04, audit slice S4)",
        "date": "2026-10-17",
        "url": "https://git.rrios.dev/rrios-forge/forge/src/branch/main/docs/poesia/DECISION_LOGS/ADR-032-theme-layers-and-brand.md"
      },
      {
        "id": "ADR-033",
        "title": "The material ships once, and the night is tokens",
        "status": "accepted 2026-10-17 (audit slice S5)",
        "date": "2026-10-17",
        "url": "https://git.rrios.dev/rrios-forge/forge/src/branch/main/docs/poesia/DECISION_LOGS/ADR-033-material-engineering.md"
      },
      {
        "id": "ADR-034",
        "title": "Accessible names come from a labels provider",
        "status": "accepted 2026-10-17 (audit slice S6)",
        "date": "2026-10-17",
        "url": "https://git.rrios.dev/rrios-forge/forge/src/branch/main/docs/poesia/DECISION_LOGS/ADR-034-accessible-names-from-a-labels-provider.md"
      },
      {
        "id": "ADR-035",
        "title": "Motion grammar: the gate before motion, slop by repetition, and what reduced motion keeps",
        "status": "accepted 2026-10-17 (J-13, slice G3)",
        "date": "2026-10-17",
        "url": "https://git.rrios.dev/rrios-forge/forge/src/branch/main/docs/poesia/DECISION_LOGS/ADR-035-motion-grammar.md"
      },
      {
        "id": "ADR-036",
        "title": "Data visualization: colour roles, a grammar, and three components on plain SVG",
        "status": "accepted 2026-10-17 (J-13, slice G4)",
        "date": "2026-10-17",
        "url": "https://git.rrios.dev/rrios-forge/forge/src/branch/main/docs/poesia/DECISION_LOGS/ADR-036-data-visualization.md"
      },
      {
        "id": "ADR-037",
        "title": "Continuity motion: a decelerating curve, a travelling indicator, view transitions and the SegmentedControl",
        "status": "accepted 2026-10-17 (Atlas premium pass)",
        "date": "2026-10-17",
        "url": "https://git.rrios.dev/rrios-forge/forge/src/branch/main/docs/poesia/DECISION_LOGS/ADR-037-continuity-motion.md"
      },
      {
        "id": "ADR-038",
        "title": "Liquid Glass layers: glass for navigation and controls, a content material for everything read",
        "status": "accepted 2026-10-17 (J-16)",
        "date": "2026-10-17",
        "url": "https://git.rrios.dev/rrios-forge/forge/src/branch/main/docs/poesia/DECISION_LOGS/ADR-038-liquid-glass-layers.md"
      },
      {
        "id": "ADR-039",
        "title": "The component premium pass: translucent fills, a selected register, quiet scroll, and a system-wide audit",
        "status": "accepted 2026-10-17 (J-17)",
        "date": "2026-10-17",
        "url": "https://git.rrios.dev/rrios-forge/forge/src/branch/main/docs/poesia/DECISION_LOGS/ADR-039-component-premium-pass.md"
      },
      {
        "id": "ADR-040",
        "title": "The sidebar collapses by default and gives the page the room",
        "status": "accepted 2026-10-17 (J-18)",
        "date": "2026-10-17",
        "url": "https://git.rrios.dev/rrios-forge/forge/src/branch/main/docs/poesia/DECISION_LOGS/ADR-040-collapsible-sidebar.md"
      },
      {
        "id": "ADR-041",
        "title": "The rail peeks instead of growing",
        "status": "accepted 2026-10-17 (J-23)",
        "date": "2026-10-17",
        "url": "https://git.rrios.dev/rrios-forge/forge/src/branch/main/docs/poesia/DECISION_LOGS/ADR-041-rail-peek.md"
      },
      {
        "id": "ADR-042",
        "title": "The reader chooses the material: a transparency layer",
        "status": "accepted 2026-10-18 (J-31)",
        "date": "2026-10-18",
        "url": "https://git.rrios.dev/rrios-forge/forge/src/branch/main/docs/poesia/DECISION_LOGS/ADR-042-transparency-layer.md"
      },
      {
        "id": "ADR-043",
        "title": "The default theme is monochrome",
        "status": "accepted 2026-10-18 (J-35)",
        "date": "2026-10-18",
        "url": "https://git.rrios.dev/rrios-forge/forge/src/branch/main/docs/poesia/DECISION_LOGS/ADR-043-monochrome-default.md"
      },
      {
        "id": "ADR-044",
        "title": "Navigation is a rail that peeks",
        "status": "accepted 2026-10-18 (J-38)",
        "date": "2026-10-18",
        "url": "https://git.rrios.dev/rrios-forge/forge/src/branch/main/docs/poesia/DECISION_LOGS/ADR-044-rail-navigation.md"
      },
      {
        "id": "ADR-045",
        "title": "A screen's controls pin and condense",
        "status": "accepted 2026-10-18 (J-49)",
        "date": "2026-10-18",
        "url": "https://git.rrios.dev/rrios-forge/forge/src/branch/main/docs/poesia/DECISION_LOGS/ADR-045-sticky-bars.md"
      },
      {
        "id": "ADR-046",
        "title": "Markdown is painted with atoms, and apps fill its slots",
        "status": "proposed",
        "date": "2026-10-19",
        "url": "https://git.rrios.dev/rrios-forge/forge/src/branch/main/docs/poesia/DECISION_LOGS/ADR-046-markdown-molecule.md"
      }
    ],
    "taste": [
      {
        "id": "T01",
        "title": "No dominant element",
        "area": "hierarchy",
        "scope": "both",
        "check": "review",
        "signal": "Several things on a screen compete at the same size and weight; squinting leaves no mass that leads.",
        "why": "The eye has nowhere to land and the screen reads as a list of equals (P11).",
        "instead": "One element leads each screen or region — the page title, the data that matters, or the primary action — and the rest step back through prominence and tone.",
        "related": [
          "P11"
        ]
      },
      {
        "id": "T02",
        "title": "More than one primary action per region",
        "area": "hierarchy",
        "scope": "both",
        "check": "review",
        "signal": "Two or more solid primary buttons side by side, or a primary on every card in a list.",
        "why": "When everything is primary nothing is; the accent stops marking the decision (P11).",
        "instead": "One `intent=\"primary\" emphasis=\"solid\"` per region; the others go to secondary, outline or ghost, or into an ActionGroup.",
        "related": [
          "P11",
          "R02"
        ]
      },
      {
        "id": "T03",
        "title": "Too many type sizes, too close together",
        "area": "type",
        "scope": "both",
        "check": "capture",
        "signal": "Six or more font sizes on one screen, or headings barely larger than body text.",
        "why": "Small steps read as noise, not hierarchy.",
        "instead": "Use the type roles only (display, heading-lg/md/sm, body-lg/body/body-sm, caption, eyebrow); five or fewer per screen, with visible jumps.",
        "related": [
          "P11",
          "ADR-031"
        ]
      },
      {
        "id": "T04",
        "title": "Template section sequence",
        "area": "layout",
        "scope": "marketing",
        "check": "review",
        "signal": "Hero, logo strip, three features, testimonial, pricing, closing call to action — in that order, because the template has them.",
        "why": "Sections that exist without a claim make every page the same page.",
        "instead": "One claim and its proof per section; delete sections without a claim; order them by the argument.",
        "related": [
          "P10"
        ]
      },
      {
        "id": "T05",
        "title": "Rows of identical icon-topped cards",
        "area": "layout",
        "scope": "both",
        "check": "review",
        "signal": "Three or four equal cards, each an icon in a rounded square above a title and two lines.",
        "why": "The most recognisable default layout; it says \"features\" without showing any.",
        "instead": "Show the thing — a list with real content, a split with a real picture or interface fragment, a table. Use cards when the items are objects the reader acts on.",
        "related": [
          "P01",
          "P10"
        ]
      },
      {
        "id": "T06",
        "title": "Everything centred",
        "area": "layout",
        "scope": "both",
        "check": "capture",
        "signal": "Most text on the page is centre-aligned, paragraphs included.",
        "why": "Centring everything removes the reading edge and flattens hierarchy.",
        "instead": "Two or three shared left edges for the page; centre at most one moment per screen; never centre a paragraph longer than three lines.",
        "related": [
          "P11"
        ]
      },
      {
        "id": "T07",
        "title": "Too many left edges",
        "area": "layout",
        "scope": "both",
        "check": "review",
        "signal": "Content starts at five or six different x positions down the page.",
        "why": "Items were placed one at a time; the page has no grid.",
        "instead": "Align to the container and its grid; reuse two or three anchor lines on purpose.",
        "related": [
          "P06"
        ]
      },
      {
        "id": "T08",
        "title": "Boxes inside boxes",
        "area": "layout",
        "scope": "both",
        "check": "review",
        "signal": "Cards inside cards inside panels; every group wrapped in its own bordered surface.",
        "why": "Compartments compete with content and multiply edges.",
        "instead": "One surface per layer. Inside it, separate with space (`stack`/`inline` tokens) and a tone step (`surface` axis), not another box. Vibrant panes never nest (ADR-027).",
        "related": [
          "ADR-027",
          "P11"
        ]
      },
      {
        "id": "T09",
        "title": "Thin or empty screens",
        "area": "layout",
        "scope": "both",
        "check": "capture",
        "signal": "A screen that is mostly empty, or a little content stretched over several screens.",
        "why": "Reads as unfinished; restraint is not the same as absence.",
        "instead": "Make the main element larger or remove the section; give empty states a real action (T37).",
        "related": [
          "P10"
        ]
      },
      {
        "id": "T10",
        "title": "The phone as a shrunken desktop",
        "area": "layout",
        "scope": "both",
        "check": "capture",
        "signal": "At 390 px the desktop layout is merely squeezed — tiny type, cramped rows, sideways scroll.",
        "why": "The phone is where most people read; a reduced desktop is a broken phone screen.",
        "instead": "Compose the phone screen on its own — first screen says what it is and offers its action; navigation in the bottom tab bar (PageShell); no horizontal scroll at 375 px.",
        "related": [
          "P02",
          "C-21"
        ]
      },
      {
        "id": "T11",
        "title": "Viewport units that hide content",
        "area": "layout",
        "scope": "both",
        "check": "lint",
        "signal": "Full-height sections sized with `100vh`, or fixed bars that cover content.",
        "why": "On phones `100vh` includes the browser chrome, so the bottom of the section hides behind it; fixed bars cover what they do not reserve space for.",
        "instead": "Use dynamic viewport units (`dvh`) and reserve space for every fixed bar (safe-area utilities).",
        "related": [
          "P02"
        ]
      },
      {
        "id": "T12",
        "title": "Headlines longer than two lines",
        "area": "type",
        "scope": "both",
        "check": "capture",
        "signal": "A heading wraps to three or more lines at any of the three review widths.",
        "why": "A long headline is a paragraph in disguise; it stops being scanned.",
        "instead": "Cut words before shrinking the size; keep statements as paragraphs; balanced wrapping, no orphan word.",
        "related": [
          "P11"
        ]
      },
      {
        "id": "T13",
        "title": "Eyebrows by default",
        "area": "type",
        "scope": "both",
        "check": "review",
        "signal": "A small uppercase kicker above every heading, or a pill badge above the hero, carrying no information.",
        "why": "The label became decoration; repeated, it is the generated look.",
        "instead": "Use the eyebrow role only when it carries information the heading does not (place, category, step); at most one per region.",
        "related": [
          "P10",
          "ADR-031"
        ]
      },
      {
        "id": "T14",
        "title": "Scattered tiny capitals",
        "area": "type",
        "scope": "both",
        "check": "capture",
        "signal": "Many small uppercase, letter-spaced labels around the screen; caps runs longer than three words.",
        "why": "Hard to read and visually noisy; it imitates \"detail\" instead of providing it.",
        "instead": "Sentence case at a readable role, next to what it describes; capitals only for the eyebrow role and short runs.",
        "related": [
          "P02"
        ]
      },
      {
        "id": "T15",
        "title": "Decorative numbering and meta",
        "area": "type",
        "scope": "both",
        "check": "review",
        "signal": "01 / 02 / 03 before sections that are not steps; version stamps, coordinates, \"est. 2024\", local time as ornament.",
        "why": "Gallery fashion that carries no information.",
        "instead": "Number only real sequences (Stepper, ordered lists); delete furniture text.",
        "related": [
          "P10"
        ]
      },
      {
        "id": "T16",
        "title": "One word styled differently in a headline",
        "area": "type",
        "scope": "both",
        "check": "review",
        "signal": "A single word in another colour, italic, serif or gradient inside a heading.",
        "why": "The fix that became the look; it splits the headline's voice.",
        "instead": "One face, one colour per heading. The serif voice is the display role, used once per page.",
        "related": [
          "P11",
          "ADR-006"
        ]
      },
      {
        "id": "T17",
        "title": "Grey body text",
        "area": "type",
        "scope": "both",
        "check": "review",
        "signal": "Paragraphs meant to be read set in the muted tone.",
        "why": "Reads unfinished and lowers contrast where reading happens.",
        "instead": "Body in `content-default`; `muted` only for secondary notes and metadata; quieter means a lower role or tone, never opacity.",
        "related": [
          "R05",
          "P02"
        ]
      },
      {
        "id": "T18",
        "title": "Text too small to read",
        "area": "type",
        "scope": "both",
        "check": "capture",
        "signal": "Reading text under 16 px, or blocks of text under 13 px.",
        "why": "Fails comfort before it fails WCAG.",
        "instead": "Body role for reading; caption and eyebrow only for short meta (the eyebrow's 11 px is the floor).",
        "related": [
          "P02",
          "ADR-031"
        ]
      },
      {
        "id": "T19",
        "title": "Justified or ragged-badly text",
        "area": "type",
        "scope": "both",
        "check": "lint",
        "signal": "Justified paragraphs, orphan words on headline last lines, paragraphs wider than about 75 characters.",
        "why": "Rivers, orphans and long measures slow reading.",
        "instead": "Left-aligned text, balanced headline wrapping, `max-w-prose` for long text.",
        "related": [
          "P02"
        ]
      },
      {
        "id": "T20",
        "title": "Accent everywhere",
        "area": "colour",
        "scope": "both",
        "check": "review",
        "signal": "The accent colour on headings, borders, bullets, icons and links at once; more than a small share of the screen.",
        "why": "An accent marks a decision; spread out, it marks nothing.",
        "instead": "The accent is for the primary action and focus; at most one other recurring element. Headings stay in ink.",
        "related": [
          "P11",
          "ADR-028"
        ]
      },
      {
        "id": "T21",
        "title": "Decorative gradients",
        "area": "colour",
        "scope": "both",
        "check": "lint",
        "signal": "Gradient text, gradient buttons, glows behind calls to action, violet-to-blue hero washes.",
        "why": "The first-generation look of generated interfaces; it also breaks contrast guarantees.",
        "instead": "Flat role colours. In Poesía the only gradient is the atmosphere ground, painted by the Atmosphere organism.",
        "related": [
          "R04",
          "R05",
          "ADR-023"
        ]
      },
      {
        "id": "T22",
        "title": "Material without purpose",
        "area": "material",
        "scope": "both",
        "check": "review",
        "signal": "A vibrant pane over a flat canvas, panes nested in panes, blur used as decoration, text placed on the sky.",
        "why": "Glass that has nothing behind it is a grey box; glass on glass muddies; words on the sky lose their protection.",
        "instead": "Vibrant panes on an Atmosphere ground, one pane per layer, type and actions on panes only (ADR-027); `solid` where the material does not carry meaning.",
        "related": [
          "ADR-027",
          "ADR-022"
        ]
      },
      {
        "id": "T23",
        "title": "Shadows on everything",
        "area": "material",
        "scope": "both",
        "check": "review",
        "signal": "Every resting card carries a drop shadow; glows under buttons.",
        "why": "Depth stops meaning anything when nothing is flat.",
        "instead": "Elevation by role — resting surfaces raised at most; shadows for what floats (popovers, dialogs, toasts) through the elevation tokens.",
        "related": [
          "R04",
          "ADR-007"
        ]
      },
      {
        "id": "T24",
        "title": "Softening with opacity",
        "area": "colour",
        "scope": "both",
        "check": "review",
        "signal": "Secondary text or icons made lighter with opacity instead of a tone.",
        "why": "Opacity drops contrast unpredictably over a ground and over the material.",
        "instead": "Use the `muted` or `subtle` content tones; opacity only for disabled (`opacity-disabled`).",
        "related": [
          "R05",
          "R04"
        ]
      },
      {
        "id": "T25",
        "title": "Decorative live signals",
        "area": "motion",
        "scope": "both",
        "check": "lint",
        "signal": "Pulsing dots, pinging badges, \"available now\" indicators that are not live data.",
        "why": "Attention-seeking loops with nothing to say (P10).",
        "instead": "Loops only for real progress or live data (Spinner, Skeleton, Progress); a static status Badge otherwise.",
        "related": [
          "P10"
        ]
      },
      {
        "id": "T26",
        "title": "Placeholders and fake interfaces",
        "area": "imagery",
        "scope": "both",
        "check": "review",
        "signal": "Grey boxes, \"image here\", abstract dashboards whose numbers do not add up.",
        "why": "Worse than no image: it tells the reader nothing is real.",
        "instead": "A real picture of the subject, a true-size fragment of the real interface with believable data, or type alone.",
        "related": [
          "P10"
        ]
      },
      {
        "id": "T27",
        "title": "Emoji as icons",
        "area": "imagery",
        "scope": "both",
        "check": "lint",
        "signal": "Emoji characters standing in for icons in buttons, navigation, lists or headings.",
        "why": "Inconsistent across platforms, not themable, unlabelled for assistive technology.",
        "instead": "An SVG through `Icon` (decorative, or with an accessible name); emoji only inside user content.",
        "related": [
          "P02",
          "R04"
        ]
      },
      {
        "id": "T28",
        "title": "Mixed icon styles",
        "area": "imagery",
        "scope": "both",
        "check": "review",
        "signal": "Outline and filled icons side by side, different stroke widths, cliché metaphors (rocket for launch).",
        "why": "One language per layer is what makes icons quiet.",
        "instead": "One family and stroke per hierarchy level, sized by the icon size axis.",
        "related": [
          "P06"
        ]
      },
      {
        "id": "T29",
        "title": "Clip-art decoration",
        "area": "imagery",
        "scope": "marketing",
        "check": "review",
        "signal": "Floating blobs, dot grids, wave dividers, isometric scenes, tilted framed screenshots.",
        "why": "Decoration that belongs to no subject.",
        "instead": "The Atmosphere is Poesía's ground; anything else drawn must be the subject's own thing, large, in one language.",
        "related": [
          "P10",
          "ADR-023"
        ]
      },
      {
        "id": "T30",
        "title": "Genre words",
        "area": "copy",
        "scope": "both",
        "check": "lint",
        "signal": "Unleash, supercharge, seamless, effortless, elevate, empower, next-gen, world-class, cutting-edge, game-changer, revolutionise.",
        "why": "Sentences any company could print unchanged say nothing about this one.",
        "instead": "Specific nouns and real numbers; test each sentence by asking whether a competitor could sign it.",
        "related": [
          "P10"
        ]
      },
      {
        "id": "T31",
        "title": "Formula sentences",
        "area": "copy",
        "scope": "both",
        "check": "lint",
        "signal": "\"Not just X, it's Y\", \"take your X to the next level\", \"the future of X\", three-word tricolons as headlines.",
        "why": "The construction is the generated voice, whatever the words.",
        "instead": "The plainest true sentence — what it is, what it does, for whom.",
        "related": [
          "P10"
        ]
      },
      {
        "id": "T32",
        "title": "Generic action labels",
        "area": "copy",
        "scope": "both",
        "check": "lint",
        "signal": "Buttons labelled Learn more, Click here, Submit, Get started.",
        "why": "The label should say what happens; a generic one makes the reader guess.",
        "instead": "Verb plus object in one to three words (\"Save changes\", \"Book a table\"); one label per intent across the product.",
        "related": [
          "P02"
        ]
      },
      {
        "id": "T33",
        "title": "Placeholder data",
        "area": "copy",
        "scope": "both",
        "check": "lint",
        "signal": "John Doe, Lorem ipsum, 1234567, 99.99%, identical avatars and dates.",
        "why": "Placeholder data hides layout problems real data would reveal.",
        "instead": "Realistic, varied names, lengths and numbers — including the longest real value.",
        "related": [
          "P10"
        ]
      },
      {
        "id": "T34",
        "title": "Invented proof",
        "area": "copy",
        "scope": "marketing",
        "check": "review",
        "signal": "Logo walls, ratings, quotes or \"10,000+ teams\" with no source.",
        "why": "Untrue claims; also the most recognisable generated filler.",
        "instead": "True facts only (price, place, inclusions); clearly marked samples to replace when the real proof is missing.",
        "related": [
          "P07"
        ]
      },
      {
        "id": "T35",
        "title": "Hyped or cute tone in system messages",
        "area": "copy",
        "scope": "both",
        "check": "review",
        "signal": "Exclamation marks in confirmations, jokes in errors, Title Case headings, passive voice.",
        "why": "The interface should sound like a capable colleague, not an advert.",
        "instead": "Plain, active, sentence case; errors say what happened and how to fix it.",
        "related": [
          "P02"
        ]
      },
      {
        "id": "T36",
        "title": "The wrong waiting state",
        "area": "states",
        "scope": "product",
        "check": "review",
        "signal": "A spinner where the layout is known, a blank screen while loading, content jumping when it arrives.",
        "why": "The wait feels longer and the layout shifts.",
        "instead": "Skeleton in the shape of the content for waits over about a second; reserve the space; Spinner only inside controls.",
        "related": [
          "P02"
        ]
      },
      {
        "id": "T37",
        "title": "Empty states with nothing to do",
        "area": "states",
        "scope": "product",
        "check": "review",
        "signal": "An empty list or dashboard that only says \"No data\".",
        "why": "The first run is where the product explains itself.",
        "instead": "EmptyState with what will appear here and one action to create the first item.",
        "related": [
          "P08"
        ]
      },
      {
        "id": "T38",
        "title": "Dead or hidden interactions",
        "area": "states",
        "scope": "both",
        "check": "lint",
        "signal": "Links to `#`, actions reachable only on hover, missing focus, no active state in navigation.",
        "why": "Keyboard, touch and screen-reader users cannot reach what the mouse can.",
        "instead": "Real destinations; every hover affordance has a tap and keyboard equivalent; the shared focus ring; NavItem `active`.",
        "related": [
          "P02",
          "R14"
        ]
      },
      {
        "id": "T39",
        "title": "Uniform motion everywhere",
        "area": "motion",
        "scope": "both",
        "check": "lint",
        "signal": "The same fade-and-rise on every block, stagger on every list, hover scale on every card, bounce on utility controls, `transition: all`, entering from scale 0, ease-in on interface motion.",
        "why": "Motion applied by default says nothing about cause and effect, and some of it reflows the layout.",
        "instead": "Motion by frequency and purpose on the motion tokens (G3); transform and opacity only; ease-out to enter, never ease-in; press feedback, not hover lift.",
        "related": [
          "P10",
          "ADR-031"
        ]
      }
    ],
    "dataviz": {
      "notAChart": [
        {
          "data": "A single current value, maybe with a trend",
          "use": "MetricCard (value, delta, optional sparkline)"
        },
        {
          "data": "A handful of headline numbers",
          "use": "A row of MetricCards"
        },
        {
          "data": "The one number a screen leads with",
          "use": "A hero figure in the sans display role, one per view"
        },
        {
          "data": "One ratio against a limit",
          "use": "Progress or a meter"
        },
        {
          "data": "More than about seven classes that all carry meaning",
          "use": "A table (DataTable), with a chart beside it if the shape matters"
        }
      ],
      "forms": [
        {
          "job": "Compare magnitude, low to high",
          "form": "bar or column; heatmap for a grid",
          "colour": "sequential, or one series colour",
          "avoid": "time series; proportions"
        },
        {
          "job": "Trend over time",
          "form": "line; area for a single series",
          "colour": "one series colour, or categorical for a few series",
          "avoid": "fewer than four points; more than six series; no time axis"
        },
        {
          "job": "Tell distinct series apart",
          "form": "grouped or stacked bar, multi-line",
          "colour": "categorical, in slot order",
          "avoid": "more series than the ladder allows"
        },
        {
          "job": "One series is the point, the rest are context",
          "form": "emphasis — one series in colour, the rest in the neutral tone",
          "colour": "one series colour plus neutral",
          "avoid": "categorical colour on every series"
        },
        {
          "job": "Above or below a baseline; delta to a target",
          "form": "diverging bar, or a line against the baseline",
          "colour": "diverging",
          "avoid": "red and green alone"
        },
        {
          "job": "Part to whole",
          "form": "stacked bar (horizontal for many or long names); a donut only for five slices or fewer with a dominant one",
          "colour": "categorical",
          "avoid": "near-equal slices; precise reading from angles"
        },
        {
          "job": "Ordered-scale share (agree to disagree, sentiment)",
          "form": "diverging stacked bar, centred on the neutral",
          "colour": "diverging",
          "avoid": "categorical colour on an ordered scale"
        },
        {
          "job": "Before and after per item",
          "form": "dumbbell",
          "colour": "one series colour in two steps",
          "avoid": "two separate bar charts"
        },
        {
          "job": "Distribution or spread",
          "form": "histogram, box plot; scatter for two continuous variables (twenty points or more)",
          "colour": "one series colour; at most three categorical series in a scatter",
          "avoid": "scatter for categorical data"
        },
        {
          "job": "Intensity over two dimensions (hour by day)",
          "form": "heatmap with a numeric legend",
          "colour": "sequential",
          "avoid": "a rainbow scale"
        }
      ],
      "colourJobs": {
        "categorical": {
          "tokens": "series-1 … series-8",
          "rule": "Identity. Assigned in slot order, never cycled, never by rank; a series keeps its colour when a filter removes others. A ninth series folds into \"Other\", small multiples, or a second encoding — never a generated hue."
        },
        "ordinal": {
          "tokens": "scale-1 … scale-5",
          "rule": "Order (funnel stage, tier, bucket). One hue, monotone lightness. Use it whenever reordering the categories would change the meaning."
        },
        "sequential": {
          "tokens": "scale-1 … scale-5",
          "rule": "Magnitude. One hue, light to dark by day, dark to light by night. The safe default."
        },
        "diverging": {
          "tokens": "diverging-below-3 … diverging-neutral … diverging-above-3",
          "rule": "Polarity. Two hues and a neutral midpoint, equal steps per arm; never a hue at the midpoint."
        },
        "status": {
          "tokens": "feedback and status roles (success, warning, danger, neutral)",
          "rule": "State, with reserved meaning, always with an icon and a label. When a series means good or bad it wears status roles; when it is just a series it wears categorical — never both in one chart."
        }
      },
      "seriesLadder": [
        {
          "count": "1 to 3",
          "treatment": "Colour alone is comfortable; label directly. Forms where any two marks can touch (scatter, bubble, maps, small multiples) stop here."
        },
        {
          "count": 4,
          "treatment": "Bars, stacks and lines stay safe; direct labels become mandatory."
        },
        {
          "count": "5 to 6",
          "treatment": "Soft cap; legend, or small multiples."
        },
        {
          "count": "7 to 8",
          "treatment": "The ceiling. Past it, fold the tail into \"Other\", facet, or add a second encoding (shape)."
        }
      ],
      "labels": [
        "A legend whenever there are two or more series; none for one (the title names it).",
        "Direct labels are selective — the endpoint, the extreme, the series the story is about — never a number on every point.",
        "Text never wears a series colour; values, labels and legends use content tones, and a coloured key beside them carries the identity.",
        "A label that does not fit inside its mark moves outside it or into the tooltip; it is never clipped.",
        "Axis ticks are round numbers, compacted from a thousand (1K, 2K); units on the axis.",
        "Large standalone figures use proportional numerals; columns of numbers use tabular numerals."
      ],
      "interaction": [
        {
          "Tooltips enhance, never gate": "every value is also reachable through labels or the table view."
        },
        "Lines and areas take a crosshair that snaps to the nearest data position and lists every series at that position; bars and cells are their own hit targets.",
        "Hit targets are larger than the mark (at least the WCAG 2.2 target size); dense scatter uses nearest-point.",
        "The same details on keyboard focus as on hover; marks are reachable by keyboard.",
        "Filters sit in one row above the charts they scope, date range first; a refetch keeps the last render, dimmed, instead of a skeleton.",
        "Series and category names are untrusted data, inserted as text, never as markup."
      ],
      "accessibility": [
        "A table view (or DataTable) of the same data is always reachable.",
        "Identity is never colour alone (legend, direct labels, or texture).",
        "A text summary or accessible name states the chart's one insight.",
        {
          "Charts are readable at once; they do not draw themselves in on arrival (ADR-035 gate": "decoration), and live updates respect reduced motion."
        },
        {
          "Empty, loading and error states are designed": "what will appear, a skeleton in the chart's shape, a retry."
        },
        "Night values are their own steps, validated on the night surface, not an automatic inversion."
      ],
      "never": [
        "Two y-axes on one chart. Two measures of different scale are two charts, small multiples, or indexed to a common base.",
        "A rainbow scale, or a hue at a diverging midpoint.",
        "Colour assigned by rank, or repainted when a filter changes the series.",
        "3D, gradients, shadows or glows on data marks.",
        "Pie or donut with more than five slices or near-equal slices.",
        "A chart for a single number."
      ]
    },
    "product": {
      "levers": {
        "scheme": "Which colour scheme the product opens in — day or night — before the reader chooses (ADR-032).",
        "density": "default, or desktop density for information-dense work (ADR-032).",
        "contrast": "The target above AA (R05) — AA, or AAA where the reader may be vulnerable or the domain regulated.",
        "atmosphere": "How much sky the working screens carry — full, quiet (reading rooms), or still — and whether it drifts (ADR-023, ADR-031).",
        "material": "vibrant panes by default; solid for instruments, dense tables and charts that need a flat ground (ADR-027).",
        "display": "Whether the serif display voice appears (once per page) or the product stays in the sans.",
        "motion": "The lens of the motion gate (ADR-035) — restraint (frequent use, tools), polish (product), or play (rare moments, learning).",
        "brand": "The brand layer's hues (BRAND.md) — the only place a product chooses colour, checked for contrast."
      },
      "profiles": [
        {
          "id": "tool",
          "for": "Productivity tools, editors, back offices, content management",
          "scheme": "day",
          "density": "desktop on desktop screens",
          "contrast": "AA",
          "atmosphere": "quiet, still on working screens",
          "material": "vibrant chrome, solid instruments",
          "display": "none on working screens",
          "motion": "restraint",
          "must_have": [
            "keyboard paths and shortcuts",
            "undo for destructive actions",
            "empty states that teach"
          ],
          "avoid": [
            "T01",
            "T05",
            "T09",
            "T39"
          ]
        },
        {
          "id": "data",
          "for": "Dashboards, analytics, monitoring, status pages",
          "scheme": "night",
          "density": "desktop",
          "contrast": "AA",
          "atmosphere": "still",
          "material": "solid instruments, vibrant chrome only",
          "display": "none; a sans hero figure leads",
          "motion": "restraint",
          "must_have": [
            "filters in one row above the charts",
            "a table view for every chart",
            "live values without flashing",
            "export"
          ],
          "avoid": [
            "T03",
            "T21",
            "T25",
            "T26"
          ]
        },
        {
          "id": "money",
          "for": "Banking, payments, fintech, wallets, trading",
          "scheme": "day",
          "density": "default",
          "contrast": "AAA for amounts and actions",
          "atmosphere": "quiet, still",
          "material": "vibrant chrome, solid for statements and forms",
          "display": "none in flows; allowed on the landing",
          "motion": "restraint",
          "must_have": [
            "every fee and amount visible before confirming",
            "confirmation and undo where possible",
            "tabular numerals",
            "plain security states"
          ],
          "avoid": [
            "T21",
            "T30",
            "T34",
            "T35"
          ]
        },
        {
          "id": "care",
          "for": "Health, mental health, wellbeing, beauty and care services",
          "scheme": "day",
          "density": "default",
          "contrast": "AAA",
          "atmosphere": "quiet, slow drift",
          "material": "vibrant, soft",
          "display": "once per page",
          "motion": "polish, gentle; nothing pulsing",
          "must_have": [
            "calm copy",
            "large reading text",
            "safe defaults",
            "an obvious way to get help"
          ],
          "avoid": [
            "T25",
            "T35",
            "T39"
          ]
        },
        {
          "id": "commerce",
          "for": "Shops, marketplaces, bookings, luxury goods",
          "scheme": "day",
          "density": "default",
          "contrast": "AA",
          "atmosphere": "full on browsing screens, quiet at checkout",
          "material": "vibrant",
          "display": "once per page on browsing screens",
          "motion": "polish",
          "must_have": [
            "real product pictures",
            "price and availability next to the action",
            "a short checkout",
            "trust at payment"
          ],
          "avoid": [
            "T05",
            "T26",
            "T32",
            "T34"
          ]
        },
        {
          "id": "reading",
          "for": "Editorial, documentation, courses, long-form content, divination and interpretation texts",
          "scheme": "day, night available",
          "density": "default, generous measure",
          "contrast": "AA",
          "atmosphere": "quiet reading rooms (the reading sheet)",
          "material": "vibrant reading sheets",
          "display": "the article title",
          "motion": "restraint",
          "must_have": [
            "readable measure",
            "reading progress or table of contents for long text",
            "typographic quality"
          ],
          "avoid": [
            "T12",
            "T17",
            "T18",
            "T19"
          ]
        },
        {
          "id": "community",
          "for": "Social, creators, messaging, communities, adult content platforms",
          "scheme": "night",
          "density": "default",
          "contrast": "AA",
          "atmosphere": "full drift on the home, quiet in conversations",
          "material": "vibrant",
          "display": "profiles and the home",
          "motion": "polish; play for rare moments (a first post, a milestone)",
          "must_have": [
            "privacy controls in reach",
            "clear consent and visibility states",
            "moderation cues",
            "real people's content first"
          ],
          "avoid": [
            "T25",
            "T26",
            "T33",
            "T39"
          ]
        },
        {
          "id": "learning",
          "for": "Learning products, kids, gamified progress",
          "scheme": "day",
          "density": "default",
          "contrast": "AA",
          "atmosphere": "full",
          "material": "vibrant",
          "display": "section openers",
          "motion": "play for rewards and progress, restraint in exercises",
          "must_have": [
            "visible progress",
            "encouraging feedback",
            "no dark patterns",
            "large targets"
          ],
          "avoid": [
            "T35",
            "T36",
            "T37"
          ]
        },
        {
          "id": "studio",
          "for": "Creative studios, media generation and editing, portfolios",
          "scheme": "night",
          "density": "desktop for editing panels",
          "contrast": "AA",
          "atmosphere": "still behind the canvas, full on the landing",
          "material": "solid around the work, vibrant chrome",
          "display": "the landing and project titles",
          "motion": "restraint in the editor, polish elsewhere",
          "must_have": [
            "the work is the largest thing on screen",
            "non-destructive editing",
            "clear cost and progress for long jobs"
          ],
          "avoid": [
            "T22",
            "T26",
            "T29"
          ]
        },
        {
          "id": "developer",
          "for": "Developer tools, APIs, consoles, status of services",
          "scheme": "night",
          "density": "desktop",
          "contrast": "AA",
          "atmosphere": "still",
          "material": "solid instruments",
          "display": "none",
          "motion": "restraint",
          "must_have": [
            "copyable values",
            "discoverable endpoints",
            "explicit limits and errors",
            "code in the mono face"
          ],
          "avoid": [
            "T15",
            "T21",
            "T30"
          ]
        },
        {
          "id": "landing",
          "for": "Marketing and launch pages",
          "scheme": "the product's",
          "density": "default",
          "contrast": "AA",
          "atmosphere": "full, drifting",
          "material": "vibrant",
          "display": "the hero",
          "motion": "polish, one signature moment",
          "must_have": [
            "one claim and its proof per section",
            "the real product shown",
            "one primary action per section"
          ],
          "avoid": [
            "T04",
            "T05",
            "T29",
            "T30",
            "T31",
            "T34"
          ]
        }
      ],
      "delivery": [
        "Works at 375, 768, 1024 and 1440 px, and in landscape on a phone; no horizontal scroll; nothing under fixed bars.",
        "Touch targets of at least 44 px with room between them; pointer targets of at least 24 px.",
        "Every field has a visible label; errors appear on leaving the field, say what to do, and a failed submit focuses a linked summary (ErrorSummary).",
        "Buttons that start work disable and show progress until it ends; destructive actions confirm and, where possible, undo.",
        "Loading has the shape of the content, empty states offer the first action, errors offer a way out.",
        "Colour is never the only signal; focus is visible and never hidden by sticky bars.",
        "Controls the reader needs while the content scrolls (filters, search, a view switch, section tabs; a selection's actions) stay in reach in a pinned, condensed bar — one per edge (ADR-045).",
        "Numbers, dates and money are formatted for the locale; columns of numbers use tabular numerals.",
        "Night and more contrast are checked as their own themes, not assumed.",
        "Reduced motion and the largest text size leave every task possible."
      ]
    },
    "motion": {
      "registers": {
        "interaction": {
          "tempo": "fast | default | slow (the duration tokens)",
          "purpose": "Explain a change of state; enter toward where the element belongs."
        },
        "ambient": {
          "tempo": "seconds to minutes; nothing under six seconds; crossfades of at least 0.8 seconds",
          "purpose": "The atmosphere's drift and breath. Never zoom, spin or parallax in a loop; never attention-seeking."
        }
      },
      "gate": [
        {
          "id": "G1",
          "question": "How often is it triggered?",
          "answer": "Rare (onboarding, a first success, about monthly) may be expressive:\nslow duration, emphasized easing. Occasional (daily) is quiet and\nquick: fast or default. Frequent (typing, list navigation, sorting,\nfiltering, many times per session) does not animate: the change is\ninstant.\n"
        },
        {
          "id": "G2",
          "question": "Was it started from the keyboard?",
          "answer": "Keyboard-driven changes (arrow navigation, shortcuts, typing) are instant. A shortcut that opens a surface may open it on the surface's recipe; moving inside it does not animate."
        },
        {
          "id": "G3",
          "question": "What is it for?",
          "answer": "Feedback (a press, a state flip), orientation (where something came\nfrom or went), or continuity (content arriving, leaving, resizing).\nAnything else is decoration and goes. Delight is allowed only for\nrare moments.\n"
        },
        {
          "id": "G4",
          "question": "Does it survive the tenth repetition?",
          "answer": "If it would annoy on the tenth time, make it faster, smaller, or remove it."
        },
        {
          "id": "G5",
          "question": "What is lost without it?",
          "answer": "If removing it leaves the reader unsure what happened, it is functional and must survive reduced motion as a non-motion cue. Otherwise it is decorative and is dropped under reduced motion."
        }
      ],
      "recipes": [
        {
          "class": "hover, focus, state change",
          "duration": "fast",
          "easing": "standard",
          "properties": [
            "colour",
            "background",
            "border",
            "opacity",
            "shadow"
          ],
          "note": "Never instant (a colour snap reads as broken), never a layout change."
        },
        {
          "class": "press",
          "duration": "fast",
          "easing": "standard",
          "properties": [
            "scale"
          ],
          "note": "Button-shaped controls scale to 0.98 while pressed (ADR-005). Surfaces with content do not shrink."
        },
        {
          "class": "compact overlay (tooltip, popover, dropdown menu)",
          "duration": "fast",
          "easing": "standard",
          "properties": [
            "opacity",
            "scale"
          ],
          "note": "Scale from 0.95, from the trigger's side (transform origin at the trigger). Same recipe in and out."
        },
        {
          "class": "tray overlay",
          "duration": "default",
          "easing": "standard",
          "properties": [
            "opacity",
            "translate"
          ],
          "note": "A short travel (about 4 px) toward its resting place."
        },
        {
          "class": "dialog",
          "duration": "default",
          "easing": "standard",
          "properties": [
            "opacity",
            "scale"
          ],
          "note": "Scale from 0.96. Symmetric exit (ADR-018)."
        },
        {
          "class": "drawer, sheet",
          "duration": "default",
          "easing": "standard",
          "properties": [
            "opacity",
            "translate"
          ],
          "note": "From its edge. Symmetric exit (ADR-018)."
        },
        {
          "class": "toast",
          "duration": "fast",
          "easing": "standard",
          "properties": [
            "opacity",
            "translate"
          ],
          "note": "A momentary acknowledgement, not an arrival."
        },
        {
          "class": "inline feedback (field error, inline alert, validation message)",
          "duration": "fast",
          "easing": "standard",
          "properties": [
            "opacity"
          ],
          "note": "Fades in where it will stay; the layout change itself is not animated."
        },
        {
          "class": "tab panel",
          "duration": "instant",
          "easing": "none",
          "properties": [],
          "note": "The panel swaps at once and the selection indicator travels; the old panel is gone before the new one paints, so a fade-in reads as an empty frame (J-37)."
        },
        {
          "class": "content swap (loading to content, icon swap)",
          "duration": "fast",
          "easing": "standard",
          "properties": [
            "opacity"
          ],
          "note": "Crossfade; the skeleton has the shape of the content, so nothing jumps."
        },
        {
          "class": "selection indicator (tab underline, segmented thumb)",
          "duration": "default",
          "easing": "standard",
          "properties": [
            "clip-path"
          ],
          "note": "One shape travels to the chosen option (ADR-037). Pointer choices travel; keyboard moves, first paint and resizes are instant."
        },
        {
          "class": "page change in an app frame (view transition)",
          "duration": "default",
          "easing": "standard",
          "properties": [
            "opacity",
            "translate"
          ],
          "note": "The page crossfades on fast, the new content rises 4 px, the current navigation pill travels to the new item (ADR-037, startViewTransition)."
        },
        {
          "class": "reveal (theme switch)",
          "duration": "slow",
          "easing": "emphasized",
          "properties": [
            "clip-path"
          ],
          "note": "The new state opens as a circle from its trigger. Rare, so expressive (G1); instant under reduced motion (ADR-037)."
        },
        {
          "class": "surface leaving the canvas (route change, hero swap)",
          "duration": "slow",
          "easing": "emphasized",
          "properties": [
            "opacity",
            "translate"
          ],
          "note": "The only use of the emphasized easing (ADR-018)."
        },
        {
          "class": "progress and live data",
          "duration": "loop",
          "easing": "linear or standard",
          "properties": [
            "transform",
            "opacity"
          ],
          "note": "Loops only where work is really happening (Spinner, Progress, Skeleton)."
        }
      ],
      "rules": [
        {
          "id": "MR1",
          "rule": "Animate transform, opacity, filter and clip-path. Never width, height, margin, padding, top or left (they reflow every frame)."
        },
        {
          "id": "MR2",
          "rule": "Never start from scale 0. Overlays start at 0.95 to 0.96; nothing starts below 0.9."
        },
        {
          "id": "MR3",
          "rule": "Never ease-in for interface motion, and never the browser's default easing; use the standard or emphasized easing tokens."
        },
        {
          "id": "MR4",
          "rule": "Overlays grow from their trigger (transform origin at the trigger's side), not from their centre."
        },
        {
          "id": "MR5",
          "rule": "Sheets and panels leave on the same recipe that brought them in (symmetric exits, ADR-018). Inline content that disappears because the reader removed it may simply go."
        },
        {
          "id": "MR6",
          "rule": "One easing family per register; durations come from the tokens only. A new duration is a token proposal, not a literal."
        },
        {
          "id": "MR7",
          "rule": "Interruptible motion uses transitions, so a reversal mid-flight retargets. Exit keyframes exist only where a primitive needs them to delay unmounting (ADR-018)."
        },
        {
          "id": "MR8",
          "rule": "No bounce or overshoot on utility controls (menus, toggles, dialogs, settings, errors)."
        },
        {
          "id": "MR9",
          "rule": "will-change only on what is about to move, never globally; keep continuously animated layers few."
        }
      ],
      "slop": [
        {
          "id": "MS1",
          "pattern": "Looping attention signals (pulsing dots, breathing calls to action, ping badges)",
          "threshold": "any instance that is not real progress or live data",
          "taste": "T25"
        },
        {
          "id": "MS2",
          "pattern": "Hover scale on many elements",
          "threshold": "three or more components with the same hover scale (one primary floating action, or a draggable thumb, is fine)",
          "taste": "T39"
        },
        {
          "id": "MS3",
          "pattern": "The same entrance on everything (identical fade-and-rise)",
          "threshold": "four or more components sharing one entrance",
          "taste": "T39"
        },
        {
          "id": "MS4",
          "pattern": "Staggered lists",
          "threshold": "two or more staggered lists in one view",
          "taste": "T39"
        },
        {
          "id": "MS5",
          "pattern": "Bounce on utility controls",
          "threshold": "any instance",
          "taste": "T39"
        },
        {
          "id": "MS6",
          "pattern": "Motion on mount for static content (headings, paragraphs, navigation)",
          "threshold": "any instance without a purpose from the gate",
          "taste": "T39"
        },
        {
          "id": "MS7",
          "pattern": "Blur entrances everywhere",
          "threshold": "three or more components sharing one blur entrance, or blur over reading text",
          "taste": "T39"
        }
      ],
      "reducedMotion": {
        "sources": "The `reduced-motion` theme layer (`data-motion=\"reduce\"`) and the operating system preference apply the same contract; the OS always wins over a theme (ADR-032).",
        "keep": "State changes still land, instantly or as a slow crossfade; anything whose removal would leave the reader unsure what happened is replaced by a non-motion cue (colour, outline, text), never deleted.",
        "drop": "Travel, scale, parallax, ambient loops (the sky goes still, not dead) and every decorative flourish.",
        "final_state": "Every animation's end state is reachable without it; nothing is hidden until an animation runs."
      },
      "divergences": [
        {
          "topic": "Exit weight",
          "source": "Exits should be lighter and faster than entrances.",
          "poesia": "Sheets and panels exit symmetrically; asymmetric exits read as a flicker.",
          "decision": "ADR-018 (owner, motion follow-up)"
        },
        {
          "topic": "Press scale",
          "source": 0.97,
          "poesia": "0.98 on button-shaped controls only.",
          "decision": "ADR-005"
        },
        {
          "topic": "Duration ceiling",
          "source": "Under 300 ms for productivity interfaces, 180 ms ideal.",
          "poesia": "fast 150 ms and default 250 ms for interaction; slow 400 ms only for large surfaces and rare moments.",
          "decision": "ADR-018, ADR-031"
        },
        {
          "topic": "Width animation for the sidebar morph",
          "source": "Never animate layout properties.",
          "poesia": "The sidebar morph (panel to rail) animates width, a single surface on an occasional action; accepted until a transform-based morph exists. Only the labelled-panel opt-in morphs; the default rail never grows (ADR-044).",
          "decision": "ADR-018 (accepted exception, revisited in ADR-035)"
        }
      ]
    },
    "counts": {
      "atom": 26,
      "molecule": 65,
      "organism": 15
    }
  },
  "needs": [
    {
      "need": "Primary CTA",
      "answer": "`Button intent=\"primary\" emphasis=\"solid\"`",
      "components": [
        "Button"
      ]
    },
    {
      "need": "Destructive action",
      "answer": "`Button intent=\"danger\" emphasis=\"solid\"`",
      "components": [
        "Button"
      ]
    },
    {
      "need": "Quiet secondary action",
      "answer": "`Button intent=\"neutral\" emphasis=\"ghost\"`",
      "components": [
        "Button"
      ]
    },
    {
      "need": "Icon-only button",
      "answer": "`IconButton`",
      "components": [
        "IconButton"
      ]
    },
    {
      "need": "Link styled as a button",
      "answer": "`Link className={buttonVariants({ intent, variant, size })}`",
      "components": [
        "Link"
      ]
    },
    {
      "need": "Page header / section title",
      "answer": "`PageHeader` / `SectionHeader`",
      "components": [
        "PageHeader",
        "SectionHeader"
      ]
    },
    {
      "need": "Content card",
      "answer": "`Card`",
      "components": [
        "Card"
      ]
    },
    {
      "need": "KPI / metric",
      "answer": "`MetricCard`",
      "components": [
        "MetricCard"
      ]
    },
    {
      "need": "Pricing plan",
      "answer": "`PlanCard` or `PricingOption`",
      "components": [
        "PlanCard",
        "PricingOption"
      ]
    },
    {
      "need": "Empty / loading state",
      "answer": "`EmptyState` / `LoadingState` or `Skeleton`",
      "components": [
        "EmptyState",
        "LoadingState",
        "Skeleton"
      ]
    },
    {
      "need": "Inline spinner",
      "answer": "`Spinner`",
      "components": [
        "Spinner"
      ]
    },
    {
      "need": "Alert / banner",
      "answer": "`Alert tone=\"info|success|warning|danger|neutral\"`",
      "components": [
        "Alert"
      ]
    },
    {
      "need": "Ephemeral toast",
      "answer": "`Toast`",
      "components": [
        "Toast"
      ]
    },
    {
      "need": "Tooltip / popover / contextual menu",
      "answer": "`Tooltip` / `Popover` / `DropdownMenu`",
      "components": [
        "Tooltip",
        "Popover",
        "DropdownMenu"
      ]
    },
    {
      "need": "Confirmation modal / generic modal",
      "answer": "`Dialog` + `ConfirmDialogContent` / `Dialog`",
      "components": [
        "Dialog",
        "ConfirmDialogContent"
      ]
    },
    {
      "need": "Side panel",
      "answer": "`Drawer` or `Sheet`",
      "components": [
        "Drawer",
        "Sheet"
      ]
    },
    {
      "need": "Tabs / select / autocomplete",
      "answer": "`Tabs` / `Select` / `Combobox` or `SearchField`",
      "components": [
        "Tabs",
        "Select",
        "Combobox",
        "SearchField"
      ]
    },
    {
      "need": "One of a few values, all in view (range, view mode)",
      "answer": "`SegmentedControl` (two to five options; more → `Select`)",
      "components": [
        "SegmentedControl",
        "Select"
      ]
    },
    {
      "need": "Field with label + helper + error",
      "answer": "`Field` + `Input`/`Textarea`/`Select`",
      "components": [
        "Field",
        "Input",
        "Textarea",
        "Select"
      ]
    },
    {
      "need": "Group of fields",
      "answer": "`FormSection` or `InputGroup`",
      "components": [
        "FormSection",
        "InputGroup"
      ]
    },
    {
      "need": "Complex validated form",
      "answer": "`Form` organism (RHF + Zod)",
      "components": [
        "Form"
      ]
    },
    {
      "need": "Binary toggle / checkbox / radio group",
      "answer": "`Switch` (in `SettingsField` with label) / `Checkbox` / `ChoiceGroup` with `Radio`",
      "components": [
        "Switch",
        "SettingsField",
        "Checkbox",
        "ChoiceGroup",
        "Radio"
      ]
    },
    {
      "need": "OTP / 2FA code",
      "answer": "`InputOtp` (molecule)",
      "components": [
        "InputOtp"
      ]
    },
    {
      "need": "Date field / file drop / slider",
      "answer": "`DateField` / `FileDropzone` / `Slider`",
      "components": [
        "DateField",
        "FileDropzone",
        "Slider"
      ]
    },
    {
      "need": "Property list / data row / list item",
      "answer": "`PropertyList` / `DataRow` / `ListItem`",
      "components": [
        "PropertyList",
        "DataRow",
        "ListItem"
      ]
    },
    {
      "need": "Row that opens a page (settings-list disclosure)",
      "answer": "`ListItem href` (whole row is the link, trailing chevron)",
      "components": [
        "ListItem"
      ]
    },
    {
      "need": "Notification / timeline / activity item",
      "answer": "`NotificationItem` / `TimelineItem` / `ActivityItem`",
      "components": [
        "NotificationItem",
        "TimelineItem",
        "ActivityItem"
      ]
    },
    {
      "need": "Notification center",
      "answer": "`NotificationCenter`",
      "components": [
        "NotificationCenter"
      ]
    },
    {
      "need": "Feed card / infinite feed",
      "answer": "`FeedCard` / `Feed`",
      "components": [
        "FeedCard",
        "Feed"
      ]
    },
    {
      "need": "Threaded comments",
      "answer": "`CommentsThread`",
      "components": [
        "CommentsThread"
      ]
    },
    {
      "need": "Chat message / reactions",
      "answer": "`ChatBubble` / `ReactionBar`",
      "components": [
        "ChatBubble",
        "ReactionBar"
      ]
    },
    {
      "need": "Auth flow",
      "answer": "`AuthCard`",
      "components": [
        "AuthCard"
      ]
    },
    {
      "need": "Marketing / onboarding hero",
      "answer": "`Hero`",
      "components": [
        "Hero"
      ]
    },
    {
      "need": "App frame / navigation",
      "answer": "**The rail that peeks (ADR-044) — the default and the recommendation.** `PageShell` (defaults: `sidebarMode=\"rail\"`, `sidebarPresentation=\"inset\"`, `mobileNav=\"tabs\"`) + `SidebarSection aria-label` + ONE untitled `NavGroup`: home, search, the rooms, settings — same size, same gap. Wrap every `NavItem` in `PageShell.RailPeek` and compose its panel with `PageShell.PeekHeader` / `PeekFacts` / `PeekLinks`. Search is a button row opening `CommandMenu` (⌘K); settings' peek holds the quick controls; phones get `PageShell.MobileTabBar` (≤ 5). No `TopBar` in an app frame. Opt-ins only when a product needs them: the labelled panel (`sidebarMode=\"auto\"`, ⌘\\\\ collapse, ADR-040), `island`/`column` (ADR-025), the bubble (`mobileNav=\"bubble\"`)",
      "components": [
        "PageShell",
        "SidebarSection",
        "NavGroup",
        "NavItem",
        "PeekFacts",
        "PeekLinks",
        "CommandMenu",
        "TopBar"
      ]
    },
    {
      "need": "Controls that must stay in reach while the screen scrolls (filters, search, a view switch, section tabs) — or a selection's / a form's actions",
      "answer": "`PageShell.StickyBar` (ADR-045) under the `PageHeader`, `edge=\"bottom\"` for actions: at rest part of the page; pinned, it condenses onto glass and carries the page title small. One bar per edge; never hides focus",
      "components": [
        "PageShell",
        "PageHeader"
      ]
    },
    {
      "need": "Ground behind glass",
      "answer": "`Atmosphere`",
      "components": [
        "Atmosphere"
      ]
    },
    {
      "need": "Command palette",
      "answer": "`CommandMenu`",
      "components": [
        "CommandMenu"
      ]
    },
    {
      "need": "Table",
      "answer": "`DataTable`, or `TableHeader` + `TableRow` + `TablePagination`",
      "components": [
        "DataTable",
        "TableHeader",
        "TableRow",
        "TablePagination"
      ]
    },
    {
      "need": "Filters / pagination / stepper",
      "answer": "`FilterBar` / `Pagination` / `Stepper`",
      "components": [
        "FilterBar",
        "Pagination",
        "Stepper"
      ]
    },
    {
      "need": "Toolbar / split action",
      "answer": "`Toolbar` or `ActionGroup` / `SplitAction`",
      "components": [
        "Toolbar",
        "ActionGroup",
        "SplitAction"
      ]
    },
    {
      "need": "A trend in a tile or a row",
      "answer": "`Sparkline` (in `MetricCard`'s `trend` slot)",
      "components": [
        "Sparkline",
        "MetricCard"
      ]
    },
    {
      "need": "Names ranked by a value (top pages, products)",
      "answer": "`BarList`",
      "components": [
        "BarList"
      ]
    },
    {
      "need": "A chart (trend, comparison, part to whole)",
      "answer": "`Chart` with the `form` the data's job names (`dataviz.yaml`); a single number is a `MetricCard`, many classes a `DataTable`",
      "components": [
        "Chart",
        "MetricCard",
        "DataTable"
      ]
    },
    {
      "need": "Media viewer / composer / profile",
      "answer": "`MediaLightbox` / `Composer` / `ProfileHeader`",
      "components": [
        "MediaLightbox",
        "Composer",
        "ProfileHeader"
      ]
    },
    {
      "need": "Responsive grid / max-width container",
      "answer": "`Grid` / `Container`",
      "components": [
        "Grid",
        "Container"
      ]
    },
    {
      "need": "Content that overflows one axis (a strip of options, a long list in a pane)",
      "answer": "`ScrollArea` (edge fades, no heavy scrollbar)",
      "components": [
        "ScrollArea"
      ]
    },
    {
      "need": "Avatar / badge / separator / icon",
      "answer": "`Avatar` / `Badge` / `Separator` / `Icon`",
      "components": [
        "Avatar",
        "Badge",
        "Separator",
        "Icon"
      ]
    },
    {
      "need": "Text / heading / helper / code / shortcut",
      "answer": "`Text` / `Heading` / `Description` / `Code` / `Kbd`",
      "components": [
        "Text",
        "Heading",
        "Description",
        "Code",
        "Kbd"
      ]
    },
    {
      "need": "Markdown a model or an editor wrote (an answer, an article body)",
      "answer": "`Markdown` (ADR-046): atoms only, never `dangerouslySetInnerHTML`; app pieces (routing, glossary, chips) through `renderLink` / `renderMarker` / `renderText`, link policy through `allowLink`",
      "components": [
        "Markdown"
      ]
    },
    {
      "need": "Screen-reader-only text",
      "answer": "`VisuallyHidden`",
      "components": [
        "VisuallyHidden"
      ]
    }
  ],
  "components": [
    {
      "id": "avatar",
      "name": "Avatar",
      "level": "atom",
      "status": "stable",
      "purpose": "A person or entity at a glance — a photo, or initials when there is none.",
      "description": "Image-with-fallback identity primitive. Composes `@radix-ui/react-avatar` so the fallback shows while the image loads (and stays if the image errors). `alt` is required; pass `alt=\"\"` only when the avatar is decorative and the surrounding text already names the entity.",
      "role": "content",
      "import": "@rrios-forge/ui/atoms/avatar",
      "exports": [
        "Avatar",
        "avatarKindFromShape",
        "avatarVariants",
        "AVATAR_KINDS",
        "AVATAR_SHAPES",
        "AVATAR_SIZES"
      ],
      "source": "packages/ui/src/atoms/avatar",
      "axes": [
        {
          "axis": "size",
          "part": null,
          "values": [
            "sm",
            "md",
            "lg",
            "xl"
          ],
          "default": "md",
          "meaning": "Ergonomic scale, in three families (control, text, container)."
        },
        {
          "axis": "kind",
          "part": null,
          "values": [
            "person",
            "entity"
          ],
          "default": null,
          "meaning": "What an avatar stands for — a person (round) or an entity such as a workspace or brand (rounded square) (ADR-039)."
        },
        {
          "axis": "shape",
          "part": null,
          "values": [
            "circle",
            "rounded"
          ],
          "default": null,
          "meaning": "Geometry, where geometry is the meaning."
        }
      ],
      "needs": [
        {
          "need": "Avatar / badge / separator / icon",
          "answer": "`Avatar` / `Badge` / `Separator` / `Icon`"
        }
      ],
      "patterns": [],
      "a11yExceptions": [],
      "decisions": [
        {
          "id": "ADR-013",
          "title": "PageShell: mobile-nav polymorphism"
        },
        {
          "id": "ADR-014",
          "title": "PageShell: Apple Mail / macOS Big Sur visual register"
        }
      ],
      "stories": [
        {
          "name": "Playground",
          "id": "components-atoms-avatar--playground",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-atoms-avatar--playground",
          "frame": "/iframe.html?id=components-atoms-avatar--playground&viewMode=story"
        },
        {
          "name": "Sizes",
          "id": "components-atoms-avatar--sizes",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-atoms-avatar--sizes",
          "frame": "/iframe.html?id=components-atoms-avatar--sizes&viewMode=story"
        },
        {
          "name": "Kinds",
          "id": "components-atoms-avatar--kinds",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-atoms-avatar--kinds",
          "frame": "/iframe.html?id=components-atoms-avatar--kinds&viewMode=story"
        },
        {
          "name": "With image",
          "id": "components-atoms-avatar--with-image",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-atoms-avatar--with-image",
          "frame": "/iframe.html?id=components-atoms-avatar--with-image&viewMode=story"
        },
        {
          "name": "Fallback",
          "id": "components-atoms-avatar--fallback",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-atoms-avatar--fallback",
          "frame": "/iframe.html?id=components-atoms-avatar--fallback&viewMode=story"
        },
        {
          "name": "Group",
          "id": "components-atoms-avatar--group",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-atoms-avatar--group",
          "frame": "/iframe.html?id=components-atoms-avatar--group&viewMode=story"
        }
      ],
      "storyFile": "tooling/storybook/stories/components/atoms/avatar.stories.tsx"
    },
    {
      "id": "badge",
      "name": "Badge",
      "level": "atom",
      "status": "stable",
      "purpose": "A short status label, tinted by what it means: info, success, warning, danger or neutral.",
      "description": "Status label. `tone` carries the semantic charge (neutral, info, success, warning, danger); `emphasis` decides how loud the chip reads: `soft` (the default — a tint of the tone, for statuses in rows and headers), `outline`, and `solid` for the one status that must shout. Tone is reinforced by the visible label so colour is never the sole carrier of meaning.",
      "role": "status",
      "import": "@rrios-forge/ui/atoms/badge",
      "exports": [
        "Badge",
        "badgeVariants",
        "BADGE_EMPHASIS",
        "BADGE_SIZES",
        "BADGE_TONES"
      ],
      "source": "packages/ui/src/atoms/badge",
      "axes": [
        {
          "axis": "emphasis",
          "part": null,
          "values": [
            "soft",
            "outline",
            "solid"
          ],
          "default": "soft",
          "meaning": "How strongly a control or chip asserts itself, quiet to loud."
        },
        {
          "axis": "tone",
          "part": null,
          "values": [
            "neutral",
            "info",
            "success",
            "warning",
            "danger"
          ],
          "default": "neutral",
          "meaning": "Which semantic colour family the element speaks in."
        },
        {
          "axis": "size",
          "part": null,
          "values": [
            "sm",
            "md",
            "lg"
          ],
          "default": "md",
          "meaning": "Ergonomic scale, in three families (control, text, container)."
        }
      ],
      "needs": [
        {
          "need": "Avatar / badge / separator / icon",
          "answer": "`Avatar` / `Badge` / `Separator` / `Icon`"
        }
      ],
      "patterns": [],
      "a11yExceptions": [],
      "decisions": [
        {
          "id": "ADR-002",
          "title": "Component variants live in `variants.ts` and export their option metadata"
        }
      ],
      "stories": [
        {
          "name": "Playground",
          "id": "components-atoms-badge--playground",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-atoms-badge--playground",
          "frame": "/iframe.html?id=components-atoms-badge--playground&viewMode=story"
        },
        {
          "name": "Tones",
          "id": "components-atoms-badge--tones",
          "interaction": false,
          "snapshots": [
            "dark",
            "high-contrast",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-atoms-badge--tones",
          "frame": "/iframe.html?id=components-atoms-badge--tones&viewMode=story"
        },
        {
          "name": "Emphases",
          "id": "components-atoms-badge--emphases",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-atoms-badge--emphases",
          "frame": "/iframe.html?id=components-atoms-badge--emphases&viewMode=story"
        },
        {
          "name": "Sizes",
          "id": "components-atoms-badge--sizes",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-atoms-badge--sizes",
          "frame": "/iframe.html?id=components-atoms-badge--sizes&viewMode=story"
        },
        {
          "name": "In context",
          "id": "components-atoms-badge--in-context",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-atoms-badge--in-context",
          "frame": "/iframe.html?id=components-atoms-badge--in-context&viewMode=story"
        }
      ],
      "storyFile": "tooling/storybook/stories/components/atoms/badge.stories.tsx"
    },
    {
      "id": "button",
      "name": "Button",
      "level": "atom",
      "status": "stable",
      "purpose": "The action a reader takes, from the one primary call to quiet secondary ones.",
      "description": "**Purpose.** The verb of the system — a control that *commits an action* with a side effect. Buttons are how users do things; they are not how users navigate.\n\n**When to use.**\n- Submit a form, save changes, confirm a dialog, run an operation.\n- Trigger a destructive action (`intent=\"danger\"`) where the consequence is reversible only by a counter-action.\n- Open a modal, panel or other in-product surface that the user is *staying* in (the URL does not change).\n\n**When NOT to use.**\n- The control changes the URL or opens an external page → use `Link`. Buttons break right-click, middle-click, history and crawlability.\n- The control is icon-only → use `IconButton`. It enforces square hit-area, focus ring and a required `aria-label`.\n- The control is part of a segmented set with persistent selection → use `Tabs` or a `RadioGroup` styled as a toolbar.\n\n**Composes with.**\n- `Icon` (decorative leading glyph) reinforces the label without replacing it.\n- `Spinner` is rendered automatically by the Button when `loading` is true; do not place a `Spinner` inside the children.\n- `Field`, `Dialog`, `FormSection` consume Button as the commit affordance; the Button never owns submit logic itself.\n\n**Accessibility.**\n- Renders a real `<button>` element; `Enter` and `Space` activate it; tab-order participates by default.\n- `loading` sets `aria-busy=\"true\"` and disables interaction without removing the focus ring; the label remains visible to screen readers.\n- `disabled` is exposed as the native attribute and removes the control from the tab sequence.\n- Icon-only Buttons are forbidden; the `Button` API requires text children (use `IconButton` instead).\n\n**Related patterns.**\n- `Patterns/Decision Matrix · ComponentChoice` — Button vs Link vs IconButton.\n- `Patterns/Visual Priority · ActionEmphasisLadder` — primary / secondary / quiet emphasis order on a surface.\n- `Patterns/Composition · CompositionChecklist` — how Button slots into Field, Dialog and FormSection.",
      "role": "action",
      "import": "@rrios-forge/ui/atoms/button",
      "exports": [
        "Button",
        "buttonVariants",
        "BUTTON_INTENTS",
        "BUTTON_EMPHASES",
        "BUTTON_VARIANTS",
        "BUTTON_SIZES"
      ],
      "source": "packages/ui/src/atoms/button",
      "axes": [
        {
          "axis": "emphasis",
          "part": null,
          "values": [
            "solid",
            "soft",
            "outline",
            "ghost"
          ],
          "default": "solid",
          "meaning": "How strongly a control or chip asserts itself, quiet to loud."
        },
        {
          "axis": "intent",
          "part": null,
          "values": [
            "primary",
            "secondary",
            "danger",
            "neutral"
          ],
          "default": "primary",
          "meaning": "What an action does."
        },
        {
          "axis": "size",
          "part": null,
          "values": [
            "sm",
            "md",
            "lg"
          ],
          "default": "md",
          "meaning": "Ergonomic scale, in three families (control, text, container)."
        }
      ],
      "needs": [
        {
          "need": "Primary CTA",
          "answer": "`Button intent=\"primary\" emphasis=\"solid\"`"
        },
        {
          "need": "Destructive action",
          "answer": "`Button intent=\"danger\" emphasis=\"solid\"`"
        },
        {
          "need": "Quiet secondary action",
          "answer": "`Button intent=\"neutral\" emphasis=\"ghost\"`"
        }
      ],
      "patterns": [
        "Patterns/Decision Matrix · ComponentChoice",
        "Patterns/Visual Priority · ActionEmphasisLadder",
        "Patterns/Composition · CompositionChecklist"
      ],
      "a11yExceptions": [],
      "decisions": [
        {
          "id": "ADR-002",
          "title": "Component variants live in `variants.ts` and export their option metadata"
        },
        {
          "id": "ADR-003",
          "title": "Storybook editorial convention and pattern↔component bidirectionality"
        },
        {
          "id": "ADR-005",
          "title": "Visual operational rules: surfaces, interaction, motion"
        },
        {
          "id": "ADR-006",
          "title": "Geometry and typography signature"
        },
        {
          "id": "ADR-017",
          "title": "Actionable components adopt the `asChild` slot pattern for framework-aware routing"
        },
        {
          "id": "ADR-019",
          "title": "Composer organism (message/post authoring surface)"
        },
        {
          "id": "ADR-022",
          "title": "The material family: `solid` and `vibrant`"
        },
        {
          "id": "ADR-028",
          "title": "The label is not the fill"
        },
        {
          "id": "ADR-030",
          "title": "Axis vocabulary: one name, one meaning"
        },
        {
          "id": "ADR-043",
          "title": "The default theme is monochrome"
        }
      ],
      "stories": [
        {
          "name": "Playground",
          "id": "components-atoms-button--playground",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-atoms-button--playground",
          "frame": "/iframe.html?id=components-atoms-button--playground&viewMode=story"
        },
        {
          "name": "In context",
          "id": "components-atoms-button--in-context",
          "interaction": false,
          "snapshots": [
            "dark",
            "high-contrast",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-atoms-button--in-context",
          "frame": "/iframe.html?id=components-atoms-button--in-context&viewMode=story"
        },
        {
          "name": "Intents",
          "id": "components-atoms-button--intents",
          "interaction": false,
          "snapshots": [
            "dark",
            "high-contrast",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-atoms-button--intents",
          "frame": "/iframe.html?id=components-atoms-button--intents&viewMode=story"
        },
        {
          "name": "Variants",
          "id": "components-atoms-button--variants",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-atoms-button--variants",
          "frame": "/iframe.html?id=components-atoms-button--variants&viewMode=story"
        },
        {
          "name": "Sizes",
          "id": "components-atoms-button--sizes",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-atoms-button--sizes",
          "frame": "/iframe.html?id=components-atoms-button--sizes&viewMode=story"
        },
        {
          "name": "Focus (keyboard)",
          "id": "components-atoms-button--focus-visible",
          "interaction": true,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-atoms-button--focus-visible",
          "frame": "/iframe.html?id=components-atoms-button--focus-visible&viewMode=story"
        },
        {
          "name": "States",
          "id": "components-atoms-button--states",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-atoms-button--states",
          "frame": "/iframe.html?id=components-atoms-button--states&viewMode=story"
        }
      ],
      "storyFile": "tooling/storybook/stories/components/atoms/button.stories.tsx"
    },
    {
      "id": "checkbox",
      "name": "Checkbox",
      "level": "atom",
      "status": "stable",
      "purpose": "An on/off choice, with a mixed state for \"select all\".",
      "description": "Tri-state form control. Composes `@radix-ui/react-checkbox` for the ARIA contract (`role=\"checkbox\"`, `aria-checked` including the `mixed` value when indeterminate). Pair with a Label via `htmlFor` → `id`.",
      "role": "input",
      "import": "@rrios-forge/ui/atoms/checkbox",
      "exports": [
        "Checkbox",
        "checkboxVariants",
        "CHECKBOX_SIZES"
      ],
      "source": "packages/ui/src/atoms/checkbox",
      "axes": [
        {
          "axis": "size",
          "part": null,
          "values": [
            "sm",
            "md",
            "lg"
          ],
          "default": "md",
          "meaning": "Ergonomic scale, in three families (control, text, container)."
        },
        {
          "axis": "invalid",
          "part": null,
          "values": [
            "true",
            "false"
          ],
          "default": "false",
          "meaning": "Fails validation: a danger edge, announced as invalid; pair it with an error message."
        }
      ],
      "needs": [
        {
          "need": "Binary toggle / checkbox / radio group",
          "answer": "`Switch` (in `SettingsField` with label) / `Checkbox` / `ChoiceGroup` with `Radio`"
        }
      ],
      "patterns": [],
      "a11yExceptions": [],
      "decisions": [],
      "stories": [
        {
          "name": "Playground",
          "id": "components-atoms-checkbox--playground",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-atoms-checkbox--playground",
          "frame": "/iframe.html?id=components-atoms-checkbox--playground&viewMode=story"
        },
        {
          "name": "Sizes",
          "id": "components-atoms-checkbox--sizes",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-atoms-checkbox--sizes",
          "frame": "/iframe.html?id=components-atoms-checkbox--sizes&viewMode=story"
        },
        {
          "name": "States",
          "id": "components-atoms-checkbox--states",
          "interaction": false,
          "snapshots": [
            "dark",
            "high-contrast",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-atoms-checkbox--states",
          "frame": "/iframe.html?id=components-atoms-checkbox--states&viewMode=story"
        },
        {
          "name": "With label",
          "id": "components-atoms-checkbox--with-label",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-atoms-checkbox--with-label",
          "frame": "/iframe.html?id=components-atoms-checkbox--with-label&viewMode=story"
        }
      ],
      "storyFile": "tooling/storybook/stories/components/atoms/checkbox.stories.tsx"
    },
    {
      "id": "code",
      "name": "Code",
      "level": "atom",
      "status": "stable",
      "purpose": "A name from code inside a sentence: a token, a prop, an API.",
      "description": "Inline code reference. Renders a `<code>` element with the design-system mono font and a subtle muted-surface chip background. For multi-line code blocks, wrap in `<pre>` (Code itself stays inline).",
      "role": "content",
      "import": "@rrios-forge/ui/atoms/code",
      "exports": [
        "Code",
        "codeVariants",
        "CODE_SIZES",
        "CODE_TONES"
      ],
      "source": "packages/ui/src/atoms/code",
      "axes": [
        {
          "axis": "size",
          "part": null,
          "values": [
            "sm",
            "md"
          ],
          "default": "sm",
          "meaning": "Ergonomic scale, in three families (control, text, container)."
        },
        {
          "axis": "tone",
          "part": null,
          "values": [
            "neutral",
            "muted"
          ],
          "default": "neutral",
          "meaning": "Which semantic colour family the element speaks in."
        }
      ],
      "needs": [
        {
          "need": "Text / heading / helper / code / shortcut",
          "answer": "`Text` / `Heading` / `Description` / `Code` / `Kbd`"
        }
      ],
      "patterns": [],
      "a11yExceptions": [],
      "decisions": [
        {
          "id": "ADR-046",
          "title": "Markdown is painted with atoms, and apps fill its slots"
        }
      ],
      "stories": [
        {
          "name": "Playground",
          "id": "components-atoms-code--playground",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-atoms-code--playground",
          "frame": "/iframe.html?id=components-atoms-code--playground&viewMode=story"
        },
        {
          "name": "Sizes",
          "id": "components-atoms-code--sizes",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-atoms-code--sizes",
          "frame": "/iframe.html?id=components-atoms-code--sizes&viewMode=story"
        },
        {
          "name": "Tones",
          "id": "components-atoms-code--tones",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-atoms-code--tones",
          "frame": "/iframe.html?id=components-atoms-code--tones&viewMode=story"
        },
        {
          "name": "In context",
          "id": "components-atoms-code--in-context",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-atoms-code--in-context",
          "frame": "/iframe.html?id=components-atoms-code--in-context&viewMode=story"
        }
      ],
      "storyFile": "tooling/storybook/stories/components/atoms/code.stories.tsx"
    },
    {
      "id": "container",
      "name": "Container",
      "level": "atom",
      "status": "stable",
      "purpose": "Keeps a page to a readable width, from prose to fluid.",
      "description": "Page-width primitive. Picks one of the system's container widths, applies the page gutter and centers itself. Pair with `<Grid>` for the column system.",
      "role": "surface",
      "import": "@rrios-forge/ui/atoms/container",
      "exports": [
        "Container",
        "CONTAINER_PADDINGS",
        "CONTAINER_SIZES",
        "containerVariants"
      ],
      "source": "packages/ui/src/atoms/container",
      "axes": [
        {
          "axis": "size",
          "part": null,
          "values": [
            "prose",
            "sm",
            "md",
            "lg",
            "xl",
            "fluid"
          ],
          "default": "lg",
          "meaning": "Ergonomic scale, in three families (control, text, container)."
        },
        {
          "axis": "padding",
          "part": null,
          "values": [
            "none",
            "sm",
            "md",
            "lg"
          ],
          "default": "md",
          "meaning": "Inner spacing of a container."
        },
        {
          "axis": "centered",
          "part": null,
          "values": [
            "true",
            "false"
          ],
          "default": "true",
          "meaning": "Container centres itself."
        }
      ],
      "needs": [
        {
          "need": "Responsive grid / max-width container",
          "answer": "`Grid` / `Container`"
        }
      ],
      "patterns": [],
      "a11yExceptions": [],
      "decisions": [
        {
          "id": "ADR-008",
          "title": "Layout layer: refined `Grid` + new `Container`"
        },
        {
          "id": "ADR-009",
          "title": "Editorial Frame: PageShell v3 + new `TopBar` molecule"
        },
        {
          "id": "ADR-013",
          "title": "PageShell: mobile-nav polymorphism"
        },
        {
          "id": "ADR-029",
          "title": "The page gutter belongs outside the frame"
        }
      ],
      "stories": [
        {
          "name": "Playground",
          "id": "components-atoms-container--playground",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-atoms-container--playground",
          "frame": "/iframe.html?id=components-atoms-container--playground&viewMode=story"
        },
        {
          "name": "Sizes",
          "id": "components-atoms-container--sizes",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-atoms-container--sizes",
          "frame": "/iframe.html?id=components-atoms-container--sizes&viewMode=story"
        },
        {
          "name": "Prose width",
          "id": "components-atoms-container--prose",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-atoms-container--prose",
          "frame": "/iframe.html?id=components-atoms-container--prose&viewMode=story"
        },
        {
          "name": "Fluid",
          "id": "components-atoms-container--fluid",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-atoms-container--fluid",
          "frame": "/iframe.html?id=components-atoms-container--fluid&viewMode=story"
        }
      ],
      "storyFile": "tooling/storybook/stories/components/atoms/container.stories.tsx"
    },
    {
      "id": "description",
      "name": "Description",
      "level": "atom",
      "status": "stable",
      "purpose": "Quiet supporting text that explains a field or a section.",
      "description": "Supporting / helper / status copy primitive. Composition surface for Field (helper text), Alert (body), Card (subtitle), EmptyState (body) and any inline form description / error message. Polymorphic via `as`; `tone` reinforces meaning; defaults to `muted` because Description is the supporting layer below `<Text>`.",
      "role": "content",
      "import": "@rrios-forge/ui/atoms/description",
      "exports": [
        "Description",
        "descriptionVariants",
        "DESCRIPTION_ELEMENTS",
        "DESCRIPTION_SIZES",
        "DESCRIPTION_TONES"
      ],
      "source": "packages/ui/src/atoms/description",
      "axes": [
        {
          "axis": "tone",
          "part": null,
          "values": [
            "neutral",
            "muted",
            "danger",
            "success",
            "warning"
          ],
          "default": "muted",
          "meaning": "Which semantic colour family the element speaks in."
        },
        {
          "axis": "size",
          "part": null,
          "values": [
            "sm",
            "md"
          ],
          "default": "md",
          "meaning": "Ergonomic scale, in three families (control, text, container)."
        }
      ],
      "needs": [
        {
          "need": "Text / heading / helper / code / shortcut",
          "answer": "`Text` / `Heading` / `Description` / `Code` / `Kbd`"
        }
      ],
      "patterns": [],
      "a11yExceptions": [],
      "decisions": [],
      "stories": [
        {
          "name": "Playground",
          "id": "components-atoms-description--playground",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-atoms-description--playground",
          "frame": "/iframe.html?id=components-atoms-description--playground&viewMode=story"
        },
        {
          "name": "Tones",
          "id": "components-atoms-description--tones",
          "interaction": false,
          "snapshots": [
            "dark",
            "high-contrast",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-atoms-description--tones",
          "frame": "/iframe.html?id=components-atoms-description--tones&viewMode=story"
        },
        {
          "name": "Sizes",
          "id": "components-atoms-description--sizes",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-atoms-description--sizes",
          "frame": "/iframe.html?id=components-atoms-description--sizes&viewMode=story"
        },
        {
          "name": "In context",
          "id": "components-atoms-description--in-context",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-atoms-description--in-context",
          "frame": "/iframe.html?id=components-atoms-description--in-context&viewMode=story"
        },
        {
          "name": "Form description",
          "id": "components-atoms-description--form-description",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-atoms-description--form-description",
          "frame": "/iframe.html?id=components-atoms-description--form-description&viewMode=story"
        }
      ],
      "storyFile": "tooling/storybook/stories/components/atoms/description.stories.tsx"
    },
    {
      "id": "grid",
      "name": "Grid",
      "level": "atom",
      "status": "stable",
      "purpose": "Lays content out in responsive columns with system gaps.",
      "description": "Layout primitive that owns the column system. Track mode defines a fixed column count (optionally per breakpoint); fluid mode lets `auto-fit` tracks adapt to the container width using a min-track token.",
      "role": "surface",
      "import": "@rrios-forge/ui/atoms/grid",
      "exports": [
        "Grid",
        "GridItem",
        "GRID_ALIGN_X",
        "GRID_ALIGN_Y",
        "GRID_BREAKPOINTS",
        "GRID_COLUMNS",
        "GRID_GAPS",
        "GRID_ITEM_ROW_SPANS",
        "GRID_ITEM_SPANS",
        "GRID_MIN_COLUMNS",
        "GRID_MODES",
        "gridItemVariants",
        "gridVariants",
        "resolveGridColumnsClass",
        "resolveGridRowSpanClass",
        "resolveGridSpanClass"
      ],
      "source": "packages/ui/src/atoms/grid",
      "axes": [
        {
          "axis": "gap",
          "part": null,
          "values": [
            "none",
            "xs",
            "sm",
            "md",
            "lg",
            "xl"
          ],
          "default": "md",
          "meaning": "Spacing between grid items."
        },
        {
          "axis": "rowGap",
          "part": null,
          "values": [
            "none",
            "xs",
            "sm",
            "md",
            "lg",
            "xl"
          ],
          "default": "md",
          "meaning": "Spacing between grid rows."
        },
        {
          "axis": "alignX",
          "part": null,
          "values": [
            "start",
            "center",
            "end",
            "stretch"
          ],
          "default": "stretch",
          "meaning": "Inline-axis alignment of grid items."
        },
        {
          "axis": "alignY",
          "part": null,
          "values": [
            "start",
            "center",
            "end",
            "stretch",
            "baseline"
          ],
          "default": "stretch",
          "meaning": "Block-axis alignment of grid items."
        },
        {
          "axis": "dense",
          "part": null,
          "values": [
            "true",
            "false"
          ],
          "default": "false",
          "meaning": "Grid packs items densely."
        }
      ],
      "needs": [
        {
          "need": "Responsive grid / max-width container",
          "answer": "`Grid` / `Container`"
        }
      ],
      "patterns": [],
      "a11yExceptions": [],
      "decisions": [
        {
          "id": "ADR-008",
          "title": "Layout layer: refined `Grid` + new `Container`"
        }
      ],
      "stories": [
        {
          "name": "Playground",
          "id": "components-atoms-grid--playground",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-atoms-grid--playground",
          "frame": "/iframe.html?id=components-atoms-grid--playground&viewMode=story"
        },
        {
          "name": "Track — fixed columns",
          "id": "components-atoms-grid--track",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-atoms-grid--track",
          "frame": "/iframe.html?id=components-atoms-grid--track&viewMode=story"
        },
        {
          "name": "Responsive — per-breakpoint columns",
          "id": "components-atoms-grid--responsive",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-atoms-grid--responsive",
          "frame": "/iframe.html?id=components-atoms-grid--responsive&viewMode=story"
        },
        {
          "name": "Fluid — auto-fit tracks",
          "id": "components-atoms-grid--fluid",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-atoms-grid--fluid",
          "frame": "/iframe.html?id=components-atoms-grid--fluid&viewMode=story"
        },
        {
          "name": "Independent row + column gap",
          "id": "components-atoms-grid--row-gap",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-atoms-grid--row-gap",
          "frame": "/iframe.html?id=components-atoms-grid--row-gap&viewMode=story"
        },
        {
          "name": "Dense packing",
          "id": "components-atoms-grid--dense",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-atoms-grid--dense",
          "frame": "/iframe.html?id=components-atoms-grid--dense&viewMode=story"
        },
        {
          "name": "AlignX — items horizontal",
          "id": "components-atoms-grid--align-x",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-atoms-grid--align-x",
          "frame": "/iframe.html?id=components-atoms-grid--align-x&viewMode=story"
        },
        {
          "name": "Grid.Item · responsive span",
          "id": "components-atoms-grid--span-responsive",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-atoms-grid--span-responsive",
          "frame": "/iframe.html?id=components-atoms-grid--span-responsive&viewMode=story"
        },
        {
          "name": "Dashboard composition",
          "id": "components-atoms-grid--dashboard-layout",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-atoms-grid--dashboard-layout",
          "frame": "/iframe.html?id=components-atoms-grid--dashboard-layout&viewMode=story"
        },
        {
          "name": "Loading skeleton",
          "id": "components-atoms-grid--loading-state",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-atoms-grid--loading-state",
          "frame": "/iframe.html?id=components-atoms-grid--loading-state&viewMode=story"
        }
      ],
      "storyFile": "tooling/storybook/stories/components/atoms/grid.stories.tsx"
    },
    {
      "id": "heading",
      "name": "Heading",
      "level": "atom",
      "status": "stable",
      "purpose": "The title ramp, from section headings to the display serif.",
      "description": "**Purpose.** Section / page title. `as` (h1-h6) is **required** — Heading refuses to guess a document outline level. Visual `size` (sm | md | lg | display) is independent of the rendered HTML level. Pick the level for the outline; pick the size for the visual rhythm.\n\n**Size guidance** (validated by `Foundations/Identity/Display Hierarchy`):\n\n| Size | font-size | tracking | When to use |\n|---|---|---|---|\n| `sm` | 20 px | tight (-0.01em) | Card titles, in-page section heads, dense content groups |\n| `md` | 24 px | compact (-0.015em) | Sub-section heads, MetricCard values, settings sub-pages where breadcrumb already locates the user |\n| `lg` | 30 px | snug (-0.022em) | **Default app page lead** — Settings overview, Dashboard, content section pages |\n| `display` | 48 px | hero (-0.03em) | **Empty pages, marketing surfaces, hero / lead areas** where the heading is the protagonist |\n\n**Why no `6xl` (60 px).** Tested against three real surfaces (Settings header, Empty page, Dashboard lead) under `Foundations/Identity/Display Hierarchy` and rejected — no real surface needed it. The ramp is deliberately short. Extend the surrounding composition before reaching for a bigger size.\n\n**Related**: `Foundations/Identity/Overview`, ADR-006.",
      "role": "content",
      "import": "@rrios-forge/ui/atoms/heading",
      "exports": [
        "Heading",
        "headingVariants",
        "HEADING_SIZES",
        "HEADING_TONES",
        "HEADING_WEIGHTS"
      ],
      "source": "packages/ui/src/atoms/heading",
      "axes": [
        {
          "axis": "size",
          "part": null,
          "values": [
            "sm",
            "md",
            "lg",
            "display"
          ],
          "default": "md",
          "meaning": "Ergonomic scale, in three families (control, text, container)."
        },
        {
          "axis": "weight",
          "part": null,
          "values": [
            "regular",
            "medium",
            "semibold"
          ],
          "default": "semibold",
          "meaning": "Type weight within the ramp."
        },
        {
          "axis": "tone",
          "part": null,
          "values": [
            "neutral",
            "muted",
            "inverse",
            "danger"
          ],
          "default": "neutral",
          "meaning": "Which semantic colour family the element speaks in."
        }
      ],
      "needs": [
        {
          "need": "Text / heading / helper / code / shortcut",
          "answer": "`Text` / `Heading` / `Description` / `Code` / `Kbd`"
        }
      ],
      "patterns": [],
      "a11yExceptions": [],
      "decisions": [
        {
          "id": "ADR-005",
          "title": "Visual operational rules: surfaces, interaction, motion"
        },
        {
          "id": "ADR-006",
          "title": "Geometry and typography signature"
        },
        {
          "id": "ADR-014",
          "title": "PageShell: Apple Mail / macOS Big Sur visual register"
        },
        {
          "id": "ADR-046",
          "title": "Markdown is painted with atoms, and apps fill its slots"
        }
      ],
      "stories": [
        {
          "name": "Playground",
          "id": "components-atoms-heading--playground",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-atoms-heading--playground",
          "frame": "/iframe.html?id=components-atoms-heading--playground&viewMode=story"
        },
        {
          "name": "Sizes",
          "id": "components-atoms-heading--sizes",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-atoms-heading--sizes",
          "frame": "/iframe.html?id=components-atoms-heading--sizes&viewMode=story"
        },
        {
          "name": "Levels",
          "id": "components-atoms-heading--levels",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-atoms-heading--levels",
          "frame": "/iframe.html?id=components-atoms-heading--levels&viewMode=story"
        },
        {
          "name": "Tones",
          "id": "components-atoms-heading--tones",
          "interaction": false,
          "snapshots": [
            "dark",
            "high-contrast",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-atoms-heading--tones",
          "frame": "/iframe.html?id=components-atoms-heading--tones&viewMode=story"
        },
        {
          "name": "In context",
          "id": "components-atoms-heading--in-context",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-atoms-heading--in-context",
          "frame": "/iframe.html?id=components-atoms-heading--in-context&viewMode=story"
        }
      ],
      "storyFile": "tooling/storybook/stories/components/atoms/heading.stories.tsx"
    },
    {
      "id": "icon",
      "name": "Icon",
      "level": "atom",
      "status": "stable",
      "purpose": "A small symbol sized to sit beside text, in the colour of its words.",
      "description": "Generic SVG wrapper that gives icons a predictable size, alignment and accessibility contract. Color follows `currentColor`; no icon library is bundled.",
      "role": "content",
      "import": "@rrios-forge/ui/atoms/icon",
      "exports": [
        "Icon",
        "iconVariants",
        "ICON_SIZES"
      ],
      "source": "packages/ui/src/atoms/icon",
      "axes": [
        {
          "axis": "size",
          "part": null,
          "values": [
            "sm",
            "md",
            "lg"
          ],
          "default": "md",
          "meaning": "Ergonomic scale, in three families (control, text, container)."
        }
      ],
      "needs": [
        {
          "need": "Avatar / badge / separator / icon",
          "answer": "`Avatar` / `Badge` / `Separator` / `Icon`"
        }
      ],
      "patterns": [],
      "a11yExceptions": [],
      "decisions": [
        {
          "id": "ADR-002",
          "title": "Component variants live in `variants.ts` and export their option metadata"
        }
      ],
      "stories": [
        {
          "name": "Playground",
          "id": "components-atoms-icon--playground",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-atoms-icon--playground",
          "frame": "/iframe.html?id=components-atoms-icon--playground&viewMode=story"
        },
        {
          "name": "Sizes",
          "id": "components-atoms-icon--sizes",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-atoms-icon--sizes",
          "frame": "/iframe.html?id=components-atoms-icon--sizes&viewMode=story"
        },
        {
          "name": "Inherits currentColor",
          "id": "components-atoms-icon--inherits-current-color",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-atoms-icon--inherits-current-color",
          "frame": "/iframe.html?id=components-atoms-icon--inherits-current-color&viewMode=story"
        },
        {
          "name": "Accessibility",
          "id": "components-atoms-icon--accessibility",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-atoms-icon--accessibility",
          "frame": "/iframe.html?id=components-atoms-icon--accessibility&viewMode=story"
        }
      ],
      "storyFile": "tooling/storybook/stories/components/atoms/icon.stories.tsx"
    },
    {
      "id": "icon-button",
      "name": "IconButton",
      "level": "atom",
      "status": "stable",
      "purpose": "An action shown as a single symbol, with a name for screen readers.",
      "description": "Icon-only action with a guaranteed accessible name. `aria-label` is type-required. Composes Button so every Button intent / emphasis / state behaviour propagates; the geometry is IconButton's own (a circle on the control-height scale, sm | md | lg, with a 44 px touch hit-area). The standard icon button is quiet — `intent=\"neutral\"`, `emphasis=\"ghost\"`, the defaults — and keeps its glyph monochrome; tint the glyph only for `danger`, and reserve the solid accent for the one primary action of a surface.",
      "role": "action",
      "import": "@rrios-forge/ui/atoms/icon-button",
      "exports": [
        "IconButton",
        "ICON_BUTTON_EMPHASES",
        "ICON_BUTTON_INTENTS",
        "ICON_BUTTON_SIZE_CLASSES",
        "ICON_BUTTON_SIZES",
        "ICON_BUTTON_VARIANTS"
      ],
      "source": "packages/ui/src/atoms/icon-button",
      "axes": [
        {
          "axis": "size",
          "part": null,
          "values": [
            "sm",
            "md",
            "lg"
          ],
          "default": null,
          "meaning": "Ergonomic scale, in three families (control, text, container)."
        },
        {
          "axis": "intent",
          "part": null,
          "values": [
            "primary",
            "secondary",
            "danger",
            "neutral"
          ],
          "default": null,
          "meaning": "What an action does."
        },
        {
          "axis": "emphasis",
          "part": null,
          "values": [
            "solid",
            "soft",
            "outline",
            "ghost"
          ],
          "default": null,
          "meaning": "How strongly a control or chip asserts itself, quiet to loud."
        }
      ],
      "needs": [
        {
          "need": "Icon-only button",
          "answer": "`IconButton`"
        }
      ],
      "patterns": [],
      "a11yExceptions": [],
      "decisions": [
        {
          "id": "ADR-003",
          "title": "Storybook editorial convention and pattern↔component bidirectionality"
        },
        {
          "id": "ADR-005",
          "title": "Visual operational rules: surfaces, interaction, motion"
        },
        {
          "id": "ADR-013",
          "title": "PageShell: mobile-nav polymorphism"
        },
        {
          "id": "ADR-014",
          "title": "PageShell: Apple Mail / macOS Big Sur visual register"
        },
        {
          "id": "ADR-016",
          "title": "NotificationCenter v2: Popover → Drawer + Provider/Hooks"
        },
        {
          "id": "ADR-017",
          "title": "Actionable components adopt the `asChild` slot pattern for framework-aware routing"
        },
        {
          "id": "ADR-030",
          "title": "Axis vocabulary: one name, one meaning"
        }
      ],
      "stories": [
        {
          "name": "Playground",
          "id": "components-atoms-iconbutton--playground",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-atoms-iconbutton--playground",
          "frame": "/iframe.html?id=components-atoms-iconbutton--playground&viewMode=story"
        },
        {
          "name": "Intents",
          "id": "components-atoms-iconbutton--intents",
          "interaction": false,
          "snapshots": [
            "dark",
            "high-contrast",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-atoms-iconbutton--intents",
          "frame": "/iframe.html?id=components-atoms-iconbutton--intents&viewMode=story"
        },
        {
          "name": "Variants",
          "id": "components-atoms-iconbutton--variants",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-atoms-iconbutton--variants",
          "frame": "/iframe.html?id=components-atoms-iconbutton--variants&viewMode=story"
        },
        {
          "name": "Sizes",
          "id": "components-atoms-iconbutton--sizes",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-atoms-iconbutton--sizes",
          "frame": "/iframe.html?id=components-atoms-iconbutton--sizes&viewMode=story"
        },
        {
          "name": "States",
          "id": "components-atoms-iconbutton--states",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-atoms-iconbutton--states",
          "frame": "/iframe.html?id=components-atoms-iconbutton--states&viewMode=story"
        }
      ],
      "storyFile": "tooling/storybook/stories/components/atoms/icon-button.stories.tsx"
    },
    {
      "id": "input",
      "name": "Input",
      "level": "atom",
      "status": "stable",
      "purpose": "A single line where people type text, with a clear invalid state.",
      "description": "Native `<input>` with semantic sizing and an `invalid` state. Composes with Label via `id` / `htmlFor` and is the building block the Field molecule will compose later. The `invalid` prop drives both the visible danger ring and `aria-invalid`; meaning never relies on colour alone — pair it with a visible error message via `aria-describedby`.",
      "role": "input",
      "import": "@rrios-forge/ui/atoms/input",
      "exports": [
        "Input",
        "inputVariants",
        "INPUT_SIZES"
      ],
      "source": "packages/ui/src/atoms/input",
      "axes": [
        {
          "axis": "size",
          "part": null,
          "values": [
            "sm",
            "md",
            "lg"
          ],
          "default": "md",
          "meaning": "Ergonomic scale, in three families (control, text, container)."
        },
        {
          "axis": "invalid",
          "part": null,
          "values": [
            "true",
            "false"
          ],
          "default": "false",
          "meaning": "Fails validation: a danger edge, announced as invalid; pair it with an error message."
        }
      ],
      "needs": [
        {
          "need": "Field with label + helper + error",
          "answer": "`Field` + `Input`/`Textarea`/`Select`"
        }
      ],
      "patterns": [],
      "a11yExceptions": [],
      "decisions": [
        {
          "id": "ADR-002",
          "title": "Component variants live in `variants.ts` and export their option metadata"
        }
      ],
      "stories": [
        {
          "name": "Playground",
          "id": "components-atoms-input--playground",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-atoms-input--playground",
          "frame": "/iframe.html?id=components-atoms-input--playground&viewMode=story"
        },
        {
          "name": "Sizes",
          "id": "components-atoms-input--sizes",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-atoms-input--sizes",
          "frame": "/iframe.html?id=components-atoms-input--sizes&viewMode=story"
        },
        {
          "name": "States",
          "id": "components-atoms-input--states",
          "interaction": false,
          "snapshots": [
            "dark",
            "high-contrast",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-atoms-input--states",
          "frame": "/iframe.html?id=components-atoms-input--states&viewMode=story"
        },
        {
          "name": "Invalid",
          "id": "components-atoms-input--invalid",
          "interaction": false,
          "snapshots": [
            "dark",
            "high-contrast",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-atoms-input--invalid",
          "frame": "/iframe.html?id=components-atoms-input--invalid&viewMode=story"
        },
        {
          "name": "With label",
          "id": "components-atoms-input--with-label",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-atoms-input--with-label",
          "frame": "/iframe.html?id=components-atoms-input--with-label&viewMode=story"
        },
        {
          "name": "Disabled and read-only",
          "id": "components-atoms-input--disabled-and-readonly",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-atoms-input--disabled-and-readonly",
          "frame": "/iframe.html?id=components-atoms-input--disabled-and-readonly&viewMode=story"
        }
      ],
      "storyFile": "tooling/storybook/stories/components/atoms/input.stories.tsx"
    },
    {
      "id": "kbd",
      "name": "Kbd",
      "level": "atom",
      "status": "stable",
      "purpose": "A keyboard shortcut, set as keys — like the ⌘K that opens search.",
      "description": "Keyboard-key glyph. Renders a `<kbd>` element styled as a key cap. Use for shortcuts in command palettes, tooltips and onboarding copy. For combos pass `keys` (`<Kbd keys={[\"⌘\", \"K\"]} />`): one cap per key, side by side, no `+` between them.",
      "role": "status",
      "import": "@rrios-forge/ui/atoms/kbd",
      "exports": [
        "Kbd",
        "kbdVariants",
        "KBD_SIZES"
      ],
      "source": "packages/ui/src/atoms/kbd",
      "axes": [
        {
          "axis": "size",
          "part": null,
          "values": [
            "sm",
            "md"
          ],
          "default": "sm",
          "meaning": "Ergonomic scale, in three families (control, text, container)."
        }
      ],
      "needs": [
        {
          "need": "Text / heading / helper / code / shortcut",
          "answer": "`Text` / `Heading` / `Description` / `Code` / `Kbd`"
        }
      ],
      "patterns": [],
      "a11yExceptions": [],
      "decisions": [
        {
          "id": "ADR-009",
          "title": "Editorial Frame: PageShell v3 + new `TopBar` molecule"
        }
      ],
      "stories": [
        {
          "name": "Playground",
          "id": "components-atoms-kbd--playground",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-atoms-kbd--playground",
          "frame": "/iframe.html?id=components-atoms-kbd--playground&viewMode=story"
        },
        {
          "name": "Sizes",
          "id": "components-atoms-kbd--sizes",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-atoms-kbd--sizes",
          "frame": "/iframe.html?id=components-atoms-kbd--sizes&viewMode=story"
        },
        {
          "name": "Combos",
          "id": "components-atoms-kbd--combos",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-atoms-kbd--combos",
          "frame": "/iframe.html?id=components-atoms-kbd--combos&viewMode=story"
        },
        {
          "name": "In context",
          "id": "components-atoms-kbd--in-context",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-atoms-kbd--in-context",
          "frame": "/iframe.html?id=components-atoms-kbd--in-context&viewMode=story"
        }
      ],
      "storyFile": "tooling/storybook/stories/components/atoms/kbd.stories.tsx"
    },
    {
      "id": "label",
      "name": "Label",
      "level": "atom",
      "status": "stable",
      "purpose": "Names a form control and marks it as required.",
      "description": "Accessible label for a form control. Renders a real `<label>`. The `required` indicator is the conventional `*` (quiet `content-muted`, danger only once the owning Field is invalid) plus an `sr-only` 'required' message — meaning is never carried by colour alone. `size` mirrors the field: `lg` sets 16 px next to a large Input.",
      "role": "input",
      "import": "@rrios-forge/ui/atoms/label",
      "exports": [
        "Label",
        "labelVariants",
        "LABEL_SIZES"
      ],
      "source": "packages/ui/src/atoms/label",
      "axes": [
        {
          "axis": "size",
          "part": null,
          "values": [
            "sm",
            "md",
            "lg"
          ],
          "default": "md",
          "meaning": "Ergonomic scale, in three families (control, text, container)."
        },
        {
          "axis": "disabled",
          "part": null,
          "values": [
            "true",
            "false"
          ],
          "default": "false",
          "meaning": "Not available: dimmed, skipped by the keyboard, ignores the pointer."
        }
      ],
      "needs": [],
      "patterns": [],
      "a11yExceptions": [],
      "decisions": [
        {
          "id": "ADR-002",
          "title": "Component variants live in `variants.ts` and export their option metadata"
        }
      ],
      "stories": [
        {
          "name": "Playground",
          "id": "components-atoms-label--playground",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-atoms-label--playground",
          "frame": "/iframe.html?id=components-atoms-label--playground&viewMode=story"
        },
        {
          "name": "States",
          "id": "components-atoms-label--states",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-atoms-label--states",
          "frame": "/iframe.html?id=components-atoms-label--states&viewMode=story"
        },
        {
          "name": "Sizes",
          "id": "components-atoms-label--sizes",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-atoms-label--sizes",
          "frame": "/iframe.html?id=components-atoms-label--sizes&viewMode=story"
        },
        {
          "name": "Paired with a control",
          "id": "components-atoms-label--paired-with-control",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-atoms-label--paired-with-control",
          "frame": "/iframe.html?id=components-atoms-label--paired-with-control&viewMode=story"
        },
        {
          "name": "Disabled control",
          "id": "components-atoms-label--disabled-pair",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-atoms-label--disabled-pair",
          "frame": "/iframe.html?id=components-atoms-label--disabled-pair&viewMode=story"
        }
      ],
      "storyFile": "tooling/storybook/stories/components/atoms/label.stories.tsx"
    },
    {
      "id": "link",
      "name": "Link",
      "level": "atom",
      "status": "stable",
      "purpose": "Takes the reader to another page, within a sentence or on its own.",
      "description": "Accessible navigation/text action. `presentation` controls the underline rule (`inline` links flow and wrap with the sentence; the underline is quiet at rest and full on hover — hover never fades the colour); `tone` controls colour emphasis. Distinguishability never relies on colour alone — focus ring + underline carry the signal. External links show an arrow icon outside the underline plus an sr-only hint.",
      "role": "navigation",
      "import": "@rrios-forge/ui/atoms/link",
      "exports": [
        "Link",
        "linkVariants",
        "LINK_PRESENTATIONS",
        "LINK_TINT",
        "LINK_TONES",
        "LINK_VARIANTS"
      ],
      "source": "packages/ui/src/atoms/link",
      "axes": [
        {
          "axis": "presentation",
          "part": null,
          "values": [
            "inline",
            "standalone",
            "subtle"
          ],
          "default": "inline",
          "meaning": "How the same thing is staged."
        },
        {
          "axis": "tone",
          "part": null,
          "values": [
            "neutral",
            "muted",
            "danger"
          ],
          "default": null,
          "meaning": "Which semantic colour family the element speaks in."
        }
      ],
      "needs": [
        {
          "need": "Link styled as a button",
          "answer": "`Link className={buttonVariants({ intent, variant, size })}`"
        }
      ],
      "patterns": [],
      "a11yExceptions": [],
      "decisions": [
        {
          "id": "ADR-002",
          "title": "Component variants live in `variants.ts` and export their option metadata"
        },
        {
          "id": "ADR-017",
          "title": "Actionable components adopt the `asChild` slot pattern for framework-aware routing"
        },
        {
          "id": "ADR-028",
          "title": "The label is not the fill"
        },
        {
          "id": "ADR-046",
          "title": "Markdown is painted with atoms, and apps fill its slots"
        }
      ],
      "stories": [
        {
          "name": "Playground",
          "id": "components-atoms-link--playground",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-atoms-link--playground",
          "frame": "/iframe.html?id=components-atoms-link--playground&viewMode=story"
        },
        {
          "name": "Variants",
          "id": "components-atoms-link--variants",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-atoms-link--variants",
          "frame": "/iframe.html?id=components-atoms-link--variants&viewMode=story"
        },
        {
          "name": "Tones",
          "id": "components-atoms-link--tones",
          "interaction": false,
          "snapshots": [
            "dark",
            "high-contrast",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-atoms-link--tones",
          "frame": "/iframe.html?id=components-atoms-link--tones&viewMode=story"
        },
        {
          "name": "External",
          "id": "components-atoms-link--external",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-atoms-link--external",
          "frame": "/iframe.html?id=components-atoms-link--external&viewMode=story"
        },
        {
          "name": "Focus state",
          "id": "components-atoms-link--focus-state",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-atoms-link--focus-state",
          "frame": "/iframe.html?id=components-atoms-link--focus-state&viewMode=story"
        },
        {
          "name": "asChild · framework Link",
          "id": "components-atoms-link--as-child-with-link",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-atoms-link--as-child-with-link",
          "frame": "/iframe.html?id=components-atoms-link--as-child-with-link&viewMode=story"
        },
        {
          "name": "asChild · prevents browser navigation",
          "id": "components-atoms-link--as-child-prevents-navigation",
          "interaction": true,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-atoms-link--as-child-prevents-navigation",
          "frame": "/iframe.html?id=components-atoms-link--as-child-prevents-navigation&viewMode=story"
        }
      ],
      "storyFile": "tooling/storybook/stories/components/atoms/link.stories.tsx"
    },
    {
      "id": "progress",
      "name": "Progress",
      "level": "atom",
      "status": "stable",
      "purpose": "How far a task has got, as a bar.",
      "description": "Semantic progress bar. Composes `@radix-ui/react-progress` for the ARIA contract (`role=\"progressbar\"`, `aria-valuenow` / `aria-valuemin` / `aria-valuemax`). `value={null}` flips to the indeterminate state. `tone` reinforces meaning when the progress represents a specific state (success / warning / danger).",
      "role": "status",
      "import": "@rrios-forge/ui/atoms/progress",
      "exports": [
        "Progress",
        "progressVariants",
        "PROGRESS_INDICATOR_TONE_CLASSES",
        "PROGRESS_SIZES",
        "PROGRESS_TONES"
      ],
      "source": "packages/ui/src/atoms/progress",
      "axes": [
        {
          "axis": "size",
          "part": null,
          "values": [
            "sm",
            "md",
            "lg"
          ],
          "default": "md",
          "meaning": "Ergonomic scale, in three families (control, text, container)."
        }
      ],
      "needs": [],
      "patterns": [],
      "a11yExceptions": [],
      "decisions": [],
      "stories": [
        {
          "name": "Playground",
          "id": "components-atoms-progress--playground",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-atoms-progress--playground",
          "frame": "/iframe.html?id=components-atoms-progress--playground&viewMode=story"
        },
        {
          "name": "Sizes",
          "id": "components-atoms-progress--sizes",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-atoms-progress--sizes",
          "frame": "/iframe.html?id=components-atoms-progress--sizes&viewMode=story"
        },
        {
          "name": "Tones",
          "id": "components-atoms-progress--tones",
          "interaction": false,
          "snapshots": [
            "dark",
            "high-contrast",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-atoms-progress--tones",
          "frame": "/iframe.html?id=components-atoms-progress--tones&viewMode=story"
        },
        {
          "name": "Indeterminate",
          "id": "components-atoms-progress--indeterminate",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-atoms-progress--indeterminate",
          "frame": "/iframe.html?id=components-atoms-progress--indeterminate&viewMode=story"
        }
      ],
      "storyFile": "tooling/storybook/stories/components/atoms/progress.stories.tsx"
    },
    {
      "id": "radio",
      "name": "Radio",
      "level": "atom",
      "status": "stable",
      "purpose": "One choice out of a few, shown together in a group.",
      "description": "Single-choice selector inside a RadioGroup. Composes `@radix-ui/react-radio-group`: the group owns the roving tabindex (arrow keys move between items) and the group `aria-labelledby`. Pair every Radio with a Label via `htmlFor` → `id`.",
      "role": "input",
      "import": "@rrios-forge/ui/atoms/radio",
      "exports": [
        "Radio",
        "RadioGroup",
        "radioVariants",
        "RADIO_INDICATOR_CLASSES",
        "RADIO_SIZES"
      ],
      "source": "packages/ui/src/atoms/radio",
      "axes": [
        {
          "axis": "size",
          "part": null,
          "values": [
            "sm",
            "md",
            "lg"
          ],
          "default": "md",
          "meaning": "Ergonomic scale, in three families (control, text, container)."
        },
        {
          "axis": "invalid",
          "part": null,
          "values": [
            "true",
            "false"
          ],
          "default": "false",
          "meaning": "Fails validation: a danger edge, announced as invalid; pair it with an error message."
        }
      ],
      "needs": [
        {
          "need": "Binary toggle / checkbox / radio group",
          "answer": "`Switch` (in `SettingsField` with label) / `Checkbox` / `ChoiceGroup` with `Radio`"
        }
      ],
      "patterns": [],
      "a11yExceptions": [],
      "decisions": [],
      "stories": [
        {
          "name": "Playground",
          "id": "components-atoms-radio--playground",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-atoms-radio--playground",
          "frame": "/iframe.html?id=components-atoms-radio--playground&viewMode=story"
        },
        {
          "name": "Sizes",
          "id": "components-atoms-radio--sizes",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-atoms-radio--sizes",
          "frame": "/iframe.html?id=components-atoms-radio--sizes&viewMode=story"
        },
        {
          "name": "States",
          "id": "components-atoms-radio--states",
          "interaction": false,
          "snapshots": [
            "dark",
            "high-contrast",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-atoms-radio--states",
          "frame": "/iframe.html?id=components-atoms-radio--states&viewMode=story"
        },
        {
          "name": "Group",
          "id": "components-atoms-radio--group",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-atoms-radio--group",
          "frame": "/iframe.html?id=components-atoms-radio--group&viewMode=story"
        }
      ],
      "storyFile": "tooling/storybook/stories/components/atoms/radio.stories.tsx"
    },
    {
      "id": "separator",
      "name": "Separator",
      "level": "atom",
      "status": "stable",
      "purpose": "A quiet line that divides content, across or along.",
      "description": "Semantic divider line. Composes `@radix-ui/react-separator` so the ARIA contract is right by construction (`role=\"separator\"` + `aria-orientation` when meaningful, `aria-hidden` when decorative). Visually a 1 px line in `boundary.default`.",
      "role": "boundary",
      "import": "@rrios-forge/ui/atoms/separator",
      "exports": [
        "Separator",
        "separatorVariants",
        "SEPARATOR_ORIENTATIONS"
      ],
      "source": "packages/ui/src/atoms/separator",
      "axes": [
        {
          "axis": "orientation",
          "part": null,
          "values": [
            "horizontal",
            "vertical"
          ],
          "default": "horizontal",
          "meaning": "The direction the parts run: a row (horizontal) or a column (vertical); responsive stacks on phones and runs in a row from sm."
        }
      ],
      "needs": [
        {
          "need": "Avatar / badge / separator / icon",
          "answer": "`Avatar` / `Badge` / `Separator` / `Icon`"
        }
      ],
      "patterns": [],
      "a11yExceptions": [],
      "decisions": [],
      "stories": [
        {
          "name": "Playground",
          "id": "components-atoms-separator--playground",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-atoms-separator--playground",
          "frame": "/iframe.html?id=components-atoms-separator--playground&viewMode=story"
        },
        {
          "name": "Orientations",
          "id": "components-atoms-separator--orientations",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-atoms-separator--orientations",
          "frame": "/iframe.html?id=components-atoms-separator--orientations&viewMode=story"
        },
        {
          "name": "In context",
          "id": "components-atoms-separator--in-context",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-atoms-separator--in-context",
          "frame": "/iframe.html?id=components-atoms-separator--in-context&viewMode=story"
        }
      ],
      "storyFile": "tooling/storybook/stories/components/atoms/separator.stories.tsx"
    },
    {
      "id": "skeleton",
      "name": "Skeleton",
      "level": "atom",
      "status": "stable",
      "purpose": "Loading shimmer placeholder.",
      "description": "Loading placeholder. Uses the translucent `bg-fill-muted` (reads on white, content material and glass) + `animate-pulse`. The `text` shape is a 12 px bar in a 20 px line box; `lines` renders a paragraph whose last line is shorter. Always `aria-hidden`; the actual loading announcement lives on the surrounding region (e.g. a wrapping `role=\"status\"` or an adjacent Spinner with a label).",
      "role": "status",
      "import": "@rrios-forge/ui/atoms/skeleton",
      "exports": [
        "Skeleton",
        "skeletonVariants",
        "SKELETON_SHAPES"
      ],
      "source": "packages/ui/src/atoms/skeleton",
      "axes": [
        {
          "axis": "shape",
          "part": null,
          "values": [
            "text",
            "rectangle",
            "circle"
          ],
          "default": "text",
          "meaning": "Geometry, where geometry is the meaning."
        }
      ],
      "needs": [
        {
          "need": "Empty / loading state",
          "answer": "`EmptyState` / `LoadingState` or `Skeleton`"
        }
      ],
      "patterns": [],
      "a11yExceptions": [],
      "decisions": [],
      "stories": [
        {
          "name": "Playground",
          "id": "components-atoms-skeleton--playground",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-atoms-skeleton--playground",
          "frame": "/iframe.html?id=components-atoms-skeleton--playground&viewMode=story"
        },
        {
          "name": "Shapes",
          "id": "components-atoms-skeleton--shapes",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-atoms-skeleton--shapes",
          "frame": "/iframe.html?id=components-atoms-skeleton--shapes&viewMode=story"
        },
        {
          "name": "In context",
          "id": "components-atoms-skeleton--in-context",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-atoms-skeleton--in-context",
          "frame": "/iframe.html?id=components-atoms-skeleton--in-context&viewMode=story"
        }
      ],
      "storyFile": "tooling/storybook/stories/components/atoms/skeleton.stories.tsx"
    },
    {
      "id": "sparkline",
      "name": "Sparkline",
      "level": "atom",
      "status": "stable",
      "purpose": "A trend in one line, with the current value marked.",
      "description": "A trend without axes, for a MetricCard or a table cell. The line wears the subtle content tone; only the current value — the last point — wears a series colour. `label` is required: it is the accessible name, read with the latest value. No tooltip, no draw-in animation (ADR-035). For axes and exact values use Chart.",
      "role": "content",
      "import": "@rrios-forge/ui/atoms/sparkline",
      "exports": [
        "Sparkline",
        "sparklineVariants",
        "SPARKLINE_SIZES"
      ],
      "source": "packages/ui/src/atoms/sparkline",
      "axes": [
        {
          "axis": "size",
          "part": null,
          "values": [
            "sm",
            "md",
            "lg"
          ],
          "default": "md",
          "meaning": "Ergonomic scale, in three families (control, text, container)."
        }
      ],
      "needs": [
        {
          "need": "A trend in a tile or a row",
          "answer": "`Sparkline` (in `MetricCard`'s `trend` slot)"
        }
      ],
      "patterns": [],
      "a11yExceptions": [],
      "decisions": [
        {
          "id": "ADR-036",
          "title": "Data visualization: colour roles, a grammar, and three components on plain SVG"
        }
      ],
      "stories": [
        {
          "name": "Playground",
          "id": "components-atoms-sparkline--playground",
          "interaction": false,
          "snapshots": [
            "dark",
            "high-contrast",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-atoms-sparkline--playground",
          "frame": "/iframe.html?id=components-atoms-sparkline--playground&viewMode=story"
        },
        {
          "name": "Sizes",
          "id": "components-atoms-sparkline--sizes",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-atoms-sparkline--sizes",
          "frame": "/iframe.html?id=components-atoms-sparkline--sizes&viewMode=story"
        },
        {
          "name": "With gaps",
          "id": "components-atoms-sparkline--with-gaps",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-atoms-sparkline--with-gaps",
          "frame": "/iframe.html?id=components-atoms-sparkline--with-gaps&viewMode=story"
        },
        {
          "name": "In a MetricCard",
          "id": "components-atoms-sparkline--in-metric-card",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-atoms-sparkline--in-metric-card",
          "frame": "/iframe.html?id=components-atoms-sparkline--in-metric-card&viewMode=story"
        }
      ],
      "storyFile": "tooling/storybook/stories/components/atoms/sparkline.stories.tsx"
    },
    {
      "id": "spinner",
      "name": "Spinner",
      "level": "atom",
      "status": "stable",
      "purpose": "Indeterminate progress glyph.",
      "description": "In-flight feedback. Eight spokes stepping round (Apple's activity indicator); under reduced motion they stay put and pulse in opacity. A neutral grey by default — a loader is not an action, so it never wears the accent. When not decorative it is a `role=\"status\"` live region whose `label` is rendered inside it as visually hidden text (live regions announce content, not `aria-label`); pass `decorative` when a parent already announces the in-flight state (e.g. `<Button loading>`), and `tone=\"inherit\"` to take the parent's colour.",
      "role": "status",
      "import": "@rrios-forge/ui/atoms/spinner",
      "exports": [
        "Spinner",
        "spinnerVariants",
        "SPINNER_GLYPH_CLASSES",
        "SPINNER_SIZES",
        "SPINNER_TONES"
      ],
      "source": "packages/ui/src/atoms/spinner",
      "axes": [
        {
          "axis": "size",
          "part": null,
          "values": [
            "sm",
            "md",
            "lg"
          ],
          "default": "md",
          "meaning": "Ergonomic scale, in three families (control, text, container)."
        },
        {
          "axis": "tone",
          "part": null,
          "values": [
            "neutral",
            "muted",
            "inverse",
            "danger"
          ],
          "default": "neutral",
          "meaning": "Which semantic colour family the element speaks in."
        }
      ],
      "needs": [
        {
          "need": "Inline spinner",
          "answer": "`Spinner`"
        }
      ],
      "patterns": [],
      "a11yExceptions": [],
      "decisions": [],
      "stories": [
        {
          "name": "Playground",
          "id": "components-atoms-spinner--playground",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-atoms-spinner--playground",
          "frame": "/iframe.html?id=components-atoms-spinner--playground&viewMode=story"
        },
        {
          "name": "Sizes",
          "id": "components-atoms-spinner--sizes",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-atoms-spinner--sizes",
          "frame": "/iframe.html?id=components-atoms-spinner--sizes&viewMode=story"
        },
        {
          "name": "Tones",
          "id": "components-atoms-spinner--tones",
          "interaction": false,
          "snapshots": [
            "dark",
            "high-contrast",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-atoms-spinner--tones",
          "frame": "/iframe.html?id=components-atoms-spinner--tones&viewMode=story"
        },
        {
          "name": "Inline with text",
          "id": "components-atoms-spinner--inline-with-text",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-atoms-spinner--inline-with-text",
          "frame": "/iframe.html?id=components-atoms-spinner--inline-with-text&viewMode=story"
        }
      ],
      "storyFile": "tooling/storybook/stories/components/atoms/spinner.stories.tsx"
    },
    {
      "id": "switch",
      "name": "Switch",
      "level": "atom",
      "status": "stable",
      "purpose": "Turns a setting on or off, applied at once.",
      "description": "Binary on/off toggle for instant changes. Composes `@radix-ui/react-switch` (`role=\"switch\"`, `aria-checked`). Use Switch for changes that apply the moment the user toggles; use Checkbox for choices that apply on submit.",
      "role": "input",
      "import": "@rrios-forge/ui/atoms/switch",
      "exports": [
        "Switch",
        "switchVariants",
        "SWITCH_SIZES",
        "SWITCH_THUMB_CLASSES"
      ],
      "source": "packages/ui/src/atoms/switch",
      "axes": [
        {
          "axis": "size",
          "part": null,
          "values": [
            "sm",
            "md",
            "lg"
          ],
          "default": "md",
          "meaning": "Ergonomic scale, in three families (control, text, container)."
        }
      ],
      "needs": [
        {
          "need": "Binary toggle / checkbox / radio group",
          "answer": "`Switch` (in `SettingsField` with label) / `Checkbox` / `ChoiceGroup` with `Radio`"
        }
      ],
      "patterns": [],
      "a11yExceptions": [],
      "decisions": [
        {
          "id": "ADR-037",
          "title": "Continuity motion: a decelerating curve, a travelling indicator, view transitions and the SegmentedControl"
        }
      ],
      "stories": [
        {
          "name": "Playground",
          "id": "components-atoms-switch--playground",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-atoms-switch--playground",
          "frame": "/iframe.html?id=components-atoms-switch--playground&viewMode=story"
        },
        {
          "name": "Sizes",
          "id": "components-atoms-switch--sizes",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-atoms-switch--sizes",
          "frame": "/iframe.html?id=components-atoms-switch--sizes&viewMode=story"
        },
        {
          "name": "States",
          "id": "components-atoms-switch--states",
          "interaction": false,
          "snapshots": [
            "dark",
            "high-contrast",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-atoms-switch--states",
          "frame": "/iframe.html?id=components-atoms-switch--states&viewMode=story"
        },
        {
          "name": "With label",
          "id": "components-atoms-switch--with-label",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-atoms-switch--with-label",
          "frame": "/iframe.html?id=components-atoms-switch--with-label&viewMode=story"
        }
      ],
      "storyFile": "tooling/storybook/stories/components/atoms/switch.stories.tsx"
    },
    {
      "id": "text",
      "name": "Text",
      "level": "atom",
      "status": "stable",
      "purpose": "Body text in the system's sizes and tones.",
      "description": "Prose primitive. `as` picks the semantic element (default `<p>`); `size`, `weight`, `tone` and `numeric` are independent visual axes. The size axis maps to the caption / body-sm / body / body-lg roles in `Foundations/Typography`. `size=\"inherit\"` / `tone=\"inherit\"` follow the parent (inside a control or a badge); `numeric=\"tabular\"` lines up figures that compare.",
      "role": "content",
      "import": "@rrios-forge/ui/atoms/text",
      "exports": [
        "Text",
        "textVariants",
        "TEXT_NUMERIC_CLASSES",
        "TEXT_NUMERICS",
        "TEXT_SIZES",
        "TEXT_TONES",
        "TEXT_WEIGHTS"
      ],
      "source": "packages/ui/src/atoms/text",
      "axes": [
        {
          "axis": "size",
          "part": null,
          "values": [
            "xs",
            "sm",
            "md",
            "lg"
          ],
          "default": "md",
          "meaning": "Ergonomic scale, in three families (control, text, container)."
        },
        {
          "axis": "weight",
          "part": null,
          "values": [
            "regular",
            "medium",
            "semibold"
          ],
          "default": "regular",
          "meaning": "Type weight within the ramp."
        },
        {
          "axis": "tone",
          "part": null,
          "values": [
            "neutral",
            "muted",
            "inverse",
            "danger"
          ],
          "default": "neutral",
          "meaning": "Which semantic colour family the element speaks in."
        }
      ],
      "needs": [
        {
          "need": "Text / heading / helper / code / shortcut",
          "answer": "`Text` / `Heading` / `Description` / `Code` / `Kbd`"
        }
      ],
      "patterns": [],
      "a11yExceptions": [],
      "decisions": [
        {
          "id": "ADR-046",
          "title": "Markdown is painted with atoms, and apps fill its slots"
        }
      ],
      "stories": [
        {
          "name": "Playground",
          "id": "components-atoms-text--playground",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-atoms-text--playground",
          "frame": "/iframe.html?id=components-atoms-text--playground&viewMode=story"
        },
        {
          "name": "Sizes",
          "id": "components-atoms-text--sizes",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-atoms-text--sizes",
          "frame": "/iframe.html?id=components-atoms-text--sizes&viewMode=story"
        },
        {
          "name": "Weights",
          "id": "components-atoms-text--weights",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-atoms-text--weights",
          "frame": "/iframe.html?id=components-atoms-text--weights&viewMode=story"
        },
        {
          "name": "Tones",
          "id": "components-atoms-text--tones",
          "interaction": false,
          "snapshots": [
            "dark",
            "high-contrast",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-atoms-text--tones",
          "frame": "/iframe.html?id=components-atoms-text--tones&viewMode=story"
        },
        {
          "name": "Polymorphic `as`",
          "id": "components-atoms-text--elements",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-atoms-text--elements",
          "frame": "/iframe.html?id=components-atoms-text--elements&viewMode=story"
        },
        {
          "name": "Numeric figures and inherit",
          "id": "components-atoms-text--numeric-and-inherit",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-atoms-text--numeric-and-inherit",
          "frame": "/iframe.html?id=components-atoms-text--numeric-and-inherit&viewMode=story"
        }
      ],
      "storyFile": "tooling/storybook/stories/components/atoms/text.stories.tsx"
    },
    {
      "id": "textarea",
      "name": "Textarea",
      "level": "atom",
      "status": "stable",
      "purpose": "Multi-line text input.",
      "description": "Native multi-line text entry. Mirrors Input's recipe (boundary, hover, focus) and adds a vertical-only resize handle while editable (none when disabled or read-only). Disabled keeps an opaque box; text is 16 px on touch so iOS does not zoom on focus. Composes with Label via `id` / `htmlFor`. The `invalid` prop drives both the visible danger ring and `aria-invalid`; pair it with a visible error message via `aria-describedby`.",
      "role": "input",
      "import": "@rrios-forge/ui/atoms/textarea",
      "exports": [
        "Textarea",
        "textareaVariants",
        "TEXTAREA_SIZES"
      ],
      "source": "packages/ui/src/atoms/textarea",
      "axes": [
        {
          "axis": "size",
          "part": null,
          "values": [
            "sm",
            "md",
            "lg"
          ],
          "default": "md",
          "meaning": "Ergonomic scale, in three families (control, text, container)."
        },
        {
          "axis": "invalid",
          "part": null,
          "values": [
            "true",
            "false"
          ],
          "default": "false",
          "meaning": "Fails validation: a danger edge, announced as invalid; pair it with an error message."
        }
      ],
      "needs": [
        {
          "need": "Field with label + helper + error",
          "answer": "`Field` + `Input`/`Textarea`/`Select`"
        }
      ],
      "patterns": [],
      "a11yExceptions": [],
      "decisions": [
        {
          "id": "ADR-019",
          "title": "Composer organism (message/post authoring surface)"
        }
      ],
      "stories": [
        {
          "name": "Playground",
          "id": "components-atoms-textarea--playground",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-atoms-textarea--playground",
          "frame": "/iframe.html?id=components-atoms-textarea--playground&viewMode=story"
        },
        {
          "name": "Sizes",
          "id": "components-atoms-textarea--sizes",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-atoms-textarea--sizes",
          "frame": "/iframe.html?id=components-atoms-textarea--sizes&viewMode=story"
        },
        {
          "name": "States",
          "id": "components-atoms-textarea--states",
          "interaction": false,
          "snapshots": [
            "dark",
            "high-contrast",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-atoms-textarea--states",
          "frame": "/iframe.html?id=components-atoms-textarea--states&viewMode=story"
        },
        {
          "name": "Invalid",
          "id": "components-atoms-textarea--invalid",
          "interaction": false,
          "snapshots": [
            "dark",
            "high-contrast",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-atoms-textarea--invalid",
          "frame": "/iframe.html?id=components-atoms-textarea--invalid&viewMode=story"
        },
        {
          "name": "With label",
          "id": "components-atoms-textarea--with-label",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-atoms-textarea--with-label",
          "frame": "/iframe.html?id=components-atoms-textarea--with-label&viewMode=story"
        }
      ],
      "storyFile": "tooling/storybook/stories/components/atoms/textarea.stories.tsx"
    },
    {
      "id": "visually-hidden",
      "name": "VisuallyHidden",
      "level": "atom",
      "status": "stable",
      "purpose": "Screen-reader-only content.",
      "description": "Content invisible on screen, exposed to assistive technology. Uses Tailwind's `sr-only` clip pattern. Use it for off-screen labels, skip links and AT-only context. `focusable` reveals the content while it holds focus — required for skip links (WCAG 2.4.7). Has no variant axes — pure accessibility utility.",
      "role": "content",
      "import": "@rrios-forge/ui/atoms/visually-hidden",
      "exports": [
        "VisuallyHidden"
      ],
      "source": "packages/ui/src/atoms/visually-hidden",
      "axes": [],
      "needs": [
        {
          "need": "Screen-reader-only text",
          "answer": "`VisuallyHidden`"
        }
      ],
      "patterns": [],
      "a11yExceptions": [],
      "decisions": [],
      "stories": [
        {
          "name": "Playground",
          "id": "components-atoms-visuallyhidden--playground",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-atoms-visuallyhidden--playground",
          "frame": "/iframe.html?id=components-atoms-visuallyhidden--playground&viewMode=story"
        },
        {
          "name": "With IconButton",
          "id": "components-atoms-visuallyhidden--with-icon-button",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-atoms-visuallyhidden--with-icon-button",
          "frame": "/iframe.html?id=components-atoms-visuallyhidden--with-icon-button&viewMode=story"
        },
        {
          "name": "Skip link (focusable)",
          "id": "components-atoms-visuallyhidden--skip-link",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-atoms-visuallyhidden--skip-link",
          "frame": "/iframe.html?id=components-atoms-visuallyhidden--skip-link&viewMode=story"
        }
      ],
      "storyFile": "tooling/storybook/stories/components/atoms/visually-hidden.stories.tsx"
    },
    {
      "id": "wordmark",
      "name": "Wordmark",
      "level": "atom",
      "status": "stable",
      "purpose": "The Poesía brand mark, set as a word.",
      "description": "Poesía's brand mark: an ink rounded square with a soft highlight, beside the name set in the display serif. Mark and name share one colour, near-black by day and near-white by night, so the mark sits in the monochrome theme like the primary action does. It comes at three sizes, as the full lockup or the square alone, and can be held to a light or dark ground for photos and print.",
      "role": "content",
      "import": "@rrios-forge/ui/atoms/wordmark",
      "exports": [
        "Wordmark",
        "WORDMARK_GROUNDS",
        "WORDMARK_LOCKUPS",
        "WORDMARK_PALETTES",
        "WORDMARK_SIZES",
        "WORDMARK_TONES",
        "WORDMARK_VARIANTS",
        "wordmarkVariants"
      ],
      "source": "packages/ui/src/atoms/wordmark",
      "axes": [
        {
          "axis": "size",
          "part": null,
          "values": [
            "sm",
            "md",
            "lg"
          ],
          "default": "md",
          "meaning": "Ergonomic scale, in three families (control, text, container)."
        },
        {
          "axis": "lockup",
          "part": null,
          "values": [
            "full",
            "mark"
          ],
          "default": "full",
          "meaning": "Which form of the brand mark."
        },
        {
          "axis": "ground",
          "part": null,
          "values": [
            "auto",
            "light",
            "dark"
          ],
          "default": "auto",
          "meaning": "Which ground a brand mark sits on."
        },
        {
          "axis": "palette",
          "part": null,
          "values": [
            "brand",
            "mono"
          ],
          "default": "brand",
          "meaning": "Brand colour or monochrome for a brand mark."
        }
      ],
      "needs": [],
      "patterns": [],
      "a11yExceptions": [],
      "decisions": [
        {
          "id": "ADR-009",
          "title": "Editorial Frame: PageShell v3 + new `TopBar` molecule"
        },
        {
          "id": "ADR-030",
          "title": "Axis vocabulary: one name, one meaning"
        }
      ],
      "stories": [
        {
          "name": "Playground",
          "id": "components-atoms-wordmark--playground",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-atoms-wordmark--playground",
          "frame": "/iframe.html?id=components-atoms-wordmark--playground&viewMode=story"
        },
        {
          "name": "Sizes",
          "id": "components-atoms-wordmark--sizes",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-atoms-wordmark--sizes",
          "frame": "/iframe.html?id=components-atoms-wordmark--sizes&viewMode=story"
        },
        {
          "name": "Variants",
          "id": "components-atoms-wordmark--variants",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-atoms-wordmark--variants",
          "frame": "/iframe.html?id=components-atoms-wordmark--variants&viewMode=story"
        },
        {
          "name": "Tones",
          "id": "components-atoms-wordmark--tones",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-atoms-wordmark--tones",
          "frame": "/iframe.html?id=components-atoms-wordmark--tones&viewMode=story"
        }
      ],
      "storyFile": "tooling/storybook/stories/components/atoms/wordmark.stories.tsx"
    },
    {
      "id": "action-group",
      "name": "ActionGroup",
      "level": "molecule",
      "status": "stable",
      "purpose": "Cluster of related actions (e.g. dialog footer).",
      "description": "Consistent grouping of primary, secondary and destructive actions. Three orthogonal axes: align (start | end | between), orientation (horizontal | vertical | responsive), density (compact | comfortable). The molecule never reorders children — reading order matches visual order. Patterns consulted: Patterns/Visual Priority · ActionHierarchy + QuietSecondaryActions, Patterns/Density & Growth · ActionOverflow.",
      "role": "action",
      "import": "@rrios-forge/ui/molecules/action-group",
      "exports": [
        "ActionGroup",
        "ACTION_GROUP_ALIGNS",
        "ACTION_GROUP_DENSITIES",
        "ACTION_GROUP_ORIENTATIONS",
        "actionGroupVariants"
      ],
      "source": "packages/ui/src/molecules/action-group",
      "axes": [
        {
          "axis": "orientation",
          "part": null,
          "values": [
            "horizontal",
            "vertical",
            "responsive"
          ],
          "default": "horizontal",
          "meaning": "The direction the parts run: a row (horizontal) or a column (vertical); responsive stacks on phones and runs in a row from sm."
        },
        {
          "axis": "align",
          "part": null,
          "values": [
            "start",
            "end",
            "between"
          ],
          "default": "end",
          "meaning": "Distribution along the main axis."
        }
      ],
      "needs": [
        {
          "need": "Toolbar / split action",
          "answer": "`Toolbar` or `ActionGroup` / `SplitAction`"
        }
      ],
      "patterns": [],
      "a11yExceptions": [],
      "decisions": [
        {
          "id": "ADR-008",
          "title": "Layout layer: refined `Grid` + new `Container`"
        }
      ],
      "stories": [
        {
          "name": "Playground",
          "id": "components-molecules-actiongroup--playground",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-actiongroup--playground",
          "frame": "/iframe.html?id=components-molecules-actiongroup--playground&viewMode=story"
        },
        {
          "name": "Alignment",
          "id": "components-molecules-actiongroup--alignment",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-actiongroup--alignment",
          "frame": "/iframe.html?id=components-molecules-actiongroup--alignment&viewMode=story"
        },
        {
          "name": "Orientation",
          "id": "components-molecules-actiongroup--orientation",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-actiongroup--orientation",
          "frame": "/iframe.html?id=components-molecules-actiongroup--orientation&viewMode=story"
        },
        {
          "name": "Density",
          "id": "components-molecules-actiongroup--density",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-actiongroup--density",
          "frame": "/iframe.html?id=components-molecules-actiongroup--density&viewMode=story"
        },
        {
          "name": "Primary · secondary · danger",
          "id": "components-molecules-actiongroup--primary-secondary-danger",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-actiongroup--primary-secondary-danger",
          "frame": "/iframe.html?id=components-molecules-actiongroup--primary-secondary-danger&viewMode=story"
        },
        {
          "name": "In dialog footer",
          "id": "components-molecules-actiongroup--in-dialog-footer",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-actiongroup--in-dialog-footer",
          "frame": "/iframe.html?id=components-molecules-actiongroup--in-dialog-footer&viewMode=story"
        },
        {
          "name": "In card footer",
          "id": "components-molecules-actiongroup--in-card-footer",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-actiongroup--in-card-footer",
          "frame": "/iframe.html?id=components-molecules-actiongroup--in-card-footer&viewMode=story"
        }
      ],
      "storyFile": "tooling/storybook/stories/components/molecules/action-group.stories.tsx"
    },
    {
      "id": "activity-item",
      "name": "ActivityItem",
      "level": "molecule",
      "status": "stable",
      "purpose": "One event in a feed: who did what to what, and when.",
      "description": "Activity feed row reading 'actor performed action on object — time'. The molecule never invents a sentence; the consumer composes the action and object nodes.",
      "role": "content",
      "import": "@rrios-forge/ui/molecules/activity-item",
      "exports": [
        "ActivityItem",
        "activityItemVariants"
      ],
      "source": "packages/ui/src/molecules/activity-item",
      "axes": [],
      "needs": [
        {
          "need": "Notification / timeline / activity item",
          "answer": "`NotificationItem` / `TimelineItem` / `ActivityItem`"
        }
      ],
      "patterns": [],
      "a11yExceptions": [],
      "decisions": [],
      "stories": [
        {
          "name": "Playground",
          "id": "components-molecules-activityitem--playground",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-activityitem--playground",
          "frame": "/iframe.html?id=components-molecules-activityitem--playground&viewMode=story"
        },
        {
          "name": "With avatar",
          "id": "components-molecules-activityitem--with-avatar",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-activityitem--with-avatar",
          "frame": "/iframe.html?id=components-molecules-activityitem--with-avatar&viewMode=story"
        },
        {
          "name": "With badge",
          "id": "components-molecules-activityitem--with-badge",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-activityitem--with-badge",
          "frame": "/iframe.html?id=components-molecules-activityitem--with-badge&viewMode=story"
        },
        {
          "name": "Activity feed",
          "id": "components-molecules-activityitem--activity-feed",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-activityitem--activity-feed",
          "frame": "/iframe.html?id=components-molecules-activityitem--activity-feed&viewMode=story"
        }
      ],
      "storyFile": "tooling/storybook/stories/components/molecules/activity-item.stories.tsx"
    },
    {
      "id": "alert",
      "name": "Alert",
      "level": "molecule",
      "status": "stable",
      "purpose": "A message about the page or a section of it, in the tone of what it says.",
      "description": "Persistent inline feedback for a section, form, page area or system state. Use Alert when the message must remain visible until dismissed; use Toast for ephemeral results. Patterns consulted: Patterns/Feedback · SuccessWarningError + LocalVsGlobalFeedback + BlockingVsNonBlocking, Patterns/Visual Priority · StatusHierarchy, Patterns/Decision Matrix · FeedbackChoice.",
      "role": "feedback",
      "import": "@rrios-forge/ui/molecules/alert",
      "exports": [
        "Alert",
        "ALERT_EMPHASIS",
        "ALERT_SIZES",
        "ALERT_TONES",
        "alertIconVariants",
        "alertVariants"
      ],
      "source": "packages/ui/src/molecules/alert",
      "axes": [
        {
          "axis": "tone",
          "part": null,
          "values": [
            "neutral",
            "info",
            "success",
            "warning",
            "danger"
          ],
          "default": "info",
          "meaning": "Which semantic colour family the element speaks in."
        },
        {
          "axis": "emphasis",
          "part": null,
          "values": [
            "soft",
            "outline",
            "solid"
          ],
          "default": "soft",
          "meaning": "How strongly a control or chip asserts itself, quiet to loud."
        },
        {
          "axis": "size",
          "part": null,
          "values": [
            "sm",
            "md"
          ],
          "default": "md",
          "meaning": "Ergonomic scale, in three families (control, text, container)."
        }
      ],
      "needs": [
        {
          "need": "Alert / banner",
          "answer": "`Alert tone=\"info|success|warning|danger|neutral\"`"
        }
      ],
      "patterns": [],
      "a11yExceptions": [],
      "decisions": [
        {
          "id": "ADR-003",
          "title": "Storybook editorial convention and pattern↔component bidirectionality"
        },
        {
          "id": "ADR-005",
          "title": "Visual operational rules: surfaces, interaction, motion"
        },
        {
          "id": "ADR-030",
          "title": "Axis vocabulary: one name, one meaning"
        },
        {
          "id": "ADR-034",
          "title": "Accessible names come from a labels provider"
        }
      ],
      "stories": [
        {
          "name": "Playground",
          "id": "components-molecules-alert--playground",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-alert--playground",
          "frame": "/iframe.html?id=components-molecules-alert--playground&viewMode=story"
        },
        {
          "name": "Tones",
          "id": "components-molecules-alert--tones",
          "interaction": false,
          "snapshots": [
            "dark",
            "high-contrast",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-alert--tones",
          "frame": "/iframe.html?id=components-molecules-alert--tones&viewMode=story"
        },
        {
          "name": "Emphases",
          "id": "components-molecules-alert--emphases",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-alert--emphases",
          "frame": "/iframe.html?id=components-molecules-alert--emphases&viewMode=story"
        },
        {
          "name": "With Action",
          "id": "components-molecules-alert--with-action",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-alert--with-action",
          "frame": "/iframe.html?id=components-molecules-alert--with-action&viewMode=story"
        },
        {
          "name": "Dismissible",
          "id": "components-molecules-alert--dismissible",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-alert--dismissible",
          "frame": "/iframe.html?id=components-molecules-alert--dismissible&viewMode=story"
        },
        {
          "name": "Accessibility",
          "id": "components-molecules-alert--accessibility",
          "interaction": false,
          "snapshots": [
            "dark",
            "high-contrast",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-alert--accessibility",
          "frame": "/iframe.html?id=components-molecules-alert--accessibility&viewMode=story"
        },
        {
          "name": "In context",
          "id": "components-molecules-alert--in-context",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-alert--in-context",
          "frame": "/iframe.html?id=components-molecules-alert--in-context&viewMode=story"
        }
      ],
      "storyFile": "tooling/storybook/stories/components/molecules/alert.stories.tsx"
    },
    {
      "id": "avatar-group",
      "name": "AvatarGroup",
      "level": "molecule",
      "status": "stable",
      "purpose": "A few people at a glance, overlapping, with a count for the rest.",
      "description": "Overlapping cluster of avatars with a `+N` overflow chip. The first `max` entries render overlapped and ringed; the remainder collapse into a decorative `+N` chip (aria-hidden). The container is role=group — pass `label` to name it. Size mirrors the Avatar atom scale. Patterns consulted: Patterns/Information Architecture · MetadataAndActions, Patterns/Density & Growth · MetadataCompression.",
      "role": "content",
      "import": "@rrios-forge/ui/molecules/avatar-group",
      "exports": [
        "AvatarGroup",
        "avatarGroupItemVariants",
        "avatarGroupOverflowVariants",
        "AVATAR_GROUP_SIZES"
      ],
      "source": "packages/ui/src/molecules/avatar-group",
      "axes": [
        {
          "axis": "size",
          "part": null,
          "values": [
            "sm",
            "md",
            "lg",
            "xl"
          ],
          "default": "md",
          "meaning": "Ergonomic scale, in three families (control, text, container)."
        },
        {
          "axis": "lead",
          "part": null,
          "values": [
            "true",
            "false"
          ],
          "default": "false",
          "meaning": "AvatarGroup leading avatar emphasis."
        }
      ],
      "needs": [],
      "patterns": [],
      "a11yExceptions": [],
      "decisions": [],
      "stories": [
        {
          "name": "Playground",
          "id": "components-molecules-avatargroup--playground",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-avatargroup--playground",
          "frame": "/iframe.html?id=components-molecules-avatargroup--playground&viewMode=story"
        },
        {
          "name": "Sizes",
          "id": "components-molecules-avatargroup--sizes",
          "interaction": false,
          "snapshots": [
            "dark",
            "high-contrast",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-avatargroup--sizes",
          "frame": "/iframe.html?id=components-molecules-avatargroup--sizes&viewMode=story"
        },
        {
          "name": "Overflow chip",
          "id": "components-molecules-avatargroup--overflow",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-avatargroup--overflow",
          "frame": "/iframe.html?id=components-molecules-avatargroup--overflow&viewMode=story"
        },
        {
          "name": "No overflow",
          "id": "components-molecules-avatargroup--no-overflow",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-avatargroup--no-overflow",
          "frame": "/iframe.html?id=components-molecules-avatargroup--no-overflow&viewMode=story"
        }
      ],
      "storyFile": "tooling/storybook/stories/components/molecules/avatar-group.stories.tsx"
    },
    {
      "id": "bottom-dock",
      "name": "BottomDock",
      "level": "molecule",
      "status": "stable",
      "purpose": "A raft of page actions pinned to the bottom of the frame.",
      "description": "Bottom-anchored primary navigation. Two semantic axes (`density`, `orientation`) and three slots (`workspace`, `items[]`, `user`). The active item wears a neutral capsule that hugs its icon and label and slides between items; the dock surface has a hairline top edge.",
      "role": "navigation",
      "import": "@rrios-forge/ui/molecules/bottom-dock",
      "exports": [
        "BottomDock",
        "BottomDockItem",
        "BOTTOM_DOCK_DENSITIES",
        "BOTTOM_DOCK_ORIENTATIONS",
        "bottomDockItemBadgeVariants",
        "bottomDockItemIconVariants",
        "bottomDockItemLabelVariants",
        "bottomDockItemVariants",
        "bottomDockItemsVariants",
        "bottomDockSlotVariants",
        "bottomDockVariants"
      ],
      "source": "packages/ui/src/molecules/bottom-dock",
      "axes": [
        {
          "axis": "orientation",
          "part": null,
          "values": [
            "horizontal"
          ],
          "default": "horizontal",
          "meaning": "The direction the parts run: a row (horizontal) or a column (vertical); responsive stacks on phones and runs in a row from sm."
        },
        {
          "axis": "active",
          "part": null,
          "values": [
            "true",
            "false"
          ],
          "default": "false",
          "meaning": "The current destination or item: marked as current to assistive tech."
        },
        {
          "axis": "disabled",
          "part": null,
          "values": [
            "true",
            "false"
          ],
          "default": "false",
          "meaning": "Not available: dimmed, skipped by the keyboard, ignores the pointer."
        }
      ],
      "needs": [],
      "patterns": [],
      "a11yExceptions": [],
      "decisions": [
        {
          "id": "ADR-010",
          "title": "PageShell v4: bottom dock + mobile floating bubble"
        },
        {
          "id": "ADR-011",
          "title": "PageShell v5: adaptive lateral sidebar + mobile nav bubble"
        },
        {
          "id": "ADR-013",
          "title": "PageShell: mobile-nav polymorphism"
        },
        {
          "id": "ADR-022",
          "title": "The material family: `solid` and `vibrant`"
        }
      ],
      "stories": [
        {
          "name": "Playground",
          "id": "components-molecules-bottomdock--playground",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-bottomdock--playground",
          "frame": "/iframe.html?id=components-molecules-bottomdock--playground&viewMode=story"
        },
        {
          "name": "Comfortable",
          "id": "components-molecules-bottomdock--comfortable",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-bottomdock--comfortable",
          "frame": "/iframe.html?id=components-molecules-bottomdock--comfortable&viewMode=story"
        },
        {
          "name": "Compact",
          "id": "components-molecules-bottomdock--compact",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-bottomdock--compact",
          "frame": "/iframe.html?id=components-molecules-bottomdock--compact&viewMode=story"
        },
        {
          "name": "With badges",
          "id": "components-molecules-bottomdock--with-badges",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-bottomdock--with-badges",
          "frame": "/iframe.html?id=components-molecules-bottomdock--with-badges&viewMode=story"
        },
        {
          "name": "Items only (no workspace / user)",
          "id": "components-molecules-bottomdock--items-only",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-bottomdock--items-only",
          "frame": "/iframe.html?id=components-molecules-bottomdock--items-only&viewMode=story"
        },
        {
          "name": "asChild · framework Link",
          "id": "components-molecules-bottomdock--as-child-with-link",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-bottomdock--as-child-with-link",
          "frame": "/iframe.html?id=components-molecules-bottomdock--as-child-with-link&viewMode=story"
        },
        {
          "name": "asChild · prevents browser navigation",
          "id": "components-molecules-bottomdock--as-child-prevents-navigation",
          "interaction": true,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-bottomdock--as-child-prevents-navigation",
          "frame": "/iframe.html?id=components-molecules-bottomdock--as-child-prevents-navigation&viewMode=story"
        },
        {
          "name": "Mobile",
          "id": "components-molecules-bottomdock--mobile",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-bottomdock--mobile",
          "frame": "/iframe.html?id=components-molecules-bottomdock--mobile&viewMode=story"
        }
      ],
      "storyFile": "tooling/storybook/stories/components/molecules/bottom-dock.stories.tsx"
    },
    {
      "id": "bar-list",
      "name": "BarList",
      "level": "molecule",
      "status": "stable",
      "purpose": "Names ranked by a value — a label, the value and a thin bar per row.",
      "description": "Compare magnitude when the categories are names: each row is its label and its value, and the bar shows the size. Text first — the list reads without the bars. One list is one series, so every bar wears the same slot; values use tabular numerals; bars grow from one baseline and do not animate in.",
      "role": "content",
      "import": "@rrios-forge/ui/molecules/bar-list",
      "exports": [
        "BarList",
        "barListBarVariants",
        "barListTrackVariants",
        "barListVariants",
        "BAR_LIST_SIZES"
      ],
      "source": "packages/ui/src/molecules/bar-list",
      "axes": [
        {
          "axis": "size",
          "part": null,
          "values": [
            "sm",
            "md"
          ],
          "default": "md",
          "meaning": "Ergonomic scale, in three families (control, text, container)."
        }
      ],
      "needs": [
        {
          "need": "Names ranked by a value (top pages, products)",
          "answer": "`BarList`"
        }
      ],
      "patterns": [],
      "a11yExceptions": [],
      "decisions": [
        {
          "id": "ADR-036",
          "title": "Data visualization: colour roles, a grammar, and three components on plain SVG"
        }
      ],
      "stories": [
        {
          "name": "Playground",
          "id": "components-molecules-barlist--playground",
          "interaction": false,
          "snapshots": [
            "dark",
            "high-contrast",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-barlist--playground",
          "frame": "/iframe.html?id=components-molecules-barlist--playground&viewMode=story"
        },
        {
          "name": "Sizes",
          "id": "components-molecules-barlist--sizes",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-barlist--sizes",
          "frame": "/iframe.html?id=components-molecules-barlist--sizes&viewMode=story"
        },
        {
          "name": "With links",
          "id": "components-molecules-barlist--with-links",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-barlist--with-links",
          "frame": "/iframe.html?id=components-molecules-barlist--with-links&viewMode=story"
        },
        {
          "name": "In a Card",
          "id": "components-molecules-barlist--in-a-card",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-barlist--in-a-card",
          "frame": "/iframe.html?id=components-molecules-barlist--in-a-card&viewMode=story"
        }
      ],
      "storyFile": "tooling/storybook/stories/components/molecules/bar-list.stories.tsx"
    },
    {
      "id": "breadcrumb",
      "name": "Breadcrumb",
      "level": "molecule",
      "status": "stable",
      "purpose": "Where the reader is: the trail of pages above this one, each a link back.",
      "description": "The trail from the top of the product to the current page — Workspaces › Acme Inc. › Settings — so a person sees where they are and can step back up. Renders `<nav aria-label=\"Breadcrumb\">`, an announced navigation landmark; the current page reads `aria-current=\"page\"`. Separators are `aria-hidden`.",
      "role": "navigation",
      "import": "@rrios-forge/ui/molecules/breadcrumb",
      "exports": [
        "Breadcrumb",
        "BreadcrumbEllipsis",
        "BreadcrumbItem",
        "BreadcrumbLink",
        "BreadcrumbList",
        "BreadcrumbPage",
        "BreadcrumbSeparator"
      ],
      "source": "packages/ui/src/molecules/breadcrumb",
      "axes": [],
      "needs": [],
      "patterns": [],
      "a11yExceptions": [],
      "decisions": [],
      "stories": [
        {
          "name": "Playground",
          "id": "components-molecules-breadcrumb--playground",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-breadcrumb--playground",
          "frame": "/iframe.html?id=components-molecules-breadcrumb--playground&viewMode=story"
        },
        {
          "name": "With ellipsis",
          "id": "components-molecules-breadcrumb--with-ellipsis",
          "interaction": false,
          "snapshots": [
            "dark",
            "high-contrast",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-breadcrumb--with-ellipsis",
          "frame": "/iframe.html?id=components-molecules-breadcrumb--with-ellipsis&viewMode=story"
        }
      ],
      "storyFile": "tooling/storybook/stories/components/molecules/breadcrumb.stories.tsx"
    },
    {
      "id": "card",
      "name": "Card",
      "level": "molecule",
      "status": "stable",
      "purpose": "A content surface that groups one subject, with optional actions.",
      "description": "Reusable surface for grouped content. Compound API: Card + CardHeader + CardTitle + CardDescription + CardContent + CardFooter. Three tones (default, muted, elevated) and four padding densities. Card is not interactive by default; pass interactive=true plus a real semantic interactive wrapper. Patterns consulted: Patterns/Information Architecture · SectionAnatomy, Patterns/Composition · ReuseBeforeCreate + DoNotOverCompose, Patterns/Density & Growth · DensityLevels.",
      "role": "content",
      "import": "@rrios-forge/ui/molecules/card",
      "exports": [
        "Card",
        "CardContent",
        "CardDescription",
        "CardFooter",
        "CardHeader",
        "CardTitle",
        "CardContext",
        "CARD_FILL",
        "CARD_MATERIALS",
        "CARD_PADDING",
        "CARD_SURFACES",
        "CARD_TONES",
        "cardVariants"
      ],
      "source": "packages/ui/src/molecules/card",
      "axes": [
        {
          "axis": "surface",
          "part": null,
          "values": [
            "default",
            "muted",
            "raised"
          ],
          "default": "default",
          "meaning": "Which surface level a container paints."
        },
        {
          "axis": "padding",
          "part": null,
          "values": [
            "none",
            "sm",
            "md",
            "lg"
          ],
          "default": "md",
          "meaning": "Inner spacing of a container."
        },
        {
          "axis": "interactive",
          "part": null,
          "values": [
            "true",
            "false"
          ],
          "default": "false",
          "meaning": "Responds to the pointer: hover and press feedback, a pointer cursor."
        },
        {
          "axis": "fill",
          "part": null,
          "values": [
            "true",
            "false"
          ],
          "default": "false",
          "meaning": "Card grows to its row's tallest sibling (ADR-012)."
        }
      ],
      "needs": [
        {
          "need": "Content card",
          "answer": "`Card`"
        }
      ],
      "patterns": [],
      "a11yExceptions": [],
      "decisions": [
        {
          "id": "ADR-004",
          "title": "Migrate boolean configuration props to semantic axes"
        },
        {
          "id": "ADR-005",
          "title": "Visual operational rules: surfaces, interaction, motion"
        },
        {
          "id": "ADR-006",
          "title": "Geometry and typography signature"
        },
        {
          "id": "ADR-007",
          "title": "Material highlight on raised surfaces"
        },
        {
          "id": "ADR-009",
          "title": "Editorial Frame: PageShell v3 + new `TopBar` molecule"
        },
        {
          "id": "ADR-011",
          "title": "PageShell v5: adaptive lateral sidebar + mobile nav bubble"
        },
        {
          "id": "ADR-012",
          "title": "Card.fill axis for symmetric growth in grids"
        },
        {
          "id": "ADR-027",
          "title": "Vibrant is the system's material, not one of its members"
        }
      ],
      "stories": [
        {
          "name": "Playground",
          "id": "components-molecules-card--playground",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-card--playground",
          "frame": "/iframe.html?id=components-molecules-card--playground&viewMode=story"
        },
        {
          "name": "Anatomy",
          "id": "components-molecules-card--anatomy",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-card--anatomy",
          "frame": "/iframe.html?id=components-molecules-card--anatomy&viewMode=story"
        },
        {
          "name": "Tones",
          "id": "components-molecules-card--tones",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-card--tones",
          "frame": "/iframe.html?id=components-molecules-card--tones&viewMode=story"
        },
        {
          "name": "Padding",
          "id": "components-molecules-card--padding",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-card--padding",
          "frame": "/iframe.html?id=components-molecules-card--padding&viewMode=story"
        },
        {
          "name": "With actions",
          "id": "components-molecules-card--with-actions",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-card--with-actions",
          "frame": "/iframe.html?id=components-molecules-card--with-actions&viewMode=story"
        },
        {
          "name": "Dense content",
          "id": "components-molecules-card--dense-content",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-card--dense-content",
          "frame": "/iframe.html?id=components-molecules-card--dense-content&viewMode=story"
        },
        {
          "name": "In context",
          "id": "components-molecules-card--in-context",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-card--in-context",
          "frame": "/iframe.html?id=components-molecules-card--in-context&viewMode=story"
        },
        {
          "name": "Fill in grid",
          "id": "components-molecules-card--fill-in-grid",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-card--fill-in-grid",
          "frame": "/iframe.html?id=components-molecules-card--fill-in-grid&viewMode=story"
        },
        {
          "name": "Vibrant",
          "id": "components-molecules-card--vibrant",
          "interaction": false,
          "snapshots": [
            "dark",
            "high-contrast",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-card--vibrant",
          "frame": "/iframe.html?id=components-molecules-card--vibrant&viewMode=story"
        }
      ],
      "storyFile": "tooling/storybook/stories/components/molecules/card.stories.tsx"
    },
    {
      "id": "carousel",
      "name": "Carousel",
      "level": "molecule",
      "status": "stable",
      "purpose": "A row of slides to swipe or step through.",
      "description": "Apple-grade carousel built on `embla-carousel-react`. Compound API:\n`Carousel` + `CarouselViewport` + `CarouselSlide` + optional\n`CarouselControls`, `CarouselPreviousButton`, `CarouselNextButton`,\n`CarouselPagination`, `CarouselCounter`.\n\nSupports horizontal and vertical layouts, single or multi-item per\nview, loop, autoplay (with WCAG 2.2.2 pause-on-hover / pause-on-focus\nand reduced-motion opt-out), touch/drag, and full keyboard navigation\n(arrows + Home / End) on the Root region.\n\nIntegrates with every Card-family surface in the system: `Card`,\n`MetricCard`, `PlanCard`, `PricingOption`, `FeedCard`. Each slide is\nan inert container; the focused content lives inside it.\n\nPatterns consulted: `Patterns/Information Architecture · Progressive\ndisclosure`, `Patterns/Composition · Compound components`,\n`Patterns/Visual Priority · Action hierarchy`, `Patterns/Density &\nGrowth · Touch-target floor`, `Patterns/Page Shells · Dashboard surface`.",
      "role": "content",
      "import": "@rrios-forge/ui/molecules/carousel",
      "exports": [
        "Carousel",
        "CarouselAutoplayToggle",
        "CarouselControls",
        "CarouselCounter",
        "CarouselNextButton",
        "CarouselPagination",
        "CarouselPreviousButton",
        "CarouselSlide",
        "CarouselViewport",
        "useCarousel",
        "carouselButtonVariants",
        "carouselContainerVariants",
        "carouselControlsVariants",
        "carouselCounterVariants",
        "carouselDotVariants",
        "carouselPaginationVariants",
        "carouselRootVariants",
        "carouselSlideVariants",
        "carouselViewportVariants",
        "CAROUSEL_ALIGNMENTS",
        "CAROUSEL_CONTROL_PLACEMENTS",
        "CAROUSEL_ORIENTATIONS"
      ],
      "source": "packages/ui/src/molecules/carousel",
      "axes": [
        {
          "axis": "orientation",
          "part": null,
          "values": [
            "horizontal",
            "vertical"
          ],
          "default": "horizontal",
          "meaning": "The direction the parts run: a row (horizontal) or a column (vertical); responsive stacks on phones and runs in a row from sm."
        },
        {
          "axis": "placement",
          "part": null,
          "values": [
            "inset",
            "below",
            "floating-bottom"
          ],
          "default": "below",
          "meaning": "Where an attached element sits."
        },
        {
          "axis": "side",
          "part": null,
          "values": [
            "previous",
            "next"
          ],
          "default": "previous",
          "meaning": "Which side something belongs to."
        },
        {
          "axis": "presentation",
          "part": null,
          "values": [
            "plain",
            "capsule"
          ],
          "default": "capsule",
          "meaning": "How the same thing is staged."
        }
      ],
      "needs": [],
      "patterns": [],
      "a11yExceptions": [],
      "decisions": [],
      "stories": [
        {
          "name": "Playground",
          "id": "components-molecules-carousel--playground",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-carousel--playground",
          "frame": "/iframe.html?id=components-molecules-carousel--playground&viewMode=story"
        },
        {
          "name": "Multi-item per view",
          "id": "components-molecules-carousel--multi-item-view",
          "interaction": false,
          "snapshots": [
            "dark",
            "high-contrast",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-carousel--multi-item-view",
          "frame": "/iframe.html?id=components-molecules-carousel--multi-item-view&viewMode=story"
        },
        {
          "name": "Control placements",
          "id": "components-molecules-carousel--control-placements",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-carousel--control-placements",
          "frame": "/iframe.html?id=components-molecules-carousel--control-placements&viewMode=story"
        },
        {
          "name": "Loop + autoplay",
          "id": "components-molecules-carousel--loop-and-autoplay",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-carousel--loop-and-autoplay",
          "frame": "/iframe.html?id=components-molecules-carousel--loop-and-autoplay&viewMode=story"
        },
        {
          "name": "Vertical",
          "id": "components-molecules-carousel--vertical",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-carousel--vertical",
          "frame": "/iframe.html?id=components-molecules-carousel--vertical&viewMode=story"
        },
        {
          "name": "Integration — Carousel of Cards",
          "id": "components-molecules-carousel--with-card",
          "interaction": false,
          "snapshots": [
            "dark",
            "high-contrast",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-carousel--with-card",
          "frame": "/iframe.html?id=components-molecules-carousel--with-card&viewMode=story"
        },
        {
          "name": "Integration — MetricCard",
          "id": "components-molecules-carousel--with-metric-cards",
          "interaction": false,
          "snapshots": [
            "dark",
            "high-contrast",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-carousel--with-metric-cards",
          "frame": "/iframe.html?id=components-molecules-carousel--with-metric-cards&viewMode=story"
        },
        {
          "name": "Integration — PricingOption",
          "id": "components-molecules-carousel--with-pricing-options",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-carousel--with-pricing-options",
          "frame": "/iframe.html?id=components-molecules-carousel--with-pricing-options&viewMode=story"
        },
        {
          "name": "With counter",
          "id": "components-molecules-carousel--with-counter",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-carousel--with-counter",
          "frame": "/iframe.html?id=components-molecules-carousel--with-counter&viewMode=story"
        },
        {
          "name": "Inset controls",
          "id": "components-molecules-carousel--inset-controls",
          "interaction": false,
          "snapshots": [
            "dark",
            "high-contrast",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-carousel--inset-controls",
          "frame": "/iframe.html?id=components-molecules-carousel--inset-controls&viewMode=story"
        },
        {
          "name": "In context",
          "id": "components-molecules-carousel--in-context",
          "interaction": false,
          "snapshots": [
            "dark",
            "high-contrast",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-carousel--in-context",
          "frame": "/iframe.html?id=components-molecules-carousel--in-context&viewMode=story"
        },
        {
          "name": "Accessibility notes",
          "id": "components-molecules-carousel--accessibility-notes",
          "interaction": false,
          "snapshots": [],
          "skipsSnapshot": true,
          "docs": "/?path=/story/components-molecules-carousel--accessibility-notes",
          "frame": "/iframe.html?id=components-molecules-carousel--accessibility-notes&viewMode=story"
        },
        {
          "name": "Integration — Card with embedded Carousel",
          "id": "components-molecules-carousel--card-with-carousel",
          "interaction": false,
          "snapshots": [
            "dark",
            "high-contrast",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-carousel--card-with-carousel",
          "frame": "/iframe.html?id=components-molecules-carousel--card-with-carousel&viewMode=story"
        },
        {
          "name": "Integration — Card with vertical Carousel",
          "id": "components-molecules-carousel--card-with-vertical-carousel",
          "interaction": false,
          "snapshots": [
            "dark",
            "high-contrast",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-carousel--card-with-vertical-carousel",
          "frame": "/iframe.html?id=components-molecules-carousel--card-with-vertical-carousel&viewMode=story"
        },
        {
          "name": "Integration — Card with metric snapshot Carousel",
          "id": "components-molecules-carousel--card-with-metrics-carousel",
          "interaction": false,
          "snapshots": [
            "dark",
            "high-contrast",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-carousel--card-with-metrics-carousel",
          "frame": "/iframe.html?id=components-molecules-carousel--card-with-metrics-carousel&viewMode=story"
        },
        {
          "name": "Keyboard flow (interaction test)",
          "id": "components-molecules-carousel--keyboard-flow",
          "interaction": true,
          "snapshots": [],
          "skipsSnapshot": true,
          "docs": "/?path=/story/components-molecules-carousel--keyboard-flow",
          "frame": "/iframe.html?id=components-molecules-carousel--keyboard-flow&viewMode=story"
        }
      ],
      "storyFile": "tooling/storybook/stories/components/molecules/carousel.stories.tsx"
    },
    {
      "id": "chat-bubble",
      "name": "ChatBubble",
      "level": "molecule",
      "status": "experimental",
      "purpose": "One message in a conversation, sent or received.",
      "description": "A single directional message. `side` encodes authorship and drives both alignment and tone. The optional footer carries a consumer-localized timestamp and delivery label — the molecule bakes no language. Use ChatBubble for DM / chat surfaces; use CommentItem for threaded comments. Patterns consulted: Patterns/Visual Priority · StatusHierarchy, Patterns/Information Architecture · MetadataAndActions.",
      "role": "content",
      "import": "@rrios-forge/ui/molecules/chat-bubble",
      "exports": [
        "ChatBubble",
        "chatBubbleVariants",
        "CHAT_BUBBLE_POSITIONS",
        "CHAT_BUBBLE_SIDES"
      ],
      "source": "packages/ui/src/molecules/chat-bubble",
      "axes": [
        {
          "axis": "side",
          "part": null,
          "values": [
            "mine",
            "theirs",
            "system"
          ],
          "default": "theirs",
          "meaning": "Which side something belongs to."
        },
        {
          "axis": "position",
          "part": null,
          "values": [
            "single",
            "first",
            "middle",
            "last"
          ],
          "default": "single",
          "meaning": "Placement of a docked element."
        }
      ],
      "needs": [
        {
          "need": "Chat message / reactions",
          "answer": "`ChatBubble` / `ReactionBar`"
        }
      ],
      "patterns": [],
      "a11yExceptions": [],
      "decisions": [
        {
          "id": "ADR-043",
          "title": "The default theme is monochrome"
        }
      ],
      "stories": [
        {
          "name": "Playground",
          "id": "components-molecules-chatbubble--playground",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-chatbubble--playground",
          "frame": "/iframe.html?id=components-molecules-chatbubble--playground&viewMode=story"
        },
        {
          "name": "Conversation",
          "id": "components-molecules-chatbubble--conversation",
          "interaction": false,
          "snapshots": [
            "dark",
            "high-contrast",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-chatbubble--conversation",
          "frame": "/iframe.html?id=components-molecules-chatbubble--conversation&viewMode=story"
        },
        {
          "name": "Sides",
          "id": "components-molecules-chatbubble--sides",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-chatbubble--sides",
          "frame": "/iframe.html?id=components-molecules-chatbubble--sides&viewMode=story"
        }
      ],
      "storyFile": "tooling/storybook/stories/components/molecules/chat-bubble.stories.tsx"
    },
    {
      "id": "choice-group",
      "name": "ChoiceGroup",
      "level": "molecule",
      "status": "stable",
      "purpose": "Pick one or many from a short set, each choice with a title and a line of detail.",
      "description": "Pick one or many from a set, each with a title and a line of detail. A fieldset with its legend, an optional description and an optional error, holding checkboxes, radios or switches; vertical or horizontal, comfortable or compact. For radios, wrap the items in a RadioGroup so arrow keys move between them.",
      "role": "input",
      "import": "@rrios-forge/ui/molecules/choice-group",
      "exports": [
        "ChoiceGroup",
        "ChoiceGroupItem",
        "CHOICE_GROUP_DENSITIES",
        "CHOICE_GROUP_ORIENTATIONS",
        "choiceGroupVariants"
      ],
      "source": "packages/ui/src/molecules/choice-group",
      "axes": [
        {
          "axis": "orientation",
          "part": null,
          "values": [
            "vertical",
            "horizontal"
          ],
          "default": "vertical",
          "meaning": "The direction the parts run: a row (horizontal) or a column (vertical); responsive stacks on phones and runs in a row from sm."
        },
        {
          "axis": "invalid",
          "part": null,
          "values": [
            "true",
            "false"
          ],
          "default": "false",
          "meaning": "Fails validation: a danger edge, announced as invalid; pair it with an error message."
        }
      ],
      "needs": [
        {
          "need": "Binary toggle / checkbox / radio group",
          "answer": "`Switch` (in `SettingsField` with label) / `Checkbox` / `ChoiceGroup` with `Radio`"
        }
      ],
      "patterns": [],
      "a11yExceptions": [],
      "decisions": [],
      "stories": [
        {
          "name": "Playground",
          "id": "components-molecules-choicegroup--playground",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-choicegroup--playground",
          "frame": "/iframe.html?id=components-molecules-choicegroup--playground&viewMode=story"
        },
        {
          "name": "Checkbox choices",
          "id": "components-molecules-choicegroup--checkbox-choices",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-choicegroup--checkbox-choices",
          "frame": "/iframe.html?id=components-molecules-choicegroup--checkbox-choices&viewMode=story"
        },
        {
          "name": "Radio choices",
          "id": "components-molecules-choicegroup--radio-choices",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-choicegroup--radio-choices",
          "frame": "/iframe.html?id=components-molecules-choicegroup--radio-choices&viewMode=story"
        },
        {
          "name": "Switch choices",
          "id": "components-molecules-choicegroup--switch-choices",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-choicegroup--switch-choices",
          "frame": "/iframe.html?id=components-molecules-choicegroup--switch-choices&viewMode=story"
        },
        {
          "name": "Invalid",
          "id": "components-molecules-choicegroup--invalid",
          "interaction": false,
          "snapshots": [
            "dark",
            "high-contrast",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-choicegroup--invalid",
          "frame": "/iframe.html?id=components-molecules-choicegroup--invalid&viewMode=story"
        },
        {
          "name": "Horizontal",
          "id": "components-molecules-choicegroup--horizontal",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-choicegroup--horizontal",
          "frame": "/iframe.html?id=components-molecules-choicegroup--horizontal&viewMode=story"
        }
      ],
      "storyFile": "tooling/storybook/stories/components/molecules/choice-group.stories.tsx"
    },
    {
      "id": "combobox",
      "name": "Combobox",
      "level": "molecule",
      "status": "stable",
      "purpose": "A select you can type into to filter a long list.",
      "description": "**Purpose.** A searchable single-choice selector. Composes a Popover surface with the cmdk Command primitive — type-ahead filtering, arrow-key navigation, escape-to-close — behind a Trigger that mirrors `Select`'s chrome.\n\n**When to use.**\n- The list of options is long (~10 or more) so scanning is slow.\n- The user is likely to know the option's name and benefits from filtering as they type.\n- The options have grouping (frameworks by family, regions by continent) that filtering can collapse.\n\n**When NOT to use.**\n- ≤ 10 options where scanning is fast → use `Select`. Combobox adds keyboard ceremony for no gain.\n- Multi-select picker → use a tag-list pattern with `Combobox` + a chips region (or wait for a `MultiCombobox` molecule).\n- Free text where any value is acceptable → use `Input`. Combobox enforces a fixed list.\n\n**Composes with.**\n- `Field` to inherit label / description / error wiring.\n- `Combobox.Trigger / Content / Input / List / Group / Item / Separator / Empty` are the compound surface; consumers always render through them.\n- `Label` + `Description` for inline placements outside `Field`.\n\n**Accessibility.**\n- The Trigger is a `<button role=\"combobox\" aria-expanded>` with the listbox ID via `aria-controls`.\n- The Input inside the popover carries `aria-autocomplete=\"list\"`; the list is `role=\"listbox\"`; items are `role=\"option\"` with `aria-selected`.\n- Type-ahead and arrow keys are wired by cmdk. `Escape` closes the popover and returns focus to the Trigger.\n- `Empty` is announced inline (no toast) so the user knows their query produced no results.\n\n**Related patterns.**\n- `Patterns/Decision Matrix · ComponentChoice` — Combobox vs Select.\n- `Patterns/Overlays · OverlayChoice` — Popover-anchored vs Dialog-anchored selection.\n- `Patterns/Forms · ChoiceControls` — single-choice vs multi-choice ergonomics.",
      "role": "input",
      "import": "@rrios-forge/ui/molecules/combobox",
      "exports": [
        "Combobox",
        "ComboboxContent",
        "ComboboxEmpty",
        "ComboboxGroup",
        "ComboboxInput",
        "ComboboxItem",
        "ComboboxList",
        "ComboboxSeparator",
        "ComboboxTrigger",
        "comboboxInputRowVariants",
        "comboboxInputVariants",
        "comboboxItemVariants",
        "comboboxTriggerVariants",
        "COMBOBOX_TRIGGER_SIZES"
      ],
      "source": "packages/ui/src/molecules/combobox",
      "axes": [
        {
          "axis": "size",
          "part": null,
          "values": [
            "sm",
            "md",
            "lg"
          ],
          "default": "md",
          "meaning": "Ergonomic scale, in three families (control, text, container)."
        },
        {
          "axis": "invalid",
          "part": null,
          "values": [
            "true",
            "false"
          ],
          "default": "false",
          "meaning": "Fails validation: a danger edge, announced as invalid; pair it with an error message."
        }
      ],
      "needs": [
        {
          "need": "Tabs / select / autocomplete",
          "answer": "`Tabs` / `Select` / `Combobox` or `SearchField`"
        }
      ],
      "patterns": [
        "Patterns/Forms · ChoiceControls",
        "Patterns/Overlays · OverlayChoice",
        "Patterns/Decision Matrix · ComponentChoice"
      ],
      "a11yExceptions": [],
      "decisions": [
        {
          "id": "ADR-003",
          "title": "Storybook editorial convention and pattern↔component bidirectionality"
        },
        {
          "id": "ADR-005",
          "title": "Visual operational rules: surfaces, interaction, motion"
        },
        {
          "id": "ADR-006",
          "title": "Geometry and typography signature"
        },
        {
          "id": "ADR-024",
          "title": "`LocaleSelector` is a new molecule, not an extension of `Combobox`"
        }
      ],
      "stories": [
        {
          "name": "Playground",
          "id": "components-molecules-combobox--playground",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-combobox--playground",
          "frame": "/iframe.html?id=components-molecules-combobox--playground&viewMode=story"
        },
        {
          "name": "Many options",
          "id": "components-molecules-combobox--many-options",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-combobox--many-options",
          "frame": "/iframe.html?id=components-molecules-combobox--many-options&viewMode=story"
        },
        {
          "name": "Grouped",
          "id": "components-molecules-combobox--grouped",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-combobox--grouped",
          "frame": "/iframe.html?id=components-molecules-combobox--grouped&viewMode=story"
        },
        {
          "name": "In context",
          "id": "components-molecules-combobox--in-context",
          "interaction": false,
          "snapshots": [
            "dark",
            "high-contrast",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-combobox--in-context",
          "frame": "/iframe.html?id=components-molecules-combobox--in-context&viewMode=story"
        },
        {
          "name": "Keyboard flow",
          "id": "components-molecules-combobox--keyboard-flow",
          "interaction": true,
          "snapshots": [],
          "skipsSnapshot": true,
          "docs": "/?path=/story/components-molecules-combobox--keyboard-flow",
          "frame": "/iframe.html?id=components-molecules-combobox--keyboard-flow&viewMode=story"
        },
        {
          "name": "Active descendant (interaction test, known bug)",
          "id": "components-molecules-combobox--active-descendant",
          "interaction": true,
          "snapshots": [],
          "skipsSnapshot": true,
          "docs": "/?path=/story/components-molecules-combobox--active-descendant",
          "frame": "/iframe.html?id=components-molecules-combobox--active-descendant&viewMode=story"
        }
      ],
      "storyFile": "tooling/storybook/stories/components/molecules/combobox.stories.tsx"
    },
    {
      "id": "command-item",
      "name": "CommandItem",
      "level": "molecule",
      "status": "stable",
      "purpose": "One command in the command menu, with its icon and shortcut.",
      "description": "Renders <div role=\"option\"> for cmdk / listbox parents. The molecule never owns keyboard navigation or active-descendant state — the parent does. shortcut is a visual hint passed as a string and shown as quiet tertiary text, never a contract enforced by this row.",
      "role": "navigation",
      "import": "@rrios-forge/ui/molecules/command-item",
      "exports": [
        "CommandItem",
        "COMMAND_ITEM_INTENTS",
        "COMMAND_ITEM_TONES",
        "commandItemVariants"
      ],
      "source": "packages/ui/src/molecules/command-item",
      "axes": [
        {
          "axis": "tone",
          "part": null,
          "values": [
            "neutral",
            "muted"
          ],
          "default": "neutral",
          "meaning": "Which semantic colour family the element speaks in."
        },
        {
          "axis": "intent",
          "part": null,
          "values": [
            "neutral",
            "danger"
          ],
          "default": "neutral",
          "meaning": "What an action does."
        },
        {
          "axis": "selected",
          "part": null,
          "values": [
            "true",
            "false"
          ],
          "default": "false",
          "meaning": "Chosen in a set: the selected wash plus a non-colour cue (weight, check)."
        },
        {
          "axis": "disabled",
          "part": null,
          "values": [
            "true",
            "false"
          ],
          "default": "false",
          "meaning": "Not available: dimmed, skipped by the keyboard, ignores the pointer."
        }
      ],
      "needs": [],
      "patterns": [],
      "a11yExceptions": [],
      "decisions": [
        {
          "id": "ADR-030",
          "title": "Axis vocabulary: one name, one meaning"
        }
      ],
      "stories": [
        {
          "name": "Playground",
          "id": "components-molecules-commanditem--playground",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-commanditem--playground",
          "frame": "/iframe.html?id=components-molecules-commanditem--playground&viewMode=story"
        },
        {
          "name": "Selected",
          "id": "components-molecules-commanditem--selected",
          "interaction": false,
          "snapshots": [
            "dark",
            "high-contrast",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-commanditem--selected",
          "frame": "/iframe.html?id=components-molecules-commanditem--selected&viewMode=story"
        },
        {
          "name": "With shortcut",
          "id": "components-molecules-commanditem--with-shortcut",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-commanditem--with-shortcut",
          "frame": "/iframe.html?id=components-molecules-commanditem--with-shortcut&viewMode=story"
        },
        {
          "name": "With badge",
          "id": "components-molecules-commanditem--with-badge",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-commanditem--with-badge",
          "frame": "/iframe.html?id=components-molecules-commanditem--with-badge&viewMode=story"
        },
        {
          "name": "Danger",
          "id": "components-molecules-commanditem--danger",
          "interaction": false,
          "snapshots": [
            "dark",
            "high-contrast",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-commanditem--danger",
          "frame": "/iframe.html?id=components-molecules-commanditem--danger&viewMode=story"
        },
        {
          "name": "Command list",
          "id": "components-molecules-commanditem--command-list",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-commanditem--command-list",
          "frame": "/iframe.html?id=components-molecules-commanditem--command-list&viewMode=story"
        }
      ],
      "storyFile": "tooling/storybook/stories/components/molecules/command-item.stories.tsx"
    },
    {
      "id": "comment-item",
      "name": "CommentItem",
      "level": "molecule",
      "status": "experimental",
      "purpose": "One comment: who wrote it, what they said, and the reactions to it.",
      "description": "Compact comment / message row. Reading order: avatar / author + timestamp → body → actions. Actions sit below the body so they never dominate the content. Patterns consulted: Patterns/Information Architecture · MetadataAndActions.",
      "role": "content",
      "import": "@rrios-forge/ui/molecules/comment-item",
      "exports": [
        "CommentItem",
        "COMMENT_ITEM_DENSITIES",
        "commentItemVariants"
      ],
      "source": "packages/ui/src/molecules/comment-item",
      "axes": [
        {
          "axis": "density",
          "part": null,
          "values": [
            "compact",
            "comfortable"
          ],
          "default": null,
          "meaning": null
        }
      ],
      "needs": [],
      "patterns": [],
      "a11yExceptions": [],
      "decisions": [],
      "stories": [
        {
          "name": "Playground",
          "id": "components-molecules-commentitem--playground",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-commentitem--playground",
          "frame": "/iframe.html?id=components-molecules-commentitem--playground&viewMode=story"
        },
        {
          "name": "Compact",
          "id": "components-molecules-commentitem--compact",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-commentitem--compact",
          "frame": "/iframe.html?id=components-molecules-commentitem--compact&viewMode=story"
        },
        {
          "name": "With actions",
          "id": "components-molecules-commentitem--with-actions",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-commentitem--with-actions",
          "frame": "/iframe.html?id=components-molecules-commentitem--with-actions&viewMode=story"
        },
        {
          "name": "With badge",
          "id": "components-molecules-commentitem--with-badge",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-commentitem--with-badge",
          "frame": "/iframe.html?id=components-molecules-commentitem--with-badge&viewMode=story"
        },
        {
          "name": "Comment list",
          "id": "components-molecules-commentitem--comment-list",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-commentitem--comment-list",
          "frame": "/iframe.html?id=components-molecules-commentitem--comment-list&viewMode=story"
        }
      ],
      "storyFile": "tooling/storybook/stories/components/molecules/comment-item.stories.tsx"
    },
    {
      "id": "confirm-dialog-content",
      "name": "ConfirmDialogContent",
      "level": "molecule",
      "status": "stable",
      "purpose": "Asks a reader to confirm or cancel before something that matters.",
      "description": "Drop-in content for <DialogContent>. Renders DialogHeader (Title + Description) + DialogFooter (Cancel + Confirm). Three tones (neutral primary, warning primary, danger danger) — confirm button intent follows the tone. The consumer keeps control of open / onOpenChange. Patterns consulted: Patterns/Overlays · DialogAsTask, Patterns/Feedback · BlockingVsNonBlocking.",
      "role": "feedback",
      "import": "@rrios-forge/ui/molecules/confirm-dialog-content",
      "exports": [
        "ConfirmDialogContent",
        "CONFIRM_DIALOG_CONTENT_TONES",
        "confirmDialogContentVariants"
      ],
      "source": "packages/ui/src/molecules/confirm-dialog-content",
      "axes": [
        {
          "axis": "tone",
          "part": null,
          "values": [
            "neutral",
            "warning",
            "danger"
          ],
          "default": "neutral",
          "meaning": "Which semantic colour family the element speaks in."
        }
      ],
      "needs": [
        {
          "need": "Confirmation modal / generic modal",
          "answer": "`Dialog` + `ConfirmDialogContent` / `Dialog`"
        }
      ],
      "patterns": [],
      "a11yExceptions": [],
      "decisions": [
        {
          "id": "ADR-030",
          "title": "Axis vocabulary: one name, one meaning"
        }
      ],
      "stories": [
        {
          "name": "Playground",
          "id": "components-molecules-confirmdialogcontent--playground",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-confirmdialogcontent--playground",
          "frame": "/iframe.html?id=components-molecules-confirmdialogcontent--playground&viewMode=story"
        },
        {
          "name": "Danger",
          "id": "components-molecules-confirmdialogcontent--danger",
          "interaction": false,
          "snapshots": [
            "dark",
            "high-contrast",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-confirmdialogcontent--danger",
          "frame": "/iframe.html?id=components-molecules-confirmdialogcontent--danger&viewMode=story"
        },
        {
          "name": "Warning",
          "id": "components-molecules-confirmdialogcontent--warning",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-confirmdialogcontent--warning",
          "frame": "/iframe.html?id=components-molecules-confirmdialogcontent--warning&viewMode=story"
        },
        {
          "name": "Loading",
          "id": "components-molecules-confirmdialogcontent--loading",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-confirmdialogcontent--loading",
          "frame": "/iframe.html?id=components-molecules-confirmdialogcontent--loading&viewMode=story"
        },
        {
          "name": "In dialog",
          "id": "components-molecules-confirmdialogcontent--in-dialog",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-confirmdialogcontent--in-dialog",
          "frame": "/iframe.html?id=components-molecules-confirmdialogcontent--in-dialog&viewMode=story"
        }
      ],
      "storyFile": "tooling/storybook/stories/components/molecules/confirm-dialog-content.stories.tsx"
    },
    {
      "id": "data-row",
      "name": "DataRow",
      "level": "molecule",
      "status": "stable",
      "purpose": "Generic row for narrow lists (settings, audit).",
      "description": "Single row inside a list / pseudo-table: leading · (title + description) · columns · status · action. Renders <div role=\"row\"> so it composes inside non-table hosts. Two densities. Patterns consulted: Patterns/Density & Growth · DensityLevels + ContentGrowth.",
      "role": "content",
      "import": "@rrios-forge/ui/molecules/data-row",
      "exports": [
        "DataRow",
        "DATA_ROW_DENSITIES",
        "dataRowVariants"
      ],
      "source": "packages/ui/src/molecules/data-row",
      "axes": [
        {
          "axis": "selected",
          "part": null,
          "values": [
            "true",
            "false"
          ],
          "default": "false",
          "meaning": "Chosen in a set: the selected wash plus a non-colour cue (weight, check)."
        },
        {
          "axis": "interactive",
          "part": null,
          "values": [
            "true",
            "false"
          ],
          "default": "false",
          "meaning": "Responds to the pointer: hover and press feedback, a pointer cursor."
        }
      ],
      "needs": [
        {
          "need": "Property list / data row / list item",
          "answer": "`PropertyList` / `DataRow` / `ListItem`"
        }
      ],
      "patterns": [],
      "a11yExceptions": [],
      "decisions": [],
      "stories": [
        {
          "name": "Playground",
          "id": "components-molecules-datarow--playground",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-datarow--playground",
          "frame": "/iframe.html?id=components-molecules-datarow--playground&viewMode=story"
        },
        {
          "name": "With columns",
          "id": "components-molecules-datarow--with-columns",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-datarow--with-columns",
          "frame": "/iframe.html?id=components-molecules-datarow--with-columns&viewMode=story"
        },
        {
          "name": "With status",
          "id": "components-molecules-datarow--with-status",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-datarow--with-status",
          "frame": "/iframe.html?id=components-molecules-datarow--with-status&viewMode=story"
        },
        {
          "name": "Selected",
          "id": "components-molecules-datarow--selected",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-datarow--selected",
          "frame": "/iframe.html?id=components-molecules-datarow--selected&viewMode=story"
        },
        {
          "name": "Dense dataset",
          "id": "components-molecules-datarow--dense-dataset",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-datarow--dense-dataset",
          "frame": "/iframe.html?id=components-molecules-datarow--dense-dataset&viewMode=story"
        },
        {
          "name": "With actions",
          "id": "components-molecules-datarow--with-actions",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-datarow--with-actions",
          "frame": "/iframe.html?id=components-molecules-datarow--with-actions&viewMode=story"
        }
      ],
      "storyFile": "tooling/storybook/stories/components/molecules/data-row.stories.tsx"
    },
    {
      "id": "date-field",
      "name": "DateField",
      "level": "molecule",
      "status": "stable",
      "purpose": "Date input with custom calendar popover.",
      "description": "Apple-style date picker. The trigger reuses Input geometry; the popover renders a custom calendar (Radix Popover gives focus trap + escape-to-close; the calendar grid implements full keyboard navigation per the APG date picker pattern). Locale-aware via `Intl.DateTimeFormat`, theme-native via tokens — no hard-coded colours, no native browser picker.",
      "role": "input",
      "import": "@rrios-forge/ui/molecules/date-field",
      "exports": [
        "DateField",
        "dateFieldVariants",
        "dateFieldTriggerVariants",
        "dateFieldDayVariants"
      ],
      "source": "packages/ui/src/molecules/date-field",
      "axes": [
        {
          "axis": "size",
          "part": null,
          "values": [
            "sm",
            "md",
            "lg"
          ],
          "default": "md",
          "meaning": "Ergonomic scale, in three families (control, text, container)."
        },
        {
          "axis": "tone",
          "part": null,
          "values": [
            "neutral",
            "muted"
          ],
          "default": "neutral",
          "meaning": "Which semantic colour family the element speaks in."
        },
        {
          "axis": "selected",
          "part": null,
          "values": [
            "true",
            "false"
          ],
          "default": "false",
          "meaning": "Chosen in a set: the selected wash plus a non-colour cue (weight, check)."
        },
        {
          "axis": "today",
          "part": null,
          "values": [
            "true",
            "false"
          ],
          "default": "false",
          "meaning": "Marks the current day in a calendar."
        }
      ],
      "needs": [
        {
          "need": "Date field / file drop / slider",
          "answer": "`DateField` / `FileDropzone` / `Slider`"
        }
      ],
      "patterns": [],
      "a11yExceptions": [],
      "decisions": [
        {
          "id": "ADR-030",
          "title": "Axis vocabulary: one name, one meaning"
        },
        {
          "id": "ADR-043",
          "title": "The default theme is monochrome"
        }
      ],
      "stories": [
        {
          "name": "Playground",
          "id": "components-molecules-datefield--playground",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-datefield--playground",
          "frame": "/iframe.html?id=components-molecules-datefield--playground&viewMode=story"
        },
        {
          "name": "Required",
          "id": "components-molecules-datefield--required",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-datefield--required",
          "frame": "/iframe.html?id=components-molecules-datefield--required&viewMode=story"
        },
        {
          "name": "Invalid",
          "id": "components-molecules-datefield--invalid",
          "interaction": false,
          "snapshots": [
            "dark",
            "high-contrast",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-datefield--invalid",
          "frame": "/iframe.html?id=components-molecules-datefield--invalid&viewMode=story"
        },
        {
          "name": "Disabled",
          "id": "components-molecules-datefield--disabled",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-datefield--disabled",
          "frame": "/iframe.html?id=components-molecules-datefield--disabled&viewMode=story"
        },
        {
          "name": "Empty",
          "id": "components-molecules-datefield--empty",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-datefield--empty",
          "frame": "/iframe.html?id=components-molecules-datefield--empty&viewMode=story"
        },
        {
          "name": "With min / max bounds",
          "id": "components-molecules-datefield--with-bounds",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-datefield--with-bounds",
          "frame": "/iframe.html?id=components-molecules-datefield--with-bounds&viewMode=story"
        },
        {
          "name": "Open calendar",
          "id": "components-molecules-datefield--open",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-datefield--open",
          "frame": "/iframe.html?id=components-molecules-datefield--open&viewMode=story"
        },
        {
          "name": "Locales",
          "id": "components-molecules-datefield--locales",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-datefield--locales",
          "frame": "/iframe.html?id=components-molecules-datefield--locales&viewMode=story"
        },
        {
          "name": "Controlled",
          "id": "components-molecules-datefield--controlled",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-datefield--controlled",
          "frame": "/iframe.html?id=components-molecules-datefield--controlled&viewMode=story"
        },
        {
          "name": "With range",
          "id": "components-molecules-datefield--with-range",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-datefield--with-range",
          "frame": "/iframe.html?id=components-molecules-datefield--with-range&viewMode=story"
        },
        {
          "name": "Keyboard flow (interaction test)",
          "id": "components-molecules-datefield--keyboard-flow",
          "interaction": true,
          "snapshots": [],
          "skipsSnapshot": true,
          "docs": "/?path=/story/components-molecules-datefield--keyboard-flow",
          "frame": "/iframe.html?id=components-molecules-datefield--keyboard-flow&viewMode=story"
        },
        {
          "name": "Open focus (interaction test)",
          "id": "components-molecules-datefield--open-focus",
          "interaction": true,
          "snapshots": [],
          "skipsSnapshot": true,
          "docs": "/?path=/story/components-molecules-datefield--open-focus",
          "frame": "/iframe.html?id=components-molecules-datefield--open-focus&viewMode=story"
        },
        {
          "name": "Month paging (interaction test)",
          "id": "components-molecules-datefield--month-paging",
          "interaction": true,
          "snapshots": [],
          "skipsSnapshot": true,
          "docs": "/?path=/story/components-molecules-datefield--month-paging",
          "frame": "/iframe.html?id=components-molecules-datefield--month-paging&viewMode=story"
        }
      ],
      "storyFile": "tooling/storybook/stories/components/molecules/date-field.stories.tsx"
    },
    {
      "id": "dialog",
      "name": "Dialog",
      "level": "molecule",
      "status": "stable",
      "purpose": "A modal surface for a focused task; the page waits behind it.",
      "description": "Modal panel. Composes `@radix-ui/react-dialog` for the full modal contract: `aria-modal`, focus trap, focus return, escape-to-close, outside-click-to-close, body scroll lock, portal isolation. Title + Description are required for accessibility.",
      "role": "feedback",
      "import": "@rrios-forge/ui/molecules/dialog",
      "exports": [
        "Dialog",
        "DialogClose",
        "DialogContent",
        "DialogDescription",
        "DialogFooter",
        "DialogHeader",
        "DialogTitle",
        "DialogTrigger",
        "dialogContentVariants",
        "dialogOverlayVariants",
        "DIALOG_SIZES"
      ],
      "source": "packages/ui/src/molecules/dialog",
      "axes": [
        {
          "axis": "size",
          "part": null,
          "values": [
            "sm",
            "md",
            "lg",
            "xl"
          ],
          "default": "md",
          "meaning": "Ergonomic scale, in three families (control, text, container)."
        }
      ],
      "needs": [
        {
          "need": "Confirmation modal / generic modal",
          "answer": "`Dialog` + `ConfirmDialogContent` / `Dialog`"
        }
      ],
      "patterns": [],
      "a11yExceptions": [],
      "decisions": [
        {
          "id": "ADR-006",
          "title": "Geometry and typography signature"
        },
        {
          "id": "ADR-007",
          "title": "Material highlight on raised surfaces"
        },
        {
          "id": "ADR-009",
          "title": "Editorial Frame: PageShell v3 + new `TopBar` molecule"
        },
        {
          "id": "ADR-015",
          "title": "Drawer molecule on top of Radix Dialog"
        },
        {
          "id": "ADR-024",
          "title": "`LocaleSelector` is a new molecule, not an extension of `Combobox`"
        }
      ],
      "stories": [
        {
          "name": "Playground",
          "id": "components-molecules-dialog--playground",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-dialog--playground",
          "frame": "/iframe.html?id=components-molecules-dialog--playground&viewMode=story"
        },
        {
          "name": "Sizes",
          "id": "components-molecules-dialog--sizes",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-dialog--sizes",
          "frame": "/iframe.html?id=components-molecules-dialog--sizes&viewMode=story"
        },
        {
          "name": "With form",
          "id": "components-molecules-dialog--with-form",
          "interaction": false,
          "snapshots": [
            "dark",
            "high-contrast",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-dialog--with-form",
          "frame": "/iframe.html?id=components-molecules-dialog--with-form&viewMode=story"
        },
        {
          "name": "Focus flow (interaction test)",
          "id": "components-molecules-dialog--focus-flow",
          "interaction": true,
          "snapshots": [],
          "skipsSnapshot": true,
          "docs": "/?path=/story/components-molecules-dialog--focus-flow",
          "frame": "/iframe.html?id=components-molecules-dialog--focus-flow&viewMode=story"
        }
      ],
      "storyFile": "tooling/storybook/stories/components/molecules/dialog.stories.tsx"
    },
    {
      "id": "drawer",
      "name": "Drawer",
      "level": "molecule",
      "status": "stable",
      "purpose": "A panel that slides in from an edge for a secondary task.",
      "description": "Modal side panel. Composes `@radix-ui/react-dialog` for the full modal contract: `aria-modal`, focus trap, focus return, escape-to-close, outside-click-to-close, body scroll lock, portal isolation. Two semantic axes — `side` (right / left / top / bottom) and `size` (sm / md / lg / xl / full). Mobile (<md) is fullscreen regardless of `side`; the slide animation enters from the configured edge so the affordance stays consistent.",
      "role": "surface",
      "import": "@rrios-forge/ui/molecules/drawer",
      "exports": [
        "Drawer",
        "DrawerBody",
        "DrawerClose",
        "DrawerContent",
        "DrawerDescription",
        "DrawerFooter",
        "DrawerHeader",
        "DrawerTitle",
        "DrawerTrigger",
        "drawerBodyVariants",
        "drawerContentVariants",
        "drawerFooterVariants",
        "drawerHeaderVariants",
        "drawerOverlayVariants",
        "DRAWER_SIDES",
        "DRAWER_SIZES"
      ],
      "source": "packages/ui/src/molecules/drawer",
      "axes": [
        {
          "axis": "side",
          "part": null,
          "values": [
            "right",
            "left",
            "top",
            "bottom"
          ],
          "default": "right",
          "meaning": "Which side something belongs to."
        },
        {
          "axis": "size",
          "part": null,
          "values": [
            "sm",
            "md",
            "lg",
            "xl",
            "full"
          ],
          "default": "md",
          "meaning": "Ergonomic scale, in three families (control, text, container)."
        }
      ],
      "needs": [
        {
          "need": "Side panel",
          "answer": "`Drawer` or `Sheet`"
        }
      ],
      "patterns": [],
      "a11yExceptions": [],
      "decisions": [
        {
          "id": "ADR-015",
          "title": "Drawer molecule on top of Radix Dialog"
        },
        {
          "id": "ADR-016",
          "title": "NotificationCenter v2: Popover → Drawer + Provider/Hooks"
        }
      ],
      "stories": [
        {
          "name": "Playground",
          "id": "components-molecules-drawer--playground",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-drawer--playground",
          "frame": "/iframe.html?id=components-molecules-drawer--playground&viewMode=story"
        },
        {
          "name": "Sides",
          "id": "components-molecules-drawer--sides",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-drawer--sides",
          "frame": "/iframe.html?id=components-molecules-drawer--sides&viewMode=story"
        },
        {
          "name": "Sizes",
          "id": "components-molecules-drawer--sizes",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-drawer--sizes",
          "frame": "/iframe.html?id=components-molecules-drawer--sizes&viewMode=story"
        },
        {
          "name": "With long content",
          "id": "components-molecules-drawer--with-long-content",
          "interaction": false,
          "snapshots": [
            "dark",
            "high-contrast",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-drawer--with-long-content",
          "frame": "/iframe.html?id=components-molecules-drawer--with-long-content&viewMode=story"
        },
        {
          "name": "Accessibility",
          "id": "components-molecules-drawer--accessibility",
          "interaction": false,
          "snapshots": [
            "dark",
            "high-contrast",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-drawer--accessibility",
          "frame": "/iframe.html?id=components-molecules-drawer--accessibility&viewMode=story"
        }
      ],
      "storyFile": "tooling/storybook/stories/components/molecules/drawer.stories.tsx"
    },
    {
      "id": "dropdown-menu",
      "name": "DropdownMenu",
      "level": "molecule",
      "status": "stable",
      "purpose": "A menu of actions opened from a button.",
      "description": "Keyboard-navigable action menu. Composes `@radix-ui/react-dropdown-menu` so the ARIA contract (`role=\"menu\"`, roving focus, type-ahead, escape-to-close, focus return, portal isolation) is right by construction. Supports plain Items, CheckboxItems, RadioGroups, nested SubMenus, Labels, Separators and a trailing Shortcut hint.",
      "role": "action",
      "import": "@rrios-forge/ui/molecules/dropdown-menu",
      "exports": [
        "DropdownMenu",
        "DropdownMenuCheckboxItem",
        "DropdownMenuContent",
        "DropdownMenuGroup",
        "DropdownMenuItem",
        "DropdownMenuLabel",
        "DropdownMenuRadioGroup",
        "DropdownMenuRadioItem",
        "DropdownMenuSeparator",
        "DropdownMenuShortcut",
        "DropdownMenuSub",
        "DropdownMenuSubContent",
        "DropdownMenuSubTrigger",
        "DropdownMenuTrigger",
        "dropdownMenuContentVariants",
        "dropdownMenuItemVariants",
        "DROPDOWN_MENU_ITEM_INTENTS",
        "DROPDOWN_MENU_ITEM_TONES",
        "DROPDOWN_MENU_SIZES"
      ],
      "source": "packages/ui/src/molecules/dropdown-menu",
      "axes": [
        {
          "axis": "size",
          "part": null,
          "values": [
            "sm",
            "md",
            "lg"
          ],
          "default": "md",
          "meaning": "Ergonomic scale, in three families (control, text, container)."
        },
        {
          "axis": "tone",
          "part": null,
          "values": [
            "neutral"
          ],
          "default": "neutral",
          "meaning": "Which semantic colour family the element speaks in."
        },
        {
          "axis": "intent",
          "part": null,
          "values": [
            "neutral",
            "danger"
          ],
          "default": "neutral",
          "meaning": "What an action does."
        }
      ],
      "needs": [
        {
          "need": "Tooltip / popover / contextual menu",
          "answer": "`Tooltip` / `Popover` / `DropdownMenu`"
        }
      ],
      "patterns": [],
      "a11yExceptions": [],
      "decisions": [
        {
          "id": "ADR-003",
          "title": "Storybook editorial convention and pattern↔component bidirectionality"
        },
        {
          "id": "ADR-005",
          "title": "Visual operational rules: surfaces, interaction, motion"
        },
        {
          "id": "ADR-006",
          "title": "Geometry and typography signature"
        },
        {
          "id": "ADR-007",
          "title": "Material highlight on raised surfaces"
        },
        {
          "id": "ADR-015",
          "title": "Drawer molecule on top of Radix Dialog"
        },
        {
          "id": "ADR-018",
          "title": "Motion language as a Pattern Layer contract"
        },
        {
          "id": "ADR-024",
          "title": "`LocaleSelector` is a new molecule, not an extension of `Combobox`"
        },
        {
          "id": "ADR-027",
          "title": "Vibrant is the system's material, not one of its members"
        },
        {
          "id": "ADR-030",
          "title": "Axis vocabulary: one name, one meaning"
        },
        {
          "id": "ADR-033",
          "title": "The material ships once, and the night is tokens"
        }
      ],
      "stories": [
        {
          "name": "Playground",
          "id": "components-molecules-dropdownmenu--playground",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-dropdownmenu--playground",
          "frame": "/iframe.html?id=components-molecules-dropdownmenu--playground&viewMode=story"
        },
        {
          "name": "With checkboxes",
          "id": "components-molecules-dropdownmenu--with-checkboxes",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-dropdownmenu--with-checkboxes",
          "frame": "/iframe.html?id=components-molecules-dropdownmenu--with-checkboxes&viewMode=story"
        },
        {
          "name": "With radio group",
          "id": "components-molecules-dropdownmenu--with-radio-group",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-dropdownmenu--with-radio-group",
          "frame": "/iframe.html?id=components-molecules-dropdownmenu--with-radio-group&viewMode=story"
        },
        {
          "name": "With submenu",
          "id": "components-molecules-dropdownmenu--with-submenu",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-dropdownmenu--with-submenu",
          "frame": "/iframe.html?id=components-molecules-dropdownmenu--with-submenu&viewMode=story"
        },
        {
          "name": "Account menu",
          "id": "components-molecules-dropdownmenu--account-menu",
          "interaction": false,
          "snapshots": [
            "dark",
            "high-contrast",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-dropdownmenu--account-menu",
          "frame": "/iframe.html?id=components-molecules-dropdownmenu--account-menu&viewMode=story"
        },
        {
          "name": "Keyboard flow (interaction test)",
          "id": "components-molecules-dropdownmenu--keyboard-flow",
          "interaction": true,
          "snapshots": [],
          "skipsSnapshot": true,
          "docs": "/?path=/story/components-molecules-dropdownmenu--keyboard-flow",
          "frame": "/iframe.html?id=components-molecules-dropdownmenu--keyboard-flow&viewMode=story"
        }
      ],
      "storyFile": "tooling/storybook/stories/components/molecules/dropdown-menu.stories.tsx"
    },
    {
      "id": "empty-state",
      "name": "EmptyState",
      "level": "molecule",
      "status": "stable",
      "purpose": "Tells people why a surface is empty and what to do first.",
      "description": "Centred title + description + actions explaining a zero / blocked state and the next move. Title is required; vague copy ('Nothing here') is documented as an anti-pattern. Patterns consulted: Patterns/Feedback · LoadingFeedback, Patterns/Page Shells · EmptyPage, Patterns/Information Architecture · BasicHierarchy.",
      "role": "feedback",
      "import": "@rrios-forge/ui/molecules/empty-state",
      "exports": [
        "EmptyState",
        "EMPTY_STATE_SIZES",
        "EMPTY_STATE_TONES",
        "emptyStateIconVariants",
        "emptyStateVariants"
      ],
      "source": "packages/ui/src/molecules/empty-state",
      "axes": [
        {
          "axis": "size",
          "part": null,
          "values": [
            "sm",
            "md",
            "lg"
          ],
          "default": "md",
          "meaning": "Ergonomic scale, in three families (control, text, container)."
        },
        {
          "axis": "tone",
          "part": null,
          "values": [
            "neutral",
            "info",
            "success",
            "warning",
            "danger"
          ],
          "default": "neutral",
          "meaning": "Which semantic colour family the element speaks in."
        }
      ],
      "needs": [
        {
          "need": "Empty / loading state",
          "answer": "`EmptyState` / `LoadingState` or `Skeleton`"
        }
      ],
      "patterns": [],
      "a11yExceptions": [],
      "decisions": [
        {
          "id": "ADR-030",
          "title": "Axis vocabulary: one name, one meaning"
        }
      ],
      "stories": [
        {
          "name": "Playground",
          "id": "components-molecules-emptystate--playground",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-emptystate--playground",
          "frame": "/iframe.html?id=components-molecules-emptystate--playground&viewMode=story"
        },
        {
          "name": "Tones",
          "id": "components-molecules-emptystate--tones",
          "interaction": false,
          "snapshots": [
            "dark",
            "high-contrast",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-emptystate--tones",
          "frame": "/iframe.html?id=components-molecules-emptystate--tones&viewMode=story"
        },
        {
          "name": "Sizes",
          "id": "components-molecules-emptystate--sizes",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-emptystate--sizes",
          "frame": "/iframe.html?id=components-molecules-emptystate--sizes&viewMode=story"
        },
        {
          "name": "Search empty",
          "id": "components-molecules-emptystate--search-empty",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-emptystate--search-empty",
          "frame": "/iframe.html?id=components-molecules-emptystate--search-empty&viewMode=story"
        },
        {
          "name": "Permission empty",
          "id": "components-molecules-emptystate--permission-empty",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-emptystate--permission-empty",
          "frame": "/iframe.html?id=components-molecules-emptystate--permission-empty&viewMode=story"
        },
        {
          "name": "Error empty",
          "id": "components-molecules-emptystate--error-empty",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-emptystate--error-empty",
          "frame": "/iframe.html?id=components-molecules-emptystate--error-empty&viewMode=story"
        },
        {
          "name": "With actions",
          "id": "components-molecules-emptystate--with-actions",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-emptystate--with-actions",
          "frame": "/iframe.html?id=components-molecules-emptystate--with-actions&viewMode=story"
        }
      ],
      "storyFile": "tooling/storybook/stories/components/molecules/empty-state.stories.tsx"
    },
    {
      "id": "error-summary",
      "name": "ErrorSummary",
      "level": "molecule",
      "status": "stable",
      "purpose": "Lists what went wrong in a form and takes people to each mistake.",
      "description": "Summary of validation errors at the top of a form. role=alert + aria-live=assertive. Each error optionally links to the field via href. Field-level errors still live next to their inputs (Field.Error); ErrorSummary supplements, never replaces. Patterns consulted: Patterns/Forms · ValidationFlow.",
      "role": "feedback",
      "import": "@rrios-forge/ui/molecules/error-summary",
      "exports": [
        "ErrorSummary",
        "errorSummaryVariants"
      ],
      "source": "packages/ui/src/molecules/error-summary",
      "axes": [],
      "needs": [],
      "patterns": [],
      "a11yExceptions": [],
      "decisions": [],
      "stories": [
        {
          "name": "Playground",
          "id": "components-molecules-errorsummary--playground",
          "interaction": false,
          "snapshots": [
            "dark",
            "high-contrast",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-errorsummary--playground",
          "frame": "/iframe.html?id=components-molecules-errorsummary--playground&viewMode=story"
        },
        {
          "name": "With links",
          "id": "components-molecules-errorsummary--with-links",
          "interaction": false,
          "snapshots": [
            "dark",
            "high-contrast",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-errorsummary--with-links",
          "frame": "/iframe.html?id=components-molecules-errorsummary--with-links&viewMode=story"
        },
        {
          "name": "Without links",
          "id": "components-molecules-errorsummary--without-links",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-errorsummary--without-links",
          "frame": "/iframe.html?id=components-molecules-errorsummary--without-links&viewMode=story"
        },
        {
          "name": "In form",
          "id": "components-molecules-errorsummary--in-form",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-errorsummary--in-form",
          "frame": "/iframe.html?id=components-molecules-errorsummary--in-form&viewMode=story"
        }
      ],
      "storyFile": "tooling/storybook/stories/components/molecules/error-summary.stories.tsx"
    },
    {
      "id": "field",
      "name": "Field",
      "level": "molecule",
      "status": "stable",
      "purpose": "One form question: its label, the control, a hint and any error.",
      "description": "**Purpose.** The canonical accessible form composition. `Field` is the molecule that *binds* a label, a control, a description and an error into a single semantic unit, owning the wiring (`id`, `htmlFor`, `aria-describedby`, `aria-invalid`, `aria-required`) so the consumer never forgets it.\n\n**When to use.**\n- Any input that needs a visible label (almost always).\n- A choice control (radio, checkbox, switch) that participates in a form.\n- A composite control (Select, Combobox, DateField, FileDropzone) that should expose the same a11y contract as a plain Input.\n\n**When NOT to use.**\n- Inline single-input search bars where the placeholder *is* the label (controversial, but accepted) — use the bare control.\n- Toolbar-style toggles where the affordance is a `Switch` without descriptive copy — use the atom directly.\n- A list of independent options *not* tied to a label (a permission grid, a settings switchboard) — use `ChoiceGroup` or `SettingsField`.\n\n**Composes with.**\n- `Field.Label` (always), `Field.Control` (wraps the input atom), `Field.Description` (intent / hint), `Field.Error` (validation).\n- Controls: `Input`, `Textarea`, `Select`, `Combobox`, `Checkbox`, `Radio`, `Switch`, `DateField`, `Slider`, `FileDropzone` — anything that accepts standard ARIA attributes on its rendered DOM element.\n- `FormSection` consumes Field as the row unit; `ErrorSummary` aggregates errors that originate in Field.\n\n**Accessibility.**\n- `Field.Label` becomes the control's accessible name via `htmlFor` ↔ `id`. Required fields expose `aria-required` automatically.\n- `Field.Description` and `Field.Error` are joined into the control's `aria-describedby` so assistive tech reads the hint and the error in order.\n- `invalid` propagates `aria-invalid=\"true\"` and triggers the error tone on the control's chrome.\n- `disabled` propagates to the control and visually demotes the label without removing it from screen readers.\n- Radio / Checkbox / Switch controls keep their native semantics; the molecule never wraps them in extra interactive divs.\n\n**Related patterns.**\n- `Patterns/Forms · FieldAnatomy` — the four-slot anatomy this molecule renders.\n- `Patterns/Forms · ValidationFlow` — when and where the error appears.\n- `Patterns/Feedback · InlineFeedback` — why the error stays next to its cause.\n- `Patterns/Composition · AtomToMolecule` — Field as the first molecule a form needs.",
      "role": "input",
      "import": "@rrios-forge/ui/molecules/field",
      "exports": [
        "Field",
        "FieldRoot",
        "FieldControl",
        "FieldDescription",
        "FieldError",
        "FieldLabel",
        "useFieldContext",
        "FIELD_ORIENTATIONS",
        "fieldVariants"
      ],
      "source": "packages/ui/src/molecules/field",
      "axes": [
        {
          "axis": "orientation",
          "part": null,
          "values": [
            "vertical",
            "horizontal"
          ],
          "default": "vertical",
          "meaning": "The direction the parts run: a row (horizontal) or a column (vertical); responsive stacks on phones and runs in a row from sm."
        },
        {
          "axis": "disabled",
          "part": null,
          "values": [
            "true",
            "false"
          ],
          "default": "false",
          "meaning": "Not available: dimmed, skipped by the keyboard, ignores the pointer."
        }
      ],
      "needs": [
        {
          "need": "Field with label + helper + error",
          "answer": "`Field` + `Input`/`Textarea`/`Select`"
        }
      ],
      "patterns": [
        "Patterns/Forms · FieldAnatomy",
        "Patterns/Forms · ValidationFlow",
        "Patterns/Forms · ChoiceControls",
        "Patterns/Feedback · InlineFeedback",
        "Patterns/Composition · AtomToMolecule"
      ],
      "a11yExceptions": [],
      "decisions": [
        {
          "id": "ADR-004",
          "title": "Migrate boolean configuration props to semantic axes"
        },
        {
          "id": "ADR-006",
          "title": "Geometry and typography signature"
        },
        {
          "id": "ADR-035",
          "title": "Motion grammar: the gate before motion, slop by repetition, and what reduced motion keeps"
        }
      ],
      "stories": [
        {
          "name": "Playground",
          "id": "components-molecules-field--playground",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-field--playground",
          "frame": "/iframe.html?id=components-molecules-field--playground&viewMode=story"
        },
        {
          "name": "With Input",
          "id": "components-molecules-field--with-input",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-field--with-input",
          "frame": "/iframe.html?id=components-molecules-field--with-input&viewMode=story"
        },
        {
          "name": "With Textarea",
          "id": "components-molecules-field--with-textarea",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-field--with-textarea",
          "frame": "/iframe.html?id=components-molecules-field--with-textarea&viewMode=story"
        },
        {
          "name": "With Select",
          "id": "components-molecules-field--with-select",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-field--with-select",
          "frame": "/iframe.html?id=components-molecules-field--with-select&viewMode=story"
        },
        {
          "name": "With Checkbox",
          "id": "components-molecules-field--with-checkbox",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-field--with-checkbox",
          "frame": "/iframe.html?id=components-molecules-field--with-checkbox&viewMode=story"
        },
        {
          "name": "Invalid",
          "id": "components-molecules-field--invalid",
          "interaction": false,
          "snapshots": [
            "dark",
            "high-contrast",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-field--invalid",
          "frame": "/iframe.html?id=components-molecules-field--invalid&viewMode=story"
        },
        {
          "name": "Disabled",
          "id": "components-molecules-field--disabled",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-field--disabled",
          "frame": "/iframe.html?id=components-molecules-field--disabled&viewMode=story"
        },
        {
          "name": "Required",
          "id": "components-molecules-field--required",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-field--required",
          "frame": "/iframe.html?id=components-molecules-field--required&viewMode=story"
        },
        {
          "name": "Density examples",
          "id": "components-molecules-field--density-examples",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-field--density-examples",
          "frame": "/iframe.html?id=components-molecules-field--density-examples&viewMode=story"
        },
        {
          "name": "Accessibility",
          "id": "components-molecules-field--accessibility",
          "interaction": false,
          "snapshots": [
            "dark",
            "high-contrast",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-field--accessibility",
          "frame": "/iframe.html?id=components-molecules-field--accessibility&viewMode=story"
        }
      ],
      "storyFile": "tooling/storybook/stories/components/molecules/field.stories.tsx"
    },
    {
      "id": "file-dropzone",
      "name": "FileDropzone",
      "level": "molecule",
      "status": "stable",
      "purpose": "Lets people drop files onto an area or browse for them.",
      "description": "Real <input type=\"file\"> clipped behind the surface so click + keyboard work; drag/drop is layered on top, never the only interaction. The molecule never owns drag-state internally — the consumer wires onDragEnter/onDragLeave and flips dragging.",
      "role": "input",
      "import": "@rrios-forge/ui/molecules/file-dropzone",
      "exports": [
        "FileDropzone",
        "FILE_DROPZONE_SIZES",
        "FILE_DROPZONE_TONES",
        "fileDropzoneVariants"
      ],
      "source": "packages/ui/src/molecules/file-dropzone",
      "axes": [
        {
          "axis": "tone",
          "part": null,
          "values": [
            "neutral",
            "info",
            "danger"
          ],
          "default": "neutral",
          "meaning": "Which semantic colour family the element speaks in."
        },
        {
          "axis": "size",
          "part": null,
          "values": [
            "sm",
            "md",
            "lg"
          ],
          "default": "md",
          "meaning": "Ergonomic scale, in three families (control, text, container)."
        },
        {
          "axis": "dragging",
          "part": null,
          "values": [
            "true",
            "false"
          ],
          "default": "false",
          "meaning": "Something is being dragged over it: the drop target lights up."
        },
        {
          "axis": "invalid",
          "part": null,
          "values": [
            "true",
            "false"
          ],
          "default": "false",
          "meaning": "Fails validation: a danger edge, announced as invalid; pair it with an error message."
        },
        {
          "axis": "disabled",
          "part": null,
          "values": [
            "true",
            "false"
          ],
          "default": "false",
          "meaning": "Not available: dimmed, skipped by the keyboard, ignores the pointer."
        }
      ],
      "needs": [
        {
          "need": "Date field / file drop / slider",
          "answer": "`DateField` / `FileDropzone` / `Slider`"
        }
      ],
      "patterns": [],
      "a11yExceptions": [],
      "decisions": [
        {
          "id": "ADR-028",
          "title": "The label is not the fill"
        },
        {
          "id": "ADR-030",
          "title": "Axis vocabulary: one name, one meaning"
        }
      ],
      "stories": [
        {
          "name": "Playground",
          "id": "components-molecules-filedropzone--playground",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-filedropzone--playground",
          "frame": "/iframe.html?id=components-molecules-filedropzone--playground&viewMode=story"
        },
        {
          "name": "Sizes",
          "id": "components-molecules-filedropzone--sizes",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-filedropzone--sizes",
          "frame": "/iframe.html?id=components-molecules-filedropzone--sizes&viewMode=story"
        },
        {
          "name": "Dragging",
          "id": "components-molecules-filedropzone--dragging",
          "interaction": false,
          "snapshots": [
            "dark",
            "high-contrast",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-filedropzone--dragging",
          "frame": "/iframe.html?id=components-molecules-filedropzone--dragging&viewMode=story"
        },
        {
          "name": "Invalid",
          "id": "components-molecules-filedropzone--invalid",
          "interaction": false,
          "snapshots": [
            "dark",
            "high-contrast",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-filedropzone--invalid",
          "frame": "/iframe.html?id=components-molecules-filedropzone--invalid&viewMode=story"
        },
        {
          "name": "Disabled",
          "id": "components-molecules-filedropzone--disabled",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-filedropzone--disabled",
          "frame": "/iframe.html?id=components-molecules-filedropzone--disabled&viewMode=story"
        },
        {
          "name": "With selected files",
          "id": "components-molecules-filedropzone--with-selected-files",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-filedropzone--with-selected-files",
          "frame": "/iframe.html?id=components-molecules-filedropzone--with-selected-files&viewMode=story"
        }
      ],
      "storyFile": "tooling/storybook/stories/components/molecules/file-dropzone.stories.tsx"
    },
    {
      "id": "filter-bar",
      "name": "FilterBar",
      "level": "molecule",
      "status": "experimental",
      "purpose": "Narrows a list by a few filters and shows which ones are on.",
      "description": "Two-row toolbar: search · filters · actions on top, optional active-filter chips below. Renders <section role=\"region\">. Patterns consulted: Patterns/Navigation · TabsForLocalContext, Patterns/Forms · SearchAndSelect, Patterns/Density & Growth · ActionOverflow.",
      "role": "surface",
      "import": "@rrios-forge/ui/molecules/filter-bar",
      "exports": [
        "FilterBar",
        "FILTER_BAR_DENSITIES",
        "filterBarVariants"
      ],
      "source": "packages/ui/src/molecules/filter-bar",
      "axes": [
        {
          "axis": "density",
          "part": null,
          "values": [
            "compact",
            "comfortable"
          ],
          "default": null,
          "meaning": null
        }
      ],
      "needs": [
        {
          "need": "Filters / pagination / stepper",
          "answer": "`FilterBar` / `Pagination` / `Stepper`"
        }
      ],
      "patterns": [],
      "a11yExceptions": [],
      "decisions": [],
      "stories": [
        {
          "name": "Playground",
          "id": "components-molecules-filterbar--playground",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-filterbar--playground",
          "frame": "/iframe.html?id=components-molecules-filterbar--playground&viewMode=story"
        },
        {
          "name": "With search",
          "id": "components-molecules-filterbar--with-search",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-filterbar--with-search",
          "frame": "/iframe.html?id=components-molecules-filterbar--with-search&viewMode=story"
        },
        {
          "name": "With select filters",
          "id": "components-molecules-filterbar--with-select-filters",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-filterbar--with-select-filters",
          "frame": "/iframe.html?id=components-molecules-filterbar--with-select-filters&viewMode=story"
        },
        {
          "name": "With active filters",
          "id": "components-molecules-filterbar--with-active-filters",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-filterbar--with-active-filters",
          "frame": "/iframe.html?id=components-molecules-filterbar--with-active-filters&viewMode=story"
        },
        {
          "name": "Dense",
          "id": "components-molecules-filterbar--dense",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-filterbar--dense",
          "frame": "/iframe.html?id=components-molecules-filterbar--dense&viewMode=story"
        },
        {
          "name": "In data page",
          "id": "components-molecules-filterbar--in-data-page",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-filterbar--in-data-page",
          "frame": "/iframe.html?id=components-molecules-filterbar--in-data-page&viewMode=story"
        }
      ],
      "storyFile": "tooling/storybook/stories/components/molecules/filter-bar.stories.tsx"
    },
    {
      "id": "form-section",
      "name": "FormSection",
      "level": "molecule",
      "status": "stable",
      "purpose": "Gathers related form fields under a title and a short explanation.",
      "description": "Composes SectionHeader (when title is provided) and stacks Fields below. Renders a <section> landmark. density toggles inter-field gap; the host owns padding. Patterns consulted: Patterns/Forms · FieldAnatomy + FormDensity, Patterns/Information Architecture · SectionAnatomy.",
      "role": "surface",
      "import": "@rrios-forge/ui/molecules/form-section",
      "exports": [
        "FormSection",
        "FORM_SECTION_DENSITIES",
        "FORM_SECTION_WIDTHS",
        "formSectionFieldsVariants",
        "formSectionVariants"
      ],
      "source": "packages/ui/src/molecules/form-section",
      "axes": [
        {
          "axis": "density",
          "part": null,
          "values": [
            "compact",
            "comfortable"
          ],
          "default": null,
          "meaning": null
        },
        {
          "axis": "width",
          "part": null,
          "values": [
            "readable",
            "full"
          ],
          "default": null,
          "meaning": null
        }
      ],
      "needs": [
        {
          "need": "Group of fields",
          "answer": "`FormSection` or `InputGroup`"
        }
      ],
      "patterns": [],
      "a11yExceptions": [],
      "decisions": [
        {
          "id": "ADR-005",
          "title": "Visual operational rules: surfaces, interaction, motion"
        },
        {
          "id": "ADR-006",
          "title": "Geometry and typography signature"
        }
      ],
      "stories": [
        {
          "name": "Playground",
          "id": "components-molecules-formsection--playground",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-formsection--playground",
          "frame": "/iframe.html?id=components-molecules-formsection--playground&viewMode=story"
        },
        {
          "name": "Account section",
          "id": "components-molecules-formsection--account-section",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-formsection--account-section",
          "frame": "/iframe.html?id=components-molecules-formsection--account-section&viewMode=story"
        },
        {
          "name": "Security section",
          "id": "components-molecules-formsection--security-section",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-formsection--security-section",
          "frame": "/iframe.html?id=components-molecules-formsection--security-section&viewMode=story"
        },
        {
          "name": "Compact",
          "id": "components-molecules-formsection--compact",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-formsection--compact",
          "frame": "/iframe.html?id=components-molecules-formsection--compact&viewMode=story"
        },
        {
          "name": "With action",
          "id": "components-molecules-formsection--with-action",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-formsection--with-action",
          "frame": "/iframe.html?id=components-molecules-formsection--with-action&viewMode=story"
        }
      ],
      "storyFile": "tooling/storybook/stories/components/molecules/form-section.stories.tsx"
    },
    {
      "id": "input-group",
      "name": "InputGroup",
      "level": "molecule",
      "status": "stable",
      "purpose": "A text input joined with a prefix, a suffix or a button.",
      "description": "Compound input wrapper. The group is the focusable surface (focus-within ring sits on the wrapper); the inner Input keeps its native semantics. size, invalid and disabled propagate via context. Prefix and suffix never replace a Label — wrap the InputGroup in a Field. Patterns consulted: Patterns/Forms · FieldAnatomy + SearchAndSelect, Patterns/Density & Growth · MetadataCompression.",
      "role": "input",
      "import": "@rrios-forge/ui/molecules/input-group",
      "exports": [
        "InputGroup",
        "InputGroupAction",
        "InputGroupIcon",
        "InputGroupInput",
        "InputGroupPrefix",
        "InputGroupSuffix",
        "INPUT_GROUP_AFFIX_PADDING",
        "INPUT_GROUP_LEADING_AFFIX_PADDING",
        "INPUT_GROUP_TRAILING_AFFIX_PADDING",
        "INPUT_GROUP_SIZES",
        "inputGroupVariants"
      ],
      "source": "packages/ui/src/molecules/input-group",
      "axes": [
        {
          "axis": "size",
          "part": null,
          "values": [
            "sm",
            "md",
            "lg"
          ],
          "default": "md",
          "meaning": "Ergonomic scale, in three families (control, text, container)."
        },
        {
          "axis": "invalid",
          "part": null,
          "values": [
            "true",
            "false"
          ],
          "default": "false",
          "meaning": "Fails validation: a danger edge, announced as invalid; pair it with an error message."
        },
        {
          "axis": "disabled",
          "part": null,
          "values": [
            "true",
            "false"
          ],
          "default": "false",
          "meaning": "Not available: dimmed, skipped by the keyboard, ignores the pointer."
        }
      ],
      "needs": [
        {
          "need": "Group of fields",
          "answer": "`FormSection` or `InputGroup`"
        }
      ],
      "patterns": [],
      "a11yExceptions": [],
      "decisions": [],
      "stories": [
        {
          "name": "Playground",
          "id": "components-molecules-inputgroup--playground",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-inputgroup--playground",
          "frame": "/iframe.html?id=components-molecules-inputgroup--playground&viewMode=story"
        },
        {
          "name": "With leading icon",
          "id": "components-molecules-inputgroup--with-leading-icon",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-inputgroup--with-leading-icon",
          "frame": "/iframe.html?id=components-molecules-inputgroup--with-leading-icon&viewMode=story"
        },
        {
          "name": "With prefix",
          "id": "components-molecules-inputgroup--with-prefix",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-inputgroup--with-prefix",
          "frame": "/iframe.html?id=components-molecules-inputgroup--with-prefix&viewMode=story"
        },
        {
          "name": "With suffix",
          "id": "components-molecules-inputgroup--with-suffix",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-inputgroup--with-suffix",
          "frame": "/iframe.html?id=components-molecules-inputgroup--with-suffix&viewMode=story"
        },
        {
          "name": "With action",
          "id": "components-molecules-inputgroup--with-action",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-inputgroup--with-action",
          "frame": "/iframe.html?id=components-molecules-inputgroup--with-action&viewMode=story"
        },
        {
          "name": "Invalid",
          "id": "components-molecules-inputgroup--invalid",
          "interaction": false,
          "snapshots": [
            "dark",
            "high-contrast",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-inputgroup--invalid",
          "frame": "/iframe.html?id=components-molecules-inputgroup--invalid&viewMode=story"
        },
        {
          "name": "Disabled",
          "id": "components-molecules-inputgroup--disabled",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-inputgroup--disabled",
          "frame": "/iframe.html?id=components-molecules-inputgroup--disabled&viewMode=story"
        },
        {
          "name": "In Field",
          "id": "components-molecules-inputgroup--in-field",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-inputgroup--in-field",
          "frame": "/iframe.html?id=components-molecules-inputgroup--in-field&viewMode=story"
        }
      ],
      "storyFile": "tooling/storybook/stories/components/molecules/input-group.stories.tsx"
    },
    {
      "id": "input-otp",
      "name": "InputOtp",
      "level": "molecule",
      "status": "stable",
      "purpose": "Takes a one-time code, one digit per box, pasted or typed.",
      "description": "**Purpose.** Single-purpose molecule for entering a one-time code as a row of single-character slots. Auto-advances on input, retreats on backspace, distributes paste across the row, and exposes a single concatenated value to the form layer. Mirrors the Input atom's visual contract so the two read as the same family.\n\n**When to use.**\n- Two-factor authentication and email/SMS verification flows.\n- Account-recovery codes and step-up authentication.\n- Any short, fixed-length code that benefits from per-character visual feedback.\n\n**When NOT to use.**\n- Variable-length codes or longer secrets — use `Input type=\"password\"`.\n- Free-text identifiers or coupons — use `Input` with `pattern`.\n- Reading existing codes back to the user as plain text — render with `Code`.\n\n**Composes with.**\n- `Field` + `Field.Label` + `Field.Description` + `Field.Error` — wrap the row to inherit the molecule's full ARIA wiring and visual rhythm.\n- `Button` for the resend / submit affordances that typically sit beneath the row.\n- `Card.tone=\"elevated\"` as the canonical container for a sign-in step.\n\n**Accessibility.**\n- `aria-label` is required on the row (e.g. \"One-time code\"). Each slot is auto-labelled `Code digit N of LENGTH` so screen-reader users always know where they are.\n- The control wires `aria-invalid` and `aria-required` on every slot from the row's props; `aria-describedby` propagates so a `Field.Error` anchors correctly.\n- The first slot uses `autoComplete=\"one-time-code\"` so iOS/Android surface the SMS code as a keyboard suggestion.\n- `inputMode` defaults to `numeric` (numeric soft keyboard); `pattern` defaults to `^\\d$` per slot. Override both for alphanumeric codes.\n- Backspace clears the focused slot in place; pressing it again retreats. Arrow keys, Home, End and paste behave per platform expectations.\n- `disabled` dims the whole row as a single block; the slots remain in the tab order only when the row is enabled.\n\n**Related patterns.**\n- `Patterns/Forms · FieldAnatomy` — wrap the row in a `Field` for the canonical Label · Control · Description / Error stack.\n- `Patterns/Forms · ValidationFlow` — error placement and tone.\n- `Patterns/Feedback · InlineFeedback` — error lives next to its cause.\n- `Patterns/Composition · AtomToMolecule` — InputOtp is a leaf molecule, not a primitive.\n- `Patterns/Decision Matrix · ComponentChoice` — pick `InputOtp` over `Input` when the input is a fixed-length code.",
      "role": "input",
      "import": "@rrios-forge/ui/molecules/input-otp",
      "exports": [
        "InputOtp",
        "INPUT_OTP_SIZES",
        "inputOtpSlotVariants",
        "inputOtpVariants"
      ],
      "source": "packages/ui/src/molecules/input-otp",
      "axes": [
        {
          "axis": "size",
          "part": null,
          "values": [
            "sm",
            "md",
            "lg"
          ],
          "default": "md",
          "meaning": "Ergonomic scale, in three families (control, text, container)."
        },
        {
          "axis": "invalid",
          "part": null,
          "values": [
            "true",
            "false"
          ],
          "default": "false",
          "meaning": "Fails validation: a danger edge, announced as invalid; pair it with an error message."
        },
        {
          "axis": "filled",
          "part": null,
          "values": [
            "true",
            "false"
          ],
          "default": "false",
          "meaning": "Holds a value: the label stays raised over the field."
        },
        {
          "axis": "disabled",
          "part": null,
          "values": [
            "true",
            "false"
          ],
          "default": "false",
          "meaning": "Not available: dimmed, skipped by the keyboard, ignores the pointer."
        }
      ],
      "needs": [
        {
          "need": "OTP / 2FA code",
          "answer": "`InputOtp` (molecule)"
        }
      ],
      "patterns": [
        "Patterns/Forms · FieldAnatomy",
        "Patterns/Forms · ValidationFlow",
        "Patterns/Feedback · InlineFeedback",
        "Patterns/Composition · AtomToMolecule",
        "Patterns/Decision Matrix · ComponentChoice"
      ],
      "a11yExceptions": [],
      "decisions": [],
      "stories": [
        {
          "name": "Playground",
          "id": "components-molecules-inputotp--playground",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-inputotp--playground",
          "frame": "/iframe.html?id=components-molecules-inputotp--playground&viewMode=story"
        },
        {
          "name": "Sizes",
          "id": "components-molecules-inputotp--sizes",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-inputotp--sizes",
          "frame": "/iframe.html?id=components-molecules-inputotp--sizes&viewMode=story"
        },
        {
          "name": "States",
          "id": "components-molecules-inputotp--states",
          "interaction": false,
          "snapshots": [
            "dark",
            "high-contrast",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-inputotp--states",
          "frame": "/iframe.html?id=components-molecules-inputotp--states&viewMode=story"
        },
        {
          "name": "In Context",
          "id": "components-molecules-inputotp--in-context",
          "interaction": false,
          "snapshots": [
            "dark",
            "high-contrast",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-inputotp--in-context",
          "frame": "/iframe.html?id=components-molecules-inputotp--in-context&viewMode=story"
        },
        {
          "name": "Typing flow (interaction test)",
          "id": "components-molecules-inputotp--typing-flow",
          "interaction": true,
          "snapshots": [],
          "skipsSnapshot": true,
          "docs": "/?path=/story/components-molecules-inputotp--typing-flow",
          "frame": "/iframe.html?id=components-molecules-inputotp--typing-flow&viewMode=story"
        }
      ],
      "storyFile": "tooling/storybook/stories/components/molecules/input-otp.stories.tsx"
    },
    {
      "id": "list-item",
      "name": "ListItem",
      "level": "molecule",
      "status": "stable",
      "purpose": "One row of a list: a title, a line of detail and an action.",
      "description": "Reusable list row with leading slot, title, description, metadata, badge and action. interactive only adds visual hover/focus affordances; the consumer wraps the row in a real semantic interactive element when the whole row commits an action. selected becomes aria-selected only when interactive=true. Patterns consulted: Patterns/Information Architecture · MetadataAndActions, Patterns/Composition · DoNotOverCompose.",
      "role": "content",
      "import": "@rrios-forge/ui/molecules/list-item",
      "exports": [
        "ListItem",
        "LIST_ITEM_DENSITIES",
        "LIST_ITEM_TONES",
        "listItemVariants"
      ],
      "source": "packages/ui/src/molecules/list-item",
      "axes": [
        {
          "axis": "tone",
          "part": null,
          "values": [
            "neutral",
            "muted",
            "danger"
          ],
          "default": "neutral",
          "meaning": "Which semantic colour family the element speaks in."
        },
        {
          "axis": "selected",
          "part": null,
          "values": [
            "true",
            "false"
          ],
          "default": "false",
          "meaning": "Chosen in a set: the selected wash plus a non-colour cue (weight, check)."
        },
        {
          "axis": "disabled",
          "part": null,
          "values": [
            "true",
            "false"
          ],
          "default": "false",
          "meaning": "Not available: dimmed, skipped by the keyboard, ignores the pointer."
        },
        {
          "axis": "interactive",
          "part": null,
          "values": [
            "true",
            "false"
          ],
          "default": "false",
          "meaning": "Responds to the pointer: hover and press feedback, a pointer cursor."
        }
      ],
      "needs": [
        {
          "need": "Property list / data row / list item",
          "answer": "`PropertyList` / `DataRow` / `ListItem`"
        },
        {
          "need": "Row that opens a page (settings-list disclosure)",
          "answer": "`ListItem href` (whole row is the link, trailing chevron)"
        }
      ],
      "patterns": [],
      "a11yExceptions": [],
      "decisions": [
        {
          "id": "ADR-005",
          "title": "Visual operational rules: surfaces, interaction, motion"
        },
        {
          "id": "ADR-030",
          "title": "Axis vocabulary: one name, one meaning"
        }
      ],
      "stories": [
        {
          "name": "Playground",
          "id": "components-molecules-listitem--playground",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-listitem--playground",
          "frame": "/iframe.html?id=components-molecules-listitem--playground&viewMode=story"
        },
        {
          "name": "Densities",
          "id": "components-molecules-listitem--densities",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-listitem--densities",
          "frame": "/iframe.html?id=components-molecules-listitem--densities&viewMode=story"
        },
        {
          "name": "With avatar",
          "id": "components-molecules-listitem--with-avatar",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-listitem--with-avatar",
          "frame": "/iframe.html?id=components-molecules-listitem--with-avatar&viewMode=story"
        },
        {
          "name": "With icon",
          "id": "components-molecules-listitem--with-icon",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-listitem--with-icon",
          "frame": "/iframe.html?id=components-molecules-listitem--with-icon&viewMode=story"
        },
        {
          "name": "Selected",
          "id": "components-molecules-listitem--selected",
          "interaction": false,
          "snapshots": [
            "dark",
            "high-contrast",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-listitem--selected",
          "frame": "/iframe.html?id=components-molecules-listitem--selected&viewMode=story"
        },
        {
          "name": "Disabled",
          "id": "components-molecules-listitem--disabled",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-listitem--disabled",
          "frame": "/iframe.html?id=components-molecules-listitem--disabled&viewMode=story"
        },
        {
          "name": "Danger",
          "id": "components-molecules-listitem--danger",
          "interaction": false,
          "snapshots": [
            "dark",
            "high-contrast",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-listitem--danger",
          "frame": "/iframe.html?id=components-molecules-listitem--danger&viewMode=story"
        },
        {
          "name": "With actions",
          "id": "components-molecules-listitem--with-actions",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-listitem--with-actions",
          "frame": "/iframe.html?id=components-molecules-listitem--with-actions&viewMode=story"
        },
        {
          "name": "Grouped",
          "id": "components-molecules-listitem--grouped",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-listitem--grouped",
          "frame": "/iframe.html?id=components-molecules-listitem--grouped&viewMode=story"
        }
      ],
      "storyFile": "tooling/storybook/stories/components/molecules/list-item.stories.tsx"
    },
    {
      "id": "loading-state",
      "name": "LoadingState",
      "level": "molecule",
      "status": "stable",
      "purpose": "What a surface shows while it loads: a spinner, a skeleton of its content, or progress.",
      "description": "What a surface shows while it loads: a skeleton of its content when the layout is known, a spinner for short waits, or a progress bar with a caption when the work can be measured. Screen readers hear that the region is busy and when it is done.",
      "role": "feedback",
      "import": "@rrios-forge/ui/molecules/loading-state",
      "exports": [
        "LoadingState",
        "LOADING_STATE_SIZES",
        "LOADING_STATE_TYPES",
        "loadingStateVariants"
      ],
      "source": "packages/ui/src/molecules/loading-state",
      "axes": [
        {
          "axis": "size",
          "part": null,
          "values": [
            "sm",
            "md",
            "lg"
          ],
          "default": "md",
          "meaning": "Ergonomic scale, in three families (control, text, container)."
        },
        {
          "axis": "type",
          "part": null,
          "values": [
            "spinner",
            "skeleton",
            "progress"
          ],
          "default": "skeleton",
          "meaning": "Which loading indicator."
        }
      ],
      "needs": [
        {
          "need": "Empty / loading state",
          "answer": "`EmptyState` / `LoadingState` or `Skeleton`"
        }
      ],
      "patterns": [],
      "a11yExceptions": [],
      "decisions": [],
      "stories": [
        {
          "name": "Playground",
          "id": "components-molecules-loadingstate--playground",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-loadingstate--playground",
          "frame": "/iframe.html?id=components-molecules-loadingstate--playground&viewMode=story"
        },
        {
          "name": "Spinner",
          "id": "components-molecules-loadingstate--spinner",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-loadingstate--spinner",
          "frame": "/iframe.html?id=components-molecules-loadingstate--spinner&viewMode=story"
        },
        {
          "name": "Skeleton",
          "id": "components-molecules-loadingstate--skeleton",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-loadingstate--skeleton",
          "frame": "/iframe.html?id=components-molecules-loadingstate--skeleton&viewMode=story"
        },
        {
          "name": "Skeleton fallback",
          "id": "components-molecules-loadingstate--skeleton-fallback",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-loadingstate--skeleton-fallback",
          "frame": "/iframe.html?id=components-molecules-loadingstate--skeleton-fallback&viewMode=story"
        },
        {
          "name": "Progress",
          "id": "components-molecules-loadingstate--progress",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-loadingstate--progress",
          "frame": "/iframe.html?id=components-molecules-loadingstate--progress&viewMode=story"
        },
        {
          "name": "Full page",
          "id": "components-molecules-loadingstate--full-page",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-loadingstate--full-page",
          "frame": "/iframe.html?id=components-molecules-loadingstate--full-page&viewMode=story"
        },
        {
          "name": "Inline",
          "id": "components-molecules-loadingstate--inline",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-loadingstate--inline",
          "frame": "/iframe.html?id=components-molecules-loadingstate--inline&viewMode=story"
        }
      ],
      "storyFile": "tooling/storybook/stories/components/molecules/loading-state.stories.tsx"
    },
    {
      "id": "locale-selector",
      "name": "LocaleSelector",
      "level": "molecule",
      "status": "stable",
      "purpose": "Locale picker with native language names.",
      "description": "**Purpose.** Single-choice locale picker. Shows the selected locale's flag and native name in a trigger and exposes the full list — searchable when long — in a `Popover`. The list is content-controlled by the integrator so the molecule never ships a hardcoded language catalogue.\n\n**When to use.**\n- A header / top-bar locale switch on a public marketing page.\n- A settings field where the user picks the language of the product UI.\n- A document or workspace surface where the active locale is part of the metadata.\n\n**When NOT to use.**\n- Choosing a country that isn't tied to a language — use a plain `Select`.\n- Multi-select language preferences — compose `Combobox` instead.\n- A free-text search across many unrelated entities — use a `Combobox` or a `CommandMenu`.\n\n**Composes.**\n- `Popover` — the floating panel and ARIA dialog surface.\n- `cmdk` `Command` — the searchable list with type-ahead, arrow-key navigation and `aria-activedescendant`.\n\n**Display modes.**\n- `flag-and-text` (default) — flag + native name, e.g. `🇪🇸 Español`.\n- `flag-only` — flag only; ideal for top-bars. Requires an `aria-label` (a sensible default is computed from the selected locale's native name).\n- `text-only` — native name only; useful when the brand cannot rely on emoji flag rendering across all platforms (notably Windows).\n\n**Search.**\n- The list grows a search input when `locales.length >= searchThreshold` (default `5`).\n- The filter scores against the native name, the optional English alias (`searchAliases`) and the locale code, so users discover their language even when they do not yet read it.\n\n**Accessibility.**\n- The trigger is `role=\"combobox\"`, `aria-haspopup=\"listbox\"`, `aria-expanded` reflects the open state.\n- Keyboard contract inherits from `Popover` + `cmdk`: Enter / Space opens, ↑↓ navigate, Enter selects, Escape closes and returns focus to the trigger.\n- `flag-only` requires an explicit or computed `aria-label` so screen-reader users hear the active locale.\n\n**Related patterns.**\n- `Patterns/Decision Matrix · NavigationChoice` — picks a value from a long set.\n- `Patterns/Surfaces/Overlays · OverlayDecisionTable` — Popover (not Dropdown, not Dialog) is the right primitive.\n- `Patterns/Surfaces/Forms · SearchAndSelect` — the search-within-a-list contract.\n- `Patterns/Flows/Navigation · PopoverForContextualWork` — anatomy of the panel.\n- `Patterns/Flows/Search & Command · SearchFieldVsCombobox` — when to expose the search input.\n- `Patterns/Foundations/Visual Priority · QuietSecondaryActions` — the selected-row tint and tick are quiet, not loud.\n- `Patterns/Foundations/Density & Growth · ContentGrowth` — search appears as the dataset grows.",
      "role": "input",
      "import": "@rrios-forge/ui/molecules/locale-selector",
      "exports": [
        "LocaleSelector",
        "localeToFlagEmoji",
        "LOCALE_SELECTOR_DISPLAYS",
        "LOCALE_SELECTOR_SIZES",
        "localeSelectorInputVariants",
        "localeSelectorItemVariants",
        "localeSelectorTriggerVariants"
      ],
      "source": "packages/ui/src/molecules/locale-selector",
      "axes": [
        {
          "axis": "size",
          "part": null,
          "values": [
            "sm",
            "md",
            "lg"
          ],
          "default": "md",
          "meaning": "Ergonomic scale, in three families (control, text, container)."
        },
        {
          "axis": "display",
          "part": null,
          "values": [
            "flag-only",
            "flag-and-text",
            "text-only"
          ],
          "default": "flag-and-text",
          "meaning": "What a selector shows."
        },
        {
          "axis": "selected",
          "part": null,
          "values": [
            "true",
            "false"
          ],
          "default": "false",
          "meaning": "Chosen in a set: the selected wash plus a non-colour cue (weight, check)."
        }
      ],
      "needs": [],
      "patterns": [
        "Patterns/Decision Matrix · OverlayChoice",
        "Patterns/Decision Matrix · NavigationChoice",
        "Patterns/Surfaces/Overlays · OverlayDecisionTable",
        "Patterns/Surfaces/Overlays · EscapeAndReturnPath",
        "Patterns/Surfaces/Forms · SearchAndSelect",
        "Patterns/Flows/Navigation · NavigationLayers",
        "Patterns/Flows/Navigation · PopoverForContextualWork",
        "Patterns/Flows/Search & Command · SearchFieldVsCombobox",
        "Patterns/Foundations/Visual Priority · QuietSecondaryActions",
        "Patterns/Foundations/Visual Priority · StatusHierarchy",
        "Patterns/Foundations/Density & Growth · DensityLevels",
        "Patterns/Foundations/Density & Growth · ContentGrowth",
        "Patterns/Foundations/Composition · CompositionChecklist",
        "Patterns/Foundations/Composition · ReuseBeforeCreate"
      ],
      "a11yExceptions": [],
      "decisions": [
        {
          "id": "ADR-024",
          "title": "`LocaleSelector` is a new molecule, not an extension of `Combobox`"
        }
      ],
      "stories": [
        {
          "name": "Playground",
          "id": "components-molecules-localeselector--playground",
          "interaction": false,
          "snapshots": [
            "dark",
            "high-contrast",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-localeselector--playground",
          "frame": "/iframe.html?id=components-molecules-localeselector--playground&viewMode=story"
        },
        {
          "name": "Display Modes",
          "id": "components-molecules-localeselector--display-modes",
          "interaction": false,
          "snapshots": [
            "dark",
            "high-contrast",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-localeselector--display-modes",
          "frame": "/iframe.html?id=components-molecules-localeselector--display-modes&viewMode=story"
        },
        {
          "name": "Sizes",
          "id": "components-molecules-localeselector--sizes",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-localeselector--sizes",
          "frame": "/iframe.html?id=components-molecules-localeselector--sizes&viewMode=story"
        },
        {
          "name": "With Search",
          "id": "components-molecules-localeselector--with-search",
          "interaction": false,
          "snapshots": [
            "dark",
            "high-contrast",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-localeselector--with-search",
          "frame": "/iframe.html?id=components-molecules-localeselector--with-search&viewMode=story"
        },
        {
          "name": "Without Search",
          "id": "components-molecules-localeselector--without-search",
          "interaction": false,
          "snapshots": [
            "dark",
            "high-contrast",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-localeselector--without-search",
          "frame": "/iframe.html?id=components-molecules-localeselector--without-search&viewMode=story"
        },
        {
          "name": "States",
          "id": "components-molecules-localeselector--states",
          "interaction": false,
          "snapshots": [
            "dark",
            "high-contrast",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-localeselector--states",
          "frame": "/iframe.html?id=components-molecules-localeselector--states&viewMode=story"
        },
        {
          "name": "In Context",
          "id": "components-molecules-localeselector--in-context",
          "interaction": false,
          "snapshots": [
            "dark",
            "high-contrast",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-localeselector--in-context",
          "frame": "/iframe.html?id=components-molecules-localeselector--in-context&viewMode=story"
        }
      ],
      "storyFile": "tooling/storybook/stories/components/molecules/locale-selector.stories.tsx"
    },
    {
      "id": "markdown",
      "name": "Markdown",
      "level": "molecule",
      "status": "experimental",
      "purpose": "Model or editorial Markdown painted with atoms; app pieces through render slots.",
      "description": "**Purpose** — render the Markdown a model or an editor writes (paragraphs, headings, lists with one nested level, quotes, strong, emphasis, inline code, links) with Poesía atoms only. The source is text: HTML inside it renders literally and nothing goes through `dangerouslySetInnerHTML`.\n**When to use** — an assistant's answer (`size=\"sm\"`, `headings=\"flatten\"`, `streaming` while it arrives), an article or help body (`size=\"md\"`, `headingLevel` under the page's own heading).\n**When NOT** — UI copy you author in code (use `Text`, `Heading` directly); tables, images or embedded HTML (out of the subset on purpose).\n**Composes with** — app pieces through render slots: `renderLink` (client-side routing via `<Link asChild>`, a decorated citation), `renderMarker` (an app's `[[kind:target|label]]` chip), `renderText` (a glossary that decorates terms). `allowLink` narrows the link policy — a model should not choose where the reader goes.\n**Accessibility** — semantic elements throughout (`p`, `h2`–`h6`, `ul`/`ol`, `blockquote`, `strong`, `em`, `code`, `a`); the component says no words of its own (an external link's hint comes from the labels provider, ADR-034).\n**Related patterns** — Decision Matrix · ComponentChoice, Composition · AtomToMolecule, Information Architecture · BasicHierarchy.",
      "role": "content",
      "import": "@rrios-forge/ui/molecules/markdown",
      "exports": [
        "Markdown",
        "isExternalHref",
        "isSafeHref",
        "MARKDOWN_HEADINGS",
        "MARKDOWN_LIST_MARKERS",
        "MARKDOWN_NESTED_LIST_CLASSES",
        "MARKDOWN_SIZES",
        "markdownListVariants",
        "markdownQuoteVariants",
        "markdownVariants"
      ],
      "source": "packages/ui/src/molecules/markdown",
      "axes": [
        {
          "axis": "size",
          "part": null,
          "values": [
            "sm",
            "md"
          ],
          "default": "md",
          "meaning": "Ergonomic scale, in three families (control, text, container)."
        }
      ],
      "needs": [
        {
          "need": "Markdown a model or an editor wrote (an answer, an article body)",
          "answer": "`Markdown` (ADR-046): atoms only, never `dangerouslySetInnerHTML`; app pieces (routing, glossary, chips) through `renderLink` / `renderMarker` / `renderText`, link policy through `allowLink`"
        }
      ],
      "patterns": [
        "Patterns/Decision Matrix · ComponentChoice",
        "Patterns/Composition · AtomToMolecule",
        "Patterns/Information Architecture · BasicHierarchy",
        "Patterns/Density & Growth · ContentGrowth"
      ],
      "a11yExceptions": [],
      "decisions": [
        {
          "id": "ADR-003",
          "title": "Storybook editorial convention and pattern↔component bidirectionality"
        },
        {
          "id": "ADR-046",
          "title": "Markdown is painted with atoms, and apps fill its slots"
        }
      ],
      "stories": [
        {
          "name": "Playground",
          "id": "components-molecules-markdown--playground",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-markdown--playground",
          "frame": "/iframe.html?id=components-molecules-markdown--playground&viewMode=story"
        },
        {
          "name": "Sizes",
          "id": "components-molecules-markdown--sizes",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-markdown--sizes",
          "frame": "/iframe.html?id=components-molecules-markdown--sizes&viewMode=story"
        },
        {
          "name": "Headings",
          "id": "components-molecules-markdown--headings",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-markdown--headings",
          "frame": "/iframe.html?id=components-molecules-markdown--headings&viewMode=story"
        },
        {
          "name": "States",
          "id": "components-molecules-markdown--states",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-markdown--states",
          "frame": "/iframe.html?id=components-molecules-markdown--states&viewMode=story"
        },
        {
          "name": "In Context",
          "id": "components-molecules-markdown--in-context",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-markdown--in-context",
          "frame": "/iframe.html?id=components-molecules-markdown--in-context&viewMode=story"
        }
      ],
      "storyFile": "tooling/storybook/stories/components/molecules/markdown.stories.tsx"
    },
    {
      "id": "metric-card",
      "name": "MetricCard",
      "level": "molecule",
      "status": "stable",
      "purpose": "One number that matters, with its label, unit and change.",
      "description": "Apple-Fitness-register dashboard tile: small caps label, tabular-nums value, optional unit + delta pill + progress + description. Always raised material (ADR-007). Three axes: `tone` (left rail + icon-pill tint), `density` (comfortable / compact), `emphasis` (default / featured — featured uses font-display).",
      "role": "content",
      "import": "@rrios-forge/ui/molecules/metric-card",
      "exports": [
        "MetricCard",
        "METRIC_CARD_DELTA_DIRECTIONS",
        "METRIC_CARD_DENSITIES",
        "METRIC_CARD_EMPHASES",
        "METRIC_CARD_PROMINENCES",
        "METRIC_CARD_TONES",
        "metricCardVariants"
      ],
      "source": "packages/ui/src/molecules/metric-card",
      "axes": [
        {
          "axis": "tone",
          "part": null,
          "values": [
            "neutral",
            "info",
            "success",
            "warning",
            "danger"
          ],
          "default": "neutral",
          "meaning": "Which semantic colour family the element speaks in."
        },
        {
          "axis": "prominence",
          "part": null,
          "values": [
            "default",
            "featured"
          ],
          "default": "default",
          "meaning": "How a surface stands among its siblings."
        }
      ],
      "needs": [
        {
          "need": "KPI / metric",
          "answer": "`MetricCard`"
        },
        {
          "need": "A trend in a tile or a row",
          "answer": "`Sparkline` (in `MetricCard`'s `trend` slot)"
        },
        {
          "need": "A chart (trend, comparison, part to whole)",
          "answer": "`Chart` with the `form` the data's job names (`dataviz.yaml`); a single number is a `MetricCard`, many classes a `DataTable`"
        }
      ],
      "patterns": [],
      "a11yExceptions": [],
      "decisions": [
        {
          "id": "ADR-005",
          "title": "Visual operational rules: surfaces, interaction, motion"
        },
        {
          "id": "ADR-006",
          "title": "Geometry and typography signature"
        },
        {
          "id": "ADR-007",
          "title": "Material highlight on raised surfaces"
        },
        {
          "id": "ADR-008",
          "title": "Layout layer: refined `Grid` + new `Container`"
        },
        {
          "id": "ADR-009",
          "title": "Editorial Frame: PageShell v3 + new `TopBar` molecule"
        },
        {
          "id": "ADR-012",
          "title": "Card.fill axis for symmetric growth in grids"
        },
        {
          "id": "ADR-027",
          "title": "Vibrant is the system's material, not one of its members"
        },
        {
          "id": "ADR-029",
          "title": "The page gutter belongs outside the frame"
        },
        {
          "id": "ADR-030",
          "title": "Axis vocabulary: one name, one meaning"
        },
        {
          "id": "ADR-034",
          "title": "Accessible names come from a labels provider"
        },
        {
          "id": "ADR-036",
          "title": "Data visualization: colour roles, a grammar, and three components on plain SVG"
        },
        {
          "id": "ADR-037",
          "title": "Continuity motion: a decelerating curve, a travelling indicator, view transitions and the SegmentedControl"
        },
        {
          "id": "ADR-038",
          "title": "Liquid Glass layers: glass for navigation and controls, a content material for everything read"
        }
      ],
      "stories": [
        {
          "name": "Playground",
          "id": "components-molecules-metriccard--playground",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-metriccard--playground",
          "frame": "/iframe.html?id=components-molecules-metriccard--playground&viewMode=story"
        },
        {
          "name": "Canonical (icon + delta + unit)",
          "id": "components-molecules-metriccard--canonical",
          "interaction": false,
          "snapshots": [
            "dark",
            "high-contrast",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-metriccard--canonical",
          "frame": "/iframe.html?id=components-molecules-metriccard--canonical&viewMode=story"
        },
        {
          "name": "Tones",
          "id": "components-molecules-metriccard--tones",
          "interaction": false,
          "snapshots": [
            "dark",
            "high-contrast",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-metriccard--tones",
          "frame": "/iframe.html?id=components-molecules-metriccard--tones&viewMode=story"
        },
        {
          "name": "Featured (display ramp)",
          "id": "components-molecules-metriccard--featured",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-metriccard--featured",
          "frame": "/iframe.html?id=components-molecules-metriccard--featured&viewMode=story"
        },
        {
          "name": "Compact (dense panels)",
          "id": "components-molecules-metriccard--compact",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-metriccard--compact",
          "frame": "/iframe.html?id=components-molecules-metriccard--compact&viewMode=story"
        },
        {
          "name": "With progress",
          "id": "components-molecules-metriccard--with-progress",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-metriccard--with-progress",
          "frame": "/iframe.html?id=components-molecules-metriccard--with-progress&viewMode=story"
        },
        {
          "name": "Dashboard grid",
          "id": "components-molecules-metriccard--dashboard-grid",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-metriccard--dashboard-grid",
          "frame": "/iframe.html?id=components-molecules-metriccard--dashboard-grid&viewMode=story"
        },
        {
          "name": "Minimal (no chrome)",
          "id": "components-molecules-metriccard--minimal",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-metriccard--minimal",
          "frame": "/iframe.html?id=components-molecules-metriccard--minimal&viewMode=story"
        }
      ],
      "storyFile": "tooling/storybook/stories/components/molecules/metric-card.stories.tsx"
    },
    {
      "id": "nav-group",
      "name": "NavGroup",
      "level": "molecule",
      "status": "stable",
      "purpose": "Gathers related navigation rows into one group, with or without a title.",
      "description": "Gathers related navigation rows into one group. The title is optional, and a collapsible group lets people fold it away. In the rail an app has a single untitled group; titled groups live in the panel a rail row opens.",
      "role": "navigation",
      "import": "@rrios-forge/ui/molecules/nav-group",
      "exports": [
        "NavGroup",
        "navGroupVariants"
      ],
      "source": "packages/ui/src/molecules/nav-group",
      "axes": [],
      "needs": [
        {
          "need": "App frame / navigation",
          "answer": "**The rail that peeks (ADR-044) — the default and the recommendation.** `PageShell` (defaults: `sidebarMode=\"rail\"`, `sidebarPresentation=\"inset\"`, `mobileNav=\"tabs\"`) + `SidebarSection aria-label` + ONE untitled `NavGroup`: home, search, the rooms, settings — same size, same gap. Wrap every `NavItem` in `PageShell.RailPeek` and compose its panel with `PageShell.PeekHeader` / `PeekFacts` / `PeekLinks`. Search is a button row opening `CommandMenu` (⌘K); settings' peek holds the quick controls; phones get `PageShell.MobileTabBar` (≤ 5). No `TopBar` in an app frame. Opt-ins only when a product needs them: the labelled panel (`sidebarMode=\"auto\"`, ⌘\\\\ collapse, ADR-040), `island`/`column` (ADR-025), the bubble (`mobileNav=\"bubble\"`)"
        }
      ],
      "patterns": [],
      "a11yExceptions": [],
      "decisions": [
        {
          "id": "ADR-009",
          "title": "Editorial Frame: PageShell v3 + new `TopBar` molecule"
        },
        {
          "id": "ADR-010",
          "title": "PageShell v4: bottom dock + mobile floating bubble"
        },
        {
          "id": "ADR-011",
          "title": "PageShell v5: adaptive lateral sidebar + mobile nav bubble"
        },
        {
          "id": "ADR-014",
          "title": "PageShell: Apple Mail / macOS Big Sur visual register"
        },
        {
          "id": "ADR-044",
          "title": "Navigation is a rail that peeks"
        }
      ],
      "stories": [
        {
          "name": "Playground",
          "id": "components-molecules-navgroup--playground",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-navgroup--playground",
          "frame": "/iframe.html?id=components-molecules-navgroup--playground&viewMode=story"
        },
        {
          "name": "Basic",
          "id": "components-molecules-navgroup--basic",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-navgroup--basic",
          "frame": "/iframe.html?id=components-molecules-navgroup--basic&viewMode=story"
        },
        {
          "name": "Collapsible",
          "id": "components-molecules-navgroup--collapsible",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-navgroup--collapsible",
          "frame": "/iframe.html?id=components-molecules-navgroup--collapsible&viewMode=story"
        },
        {
          "name": "With badges",
          "id": "components-molecules-navgroup--with-badges",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-navgroup--with-badges",
          "frame": "/iframe.html?id=components-molecules-navgroup--with-badges&viewMode=story"
        }
      ],
      "storyFile": "tooling/storybook/stories/components/molecules/nav-group.stories.tsx"
    },
    {
      "id": "nav-item",
      "name": "NavItem",
      "level": "molecule",
      "status": "stable",
      "purpose": "A navigation row — an icon in the rail that opens its peek, a labelled row in a panel.",
      "description": "Renders <a> when href is provided, otherwise <button>. active sets aria-current=page; collapsed compresses to icon-only with sr-only label. Patterns consulted: Patterns/Navigation · NavigationLayers, Patterns/Visual Priority · QuietSecondaryActions.",
      "role": "navigation",
      "import": "@rrios-forge/ui/molecules/nav-item",
      "exports": [
        "NavItem",
        "NAV_ITEM_STATES",
        "navItemVariants"
      ],
      "source": "packages/ui/src/molecules/nav-item",
      "axes": [
        {
          "axis": "active",
          "part": null,
          "values": [
            "true",
            "false"
          ],
          "default": "false",
          "meaning": "The current destination or item: marked as current to assistive tech."
        },
        {
          "axis": "disabled",
          "part": null,
          "values": [
            "true",
            "false"
          ],
          "default": "false",
          "meaning": "Not available: dimmed, skipped by the keyboard, ignores the pointer."
        },
        {
          "axis": "collapsed",
          "part": null,
          "values": [
            "true",
            "false"
          ],
          "default": "false",
          "meaning": "Folded to its compact form (an icon rail, a closed group)."
        }
      ],
      "needs": [
        {
          "need": "App frame / navigation",
          "answer": "**The rail that peeks (ADR-044) — the default and the recommendation.** `PageShell` (defaults: `sidebarMode=\"rail\"`, `sidebarPresentation=\"inset\"`, `mobileNav=\"tabs\"`) + `SidebarSection aria-label` + ONE untitled `NavGroup`: home, search, the rooms, settings — same size, same gap. Wrap every `NavItem` in `PageShell.RailPeek` and compose its panel with `PageShell.PeekHeader` / `PeekFacts` / `PeekLinks`. Search is a button row opening `CommandMenu` (⌘K); settings' peek holds the quick controls; phones get `PageShell.MobileTabBar` (≤ 5). No `TopBar` in an app frame. Opt-ins only when a product needs them: the labelled panel (`sidebarMode=\"auto\"`, ⌘\\\\ collapse, ADR-040), `island`/`column` (ADR-025), the bubble (`mobileNav=\"bubble\"`)"
        }
      ],
      "patterns": [],
      "a11yExceptions": [],
      "decisions": [
        {
          "id": "ADR-005",
          "title": "Visual operational rules: surfaces, interaction, motion"
        },
        {
          "id": "ADR-009",
          "title": "Editorial Frame: PageShell v3 + new `TopBar` molecule"
        },
        {
          "id": "ADR-010",
          "title": "PageShell v4: bottom dock + mobile floating bubble"
        },
        {
          "id": "ADR-011",
          "title": "PageShell v5: adaptive lateral sidebar + mobile nav bubble"
        },
        {
          "id": "ADR-014",
          "title": "PageShell: Apple Mail / macOS Big Sur visual register"
        },
        {
          "id": "ADR-017",
          "title": "Actionable components adopt the `asChild` slot pattern for framework-aware routing"
        },
        {
          "id": "ADR-018",
          "title": "Motion language as a Pattern Layer contract"
        },
        {
          "id": "ADR-025",
          "title": "The sidebar is an island, not a wall (amended: two stagings)"
        },
        {
          "id": "ADR-037",
          "title": "Continuity motion: a decelerating curve, a travelling indicator, view transitions and the SegmentedControl"
        }
      ],
      "stories": [
        {
          "name": "Playground",
          "id": "components-molecules-navitem--playground",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-navitem--playground",
          "frame": "/iframe.html?id=components-molecules-navitem--playground&viewMode=story"
        },
        {
          "name": "Active",
          "id": "components-molecules-navitem--active",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-navitem--active",
          "frame": "/iframe.html?id=components-molecules-navitem--active&viewMode=story"
        },
        {
          "name": "With badge",
          "id": "components-molecules-navitem--with-badge",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-navitem--with-badge",
          "frame": "/iframe.html?id=components-molecules-navitem--with-badge&viewMode=story"
        },
        {
          "name": "Collapsed",
          "id": "components-molecules-navitem--collapsed",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-navitem--collapsed",
          "frame": "/iframe.html?id=components-molecules-navitem--collapsed&viewMode=story"
        },
        {
          "name": "Disabled",
          "id": "components-molecules-navitem--disabled",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-navitem--disabled",
          "frame": "/iframe.html?id=components-molecules-navitem--disabled&viewMode=story"
        },
        {
          "name": "As button",
          "id": "components-molecules-navitem--button-branch",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-navitem--button-branch",
          "frame": "/iframe.html?id=components-molecules-navitem--button-branch&viewMode=story"
        },
        {
          "name": "With a router link",
          "id": "components-molecules-navitem--as-child-with-link",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-navitem--as-child-with-link",
          "frame": "/iframe.html?id=components-molecules-navitem--as-child-with-link&viewMode=story"
        },
        {
          "name": "Client-side navigation",
          "id": "components-molecules-navitem--as-child-prevents-navigation",
          "interaction": true,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-navitem--as-child-prevents-navigation",
          "frame": "/iframe.html?id=components-molecules-navitem--as-child-prevents-navigation&viewMode=story"
        },
        {
          "name": "In the rail, with a tooltip",
          "id": "components-molecules-navitem--collapsed-with-tooltip",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-navitem--collapsed-with-tooltip",
          "frame": "/iframe.html?id=components-molecules-navitem--collapsed-with-tooltip&viewMode=story"
        },
        {
          "name": "With a trailing action",
          "id": "components-molecules-navitem--with-trailing-action",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-navitem--with-trailing-action",
          "frame": "/iframe.html?id=components-molecules-navitem--with-trailing-action&viewMode=story"
        },
        {
          "name": "Plain link (deprecated)",
          "id": "components-molecules-navitem--plain-link",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-navitem--plain-link",
          "frame": "/iframe.html?id=components-molecules-navitem--plain-link&viewMode=story"
        }
      ],
      "storyFile": "tooling/storybook/stories/components/molecules/nav-item.stories.tsx"
    },
    {
      "id": "notification-item",
      "name": "NotificationItem",
      "level": "molecule",
      "status": "stable",
      "purpose": "One notification: who, what happened and when.",
      "description": "Notification feed row with leading slot, title, description, timestamp, badge and trailing action. Tone reinforces meaning without carrying it alone (R14). unread bolds the title and adds a coloured dot — the colour is reinforcement, not the message.",
      "role": "feedback",
      "import": "@rrios-forge/ui/molecules/notification-item",
      "exports": [
        "NotificationItem",
        "NOTIFICATION_ITEM_DENSITIES",
        "NOTIFICATION_ITEM_TONES",
        "notificationItemVariants"
      ],
      "source": "packages/ui/src/molecules/notification-item",
      "axes": [
        {
          "axis": "tone",
          "part": null,
          "values": [
            "neutral",
            "info",
            "success",
            "warning",
            "danger"
          ],
          "default": "neutral",
          "meaning": "Which semantic colour family the element speaks in."
        },
        {
          "axis": "unread",
          "part": null,
          "values": [
            "true",
            "false"
          ],
          "default": "false",
          "meaning": "Not yet seen: a dot and stronger weight until opened."
        },
        {
          "axis": "selected",
          "part": null,
          "values": [
            "true",
            "false"
          ],
          "default": "false",
          "meaning": "Chosen in a set: the selected wash plus a non-colour cue (weight, check)."
        }
      ],
      "needs": [
        {
          "need": "Notification / timeline / activity item",
          "answer": "`NotificationItem` / `TimelineItem` / `ActivityItem`"
        }
      ],
      "patterns": [],
      "a11yExceptions": [],
      "decisions": [
        {
          "id": "ADR-016",
          "title": "NotificationCenter v2: Popover → Drawer + Provider/Hooks"
        },
        {
          "id": "ADR-030",
          "title": "Axis vocabulary: one name, one meaning"
        }
      ],
      "stories": [
        {
          "name": "Playground",
          "id": "components-molecules-notificationitem--playground",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-notificationitem--playground",
          "frame": "/iframe.html?id=components-molecules-notificationitem--playground&viewMode=story"
        },
        {
          "name": "Tones",
          "id": "components-molecules-notificationitem--tones",
          "interaction": false,
          "snapshots": [
            "dark",
            "high-contrast",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-notificationitem--tones",
          "frame": "/iframe.html?id=components-molecules-notificationitem--tones&viewMode=story"
        },
        {
          "name": "Densities",
          "id": "components-molecules-notificationitem--densities",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-notificationitem--densities",
          "frame": "/iframe.html?id=components-molecules-notificationitem--densities&viewMode=story"
        },
        {
          "name": "Unread",
          "id": "components-molecules-notificationitem--unread",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-notificationitem--unread",
          "frame": "/iframe.html?id=components-molecules-notificationitem--unread&viewMode=story"
        },
        {
          "name": "With action",
          "id": "components-molecules-notificationitem--with-action",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-notificationitem--with-action",
          "frame": "/iframe.html?id=components-molecules-notificationitem--with-action&viewMode=story"
        },
        {
          "name": "Notification feed",
          "id": "components-molecules-notificationitem--notification-feed",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-notificationitem--notification-feed",
          "frame": "/iframe.html?id=components-molecules-notificationitem--notification-feed&viewMode=story"
        }
      ],
      "storyFile": "tooling/storybook/stories/components/molecules/notification-item.stories.tsx"
    },
    {
      "id": "page-header",
      "name": "PageHeader",
      "level": "molecule",
      "status": "stable",
      "purpose": "The top of a page: its title, a line about it and its main actions.",
      "description": "**Purpose.** Orient the user at the top of a view. Composes breadcrumb, eyebrow, title (h1 by default), badge, description, actions and an optional Tabs row below. Renders a `<header>` landmark.\n\n**Size axis** (validated under `Foundations/Identity/Display Hierarchy`, Heading mapping per ADR-006):\n\n| Size | Title size | When to use |\n|---|---|---|\n| `sm` | Heading.md (24 px) | Settings sub-page where the breadcrumb already names the location. Title is technical, calm, secondary to the breadcrumb. |\n| `md` | Heading.lg (30 px) | **Default app page** — the consumer landed here directly; the title leads the page without shouting. Members, Deployments overview, Inbox. |\n| `lg` | Heading.display (48 px) | **Hero / product / marketing page** — landing surfaces, product overview, empty page top. Reserved; reach for it only when the title is meant to dominate. |\n\n**Composition slots** (rendered in this order, each optional except `title`): `breadcrumb` → `eyebrow` → `title` (+ optional `badge` inline) → `description` → `actions` (right-aligned) → `tabs` (below).\n\n**Patterns consulted**: `Patterns/Page Shells · PageHeader`, `Patterns/Navigation · BreadcrumbForLocation + TabsForLocalContext`, `Patterns/Information Architecture · MetadataAndActions`, `Patterns/Visual Priority · ActionHierarchy`.",
      "role": "surface",
      "import": "@rrios-forge/ui/molecules/page-header",
      "exports": [
        "PageHeader",
        "PAGE_HEADER_SIZES",
        "pageHeaderVariants",
        "PAGE_HEADER_PRESENTATIONS"
      ],
      "source": "packages/ui/src/molecules/page-header",
      "axes": [
        {
          "axis": "size",
          "part": null,
          "values": [
            "sm",
            "md",
            "lg"
          ],
          "default": "md",
          "meaning": "Ergonomic scale, in three families (control, text, container)."
        },
        {
          "axis": "presentation",
          "part": null,
          "values": [
            "editorial",
            "title"
          ],
          "default": "editorial",
          "meaning": "How the same thing is staged."
        }
      ],
      "needs": [
        {
          "need": "Page header / section title",
          "answer": "`PageHeader` / `SectionHeader`"
        },
        {
          "need": "Controls that must stay in reach while the screen scrolls (filters, search, a view switch, section tabs) — or a selection's / a form's actions",
          "answer": "`PageShell.StickyBar` (ADR-045) under the `PageHeader`, `edge=\"bottom\"` for actions: at rest part of the page; pinned, it condenses onto glass and carries the page title small. One bar per edge; never hides focus"
        }
      ],
      "patterns": [],
      "a11yExceptions": [],
      "decisions": [
        {
          "id": "ADR-008",
          "title": "Layout layer: refined `Grid` + new `Container`"
        },
        {
          "id": "ADR-009",
          "title": "Editorial Frame: PageShell v3 + new `TopBar` molecule"
        },
        {
          "id": "ADR-010",
          "title": "PageShell v4: bottom dock + mobile floating bubble"
        },
        {
          "id": "ADR-014",
          "title": "PageShell: Apple Mail / macOS Big Sur visual register"
        },
        {
          "id": "ADR-016",
          "title": "NotificationCenter v2: Popover → Drawer + Provider/Hooks"
        },
        {
          "id": "ADR-022",
          "title": "The material family: `solid` and `vibrant`"
        },
        {
          "id": "ADR-029",
          "title": "The page gutter belongs outside the frame"
        },
        {
          "id": "ADR-044",
          "title": "Navigation is a rail that peeks"
        },
        {
          "id": "ADR-045",
          "title": "A screen's controls pin and condense"
        }
      ],
      "stories": [
        {
          "name": "Playground",
          "id": "components-molecules-pageheader--playground",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-pageheader--playground",
          "frame": "/iframe.html?id=components-molecules-pageheader--playground&viewMode=story"
        },
        {
          "name": "With breadcrumb",
          "id": "components-molecules-pageheader--with-breadcrumb",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-pageheader--with-breadcrumb",
          "frame": "/iframe.html?id=components-molecules-pageheader--with-breadcrumb&viewMode=story"
        },
        {
          "name": "With actions",
          "id": "components-molecules-pageheader--with-actions",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-pageheader--with-actions",
          "frame": "/iframe.html?id=components-molecules-pageheader--with-actions&viewMode=story"
        },
        {
          "name": "With tabs",
          "id": "components-molecules-pageheader--with-tabs",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-pageheader--with-tabs",
          "frame": "/iframe.html?id=components-molecules-pageheader--with-tabs&viewMode=story"
        },
        {
          "name": "Dense",
          "id": "components-molecules-pageheader--dense",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-pageheader--dense",
          "frame": "/iframe.html?id=components-molecules-pageheader--dense&viewMode=story"
        },
        {
          "name": "Product page",
          "id": "components-molecules-pageheader--product-page",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-pageheader--product-page",
          "frame": "/iframe.html?id=components-molecules-pageheader--product-page&viewMode=story"
        },
        {
          "name": "Settings page",
          "id": "components-molecules-pageheader--settings-page",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-pageheader--settings-page",
          "frame": "/iframe.html?id=components-molecules-pageheader--settings-page&viewMode=story"
        }
      ],
      "storyFile": "tooling/storybook/stories/components/molecules/page-header.stories.tsx"
    },
    {
      "id": "pagination",
      "name": "Pagination",
      "level": "molecule",
      "status": "stable",
      "purpose": "Moves through a long list a page at a time.",
      "description": "Semantic page-list navigation. Renders `<nav aria-label=\"Pagination\">` with an `<ol>` of items. Active page sets `aria-current=\"page\"`. Previous / Next render directional glyphs + inline labels for both screen-reader and sighted users.",
      "role": "navigation",
      "import": "@rrios-forge/ui/molecules/pagination",
      "exports": [
        "Pagination",
        "PaginationContent",
        "PaginationEllipsis",
        "PaginationItem",
        "PaginationLink",
        "PaginationNext",
        "PaginationPrevious",
        "paginationLinkVariants",
        "PAGINATION_SIZES"
      ],
      "source": "packages/ui/src/molecules/pagination",
      "axes": [
        {
          "axis": "size",
          "part": null,
          "values": [
            "sm",
            "md",
            "lg"
          ],
          "default": "md",
          "meaning": "Ergonomic scale, in three families (control, text, container)."
        }
      ],
      "needs": [
        {
          "need": "Filters / pagination / stepper",
          "answer": "`FilterBar` / `Pagination` / `Stepper`"
        }
      ],
      "patterns": [],
      "a11yExceptions": [],
      "decisions": [
        {
          "id": "ADR-029",
          "title": "The page gutter belongs outside the frame"
        }
      ],
      "stories": [
        {
          "name": "Playground",
          "id": "components-molecules-pagination--playground",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-pagination--playground",
          "frame": "/iframe.html?id=components-molecules-pagination--playground&viewMode=story"
        },
        {
          "name": "Sizes",
          "id": "components-molecules-pagination--sizes",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-pagination--sizes",
          "frame": "/iframe.html?id=components-molecules-pagination--sizes&viewMode=story"
        },
        {
          "name": "In context",
          "id": "components-molecules-pagination--in-context",
          "interaction": false,
          "snapshots": [
            "dark",
            "high-contrast",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-pagination--in-context",
          "frame": "/iframe.html?id=components-molecules-pagination--in-context&viewMode=story"
        },
        {
          "name": "First page",
          "id": "components-molecules-pagination--first-page",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-pagination--first-page",
          "frame": "/iframe.html?id=components-molecules-pagination--first-page&viewMode=story"
        }
      ],
      "storyFile": "tooling/storybook/stories/components/molecules/pagination.stories.tsx"
    },
    {
      "id": "plan-card",
      "name": "PlanCard",
      "level": "molecule",
      "status": "stable",
      "purpose": "One pricing plan: its name, price, what it includes and how to choose it.",
      "description": "Higher-level pricing card for marketing surfaces and account plan pages. Layout: title + badge → price → description → features → action → footer. tone accent never carries meaning alone (R14); the title repeats it.",
      "role": "content",
      "import": "@rrios-forge/ui/molecules/plan-card",
      "exports": [
        "PlanCard",
        "PLAN_CARD_PROMINENCES",
        "PLAN_CARD_TONES",
        "planCardVariants"
      ],
      "source": "packages/ui/src/molecules/plan-card",
      "axes": [
        {
          "axis": "tone",
          "part": null,
          "values": [
            "neutral",
            "info",
            "success",
            "warning",
            "danger"
          ],
          "default": "neutral",
          "meaning": "Which semantic colour family the element speaks in."
        },
        {
          "axis": "prominence",
          "part": null,
          "values": [
            "default",
            "featured"
          ],
          "default": "default",
          "meaning": "How a surface stands among its siblings."
        }
      ],
      "needs": [
        {
          "need": "Pricing plan",
          "answer": "`PlanCard` or `PricingOption`"
        }
      ],
      "patterns": [],
      "a11yExceptions": [],
      "decisions": [
        {
          "id": "ADR-005",
          "title": "Visual operational rules: surfaces, interaction, motion"
        },
        {
          "id": "ADR-006",
          "title": "Geometry and typography signature"
        },
        {
          "id": "ADR-012",
          "title": "Card.fill axis for symmetric growth in grids"
        },
        {
          "id": "ADR-030",
          "title": "Axis vocabulary: one name, one meaning"
        }
      ],
      "stories": [
        {
          "name": "Playground",
          "id": "components-molecules-plancard--playground",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-plancard--playground",
          "frame": "/iframe.html?id=components-molecules-plancard--playground&viewMode=story"
        },
        {
          "name": "Tones",
          "id": "components-molecules-plancard--tones",
          "interaction": false,
          "snapshots": [
            "dark",
            "high-contrast",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-plancard--tones",
          "frame": "/iframe.html?id=components-molecules-plancard--tones&viewMode=story"
        },
        {
          "name": "Highlighted",
          "id": "components-molecules-plancard--highlighted",
          "interaction": false,
          "snapshots": [
            "dark",
            "high-contrast",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-plancard--highlighted",
          "frame": "/iframe.html?id=components-molecules-plancard--highlighted&viewMode=story"
        },
        {
          "name": "Pricing grid",
          "id": "components-molecules-plancard--pricing-grid",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-plancard--pricing-grid",
          "frame": "/iframe.html?id=components-molecules-plancard--pricing-grid&viewMode=story"
        },
        {
          "name": "Current plan",
          "id": "components-molecules-plancard--current-plan",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-plancard--current-plan",
          "frame": "/iframe.html?id=components-molecules-plancard--current-plan&viewMode=story"
        }
      ],
      "storyFile": "tooling/storybook/stories/components/molecules/plan-card.stories.tsx"
    },
    {
      "id": "popover",
      "name": "Popover",
      "level": "molecule",
      "status": "stable",
      "purpose": "A small floating surface anchored to what opened it.",
      "description": "Floating panel that appears on click / keyboard activation. Composes `@radix-ui/react-popover` so the ARIA contract (`role=\"dialog\"`, focus return, escape-to-close, outside-click-to-close, portal isolation) is right by construction. Use Popover for short, contained content; reach for Dialog for richer modal interactions.",
      "role": "feedback",
      "import": "@rrios-forge/ui/molecules/popover",
      "exports": [
        "Popover",
        "PopoverAnchor",
        "PopoverClose",
        "PopoverContent",
        "PopoverTrigger",
        "popoverContentVariants",
        "POPOVER_SIZES"
      ],
      "source": "packages/ui/src/molecules/popover",
      "axes": [
        {
          "axis": "size",
          "part": null,
          "values": [
            "sm",
            "md",
            "lg"
          ],
          "default": "md",
          "meaning": "Ergonomic scale, in three families (control, text, container)."
        }
      ],
      "needs": [
        {
          "need": "Tooltip / popover / contextual menu",
          "answer": "`Tooltip` / `Popover` / `DropdownMenu`"
        }
      ],
      "patterns": [],
      "a11yExceptions": [],
      "decisions": [
        {
          "id": "ADR-007",
          "title": "Material highlight on raised surfaces"
        },
        {
          "id": "ADR-015",
          "title": "Drawer molecule on top of Radix Dialog"
        },
        {
          "id": "ADR-016",
          "title": "NotificationCenter v2: Popover → Drawer + Provider/Hooks"
        },
        {
          "id": "ADR-024",
          "title": "`LocaleSelector` is a new molecule, not an extension of `Combobox`"
        }
      ],
      "stories": [
        {
          "name": "Playground",
          "id": "components-molecules-popover--playground",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-popover--playground",
          "frame": "/iframe.html?id=components-molecules-popover--playground&viewMode=story"
        },
        {
          "name": "Sizes",
          "id": "components-molecules-popover--sizes",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-popover--sizes",
          "frame": "/iframe.html?id=components-molecules-popover--sizes&viewMode=story"
        },
        {
          "name": "With form",
          "id": "components-molecules-popover--with-form",
          "interaction": false,
          "snapshots": [
            "dark",
            "high-contrast",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-popover--with-form",
          "frame": "/iframe.html?id=components-molecules-popover--with-form&viewMode=story"
        }
      ],
      "storyFile": "tooling/storybook/stories/components/molecules/popover.stories.tsx"
    },
    {
      "id": "pricing-option",
      "name": "PricingOption",
      "level": "molecule",
      "status": "stable",
      "purpose": "One choice of plan, to pick among a few.",
      "description": "Selectable plan / price option. Standalone, the consumer wires `selected`; inside a `PricingOptionGroup` each option takes a `value` and the card itself is the radio. `prominence=\"featured\"` is the 'recommended' mark (a lift and a badge), visually distinct from the user's selection (an accent ring and a check).",
      "role": "content",
      "import": "@rrios-forge/ui/molecules/pricing-option",
      "exports": [
        "PricingOption",
        "PricingOptionGroup",
        "PRICING_OPTION_PROMINENCES",
        "pricingOptionGroupVariants",
        "pricingOptionVariants"
      ],
      "source": "packages/ui/src/molecules/pricing-option",
      "axes": [
        {
          "axis": "selected",
          "part": null,
          "values": [
            "true",
            "false"
          ],
          "default": "false",
          "meaning": "Chosen in a set: the selected wash plus a non-colour cue (weight, check)."
        },
        {
          "axis": "prominence",
          "part": null,
          "values": [
            "default",
            "featured"
          ],
          "default": "default",
          "meaning": "How a surface stands among its siblings."
        },
        {
          "axis": "disabled",
          "part": null,
          "values": [
            "true",
            "false"
          ],
          "default": "false",
          "meaning": "Not available: dimmed, skipped by the keyboard, ignores the pointer."
        },
        {
          "axis": "interactive",
          "part": null,
          "values": [
            "true",
            "false"
          ],
          "default": "false",
          "meaning": "Responds to the pointer: hover and press feedback, a pointer cursor."
        }
      ],
      "needs": [
        {
          "need": "Pricing plan",
          "answer": "`PlanCard` or `PricingOption`"
        }
      ],
      "patterns": [],
      "a11yExceptions": [],
      "decisions": [
        {
          "id": "ADR-005",
          "title": "Visual operational rules: surfaces, interaction, motion"
        },
        {
          "id": "ADR-006",
          "title": "Geometry and typography signature"
        },
        {
          "id": "ADR-028",
          "title": "The label is not the fill"
        },
        {
          "id": "ADR-030",
          "title": "Axis vocabulary: one name, one meaning"
        }
      ],
      "stories": [
        {
          "name": "Playground",
          "id": "components-molecules-pricingoption--playground",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-pricingoption--playground",
          "frame": "/iframe.html?id=components-molecules-pricingoption--playground&viewMode=story"
        },
        {
          "name": "Selected",
          "id": "components-molecules-pricingoption--selected",
          "interaction": false,
          "snapshots": [
            "dark",
            "high-contrast",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-pricingoption--selected",
          "frame": "/iframe.html?id=components-molecules-pricingoption--selected&viewMode=story"
        },
        {
          "name": "Highlighted",
          "id": "components-molecules-pricingoption--highlighted",
          "interaction": false,
          "snapshots": [
            "dark",
            "high-contrast",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-pricingoption--highlighted",
          "frame": "/iframe.html?id=components-molecules-pricingoption--highlighted&viewMode=story"
        },
        {
          "name": "Disabled",
          "id": "components-molecules-pricingoption--disabled",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-pricingoption--disabled",
          "frame": "/iframe.html?id=components-molecules-pricingoption--disabled&viewMode=story"
        },
        {
          "name": "Pricing set",
          "id": "components-molecules-pricingoption--pricing-set",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-pricingoption--pricing-set",
          "frame": "/iframe.html?id=components-molecules-pricingoption--pricing-set&viewMode=story"
        },
        {
          "name": "Radio group",
          "id": "components-molecules-pricingoption--radio-group",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-pricingoption--radio-group",
          "frame": "/iframe.html?id=components-molecules-pricingoption--radio-group&viewMode=story"
        }
      ],
      "storyFile": "tooling/storybook/stories/components/molecules/pricing-option.stories.tsx"
    },
    {
      "id": "property-list",
      "name": "PropertyList",
      "level": "molecule",
      "status": "stable",
      "purpose": "Key/value rows for record metadata.",
      "description": "Compound description list (`<dl>` + `<dt>` + `<dd>`) for key/value properties. Two orientations × two densities. Patterns consulted: Patterns/Information Architecture · MetadataAndActions.",
      "role": "content",
      "import": "@rrios-forge/ui/molecules/property-list",
      "exports": [
        "PropertyItem",
        "PropertyLabel",
        "PropertyList",
        "PropertyValue",
        "PROPERTY_LIST_DENSITIES",
        "PROPERTY_LIST_ORIENTATIONS",
        "propertyListVariants"
      ],
      "source": "packages/ui/src/molecules/property-list",
      "axes": [
        {
          "axis": "orientation",
          "part": null,
          "values": [
            "vertical",
            "horizontal"
          ],
          "default": "vertical",
          "meaning": "The direction the parts run: a row (horizontal) or a column (vertical); responsive stacks on phones and runs in a row from sm."
        }
      ],
      "needs": [
        {
          "need": "Property list / data row / list item",
          "answer": "`PropertyList` / `DataRow` / `ListItem`"
        }
      ],
      "patterns": [],
      "a11yExceptions": [],
      "decisions": [
        {
          "id": "ADR-008",
          "title": "Layout layer: refined `Grid` + new `Container`"
        }
      ],
      "stories": [
        {
          "name": "Playground",
          "id": "components-molecules-propertylist--playground",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-propertylist--playground",
          "frame": "/iframe.html?id=components-molecules-propertylist--playground&viewMode=story"
        },
        {
          "name": "Account properties",
          "id": "components-molecules-propertylist--account-properties",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-propertylist--account-properties",
          "frame": "/iframe.html?id=components-molecules-propertylist--account-properties&viewMode=story"
        },
        {
          "name": "Billing properties",
          "id": "components-molecules-propertylist--billing-properties",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-propertylist--billing-properties",
          "frame": "/iframe.html?id=components-molecules-propertylist--billing-properties&viewMode=story"
        },
        {
          "name": "With badges",
          "id": "components-molecules-propertylist--with-badges",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-propertylist--with-badges",
          "frame": "/iframe.html?id=components-molecules-propertylist--with-badges&viewMode=story"
        },
        {
          "name": "Compact",
          "id": "components-molecules-propertylist--compact",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-propertylist--compact",
          "frame": "/iframe.html?id=components-molecules-propertylist--compact&viewMode=story"
        }
      ],
      "storyFile": "tooling/storybook/stories/components/molecules/property-list.stories.tsx"
    },
    {
      "id": "reaction-bar",
      "name": "ReactionBar",
      "level": "molecule",
      "status": "experimental",
      "purpose": "Quick emoji reactions with their counts; the reader's own stands out.",
      "description": "Controlled reaction bar. Pass `reactions` (key + glyph + label + count), the `active` key, and `onToggle`. Each option is a Button atom — active → intent primary solid, idle → neutral ghost. The consumer owns toggle semantics (add / replace / remove) and optimistic state. Patterns consulted: Patterns/Visual Priority · StatusHierarchy.",
      "role": "action",
      "import": "@rrios-forge/ui/molecules/reaction-bar",
      "exports": [
        "ReactionBar",
        "reactionBarVariants",
        "REACTION_BAR_SIZES"
      ],
      "source": "packages/ui/src/molecules/reaction-bar",
      "axes": [
        {
          "axis": "size",
          "part": null,
          "values": [
            "sm",
            "md"
          ],
          "default": "sm",
          "meaning": "Ergonomic scale, in three families (control, text, container)."
        }
      ],
      "needs": [
        {
          "need": "Chat message / reactions",
          "answer": "`ChatBubble` / `ReactionBar`"
        }
      ],
      "patterns": [],
      "a11yExceptions": [],
      "decisions": [],
      "stories": [
        {
          "name": "Playground",
          "id": "components-molecules-reactionbar--playground",
          "interaction": false,
          "snapshots": [
            "dark",
            "high-contrast",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-reactionbar--playground",
          "frame": "/iframe.html?id=components-molecules-reactionbar--playground&viewMode=story"
        },
        {
          "name": "Nothing selected",
          "id": "components-molecules-reactionbar--no-active",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-reactionbar--no-active",
          "frame": "/iframe.html?id=components-molecules-reactionbar--no-active&viewMode=story"
        },
        {
          "name": "Disabled",
          "id": "components-molecules-reactionbar--disabled",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-reactionbar--disabled",
          "frame": "/iframe.html?id=components-molecules-reactionbar--disabled&viewMode=story"
        },
        {
          "name": "Multi-active (array)",
          "id": "components-molecules-reactionbar--multi-active",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-reactionbar--multi-active",
          "frame": "/iframe.html?id=components-molecules-reactionbar--multi-active&viewMode=story"
        }
      ],
      "storyFile": "tooling/storybook/stories/components/molecules/reaction-bar.stories.tsx"
    },
    {
      "id": "scroll-area",
      "name": "ScrollArea",
      "level": "molecule",
      "status": "stable",
      "purpose": "Scrolls one axis with soft edge fades instead of a heavy scrollbar.",
      "description": "A region that scrolls on one axis without a heavy scrollbar (ADR-039). Its edges fade only where content continues, so the reader sees there is more without a grey bar; a vertical wheel moves a horizontal strip. Name it (`aria-label`) and it becomes a keyboard stop when it overflows.",
      "role": "surface",
      "import": "@rrios-forge/ui/molecules/scroll-area",
      "exports": [
        "ScrollArea",
        "SCROLL_AREA_ORIENTATIONS",
        "scrollAreaVariants"
      ],
      "source": "packages/ui/src/molecules/scroll-area",
      "axes": [
        {
          "axis": "orientation",
          "part": null,
          "values": [
            "horizontal",
            "vertical"
          ],
          "default": "vertical",
          "meaning": "The direction the parts run: a row (horizontal) or a column (vertical); responsive stacks on phones and runs in a row from sm."
        }
      ],
      "needs": [
        {
          "need": "Content that overflows one axis (a strip of options, a long list in a pane)",
          "answer": "`ScrollArea` (edge fades, no heavy scrollbar)"
        }
      ],
      "patterns": [],
      "a11yExceptions": [],
      "decisions": [
        {
          "id": "ADR-039",
          "title": "The component premium pass: translucent fills, a selected register, quiet scroll, and a system-wide audit"
        }
      ],
      "stories": [
        {
          "name": "Horizontal",
          "id": "components-molecules-scrollarea--horizontal",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-scrollarea--horizontal",
          "frame": "/iframe.html?id=components-molecules-scrollarea--horizontal&viewMode=story"
        },
        {
          "name": "Vertical",
          "id": "components-molecules-scrollarea--vertical",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-scrollarea--vertical",
          "frame": "/iframe.html?id=components-molecules-scrollarea--vertical&viewMode=story"
        },
        {
          "name": "No Overflow",
          "id": "components-molecules-scrollarea--no-overflow",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-scrollarea--no-overflow",
          "frame": "/iframe.html?id=components-molecules-scrollarea--no-overflow&viewMode=story"
        }
      ],
      "storyFile": "tooling/storybook/stories/components/molecules/scroll-area.stories.tsx"
    },
    {
      "id": "search-field",
      "name": "SearchField",
      "level": "molecule",
      "status": "stable",
      "purpose": "A search box that can be cleared in one press.",
      "description": "Search input pattern composed from InputGroup. Pre-wired with a search icon, optional spinner (loading=true) and optional clear button. role=search on the wrapper, type=search on the input. Placeholder never replaces a label — pass aria-label or wrap in Field. Patterns consulted: Patterns/Forms · SearchAndSelect, Patterns/Feedback · LoadingFeedback.",
      "role": "input",
      "import": "@rrios-forge/ui/molecules/search-field",
      "exports": [
        "SearchField",
        "SEARCH_FIELD_SIZES",
        "searchFieldVariants"
      ],
      "source": "packages/ui/src/molecules/search-field",
      "axes": [
        {
          "axis": "size",
          "part": null,
          "values": [
            "sm",
            "md",
            "lg"
          ],
          "default": "md",
          "meaning": "Ergonomic scale, in three families (control, text, container)."
        }
      ],
      "needs": [
        {
          "need": "Tabs / select / autocomplete",
          "answer": "`Tabs` / `Select` / `Combobox` or `SearchField`"
        }
      ],
      "patterns": [],
      "a11yExceptions": [],
      "decisions": [],
      "stories": [
        {
          "name": "Playground",
          "id": "components-molecules-searchfield--playground",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-searchfield--playground",
          "frame": "/iframe.html?id=components-molecules-searchfield--playground&viewMode=story"
        },
        {
          "name": "Loading",
          "id": "components-molecules-searchfield--loading",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-searchfield--loading",
          "frame": "/iframe.html?id=components-molecules-searchfield--loading&viewMode=story"
        },
        {
          "name": "Clearable",
          "id": "components-molecules-searchfield--clearable",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-searchfield--clearable",
          "frame": "/iframe.html?id=components-molecules-searchfield--clearable&viewMode=story"
        },
        {
          "name": "Disabled",
          "id": "components-molecules-searchfield--disabled",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-searchfield--disabled",
          "frame": "/iframe.html?id=components-molecules-searchfield--disabled&viewMode=story"
        },
        {
          "name": "In toolbar",
          "id": "components-molecules-searchfield--in-toolbar",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-searchfield--in-toolbar",
          "frame": "/iframe.html?id=components-molecules-searchfield--in-toolbar&viewMode=story"
        },
        {
          "name": "With results hint",
          "id": "components-molecules-searchfield--with-results-hint",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-searchfield--with-results-hint",
          "frame": "/iframe.html?id=components-molecules-searchfield--with-results-hint&viewMode=story"
        }
      ],
      "storyFile": "tooling/storybook/stories/components/molecules/search-field.stories.tsx"
    },
    {
      "id": "segmented-control",
      "name": "SegmentedControl",
      "level": "molecule",
      "status": "stable",
      "purpose": "One of a few values, all in view; the thumb slides to the choice.",
      "description": "Pick one of two to five values, all in view (ADR-037). A radio group on Radix: arrow keys move and select, Tab leaves. One thumb travels to the chosen option on a pointer choice and jumps on a keyboard one. Use Tabs when the choice swaps a panel; a Select past five options.",
      "role": "input",
      "import": "@rrios-forge/ui/molecules/segmented-control",
      "exports": [
        "SegmentedControl",
        "SEGMENTED_CONTROL_SIZES",
        "segmentedControlItemVariants",
        "segmentedControlVariants"
      ],
      "source": "packages/ui/src/molecules/segmented-control",
      "axes": [
        {
          "axis": "size",
          "part": null,
          "values": [
            "sm",
            "md"
          ],
          "default": "md",
          "meaning": "Ergonomic scale, in three families (control, text, container)."
        },
        {
          "axis": "fill",
          "part": null,
          "values": [
            "true",
            "false"
          ],
          "default": "false",
          "meaning": "Card grows to its row's tallest sibling (ADR-012)."
        }
      ],
      "needs": [
        {
          "need": "One of a few values, all in view (range, view mode)",
          "answer": "`SegmentedControl` (two to five options; more → `Select`)"
        }
      ],
      "patterns": [],
      "a11yExceptions": [],
      "decisions": [
        {
          "id": "ADR-037",
          "title": "Continuity motion: a decelerating curve, a travelling indicator, view transitions and the SegmentedControl"
        }
      ],
      "stories": [
        {
          "name": "Playground",
          "id": "components-molecules-segmentedcontrol--playground",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-segmentedcontrol--playground",
          "frame": "/iframe.html?id=components-molecules-segmentedcontrol--playground&viewMode=story"
        },
        {
          "name": "Sizes",
          "id": "components-molecules-segmentedcontrol--sizes",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-segmentedcontrol--sizes",
          "frame": "/iframe.html?id=components-molecules-segmentedcontrol--sizes&viewMode=story"
        },
        {
          "name": "Fill",
          "id": "components-molecules-segmentedcontrol--fill",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-segmentedcontrol--fill",
          "frame": "/iframe.html?id=components-molecules-segmentedcontrol--fill&viewMode=story"
        },
        {
          "name": "On a pane",
          "id": "components-molecules-segmentedcontrol--on-a-pane",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-segmentedcontrol--on-a-pane",
          "frame": "/iframe.html?id=components-molecules-segmentedcontrol--on-a-pane&viewMode=story"
        },
        {
          "name": "Disabled",
          "id": "components-molecules-segmentedcontrol--disabled",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-segmentedcontrol--disabled",
          "frame": "/iframe.html?id=components-molecules-segmentedcontrol--disabled&viewMode=story"
        },
        {
          "name": "Keyboard",
          "id": "components-molecules-segmentedcontrol--keyboard",
          "interaction": true,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-segmentedcontrol--keyboard",
          "frame": "/iframe.html?id=components-molecules-segmentedcontrol--keyboard&viewMode=story"
        }
      ],
      "storyFile": "tooling/storybook/stories/components/molecules/segmented-control.stories.tsx"
    },
    {
      "id": "section-header",
      "name": "SectionHeader",
      "level": "molecule",
      "status": "stable",
      "purpose": "Sub-section title within a page body.",
      "description": "Standard header for sections within pages, cards and forms. Composes Heading + Description, with optional eyebrow, badge and action slots. Two alignments (start | between) × three sizes. Promotes the inline pattern helper into a real molecule. Patterns consulted: Patterns/Information Architecture · SectionAnatomy + MetadataAndActions, Patterns/Visual Priority · PriorityStack.",
      "role": "surface",
      "import": "@rrios-forge/ui/molecules/section-header",
      "exports": [
        "SectionHeader",
        "SECTION_HEADER_ALIGNS",
        "SECTION_HEADER_SIZES",
        "sectionHeaderTitleBlockVariants",
        "sectionHeaderVariants"
      ],
      "source": "packages/ui/src/molecules/section-header",
      "axes": [
        {
          "axis": "align",
          "part": null,
          "values": [
            "start",
            "between"
          ],
          "default": "start",
          "meaning": "Distribution along the main axis."
        },
        {
          "axis": "size",
          "part": null,
          "values": [
            "sm",
            "md",
            "lg"
          ],
          "default": "md",
          "meaning": "Ergonomic scale, in three families (control, text, container)."
        }
      ],
      "needs": [
        {
          "need": "Page header / section title",
          "answer": "`PageHeader` / `SectionHeader`"
        }
      ],
      "patterns": [],
      "a11yExceptions": [],
      "decisions": [],
      "stories": [
        {
          "name": "Playground",
          "id": "components-molecules-sectionheader--playground",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-sectionheader--playground",
          "frame": "/iframe.html?id=components-molecules-sectionheader--playground&viewMode=story"
        },
        {
          "name": "Sizes",
          "id": "components-molecules-sectionheader--sizes",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-sectionheader--sizes",
          "frame": "/iframe.html?id=components-molecules-sectionheader--sizes&viewMode=story"
        },
        {
          "name": "With badge",
          "id": "components-molecules-sectionheader--with-badge",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-sectionheader--with-badge",
          "frame": "/iframe.html?id=components-molecules-sectionheader--with-badge&viewMode=story"
        },
        {
          "name": "With action",
          "id": "components-molecules-sectionheader--with-action",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-sectionheader--with-action",
          "frame": "/iframe.html?id=components-molecules-sectionheader--with-action&viewMode=story"
        },
        {
          "name": "In card",
          "id": "components-molecules-sectionheader--in-card",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-sectionheader--in-card",
          "frame": "/iframe.html?id=components-molecules-sectionheader--in-card&viewMode=story"
        },
        {
          "name": "In form section",
          "id": "components-molecules-sectionheader--in-form-section",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-sectionheader--in-form-section",
          "frame": "/iframe.html?id=components-molecules-sectionheader--in-form-section&viewMode=story"
        }
      ],
      "storyFile": "tooling/storybook/stories/components/molecules/section-header.stories.tsx"
    },
    {
      "id": "select",
      "name": "Select",
      "level": "molecule",
      "status": "stable",
      "purpose": "Picks one value from a list in a dropdown.",
      "description": "Semantic single-choice selector. Composes `@radix-ui/react-select` for the full ARIA contract (`role=\"combobox\"` + `role=\"listbox\"` + `role=\"option\"`, type-ahead, arrow-key navigation, hidden native `<select>` for forms, portal isolation). The Trigger mirrors Input so a Select sits inline with the rest of the form layer.",
      "role": "input",
      "import": "@rrios-forge/ui/molecules/select",
      "exports": [
        "Select",
        "SelectContent",
        "SelectGroup",
        "SelectItem",
        "SelectLabel",
        "SelectSeparator",
        "SelectTrigger",
        "SelectValue",
        "selectContentVariants",
        "selectItemVariants",
        "selectTriggerVariants",
        "SELECT_TRIGGER_SIZES"
      ],
      "source": "packages/ui/src/molecules/select",
      "axes": [
        {
          "axis": "size",
          "part": null,
          "values": [
            "sm",
            "md",
            "lg"
          ],
          "default": "md",
          "meaning": "Ergonomic scale, in three families (control, text, container)."
        },
        {
          "axis": "invalid",
          "part": null,
          "values": [
            "true",
            "false"
          ],
          "default": "false",
          "meaning": "Fails validation: a danger edge, announced as invalid; pair it with an error message."
        }
      ],
      "needs": [
        {
          "need": "Tabs / select / autocomplete",
          "answer": "`Tabs` / `Select` / `Combobox` or `SearchField`"
        },
        {
          "need": "One of a few values, all in view (range, view mode)",
          "answer": "`SegmentedControl` (two to five options; more → `Select`)"
        },
        {
          "need": "Field with label + helper + error",
          "answer": "`Field` + `Input`/`Textarea`/`Select`"
        }
      ],
      "patterns": [],
      "a11yExceptions": [],
      "decisions": [
        {
          "id": "ADR-024",
          "title": "`LocaleSelector` is a new molecule, not an extension of `Combobox`"
        }
      ],
      "stories": [
        {
          "name": "Playground",
          "id": "components-molecules-select--playground",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-select--playground",
          "frame": "/iframe.html?id=components-molecules-select--playground&viewMode=story"
        },
        {
          "name": "Sizes",
          "id": "components-molecules-select--sizes",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-select--sizes",
          "frame": "/iframe.html?id=components-molecules-select--sizes&viewMode=story"
        },
        {
          "name": "Invalid",
          "id": "components-molecules-select--invalid",
          "interaction": false,
          "snapshots": [
            "dark",
            "high-contrast",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-select--invalid",
          "frame": "/iframe.html?id=components-molecules-select--invalid&viewMode=story"
        },
        {
          "name": "Grouped",
          "id": "components-molecules-select--grouped",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-select--grouped",
          "frame": "/iframe.html?id=components-molecules-select--grouped&viewMode=story"
        }
      ],
      "storyFile": "tooling/storybook/stories/components/molecules/select.stories.tsx"
    },
    {
      "id": "settings-field",
      "name": "SettingsField",
      "level": "molecule",
      "status": "stable",
      "purpose": "One setting: what it does, in a line, and its control.",
      "description": "One-row settings layout. Title + description on the left, control + action on the right. Stacks below sm. Use Field underneath for the actual <label htmlFor> wiring; SettingsField title is the visible name. Patterns consulted: Patterns/Forms · FieldAnatomy, Patterns/Density & Growth · DensityLevels.",
      "role": "input",
      "import": "@rrios-forge/ui/molecules/settings-field",
      "exports": [
        "SettingsField",
        "SETTINGS_FIELD_DENSITIES",
        "settingsFieldVariants"
      ],
      "source": "packages/ui/src/molecules/settings-field",
      "axes": [
        {
          "axis": "density",
          "part": null,
          "values": [
            "compact",
            "comfortable"
          ],
          "default": null,
          "meaning": null
        }
      ],
      "needs": [
        {
          "need": "Binary toggle / checkbox / radio group",
          "answer": "`Switch` (in `SettingsField` with label) / `Checkbox` / `ChoiceGroup` with `Radio`"
        }
      ],
      "patterns": [],
      "a11yExceptions": [],
      "decisions": [],
      "stories": [
        {
          "name": "Playground",
          "id": "components-molecules-settingsfield--playground",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-settingsfield--playground",
          "frame": "/iframe.html?id=components-molecules-settingsfield--playground&viewMode=story"
        },
        {
          "name": "With switch",
          "id": "components-molecules-settingsfield--with-switch",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-settingsfield--with-switch",
          "frame": "/iframe.html?id=components-molecules-settingsfield--with-switch&viewMode=story"
        },
        {
          "name": "With select",
          "id": "components-molecules-settingsfield--with-select",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-settingsfield--with-select",
          "frame": "/iframe.html?id=components-molecules-settingsfield--with-select&viewMode=story"
        },
        {
          "name": "With button",
          "id": "components-molecules-settingsfield--with-button",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-settingsfield--with-button",
          "frame": "/iframe.html?id=components-molecules-settingsfield--with-button&viewMode=story"
        },
        {
          "name": "Compact",
          "id": "components-molecules-settingsfield--compact",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-settingsfield--compact",
          "frame": "/iframe.html?id=components-molecules-settingsfield--compact&viewMode=story"
        },
        {
          "name": "Disabled control",
          "id": "components-molecules-settingsfield--disabled-control",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-settingsfield--disabled-control",
          "frame": "/iframe.html?id=components-molecules-settingsfield--disabled-control&viewMode=story"
        }
      ],
      "storyFile": "tooling/storybook/stories/components/molecules/settings-field.stories.tsx"
    },
    {
      "id": "sheet",
      "name": "Sheet",
      "level": "molecule",
      "status": "stable",
      "purpose": "A document pane: one surface divided into sections.",
      "description": "One continuous surface, many sections. A Sheet is a DOCUMENT pane: several regions of one entity that belong on one surface — no gaps between cards, the seam is a divider (hairline on solid, bevelled glass edge on vibrant) and every section owns its padding, chosen once via the sheet's inset. Built ON the Card recipe per the R10 consult (Patterns/Page Shells · DataPage). material=vibrant is the translucent member of ADR-022: it admits the app's ambient backdrop through blur + tint, exists in BOTH light (frosted white) and dark (night glass); high-contrast and prefers-reduced-transparency collapse it to solid. NOT shadcn's Sheet — their side drawer is Poesía's Drawer (ADR-015).",
      "role": "surface",
      "import": "@rrios-forge/ui/molecules/sheet",
      "exports": [
        "Sheet",
        "SheetSection",
        "SheetContext",
        "SHEET_INSETS",
        "SHEET_MATERIALS",
        "sheetSectionVariants",
        "sheetVariants"
      ],
      "source": "packages/ui/src/molecules/sheet",
      "axes": [
        {
          "axis": "material",
          "part": null,
          "values": [
            "solid",
            "vibrant"
          ],
          "default": "vibrant",
          "meaning": "The layer's material (ADR-022, ADR-027)."
        },
        {
          "axis": "inset",
          "part": null,
          "values": [
            "sm",
            "md",
            "lg"
          ],
          "default": "md",
          "meaning": "Inner spacing of a sheet section."
        },
        {
          "axis": "bleed",
          "part": null,
          "values": [
            "true",
            "false"
          ],
          "default": "false",
          "meaning": "Sheet section runs edge to edge."
        }
      ],
      "needs": [
        {
          "need": "Side panel",
          "answer": "`Drawer` or `Sheet`"
        }
      ],
      "patterns": [],
      "a11yExceptions": [],
      "decisions": [
        {
          "id": "ADR-009",
          "title": "Editorial Frame: PageShell v3 + new `TopBar` molecule"
        },
        {
          "id": "ADR-022",
          "title": "The material family: `solid` and `vibrant`"
        },
        {
          "id": "ADR-027",
          "title": "Vibrant is the system's material, not one of its members"
        },
        {
          "id": "ADR-029",
          "title": "The page gutter belongs outside the frame"
        }
      ],
      "stories": [
        {
          "name": "Playground",
          "id": "components-molecules-sheet--playground",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-sheet--playground",
          "frame": "/iframe.html?id=components-molecules-sheet--playground&viewMode=story"
        },
        {
          "name": "Vibrant",
          "id": "components-molecules-sheet--vibrant",
          "interaction": false,
          "snapshots": [
            "dark",
            "high-contrast",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-sheet--vibrant",
          "frame": "/iframe.html?id=components-molecules-sheet--vibrant&viewMode=story"
        },
        {
          "name": "Solid",
          "id": "components-molecules-sheet--solid",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-sheet--solid",
          "frame": "/iframe.html?id=components-molecules-sheet--solid&viewMode=story"
        },
        {
          "name": "Bleed Section",
          "id": "components-molecules-sheet--bleed-section",
          "interaction": false,
          "snapshots": [
            "dark"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-sheet--bleed-section",
          "frame": "/iframe.html?id=components-molecules-sheet--bleed-section&viewMode=story"
        }
      ],
      "storyFile": "tooling/storybook/stories/components/molecules/sheet.stories.tsx"
    },
    {
      "id": "sidebar-section",
      "name": "SidebarSection",
      "level": "molecule",
      "status": "stable",
      "purpose": "The sidebar's content — in the rail, one group of rows.",
      "description": "Sidebar landmark <aside aria-label> with optional title (header) and footer. Body fills the remaining height; footer pinned at the bottom. Compose NavGroup + NavItem inside. Patterns consulted: Patterns/Navigation · NavigationLayers, Patterns/Page Shells · PageHeader.",
      "role": "navigation",
      "import": "@rrios-forge/ui/molecules/sidebar-section",
      "exports": [
        "SidebarSection",
        "sidebarSectionVariants"
      ],
      "source": "packages/ui/src/molecules/sidebar-section",
      "axes": [],
      "needs": [
        {
          "need": "App frame / navigation",
          "answer": "**The rail that peeks (ADR-044) — the default and the recommendation.** `PageShell` (defaults: `sidebarMode=\"rail\"`, `sidebarPresentation=\"inset\"`, `mobileNav=\"tabs\"`) + `SidebarSection aria-label` + ONE untitled `NavGroup`: home, search, the rooms, settings — same size, same gap. Wrap every `NavItem` in `PageShell.RailPeek` and compose its panel with `PageShell.PeekHeader` / `PeekFacts` / `PeekLinks`. Search is a button row opening `CommandMenu` (⌘K); settings' peek holds the quick controls; phones get `PageShell.MobileTabBar` (≤ 5). No `TopBar` in an app frame. Opt-ins only when a product needs them: the labelled panel (`sidebarMode=\"auto\"`, ⌘\\\\ collapse, ADR-040), `island`/`column` (ADR-025), the bubble (`mobileNav=\"bubble\"`)"
        }
      ],
      "patterns": [],
      "a11yExceptions": [],
      "decisions": [
        {
          "id": "ADR-010",
          "title": "PageShell v4: bottom dock + mobile floating bubble"
        },
        {
          "id": "ADR-011",
          "title": "PageShell v5: adaptive lateral sidebar + mobile nav bubble"
        },
        {
          "id": "ADR-014",
          "title": "PageShell: Apple Mail / macOS Big Sur visual register"
        }
      ],
      "stories": [
        {
          "name": "Playground",
          "id": "components-molecules-sidebarsection--playground",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-sidebarsection--playground",
          "frame": "/iframe.html?id=components-molecules-sidebarsection--playground&viewMode=story"
        },
        {
          "name": "Product nav",
          "id": "components-molecules-sidebarsection--product-nav",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-sidebarsection--product-nav",
          "frame": "/iframe.html?id=components-molecules-sidebarsection--product-nav&viewMode=story"
        },
        {
          "name": "Account nav",
          "id": "components-molecules-sidebarsection--account-nav",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-sidebarsection--account-nav",
          "frame": "/iframe.html?id=components-molecules-sidebarsection--account-nav&viewMode=story"
        },
        {
          "name": "Collapsed preview",
          "id": "components-molecules-sidebarsection--collapsed-preview",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-sidebarsection--collapsed-preview",
          "frame": "/iframe.html?id=components-molecules-sidebarsection--collapsed-preview&viewMode=story"
        }
      ],
      "storyFile": "tooling/storybook/stories/components/molecules/sidebar-section.stories.tsx"
    },
    {
      "id": "slider",
      "name": "Slider",
      "level": "molecule",
      "status": "stable",
      "purpose": "Picks a value along a range by dragging.",
      "description": "Semantic value selector. Wraps `@radix-ui/react-slider`, so the ARIA contract\n(`role=\"slider\"`, `aria-valuemin/max/now`, arrow + page + Home/End navigation, RTL-aware orientation)\nis right by construction. Pass one value for a single slider, two or more for a range —\nRadix renders one Thumb per value.\n\nComposition slots: `marks`, `showValue`+`formatValue` (value bubble),\n`startAdornment`/`endAdornment`, and `gradient` for the filled range.\nHit area stays at 44 × 44 at every size via an invisible pseudo-element on each thumb.",
      "role": "input",
      "import": "@rrios-forge/ui/molecules/slider",
      "exports": [
        "Slider",
        "sliderAdornmentVariants",
        "sliderMarkLabelVariants",
        "sliderMarkVariants",
        "sliderRangeVariants",
        "sliderRootVariants",
        "sliderThumbVariants",
        "sliderTrackVariants",
        "sliderValueBubbleVariants",
        "SLIDER_INTENTS",
        "SLIDER_ORIENTATIONS",
        "SLIDER_SHOW_VALUE",
        "SLIDER_SIZES",
        "SLIDER_TONES"
      ],
      "source": "packages/ui/src/molecules/slider",
      "axes": [
        {
          "axis": "orientation",
          "part": null,
          "values": [
            "horizontal",
            "vertical"
          ],
          "default": "horizontal",
          "meaning": "The direction the parts run: a row (horizontal) or a column (vertical); responsive stacks on phones and runs in a row from sm."
        },
        {
          "axis": "size",
          "part": null,
          "values": [
            "sm",
            "md",
            "lg"
          ],
          "default": "md",
          "meaning": "Ergonomic scale, in three families (control, text, container)."
        },
        {
          "axis": "intent",
          "part": null,
          "values": [
            "primary"
          ],
          "default": null,
          "meaning": "What an action does."
        },
        {
          "axis": "tone",
          "part": null,
          "values": [
            "neutral",
            "info",
            "success",
            "warning",
            "danger"
          ],
          "default": null,
          "meaning": "Which semantic colour family the element speaks in."
        },
        {
          "axis": "visibility",
          "part": null,
          "values": [
            "always",
            "on-interaction"
          ],
          "default": "on-interaction",
          "meaning": "When an affordance shows."
        }
      ],
      "needs": [
        {
          "need": "Date field / file drop / slider",
          "answer": "`DateField` / `FileDropzone` / `Slider`"
        }
      ],
      "patterns": [],
      "a11yExceptions": [],
      "decisions": [],
      "stories": [
        {
          "name": "Playground",
          "id": "components-molecules-slider--playground",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-slider--playground",
          "frame": "/iframe.html?id=components-molecules-slider--playground&viewMode=story"
        },
        {
          "name": "Variants — tones",
          "id": "components-molecules-slider--variants",
          "interaction": false,
          "snapshots": [
            "dark",
            "high-contrast",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-slider--variants",
          "frame": "/iframe.html?id=components-molecules-slider--variants&viewMode=story"
        },
        {
          "name": "Sizes",
          "id": "components-molecules-slider--sizes",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-slider--sizes",
          "frame": "/iframe.html?id=components-molecules-slider--sizes&viewMode=story"
        },
        {
          "name": "States",
          "id": "components-molecules-slider--states",
          "interaction": false,
          "snapshots": [
            "dark",
            "high-contrast",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-slider--states",
          "frame": "/iframe.html?id=components-molecules-slider--states&viewMode=story"
        },
        {
          "name": "Range",
          "id": "components-molecules-slider--range",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-slider--range",
          "frame": "/iframe.html?id=components-molecules-slider--range&viewMode=story"
        },
        {
          "name": "With marks",
          "id": "components-molecules-slider--with-marks",
          "interaction": false,
          "snapshots": [
            "dark",
            "high-contrast",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-slider--with-marks",
          "frame": "/iframe.html?id=components-molecules-slider--with-marks&viewMode=story"
        },
        {
          "name": "Vertical",
          "id": "components-molecules-slider--vertical",
          "interaction": false,
          "snapshots": [
            "dark",
            "high-contrast",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-slider--vertical",
          "frame": "/iframe.html?id=components-molecules-slider--vertical&viewMode=story"
        },
        {
          "name": "With adornments",
          "id": "components-molecules-slider--with-adornments",
          "interaction": false,
          "snapshots": [
            "dark",
            "high-contrast",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-slider--with-adornments",
          "frame": "/iframe.html?id=components-molecules-slider--with-adornments&viewMode=story"
        },
        {
          "name": "With value bubble",
          "id": "components-molecules-slider--with-value-bubble",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-slider--with-value-bubble",
          "frame": "/iframe.html?id=components-molecules-slider--with-value-bubble&viewMode=story"
        },
        {
          "name": "Gradient track",
          "id": "components-molecules-slider--gradient-track",
          "interaction": false,
          "snapshots": [
            "dark",
            "high-contrast",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-slider--gradient-track",
          "frame": "/iframe.html?id=components-molecules-slider--gradient-track&viewMode=story"
        },
        {
          "name": "In context",
          "id": "components-molecules-slider--in-context",
          "interaction": false,
          "snapshots": [
            "dark",
            "high-contrast",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-slider--in-context",
          "frame": "/iframe.html?id=components-molecules-slider--in-context&viewMode=story"
        },
        {
          "name": "RTL",
          "id": "components-molecules-slider--right-to-left",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-slider--right-to-left",
          "frame": "/iframe.html?id=components-molecules-slider--right-to-left&viewMode=story"
        }
      ],
      "storyFile": "tooling/storybook/stories/components/molecules/slider.stories.tsx"
    },
    {
      "id": "split-action",
      "name": "SplitAction",
      "level": "molecule",
      "status": "stable",
      "purpose": "A main action with a menu of related ones beside it.",
      "description": "Two independent buttons (main + menu trigger) attached visually. Each is a separate focus stop. Destructive split actions reserve danger for the main button and the matching menu items — never for the menu trigger alone. Patterns consulted: Patterns/Visual Priority · ActionHierarchy, Patterns/Overlays · DropdownVsDialog.",
      "role": "action",
      "import": "@rrios-forge/ui/molecules/split-action",
      "exports": [
        "SplitAction",
        "SPLIT_ACTION_EMPHASES",
        "SPLIT_ACTION_INTENTS",
        "SPLIT_ACTION_SIZES",
        "splitActionVariants"
      ],
      "source": "packages/ui/src/molecules/split-action",
      "axes": [
        {
          "axis": "size",
          "part": null,
          "values": [
            "sm",
            "md",
            "lg"
          ],
          "default": "md",
          "meaning": "Ergonomic scale, in three families (control, text, container)."
        }
      ],
      "needs": [
        {
          "need": "Toolbar / split action",
          "answer": "`Toolbar` or `ActionGroup` / `SplitAction`"
        }
      ],
      "patterns": [],
      "a11yExceptions": [],
      "decisions": [
        {
          "id": "ADR-030",
          "title": "Axis vocabulary: one name, one meaning"
        }
      ],
      "stories": [
        {
          "name": "Playground",
          "id": "components-molecules-splitaction--playground",
          "interaction": true,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-splitaction--playground",
          "frame": "/iframe.html?id=components-molecules-splitaction--playground&viewMode=story"
        },
        {
          "name": "Intents",
          "id": "components-molecules-splitaction--intents",
          "interaction": false,
          "snapshots": [
            "dark",
            "high-contrast",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-splitaction--intents",
          "frame": "/iframe.html?id=components-molecules-splitaction--intents&viewMode=story"
        },
        {
          "name": "Emphases",
          "id": "components-molecules-splitaction--emphases",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-splitaction--emphases",
          "frame": "/iframe.html?id=components-molecules-splitaction--emphases&viewMode=story"
        },
        {
          "name": "Sizes",
          "id": "components-molecules-splitaction--sizes",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-splitaction--sizes",
          "frame": "/iframe.html?id=components-molecules-splitaction--sizes&viewMode=story"
        },
        {
          "name": "With danger menu",
          "id": "components-molecules-splitaction--with-danger-menu",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-splitaction--with-danger-menu",
          "frame": "/iframe.html?id=components-molecules-splitaction--with-danger-menu&viewMode=story"
        },
        {
          "name": "In toolbar",
          "id": "components-molecules-splitaction--in-toolbar",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-splitaction--in-toolbar",
          "frame": "/iframe.html?id=components-molecules-splitaction--in-toolbar&viewMode=story"
        }
      ],
      "storyFile": "tooling/storybook/stories/components/molecules/split-action.stories.tsx"
    },
    {
      "id": "status-row",
      "name": "StatusRow",
      "level": "molecule",
      "status": "stable",
      "purpose": "The state of one thing, named and explained in a line.",
      "description": "One-line status display with leading tone dot (or icon), title, optional description, trailing Badge and trailing action. Tone colours only the leading dot (or tinted icon); the row is chrome-less, so a stack is grouped by its host (a Card with `divide-y divide-boundary-subtle`). Pair the trailing status with an outline Badge so the dot stays the only saturated mark. The body always reads in the surface's default content tone, so meaning never relies on colour alone (R14). Patterns consulted: Patterns/Feedback · LocalVsGlobalFeedback, Patterns/Visual Priority · StatusHierarchy.",
      "role": "status",
      "import": "@rrios-forge/ui/molecules/status-row",
      "exports": [
        "StatusRow",
        "STATUS_ROW_TONES",
        "statusRowDotVariants",
        "statusRowIconVariants",
        "statusRowVariants"
      ],
      "source": "packages/ui/src/molecules/status-row",
      "axes": [
        {
          "axis": "tone",
          "part": null,
          "values": [
            "neutral",
            "info",
            "success",
            "warning",
            "danger"
          ],
          "default": "neutral",
          "meaning": "Which semantic colour family the element speaks in."
        }
      ],
      "needs": [],
      "patterns": [],
      "a11yExceptions": [],
      "decisions": [
        {
          "id": "ADR-030",
          "title": "Axis vocabulary: one name, one meaning"
        }
      ],
      "stories": [
        {
          "name": "Playground",
          "id": "components-molecules-statusrow--playground",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-statusrow--playground",
          "frame": "/iframe.html?id=components-molecules-statusrow--playground&viewMode=story"
        },
        {
          "name": "Tones",
          "id": "components-molecules-statusrow--tones",
          "interaction": false,
          "snapshots": [
            "dark",
            "high-contrast",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-statusrow--tones",
          "frame": "/iframe.html?id=components-molecules-statusrow--tones&viewMode=story"
        },
        {
          "name": "With action",
          "id": "components-molecules-statusrow--with-action",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-statusrow--with-action",
          "frame": "/iframe.html?id=components-molecules-statusrow--with-action&viewMode=story"
        },
        {
          "name": "System health",
          "id": "components-molecules-statusrow--system-health",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-statusrow--system-health",
          "frame": "/iframe.html?id=components-molecules-statusrow--system-health&viewMode=story"
        },
        {
          "name": "Billing status",
          "id": "components-molecules-statusrow--billing-status",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-statusrow--billing-status",
          "frame": "/iframe.html?id=components-molecules-statusrow--billing-status&viewMode=story"
        }
      ],
      "storyFile": "tooling/storybook/stories/components/molecules/status-row.stories.tsx"
    },
    {
      "id": "stepper",
      "name": "Stepper",
      "level": "molecule",
      "status": "stable",
      "purpose": "Multi-step process indicator.",
      "description": "<ol role=\"list\"> with per-step status (complete | current | upcoming | error). Status carries on glyph + index, never on colour alone (R14). Current step also carries aria-current=step.",
      "role": "navigation",
      "import": "@rrios-forge/ui/molecules/stepper",
      "exports": [
        "Stepper",
        "STEPPER_ORIENTATIONS",
        "STEPPER_STATUSES",
        "stepIndicatorVariants",
        "stepperVariants"
      ],
      "source": "packages/ui/src/molecules/stepper",
      "axes": [
        {
          "axis": "orientation",
          "part": null,
          "values": [
            "horizontal",
            "vertical"
          ],
          "default": "horizontal",
          "meaning": "The direction the parts run: a row (horizontal) or a column (vertical); responsive stacks on phones and runs in a row from sm."
        },
        {
          "axis": "status",
          "part": null,
          "values": [
            "complete",
            "current",
            "upcoming",
            "error"
          ],
          "default": "upcoming",
          "meaning": "Progress state of a step."
        }
      ],
      "needs": [
        {
          "need": "Filters / pagination / stepper",
          "answer": "`FilterBar` / `Pagination` / `Stepper`"
        }
      ],
      "patterns": [],
      "a11yExceptions": [],
      "decisions": [],
      "stories": [
        {
          "name": "Playground",
          "id": "components-molecules-stepper--playground",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-stepper--playground",
          "frame": "/iframe.html?id=components-molecules-stepper--playground&viewMode=story"
        },
        {
          "name": "Horizontal",
          "id": "components-molecules-stepper--horizontal",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-stepper--horizontal",
          "frame": "/iframe.html?id=components-molecules-stepper--horizontal&viewMode=story"
        },
        {
          "name": "Vertical",
          "id": "components-molecules-stepper--vertical",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-stepper--vertical",
          "frame": "/iframe.html?id=components-molecules-stepper--vertical&viewMode=story"
        },
        {
          "name": "With error",
          "id": "components-molecules-stepper--with-error",
          "interaction": false,
          "snapshots": [
            "dark",
            "high-contrast",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-stepper--with-error",
          "frame": "/iframe.html?id=components-molecules-stepper--with-error&viewMode=story"
        },
        {
          "name": "Completed",
          "id": "components-molecules-stepper--completed",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-stepper--completed",
          "frame": "/iframe.html?id=components-molecules-stepper--completed&viewMode=story"
        }
      ],
      "storyFile": "tooling/storybook/stories/components/molecules/stepper.stories.tsx"
    },
    {
      "id": "table-header",
      "name": "TableHeader",
      "level": "molecule",
      "status": "stable",
      "purpose": "DataTable header cells with sort indicators.",
      "description": "Header row for div-based tables / pseudo-tables. Sentence-case labels at text-xs. Sortable cells render as <button> with aria-sort; inactive chevrons stay visible. `trailing` mirrors TableRow.action and `align` mirrors the row cell align, so columns line up. Pair the same flex template with TableRow so cells line up. Patterns consulted: Patterns/Information Architecture · MetadataAndActions.",
      "role": "content",
      "import": "@rrios-forge/ui/molecules/table-header",
      "exports": [
        "TableHeader",
        "TABLE_HEADER_ALIGNS",
        "TABLE_HEADER_DENSITIES",
        "TABLE_HEADER_SORT_DIRECTIONS",
        "tableHeaderCellAlignClass",
        "tableHeaderVariants"
      ],
      "source": "packages/ui/src/molecules/table-header",
      "axes": [
        {
          "axis": "density",
          "part": null,
          "values": [
            "compact",
            "comfortable"
          ],
          "default": null,
          "meaning": null
        },
        {
          "axis": "align",
          "part": null,
          "values": [
            "start",
            "center",
            "end"
          ],
          "default": null,
          "meaning": "Distribution along the main axis."
        }
      ],
      "needs": [
        {
          "need": "Table",
          "answer": "`DataTable`, or `TableHeader` + `TableRow` + `TablePagination`"
        }
      ],
      "patterns": [],
      "a11yExceptions": [],
      "decisions": [],
      "stories": [
        {
          "name": "Playground",
          "id": "components-molecules-tableheader--playground",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-tableheader--playground",
          "frame": "/iframe.html?id=components-molecules-tableheader--playground&viewMode=story"
        },
        {
          "name": "Sortable",
          "id": "components-molecules-tableheader--sortable",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-tableheader--sortable",
          "frame": "/iframe.html?id=components-molecules-tableheader--sortable&viewMode=story"
        },
        {
          "name": "Densities",
          "id": "components-molecules-tableheader--densities",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-tableheader--densities",
          "frame": "/iframe.html?id=components-molecules-tableheader--densities&viewMode=story"
        },
        {
          "name": "In data surface",
          "id": "components-molecules-tableheader--in-data-surface",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-tableheader--in-data-surface",
          "frame": "/iframe.html?id=components-molecules-tableheader--in-data-surface&viewMode=story"
        }
      ],
      "storyFile": "tooling/storybook/stories/components/molecules/table-header.stories.tsx"
    },
    {
      "id": "table-pagination",
      "name": "TablePagination",
      "level": "molecule",
      "status": "stable",
      "purpose": "Pagination footer for DataTable.",
      "description": "Composes the existing Pagination molecule with a summary line ('1–10 of 42'). page / pageCount are required and 1-based; pageSize / totalItems unlock the compressed range. Patterns consulted: Patterns/Navigation · PaginationForDatasets, Patterns/Page Shells · DataPage.",
      "role": "navigation",
      "import": "@rrios-forge/ui/molecules/table-pagination",
      "exports": [
        "TablePagination",
        "TABLE_PAGINATION_DENSITIES",
        "tablePaginationVariants"
      ],
      "source": "packages/ui/src/molecules/table-pagination",
      "axes": [
        {
          "axis": "density",
          "part": null,
          "values": [
            "compact",
            "comfortable"
          ],
          "default": null,
          "meaning": null
        }
      ],
      "needs": [
        {
          "need": "Table",
          "answer": "`DataTable`, or `TableHeader` + `TableRow` + `TablePagination`"
        }
      ],
      "patterns": [],
      "a11yExceptions": [],
      "decisions": [],
      "stories": [
        {
          "name": "Playground",
          "id": "components-molecules-tablepagination--playground",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-tablepagination--playground",
          "frame": "/iframe.html?id=components-molecules-tablepagination--playground&viewMode=story"
        },
        {
          "name": "Many pages",
          "id": "components-molecules-tablepagination--many-pages",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-tablepagination--many-pages",
          "frame": "/iframe.html?id=components-molecules-tablepagination--many-pages&viewMode=story"
        },
        {
          "name": "First page",
          "id": "components-molecules-tablepagination--first-page",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-tablepagination--first-page",
          "frame": "/iframe.html?id=components-molecules-tablepagination--first-page&viewMode=story"
        },
        {
          "name": "Last page",
          "id": "components-molecules-tablepagination--last-page",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-tablepagination--last-page",
          "frame": "/iframe.html?id=components-molecules-tablepagination--last-page&viewMode=story"
        },
        {
          "name": "In data surface",
          "id": "components-molecules-tablepagination--in-data-surface",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-tablepagination--in-data-surface",
          "frame": "/iframe.html?id=components-molecules-tablepagination--in-data-surface&viewMode=story"
        }
      ],
      "storyFile": "tooling/storybook/stories/components/molecules/table-pagination.stories.tsx"
    },
    {
      "id": "table-row",
      "name": "TableRow",
      "level": "molecule",
      "status": "stable",
      "purpose": "One row of a table, selectable when the table is.",
      "description": "Renders <div role=\"row\">. Cells accept a node or `{ content, align }`; `align` mirrors TableHeaderColumn.align so a column lines up with its header (`end` adds tabular-nums). Selected rows wear the selected register plus weight and `aria-selected`; hover is a quiet fill. The molecule never adds tabIndex; the consumer wraps the row in a real semantic interactive element when the whole row commits an action. Patterns consulted: Patterns/Density & Growth · DensityLevels + ContentGrowth.",
      "role": "content",
      "import": "@rrios-forge/ui/molecules/table-row",
      "exports": [
        "TableRow",
        "TABLE_ROW_DENSITIES",
        "tableRowVariants"
      ],
      "source": "packages/ui/src/molecules/table-row",
      "axes": [
        {
          "axis": "selected",
          "part": null,
          "values": [
            "true",
            "false"
          ],
          "default": "false",
          "meaning": "Chosen in a set: the selected wash plus a non-colour cue (weight, check)."
        },
        {
          "axis": "disabled",
          "part": null,
          "values": [
            "true",
            "false"
          ],
          "default": "false",
          "meaning": "Not available: dimmed, skipped by the keyboard, ignores the pointer."
        },
        {
          "axis": "interactive",
          "part": null,
          "values": [
            "true",
            "false"
          ],
          "default": "false",
          "meaning": "Responds to the pointer: hover and press feedback, a pointer cursor."
        }
      ],
      "needs": [
        {
          "need": "Table",
          "answer": "`DataTable`, or `TableHeader` + `TableRow` + `TablePagination`"
        }
      ],
      "patterns": [],
      "a11yExceptions": [],
      "decisions": [],
      "stories": [
        {
          "name": "Playground",
          "id": "components-molecules-tablerow--playground",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-tablerow--playground",
          "frame": "/iframe.html?id=components-molecules-tablerow--playground&viewMode=story"
        },
        {
          "name": "Densities",
          "id": "components-molecules-tablerow--densities",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-tablerow--densities",
          "frame": "/iframe.html?id=components-molecules-tablerow--densities&viewMode=story"
        },
        {
          "name": "Selected",
          "id": "components-molecules-tablerow--selected",
          "interaction": false,
          "snapshots": [
            "dark",
            "high-contrast",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-tablerow--selected",
          "frame": "/iframe.html?id=components-molecules-tablerow--selected&viewMode=story"
        },
        {
          "name": "With actions",
          "id": "components-molecules-tablerow--with-actions",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-tablerow--with-actions",
          "frame": "/iframe.html?id=components-molecules-tablerow--with-actions&viewMode=story"
        },
        {
          "name": "In data surface",
          "id": "components-molecules-tablerow--in-data-surface",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-tablerow--in-data-surface",
          "frame": "/iframe.html?id=components-molecules-tablerow--in-data-surface&viewMode=story"
        }
      ],
      "storyFile": "tooling/storybook/stories/components/molecules/table-row.stories.tsx"
    },
    {
      "id": "tabs",
      "name": "Tabs",
      "level": "molecule",
      "status": "stable",
      "purpose": "Switches between sibling views of the same subject.",
      "description": "Semantic tab strip. Composes `@radix-ui/react-tabs` (`role=\"tablist\"` + `role=\"tab\"` + `role=\"tabpanel\"`, arrow-key navigation, type-ahead). `variant=\"underline\"` (default) for low-chrome page sub-navs; `variant=\"enclosed\"` for tab pills inside cards or panels.",
      "role": "navigation",
      "import": "@rrios-forge/ui/molecules/tabs",
      "exports": [
        "Tabs",
        "TabsContent",
        "TabsList",
        "TabsTrigger",
        "tabsContentVariants",
        "tabsListVariants",
        "tabsTriggerVariants",
        "TABS_PRESENTATIONS",
        "TABS_SIZES",
        "TABS_VARIANTS"
      ],
      "source": "packages/ui/src/molecules/tabs",
      "axes": [
        {
          "axis": "presentation",
          "part": null,
          "values": [
            "tabs",
            "segmented"
          ],
          "default": "tabs",
          "meaning": "How the same thing is staged."
        },
        {
          "axis": "size",
          "part": null,
          "values": [
            "sm",
            "md",
            "lg"
          ],
          "default": "md",
          "meaning": "Ergonomic scale, in three families (control, text, container)."
        }
      ],
      "needs": [
        {
          "need": "Tabs / select / autocomplete",
          "answer": "`Tabs` / `Select` / `Combobox` or `SearchField`"
        }
      ],
      "patterns": [],
      "a11yExceptions": [],
      "decisions": [],
      "stories": [
        {
          "name": "Playground",
          "id": "components-molecules-tabs--playground",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-tabs--playground",
          "frame": "/iframe.html?id=components-molecules-tabs--playground&viewMode=story"
        },
        {
          "name": "Variants",
          "id": "components-molecules-tabs--variants",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-tabs--variants",
          "frame": "/iframe.html?id=components-molecules-tabs--variants&viewMode=story"
        },
        {
          "name": "Sizes",
          "id": "components-molecules-tabs--sizes",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-tabs--sizes",
          "frame": "/iframe.html?id=components-molecules-tabs--sizes&viewMode=story"
        },
        {
          "name": "In context",
          "id": "components-molecules-tabs--in-context",
          "interaction": false,
          "snapshots": [
            "dark",
            "high-contrast",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-tabs--in-context",
          "frame": "/iframe.html?id=components-molecules-tabs--in-context&viewMode=story"
        },
        {
          "name": "Keyboard flow (interaction test)",
          "id": "components-molecules-tabs--keyboard-flow",
          "interaction": true,
          "snapshots": [],
          "skipsSnapshot": true,
          "docs": "/?path=/story/components-molecules-tabs--keyboard-flow",
          "frame": "/iframe.html?id=components-molecules-tabs--keyboard-flow&viewMode=story"
        }
      ],
      "storyFile": "tooling/storybook/stories/components/molecules/tabs.stories.tsx"
    },
    {
      "id": "timeline-item",
      "name": "TimelineItem",
      "level": "molecule",
      "status": "stable",
      "purpose": "One step in a timeline: what happened, who did it and when.",
      "description": "<li> with a leading dot (or icon) on a rail. Tone colours only the dot; the body reads in the default content tone (R14). The item owns its rail (dot + hairline to the next item, hidden on the last); the consumer wraps items in a gap-less <ol role=\"list\" className=\"flex flex-col\">.",
      "role": "content",
      "import": "@rrios-forge/ui/molecules/timeline-item",
      "exports": [
        "TimelineItem",
        "TIMELINE_ITEM_TONES",
        "timelineItemDotVariants",
        "timelineItemIconVariants",
        "timelineItemVariants"
      ],
      "source": "packages/ui/src/molecules/timeline-item",
      "axes": [
        {
          "axis": "tone",
          "part": null,
          "values": [
            "neutral",
            "info",
            "success",
            "warning",
            "danger"
          ],
          "default": "neutral",
          "meaning": "Which semantic colour family the element speaks in."
        }
      ],
      "needs": [
        {
          "need": "Notification / timeline / activity item",
          "answer": "`NotificationItem` / `TimelineItem` / `ActivityItem`"
        }
      ],
      "patterns": [],
      "a11yExceptions": [],
      "decisions": [
        {
          "id": "ADR-030",
          "title": "Axis vocabulary: one name, one meaning"
        }
      ],
      "stories": [
        {
          "name": "Playground",
          "id": "components-molecules-timelineitem--playground",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-timelineitem--playground",
          "frame": "/iframe.html?id=components-molecules-timelineitem--playground&viewMode=story"
        },
        {
          "name": "Tones",
          "id": "components-molecules-timelineitem--tones",
          "interaction": false,
          "snapshots": [
            "dark",
            "high-contrast",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-timelineitem--tones",
          "frame": "/iframe.html?id=components-molecules-timelineitem--tones&viewMode=story"
        },
        {
          "name": "With action",
          "id": "components-molecules-timelineitem--with-action",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-timelineitem--with-action",
          "frame": "/iframe.html?id=components-molecules-timelineitem--with-action&viewMode=story"
        },
        {
          "name": "Timeline stack",
          "id": "components-molecules-timelineitem--timeline-stack",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-timelineitem--timeline-stack",
          "frame": "/iframe.html?id=components-molecules-timelineitem--timeline-stack&viewMode=story"
        }
      ],
      "storyFile": "tooling/storybook/stories/components/molecules/timeline-item.stories.tsx"
    },
    {
      "id": "toast",
      "name": "Toast",
      "level": "molecule",
      "status": "stable",
      "purpose": "A brief message about something that just happened.",
      "description": "Transient feedback message. Composes `@radix-ui/react-toast` (`role=\"status\"` for default, `role=\"alert\"` for danger; polite/assertive live regions, swipe-to-dismiss, escape-to-close). The Provider wraps the app; the Viewport is the portal target. It wears the shared overlay glass (ADR-038) with a leading tinted status glyph — colour pairs with the glyph shape and the message text so meaning never rides on colour alone (R14).",
      "role": "feedback",
      "import": "@rrios-forge/ui/molecules/toast",
      "exports": [
        "Toast",
        "ToastAction",
        "ToastClose",
        "ToastDescription",
        "ToastIcon",
        "ToastProvider",
        "ToastTitle",
        "ToastViewport",
        "toastIconPillVariants",
        "toastVariants",
        "toastViewportVariants",
        "TOAST_TONES"
      ],
      "source": "packages/ui/src/molecules/toast",
      "axes": [
        {
          "axis": "tone",
          "part": null,
          "values": [
            "neutral",
            "info",
            "success",
            "warning",
            "danger"
          ],
          "default": "neutral",
          "meaning": "Which semantic colour family the element speaks in."
        }
      ],
      "needs": [
        {
          "need": "Ephemeral toast",
          "answer": "`Toast`"
        }
      ],
      "patterns": [],
      "a11yExceptions": [],
      "decisions": [],
      "stories": [
        {
          "name": "Tones",
          "id": "components-molecules-toast--tones",
          "interaction": false,
          "snapshots": [
            "dark",
            "high-contrast",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-toast--tones",
          "frame": "/iframe.html?id=components-molecules-toast--tones&viewMode=story"
        },
        {
          "name": "With action",
          "id": "components-molecules-toast--with-action",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-toast--with-action",
          "frame": "/iframe.html?id=components-molecules-toast--with-action&viewMode=story"
        },
        {
          "name": "Default",
          "id": "components-molecules-toast--default",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-toast--default",
          "frame": "/iframe.html?id=components-molecules-toast--default&viewMode=story"
        }
      ],
      "storyFile": "tooling/storybook/stories/components/molecules/toast.stories.tsx"
    },
    {
      "id": "toolbar",
      "name": "Toolbar",
      "level": "molecule",
      "status": "stable",
      "purpose": "Generic horizontal toolbar of actions.",
      "description": "Compact action / filter row. Renders <div role=\"toolbar\"> with align (start | between | end) and density (compact | comfortable). Chrome-less: items carry the grouping and a framed toolbar is its host's Card. Children keep their intrinsic width; mark the one that should grow with `data-toolbar-grow`. The molecule never reorders children — reading order matches visual order. Patterns consulted: Patterns/Visual Priority · ActionHierarchy, Patterns/Density & Growth · ActionOverflow.",
      "role": "action",
      "import": "@rrios-forge/ui/molecules/toolbar",
      "exports": [
        "Toolbar",
        "TOOLBAR_ALIGNS",
        "TOOLBAR_DENSITIES",
        "toolbarVariants"
      ],
      "source": "packages/ui/src/molecules/toolbar",
      "axes": [
        {
          "axis": "align",
          "part": null,
          "values": [
            "start",
            "between",
            "end"
          ],
          "default": "between",
          "meaning": "Distribution along the main axis."
        }
      ],
      "needs": [
        {
          "need": "Toolbar / split action",
          "answer": "`Toolbar` or `ActionGroup` / `SplitAction`"
        }
      ],
      "patterns": [],
      "a11yExceptions": [],
      "decisions": [],
      "stories": [
        {
          "name": "Playground",
          "id": "components-molecules-toolbar--playground",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-toolbar--playground",
          "frame": "/iframe.html?id=components-molecules-toolbar--playground&viewMode=story"
        },
        {
          "name": "With search",
          "id": "components-molecules-toolbar--with-search",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-toolbar--with-search",
          "frame": "/iframe.html?id=components-molecules-toolbar--with-search&viewMode=story"
        },
        {
          "name": "With filters",
          "id": "components-molecules-toolbar--with-filters",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-toolbar--with-filters",
          "frame": "/iframe.html?id=components-molecules-toolbar--with-filters&viewMode=story"
        },
        {
          "name": "With actions",
          "id": "components-molecules-toolbar--with-actions",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-toolbar--with-actions",
          "frame": "/iframe.html?id=components-molecules-toolbar--with-actions&viewMode=story"
        },
        {
          "name": "Dense",
          "id": "components-molecules-toolbar--dense",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-toolbar--dense",
          "frame": "/iframe.html?id=components-molecules-toolbar--dense&viewMode=story"
        }
      ],
      "storyFile": "tooling/storybook/stories/components/molecules/toolbar.stories.tsx"
    },
    {
      "id": "tooltip",
      "name": "Tooltip",
      "level": "molecule",
      "status": "stable",
      "purpose": "A short label that appears on hover or focus.",
      "description": "**Purpose.** A short label that describes a target on hover or focus. Composes `@radix-ui/react-tooltip` for the ARIA contract: `role=\"tooltip\"`, focus + hover triggers, escape-to-dismiss, single-trigger inheritance.\n\n**When to use.**\n- Reveal the name of an `IconButton` whose glyph is the only visible affordance.\n- Reveal a keyboard shortcut paired with a labelled control (`Save` + `⌘ S`).\n- Disambiguate a truncated text or a status glyph in a dense surface.\n\n**When NOT to use.**\n- Critical information the user must read → use visible copy. Tooltips are not always exposed by assistive tech and disappear on blur.\n- An interactive payload (links, buttons, forms) → use `Popover`. Tooltip is non-interactive.\n- A long description that exceeds one line → use `Popover` or inline text.\n- Mobile-first surfaces where there is no hover → use visible labels.\n\n**Composes with.**\n- `IconButton` (the canonical pairing — Tooltip names the icon-only control).\n- `Kbd` (inside `TooltipContent` for shortcut hints).\n- `TooltipProvider` wraps the whole tree once at the app root; consumers do not nest it per-tooltip.\n\n**Accessibility.**\n- Renders `role=\"tooltip\"`; the trigger element receives `aria-describedby` automatically.\n- Keyboard contract: focusing the trigger opens the tooltip; `Escape` dismisses; blur dismisses. Hover is the secondary trigger, not the primary.\n- The tooltip must never be the sole source of meaning. The trigger element keeps its own accessible name (`aria-label` on `IconButton`).\n\n**Related patterns.**\n- `Patterns/Overlays · OverlayChoice` — Tooltip vs Popover vs DropdownMenu vs Dialog.\n- `Patterns/Iconography · ConsumingComponents` — Tooltip is the canonical companion for `IconButton`.\n- `Patterns/Decision Matrix · ComponentChoice` — when a Tooltip earns its ceremony.",
      "role": "overlay",
      "import": "@rrios-forge/ui/molecules/tooltip",
      "exports": [
        "Tooltip",
        "TooltipContent",
        "TooltipProvider",
        "TooltipTrigger",
        "tooltipContentVariants",
        "TOOLTIP_TONES"
      ],
      "source": "packages/ui/src/molecules/tooltip",
      "axes": [
        {
          "axis": "tone",
          "part": null,
          "values": [
            "neutral",
            "inverse"
          ],
          "default": "neutral",
          "meaning": "Which semantic colour family the element speaks in."
        }
      ],
      "needs": [
        {
          "need": "Tooltip / popover / contextual menu",
          "answer": "`Tooltip` / `Popover` / `DropdownMenu`"
        }
      ],
      "patterns": [
        "Patterns/Overlays · OverlayChoice",
        "Patterns/Decision Matrix · ComponentChoice",
        "Patterns/Iconography · ConsumingComponents"
      ],
      "a11yExceptions": [],
      "decisions": [
        {
          "id": "ADR-007",
          "title": "Material highlight on raised surfaces"
        },
        {
          "id": "ADR-018",
          "title": "Motion language as a Pattern Layer contract"
        }
      ],
      "stories": [
        {
          "name": "Playground",
          "id": "components-molecules-tooltip--playground",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-tooltip--playground",
          "frame": "/iframe.html?id=components-molecules-tooltip--playground&viewMode=story"
        },
        {
          "name": "Tones",
          "id": "components-molecules-tooltip--tones",
          "interaction": false,
          "snapshots": [
            "dark",
            "high-contrast",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-tooltip--tones",
          "frame": "/iframe.html?id=components-molecules-tooltip--tones&viewMode=story"
        },
        {
          "name": "With shortcut",
          "id": "components-molecules-tooltip--with-shortcut",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-tooltip--with-shortcut",
          "frame": "/iframe.html?id=components-molecules-tooltip--with-shortcut&viewMode=story"
        },
        {
          "name": "In toolbar",
          "id": "components-molecules-tooltip--in-toolbar",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-tooltip--in-toolbar",
          "frame": "/iframe.html?id=components-molecules-tooltip--in-toolbar&viewMode=story"
        }
      ],
      "storyFile": "tooling/storybook/stories/components/molecules/tooltip.stories.tsx"
    },
    {
      "id": "top-bar",
      "name": "TopBar",
      "level": "molecule",
      "status": "stable",
      "purpose": "Brand, search and actions across the top of a page without a rail.",
      "description": "Page-level command bar that hosts the brand mark on the left, a search/command pill in the centre, and an actions cluster on the right. Compose with `<PageShell>` for the editorial frame, or render alone above any full-page surface.",
      "role": "navigation",
      "import": "@rrios-forge/ui/molecules/top-bar",
      "exports": [
        "TopBar",
        "TopBarSearchTrigger",
        "topBarActionsColumnVariants",
        "topBarActionsVariants",
        "topBarBrandVariants",
        "topBarSearchSlotVariants",
        "topBarSearchTriggerLabelVariants",
        "topBarSearchTriggerVariants",
        "topBarVariants"
      ],
      "source": "packages/ui/src/molecules/top-bar",
      "axes": [
        {
          "axis": "size",
          "part": null,
          "values": [
            "sm",
            "md"
          ],
          "default": "md",
          "meaning": "Ergonomic scale, in three families (control, text, container)."
        }
      ],
      "needs": [
        {
          "need": "App frame / navigation",
          "answer": "**The rail that peeks (ADR-044) — the default and the recommendation.** `PageShell` (defaults: `sidebarMode=\"rail\"`, `sidebarPresentation=\"inset\"`, `mobileNav=\"tabs\"`) + `SidebarSection aria-label` + ONE untitled `NavGroup`: home, search, the rooms, settings — same size, same gap. Wrap every `NavItem` in `PageShell.RailPeek` and compose its panel with `PageShell.PeekHeader` / `PeekFacts` / `PeekLinks`. Search is a button row opening `CommandMenu` (⌘K); settings' peek holds the quick controls; phones get `PageShell.MobileTabBar` (≤ 5). No `TopBar` in an app frame. Opt-ins only when a product needs them: the labelled panel (`sidebarMode=\"auto\"`, ⌘\\\\ collapse, ADR-040), `island`/`column` (ADR-025), the bubble (`mobileNav=\"bubble\"`)"
        }
      ],
      "patterns": [],
      "a11yExceptions": [],
      "decisions": [
        {
          "id": "ADR-009",
          "title": "Editorial Frame: PageShell v3 + new `TopBar` molecule"
        },
        {
          "id": "ADR-010",
          "title": "PageShell v4: bottom dock + mobile floating bubble"
        },
        {
          "id": "ADR-011",
          "title": "PageShell v5: adaptive lateral sidebar + mobile nav bubble"
        },
        {
          "id": "ADR-013",
          "title": "PageShell: mobile-nav polymorphism"
        },
        {
          "id": "ADR-014",
          "title": "PageShell: Apple Mail / macOS Big Sur visual register"
        },
        {
          "id": "ADR-016",
          "title": "NotificationCenter v2: Popover → Drawer + Provider/Hooks"
        },
        {
          "id": "ADR-022",
          "title": "The material family: `solid` and `vibrant`"
        },
        {
          "id": "ADR-030",
          "title": "Axis vocabulary: one name, one meaning"
        },
        {
          "id": "ADR-044",
          "title": "Navigation is a rail that peeks"
        }
      ],
      "stories": [
        {
          "name": "Playground",
          "id": "components-molecules-topbar--playground",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-topbar--playground",
          "frame": "/iframe.html?id=components-molecules-topbar--playground&viewMode=story"
        },
        {
          "name": "Brand only",
          "id": "components-molecules-topbar--brand-only",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-topbar--brand-only",
          "frame": "/iframe.html?id=components-molecules-topbar--brand-only&viewMode=story"
        },
        {
          "name": "Search only",
          "id": "components-molecules-topbar--search-only",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-topbar--search-only",
          "frame": "/iframe.html?id=components-molecules-topbar--search-only&viewMode=story"
        },
        {
          "name": "Actions only",
          "id": "components-molecules-topbar--actions-only",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-topbar--actions-only",
          "frame": "/iframe.html?id=components-molecules-topbar--actions-only&viewMode=story"
        },
        {
          "name": "Compact (mobile)",
          "id": "components-molecules-topbar--compact",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-topbar--compact",
          "frame": "/iframe.html?id=components-molecules-topbar--compact&viewMode=story"
        }
      ],
      "storyFile": "tooling/storybook/stories/components/molecules/top-bar.stories.tsx"
    },
    {
      "id": "user-menu-content",
      "name": "UserMenuContent",
      "level": "molecule",
      "status": "stable",
      "purpose": "The account menu: who is signed in, their settings, and sign out.",
      "description": "Drop-in content for a DropdownMenu / Popover. Identity header (avatar + name + email + plan) + body slot for menu items + optional footer. The molecule never renders a DropdownMenu itself — the consumer owns the trigger. The Playground / WithPlan / WithDangerAction stories render the molecule outside a DropdownMenu and use a plain Row for items so the snapshot is portal-free; the InDropdownMenu story is the canonical wiring.",
      "role": "navigation",
      "import": "@rrios-forge/ui/molecules/user-menu-content",
      "exports": [
        "UserMenuContent",
        "userMenuContentVariants"
      ],
      "source": "packages/ui/src/molecules/user-menu-content",
      "axes": [],
      "needs": [],
      "patterns": [],
      "a11yExceptions": [],
      "decisions": [],
      "stories": [
        {
          "name": "Ada Lovelace",
          "id": "components-molecules-usermenucontent--playground",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-usermenucontent--playground",
          "frame": "/iframe.html?id=components-molecules-usermenucontent--playground&viewMode=story"
        },
        {
          "name": "With plan",
          "id": "components-molecules-usermenucontent--with-plan",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-usermenucontent--with-plan",
          "frame": "/iframe.html?id=components-molecules-usermenucontent--with-plan&viewMode=story"
        },
        {
          "name": "In dropdown menu",
          "id": "components-molecules-usermenucontent--in-dropdown-menu",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-usermenucontent--in-dropdown-menu",
          "frame": "/iframe.html?id=components-molecules-usermenucontent--in-dropdown-menu&viewMode=story"
        },
        {
          "name": "With danger action",
          "id": "components-molecules-usermenucontent--with-danger-action",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-molecules-usermenucontent--with-danger-action",
          "frame": "/iframe.html?id=components-molecules-usermenucontent--with-danger-action&viewMode=story"
        }
      ],
      "storyFile": "tooling/storybook/stories/components/molecules/user-menu-content.stories.tsx"
    },
    {
      "id": "atmosphere",
      "name": "Atmosphere",
      "level": "organism",
      "status": "stable",
      "purpose": "The sky behind the glass — a themed ground with slow-drifting light.",
      "description": "The optional DEFAULT atmosphere of the design system: a themed sky (high-key day in light, night in dark) with two brand lights drifting on minute-long, transform-only loops. It is the ONE sanctioned continuous animation in Poesía — weather, not component state — governed by the ADR-023 grammar: `energy` is the community's resting tempo (calm | lively), `signal` is the ONE stateful channel (none | raised | urgent — opacity-only breathing, ≥6 s cycles, tempo = urgency and nothing else), and skins recolour the lights via --poesia-atmosphere-light-primary/-secondary. It freezes under prefers-reduced-motion or motion=\"still\" (the WCAG 2.2.2 pause lever — apps owe their users a persistent setting wired to it), with signal changes landing as a slow opacity crossfade. The day sky carries a sharp dot lattice and the night sky its point highlights: crisp structure whose visible melting is what makes the vibrant material read as glass.",
      "role": "surface",
      "import": "@rrios-forge/ui/organisms/atmosphere",
      "exports": [
        "Atmosphere",
        "ATMOSPHERE_ENERGIES",
        "ATMOSPHERE_MOTIONS",
        "ATMOSPHERE_SIGNALS",
        "atmosphereVariants"
      ],
      "source": "packages/ui/src/organisms/atmosphere",
      "axes": [
        {
          "axis": "motion",
          "part": null,
          "values": [
            "drift",
            "still"
          ],
          "default": "drift",
          "meaning": "Ambient motion of the atmosphere (ADR-023)."
        },
        {
          "axis": "energy",
          "part": null,
          "values": [
            "calm",
            "lively"
          ],
          "default": "calm",
          "meaning": "Resting tempo of the atmosphere (ADR-023)."
        },
        {
          "axis": "signal",
          "part": null,
          "values": [
            "none",
            "raised",
            "urgent"
          ],
          "default": "none",
          "meaning": "Ambient escalation (ADR-023)."
        }
      ],
      "needs": [
        {
          "need": "Ground behind glass",
          "answer": "`Atmosphere`"
        }
      ],
      "patterns": [],
      "a11yExceptions": [],
      "decisions": [
        {
          "id": "ADR-022",
          "title": "The material family: `solid` and `vibrant`"
        },
        {
          "id": "ADR-023",
          "title": "Atmosphere grammar: colour, motion, and meaning"
        },
        {
          "id": "ADR-027",
          "title": "Vibrant is the system's material, not one of its members"
        }
      ],
      "stories": [
        {
          "name": "Drift",
          "id": "components-organisms-atmosphere--drift",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-organisms-atmosphere--drift",
          "frame": "/iframe.html?id=components-organisms-atmosphere--drift&viewMode=story"
        },
        {
          "name": "Still",
          "id": "components-organisms-atmosphere--still",
          "interaction": false,
          "snapshots": [
            "dark",
            "high-contrast",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-organisms-atmosphere--still",
          "frame": "/iframe.html?id=components-organisms-atmosphere--still&viewMode=story"
        },
        {
          "name": "With Glass",
          "id": "components-organisms-atmosphere--with-glass",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-organisms-atmosphere--with-glass",
          "frame": "/iframe.html?id=components-organisms-atmosphere--with-glass&viewMode=story"
        }
      ],
      "storyFile": "tooling/storybook/stories/components/organisms/atmosphere.stories.tsx"
    },
    {
      "id": "auth-card",
      "name": "AuthCard",
      "level": "organism",
      "status": "stable",
      "purpose": "Sign in and sign up: credentials, a one-time code, a forgotten password, and what follows each.",
      "description": "The card a person signs in or signs up with, walking them from their email and password or a magic link through a one-time code, a forgotten password and the final confirmation.",
      "role": "surface",
      "import": "@rrios-forge/ui/organisms/auth-card",
      "exports": [
        "AuthCard",
        "AUTH_CARD_DENSITIES",
        "AUTH_CARD_SIZES",
        "AUTH_CARD_STEPS",
        "authCardVariants"
      ],
      "source": "packages/ui/src/organisms/auth-card",
      "axes": [
        {
          "axis": "size",
          "part": null,
          "values": [
            "sm",
            "md",
            "lg"
          ],
          "default": "md",
          "meaning": "Ergonomic scale, in three families (control, text, container)."
        }
      ],
      "needs": [
        {
          "need": "Auth flow",
          "answer": "`AuthCard`"
        }
      ],
      "patterns": [],
      "a11yExceptions": [],
      "decisions": [
        {
          "id": "ADR-032",
          "title": "Themes compose by layers; brands are a checked layer"
        }
      ],
      "stories": [
        {
          "name": "Magic link (default)",
          "id": "components-organisms-authcard--magic-link",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-organisms-authcard--magic-link",
          "frame": "/iframe.html?id=components-organisms-authcard--magic-link&viewMode=story"
        },
        {
          "name": "Magic link only (no password toggle)",
          "id": "components-organisms-authcard--magic-link-only",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-organisms-authcard--magic-link-only",
          "frame": "/iframe.html?id=components-organisms-authcard--magic-link-only&viewMode=story"
        },
        {
          "name": "OTP step",
          "id": "components-organisms-authcard--one-time-code",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-organisms-authcard--one-time-code",
          "frame": "/iframe.html?id=components-organisms-authcard--one-time-code&viewMode=story"
        },
        {
          "name": "Forgot password",
          "id": "components-organisms-authcard--forgot",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-organisms-authcard--forgot",
          "frame": "/iframe.html?id=components-organisms-authcard--forgot&viewMode=story"
        },
        {
          "name": "With global error",
          "id": "components-organisms-authcard--error-state",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-organisms-authcard--error-state",
          "frame": "/iframe.html?id=components-organisms-authcard--error-state&viewMode=story"
        },
        {
          "name": "Success",
          "id": "components-organisms-authcard--success",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-organisms-authcard--success",
          "frame": "/iframe.html?id=components-organisms-authcard--success&viewMode=story"
        },
        {
          "name": "Sizes",
          "id": "components-organisms-authcard--sizes",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-organisms-authcard--sizes",
          "frame": "/iframe.html?id=components-organisms-authcard--sizes&viewMode=story"
        }
      ],
      "storyFile": "tooling/storybook/stories/components/organisms/auth-card.stories.tsx"
    },
    {
      "id": "composer",
      "name": "Composer",
      "level": "organism",
      "status": "experimental",
      "purpose": "Writes a message or post — text, attachments, mentions and send.",
      "description": "A content-creation surface that gathers body + media + tags and hands them to onSubmit. The freeform tag field uses the Input atom and the media trigger is a Button over a hidden file input (atoms-only, §8). suggestions → future Combobox upgrade; media → future FileDropzone upgrade. Patterns consulted: Patterns/Forms · FieldAnatomy, Patterns/Visual Priority · ActionHierarchy.",
      "role": "input",
      "import": "@rrios-forge/ui/organisms/composer",
      "exports": [
        "Composer",
        "composerVariants",
        "COMPOSER_DENSITIES"
      ],
      "source": "packages/ui/src/organisms/composer",
      "axes": [
        {
          "axis": "density",
          "part": null,
          "values": [
            "comfortable",
            "compact"
          ],
          "default": null,
          "meaning": null
        }
      ],
      "needs": [
        {
          "need": "Media viewer / composer / profile",
          "answer": "`MediaLightbox` / `Composer` / `ProfileHeader`"
        }
      ],
      "patterns": [],
      "a11yExceptions": [],
      "decisions": [
        {
          "id": "ADR-019",
          "title": "Composer organism (message/post authoring surface)"
        }
      ],
      "stories": [
        {
          "name": "Playground",
          "id": "components-organisms-composer--playground",
          "interaction": false,
          "snapshots": [
            "dark",
            "high-contrast",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-organisms-composer--playground",
          "frame": "/iframe.html?id=components-organisms-composer--playground&viewMode=story"
        },
        {
          "name": "Text only",
          "id": "components-organisms-composer--text-only",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-organisms-composer--text-only",
          "frame": "/iframe.html?id=components-organisms-composer--text-only&viewMode=story"
        },
        {
          "name": "Compact",
          "id": "components-organisms-composer--compact",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-organisms-composer--compact",
          "frame": "/iframe.html?id=components-organisms-composer--compact&viewMode=story"
        }
      ],
      "storyFile": "tooling/storybook/stories/components/organisms/composer.stories.tsx"
    },
    {
      "id": "chart",
      "name": "Chart",
      "level": "organism",
      "status": "stable",
      "purpose": "Line, area and column charts with a legend, a table view and keyboard readout.",
      "description": "Line, area and column charts drawn as SVG on Poesía's tokens — no charting library. The form follows the data's job (`dataviz.yaml`); series take the categorical slots in order; a legend appears from two series; every chart has a table view, a keyboard path through its points (arrow keys, Home, End, Escape) with the same readout as the pointer, and designed loading, empty and error states. `title` is the accessible name; the visible heading is yours.",
      "role": "content",
      "import": "@rrios-forge/ui/organisms/chart",
      "exports": [
        "Chart",
        "chartVariants",
        "CHART_FORMS",
        "CHART_HEIGHTS",
        "CHART_SIZES"
      ],
      "source": "packages/ui/src/organisms/chart",
      "axes": [
        {
          "axis": "form",
          "part": null,
          "values": [
            "line",
            "area",
            "column"
          ],
          "default": "line",
          "meaning": "Which chart form encodes the data — chosen by the data's job, never by the look (ADR-036)."
        },
        {
          "axis": "size",
          "part": null,
          "values": [
            "sm",
            "md",
            "lg"
          ],
          "default": "md",
          "meaning": "Ergonomic scale, in three families (control, text, container)."
        }
      ],
      "needs": [
        {
          "need": "A chart (trend, comparison, part to whole)",
          "answer": "`Chart` with the `form` the data's job names (`dataviz.yaml`); a single number is a `MetricCard`, many classes a `DataTable`"
        }
      ],
      "patterns": [],
      "a11yExceptions": [],
      "decisions": [
        {
          "id": "ADR-036",
          "title": "Data visualization: colour roles, a grammar, and three components on plain SVG"
        }
      ],
      "stories": [
        {
          "name": "Line",
          "id": "components-organisms-chart--line",
          "interaction": false,
          "snapshots": [
            "dark",
            "high-contrast",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-organisms-chart--line",
          "frame": "/iframe.html?id=components-organisms-chart--line&viewMode=story"
        },
        {
          "name": "Area",
          "id": "components-organisms-chart--area",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-organisms-chart--area",
          "frame": "/iframe.html?id=components-organisms-chart--area&viewMode=story"
        },
        {
          "name": "Column",
          "id": "components-organisms-chart--column",
          "interaction": false,
          "snapshots": [
            "dark",
            "high-contrast",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-organisms-chart--column",
          "frame": "/iframe.html?id=components-organisms-chart--column&viewMode=story"
        },
        {
          "name": "Emphasis",
          "id": "components-organisms-chart--emphasis",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-organisms-chart--emphasis",
          "frame": "/iframe.html?id=components-organisms-chart--emphasis&viewMode=story"
        },
        {
          "name": "Below zero",
          "id": "components-organisms-chart--below-zero",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-organisms-chart--below-zero",
          "frame": "/iframe.html?id=components-organisms-chart--below-zero&viewMode=story"
        },
        {
          "name": "In a Card",
          "id": "components-organisms-chart--in-a-card",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-organisms-chart--in-a-card",
          "frame": "/iframe.html?id=components-organisms-chart--in-a-card&viewMode=story"
        },
        {
          "name": "Loading",
          "id": "components-organisms-chart--loading",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-organisms-chart--loading",
          "frame": "/iframe.html?id=components-organisms-chart--loading&viewMode=story"
        },
        {
          "name": "Empty",
          "id": "components-organisms-chart--empty",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-organisms-chart--empty",
          "frame": "/iframe.html?id=components-organisms-chart--empty&viewMode=story"
        },
        {
          "name": "Error",
          "id": "components-organisms-chart--error-state",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-organisms-chart--error-state",
          "frame": "/iframe.html?id=components-organisms-chart--error-state&viewMode=story"
        },
        {
          "name": "Table view (interaction test)",
          "id": "components-organisms-chart--table-view",
          "interaction": true,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-organisms-chart--table-view",
          "frame": "/iframe.html?id=components-organisms-chart--table-view&viewMode=story"
        },
        {
          "name": "Keyboard readout (interaction test)",
          "id": "components-organisms-chart--keyboard-readout",
          "interaction": true,
          "snapshots": [],
          "skipsSnapshot": true,
          "docs": "/?path=/story/components-organisms-chart--keyboard-readout",
          "frame": "/iframe.html?id=components-organisms-chart--keyboard-readout&viewMode=story"
        }
      ],
      "storyFile": "tooling/storybook/stories/components/organisms/chart.stories.tsx"
    },
    {
      "id": "command-menu",
      "name": "CommandMenu",
      "level": "organism",
      "status": "stable",
      "purpose": "Finds and runs anything from the keyboard (⌘K).",
      "description": "⌘K command palette. Composes Dialog (modal overlay + focus trap) + cmdk Command (filtered listbox + keyboard navigation + active descendant). Item rendering is consumer-owned via children — typically a tree of CommandMenu.Group + CommandMenu.Item + CommandMenu.Separator. cmdk handles filtering automatically based on the search input; the organism never owns search state.",
      "role": "navigation",
      "import": "@rrios-forge/ui/organisms/command-menu",
      "exports": [
        "CommandMenu",
        "CommandMenuGroup",
        "CommandMenuItem",
        "CommandMenuSeparator",
        "COMMAND_MENU_CONTENT_CLASSNAME",
        "COMMAND_MENU_ITEM_INTENTS",
        "COMMAND_MENU_ITEM_TONES",
        "COMMAND_MENU_PRESENTATIONS",
        "commandMenuFooterVariants",
        "commandMenuGroupVariants",
        "commandMenuInputFieldVariants",
        "commandMenuInlineVariants",
        "commandMenuInputVariants",
        "commandMenuItemVariants",
        "commandMenuListVariants",
        "commandMenuListViewportVariants",
        "commandMenuRootVariants",
        "commandMenuSeparatorVariants"
      ],
      "source": "packages/ui/src/organisms/command-menu",
      "axes": [
        {
          "axis": "tone",
          "part": null,
          "values": [
            "neutral",
            "muted"
          ],
          "default": "neutral",
          "meaning": "Which semantic colour family the element speaks in."
        },
        {
          "axis": "intent",
          "part": null,
          "values": [
            "neutral",
            "danger"
          ],
          "default": "neutral",
          "meaning": "What an action does."
        }
      ],
      "needs": [
        {
          "need": "App frame / navigation",
          "answer": "**The rail that peeks (ADR-044) — the default and the recommendation.** `PageShell` (defaults: `sidebarMode=\"rail\"`, `sidebarPresentation=\"inset\"`, `mobileNav=\"tabs\"`) + `SidebarSection aria-label` + ONE untitled `NavGroup`: home, search, the rooms, settings — same size, same gap. Wrap every `NavItem` in `PageShell.RailPeek` and compose its panel with `PageShell.PeekHeader` / `PeekFacts` / `PeekLinks`. Search is a button row opening `CommandMenu` (⌘K); settings' peek holds the quick controls; phones get `PageShell.MobileTabBar` (≤ 5). No `TopBar` in an app frame. Opt-ins only when a product needs them: the labelled panel (`sidebarMode=\"auto\"`, ⌘\\\\ collapse, ADR-040), `island`/`column` (ADR-025), the bubble (`mobileNav=\"bubble\"`)"
        },
        {
          "need": "Command palette",
          "answer": "`CommandMenu`"
        }
      ],
      "patterns": [],
      "a11yExceptions": [],
      "decisions": [
        {
          "id": "ADR-003",
          "title": "Storybook editorial convention and pattern↔component bidirectionality"
        },
        {
          "id": "ADR-009",
          "title": "Editorial Frame: PageShell v3 + new `TopBar` molecule"
        },
        {
          "id": "ADR-010",
          "title": "PageShell v4: bottom dock + mobile floating bubble"
        },
        {
          "id": "ADR-030",
          "title": "Axis vocabulary: one name, one meaning"
        },
        {
          "id": "ADR-034",
          "title": "Accessible names come from a labels provider"
        },
        {
          "id": "ADR-035",
          "title": "Motion grammar: the gate before motion, slop by repetition, and what reduced motion keeps"
        },
        {
          "id": "ADR-044",
          "title": "Navigation is a rail that peeks"
        }
      ],
      "stories": [
        {
          "name": "Playground",
          "id": "components-organisms-commandmenu--playground",
          "interaction": false,
          "snapshots": [],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-organisms-commandmenu--playground",
          "frame": "/iframe.html?id=components-organisms-commandmenu--playground&viewMode=story"
        },
        {
          "name": "Open (inline)",
          "id": "components-organisms-commandmenu--open",
          "interaction": false,
          "snapshots": [
            "dark",
            "high-contrast",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-organisms-commandmenu--open",
          "frame": "/iframe.html?id=components-organisms-commandmenu--open&viewMode=story"
        },
        {
          "name": "With trigger",
          "id": "components-organisms-commandmenu--with-trigger",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-organisms-commandmenu--with-trigger",
          "frame": "/iframe.html?id=components-organisms-commandmenu--with-trigger&viewMode=story"
        },
        {
          "name": "Empty (no matches)",
          "id": "components-organisms-commandmenu--empty",
          "interaction": false,
          "snapshots": [],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-organisms-commandmenu--empty",
          "frame": "/iframe.html?id=components-organisms-commandmenu--empty&viewMode=story"
        },
        {
          "name": "Custom empty",
          "id": "components-organisms-commandmenu--custom-empty",
          "interaction": false,
          "snapshots": [],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-organisms-commandmenu--custom-empty",
          "frame": "/iframe.html?id=components-organisms-commandmenu--custom-empty&viewMode=story"
        },
        {
          "name": "No footer",
          "id": "components-organisms-commandmenu--no-footer",
          "interaction": false,
          "snapshots": [],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-organisms-commandmenu--no-footer",
          "frame": "/iframe.html?id=components-organisms-commandmenu--no-footer&viewMode=story"
        },
        {
          "name": "Single group",
          "id": "components-organisms-commandmenu--single-group",
          "interaction": false,
          "snapshots": [],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-organisms-commandmenu--single-group",
          "frame": "/iframe.html?id=components-organisms-commandmenu--single-group&viewMode=story"
        },
        {
          "name": "In PageShell (⌘K trigger)",
          "id": "components-organisms-commandmenu--in-page-shell",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-organisms-commandmenu--in-page-shell",
          "frame": "/iframe.html?id=components-organisms-commandmenu--in-page-shell&viewMode=story"
        },
        {
          "name": "Accessibility",
          "id": "components-organisms-commandmenu--accessibility",
          "interaction": false,
          "snapshots": [],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-organisms-commandmenu--accessibility",
          "frame": "/iframe.html?id=components-organisms-commandmenu--accessibility&viewMode=story"
        }
      ],
      "storyFile": "tooling/storybook/stories/components/organisms/command-menu.stories.tsx"
    },
    {
      "id": "comments-thread",
      "name": "CommentsThread",
      "level": "organism",
      "status": "experimental",
      "purpose": "A discussion: comments, replies to them and a box to add yours.",
      "description": "Threaded discussion with role=tree, aria-level per node and a depth-indexed indentation rail. Pure presentation: consumers own the comments tree and click handlers; the organism owns the a11y contract. Use mode=flat to suppress visual indentation while preserving semantic hierarchy.",
      "role": "content",
      "import": "@rrios-forge/ui/organisms/comments-thread",
      "exports": [
        "CommentsThread",
        "COMMENTS_THREAD_DENSITIES",
        "COMMENTS_THREAD_MODES",
        "COMMENTS_THREAD_SORTS",
        "commentsThreadVariants"
      ],
      "source": "packages/ui/src/organisms/comments-thread",
      "axes": [
        {
          "axis": "mode",
          "part": null,
          "values": [
            "tree",
            "flat"
          ],
          "default": null,
          "meaning": null
        },
        {
          "axis": "density",
          "part": null,
          "values": [
            "comfortable",
            "compact"
          ],
          "default": null,
          "meaning": null
        },
        {
          "axis": "sort",
          "part": null,
          "values": [
            "recent",
            "top",
            "controversial"
          ],
          "default": null,
          "meaning": null
        }
      ],
      "needs": [
        {
          "need": "Threaded comments",
          "answer": "`CommentsThread`"
        }
      ],
      "patterns": [],
      "a11yExceptions": [],
      "decisions": [],
      "stories": [
        {
          "name": "Tree",
          "id": "components-organisms-commentsthread--tree",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-organisms-commentsthread--tree",
          "frame": "/iframe.html?id=components-organisms-commentsthread--tree&viewMode=story"
        },
        {
          "name": "Flat",
          "id": "components-organisms-commentsthread--flat",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-organisms-commentsthread--flat",
          "frame": "/iframe.html?id=components-organisms-commentsthread--flat&viewMode=story"
        },
        {
          "name": "Max depth (continue thread)",
          "id": "components-organisms-commentsthread--max-depth",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-organisms-commentsthread--max-depth",
          "frame": "/iframe.html?id=components-organisms-commentsthread--max-depth&viewMode=story"
        },
        {
          "name": "Empty",
          "id": "components-organisms-commentsthread--empty",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-organisms-commentsthread--empty",
          "frame": "/iframe.html?id=components-organisms-commentsthread--empty&viewMode=story"
        },
        {
          "name": "Compact",
          "id": "components-organisms-commentsthread--compact",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-organisms-commentsthread--compact",
          "frame": "/iframe.html?id=components-organisms-commentsthread--compact&viewMode=story"
        }
      ],
      "storyFile": "tooling/storybook/stories/components/organisms/comments-thread.stories.tsx"
    },
    {
      "id": "data-table",
      "name": "DataTable",
      "level": "organism",
      "status": "stable",
      "purpose": "Shows records in rows and columns that people can sort, select and page through.",
      "description": "**Purpose.** The tabular surface organism. `DataTable` composes the molecule layer (`TableHeader`, `TableRow`, `TablePagination`, `EmptyState`, `LoadingState`) into a single coordinated component that owns row rendering, selection ergonomics, sort affordance and density propagation — but never the data itself.\n\n**When to use.**\n- A list of structured records that benefits from columns, sorting, and per-row actions.\n- A surface where the user needs to *select* one or many rows for a follow-up operation (`selection=\"multiple\"`).\n- A list whose layout must stay stable across loading, empty and error states (the chrome remains; the row area swaps).\n\n**When NOT to use.**\n- A scrolling feed of heterogeneous items → use `Card` or `ListItem` compositions inside a list shell.\n- A dashboard of metrics → use `MetricCard` / `Card` instead.\n- A small fixed list (≤ 5 rows) where columns add ceremony without value → use a `dl` / property list.\n- A tree, kanban or timeline view — these need their own organism, not a `DataTable` with hidden columns.\n\n**Composes with.**\n- `DataTableToolbar` (consumer-passed `toolbar` slot) — search, filter, bulk actions.\n- `DataTablePagination` (consumer-passed `pagination` slot) or `TablePagination` molecule directly.\n- `DataTableEmpty`, `DataTableLoading` — exposed for swap-in customisation.\n- `Badge`, `Avatar`, `IconButton`, `DropdownMenu` inside cells via column `render`.\n- `PageShell mainPadding=\"flush\"` to host the table edge-to-edge inside a Card.\n\n**Accessibility.**\n- Renders `<section role=\"region\" aria-label>` so the table is an announced region.\n- Header cells expose `aria-sort` when `sortable`; the sort glyph is decorative.\n- Selection checkboxes carry explicit `aria-label`. The header tri-state checkbox announces `mixed` via `aria-checked`.\n- Loading renders skeleton rows inside `role=\"status\"` + `aria-live=\"polite\"` (shape-preserving, per Patterns/System States); empty exposes `role=\"status\"`. Neither state ever overlays stale rows.\n\n**Related patterns.**\n- `Patterns/System States · StateChoice` — Empty / Loading / Error are first-class states the organism honours.\n- `Patterns/Density & Growth · DensityLevels` — when to pick `compact` vs `comfortable`.\n- `Patterns/Navigation · PaginationForDatasets` — pagination over infinite scroll.\n- `Patterns/Decision Matrix · ComponentChoice` — DataTable vs ListItem vs Card.",
      "role": "content",
      "import": "@rrios-forge/ui/organisms/data-table",
      "exports": [
        "DataTable",
        "DataTableEmpty",
        "DataTableHeader",
        "DataTableLoading",
        "DataTablePagination",
        "DataTableRow",
        "DataTableToolbar",
        "getVisibleColumns",
        "DATA_TABLE_DENSITIES",
        "DATA_TABLE_DENSITY_GAP",
        "DATA_TABLE_SELECTIONS",
        "dataTableVariants"
      ],
      "source": "packages/ui/src/organisms/data-table",
      "axes": [
        {
          "axis": "density",
          "part": null,
          "values": [
            "compact",
            "comfortable"
          ],
          "default": null,
          "meaning": null
        },
        {
          "axis": "selection",
          "part": null,
          "values": [
            "none",
            "multiple"
          ],
          "default": null,
          "meaning": null
        }
      ],
      "needs": [
        {
          "need": "Table",
          "answer": "`DataTable`, or `TableHeader` + `TableRow` + `TablePagination`"
        },
        {
          "need": "A chart (trend, comparison, part to whole)",
          "answer": "`Chart` with the `form` the data's job names (`dataviz.yaml`); a single number is a `MetricCard`, many classes a `DataTable`"
        }
      ],
      "patterns": [
        "Patterns/Density & Growth · DensityLevels",
        "Patterns/Density & Growth · ContentGrowth",
        "Patterns/Navigation · PaginationForDatasets",
        "Patterns/Feedback · LoadingFeedback",
        "Patterns/Information Architecture · MetadataAndActions",
        "Patterns/Visual Priority · QuietSecondaryActions",
        "Patterns/Decision Matrix · ComponentChoice",
        "Patterns/System States · StateChoice"
      ],
      "a11yExceptions": [],
      "decisions": [
        {
          "id": "ADR-003",
          "title": "Storybook editorial convention and pattern↔component bidirectionality"
        },
        {
          "id": "ADR-004",
          "title": "Migrate boolean configuration props to semantic axes"
        },
        {
          "id": "ADR-005",
          "title": "Visual operational rules: surfaces, interaction, motion"
        },
        {
          "id": "ADR-006",
          "title": "Geometry and typography signature"
        },
        {
          "id": "ADR-013",
          "title": "PageShell: mobile-nav polymorphism"
        },
        {
          "id": "ADR-034",
          "title": "Accessible names come from a labels provider"
        },
        {
          "id": "ADR-035",
          "title": "Motion grammar: the gate before motion, slop by repetition, and what reduced motion keeps"
        }
      ],
      "stories": [
        {
          "name": "Playground",
          "id": "components-organisms-datatable--playground",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-organisms-datatable--playground",
          "frame": "/iframe.html?id=components-organisms-datatable--playground&viewMode=story"
        },
        {
          "name": "Loading",
          "id": "components-organisms-datatable--loading",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-organisms-datatable--loading",
          "frame": "/iframe.html?id=components-organisms-datatable--loading&viewMode=story"
        },
        {
          "name": "Empty",
          "id": "components-organisms-datatable--empty",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-organisms-datatable--empty",
          "frame": "/iframe.html?id=components-organisms-datatable--empty&viewMode=story"
        },
        {
          "name": "With filters",
          "id": "components-organisms-datatable--with-filters",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-organisms-datatable--with-filters",
          "frame": "/iframe.html?id=components-organisms-datatable--with-filters&viewMode=story"
        },
        {
          "name": "With pagination",
          "id": "components-organisms-datatable--with-pagination",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-organisms-datatable--with-pagination",
          "frame": "/iframe.html?id=components-organisms-datatable--with-pagination&viewMode=story"
        },
        {
          "name": "Selectable rows",
          "id": "components-organisms-datatable--selectable-rows",
          "interaction": false,
          "snapshots": [
            "dark",
            "high-contrast",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-organisms-datatable--selectable-rows",
          "frame": "/iframe.html?id=components-organisms-datatable--selectable-rows&viewMode=story"
        },
        {
          "name": "Dense",
          "id": "components-organisms-datatable--dense",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-organisms-datatable--dense",
          "frame": "/iframe.html?id=components-organisms-datatable--dense&viewMode=story"
        },
        {
          "name": "Row actions",
          "id": "components-organisms-datatable--row-actions",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-organisms-datatable--row-actions",
          "frame": "/iframe.html?id=components-organisms-datatable--row-actions&viewMode=story"
        },
        {
          "name": "Status column",
          "id": "components-organisms-datatable--status-column",
          "interaction": false,
          "snapshots": [
            "dark",
            "high-contrast",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-organisms-datatable--status-column",
          "frame": "/iframe.html?id=components-organisms-datatable--status-column&viewMode=story"
        },
        {
          "name": "Full example",
          "id": "components-organisms-datatable--full-example",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-organisms-datatable--full-example",
          "frame": "/iframe.html?id=components-organisms-datatable--full-example&viewMode=story"
        }
      ],
      "storyFile": "tooling/storybook/stories/components/organisms/data-table.stories.tsx"
    },
    {
      "id": "feed",
      "name": "Feed",
      "level": "organism",
      "status": "stable",
      "purpose": "A stream of posts that loads more as people scroll.",
      "description": "Infinite-scroll content feed. Pure presentation: pass `items`, `hasMore`, `loading`, `onLoadMore` and `renderItem` — the Feed handles the sentinel, the loading shelf and the empty / end-of-feed states. Three layouts (single, grid, masonry); `role=\"feed\"` ARIA pattern with `aria-busy` while loading. Pair with SWR / React Query / vanilla `useEffect` for the data layer.",
      "role": "content",
      "import": "@rrios-forge/ui/organisms/feed",
      "exports": [
        "Feed",
        "FEED_COLUMNS",
        "FEED_DENSITIES",
        "FEED_LAYOUTS",
        "feedVariants",
        "useInfiniteScroll"
      ],
      "source": "packages/ui/src/organisms/feed",
      "axes": [
        {
          "axis": "layout",
          "part": null,
          "values": [
            "single",
            "grid",
            "masonry"
          ],
          "default": "single",
          "meaning": "Arrangement of a composite."
        },
        {
          "axis": "columns",
          "part": null,
          "values": [
            "2",
            "3",
            "4"
          ],
          "default": "3",
          "meaning": "How many columns a grid layout takes from its widest breakpoint (ADR-039)."
        }
      ],
      "needs": [
        {
          "need": "Feed card / infinite feed",
          "answer": "`FeedCard` / `Feed`"
        }
      ],
      "patterns": [],
      "a11yExceptions": [],
      "decisions": [
        {
          "id": "ADR-020",
          "title": "Feed `anchor=\"bottom\"` (conversation mode) instead of a ChatThread organism"
        }
      ],
      "stories": [
        {
          "name": "Single Column",
          "id": "components-organisms-feed--single-column",
          "interaction": false,
          "snapshots": [],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-organisms-feed--single-column",
          "frame": "/iframe.html?id=components-organisms-feed--single-column&viewMode=story"
        },
        {
          "name": "Grid",
          "id": "components-organisms-feed--grid",
          "interaction": false,
          "snapshots": [],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-organisms-feed--grid",
          "frame": "/iframe.html?id=components-organisms-feed--grid&viewMode=story"
        },
        {
          "name": "Masonry",
          "id": "components-organisms-feed--masonry",
          "interaction": false,
          "snapshots": [],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-organisms-feed--masonry",
          "frame": "/iframe.html?id=components-organisms-feed--masonry&viewMode=story"
        },
        {
          "name": "Empty",
          "id": "components-organisms-feed--empty",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-organisms-feed--empty",
          "frame": "/iframe.html?id=components-organisms-feed--empty&viewMode=story"
        },
        {
          "name": "Initial loading (skeleton)",
          "id": "components-organisms-feed--initial-loading",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-organisms-feed--initial-loading",
          "frame": "/iframe.html?id=components-organisms-feed--initial-loading&viewMode=story"
        },
        {
          "name": "End of feed",
          "id": "components-organisms-feed--end-of-feed",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-organisms-feed--end-of-feed",
          "frame": "/iframe.html?id=components-organisms-feed--end-of-feed&viewMode=story"
        },
        {
          "name": "Content variety (any element)",
          "id": "components-organisms-feed--content-variety",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-organisms-feed--content-variety",
          "frame": "/iframe.html?id=components-organisms-feed--content-variety&viewMode=story"
        },
        {
          "name": "Headless data layer (consumer-owned)",
          "id": "components-organisms-feed--swr-ready",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-organisms-feed--swr-ready",
          "frame": "/iframe.html?id=components-organisms-feed--swr-ready&viewMode=story"
        },
        {
          "name": "Chat mode (anchor=bottom)",
          "id": "components-organisms-feed--chat-mode",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-organisms-feed--chat-mode",
          "frame": "/iframe.html?id=components-organisms-feed--chat-mode&viewMode=story"
        }
      ],
      "storyFile": "tooling/storybook/stories/components/organisms/feed.stories.tsx"
    },
    {
      "id": "feed-card",
      "name": "FeedCard",
      "level": "organism",
      "status": "stable",
      "purpose": "One post in a feed: who wrote it, what it says and how people reacted.",
      "description": "The canonical card for feed-like surfaces — social posts, blog teasers, video cards, activity entries. The intent axis (post / article / video / activity) is semantic; the visual treatment is owned by `layout` (stacked / horizontal) and `emphasis` (default / featured).",
      "role": "content",
      "import": "@rrios-forge/ui/organisms/feed-card",
      "exports": [
        "FeedCard",
        "FEED_CARD_DENSITIES",
        "FEED_CARD_EMPHASES",
        "FEED_CARD_INTENTS",
        "FEED_CARD_LAYOUTS",
        "FEED_CARD_PROMINENCES",
        "feedCardVariants"
      ],
      "source": "packages/ui/src/organisms/feed-card",
      "axes": [
        {
          "axis": "layout",
          "part": null,
          "values": [
            "stacked",
            "horizontal",
            "lead"
          ],
          "default": "stacked",
          "meaning": "Arrangement of a composite."
        },
        {
          "axis": "prominence",
          "part": null,
          "values": [
            "default",
            "featured"
          ],
          "default": "default",
          "meaning": "How a surface stands among its siblings."
        }
      ],
      "needs": [
        {
          "need": "Feed card / infinite feed",
          "answer": "`FeedCard` / `Feed`"
        }
      ],
      "patterns": [],
      "a11yExceptions": [],
      "decisions": [
        {
          "id": "ADR-021",
          "title": "ProfileHeader organism and the `cover` slot contract"
        },
        {
          "id": "ADR-030",
          "title": "Axis vocabulary: one name, one meaning"
        }
      ],
      "stories": [
        {
          "name": "Post",
          "id": "components-organisms-feedcard--post",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-organisms-feedcard--post",
          "frame": "/iframe.html?id=components-organisms-feedcard--post&viewMode=story"
        },
        {
          "name": "Article (horizontal)",
          "id": "components-organisms-feedcard--article-horizontal",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-organisms-feedcard--article-horizontal",
          "frame": "/iframe.html?id=components-organisms-feedcard--article-horizontal&viewMode=story"
        },
        {
          "name": "Video",
          "id": "components-organisms-feedcard--video",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-organisms-feedcard--video",
          "frame": "/iframe.html?id=components-organisms-feedcard--video&viewMode=story"
        },
        {
          "name": "Featured",
          "id": "components-organisms-feedcard--featured",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-organisms-feedcard--featured",
          "frame": "/iframe.html?id=components-organisms-feedcard--featured&viewMode=story"
        },
        {
          "name": "Activity",
          "id": "components-organisms-feedcard--activity",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-organisms-feedcard--activity",
          "frame": "/iframe.html?id=components-organisms-feedcard--activity&viewMode=story"
        },
        {
          "name": "Selection / read state",
          "id": "components-organisms-feedcard--selected-and-unread",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-organisms-feedcard--selected-and-unread",
          "frame": "/iframe.html?id=components-organisms-feedcard--selected-and-unread&viewMode=story"
        }
      ],
      "storyFile": "tooling/storybook/stories/components/organisms/feed-card.stories.tsx"
    },
    {
      "id": "form",
      "name": "Form",
      "level": "organism",
      "status": "stable",
      "purpose": "Runs a whole form: checks every answer and shows what needs fixing before it sends.",
      "description": "Apple-style form orchestrator built around React Hook Form. Pass `methods` from `useForm()` (typically wired with a Zod resolver via `@hookform/resolvers/zod`) and the orchestrator handles `handleSubmit`, `FormProvider`, the auto-mounted ErrorSummary on failed submits, success transient on the Submit button, and the canonical Apple-app-shell action row. The compound parts — `Form.Field`, `Form.Input`, `Form.Textarea`, `Form.Checkbox`, `Form.Switch`, `Form.RadioGroup`, `Form.Select`, `Form.Slider`, `Form.Submit`, `Form.Reset`, `Form.ErrorSummary`, `Form.Section`, `Form.Surface` — read RHF state via `useFormContext()` so consumers never prop-drill.",
      "role": "input",
      "import": "@rrios-forge/ui/organisms/form",
      "exports": [
        "Form",
        "FormCheckbox",
        "FormErrorSummary",
        "FormField",
        "FormInput",
        "FormRadioGroup",
        "FormReset",
        "FormSelect",
        "FormSlider",
        "FormSubmit",
        "FormSurface",
        "FormSwitch",
        "FormTextarea",
        "FORM_DENSITIES",
        "FORM_INTENTS",
        "formVariants",
        "buildErrorSummary"
      ],
      "source": "packages/ui/src/organisms/form",
      "axes": [
        {
          "axis": "align",
          "part": null,
          "values": [
            "between",
            "end"
          ],
          "default": "end",
          "meaning": "Distribution along the main axis."
        },
        {
          "axis": "tone",
          "part": null,
          "values": [
            "neutral",
            "muted"
          ],
          "default": "neutral",
          "meaning": "Which semantic colour family the element speaks in."
        },
        {
          "axis": "material",
          "part": null,
          "values": [
            "vibrant",
            "solid"
          ],
          "default": "vibrant",
          "meaning": "The layer's material (ADR-022, ADR-027)."
        }
      ],
      "needs": [
        {
          "need": "Complex validated form",
          "answer": "`Form` organism (RHF + Zod)"
        }
      ],
      "patterns": [],
      "a11yExceptions": [],
      "decisions": [
        {
          "id": "ADR-019",
          "title": "Composer organism (message/post authoring surface)"
        }
      ],
      "stories": [
        {
          "name": "Playground",
          "id": "components-organisms-form--playground",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-organisms-form--playground",
          "frame": "/iframe.html?id=components-organisms-form--playground&viewMode=story"
        },
        {
          "name": "On a card",
          "id": "components-organisms-form--surface",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-organisms-form--surface",
          "frame": "/iframe.html?id=components-organisms-form--surface&viewMode=story"
        },
        {
          "name": "Toggles and choices",
          "id": "components-organisms-form--controlled-fields",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-organisms-form--controlled-fields",
          "frame": "/iframe.html?id=components-organisms-form--controlled-fields&viewMode=story"
        },
        {
          "name": "Repeating fields",
          "id": "components-organisms-form--field-array",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-organisms-form--field-array",
          "frame": "/iframe.html?id=components-organisms-form--field-array&viewMode=story"
        },
        {
          "name": "Errors on submit",
          "id": "components-organisms-form--invalid-on-submit",
          "interaction": true,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-organisms-form--invalid-on-submit",
          "frame": "/iframe.html?id=components-organisms-form--invalid-on-submit&viewMode=story"
        },
        {
          "name": "Editing",
          "id": "components-organisms-form--edit-intent",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-organisms-form--edit-intent",
          "frame": "/iframe.html?id=components-organisms-form--edit-intent&viewMode=story"
        },
        {
          "name": "Fix and submit",
          "id": "components-organisms-form--fix-and-submit",
          "interaction": true,
          "snapshots": [],
          "skipsSnapshot": true,
          "docs": "/?path=/story/components-organisms-form--fix-and-submit",
          "frame": "/iframe.html?id=components-organisms-form--fix-and-submit&viewMode=story"
        }
      ],
      "storyFile": "tooling/storybook/stories/components/organisms/form.stories.tsx"
    },
    {
      "id": "hero",
      "name": "Hero",
      "level": "organism",
      "status": "stable",
      "purpose": "The opening section of a landing or welcome page, with its headline and main action.",
      "description": "The canonical landing-page hero — display heading, description, primary + secondary CTAs, optional trust line and media slot. The `prominent` emphasis renders a soft radial gradient using existing feedback-surface tokens; the gradient collapses cleanly under high-contrast theme.",
      "role": "content",
      "import": "@rrios-forge/ui/organisms/hero",
      "exports": [
        "Hero",
        "HERO_ALIGNS",
        "HERO_EMPHASES",
        "HERO_LAYOUTS",
        "HERO_PROMINENCES",
        "HERO_SIZES",
        "heroVariants"
      ],
      "source": "packages/ui/src/organisms/hero",
      "axes": [
        {
          "axis": "prominence",
          "part": null,
          "values": [
            "subtle",
            "default",
            "featured"
          ],
          "default": "subtle",
          "meaning": "How a surface stands among its siblings."
        },
        {
          "axis": "material",
          "part": null,
          "values": [
            "solid",
            "vibrant"
          ],
          "default": "vibrant",
          "meaning": "The layer's material (ADR-022, ADR-027)."
        },
        {
          "axis": "size",
          "part": null,
          "values": [
            "sm",
            "md",
            "lg"
          ],
          "default": "md",
          "meaning": "Ergonomic scale, in three families (control, text, container)."
        },
        {
          "axis": "layout",
          "part": null,
          "values": [
            "stacked",
            "split",
            "centered"
          ],
          "default": "stacked",
          "meaning": "Arrangement of a composite."
        },
        {
          "axis": "align",
          "part": null,
          "values": [
            "start",
            "center"
          ],
          "default": "start",
          "meaning": "Distribution along the main axis."
        }
      ],
      "needs": [
        {
          "need": "Marketing / onboarding hero",
          "answer": "`Hero`"
        }
      ],
      "patterns": [],
      "a11yExceptions": [],
      "decisions": [
        {
          "id": "ADR-021",
          "title": "ProfileHeader organism and the `cover` slot contract"
        },
        {
          "id": "ADR-027",
          "title": "Vibrant is the system's material, not one of its members"
        }
      ],
      "stories": [
        {
          "name": "Stacked",
          "id": "components-organisms-hero--stacked",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-organisms-hero--stacked",
          "frame": "/iframe.html?id=components-organisms-hero--stacked&viewMode=story"
        },
        {
          "name": "Split",
          "id": "components-organisms-hero--split",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-organisms-hero--split",
          "frame": "/iframe.html?id=components-organisms-hero--split&viewMode=story"
        },
        {
          "name": "Centered",
          "id": "components-organisms-hero--centered",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-organisms-hero--centered",
          "frame": "/iframe.html?id=components-organisms-hero--centered&viewMode=story"
        },
        {
          "name": "Subtle (page section)",
          "id": "components-organisms-hero--subtle-section",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-organisms-hero--subtle-section",
          "frame": "/iframe.html?id=components-organisms-hero--subtle-section&viewMode=story"
        },
        {
          "name": "Sizes",
          "id": "components-organisms-hero--sizes",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-organisms-hero--sizes",
          "frame": "/iframe.html?id=components-organisms-hero--sizes&viewMode=story"
        }
      ],
      "storyFile": "tooling/storybook/stories/components/organisms/hero.stories.tsx"
    },
    {
      "id": "media-lightbox",
      "name": "MediaLightbox",
      "level": "organism",
      "status": "experimental",
      "purpose": "Shows a picture or video full screen, to zoom and step through.",
      "description": "Fullscreen immersive media viewer. Controlled via `open` / `onClose`; owns index, zoom and idle-fade chrome internally. Backdrop is the overlay-backdrop token + content-inverse text (no literal black/white, R04). Icons are consumer slots with text-glyph fallbacks. Replaces the sissificate PostMediaLightbox. Patterns consulted: Patterns/Overlays · ImmersiveMedia, Patterns/Motion · MovementByElementType.",
      "role": "content",
      "import": "@rrios-forge/ui/organisms/media-lightbox",
      "exports": [
        "MediaLightbox",
        "mediaLightboxVariants",
        "mediaLightboxChromeVariants",
        "mediaLightboxPillVariants",
        "mediaLightboxStageVariants"
      ],
      "source": "packages/ui/src/organisms/media-lightbox",
      "axes": [
        {
          "axis": "idle",
          "part": null,
          "values": [
            "true",
            "false"
          ],
          "default": "false",
          "meaning": "Waiting, with nothing to show yet."
        }
      ],
      "needs": [
        {
          "need": "Media viewer / composer / profile",
          "answer": "`MediaLightbox` / `Composer` / `ProfileHeader`"
        }
      ],
      "patterns": [],
      "a11yExceptions": [],
      "decisions": [
        {
          "id": "ADR-021",
          "title": "ProfileHeader organism and the `cover` slot contract"
        },
        {
          "id": "ADR-034",
          "title": "Accessible names come from a labels provider"
        }
      ],
      "stories": [
        {
          "name": "Playground",
          "id": "components-organisms-medialightbox--playground",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-organisms-medialightbox--playground",
          "frame": "/iframe.html?id=components-organisms-medialightbox--playground&viewMode=story"
        },
        {
          "name": "Mixed media (video + gif)",
          "id": "components-organisms-medialightbox--mixed-media",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-organisms-medialightbox--mixed-media",
          "frame": "/iframe.html?id=components-organisms-medialightbox--mixed-media&viewMode=story"
        },
        {
          "name": "Single image (no arrows)",
          "id": "components-organisms-medialightbox--single-image",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-organisms-medialightbox--single-image",
          "frame": "/iframe.html?id=components-organisms-medialightbox--single-image&viewMode=story"
        }
      ],
      "storyFile": "tooling/storybook/stories/components/organisms/media-lightbox.stories.tsx"
    },
    {
      "id": "notification-center",
      "name": "NotificationCenter",
      "level": "organism",
      "status": "stable",
      "purpose": "Dropdown-anchored notification panel.",
      "description": "App-level notifications surface — bell trigger + side drawer + hook stack. Mount the Provider once, drop the Trigger where it belongs (a rail row in Poesía's frame, ADR-044), mount the Drawer at the shell root, and call `useNotificationsActions().push(...)` from anywhere. Mobile (<md) renders fullscreen with the same right-side slide animation. ADR-015 (Drawer molecule) and ADR-016 (organism refactor) document the rationale.",
      "role": "feedback",
      "import": "@rrios-forge/ui/organisms/notification-center",
      "exports": [
        "NotificationCenter",
        "NotificationCenterProvider",
        "NotificationCenterTrigger",
        "NotificationCenterDrawer",
        "NotificationCenterList",
        "NotificationCenterGroup",
        "NotificationCenterEmpty",
        "NotificationCenterFilters",
        "NotificationCenterSection",
        "NotificationCenterSectionBody",
        "NotificationCenterSectionDefaultActions",
        "NotificationCenterSectionFilters",
        "NotificationCenterSectionHeader",
        "useNotifications",
        "useNotificationsState",
        "useNotificationsActions",
        "useNotificationEvent",
        "NOTIFICATIONS_FILTER_MODES",
        "useNotificationsFiltered",
        "notificationCenterGroupHeaderVariants",
        "notificationCenterListItemVariants",
        "notificationCenterListVariants",
        "notificationCenterTriggerBadgeVariants",
        "groupByDay",
        "groupByKey"
      ],
      "source": "packages/ui/src/organisms/notification-center",
      "axes": [
        {
          "axis": "tone",
          "part": null,
          "values": [
            "info",
            "danger"
          ],
          "default": "danger",
          "meaning": "Which semantic colour family the element speaks in."
        }
      ],
      "needs": [
        {
          "need": "Notification center",
          "answer": "`NotificationCenter`"
        }
      ],
      "patterns": [],
      "a11yExceptions": [],
      "decisions": [
        {
          "id": "ADR-003",
          "title": "Storybook editorial convention and pattern↔component bidirectionality"
        },
        {
          "id": "ADR-015",
          "title": "Drawer molecule on top of Radix Dialog"
        },
        {
          "id": "ADR-016",
          "title": "NotificationCenter v2: Popover → Drawer + Provider/Hooks"
        },
        {
          "id": "ADR-018",
          "title": "Motion language as a Pattern Layer contract"
        },
        {
          "id": "ADR-030",
          "title": "Axis vocabulary: one name, one meaning"
        },
        {
          "id": "ADR-043",
          "title": "The default theme is monochrome"
        }
      ],
      "stories": [
        {
          "name": "Populated",
          "id": "components-organisms-notificationcenter--populated",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-organisms-notificationcenter--populated",
          "frame": "/iframe.html?id=components-organisms-notificationcenter--populated&viewMode=story"
        },
        {
          "name": "Empty",
          "id": "components-organisms-notificationcenter--empty",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-organisms-notificationcenter--empty",
          "frame": "/iframe.html?id=components-organisms-notificationcenter--empty&viewMode=story"
        },
        {
          "name": "Scrolled (12 items)",
          "id": "components-organisms-notificationcenter--scrolled",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-organisms-notificationcenter--scrolled",
          "frame": "/iframe.html?id=components-organisms-notificationcenter--scrolled&viewMode=story"
        },
        {
          "name": "With grouping (by day)",
          "id": "components-organisms-notificationcenter--with-grouping",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-organisms-notificationcenter--with-grouping",
          "frame": "/iframe.html?id=components-organisms-notificationcenter--with-grouping&viewMode=story"
        },
        {
          "name": "Live (Provider + hooks)",
          "id": "components-organisms-notificationcenter--with-provider",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-organisms-notificationcenter--with-provider",
          "frame": "/iframe.html?id=components-organisms-notificationcenter--with-provider&viewMode=story"
        },
        {
          "name": "Page (Section in PageShell)",
          "id": "components-organisms-notificationcenter--page",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-organisms-notificationcenter--page",
          "frame": "/iframe.html?id=components-organisms-notificationcenter--page&viewMode=story"
        },
        {
          "name": "Page (custom composition)",
          "id": "components-organisms-notificationcenter--page-custom-composition",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-organisms-notificationcenter--page-custom-composition",
          "frame": "/iframe.html?id=components-organisms-notificationcenter--page-custom-composition&viewMode=story"
        },
        {
          "name": "Accessibility",
          "id": "components-organisms-notificationcenter--accessibility",
          "interaction": false,
          "snapshots": [
            "dark",
            "high-contrast",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-organisms-notificationcenter--accessibility",
          "frame": "/iframe.html?id=components-organisms-notificationcenter--accessibility&viewMode=story"
        }
      ],
      "storyFile": "tooling/storybook/stories/components/organisms/notification-center.stories.tsx"
    },
    {
      "id": "page-shell",
      "name": "PageShell",
      "level": "organism",
      "status": "stable",
      "purpose": "The app frame: an icon rail whose rows peek, the page header, the content; tabs on phones.",
      "description": "**Purpose.** The slot-based layout organism for application pages. Its default frame is **Poesía's navigation (ADR-044)**: a permanent icon rail in a glass capsule centred on the window (`sidebarMode=\"rail\"`, `sidebarPresentation=\"inset\"`), every row in one untitled `NavGroup`, each row wrapped in `<PageShell.RailPeek>` so hovering it opens a glass panel over the page — composed from `PeekHeader`, `PeekFacts` and `PeekLinks`. Search and settings are rows; there is no top bar; phones get `<PageShell.MobileTabBar>` (`mobileNav=\"tabs\"`). See the Playground story.\n\n**Opt-ins.** The labelled panel (`sidebarMode=\"auto\"` / `\"panel\"`, collapsible with ⌘\\, ADR-014/040), the `island` and `column` presentations (ADR-025), a `topBar` for pages without a rail (ADR-009), and the floating bubble with its drawer on phones (`mobileNav=\"bubble\"`, ADR-011/013). The stories below that show them say so.\n\n**Identity moves.**\n- The rail never grows; the page keeps its width. A detail (a count, a status) goes in the row's peek, never on the icon.\n- One group, one gap: home first, settings last (J-36).\n- Glass only where you navigate or act (ADR-038): the rail capsule and the peek; the content rests on the content material.\n\n**Controls that stay in reach (ADR-045).** A screen whose content scrolls past its filters, search, view switch or section tabs puts them in `<PageShell.StickyBar title=\"…\">` right under its `PageHeader`. At rest the bar is part of the page; once it pins it condenses onto glass and the page title folds into it, small (left out on phones). Its box never changes, so nothing jumps; it never hides focus. With `edge=\"bottom\"` it holds a selection's or a form's actions. One bar per edge: put a view switch and its filter in the same bar. See the Sticky bars story.\n\n**When to use.**\n- Any application page: the rail frame, a page header and the content body.\n- A settings page (`width=\"md\"`), a data page (`width=\"xl\"` + `mainPadding=\"flush\"`), a dashboard (`width=\"xl\"`), a marketing surface (`width=\"fluid\"` + `frame=\"off\"`).\n\n**When NOT to use.**\n- An overlay surface (Dialog, DropdownMenu, Popover) — these are not pages.\n- A fixed authentication / onboarding screen with a single centered card → use a simpler `<main>` + `Card` directly.\n\n**Composes with.**\n- `<SidebarSection aria-label>` + one `<NavGroup>` of `<PageShell.RailPeek>`-wrapped `<NavItem>`s in the `sidebar` slot.\n- `<CommandMenu>` opened by the search row (⌘K).\n- `<PageHeader>` in the `header` slot — title, breadcrumb, page actions — or in the body, followed by a `<PageShell.StickyBar>` when the screen has controls to keep in reach (ADR-045).\n- `<TopBar>` in the `topBar` slot only for pages without a rail (marketing, reading).\n\n**Mobile.** The tab bar by default (five tabs at most). The bubble is an opt-in:\n- With `mobileNav=\"bubble\"` (or no `mobileTabBar`) it auto-renders at `<md` whenever a `sidebar` is provided. Override via `navBubble={false}` to suppress (and mount the compound manually for full positioning control), or `navBubblePosition=\"start\"` to anchor it on the left.\n- The bubble is `<PageShell.MobileNavBubble />`. Its predecessor `<PageShell.MobileNavTrigger />` is deprecated — kept exported one release for migration, removed in the next.\n\n**Accessibility.**\n- Renders `<main aria-label={mainLabel}>` (default `\"Main content\"`).\n- The mobile drawer is a Radix Dialog — focus trap, Escape-to-close and overlay click are right by construction.\n- The bubble announces `aria-expanded` and `aria-controls` linking to the drawer; its `aria-label` toggles between \"Open navigation\" and \"Close navigation\" depending on state.\n- The shell uses an **app-shell scroll model**: only the main column scrolls. PageHeader stays sticky inside that scroll context.\n\n**Related patterns.**\n- `Patterns/Page Shells · DashboardSurface / SettingsPage / DataPage` — the canonical configurations.\n- `Patterns/Information Architecture · SectionAnatomy` — why the shell stays visually quiet.\n- `Patterns/Decision Matrix · LayoutPrimitive` — when PageShell vs a simpler `<main>` is the right answer.",
      "role": "surface",
      "import": "@rrios-forge/ui/organisms/page-shell",
      "exports": [
        "PageShell",
        "PageShellMobileNavBubble",
        "PageShellMobileNavTrigger",
        "PageShellMobileTabBar",
        "PageShellRailPeek",
        "PageShellSidebarTrigger",
        "usePageShellMobileNav",
        "usePageShellSidebar",
        "PageShellStickyBar",
        "PAGE_SHELL_FRAMES",
        "PAGE_SHELL_MAIN_PADDINGS",
        "PAGE_SHELL_MOBILE_NAVS",
        "PAGE_SHELL_NAV_BUBBLE_POSITIONS",
        "PAGE_SHELL_SIDEBAR_MODES",
        "PAGE_SHELL_SIDEBAR_TONES",
        "PAGE_SHELL_WIDTHS",
        "pageShellFooterVariants",
        "pageShellFrameVariants",
        "pageShellHeaderVariants",
        "pageShellMainVariants",
        "pageShellMobileNavBubbleIconVariants",
        "pageShellMobileNavBubbleVariants",
        "pageShellMobileSheetOverlayVariants",
        "pageShellMobileSheetVariants",
        "pageShellMobileTabBarSlotVariants",
        "pageShellOuterVariants",
        "pageShellRowVariants",
        "pageShellScrollVariants",
        "pageShellSidebarBodyVariants",
        "pageShellSidebarFooterVariants",
        "pageShellSidebarHeaderVariants",
        "pageShellSidebarVariants",
        "pageShellTopBarSlotVariants"
      ],
      "source": "packages/ui/src/organisms/page-shell",
      "axes": [
        {
          "axis": "frame",
          "part": null,
          "values": [
            "auto",
            "on",
            "off"
          ],
          "default": "auto",
          "meaning": "PageShell editorial frame."
        },
        {
          "axis": "scroll",
          "part": null,
          "values": [
            "pane",
            "page"
          ],
          "default": "pane",
          "meaning": "PageShell scroll owner."
        },
        {
          "axis": "stage",
          "part": null,
          "values": [
            "field",
            "none"
          ],
          "default": "field",
          "meaning": "PageShell stage paint."
        },
        {
          "axis": "sidebarMode",
          "part": null,
          "values": [
            "auto",
            "panel",
            "rail"
          ],
          "default": "auto",
          "meaning": "How the app frame shows its navigation: rail, the default, is a column of icons whose rows preview their page; auto and panel show the labelled panel instead."
        },
        {
          "axis": "presentation",
          "part": null,
          "values": [
            "island",
            "column",
            "inset"
          ],
          "default": "island",
          "meaning": "How the same thing is staged."
        },
        {
          "axis": "material",
          "part": null,
          "values": [
            "solid",
            "vibrant"
          ],
          "default": "solid",
          "meaning": "The layer's material (ADR-022, ADR-027)."
        },
        {
          "axis": "mainPadding",
          "part": null,
          "values": [
            "default",
            "flush"
          ],
          "default": "default",
          "meaning": "PageShell main padding."
        },
        {
          "axis": "position",
          "part": null,
          "values": [
            "start",
            "end"
          ],
          "default": "end",
          "meaning": "Placement of a docked element."
        }
      ],
      "needs": [
        {
          "need": "App frame / navigation",
          "answer": "**The rail that peeks (ADR-044) — the default and the recommendation.** `PageShell` (defaults: `sidebarMode=\"rail\"`, `sidebarPresentation=\"inset\"`, `mobileNav=\"tabs\"`) + `SidebarSection aria-label` + ONE untitled `NavGroup`: home, search, the rooms, settings — same size, same gap. Wrap every `NavItem` in `PageShell.RailPeek` and compose its panel with `PageShell.PeekHeader` / `PeekFacts` / `PeekLinks`. Search is a button row opening `CommandMenu` (⌘K); settings' peek holds the quick controls; phones get `PageShell.MobileTabBar` (≤ 5). No `TopBar` in an app frame. Opt-ins only when a product needs them: the labelled panel (`sidebarMode=\"auto\"`, ⌘\\\\ collapse, ADR-040), `island`/`column` (ADR-025), the bubble (`mobileNav=\"bubble\"`)"
        },
        {
          "need": "Controls that must stay in reach while the screen scrolls (filters, search, a view switch, section tabs) — or a selection's / a form's actions",
          "answer": "`PageShell.StickyBar` (ADR-045) under the `PageHeader`, `edge=\"bottom\"` for actions: at rest part of the page; pinned, it condenses onto glass and carries the page title small. One bar per edge; never hides focus"
        }
      ],
      "patterns": [
        "Patterns/Page Shells · DashboardSurface",
        "Patterns/Page Shells · SettingsPage",
        "Patterns/Page Shells · DataPage",
        "Patterns/Information Architecture · SectionAnatomy",
        "Patterns/Navigation · NavigationLayers",
        "Patterns/Density & Growth · ContentGrowth",
        "Patterns/Decision Matrix · ComponentChoice + LayoutPrimitive"
      ],
      "a11yExceptions": [],
      "decisions": [
        {
          "id": "ADR-003",
          "title": "Storybook editorial convention and pattern↔component bidirectionality"
        },
        {
          "id": "ADR-004",
          "title": "Migrate boolean configuration props to semantic axes"
        },
        {
          "id": "ADR-009",
          "title": "Editorial Frame: PageShell v3 + new `TopBar` molecule"
        },
        {
          "id": "ADR-010",
          "title": "PageShell v4: bottom dock + mobile floating bubble"
        },
        {
          "id": "ADR-011",
          "title": "PageShell v5: adaptive lateral sidebar + mobile nav bubble"
        },
        {
          "id": "ADR-013",
          "title": "PageShell: mobile-nav polymorphism"
        },
        {
          "id": "ADR-014",
          "title": "PageShell: Apple Mail / macOS Big Sur visual register"
        },
        {
          "id": "ADR-015",
          "title": "Drawer molecule on top of Radix Dialog"
        },
        {
          "id": "ADR-016",
          "title": "NotificationCenter v2: Popover → Drawer + Provider/Hooks"
        },
        {
          "id": "ADR-018",
          "title": "Motion language as a Pattern Layer contract"
        },
        {
          "id": "ADR-022",
          "title": "The material family: `solid` and `vibrant`"
        },
        {
          "id": "ADR-025",
          "title": "The sidebar is an island, not a wall (amended: two stagings)"
        },
        {
          "id": "ADR-026",
          "title": "Sunset functional palette + the stage field"
        },
        {
          "id": "ADR-027",
          "title": "Vibrant is the system's material, not one of its members"
        },
        {
          "id": "ADR-029",
          "title": "The page gutter belongs outside the frame"
        },
        {
          "id": "ADR-030",
          "title": "Axis vocabulary: one name, one meaning"
        },
        {
          "id": "ADR-032",
          "title": "Themes compose by layers; brands are a checked layer"
        },
        {
          "id": "ADR-033",
          "title": "The material ships once, and the night is tokens"
        },
        {
          "id": "ADR-037",
          "title": "Continuity motion: a decelerating curve, a travelling indicator, view transitions and the SegmentedControl"
        },
        {
          "id": "ADR-038",
          "title": "Liquid Glass layers: glass for navigation and controls, a content material for everything read"
        },
        {
          "id": "ADR-039",
          "title": "The component premium pass: translucent fills, a selected register, quiet scroll, and a system-wide audit"
        },
        {
          "id": "ADR-040",
          "title": "The sidebar collapses by default and gives the page the room"
        },
        {
          "id": "ADR-041",
          "title": "The rail peeks instead of growing"
        },
        {
          "id": "ADR-044",
          "title": "Navigation is a rail that peeks"
        },
        {
          "id": "ADR-045",
          "title": "A screen's controls pin and condense"
        }
      ],
      "stories": [
        {
          "name": "Playground",
          "id": "components-organisms-pageshell--playground",
          "interaction": false,
          "snapshots": [
            "dark",
            "high-contrast",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-organisms-pageshell--playground",
          "frame": "/iframe.html?id=components-organisms-pageshell--playground&viewMode=story"
        },
        {
          "name": "Apple-style desktop",
          "id": "components-organisms-pageshell--apple-style-desktop",
          "interaction": false,
          "snapshots": [
            "dark",
            "high-contrast",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-organisms-pageshell--apple-style-desktop",
          "frame": "/iframe.html?id=components-organisms-pageshell--apple-style-desktop&viewMode=story"
        },
        {
          "name": "Dashboard",
          "id": "components-organisms-pageshell--dashboard",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-organisms-pageshell--dashboard",
          "frame": "/iframe.html?id=components-organisms-pageshell--dashboard&viewMode=story"
        },
        {
          "name": "Settings page",
          "id": "components-organisms-pageshell--settings-page",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-organisms-pageshell--settings-page",
          "frame": "/iframe.html?id=components-organisms-pageshell--settings-page&viewMode=story"
        },
        {
          "name": "Data page",
          "id": "components-organisms-pageshell--data-page",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-organisms-pageshell--data-page",
          "frame": "/iframe.html?id=components-organisms-pageshell--data-page&viewMode=story"
        },
        {
          "name": "Sticky bars",
          "id": "components-organisms-pageshell--sticky-bars",
          "interaction": true,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-organisms-pageshell--sticky-bars",
          "frame": "/iframe.html?id=components-organisms-pageshell--sticky-bars&viewMode=story"
        },
        {
          "name": "With footer",
          "id": "components-organisms-pageshell--with-footer",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-organisms-pageshell--with-footer",
          "frame": "/iframe.html?id=components-organisms-pageshell--with-footer&viewMode=story"
        },
        {
          "name": "Frame · auto / on / off",
          "id": "components-organisms-pageshell--frame-triptych",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-organisms-pageshell--frame-triptych",
          "frame": "/iframe.html?id=components-organisms-pageshell--frame-triptych&viewMode=story"
        },
        {
          "name": "Sidebar · panel / rail / auto",
          "id": "components-organisms-pageshell--sidebar-modes",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-organisms-pageshell--sidebar-modes",
          "frame": "/iframe.html?id=components-organisms-pageshell--sidebar-modes&viewMode=story"
        },
        {
          "name": "Sidebar · column (Sissificate register)",
          "id": "components-organisms-pageshell--sidebar-column",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-organisms-pageshell--sidebar-column",
          "frame": "/iframe.html?id=components-organisms-pageshell--sidebar-column&viewMode=story"
        },
        {
          "name": "Liquid Glass (inset sidebar)",
          "id": "components-organisms-pageshell--liquid-glass",
          "interaction": false,
          "snapshots": [
            "dark",
            "high-contrast",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-organisms-pageshell--liquid-glass",
          "frame": "/iframe.html?id=components-organisms-pageshell--liquid-glass&viewMode=story"
        },
        {
          "name": "Sidebar · collapse (default)",
          "id": "components-organisms-pageshell--sidebar-collapsible",
          "interaction": true,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-organisms-pageshell--sidebar-collapsible",
          "frame": "/iframe.html?id=components-organisms-pageshell--sidebar-collapsible&viewMode=story"
        },
        {
          "name": "Sidebar · rail peek",
          "id": "components-organisms-pageshell--sidebar-rail-peek",
          "interaction": true,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-organisms-pageshell--sidebar-rail-peek",
          "frame": "/iframe.html?id=components-organisms-pageshell--sidebar-rail-peek&viewMode=story"
        },
        {
          "name": "Mobile (drawer + bubble)",
          "id": "components-organisms-pageshell--mobile",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-organisms-pageshell--mobile",
          "frame": "/iframe.html?id=components-organisms-pageshell--mobile&viewMode=story"
        },
        {
          "name": "Mobile · drawer open",
          "id": "components-organisms-pageshell--mobile-bubble-open",
          "interaction": false,
          "snapshots": [
            "dark",
            "high-contrast",
            "light",
            "reduced-motion"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-organisms-pageshell--mobile-bubble-open",
          "frame": "/iframe.html?id=components-organisms-pageshell--mobile-bubble-open&viewMode=story"
        },
        {
          "name": "Mobile · bubble start (left)",
          "id": "components-organisms-pageshell--mobile-bubble-start",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-organisms-pageshell--mobile-bubble-start",
          "frame": "/iframe.html?id=components-organisms-pageshell--mobile-bubble-start&viewMode=story"
        },
        {
          "name": "Mobile · bottom tabs (iOS register)",
          "id": "components-organisms-pageshell--mobile-nav-tabs",
          "interaction": false,
          "snapshots": [
            "dark",
            "high-contrast",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-organisms-pageshell--mobile-nav-tabs",
          "frame": "/iframe.html?id=components-organisms-pageshell--mobile-nav-tabs&viewMode=story"
        },
        {
          "name": "Mobile · no nav (embedded)",
          "id": "components-organisms-pageshell--mobile-nav-none",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-organisms-pageshell--mobile-nav-none",
          "frame": "/iframe.html?id=components-organisms-pageshell--mobile-nav-none&viewMode=story"
        },
        {
          "name": "Container · flush body (own gutter)",
          "id": "components-organisms-pageshell--container-padding-flush",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-organisms-pageshell--container-padding-flush",
          "frame": "/iframe.html?id=components-organisms-pageshell--container-padding-flush&viewMode=story"
        },
        {
          "name": "Container · opt-out (disableContainer)",
          "id": "components-organisms-pageshell--disable-container",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-organisms-pageshell--disable-container",
          "frame": "/iframe.html?id=components-organisms-pageshell--disable-container&viewMode=story"
        },
        {
          "name": "Tablet",
          "id": "components-organisms-pageshell--tablet",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-organisms-pageshell--tablet",
          "frame": "/iframe.html?id=components-organisms-pageshell--tablet&viewMode=story"
        },
        {
          "name": "Widths",
          "id": "components-organisms-pageshell--widths",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-organisms-pageshell--widths",
          "frame": "/iframe.html?id=components-organisms-pageshell--widths&viewMode=story"
        },
        {
          "name": "Accessibility",
          "id": "components-organisms-pageshell--accessibility",
          "interaction": false,
          "snapshots": [
            "dark",
            "high-contrast",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-organisms-pageshell--accessibility",
          "frame": "/iframe.html?id=components-organisms-pageshell--accessibility&viewMode=story"
        },
        {
          "name": "Vibrant chrome",
          "id": "components-organisms-pageshell--vibrant-chrome",
          "interaction": false,
          "snapshots": [
            "dark",
            "high-contrast",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-organisms-pageshell--vibrant-chrome",
          "frame": "/iframe.html?id=components-organisms-pageshell--vibrant-chrome&viewMode=story"
        }
      ],
      "storyFile": "tooling/storybook/stories/components/organisms/page-shell.stories.tsx"
    },
    {
      "id": "profile-header",
      "name": "ProfileHeader",
      "level": "organism",
      "status": "experimental",
      "purpose": "The top of a profile — cover, avatar, name, stats and actions.",
      "description": "Profile surface: a 4:1 cover band, an avatar overlapping its bottom edge, an identity block (name/handle/pronouns/bio), an optional stats row and an actions slot. cover is a ReactNode slot so the consumer supplies its own image element (next/image, <img>, a gradient). Patterns consulted: Patterns/Information Architecture · MetadataAndActions, Patterns/Visual Priority · ActionHierarchy.",
      "role": "content",
      "import": "@rrios-forge/ui/organisms/profile-header",
      "exports": [
        "ProfileHeader",
        "profileHeaderAvatarVariants",
        "profileHeaderCoverVariants",
        "profileHeaderVariants",
        "PROFILE_HEADER_DENSITIES"
      ],
      "source": "packages/ui/src/organisms/profile-header",
      "axes": [
        {
          "axis": "overlap",
          "part": null,
          "values": [
            "true",
            "false"
          ],
          "default": "false",
          "meaning": "ProfileHeader avatar overlaps the cover (ADR-039)."
        }
      ],
      "needs": [
        {
          "need": "Media viewer / composer / profile",
          "answer": "`MediaLightbox` / `Composer` / `ProfileHeader`"
        }
      ],
      "patterns": [],
      "a11yExceptions": [],
      "decisions": [
        {
          "id": "ADR-021",
          "title": "ProfileHeader organism and the `cover` slot contract"
        },
        {
          "id": "ADR-034",
          "title": "Accessible names come from a labels provider"
        }
      ],
      "stories": [
        {
          "name": "Maya Okafor",
          "id": "components-organisms-profileheader--playground",
          "interaction": false,
          "snapshots": [
            "dark",
            "high-contrast",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-organisms-profileheader--playground",
          "frame": "/iframe.html?id=components-organisms-profileheader--playground&viewMode=story"
        },
        {
          "name": "No cover · no stats",
          "id": "components-organisms-profileheader--no-cover",
          "interaction": false,
          "snapshots": [
            "dark",
            "light"
          ],
          "skipsSnapshot": false,
          "docs": "/?path=/story/components-organisms-profileheader--no-cover",
          "frame": "/iframe.html?id=components-organisms-profileheader--no-cover&viewMode=story"
        }
      ],
      "storyFile": "tooling/storybook/stories/components/organisms/profile-header.stories.tsx"
    }
  ]
}
