@assure-one/design-system 1.37.0 → 1.38.0

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.
@@ -15,74 +15,455 @@
15
15
  "hooks/utilities": "Non-rendering exports: hooks, class-name helpers, formatters and token objects."
16
16
  },
17
17
  "needs": [
18
- { "need": "Trigger an action", "use": ["Button", "IconButton"], "notes": "`IconButton` when the control is only an icon (it requires an accessible name and shows a tooltip). Same `variant` × `intent` × `size` axes." },
19
- { "need": "Navigate somewhere with a button look", "use": ["LinkButton"], "notes": "Renders an `<a href>`; `Button asChild` around your router's `Link` is the alternative." },
20
- { "need": "Submit a form", "use": ["SubmitButton"], "notes": "Full-width by default; `type=\"submit\"` and pending state handled." },
21
- { "need": "Make something that is not a button clickable", "use": ["Pressable"], "notes": "Keyboard, focus ring, disabled handling, no button chrome. Never `<div onClick>`." },
22
- { "need": "Confirm a destructive action", "use": ["ConfirmActionButton", "ConfirmDialog", "ConfirmHost"], "notes": "`ConfirmActionButton` wraps the dialog around any trigger; `ConfirmDialog` when you control `open` or need a form field in the body; `useConfirm()` / `usePrompt()` to `await` an answer from an event handler (needs `DesignSystemProvider confirm` or a `ConfirmHost`)." },
23
- { "need": "Act on selected rows", "use": ["BulkActionBar"], "notes": "Floating bar with the count and the row actions." },
24
- { "need": "Keep Save / Cancel visible at the bottom of a long form", "use": ["StickyActionBar"] },
25
- { "need": "Label + help + error around any control", "use": ["Field"], "notes": "`Label`, `FieldDescription`, `FieldError` inside; controls bind automatically. `Fieldset` groups several. `FieldControl` wires a non-DS control." },
26
- { "need": "Free text, one line", "use": ["Input"], "notes": "`SearchInput` for search boxes, `NumberInput` for numbers, `PhoneField` for phone numbers, `OTPInput` for codes." },
27
- { "need": "A phone number", "use": ["PhoneField"], "notes": "Country picker + national number, E.164 value. `PhoneInput` and `PhoneCountryInput` are deprecated." },
28
- { "need": "Free text, several lines", "use": ["Textarea"] },
29
- { "need": "A number with formatting or steppers", "use": ["NumberInput"] },
30
- { "need": "A date, or a date range", "use": ["DatePicker", "DateRangePicker"], "notes": "`Calendar` alone when the picker should be inline rather than in a popover." },
31
- { "need": "Upload files", "use": ["FileUpload"], "notes": "`DocumentRequestUpload` for the client-portal request flow." },
32
- { "need": "Yes / no", "use": ["Checkbox", "Switch"], "notes": "`Switch` when the change applies immediately, `Checkbox` when it is submitted with the form or is one of several." },
33
- { "need": "One of a few visible options", "use": ["RadioGroup", "ToggleGroup"], "notes": "`RadioGroup` in forms; `ToggleGroup` for view/mode switches with immediate effect." },
34
- { "need": "One of many options in a dropdown", "use": ["Select", "Combobox"], "notes": "`Select` for short static lists; `Combobox` when the user should type to filter or the list is large or async." },
35
- { "need": "Several of many options", "use": ["MultiSelect", "MultiSelectField"], "notes": "`MultiSelect` is the searchable dropdown; `MultiSelectField` a visible pill toggle row for a handful of options." },
36
- { "need": "Pick a client or a team member", "use": ["ClientSelect", "TeamMemberSelect"] },
37
- { "need": "Filter a list", "use": ["Toolbar", "MultiFilterPill", "DisplayMenu"], "notes": "`FilterChip` inside `Toolbar` for one-value filters, `MultiFilterPill` for multi-value, `DisplayMenu` for the Linear-style filter/group/sort/columns menu." },
38
- { "need": "Removable or toggleable tokens (tags, applied filters)", "use": ["Chip"], "notes": "`DismissibleChip` is the older single-purpose removable chip." },
39
- { "need": "A slider value", "use": ["Slider"] },
40
- { "need": "Show a message inline (success, warning, error, info)", "use": ["Alert"] },
41
- { "need": "Notify after an action", "use": ["ToastProvider"], "notes": "`useToast()` from inside the provider." },
42
- { "need": "Show loading", "use": ["Spinner", "Skeleton", "LoadingRows"], "notes": "`Spinner` inside a control or small area, `Skeleton` for a shape, `LoadingRows` for list/table rows." },
43
- { "need": "Show progress", "use": ["ProgressBar", "ProgressRing", "SegmentedProgress", "Stepper"], "notes": "`Stepper` when the steps have names; `SuiteProgress` for the suite's segmented percent meter." },
44
- { "need": "Nothing to show yet", "use": ["EmptyState", "ComingSoon"] },
45
- { "need": "A modal task or message", "use": ["Dialog", "ResponsiveDialog"], "notes": "`ResponsiveDialog` becomes a `Sheet` on small screens." },
46
- { "need": "A side panel", "use": ["Sheet", "SideDrawer"], "notes": "`Sheet` is the Radix-based standard; `SideDrawer` is the older API kept for existing call sites." },
47
- { "need": "A contextual menu of actions", "use": ["DropdownMenu", "ContextMenu", "NewMenu"], "notes": "`ContextMenu` on right-click; `NewMenu` is the ready-made \"+ New\" creation menu." },
48
- { "need": "Extra content on hover or click", "use": ["Tooltip", "Popover", "HoverCard"], "notes": "`Tooltip` for a short label, `Popover` for interactive content, `HoverCard` for a rich preview on hover." },
49
- { "need": "A global command / search box", "use": ["CommandPalette", "KeyboardShortcutsDialog"] },
50
- { "need": "Switch between views", "use": ["Tabs", "ChannelTabs", "BottomNav"], "notes": "`BottomNav` is the mobile tab bar." },
51
- { "need": "Where am I", "use": ["Breadcrumb", "PageHeader", "AppHeader"] },
52
- { "need": "Page through results", "use": ["Pagination"], "notes": "`DataTablePagination` inside a `DataTable`." },
53
- { "need": "A tree or a rail of items", "use": ["FolderTree", "ClientRailItem"] },
54
- { "need": "Space things out", "use": ["Stack", "Inline"], "notes": "Tokenised gap and alignment; never ad-hoc `flex gap-*` in product code." },
55
- { "need": "A bordered box or card", "use": ["Surface", "Card"], "notes": "`Card` adds header/title/description/footer parts and an interactive variant." },
56
- { "need": "A divider", "use": ["Separator", "CategoryDivider"] },
57
- { "need": "Collapse content", "use": ["Collapsible", "Accordion"] },
58
- { "need": "Scroll a region", "use": ["ScrollArea"] },
59
- { "need": "Title a page or a section", "use": ["PageHeader", "SectionHeader", "Heading"] },
60
- { "need": "Body text, captions, code, keys", "use": ["Text", "Code", "Kbd", "Blockquote"] },
61
- { "need": "A number with a caption", "use": ["Stat", "KpiCard"], "notes": "`KpiCard` is the dashboard tile with tone and hint." },
62
- { "need": "A table of records", "use": ["DataTableView", "DataTable", "Table"], "notes": "`DataTableView` is config-driven (columns + data, owns search/sort/pagination); `DataTable` the composable parts; `Table` the bare semantic table." },
63
- { "need": "Label / value pairs", "use": ["MetadataGrid"] },
64
- { "need": "A status word or count", "use": ["StatusBadge", "Badge", "StatusPill", "StatusDot"], "notes": "`StatusBadge` for statuses (use `defineStatusMap`), `Badge` for counts and neutral labels, `StatusDot` for a dot alone." },
65
- { "need": "A person or a file", "use": ["Avatar", "FileTypeBadge", "FileChip", "AttachmentChip"] },
66
- { "need": "An activity feed or notifications", "use": ["ActivityList", "NotificationPanel"] },
67
- { "need": "A chart", "use": ["AreaChart", "DonutChart", "StackedBarChart", "RankedBars"] },
68
- { "need": "Preview a document", "use": ["PdfPreview", "SpreadsheetPreview"] },
69
- { "need": "An icon", "use": ["Icons"], "notes": "From the catalogue only, never an inline `<svg>`; brand marks from the brand icon family or `Logo`." },
70
- { "need": "The application frame", "use": ["Shell", "Sidebar", "AppHeader"], "notes": "`DesignSystemProvider` (or `/next`'s `NextDesignSystemProvider`) once in the root layout; `BrandScope` sets the product theme of a subtree." },
71
- { "need": "Configure strings, locale, links or the portal container", "use": ["DesignSystemProvider"], "notes": "Once, in the root layout. `useDsMessages` reads the resolved strings." },
72
- { "need": "Theme one subtree (scheme, brand, density) including its overlays", "use": ["ThemeScope", "BrandScope"], "notes": "`ThemeScope` re-stamps portalled overlays; `BrandScope` is product brand only." },
73
- { "need": "Hide text visually but keep it for screen readers", "use": ["VisuallyHidden"] },
74
- { "need": "Merge class names", "use": ["cn"], "notes": "Consumer classes win over component classes by cascade; `cn` only dedupes." }
18
+ {
19
+ "need": "Trigger an action",
20
+ "use": [
21
+ "Button",
22
+ "IconButton"
23
+ ],
24
+ "notes": "`IconButton` when the control is only an icon (it requires an accessible name and shows a tooltip). Same `variant` × `intent` × `size` axes."
25
+ },
26
+ {
27
+ "need": "Navigate somewhere with a button look",
28
+ "use": [
29
+ "LinkButton"
30
+ ],
31
+ "notes": "Renders an `<a href>`; `Button asChild` around your router's `Link` is the alternative."
32
+ },
33
+ {
34
+ "need": "Submit a form",
35
+ "use": [
36
+ "SubmitButton"
37
+ ],
38
+ "notes": "Full-width by default; `type=\"submit\"` and pending state handled."
39
+ },
40
+ {
41
+ "need": "Make something that is not a button clickable",
42
+ "use": [
43
+ "Pressable"
44
+ ],
45
+ "notes": "Keyboard, focus ring, disabled handling, no button chrome. Never `<div onClick>`."
46
+ },
47
+ {
48
+ "need": "Confirm a destructive action",
49
+ "use": [
50
+ "ConfirmActionButton",
51
+ "ConfirmDialog",
52
+ "ConfirmHost"
53
+ ],
54
+ "notes": "`ConfirmActionButton` wraps the dialog around any trigger; `ConfirmDialog` when you control `open` or need a form field in the body; `useConfirm()` / `usePrompt()` to `await` an answer from an event handler (needs `DesignSystemProvider confirm` or a `ConfirmHost`)."
55
+ },
56
+ {
57
+ "need": "Act on selected rows",
58
+ "use": [
59
+ "BulkActionBar"
60
+ ],
61
+ "notes": "Floating bar with the count and the row actions."
62
+ },
63
+ {
64
+ "need": "Keep Save / Cancel visible at the bottom of a long form",
65
+ "use": [
66
+ "StickyActionBar"
67
+ ]
68
+ },
69
+ {
70
+ "need": "Label + help + error around any control",
71
+ "use": [
72
+ "Field"
73
+ ],
74
+ "notes": "`Label`, `FieldDescription`, `FieldError` inside; controls bind automatically. `Fieldset` groups several. `FieldControl` wires a non-DS control."
75
+ },
76
+ {
77
+ "need": "Free text, one line",
78
+ "use": [
79
+ "Input"
80
+ ],
81
+ "notes": "`SearchInput` for search boxes, `NumberInput` for numbers, `PhoneField` for phone numbers, `OTPInput` for codes."
82
+ },
83
+ {
84
+ "need": "A phone number",
85
+ "use": [
86
+ "PhoneField"
87
+ ],
88
+ "notes": "Country picker + national number, E.164 value. `PhoneInput` and `PhoneCountryInput` are deprecated."
89
+ },
90
+ {
91
+ "need": "Free text, several lines",
92
+ "use": [
93
+ "Textarea"
94
+ ]
95
+ },
96
+ {
97
+ "need": "A number with formatting or steppers",
98
+ "use": [
99
+ "NumberInput"
100
+ ]
101
+ },
102
+ {
103
+ "need": "A date, or a date range",
104
+ "use": [
105
+ "DatePicker",
106
+ "DateRangePicker"
107
+ ],
108
+ "notes": "`Calendar` alone when the picker should be inline rather than in a popover."
109
+ },
110
+ {
111
+ "need": "Upload files",
112
+ "use": [
113
+ "FileUpload"
114
+ ],
115
+ "notes": "`DocumentRequestUpload` for the client-portal request flow."
116
+ },
117
+ {
118
+ "need": "Yes / no",
119
+ "use": [
120
+ "Checkbox",
121
+ "Switch"
122
+ ],
123
+ "notes": "`Switch` when the change applies immediately, `Checkbox` when it is submitted with the form or is one of several."
124
+ },
125
+ {
126
+ "need": "One of a few visible options",
127
+ "use": [
128
+ "RadioGroup",
129
+ "ToggleGroup"
130
+ ],
131
+ "notes": "`RadioGroup` in forms; `ToggleGroup` for view/mode switches with immediate effect."
132
+ },
133
+ {
134
+ "need": "One of many options in a dropdown",
135
+ "use": [
136
+ "Select",
137
+ "Combobox"
138
+ ],
139
+ "notes": "`Select` for short static lists; `Combobox` when the user should type to filter or the list is large or async."
140
+ },
141
+ {
142
+ "need": "Several of many options",
143
+ "use": [
144
+ "MultiSelect",
145
+ "MultiSelectField"
146
+ ],
147
+ "notes": "`MultiSelect` is the searchable dropdown; `MultiSelectField` a visible pill toggle row for a handful of options."
148
+ },
149
+ {
150
+ "need": "Pick a client or a team member",
151
+ "use": [
152
+ "ClientSelect",
153
+ "TeamMemberSelect"
154
+ ]
155
+ },
156
+ {
157
+ "need": "Filter a list",
158
+ "use": [
159
+ "Toolbar",
160
+ "MultiFilterPill",
161
+ "DisplayMenu"
162
+ ],
163
+ "notes": "`FilterChip` inside `Toolbar` for one-value filters, `MultiFilterPill` for multi-value, `DisplayMenu` for the Linear-style filter/group/sort/columns menu."
164
+ },
165
+ {
166
+ "need": "Removable or toggleable tokens (tags, applied filters)",
167
+ "use": [
168
+ "Chip"
169
+ ],
170
+ "notes": "`DismissibleChip` is the older single-purpose removable chip."
171
+ },
172
+ {
173
+ "need": "A slider value",
174
+ "use": [
175
+ "Slider"
176
+ ]
177
+ },
178
+ {
179
+ "need": "Show a message inline (success, warning, error, info)",
180
+ "use": [
181
+ "Alert"
182
+ ]
183
+ },
184
+ {
185
+ "need": "Notify after an action",
186
+ "use": [
187
+ "ToastProvider"
188
+ ],
189
+ "notes": "`useToast()` from inside the provider."
190
+ },
191
+ {
192
+ "need": "Show loading",
193
+ "use": [
194
+ "Spinner",
195
+ "Skeleton",
196
+ "LoadingRows"
197
+ ],
198
+ "notes": "`Spinner` inside a control or small area, `Skeleton` for a shape, `LoadingRows` for list/table rows."
199
+ },
200
+ {
201
+ "need": "Show progress",
202
+ "use": [
203
+ "ProgressBar",
204
+ "ProgressRing",
205
+ "SegmentedProgress",
206
+ "Stepper"
207
+ ],
208
+ "notes": "`Stepper` when the steps have names; `SuiteProgress` for the suite's segmented percent meter."
209
+ },
210
+ {
211
+ "need": "Nothing to show yet",
212
+ "use": [
213
+ "EmptyState",
214
+ "ComingSoon"
215
+ ]
216
+ },
217
+ {
218
+ "need": "A modal task or message",
219
+ "use": [
220
+ "Dialog",
221
+ "ResponsiveDialog"
222
+ ],
223
+ "notes": "`ResponsiveDialog` becomes a `Sheet` on small screens."
224
+ },
225
+ {
226
+ "need": "A side panel",
227
+ "use": [
228
+ "Sheet",
229
+ "SideDrawer"
230
+ ],
231
+ "notes": "`Sheet` is the Radix-based standard; `SideDrawer` is the older API kept for existing call sites."
232
+ },
233
+ {
234
+ "need": "A contextual menu of actions",
235
+ "use": [
236
+ "DropdownMenu",
237
+ "ContextMenu",
238
+ "NewMenu"
239
+ ],
240
+ "notes": "`ContextMenu` on right-click; `NewMenu` is the ready-made \"+ New\" creation menu."
241
+ },
242
+ {
243
+ "need": "Extra content on hover or click",
244
+ "use": [
245
+ "Tooltip",
246
+ "Popover",
247
+ "HoverCard"
248
+ ],
249
+ "notes": "`Tooltip` for a short label, `Popover` for interactive content, `HoverCard` for a rich preview on hover."
250
+ },
251
+ {
252
+ "need": "A global command / search box",
253
+ "use": [
254
+ "CommandPalette",
255
+ "KeyboardShortcutsDialog"
256
+ ]
257
+ },
258
+ {
259
+ "need": "Switch between views",
260
+ "use": [
261
+ "Tabs",
262
+ "ChannelTabs",
263
+ "BottomNav"
264
+ ],
265
+ "notes": "`BottomNav` is the mobile tab bar."
266
+ },
267
+ {
268
+ "need": "Where am I",
269
+ "use": [
270
+ "Breadcrumb",
271
+ "PageHeader",
272
+ "AppHeader"
273
+ ]
274
+ },
275
+ {
276
+ "need": "Page through results",
277
+ "use": [
278
+ "Pagination"
279
+ ],
280
+ "notes": "`DataTablePagination` is the same pager with the table's 25-row default; `pageSizeOptions` adds a rows-per-page picker."
281
+ },
282
+ {
283
+ "need": "A tree or a rail of items",
284
+ "use": [
285
+ "FolderTree",
286
+ "ClientRailItem"
287
+ ]
288
+ },
289
+ {
290
+ "need": "Space things out",
291
+ "use": [
292
+ "Stack",
293
+ "Inline"
294
+ ],
295
+ "notes": "Tokenised gap and alignment; never ad-hoc `flex gap-*` in product code."
296
+ },
297
+ {
298
+ "need": "A bordered box or card",
299
+ "use": [
300
+ "Surface",
301
+ "Card"
302
+ ],
303
+ "notes": "`Card` adds header/title/description/footer parts and an interactive variant."
304
+ },
305
+ {
306
+ "need": "A divider",
307
+ "use": [
308
+ "Separator",
309
+ "CategoryDivider"
310
+ ]
311
+ },
312
+ {
313
+ "need": "Collapse content",
314
+ "use": [
315
+ "Collapsible",
316
+ "Accordion"
317
+ ]
318
+ },
319
+ {
320
+ "need": "Scroll a region",
321
+ "use": [
322
+ "ScrollArea"
323
+ ]
324
+ },
325
+ {
326
+ "need": "Title a page or a section",
327
+ "use": [
328
+ "PageHeader",
329
+ "SectionHeader",
330
+ "Heading"
331
+ ]
332
+ },
333
+ {
334
+ "need": "Body text, captions, code, keys",
335
+ "use": [
336
+ "Text",
337
+ "Code",
338
+ "Kbd",
339
+ "Blockquote"
340
+ ]
341
+ },
342
+ {
343
+ "need": "A number with a caption",
344
+ "use": [
345
+ "Stat",
346
+ "KpiCard"
347
+ ],
348
+ "notes": "`KpiCard` is the dashboard tile with tone and hint."
349
+ },
350
+ {
351
+ "need": "A table of records",
352
+ "use": [
353
+ "DataTableView",
354
+ "DataTable",
355
+ "Table"
356
+ ],
357
+ "notes": "`DataTableView` is config-driven (columns + data, owns search/sort/pagination); `DataTable` the composable parts; `Table` the bare semantic table."
358
+ },
359
+ {
360
+ "need": "Label / value pairs",
361
+ "use": [
362
+ "MetadataGrid"
363
+ ]
364
+ },
365
+ {
366
+ "need": "A status word or count",
367
+ "use": [
368
+ "StatusBadge",
369
+ "Badge",
370
+ "StatusPill",
371
+ "StatusDot"
372
+ ],
373
+ "notes": "`StatusBadge` for statuses (use `defineStatusMap`), `Badge` for counts and neutral labels, `StatusDot` for a dot alone."
374
+ },
375
+ {
376
+ "need": "A person or a file",
377
+ "use": [
378
+ "Avatar",
379
+ "FileTypeBadge",
380
+ "FileChip",
381
+ "AttachmentChip"
382
+ ]
383
+ },
384
+ {
385
+ "need": "An activity feed or notifications",
386
+ "use": [
387
+ "ActivityList",
388
+ "NotificationPanel"
389
+ ]
390
+ },
391
+ {
392
+ "need": "A chart",
393
+ "use": [
394
+ "AreaChart",
395
+ "DonutChart",
396
+ "StackedBarChart",
397
+ "RankedBars"
398
+ ]
399
+ },
400
+ {
401
+ "need": "Preview a document",
402
+ "use": [
403
+ "PdfPreview",
404
+ "SpreadsheetPreview"
405
+ ]
406
+ },
407
+ {
408
+ "need": "An icon",
409
+ "use": [
410
+ "Icons"
411
+ ],
412
+ "notes": "From the catalogue only, never an inline `<svg>`; brand marks from the brand icon family or `Logo`."
413
+ },
414
+ {
415
+ "need": "The application frame",
416
+ "use": [
417
+ "Shell",
418
+ "Sidebar",
419
+ "AppHeader"
420
+ ],
421
+ "notes": "`DesignSystemProvider` (or `/next`'s `NextDesignSystemProvider`) once in the root layout; `BrandScope` sets the product theme of a subtree."
422
+ },
423
+ {
424
+ "need": "Configure strings, locale, links or the portal container",
425
+ "use": [
426
+ "DesignSystemProvider"
427
+ ],
428
+ "notes": "Once, in the root layout. `useDsMessages` reads the resolved strings."
429
+ },
430
+ {
431
+ "need": "Theme one subtree (scheme, brand, density) including its overlays",
432
+ "use": [
433
+ "ThemeScope",
434
+ "BrandScope"
435
+ ],
436
+ "notes": "`ThemeScope` re-stamps portalled overlays; `BrandScope` is product brand only."
437
+ },
438
+ {
439
+ "need": "Hide text visually but keep it for screen readers",
440
+ "use": [
441
+ "VisuallyHidden"
442
+ ]
443
+ },
444
+ {
445
+ "need": "Merge class names",
446
+ "use": [
447
+ "cn"
448
+ ],
449
+ "notes": "Consumer classes win over component classes by cascade; `cn` only dedupes."
450
+ }
75
451
  ],
76
452
  "iconFamilies": [
77
453
  {
78
454
  "name": "Icons",
79
455
  "pattern": "Icon$",
80
456
  "exclude": "BrandIcon$",
81
- "helpers": ["createIcon"],
457
+ "helpers": [
458
+ "createIcon"
459
+ ],
82
460
  "description": "The UI glyph catalogue: 24-unit grid, `currentColor` 1.5 strokes, `aria-hidden` unless titled. Import from `@assure-one/design-system/icons` (server-safe) or the root.",
83
461
  "useWhen": "Any glyph in a control, a list row, a status, an empty state; `createIcon` to register a one-off glyph in the same contract.",
84
462
  "dontUseWhen": "You need a product mark (brand icon family or `Logo`), a state-driven glyph (`StatusIcon`, `PriorityIcon`) or an illustration.",
85
- "replacesRawHtml": ["<svg>", "lucide-react"],
463
+ "replacesRawHtml": [
464
+ "<svg>",
465
+ "lucide-react"
466
+ ],
86
467
  "story": "src/primitives/icons.stories.tsx",
87
468
  "status": "experimental"
88
469
  },
@@ -92,1089 +473,2114 @@
92
473
  "description": "Product and third-party marks: the Assure products plus Google and Microsoft. The `BrandIcon` suffix is the contract disclosure that the drawing is a trademark.",
93
474
  "useWhen": "A product switcher, a sign-in provider button, a suite tile.",
94
475
  "dontUseWhen": "A generic glyph is meant (use the icon catalogue) or the full wordmark is wanted (`Logo`).",
95
- "replacesRawHtml": ["<img src=\"…logo.svg\">"],
476
+ "replacesRawHtml": [
477
+ "<img src=\"…logo.svg\">"
478
+ ],
96
479
  "story": "src/primitives/logo.stories.tsx"
97
480
  }
98
481
  ],
99
482
  "components": {
100
483
  "Button": {
101
484
  "category": "actions",
102
- "helpers": ["buttonVariants", "resolveButtonStyle"],
485
+ "helpers": [
486
+ "buttonVariants",
487
+ "resolveButtonStyle"
488
+ ],
103
489
  "useWhen": "Any action the user triggers: `variant` (solid, soft, outline, ghost, link) × `intent` (brand, neutral, success, danger) × `size` (xs…xl); `loading`, `iconStart`/`iconEnd`, `asChild` for a router link.",
104
490
  "dontUseWhen": "The control is icon-only (`IconButton`), navigates (`LinkButton`), submits a form (`SubmitButton`) or is a clickable non-button surface (`Pressable`).",
105
- "replacesRawHtml": ["<button>", "<a role=\"button\">", "<div onClick>", "<input type=\"button\">"],
106
- "related": ["IconButton", "LinkButton", "SubmitButton", "Pressable", "PrimaryAction"],
491
+ "replacesRawHtml": [
492
+ "<button>",
493
+ "<a role=\"button\">",
494
+ "<div onClick>",
495
+ "<input type=\"button\">"
496
+ ],
497
+ "related": [
498
+ "IconButton",
499
+ "LinkButton",
500
+ "SubmitButton",
501
+ "Pressable",
502
+ "PrimaryAction"
503
+ ],
107
504
  "since": "0.0.0",
108
- "docs": ["docs/adr/007-variant-intent-vocabulary.md"]
505
+ "docs": [
506
+ "docs/adr/007-variant-intent-vocabulary.md"
507
+ ]
109
508
  },
110
509
  "IconButton": {
111
510
  "category": "actions",
112
- "helpers": ["iconButtonVariants"],
511
+ "helpers": [
512
+ "iconButtonVariants"
513
+ ],
113
514
  "useWhen": "An icon-only action (close, edit, more): square control-scale geometry, a required accessible name, a tooltip by default, the Button family's variants and intents.",
114
515
  "dontUseWhen": "The action has a visible text label (`Button` with `iconStart`) or is a menu trigger that shows the chosen value.",
115
- "replacesRawHtml": ["<button><svg/></button>"],
116
- "related": ["Button", "Tooltip"],
516
+ "replacesRawHtml": [
517
+ "<button><svg/></button>"
518
+ ],
519
+ "related": [
520
+ "Button",
521
+ "Tooltip"
522
+ ],
117
523
  "since": "1.35.0"
118
524
  },
119
525
  "LinkButton": {
120
526
  "category": "actions",
121
527
  "useWhen": "Navigation that should look like a button: an `<a href>` with the Button variants, intents, sizes and icon slots.",
122
528
  "dontUseWhen": "The action does not change the URL (`Button`) or the link should read as inline text (`Text asChild` around your router link).",
123
- "replacesRawHtml": ["<a class=\"btn\">"],
124
- "related": ["Button", "LinkAction"],
529
+ "replacesRawHtml": [
530
+ "<a class=\"btn\">"
531
+ ],
532
+ "related": [
533
+ "Button",
534
+ "LinkAction"
535
+ ],
125
536
  "since": "0.0.0"
126
537
  },
127
538
  "SubmitButton": {
128
539
  "category": "actions",
129
540
  "useWhen": "The primary submit of a form: `type=\"submit\"`, full width by default (`fullWidth={false}` inline), shows `pendingText` while the form's `useFormStatus` is pending.",
130
541
  "dontUseWhen": "The button is not a form submit or you need a secondary action next to the submit (`Button`).",
131
- "replacesRawHtml": ["<button type=\"submit\">", "<input type=\"submit\">"],
132
- "related": ["Button", "Field"],
542
+ "replacesRawHtml": [
543
+ "<button type=\"submit\">",
544
+ "<input type=\"submit\">"
545
+ ],
546
+ "related": [
547
+ "Button",
548
+ "Field"
549
+ ],
133
550
  "since": "0.0.0"
134
551
  },
135
552
  "Pressable": {
136
553
  "category": "actions",
137
554
  "useWhen": "A clickable region without button chrome: a card, a row, a tile. Renders a `<button>` (or `asChild`) with keyboard activation, focus ring and disabled handling.",
138
555
  "dontUseWhen": "A visible button is meant (`Button`) or the region contains its own interactive controls (use `Card variant=\"interactive\"` with an explicit action).",
139
- "replacesRawHtml": ["<div onClick>", "<span role=\"button\">", "<li onClick>"],
140
- "related": ["Button", "Card"],
556
+ "replacesRawHtml": [
557
+ "<div onClick>",
558
+ "<span role=\"button\">",
559
+ "<li onClick>"
560
+ ],
561
+ "related": [
562
+ "Button",
563
+ "Card"
564
+ ],
141
565
  "since": "1.35.0"
142
566
  },
143
567
  "CopyButton": {
144
568
  "category": "actions",
145
569
  "useWhen": "Copy a value to the clipboard with check-mark feedback (ids, codes, links).",
146
570
  "dontUseWhen": "The copy needs a confirmation toast or copies rich content — compose `IconButton` + `useToast`.",
147
- "replacesRawHtml": ["navigator.clipboard.writeText + useState"],
148
- "related": ["IconButton", "ToastProvider"],
571
+ "replacesRawHtml": [
572
+ "navigator.clipboard.writeText + useState"
573
+ ],
574
+ "related": [
575
+ "IconButton",
576
+ "ToastProvider"
577
+ ],
149
578
  "since": "0.0.0"
150
579
  },
151
580
  "ConfirmActionButton": {
152
581
  "category": "actions",
153
582
  "useWhen": "A destructive or irreversible action that needs a confirmation step: a trigger plus `ConfirmDialog`, retiring `window.confirm()`. `destructive={false}` (alias of `intent=\"brand\"`) for a non-destructive confirm.",
154
583
  "dontUseWhen": "The confirmation is imperative (`useConfirm`) or the action is reversible (act, then offer undo in a toast).",
155
- "replacesRawHtml": ["window.confirm()", "useState + AlertDialog boilerplate"],
156
- "related": ["ConfirmDialog", "AlertDialog", "DangerAction"],
584
+ "replacesRawHtml": [
585
+ "window.confirm()",
586
+ "useState + AlertDialog boilerplate"
587
+ ],
588
+ "related": [
589
+ "ConfirmDialog",
590
+ "AlertDialog",
591
+ "DangerAction"
592
+ ],
157
593
  "since": "0.3.0"
158
594
  },
159
595
  "ConfirmDialog": {
160
596
  "category": "overlays",
161
597
  "useWhen": "The confirmation pattern (target architecture §34): `title`, `description`, optional body content (a form field the decision depends on), `intent` (`danger` default — focus starts on Cancel; `brand` / `neutral` / `success` render the action through the Button recipe), async `onConfirm` with a built-in pending state, a rejection or a resolved `false` keeps it open and shows the error inline. Labels default to the `confirm` messages namespace.",
162
598
  "dontUseWhen": "A one-line confirm around a trigger (`ConfirmActionButton`, which is this pattern with a `trigger`) or an imperative `await` from an event handler (`useConfirm`).",
163
- "replacesRawHtml": ["window.confirm()", "useState + AlertDialog + pending flag boilerplate"],
164
- "related": ["ConfirmActionButton", "AlertDialog", "ConfirmHost"],
599
+ "replacesRawHtml": [
600
+ "window.confirm()",
601
+ "useState + AlertDialog + pending flag boilerplate"
602
+ ],
603
+ "related": [
604
+ "ConfirmActionButton",
605
+ "AlertDialog",
606
+ "ConfirmHost"
607
+ ],
165
608
  "since": "unreleased"
166
609
  },
167
610
  "ConfirmHost": {
168
611
  "category": "overlays",
169
- "hooks": ["useConfirm", "usePrompt"],
612
+ "hooks": [
613
+ "useConfirm",
614
+ "usePrompt"
615
+ ],
170
616
  "useWhen": "Imperative confirmation: `const confirm = useConfirm(); if (await confirm({ title, intent: \"danger\" })) …` resolves `true` / `false`; `usePrompt()` resolves the entered string or `null`. Mount one `ConfirmHost` high in the tree (`DesignSystemProvider confirm` does) and every hook below shares its queue; without a host, or on the server, a request resolves as cancelled.",
171
617
  "dontUseWhen": "The confirmation is part of the markup (`ConfirmDialog`, `ConfirmActionButton`) or needs a custom body beyond one input (`ConfirmDialog` with children).",
172
- "replacesRawHtml": ["window.confirm()", "window.prompt()", "PromptDialog.ask() singletons"],
173
- "related": ["ConfirmDialog", "DesignSystemProvider"],
618
+ "replacesRawHtml": [
619
+ "window.confirm()",
620
+ "window.prompt()",
621
+ "PromptDialog.ask() singletons"
622
+ ],
623
+ "related": [
624
+ "ConfirmDialog",
625
+ "DesignSystemProvider"
626
+ ],
174
627
  "since": "unreleased",
175
628
  "story": "src/patterns/confirm/use-confirm.stories.tsx"
176
629
  },
177
630
  "PrimaryAction": {
178
631
  "category": "actions",
179
632
  "label": "Intent actions",
180
- "parts": ["SecondaryAction", "DangerAction", "LinkAction", "IconAction"],
633
+ "parts": [
634
+ "SecondaryAction",
635
+ "DangerAction",
636
+ "LinkAction",
637
+ "IconAction"
638
+ ],
181
639
  "useWhen": "Intent-named `Button` wrappers for product code that reads by role: primary, secondary, danger, link-styled, icon-only.",
182
640
  "dontUseWhen": "You need the full variant × intent matrix or a size outside the defaults (`Button`, `IconButton`).",
183
- "related": ["Button", "IconButton", "LinkButton"],
641
+ "related": [
642
+ "Button",
643
+ "IconButton",
644
+ "LinkButton"
645
+ ],
184
646
  "since": "0.3.0"
185
647
  },
186
648
  "BulkActionBar": {
187
649
  "category": "actions",
188
- "parts": ["BulkActionBarAction", "BulkActionBarSeparator"],
650
+ "parts": [
651
+ "BulkActionBarAction",
652
+ "BulkActionBarSeparator"
653
+ ],
189
654
  "useWhen": "A floating bar that appears when rows are selected: selection count, actions, separators, clear.",
190
655
  "dontUseWhen": "Actions apply to one record (row menu via `DropdownMenu`) or belong to the page (`PageHeader` actions).",
191
- "related": ["DataTable", "StickyActionBar"],
656
+ "related": [
657
+ "DataTable",
658
+ "StickyActionBar"
659
+ ],
192
660
  "since": "0.15.0"
193
661
  },
194
662
  "StickyActionBar": {
195
663
  "category": "actions",
196
664
  "useWhen": "Save / Cancel that stays visible at the bottom of a long form or settings page, with an optional hint and mobile-nav offset.",
197
665
  "dontUseWhen": "The form fits the viewport (put the `SubmitButton` at the end) or the actions belong to a dialog (`DialogFooter`).",
198
- "replacesRawHtml": ["<div class=\"sticky bottom-0\">"],
199
- "related": ["SubmitButton", "BulkActionBar"],
666
+ "replacesRawHtml": [
667
+ "<div class=\"sticky bottom-0\">"
668
+ ],
669
+ "related": [
670
+ "SubmitButton",
671
+ "BulkActionBar"
672
+ ],
200
673
  "since": "1.3.0"
201
674
  },
202
675
  "NewMenu": {
203
676
  "category": "actions",
204
677
  "useWhen": "The \"+ New\" creation menu of an app: grouped actions with icons and shortcuts on a `DropdownMenu`.",
205
678
  "dontUseWhen": "The menu is contextual to one record (`DropdownMenu`) or has a single action (`Button`).",
206
- "related": ["DropdownMenu", "AppHeader"],
679
+ "related": [
680
+ "DropdownMenu",
681
+ "AppHeader"
682
+ ],
207
683
  "since": "1.2.0"
208
684
  },
209
685
  "DisplayMenu": {
210
686
  "category": "actions",
211
687
  "useWhen": "The Linear-style Display control of a list surface: filters, grouping, ordering and column visibility in one searchable menu, driven by a `sections` array.",
212
688
  "dontUseWhen": "There is one filter (`FilterChip`) or one multi-value filter (`MultiFilterPill`).",
213
- "related": ["Toolbar", "MultiFilterPill", "DataTableView"],
689
+ "related": [
690
+ "Toolbar",
691
+ "MultiFilterPill",
692
+ "DataTableView"
693
+ ],
214
694
  "since": "1.25.0"
215
695
  },
216
696
  "Toolbar": {
217
697
  "category": "actions",
218
- "parts": ["FilterChip"],
219
- "helpers": ["filterChipVariants"],
698
+ "parts": [
699
+ "FilterChip"
700
+ ],
701
+ "helpers": [
702
+ "filterChipVariants"
703
+ ],
220
704
  "useWhen": "The row of controls above a list or dashboard; `FilterChip` for a single-value filter toggle inside it. Controls share one control size so the row reads as one line.",
221
705
  "dontUseWhen": "The controls belong to a table card (`DataTableToolbar`) or the filter is multi-value (`MultiFilterPill`).",
222
- "replacesRawHtml": ["<div class=\"flex items-center gap-2\"> above a list"],
223
- "related": ["MultiFilterPill", "DisplayMenu", "DataTable"],
706
+ "replacesRawHtml": [
707
+ "<div class=\"flex items-center gap-2\"> above a list"
708
+ ],
709
+ "related": [
710
+ "MultiFilterPill",
711
+ "DisplayMenu",
712
+ "DataTable"
713
+ ],
224
714
  "since": "0.3.0"
225
715
  },
226
716
  "SuggestionPills": {
227
717
  "category": "actions",
228
718
  "useWhen": "A strip of AI quick-reply pills floated above a composer; renders nothing when empty and not loading, so mount it unconditionally.",
229
719
  "dontUseWhen": "The choices are a form value (`MultiSelectField`) or filters (`FilterChip`).",
230
- "related": ["MessageComposer", "AiDraftCard"],
720
+ "related": [
721
+ "MessageComposer",
722
+ "AiDraftCard"
723
+ ],
231
724
  "since": "1.5.0"
232
725
  },
233
-
234
726
  "Field": {
235
727
  "category": "forms",
236
- "parts": ["FieldDescription", "FieldError"],
728
+ "parts": [
729
+ "FieldDescription",
730
+ "FieldError"
731
+ ],
237
732
  "useWhen": "Every form control: owns ids, states and ARIA wiring for one control and its `Label`, `FieldDescription` and `FieldError`; design-system controls bind automatically.",
238
733
  "dontUseWhen": "Grouping several controls (`Fieldset`) or wiring a control the design system does not ship (`FieldControl`).",
239
- "replacesRawHtml": ["<label for> + <input id> + <p id> aria-describedby", "<p class=\"text-red-500\">"],
240
- "related": ["Label", "Fieldset", "FieldControl", "useFieldControl"],
734
+ "replacesRawHtml": [
735
+ "<label for> + <input id> + <p id> aria-describedby",
736
+ "<p class=\"text-red-500\">"
737
+ ],
738
+ "related": [
739
+ "Label",
740
+ "Fieldset",
741
+ "FieldControl",
742
+ "useFieldControl"
743
+ ],
241
744
  "since": "unreleased",
242
- "docs": ["docs/forms.md", "docs/adr/006-field-native-form-participation.md"]
745
+ "docs": [
746
+ "docs/forms.md",
747
+ "docs/adr/006-field-native-form-participation.md"
748
+ ]
243
749
  },
244
750
  "FieldControl": {
245
751
  "category": "forms",
246
752
  "useWhen": "A control that is not a design-system component (a rich-text editor, a canvas, a plain `<input>`) that must still get the `Field` wiring; a Slot that renders no element of its own.",
247
753
  "dontUseWhen": "The control is a design-system component — it already calls `useFieldControl`.",
248
- "related": ["Field", "useFieldControl"],
754
+ "related": [
755
+ "Field",
756
+ "useFieldControl"
757
+ ],
249
758
  "since": "unreleased"
250
759
  },
251
760
  "Fieldset": {
252
761
  "category": "forms",
253
- "parts": ["FieldsetLegend"],
762
+ "parts": [
763
+ "FieldsetLegend"
764
+ ],
254
765
  "useWhen": "Group related controls under one legend (a radio group, a set of checkboxes, a date range, a composite field): native `<fieldset>`/`<legend>`, `disabled` disables all.",
255
766
  "dontUseWhen": "There is a single control (`Field`) or the grouping is only visual (`Section`, `Card`).",
256
- "replacesRawHtml": ["<fieldset>", "<legend>", "<div role=\"group\">"],
257
- "related": ["Field", "RadioGroup", "FormSection"],
767
+ "replacesRawHtml": [
768
+ "<fieldset>",
769
+ "<legend>",
770
+ "<div role=\"group\">"
771
+ ],
772
+ "related": [
773
+ "Field",
774
+ "RadioGroup",
775
+ "FormSection"
776
+ ],
258
777
  "since": "unreleased"
259
778
  },
260
779
  "Label": {
261
780
  "category": "forms",
262
- "helpers": ["labelVariants"],
781
+ "helpers": [
782
+ "labelVariants"
783
+ ],
263
784
  "useWhen": "The visible name of a control, inside a `Field` (binds automatically) or with an explicit `htmlFor`.",
264
785
  "dontUseWhen": "The text is not a control's name (`Text`) or a heading (`Heading`).",
265
- "replacesRawHtml": ["<label>"],
266
- "related": ["Field", "Input"],
786
+ "replacesRawHtml": [
787
+ "<label>"
788
+ ],
789
+ "related": [
790
+ "Field",
791
+ "Input"
792
+ ],
267
793
  "since": "0.0.0"
268
794
  },
795
+ "InfoHint": {
796
+ "category": "data display",
797
+ "useWhen": "The \u24d8 beside a label or a figure (W7-15): `label` names what the hint is about, `children` is the explanation, `presentation=\"tooltip\"` (default) or `\"popover\"` for an explanation with a paragraph or a link. The trigger is a real `IconButton`, so the hint is reachable by keyboard and by touch.",
798
+ "dontUseWhen": "The text belongs in the layout (`FieldDescription` under a field) or the surface is a rich hover preview (`HoverCard`).",
799
+ "replacesRawHtml": ["<svg title>", "<span title>"],
800
+ "related": ["Tooltip", "Popover", "IconButton", "FieldDescription"],
801
+ "since": "unreleased"
802
+ },
803
+ "PeoplePicker": {
804
+ "category": "selection",
805
+ "useWhen": "Pick a person or people from the firm's roster (W7-10): `people`, single or `multiple`, avatars with an optional second line, an \"assign to me\" shortcut from `currentUserId`, and an `unassignedLabel` row that reports `null`. Search, keyboard, `Field` binding and form submission come from `Combobox`.",
806
+ "dontUseWhen": "The options are not people (`Combobox`, `MultiSelect`), or a plain roster select with no roster affordances is enough (`Select`). `TeamMemberSelect` is the predecessor it replaces.",
807
+ "replacesRawHtml": ["hand-rolled assignee popover with checkboxes"],
808
+ "related": ["Combobox", "MultiSelect", "Avatar", "TeamMemberSelect"],
809
+ "since": "unreleased"
810
+ },
811
+ "SegmentedControl": {
812
+ "category": "selection",
813
+ "useWhen": "One of a few mutually exclusive views or scopes, shown side by side (W7-17): `options` with an optional `count` per segment, `size` on the control scale, radio semantics and arrow-key movement from `ToggleGroup`. The active segment cannot be cleared by clicking it again.",
814
+ "dontUseWhen": "The set is long or open-ended (`Select`, `Combobox`), more than one may be active (`ToggleGroup type=\"multiple\"`), or the segments switch page regions rather than a value (`Tabs`).",
815
+ "replacesRawHtml": ["pill Tabs used as a filter", "<div> of <button> with a manual active class"],
816
+ "related": ["ToggleGroup", "Tabs", "Select", "MultiFilterPill"],
817
+ "since": "unreleased"
818
+ },
269
819
  "Input": {
270
820
  "category": "forms",
271
- "helpers": ["inputVariants"],
821
+ "helpers": [
822
+ "inputVariants"
823
+ ],
272
824
  "useWhen": "Single-line text, email, password, url, tel, file: `size` on the control scale, `variant` default/ghost, invalid state, start/end adornments, `label`/`description`/`error` sugar, `classNames` per part.",
273
825
  "dontUseWhen": "Multi-line (`Textarea`), numbers (`NumberInput`), search (`SearchInput`), phone (`PhoneField`), codes (`OTPInput`), dates (`DatePicker`), files with drop zone (`FileUpload`).",
274
- "replacesRawHtml": ["<input>", "<input type=\"text\">", "<input type=\"email\">", "<input type=\"password\">"],
275
- "related": ["Field", "Textarea", "NumberInput", "SearchInput"],
826
+ "replacesRawHtml": [
827
+ "<input>",
828
+ "<input type=\"text\">",
829
+ "<input type=\"email\">",
830
+ "<input type=\"password\">"
831
+ ],
832
+ "related": [
833
+ "Field",
834
+ "Textarea",
835
+ "NumberInput",
836
+ "SearchInput"
837
+ ],
276
838
  "since": "0.0.0",
277
- "docs": ["docs/design-system/control-sizes.md"]
839
+ "docs": [
840
+ "docs/design-system/control-sizes.md"
841
+ ]
278
842
  },
279
843
  "Textarea": {
280
844
  "category": "forms",
281
- "helpers": ["textareaVariants"],
845
+ "helpers": [
846
+ "textareaVariants"
847
+ ],
282
848
  "useWhen": "Multi-line free text with the Input chrome, sizes, invalid state and Field binding.",
283
849
  "dontUseWhen": "Rich text (bring your editor inside `FieldControl` or `MessageComposer`) or a single line (`Input`).",
284
- "replacesRawHtml": ["<textarea>"],
285
- "related": ["Input", "Field", "MessageComposer"],
850
+ "replacesRawHtml": [
851
+ "<textarea>"
852
+ ],
853
+ "related": [
854
+ "Input",
855
+ "Field",
856
+ "MessageComposer"
857
+ ],
286
858
  "since": "0.0.0"
287
859
  },
288
860
  "NumberInput": {
289
861
  "category": "forms",
290
862
  "useWhen": "A `number | null` value with locale formatting, min/max/step, optional stepper buttons and a text fallback while typing.",
291
863
  "dontUseWhen": "Money entered as text with a mask (`Input` + your formatter) or a bounded visual value (`Slider`).",
292
- "replacesRawHtml": ["<input type=\"number\">"],
293
- "related": ["Input", "Slider"],
864
+ "replacesRawHtml": [
865
+ "<input type=\"number\">"
866
+ ],
867
+ "related": [
868
+ "Input",
869
+ "Slider"
870
+ ],
294
871
  "since": "unreleased"
295
872
  },
296
873
  "SearchInput": {
297
874
  "category": "forms",
298
- "helpers": ["searchInputVariants"],
875
+ "helpers": [
876
+ "searchInputVariants"
877
+ ],
299
878
  "useWhen": "A search box: search icon, clear affordance, `size`, debounced `onValueChange`.",
300
879
  "dontUseWhen": "The search filters a dropdown's options (`Combobox`) or the whole app (`CommandPalette`).",
301
- "replacesRawHtml": ["<input type=\"search\">"],
302
- "related": ["Input", "Combobox", "DataTable"],
880
+ "replacesRawHtml": [
881
+ "<input type=\"search\">"
882
+ ],
883
+ "related": [
884
+ "Input",
885
+ "Combobox",
886
+ "DataTable"
887
+ ],
303
888
  "since": "0.0.0"
304
889
  },
305
890
  "OTPInput": {
306
891
  "category": "forms",
307
892
  "useWhen": "A one-time code split into cells: paste handling, auto-advance, one hidden form value, named by the surrounding `Label`.",
308
893
  "dontUseWhen": "A plain numeric field (`NumberInput`) or a password (`Input type=\"password\"`).",
309
- "replacesRawHtml": ["six <input maxlength=\"1\">"],
310
- "related": ["Input", "Field"],
894
+ "replacesRawHtml": [
895
+ "six <input maxlength=\"1\">"
896
+ ],
897
+ "related": [
898
+ "Input",
899
+ "Field"
900
+ ],
311
901
  "since": "0.0.0"
312
902
  },
313
903
  "PhoneField": {
314
904
  "category": "forms",
315
- "helpers": ["DEFAULT_PHONE_FIELD_MESSAGES"],
905
+ "helpers": [
906
+ "DEFAULT_PHONE_FIELD_MESSAGES"
907
+ ],
316
908
  "useWhen": "The one phone control: a `Combobox` country picker beside the national-number input on the shared control chrome; E.164 value (`+14155550100` or `null`), `onValueChange(value, { country, nationalNumber })`, lazy-loaded flags, Field binding and native submission; `DEFAULT_PHONE_FIELD_MESSAGES` to localise its strings.",
317
909
  "dontUseWhen": "The value is not a phone number (`Input type=\"tel\"` is never right either — an extension or a PIN is an `Input`/`OTPInput`).",
318
- "replacesRawHtml": ["<input type=\"tel\">", "<select> of dial codes + <input type=\"tel\">"],
319
- "related": ["Combobox", "Field", "PhoneInput", "PhoneCountryInput"],
910
+ "replacesRawHtml": [
911
+ "<input type=\"tel\">",
912
+ "<select> of dial codes + <input type=\"tel\">"
913
+ ],
914
+ "related": [
915
+ "Combobox",
916
+ "Field",
917
+ "PhoneInput",
918
+ "PhoneCountryInput"
919
+ ],
320
920
  "since": "unreleased"
321
921
  },
322
922
  "PhoneInput": {
323
923
  "category": "forms",
324
924
  "useWhen": "Only in code that already uses it: US-only phone formatting on the `Input` chrome.",
325
925
  "dontUseWhen": "New code — `PhoneField` (deprecated, removed in 3.0).",
326
- "related": ["PhoneField", "Input"],
926
+ "related": [
927
+ "PhoneField",
928
+ "Input"
929
+ ],
327
930
  "since": "0.0.0"
328
931
  },
329
932
  "PhoneCountryInput": {
330
933
  "category": "forms",
331
- "parts": ["CountrySelect", "CountryFlag"],
934
+ "parts": [
935
+ "CountrySelect",
936
+ "CountryFlag"
937
+ ],
332
938
  "useWhen": "Only in code that already uses it: the pre-PhoneField country `Select` + `tel` input pair; `parsePhoneForEditing` seeds it from a stored E.164 string.",
333
939
  "dontUseWhen": "New code — `PhoneField` (its country picker is a `Combobox`; deprecated, removed in 3.0).",
334
- "related": ["PhoneField", "COUNTRY_CODES"],
940
+ "related": [
941
+ "PhoneField",
942
+ "COUNTRY_CODES"
943
+ ],
335
944
  "since": "1.1.0"
336
945
  },
337
946
  "FileUpload": {
338
947
  "category": "forms",
339
948
  "useWhen": "Pick or drop files: accept/multiple/max size, file list with remove, keyboard-focusable input, Field binding.",
340
949
  "dontUseWhen": "The upload belongs to a client document request (`DocumentRequestUpload`) or you only show already-uploaded files (`AttachmentChip`, `FileChip`).",
341
- "replacesRawHtml": ["<input type=\"file\">", "drop-zone div with onDrop"],
342
- "related": ["DocumentRequestUpload", "AttachmentChip", "FileTypeBadge"],
950
+ "replacesRawHtml": [
951
+ "<input type=\"file\">",
952
+ "drop-zone div with onDrop"
953
+ ],
954
+ "related": [
955
+ "DocumentRequestUpload",
956
+ "AttachmentChip",
957
+ "FileTypeBadge"
958
+ ],
343
959
  "since": "0.0.0"
344
960
  },
345
961
  "DatePicker": {
346
962
  "category": "forms",
347
963
  "useWhen": "One date (or a year in year mode) typed with a mask or picked from a `Calendar` popover; ISO `YYYY-MM-DD` value, `onValueChange`, deterministic `en-US` display.",
348
964
  "dontUseWhen": "A range (`DateRangePicker`) or an always-visible calendar (`Calendar`).",
349
- "replacesRawHtml": ["<input type=\"date\">"],
350
- "related": ["DateRangePicker", "Calendar", "isoToDisplay"],
965
+ "replacesRawHtml": [
966
+ "<input type=\"date\">"
967
+ ],
968
+ "related": [
969
+ "DateRangePicker",
970
+ "Calendar",
971
+ "isoToDisplay"
972
+ ],
351
973
  "since": "0.0.0"
352
974
  },
353
975
  "DateRangePicker": {
354
976
  "category": "forms",
355
977
  "useWhen": "A from/to pair in one control; posts `${name}_from` / `${name}_to`.",
356
978
  "dontUseWhen": "A single date (`DatePicker`) or two independent dates in a form (two `DatePicker`s in a `Fieldset`).",
357
- "replacesRawHtml": ["two <input type=\"date\">"],
358
- "related": ["DatePicker", "Calendar"],
979
+ "replacesRawHtml": [
980
+ "two <input type=\"date\">"
981
+ ],
982
+ "related": [
983
+ "DatePicker",
984
+ "Calendar"
985
+ ],
359
986
  "since": "0.11.0"
360
987
  },
361
988
  "Calendar": {
362
989
  "category": "forms",
363
990
  "useWhen": "An inline month grid (react-day-picker) for choosing a day or range without a popover.",
364
991
  "dontUseWhen": "The date belongs in a form field (`DatePicker`, `DateRangePicker`).",
365
- "related": ["DatePicker", "DateRangePicker"],
992
+ "related": [
993
+ "DatePicker",
994
+ "DateRangePicker"
995
+ ],
366
996
  "since": "0.0.0"
367
997
  },
368
998
  "Checkbox": {
369
999
  "category": "forms",
370
1000
  "useWhen": "A boolean or one of several independent choices; `checked` accepts `\"indeterminate\"` for select-all; native form participation.",
371
1001
  "dontUseWhen": "The change applies immediately as a setting (`Switch`) or the choices are exclusive (`RadioGroup`).",
372
- "replacesRawHtml": ["<input type=\"checkbox\">"],
373
- "related": ["Switch", "RadioGroup", "DataTable"],
1002
+ "replacesRawHtml": [
1003
+ "<input type=\"checkbox\">"
1004
+ ],
1005
+ "related": [
1006
+ "Switch",
1007
+ "RadioGroup",
1008
+ "DataTable"
1009
+ ],
374
1010
  "since": "0.0.0"
375
1011
  },
376
1012
  "RadioGroup": {
377
1013
  "category": "forms",
378
- "parts": ["RadioGroupItem"],
1014
+ "parts": [
1015
+ "RadioGroupItem"
1016
+ ],
379
1017
  "useWhen": "Exclusive choice among a few visible options in a form; wrap in `Fieldset` for the legend.",
380
1018
  "dontUseWhen": "More than about six options (`Select`) or an immediate view switch (`ToggleGroup`).",
381
- "replacesRawHtml": ["<input type=\"radio\">"],
382
- "related": ["Fieldset", "ToggleGroup", "Select"],
1019
+ "replacesRawHtml": [
1020
+ "<input type=\"radio\">"
1021
+ ],
1022
+ "related": [
1023
+ "Fieldset",
1024
+ "ToggleGroup",
1025
+ "Select"
1026
+ ],
383
1027
  "since": "0.0.0"
384
1028
  },
385
1029
  "Switch": {
386
1030
  "category": "forms",
387
1031
  "useWhen": "An on/off setting that takes effect immediately.",
388
1032
  "dontUseWhen": "The value is submitted with the form (`Checkbox`).",
389
- "replacesRawHtml": ["<input type=\"checkbox\" role=\"switch\">"],
390
- "related": ["Checkbox"],
1033
+ "replacesRawHtml": [
1034
+ "<input type=\"checkbox\" role=\"switch\">"
1035
+ ],
1036
+ "related": [
1037
+ "Checkbox"
1038
+ ],
391
1039
  "since": "0.0.0"
392
1040
  },
393
1041
  "Slider": {
394
1042
  "category": "forms",
395
1043
  "useWhen": "A bounded numeric value chosen by dragging (one or two thumbs).",
396
1044
  "dontUseWhen": "Exact numbers matter (`NumberInput`).",
397
- "replacesRawHtml": ["<input type=\"range\">"],
398
- "related": ["NumberInput"],
1045
+ "replacesRawHtml": [
1046
+ "<input type=\"range\">"
1047
+ ],
1048
+ "related": [
1049
+ "NumberInput"
1050
+ ],
399
1051
  "since": "0.0.0"
400
1052
  },
401
1053
  "MultiSelectField": {
402
1054
  "category": "forms",
403
1055
  "useWhen": "A visible row of pill buttons that toggle membership in a comma-separated value: a handful of options everyone should see.",
404
1056
  "dontUseWhen": "Many options or search (`MultiSelect`), or the pills are filters rather than a form value (`FilterChip`).",
405
- "replacesRawHtml": ["<input type=\"checkbox\"> styled as pills"],
406
- "related": ["MultiSelect", "ToggleGroup", "Chip"],
1057
+ "replacesRawHtml": [
1058
+ "<input type=\"checkbox\"> styled as pills"
1059
+ ],
1060
+ "related": [
1061
+ "MultiSelect",
1062
+ "ToggleGroup",
1063
+ "Chip"
1064
+ ],
407
1065
  "since": "0.0.0"
408
1066
  },
409
1067
  "Grid": {
410
1068
  "category": "forms",
411
1069
  "useWhen": "A matrix of typed cells (rows × columns of text, number, select, checkbox) edited as one controlled value with an accessible name per cell.",
412
1070
  "dontUseWhen": "Read-only data (`Table`, `DataTable`) or a single column of fields (`Stack` of `Field`s).",
413
- "replacesRawHtml": ["<table> of <input>s"],
414
- "related": ["Table", "Questions"],
1071
+ "replacesRawHtml": [
1072
+ "<table> of <input>s"
1073
+ ],
1074
+ "related": [
1075
+ "Table",
1076
+ "Questions"
1077
+ ],
415
1078
  "since": "1.20.0"
416
1079
  },
417
1080
  "Questions": {
418
1081
  "category": "forms",
419
1082
  "useWhen": "One questionnaire question card: index, title, description, type, required flag, `chrome` card or plain.",
420
1083
  "dontUseWhen": "You are laying out the whole questionnaire (`QuestionnairePanel`) or a plain form field (`Field`).",
421
- "related": ["QuestionnairePanel", "Field"],
1084
+ "related": [
1085
+ "QuestionnairePanel",
1086
+ "Field"
1087
+ ],
422
1088
  "since": "1.17.0"
423
1089
  },
424
1090
  "QuestionnairePanel": {
425
1091
  "category": "forms",
426
1092
  "useWhen": "The questionnaire container of the client portal: `cards` or `navigation` variant with eyebrow and title.",
427
1093
  "dontUseWhen": "A settings form (`Fieldset` inside `Card`).",
428
- "related": ["Questions", "Fieldset"],
1094
+ "related": [
1095
+ "Questions",
1096
+ "Fieldset"
1097
+ ],
429
1098
  "since": "1.17.0"
430
1099
  },
431
1100
  "MessageComposer": {
432
1101
  "category": "forms",
433
1102
  "useWhen": "The chat input of a thread: one card chrome, optional quick-reply chips, your editor as `children`, a footer with a built-in Send.",
434
1103
  "dontUseWhen": "A plain multi-line field (`Textarea`) or an email signature editor (`SignatureEditor`).",
435
- "related": ["Textarea", "SuggestionPills", "AiDraftCard", "MessageBubble"],
1104
+ "related": [
1105
+ "Textarea",
1106
+ "SuggestionPills",
1107
+ "AiDraftCard",
1108
+ "MessageBubble"
1109
+ ],
436
1110
  "since": "0.14.0"
437
1111
  },
438
1112
  "SignatureEditor": {
439
1113
  "category": "forms",
440
1114
  "useWhen": "The panel chrome for editing a personal email signature: header with Add image, your editor as `children`, Save / Insert footer; drop it in a `Popover` or use standalone.",
441
1115
  "dontUseWhen": "Capturing a drawn e-signature (`ProposalSignatureBlock`).",
442
- "related": ["MessageComposer", "Popover"],
1116
+ "related": [
1117
+ "MessageComposer",
1118
+ "Popover"
1119
+ ],
443
1120
  "since": "1.5.0"
444
1121
  },
445
1122
  "DocumentRequestField": {
446
1123
  "category": "forms",
447
1124
  "useWhen": "One row of a document request form: a slot for your document-type select plus description and required toggle.",
448
1125
  "dontUseWhen": "A generic form field (`Field`).",
449
- "related": ["DocumentRequestDetail", "Field", "Select"],
1126
+ "related": [
1127
+ "DocumentRequestDetail",
1128
+ "Field",
1129
+ "Select"
1130
+ ],
450
1131
  "since": "1.4.0"
451
1132
  },
452
1133
  "DocumentRequestUpload": {
453
1134
  "category": "forms",
454
1135
  "useWhen": "The client-portal upload for a requested document: drop zone, progress and states tied to the request.",
455
1136
  "dontUseWhen": "A generic file field (`FileUpload`).",
456
- "related": ["FileUpload", "DocumentChecklist", "DocumentRequestDetail"],
1137
+ "related": [
1138
+ "FileUpload",
1139
+ "DocumentChecklist",
1140
+ "DocumentRequestDetail"
1141
+ ],
457
1142
  "since": "1.20.0"
458
1143
  },
459
1144
  "ProposalSignatureBlock": {
460
1145
  "category": "forms",
461
1146
  "label": "Proposal signing",
462
- "parts": ["ProposalConsentGate", "ProposalPaymentCapture"],
1147
+ "parts": [
1148
+ "ProposalConsentGate",
1149
+ "ProposalPaymentCapture"
1150
+ ],
463
1151
  "useWhen": "The signing step of a proposal: consent gate, signature capture, payment capture.",
464
1152
  "dontUseWhen": "An email signature (`SignatureEditor`).",
465
- "related": ["AgreementViewer", "ProposalPackageCard"],
1153
+ "related": [
1154
+ "AgreementViewer",
1155
+ "ProposalPackageCard"
1156
+ ],
466
1157
  "since": "1.12.0"
467
1158
  },
468
1159
  "FormSection": {
469
1160
  "category": "forms",
470
1161
  "useWhen": "Only in code that already uses it: a titled `<fieldset>` block of a settings form with description and trailing action.",
471
1162
  "dontUseWhen": "New code — use `Fieldset` + `FieldsetLegend` (deprecated, removed in 3.0).",
472
- "related": ["Fieldset", "Field"],
1163
+ "related": [
1164
+ "Fieldset",
1165
+ "Field"
1166
+ ],
473
1167
  "since": "0.4.1"
474
1168
  },
475
1169
  "FormError": {
476
1170
  "category": "forms",
477
1171
  "label": "FormError / FormSuccess",
478
- "parts": ["FormSuccess"],
1172
+ "parts": [
1173
+ "FormSuccess"
1174
+ ],
479
1175
  "useWhen": "Only in code that already uses them: the pre-Field inline error and success messages (contract C-FORM-MSG).",
480
1176
  "dontUseWhen": "New code — `FieldError` and `FieldDescription` inside a `Field`, or a toast for a saved form (deprecated, removed in 3.0).",
481
- "related": ["Field", "ToastProvider"],
1177
+ "related": [
1178
+ "Field",
1179
+ "ToastProvider"
1180
+ ],
482
1181
  "since": "0.0.0"
483
1182
  },
484
-
485
1183
  "Select": {
486
1184
  "category": "selection",
487
- "parts": ["SelectRoot", "SelectTrigger", "SelectValue", "SelectContent", "SelectItem", "SelectGroup", "SelectLabel", "SelectSeparator", "SelectScrollUpButton", "SelectScrollDownButton"],
1185
+ "parts": [
1186
+ "SelectRoot",
1187
+ "SelectTrigger",
1188
+ "SelectValue",
1189
+ "SelectContent",
1190
+ "SelectItem",
1191
+ "SelectGroup",
1192
+ "SelectLabel",
1193
+ "SelectSeparator",
1194
+ "SelectScrollUpButton",
1195
+ "SelectScrollDownButton"
1196
+ ],
488
1197
  "useWhen": "One of a short static list in a dropdown: the sealed `Select` takes `options`; the `Select*` parts compose custom items. Empty value is a real empty (no sentinel option), `size`, `classNames`, Field binding.",
489
1198
  "dontUseWhen": "The user should type to filter, the list is long or async (`Combobox`), several values (`MultiSelect`), or a few options that can all be visible (`RadioGroup`, `ToggleGroup`).",
490
- "replacesRawHtml": ["<select>", "<option>"],
491
- "related": ["Combobox", "MultiSelect", "ClientSelect", "TeamMemberSelect"],
1199
+ "replacesRawHtml": [
1200
+ "<select>",
1201
+ "<option>"
1202
+ ],
1203
+ "related": [
1204
+ "Combobox",
1205
+ "MultiSelect",
1206
+ "ClientSelect",
1207
+ "TeamMemberSelect"
1208
+ ],
492
1209
  "since": "0.0.0"
493
1210
  },
494
1211
  "Combobox": {
495
1212
  "category": "selection",
496
- "helpers": ["DEFAULT_COMBOBOX_MESSAGES"],
1213
+ "helpers": [
1214
+ "DEFAULT_COMBOBOX_MESSAGES"
1215
+ ],
497
1216
  "useWhen": "A searchable pick: one input, a portalled listbox, the `Option<T>` model (`{ value, label }`), async loading and empty messages, single or `multiple`.",
498
1217
  "dontUseWhen": "A short static list (`Select`) or free text with suggestions that need not match (`Input` + `Popover`).",
499
- "replacesRawHtml": ["<input list> + <datalist>", "<select> with a search box"],
500
- "related": ["Select", "MultiSelect", "SearchSelect"],
1218
+ "replacesRawHtml": [
1219
+ "<input list> + <datalist>",
1220
+ "<select> with a search box"
1221
+ ],
1222
+ "related": [
1223
+ "Select",
1224
+ "MultiSelect",
1225
+ "SearchSelect"
1226
+ ],
501
1227
  "since": "unreleased"
502
1228
  },
503
1229
  "MultiSelect": {
504
1230
  "category": "selection",
505
1231
  "useWhen": "Several of many options with search: `Combobox` in `multiple` mode with selected chips.",
506
1232
  "dontUseWhen": "A handful of options that should all be visible (`MultiSelectField`) or one value (`Combobox`, `Select`).",
507
- "replacesRawHtml": ["<select multiple>"],
508
- "related": ["Combobox", "MultiSelectField", "Chip"],
1233
+ "replacesRawHtml": [
1234
+ "<select multiple>"
1235
+ ],
1236
+ "related": [
1237
+ "Combobox",
1238
+ "MultiSelectField",
1239
+ "Chip"
1240
+ ],
509
1241
  "since": "unreleased"
510
1242
  },
511
1243
  "SearchSelect": {
512
1244
  "category": "selection",
513
1245
  "useWhen": "Only in code that already uses it: the pre-Combobox searchable select with `{ id, label }` options (contract C-SEARCHSELECT).",
514
1246
  "dontUseWhen": "New code — `Combobox` with `Option` (deprecated, removed in 3.0; CM-08 rewrites single-mode call sites).",
515
- "related": ["Combobox", "MultiSelect"],
1247
+ "related": [
1248
+ "Combobox",
1249
+ "MultiSelect"
1250
+ ],
516
1251
  "since": "0.0.0"
517
1252
  },
518
1253
  "ClientSelect": {
519
1254
  "category": "selection",
520
1255
  "useWhen": "Pick one client: avatar, name and email rows on the `Select` primitive, long names truncated.",
521
1256
  "dontUseWhen": "Searching thousands of clients (`Combobox` with async options) or any other entity (`Select`).",
522
- "related": ["Select", "TeamMemberSelect", "Combobox"],
1257
+ "related": [
1258
+ "Select",
1259
+ "TeamMemberSelect",
1260
+ "Combobox"
1261
+ ],
523
1262
  "since": "0.0.0"
524
1263
  },
525
1264
  "TeamMemberSelect": {
526
1265
  "category": "selection",
527
1266
  "useWhen": "Pick an assignee: avatar and name rows on the `Select` primitive, with an unassigned option.",
528
1267
  "dontUseWhen": "Several assignees (`MultiSelect`) or any other entity (`Select`).",
529
- "related": ["Select", "ClientSelect", "DataTableView"],
1268
+ "related": [
1269
+ "Select",
1270
+ "ClientSelect",
1271
+ "DataTableView"
1272
+ ],
530
1273
  "since": "0.0.0"
531
1274
  },
532
1275
  "ToggleGroup": {
533
1276
  "category": "selection",
534
- "parts": ["ToggleGroupItem"],
1277
+ "parts": [
1278
+ "ToggleGroupItem"
1279
+ ],
535
1280
  "useWhen": "A view or mode switch with immediate effect (list/grid, day/week), single or multiple, roving focus.",
536
1281
  "dontUseWhen": "The choice is a form value (`RadioGroup`, `MultiSelectField`) or navigation between panels (`Tabs`).",
537
- "replacesRawHtml": ["group of <button aria-pressed>"],
538
- "related": ["Tabs", "RadioGroup", "DocumentSourceFilter"],
1282
+ "replacesRawHtml": [
1283
+ "group of <button aria-pressed>"
1284
+ ],
1285
+ "related": [
1286
+ "Tabs",
1287
+ "RadioGroup",
1288
+ "DocumentSourceFilter"
1289
+ ],
539
1290
  "since": "0.0.0"
540
1291
  },
541
1292
  "Chip": {
542
1293
  "category": "selection",
543
- "helpers": ["chipVariants", "resolveChipStyle"],
1294
+ "helpers": [
1295
+ "chipVariants",
1296
+ "resolveChipStyle"
1297
+ ],
544
1298
  "useWhen": "A removable, toggleable or clickable token: applied filters, tags, selected values; `variant` × `intent` × `size`, `onRemove`, `pressed`.",
545
1299
  "dontUseWhen": "A static label (`Badge`), a status (`StatusBadge`) or a file (`FileChip`, `AttachmentChip`).",
546
- "replacesRawHtml": ["<span class=\"rounded-full …\"><button>×</button></span>"],
547
- "related": ["DismissibleChip", "Badge", "Toolbar", "MultiSelect"],
1300
+ "replacesRawHtml": [
1301
+ "<span class=\"rounded-full …\"><button>×</button></span>"
1302
+ ],
1303
+ "related": [
1304
+ "DismissibleChip",
1305
+ "Badge",
1306
+ "Toolbar",
1307
+ "MultiSelect"
1308
+ ],
548
1309
  "since": "1.35.0"
549
1310
  },
550
1311
  "DismissibleChip": {
551
1312
  "category": "selection",
552
1313
  "useWhen": "Only in code that already uses it: a label with a remove button.",
553
1314
  "dontUseWhen": "New code — `Chip` with `onRemove` covers it with the shared variants and sizes.",
554
- "related": ["Chip"],
1315
+ "related": [
1316
+ "Chip"
1317
+ ],
555
1318
  "since": "0.4.0"
556
1319
  },
557
1320
  "MultiFilterPill": {
558
1321
  "category": "selection",
559
1322
  "useWhen": "A toolbar filter with a multi-select dropdown and a count of applied values.",
560
1323
  "dontUseWhen": "A single-value filter (`FilterChip`) or the full display menu (`DisplayMenu`).",
561
- "related": ["Toolbar", "DisplayMenu", "MultiSelect"],
1324
+ "related": [
1325
+ "Toolbar",
1326
+ "DisplayMenu",
1327
+ "MultiSelect"
1328
+ ],
562
1329
  "since": "0.0.0"
563
1330
  },
564
1331
  "DocumentSourceFilter": {
565
1332
  "category": "selection",
566
1333
  "useWhen": "Scope a document list to a provenance bucket (all, uploaded, emailed, …) with counts: a `ToggleGroup` that reuses `DocumentSourceTag`'s glyphs.",
567
1334
  "dontUseWhen": "Any other segmented filter (`ToggleGroup`).",
568
- "related": ["ToggleGroup", "DocumentSourceTag", "DocumentDetailPanel"],
1335
+ "related": [
1336
+ "ToggleGroup",
1337
+ "DocumentSourceTag",
1338
+ "DocumentDetailPanel"
1339
+ ],
569
1340
  "since": "1.12.0"
570
1341
  },
571
-
572
1342
  "Alert": {
573
1343
  "category": "feedback",
574
- "parts": ["AlertTitle", "AlertDescription"],
575
- "helpers": ["alertVariants"],
1344
+ "parts": [
1345
+ "AlertTitle",
1346
+ "AlertDescription"
1347
+ ],
1348
+ "helpers": [
1349
+ "alertVariants"
1350
+ ],
576
1351
  "useWhen": "An inline banner in the page flow: success, warning, danger or info, with title, description and optional action.",
577
1352
  "dontUseWhen": "Feedback after an action that should disappear (`ToastProvider`), a per-field error (`FieldError`) or a blocking message (`AlertDialog`).",
578
- "replacesRawHtml": ["<div role=\"alert\">", "coloured bordered div"],
579
- "related": ["ToastProvider", "Field", "AlertDialog"],
1353
+ "replacesRawHtml": [
1354
+ "<div role=\"alert\">",
1355
+ "coloured bordered div"
1356
+ ],
1357
+ "related": [
1358
+ "ToastProvider",
1359
+ "Field",
1360
+ "AlertDialog"
1361
+ ],
580
1362
  "since": "0.0.0"
581
1363
  },
582
1364
  "ToastProvider": {
583
1365
  "category": "feedback",
584
- "hooks": ["useToast"],
1366
+ "hooks": [
1367
+ "useToast"
1368
+ ],
585
1369
  "useWhen": "Transient notifications after an action: mount `ToastProvider` once, call `useToast()` anywhere below; `/testing` ships `createToastRecorder`.",
586
1370
  "dontUseWhen": "The message must stay until read (`Alert`) or is tied to a field (`FieldError`).",
587
- "replacesRawHtml": ["alert()", "hand-rolled toast portal"],
588
- "related": ["Alert", "CopyButton"],
1371
+ "replacesRawHtml": [
1372
+ "alert()",
1373
+ "hand-rolled toast portal"
1374
+ ],
1375
+ "related": [
1376
+ "Alert",
1377
+ "CopyButton"
1378
+ ],
589
1379
  "since": "0.0.0"
590
1380
  },
591
1381
  "Spinner": {
592
1382
  "category": "feedback",
593
- "helpers": ["spinnerVariants", "SPINNER_TONE_TO_INTENT"],
1383
+ "helpers": [
1384
+ "spinnerVariants",
1385
+ "SPINNER_TONE_TO_INTENT"
1386
+ ],
594
1387
  "useWhen": "Indeterminate activity in a small area or inside a control; inherits `currentColor` unless an `intent` is set.",
595
1388
  "dontUseWhen": "Loading content with a known shape (`Skeleton`, `LoadingRows`) or a button's own pending state (`Button loading`).",
596
- "replacesRawHtml": ["animate-spin svg"],
597
- "related": ["Skeleton", "LoadingRows", "ProgressBar"],
1389
+ "replacesRawHtml": [
1390
+ "animate-spin svg"
1391
+ ],
1392
+ "related": [
1393
+ "Skeleton",
1394
+ "LoadingRows",
1395
+ "ProgressBar"
1396
+ ],
598
1397
  "since": "0.15.0"
599
1398
  },
600
1399
  "Skeleton": {
601
1400
  "category": "feedback",
602
- "parts": ["SkeletonText", "SkeletonCircle"],
1401
+ "parts": [
1402
+ "SkeletonText",
1403
+ "SkeletonCircle"
1404
+ ],
603
1405
  "useWhen": "A placeholder in the shape of the content that is loading: block, text lines, circle.",
604
1406
  "dontUseWhen": "Rows of a list or table (`LoadingRows`) or an operation with no layout to reserve (`Spinner`).",
605
- "replacesRawHtml": ["<div class=\"animate-pulse bg-…\">"],
606
- "related": ["LoadingRows", "Spinner"],
1407
+ "replacesRawHtml": [
1408
+ "<div class=\"animate-pulse bg-…\">"
1409
+ ],
1410
+ "related": [
1411
+ "LoadingRows",
1412
+ "Spinner"
1413
+ ],
607
1414
  "since": "0.0.0"
608
1415
  },
609
1416
  "LoadingRows": {
610
1417
  "category": "feedback",
611
1418
  "useWhen": "N uniform skeleton rows while a list or table loads.",
612
1419
  "dontUseWhen": "A single shape (`Skeleton`).",
613
- "replacesRawHtml": ["Array.from({ length }).map(<Skeleton/>)"],
614
- "related": ["Skeleton", "DataTable"],
1420
+ "replacesRawHtml": [
1421
+ "Array.from({ length }).map(<Skeleton/>)"
1422
+ ],
1423
+ "related": [
1424
+ "Skeleton",
1425
+ "DataTable"
1426
+ ],
615
1427
  "since": "0.4.1"
616
1428
  },
617
1429
  "ProgressBar": {
618
1430
  "category": "feedback",
619
- "helpers": ["progressBarVariants", "PROGRESS_LEGACY_TO_INTENT"],
1431
+ "helpers": [
1432
+ "progressBarVariants",
1433
+ "PROGRESS_LEGACY_TO_INTENT"
1434
+ ],
620
1435
  "useWhen": "A determinate (or indeterminate) horizontal meter; `intent` sets the colour, otherwise it follows the value.",
621
1436
  "dontUseWhen": "A compact circular meter (`ProgressRing`), discrete steps (`SegmentedProgress`, `Stepper`) or the suite's percent readout (`SuiteProgress`).",
622
- "replacesRawHtml": ["<progress>", "nested div with width:%"],
623
- "related": ["ProgressRing", "SegmentedProgress", "SuiteProgress"],
1437
+ "replacesRawHtml": [
1438
+ "<progress>",
1439
+ "nested div with width:%"
1440
+ ],
1441
+ "related": [
1442
+ "ProgressRing",
1443
+ "SegmentedProgress",
1444
+ "SuiteProgress"
1445
+ ],
624
1446
  "since": "0.0.0"
625
1447
  },
626
1448
  "ProgressRing": {
627
1449
  "category": "feedback",
628
- "helpers": ["progressRingVariants"],
1450
+ "helpers": [
1451
+ "progressRingVariants"
1452
+ ],
629
1453
  "useWhen": "A circular meter for a card or tile, with the same `intent` and value-driven colour rule as `ProgressBar`.",
630
1454
  "dontUseWhen": "A wide layout (`ProgressBar`) or a donut of several series (`DonutChart`).",
631
- "related": ["ProgressBar", "DonutChart"],
1455
+ "related": [
1456
+ "ProgressBar",
1457
+ "DonutChart"
1458
+ ],
632
1459
  "since": "0.0.0"
633
1460
  },
634
1461
  "SegmentedProgress": {
635
1462
  "category": "feedback",
636
1463
  "useWhen": "Progress through a known number of steps as filled segments (onboarding, checklists).",
637
1464
  "dontUseWhen": "The steps have names (`Stepper`) or the value is continuous (`ProgressBar`).",
638
- "related": ["Stepper", "ProgressBar", "SuiteProgress"],
1465
+ "related": [
1466
+ "Stepper",
1467
+ "ProgressBar",
1468
+ "SuiteProgress"
1469
+ ],
639
1470
  "since": "1.2.0"
640
1471
  },
641
1472
  "SuiteProgress": {
642
1473
  "category": "feedback",
643
- "helpers": ["suiteProgressFillVariants"],
1474
+ "helpers": [
1475
+ "suiteProgressFillVariants"
1476
+ ],
644
1477
  "useWhen": "The suite's discrete segmented meter with a percent readout, tinted per product or `intent`.",
645
1478
  "dontUseWhen": "A generic segmented meter (`SegmentedProgress`) or a continuous one (`ProgressBar`).",
646
- "related": ["SegmentedProgress", "ProgressBar"],
1479
+ "related": [
1480
+ "SegmentedProgress",
1481
+ "ProgressBar"
1482
+ ],
647
1483
  "since": "1.34.0"
648
1484
  },
649
1485
  "EmptyState": {
650
1486
  "category": "feedback",
651
1487
  "useWhen": "A list or panel has nothing to show: icon, title, description and one action.",
652
1488
  "dontUseWhen": "The feature does not exist yet (`ComingSoon`) or content is loading (`Skeleton`).",
653
- "replacesRawHtml": ["centred div with an icon and grey text"],
654
- "related": ["ComingSoon", "LoadingRows"],
1489
+ "replacesRawHtml": [
1490
+ "centred div with an icon and grey text"
1491
+ ],
1492
+ "related": [
1493
+ "ComingSoon",
1494
+ "LoadingRows",
1495
+ "ErrorState"
1496
+ ],
655
1497
  "since": "0.0.0"
656
1498
  },
1499
+ "SectionCard": {
1500
+ "category": "layout",
1501
+ "useWhen": "A titled panel: `title`, optional `description`, trailing `actions`, body and optional `footer` — `Card`'s header/body/footer composed once. `flush` for a body that owns its row insets.",
1502
+ "dontUseWhen": "The surface has no heading (`Card`) or it is a whole page header (`PageHeader`).",
1503
+ "replacesRawHtml": [
1504
+ "section with a border, a heading row and a padded body"
1505
+ ],
1506
+ "related": [
1507
+ "Card",
1508
+ "PageHeader",
1509
+ "Surface"
1510
+ ],
1511
+ "since": "1.38.0"
1512
+ },
1513
+ "AvatarGroup": {
1514
+ "category": "data display",
1515
+ "useWhen": "An overlapping stack of `Avatar`s with a `+N` overflow bubble: `max` caps the faces, `total` carries the real count, `size` cascades from Avatar's scale.",
1516
+ "dontUseWhen": "A single person (`Avatar`) or a list that needs names (`DescriptionList`).",
1517
+ "replacesRawHtml": [
1518
+ "flex row of avatars with negative margins and a +N circle"
1519
+ ],
1520
+ "related": [
1521
+ "Avatar",
1522
+ "TeamMemberSelect"
1523
+ ],
1524
+ "since": "1.38.0"
1525
+ },
1526
+ "ErrorState": {
1527
+ "category": "feedback",
1528
+ "useWhen": "A list or panel failed to load: danger icon tile, title, description and a retry button (`onRetry`). `size=\"compact\"` inside a table.",
1529
+ "dontUseWhen": "There is simply nothing to show (`EmptyState`) or the error belongs to a form field (`FieldError`).",
1530
+ "replacesRawHtml": [
1531
+ "centred div with a warning icon and a Try again button"
1532
+ ],
1533
+ "related": [
1534
+ "EmptyState",
1535
+ "TableError"
1536
+ ],
1537
+ "since": "1.38.0"
1538
+ },
657
1539
  "ComingSoon": {
658
1540
  "category": "feedback",
659
1541
  "useWhen": "A placeholder for a feature that is not available yet: icon, title, description and a feature list.",
660
1542
  "dontUseWhen": "The feature exists but has no data (`EmptyState`).",
661
- "related": ["EmptyState"],
1543
+ "related": [
1544
+ "EmptyState"
1545
+ ],
662
1546
  "since": "0.0.0"
663
1547
  },
664
1548
  "AttentionItem": {
665
1549
  "category": "feedback",
666
1550
  "useWhen": "One row of an attention queue: icon, title, description, service tone and trailing action.",
667
1551
  "dontUseWhen": "A notification (`NotificationPanel` items) or an activity event (`ActivityList` items).",
668
- "related": ["NotificationPanel", "ActivityList", "KpiCard"],
1552
+ "related": [
1553
+ "NotificationPanel",
1554
+ "ActivityList",
1555
+ "KpiCard"
1556
+ ],
669
1557
  "since": "1.2.0"
670
1558
  },
671
1559
  "MissingDocumentsPanel": {
672
1560
  "category": "feedback",
673
1561
  "useWhen": "The firm-side panel listing documents a client has not provided, with a Request action.",
674
1562
  "dontUseWhen": "The client-side checklist (`DocumentChecklist`).",
675
- "related": ["DocumentChecklist", "DocumentRequestDetail"],
1563
+ "related": [
1564
+ "DocumentChecklist",
1565
+ "DocumentRequestDetail"
1566
+ ],
676
1567
  "since": "1.4.0"
677
1568
  },
678
1569
  "AiDraftCard": {
679
1570
  "category": "feedback",
680
1571
  "useWhen": "Present an AI-generated draft inside a composer: one `state` prop drives loading, refining, error and ready (collapsible); you pass the body and actions.",
681
1572
  "dontUseWhen": "A human message (`MessageBubble`) or AI quick replies (`SuggestionPills`).",
682
- "related": ["MessageComposer", "SuggestionPills", "AIReceiptPanel"],
1573
+ "related": [
1574
+ "MessageComposer",
1575
+ "SuggestionPills",
1576
+ "AIReceiptPanel"
1577
+ ],
683
1578
  "since": "1.5.0"
684
1579
  },
685
1580
  "AIReceiptPanel": {
686
1581
  "category": "feedback",
687
1582
  "useWhen": "The receipt-reading panel: idle, reading and done states with the extracted result and an Attach action.",
688
1583
  "dontUseWhen": "A generic upload (`FileUpload`) or a draft message (`AiDraftCard`).",
689
- "related": ["AiDraftCard", "FileUpload"],
1584
+ "related": [
1585
+ "AiDraftCard",
1586
+ "FileUpload"
1587
+ ],
690
1588
  "since": "1.2.0"
691
1589
  },
692
-
693
1590
  "Dialog": {
694
1591
  "category": "overlays",
695
- "parts": ["DialogTrigger", "DialogPortal", "DialogOverlay", "DialogContent", "DialogHeader", "DialogTitle", "DialogDescription", "DialogBody", "DialogFooter", "DialogClose"],
1592
+ "parts": [
1593
+ "DialogTrigger",
1594
+ "DialogPortal",
1595
+ "DialogOverlay",
1596
+ "DialogContent",
1597
+ "DialogHeader",
1598
+ "DialogTitle",
1599
+ "DialogDescription",
1600
+ "DialogBody",
1601
+ "DialogFooter",
1602
+ "DialogClose"
1603
+ ],
696
1604
  "useWhen": "A modal task or message: focus trap, Escape, overlay, `DialogTitle` required for the accessible name; `size` up to `xl` (or the `--ds-dialog-width` variable), `height`, and `DialogBody` as the scrolling region between header and footer.",
697
1605
  "dontUseWhen": "A confirmation that must be answered (`AlertDialog`), a side panel (`Sheet`), a mobile-friendly modal (`ResponsiveDialog`) or non-modal content (`Popover`).",
698
- "replacesRawHtml": ["<dialog>", "fixed inset-0 div"],
699
- "related": ["AlertDialog", "Sheet", "ResponsiveDialog", "CommandPalette"],
1606
+ "replacesRawHtml": [
1607
+ "<dialog>",
1608
+ "fixed inset-0 div"
1609
+ ],
1610
+ "related": [
1611
+ "AlertDialog",
1612
+ "Sheet",
1613
+ "ResponsiveDialog",
1614
+ "CommandPalette"
1615
+ ],
700
1616
  "since": "0.0.0",
701
- "docs": ["docs/adr/012-overlay-presence-motion.md"]
1617
+ "docs": [
1618
+ "docs/adr/012-overlay-presence-motion.md"
1619
+ ]
702
1620
  },
703
1621
  "AlertDialog": {
704
1622
  "category": "overlays",
705
- "parts": ["AlertDialogTrigger", "AlertDialogPortal", "AlertDialogOverlay", "AlertDialogContent", "AlertDialogHeader", "AlertDialogTitle", "AlertDialogDescription", "AlertDialogFooter", "AlertDialogAction", "AlertDialogCancel"],
1623
+ "parts": [
1624
+ "AlertDialogTrigger",
1625
+ "AlertDialogPortal",
1626
+ "AlertDialogOverlay",
1627
+ "AlertDialogContent",
1628
+ "AlertDialogHeader",
1629
+ "AlertDialogTitle",
1630
+ "AlertDialogDescription",
1631
+ "AlertDialogFooter",
1632
+ "AlertDialogAction",
1633
+ "AlertDialogCancel"
1634
+ ],
706
1635
  "useWhen": "A decision the user must make before continuing (delete, discard): no outside-click dismiss, explicit Action and Cancel.",
707
1636
  "dontUseWhen": "A dismissible task (`Dialog`) or a one-line confirm around a trigger (`ConfirmActionButton`).",
708
- "replacesRawHtml": ["window.confirm()"],
709
- "related": ["Dialog", "ConfirmActionButton"],
1637
+ "replacesRawHtml": [
1638
+ "window.confirm()"
1639
+ ],
1640
+ "related": [
1641
+ "Dialog",
1642
+ "ConfirmActionButton"
1643
+ ],
710
1644
  "since": "0.0.0"
711
1645
  },
712
1646
  "Sheet": {
713
1647
  "category": "overlays",
714
- "parts": ["SheetTrigger", "SheetPortal", "SheetOverlay", "SheetContent", "SheetHeader", "SheetTitle", "SheetDescription", "SheetBody", "SheetFooter", "SheetClose"],
1648
+ "parts": [
1649
+ "SheetTrigger",
1650
+ "SheetPortal",
1651
+ "SheetOverlay",
1652
+ "SheetContent",
1653
+ "SheetHeader",
1654
+ "SheetTitle",
1655
+ "SheetDescription",
1656
+ "SheetBody",
1657
+ "SheetFooter",
1658
+ "SheetClose"
1659
+ ],
715
1660
  "useWhen": "A panel sliding in from an edge for a secondary task or detail: `side`, sizes, the Dialog accessibility model, `SheetBody` as the scrolling region between header and footer.",
716
1661
  "dontUseWhen": "Centred content (`Dialog`) or a persistent split view (`MasterDetailLayout`).",
717
- "replacesRawHtml": ["fixed right-0 h-full div"],
718
- "related": ["SideDrawer", "Dialog", "ResponsiveDialog"],
1662
+ "replacesRawHtml": [
1663
+ "fixed right-0 h-full div"
1664
+ ],
1665
+ "related": [
1666
+ "SideDrawer",
1667
+ "Dialog",
1668
+ "ResponsiveDialog"
1669
+ ],
719
1670
  "since": "0.0.0"
720
1671
  },
721
1672
  "SideDrawer": {
722
1673
  "category": "overlays",
723
1674
  "useWhen": "Only in code that already uses it: the earlier slide-in panel API (`open`, `onClose`, `title`, `width`).",
724
1675
  "dontUseWhen": "New code — `Sheet` has the same behaviour with composable parts.",
725
- "related": ["Sheet"],
1676
+ "related": [
1677
+ "Sheet"
1678
+ ],
726
1679
  "since": "0.0.0"
727
1680
  },
728
1681
  "ResponsiveDialog": {
729
1682
  "category": "overlays",
730
1683
  "useWhen": "A modal that should be a `Dialog` on desktop and a bottom `Sheet` below the `sm` breakpoint, decided after mount.",
731
1684
  "dontUseWhen": "The presentation must be fixed (`Dialog`, `Sheet`).",
732
- "related": ["Dialog", "Sheet"],
1685
+ "related": [
1686
+ "Dialog",
1687
+ "Sheet"
1688
+ ],
733
1689
  "since": "1.3.0"
734
1690
  },
735
1691
  "Popover": {
736
1692
  "category": "overlays",
737
- "parts": ["PopoverTrigger", "PopoverAnchor", "PopoverPortal", "PopoverContent", "PopoverClose"],
1693
+ "parts": [
1694
+ "PopoverTrigger",
1695
+ "PopoverAnchor",
1696
+ "PopoverPortal",
1697
+ "PopoverContent",
1698
+ "PopoverClose"
1699
+ ],
738
1700
  "useWhen": "Interactive content anchored to a trigger: a small form, a picker, a filter panel.",
739
1701
  "dontUseWhen": "A short non-interactive label (`Tooltip`), a preview on hover (`HoverCard`) or a list of actions (`DropdownMenu`).",
740
- "replacesRawHtml": ["absolute-positioned div toggled by state"],
741
- "related": ["Tooltip", "HoverCard", "DropdownMenu"],
1702
+ "replacesRawHtml": [
1703
+ "absolute-positioned div toggled by state"
1704
+ ],
1705
+ "related": [
1706
+ "Tooltip",
1707
+ "HoverCard",
1708
+ "DropdownMenu"
1709
+ ],
742
1710
  "since": "0.0.0"
743
1711
  },
744
1712
  "HoverCard": {
745
1713
  "category": "overlays",
746
- "parts": ["HoverCardTrigger", "HoverCardPortal", "HoverCardContent"],
1714
+ "parts": [
1715
+ "HoverCardTrigger",
1716
+ "HoverCardPortal",
1717
+ "HoverCardContent"
1718
+ ],
747
1719
  "useWhen": "A rich preview when hovering a link or name (a person card, a record summary), for sighted pointer users.",
748
1720
  "dontUseWhen": "The content is essential (it is hover-only) or interactive (`Popover`).",
749
- "related": ["Popover", "Tooltip"],
1721
+ "related": [
1722
+ "Popover",
1723
+ "Tooltip"
1724
+ ],
750
1725
  "since": "0.0.0"
751
1726
  },
752
1727
  "Tooltip": {
753
1728
  "category": "overlays",
754
- "parts": ["TooltipProvider", "TooltipTrigger", "TooltipPortal", "TooltipContent"],
1729
+ "parts": [
1730
+ "TooltipProvider",
1731
+ "TooltipTrigger",
1732
+ "TooltipPortal",
1733
+ "TooltipContent"
1734
+ ],
755
1735
  "useWhen": "A short label for a control on hover and focus; the sealed `Tooltip` takes `content`, the parts compose.",
756
1736
  "dontUseWhen": "The text is essential to use the control (make it visible) or interactive (`Popover`).",
757
- "replacesRawHtml": ["title=\"…\""],
758
- "related": ["IconButton", "Popover", "Kbd"],
1737
+ "replacesRawHtml": [
1738
+ "title=\"…\""
1739
+ ],
1740
+ "related": [
1741
+ "IconButton",
1742
+ "Popover",
1743
+ "Kbd"
1744
+ ],
759
1745
  "since": "0.0.0"
760
1746
  },
761
1747
  "DropdownMenu": {
762
1748
  "category": "overlays",
763
- "parts": ["DropdownMenuTrigger", "DropdownMenuPortal", "DropdownMenuContent", "DropdownMenuItem", "DropdownMenuCheckboxItem", "DropdownMenuRadioGroup", "DropdownMenuRadioItem", "DropdownMenuGroup", "DropdownMenuLabel", "DropdownMenuSeparator", "DropdownMenuShortcut", "DropdownMenuSub", "DropdownMenuSubTrigger", "DropdownMenuSubContent"],
1749
+ "parts": [
1750
+ "DropdownMenuTrigger",
1751
+ "DropdownMenuPortal",
1752
+ "DropdownMenuContent",
1753
+ "DropdownMenuItem",
1754
+ "DropdownMenuCheckboxItem",
1755
+ "DropdownMenuRadioGroup",
1756
+ "DropdownMenuRadioItem",
1757
+ "DropdownMenuGroup",
1758
+ "DropdownMenuLabel",
1759
+ "DropdownMenuSeparator",
1760
+ "DropdownMenuShortcut",
1761
+ "DropdownMenuSub",
1762
+ "DropdownMenuSubTrigger",
1763
+ "DropdownMenuSubContent"
1764
+ ],
764
1765
  "useWhen": "A menu of actions from a button: items, checkbox and radio items, groups, shortcuts, submenus; `/testing` ships `openMenu`.",
765
1766
  "dontUseWhen": "Choosing a form value (`Select`), right-click (`ContextMenu`) or a form inside (`Popover`).",
766
- "replacesRawHtml": ["<ul> shown on click", "<select> used as a menu"],
767
- "related": ["ContextMenu", "NewMenu", "Select", "Popover"],
1767
+ "replacesRawHtml": [
1768
+ "<ul> shown on click",
1769
+ "<select> used as a menu"
1770
+ ],
1771
+ "related": [
1772
+ "ContextMenu",
1773
+ "NewMenu",
1774
+ "Select",
1775
+ "Popover"
1776
+ ],
768
1777
  "since": "0.0.0"
769
1778
  },
770
1779
  "ContextMenu": {
771
1780
  "category": "overlays",
772
- "parts": ["ContextMenuTrigger", "ContextMenuPortal", "ContextMenuContent", "ContextMenuItem", "ContextMenuCheckboxItem", "ContextMenuRadioGroup", "ContextMenuRadioItem", "ContextMenuGroup", "ContextMenuLabel", "ContextMenuSeparator", "ContextMenuShortcut", "ContextMenuSub", "ContextMenuSubTrigger", "ContextMenuSubContent"],
1781
+ "parts": [
1782
+ "ContextMenuTrigger",
1783
+ "ContextMenuPortal",
1784
+ "ContextMenuContent",
1785
+ "ContextMenuItem",
1786
+ "ContextMenuCheckboxItem",
1787
+ "ContextMenuRadioGroup",
1788
+ "ContextMenuRadioItem",
1789
+ "ContextMenuGroup",
1790
+ "ContextMenuLabel",
1791
+ "ContextMenuSeparator",
1792
+ "ContextMenuShortcut",
1793
+ "ContextMenuSub",
1794
+ "ContextMenuSubTrigger",
1795
+ "ContextMenuSubContent"
1796
+ ],
773
1797
  "useWhen": "Actions on right-click or long-press over a region, with the same item model as `DropdownMenu`.",
774
1798
  "dontUseWhen": "The actions must be discoverable (`DropdownMenu` from a visible trigger).",
775
- "replacesRawHtml": ["onContextMenu + positioned div"],
776
- "related": ["DropdownMenu"],
1799
+ "replacesRawHtml": [
1800
+ "onContextMenu + positioned div"
1801
+ ],
1802
+ "related": [
1803
+ "DropdownMenu"
1804
+ ],
777
1805
  "since": "0.0.0"
778
1806
  },
779
1807
  "CommandPalette": {
780
1808
  "category": "overlays",
781
1809
  "useWhen": "The ⌘K command and search dialog: `cmdk` inside `Dialog`, groups, shortcuts, async results.",
782
1810
  "dontUseWhen": "Searching one list (`SearchInput`) or picking a form value (`Combobox`).",
783
- "related": ["Dialog", "KeyboardShortcutsDialog", "Combobox"],
1811
+ "related": [
1812
+ "Dialog",
1813
+ "KeyboardShortcutsDialog",
1814
+ "Combobox"
1815
+ ],
784
1816
  "since": "0.0.0"
785
1817
  },
786
1818
  "KeyboardShortcutsDialog": {
787
1819
  "category": "overlays",
788
1820
  "useWhen": "The \"?\" help dialog listing keyboard shortcuts by section; no props shows the universal General section.",
789
1821
  "dontUseWhen": "Showing one shortcut next to a control (`Kbd`, `KbdHint`).",
790
- "related": ["Kbd", "CommandPalette"],
1822
+ "related": [
1823
+ "Kbd",
1824
+ "CommandPalette"
1825
+ ],
791
1826
  "since": "0.0.0"
792
1827
  },
793
-
794
1828
  "Tabs": {
795
1829
  "category": "navigation",
796
- "parts": ["TabsList", "TabsTrigger", "TabsContent"],
1830
+ "parts": [
1831
+ "TabsList",
1832
+ "TabsTrigger",
1833
+ "TabsContent"
1834
+ ],
797
1835
  "useWhen": "Switch between panels of one page; roving focus, `value`/`onValueChange`.",
798
1836
  "dontUseWhen": "The switch changes a mode rather than showing another panel (`ToggleGroup`), or it is the mobile app-level bar (`BottomNav`).",
799
- "replacesRawHtml": ["<ul role=\"tablist\">", "buttons toggling useState panels"],
800
- "related": ["ToggleGroup", "ChannelTabs", "BottomNav"],
1837
+ "replacesRawHtml": [
1838
+ "<ul role=\"tablist\">",
1839
+ "buttons toggling useState panels"
1840
+ ],
1841
+ "related": [
1842
+ "ToggleGroup",
1843
+ "ChannelTabs",
1844
+ "BottomNav"
1845
+ ],
801
1846
  "since": "0.0.0"
802
1847
  },
803
1848
  "ChannelTabs": {
804
1849
  "category": "navigation",
805
1850
  "useWhen": "Pill tabs switching between communication channels on a thread, each with a toned status dot and unread count; fully controlled.",
806
1851
  "dontUseWhen": "Generic panels (`Tabs`).",
807
- "related": ["Tabs", "StatusDot", "MessageBubble"],
1852
+ "related": [
1853
+ "Tabs",
1854
+ "StatusDot",
1855
+ "MessageBubble"
1856
+ ],
808
1857
  "since": "1.5.0"
809
1858
  },
810
1859
  "Breadcrumb": {
811
1860
  "category": "navigation",
812
- "parts": ["BreadcrumbList", "BreadcrumbItem", "BreadcrumbLink", "BreadcrumbPage", "BreadcrumbSeparator"],
1861
+ "parts": [
1862
+ "BreadcrumbList",
1863
+ "BreadcrumbItem",
1864
+ "BreadcrumbLink",
1865
+ "BreadcrumbPage",
1866
+ "BreadcrumbSeparator"
1867
+ ],
813
1868
  "useWhen": "The path to the current page; `BreadcrumbPage` marks the current one, `BreadcrumbLink asChild` wraps your router link.",
814
1869
  "dontUseWhen": "The page title itself (`PageHeader`) or the app-level bar (`AppHeaderBreadcrumb` inside `AppHeader`).",
815
- "replacesRawHtml": ["<nav aria-label=\"breadcrumb\"><ol>"],
816
- "related": ["PageHeader", "AppHeader"],
1870
+ "replacesRawHtml": [
1871
+ "<nav aria-label=\"breadcrumb\"><ol>"
1872
+ ],
1873
+ "related": [
1874
+ "PageHeader",
1875
+ "AppHeader"
1876
+ ],
817
1877
  "since": "0.0.0"
818
1878
  },
819
1879
  "Pagination": {
820
1880
  "category": "navigation",
821
1881
  "useWhen": "Page controls for a paged list: current/total pages, sibling count, optional total items.",
822
- "dontUseWhen": "Inside a `DataTable` (`DataTablePagination`) or infinite scroll.",
823
- "replacesRawHtml": ["<nav> of page number buttons"],
824
- "related": ["DataTable", "DataTableView"],
1882
+ "dontUseWhen": "Infinite scroll. Inside a `DataTable`, `DataTablePagination` is the same component with the table defaults.",
1883
+ "replacesRawHtml": [
1884
+ "<nav> of page number buttons"
1885
+ ],
1886
+ "related": [
1887
+ "DataTable",
1888
+ "DataTableView"
1889
+ ],
825
1890
  "since": "0.0.0"
826
1891
  },
827
1892
  "Stepper": {
828
1893
  "category": "navigation",
829
1894
  "useWhen": "Named steps of a multi-step flow, horizontal or vertical, with the current step marked.",
830
1895
  "dontUseWhen": "Unnamed progress (`SegmentedProgress`) or a timeline of past events (`EngagementTimeline`).",
831
- "related": ["SegmentedProgress", "EngagementTimeline"],
1896
+ "related": [
1897
+ "SegmentedProgress",
1898
+ "EngagementTimeline"
1899
+ ],
832
1900
  "since": "0.0.0"
833
1901
  },
834
1902
  "BottomNav": {
835
1903
  "category": "navigation",
836
1904
  "useWhen": "The mobile tab bar at the bottom of the app: tabs with icons and badges, controlled `value`.",
837
1905
  "dontUseWhen": "Desktop navigation (`Sidebar`) or in-page panels (`Tabs`).",
838
- "related": ["Sidebar", "Tabs", "StickyActionBar"],
1906
+ "related": [
1907
+ "Sidebar",
1908
+ "Tabs",
1909
+ "StickyActionBar"
1910
+ ],
839
1911
  "since": "1.2.0"
840
1912
  },
841
1913
  "FolderTree": {
842
1914
  "category": "navigation",
843
1915
  "useWhen": "A collapsible tree of folders with an active node, default-open ids and selection callback.",
844
1916
  "dontUseWhen": "A flat list (`ClientRailItem`) or a file list (`DocumentList`).",
845
- "related": ["DocumentsWorkspaceLayout", "ClientRailItem", "Collapsible"],
1917
+ "related": [
1918
+ "DocumentsWorkspaceLayout",
1919
+ "ClientRailItem",
1920
+ "Collapsible"
1921
+ ],
846
1922
  "since": "1.2.0"
847
1923
  },
848
1924
  "ClientRailItem": {
849
1925
  "category": "navigation",
850
- "parts": ["ClientRailGroupHeader"],
1926
+ "parts": [
1927
+ "ClientRailGroupHeader"
1928
+ ],
851
1929
  "useWhen": "One client row in the Documents left rail (avatar, name, counts) plus the section label above a group.",
852
1930
  "dontUseWhen": "Picking a client in a form (`ClientSelect`) or the main navigation (`SidebarLink`).",
853
- "related": ["DocumentsWorkspaceLayout", "ClientSelect", "Sidebar"],
1931
+ "related": [
1932
+ "DocumentsWorkspaceLayout",
1933
+ "ClientSelect",
1934
+ "Sidebar"
1935
+ ],
854
1936
  "since": "1.4.0"
855
1937
  },
856
-
857
1938
  "Stack": {
858
1939
  "category": "layout",
859
1940
  "useWhen": "A vertical (or `direction=\"row\"`) flex container that owns the gap between its children with tokenised `gap` and alignment.",
860
1941
  "dontUseWhen": "A wrapping horizontal row (`Inline`) or a bordered box (`Surface`).",
861
- "replacesRawHtml": ["<div class=\"flex flex-col gap-4\">"],
862
- "related": ["Inline", "Surface"],
1942
+ "replacesRawHtml": [
1943
+ "<div class=\"flex flex-col gap-4\">"
1944
+ ],
1945
+ "related": [
1946
+ "Inline",
1947
+ "Surface"
1948
+ ],
863
1949
  "since": "1.33.0"
864
1950
  },
865
1951
  "Inline": {
866
1952
  "category": "layout",
867
1953
  "useWhen": "A horizontal wrapping row with children centred on the baseline and a tokenised gap: a row of chips, a button row, meta items.",
868
1954
  "dontUseWhen": "A column (`Stack`) or a toolbar of controls that must share one control size (`Toolbar`).",
869
- "replacesRawHtml": ["<div class=\"flex flex-wrap items-center gap-2\">"],
870
- "related": ["Stack", "Toolbar"],
1955
+ "replacesRawHtml": [
1956
+ "<div class=\"flex flex-wrap items-center gap-2\">"
1957
+ ],
1958
+ "related": [
1959
+ "Stack",
1960
+ "Toolbar"
1961
+ ],
871
1962
  "since": "1.33.0"
872
1963
  },
873
1964
  "Surface": {
874
1965
  "category": "layout",
875
1966
  "useWhen": "The bordered box content sits on: surface background, 1px rule, radius, `padding` role (none/sm/md/lg).",
876
1967
  "dontUseWhen": "You need header/title/footer parts or an interactive variant (`Card`).",
877
- "replacesRawHtml": ["<div class=\"rounded-xl border bg-white p-4\">"],
878
- "related": ["Card", "Stack"],
1968
+ "replacesRawHtml": [
1969
+ "<div class=\"rounded-xl border bg-white p-4\">"
1970
+ ],
1971
+ "related": [
1972
+ "Card",
1973
+ "Stack"
1974
+ ],
879
1975
  "since": "1.33.0"
880
1976
  },
881
1977
  "Card": {
882
1978
  "category": "layout",
883
- "parts": ["CardHeader", "CardTitle", "CardDescription", "CardAction", "CardContent", "CardFooter"],
884
- "helpers": ["cardVariants"],
1979
+ "parts": [
1980
+ "CardHeader",
1981
+ "CardTitle",
1982
+ "CardDescription",
1983
+ "CardAction",
1984
+ "CardContent",
1985
+ "CardFooter"
1986
+ ],
1987
+ "helpers": [
1988
+ "cardVariants"
1989
+ ],
885
1990
  "useWhen": "A surface with structure: header, title, description, trailing action, content, footer; `variant` default, interactive (hover border) or flat (nested).",
886
1991
  "dontUseWhen": "A plain box without parts (`Surface`), a KPI tile (`KpiCard`) or a domain card that already exists (`EngagementCard`, `DocumentFileRow`).",
887
- "replacesRawHtml": ["<div class=\"rounded-xl border shadow\">"],
888
- "related": ["Surface", "KpiCard", "Pressable"],
1992
+ "replacesRawHtml": [
1993
+ "<div class=\"rounded-xl border shadow\">"
1994
+ ],
1995
+ "related": [
1996
+ "Surface",
1997
+ "KpiCard",
1998
+ "Pressable"
1999
+ ],
889
2000
  "since": "0.0.0"
890
2001
  },
891
2002
  "Separator": {
892
2003
  "category": "layout",
893
2004
  "useWhen": "A horizontal or vertical rule between groups, decorative or semantic.",
894
2005
  "dontUseWhen": "The divider carries a category label (`CategoryDivider`) or sits inside a menu (`DropdownMenuSeparator`).",
895
- "replacesRawHtml": ["<hr>", "<div class=\"border-t\">"],
896
- "related": ["CategoryDivider"],
2006
+ "replacesRawHtml": [
2007
+ "<hr>",
2008
+ "<div class=\"border-t\">"
2009
+ ],
2010
+ "related": [
2011
+ "CategoryDivider"
2012
+ ],
897
2013
  "since": "0.0.0"
898
2014
  },
899
2015
  "AspectRatio": {
900
2016
  "category": "layout",
901
2017
  "useWhen": "Reserve a fixed ratio box for an image, video or embed.",
902
2018
  "dontUseWhen": "The media has intrinsic size (plain `<img>` with width/height).",
903
- "replacesRawHtml": ["padding-top percentage hack"],
904
- "related": ["PdfPreview"],
2019
+ "replacesRawHtml": [
2020
+ "padding-top percentage hack"
2021
+ ],
2022
+ "related": [
2023
+ "PdfPreview"
2024
+ ],
905
2025
  "since": "0.0.0"
906
2026
  },
907
2027
  "ScrollArea": {
908
2028
  "category": "layout",
909
- "parts": ["ScrollBar"],
2029
+ "parts": [
2030
+ "ScrollBar"
2031
+ ],
910
2032
  "useWhen": "A scrollable region with styled, consistent scrollbars (panels, menus, side rails).",
911
2033
  "dontUseWhen": "The document scrolls (leave it to the browser).",
912
- "replacesRawHtml": ["<div class=\"overflow-auto\">"],
913
- "related": ["Sheet", "Sidebar"],
2034
+ "replacesRawHtml": [
2035
+ "<div class=\"overflow-auto\">"
2036
+ ],
2037
+ "related": [
2038
+ "Sheet",
2039
+ "Sidebar"
2040
+ ],
914
2041
  "since": "0.0.0"
915
2042
  },
916
2043
  "Collapsible": {
917
2044
  "category": "layout",
918
- "parts": ["CollapsibleTrigger", "CollapsibleContent"],
2045
+ "parts": [
2046
+ "CollapsibleTrigger",
2047
+ "CollapsibleContent"
2048
+ ],
919
2049
  "useWhen": "Show/hide one region from a trigger, animated and reduced-motion aware.",
920
2050
  "dontUseWhen": "Several mutually exclusive sections (`Accordion`).",
921
- "replacesRawHtml": ["<details>/<summary>", "useState toggle"],
922
- "related": ["Accordion", "FolderTree"],
2051
+ "replacesRawHtml": [
2052
+ "<details>/<summary>",
2053
+ "useState toggle"
2054
+ ],
2055
+ "related": [
2056
+ "Accordion",
2057
+ "FolderTree"
2058
+ ],
923
2059
  "since": "0.0.0"
924
2060
  },
925
2061
  "Accordion": {
926
2062
  "category": "layout",
927
- "parts": ["AccordionItem", "AccordionTrigger", "AccordionContent"],
2063
+ "parts": [
2064
+ "AccordionItem",
2065
+ "AccordionTrigger",
2066
+ "AccordionContent"
2067
+ ],
928
2068
  "useWhen": "A list of expandable sections, single or multiple open.",
929
2069
  "dontUseWhen": "One region (`Collapsible`) or navigation between panels (`Tabs`).",
930
- "replacesRawHtml": ["stack of <details>"],
931
- "related": ["Collapsible", "Tabs"],
2070
+ "replacesRawHtml": [
2071
+ "stack of <details>"
2072
+ ],
2073
+ "related": [
2074
+ "Collapsible",
2075
+ "Tabs"
2076
+ ],
932
2077
  "since": "0.0.0"
933
2078
  },
934
2079
  "Section": {
935
2080
  "category": "layout",
936
- "parts": ["SectionHead"],
2081
+ "parts": [
2082
+ "SectionHead"
2083
+ ],
937
2084
  "useWhen": "A max-width centred content section with the canonical `--content-pad` gutter and a `SectionHead` title row.",
938
2085
  "dontUseWhen": "The page already sits in `Content` of the `Shell` and needs a page title (`PageHeader`).",
939
- "replacesRawHtml": ["<section class=\"mx-auto max-w-… px-8\">"],
940
- "related": ["SectionHeader", "PageHeader", "Shell"],
2086
+ "replacesRawHtml": [
2087
+ "<section class=\"mx-auto max-w-… px-8\">"
2088
+ ],
2089
+ "related": [
2090
+ "SectionHeader",
2091
+ "PageHeader",
2092
+ "Shell"
2093
+ ],
941
2094
  "since": "0.0.0"
942
2095
  },
943
2096
  "SectionHeader": {
944
2097
  "category": "layout",
945
2098
  "useWhen": "A title + description block for a marketing-style or settings section.",
946
2099
  "dontUseWhen": "The top of a page (`PageHeader`) or a form group (`FieldsetLegend`).",
947
- "replacesRawHtml": ["<h2> + <p> pair"],
948
- "related": ["PageHeader", "Heading", "Section"],
2100
+ "replacesRawHtml": [
2101
+ "<h2> + <p> pair"
2102
+ ],
2103
+ "related": [
2104
+ "PageHeader",
2105
+ "Heading",
2106
+ "Section"
2107
+ ],
949
2108
  "since": "0.0.0"
950
2109
  },
951
2110
  "PageHeader": {
952
2111
  "category": "layout",
953
- "parts": ["PageHeaderSpec", "PageHeaderSep"],
2112
+ "parts": [
2113
+ "PageHeaderSpec",
2114
+ "PageHeaderSep"
2115
+ ],
954
2116
  "useWhen": "The top-of-page title block: eyebrow, headline with trailing actions, description and a meta row (`PageHeaderSpec` items separated by `PageHeaderSep`).",
955
2117
  "dontUseWhen": "The sticky app bar (`AppHeader`) or a section inside the page (`SectionHeader`).",
956
- "replacesRawHtml": ["<div class=\"flex items-center justify-between\"><h1>"],
957
- "related": ["AppHeader", "SectionHeader", "Breadcrumb"],
2118
+ "replacesRawHtml": [
2119
+ "<div class=\"flex items-center justify-between\"><h1>"
2120
+ ],
2121
+ "related": [
2122
+ "AppHeader",
2123
+ "SectionHeader",
2124
+ "Breadcrumb"
2125
+ ],
958
2126
  "since": "0.3.0"
959
2127
  },
960
2128
  "CategoryDivider": {
961
2129
  "category": "layout",
962
- "parts": ["CategoryTag"],
2130
+ "parts": [
2131
+ "CategoryTag"
2132
+ ],
963
2133
  "useWhen": "Separate a run of items by service line: a tone-tinted category pill, a hairline and an optional count — the one place per-service colour is allowed.",
964
2134
  "dontUseWhen": "A plain rule (`Separator`) or a status (`StatusBadge`).",
965
- "related": ["Separator", "serviceToneStyle"],
2135
+ "related": [
2136
+ "Separator",
2137
+ "serviceToneStyle"
2138
+ ],
966
2139
  "since": "1.3.0"
967
2140
  },
968
2141
  "StickyStack": {
969
2142
  "category": "layout",
970
- "parts": ["StickyStackLayer", "StickyStackSticky", "StickyStackSectionHeader"],
2143
+ "parts": [
2144
+ "StickyStackLayer",
2145
+ "StickyStackSticky",
2146
+ "StickyStackSectionHeader"
2147
+ ],
971
2148
  "useWhen": "Several fixed layers (app header, toolbar, section headers) that must stack without overlapping: layers are measured and sticky regions consume the offset.",
972
2149
  "dontUseWhen": "One sticky element (`position: sticky` on it) or a bottom bar (`StickyActionBar`).",
973
- "replacesRawHtml": ["hard-coded top-[56px] sticky offsets"],
974
- "related": ["AppHeader", "StickyActionBar"],
2150
+ "replacesRawHtml": [
2151
+ "hard-coded top-[56px] sticky offsets"
2152
+ ],
2153
+ "related": [
2154
+ "AppHeader",
2155
+ "StickyActionBar"
2156
+ ],
975
2157
  "since": "1.30.1"
976
2158
  },
977
2159
  "DetailGrid": {
978
2160
  "category": "layout",
979
2161
  "label": "Detail layout",
980
- "parts": ["DetailSpine", "DetailSpineHeader", "DetailSpineSection", "DetailSpineStats", "DetailMain"],
2162
+ "parts": [
2163
+ "DetailSpine",
2164
+ "DetailSpineHeader",
2165
+ "DetailSpineSection",
2166
+ "DetailSpineStats",
2167
+ "DetailMain"
2168
+ ],
981
2169
  "useWhen": "A record detail page: a sticky 320px spine (identity, key facts, stats) and a scrolling main column for tabs, sections and feeds.",
982
2170
  "dontUseWhen": "A list with a selected item beside it (`MasterDetailLayout`) or a plain page (`Section`).",
983
- "replacesRawHtml": ["<div class=\"grid grid-cols-[320px_1fr]\">"],
984
- "related": ["MasterDetailLayout", "MetadataGrid", "Tabs"],
2171
+ "replacesRawHtml": [
2172
+ "<div class=\"grid grid-cols-[320px_1fr]\">"
2173
+ ],
2174
+ "related": [
2175
+ "MasterDetailLayout",
2176
+ "MetadataGrid",
2177
+ "Tabs"
2178
+ ],
985
2179
  "since": "0.3.0"
986
2180
  },
987
2181
  "MasterDetailLayout": {
988
2182
  "category": "layout",
989
2183
  "useWhen": "A list on the left and the selected item's detail on the right, collapsing to one pane on small screens.",
990
2184
  "dontUseWhen": "A record page with a spine (`DetailGrid`) or the three-pane documents workspace (`DocumentsWorkspaceLayout`).",
991
- "related": ["DetailGrid", "DocumentsWorkspaceLayout"],
2185
+ "related": [
2186
+ "DetailGrid",
2187
+ "DocumentsWorkspaceLayout"
2188
+ ],
992
2189
  "since": "1.3.0"
993
2190
  },
994
2191
  "DocumentsWorkspaceLayout": {
995
2192
  "category": "layout",
996
2193
  "useWhen": "The three-pane documents workspace: clients rail, folder tree and files area as slots.",
997
2194
  "dontUseWhen": "Two panes (`MasterDetailLayout`).",
998
- "related": ["ClientRailItem", "FolderTree", "DocumentDetailPanel", "MasterDetailLayout"],
2195
+ "related": [
2196
+ "ClientRailItem",
2197
+ "FolderTree",
2198
+ "DocumentDetailPanel",
2199
+ "MasterDetailLayout"
2200
+ ],
999
2201
  "since": "1.4.0"
1000
2202
  },
1001
2203
  "DashGrid": {
1002
2204
  "category": "layout",
1003
2205
  "useWhen": "A dashboard of reorderable widgets in 2–4 columns with the order persisted under `storageKey`.",
1004
2206
  "dontUseWhen": "A static grid of cards (CSS grid of `Card`s).",
1005
- "related": ["KpiCard", "Card"],
2207
+ "related": [
2208
+ "KpiCard",
2209
+ "Card"
2210
+ ],
1006
2211
  "since": "1.2.0"
1007
2212
  },
1008
2213
  "RouteTransition": {
1009
2214
  "category": "layout",
1010
2215
  "useWhen": "Fade and slide a page panel in when `routeKey` changes; respects reduced motion.",
1011
2216
  "dontUseWhen": "Animating a component's own presence (the overlays already do) or a list (leave static).",
1012
- "related": ["Shell"],
2217
+ "related": [
2218
+ "Shell"
2219
+ ],
1013
2220
  "since": "1.3.0"
1014
2221
  },
1015
2222
  "VisuallyHidden": {
1016
2223
  "category": "layout",
1017
2224
  "useWhen": "Text for assistive technology that must not be seen: the name of an icon-only control you compose yourself, a live-region message.",
1018
2225
  "dontUseWhen": "Hiding from everyone (`hidden`) or an `IconButton` (it names itself).",
1019
- "replacesRawHtml": ["class=\"sr-only\""],
1020
- "related": ["IconButton"],
2226
+ "replacesRawHtml": [
2227
+ "class=\"sr-only\""
2228
+ ],
2229
+ "related": [
2230
+ "IconButton"
2231
+ ],
1021
2232
  "since": "0.0.0"
1022
2233
  },
1023
-
1024
2234
  "Heading": {
1025
2235
  "category": "typography",
1026
2236
  "useWhen": "A heading: `level` sets the element (h1–h6), `size` the visual role when it differs; h1 once per screen.",
1027
2237
  "dontUseWhen": "A label for a control (`Label`) or emphasised body text (`Text weight`).",
1028
- "replacesRawHtml": ["<h1>", "<h2>", "<h3>", "<h4>"],
1029
- "related": ["Text", "PageHeader", "SectionHeader"],
2238
+ "replacesRawHtml": [
2239
+ "<h1>",
2240
+ "<h2>",
2241
+ "<h3>",
2242
+ "<h4>"
2243
+ ],
2244
+ "related": [
2245
+ "Text",
2246
+ "PageHeader",
2247
+ "SectionHeader"
2248
+ ],
1030
2249
  "since": "1.33.0",
1031
- "docs": ["docs/design-system/typography-roles.md"]
2250
+ "docs": [
2251
+ "docs/design-system/typography-roles.md"
2252
+ ]
1032
2253
  },
1033
2254
  "Text": {
1034
2255
  "category": "typography",
1035
2256
  "useWhen": "Body, caption and label text: `size` is the typography role, `color` the token, `asChild` renders your element (a link, a `<p>`).",
1036
2257
  "dontUseWhen": "A heading (`Heading`), an identifier or snippet (`Code`) or a control's label (`Label`).",
1037
- "replacesRawHtml": ["<p>", "<span class=\"text-sm text-gray-500\">"],
1038
- "related": ["Heading", "Code", "Eyebrow"],
2258
+ "replacesRawHtml": [
2259
+ "<p>",
2260
+ "<span class=\"text-sm text-gray-500\">"
2261
+ ],
2262
+ "related": [
2263
+ "Heading",
2264
+ "Code",
2265
+ "Eyebrow"
2266
+ ],
1039
2267
  "since": "1.33.0"
1040
2268
  },
1041
2269
  "Code": {
1042
2270
  "category": "typography",
1043
2271
  "useWhen": "Monospace text: an identifier, a path, a value, a snippet (inline or block); server-safe.",
1044
2272
  "dontUseWhen": "A keyboard key (`Kbd`) or tabular figures in body text (`Numeric`).",
1045
- "replacesRawHtml": ["<code>", "<pre>"],
1046
- "related": ["Kbd", "Eyebrow"],
2273
+ "replacesRawHtml": [
2274
+ "<code>",
2275
+ "<pre>"
2276
+ ],
2277
+ "related": [
2278
+ "Kbd",
2279
+ "Eyebrow"
2280
+ ],
1047
2281
  "since": "1.33.0"
1048
2282
  },
1049
2283
  "Kbd": {
1050
2284
  "category": "typography",
1051
2285
  "useWhen": "A keyboard key or shortcut, with platform spelling decided after mount (⌘ vs Ctrl).",
1052
2286
  "dontUseWhen": "A hint next to a control in the intent-atom style (`KbdHint`) or code (`Code`).",
1053
- "replacesRawHtml": ["<kbd>"],
1054
- "related": ["Eyebrow", "KeyboardShortcutsDialog"],
2287
+ "replacesRawHtml": [
2288
+ "<kbd>"
2289
+ ],
2290
+ "related": [
2291
+ "Eyebrow",
2292
+ "KeyboardShortcutsDialog"
2293
+ ],
1055
2294
  "since": "1.33.0"
1056
2295
  },
1057
2296
  "Blockquote": {
1058
2297
  "category": "typography",
1059
2298
  "useWhen": "A quoted passage with the design system's rule and spacing.",
1060
2299
  "dontUseWhen": "A callout with an intent (`Alert`).",
1061
- "replacesRawHtml": ["<blockquote>"],
1062
- "related": ["Alert", "Text"],
2300
+ "replacesRawHtml": [
2301
+ "<blockquote>"
2302
+ ],
2303
+ "related": [
2304
+ "Alert",
2305
+ "Text"
2306
+ ],
1063
2307
  "since": "0.0.0"
1064
2308
  },
1065
2309
  "Eyebrow": {
1066
2310
  "category": "typography",
1067
2311
  "label": "Intent atoms",
1068
- "parts": ["MutedSpec", "Numeric", "KbdHint"],
2312
+ "parts": [
2313
+ "MutedSpec",
2314
+ "Numeric",
2315
+ "KbdHint"
2316
+ ],
1069
2317
  "useWhen": "Intent-named text atoms that bake in typography and colour tokens: `Eyebrow` (small caps label), `MutedSpec` (secondary spec text), `Numeric` (tabular figures), `KbdHint` (a key hint).",
1070
2318
  "dontUseWhen": "General body text with a chosen role (`Text`) or a heading (`Heading`).",
1071
- "related": ["Text", "Kbd", "Stat"],
2319
+ "related": [
2320
+ "Text",
2321
+ "Kbd",
2322
+ "Stat"
2323
+ ],
1072
2324
  "since": "0.3.0"
1073
2325
  },
1074
2326
  "StarRating": {
1075
2327
  "category": "data display",
1076
- "helpers": ["starRatingVariants"],
2328
+ "helpers": [
2329
+ "starRatingVariants"
2330
+ ],
1077
2331
  "useWhen": "A display-only rating: fractional stars, `max`, sized variants.",
1078
2332
  "dontUseWhen": "Capturing a rating (compose `RadioGroup` or `ToggleGroup` with star icons).",
1079
- "related": ["Badge", "KpiCard"],
2333
+ "related": [
2334
+ "Badge",
2335
+ "KpiCard"
2336
+ ],
1080
2337
  "since": "0.0.0"
1081
2338
  },
1082
2339
  "Stat": {
1083
2340
  "category": "typography",
1084
2341
  "useWhen": "A large number with a caption in display type.",
1085
2342
  "dontUseWhen": "A dashboard tile with tone, icon and hint (`KpiCard`).",
1086
- "related": ["KpiCard", "Eyebrow"],
2343
+ "related": [
2344
+ "KpiCard",
2345
+ "Eyebrow"
2346
+ ],
1087
2347
  "since": "0.0.0"
1088
2348
  },
1089
-
1090
2349
  "Table": {
1091
2350
  "category": "data display",
1092
- "parts": ["TableHeader", "TableBody", "TableFooter", "TableRow", "TableHead", "TableCell", "TableCaption"],
2351
+ "parts": [
2352
+ "TableHeader",
2353
+ "TableBody",
2354
+ "TableFooter",
2355
+ "TableRow",
2356
+ "TableHead",
2357
+ "TableCell",
2358
+ "TableCaption"
2359
+ ],
1093
2360
  "useWhen": "A bare semantic table with the design system's row, header and caption styling.",
1094
2361
  "dontUseWhen": "A records table with toolbar, sorting and pagination (`DataTable`, `DataTableView`) or an editable matrix (`Grid`).",
1095
- "replacesRawHtml": ["<table>", "<tr>", "<td>", "<th>"],
1096
- "related": ["DataTable", "DataTableView", "MetadataGrid"],
2362
+ "replacesRawHtml": [
2363
+ "<table>",
2364
+ "<tr>",
2365
+ "<td>",
2366
+ "<th>"
2367
+ ],
2368
+ "related": [
2369
+ "DataTable",
2370
+ "DataTableView",
2371
+ "MetadataGrid"
2372
+ ],
1097
2373
  "since": "0.0.0"
1098
2374
  },
1099
2375
  "DataTable": {
1100
2376
  "category": "data display",
1101
- "parts": ["DataTableToolbar", "DataTableSearch", "DataTableSpacer", "DataTableResultsCount", "DataTableHead", "DataTableHeader", "DataTableBody", "DataTableRow", "DataTableCell", "DataTableCellName", "DataTableCellMono", "DataTableCellId", "DataTableCellDue", "DataTableCheckbox", "DataTablePagination"],
2377
+ "parts": [
2378
+ "DataTableToolbar",
2379
+ "DataTableSearch",
2380
+ "DataTableSpacer",
2381
+ "DataTableResultsCount",
2382
+ "DataTableHead",
2383
+ "DataTableHeader",
2384
+ "DataTableBody",
2385
+ "DataTableRow",
2386
+ "DataTableCell",
2387
+ "DataTableCellName",
2388
+ "DataTableCellMono",
2389
+ "DataTableCellId",
2390
+ "DataTableCellDue",
2391
+ "DataTableCheckbox",
2392
+ "DataTablePagination"
2393
+ ],
1102
2394
  "useWhen": "The composable records table: card frame, toolbar with search and count, sortable headers, typed cells (name, mono, id, due), row checkbox, pagination.",
1103
2395
  "dontUseWhen": "A config-driven table is enough (`DataTableView`) or the table is a plain semantic one (`Table`).",
1104
- "replacesRawHtml": ["<table> + hand-rolled toolbar and pager"],
1105
- "related": ["DataTableView", "Table", "BulkActionBar", "LoadingRows"],
2396
+ "replacesRawHtml": [
2397
+ "<table> + hand-rolled toolbar and pager"
2398
+ ],
2399
+ "related": [
2400
+ "DataTableView",
2401
+ "Table",
2402
+ "BulkActionBar",
2403
+ "LoadingRows",
2404
+ "TableLoading"
2405
+ ],
1106
2406
  "since": "0.3.0"
1107
2407
  },
2408
+ "TableLoading": {
2409
+ "category": "data display",
2410
+ "useWhen": "The `<tbody aria-busy>` of a data table while its rows load: skeleton rows sized to the columns. Slots in place of `DataTableBody`.",
2411
+ "dontUseWhen": "A list outside a table (`LoadingRows`) or a single shape (`Skeleton`).",
2412
+ "replacesRawHtml": [
2413
+ "<tbody> of hand-rolled skeleton <td>s"
2414
+ ],
2415
+ "related": [
2416
+ "TableEmpty",
2417
+ "TableError",
2418
+ "DataTable",
2419
+ "LoadingRows"
2420
+ ],
2421
+ "since": "1.38.0"
2422
+ },
2423
+ "TableEmpty": {
2424
+ "category": "data display",
2425
+ "useWhen": "The `<tbody>` of a data table with no rows: one full-width row holding a compact `EmptyState`.",
2426
+ "dontUseWhen": "An empty panel outside a table (`EmptyState`).",
2427
+ "replacesRawHtml": [
2428
+ "<tr><td colSpan> with centred grey text"
2429
+ ],
2430
+ "related": [
2431
+ "TableLoading",
2432
+ "TableError",
2433
+ "EmptyState",
2434
+ "DataTable"
2435
+ ],
2436
+ "since": "1.38.0"
2437
+ },
2438
+ "TableError": {
2439
+ "category": "data display",
2440
+ "useWhen": "The `<tbody>` of a data table whose rows failed to load: one full-width row holding a compact `ErrorState` with retry.",
2441
+ "dontUseWhen": "An error panel outside a table (`ErrorState`).",
2442
+ "replacesRawHtml": [
2443
+ "<tr><td colSpan> with an error message and a retry button"
2444
+ ],
2445
+ "related": [
2446
+ "TableLoading",
2447
+ "TableEmpty",
2448
+ "ErrorState",
2449
+ "DataTable"
2450
+ ],
2451
+ "since": "1.38.0"
2452
+ },
1108
2453
  "DataTableView": {
1109
2454
  "category": "data display",
1110
- "parts": ["StagePill", "Assignee", "MoneyCell", "TagsCell", "Dash"],
2455
+ "parts": [
2456
+ "StagePill",
2457
+ "Assignee",
2458
+ "MoneyCell",
2459
+ "TagsCell",
2460
+ "Dash"
2461
+ ],
1111
2462
  "useWhen": "A list screen as configuration: `columns` + `data` (+ filters, search keys, sort); owns search/filter/sort/pagination state. Cell renderers `StagePill`, `Assignee`, `MoneyCell`, `TagsCell`, `Dash` for `column.render`.",
1112
2463
  "dontUseWhen": "You need custom table composition (`DataTable`).",
1113
- "related": ["DataTable", "DisplayMenu", "Toolbar"],
2464
+ "related": [
2465
+ "DataTable",
2466
+ "DisplayMenu",
2467
+ "Toolbar"
2468
+ ],
1114
2469
  "since": "1.6.0"
1115
2470
  },
1116
2471
  "MetadataGrid": {
1117
2472
  "category": "data display",
1118
- "parts": ["DataItem"],
2473
+ "parts": [
2474
+ "DataItem"
2475
+ ],
1119
2476
  "useWhen": "Label / value pairs on a detail surface as a semantic `<dl>`; `DataItem span={2}` for full-row values.",
1120
2477
  "dontUseWhen": "Tabular records (`Table`) or a stat tile (`KpiCard`).",
1121
- "replacesRawHtml": ["<dl>", "two-column label/value divs"],
1122
- "related": ["DetailGrid", "Table"],
2478
+ "replacesRawHtml": [
2479
+ "<dl>",
2480
+ "two-column label/value divs"
2481
+ ],
2482
+ "related": [
2483
+ "DetailGrid",
2484
+ "Table"
2485
+ ],
1123
2486
  "since": "0.4.1"
1124
2487
  },
1125
2488
  "KpiCard": {
1126
2489
  "category": "data display",
1127
- "parts": ["SelectableKpiCard"],
2490
+ "parts": [
2491
+ "SelectableKpiCard"
2492
+ ],
1128
2493
  "useWhen": "A single-stat dashboard tile: label, value, optional tone, icon and hint; `SelectableKpiCard` when tiles act as filters.",
1129
2494
  "dontUseWhen": "A number inside running content (`Stat`) or a chart (`DonutChart`).",
1130
- "related": ["Stat", "DashGrid", "Card"],
2495
+ "related": [
2496
+ "Stat",
2497
+ "DashGrid",
2498
+ "Card"
2499
+ ],
1131
2500
  "since": "0.4.1"
1132
2501
  },
1133
2502
  "Badge": {
1134
2503
  "category": "data display",
1135
- "helpers": ["badgeVariants", "resolveBadgeAppearance"],
2504
+ "helpers": [
2505
+ "badgeVariants",
2506
+ "resolveBadgeAppearance"
2507
+ ],
1136
2508
  "useWhen": "A short static label or count: `variant` (solid, soft, outline) × `intent`.",
1137
2509
  "dontUseWhen": "A status with a shared vocabulary (`StatusBadge`), a removable token (`Chip`) or a machine-suggested intent (`IntentBadge`).",
1138
- "replacesRawHtml": ["<span class=\"rounded-full px-2 text-xs\">"],
1139
- "related": ["StatusBadge", "Chip", "IntentBadge", "StatusDot"],
2510
+ "replacesRawHtml": [
2511
+ "<span class=\"rounded-full px-2 text-xs\">"
2512
+ ],
2513
+ "related": [
2514
+ "StatusBadge",
2515
+ "Chip",
2516
+ "IntentBadge",
2517
+ "StatusDot"
2518
+ ],
1140
2519
  "since": "0.0.0"
1141
2520
  },
1142
2521
  "StatusBadge": {
1143
2522
  "category": "data display",
1144
- "helpers": ["defineStatusMap"],
2523
+ "helpers": [
2524
+ "defineStatusMap"
2525
+ ],
1145
2526
  "useWhen": "The presentation of a status: soft badge, indicator dot, icon; define the product's statuses once with `defineStatusMap` and spread an entry onto it.",
1146
2527
  "dontUseWhen": "A count or neutral label (`Badge`) or a stage pill inside `DataTableView` (`StagePill`).",
1147
- "related": ["Badge", "StatusDot", "StatusPill", "DataTableView"],
2528
+ "related": [
2529
+ "Badge",
2530
+ "StatusDot",
2531
+ "StatusPill",
2532
+ "DataTableView"
2533
+ ],
1148
2534
  "since": "1.35.0"
1149
2535
  },
1150
2536
  "StatusPill": {
1151
2537
  "category": "data display",
1152
2538
  "useWhen": "Only in code that already uses it: the fixed-vocabulary pill (`status`, optional dot) for authoritative state.",
1153
2539
  "dontUseWhen": "New code — `StatusBadge` with `defineStatusMap`.",
1154
- "related": ["StatusBadge", "IntentBadge"],
2540
+ "related": [
2541
+ "StatusBadge",
2542
+ "IntentBadge"
2543
+ ],
1155
2544
  "since": "1.2.0"
1156
2545
  },
1157
2546
  "IntentBadge": {
1158
2547
  "category": "data display",
1159
2548
  "useWhen": "A dashed-outline badge for an AI-classified intent: signals machine-suggested, not yet confirmed.",
1160
2549
  "dontUseWhen": "Authoritative state (`StatusBadge`).",
1161
- "related": ["StatusBadge", "Badge", "AiDraftCard"],
2550
+ "related": [
2551
+ "StatusBadge",
2552
+ "Badge",
2553
+ "AiDraftCard"
2554
+ ],
1162
2555
  "since": "1.5.0"
1163
2556
  },
1164
2557
  "StatusDot": {
1165
2558
  "category": "data display",
1166
- "helpers": ["statusDotVariants", "STATUS_DOT_TONE_TO_INTENT"],
2559
+ "helpers": [
2560
+ "statusDotVariants",
2561
+ "STATUS_DOT_TONE_TO_INTENT"
2562
+ ],
1167
2563
  "useWhen": "A standalone attention / unread / presence dot on non-avatar surfaces: nav rails, bells, list rows; `intent` colours it.",
1168
2564
  "dontUseWhen": "Next to an avatar (`Avatar` renders its own presence dot) or with a label (`StatusBadge`).",
1169
- "replacesRawHtml": ["<span class=\"h-2 w-2 rounded-full bg-red-500\">"],
1170
- "related": ["StatusBadge", "Avatar", "Sidebar"],
2565
+ "replacesRawHtml": [
2566
+ "<span class=\"h-2 w-2 rounded-full bg-red-500\">"
2567
+ ],
2568
+ "related": [
2569
+ "StatusBadge",
2570
+ "Avatar",
2571
+ "Sidebar"
2572
+ ],
1171
2573
  "since": "1.3.0"
1172
2574
  },
1173
2575
  "StatusIcon": {
1174
2576
  "category": "icons",
1175
2577
  "useWhen": "A progress-aware state circle for pipeline stages (`state`, optional `progress`).",
1176
2578
  "dontUseWhen": "A status with text (`StatusBadge`) or a fixed glyph (icon catalogue).",
1177
- "related": ["PriorityIcon", "StatusBadge", "ProgressRing"],
2579
+ "related": [
2580
+ "PriorityIcon",
2581
+ "StatusBadge",
2582
+ "ProgressRing"
2583
+ ],
1178
2584
  "since": "0.8.0",
1179
2585
  "story": "src/primitives/priority-status-icons.stories.tsx"
1180
2586
  },
@@ -1182,267 +2588,501 @@
1182
2588
  "category": "icons",
1183
2589
  "useWhen": "The glyph for the fixed none/low/medium/high/urgent priority scale.",
1184
2590
  "dontUseWhen": "A generic arrow or flag (icon catalogue) or a status (`StatusIcon`).",
1185
- "related": ["StatusIcon", "StackedBarChart"],
2591
+ "related": [
2592
+ "StatusIcon",
2593
+ "StackedBarChart"
2594
+ ],
1186
2595
  "since": "0.8.0",
1187
2596
  "story": "src/primitives/priority-status-icons.stories.tsx"
1188
2597
  },
1189
2598
  "IconTile": {
1190
2599
  "category": "data display",
1191
- "helpers": ["iconTileVariants", "ICON_TILE_TONE_TO_INTENT"],
2600
+ "helpers": [
2601
+ "iconTileVariants",
2602
+ "ICON_TILE_TONE_TO_INTENT"
2603
+ ],
1192
2604
  "useWhen": "The tinted rounded-square icon chip that leads a list row or card: `intent` tints the square and the glyph.",
1193
2605
  "dontUseWhen": "An action (`IconButton`) or a file type (`FileTypeBadge`).",
1194
- "replacesRawHtml": ["<div class=\"grid place-items-center rounded-lg bg-…\"><svg/>"],
1195
- "related": ["FileTypeBadge", "Avatar", "IconButton"],
2606
+ "replacesRawHtml": [
2607
+ "<div class=\"grid place-items-center rounded-lg bg-…\"><svg/>"
2608
+ ],
2609
+ "related": [
2610
+ "FileTypeBadge",
2611
+ "Avatar",
2612
+ "IconButton"
2613
+ ],
1196
2614
  "since": "1.3.0"
1197
2615
  },
1198
2616
  "Avatar": {
1199
2617
  "category": "data display",
1200
2618
  "useWhen": "A person or organisation: image with initials fallback, sizes, optional presence dot.",
1201
2619
  "dontUseWhen": "A file (`FileTypeBadge`) or a product mark (brand icons, `Logo`).",
1202
- "replacesRawHtml": ["<img class=\"rounded-full\">"],
1203
- "related": ["StatusDot", "DataTableView", "TeamMemberSelect"],
2620
+ "replacesRawHtml": [
2621
+ "<img class=\"rounded-full\">"
2622
+ ],
2623
+ "related": [
2624
+ "StatusDot",
2625
+ "DataTableView",
2626
+ "TeamMemberSelect"
2627
+ ],
1204
2628
  "since": "0.0.0"
1205
2629
  },
1206
2630
  "FileTypeBadge": {
1207
2631
  "category": "data display",
1208
- "helpers": ["fileTypeBadgeVariants", "fileTypeFromName"],
2632
+ "helpers": [
2633
+ "fileTypeBadgeVariants",
2634
+ "fileTypeFromName"
2635
+ ],
1209
2636
  "useWhen": "The coloured format square (PDF, IMG, DOC…) for a file; `fileTypeFromName` derives the type.",
1210
2637
  "dontUseWhen": "A whole file row (`AttachmentChip`, `FileChip`, `DocumentFileRow`).",
1211
- "related": ["AttachmentChip", "FileChip", "IconTile"],
2638
+ "related": [
2639
+ "AttachmentChip",
2640
+ "FileChip",
2641
+ "IconTile"
2642
+ ],
1212
2643
  "since": "1.3.0"
1213
2644
  },
1214
2645
  "FileChip": {
1215
2646
  "category": "data display",
1216
2647
  "useWhen": "A compact file token: name, meta, kind icon, one action.",
1217
2648
  "dontUseWhen": "A full attachment row with view/download (`AttachmentChip`) or a document in the portal (`DocumentFileRow`).",
1218
- "related": ["AttachmentChip", "FileTypeBadge", "Chip"],
2649
+ "related": [
2650
+ "AttachmentChip",
2651
+ "FileTypeBadge",
2652
+ "Chip"
2653
+ ],
1219
2654
  "since": "1.2.0"
1220
2655
  },
1221
2656
  "AttachmentChip": {
1222
2657
  "category": "data display",
1223
- "helpers": ["attachmentChipVariants"],
2658
+ "helpers": [
2659
+ "attachmentChipVariants"
2660
+ ],
1224
2661
  "useWhen": "A full attachment row: `FileTypeBadge`, truncated name with meta, trailing view/download and your actions; presentational.",
1225
2662
  "dontUseWhen": "A compact token (`FileChip`) or an upload control (`FileUpload`).",
1226
- "related": ["FileChip", "FileTypeBadge", "FileUpload"],
2663
+ "related": [
2664
+ "FileChip",
2665
+ "FileTypeBadge",
2666
+ "FileUpload"
2667
+ ],
1227
2668
  "since": "1.3.0"
1228
2669
  },
1229
2670
  "DocumentSourceTag": {
1230
2671
  "category": "data display",
1231
2672
  "useWhen": "Where a document came from (uploaded, emailed, scanned…): glyph + label tag.",
1232
2673
  "dontUseWhen": "Filtering by source (`DocumentSourceFilter`).",
1233
- "related": ["DocumentSourceFilter", "DocumentDetailPanel"],
2674
+ "related": [
2675
+ "DocumentSourceFilter",
2676
+ "DocumentDetailPanel"
2677
+ ],
1234
2678
  "since": "1.12.0"
1235
2679
  },
1236
2680
  "ActivityList": {
1237
2681
  "category": "data display",
1238
- "parts": ["ActivityItem", "ActivityEventItem"],
2682
+ "parts": [
2683
+ "ActivityItem",
2684
+ "ActivityEventItem"
2685
+ ],
1239
2686
  "useWhen": "An activity feed: actor/text/target rows (`ActivityItem`) and titled events with a time and coloured dot (`ActivityEventItem`).",
1240
2687
  "dontUseWhen": "Notifications with filters and read state (`NotificationPanel`) or a process timeline (`EngagementTimeline`).",
1241
- "replacesRawHtml": ["<ul> of hand-styled feed rows"],
1242
- "related": ["NotificationPanel", "EngagementTimeline", "AttentionItem"],
2688
+ "replacesRawHtml": [
2689
+ "<ul> of hand-styled feed rows"
2690
+ ],
2691
+ "related": [
2692
+ "NotificationPanel",
2693
+ "EngagementTimeline",
2694
+ "AttentionItem"
2695
+ ],
1243
2696
  "since": "0.3.0"
1244
2697
  },
1245
2698
  "NotificationPanel": {
1246
2699
  "category": "data display",
1247
- "parts": ["NotificationPanelHeader", "NotificationFilter", "NotificationList", "NotificationItem", "NotificationPanelFooter"],
2700
+ "parts": [
2701
+ "NotificationPanelHeader",
2702
+ "NotificationFilter",
2703
+ "NotificationList",
2704
+ "NotificationItem",
2705
+ "NotificationPanelFooter"
2706
+ ],
1248
2707
  "useWhen": "The notifications flyout: header, filter, list of items with read state, footer actions.",
1249
2708
  "dontUseWhen": "A page-level activity feed (`ActivityList`).",
1250
- "related": ["ActivityList", "StatusDot", "Popover"],
2709
+ "related": [
2710
+ "ActivityList",
2711
+ "StatusDot",
2712
+ "Popover"
2713
+ ],
1251
2714
  "since": "0.7.0"
1252
2715
  },
1253
2716
  "Kanban": {
1254
2717
  "category": "data display",
1255
- "parts": ["KanbanColumn", "KanbanCard"],
2718
+ "parts": [
2719
+ "KanbanColumn",
2720
+ "KanbanCard"
2721
+ ],
1256
2722
  "useWhen": "A board of columns and cards for stage-based work.",
1257
2723
  "dontUseWhen": "The data is tabular (`DataTableView`).",
1258
- "related": ["DataTableView"],
2724
+ "related": [
2725
+ "DataTableView"
2726
+ ],
1259
2727
  "since": "0.3.0"
1260
2728
  },
1261
2729
  "EngagementCard": {
1262
2730
  "category": "data display",
1263
2731
  "useWhen": "The client-portal card for one engagement: service, tone, title, progress and next step.",
1264
2732
  "dontUseWhen": "A generic card (`Card`) or a KPI (`KpiCard`).",
1265
- "related": ["EngagementTimeline", "Card", "serviceToneStyle"],
2733
+ "related": [
2734
+ "EngagementTimeline",
2735
+ "Card",
2736
+ "serviceToneStyle"
2737
+ ],
1266
2738
  "since": "1.2.0"
1267
2739
  },
1268
2740
  "EngagementTimeline": {
1269
2741
  "category": "data display",
1270
- "parts": ["EngagementTimelineStep"],
2742
+ "parts": [
2743
+ "EngagementTimelineStep"
2744
+ ],
1271
2745
  "useWhen": "The steps of an engagement as a toned vertical timeline.",
1272
2746
  "dontUseWhen": "A flow the user navigates (`Stepper`) or an activity feed (`ActivityList`).",
1273
- "related": ["EngagementCard", "Stepper", "ActivityList"],
2747
+ "related": [
2748
+ "EngagementCard",
2749
+ "Stepper",
2750
+ "ActivityList"
2751
+ ],
1274
2752
  "since": "1.2.0"
1275
2753
  },
1276
2754
  "MessageBubble": {
1277
2755
  "category": "data display",
1278
- "parts": ["MessageBubbleAction", "MessageBubbleTombstone"],
2756
+ "parts": [
2757
+ "MessageBubbleAction",
2758
+ "MessageBubbleTombstone"
2759
+ ],
1279
2760
  "useWhen": "One chat message in a thread, inbound or outbound, with hover actions and a tombstone for deleted messages.",
1280
2761
  "dontUseWhen": "An email (`EmailMessageCard`) or an AI draft (`AiDraftCard`).",
1281
- "related": ["EmailMessageCard", "MessageComposer", "ChannelTabs"],
2762
+ "related": [
2763
+ "EmailMessageCard",
2764
+ "MessageComposer",
2765
+ "ChannelTabs"
2766
+ ],
1282
2767
  "since": "0.12.0"
1283
2768
  },
1284
2769
  "EmailMessageCard": {
1285
2770
  "category": "data display",
1286
2771
  "useWhen": "An email in a thread as an envelope card (header, readable body, footer) with auto-clamp and show-full toggle; you sanitise the HTML.",
1287
2772
  "dontUseWhen": "A chat message (`MessageBubble`).",
1288
- "related": ["MessageBubble", "AttachmentChip"],
2773
+ "related": [
2774
+ "MessageBubble",
2775
+ "AttachmentChip"
2776
+ ],
1289
2777
  "since": "1.5.0"
1290
2778
  },
1291
2779
  "DocumentChecklist": {
1292
2780
  "category": "data display",
1293
2781
  "useWhen": "The client's view of requested documents by lifecycle: awaiting, in review, received, complete.",
1294
2782
  "dontUseWhen": "The firm's missing-documents view (`MissingDocumentsPanel`).",
1295
- "related": ["MissingDocumentsPanel", "DocumentRequestUpload"],
2783
+ "related": [
2784
+ "MissingDocumentsPanel",
2785
+ "DocumentRequestUpload"
2786
+ ],
1296
2787
  "since": "1.21.0"
1297
2788
  },
1298
2789
  "DocumentDetailPanel": {
1299
2790
  "category": "data display",
1300
- "parts": ["DocumentDetailHeader", "DocumentDetailTitle", "DocumentDetailRequester", "DocumentDetailMetaRow", "DocumentDetailBody", "DocumentDetailActions", "DocumentList", "DocumentListSection", "DocumentRow"],
2791
+ "parts": [
2792
+ "DocumentDetailHeader",
2793
+ "DocumentDetailTitle",
2794
+ "DocumentDetailRequester",
2795
+ "DocumentDetailMetaRow",
2796
+ "DocumentDetailBody",
2797
+ "DocumentDetailActions",
2798
+ "DocumentList",
2799
+ "DocumentListSection",
2800
+ "DocumentRow"
2801
+ ],
1301
2802
  "useWhen": "The document detail side panel and the document list it opens from: header, title, requester, meta, body, actions; `DocumentList` sections of `DocumentRow`s.",
1302
2803
  "dontUseWhen": "A file outside the documents workspace (`AttachmentChip`).",
1303
- "related": ["DocumentsWorkspaceLayout", "DocumentFileRow", "DocumentSourceTag"],
2804
+ "related": [
2805
+ "DocumentsWorkspaceLayout",
2806
+ "DocumentFileRow",
2807
+ "DocumentSourceTag"
2808
+ ],
1304
2809
  "since": "1.8.0"
1305
2810
  },
1306
2811
  "DocumentFileRow": {
1307
2812
  "category": "data display",
1308
- "parts": ["DocumentFileCard", "DocumentFileLine"],
2813
+ "parts": [
2814
+ "DocumentFileCard",
2815
+ "DocumentFileLine"
2816
+ ],
1309
2817
  "useWhen": "A file in the documents workspace as a row, a card or a selectable line (named checkbox).",
1310
2818
  "dontUseWhen": "An attachment outside the workspace (`AttachmentChip`).",
1311
- "related": ["DocumentDetailPanel", "FileTypeBadge", "AttachmentChip"],
2819
+ "related": [
2820
+ "DocumentDetailPanel",
2821
+ "FileTypeBadge",
2822
+ "AttachmentChip"
2823
+ ],
1312
2824
  "since": "1.4.0"
1313
2825
  },
1314
2826
  "DocumentRequestDetail": {
1315
2827
  "category": "data display",
1316
- "parts": ["DocumentRequestCard"],
2828
+ "parts": [
2829
+ "DocumentRequestCard"
2830
+ ],
1317
2831
  "useWhen": "A document request as a card in a list and as the expanded detail.",
1318
2832
  "dontUseWhen": "The request form field (`DocumentRequestField`) or the client's upload (`DocumentRequestUpload`).",
1319
- "related": ["DocumentRequestField", "DocumentRequestUpload", "MissingDocumentsPanel"],
2833
+ "related": [
2834
+ "DocumentRequestField",
2835
+ "DocumentRequestUpload",
2836
+ "MissingDocumentsPanel"
2837
+ ],
1320
2838
  "since": "1.9.0"
1321
2839
  },
1322
2840
  "TimeLogger": {
1323
2841
  "category": "data display",
1324
- "parts": ["TimeLoggerHeader", "TimeLoggerTimer", "TimeLoggerContextRow", "TimeLoggerField", "TimeLoggerBillable", "TimeLoggerNotes", "TimeLoggerEntryList", "TimeLoggerEntry", "TimeLoggerActions", "TimeLoggerFooter"],
1325
- "helpers": ["formatClock", "formatDuration", "parseDuration", "formatCurrency"],
1326
- "hooks": ["useStopwatch"],
2842
+ "parts": [
2843
+ "TimeLoggerHeader",
2844
+ "TimeLoggerTimer",
2845
+ "TimeLoggerContextRow",
2846
+ "TimeLoggerField",
2847
+ "TimeLoggerBillable",
2848
+ "TimeLoggerNotes",
2849
+ "TimeLoggerEntryList",
2850
+ "TimeLoggerEntry",
2851
+ "TimeLoggerActions",
2852
+ "TimeLoggerFooter"
2853
+ ],
2854
+ "helpers": [
2855
+ "formatClock",
2856
+ "formatDuration",
2857
+ "parseDuration",
2858
+ "formatCurrency"
2859
+ ],
2860
+ "hooks": [
2861
+ "useStopwatch"
2862
+ ],
1327
2863
  "useWhen": "The compact time-entry panel: compose only the rows a surface needs (timer, context, billable, notes, entries); `useStopwatch` and the duration formatters drive it.",
1328
2864
  "dontUseWhen": "A single duration field (`Input` + `parseDuration`).",
1329
- "related": ["Popover", "NumberInput"],
2865
+ "related": [
2866
+ "Popover",
2867
+ "NumberInput"
2868
+ ],
1330
2869
  "since": "0.15.0"
1331
2870
  },
1332
2871
  "ProposalPackageCard": {
1333
2872
  "category": "data display",
1334
2873
  "label": "Proposal pricing",
1335
- "parts": ["ProposalServiceRow", "ProposalAddOn", "ProposalBillingTerms", "ProposalPricingSummary"],
2874
+ "parts": [
2875
+ "ProposalServiceRow",
2876
+ "ProposalAddOn",
2877
+ "ProposalBillingTerms",
2878
+ "ProposalPricingSummary"
2879
+ ],
1336
2880
  "useWhen": "The Services & Pricing blocks of a proposal preview: package card, service rows, add-ons, billing terms, summary; inherit the firm accent inside `AgreementViewer`.",
1337
2881
  "dontUseWhen": "Anything outside a proposal (`Card`, `MetadataGrid`).",
1338
- "related": ["AgreementViewer", "ProposalSignatureBlock", "ProposalSignerList"],
2882
+ "related": [
2883
+ "AgreementViewer",
2884
+ "ProposalSignatureBlock",
2885
+ "ProposalSignerList"
2886
+ ],
1339
2887
  "since": "1.12.0"
1340
2888
  },
1341
2889
  "ProposalSignerList": {
1342
2890
  "category": "data display",
1343
2891
  "label": "Proposal content",
1344
- "parts": ["ProposalNote", "ProposalCustomPage"],
2892
+ "parts": [
2893
+ "ProposalNote",
2894
+ "ProposalCustomPage"
2895
+ ],
1345
2896
  "useWhen": "The content blocks of a proposal: signer list, notes, custom pages.",
1346
2897
  "dontUseWhen": "Anything outside a proposal.",
1347
- "related": ["AgreementViewer", "ProposalPackageCard"],
2898
+ "related": [
2899
+ "AgreementViewer",
2900
+ "ProposalPackageCard"
2901
+ ],
1348
2902
  "since": "1.12.0"
1349
2903
  },
1350
-
1351
2904
  "AreaChart": {
1352
2905
  "category": "media",
1353
2906
  "useWhen": "A trend over time as a filled area, in design-system colours.",
1354
2907
  "dontUseWhen": "Parts of a whole (`DonutChart`) or category comparison (`StackedBarChart`, `RankedBars`).",
1355
- "replacesRawHtml": ["ad-hoc recharts with hex colours"],
1356
- "related": ["DonutChart", "StackedBarChart", "RankedBars"],
2908
+ "replacesRawHtml": [
2909
+ "ad-hoc recharts with hex colours"
2910
+ ],
2911
+ "related": [
2912
+ "DonutChart",
2913
+ "StackedBarChart",
2914
+ "RankedBars"
2915
+ ],
1357
2916
  "since": "1.2.0"
1358
2917
  },
1359
2918
  "DonutChart": {
1360
2919
  "category": "media",
1361
2920
  "useWhen": "Parts of a whole with a centre label.",
1362
2921
  "dontUseWhen": "One value's progress (`ProgressRing`).",
1363
- "related": ["ProgressRing", "AreaChart"],
2922
+ "related": [
2923
+ "ProgressRing",
2924
+ "AreaChart"
2925
+ ],
1364
2926
  "since": "1.2.0"
1365
2927
  },
1366
2928
  "StackedBarChart": {
1367
2929
  "category": "media",
1368
2930
  "useWhen": "Composition per category as stacked bars (e.g. work by priority).",
1369
2931
  "dontUseWhen": "A ranked list of values (`RankedBars`).",
1370
- "related": ["RankedBars", "AreaChart", "PriorityIcon"],
2932
+ "related": [
2933
+ "RankedBars",
2934
+ "AreaChart",
2935
+ "PriorityIcon"
2936
+ ],
1371
2937
  "since": "1.6.0"
1372
2938
  },
1373
2939
  "RankedBars": {
1374
2940
  "category": "media",
1375
2941
  "useWhen": "A ranked list of labelled values as horizontal bars.",
1376
2942
  "dontUseWhen": "Stacked composition (`StackedBarChart`).",
1377
- "related": ["StackedBarChart"],
2943
+ "related": [
2944
+ "StackedBarChart"
2945
+ ],
1378
2946
  "since": "1.2.0"
1379
2947
  },
1380
2948
  "PdfPreview": {
1381
2949
  "category": "media",
1382
2950
  "useWhen": "Render a PDF inline with paging and zoom.",
1383
2951
  "dontUseWhen": "A spreadsheet (`SpreadsheetPreview`) or just a file row (`AttachmentChip`).",
1384
- "related": ["SpreadsheetPreview", "AttachmentChip", "AspectRatio"],
2952
+ "related": [
2953
+ "SpreadsheetPreview",
2954
+ "AttachmentChip",
2955
+ "AspectRatio"
2956
+ ],
1385
2957
  "since": "1.7.0"
1386
2958
  },
1387
2959
  "SpreadsheetPreview": {
1388
2960
  "category": "media",
1389
2961
  "useWhen": "Render a spreadsheet's sheets and cells inline.",
1390
2962
  "dontUseWhen": "A PDF (`PdfPreview`) or an editable grid (`Grid`).",
1391
- "related": ["PdfPreview", "Table"],
2963
+ "related": [
2964
+ "PdfPreview",
2965
+ "Table"
2966
+ ],
1392
2967
  "since": "1.7.0"
1393
2968
  },
1394
2969
  "Logo": {
1395
2970
  "category": "media",
1396
2971
  "useWhen": "The Assure suite or product wordmark: official artwork with a glyph + text fallback; `assetPath` resolves the artwork base.",
1397
2972
  "dontUseWhen": "A small product mark alone (brand icon family).",
1398
- "replacesRawHtml": ["<img src=\"/brand/….svg\">"],
1399
- "related": ["Sidebar", "assetPath"],
2973
+ "replacesRawHtml": [
2974
+ "<img src=\"/brand/….svg\">"
2975
+ ],
2976
+ "related": [
2977
+ "Sidebar",
2978
+ "assetPath"
2979
+ ],
1400
2980
  "since": "0.0.0"
1401
2981
  },
1402
-
1403
2982
  "Shell": {
1404
2983
  "category": "shell/screens",
1405
- "parts": ["Main", "Content"],
2984
+ "parts": [
2985
+ "Main",
2986
+ "Content"
2987
+ ],
1406
2988
  "useWhen": "The application frame: `Shell` holds the `Sidebar` and `Main`; `Main` holds `AppHeader` and `Content`.",
1407
2989
  "dontUseWhen": "A public or marketing page (`Section`).",
1408
- "replacesRawHtml": ["<div class=\"flex h-screen\">"],
1409
- "related": ["Sidebar", "AppHeader", "BrandScope"],
2990
+ "replacesRawHtml": [
2991
+ "<div class=\"flex h-screen\">"
2992
+ ],
2993
+ "related": [
2994
+ "Sidebar",
2995
+ "AppHeader",
2996
+ "BrandScope"
2997
+ ],
1410
2998
  "since": "0.3.0"
1411
2999
  },
1412
3000
  "Sidebar": {
1413
3001
  "category": "shell/screens",
1414
- "parts": ["SidebarProvider", "SidebarTrigger", "SidebarBrand", "SidebarBrandText", "SidebarSection", "SidebarLinkGroup", "SidebarLink", "SidebarLinkLabel", "SidebarLinkBadge", "SidebarLinkAction", "SidebarPinButton", "SidebarUser", "SidebarFooter"],
1415
- "helpers": ["sidebarLinkBadgeVariants"],
1416
- "hooks": ["useSidebarState", "useSidebarPeekLock"],
3002
+ "parts": [
3003
+ "SidebarProvider",
3004
+ "SidebarTrigger",
3005
+ "SidebarBrand",
3006
+ "SidebarBrandText",
3007
+ "SidebarSection",
3008
+ "SidebarLinkGroup",
3009
+ "SidebarLink",
3010
+ "SidebarLinkLabel",
3011
+ "SidebarLinkBadge",
3012
+ "SidebarLinkAction",
3013
+ "SidebarPinButton",
3014
+ "SidebarUser",
3015
+ "SidebarFooter"
3016
+ ],
3017
+ "helpers": [
3018
+ "sidebarLinkBadgeVariants"
3019
+ ],
3020
+ "hooks": [
3021
+ "useSidebarState",
3022
+ "useSidebarPeekLock"
3023
+ ],
1417
3024
  "useWhen": "The app navigation rail: expanded/collapsed/peek states from `SidebarProvider`, brand, sections, link groups with badges and actions, user and footer.",
1418
3025
  "dontUseWhen": "Mobile (`BottomNav`) or a rail of records (`ClientRailItem`).",
1419
- "replacesRawHtml": ["<aside> + <nav> hand-rolled"],
1420
- "related": ["Shell", "SidebarBrandSwitcher", "BottomNav"],
3026
+ "replacesRawHtml": [
3027
+ "<aside> + <nav> hand-rolled"
3028
+ ],
3029
+ "related": [
3030
+ "Shell",
3031
+ "SidebarBrandSwitcher",
3032
+ "BottomNav",
3033
+ "SidebarDrawer"
3034
+ ],
1421
3035
  "since": "0.3.0"
1422
3036
  },
1423
3037
  "SidebarBrandSwitcher": {
1424
3038
  "category": "shell/screens",
1425
- "parts": ["SidebarBrandSwitcherTile"],
3039
+ "parts": [
3040
+ "SidebarBrandSwitcherTile"
3041
+ ],
1426
3042
  "useWhen": "Switch between Assure products from the sidebar brand slot: tiles for available, current and coming-soon products.",
1427
3043
  "dontUseWhen": "A single-product app (`SidebarBrand`).",
1428
- "related": ["Sidebar", "BrandScope", "Logo"],
3044
+ "related": [
3045
+ "Sidebar",
3046
+ "BrandScope",
3047
+ "Logo"
3048
+ ],
1429
3049
  "since": "0.11.2"
1430
3050
  },
1431
3051
  "AppHeader": {
1432
3052
  "category": "shell/screens",
1433
- "parts": ["AppHeaderBreadcrumb", "AppHeaderTitle", "AppHeaderSearch", "AppHeaderActions"],
3053
+ "parts": [
3054
+ "AppHeaderBreadcrumb",
3055
+ "AppHeaderTitle",
3056
+ "AppHeaderSearch",
3057
+ "AppHeaderActions"
3058
+ ],
1434
3059
  "useWhen": "The sticky 56px top bar inside `Main`: breadcrumb, title, search and actions slots in any order.",
1435
3060
  "dontUseWhen": "The page's own title block (`PageHeader`).",
1436
- "related": ["Shell", "PageHeader", "NewMenu", "NotificationPanel"],
3061
+ "related": [
3062
+ "Shell",
3063
+ "PageHeader",
3064
+ "NewMenu",
3065
+ "NotificationPanel"
3066
+ ],
1437
3067
  "since": "0.3.0"
1438
3068
  },
1439
3069
  "DesignSystemProvider": {
1440
3070
  "category": "shell/screens",
1441
- "hooks": ["useDsMessages"],
3071
+ "hooks": [
3072
+ "useDsMessages"
3073
+ ],
1442
3074
  "useWhen": "Mount once in the root layout to configure the whole design system: `messages` overrides for the generic strings components render, `locale` (default `en-US`, pass the one your app knows server-side), `dir`, the portal container, the router `linkComponent` and `imageComponent` for `LinkButton` and `Logo`, the tooltip provider, and opt-in `toasts` / `confirm` regions. `useDsMessages(namespace, override?)` reads the resolved strings inside your own components.",
1443
3075
  "dontUseWhen": "You are on Next.js — `NextDesignSystemProvider` from `/next` fills in the adapters. Theming a subtree is `ThemeScope` / `BrandScope`, not a nested provider.",
1444
- "replacesRawHtml": ["hand-rolled i18n or router context for design-system strings and links"],
1445
- "related": ["ThemeScope", "BrandScope", "Tooltip", "LinkButton", "Logo"],
3076
+ "replacesRawHtml": [
3077
+ "hand-rolled i18n or router context for design-system strings and links"
3078
+ ],
3079
+ "related": [
3080
+ "ThemeScope",
3081
+ "BrandScope",
3082
+ "Tooltip",
3083
+ "LinkButton",
3084
+ "Logo"
3085
+ ],
1446
3086
  "since": "unreleased",
1447
3087
  "story": "src/foundation/provider/design-system-provider.stories.tsx"
1448
3088
  },
@@ -1450,93 +3090,237 @@
1450
3090
  "category": "shell/screens",
1451
3091
  "useWhen": "A subtree that renders with its own colour `scheme`, `brand`, `density`, `dir` or runtime brand theme: stamps the `data-ds-*` attributes on its element and registers them so portalled overlays opened from inside (Dialog, Popover, menus) come up in the same theme; nested scopes merge.",
1452
3092
  "dontUseWhen": "The whole app shares one theme (set the attributes on the document root) or only the product brand changes (`BrandScope`).",
1453
- "replacesRawHtml": ["<div data-ds-scheme=\"dark\"> whose dialogs come up in the root theme"],
1454
- "related": ["BrandScope", "DesignSystemProvider", "Dialog", "Popover"],
3093
+ "replacesRawHtml": [
3094
+ "<div data-ds-scheme=\"dark\"> whose dialogs come up in the root theme"
3095
+ ],
3096
+ "related": [
3097
+ "BrandScope",
3098
+ "DesignSystemProvider",
3099
+ "Dialog",
3100
+ "Popover"
3101
+ ],
1455
3102
  "since": "unreleased",
1456
3103
  "story": "src/primitives/behavior/portal.stories.tsx",
1457
- "docs": ["docs/integration/css.md"]
3104
+ "docs": [
3105
+ "docs/integration/css.md"
3106
+ ]
1458
3107
  },
1459
3108
  "BrandScope": {
1460
3109
  "category": "shell/screens",
1461
- "parts": ["BrandScopeProvider"],
1462
- "helpers": ["BRAND_PRODUCTS", "brandLabel", "brandScope"],
1463
- "hooks": ["useBrandScope"],
3110
+ "parts": [
3111
+ "BrandScopeProvider"
3112
+ ],
3113
+ "helpers": [
3114
+ "BRAND_PRODUCTS",
3115
+ "brandLabel",
3116
+ "brandScope"
3117
+ ],
3118
+ "hooks": [
3119
+ "useBrandScope"
3120
+ ],
1464
3121
  "useWhen": "Theme a subtree as a product: stamps `data-brand` and provides it so portalled surfaces re-stamp themselves; `brandScope(product)` for the attribute alone.",
1465
3122
  "dontUseWhen": "Colouring by service line (`serviceToneStyle`) or by status (`intent`).",
1466
- "related": ["Shell", "SidebarBrandSwitcher"],
3123
+ "related": [
3124
+ "Shell",
3125
+ "SidebarBrandSwitcher"
3126
+ ],
1467
3127
  "since": "1.18.0",
1468
- "docs": ["docs/integration/css.md"]
3128
+ "docs": [
3129
+ "docs/integration/css.md"
3130
+ ]
1469
3131
  },
1470
3132
  "AgreementViewer": {
1471
3133
  "category": "shell/screens",
1472
- "parts": ["AgreementPaneHeading"],
3134
+ "parts": [
3135
+ "AgreementPaneHeading"
3136
+ ],
1473
3137
  "useWhen": "The client-facing agreement / proposal viewer: cover, steps, firm accent scope for the proposal blocks.",
1474
3138
  "dontUseWhen": "Previewing a PDF (`PdfPreview`).",
1475
- "related": ["ProposalPackageCard", "ProposalSignatureBlock", "ProposalSignerList"],
3139
+ "related": [
3140
+ "ProposalPackageCard",
3141
+ "ProposalSignatureBlock",
3142
+ "ProposalSignerList"
3143
+ ],
1476
3144
  "since": "1.12.0"
1477
3145
  },
1478
-
1479
3146
  "cn": {
1480
3147
  "category": "hooks/utilities",
1481
3148
  "useWhen": "Merge class names (clsx + tailwind-merge) when composing `className`; consumer classes still win by cascade, `cn` only dedupes.",
1482
3149
  "dontUseWhen": "Overriding a component part — pass `className`/`classNames` instead of rebuilding its classes.",
1483
- "related": ["Button"],
3150
+ "related": [
3151
+ "Button"
3152
+ ],
1484
3153
  "since": "0.0.0",
1485
- "docs": ["docs/integration/css.md"]
3154
+ "docs": [
3155
+ "docs/integration/css.md"
3156
+ ]
3157
+ },
3158
+ "useDataTable": {
3159
+ "category": "hooks/utilities",
3160
+ "label": "Data-table controller",
3161
+ "helpers": [
3162
+ "compareSortValues",
3163
+ "nextSortDirection"
3164
+ ],
3165
+ "useWhen": "Building a data table: owns sorting, pagination, search, selection, column visibility and filters (each controllable or uncontrolled), derives the rows to render, and in `manual` mode only emits state for a server-driven table.",
3166
+ "dontUseWhen": "A static table with no state (the `Table` parts alone), or the data-driven convenience (`DataTableView`) once it is rebuilt on the hook.",
3167
+ "related": [
3168
+ "Table",
3169
+ "DataTable",
3170
+ "DataTableView",
3171
+ "Pagination"
3172
+ ],
3173
+ "since": "unreleased",
3174
+ "docs": [
3175
+ "docs/data-tables.md"
3176
+ ]
1486
3177
  },
1487
3178
  "useFieldControl": {
1488
3179
  "category": "hooks/utilities",
1489
3180
  "useWhen": "Building your own form control that should bind to `Field` like the design-system ones: returns ids, `aria-*`, invalid/disabled/required wiring; explicit props win.",
1490
3181
  "dontUseWhen": "Wrapping an existing element once (`FieldControl`).",
1491
- "related": ["Field", "FieldControl"],
3182
+ "related": [
3183
+ "Field",
3184
+ "FieldControl"
3185
+ ],
1492
3186
  "since": "1.32.0",
1493
- "docs": ["docs/adr/006-field-native-form-participation.md"]
3187
+ "docs": [
3188
+ "docs/adr/006-field-native-form-participation.md"
3189
+ ]
1494
3190
  },
1495
3191
  "isoToDisplay": {
1496
3192
  "category": "hooks/utilities",
1497
3193
  "label": "Date utilities",
1498
- "helpers": ["displayToIso", "applyMask", "applyYearMask", "isoToDate", "dateToIso", "isoToYear", "yearToIso", "DATE_DISPLAY_PLACEHOLDER", "YEAR_DISPLAY_PLACEHOLDER"],
3194
+ "helpers": [
3195
+ "displayToIso",
3196
+ "applyMask",
3197
+ "applyYearMask",
3198
+ "isoToDate",
3199
+ "dateToIso",
3200
+ "isoToYear",
3201
+ "yearToIso",
3202
+ "DATE_DISPLAY_PLACEHOLDER",
3203
+ "YEAR_DISPLAY_PLACEHOLDER"
3204
+ ],
1499
3205
  "useWhen": "Convert between ISO `YYYY-MM-DD`, the `MM/DD/YYYY` display format and JS `Date` the way `DatePicker` does, and apply its typing masks.",
1500
3206
  "dontUseWhen": "Locale-aware formatting for display text (`Intl.DateTimeFormat`).",
1501
- "related": ["DatePicker", "DateRangePicker"],
3207
+ "related": [
3208
+ "DatePicker",
3209
+ "DateRangePicker"
3210
+ ],
1502
3211
  "since": "0.11.0"
1503
3212
  },
1504
3213
  "COUNTRY_CODES": {
1505
3214
  "category": "hooks/utilities",
1506
3215
  "label": "Country codes",
1507
- "helpers": ["getFlagEmoji", "parsePhoneForEditing"],
3216
+ "helpers": [
3217
+ "getFlagEmoji",
3218
+ "parsePhoneForEditing"
3219
+ ],
1508
3220
  "useWhen": "The ISO country / dial-code table behind `PhoneCountryInput`, a flag emoji fallback, and splitting a stored phone string for editing.",
1509
3221
  "dontUseWhen": "Full phone validation (bring libphonenumber).",
1510
- "related": ["PhoneField", "PhoneCountryInput"],
3222
+ "related": [
3223
+ "PhoneField",
3224
+ "PhoneCountryInput"
3225
+ ],
1511
3226
  "since": "1.1.0"
1512
3227
  },
1513
3228
  "serviceToneStyle": {
1514
3229
  "category": "hooks/utilities",
1515
3230
  "label": "Service tones",
1516
- "helpers": ["SERVICE_TONES", "serviceToneLabel"],
3231
+ "helpers": [
3232
+ "SERVICE_TONES",
3233
+ "serviceToneLabel"
3234
+ ],
1517
3235
  "useWhen": "Tone a portal surface per service line by setting `--tone` / `--tone-bg` once on its root; labels for chips and headings.",
1518
3236
  "dontUseWhen": "Status colour (`intent`) or product theming (`BrandScope`).",
1519
- "related": ["CategoryDivider", "EngagementCard", "BrandScope"],
3237
+ "related": [
3238
+ "CategoryDivider",
3239
+ "EngagementCard",
3240
+ "BrandScope"
3241
+ ],
1520
3242
  "since": "1.2.0"
1521
3243
  },
1522
3244
  "assetPath": {
1523
3245
  "category": "hooks/utilities",
1524
3246
  "label": "Asset base path",
1525
- "helpers": ["getAssetBasePath", "setAssetBasePath"],
3247
+ "helpers": [
3248
+ "getAssetBasePath",
3249
+ "setAssetBasePath"
3250
+ ],
1526
3251
  "useWhen": "The app is served from a subpath: call `setAssetBasePath` once so the design system's own artwork (`Logo`) resolves.",
1527
3252
  "dontUseWhen": "Your own assets (use your framework's base path).",
1528
- "related": ["Logo"],
3253
+ "related": [
3254
+ "Logo"
3255
+ ],
1529
3256
  "since": "1.33.0"
1530
3257
  },
1531
3258
  "systemTokens": {
1532
3259
  "category": "hooks/utilities",
1533
3260
  "label": "Tokens (root re-export)",
1534
- "helpers": ["reference", "colors", "spacing", "radii", "shadows", "surfaces", "typography"],
3261
+ "helpers": [
3262
+ "reference",
3263
+ "colors",
3264
+ "spacing",
3265
+ "radii",
3266
+ "shadows",
3267
+ "surfaces",
3268
+ "typography"
3269
+ ],
1535
3270
  "useWhen": "Token objects from JavaScript when a utility class cannot reach (inline styles, charts, motion); prefer the `/tokens` entry for a smaller import.",
1536
3271
  "dontUseWhen": "Styling components — use the `--ds-*` custom properties and utilities; never read `reference`/`colors` in component code.",
1537
- "related": ["BrandScope"],
3272
+ "related": [
3273
+ "BrandScope"
3274
+ ],
1538
3275
  "since": "0.0.0",
1539
- "docs": ["docs/design-system/shape-roles.md"]
3276
+ "docs": [
3277
+ "docs/design-system/shape-roles.md"
3278
+ ]
3279
+ },
3280
+ "DataTablePattern": {
3281
+ "category": "data display",
3282
+ "label": "DataTable (compound)",
3283
+ "useWhen": "A records table driven by `useDataTable`: the toolbar with a labelled search, filters and a column-visibility menu, the table on the `Table*` parts with sort and selection wired to the controller, bulk actions, the merged pager and the built-in loading / empty / error bodies. `classNames.search` and `--ds-data-table-search-width` size the search field.",
3284
+ "dontUseWhen": "A table with no state (the `Table` parts alone), the hand-written `DataTable*` parts a product already composes, or the config-driven convenience (`DataTableView`).",
3285
+ "replacesRawHtml": [
3286
+ "hand-rolled toolbar + <table> + pager around per-table useState"
3287
+ ],
3288
+ "related": [
3289
+ "useDataTable",
3290
+ "Table",
3291
+ "DataTable",
3292
+ "DataTableView",
3293
+ "Pagination",
3294
+ "BulkActionBar",
3295
+ "TableLoading"
3296
+ ],
3297
+ "since": "unreleased",
3298
+ "docs": [
3299
+ "docs/data-tables.md"
3300
+ ]
3301
+ },
3302
+ "EmptyValue": {
3303
+ "category": "data display",
3304
+ "status": "experimental",
3305
+ "useWhen": "A table or detail cell has no value: renders the em dash placeholder consistently.",
3306
+ "dontUseWhen": "The value is genuinely empty text a user typed — render it as-is.",
3307
+ "replacesRawHtml": [
3308
+ "<span>—</span>"
3309
+ ],
3310
+ "since": "unreleased",
3311
+ "story": "src/composites/data-table-view.stories.tsx"
3312
+ },
3313
+ "SidebarDrawer": {
3314
+ "category": "shell/screens",
3315
+ "useWhen": "The sidebar nav off-canvas on small viewports: the same tree in a left-hand Sheet, with the focus trap, scroll lock and dismissal the overlay parts already provide.",
3316
+ "dontUseWhen": "Desktop widths (`Sidebar`) or a bottom tab bar (`BottomNav`).",
3317
+ "related": [
3318
+ "Sidebar",
3319
+ "Sheet",
3320
+ "Shell"
3321
+ ],
3322
+ "status": "experimental",
3323
+ "since": "1.38.0"
1540
3324
  }
1541
3325
  },
1542
3326
  "entries": {
@@ -1572,33 +3356,185 @@
1572
3356
  }
1573
3357
  },
1574
3358
  "deprecatedAliases": [
1575
- { "deprecated": "`Button variant=\"primary\"`", "replacement": "`variant=\"solid\" intent=\"brand\"` (the default)", "codemod": "CM-04", "contract": "C-BTN-VARIANT" },
1576
- { "deprecated": "`Button variant=\"secondary\"`", "replacement": "`variant=\"soft\" intent=\"neutral\"`", "codemod": "CM-04", "contract": "C-BTN-VARIANT" },
1577
- { "deprecated": "`Button variant=\"destructive\"`", "replacement": "`variant=\"solid\" intent=\"danger\"`", "codemod": "CM-04", "contract": "C-BTN-VARIANT" },
1578
- { "deprecated": "`Button variant=\"success\"`", "replacement": "`variant=\"solid\" intent=\"success\"`", "codemod": "CM-04", "contract": "C-BTN-VARIANT" },
1579
- { "deprecated": "`Button variant=\"accent\"` / `\"dashed\"`", "replacement": "Reported by CM-04 for review: `accent` is a brand look, `dashed` an outline look; both keep rendering until 3.0", "codemod": "CM-04 (report)", "contract": "C-BTN-VARIANT" },
1580
- { "deprecated": "`Button intent=\"destructive\"`", "replacement": "`intent=\"danger\"`", "codemod": "—", "contract": "C-BTN-VARIANT" },
1581
- { "deprecated": "`Button size=\"compact\"` / `\"default\"` / `\"comfortable\"`, `\"icon-xs\"` / `\"icon-sm\"` / `\"icon\"`", "replacement": "`size=\"sm\"` / `\"md\"` / `\"lg\"`; icon sizes → `IconButton size`", "codemod": "CM-02 (explicit `size=\"md\"`)", "contract": "C-BTN-SIZE" },
1582
- { "deprecated": "`Button` / `LinkButton` / `SubmitButton` `iconLeft` / `iconRight`", "replacement": "`iconStart` / `iconEnd`", "codemod": "CM-05", "contract": "C-BTN-ICONPROPS" },
1583
- { "deprecated": "`Button` without `type` inside a form", "replacement": "`type=\"submit\"` where evident, or `SubmitButton`", "codemod": "CM-12", "contract": "—" },
1584
- { "deprecated": "`Input` / `Textarea` / `SearchInput` `inputSize`", "replacement": "`size`", "codemod": "CM-07", "contract": "C-INPUT-SIZE" },
1585
- { "deprecated": "`InputSizeAlias` `compact` / `default` / `comfortable`", "replacement": "`sm` / `md` / `lg`", "codemod": "—", "contract": "C-INPUT-SIZE" },
1586
- { "deprecated": "`Select` `triggerClassName` / `contentClassName`", "replacement": "`classNames={{ trigger, content }}`", "codemod": "—", "contract": "C-SELECT-CLASSNAMES" },
1587
- { "deprecated": "`Select searchable`", "replacement": "`Combobox`", "codemod": "—", "contract": "—" },
1588
- { "deprecated": "`Select` sentinel option values standing in for \"no value\"", "replacement": "A real empty value (`value=\"\"`, `clearable`)", "codemod": "CM-20 (finder)", "contract": "C-SELECT-EMPTY" },
1589
- { "deprecated": "`SearchSelect` (`{ id, label }` options)", "replacement": "`Combobox` with `Option` (`{ value, label }`)", "codemod": "CM-08", "contract": "C-SEARCHSELECT" },
1590
- { "deprecated": "`Checkbox indeterminate`", "replacement": "`checked=\"indeterminate\"`", "codemod": "—", "contract": "C-CHECKBOX-INDET" },
1591
- { "deprecated": "`DatePicker onChange={e => f(e.target.value)}` (fake event)", "replacement": "`onValueChange={value => f(value)}`", "codemod": "CM-10", "contract": "C-DATE-FAKEEVENT" },
1592
- { "deprecated": "`StatusDot` / `IconTile` / `Spinner` / `SegmentedProgress` / `SuiteProgress` `tone`", "replacement": "`intent` (`pro` → `brand`, `muted` → `neutral`, `accent` → `info`, `destructive` → `danger`)", "codemod": "CM-06", "contract": "C-TONE" },
1593
- { "deprecated": "`ProgressBar` / `ProgressRing` `variant` (`default`, `destructive`, …)", "replacement": "`intent` (`brand`, `danger`, …); value-driven auto colour written down explicitly", "codemod": "CM-19", "contract": "C-PROGRESS" },
1594
- { "deprecated": "`Badge variant=\"default\"` / `\"secondary\"` / `\"destructive\"` / `\"success\"` / `\"warning\"` / `\"info\"` / `\"outline\"`", "replacement": "`variant` (`solid`, `soft`, `outline`) + `intent`", "codemod": "—", "contract": "C-BADGE" },
1595
- { "deprecated": "`FormError`", "replacement": "`FieldError` inside a `Field`", "codemod": "—", "contract": "C-FORM-MSG" },
1596
- { "deprecated": "`FormSuccess`", "replacement": "`FieldDescription` inside a `Field`, or a toast for a saved form", "codemod": "—", "contract": "C-FORM-MSG" },
1597
- { "deprecated": "`FormSection`", "replacement": "`Fieldset` + `FieldsetLegend`", "codemod": "—", "contract": "—" },
1598
- { "deprecated": "`PhoneInput`, `PhoneCountryInput` (+ `CountrySelect`, `CountryFlag`)", "replacement": "`PhoneField` (E.164 value, `Combobox` country picker)", "codemod": "—", "contract": "—" },
1599
- { "deprecated": "`Sidebar gutterPx`", "replacement": "The sidebar's own geometry tokens", "codemod": "—", "contract": "—" },
1600
- { "deprecated": "`CloseIcon`, `ArrowRightSmallIcon`", "replacement": "`XIcon`, `ArrowRightIcon` (same drawing)", "codemod": "—", "contract": "—" },
1601
- { "deprecated": "Hidden `<input name>` mirrors added because a control posted nothing", "replacement": "Remove them: every control participates in the form through `FormBridge`", "codemod": "CM-14 (finder)", "contract": "C-HIDDEN-MIRRORS" },
1602
- { "deprecated": "Selectors into a component's internal DOM", "replacement": "`className` / `classNames` and `data-slot` selectors (ADR-008)", "codemod": "CM-15 (finder)", "contract": "C-DOM-*" }
3359
+ {
3360
+ "deprecated": "`Button variant=\"primary\"`",
3361
+ "replacement": "`variant=\"solid\" intent=\"brand\"` (the default)",
3362
+ "codemod": "CM-04",
3363
+ "contract": "C-BTN-VARIANT"
3364
+ },
3365
+ {
3366
+ "deprecated": "`Button variant=\"secondary\"`",
3367
+ "replacement": "`variant=\"soft\" intent=\"neutral\"`",
3368
+ "codemod": "CM-04",
3369
+ "contract": "C-BTN-VARIANT"
3370
+ },
3371
+ {
3372
+ "deprecated": "`Button variant=\"destructive\"`",
3373
+ "replacement": "`variant=\"solid\" intent=\"danger\"`",
3374
+ "codemod": "CM-04",
3375
+ "contract": "C-BTN-VARIANT"
3376
+ },
3377
+ {
3378
+ "deprecated": "`Button variant=\"success\"`",
3379
+ "replacement": "`variant=\"solid\" intent=\"success\"`",
3380
+ "codemod": "CM-04",
3381
+ "contract": "C-BTN-VARIANT"
3382
+ },
3383
+ {
3384
+ "deprecated": "`Button variant=\"accent\"` / `\"dashed\"`",
3385
+ "replacement": "Reported by CM-04 for review: `accent` is a brand look, `dashed` an outline look; both keep rendering until 3.0",
3386
+ "codemod": "CM-04 (report)",
3387
+ "contract": "C-BTN-VARIANT"
3388
+ },
3389
+ {
3390
+ "deprecated": "`Button intent=\"destructive\"`",
3391
+ "replacement": "`intent=\"danger\"`",
3392
+ "codemod": "—",
3393
+ "contract": "C-BTN-VARIANT"
3394
+ },
3395
+ {
3396
+ "deprecated": "`Button size=\"compact\"` / `\"default\"` / `\"comfortable\"`, `\"icon-xs\"` / `\"icon-sm\"` / `\"icon\"`",
3397
+ "replacement": "`size=\"sm\"` / `\"md\"` / `\"lg\"`; icon sizes → `IconButton size`",
3398
+ "codemod": "CM-02 (explicit `size=\"md\"`)",
3399
+ "contract": "C-BTN-SIZE"
3400
+ },
3401
+ {
3402
+ "deprecated": "`Button` / `LinkButton` / `SubmitButton` `iconLeft` / `iconRight`",
3403
+ "replacement": "`iconStart` / `iconEnd`",
3404
+ "codemod": "CM-05",
3405
+ "contract": "C-BTN-ICONPROPS"
3406
+ },
3407
+ {
3408
+ "deprecated": "`Button` without `type` inside a form",
3409
+ "replacement": "`type=\"submit\"` where evident, or `SubmitButton`",
3410
+ "codemod": "CM-12",
3411
+ "contract": "—"
3412
+ },
3413
+ {
3414
+ "deprecated": "`Input` / `Textarea` / `SearchInput` `inputSize`",
3415
+ "replacement": "`size`",
3416
+ "codemod": "CM-07",
3417
+ "contract": "C-INPUT-SIZE"
3418
+ },
3419
+ {
3420
+ "deprecated": "`InputSizeAlias` `compact` / `default` / `comfortable`",
3421
+ "replacement": "`sm` / `md` / `lg`",
3422
+ "codemod": "—",
3423
+ "contract": "C-INPUT-SIZE"
3424
+ },
3425
+ {
3426
+ "deprecated": "`Select` `triggerClassName` / `contentClassName`",
3427
+ "replacement": "`classNames={{ trigger, content }}`",
3428
+ "codemod": "—",
3429
+ "contract": "C-SELECT-CLASSNAMES"
3430
+ },
3431
+ {
3432
+ "deprecated": "`Dash` (DataTableView cell)",
3433
+ "replacement": "`EmptyValue`",
3434
+ "codemod": "—",
3435
+ "contract": "—"
3436
+ },
3437
+ {
3438
+ "deprecated": "`StagePill` / `Assignee` / `MoneyCell` / `TableTone` (DataTableView product cells)",
3439
+ "replacement": "Product-owned renderers in `column.render` (`StatusBadge`, `Avatar`, `Intl.NumberFormat`, `EmptyValue`); hand-over to TAX in W8-13",
3440
+ "codemod": "—",
3441
+ "contract": "—"
3442
+ },
3443
+ {
3444
+ "deprecated": "`Select searchable`",
3445
+ "replacement": "`Combobox`",
3446
+ "codemod": "—",
3447
+ "contract": "—"
3448
+ },
3449
+ {
3450
+ "deprecated": "`Select` sentinel option values standing in for \"no value\"",
3451
+ "replacement": "A real empty value (`value=\"\"`, `clearable`)",
3452
+ "codemod": "CM-20 (finder)",
3453
+ "contract": "C-SELECT-EMPTY"
3454
+ },
3455
+ {
3456
+ "deprecated": "`SearchSelect` (`{ id, label }` options)",
3457
+ "replacement": "`Combobox` with `Option` (`{ value, label }`)",
3458
+ "codemod": "CM-08",
3459
+ "contract": "C-SEARCHSELECT"
3460
+ },
3461
+ {
3462
+ "deprecated": "`Checkbox indeterminate`",
3463
+ "replacement": "`checked=\"indeterminate\"`",
3464
+ "codemod": "—",
3465
+ "contract": "C-CHECKBOX-INDET"
3466
+ },
3467
+ {
3468
+ "deprecated": "`DatePicker onChange={e => f(e.target.value)}` (fake event)",
3469
+ "replacement": "`onValueChange={value => f(value)}`",
3470
+ "codemod": "CM-10",
3471
+ "contract": "C-DATE-FAKEEVENT"
3472
+ },
3473
+ {
3474
+ "deprecated": "`StatusDot` / `IconTile` / `Spinner` / `SegmentedProgress` / `SuiteProgress` `tone`",
3475
+ "replacement": "`intent` (`pro` → `brand`, `muted` → `neutral`, `accent` → `info`, `destructive` → `danger`)",
3476
+ "codemod": "CM-06",
3477
+ "contract": "C-TONE"
3478
+ },
3479
+ {
3480
+ "deprecated": "`ProgressBar` / `ProgressRing` `variant` (`default`, `destructive`, …)",
3481
+ "replacement": "`intent` (`brand`, `danger`, …); value-driven auto colour written down explicitly",
3482
+ "codemod": "CM-19",
3483
+ "contract": "C-PROGRESS"
3484
+ },
3485
+ {
3486
+ "deprecated": "`Badge variant=\"default\"` / `\"secondary\"` / `\"destructive\"` / `\"success\"` / `\"warning\"` / `\"info\"` / `\"outline\"`",
3487
+ "replacement": "`variant` (`solid`, `soft`, `outline`) + `intent`",
3488
+ "codemod": "—",
3489
+ "contract": "C-BADGE"
3490
+ },
3491
+ {
3492
+ "deprecated": "`FormError`",
3493
+ "replacement": "`FieldError` inside a `Field`",
3494
+ "codemod": "—",
3495
+ "contract": "C-FORM-MSG"
3496
+ },
3497
+ {
3498
+ "deprecated": "`FormSuccess`",
3499
+ "replacement": "`FieldDescription` inside a `Field`, or a toast for a saved form",
3500
+ "codemod": "—",
3501
+ "contract": "C-FORM-MSG"
3502
+ },
3503
+ {
3504
+ "deprecated": "`FormSection`",
3505
+ "replacement": "`Fieldset` + `FieldsetLegend`",
3506
+ "codemod": "—",
3507
+ "contract": "—"
3508
+ },
3509
+ {
3510
+ "deprecated": "`PhoneInput`, `PhoneCountryInput` (+ `CountrySelect`, `CountryFlag`)",
3511
+ "replacement": "`PhoneField` (E.164 value, `Combobox` country picker)",
3512
+ "codemod": "—",
3513
+ "contract": "—"
3514
+ },
3515
+ {
3516
+ "deprecated": "`Sidebar gutterPx`",
3517
+ "replacement": "The sidebar's own geometry tokens",
3518
+ "codemod": "—",
3519
+ "contract": "—"
3520
+ },
3521
+ {
3522
+ "deprecated": "`CloseIcon`, `ArrowRightSmallIcon`",
3523
+ "replacement": "`XIcon`, `ArrowRightIcon` (same drawing)",
3524
+ "codemod": "—",
3525
+ "contract": "—"
3526
+ },
3527
+ {
3528
+ "deprecated": "Hidden `<input name>` mirrors added because a control posted nothing",
3529
+ "replacement": "Remove them: every control participates in the form through `FormBridge`",
3530
+ "codemod": "CM-14 (finder)",
3531
+ "contract": "C-HIDDEN-MIRRORS"
3532
+ },
3533
+ {
3534
+ "deprecated": "Selectors into a component's internal DOM",
3535
+ "replacement": "`className` / `classNames` and `data-slot` selectors (ADR-008)",
3536
+ "codemod": "CM-15 (finder)",
3537
+ "contract": "C-DOM-*"
3538
+ }
1603
3539
  ]
1604
3540
  }