@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.
- package/README.md +2 -4
- package/agent-docs.md +9 -9
- package/dist/components/accordion/accordion-root.d.ts +1 -0
- package/dist/components/accordion/accordion-root.js +1 -0
- package/dist/components/alert/alert-root.d.ts +1 -0
- package/dist/components/alert/alert-root.js +1 -0
- package/dist/components/alert-dialog/alert-dialog-root.d.ts +1 -0
- package/dist/components/alert-dialog/alert-dialog-root.js +1 -0
- package/dist/components/avatar/avatar-root.d.ts +1 -0
- package/dist/components/avatar/avatar-root.js +1 -0
- package/dist/components/badge/badge-root.d.ts +1 -0
- package/dist/components/badge/badge-root.js +1 -0
- package/dist/components/calendar/calendar-root.js +1 -0
- package/dist/components/carousel/carousel-root.d.ts +1 -0
- package/dist/components/carousel/carousel-root.js +1 -0
- package/dist/components/chart/chart-root.d.ts +1 -0
- package/dist/components/chart/chart-root.js +1 -0
- package/dist/components/collapsible/collapsible-root.d.ts +1 -0
- package/dist/components/collapsible/collapsible-root.js +1 -0
- package/dist/components/combobox/combobox-root.d.ts +1 -0
- package/dist/components/combobox/combobox-root.js +1 -0
- package/dist/components/command/command-dialog.d.ts +5 -1
- package/dist/components/command/command-dialog.js +1 -1
- package/dist/components/command/command-input.js +5 -2
- package/dist/components/command/command-root.d.ts +1 -0
- package/dist/components/command/command-root.js +1 -0
- package/dist/components/dialog/dialog-content.d.ts +2 -0
- package/dist/components/dialog/dialog-content.js +3 -2
- package/dist/components/dialog/dialog-footer.d.ts +2 -0
- package/dist/components/dialog/dialog-footer.js +8 -8
- package/dist/components/dialog/dialog-root.d.ts +1 -0
- package/dist/components/dialog/dialog-root.js +1 -0
- package/dist/components/dialog/dialog-title.d.ts +2 -0
- package/dist/components/dialog/dialog-title.js +3 -1
- package/dist/components/drawer/drawer-root.d.ts +1 -0
- package/dist/components/drawer/drawer-root.js +1 -0
- package/dist/components/heading/heading-root.d.ts +1 -0
- package/dist/components/heading/heading-root.js +1 -0
- package/dist/components/input/input-root.d.ts +1 -0
- package/dist/components/input/input-root.js +1 -0
- package/dist/components/kbd/kbd-root.d.ts +1 -0
- package/dist/components/kbd/kbd-root.js +1 -0
- package/dist/components/logo/logo-mark.d.ts +1 -1
- package/dist/components/logo/logo-mark.js +1 -1
- package/dist/components/logotype/logotype-paths.d.ts +1 -1
- package/dist/components/logotype/logotype-paths.js +1 -1
- package/dist/components/month-year-picker/month-year-picker-root.d.ts +1 -0
- package/dist/components/month-year-picker/month-year-picker-root.js +1 -0
- package/dist/components/native-select/native-select-root.d.ts +1 -0
- package/dist/components/native-select/native-select-root.js +1 -0
- package/dist/components/pill/pill-root.d.ts +1 -0
- package/dist/components/pill/pill-root.js +1 -0
- package/dist/components/popover/popover-root.d.ts +1 -0
- package/dist/components/popover/popover-root.js +1 -0
- package/dist/components/quantity-control/quantity-control-root.d.ts +1 -0
- package/dist/components/quantity-control/quantity-control-root.js +1 -0
- package/dist/components/segmented-control/segmented-control-root.js +6 -3
- package/dist/components/segmented-control/segmented-control-variants.js +4 -1
- package/dist/components/select/select-root.d.ts +1 -0
- package/dist/components/select/select-root.js +1 -0
- package/dist/components/separator/separator-root.d.ts +1 -0
- package/dist/components/separator/separator-root.js +1 -0
- package/dist/components/sheet/sheet-root.d.ts +1 -0
- package/dist/components/sheet/sheet-root.js +1 -0
- package/dist/components/spinner/spinner-root.d.ts +1 -0
- package/dist/components/spinner/spinner-root.js +1 -0
- package/dist/components/stepper/stepper-root.d.ts +1 -0
- package/dist/components/stepper/stepper-root.js +1 -0
- package/dist/components/success-tick-ripple/success-tick-ripple-root.d.ts +1 -0
- package/dist/components/success-tick-ripple/success-tick-ripple-root.js +1 -0
- package/dist/components/swatch-selector/swatch-selector-item.js +4 -1
- package/dist/components/switch/switch-root.d.ts +1 -0
- package/dist/components/switch/switch-root.js +1 -0
- package/dist/components/tag/tag-root.d.ts +1 -0
- package/dist/components/tag/tag-root.js +1 -0
- package/dist/components/textarea/textarea-root.d.ts +1 -0
- package/dist/components/textarea/textarea-root.js +1 -0
- package/dist/components/time-slot-picker/time-slot-picker-root.d.ts +1 -0
- package/dist/components/time-slot-picker/time-slot-picker-root.js +1 -0
- package/dist/components/toast/toast-root.d.ts +1 -0
- package/dist/components/toast/toast-root.js +1 -0
- package/dist/components/tooltip/tooltip-root.d.ts +1 -0
- package/dist/components/tooltip/tooltip-root.js +1 -0
- package/dist/compositions/empty-state/empty-state-root.d.ts +1 -0
- package/dist/compositions/empty-state/empty-state-root.js +1 -0
- package/dist/compositions/file-upload/file-upload-dropzone.d.ts +1 -0
- package/dist/compositions/file-upload/file-upload-dropzone.js +1 -0
- package/dist/data/decision-trees.d.ts +1 -1
- package/dist/data/decision-trees.js +1 -1
- package/dist/data/docs-manifest.d.ts +2 -0
- package/dist/data/docs-manifest.js +235 -68
- package/dist/styles/index.css +0 -1
- package/dist/tokens/segmented.d.ts +8 -0
- package/dist/tokens/segmented.js +26 -0
- package/dist/utils/cn-theme.js +1 -1
- package/lint/README.md +6 -2
- package/lint/doctrine-rules.mjs +4 -4
- package/lint/oxlint/index.d.mts +13 -5
- package/lint/oxlint/index.mjs +26 -0
- package/lint/oxlint/no-naked-element.mjs +123 -65
- package/lint/oxlint/no-render-layout-as.mjs +61 -56
- package/lint/scan-classes.d.mts +58 -5
- package/lint/scan-classes.mjs +274 -38
- package/lint/tokens.d.mts +16 -8
- package/lint/tokens.mjs +13 -3
- package/lint/type-case.d.mts +16 -8
- package/lint/type-case.mjs +17 -0
- package/package.json +27 -14
- package/lint/oxlint/fixtures/allowed.tsx +0 -12
- package/lint/oxlint/fixtures/fixture.config.mjs +0 -29
- package/lint/oxlint/fixtures/invalid.tsx +0 -24
- package/lint/oxlint/fixtures/layout-only.tsx +0 -26
- package/lint/oxlint/fixtures/render-as-invalid.tsx +0 -11
- package/lint/oxlint/fixtures/render-as-valid.tsx +0 -14
- package/lint/oxlint/fixtures/valid.tsx +0 -18
- package/lint/oxlint/no-naked-element.test.ts +0 -155
- 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.
|
|
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(
|
|
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
|
|
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
|
|
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(
|
|
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(
|
|
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
|
-
|
|
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(
|
|
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
|
|
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
|
|
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
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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
|
|
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
|
|
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(
|
|
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(
|
|
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
|
|
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(
|
|
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
|
|
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(
|
|
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(
|
|
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(
|
|
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
|
|
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
|
|
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
|
|
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(
|
|
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
|
|
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
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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(
|
|
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
|
|
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
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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
|
|
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.
|
|
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.
|
|
23036
|
+
path: "packages/ui/scripts/generate-api-report.ts",
|
|
22870
23037
|
doctrine: null,
|
|
22871
23038
|
},
|
|
22872
23039
|
],
|