@godxjp/ui 20.2.1 → 22.0.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.
Files changed (141) hide show
  1. package/dist/app/app-provider.js +2 -1
  2. package/dist/components/data-display/badge.d.ts +28 -1
  3. package/dist/components/data-display/badge.js +2 -0
  4. package/dist/components/data-display/chat-bubble.d.ts +30 -0
  5. package/dist/components/data-display/chat-bubble.js +229 -0
  6. package/dist/components/data-display/data-table.d.ts +18 -2
  7. package/dist/components/data-display/data-table.js +4 -0
  8. package/dist/components/data-display/descriptions.js +4 -1
  9. package/dist/components/data-display/index.d.ts +5 -3
  10. package/dist/components/data-display/index.js +5 -2
  11. package/dist/components/data-display/popover.d.ts +19 -1
  12. package/dist/components/data-display/popover.js +12 -3
  13. package/dist/components/data-display/progress.d.ts +37 -0
  14. package/dist/components/data-display/progress.js +57 -5
  15. package/dist/components/data-display/scroll-area.js +26 -1
  16. package/dist/components/data-display/tree.d.ts +8 -0
  17. package/dist/components/data-display/tree.js +426 -0
  18. package/dist/components/data-entry/chat-composer.d.ts +50 -0
  19. package/dist/components/data-entry/chat-composer.js +163 -0
  20. package/dist/components/data-entry/chat-suggestion.d.ts +28 -0
  21. package/dist/components/data-entry/chat-suggestion.js +285 -0
  22. package/dist/components/data-entry/date-picker.d.ts +10 -3
  23. package/dist/components/data-entry/date-picker.js +503 -238
  24. package/dist/components/data-entry/form-field.d.ts +1 -1
  25. package/dist/components/data-entry/form-field.js +4 -1
  26. package/dist/components/data-entry/form.js +10 -1
  27. package/dist/components/data-entry/index.d.ts +4 -6
  28. package/dist/components/data-entry/index.js +4 -6
  29. package/dist/components/data-entry/label.d.ts +14 -1
  30. package/dist/components/data-entry/label.js +6 -1
  31. package/dist/components/data-entry/radio.d.ts +27 -6
  32. package/dist/components/data-entry/radio.js +88 -43
  33. package/dist/components/data-entry/search-select.js +8 -1
  34. package/dist/components/data-entry/select.js +2 -0
  35. package/dist/components/data-entry/switch.d.ts +6 -3
  36. package/dist/components/data-entry/switch.js +34 -11
  37. package/dist/components/data-entry/textarea.js +3 -1
  38. package/dist/components/data-entry/tree-utils.d.ts +10 -48
  39. package/dist/components/data-entry/tree-utils.js +1 -154
  40. package/dist/components/layout/mobile-shell.d.ts +1 -1
  41. package/dist/components/layout/mobile-shell.js +2 -0
  42. package/dist/components/navigation/menubar.d.ts +10 -3
  43. package/dist/components/navigation/steps.d.ts +1 -1
  44. package/dist/components/navigation/steps.js +3 -1
  45. package/dist/components/navigation/tabs-scroll.d.ts +27 -0
  46. package/dist/components/navigation/tabs-scroll.js +52 -1
  47. package/dist/components/navigation/tabs.d.ts +2 -2
  48. package/dist/components/navigation/tabs.js +88 -23
  49. package/dist/components/ui/index.d.ts +0 -1
  50. package/dist/components/ui/index.js +0 -1
  51. package/dist/components/ui/segmented.d.ts +15 -1
  52. package/dist/components/ui/segmented.js +13 -6
  53. package/dist/i18n/messages/en.json +48 -2
  54. package/dist/i18n/messages/ja.json +46 -2
  55. package/dist/i18n/messages/vi.json +47 -2
  56. package/dist/lib/datetime/picker-format.d.ts +18 -0
  57. package/dist/lib/datetime/picker-format.js +35 -1
  58. package/dist/lib/field-a11y.d.ts +12 -0
  59. package/dist/lib/field-a11y.js +14 -1
  60. package/dist/lib/tree.d.ts +53 -0
  61. package/dist/lib/tree.js +155 -0
  62. package/dist/props/components/data-display.prop.d.ts +194 -1
  63. package/dist/props/components/data-entry.prop.d.ts +307 -99
  64. package/dist/props/components/index.d.ts +1 -1
  65. package/dist/props/components/layout.prop.d.ts +12 -1
  66. package/dist/props/components/navigation.prop.d.ts +76 -1
  67. package/dist/props/registry.d.ts +156 -19
  68. package/dist/props/registry.js +218 -18
  69. package/dist/props/vocabulary/data.prop.d.ts +12 -0
  70. package/dist/props/vocabulary/index.d.ts +2 -2
  71. package/dist/props/vocabulary/layout.prop.d.ts +11 -0
  72. package/dist/styles/badge-layout.css +4 -0
  73. package/dist/styles/card-layout.css +6 -6
  74. package/dist/styles/control.css +22 -6
  75. package/dist/styles/data-display-layout.css +385 -68
  76. package/dist/styles/data-entry-layout.css +64 -0
  77. package/dist/styles/focus-ring.css +4 -2
  78. package/dist/styles/navigation-layout.css +25 -0
  79. package/dist/styles/shell-layout.css +7 -1
  80. package/dist/styles/table-layout.css +34 -0
  81. package/dist/tokens/base.css +3 -0
  82. package/dist/tokens/components/chat-bubble.css +36 -0
  83. package/dist/tokens/components/chat-composer.css +19 -0
  84. package/dist/tokens/components/data-display.css +9 -6
  85. package/dist/tokens/components/descriptions.css +4 -0
  86. package/dist/tokens/components/navigation.css +6 -0
  87. package/dist/tokens/components/segmented.css +0 -2
  88. package/dist/tokens/components/shell.css +3 -0
  89. package/dist/tokens/components/table.css +3 -0
  90. package/dist/tokens/components/tree.css +27 -0
  91. package/dist/tokens/foundation.css +7 -0
  92. package/docs/COMPONENTS.md +14 -14
  93. package/docs/CONSUMER-RULES.md +24 -1
  94. package/docs/FRAME-COVERAGE-LEDGER.md +1 -1
  95. package/docs/FRAME-COVERAGE-REPORT.md +9 -7
  96. package/docs/TOKENS.md +65 -0
  97. package/docs/data-display/badge.tsx +37 -0
  98. package/docs/data-display/chat-bubble.tsx +397 -0
  99. package/docs/data-display/data-table/index.tsx +18 -0
  100. package/docs/data-display/popover.tsx +41 -1
  101. package/docs/data-display/progress.tsx +28 -0
  102. package/docs/data-display/timeline.tsx +46 -0
  103. package/docs/data-display/tree.tsx +394 -0
  104. package/docs/data-entry/calendar.tsx +2 -2
  105. package/docs/data-entry/chat-composer.tsx +464 -0
  106. package/docs/data-entry/chat-suggestion.tsx +301 -0
  107. package/docs/data-entry/date-picker.tsx +143 -3
  108. package/docs/data-entry/form/examples/invoice-form.tsx +2 -2
  109. package/docs/data-entry/form-field/examples/a11y-contract.tsx +3 -5
  110. package/docs/data-entry/form.tsx +4 -4
  111. package/docs/data-entry/number-input.tsx +31 -0
  112. package/docs/data-entry/segmented.tsx +103 -1
  113. package/docs/layout/mobile-shell.tsx +5 -0
  114. package/docs/navigation/tabs.tsx +149 -0
  115. package/docs/roadmap/ai-chat-components.md +207 -0
  116. package/docs/roadmap/antd-parity.md +155 -0
  117. package/docs/roadmap/badge-tag-chip-count.md +172 -0
  118. package/docs/roadmap/list-masonry.md +159 -0
  119. package/docs/roadmap/parity-audit-data-display-feedback.md +567 -0
  120. package/docs/roadmap/parity-audit-data-entry.md +357 -0
  121. package/docs/roadmap/parity-audit-layout-navigation-general.md +464 -0
  122. package/docs/roadmap/parity-backlog.md +78 -0
  123. package/docs/roadmap/tree-components.md +151 -0
  124. package/docs/showcase/acme-portal.tsx +7 -0
  125. package/docs/showcase/table-tree-rows.tsx +4 -4
  126. package/package.json +13 -23
  127. package/scripts/ui-audit.mjs +17 -4
  128. package/dist/components/data-display/tree-list.d.ts +0 -13
  129. package/dist/components/data-display/tree-list.js +0 -26
  130. package/dist/components/data-entry/date-range-picker.d.ts +0 -11
  131. package/dist/components/data-entry/date-range-picker.js +0 -349
  132. package/dist/components/data-entry/month-picker.d.ts +0 -10
  133. package/dist/components/data-entry/month-picker.js +0 -241
  134. package/dist/components/data-entry/month-range-picker.d.ts +0 -10
  135. package/dist/components/data-entry/month-range-picker.js +0 -301
  136. package/dist/components/ui/date-range-picker.d.ts +0 -1
  137. package/dist/components/ui/date-range-picker.js +0 -2
  138. package/docs/data-display/tree-list.tsx +0 -107
  139. package/docs/data-entry/date-range-picker.tsx +0 -175
  140. package/docs/data-entry/month-picker.tsx +0 -101
  141. package/docs/data-entry/month-range-picker.tsx +0 -115
@@ -244,6 +244,11 @@ export declare const VOCABULARY_REGISTRY: {
244
244
  readonly category: "layout";
245
245
  readonly description: "MobileShell block-size contract — viewport (100dvh root, the real app) | fill (fills a bounded parent, e.g. a device-frame preview)";
246
246
  };
247
+ readonly MobileShellWidthProp: {
248
+ readonly file: "vocabulary/layout.prop.ts";
249
+ readonly category: "layout";
250
+ readonly description: "MobileShell inline-size contract — fill (takes the whole inline size, the default) | phone (caps at the handheld measure and centres, for a handheld screen on a wider viewport)";
251
+ };
247
252
  readonly CenteredShellPresetProp: {
248
253
  readonly file: "vocabulary/layout.prop.ts";
249
254
  readonly category: "layout";
@@ -841,7 +846,7 @@ export declare const COMPONENT_PROP_REGISTRY: {
841
846
  readonly MobileShellProp: {
842
847
  readonly group: "layout";
843
848
  readonly file: "components/layout.prop.ts";
844
- readonly vocabulary: readonly ["ChildrenProp", "ClassNameProp", "ActionProp", "MobileShellHeightProp", {
849
+ readonly vocabulary: readonly ["ChildrenProp", "ClassNameProp", "ActionProp", "MobileShellHeightProp", "MobileShellWidthProp", {
845
850
  readonly field: "header";
846
851
  readonly local: true;
847
852
  readonly reason: "MobileShell app-bar band — the screen title row; it absorbs the top safe-area inset when no statusBar precedes it.";
@@ -1304,21 +1309,6 @@ export declare const COMPONENT_PROP_REGISTRY: {
1304
1309
  readonly file: "components/data-entry.prop.ts";
1305
1310
  readonly vocabulary: readonly ["ValueProp", "OnValueChangeProp", "PlaceholderProp", "DisabledProp", "IdProp"];
1306
1311
  };
1307
- readonly MonthPickerProp: {
1308
- readonly group: "data-entry";
1309
- readonly file: "components/data-entry.prop.ts";
1310
- readonly vocabulary: readonly ["ValueProp", "OnValueChangeProp", "PlaceholderProp", "DisabledProp", "IdProp"];
1311
- };
1312
- readonly MonthRangePickerProp: {
1313
- readonly group: "data-entry";
1314
- readonly file: "components/data-entry.prop.ts";
1315
- readonly vocabulary: readonly ["ValueProp", "OnValueChangeProp", "PlaceholderProp", "DisabledProp", "IdProp"];
1316
- };
1317
- readonly DateRangePickerProp: {
1318
- readonly group: "data-entry";
1319
- readonly file: "components/data-entry.prop.ts";
1320
- readonly vocabulary: readonly ["ValueProp", "OnValueChangeProp", "PlaceholderProp", "DisabledProp", "IdProp"];
1321
- };
1322
1312
  readonly CalendarCellRenderProp: {
1323
1313
  readonly group: "data-entry";
1324
1314
  readonly file: "components/data-entry.prop.ts";
@@ -2012,6 +2002,16 @@ export declare const COMPONENT_PROP_REGISTRY: {
2012
2002
  readonly file: "components/navigation.prop.ts";
2013
2003
  readonly vocabulary: readonly ["HandlerProp"];
2014
2004
  };
2005
+ readonly TabsOnTabClickProp: {
2006
+ readonly group: "navigation";
2007
+ readonly file: "components/navigation.prop.ts";
2008
+ readonly vocabulary: readonly ["HandlerProp"];
2009
+ };
2010
+ readonly TabsOverflowProp: {
2011
+ readonly group: "navigation";
2012
+ readonly file: "components/navigation.prop.ts";
2013
+ readonly vocabulary: readonly [];
2014
+ };
2015
2015
  readonly TabItemProp: {
2016
2016
  readonly group: "navigation";
2017
2017
  readonly file: "components/navigation.prop.ts";
@@ -2212,10 +2212,114 @@ export declare const COMPONENT_PROP_REGISTRY: {
2212
2212
  readonly reason: "Block click handler carrying the event; its presence turns every block into a real button.";
2213
2213
  }];
2214
2214
  };
2215
- readonly TreeListProp: {
2215
+ readonly ChatBubblePlacementProp: {
2216
2216
  readonly group: "data-display";
2217
- readonly file: "components/data-display/tree-list.tsx";
2218
- readonly vocabulary: readonly ["ClassNameProp"];
2217
+ readonly file: "components/data-display.prop.ts";
2218
+ readonly vocabulary: readonly [{
2219
+ readonly field: "placement";
2220
+ readonly local: true;
2221
+ readonly reason: 'Side of the conversation a message sits on ("start" | "end"), spelled on the LOGICAL inline axis so a feed flips under dir="rtl" with no per-locale branch.';
2222
+ }];
2223
+ };
2224
+ readonly ChatBubbleVariantProp: {
2225
+ readonly group: "data-display";
2226
+ readonly file: "components/data-display.prop.ts";
2227
+ readonly vocabulary: readonly [{
2228
+ readonly field: "variant";
2229
+ readonly local: true;
2230
+ readonly reason: "Structural treatment of the message body (filled | borderless | outlined). Status colour stays on `tone`; Ant Design X's `shadow` is absent because this system has no drop shadows.";
2231
+ }];
2232
+ };
2233
+ readonly ChatBubbleToneProp: {
2234
+ readonly group: "data-display";
2235
+ readonly file: "components/data-display.prop.ts";
2236
+ readonly vocabulary: readonly ["ToneProp"];
2237
+ };
2238
+ readonly ChatBubbleTypingProp: {
2239
+ readonly group: "data-display";
2240
+ readonly file: "components/data-display.prop.ts";
2241
+ readonly vocabulary: readonly [{
2242
+ readonly field: "typing";
2243
+ readonly local: true;
2244
+ readonly reason: "Stream-in animation: `true` or `{ step, interval }`. Dropped entirely under prefers-reduced-motion, which renders the full text at once (WCAG 2.3.3).";
2245
+ }];
2246
+ };
2247
+ readonly ChatBubbleProp: {
2248
+ readonly group: "data-display";
2249
+ readonly file: "components/data-display.prop.ts";
2250
+ readonly vocabulary: readonly ["ChildrenProp", "SizeProp", "ToneProp", "PendingProp", "ClassNameProp", "IdProp", {
2251
+ readonly field: "placement";
2252
+ readonly local: true;
2253
+ readonly reason: "See ChatBubblePlacementProp, the conversation-side vocabulary.";
2254
+ }, {
2255
+ readonly field: "variant";
2256
+ readonly local: true;
2257
+ readonly reason: "See ChatBubbleVariantProp, the message-body treatment vocabulary.";
2258
+ }, {
2259
+ readonly field: "avatar";
2260
+ readonly local: true;
2261
+ readonly reason: "The author's mark — a real <Avatar> node. A slot, not a label: the accessible name comes from `header`, so a decorative avatar is aria-hidden at the call site.";
2262
+ }, {
2263
+ readonly field: "header";
2264
+ readonly local: true;
2265
+ readonly reason: "Line above the body naming the turn's author. Distinct from TitleProp: it is the bubble's ACCESSIBLE NAME, not a heading in the document outline.";
2266
+ }, {
2267
+ readonly field: "footer";
2268
+ readonly local: true;
2269
+ readonly reason: "Line below the body (timestamp, per-message actions). Not FooterProp, which is a page-level action bar.";
2270
+ }, {
2271
+ readonly field: "typing";
2272
+ readonly local: true;
2273
+ readonly reason: "See ChatBubbleTypingProp, the stream-in animation vocabulary.";
2274
+ }];
2275
+ };
2276
+ readonly ChatMessageProp: {
2277
+ readonly group: "data-display";
2278
+ readonly file: "components/data-display.prop.ts";
2279
+ readonly vocabulary: readonly ["IdProp", "ChildrenProp", {
2280
+ readonly field: "role";
2281
+ readonly local: true;
2282
+ readonly reason: 'Key into ChatBubbleList\'s `roles` map ("user" | "assistant" | "system" | a product\'s own). A data field, not the ARIA `role` attribute.';
2283
+ }, {
2284
+ readonly field: "content";
2285
+ readonly local: true;
2286
+ readonly reason: "The message body. Spelled `content` rather than `children` because a data item in an array is not a JSX child.";
2287
+ }];
2288
+ };
2289
+ readonly ChatBubbleListProp: {
2290
+ readonly group: "data-display";
2291
+ readonly file: "components/data-display.prop.ts";
2292
+ readonly vocabulary: readonly ["LabelProp", "ClassNameProp", "IdProp", {
2293
+ readonly field: "items";
2294
+ readonly local: true;
2295
+ readonly reason: "Consumer-supplied messages in conversation order (see ChatMessageProp).";
2296
+ }, {
2297
+ readonly field: "roles";
2298
+ readonly local: true;
2299
+ readonly reason: "Per-role bubble defaults merged UNDER each message's own props, so a feed's shape is declared once instead of on every message.";
2300
+ }, {
2301
+ readonly field: "autoScroll";
2302
+ readonly local: true;
2303
+ readonly reason: 'Stick-to-bottom while the reader is already at the bottom. Not a generic boolean flag: revoking the pin the moment they scroll up is the behaviour, and it drives the "jump to latest" affordance.';
2304
+ }];
2305
+ };
2306
+ readonly TreeNodeProp: {
2307
+ readonly group: "data-display";
2308
+ readonly file: "components/data-display.prop.ts";
2309
+ readonly vocabulary: readonly [{
2310
+ readonly field: "icon";
2311
+ readonly local: true;
2312
+ readonly reason: "Per-node glyph drawn when Tree's showIcon is on.";
2313
+ }, {
2314
+ readonly field: "children";
2315
+ readonly local: true;
2316
+ readonly reason: "The node's own child nodes — the hierarchy itself, not a slot.";
2317
+ }];
2318
+ };
2319
+ readonly TreeProp: {
2320
+ readonly group: "data-display";
2321
+ readonly file: "components/data-display.prop.ts";
2322
+ readonly vocabulary: readonly ["ValueProp", "DefaultValueProp", "OnValueChangeProp", "DisabledProp", "SizeProp", "ClassNameProp", "IdProp"];
2219
2323
  };
2220
2324
  readonly CardProp: {
2221
2325
  readonly group: "data-display";
@@ -2562,6 +2666,39 @@ export declare const COMPONENT_PROP_REGISTRY: {
2562
2666
  readonly reason: "Forwarded MasterDetail stacking threshold override.";
2563
2667
  }];
2564
2668
  };
2669
+ readonly ChatComposerSubmitTypeProp: {
2670
+ readonly group: "data-entry";
2671
+ readonly file: "components/data-entry.prop.ts";
2672
+ readonly vocabulary: readonly [];
2673
+ };
2674
+ readonly ChatComposerProp: {
2675
+ readonly group: "data-entry";
2676
+ readonly file: "components/data-entry.prop.ts";
2677
+ readonly vocabulary: readonly ["ValueProp", "DefaultValueProp", "OnValueChangeProp", "PlaceholderProp", "DisabledProp", "PendingProp", "SizeProp", "ControlStatusProp", "NameProp", "IdProp", "ClassNameProp"];
2678
+ };
2679
+ readonly ChatSuggestionItemProp: {
2680
+ readonly group: "data-entry";
2681
+ readonly file: "components/data-entry.prop.ts";
2682
+ readonly vocabulary: readonly ["ValueProp", "LabelProp", "DisabledProp"];
2683
+ };
2684
+ readonly ChatSuggestionRenderProp: {
2685
+ readonly group: "data-entry";
2686
+ readonly file: "components/data-entry.prop.ts";
2687
+ readonly vocabulary: readonly [{
2688
+ readonly field: "onTrigger";
2689
+ readonly local: true;
2690
+ readonly reason: "Render-prop callback the composer calls to re-read the caret; not a value change.";
2691
+ }, {
2692
+ readonly field: "onKeyDown";
2693
+ readonly local: true;
2694
+ readonly reason: "Render-prop keydown forwarder — the composer's own DOM handler, not a state axis.";
2695
+ }];
2696
+ };
2697
+ readonly ChatSuggestionProp: {
2698
+ readonly group: "data-entry";
2699
+ readonly file: "components/data-entry.prop.ts";
2700
+ readonly vocabulary: readonly ["OnValueChangeProp", "OpenProp", "DefaultOpenProp", "OnOpenChangeProp", "ChildrenProp", "EmptyMessageProp", "IdProp", "ClassNameProp"];
2701
+ };
2565
2702
  };
2566
2703
  export type ComponentPropName = keyof typeof COMPONENT_PROP_REGISTRY;
2567
2704
  /** Forbidden duplicate concepts — use the canonical name on the left. */
@@ -242,6 +242,11 @@ const VOCABULARY_REGISTRY = {
242
242
  category: "layout",
243
243
  description: "MobileShell block-size contract \u2014 viewport (100dvh root, the real app) | fill (fills a bounded parent, e.g. a device-frame preview)"
244
244
  },
245
+ MobileShellWidthProp: {
246
+ file: "vocabulary/layout.prop.ts",
247
+ category: "layout",
248
+ description: "MobileShell inline-size contract \u2014 fill (takes the whole inline size, the default) | phone (caps at the handheld measure and centres, for a handheld screen on a wider viewport)"
249
+ },
245
250
  CenteredShellPresetProp: {
246
251
  file: "vocabulary/layout.prop.ts",
247
252
  category: "layout",
@@ -861,6 +866,7 @@ const COMPONENT_PROP_REGISTRY = {
861
866
  "ClassNameProp",
862
867
  "ActionProp",
863
868
  "MobileShellHeightProp",
869
+ "MobileShellWidthProp",
864
870
  {
865
871
  field: "header",
866
872
  local: true,
@@ -1472,21 +1478,6 @@ const COMPONENT_PROP_REGISTRY = {
1472
1478
  file: "components/data-entry.prop.ts",
1473
1479
  vocabulary: ["ValueProp", "OnValueChangeProp", "PlaceholderProp", "DisabledProp", "IdProp"]
1474
1480
  },
1475
- MonthPickerProp: {
1476
- group: "data-entry",
1477
- file: "components/data-entry.prop.ts",
1478
- vocabulary: ["ValueProp", "OnValueChangeProp", "PlaceholderProp", "DisabledProp", "IdProp"]
1479
- },
1480
- MonthRangePickerProp: {
1481
- group: "data-entry",
1482
- file: "components/data-entry.prop.ts",
1483
- vocabulary: ["ValueProp", "OnValueChangeProp", "PlaceholderProp", "DisabledProp", "IdProp"]
1484
- },
1485
- DateRangePickerProp: {
1486
- group: "data-entry",
1487
- file: "components/data-entry.prop.ts",
1488
- vocabulary: ["ValueProp", "OnValueChangeProp", "PlaceholderProp", "DisabledProp", "IdProp"]
1489
- },
1490
1481
  CalendarCellRenderProp: {
1491
1482
  group: "data-entry",
1492
1483
  file: "components/data-entry.prop.ts",
@@ -2316,6 +2307,16 @@ const COMPONENT_PROP_REGISTRY = {
2316
2307
  file: "components/navigation.prop.ts",
2317
2308
  vocabulary: ["HandlerProp"]
2318
2309
  },
2310
+ TabsOnTabClickProp: {
2311
+ group: "navigation",
2312
+ file: "components/navigation.prop.ts",
2313
+ vocabulary: ["HandlerProp"]
2314
+ },
2315
+ TabsOverflowProp: {
2316
+ group: "navigation",
2317
+ file: "components/navigation.prop.ts",
2318
+ vocabulary: []
2319
+ },
2319
2320
  TabItemProp: {
2320
2321
  group: "navigation",
2321
2322
  file: "components/navigation.prop.ts",
@@ -2570,10 +2571,152 @@ const COMPONENT_PROP_REGISTRY = {
2570
2571
  }
2571
2572
  ]
2572
2573
  },
2573
- TreeListProp: {
2574
+ ChatBubblePlacementProp: {
2574
2575
  group: "data-display",
2575
- file: "components/data-display/tree-list.tsx",
2576
- vocabulary: ["ClassNameProp"]
2576
+ file: "components/data-display.prop.ts",
2577
+ vocabulary: [
2578
+ {
2579
+ field: "placement",
2580
+ local: true,
2581
+ reason: 'Side of the conversation a message sits on ("start" | "end"), spelled on the LOGICAL inline axis so a feed flips under dir="rtl" with no per-locale branch.'
2582
+ }
2583
+ ]
2584
+ },
2585
+ ChatBubbleVariantProp: {
2586
+ group: "data-display",
2587
+ file: "components/data-display.prop.ts",
2588
+ vocabulary: [
2589
+ {
2590
+ field: "variant",
2591
+ local: true,
2592
+ reason: "Structural treatment of the message body (filled | borderless | outlined). Status colour stays on `tone`; Ant Design X's `shadow` is absent because this system has no drop shadows."
2593
+ }
2594
+ ]
2595
+ },
2596
+ ChatBubbleToneProp: {
2597
+ group: "data-display",
2598
+ file: "components/data-display.prop.ts",
2599
+ vocabulary: ["ToneProp"]
2600
+ },
2601
+ ChatBubbleTypingProp: {
2602
+ group: "data-display",
2603
+ file: "components/data-display.prop.ts",
2604
+ vocabulary: [
2605
+ {
2606
+ field: "typing",
2607
+ local: true,
2608
+ reason: "Stream-in animation: `true` or `{ step, interval }`. Dropped entirely under prefers-reduced-motion, which renders the full text at once (WCAG 2.3.3)."
2609
+ }
2610
+ ]
2611
+ },
2612
+ ChatBubbleProp: {
2613
+ group: "data-display",
2614
+ file: "components/data-display.prop.ts",
2615
+ vocabulary: [
2616
+ "ChildrenProp",
2617
+ "SizeProp",
2618
+ "ToneProp",
2619
+ "PendingProp",
2620
+ "ClassNameProp",
2621
+ "IdProp",
2622
+ {
2623
+ field: "placement",
2624
+ local: true,
2625
+ reason: "See ChatBubblePlacementProp, the conversation-side vocabulary."
2626
+ },
2627
+ {
2628
+ field: "variant",
2629
+ local: true,
2630
+ reason: "See ChatBubbleVariantProp, the message-body treatment vocabulary."
2631
+ },
2632
+ {
2633
+ field: "avatar",
2634
+ local: true,
2635
+ reason: "The author's mark \u2014 a real <Avatar> node. A slot, not a label: the accessible name comes from `header`, so a decorative avatar is aria-hidden at the call site."
2636
+ },
2637
+ {
2638
+ field: "header",
2639
+ local: true,
2640
+ reason: "Line above the body naming the turn's author. Distinct from TitleProp: it is the bubble's ACCESSIBLE NAME, not a heading in the document outline."
2641
+ },
2642
+ {
2643
+ field: "footer",
2644
+ local: true,
2645
+ reason: "Line below the body (timestamp, per-message actions). Not FooterProp, which is a page-level action bar."
2646
+ },
2647
+ {
2648
+ field: "typing",
2649
+ local: true,
2650
+ reason: "See ChatBubbleTypingProp, the stream-in animation vocabulary."
2651
+ }
2652
+ ]
2653
+ },
2654
+ ChatMessageProp: {
2655
+ group: "data-display",
2656
+ file: "components/data-display.prop.ts",
2657
+ vocabulary: [
2658
+ "IdProp",
2659
+ "ChildrenProp",
2660
+ {
2661
+ field: "role",
2662
+ local: true,
2663
+ reason: 'Key into ChatBubbleList\'s `roles` map ("user" | "assistant" | "system" | a product\'s own). A data field, not the ARIA `role` attribute.'
2664
+ },
2665
+ {
2666
+ field: "content",
2667
+ local: true,
2668
+ reason: "The message body. Spelled `content` rather than `children` because a data item in an array is not a JSX child."
2669
+ }
2670
+ ]
2671
+ },
2672
+ ChatBubbleListProp: {
2673
+ group: "data-display",
2674
+ file: "components/data-display.prop.ts",
2675
+ vocabulary: [
2676
+ "LabelProp",
2677
+ "ClassNameProp",
2678
+ "IdProp",
2679
+ {
2680
+ field: "items",
2681
+ local: true,
2682
+ reason: "Consumer-supplied messages in conversation order (see ChatMessageProp)."
2683
+ },
2684
+ {
2685
+ field: "roles",
2686
+ local: true,
2687
+ reason: "Per-role bubble defaults merged UNDER each message's own props, so a feed's shape is declared once instead of on every message."
2688
+ },
2689
+ {
2690
+ field: "autoScroll",
2691
+ local: true,
2692
+ reason: 'Stick-to-bottom while the reader is already at the bottom. Not a generic boolean flag: revoking the pin the moment they scroll up is the behaviour, and it drives the "jump to latest" affordance.'
2693
+ }
2694
+ ]
2695
+ },
2696
+ TreeNodeProp: {
2697
+ group: "data-display",
2698
+ file: "components/data-display.prop.ts",
2699
+ vocabulary: [
2700
+ { field: "icon", local: true, reason: "Per-node glyph drawn when Tree's showIcon is on." },
2701
+ {
2702
+ field: "children",
2703
+ local: true,
2704
+ reason: "The node's own child nodes \u2014 the hierarchy itself, not a slot."
2705
+ }
2706
+ ]
2707
+ },
2708
+ TreeProp: {
2709
+ group: "data-display",
2710
+ file: "components/data-display.prop.ts",
2711
+ vocabulary: [
2712
+ "ValueProp",
2713
+ "DefaultValueProp",
2714
+ "OnValueChangeProp",
2715
+ "DisabledProp",
2716
+ "SizeProp",
2717
+ "ClassNameProp",
2718
+ "IdProp"
2719
+ ]
2577
2720
  },
2578
2721
  CardProp: {
2579
2722
  group: "data-display",
@@ -3010,6 +3153,63 @@ const COMPONENT_PROP_REGISTRY = {
3010
3153
  reason: "Forwarded MasterDetail stacking threshold override."
3011
3154
  }
3012
3155
  ]
3156
+ },
3157
+ ChatComposerSubmitTypeProp: {
3158
+ group: "data-entry",
3159
+ file: "components/data-entry.prop.ts",
3160
+ vocabulary: []
3161
+ },
3162
+ ChatComposerProp: {
3163
+ group: "data-entry",
3164
+ file: "components/data-entry.prop.ts",
3165
+ vocabulary: [
3166
+ "ValueProp",
3167
+ "DefaultValueProp",
3168
+ "OnValueChangeProp",
3169
+ "PlaceholderProp",
3170
+ "DisabledProp",
3171
+ "PendingProp",
3172
+ "SizeProp",
3173
+ "ControlStatusProp",
3174
+ "NameProp",
3175
+ "IdProp",
3176
+ "ClassNameProp"
3177
+ ]
3178
+ },
3179
+ ChatSuggestionItemProp: {
3180
+ group: "data-entry",
3181
+ file: "components/data-entry.prop.ts",
3182
+ vocabulary: ["ValueProp", "LabelProp", "DisabledProp"]
3183
+ },
3184
+ ChatSuggestionRenderProp: {
3185
+ group: "data-entry",
3186
+ file: "components/data-entry.prop.ts",
3187
+ vocabulary: [
3188
+ {
3189
+ field: "onTrigger",
3190
+ local: true,
3191
+ reason: "Render-prop callback the composer calls to re-read the caret; not a value change."
3192
+ },
3193
+ {
3194
+ field: "onKeyDown",
3195
+ local: true,
3196
+ reason: "Render-prop keydown forwarder \u2014 the composer's own DOM handler, not a state axis."
3197
+ }
3198
+ ]
3199
+ },
3200
+ ChatSuggestionProp: {
3201
+ group: "data-entry",
3202
+ file: "components/data-entry.prop.ts",
3203
+ vocabulary: [
3204
+ "OnValueChangeProp",
3205
+ "OpenProp",
3206
+ "DefaultOpenProp",
3207
+ "OnOpenChangeProp",
3208
+ "ChildrenProp",
3209
+ "EmptyMessageProp",
3210
+ "IdProp",
3211
+ "ClassNameProp"
3212
+ ]
3013
3213
  }
3014
3214
  };
3015
3215
  const PROP_ALIASES_FORBIDDEN = {
@@ -100,6 +100,18 @@ export type SelectedIdsProp = Set<string>;
100
100
  export type OnSelectChangeProp = (next: Set<string>) => void;
101
101
  /** Table density change callback. */
102
102
  export type OnTableDensityChangeProp = (density: TableDensityProp) => void;
103
+ /**
104
+ * A row's STATE, drawn as a leading-edge rail plus a wash — the same six tones, with the same
105
+ * names and the same meanings, that `Card accent` already carries. A row that needs attention and
106
+ * a card that needs attention should not be two vocabularies.
107
+ *
108
+ * It is a state, never a category: colour is not the only signal a row may carry (WCAG 1.4.1), so
109
+ * the reason still belongs in a cell — a Badge, a status column, an icon with a label. The rail
110
+ * is what makes that cell findable in a long table, not a replacement for it.
111
+ */
112
+ export type TableRowToneProp = "primary" | "success" | "warning" | "info" | "attention" | "destructive";
113
+ /** Per-row tone resolver — return `undefined` for a row in the ordinary state. */
114
+ export type RowToneProp<T> = (row: T) => TableRowToneProp | undefined;
103
115
  /** Sort change callback — undefined clears sort. */
104
116
  export type OnSortChangeProp = (sort: {
105
117
  key: string;
@@ -1,7 +1,7 @@
1
1
  /** Barrel — all vocabulary prop types. */
2
2
  export type { ClassNameProp, ChildrenProp, IdProp, OpenProp, DefaultOpenProp, OnOpenChangeProp, HandlerProp, PendingProp, RequiredProp, DisabledProp, LabelProp, HelperProp, ErrorProp, ErrorBagProp, PlaceholderProp, NameProp, ValueProp, DefaultValueProp, OnValueChangeProp, OnChangeProp, OnClickProp, AsChildProp, FlushProp, WidthProp, ControlWidthProp, AllowClearProp, MaxTagCountProp, MaxTagPlaceholderProp, NotFoundContentProp, PopupMatchWidthProp, } from "./shared.prop.js";
3
3
  export type { TitleProp, SubtitleProp, StatusProp, DescriptionProp, ExtraProp, FooterProp, ActionProp, IconProp, ConfirmLabelProp, CancelLabelProp, ActionsProp, EmptyMessageProp, } from "./content.prop.js";
4
- export type { PageDensityProp, PageContainerVariantProp, CenteredShellWidthProp, CenteredShellAlignProp, CenteredShellPresetProp, ErrorSurfaceModeProp, ErrorSurfaceStatusProp, AuthShellPresetProp, MobileShellHeightProp, OrientationProp, TableDensityProp, DensityProp, GapNameProp, PadProp, PadRawProp, PadSides, GapProp, GapStepProp, } from "./layout.prop.js";
4
+ export type { PageDensityProp, PageContainerVariantProp, CenteredShellWidthProp, CenteredShellAlignProp, CenteredShellPresetProp, ErrorSurfaceModeProp, ErrorSurfaceStatusProp, AuthShellPresetProp, MobileShellHeightProp, MobileShellWidthProp, OrientationProp, TableDensityProp, DensityProp, GapNameProp, PadProp, PadRawProp, PadSides, GapProp, GapStepProp, } from "./layout.prop.js";
5
5
  export type { ButtonVariantProp, ButtonSizeProp, BadgeVariantProp, AppSettingPickerAppearanceProp, AppSettingToggleAppearanceProp, ShapeProp, AvatarShapeProp, TextSizeProp, TextToneProp, FontWeightProp, HeadingLevelProp, TextAlignProp, TextWhitespaceProp, SizeProp, ControlStatusProp, ControlVariantProp, FormLayoutProp, DescriptionsLayoutProp, BreakpointProp, ConfirmVariantProp, ToneProp, AlertVariantProp, SortDirectionProp, ColumnAlignProp, SortStateProp, RevealDelayProp, ActivityVariantProp, ActivityAnnounceProp, } from "./interaction.prop.js";
6
6
  export type { BreadcrumbItemProp, BreadcrumbProp, BreadcrumbItemMenuProp, BreadcrumbItemMenuEntryProp, BreadcrumbSeparatorProp, BreadcrumbItemRenderProp, } from "./navigation.prop.js";
7
- export type { GetRowIdProp, OnRowClickProp, ColumnDefProp, TablePresetProp, TableColumnPriorityProp, TableCellIndentProp, SelectedIdsProp, OnSelectChangeProp, OnTableDensityChangeProp, OnSortChangeProp, OnSearchChangeProp, OnClearFiltersProp, HasActiveFiltersProp, StickyProp, ColumnFixedProp, ColumnFilterValueProp, ColumnFilterItemProp, ColumnFilterStateProp, OnColumnFilterChangeProp, ColumnCompareProp, ColumnSorterProp, TableSelectionItemProp, TableRowSelectionProp, TableExpandableProp, TableSummaryProp, TableScrollProp, TableStickyProp, OnRowProp, TablePaginationProp, DescriptionsColumnProp, DescriptionsSpanProp, DescriptionsItemsProp, } from "./data.prop.js";
7
+ export type { GetRowIdProp, OnRowClickProp, ColumnDefProp, TablePresetProp, TableColumnPriorityProp, TableCellIndentProp, SelectedIdsProp, OnSelectChangeProp, OnTableDensityChangeProp, TableRowToneProp, RowToneProp, OnSortChangeProp, OnSearchChangeProp, OnClearFiltersProp, HasActiveFiltersProp, StickyProp, ColumnFixedProp, ColumnFilterValueProp, ColumnFilterItemProp, ColumnFilterStateProp, OnColumnFilterChangeProp, ColumnCompareProp, ColumnSorterProp, TableSelectionItemProp, TableRowSelectionProp, TableExpandableProp, TableSummaryProp, TableScrollProp, TableStickyProp, OnRowProp, TablePaginationProp, DescriptionsColumnProp, DescriptionsSpanProp, DescriptionsItemsProp, } from "./data.prop.js";
@@ -26,6 +26,17 @@ export type CenteredShellAlignProp = "start" | "center";
26
26
  * where a viewport-tall root would overflow its frame. Nothing else differs between the two.
27
27
  */
28
28
  export type MobileShellHeightProp = "viewport" | "fill";
29
+ /**
30
+ * MobileShell inline-size contract — the axis `height` had and `width` did not.
31
+ * `"fill"` (default, and what the shell has always done) takes the whole inline size it is given.
32
+ * `"phone"` caps it at the handheld measure (`--mobile-shell-max-inline-size`) and centres the
33
+ * column, for the case the shell's own docstring already names on the block axis: a handheld
34
+ * screen rendered on a viewport wider than a handheld — a device-frame preview, a desktop browser
35
+ * opening a mobile route, a phone view embedded in a wider page. Measured at a 1280px viewport
36
+ * before this existed: the shell drew 1232px wide with `max-inline-size: none`, so a 44px tab bar
37
+ * spread its four destinations across a metre of screen.
38
+ */
39
+ export type MobileShellWidthProp = "fill" | "phone";
29
40
  /**
30
41
  * ErrorSurface shell contract — WHERE the exception surface lives, not how it looks.
31
42
  * `"application"` (403 / 404): the failure happened INSIDE the authenticated app, so the surface
@@ -26,6 +26,10 @@
26
26
  }
27
27
  }
28
28
 
29
+ [data-slot="badge"][data-tabular] {
30
+ font-variant-numeric: tabular-nums;
31
+ }
32
+
29
33
  [data-slot="badge"][data-tinted] {
30
34
 
31
35
  background-color: color-mix(
@@ -44,27 +44,27 @@
44
44
  }
45
45
 
46
46
  [data-slot="card"][data-accent="primary"] {
47
- --card-accent-color: hsl(var(--primary));
47
+ --card-accent-color: hsl(var(--mark-primary));
48
48
  }
49
49
 
50
50
  [data-slot="card"][data-accent="success"] {
51
- --card-accent-color: hsl(var(--success));
51
+ --card-accent-color: hsl(var(--mark-success));
52
52
  }
53
53
 
54
54
  [data-slot="card"][data-accent="warning"] {
55
- --card-accent-color: hsl(var(--warning));
55
+ --card-accent-color: hsl(var(--mark-warning));
56
56
  }
57
57
 
58
58
  [data-slot="card"][data-accent="info"] {
59
- --card-accent-color: hsl(var(--info));
59
+ --card-accent-color: hsl(var(--mark-info));
60
60
  }
61
61
 
62
62
  [data-slot="card"][data-accent="attention"] {
63
- --card-accent-color: hsl(var(--attention));
63
+ --card-accent-color: hsl(var(--mark-attention));
64
64
  }
65
65
 
66
66
  [data-slot="card"][data-accent="destructive"] {
67
- --card-accent-color: hsl(var(--destructive));
67
+ --card-accent-color: hsl(var(--mark-destructive));
68
68
  }
69
69
 
70
70
  [data-slot="card"][data-accent] {