@instruments/materia-ui 0.4.0 → 0.4.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (117) hide show
  1. package/README.md +2 -4
  2. package/agent-docs.md +9 -9
  3. package/dist/components/accordion/accordion-root.d.ts +1 -0
  4. package/dist/components/accordion/accordion-root.js +1 -0
  5. package/dist/components/alert/alert-root.d.ts +1 -0
  6. package/dist/components/alert/alert-root.js +1 -0
  7. package/dist/components/alert-dialog/alert-dialog-root.d.ts +1 -0
  8. package/dist/components/alert-dialog/alert-dialog-root.js +1 -0
  9. package/dist/components/avatar/avatar-root.d.ts +1 -0
  10. package/dist/components/avatar/avatar-root.js +1 -0
  11. package/dist/components/badge/badge-root.d.ts +1 -0
  12. package/dist/components/badge/badge-root.js +1 -0
  13. package/dist/components/calendar/calendar-root.js +1 -0
  14. package/dist/components/carousel/carousel-root.d.ts +1 -0
  15. package/dist/components/carousel/carousel-root.js +1 -0
  16. package/dist/components/chart/chart-root.d.ts +1 -0
  17. package/dist/components/chart/chart-root.js +1 -0
  18. package/dist/components/collapsible/collapsible-root.d.ts +1 -0
  19. package/dist/components/collapsible/collapsible-root.js +1 -0
  20. package/dist/components/combobox/combobox-root.d.ts +1 -0
  21. package/dist/components/combobox/combobox-root.js +1 -0
  22. package/dist/components/command/command-dialog.d.ts +5 -1
  23. package/dist/components/command/command-dialog.js +1 -1
  24. package/dist/components/command/command-input.js +5 -2
  25. package/dist/components/command/command-root.d.ts +1 -0
  26. package/dist/components/command/command-root.js +1 -0
  27. package/dist/components/dialog/dialog-content.d.ts +2 -0
  28. package/dist/components/dialog/dialog-content.js +3 -2
  29. package/dist/components/dialog/dialog-footer.d.ts +2 -0
  30. package/dist/components/dialog/dialog-footer.js +8 -8
  31. package/dist/components/dialog/dialog-root.d.ts +1 -0
  32. package/dist/components/dialog/dialog-root.js +1 -0
  33. package/dist/components/dialog/dialog-title.d.ts +2 -0
  34. package/dist/components/dialog/dialog-title.js +3 -1
  35. package/dist/components/drawer/drawer-root.d.ts +1 -0
  36. package/dist/components/drawer/drawer-root.js +1 -0
  37. package/dist/components/heading/heading-root.d.ts +1 -0
  38. package/dist/components/heading/heading-root.js +1 -0
  39. package/dist/components/input/input-root.d.ts +1 -0
  40. package/dist/components/input/input-root.js +1 -0
  41. package/dist/components/kbd/kbd-root.d.ts +1 -0
  42. package/dist/components/kbd/kbd-root.js +1 -0
  43. package/dist/components/logo/logo-mark.d.ts +1 -1
  44. package/dist/components/logo/logo-mark.js +1 -1
  45. package/dist/components/logotype/logotype-paths.d.ts +1 -1
  46. package/dist/components/logotype/logotype-paths.js +1 -1
  47. package/dist/components/month-year-picker/month-year-picker-root.d.ts +1 -0
  48. package/dist/components/month-year-picker/month-year-picker-root.js +1 -0
  49. package/dist/components/native-select/native-select-root.d.ts +1 -0
  50. package/dist/components/native-select/native-select-root.js +1 -0
  51. package/dist/components/pill/pill-root.d.ts +1 -0
  52. package/dist/components/pill/pill-root.js +1 -0
  53. package/dist/components/popover/popover-root.d.ts +1 -0
  54. package/dist/components/popover/popover-root.js +1 -0
  55. package/dist/components/quantity-control/quantity-control-root.d.ts +1 -0
  56. package/dist/components/quantity-control/quantity-control-root.js +1 -0
  57. package/dist/components/segmented-control/segmented-control-root.js +6 -3
  58. package/dist/components/segmented-control/segmented-control-variants.js +4 -1
  59. package/dist/components/select/select-root.d.ts +1 -0
  60. package/dist/components/select/select-root.js +1 -0
  61. package/dist/components/separator/separator-root.d.ts +1 -0
  62. package/dist/components/separator/separator-root.js +1 -0
  63. package/dist/components/sheet/sheet-root.d.ts +1 -0
  64. package/dist/components/sheet/sheet-root.js +1 -0
  65. package/dist/components/spinner/spinner-root.d.ts +1 -0
  66. package/dist/components/spinner/spinner-root.js +1 -0
  67. package/dist/components/stepper/stepper-root.d.ts +1 -0
  68. package/dist/components/stepper/stepper-root.js +1 -0
  69. package/dist/components/success-tick-ripple/success-tick-ripple-root.d.ts +1 -0
  70. package/dist/components/success-tick-ripple/success-tick-ripple-root.js +1 -0
  71. package/dist/components/swatch-selector/swatch-selector-item.js +4 -1
  72. package/dist/components/switch/switch-root.d.ts +1 -0
  73. package/dist/components/switch/switch-root.js +1 -0
  74. package/dist/components/tag/tag-root.d.ts +1 -0
  75. package/dist/components/tag/tag-root.js +1 -0
  76. package/dist/components/textarea/textarea-root.d.ts +1 -0
  77. package/dist/components/textarea/textarea-root.js +1 -0
  78. package/dist/components/time-slot-picker/time-slot-picker-root.d.ts +1 -0
  79. package/dist/components/time-slot-picker/time-slot-picker-root.js +1 -0
  80. package/dist/components/toast/toast-root.d.ts +1 -0
  81. package/dist/components/toast/toast-root.js +1 -0
  82. package/dist/components/tooltip/tooltip-root.d.ts +1 -0
  83. package/dist/components/tooltip/tooltip-root.js +1 -0
  84. package/dist/compositions/empty-state/empty-state-root.d.ts +1 -0
  85. package/dist/compositions/empty-state/empty-state-root.js +1 -0
  86. package/dist/compositions/file-upload/file-upload-dropzone.d.ts +1 -0
  87. package/dist/compositions/file-upload/file-upload-dropzone.js +1 -0
  88. package/dist/data/decision-trees.d.ts +1 -1
  89. package/dist/data/decision-trees.js +1 -1
  90. package/dist/data/docs-manifest.d.ts +2 -0
  91. package/dist/data/docs-manifest.js +235 -68
  92. package/dist/styles/index.css +0 -1
  93. package/dist/tokens/segmented.d.ts +8 -0
  94. package/dist/tokens/segmented.js +26 -0
  95. package/dist/utils/cn-theme.js +1 -1
  96. package/lint/README.md +6 -2
  97. package/lint/doctrine-rules.mjs +4 -4
  98. package/lint/oxlint/index.d.mts +13 -5
  99. package/lint/oxlint/index.mjs +26 -0
  100. package/lint/oxlint/no-naked-element.mjs +123 -65
  101. package/lint/oxlint/no-render-layout-as.mjs +61 -56
  102. package/lint/scan-classes.d.mts +58 -5
  103. package/lint/scan-classes.mjs +274 -38
  104. package/lint/tokens.d.mts +16 -8
  105. package/lint/tokens.mjs +13 -3
  106. package/lint/type-case.d.mts +16 -8
  107. package/lint/type-case.mjs +17 -0
  108. package/package.json +27 -14
  109. package/lint/oxlint/fixtures/allowed.tsx +0 -12
  110. package/lint/oxlint/fixtures/fixture.config.mjs +0 -29
  111. package/lint/oxlint/fixtures/invalid.tsx +0 -24
  112. package/lint/oxlint/fixtures/layout-only.tsx +0 -26
  113. package/lint/oxlint/fixtures/render-as-invalid.tsx +0 -11
  114. package/lint/oxlint/fixtures/render-as-valid.tsx +0 -14
  115. package/lint/oxlint/fixtures/valid.tsx +0 -18
  116. package/lint/oxlint/no-naked-element.test.ts +0 -155
  117. package/lint/oxlint/no-render-layout-as.test.ts +0 -81
@@ -1,5 +1,5 @@
1
1
  /* oxlint-disable max-lines -- generated data module: one entry per design-system unit. */
2
- // GENERATED by scripts/generate-docs-manifest.mjs - do not edit.
2
+ // GENERATED by scripts/generate-docs-manifest.ts - do not edit.
3
3
  // Regenerate with `pnpm generate:docs-manifest`; the lint chain runs
4
4
  // `pnpm test` and fails when this file is stale.
5
5
  export const docsManifest = {
@@ -84,6 +84,7 @@ export const docsManifest = {
84
84
  "Reach for `Collapsible` instead when there is a single expandable region - `Accordion` is for a set of grouped items keyed by `value`.",
85
85
  "Children must be `AccordionItem`s (each with `AccordionTrigger`/`AccordionContent`); the item's `value` is what `value`/`defaultValue` match against.",
86
86
  ],
87
+ keywords: ["disclosure", "faq", "expander"],
87
88
  uses: ["icon"],
88
89
  usedBy: [],
89
90
  anatomy: {
@@ -150,6 +151,7 @@ export const docsManifest = {
150
151
  'Compose `AlertTitle` / `AlertDescription` as children and render a direct-child `<svg>` for the auto-detected icon column; `tone="danger"` recolours for errors.',
151
152
  'It renders `role="alert"`, so AT announces it on mount - keep it a notice, not a container for heavy interactive UI.',
152
153
  ],
154
+ keywords: ["callout", "notice", "banner", "message"],
153
155
  uses: ["grid"],
154
156
  usedBy: [],
155
157
  anatomy: {
@@ -286,6 +288,7 @@ export const docsManifest = {
286
288
  "Route every destructive confirmation here, never a plain `Dialog` - unlike `Dialog` it won't dismiss on outside-click / Esc, so the choice stays deliberate.",
287
289
  'Give the destructive `AlertDialogAction` `tone="danger"` and keep the safe escape as `AlertDialogCancel`.',
288
290
  ],
291
+ keywords: ["confirm", "confirmation", "modal"],
289
292
  uses: ["button", "flex"],
290
293
  usedBy: [],
291
294
  },
@@ -337,6 +340,7 @@ export const docsManifest = {
337
340
  'Use `variant="muted"` inside dense copy so the underline stays quiet; the default variant stands out from the surrounding text.',
338
341
  'Use `variant="plain"` where the link is already set apart by its position, such as a caption under a tile or a row in an index; keep an underline on links inside running text.',
339
342
  ],
343
+ keywords: [],
340
344
  uses: ["icon"],
341
345
  usedBy: ["mega-menu", "site-footer"],
342
346
  },
@@ -429,6 +433,7 @@ export const docsManifest = {
429
433
  "Use `prefix`/`suffix` for units and currency (`$`, `/10`), not sibling text nodes - they're layout-animated with the digits and folded into the one screen-reader announcement.",
430
434
  "Reach for the `duration`/`easing` tokens over a raw `transition` - token timing keeps it in step with the rest of the motion system; drop to `transition` only for bespoke springs.",
431
435
  ],
436
+ keywords: [],
432
437
  uses: ["visually-hidden"],
433
438
  usedBy: ["thinking-loader"],
434
439
  },
@@ -447,7 +452,7 @@ export const docsManifest = {
447
452
  name: "as",
448
453
  type: '"div" | "article" | "aside" | "figcaption" | "figure" | "footer" | "header" | "li" | "main" | "nav" | "ol" | "section" | "span" | "ul"',
449
454
  required: false,
450
- description: 'Render as a different host element from the closed layout vocabulary\n({@link LayoutElement}). The set is deliberately closed: `as="button"` is a\ntype error, because the design-system answer is the Button component. Ref\nand event-handler types remain the default element\'s.\n\n`as` and `render` are mutually exclusive; if both are passed, `render`\nwins (a dev-only warning fires).',
455
+ description: 'Render as a different host element from the closed layout vocabulary\n(`LayoutElement`). The set is deliberately closed: `as="button"` is a\ntype error, because the design-system answer is the Button component. Ref\nand event-handler types remain the default element\'s.\n\n`as` and `render` are mutually exclusive; if both are passed, `render`\nwins (a dev-only warning fires).',
451
456
  },
452
457
  {
453
458
  name: "ratio",
@@ -468,6 +473,7 @@ export const docsManifest = {
468
473
  "Give it exactly one child and let it fill - set the media to `size-full object-cover`; `AspectRatio` sizes to the available width and derives height from `ratio`.",
469
474
  "Use `as` to change the element (a tag); use `render` only to swap in a component (e.g. a router Link). Never `render={<Box as=…/>}` - pass `as` directly.",
470
475
  ],
476
+ keywords: [],
471
477
  uses: [],
472
478
  usedBy: [],
473
479
  anatomy: {
@@ -546,7 +552,7 @@ export const docsManifest = {
546
552
  type: 'boolean | "neutral" | "brand" | "danger" | "warning" | "success" | "info"',
547
553
  required: false,
548
554
  defaultValue: "false",
549
- description: "Render a plain dot instead of a number. `true` tints it with the badge's\nown `tone`; a {@link Tone} value overrides that with the shared dot tint.",
555
+ description: "Render a plain dot instead of a number. `true` tints it with the badge's\nown `tone`; a `Tone` value overrides that with the shared dot tint.",
550
556
  },
551
557
  {
552
558
  name: "max",
@@ -748,6 +754,7 @@ export const docsManifest = {
748
754
  "Give `AvatarImage` a meaningful `alt`; the visual is decorative only when the fallback initials already convey the identity.",
749
755
  'Keep the default `radius="full"` for people; use a squared `radius` for brand/entity logos so they read as objects, not users.',
750
756
  ],
757
+ keywords: ["profile picture", "user", "initials"],
751
758
  uses: ["center", "dot", "flex", "visually-hidden"],
752
759
  usedBy: ["mobile-navigation"],
753
760
  },
@@ -944,6 +951,7 @@ export const docsManifest = {
944
951
  'A standalone count needs an `accessibleLabel` ("3 unread"); inside an icon-only trigger, mark the badge `aria-hidden` and fold the count into the trigger\'s `aria-label`.',
945
952
  "A badge overlapping a corner of another surface takes `ring` so a 2px `background`-coloured ring separates it from what's beneath; set it only where the badge truly overlaps, and the page surface should be `background`.",
946
953
  ],
954
+ keywords: ["chip", "status", "label"],
947
955
  uses: ["icon", "pill", "spinner", "visually-hidden"],
948
956
  usedBy: ["data-grid-column-filter", "product-card"],
949
957
  },
@@ -1025,6 +1033,7 @@ export const docsManifest = {
1025
1033
  "Requires `ReducedMotionProvider`; under reduced motion it renders nothing (a static ring would read louder than the sweep it replaces), so don't add your own fallback border.",
1026
1034
  'Use it as an attention / "try me" cue on an idle surface, not a loading state - content placeholders want `Skeleton`, and a periodic liveness flick wants `Shine`.',
1027
1035
  ],
1036
+ keywords: [],
1028
1037
  uses: ["fade-overlay"],
1029
1038
  usedBy: [],
1030
1039
  },
@@ -1033,7 +1042,7 @@ export const docsManifest = {
1033
1042
  module: "components/box",
1034
1043
  title: "Box",
1035
1044
  category: "layout",
1036
- description: "The escape hatch: a raw host element with a `className`, still checked for\ntokens-only classes. Box renders the chosen {@link LayoutElement} with no\nlayout opinions of its own (no margin, width, or padding, unlike Container),\nso it suits decorative wrappers that a styled primitive would visually break. Reach for it only when no styled primitive fits; the\n`className` you pass is governed by the same tokens-only scan as everything\nelse. RSC-safe.",
1045
+ description: "The escape hatch: a raw host element with a `className`, still checked for\ntokens-only classes. Box renders the chosen `LayoutElement` with no\nlayout opinions of its own (no margin, width, or padding, unlike Container),\nso it suits decorative wrappers that a styled primitive would visually break. Reach for it only when no styled primitive fits; the\n`className` you pass is governed by the same tokens-only scan as everything\nelse. RSC-safe.",
1037
1046
  exports: [
1038
1047
  {
1039
1048
  name: "Box",
@@ -1043,7 +1052,7 @@ export const docsManifest = {
1043
1052
  name: "as",
1044
1053
  type: '"div" | "article" | "aside" | "figcaption" | "figure" | "footer" | "header" | "li" | "main" | "nav" | "ol" | "section" | "span" | "ul"',
1045
1054
  required: false,
1046
- description: 'Render as a different host element from the closed layout vocabulary\n({@link LayoutElement}). The set is deliberately closed: `as="button"` is a\ntype error, because the design-system answer is the Button component. Event handlers\nand the ref accept any host element.\n\n`as` and `render` are mutually exclusive; if both are passed, `render`\nwins (a dev-only warning fires).',
1055
+ description: 'Render as a different host element from the closed layout vocabulary\n(`LayoutElement`). The set is deliberately closed: `as="button"` is a\ntype error, because the design-system answer is the Button component. Event handlers\nand the ref accept any host element.\n\n`as` and `render` are mutually exclusive; if both are passed, `render`\nwins (a dev-only warning fires).',
1047
1056
  },
1048
1057
  {
1049
1058
  name: "ref",
@@ -1065,6 +1074,7 @@ export const docsManifest = {
1065
1074
  "`as` and `render` are mutually exclusive (`render` wins, dev-warned); `as` draws from the closed layout vocabulary.",
1066
1075
  "Use `as` to change the element (a tag); use `render` only to swap in a component (e.g. a router Link). Never `render={<Box as=…/>}` - pass `as` directly.",
1067
1076
  ],
1077
+ keywords: [],
1068
1078
  uses: [],
1069
1079
  usedBy: [
1070
1080
  "mega-menu",
@@ -1133,6 +1143,7 @@ export const docsManifest = {
1133
1143
  'Render router links via `<BreadcrumbLink render={<Link href="…" />}>` with a framework `<Link>` - the bare default is an `<a>`.',
1134
1144
  "Collapse overflow with `BreadcrumbEllipsis` hosting a menu of the hidden crumbs, rather than dropping items silently.",
1135
1145
  ],
1146
+ keywords: [],
1136
1147
  uses: ["center", "flex", "icon", "visually-hidden"],
1137
1148
  usedBy: [],
1138
1149
  anatomy: {
@@ -1355,6 +1366,7 @@ export const docsManifest = {
1355
1366
  "`loading` keeps the button focusable while it blocks presses, so focus stays put across a submit; a plain `disabled` button leaves the tab order.",
1356
1367
  'Reach for `emphasis="ghost"`/`"link"` in toolbars/headers - they carry `data-edge-comp` so containers can pull them flush to the edge.',
1357
1368
  ],
1369
+ keywords: [],
1358
1370
  uses: ["center", "dot", "icon", "spinner"],
1359
1371
  usedBy: [
1360
1372
  "alert-dialog",
@@ -1452,6 +1464,7 @@ export const docsManifest = {
1452
1464
  "Use `ButtonGroup` to visually join related `Button`s (plus `Input`/`Select`/`DropdownMenu`); for one/many *selection* state reach for `ToggleGroup`.",
1453
1465
  "The `segmented` variant owns the border/background/shadow and defaults `dividers` on, while `joined` (default) lets each child draw its own - don't mix the two.",
1454
1466
  ],
1467
+ keywords: [],
1455
1468
  uses: ["separator"],
1456
1469
  usedBy: ["quantity-control"],
1457
1470
  },
@@ -1478,6 +1491,7 @@ export const docsManifest = {
1478
1491
  "Restrict selectable dates with react-day-picker matchers (`disabled`/`hidden`/`startMonth`/`endMonth`), not by filtering after the user clicks.",
1479
1492
  "Use `Calendar` for an inline date grid; for a compact click-to-open date field, wrap it in a `Popover` behind a `Button`/`Input` trigger.",
1480
1493
  ],
1494
+ keywords: ["date picker", "datepicker", "date"],
1481
1495
  uses: ["button", "icon"],
1482
1496
  usedBy: [],
1483
1497
  },
@@ -1578,6 +1592,7 @@ export const docsManifest = {
1578
1592
  "Pass `shadow={false}` when stacking cards on a `muted`/shaded canvas - colour contrast separates them and per-card shadows read as noise.",
1579
1593
  "For a full-bleed media/CTA panel use an editorial composite (`EditorialCard`), not `Card` - `Card` is a neutral padded container, not a marketing surface.",
1580
1594
  ],
1595
+ keywords: [],
1581
1596
  uses: ["flex"],
1582
1597
  usedBy: ["attribute-card", "empty", "settings-card"],
1583
1598
  anatomy: {
@@ -1766,6 +1781,7 @@ export const docsManifest = {
1766
1781
  "Tune scroll behaviour via `opts` (Embla options like `loop`/`align`) and enable `wheelScroll`/`freeScroll` deliberately - free-scroll drops snap points, so pass `slideCount` if the dots miscount.",
1767
1782
  'Give a descriptive `aria-label` when the region isn\'t self-evidently "Carousel" (e.g. `"Product images"`).',
1768
1783
  ],
1784
+ keywords: ["slideshow", "gallery", "swiper"],
1769
1785
  uses: ["button", "flex"],
1770
1786
  usedBy: [],
1771
1787
  },
@@ -1784,7 +1800,7 @@ export const docsManifest = {
1784
1800
  name: "as",
1785
1801
  type: '"div" | "article" | "aside" | "figcaption" | "figure" | "footer" | "header" | "li" | "main" | "nav" | "ol" | "section" | "span" | "ul"',
1786
1802
  required: false,
1787
- description: 'Render as a different host element from the closed layout vocabulary\n({@link LayoutElement}). The set is deliberately closed: `as="button"` is a\ntype error, because the design-system answer is the Button component. Event handlers\nand the ref accept any host element.\n\n`as` and `render` are mutually exclusive; if both are passed, `render`\nwins (a dev-only warning fires).',
1803
+ description: 'Render as a different host element from the closed layout vocabulary\n(`LayoutElement`). The set is deliberately closed: `as="button"` is a\ntype error, because the design-system answer is the Button component. Event handlers\nand the ref accept any host element.\n\n`as` and `render` are mutually exclusive; if both are passed, `render`\nwins (a dev-only warning fires).',
1788
1804
  },
1789
1805
  {
1790
1806
  name: "inline",
@@ -1811,6 +1827,7 @@ export const docsManifest = {
1811
1827
  "`as`/`render` are mutually exclusive (`render` wins, dev-warned); use `inline` to center inline-level content without breaking the text flow.",
1812
1828
  "Use `as` to change the element (a tag); use `render` only to swap in a component (e.g. a router Link). Never `render={<Box as=…/>}` - pass `as` directly.",
1813
1829
  ],
1830
+ keywords: [],
1814
1831
  uses: [],
1815
1832
  usedBy: [
1816
1833
  "avatar",
@@ -1964,6 +1981,7 @@ export const docsManifest = {
1964
1981
  "Colour every series through `config` (`{ desktop: { label, color } }`) and reference `var(--color-<key>)` on the marks - never hardcode a hex on a `Bar` / `Line`; that keeps light/dark theming and the legend/tooltip swatches in sync.",
1965
1982
  "Reach for `Chart` only to render a recharts data visualization; for a static value + delta use `Stat`, and for a progress bar use `Progress`.",
1966
1983
  ],
1984
+ keywords: ["graph", "plot", "visualisation", "visualization"],
1967
1985
  uses: ["center", "flex", "grid"],
1968
1986
  usedBy: [],
1969
1987
  anatomy: {
@@ -2028,6 +2046,7 @@ export const docsManifest = {
2028
2046
  "Controlled use needs `checked` + `onCheckedChange` together; passing only `checked` freezes the box - use `defaultChecked` for uncontrolled.",
2029
2047
  "For a selectable card or a label+description row, reach for `CheckboxCardGroup`/`CheckboxField` instead of hand-laying-out around `Checkbox`.",
2030
2048
  ],
2049
+ keywords: [],
2031
2050
  uses: ["icon"],
2032
2051
  usedBy: ["checkbox-field", "data-grid", "document-list"],
2033
2052
  },
@@ -2202,6 +2221,7 @@ export const docsManifest = {
2202
2221
  "To control the set, give each card a `value`, drive `checkedValues` (a `string[]`) and toggle inside `onCheckedChange(value, checked)`; without `checkedValues` each card keeps its own `checked`/`defaultChecked`.",
2203
2222
  "Each card is one tab stop and toggles with Space; checkboxes don't rove, so Tab (not the arrow keys) moves between cards.",
2204
2223
  ],
2224
+ keywords: [],
2205
2225
  uses: ["center", "flex", "input-card"],
2206
2226
  usedBy: [],
2207
2227
  anatomy: {
@@ -2298,6 +2318,7 @@ export const docsManifest = {
2298
2318
  "Put helper text in `description` (linked via `aria-describedby`), not a separate sibling element the screen reader won't announce with the control.",
2299
2319
  '`size` accepts only `"xs"`/`"sm"`; for a full selectable card use `CheckboxCardGroup`, and render one `CheckboxField` per option for a set.',
2300
2320
  ],
2321
+ keywords: [],
2301
2322
  uses: ["checkbox", "grid", "label", "text"],
2302
2323
  usedBy: [],
2303
2324
  },
@@ -2331,6 +2352,7 @@ export const docsManifest = {
2331
2352
  "Use inline `Code` for identifiers/values in a sentence and `block` for multi-line snippets - `Kbd` is for keyboard keys, not code.",
2332
2353
  "`block` renders `<pre><code>` that scrolls horizontally; add `whitespace-pre-wrap` via `className` only when wrapping beats scrolling (long prose-like messages).",
2333
2354
  ],
2355
+ keywords: [],
2334
2356
  uses: [],
2335
2357
  usedBy: [],
2336
2358
  },
@@ -2373,6 +2395,7 @@ export const docsManifest = {
2373
2395
  "Compose `CollapsibleTrigger` + `CollapsibleContent` inside it - a bare child won't expand.",
2374
2396
  "Drive it uncontrolled with `defaultOpen`; only lift to `open`/`onOpenChange` when external state must sync (e.g. persisting the open panel).",
2375
2397
  ],
2398
+ keywords: ["disclosure", "show more", "expander"],
2376
2399
  uses: [],
2377
2400
  usedBy: [],
2378
2401
  anatomy: {
@@ -2444,6 +2467,7 @@ export const docsManifest = {
2444
2467
  "Values are HSL (`h` 0–360, `s`/`l` 0–100), not hex - convert at your storage boundary; a hex string won't position the handles.",
2445
2468
  "`onChange` fires on every pointer drag and arrow-key step - throttle persistence/network writes downstream rather than reacting to each intermediate value.",
2446
2469
  ],
2470
+ keywords: [],
2447
2471
  uses: [],
2448
2472
  usedBy: [],
2449
2473
  },
@@ -2544,6 +2568,7 @@ export const docsManifest = {
2544
2568
  "For lists in the hundreds+, pass `virtualization={{ enabled: true }}` so only visible rows mount instead of every option.",
2545
2569
  "Provide `items` as `{ label, value }[]` - the visible text comes from `label` while selection is tracked by `value`.",
2546
2570
  ],
2571
+ keywords: ["autocomplete", "typeahead", "searchable select"],
2547
2572
  uses: ["button", "flex", "icon"],
2548
2573
  usedBy: ["country-combobox"],
2549
2574
  },
@@ -2638,7 +2663,8 @@ export const docsManifest = {
2638
2663
  name: "showCloseButton",
2639
2664
  type: "boolean",
2640
2665
  required: false,
2641
- description: "Whether to show the dialog close button.",
2666
+ defaultValue: "false",
2667
+ description: "Whether to show the dialog close button. Off by default: the button sits\nover the search field, and Escape or a click outside closes the palette.",
2642
2668
  },
2643
2669
  {
2644
2670
  name: "contentProps",
@@ -2753,6 +2779,7 @@ export const docsManifest = {
2753
2779
  "Act on a choice with `CommandItem`'s `onClick`, which fires for a pointer click and for `Enter` on the highlighted item.",
2754
2780
  "A plain click-triggered action menu is `DropdownMenu`; a remembered selection is `Combobox`.",
2755
2781
  ],
2782
+ keywords: ["command palette", "spotlight", "cmd+k", "quick search"],
2756
2783
  uses: ["dialog", "flex", "icon"],
2757
2784
  usedBy: [],
2758
2785
  anatomy: {
@@ -2822,7 +2849,7 @@ export const docsManifest = {
2822
2849
  name: "as",
2823
2850
  type: '"div" | "article" | "aside" | "figcaption" | "figure" | "footer" | "header" | "li" | "main" | "nav" | "ol" | "section" | "span" | "ul"',
2824
2851
  required: false,
2825
- description: 'Render as a different host element from the closed layout vocabulary\n({@link LayoutElement}). The set is deliberately closed: `as="button"` is a\ntype error, because the design-system answer is the Button component. Event handlers\nand the ref accept any host element.\n\n`as` and `render` are mutually exclusive; if both are passed, `render`\nwins (a dev-only warning fires).',
2852
+ description: 'Render as a different host element from the closed layout vocabulary\n(`LayoutElement`). The set is deliberately closed: `as="button"` is a\ntype error, because the design-system answer is the Button component. Event handlers\nand the ref accept any host element.\n\n`as` and `render` are mutually exclusive; if both are passed, `render`\nwins (a dev-only warning fires).',
2826
2853
  },
2827
2854
  {
2828
2855
  name: "fluid",
@@ -2872,6 +2899,7 @@ export const docsManifest = {
2872
2899
  "`Container` constrains width and applies the page gutter; `Section` is the full-bleed vertical-rhythm band - nest a `Container` inside a `Section` when content must be both padded and centred.",
2873
2900
  "Fold a single band into one node with `space` (its `py`) instead of nesting a `Section`; pass `fluid` to drop the max-width.",
2874
2901
  ],
2902
+ keywords: [],
2875
2903
  uses: [],
2876
2904
  usedBy: [],
2877
2905
  },
@@ -2988,7 +3016,7 @@ export const docsManifest = {
2988
3016
  name: "dot",
2989
3017
  type: 'boolean | "neutral" | "brand" | "danger" | "warning" | "success" | "info"',
2990
3018
  required: false,
2991
- description: "Dot indicator at the start (takes precedence over icon): `true` for a neutral dot, or a {@link Tone} to tint it.",
3019
+ description: "Dot indicator at the start (takes precedence over icon): `true` for a neutral dot, or a `Tone` to tint it.",
2992
3020
  },
2993
3021
  {
2994
3022
  name: "icon",
@@ -3170,6 +3198,7 @@ export const docsManifest = {
3170
3198
  "Use `ContextMenu` for a right-click / long-press menu on a surface; a menu opened by clicking a button or trigger is a `DropdownMenu`.",
3171
3199
  "Wrap the target region in `ContextMenuTrigger` so the whole surface is right-clickable; use `ContextMenuCheckboxItem` / `ContextMenuRadioGroup` for stateful rows.",
3172
3200
  ],
3201
+ keywords: [],
3173
3202
  uses: ["icon", "menu-item"],
3174
3203
  usedBy: [],
3175
3204
  anatomy: {
@@ -3318,6 +3347,7 @@ export const docsManifest = {
3318
3347
  'Feed `value` an ISO alpha-2 code (`"US"`) or a full country name (`"United States"`) - both resolve - but `onValueChange` always returns the code.',
3319
3348
  "Don't pass `items`; `CountryCombobox` supplies the full country list itself. For a non-country searchable list, use the base `Combobox`.",
3320
3349
  ],
3350
+ keywords: [],
3321
3351
  uses: ["combobox"],
3322
3352
  usedBy: [],
3323
3353
  },
@@ -3392,6 +3422,7 @@ export const docsManifest = {
3392
3422
  "It is controlled-only - pass `value` (ISO 3166-1 alpha-2) and an `onChange`; there is no uncontrolled/`defaultValue` mode.",
3393
3423
  'Give each option an alpha-2 `value` (e.g. `"US"`) so the overlaid flag resolves; a globe placeholder shows when the code is empty/unknown.',
3394
3424
  ],
3425
+ keywords: [],
3395
3426
  uses: ["center", "icon", "input-group"],
3396
3427
  usedBy: ["phone-input"],
3397
3428
  },
@@ -3449,6 +3480,7 @@ export const docsManifest = {
3449
3480
  "Use this for read-only key/value metadata about one entity; for tabular rows of many records reach for `Table` or `DataGrid` instead.",
3450
3481
  "Turn on `showSeparators` when items are visually dense; leave it off inside a bordered `Card` where the container already frames them.",
3451
3482
  ],
3483
+ keywords: [],
3452
3484
  uses: ["grid"],
3453
3485
  usedBy: [],
3454
3486
  },
@@ -3501,7 +3533,7 @@ export const docsManifest = {
3501
3533
  type: "DialogContentSize",
3502
3534
  required: false,
3503
3535
  defaultValue: '"default"',
3504
- description: "Panel geometry; see {@link DialogContentSize}.",
3536
+ description: "Panel geometry; see `DialogContentSize`.",
3505
3537
  },
3506
3538
  ],
3507
3539
  },
@@ -3577,6 +3609,7 @@ export const docsManifest = {
3577
3609
  "A panel that slides in from a screen edge is a `Sheet` (or `Drawer` for a drag-to-dismiss bottom sheet), not a `Dialog`.",
3578
3610
  "Always render a `DialogTitle` (wrap in `sr-only` if visually hidden) so the modal is announced; `DialogContent` uses the 36px `--radius-modal` corner.",
3579
3611
  ],
3612
+ keywords: ["modal", "popup", "lightbox"],
3580
3613
  uses: ["button", "flex"],
3581
3614
  usedBy: ["command", "quick-view"],
3582
3615
  anatomy: {
@@ -3673,6 +3706,7 @@ export const docsManifest = {
3673
3706
  "Prefer the semantic `tone` (`success`/`warning`/`danger`/…) over a raw `color` so the dot tracks theme tokens; reserve `color` for swatches outside the palette.",
3674
3707
  "The dot is decorative - pair it with visible text or an `aria-label`; colour alone doesn't convey status to assistive tech.",
3675
3708
  ],
3709
+ keywords: [],
3676
3710
  uses: [],
3677
3711
  usedBy: [
3678
3712
  "avatar",
@@ -3746,6 +3780,7 @@ export const docsManifest = {
3746
3780
  "Pick a glyph by intent from `DOT_MATRIX_LOADERS` - don't invent ad-hoc names. Map product actions → names in one place.",
3747
3781
  "Pass `settled` when the op finished but narration is still on screen, so the slot stays in character without spinning forever.",
3748
3782
  ],
3783
+ keywords: [],
3749
3784
  uses: [],
3750
3785
  usedBy: [],
3751
3786
  },
@@ -3855,6 +3890,7 @@ export const docsManifest = {
3855
3890
  "Always render a `DrawerTitle` inside `DrawerContent` (sr-only if visually hidden) - the underlying primitive uses it for `aria-labelledby`.",
3856
3891
  "Pass `container` to scope the drawer and its scrim to a bounded element instead of the viewport (the mobile-nav overlay pattern).",
3857
3892
  ],
3893
+ keywords: ["bottom sheet"],
3858
3894
  uses: ["flex"],
3859
3895
  usedBy: ["mobile-navigation"],
3860
3896
  },
@@ -3971,7 +4007,7 @@ export const docsManifest = {
3971
4007
  name: "dot",
3972
4008
  type: 'boolean | "neutral" | "brand" | "danger" | "warning" | "success" | "info"',
3973
4009
  required: false,
3974
- description: "Dot indicator at the start (takes precedence over icon): `true` for a neutral dot, or a {@link Tone} to tint it.",
4010
+ description: "Dot indicator at the start (takes precedence over icon): `true` for a neutral dot, or a `Tone` to tint it.",
3975
4011
  },
3976
4012
  {
3977
4013
  name: "icon",
@@ -4154,6 +4190,7 @@ export const docsManifest = {
4154
4190
  "It's an actions / options menu, not a form control - to choose a value use `Select` (styled) or `Combobox` (searchable), not menu rows.",
4155
4191
  "Reach for `DropdownMenuCheckboxItem` / `DropdownMenuRadioItem` for stateful rows; `DropdownMenuContent` portals to the body.",
4156
4192
  ],
4193
+ keywords: [],
4157
4194
  uses: ["icon", "menu-item"],
4158
4195
  usedBy: [
4159
4196
  "data-grid-column-header",
@@ -4281,6 +4318,7 @@ export const docsManifest = {
4281
4318
  "Colour the curve with a `text-*` class (it strokes `currentColor`) and size it purely via `className` - the same primitive scales from a tiny preview to a full row.",
4282
4319
  "Always pass a meaningful `title` - it becomes the SVG `<title>`, the curve's only accessible name.",
4283
4320
  ],
4321
+ keywords: [],
4284
4322
  uses: [],
4285
4323
  usedBy: [],
4286
4324
  },
@@ -4385,6 +4423,7 @@ export const docsManifest = {
4385
4423
  'Use `Empty` for "no data / nothing here"; a failure the user can retry is an `ErrorState` (which composes `Empty`), so don\'t hand-roll a retry empty.',
4386
4424
  "Compose `EmptyHeader` › `EmptyMedia` + `EmptyTitle` + `EmptyDescription`, and put the call-to-action in `EmptyActions`.",
4387
4425
  ],
4426
+ keywords: [],
4388
4427
  uses: ["card", "flex", "heading", "icon", "icon-box", "stack", "text"],
4389
4428
  usedBy: ["empty-state", "error-state"],
4390
4429
  },
@@ -4439,6 +4478,7 @@ export const docsManifest = {
4439
4478
  "`ErrorBoundary` catches render crashes in a subtree - pair it with an `ErrorState` in `fallback` to show the failure; it renders nothing by default.",
4440
4479
  "It logs nothing itself - wire telemetry through `onError`, and offer recovery via the render-prop `fallback`'s `reset` callback.",
4441
4480
  ],
4481
+ keywords: [],
4442
4482
  uses: [],
4443
4483
  usedBy: [],
4444
4484
  },
@@ -4523,6 +4563,7 @@ export const docsManifest = {
4523
4563
  'Always pass an `aria-label` (e.g. "Expand row") - it\'s icon-only, so without one screen readers announce an unlabelled button.',
4524
4564
  "Drive the icon and `aria-expanded` with the `expanded` prop; set `expandedIcon`/`collapsedIcon` only to override the default Minus/Plus pair.",
4525
4565
  ],
4566
+ keywords: [],
4526
4567
  uses: [],
4527
4568
  usedBy: ["data-grid"],
4528
4569
  },
@@ -4564,6 +4605,7 @@ export const docsManifest = {
4564
4605
  "Set `collapsedHeight` in rem to a whole number of lines at the text's line height, so the cut lands between lines.",
4565
4606
  "Reach for `Collapsible` when the hidden part is separate content behind a labelled trigger rather than the rest of one passage.",
4566
4607
  ],
4608
+ keywords: [],
4567
4609
  uses: [],
4568
4610
  usedBy: [],
4569
4611
  },
@@ -4621,6 +4663,7 @@ export const docsManifest = {
4621
4663
  "It's the shared engine behind `BorderBeam` and `Shine` - prefer those named components for their specific looks; drop to `FadeOverlay` directly only for a new overlay effect.",
4622
4664
  "Needs `ReducedMotionProvider`; under reduced motion it renders only `children` (a static band would read louder than the animation), so the overlay doesn't appear.",
4623
4665
  ],
4666
+ keywords: [],
4624
4667
  uses: [],
4625
4668
  usedBy: ["border-beam", "shine"],
4626
4669
  },
@@ -4706,6 +4749,7 @@ export const docsManifest = {
4706
4749
  "Compose the documented parts (`FieldLabel`, `FieldContent`, `FieldError`, `FieldDescription`) around one control - the label's `htmlFor` and the control's `aria-describedby` are wired for you, so there are no ids to pass.",
4707
4750
  'Use `orientation="responsive"` for a label-beside-control that collapses to stacked on mobile, rather than duplicating the field per breakpoint.',
4708
4751
  ],
4752
+ keywords: [],
4709
4753
  uses: ["flex", "label"],
4710
4754
  usedBy: ["input", "input-group", "settings-card", "textarea"],
4711
4755
  anatomy: {
@@ -4760,7 +4804,7 @@ export const docsManifest = {
4760
4804
  name: "as",
4761
4805
  type: '"div" | "article" | "aside" | "figcaption" | "figure" | "footer" | "header" | "li" | "main" | "nav" | "ol" | "section" | "span" | "ul"',
4762
4806
  required: false,
4763
- description: 'Render as a different host element from the closed layout vocabulary\n({@link LayoutElement}). The set is deliberately closed: `as="button"` is a\ntype error, because the design-system answer is the Button component. Event handlers\nand the ref accept any host element.\n\n`as` and `render` are mutually exclusive; if both are passed, `render`\nwins (a dev-only warning fires).',
4807
+ description: 'Render as a different host element from the closed layout vocabulary\n(`LayoutElement`). The set is deliberately closed: `as="button"` is a\ntype error, because the design-system answer is the Button component. Event handlers\nand the ref accept any host element.\n\n`as` and `render` are mutually exclusive; if both are passed, `render`\nwins (a dev-only warning fires).',
4764
4808
  },
4765
4809
  {
4766
4810
  name: "direction",
@@ -4830,6 +4874,7 @@ export const docsManifest = {
4830
4874
  '`as` and `render` are mutually exclusive (`render` wins, dev-warned); `as` draws from the closed layout vocabulary, so `as="button"` is a type error (use `Button`).',
4831
4875
  "Use `as` to change the element (a tag); use `render` only to swap in a component (e.g. a router Link). Never `render={<Box as=…/>}` - pass `as` directly.",
4832
4876
  ],
4877
+ keywords: [],
4833
4878
  uses: [],
4834
4879
  usedBy: [
4835
4880
  "alert-dialog",
@@ -4968,6 +5013,7 @@ export const docsManifest = {
4968
5013
  "Drive variant switches by changing `src` - that triggers the built-in crossfade + shimmer; don't unmount/remount `GalleryImage` per variant or you lose the transition.",
4969
5014
  "Position `GalleryImage` inside a `relative` container with fixed dimensions - the surfaces are `absolute inset-0`, so an unsized parent collapses to zero height.",
4970
5015
  ],
5016
+ keywords: [],
4971
5017
  uses: [],
4972
5018
  usedBy: [],
4973
5019
  },
@@ -4992,7 +5038,7 @@ export const docsManifest = {
4992
5038
  name: "as",
4993
5039
  type: '"div" | "article" | "aside" | "figcaption" | "figure" | "footer" | "header" | "li" | "main" | "nav" | "ol" | "section" | "span" | "ul"',
4994
5040
  required: false,
4995
- description: 'Render as a different host element from the closed layout vocabulary\n({@link LayoutElement}). The set is deliberately closed: `as="button"` is a\ntype error, because the design-system answer is the Button component. Event handlers\nand the ref accept any host element.\n\n`as` and `render` are mutually exclusive; if both are passed, `render`\nwins (a dev-only warning fires).',
5041
+ description: 'Render as a different host element from the closed layout vocabulary\n(`LayoutElement`). The set is deliberately closed: `as="button"` is a\ntype error, because the design-system answer is the Button component. Event handlers\nand the ref accept any host element.\n\n`as` and `render` are mutually exclusive; if both are passed, `render`\nwins (a dev-only warning fires).',
4996
5042
  },
4997
5043
  {
4998
5044
  name: "columns",
@@ -5059,7 +5105,7 @@ export const docsManifest = {
5059
5105
  name: "as",
5060
5106
  type: '"div" | "article" | "aside" | "figcaption" | "figure" | "footer" | "header" | "li" | "main" | "nav" | "ol" | "section" | "span" | "ul"',
5061
5107
  required: false,
5062
- description: 'Render as a different host element from the closed layout vocabulary\n({@link LayoutElement}). The set is deliberately closed: `as="button"` is a\ntype error, because the design-system answer is the Button component. Ref\nand event-handler types remain the default element\'s (HTMLDivElement).\n\n`as` and `render` are mutually exclusive; if both are passed, `render`\nwins (a dev-only warning fires).',
5108
+ description: 'Render as a different host element from the closed layout vocabulary\n(`LayoutElement`). The set is deliberately closed: `as="button"` is a\ntype error, because the design-system answer is the Button component. Ref\nand event-handler types remain the default element\'s (HTMLDivElement).\n\n`as` and `render` are mutually exclusive; if both are passed, `render`\nwins (a dev-only warning fires).',
5063
5109
  },
5064
5110
  {
5065
5111
  name: "order",
@@ -5105,6 +5151,7 @@ export const docsManifest = {
5105
5151
  '`as` and `render` are mutually exclusive (`render` wins, dev-warned); `as` draws from the closed layout vocabulary, so `as="button"` is a type error (use `Button`).',
5106
5152
  "Use `as` to change the element (a tag); use `render` only to swap in a component (e.g. a router Link). Never `render={<Box as=…/>}` - pass `as` directly.",
5107
5153
  ],
5154
+ keywords: [],
5108
5155
  uses: [],
5109
5156
  usedBy: [
5110
5157
  "alert",
@@ -5146,7 +5193,7 @@ export const docsManifest = {
5146
5193
  name: "as",
5147
5194
  type: '"div" | "article" | "aside" | "figcaption" | "figure" | "footer" | "header" | "li" | "main" | "nav" | "ol" | "section" | "span" | "ul"',
5148
5195
  required: false,
5149
- description: 'Render as a different host element from the closed layout vocabulary\n({@link LayoutElement}). The set is deliberately closed: `as="button"` is a\ntype error, because the design-system answer is the Button component. Event handlers\nand the ref accept any host element.\n\n`as` and `render` are mutually exclusive; if both are passed, `render`\nwins (a dev-only warning fires).',
5196
+ description: 'Render as a different host element from the closed layout vocabulary\n(`LayoutElement`). The set is deliberately closed: `as="button"` is a\ntype error, because the design-system answer is the Button component. Event handlers\nand the ref accept any host element.\n\n`as` and `render` are mutually exclusive; if both are passed, `render`\nwins (a dev-only warning fires).',
5150
5197
  },
5151
5198
  {
5152
5199
  name: "gap",
@@ -5192,6 +5239,7 @@ export const docsManifest = {
5192
5239
  '`as` and `render` are mutually exclusive (`render` wins, dev-warned); `as` draws from the closed layout vocabulary, so `as="button"` is a type error (use `Button`).',
5193
5240
  "Use `as` to change the element (a tag); use `render` only to swap in a component (e.g. a router Link). Never `render={<Box as=…/>}` - pass `as` directly.",
5194
5241
  ],
5242
+ keywords: [],
5195
5243
  uses: [],
5196
5244
  usedBy: [],
5197
5245
  },
@@ -5242,6 +5290,7 @@ export const docsManifest = {
5242
5290
  "Set `level` (`h1`–`h6`) for the document outline and `size` for visual scale independently - don't pick a tag just to get a size; a small-looking heading can still be an `h2`.",
5243
5291
  "Keep one `h1` per page and don't skip levels for styling; use `size` (responsive-capable) to make a lower-level heading look larger.",
5244
5292
  ],
5293
+ keywords: ["title", "headline"],
5245
5294
  uses: [],
5246
5295
  usedBy: [
5247
5296
  "cookie-banner",
@@ -5354,6 +5403,7 @@ export const docsManifest = {
5354
5403
  "State is parent-controlled: pass `hovered`/`active` (plus `onMouseEnter`/`onClick`) - the dot grows and the ring pulses only in response; it tracks nothing itself.",
5355
5404
  "Always pass `label` - it's the button's `aria-label` and the hotspot's only accessible name; also mount `ReducedMotionProvider` so the pulse honours the OS motion setting.",
5356
5405
  ],
5406
+ keywords: [],
5357
5407
  uses: ["spinner"],
5358
5408
  usedBy: [],
5359
5409
  },
@@ -5391,6 +5441,7 @@ export const docsManifest = {
5391
5441
  "It opens on hover / focus only - never hide essential actions or content a touch / keyboard-only user can't otherwise reach behind it.",
5392
5442
  "Tune the trigger's `delay`/`closeDelay` (ms) instead of adding your own timers; `HoverCardContent` portals to the body.",
5393
5443
  ],
5444
+ keywords: [],
5394
5445
  uses: [],
5395
5446
  usedBy: [],
5396
5447
  },
@@ -5440,6 +5491,7 @@ export const docsManifest = {
5440
5491
  "`Icon` is always `aria-hidden` + non-focusable - pair it with visible text or give the interactive parent an `aria-label`; never rely on it to name a control.",
5441
5492
  'Size with the `size` token (`"sm"`,`"lg"`…), not `className="size-6"` - the scale maps to the shared `ComponentSize` steps other components align to.',
5442
5493
  ],
5494
+ keywords: [],
5443
5495
  uses: [],
5444
5496
  usedBy: [
5445
5497
  "accordion",
@@ -5558,6 +5610,7 @@ export const docsManifest = {
5558
5610
  "Set colour via `tone`, not a hex/`bg-*` className - `tone` carries the paired surface+foreground tokens, including the dark-mode variants.",
5559
5611
  "Let `iconSize` default from the box `size`; override only when the glyph must break the built-in `BOX_TO_ICON_SIZE` ratio.",
5560
5612
  ],
5613
+ keywords: [],
5561
5614
  uses: ["icon"],
5562
5615
  usedBy: ["empty", "item"],
5563
5616
  },
@@ -5608,6 +5661,7 @@ export const docsManifest = {
5608
5661
  "Pass a Lucide component to `icon` (e.g. `HomeIcon`), not a rendered element `<HomeIcon />` - it is handed to the internal `Icon` for consistent sizing/stroke.",
5609
5662
  "Use `IconCard` for compact icon-over-label option pickers (property type, category); for a content container with header/body reach for `Card`, and for a settings row use `SettingsCard`.",
5610
5663
  ],
5664
+ keywords: [],
5611
5665
  uses: ["center", "icon"],
5612
5666
  usedBy: [],
5613
5667
  },
@@ -5677,6 +5731,7 @@ export const docsManifest = {
5677
5731
  "Use it as the animated drop-in for `Icon`; for a plain static glyph stay on `Icon` and skip the extra `AnimatePresence`/motion cost.",
5678
5732
  "Needs `ReducedMotionProvider` for the blur-crossfade to run and honour reduced motion; like `Icon` it renders `aria-hidden`, so name the control elsewhere.",
5679
5733
  ],
5734
+ keywords: [],
5680
5735
  uses: ["icon"],
5681
5736
  usedBy: ["thinking-loader"],
5682
5737
  },
@@ -5751,6 +5806,7 @@ export const docsManifest = {
5751
5806
  "Position this over the exact identified bounds inside a relative container; inflate the bounds outside this component when the source geometry is smaller than a comfortable pointer target.",
5752
5807
  "Pair it with a real button or link. This component is deliberately pointer-transparent and carries no interaction semantics of its own.",
5753
5808
  ],
5809
+ keywords: [],
5754
5810
  uses: [],
5755
5811
  usedBy: [],
5756
5812
  },
@@ -5818,6 +5874,7 @@ export const docsManifest = {
5818
5874
  "Give every `Input` an associated label - inside a `Field` a `FieldLabel` targets it with no ids to wire; standalone, point a `Label`'s `htmlFor` at its `id`. A placeholder is not an accessible name.",
5819
5875
  '`size` defaults to `"xl"` (48px); pass a responsive object like `{ base: "sm", md: "xl" }` rather than swapping components per breakpoint.',
5820
5876
  ],
5877
+ keywords: ["text field", "textbox", "text input"],
5821
5878
  uses: ["field"],
5822
5879
  usedBy: ["sidebar", "tag-selector"],
5823
5880
  },
@@ -5914,6 +5971,7 @@ export const docsManifest = {
5914
5971
  "Drive the selected look via the `selected` prop (it sets `data-selected` + the primary tint), not by appending your own active classes.",
5915
5972
  "Use `render` to project the card styling onto a real interactive element (e.g. a `<label>` wrapping an input) when you need native selection behaviour.",
5916
5973
  ],
5974
+ keywords: [],
5917
5975
  uses: ["icon"],
5918
5976
  usedBy: ["checkbox-card", "radio-card"],
5919
5977
  },
@@ -6198,6 +6256,7 @@ export const docsManifest = {
6198
6256
  "Set `size`/`radius`/`disabled` once on `InputGroup`; children inherit them via context, so don't re-set them per child.",
6199
6257
  "Inside a `Field` the group inherits invalid state and its `InputGroupInput`/`InputGroupTextarea` becomes the field's control (labelled, described, `aria-invalid`) - pass `hasError` only to force error styling and `aria-invalid` independently.",
6200
6258
  ],
6259
+ keywords: [],
6201
6260
  uses: ["button", "field", "flex", "icon", "textarea"],
6202
6261
  usedBy: ["country-select", "search-input"],
6203
6262
  anatomy: {
@@ -6262,6 +6321,7 @@ export const docsManifest = {
6262
6321
  'Characters are filtered by `validationType` (`"numeric"` by default; `"alpha"`, `"alphanumeric"` and `"none"` are also available) - pass `"alphanumeric"` for codes that contain letters.',
6263
6322
  "Split slots into `InputOTPGroup`s with an `InputOTPSeparator` between them for visual grouping only - it does not change the underlying value.",
6264
6323
  ],
6324
+ keywords: [],
6265
6325
  uses: ["flex", "icon"],
6266
6326
  usedBy: [],
6267
6327
  },
@@ -6430,6 +6490,7 @@ export const docsManifest = {
6430
6490
  "Use `render` to make the whole item a link/button (e.g. `render={<Link href=\"…\" />}`); the item's children become the link's content.",
6431
6491
  "Reach for `Item` for generic single rows; for files/documents use `DocumentList`, and for term/value metadata use `DescriptionList`.",
6432
6492
  ],
6493
+ keywords: [],
6433
6494
  uses: ["flex", "icon-box", "separator", "stack"],
6434
6495
  usedBy: [],
6435
6496
  anatomy: {
@@ -6544,6 +6605,7 @@ export const docsManifest = {
6544
6605
  "Wrap multi-key chords in `KbdGroup` and set `size` on the group - children inherit it via context, so you size the combo once.",
6545
6606
  "It renders a semantic `<kbd>`; reserve it for keyboard keys/shortcuts, not as a generic small-label chip (that's `Badge`).",
6546
6607
  ],
6608
+ keywords: ["keyboard shortcut", "hotkey"],
6547
6609
  uses: [],
6548
6610
  usedBy: ["menu-item", "prompt-panel", "search-input", "sidebar"],
6549
6611
  },
@@ -6564,6 +6626,7 @@ export const docsManifest = {
6564
6626
  "Point `htmlFor` at the control's `id` so clicking the label focuses/toggles it; a `Label` with no association is just styled text.",
6565
6627
  "For checkbox/radio rows and fields, prefer `CheckboxField`/`FieldLabel`/`RadioGroupItem`, which generate the `id`/`htmlFor` pairing for you.",
6566
6628
  ],
6629
+ keywords: [],
6567
6630
  uses: [],
6568
6631
  usedBy: [
6569
6632
  "checkbox-field",
@@ -6688,6 +6751,7 @@ export const docsManifest = {
6688
6751
  "`search` may reject; the dropdown then shows no suggestions. Return `null` from `resolve` to ignore a selection.",
6689
6752
  'Pick `mode="city"` vs `"address"` to scope the geocoding; drive it controlled via the `Location` `value` + `onChange` (which also fires on clear).',
6690
6753
  ],
6754
+ keywords: [],
6691
6755
  uses: ["button", "icon", "menu-item"],
6692
6756
  usedBy: [],
6693
6757
  },
@@ -6731,6 +6795,7 @@ export const docsManifest = {
6731
6795
  'Don\'t add your own `aria-label`/`role` - `Logo` already ships `role="img"` + "Material Bank" (change the name with `label`); wrap it in a link only when you need a click target.',
6732
6796
  "To use your own brand, pass `mark` as SVG shapes in a 48x48 viewBox filled with `currentColor`, and a matching `label` - don't wrap or overlay the default mark.",
6733
6797
  ],
6798
+ keywords: [],
6734
6799
  uses: [],
6735
6800
  usedBy: ["logotype", "mobile-navigation"],
6736
6801
  },
@@ -6767,6 +6832,7 @@ export const docsManifest = {
6767
6832
  'Don\'t add your own `aria-label`/`role` - `Logotype` already ships `role="img"` + "Material Bank"; wrap it in a link only when you need a click target, and set `label=""` when the name is already visible beside it.',
6768
6833
  "Use `Logo` where only the mark fits, such as an app icon or a collapsed sidebar; use `Logotype` where the name should be read.",
6769
6834
  ],
6835
+ keywords: [],
6770
6836
  uses: ["logo"],
6771
6837
  usedBy: [],
6772
6838
  },
@@ -6818,6 +6884,7 @@ export const docsManifest = {
6818
6884
  "It only scrolls when the text overflows; short text that fits\nstays a static clipped label with no duplicate copy and no animation.",
6819
6885
  "Honours `prefers-reduced-motion` automatically via the shared\n`.animate-marquee` utility, which disables the animation.",
6820
6886
  ],
6887
+ keywords: [],
6821
6888
  uses: ["flex"],
6822
6889
  usedBy: ["product-card"],
6823
6890
  },
@@ -6836,7 +6903,7 @@ export const docsManifest = {
6836
6903
  name: "as",
6837
6904
  type: '"div" | "article" | "aside" | "figcaption" | "figure" | "footer" | "header" | "li" | "main" | "nav" | "ol" | "section" | "span" | "ul"',
6838
6905
  required: false,
6839
- description: 'Render as a different host element from the closed layout vocabulary\n({@link LayoutElement}). The set is deliberately closed: `as="button"` is a\ntype error, because the design-system answer is the Button component. Ref\nand event-handler types remain the default element\'s.\n\n`as` and `render` are mutually exclusive; if both are passed, `render`\nwins (a dev-only warning fires).',
6906
+ description: 'Render as a different host element from the closed layout vocabulary\n(`LayoutElement`). The set is deliberately closed: `as="button"` is a\ntype error, because the design-system answer is the Button component. Ref\nand event-handler types remain the default element\'s.\n\n`as` and `render` are mutually exclusive; if both are passed, `render`\nwins (a dev-only warning fires).',
6840
6907
  },
6841
6908
  {
6842
6909
  name: "edge",
@@ -6891,6 +6958,7 @@ export const docsManifest = {
6891
6958
  "Set `edge` to frame photography with an inset hairline that stays above the media; do not fake it with a border or an inset shadow on the frame, which the media hides.",
6892
6959
  "Reach for `raised` only when the frame sits on the same fill as its surface; in a dense row the edge already separates it.",
6893
6960
  ],
6961
+ keywords: [],
6894
6962
  uses: [],
6895
6963
  usedBy: ["editorial-card", "product-card"],
6896
6964
  },
@@ -7012,7 +7080,7 @@ export const docsManifest = {
7012
7080
  name: "dot",
7013
7081
  type: 'boolean | "neutral" | "brand" | "danger" | "warning" | "success" | "info" | undefined',
7014
7082
  required: false,
7015
- description: "Dot indicator at the start, centred in the icon space (takes precedence over icon): `true` for a neutral dot, or a {@link Tone} to tint it.",
7083
+ description: "Dot indicator at the start, centred in the icon space (takes precedence over icon): `true` for a neutral dot, or a `Tone` to tint it.",
7016
7084
  },
7017
7085
  {
7018
7086
  name: "icon",
@@ -7079,6 +7147,7 @@ export const docsManifest = {
7079
7147
  "`MenuItem` is the standalone base for custom menus (popovers, sheets); inside a `DropdownMenu` / `ContextMenu` use that family's `*Item` for built-in roving focus.",
7080
7148
  "Pass glyphs via the `icon` / `dot` / `avatar` / `kbd` / `suffixIcon` props, not as children - with `render` they render around `children`, which is the label only.",
7081
7149
  ],
7150
+ keywords: [],
7082
7151
  uses: ["center", "dot", "icon", "kbd", "radio", "spinner"],
7083
7152
  usedBy: [
7084
7153
  "context-menu",
@@ -7210,7 +7279,7 @@ export const docsManifest = {
7210
7279
  name: "dot",
7211
7280
  type: 'boolean | "neutral" | "brand" | "danger" | "warning" | "success" | "info"',
7212
7281
  required: false,
7213
- description: "Dot indicator at the start (takes precedence over icon): `true` for a neutral dot, or a {@link Tone} to tint it.",
7282
+ description: "Dot indicator at the start (takes precedence over icon): `true` for a neutral dot, or a `Tone` to tint it.",
7214
7283
  },
7215
7284
  {
7216
7285
  name: "icon",
@@ -7403,6 +7472,7 @@ export const docsManifest = {
7403
7472
  "Reserve `Menubar` for a persistent desktop app menu bar; a single click menu is `DropdownMenu`, a right-click menu is `ContextMenu`.",
7404
7473
  "Give each top-level label its own `MenubarMenu`, and control a menu's open state on that `MenubarMenu` (`open`/`onOpenChange`) rather than on the bar.",
7405
7474
  ],
7475
+ keywords: [],
7406
7476
  uses: ["icon", "menu-item"],
7407
7477
  usedBy: [],
7408
7478
  anatomy: {
@@ -7578,6 +7648,7 @@ export const docsManifest = {
7578
7648
  'Enable the "I\'m not sure" escape hatch with `showUnsure` (off by default); `"unsure"`/`"beyond"` only ever arrive when their toggles are shown.',
7579
7649
  'Bound the range with `yearsAhead` (from the current year); it auto-advances and commits once both month and year are chosen, so don\'t add your own "next" control.',
7580
7650
  ],
7651
+ keywords: ["date picker", "date", "month", "year"],
7581
7652
  uses: ["flex", "grid", "text", "toggle"],
7582
7653
  usedBy: [],
7583
7654
  },
@@ -7716,6 +7787,7 @@ export const docsManifest = {
7716
7787
  "Pass the trigger's `borderRadius` / `boxShadow` via `style` (not `className`) on `MorphDialogTrigger` so Motion can correct their distortion during the morph.",
7717
7788
  "Render a `MorphDialogTitle` (use `visuallyHidden` if needed) for the accessible name; mount `ReducedMotionProvider` at the app root since it animates via `m.*`.",
7718
7789
  ],
7790
+ keywords: [],
7719
7791
  uses: [],
7720
7792
  usedBy: [],
7721
7793
  },
@@ -7743,6 +7815,7 @@ export const docsManifest = {
7743
7815
  "It's required app-side, not inside",
7744
7816
  'Rely on it (not per-component code) for reduced motion: its `MotionConfig reducedMotion="user"` honours the OS setting for all descendants.',
7745
7817
  ],
7818
+ keywords: [],
7746
7819
  uses: [],
7747
7820
  usedBy: [],
7748
7821
  },
@@ -7774,6 +7847,7 @@ export const docsManifest = {
7774
7847
  "Reach for `NativeSelect` when the native mobile picker and zero-JS behaviour matter; use `Select` when you need custom-rendered option content or styling.",
7775
7848
  "It has no built-in label - associate a `Label` via `htmlFor`/`id` for an accessible name.",
7776
7849
  ],
7850
+ keywords: ["dropdown", "picker"],
7777
7851
  uses: ["icon"],
7778
7852
  usedBy: [],
7779
7853
  },
@@ -7911,6 +7985,7 @@ export const docsManifest = {
7911
7985
  "Reserve `NavigationMenu` for site/section navigation with panels; a click actions menu is `DropdownMenu`, a desktop app menu bar is `Menubar`, and simple in-page routed tabs are `TabNavigation`.",
7912
7986
  "Keep it uncontrolled unless you must drive it; leave `viewport` on unless you render your own `NavigationMenuViewport` (e.g. to place a `NavigationMenuIndicator` in it).",
7913
7987
  ],
7988
+ keywords: [],
7914
7989
  uses: ["icon"],
7915
7990
  usedBy: [],
7916
7991
  anatomy: {
@@ -8034,6 +8109,7 @@ export const docsManifest = {
8034
8109
  "It is data-source agnostic (not coupled to react-table); for grid paging use the DataGrid's own pagination parts instead.",
8035
8110
  "Signal an in-flight jump with `loadingPage={n}` so only that button spins; leave a11y labels to the component (each control is pre-labelled).",
8036
8111
  ],
8112
+ keywords: [],
8037
8113
  uses: ["button", "center", "flex"],
8038
8114
  usedBy: [],
8039
8115
  },
@@ -8123,6 +8199,7 @@ export const docsManifest = {
8123
8199
  'Set `defaultCountry` (ISO alpha-2, default `"US"`) for the initial calling code; the integrated country selector then lets users switch.',
8124
8200
  "Validate the emitted E.164 value (e.g. via react-phone-number-input's `isValidPhoneNumber`) rather than regex-matching the display text.",
8125
8201
  ],
8202
+ keywords: [],
8126
8203
  uses: ["country-select"],
8127
8204
  usedBy: [],
8128
8205
  },
@@ -8241,6 +8318,7 @@ export const docsManifest = {
8241
8318
  "Don't reach for `Pill` in app code - it's the shared styling base; use `Badge` for display-only labels/counts and `Tag` for interactive (clickable/dismissible) chips.",
8242
8319
  "`Pill` is presentation-only and has no button semantics or dismiss/click handling - those live on `Tag`; adding `onClick` here yields a non-accessible pseudo-button.",
8243
8320
  ],
8321
+ keywords: ["chip"],
8244
8322
  uses: [],
8245
8323
  usedBy: ["badge", "tag", "tag-selector"],
8246
8324
  },
@@ -8294,6 +8372,7 @@ export const docsManifest = {
8294
8372
  bestPractices: [
8295
8373
  "Use for inline chat / agent waits. Prefer ThinkingLoader when you have narrated steps; ThinkingOrb for avatar-scale state; DotMatrixLoader for prompt-bar intent glyphs.",
8296
8374
  ],
8375
+ keywords: [],
8297
8376
  uses: ["grid", "text"],
8298
8377
  usedBy: [],
8299
8378
  },
@@ -8373,6 +8452,7 @@ export const docsManifest = {
8373
8452
  "It's non-modal by default (`modal={false}`) so the page stays interactive - pass `modal` only when you must trap focus and block the background.",
8374
8453
  "`PopoverContent` portals to the body; anchor to a non-trigger element with its `anchor` prop.",
8375
8454
  ],
8455
+ keywords: ["popup", "flyout", "popout"],
8376
8456
  uses: [],
8377
8457
  usedBy: ["color-palette", "mega-menu", "product-card", "tag-selector"],
8378
8458
  anatomy: {
@@ -8478,6 +8558,7 @@ export const docsManifest = {
8478
8558
  "For a ring instead of a bar use `ProgressCircle` - it needs an explicit `label` for its native `<progress>` accessible name.",
8479
8559
  "Mount `ReducedMotionProvider` at the app root - the indeterminate bar slides via `m.*` (LazyMotion).",
8480
8560
  ],
8561
+ keywords: [],
8481
8562
  uses: ["center"],
8482
8563
  usedBy: ["file-upload"],
8483
8564
  },
@@ -8530,6 +8611,7 @@ export const docsManifest = {
8530
8611
  "Pass `onDotClick` only when steps are navigable - it turns each dot into a focusable button; `labels` surface as hover tooltips.",
8531
8612
  "Mount `ReducedMotionProvider` at the app root - the dots animate via `m.*` (LazyMotion).",
8532
8613
  ],
8614
+ keywords: [],
8533
8615
  uses: ["flex", "tooltip"],
8534
8616
  usedBy: [],
8535
8617
  },
@@ -8613,6 +8695,7 @@ export const docsManifest = {
8613
8695
  "It's controlled - pass the current `value` and update it in `onIncrement`/`onDecrement`, which fire once per step for clicks, arrow keys and each repeat of a held button. Typing a number is not supported.",
8614
8696
  "Tab focuses the quantity itself (the stepper buttons are skipped, as in any number field), announced by its `label`. In a list of lines, pass a `label` naming the item so each field is told apart.",
8615
8697
  ],
8698
+ keywords: ["counter", "number input", "increment", "spinbutton"],
8616
8699
  uses: ["button", "button-group"],
8617
8700
  usedBy: [],
8618
8701
  },
@@ -8652,6 +8735,7 @@ export const docsManifest = {
8652
8735
  "Give every `Radio` a unique `value` and pair it with a `Label` - or use `RadioGroupItem`, which bundles the radio and its wired label.",
8653
8736
  "For selectable-card options rather than plain dots, use `RadioCardGroup`.",
8654
8737
  ],
8738
+ keywords: [],
8655
8739
  uses: [],
8656
8740
  usedBy: ["menu-item", "radio-card", "radio-group"],
8657
8741
  },
@@ -8793,6 +8877,7 @@ export const docsManifest = {
8793
8877
  'Drive selection with `value`/`onValueChange` (controlled) or `defaultValue` (uncontrolled); use `layout="inline"` for a wrapping row instead of the stacked grid.',
8794
8878
  "Label the group (e.g. `aria-label` or a `Field` with a `FieldLabel`) - Tab lands on the selected card and the arrow keys move between cards.",
8795
8879
  ],
8880
+ keywords: [],
8796
8881
  uses: ["center", "flex", "input-card", "radio"],
8797
8882
  usedBy: ["product-specifications-selector"],
8798
8883
  },
@@ -8844,6 +8929,7 @@ export const docsManifest = {
8844
8929
  "Drive selection with `value` + `onValueChange` (controlled) or `defaultValue` (uncontrolled) - don't set both on the same group.",
8845
8930
  "Prefer `RadioGroupItem` (radio + wired `Label`) over hand-pairing `Radio` and `Label`; it auto-generates the `id`/`htmlFor` link.",
8846
8931
  ],
8932
+ keywords: [],
8847
8933
  uses: ["flex", "grid", "label", "radio", "text"],
8848
8934
  usedBy: [],
8849
8935
  },
@@ -8890,6 +8976,7 @@ export const docsManifest = {
8890
8976
  "Render several in a vertical list and give it an accessible grouping (e.g. `aria-live` region) so screen readers announce requirements flipping to met.",
8891
8977
  "Reach for `RequirementItem` for pass/fail checklist rows; for a generic list row use `Item`, and for form field errors use the field's own error message.",
8892
8978
  ],
8979
+ keywords: [],
8893
8980
  uses: ["flex", "icon"],
8894
8981
  usedBy: [],
8895
8982
  },
@@ -8956,6 +9043,7 @@ export const docsManifest = {
8956
9043
  "Compose `ResizablePanel` children separated by `ResizableHandle` - a handle between panels is what makes them draggable.",
8957
9044
  "Set the axis with `direction` (`horizontal`/`vertical`); it maps to the library's `orientation`, which is intentionally not exposed.",
8958
9045
  ],
9046
+ keywords: [],
8959
9047
  uses: ["center", "icon"],
8960
9048
  usedBy: [],
8961
9049
  anatomy: {
@@ -9026,6 +9114,7 @@ export const docsManifest = {
9026
9114
  "`Scrim` is a decorative gradient for text-over-image legibility, not a modal backdrop - dialog / sheet dimming is built into those components.",
9027
9115
  "Place it inside a `position: relative` ancestor; it renders `aria-hidden` and ignores pointer events, so it never blocks the content beneath.",
9028
9116
  ],
9117
+ keywords: [],
9029
9118
  uses: [],
9030
9119
  usedBy: [],
9031
9120
  },
@@ -9049,7 +9138,7 @@ export const docsManifest = {
9049
9138
  name: "as",
9050
9139
  type: '"div" | "article" | "aside" | "figcaption" | "figure" | "footer" | "header" | "li" | "main" | "nav" | "ol" | "section" | "span" | "ul"',
9051
9140
  required: false,
9052
- description: 'Render as a different host element from the closed layout vocabulary\n({@link LayoutElement}). The set is deliberately closed: `as="button"` is a\ntype error, because the design-system answer is the Button component. Ref\nand event-handler types remain the default element\'s.\n\n`as` and `render` are mutually exclusive; if both are passed, `render`\nwins (a dev-only warning fires).',
9141
+ description: 'Render as a different host element from the closed layout vocabulary\n(`LayoutElement`). The set is deliberately closed: `as="button"` is a\ntype error, because the design-system answer is the Button component. Ref\nand event-handler types remain the default element\'s.\n\n`as` and `render` are mutually exclusive; if both are passed, `render`\nwins (a dev-only warning fires).',
9053
9142
  },
9054
9143
  {
9055
9144
  name: "allowOverflow",
@@ -9094,6 +9183,7 @@ export const docsManifest = {
9094
9183
  "`ScrollArea` renders its own `ScrollBar`; reach for `ScrollBar` directly only when hand-composing a Base UI scroll area.",
9095
9184
  "Use `as` to change the element (a tag); use `render` only to swap in a component (e.g. a router Link). Never `render={<Box as=…/>}` - pass `as` directly.",
9096
9185
  ],
9186
+ keywords: [],
9097
9187
  uses: [],
9098
9188
  usedBy: [
9099
9189
  "data-grid",
@@ -9153,6 +9243,7 @@ export const docsManifest = {
9153
9243
  "Match `theme` to the container's actual background (`card`/`popover`/…) - the scrim fades to that colour, so a mismatch leaves a visible seam.",
9154
9244
  'Set `position` (`start`/`end`) and `orientation` to the edge with hidden content - `end`+`vertical` is the common "more below" bottom fade.',
9155
9245
  ],
9246
+ keywords: [],
9156
9247
  uses: [],
9157
9248
  usedBy: ["scroll-frame", "segmented-control", "tag-selector"],
9158
9249
  },
@@ -9267,6 +9358,7 @@ export const docsManifest = {
9267
9358
  'Match `fadeTheme` to the surface behind the frame (`card` inside a Card). Over an image or a blur, use `fadeMode="mask"` instead.',
9268
9359
  "For a horizontal strip used with a mouse, add `dragScroll` and `controls`; both stand aside on touch screens, and each control hides at the end it points to.",
9269
9360
  ],
9361
+ keywords: [],
9270
9362
  uses: ["button", "scroll-area", "scroll-fade"],
9271
9363
  usedBy: ["page-toolbar"],
9272
9364
  },
@@ -9370,6 +9462,7 @@ export const docsManifest = {
9370
9462
  "Pass cycling placeholder ideas via `suggestions` (which suppresses the static `placeholder`); `shortcutHint` shows only while empty and is swapped for the clear button once the field has a value.",
9371
9463
  'Pill (`radius="full"`) at the 48px `xl` default is the search signature - so leave both defaults alone in standard search/filter placements; pass `size` explicitly for compact embedded contexts (popovers, table headers).',
9372
9464
  ],
9465
+ keywords: [],
9373
9466
  uses: ["flex", "grid", "input-group", "kbd"],
9374
9467
  usedBy: [],
9375
9468
  },
@@ -9388,7 +9481,7 @@ export const docsManifest = {
9388
9481
  name: "as",
9389
9482
  type: '"div" | "article" | "aside" | "figcaption" | "figure" | "footer" | "header" | "li" | "main" | "nav" | "ol" | "section" | "span" | "ul"',
9390
9483
  required: false,
9391
- description: 'Render as a different host element from the closed layout vocabulary\n({@link LayoutElement}). The set is deliberately closed: `as="button"` is a\ntype error, because the design-system answer is the Button component. Event handlers\nand the ref accept any host element.\n\n`as` and `render` are mutually exclusive; if both are passed, `render`\nwins (a dev-only warning fires).',
9484
+ description: 'Render as a different host element from the closed layout vocabulary\n(`LayoutElement`). The set is deliberately closed: `as="button"` is a\ntype error, because the design-system answer is the Button component. Event handlers\nand the ref accept any host element.\n\n`as` and `render` are mutually exclusive; if both are passed, `render`\nwins (a dev-only warning fires).',
9392
9485
  },
9393
9486
  {
9394
9487
  name: "inset",
@@ -9426,6 +9519,7 @@ export const docsManifest = {
9426
9519
  "`Section` is full-width (padding only, no max-width) - nest a `Container` inside when content should also be centred; use `Container` alone when you just need the width cap.",
9427
9520
  "Tune vertical rhythm with `space` (its `py`, default `base`); `as`/`render` are mutually exclusive with `render` winning (dev-warned).",
9428
9521
  ],
9522
+ keywords: [],
9429
9523
  uses: [],
9430
9524
  usedBy: [],
9431
9525
  },
@@ -9434,7 +9528,7 @@ export const docsManifest = {
9434
9528
  module: "components/segmented-control",
9435
9529
  title: "SegmentedControl",
9436
9530
  category: "forms",
9437
- description: "A single-select, always-one-selected control that switches between a small\nset of visible options - a view or mode switcher rendered as a pill of\nsegments. Built on Base UI ToggleGroup (single-select) but kept permanently\nselected: re-clicking the active segment never clears it.\n\nCompose it from {@link SegmentedControlItem}s; shared `size` / `fullWidth` /\nactive state flow to them through context. Controlled via `value`, or\nuncontrolled via `defaultValue`. Items scroll horizontally with a trailing\nfade hint when they overflow.",
9531
+ description: "A single-select, always-one-selected control that switches between a small\nset of visible options - a view or mode switcher rendered as a pill of\nsegments. Built on Base UI ToggleGroup (single-select) but kept permanently\nselected: re-clicking the active segment never clears it.\n\nCompose it from `SegmentedControlItem`s; shared `size` / `fullWidth` /\nactive state flow to them through context. Controlled via `value`, or\nuncontrolled via `defaultValue`. Items scroll horizontally with a trailing\nfade hint when they overflow.",
9438
9532
  exports: [
9439
9533
  {
9440
9534
  name: "SegmentedControl",
@@ -9533,6 +9627,7 @@ export const docsManifest = {
9533
9627
  "Switching visible content panels is Tabs; navigating URLs is TabNavigation - SegmentedControl is an input that selects a value or mode.",
9534
9628
  "Icon-only items must carry an `aria-label`.",
9535
9629
  ],
9630
+ keywords: [],
9536
9631
  uses: ["dot", "flex", "icon", "scroll-area", "scroll-fade"],
9537
9632
  usedBy: ["color-palette"],
9538
9633
  anatomy: {
@@ -9719,6 +9814,7 @@ export const docsManifest = {
9719
9814
  "Drive it with `value` + `onValueChange` (controlled) or `defaultValue` (uncontrolled), and give it an accessible name via the trigger (`Field`/`Label`).",
9720
9815
  "Pass `items` (a value-to-label map or `{ value, label }[]`) so the trigger shows the selected label even before the popup has mounted.",
9721
9816
  ],
9817
+ keywords: ["dropdown", "picker"],
9722
9818
  uses: ["button", "center", "icon", "menu-item"],
9723
9819
  usedBy: ["data-grid-pagination"],
9724
9820
  anatomy: {
@@ -9796,6 +9892,7 @@ export const docsManifest = {
9796
9892
  "It is announced as a separator by default - pass `aria-hidden` when the rule is purely decorative.",
9797
9893
  'For an inline rule set `orientation="vertical"` and give it an explicit height (e.g. `className="h-6"`) - a vertical separator has no intrinsic length.',
9798
9894
  ],
9895
+ keywords: ["divider", "rule", "hr"],
9799
9896
  uses: [],
9800
9897
  usedBy: [
9801
9898
  "button-group",
@@ -9905,6 +10002,7 @@ export const docsManifest = {
9905
10002
  "Use `Sheet` for a simple edge panel holding a focused form / settings; a drag-to-dismiss bottom sheet is a `Drawer`, and nested panels are a `Sidepanel`.",
9906
10003
  "Set the entry edge via `SheetContent` `side`; always render a `SheetTitle` (wrap in `sr-only` if hidden) so the panel is announced.",
9907
10004
  ],
10005
+ keywords: ["drawer", "side sheet", "slide-over"],
9908
10006
  uses: ["button", "flex"],
9909
10007
  usedBy: ["sidebar"],
9910
10008
  anatomy: {
@@ -10037,6 +10135,7 @@ export const docsManifest = {
10037
10135
  '`variant="metallic"` is built for dark surfaces only - on a light background the chrome ramp loses contrast. Its own `duration` and `repeatDelay` defaults apply only when you pass neither.',
10038
10136
  "To sweep several lines in step, pass them one shared `progress` motion value (0-100) and drive it yourself; a Shimmer given `progress` never animates on its own.",
10039
10137
  ],
10138
+ keywords: [],
10040
10139
  uses: [],
10041
10140
  usedBy: ["thinking-loader"],
10042
10141
  },
@@ -10107,6 +10206,7 @@ export const docsManifest = {
10107
10206
  "Either pass `children` (Shine wraps them in a relative box) or render it bare inside an existing `position: relative` parent - otherwise the sweep has nothing to overlay.",
10108
10207
  "Needs `ReducedMotionProvider`; under reduced motion it renders nothing (a static band would look like a permanent artefact), so don't rely on it as persistent decoration.",
10109
10208
  ],
10209
+ keywords: [],
10110
10210
  uses: ["fade-overlay"],
10111
10211
  usedBy: [],
10112
10212
  },
@@ -10415,6 +10515,7 @@ export const docsManifest = {
10415
10515
  "Reach for `Sidepanel` when you need nested sub-panels or a non-modal panel (`modal={false}`) that leaves the page interactive; a single focused edge panel is a `Sheet`.",
10416
10516
  "Compose nested panels with `SidepanelNestedRoot`, and always render a `SidepanelTitle` for the accessible name.",
10417
10517
  ],
10518
+ keywords: [],
10418
10519
  uses: ["button", "flex", "stack"],
10419
10520
  usedBy: [],
10420
10521
  anatomy: {
@@ -10489,7 +10590,7 @@ export const docsManifest = {
10489
10590
  name: "as",
10490
10591
  type: '"div" | "article" | "aside" | "figcaption" | "figure" | "footer" | "header" | "li" | "main" | "nav" | "ol" | "section" | "span" | "ul"',
10491
10592
  required: false,
10492
- description: 'Render as a different host element from the closed layout vocabulary\n({@link LayoutElement}). The set is deliberately closed: `as="button"` is a\ntype error, because the design-system answer is the Button component. Event handlers\nand the ref accept any host element.\n\n`as` and `render` are mutually exclusive; if both are passed, `render`\nwins (a dev-only warning fires).',
10593
+ description: 'Render as a different host element from the closed layout vocabulary\n(`LayoutElement`). The set is deliberately closed: `as="button"` is a\ntype error, because the design-system answer is the Button component. Event handlers\nand the ref accept any host element.\n\n`as` and `render` are mutually exclusive; if both are passed, `render`\nwins (a dev-only warning fires).',
10493
10594
  },
10494
10595
  {
10495
10596
  name: "cols",
@@ -10544,6 +10645,7 @@ export const docsManifest = {
10544
10645
  '`as` and `render` are mutually exclusive (`render` wins, dev-warned); `as` draws from the closed layout vocabulary, so `as="button"` is a type error (use `Button`).',
10545
10646
  "Use `as` to change the element (a tag); use `render` only to swap in a component (e.g. a router Link). Never `render={<Box as=…/>}` - pass `as` directly.",
10546
10647
  ],
10648
+ keywords: [],
10547
10649
  uses: [],
10548
10650
  usedBy: [],
10549
10651
  },
@@ -10607,6 +10709,7 @@ export const docsManifest = {
10607
10709
  "Prefer `Skeleton` over a spinner for content areas - a layout-stable placeholder that mirrors the final shape avoids reflow when data lands.",
10608
10710
  'Size it with `className` (`h-*` / `w-*`); use `variant="light"` on white / `bg-background` surfaces where the default grey is too dark.',
10609
10711
  ],
10712
+ keywords: [],
10610
10713
  uses: ["stack"],
10611
10714
  usedBy: ["data-grid-pagination", "product-card", "sidebar"],
10612
10715
  },
@@ -10637,7 +10740,7 @@ export const docsManifest = {
10637
10740
  name: "onDraggingChange",
10638
10741
  type: "(dragging: boolean) => void",
10639
10742
  required: false,
10640
- description: "Told when a drag starts and ends.\n\nA consumer usually has something else that should behave differently\nunder the finger - a preview that should stop animating each step, a\nreadout that should stop settling - and the state is already tracked here\nfor {@link travelToValue}.",
10743
+ description: "Told when a drag starts and ends.\n\nA consumer usually has something else that should behave differently\nunder the finger - a preview that should stop animating each step, a\nreadout that should stop settling - and the state is already tracked here\nfor `travelToValue`.",
10641
10744
  },
10642
10745
  {
10643
10746
  name: "variant",
@@ -10687,6 +10790,7 @@ export const docsManifest = {
10687
10790
  'On `variant="channel"`, give the channel its colour with `trackBackground` and keep the thumb legible against it with `getThumbColor`; the app owns the colour maths, the slider only paints the result.',
10688
10791
  "Use `labelStart`/`labelEnd` for visible end captions and `getValueText` for what a screen reader hears; the captions are hidden from assistive technology.\n\nChannel affordances adapted from",
10689
10792
  ],
10793
+ keywords: [],
10690
10794
  uses: ["flex", "text"],
10691
10795
  usedBy: [],
10692
10796
  },
@@ -10743,6 +10847,7 @@ export const docsManifest = {
10743
10847
  'The mark paints with `currentColor`, so colour it with a text-colour class on the icon or a parent (`className="text-muted-foreground"`), not a brand fill.',
10744
10848
  'Size with the `size` token (`"sm"`, `"lg"`…), not `className="size-6"`; it shares the `Icon` scale so a mark lines up with the icons around it.',
10745
10849
  ],
10850
+ keywords: [],
10746
10851
  uses: ["icon"],
10747
10852
  usedBy: ["site-footer"],
10748
10853
  },
@@ -10786,6 +10891,7 @@ export const docsManifest = {
10786
10891
  bestPractices: [
10787
10892
  "Reach for `Space` only for a fixed one-off gap between siblings; consistent spacing across many children belongs on a `Stack`/`Flex`/`Group` `gap` instead.",
10788
10893
  ],
10894
+ keywords: [],
10789
10895
  uses: [],
10790
10896
  usedBy: [],
10791
10897
  },
@@ -10811,6 +10917,7 @@ export const docsManifest = {
10811
10917
  "Use `Spinner` for small inline / action loading (inside a `Button`, next to text); a blocking full region is `LoadingState`, a layout placeholder is `Skeleton`.",
10812
10918
  "A bare `Spinner` carries no accessible name - wrap it in a labelled live region (e.g. `LoadingState`) when it's the sole loading signal.",
10813
10919
  ],
10920
+ keywords: ["loader", "loading", "activity indicator"],
10814
10921
  uses: [],
10815
10922
  usedBy: [
10816
10923
  "badge",
@@ -10850,7 +10957,7 @@ export const docsManifest = {
10850
10957
  name: "as",
10851
10958
  type: '"div" | "article" | "aside" | "figcaption" | "figure" | "footer" | "header" | "li" | "main" | "nav" | "ol" | "section" | "span" | "ul"',
10852
10959
  required: false,
10853
- description: 'Render as a different host element from the closed layout vocabulary\n({@link LayoutElement}). The set is deliberately closed: `as="button"` is a\ntype error, because the design-system answer is the Button component. Event handlers\nand the ref accept any host element.\n\n`as` and `render` are mutually exclusive; if both are passed, `render`\nwins (a dev-only warning fires).',
10960
+ description: 'Render as a different host element from the closed layout vocabulary\n(`LayoutElement`). The set is deliberately closed: `as="button"` is a\ntype error, because the design-system answer is the Button component. Event handlers\nand the ref accept any host element.\n\n`as` and `render` are mutually exclusive; if both are passed, `render`\nwins (a dev-only warning fires).',
10854
10961
  },
10855
10962
  {
10856
10963
  name: "align",
@@ -10897,7 +11004,7 @@ export const docsManifest = {
10897
11004
  name: "as",
10898
11005
  type: '"div" | "article" | "aside" | "figcaption" | "figure" | "footer" | "header" | "li" | "main" | "nav" | "ol" | "section" | "span" | "ul"',
10899
11006
  required: false,
10900
- description: 'Render as a different host element from the closed layout vocabulary\n({@link LayoutElement}). The set is deliberately closed: `as="button"` is a\ntype error, because the design-system answer is the Button component. Event handlers\nand the ref accept any host element.\n\n`as` and `render` are mutually exclusive; if both are passed, `render`\nwins (a dev-only warning fires).',
11007
+ description: 'Render as a different host element from the closed layout vocabulary\n(`LayoutElement`). The set is deliberately closed: `as="button"` is a\ntype error, because the design-system answer is the Button component. Event handlers\nand the ref accept any host element.\n\n`as` and `render` are mutually exclusive; if both are passed, `render`\nwins (a dev-only warning fires).',
10901
11008
  },
10902
11009
  {
10903
11010
  name: "direction",
@@ -10968,7 +11075,7 @@ export const docsManifest = {
10968
11075
  name: "as",
10969
11076
  type: '"div" | "article" | "aside" | "figcaption" | "figure" | "footer" | "header" | "li" | "main" | "nav" | "ol" | "section" | "span" | "ul"',
10970
11077
  required: false,
10971
- description: 'Render as a different host element from the closed layout vocabulary\n({@link LayoutElement}). The set is deliberately closed: `as="button"` is a\ntype error, because the design-system answer is the Button component. Event handlers\nand the ref accept any host element.\n\n`as` and `render` are mutually exclusive; if both are passed, `render`\nwins (a dev-only warning fires).',
11078
+ description: 'Render as a different host element from the closed layout vocabulary\n(`LayoutElement`). The set is deliberately closed: `as="button"` is a\ntype error, because the design-system answer is the Button component. Event handlers\nand the ref accept any host element.\n\n`as` and `render` are mutually exclusive; if both are passed, `render`\nwins (a dev-only warning fires).',
10972
11079
  },
10973
11080
  {
10974
11081
  name: "align",
@@ -11006,6 +11113,7 @@ export const docsManifest = {
11006
11113
  '`as` and `render` are mutually exclusive (`render` wins, dev-warned); `as` draws from the closed layout vocabulary, so `as="button"` is a type error (use `Button`).',
11007
11114
  "Use `as` to change the element (a tag); use `render` only to swap in a component (e.g. a router Link). Never `render={<Box as=…/>}` - pass `as` directly.",
11008
11115
  ],
11116
+ keywords: [],
11009
11117
  uses: [],
11010
11118
  usedBy: [
11011
11119
  "empty",
@@ -11078,6 +11186,7 @@ export const docsManifest = {
11078
11186
  "Tune rhythm with `stagger` (gap between items) and `delay` (lead-in) on the parent, rather than hand-setting per-child transition delays.",
11079
11187
  "Needs `ReducedMotionProvider` in the tree so the orchestrated entrance both runs and honours the reduced-motion setting.",
11080
11188
  ],
11189
+ keywords: [],
11081
11190
  uses: [],
11082
11191
  usedBy: [],
11083
11192
  },
@@ -11188,6 +11297,7 @@ export const docsManifest = {
11188
11297
  "Give each step a `StepperItem` child in order - progress is derived from child index, so conditionally rendering steps shifts the fill.",
11189
11298
  "Control completion via `value`/`onValueChange` (or uncontrolled `defaultValue`); the fill reaches only the last *completed* step, not the current one.",
11190
11299
  ],
11300
+ keywords: ["wizard", "steps", "multi-step"],
11191
11301
  uses: ["icon"],
11192
11302
  usedBy: [],
11193
11303
  },
@@ -11282,6 +11392,7 @@ export const docsManifest = {
11282
11392
  bestPractices: [
11283
11393
  "Drive `tokens` from real stream deltas - don't fake a word clock in product code. Showcase demos may animate.",
11284
11394
  ],
11395
+ keywords: [],
11285
11396
  uses: ["flex", "grid", "text"],
11286
11397
  usedBy: [],
11287
11398
  },
@@ -11290,7 +11401,7 @@ export const docsManifest = {
11290
11401
  module: "components/sub-navigation",
11291
11402
  title: "SubNavigation",
11292
11403
  category: "navigation",
11293
- description: "Vertical secondary navigation for page subsections and settings-like layouts;\nthe `<nav>` landmark wrapping a {@link SubNavigationList} of links.",
11404
+ description: "Vertical secondary navigation for page subsections and settings-like layouts;\nthe `<nav>` landmark wrapping a `SubNavigationList` of links.",
11294
11405
  exports: [
11295
11406
  {
11296
11407
  name: "SubNavigation",
@@ -11358,6 +11469,7 @@ export const docsManifest = {
11358
11469
  "Reach for `SubNavigation` for a vertical in-page section/settings menu; horizontal router tabs are `TabNavigation`, the app-chrome shell is `Sidebar`.",
11359
11470
  "Fill it with a `SubNavigationList` of links - it already renders the `<nav>` landmark, so don't nest it inside another `<nav>`.",
11360
11471
  ],
11472
+ keywords: [],
11361
11473
  uses: ["flex", "menu-item"],
11362
11474
  usedBy: [],
11363
11475
  },
@@ -11402,6 +11514,7 @@ export const docsManifest = {
11402
11514
  "Wrap `SuccessTickRipple` in a `position: relative; overflow: hidden` parent - the ripple field is absolutely positioned and bleeds past an unbounded container.",
11403
11515
  "It's decorative (`aria-hidden`) unless you pass `aria-label`, which exposes it as an `img`; animations are CSS-only and already collapse under `prefers-reduced-motion`.",
11404
11516
  ],
11517
+ keywords: ["celebrate", "success", "confirmation"],
11405
11518
  uses: [],
11406
11519
  usedBy: [],
11407
11520
  },
@@ -11592,6 +11705,7 @@ export const docsManifest = {
11592
11705
  "Reach for `Swatch` for a selectable colour/gradient/material chip or tile; a tiny non-interactive status marker is `Dot`, and a display-only status/category label is `Badge`.",
11593
11706
  "For a gradient or image chip fill pass `light` - auto contrast detection (`isLightColor`) only reads solid colours, so overlaid icons/labels lose legibility without it.",
11594
11707
  ],
11708
+ keywords: [],
11595
11709
  uses: ["center", "flex", "icon"],
11596
11710
  usedBy: [
11597
11711
  "swatch-fan",
@@ -11662,6 +11776,7 @@ export const docsManifest = {
11662
11776
  "Choose `SwatchGroup` when you want radio semantics + keyboard a11y; reach for `SwatchSelector` only for a lighter controlled row without the RadioGroup roles.",
11663
11777
  "Set `icon` (e.g. `Check`) on the group to swap the selection ring for a glyph on the chosen swatch, rather than styling items individually.",
11664
11778
  ],
11779
+ keywords: [],
11665
11780
  uses: ["swatch"],
11666
11781
  usedBy: [],
11667
11782
  },
@@ -11670,7 +11785,7 @@ export const docsManifest = {
11670
11785
  module: "components/swatch-selector",
11671
11786
  title: "SwatchSelector",
11672
11787
  category: "color",
11673
- description: "Row of selectable color/image swatches with controlled single selection,\nbuilt on Base UI ToggleGroup: the row is one tab stop and the arrow keys move\nbetween swatches.\n\nShares the selected `value`, `onValueChange`, and `size` with its\n{@link SwatchSelectorItem} children through context.",
11788
+ description: "Row of selectable color/image swatches with controlled single selection,\nbuilt on Base UI ToggleGroup: the row is one tab stop and the arrow keys move\nbetween swatches.\n\nShares the selected `value`, `onValueChange`, and `size` with its\n`SwatchSelectorItem` children through context.",
11674
11789
  exports: [
11675
11790
  {
11676
11791
  name: "Swatch",
@@ -11799,6 +11914,7 @@ export const docsManifest = {
11799
11914
  "Pressing the selected swatch again keeps it selected and does not call `onValueChange`.",
11800
11915
  "Selection is controlled - pass `value` and update it from `onValueChange`; there is no internal fallback state to fall back on.",
11801
11916
  ],
11917
+ keywords: [],
11802
11918
  uses: ["swatch", "tooltip"],
11803
11919
  usedBy: ["product-card"],
11804
11920
  },
@@ -11828,6 +11944,7 @@ export const docsManifest = {
11828
11944
  "Controlled use needs `checked` + `onCheckedChange`; with only `checked` the switch won't move - use `defaultChecked` for uncontrolled.",
11829
11945
  "`Switch` has no built-in label - associate a `Label` via `htmlFor`/`id` so the toggle has an accessible name.",
11830
11946
  ],
11947
+ keywords: ["toggle", "on off"],
11831
11948
  uses: [],
11832
11949
  usedBy: [],
11833
11950
  },
@@ -11932,6 +12049,7 @@ export const docsManifest = {
11932
12049
  "Use `TabNavigation` when each tab is a route/URL (it renders a `<nav>` of links); for in-page panels that swap without navigating, use `Tabs`.",
11933
12050
  'It shares the Tabs look via context but defaults to `variant="line"`; mark the active link yourself (e.g. router `aria-current`) - there\'s no Base UI value tracking here.',
11934
12051
  ],
12052
+ keywords: [],
11935
12053
  uses: ["flex", "icon", "tabs"],
11936
12054
  usedBy: [],
11937
12055
  anatomy: {
@@ -12007,6 +12125,7 @@ export const docsManifest = {
12007
12125
  "Include a `TableCaption` describing the table's contents - it is the accessible name screen readers announce for the `<table>`.",
12008
12126
  "Compose real `TableHeader`/`TableBody`/`TableRow`/`TableHead`/`TableCell` parts (semantic `thead`/`tbody`/`th`/`td`); don't fake rows with styled divs or you lose the table semantics.",
12009
12127
  ],
12128
+ keywords: [],
12010
12129
  uses: [],
12011
12130
  usedBy: [],
12012
12131
  },
@@ -12174,6 +12293,7 @@ export const docsManifest = {
12174
12293
  "Reach for `Tabs` to swap in-page panels via `TabsContent`; when each tab is a route, use `TabNavigation` instead (renders links, no panels).",
12175
12294
  "Compose `TabsList`/`TabsTrigger`/`TabsContent` - shared `variant`/`size`/`fullWidth` flow through context, so set them on `Tabs`, not each trigger.",
12176
12295
  ],
12296
+ keywords: [],
12177
12297
  uses: ["dot", "flex", "icon", "scroll-area"],
12178
12298
  usedBy: ["tab-navigation"],
12179
12299
  anatomy: {
@@ -12240,7 +12360,7 @@ export const docsManifest = {
12240
12360
  name: "dot",
12241
12361
  type: 'boolean | "neutral" | "brand" | "danger" | "warning" | "success" | "info"',
12242
12362
  required: false,
12243
- description: "Leading status dot: `true` for a neutral dot, or a {@link Tone} to tint it.",
12363
+ description: "Leading status dot: `true` for a neutral dot, or a `Tone` to tint it.",
12244
12364
  },
12245
12365
  {
12246
12366
  name: "hideDismiss",
@@ -12339,6 +12459,7 @@ export const docsManifest = {
12339
12459
  'Set at most one leading visual - `loading` > `imageUrl` > `dot` > `icon` (in that precedence); pass a Lucide component to `icon` (not `<Icon/>`), and `imageUrl` renders a circular `<img alt="">`, so keep it decorative.',
12340
12460
  "When `onDismiss` is set, Backspace/Delete also removes the tag while it's focused - don't bind your own conflicting key handler.",
12341
12461
  ],
12462
+ keywords: ["chip", "token"],
12342
12463
  uses: ["dot", "icon", "pill", "spinner"],
12343
12464
  usedBy: ["data-grid", "tag-selector"],
12344
12465
  },
@@ -12357,7 +12478,7 @@ export const docsManifest = {
12357
12478
  name: "as",
12358
12479
  type: '"dd" | "dt" | "figcaption" | "legend" | "li" | "p" | "span"',
12359
12480
  required: false,
12360
- description: 'Render as a different host element from the closed text vocabulary\n({@link TextElement}). The set is deliberately closed and text-only:\n`as="div"` and `as="label"` are type errors (use Box for decorative\nwrappers, Label for form labels). Ref and event-handler types remain the\ndefault element\'s (HTMLParagraphElement).\n\n`as` and `render` are mutually exclusive; if both are passed, `render`\nwins (a dev-only warning fires).',
12481
+ description: 'Render as a different host element from the closed text vocabulary\n(`TextElement`). The set is deliberately closed and text-only:\n`as="div"` and `as="label"` are type errors (use Box for decorative\nwrappers, Label for form labels). Ref and event-handler types remain the\ndefault element\'s (HTMLParagraphElement).\n\n`as` and `render` are mutually exclusive; if both are passed, `render`\nwins (a dev-only warning fires).',
12361
12482
  },
12362
12483
  {
12363
12484
  name: "size",
@@ -12400,6 +12521,7 @@ export const docsManifest = {
12400
12521
  '`as` is a closed text-only vocabulary - use `as="span"` for inline copy; `as="div"`/`as="label"` are type errors (use `Box` for wrappers, `Label` for form labels).',
12401
12522
  "`as` and `render` are mutually exclusive (`render` wins, dev-warned); Text ships without a line-length cap - add `max-w-prose` at the call site for long-form prose.",
12402
12523
  ],
12524
+ keywords: [],
12403
12525
  uses: [],
12404
12526
  usedBy: [
12405
12527
  "checkbox-field",
@@ -12450,6 +12572,7 @@ export const docsManifest = {
12450
12572
  "It auto-grows with content (`field-sizing-content`); set `rows` for a minimum height in lines rather than pinning height via CSS.",
12451
12573
  "Give it a label - inside a `Field` a `FieldLabel` targets it with no ids to wire; standalone, point a `Label`'s `htmlFor` at its `id`. A placeholder is not an accessible name.",
12452
12574
  ],
12575
+ keywords: ["multiline", "text area"],
12453
12576
  uses: ["field"],
12454
12577
  usedBy: ["input-group"],
12455
12578
  },
@@ -12502,7 +12625,7 @@ export const docsManifest = {
12502
12625
  name: "orb",
12503
12626
  type: "ThinkingLoaderOrb",
12504
12627
  required: false,
12505
- description: "Inline {@link ThinkingOrb } in the loader slot. Ignored when `loader` is\nprovided. Defaults to size `20` for text-adjacent rows.",
12628
+ description: "Inline `ThinkingOrb` in the loader slot. Ignored when `loader` is\nprovided. Defaults to size `20` for text-adjacent rows.",
12506
12629
  },
12507
12630
  {
12508
12631
  name: "morphIcons",
@@ -12643,6 +12766,7 @@ export const docsManifest = {
12643
12766
  "Drive `ThinkingLoader` with `currentStep` (controlled) to reflect real progress, or omit it to auto-cycle `steps` on `interval` for a labor-illusion loader.",
12644
12767
  'It already renders an `aria-live="polite"` region announcing each step - don\'t wrap it in another status role. Mount `ReducedMotionProvider` since it animates via `m.*`.',
12645
12768
  ],
12769
+ keywords: [],
12646
12770
  uses: [
12647
12771
  "animated-number",
12648
12772
  "flex",
@@ -12755,6 +12879,7 @@ export const docsManifest = {
12755
12879
  'Prefer `theme="auto"` so the orb follows `data-theme` / system preference; pin `dark` or `light` only when the surrounding surface is fixed.',
12756
12880
  "Pass a specific `aria-label` when the state text is not otherwise announced (e.g. next to a ThinkingLoader that already speaks).",
12757
12881
  ],
12882
+ keywords: [],
12758
12883
  uses: [],
12759
12884
  usedBy: ["thinking-loader"],
12760
12885
  },
@@ -12829,6 +12954,7 @@ export const docsManifest = {
12829
12954
  "Name the group with `aria-label` or `aria-labelledby`; screen readers announce it before the first slot.",
12830
12955
  'Use `TimeSlotPicker` for a fixed set of offered times; for any time the user types, use `Input type="time"`.',
12831
12956
  ],
12957
+ keywords: ["date", "appointment", "booking", "schedule"],
12832
12958
  uses: [],
12833
12959
  usedBy: [],
12834
12960
  },
@@ -12908,6 +13034,7 @@ export const docsManifest = {
12908
13034
  "Mount `<Toaster />` exactly once near the app root, then fire toasts with `toast()` from `@instruments/materia-ui/components/toast` - don't render a `Toaster` per view.",
12909
13035
  "Press F6 to move focus into the toasts; hovering or focusing the stack pauses dismissal and fans it open.",
12910
13036
  ],
13037
+ keywords: ["notification", "snackbar", "flash message"],
12911
13038
  uses: ["button", "flex", "icon"],
12912
13039
  usedBy: [],
12913
13040
  },
@@ -12974,6 +13101,7 @@ export const docsManifest = {
12974
13101
  "One independent on/off is a `Toggle`; a mutually-exclusive or multi-select set is `ToggleGroup` with `Toggle`s inside it; an instantly-applied setting is `Switch`.",
12975
13102
  "Pass `icon` with no children for a square icon-only toggle (auto-sized); with a label, order it via `iconPlacement`.",
12976
13103
  ],
13104
+ keywords: [],
12977
13105
  uses: ["icon"],
12978
13106
  usedBy: [
12979
13107
  "data-grid",
@@ -12987,7 +13115,7 @@ export const docsManifest = {
12987
13115
  module: "components/toggle-group",
12988
13116
  title: "ToggleGroup",
12989
13117
  category: "actions",
12990
- description: "A literal group of {@link Toggle}s: several two-state pressable buttons that\nshare one selection, laid out `joined` (a seamless segmented row),\n`separated`, or `wrap`ped. Built on Base UI ToggleGroup - by default one\nitem is pressed at a time (radio-like), `multiple` makes it checkbox-like;\n`value` is always an array. The `Toggle`s inside take\n`size` / `radius` / `variant` from the group through context.",
13118
+ description: "A literal group of `Toggle`s: several two-state pressable buttons that\nshare one selection, laid out `joined` (a seamless segmented row),\n`separated`, or `wrap`ped. Built on Base UI ToggleGroup - by default one\nitem is pressed at a time (radio-like), `multiple` makes it checkbox-like;\n`value` is always an array. The `Toggle`s inside take\n`size` / `radius` / `variant` from the group through context.",
12991
13119
  exports: [
12992
13120
  {
12993
13121
  name: "ToggleGroup",
@@ -13037,6 +13165,7 @@ export const docsManifest = {
13037
13165
  "Put plain `Toggle`s inside, each with a `value`, as Base UI does.",
13038
13166
  "Icon-only toggles need an `aria-label` (a dev warning fires otherwise).",
13039
13167
  ],
13168
+ keywords: [],
13040
13169
  uses: ["toggle"],
13041
13170
  usedBy: ["data-grid"],
13042
13171
  },
@@ -13086,6 +13215,7 @@ export const docsManifest = {
13086
13215
  "The trigger must be focusable (a button / link, or `render` onto one) or keyboard and AT users never see the tip.",
13087
13216
  "Share one `TooltipProvider` to tune `delay` / skip-delay for a group; `Tooltip` wraps its own provider, so you only need it for grouping.",
13088
13217
  ],
13218
+ keywords: ["hint", "title"],
13089
13219
  uses: [],
13090
13220
  usedBy: ["product-card", "progress-dots", "sidebar", "swatch-selector"],
13091
13221
  },
@@ -13109,7 +13239,7 @@ export const docsManifest = {
13109
13239
  name: "as",
13110
13240
  type: '"div" | "article" | "aside" | "figcaption" | "figure" | "footer" | "header" | "li" | "main" | "nav" | "ol" | "section" | "span" | "ul"',
13111
13241
  required: false,
13112
- description: "Render as a different host element from the closed layout vocabulary\n({@link LayoutElement}). A row inside a real list must be an `li`.\n\n`as` and `render` are mutually exclusive; if both are passed, `render`\nwins (a dev-only warning fires).",
13242
+ description: "Render as a different host element from the closed layout vocabulary\n(`LayoutElement`). A row inside a real list must be an `li`.\n\n`as` and `render` are mutually exclusive; if both are passed, `render`\nwins (a dev-only warning fires).",
13113
13243
  },
13114
13244
  ],
13115
13245
  },
@@ -13126,7 +13256,7 @@ export const docsManifest = {
13126
13256
  name: "as",
13127
13257
  type: '"div" | "article" | "aside" | "figcaption" | "figure" | "footer" | "header" | "li" | "main" | "nav" | "ol" | "section" | "span" | "ul"',
13128
13258
  required: false,
13129
- description: "Render as a different host element from the closed layout vocabulary\n({@link LayoutElement}).\n\n`as` and `render` are mutually exclusive; if both are passed, `render`\nwins (a dev-only warning fires).",
13259
+ description: "Render as a different host element from the closed layout vocabulary\n(`LayoutElement`).\n\n`as` and `render` are mutually exclusive; if both are passed, `render`\nwins (a dev-only warning fires).",
13130
13260
  },
13131
13261
  {
13132
13262
  name: "slots",
@@ -13162,6 +13292,7 @@ export const docsManifest = {
13162
13292
  "Use `slots` only to align controls into a column across rows with different counts; otherwise let the children size the slot.",
13163
13293
  "Do not use `visible` to say a row matters more; a control drawn on every row at rest is furniture.",
13164
13294
  ],
13295
+ keywords: [],
13165
13296
  uses: [],
13166
13297
  usedBy: [],
13167
13298
  anatomy: {
@@ -13199,6 +13330,7 @@ export const docsManifest = {
13199
13330
  "Use for screen-reader-only text (e.g. a link's full context) - for icon-only `Button`s prefer the `aria-label` prop the component already requires.",
13200
13331
  "Never hide interactive or focusable content inside it - sighted keyboard users would tab into something they cannot see.",
13201
13332
  ],
13333
+ keywords: [],
13202
13334
  uses: [],
13203
13335
  usedBy: ["animated-number", "avatar", "badge", "breadcrumb"],
13204
13336
  },
@@ -13370,6 +13502,7 @@ export const docsManifest = {
13370
13502
  'Pass `label` per state (the parent decides the copy, e.g. "Voice input" vs "Stop dictation") so screen readers announce the current action; never hardcode it here.',
13371
13503
  "Feed `level` from a real RMS meter while `listening` - a dead-flat waveform reads as a crashed mic; the atom floors and undulates the bars, but only live level makes it look alive.",
13372
13504
  ],
13505
+ keywords: [],
13373
13506
  uses: ["button", "flex", "icon"],
13374
13507
  usedBy: [],
13375
13508
  },
@@ -13428,6 +13561,7 @@ export const docsManifest = {
13428
13561
  "Pass a Lucide component to `icon` (e.g. `RulerIcon`), not a rendered `<Icon/>` - it is handed to the internal `Icon` at a fixed `sm` size.",
13429
13562
  "This is a preset composition of `Card`; restyle via the surrounding layout rather than reaching inside - for a bespoke layout compose `Card`/`CardContent` directly.",
13430
13563
  ],
13564
+ keywords: [],
13431
13565
  uses: ["card", "flex", "icon"],
13432
13566
  usedBy: [],
13433
13567
  },
@@ -13591,6 +13725,7 @@ export const docsManifest = {
13591
13725
  "Chunk items with `chunkIntoRows` (using `calculateColumns`) before passing `rows`; provide a stable `getItemKey` (and `getRowKey` where rows reorder) so React reconciliation stays correct.",
13592
13726
  "Render one `CardGridSkeletonItem` per expected card while data loads, inside the same `CardGrid` - this keeps list semantics and column widths stable across the loading→loaded transition.",
13593
13727
  ],
13728
+ keywords: [],
13594
13729
  uses: ["product-card"],
13595
13730
  usedBy: [],
13596
13731
  },
@@ -13758,6 +13893,7 @@ export const docsManifest = {
13758
13893
  "Give every `image` card a `searchHex`, otherwise it can't be searched or selected - flat colours and gradients derive theirs automatically.",
13759
13894
  "Pass `renderLink` (e.g. wrapping `next/link`) for client-side nav - the built-in links are plain `<a>`; the callback must return a single anchor element.",
13760
13895
  ],
13896
+ keywords: [],
13761
13897
  uses: [
13762
13898
  "button",
13763
13899
  "center",
@@ -13845,6 +13981,7 @@ export const docsManifest = {
13845
13981
  "Only wire the actions you support: Reject and Cookie settings render only when `onReject` / `onSettings` are passed.",
13846
13982
  "It records nothing. Store the visitor's choice in the handlers and stop rendering the banner once they have made it.",
13847
13983
  ],
13984
+ keywords: [],
13848
13985
  uses: ["button", "flex", "heading", "text"],
13849
13986
  usedBy: [],
13850
13987
  },
@@ -14273,6 +14410,7 @@ export const docsManifest = {
14273
14410
  "Render the satellite parts (`DataGridTable`, `DataGridPagination`, `DataGridColumnHeader/Filter/Visibility`) inside `DataGrid` - they read the table + layout from its context and break outside it.",
14274
14411
  "Enable features through `tableLayout` (`columnsPinnable`, `columnsResizable`, `columnsVisibility`, …) rather than styling rows manually; set `initialColumnPinning` to pin on mount.",
14275
14412
  ],
14413
+ keywords: [],
14276
14414
  uses: [
14277
14415
  "button",
14278
14416
  "checkbox",
@@ -14367,6 +14505,7 @@ export const docsManifest = {
14367
14505
  "Use this for a discrete multi-select facet; it stores an array filter value, so pair it with a column filter fn that matches array membership.",
14368
14506
  "The typed search survives each pick, so several matches can be ticked from one query; it resets when the popup closes.",
14369
14507
  ],
14508
+ keywords: [],
14370
14509
  uses: ["badge", "button", "center", "flex", "icon", "separator"],
14371
14510
  usedBy: [],
14372
14511
  },
@@ -14429,6 +14568,7 @@ export const docsManifest = {
14429
14568
  "The pin/move/visibility controls only appear when the matching `tableLayout` flags (`columnsPinnable`/`columnsMovable`/`columnsVisibility`) are enabled on `DataGrid` - a missing menu item usually means the flag is off, not a bug.",
14430
14569
  "Pass a human `title` (and optional `icon`); it is the accessible label for the sort/menu trigger and the moved-column announcement.",
14431
14570
  ],
14571
+ keywords: [],
14432
14572
  uses: ["button", "data-grid", "dropdown-menu", "flex", "icon"],
14433
14573
  usedBy: [],
14434
14574
  },
@@ -14463,6 +14603,7 @@ export const docsManifest = {
14463
14603
  "Only accessor columns reporting `getCanHide()` appear; set `enableHiding: false` on a column def to keep it always-visible and out of this menu.",
14464
14604
  "Label each column via `columnDef.meta.headerTitle` - the menu falls back to the raw column `id` when it's missing.",
14465
14605
  ],
14606
+ keywords: [],
14466
14607
  uses: ["dropdown-menu"],
14467
14608
  usedBy: [],
14468
14609
  },
@@ -14563,6 +14704,7 @@ export const docsManifest = {
14563
14704
  "For server-side paging, drive the table with `manualPagination` + `pageCount` and a controlled `pagination` state; the range summary uses `recordCount`, so pass the true total, not the page length.",
14564
14705
  "Configure page-size choices via `sizes` (not by restyling the select), and localise the range text through the `info` template.",
14565
14706
  ],
14707
+ keywords: [],
14566
14708
  uses: ["button", "data-grid", "flex", "select", "skeleton"],
14567
14709
  usedBy: [],
14568
14710
  },
@@ -14808,6 +14950,7 @@ export const docsManifest = {
14808
14950
  "Rows are virtualised, so give each a stable `rowHeight` via `tableLayout` (expanded rows use `expandedRowHeight`) - variable, unmeasured heights make the window jump.",
14809
14951
  "Use `DataGridTable` for a data-driven grid; for a small static table with hand-authored `<TableRow>`s reach for `Table` instead - no virtualisation or TanStack instance needed.",
14810
14952
  ],
14953
+ keywords: [],
14811
14954
  uses: ["center", "data-grid", "flex", "spinner"],
14812
14955
  usedBy: [],
14813
14956
  },
@@ -14887,6 +15030,7 @@ export const docsManifest = {
14887
15030
  "Give it `onLocationClick` when the address can be changed, so the location becomes a button rather than inert text.",
14888
15031
  "Place it full width directly under the header; it switches to its compact layout from its own width, not the viewport's.",
14889
15032
  ],
15033
+ keywords: [],
14890
15034
  uses: ["button", "flex", "grid", "icon", "separator"],
14891
15035
  usedBy: [],
14892
15036
  },
@@ -15056,6 +15200,7 @@ export const docsManifest = {
15056
15200
  "Set `selectable` to reveal per-item checkboxes and drive selection via `value`/`onValueChange` (a `string[]`) - don't add your own checkboxes.",
15057
15201
  "Use this for files/documents with icon + metadata + actions; for a generic single-line row reach for `Item`/`ItemGroup`, and for tabular columns use `Table`.",
15058
15202
  ],
15203
+ keywords: [],
15059
15204
  uses: ["center", "checkbox", "flex", "icon"],
15060
15205
  usedBy: [],
15061
15206
  },
@@ -15290,6 +15435,7 @@ export const docsManifest = {
15290
15435
  "Pass `renderImage` (wrapping `next/image`) in Next.js - the default is a plain `<img>` and skips Next optimisation; give `media` images a meaningful `alt`.",
15291
15436
  "Set `href` to make the whole card a single link (it wraps in an `<a>`); don't nest additional links/buttons inside - use `EditorialCard` for promo tiles, plain `Card` for neutral content.",
15292
15437
  ],
15438
+ keywords: [],
15293
15439
  uses: ["center", "flex", "media-frame", "swatch-fan"],
15294
15440
  usedBy: [],
15295
15441
  },
@@ -15384,6 +15530,7 @@ export const docsManifest = {
15384
15530
  'Use `EmptyState` for "no data / nothing here"; a failure the user can retry is an `ErrorState` (which also composes `Empty`), so don\'t hand-roll a retry empty.',
15385
15531
  'Set `level` to keep the document outline gapless where you place it - a full-page empty near an `h2` wants `level="3"`, but a nested one may need `"4"`.',
15386
15532
  ],
15533
+ keywords: ["no results", "zero state", "blank slate"],
15387
15534
  uses: ["empty"],
15388
15535
  usedBy: [],
15389
15536
  },
@@ -15482,6 +15629,7 @@ export const docsManifest = {
15482
15629
  "`ErrorState` renders a failure UI (icon / title / message / retry) but does not catch errors - wrap the throwing subtree in an `ErrorBoundary` and render this in its `fallback`.",
15483
15630
  "Pass `retry` to show the retry button (omit it to hide); it's built on `Empty`, so `layout` / `minHeight` props pass straight through.",
15484
15631
  ],
15632
+ keywords: [],
15485
15633
  uses: ["button", "empty"],
15486
15634
  usedBy: [],
15487
15635
  },
@@ -15892,6 +16040,7 @@ export const docsManifest = {
15892
16040
  "Forward the hook's `handleDragEnter/Leave/Over/Drop` and drag state into `dragging` so the drag styling matches the real drop-target state.",
15893
16041
  "Keep `title`/`description` (accepted types, size limit) accurate - they are the zone's only affordance copy; override the whole body via `children` when needed.",
15894
16042
  ],
16043
+ keywords: ["dropzone", "attachment", "file input"],
15895
16044
  uses: ["button", "center", "icon", "progress", "stack", "text"],
15896
16045
  usedBy: [],
15897
16046
  },
@@ -16021,6 +16170,7 @@ export const docsManifest = {
16021
16170
  "Drive drag-and-drop drop-target styling with `open` (forces the open look without revealing the action); use `selected`+`showSelectedState` for selection, not manual classes.",
16022
16171
  "`FolderTile` is itself the button - pass `name`/`onClick` and button props directly; don't wrap it in another `<button>`/`<a>`.",
16023
16172
  ],
16173
+ keywords: [],
16024
16174
  uses: ["center", "flex", "swatch-fan"],
16025
16175
  usedBy: [],
16026
16176
  },
@@ -16064,6 +16214,7 @@ export const docsManifest = {
16064
16214
  "Reserve `LoadingState` for a whole region / page with nothing to show yet; for in-place loading over existing layout prefer `Skeleton`, and a small inline spinner is `Spinner`.",
16065
16215
  'Pass `label` to name the live region for AT; it already renders `aria-live="polite"` with a default "Loading" name, so don\'t add your own status role.',
16066
16216
  ],
16217
+ keywords: [],
16067
16218
  uses: ["center", "spinner", "text"],
16068
16219
  usedBy: [],
16069
16220
  },
@@ -16222,6 +16373,7 @@ export const docsManifest = {
16222
16373
  "Use it in a shell whose chrome is lifted (`Sidebar header`, the fixed `SidebarLayoutHeader`): the panel fills the window from the top, beneath the chrome, so the brand row, search and actions stay on top of it.",
16223
16374
  "Keep it to navigation. Every entry is a `MegaMenuLink`, which closes the menu as it navigates; actions belong in a `DropdownMenu`.",
16224
16375
  ],
16376
+ keywords: [],
16225
16377
  uses: ["anchor", "box", "grid", "heading", "popover", "stack"],
16226
16378
  usedBy: [],
16227
16379
  },
@@ -16277,7 +16429,7 @@ export const docsManifest = {
16277
16429
  name: "as",
16278
16430
  type: '"div" | "article" | "aside" | "figcaption" | "figure" | "footer" | "header" | "li" | "main" | "nav" | "ol" | "section" | "span" | "ul"',
16279
16431
  required: false,
16280
- description: 'Render as a different host element from the closed layout vocabulary\n({@link LayoutElement}). The set is deliberately closed: `as="button"` is a\ntype error, because the design-system answer is the Button component. Event handlers\nand the ref accept any host element.\n\n`as` and `render` are mutually exclusive; if both are passed, `render`\nwins (a dev-only warning fires).',
16432
+ description: 'Render as a different host element from the closed layout vocabulary\n(`LayoutElement`). The set is deliberately closed: `as="button"` is a\ntype error, because the design-system answer is the Button component. Event handlers\nand the ref accept any host element.\n\n`as` and `render` are mutually exclusive; if both are passed, `render`\nwins (a dev-only warning fires).',
16281
16433
  },
16282
16434
  {
16283
16435
  name: "direction",
@@ -16478,7 +16630,7 @@ export const docsManifest = {
16478
16630
  name: "as",
16479
16631
  type: '"div" | "article" | "aside" | "figcaption" | "figure" | "footer" | "header" | "li" | "main" | "nav" | "ol" | "section" | "span" | "ul"',
16480
16632
  required: false,
16481
- description: 'Render as a different host element from the closed layout vocabulary\n({@link LayoutElement}). The set is deliberately closed: `as="button"` is a\ntype error, because the design-system answer is the Button component. Event handlers\nand the ref accept any host element.\n\n`as` and `render` are mutually exclusive; if both are passed, `render`\nwins (a dev-only warning fires).',
16633
+ description: 'Render as a different host element from the closed layout vocabulary\n(`LayoutElement`). The set is deliberately closed: `as="button"` is a\ntype error, because the design-system answer is the Button component. Event handlers\nand the ref accept any host element.\n\n`as` and `render` are mutually exclusive; if both are passed, `render`\nwins (a dev-only warning fires).',
16482
16634
  },
16483
16635
  {
16484
16636
  name: "align",
@@ -16518,7 +16670,7 @@ export const docsManifest = {
16518
16670
  name: "as",
16519
16671
  type: '"dd" | "dt" | "figcaption" | "legend" | "li" | "p" | "span"',
16520
16672
  required: false,
16521
- description: 'Render as a different host element from the closed text vocabulary\n({@link TextElement}). The set is deliberately closed and text-only:\n`as="div"` and `as="label"` are type errors (use Box for decorative\nwrappers, Label for form labels). Ref and event-handler types remain the\ndefault element\'s (HTMLParagraphElement).\n\n`as` and `render` are mutually exclusive; if both are passed, `render`\nwins (a dev-only warning fires).',
16673
+ description: 'Render as a different host element from the closed text vocabulary\n(`TextElement`). The set is deliberately closed and text-only:\n`as="div"` and `as="label"` are type errors (use Box for decorative\nwrappers, Label for form labels). Ref and event-handler types remain the\ndefault element\'s (HTMLParagraphElement).\n\n`as` and `render` are mutually exclusive; if both are passed, `render`\nwins (a dev-only warning fires).',
16522
16674
  },
16523
16675
  {
16524
16676
  name: "size",
@@ -16620,7 +16772,7 @@ export const docsManifest = {
16620
16772
  name: "as",
16621
16773
  type: '"div" | "article" | "aside" | "figcaption" | "figure" | "footer" | "header" | "li" | "main" | "nav" | "ol" | "section" | "span" | "ul"',
16622
16774
  required: false,
16623
- description: 'Render as a different host element from the closed layout vocabulary\n({@link LayoutElement}). The set is deliberately closed: `as="button"` is a\ntype error, because the design-system answer is the Button component. Event handlers\nand the ref accept any host element.\n\n`as` and `render` are mutually exclusive; if both are passed, `render`\nwins (a dev-only warning fires).',
16775
+ description: 'Render as a different host element from the closed layout vocabulary\n(`LayoutElement`). The set is deliberately closed: `as="button"` is a\ntype error, because the design-system answer is the Button component. Event handlers\nand the ref accept any host element.\n\n`as` and `render` are mutually exclusive; if both are passed, `render`\nwins (a dev-only warning fires).',
16624
16776
  },
16625
16777
  {
16626
16778
  name: "align",
@@ -16673,7 +16825,7 @@ export const docsManifest = {
16673
16825
  name: "as",
16674
16826
  type: '"div" | "article" | "aside" | "figcaption" | "figure" | "footer" | "header" | "li" | "main" | "nav" | "ol" | "section" | "span" | "ul"',
16675
16827
  required: false,
16676
- description: 'Render as a different host element from the closed layout vocabulary\n({@link LayoutElement}). The set is deliberately closed: `as="button"` is a\ntype error, because the design-system answer is the Button component. Event handlers\nand the ref accept any host element.\n\n`as` and `render` are mutually exclusive; if both are passed, `render`\nwins (a dev-only warning fires).',
16828
+ description: 'Render as a different host element from the closed layout vocabulary\n(`LayoutElement`). The set is deliberately closed: `as="button"` is a\ntype error, because the design-system answer is the Button component. Event handlers\nand the ref accept any host element.\n\n`as` and `render` are mutually exclusive; if both are passed, `render`\nwins (a dev-only warning fires).',
16677
16829
  },
16678
16830
  {
16679
16831
  name: "align",
@@ -16726,7 +16878,7 @@ export const docsManifest = {
16726
16878
  name: "as",
16727
16879
  type: '"div" | "article" | "aside" | "figcaption" | "figure" | "footer" | "header" | "li" | "main" | "nav" | "ol" | "section" | "span" | "ul"',
16728
16880
  required: false,
16729
- description: 'Render as a different host element from the closed layout vocabulary\n({@link LayoutElement}). The set is deliberately closed: `as="button"` is a\ntype error, because the design-system answer is the Button component. Event handlers\nand the ref accept any host element.\n\n`as` and `render` are mutually exclusive; if both are passed, `render`\nwins (a dev-only warning fires).',
16881
+ description: 'Render as a different host element from the closed layout vocabulary\n(`LayoutElement`). The set is deliberately closed: `as="button"` is a\ntype error, because the design-system answer is the Button component. Event handlers\nand the ref accept any host element.\n\n`as` and `render` are mutually exclusive; if both are passed, `render`\nwins (a dev-only warning fires).',
16730
16882
  },
16731
16883
  {
16732
16884
  name: "align",
@@ -16920,7 +17072,7 @@ export const docsManifest = {
16920
17072
  name: "as",
16921
17073
  type: '"div" | "article" | "aside" | "figcaption" | "figure" | "footer" | "header" | "li" | "main" | "nav" | "ol" | "section" | "span" | "ul"',
16922
17074
  required: false,
16923
- description: 'Render as a different host element from the closed layout vocabulary\n({@link LayoutElement}). The set is deliberately closed: `as="button"` is a\ntype error, because the design-system answer is the Button component. Event handlers\nand the ref accept any host element.\n\n`as` and `render` are mutually exclusive; if both are passed, `render`\nwins (a dev-only warning fires).',
17075
+ description: 'Render as a different host element from the closed layout vocabulary\n(`LayoutElement`). The set is deliberately closed: `as="button"` is a\ntype error, because the design-system answer is the Button component. Event handlers\nand the ref accept any host element.\n\n`as` and `render` are mutually exclusive; if both are passed, `render`\nwins (a dev-only warning fires).',
16924
17076
  },
16925
17077
  {
16926
17078
  name: "align",
@@ -17117,7 +17269,7 @@ export const docsManifest = {
17117
17269
  name: "dot",
17118
17270
  type: 'boolean | "neutral" | "brand" | "danger" | "warning" | "success" | "info"',
17119
17271
  required: false,
17120
- description: "Show a status dot in place of the leading icon. `true` uses the default\naffirmative tint; a {@link Tone} value tints it from the shared dot palette.",
17272
+ description: "Show a status dot in place of the leading icon. `true` uses the default\naffirmative tint; a `Tone` value tints it from the shared dot palette.",
17121
17273
  },
17122
17274
  {
17123
17275
  name: "icon",
@@ -17269,7 +17421,7 @@ export const docsManifest = {
17269
17421
  name: "as",
17270
17422
  type: '"div" | "article" | "aside" | "figcaption" | "figure" | "footer" | "header" | "li" | "main" | "nav" | "ol" | "section" | "span" | "ul"',
17271
17423
  required: false,
17272
- description: 'Render as a different host element from the closed layout vocabulary\n({@link LayoutElement}). The set is deliberately closed: `as="button"` is a\ntype error, because the design-system answer is the Button component. Event handlers\nand the ref accept any host element.\n\n`as` and `render` are mutually exclusive; if both are passed, `render`\nwins (a dev-only warning fires).',
17424
+ description: 'Render as a different host element from the closed layout vocabulary\n(`LayoutElement`). The set is deliberately closed: `as="button"` is a\ntype error, because the design-system answer is the Button component. Event handlers\nand the ref accept any host element.\n\n`as` and `render` are mutually exclusive; if both are passed, `render`\nwins (a dev-only warning fires).',
17273
17425
  },
17274
17426
  {
17275
17427
  name: "align",
@@ -17543,6 +17695,7 @@ export const docsManifest = {
17543
17695
  'It\'s `role="dialog"`+`aria-modal` and hidden from `lg` up, so pair it with a desktop nav rather than showing both at once.',
17544
17696
  'Override the default "Navigation menu" accessible name via `aria-label` when the drawer\'s purpose is more specific.',
17545
17697
  ],
17698
+ keywords: [],
17546
17699
  uses: [
17547
17700
  "avatar",
17548
17701
  "button",
@@ -17761,6 +17914,7 @@ export const docsManifest = {
17761
17914
  'Set `layout="stacked"` and wrap each row in `PageHeaderRow` for multi-row headers; the default `"single"` wraps only when a narrow viewport needs to protect the title or actions.',
17762
17915
  "`PageHeader` is the sub-header below the app `HeaderBar`, not the app chrome itself - use `SidebarProvider` with `SidebarInset` or `HeaderBar` for the top-level frame; its `sticky` offset assumes that header is present.",
17763
17916
  ],
17917
+ keywords: [],
17764
17918
  uses: ["flex", "heading", "text"],
17765
17919
  usedBy: [],
17766
17920
  },
@@ -17799,7 +17953,7 @@ export const docsManifest = {
17799
17953
  name: "as",
17800
17954
  type: '"div" | "article" | "aside" | "figcaption" | "figure" | "footer" | "header" | "li" | "main" | "nav" | "ol" | "section" | "span" | "ul"',
17801
17955
  required: false,
17802
- description: 'Render as a different host element from the closed layout vocabulary\n({@link LayoutElement}). The set is deliberately closed: `as="button"` is a\ntype error, because the design-system answer is the Button component. Event handlers\nand the ref accept any host element.\n\n`as` and `render` are mutually exclusive; if both are passed, `render`\nwins (a dev-only warning fires).',
17956
+ description: 'Render as a different host element from the closed layout vocabulary\n(`LayoutElement`). The set is deliberately closed: `as="button"` is a\ntype error, because the design-system answer is the Button component. Event handlers\nand the ref accept any host element.\n\n`as` and `render` are mutually exclusive; if both are passed, `render`\nwins (a dev-only warning fires).',
17803
17957
  },
17804
17958
  {
17805
17959
  name: "direction",
@@ -17872,7 +18026,7 @@ export const docsManifest = {
17872
18026
  name: "as",
17873
18027
  type: '"div" | "article" | "aside" | "figcaption" | "figure" | "footer" | "header" | "li" | "main" | "nav" | "ol" | "section" | "span" | "ul"',
17874
18028
  required: false,
17875
- description: 'Render as a different host element from the closed layout vocabulary\n({@link LayoutElement}). The set is deliberately closed: `as="button"` is a\ntype error, because the design-system answer is the Button component. Event handlers\nand the ref accept any host element.\n\n`as` and `render` are mutually exclusive; if both are passed, `render`\nwins (a dev-only warning fires).',
18029
+ description: 'Render as a different host element from the closed layout vocabulary\n(`LayoutElement`). The set is deliberately closed: `as="button"` is a\ntype error, because the design-system answer is the Button component. Event handlers\nand the ref accept any host element.\n\n`as` and `render` are mutually exclusive; if both are passed, `render`\nwins (a dev-only warning fires).',
17876
18030
  },
17877
18031
  {
17878
18032
  name: "direction",
@@ -17975,7 +18129,7 @@ export const docsManifest = {
17975
18129
  name: "as",
17976
18130
  type: '"div" | "article" | "aside" | "figcaption" | "figure" | "footer" | "header" | "li" | "main" | "nav" | "ol" | "section" | "span" | "ul"',
17977
18131
  required: false,
17978
- description: 'Render as a different host element from the closed layout vocabulary\n({@link LayoutElement}). The set is deliberately closed: `as="button"` is a\ntype error, because the design-system answer is the Button component. Event handlers\nand the ref accept any host element.\n\n`as` and `render` are mutually exclusive; if both are passed, `render`\nwins (a dev-only warning fires).',
18132
+ description: 'Render as a different host element from the closed layout vocabulary\n(`LayoutElement`). The set is deliberately closed: `as="button"` is a\ntype error, because the design-system answer is the Button component. Event handlers\nand the ref accept any host element.\n\n`as` and `render` are mutually exclusive; if both are passed, `render`\nwins (a dev-only warning fires).',
17979
18133
  },
17980
18134
  {
17981
18135
  name: "direction",
@@ -18094,7 +18248,7 @@ export const docsManifest = {
18094
18248
  name: "as",
18095
18249
  type: '"div" | "article" | "aside" | "figcaption" | "figure" | "footer" | "header" | "li" | "main" | "nav" | "ol" | "section" | "span" | "ul"',
18096
18250
  required: false,
18097
- description: 'Render as a different host element from the closed layout vocabulary\n({@link LayoutElement}). The set is deliberately closed: `as="button"` is a\ntype error, because the design-system answer is the Button component. Event handlers\nand the ref accept any host element.\n\n`as` and `render` are mutually exclusive; if both are passed, `render`\nwins (a dev-only warning fires).',
18251
+ description: 'Render as a different host element from the closed layout vocabulary\n(`LayoutElement`). The set is deliberately closed: `as="button"` is a\ntype error, because the design-system answer is the Button component. Event handlers\nand the ref accept any host element.\n\n`as` and `render` are mutually exclusive; if both are passed, `render`\nwins (a dev-only warning fires).',
18098
18252
  },
18099
18253
  {
18100
18254
  name: "direction",
@@ -18395,6 +18549,7 @@ export const docsManifest = {
18395
18549
  "Each facet appears once. A `SegmentedControl` when the facet splits the set and one part is viewed at a time (its counts sum to the total); `PageToolbarFilter` chips when several combine. Never both for the same facet.",
18396
18550
  "Keep the actions to `PageToolbarSort`, which names the current order, and a view toggle. Page actions such as export belong in the `PageHeader`.",
18397
18551
  ],
18552
+ keywords: [],
18398
18553
  uses: [
18399
18554
  "box",
18400
18555
  "button",
@@ -18452,7 +18607,7 @@ export const docsManifest = {
18452
18607
  name: "dragging",
18453
18608
  type: "boolean | undefined",
18454
18609
  required: false,
18455
- description: "Swatch mode: set while the host is dragging the tile. Hides Quick view, the\ncaption and the add control and keeps the elevated shell. Distinct from\n{@link dragAdapter}, which wires a drag handle around the image.",
18610
+ description: "Swatch mode: set while the host is dragging the tile. Hides Quick view, the\ncaption and the add control and keeps the elevated shell. Distinct from\n`dragAdapter`, which wires a drag handle around the image.",
18456
18611
  },
18457
18612
  {
18458
18613
  name: "onAdd",
@@ -18478,7 +18633,7 @@ export const docsManifest = {
18478
18633
  type: "ProductCardAvailability | undefined",
18479
18634
  required: false,
18480
18635
  defaultValue: '"available"',
18481
- description: "Whether the product can be acted on - see {@link ProductCardAvailability}.",
18636
+ description: "Whether the product can be acted on - see `ProductCardAvailability`.",
18482
18637
  },
18483
18638
  {
18484
18639
  name: "dragAdapter",
@@ -18539,13 +18694,13 @@ export const docsManifest = {
18539
18694
  name: "price",
18540
18695
  type: "ReactNode",
18541
18696
  required: false,
18542
- description: "Price, supplied by the application as already-formatted content. Replaces\n`costIndicator` on the meta line. The card does no currency or tax logic.\nShipping and delivery flags go through {@link action}, whose `label` is\nalso a ReactNode.",
18697
+ description: "Price, supplied by the application as already-formatted content. Replaces\n`costIndicator` on the meta line. The card does no currency or tax logic.\nShipping and delivery flags go through `action`, whose `label` is\nalso a ReactNode.",
18543
18698
  },
18544
18699
  {
18545
18700
  name: "primaryAction",
18546
18701
  type: "ProductCardPrimaryAction | undefined",
18547
18702
  required: false,
18548
- description: "What this card's one labelled control offers - see\n{@link ProductCardPrimaryAction}.\n\nOmit entirely for a card with no control at all, which is the correct\nrendering for a product that can do nothing rather than a disabled button.\nOmitting also preserves the pre-existing cart-only behaviour for callers\nthat pass `renderAddToCart` and nothing else.",
18703
+ description: "What this card's one labelled control offers - see\n`ProductCardPrimaryAction`.\n\nOmit entirely for a card with no control at all, which is the correct\nrendering for a product that can do nothing rather than a disabled button.\nOmitting also preserves the pre-existing cart-only behaviour for callers\nthat pass `renderAddToCart` and nothing else.",
18549
18704
  },
18550
18705
  {
18551
18706
  name: "processing",
@@ -18800,7 +18955,7 @@ export const docsManifest = {
18800
18955
  name: "primaryAction",
18801
18956
  type: "ProductCardPrimaryAction | undefined",
18802
18957
  required: false,
18803
- description: "What this card's one labelled control offers - see\n{@link ProductCardPrimaryAction}.\n\nOmit entirely for a card with no control at all, which is the correct\nrendering for a product that can do nothing rather than a disabled button.\nOmitting also preserves the pre-existing cart-only behaviour for callers\nthat pass `renderAddToCart` and nothing else.",
18958
+ description: "What this card's one labelled control offers - see\n`ProductCardPrimaryAction`.\n\nOmit entirely for a card with no control at all, which is the correct\nrendering for a product that can do nothing rather than a disabled button.\nOmitting also preserves the pre-existing cart-only behaviour for callers\nthat pass `renderAddToCart` and nothing else.",
18804
18959
  },
18805
18960
  {
18806
18961
  name: "showActivePointer",
@@ -19077,14 +19232,14 @@ export const docsManifest = {
19077
19232
  name: "dragging",
19078
19233
  type: "boolean | undefined",
19079
19234
  required: false,
19080
- description: "Swatch mode: set while the host is dragging the tile. Hides Quick view, the\ncaption and the add control and keeps the elevated shell. Distinct from\n{@link dragAdapter}, which wires a drag handle around the image.",
19235
+ description: "Swatch mode: set while the host is dragging the tile. Hides Quick view, the\ncaption and the add control and keeps the elevated shell. Distinct from\n`dragAdapter`, which wires a drag handle around the image.",
19081
19236
  },
19082
19237
  {
19083
19238
  name: "availability",
19084
19239
  type: "ProductCardAvailability | undefined",
19085
19240
  required: false,
19086
19241
  defaultValue: '"available"',
19087
- description: "Whether the product can be acted on - see {@link ProductCardAvailability}.",
19242
+ description: "Whether the product can be acted on - see `ProductCardAvailability`.",
19088
19243
  },
19089
19244
  {
19090
19245
  name: "labels",
@@ -19146,7 +19301,7 @@ export const docsManifest = {
19146
19301
  name: "price",
19147
19302
  type: "ReactNode",
19148
19303
  required: false,
19149
- description: "Price, supplied by the application as already-formatted content. Replaces\n`costIndicator` on the meta line. The card does no currency or tax logic.\nShipping and delivery flags go through {@link action}, whose `label` is\nalso a ReactNode.",
19304
+ description: "Price, supplied by the application as already-formatted content. Replaces\n`costIndicator` on the meta line. The card does no currency or tax logic.\nShipping and delivery flags go through `action`, whose `label` is\nalso a ReactNode.",
19150
19305
  },
19151
19306
  {
19152
19307
  name: "processing",
@@ -19176,7 +19331,7 @@ export const docsManifest = {
19176
19331
  name: "primaryAction",
19177
19332
  type: "ProductCardPrimaryAction | undefined",
19178
19333
  required: false,
19179
- description: "What this card's one labelled control offers - see\n{@link ProductCardPrimaryAction}.\n\nOmit entirely for a card with no control at all, which is the correct\nrendering for a product that can do nothing rather than a disabled button.\nOmitting also preserves the pre-existing cart-only behaviour for callers\nthat pass `renderAddToCart` and nothing else.",
19334
+ description: "What this card's one labelled control offers - see\n`ProductCardPrimaryAction`.\n\nOmit entirely for a card with no control at all, which is the correct\nrendering for a product that can do nothing rather than a disabled button.\nOmitting also preserves the pre-existing cart-only behaviour for callers\nthat pass `renderAddToCart` and nothing else.",
19180
19335
  },
19181
19336
  {
19182
19337
  name: "product",
@@ -19395,7 +19550,7 @@ export const docsManifest = {
19395
19550
  name: "labels",
19396
19551
  type: 'Pick<ProductCardLabels, "add" | "closeSuggestions" | "suggest"> | undefined',
19397
19552
  required: false,
19398
- description: "Strings, overridable; see {@link ProductCardLabels}.",
19553
+ description: "Strings, overridable; see `ProductCardLabels`.",
19399
19554
  },
19400
19555
  {
19401
19556
  name: "menuOpen",
@@ -19481,6 +19636,7 @@ export const docsManifest = {
19481
19636
  "Pass `renderImage` wrapping `next/image` in Next.js apps -\nthe default renderer is a plain `<img>` and skips Next's optimisation.",
19482
19637
  "Keep `dragAdapter` referentially stable (a module-level\nconstant) - an inline factory remounts the image subtree and drops the\ndrag ref mid-drag.",
19483
19638
  ],
19639
+ keywords: [],
19484
19640
  uses: [
19485
19641
  "badge",
19486
19642
  "box",
@@ -19572,6 +19728,7 @@ export const docsManifest = {
19572
19728
  "It renders nothing when there are no `variantOptions` dimensions and no `siblings` with images - supply `siblings`/`siblingsWithAttributes` so single-colourway products still show a fallback thumbnail.",
19573
19729
  "Pass `renderImage` (wrapping `next/image`) in Next.js; the default is a plain `<img>`. The component ships bare - wrap it in a `Card` with your own heading when a panel is wanted.",
19574
19730
  ],
19731
+ keywords: [],
19575
19732
  uses: ["label", "radio-card", "stack", "variant-selector"],
19576
19733
  usedBy: [],
19577
19734
  },
@@ -19874,6 +20031,7 @@ export const docsManifest = {
19874
20031
  'Pass `title` (or an explicit `aria-label`) - the panel is a `role="dialog"` surface floating over other content, so it needs an accessible name of its own.',
19875
20032
  "Wrap step transitions in `PromptPanelStage`, not a hand-rolled page swap - it owns the page-slide choreography and the reduced-motion fallback.",
19876
20033
  ],
20034
+ keywords: [],
19877
20035
  uses: ["button", "flex", "grid", "icon", "kbd", "stack"],
19878
20036
  usedBy: [],
19879
20037
  anatomy: {
@@ -20304,6 +20462,7 @@ export const docsManifest = {
20304
20462
  "Offer a way to the full page in the header's `actions` - a quick view previews, it does not replace the detail page.",
20305
20463
  "A panel that docks beside the page (a cart) is a `Sidepanel`, not a quick view.",
20306
20464
  ],
20465
+ keywords: [],
20307
20466
  uses: ["box", "button", "dialog", "flex", "grid", "scroll-area", "stack"],
20308
20467
  usedBy: [],
20309
20468
  },
@@ -20322,7 +20481,7 @@ export const docsManifest = {
20322
20481
  name: "as",
20323
20482
  type: '"div" | "article" | "aside" | "figcaption" | "figure" | "footer" | "header" | "li" | "main" | "nav" | "ol" | "section" | "span" | "ul"',
20324
20483
  required: false,
20325
- description: 'Render as a different host element from the closed layout vocabulary\n({@link LayoutElement}). The set is deliberately closed: `as="button"` is a\ntype error, because the design-system answer is the Button component. Ref\nand event-handler types remain the default element\'s.\n\n`as` and `render` are mutually exclusive; if both are passed, `render`\nwins (a dev-only warning fires).',
20484
+ description: 'Render as a different host element from the closed layout vocabulary\n(`LayoutElement`). The set is deliberately closed: `as="button"` is a\ntype error, because the design-system answer is the Button component. Ref\nand event-handler types remain the default element\'s.\n\n`as` and `render` are mutually exclusive; if both are passed, `render`\nwins (a dev-only warning fires).',
20326
20485
  },
20327
20486
  {
20328
20487
  name: "actions",
@@ -20382,6 +20541,7 @@ export const docsManifest = {
20382
20541
  "Set `level` for the document outline and `size` for visual scale independently - a visually small header can still be an `h2`. Use `reserveEyebrowSpace` to keep an eyebrow-less header aligned beside sibling headers that have an eyebrow.",
20383
20542
  "Use `as` to change the element (a tag); use `render` only to swap in a component (e.g. a router Link). Never `render={<Box as=…/>}` - pass `as` directly.",
20384
20543
  ],
20544
+ keywords: [],
20385
20545
  uses: ["flex", "heading", "text"],
20386
20546
  usedBy: [],
20387
20547
  },
@@ -20538,6 +20698,7 @@ export const docsManifest = {
20538
20698
  "The footer only renders when `onSave` is passed, and the Save button is gated on `dirty` (and disabled while `loading`) - wire form dirty state through, or the button stays disabled.",
20539
20699
  "Give each card one cohesive group of settings with its own save; don't nest multiple `SettingsCard`s or share one across unrelated sections.",
20540
20700
  ],
20701
+ keywords: [],
20541
20702
  uses: ["button", "card", "field", "flex"],
20542
20703
  usedBy: [],
20543
20704
  anatomy: {
@@ -20575,7 +20736,7 @@ export const docsManifest = {
20575
20736
  module: "compositions/sidebar",
20576
20737
  title: "Sidebar",
20577
20738
  category: "navigation",
20578
- description: 'The sidebar shell. Reads open/collapsed state from {@link useSidebar}, so it\nmust render inside a {@link SidebarProvider}.\n\nAdapts by viewport and `collapsible`: an animated docked shell on desktop, a\nslide-in `Sheet` on mobile, or a static column when `collapsible="none"`.',
20739
+ description: 'The sidebar shell. Reads open/collapsed state from `useSidebar`, so it\nmust render inside a `SidebarProvider`.\n\nAdapts by viewport and `collapsible`: an animated docked shell on desktop, a\nslide-in `Sheet` on mobile, or a static column when `collapsible="none"`.',
20579
20740
  exports: [
20580
20741
  {
20581
20742
  name: "CONTENT_COLUMN_CLASS",
@@ -21223,7 +21384,7 @@ export const docsManifest = {
21223
21384
  name: "dot",
21224
21385
  type: 'boolean | "neutral" | "brand" | "danger" | "warning" | "success" | "info"',
21225
21386
  required: false,
21226
- description: "Dot indicator in the left column (takes precedence over icon): `true` for a neutral dot, or a {@link Tone} to tint it.",
21387
+ description: "Dot indicator in the left column (takes precedence over icon): `true` for a neutral dot, or a `Tone` to tint it.",
21227
21388
  },
21228
21389
  {
21229
21390
  name: "icon",
@@ -21536,6 +21697,7 @@ export const docsManifest = {
21536
21697
  "Render `Sidebar` inside a `SidebarProvider` - it reads open/collapsed state from `useSidebar` and cannot work outside one.",
21537
21698
  "Choose `collapsible` deliberately: `offcanvas` slides fully away, `icon` shrinks to a rail, `none` is a static column that never adapts to the mobile `Sheet`.",
21538
21699
  ],
21700
+ keywords: [],
21539
21701
  uses: [
21540
21702
  "button",
21541
21703
  "center",
@@ -21649,7 +21811,7 @@ export const docsManifest = {
21649
21811
  name: "as",
21650
21812
  type: '"div" | "article" | "aside" | "figcaption" | "figure" | "footer" | "header" | "li" | "main" | "nav" | "ol" | "section" | "span" | "ul"',
21651
21813
  required: false,
21652
- description: 'Render as a different host element from the closed layout vocabulary\n({@link LayoutElement}). The set is deliberately closed: `as="button"` is a\ntype error, because the design-system answer is the Button component. Event handlers\nand the ref accept any host element.\n\n`as` and `render` are mutually exclusive; if both are passed, `render`\nwins (a dev-only warning fires).',
21814
+ description: 'Render as a different host element from the closed layout vocabulary\n(`LayoutElement`). The set is deliberately closed: `as="button"` is a\ntype error, because the design-system answer is the Button component. Event handlers\nand the ref accept any host element.\n\n`as` and `render` are mutually exclusive; if both are passed, `render`\nwins (a dev-only warning fires).',
21653
21815
  },
21654
21816
  {
21655
21817
  name: "direction",
@@ -21835,7 +21997,7 @@ export const docsManifest = {
21835
21997
  name: "as",
21836
21998
  type: '"div" | "article" | "aside" | "figcaption" | "figure" | "footer" | "header" | "li" | "main" | "nav" | "ol" | "section" | "span" | "ul"',
21837
21999
  required: false,
21838
- description: 'Render as a different host element from the closed layout vocabulary\n({@link LayoutElement}). The set is deliberately closed: `as="button"` is a\ntype error, because the design-system answer is the Button component. Event handlers\nand the ref accept any host element.\n\n`as` and `render` are mutually exclusive; if both are passed, `render`\nwins (a dev-only warning fires).',
22000
+ description: 'Render as a different host element from the closed layout vocabulary\n(`LayoutElement`). The set is deliberately closed: `as="button"` is a\ntype error, because the design-system answer is the Button component. Event handlers\nand the ref accept any host element.\n\n`as` and `render` are mutually exclusive; if both are passed, `render`\nwins (a dev-only warning fires).',
21839
22001
  },
21840
22002
  {
21841
22003
  name: "align",
@@ -21880,7 +22042,7 @@ export const docsManifest = {
21880
22042
  name: "as",
21881
22043
  type: '"dd" | "dt" | "figcaption" | "legend" | "li" | "p" | "span"',
21882
22044
  required: false,
21883
- description: 'Render as a different host element from the closed text vocabulary\n({@link TextElement}). The set is deliberately closed and text-only:\n`as="div"` and `as="label"` are type errors (use Box for decorative\nwrappers, Label for form labels). Ref and event-handler types remain the\ndefault element\'s (HTMLParagraphElement).\n\n`as` and `render` are mutually exclusive; if both are passed, `render`\nwins (a dev-only warning fires).',
22045
+ description: 'Render as a different host element from the closed text vocabulary\n(`TextElement`). The set is deliberately closed and text-only:\n`as="div"` and `as="label"` are type errors (use Box for decorative\nwrappers, Label for form labels). Ref and event-handler types remain the\ndefault element\'s (HTMLParagraphElement).\n\n`as` and `render` are mutually exclusive; if both are passed, `render`\nwins (a dev-only warning fires).',
21884
22046
  },
21885
22047
  {
21886
22048
  name: "size",
@@ -21946,7 +22108,7 @@ export const docsManifest = {
21946
22108
  name: "as",
21947
22109
  type: '"div" | "article" | "aside" | "figcaption" | "figure" | "footer" | "header" | "li" | "main" | "nav" | "ol" | "section" | "span" | "ul"',
21948
22110
  required: false,
21949
- description: 'Render as a different host element from the closed layout vocabulary\n({@link LayoutElement}). The set is deliberately closed: `as="button"` is a\ntype error, because the design-system answer is the Button component. Event handlers\nand the ref accept any host element.\n\n`as` and `render` are mutually exclusive; if both are passed, `render`\nwins (a dev-only warning fires).',
22111
+ description: 'Render as a different host element from the closed layout vocabulary\n(`LayoutElement`). The set is deliberately closed: `as="button"` is a\ntype error, because the design-system answer is the Button component. Event handlers\nand the ref accept any host element.\n\n`as` and `render` are mutually exclusive; if both are passed, `render`\nwins (a dev-only warning fires).',
21950
22112
  },
21951
22113
  {
21952
22114
  name: "ref",
@@ -21974,7 +22136,7 @@ export const docsManifest = {
21974
22136
  name: "as",
21975
22137
  type: '"div" | "article" | "aside" | "figcaption" | "figure" | "footer" | "header" | "li" | "main" | "nav" | "ol" | "section" | "span" | "ul"',
21976
22138
  required: false,
21977
- description: 'Render as a different host element from the closed layout vocabulary\n({@link LayoutElement}). The set is deliberately closed: `as="button"` is a\ntype error, because the design-system answer is the Button component. Event handlers\nand the ref accept any host element.\n\n`as` and `render` are mutually exclusive; if both are passed, `render`\nwins (a dev-only warning fires).',
22139
+ description: 'Render as a different host element from the closed layout vocabulary\n(`LayoutElement`). The set is deliberately closed: `as="button"` is a\ntype error, because the design-system answer is the Button component. Event handlers\nand the ref accept any host element.\n\n`as` and `render` are mutually exclusive; if both are passed, `render`\nwins (a dev-only warning fires).',
21978
22140
  },
21979
22141
  {
21980
22142
  name: "ref",
@@ -22017,6 +22179,7 @@ export const docsManifest = {
22017
22179
  "Render it after the page's `<main>`, not inside it, so it stays the page's own footer landmark.",
22018
22180
  "Keep it to a lead, one nav and one bar. Four columns of a few links each is the shape it is set for.",
22019
22181
  ],
22182
+ keywords: [],
22020
22183
  uses: [
22021
22184
  "anchor",
22022
22185
  "box",
@@ -22034,7 +22197,7 @@ export const docsManifest = {
22034
22197
  module: "compositions/swatch-fan",
22035
22198
  title: "SwatchFan",
22036
22199
  category: "catalogue",
22037
- description: 'A fanned stack of {@link Swatch} tiles: a fixed three-card editorial fan or\nan interactive N-tile splay.\n\nPass 3 `items` with `interaction="breathe"` for the editorial fan (Figma\ngeometry, `variant` spread/stack, white 3px mount via `bordered`); pass N\n`items` with `interaction="hover-fan"` for the interactive splay-on-hover with\npointer tilt. `bordered={false}` swaps the white mount for the 1px hairline\ntile.',
22200
+ description: 'A fanned stack of `Swatch` tiles: a fixed three-card editorial fan or\nan interactive N-tile splay.\n\nPass 3 `items` with `interaction="breathe"` for the editorial fan (Figma\ngeometry, `variant` spread/stack, white 3px mount via `bordered`); pass N\n`items` with `interaction="hover-fan"` for the interactive splay-on-hover with\npointer tilt. `bordered={false}` swaps the white mount for the 1px hairline\ntile.',
22038
22201
  exports: [
22039
22202
  {
22040
22203
  name: "SwatchFan",
@@ -22224,6 +22387,7 @@ export const docsManifest = {
22224
22387
  "Needs `ReducedMotionProvider`; it already collapses the mount fan-out, hover nudge, and splay under reduced motion (snapping to the settled frame), so don't gate the interaction yourself.",
22225
22388
  "`bordered` is the mount-as-a-prop: `true` = white 3px card mount, `false` = 1px hairline - don't hand-roll either border in a wrapper.",
22226
22389
  ],
22390
+ keywords: [],
22227
22391
  uses: ["center", "flex", "swatch"],
22228
22392
  usedBy: ["editorial-card", "folder-tile"],
22229
22393
  },
@@ -22529,6 +22693,7 @@ export const docsManifest = {
22529
22693
  "A custom `trigger` render-prop is passed to `PopoverTrigger` as `render`, so return a single element that forwards its ref/props (e.g. a `Button`).",
22530
22694
  "Use `singleSelect` when only one tag may be chosen; for a fixed, non-editable list prefer `Combobox`/multi-`Select` and reserve `TagSelector` for managing the tag set itself.",
22531
22695
  ],
22696
+ keywords: [],
22532
22697
  uses: [
22533
22698
  "button",
22534
22699
  "dot",
@@ -22617,6 +22782,7 @@ export const docsManifest = {
22617
22782
  bestPractices: [
22618
22783
  "Pair above streaming answers in chat. Use ThinkingLoader when you only need a one-line narrated header without an expandable timeline.",
22619
22784
  ],
22785
+ keywords: [],
22620
22786
  uses: ["center", "flex", "grid", "icon", "text"],
22621
22787
  usedBy: [],
22622
22788
  },
@@ -22741,6 +22907,7 @@ export const docsManifest = {
22741
22907
  "`defaultValue` is uncontrolled: the selector tracks later picks itself. Pass `value` with `onValueChange` to control it.",
22742
22908
  "Use `VariantSelector` for image/colour swatch pickers; for a labelled icon-over-text option grid use `IconCard`, and for plain radio/checkbox lists use `RadioGroup`/`Checkbox`.",
22743
22909
  ],
22910
+ keywords: [],
22744
22911
  uses: ["flex", "swatch"],
22745
22912
  usedBy: ["product-specifications-selector"],
22746
22913
  },
@@ -22821,7 +22988,7 @@ export const docsManifest = {
22821
22988
  statement: "The six src layers form a strict one-directional dependency matrix (data ← tokens ← utils ← hooks ← components ← compositions); tokens additionally take no external packages.",
22822
22989
  gates: [
22823
22990
  {
22824
- path: "packages/ui/scripts/layer-matrix.mjs",
22991
+ path: "packages/ui/scripts/layer-matrix.ts",
22825
22992
  doctrine: "Each src layer may import only from the layers at or below it (data ← tokens ← utils ← hooks ← components ← compositions); tokens additionally stay free of external packages, except statement-level type-only imports which erase at build time.",
22826
22993
  },
22827
22994
  ],
@@ -22866,7 +23033,7 @@ export const docsManifest = {
22866
23033
  statement: "The full public export surface is captured as resolved-type hashes in api-report.md; any change to a public signature flips a hash and fails the gate until the report is regenerated and reviewed.",
22867
23034
  gates: [
22868
23035
  {
22869
- path: "packages/ui/scripts/generate-api-report.mjs",
23036
+ path: "packages/ui/scripts/generate-api-report.ts",
22870
23037
  doctrine: null,
22871
23038
  },
22872
23039
  ],