@ds-mo/ui 14.25.0 → 14.27.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 (220) hide show
  1. package/dist/.package-ready.json +1 -1
  2. package/dist/agent-patterns.json +1 -1
  3. package/dist/agent.json +343 -16
  4. package/dist/angular/ds-score.d.ts +12 -0
  5. package/dist/angular/ds-score.js +38 -0
  6. package/dist/angular/ds-textarea.d.ts +15 -0
  7. package/dist/angular/ds-textarea.js +43 -0
  8. package/dist/angular/index.d.ts +1 -1
  9. package/dist/angular/index.js +2 -0
  10. package/dist/angular/proxies.d.ts +2 -0
  11. package/dist/angular/proxies.js +2 -0
  12. package/dist/angular/text-value-accessor.d.ts +1 -1
  13. package/dist/angular/text-value-accessor.js +2 -2
  14. package/dist/components/ds-agent-activity.js +1 -1
  15. package/dist/components/ds-agent-questionnaire.js +1 -1
  16. package/dist/components/ds-agent-response.js +1 -1
  17. package/dist/components/ds-agent-source-list.js +1 -1
  18. package/dist/components/ds-agent-tool-call.js +1 -1
  19. package/dist/components/ds-attachment-list.js +1 -1
  20. package/dist/components/ds-badge.js +1 -1
  21. package/dist/components/ds-banner.js +1 -1
  22. package/dist/components/ds-bar-action.js +1 -1
  23. package/dist/components/ds-bar-nav.js +1 -1
  24. package/dist/components/ds-bar-title.js +1 -1
  25. package/dist/components/ds-bar-workflow.js +1 -1
  26. package/dist/components/ds-breadcrumb.js +1 -1
  27. package/dist/components/ds-button-filled.js +1 -1
  28. package/dist/components/ds-button-unfilled.js +1 -1
  29. package/dist/components/ds-card-chart.js +1 -1
  30. package/dist/components/ds-card-overview.js +1 -1
  31. package/dist/components/ds-card-overview.js.map +1 -1
  32. package/dist/components/ds-card-setting.js +1 -1
  33. package/dist/components/ds-chart-legend.js +1 -1
  34. package/dist/components/ds-chart.js +1 -1
  35. package/dist/components/ds-checkbox.js +1 -1
  36. package/dist/components/ds-chip.js +1 -1
  37. package/dist/components/ds-code-block.js +1 -1
  38. package/dist/components/ds-conversation-list-item.js +1 -1
  39. package/dist/components/ds-conversation-list-section.js +1 -1
  40. package/dist/components/ds-empty-state.js +1 -1
  41. package/dist/components/ds-field.js +1 -1
  42. package/dist/components/ds-filter-menu.js +1 -1
  43. package/dist/components/ds-input.js +1 -1
  44. package/dist/components/ds-markdown.js +1 -1
  45. package/dist/components/ds-menu.js +1 -1
  46. package/dist/components/ds-message-actions.js +1 -1
  47. package/dist/components/ds-message-composer.js +1 -1
  48. package/dist/components/ds-message-scroller.js +1 -1
  49. package/dist/components/ds-message.js +1 -1
  50. package/dist/components/ds-mobile-bar-nav.js +1 -1
  51. package/dist/components/ds-mobile-header.js +1 -1
  52. package/dist/components/ds-mobile-section-switcher.js +1 -1
  53. package/dist/components/ds-mobile-sheet-nav.js +1 -1
  54. package/dist/components/ds-modal.js +1 -1
  55. package/dist/components/ds-pagination.js +1 -1
  56. package/dist/components/ds-panel-nav.js +1 -1
  57. package/dist/components/ds-panel-sub-nav.js +1 -1
  58. package/dist/components/ds-panel-tool-header.js +1 -1
  59. package/dist/components/ds-panel-tool-search.js +1 -1
  60. package/dist/components/ds-panel-tools.js +1 -1
  61. package/dist/components/ds-paper-texture.js +1 -1
  62. package/dist/components/ds-radio.js +1 -1
  63. package/dist/components/ds-score.d.ts +11 -0
  64. package/dist/components/ds-score.js +2 -0
  65. package/dist/components/ds-score.js.map +1 -0
  66. package/dist/components/ds-select.js +1 -1
  67. package/dist/components/ds-shell-app.js +1 -1
  68. package/dist/components/ds-shell-page.js +1 -1
  69. package/dist/components/ds-shell-tools.js +1 -1
  70. package/dist/components/ds-slider.js +1 -1
  71. package/dist/components/ds-swatch-picker.js +1 -1
  72. package/dist/components/ds-tab-group.js +1 -1
  73. package/dist/components/ds-table-filter.js +1 -1
  74. package/dist/components/ds-table-group.js +1 -1
  75. package/dist/components/ds-table-group.js.map +1 -1
  76. package/dist/components/ds-table-saved-views.js +1 -1
  77. package/dist/components/ds-table-search.js +1 -1
  78. package/dist/components/ds-table-sort.js +1 -1
  79. package/dist/components/ds-table-toolbar.js +1 -1
  80. package/dist/components/ds-table.js +1 -1
  81. package/dist/components/ds-table.js.map +1 -1
  82. package/dist/components/ds-tag.js +1 -1
  83. package/dist/components/ds-text.js +1 -1
  84. package/dist/components/ds-textarea.d.ts +11 -0
  85. package/dist/components/ds-textarea.js +2 -0
  86. package/dist/components/ds-textarea.js.map +1 -0
  87. package/dist/components/ds-toast.js +1 -1
  88. package/dist/components/ds-tooltip-chart.js +1 -1
  89. package/dist/components/ds-tooltip.js +1 -1
  90. package/dist/components/ds-typing-indicator.js +1 -1
  91. package/dist/components/{p-DLaN9BPq.js → p-1604KY3B.js} +2 -2
  92. package/dist/components/{p-CYMKmJ2s.js → p-2wIPUcSL.js} +2 -2
  93. package/dist/components/{p-CEfxLsbX.js → p-537t6oRD.js} +2 -2
  94. package/dist/components/{p-kslioYhf.js → p-6_CNVbqa.js} +2 -2
  95. package/dist/components/{p-PXdvBMXB.js → p-B3Z5sQin.js} +2 -2
  96. package/dist/components/{p-CZjjDhUl.js → p-B3sRZBZk.js} +2 -2
  97. package/dist/components/{p-BZlhBJZL.js → p-B9esvbYk.js} +2 -2
  98. package/dist/components/{p-5Z4oYuiK.js → p-BEXkJ9lg.js} +2 -2
  99. package/dist/components/{p-DbLLH3hr.js → p-BIGpc__9.js} +2 -2
  100. package/dist/components/{p-DzPtYdXy.js → p-BMzn2Cmw.js} +2 -2
  101. package/dist/components/{p-BSRIF4m8.js → p-BRLDf-NK.js} +2 -2
  102. package/dist/components/{p-0X-4KGQf.js → p-BUh2GkPJ.js} +2 -2
  103. package/dist/components/{p-pUOA3iDG.js → p-BVpn_e-r.js} +2 -2
  104. package/dist/components/{p-CpeJMKJ5.js → p-BVz-r3g0.js} +2 -2
  105. package/dist/components/{p-CBymzuOO.js → p-BXDLR072.js} +2 -2
  106. package/dist/components/{p-DiS5BgLA.js → p-BZiGtBBk.js} +2 -2
  107. package/dist/components/{p-BcxidW9k.js → p-Bb9dA7sl.js} +2 -2
  108. package/dist/components/{p-BR1ayqMU.js → p-Bjt_8sLe.js} +2 -2
  109. package/dist/components/{p-BqbdABo3.js → p-BssZ4SbT.js} +2 -2
  110. package/dist/components/{p-bHnk8t5I.js → p-C68oSTb1.js} +2 -2
  111. package/dist/components/{p-C_FFU6W3.js → p-CGQnHNuW.js} +2 -2
  112. package/dist/components/{p-BqVXMEJm.js → p-CQjUOHiN.js} +2 -2
  113. package/dist/components/{p-w9fkkwL2.js → p-CaF5WCci.js} +2 -2
  114. package/dist/components/{p-Bjq1KP_Y.js → p-Cf5Ai4xx.js} +2 -2
  115. package/dist/components/{p-B0kSlcaw.js → p-Cr6pDY-e.js} +2 -2
  116. package/dist/components/{p-FxtgCvhA.js → p-Cy1oWIaV.js} +2 -2
  117. package/dist/components/{p-CTH3dSYg.js → p-DDqRCDXh.js} +2 -2
  118. package/dist/components/{p-x5u5Ueli.js → p-DIqAdmui.js} +2 -2
  119. package/dist/components/{p-Cd1JnnVK.js → p-DQQsS9Rx.js} +2 -2
  120. package/dist/components/{p-CZHIkVgj.js → p-DQsFmleZ.js} +2 -2
  121. package/dist/components/{p-CE2b5GPu.js → p-DVLghmNY.js} +2 -2
  122. package/dist/components/p-DW8ssbfI.js +2 -0
  123. package/dist/components/p-DW8ssbfI.js.map +1 -0
  124. package/dist/components/{p-BXv6RpoF.js → p-DZcIt_JJ.js} +2 -2
  125. package/dist/components/{p-CglHiyY2.js → p-DkxOEFHN.js} +2 -2
  126. package/dist/components/{p-DeK_6Uym.js → p-DlbhmXjH.js} +2 -2
  127. package/dist/components/{p-Bq8svcPs.js → p-GEi3hDJQ.js} +2 -2
  128. package/dist/components/p-LMmrjmI_.js +2 -0
  129. package/dist/components/p-LMmrjmI_.js.map +1 -0
  130. package/dist/components/{p-DI8DUozc.js → p-Q0dkeoJ6.js} +2 -2
  131. package/dist/components/{p-XaCYqck3.js → p-Q7AOgrg5.js} +2 -2
  132. package/dist/components/p-VT-5XDkB.js +2 -0
  133. package/dist/components/p-VT-5XDkB.js.map +1 -0
  134. package/dist/components/{p-B0OZx3JB.js → p-WFo1x6dN.js} +2 -2
  135. package/dist/components/{p-CEXchU5N.js → p-to8BxxgT.js} +2 -2
  136. package/dist/docs/components.json +1106 -5
  137. package/dist/mcp-data/registry/card-overview.json +8 -6
  138. package/dist/mcp-data/registry/field.json +5 -4
  139. package/dist/mcp-data/registry/panel-nav.json +2 -1
  140. package/dist/mcp-data/registry/registry.json +348 -15
  141. package/dist/mcp-data/registry/score.json +241 -0
  142. package/dist/mcp-data/registry/table-group.json +5 -5
  143. package/dist/mcp-data/registry/table.json +16 -13
  144. package/dist/mcp-data/registry/textarea.json +600 -0
  145. package/dist/mcp-data/registry/tooltip.json +5 -5
  146. package/dist/react/components.d.ts +2 -0
  147. package/dist/react/components.js +2 -0
  148. package/dist/react/ds-score.d.ts +9 -0
  149. package/dist/react/ds-score.js +12 -0
  150. package/dist/react/ds-textarea.d.ts +12 -0
  151. package/dist/react/ds-textarea.js +12 -0
  152. package/dist/styles/table.css +188 -69
  153. package/dist/types/components/CardOverview/card-overview-controller.d.ts +2 -2
  154. package/dist/types/components/CardOverview/card-overview-types.d.ts +2 -1
  155. package/dist/types/components/Score/Score.d.ts +21 -0
  156. package/dist/types/components/Score/index.d.ts +3 -0
  157. package/dist/types/components/Score/score-model.d.ts +14 -0
  158. package/dist/types/components/Score/score-types.d.ts +5 -0
  159. package/dist/types/components/Table/Table.d.ts +3 -0
  160. package/dist/types/components/Table/index.d.ts +1 -1
  161. package/dist/types/components/Table/table-cell-model.d.ts +12 -0
  162. package/dist/types/components/Table/table-model.d.ts +10 -1
  163. package/dist/types/components/Table/table-render-model.d.ts +3 -1
  164. package/dist/types/components/Table/table-types.d.ts +62 -1
  165. package/dist/types/components/Table/table-virtual-model.d.ts +6 -5
  166. package/dist/types/components/TableGroup/TableGroup.d.ts +13 -3
  167. package/dist/types/components/Textarea/Textarea.d.ts +66 -0
  168. package/dist/types/components/Textarea/index.d.ts +2 -0
  169. package/dist/types/components/Tooltip/Tooltip.d.ts +1 -1
  170. package/dist/types/components.d.ts +324 -2
  171. package/dist/vue/components.d.ts +2 -0
  172. package/dist/vue/components.js +2 -0
  173. package/dist/vue/ds-score.d.ts +3 -0
  174. package/dist/vue/ds-score.js +12 -0
  175. package/dist/vue/ds-textarea.d.ts +3 -0
  176. package/dist/vue/ds-textarea.js +36 -0
  177. package/package.json +1 -1
  178. package/dist/components/p-9X_p0bHr.js +0 -2
  179. package/dist/components/p-9X_p0bHr.js.map +0 -1
  180. package/dist/components/p-Bo6uW_8T.js +0 -2
  181. package/dist/components/p-Bo6uW_8T.js.map +0 -1
  182. /package/dist/components/{p-DLaN9BPq.js.map → p-1604KY3B.js.map} +0 -0
  183. /package/dist/components/{p-CYMKmJ2s.js.map → p-2wIPUcSL.js.map} +0 -0
  184. /package/dist/components/{p-CEfxLsbX.js.map → p-537t6oRD.js.map} +0 -0
  185. /package/dist/components/{p-kslioYhf.js.map → p-6_CNVbqa.js.map} +0 -0
  186. /package/dist/components/{p-PXdvBMXB.js.map → p-B3Z5sQin.js.map} +0 -0
  187. /package/dist/components/{p-CZjjDhUl.js.map → p-B3sRZBZk.js.map} +0 -0
  188. /package/dist/components/{p-BZlhBJZL.js.map → p-B9esvbYk.js.map} +0 -0
  189. /package/dist/components/{p-5Z4oYuiK.js.map → p-BEXkJ9lg.js.map} +0 -0
  190. /package/dist/components/{p-DbLLH3hr.js.map → p-BIGpc__9.js.map} +0 -0
  191. /package/dist/components/{p-DzPtYdXy.js.map → p-BMzn2Cmw.js.map} +0 -0
  192. /package/dist/components/{p-BSRIF4m8.js.map → p-BRLDf-NK.js.map} +0 -0
  193. /package/dist/components/{p-0X-4KGQf.js.map → p-BUh2GkPJ.js.map} +0 -0
  194. /package/dist/components/{p-pUOA3iDG.js.map → p-BVpn_e-r.js.map} +0 -0
  195. /package/dist/components/{p-CpeJMKJ5.js.map → p-BVz-r3g0.js.map} +0 -0
  196. /package/dist/components/{p-CBymzuOO.js.map → p-BXDLR072.js.map} +0 -0
  197. /package/dist/components/{p-DiS5BgLA.js.map → p-BZiGtBBk.js.map} +0 -0
  198. /package/dist/components/{p-BcxidW9k.js.map → p-Bb9dA7sl.js.map} +0 -0
  199. /package/dist/components/{p-BR1ayqMU.js.map → p-Bjt_8sLe.js.map} +0 -0
  200. /package/dist/components/{p-BqbdABo3.js.map → p-BssZ4SbT.js.map} +0 -0
  201. /package/dist/components/{p-bHnk8t5I.js.map → p-C68oSTb1.js.map} +0 -0
  202. /package/dist/components/{p-C_FFU6W3.js.map → p-CGQnHNuW.js.map} +0 -0
  203. /package/dist/components/{p-BqVXMEJm.js.map → p-CQjUOHiN.js.map} +0 -0
  204. /package/dist/components/{p-w9fkkwL2.js.map → p-CaF5WCci.js.map} +0 -0
  205. /package/dist/components/{p-Bjq1KP_Y.js.map → p-Cf5Ai4xx.js.map} +0 -0
  206. /package/dist/components/{p-B0kSlcaw.js.map → p-Cr6pDY-e.js.map} +0 -0
  207. /package/dist/components/{p-FxtgCvhA.js.map → p-Cy1oWIaV.js.map} +0 -0
  208. /package/dist/components/{p-CTH3dSYg.js.map → p-DDqRCDXh.js.map} +0 -0
  209. /package/dist/components/{p-x5u5Ueli.js.map → p-DIqAdmui.js.map} +0 -0
  210. /package/dist/components/{p-Cd1JnnVK.js.map → p-DQQsS9Rx.js.map} +0 -0
  211. /package/dist/components/{p-CZHIkVgj.js.map → p-DQsFmleZ.js.map} +0 -0
  212. /package/dist/components/{p-CE2b5GPu.js.map → p-DVLghmNY.js.map} +0 -0
  213. /package/dist/components/{p-BXv6RpoF.js.map → p-DZcIt_JJ.js.map} +0 -0
  214. /package/dist/components/{p-CglHiyY2.js.map → p-DkxOEFHN.js.map} +0 -0
  215. /package/dist/components/{p-DeK_6Uym.js.map → p-DlbhmXjH.js.map} +0 -0
  216. /package/dist/components/{p-Bq8svcPs.js.map → p-GEi3hDJQ.js.map} +0 -0
  217. /package/dist/components/{p-DI8DUozc.js.map → p-Q0dkeoJ6.js.map} +0 -0
  218. /package/dist/components/{p-XaCYqck3.js.map → p-Q7AOgrg5.js.map} +0 -0
  219. /package/dist/components/{p-B0OZx3JB.js.map → p-WFo1x6dN.js.map} +0 -0
  220. /package/dist/components/{p-CEXchU5N.js.map → p-to8BxxgT.js.map} +0 -0
@@ -2424,6 +2424,7 @@
2424
2424
  }
2425
2425
  ],
2426
2426
  "commonlyComposedWith": [
2427
+ "component:ds-score",
2427
2428
  "component:ds-select",
2428
2429
  "component:ds-button-unfilled",
2429
2430
  "component:ds-text",
@@ -2441,11 +2442,11 @@
2441
2442
  "Trend is supplied already resolved as a direction, a formatted value, and a tone. Whether a rise reads well is a product decision, so the component never infers tone from the numbers. Derive it with resolveMetricTrend.",
2442
2443
  "Omit a trend when there is nothing to report; resolveMetricTrend returns null in that case so no zero change is rendered.",
2443
2444
  "Omit score to render a centered Score unavailable cell with a tertiary border and no score fill. Set scoreErrorMessage to replace that copy while the measures remain readable.",
2444
- "Loading replaces the score and measures with skeletons and does not alter the slotted period control. When measures are already supplied, their count preserves the resolved grid shape; otherwise five measure placeholders join the score in the standard six-cell grid.",
2445
+ "Loading replaces the score and measures with skeletons and does not alter the slotted period control. Score loading replaces only the fill figure; the overview still skeletons the score-copy spacer and trend. When measures are already supplied, their count preserves the resolved grid shape; otherwise five measure placeholders join the score in the standard six-cell grid.",
2445
2446
  "At most seven measures are shown. Keep larger collections outside the summary bar rather than turning it into a dense dashboard.",
2446
2447
  "The period and filter controls are slotted rather than owned. Use the period slot when the current range is selectable; otherwise periodLabel supplies fixed current copy in the same md control-frame and label-inset anatomy. Use the filter slot for the application-owned comparison-window control. Slotted Selects use hasBorder false so the 48px bar owns their surrounding boundary and allowClear false because both controls always require one selected reporting period.",
2447
2448
  "A numeric safety score infers fair from 0–50, good from 51–80, and excellent from 81–100. The level can be supplied explicitly when the displayed value is not numeric. The deprecated band field is ignored.",
2448
- "The safety score is the first grid cell and uses the same track, 8px outer inset, 6px inner padding, dividers, and responsive behavior as metric cells. The display value removes 8px from both block edges of its line box so it does not increase the shared row height. Score remains nonselectable and excluded from metric roving focus.",
2449
+ "The safety score is the first grid cell and uses the same track, 8px outer inset, 6px inner padding, dividers, and responsive behavior as metric cells. It renders ds-score at lg for the fill only. Comparison trend stays in the score-copy column, using the same renderTrend path and always-dark tokens as measures so the score cell lines up with the rest of the grid. The 40px fill owns a fixed box so line-height does not increase the shared row height. Score remains nonselectable and excluded from metric roving focus.",
2449
2450
  "During page-controlled scroll collapse, the component preserves its expanded flow height and stationary reporting bar while the metric grid moves and clips beneath it. Elevation remains fitted to the visible surface.",
2450
2451
  "compact is exactly 48px high and renders only the reporting bar. It omits Score, measures, and footer."
2451
2452
  ],
@@ -2553,6 +2554,7 @@
2553
2554
  "@ds-mo/tokens"
2554
2555
  ],
2555
2556
  "registryDependencies": [
2557
+ "score",
2556
2558
  "skeleton",
2557
2559
  "text",
2558
2560
  "tooltip"
@@ -3844,7 +3846,7 @@
3844
3846
  {
3845
3847
  "name": "field",
3846
3848
  "title": "Field",
3847
- "description": "Accessible form-field composition that gives one Input or Select a persistent label, optional guidance, shared error presentation, stable IDs, and observable interaction state.",
3849
+ "description": "Accessible form-field composition that gives one Input, Textarea, or Select a persistent label, optional guidance, shared error presentation, stable IDs, and observable interaction state.",
3848
3850
  "type": "registry:ui",
3849
3851
  "meta": {
3850
3852
  "library": "@ds-mo/ui",
@@ -3855,9 +3857,9 @@
3855
3857
  "intent": {
3856
3858
  "audience": "general",
3857
3859
  "status": "stable",
3858
- "summary": "Accessible form-field composition that gives one Input or Select a persistent label, optional guidance, shared error presentation, stable IDs, and observable interaction state.",
3860
+ "summary": "Accessible form-field composition that gives one Input, Textarea, or Select a persistent label, optional guidance, shared error presentation, stable IDs, and observable interaction state.",
3859
3861
  "useWhen": [
3860
- "An Input or Select needs a persistent visible label in a form.",
3862
+ "An Input, Textarea, or Select needs a persistent visible label in a form.",
3861
3863
  "Help text or an error message must be programmatically associated with one control.",
3862
3864
  "A form layout needs one consistent label-control-message rhythm."
3863
3865
  ],
@@ -3875,6 +3877,7 @@
3875
3877
  ],
3876
3878
  "commonlyComposedWith": [
3877
3879
  "component:ds-input",
3880
+ "component:ds-textarea",
3878
3881
  "component:ds-select",
3879
3882
  "component:ds-text"
3880
3883
  ],
@@ -3902,7 +3905,7 @@
3902
3905
  "Assign child component values and option arrays through their normal JavaScript properties."
3903
3906
  ],
3904
3907
  "react": [
3905
- "Compose one DsInput or DsSelect child and control validation timing in the form owner."
3908
+ "Compose one DsInput, DsTextarea, or DsSelect child and control validation timing in the form owner."
3906
3909
  ],
3907
3910
  "angular": [
3908
3911
  "Compose the generated Field adapter around the control adapter and its matching Angular value accessor."
@@ -6398,6 +6401,7 @@
6398
6401
  "A parent with children is not a standalone page: activating it while expanded resolves to the first enabled child; route state keeps that parent expanded and gives both parent and child selected styling.",
6399
6402
  "While one parent is expanded in nested presentation, other top-level destinations retain secondary foreground; flat and collapsed presentations keep their existing foreground treatment.",
6400
6403
  "Within a multi-item group, an expanded nested branch is bounded beside its siblings: the first branch adds a divider after its children, a middle branch adds dividers before its parent and after its children, and the final branch adds a divider before its parent. Single-item groups add neither. Divider space expands on the nested section-height timing while the line fades in, with equal visible spacing on both sides; collapsing the full rail contracts and fades the divider on the rail-collapse timing.",
6404
+ "Expanded nested child rows share the group destination gap with the parent-to-first-child inset; that inset is owned by the first child so closed 0fr accordions still collapse flush with following destinations.",
6401
6405
  "Expanded nested branches animate to their full required height over 500ms while fixed-size child rows progressively fade over 500ms after a 250ms wait, with each row starting 50ms after the previous row. On close, child rows fade out in reverse order with secondary foreground and the height contraction waits 250ms; reduced-motion preferences collapse those transitions to the instant motion token.",
6402
6406
  "Collapsing the full navigation rail keeps the active nested branch mounted through the rail transition and contracts its height over the same duration, so following destinations reposition without snapping.",
6403
6407
  "Collapsed nested presentation opens a child-only flyout from the parent icon without navigating; the parent holds the transient pressed wash while the flyout is rendered, activates again to close, and emits navigation intent only after a child selection.",
@@ -7455,6 +7459,121 @@
7455
7459
  "text"
7456
7460
  ]
7457
7461
  },
7462
+ {
7463
+ "name": "score",
7464
+ "title": "Score",
7465
+ "description": "Safety-score figure in a semantic fill at the three control densities.",
7466
+ "type": "registry:ui",
7467
+ "meta": {
7468
+ "library": "@ds-mo/ui",
7469
+ "distribution": "npm",
7470
+ "storybook": "https://zainadeel.github.io/compomo/?path=/story/score",
7471
+ "source": "src/wc/components/Score/Score.tsx",
7472
+ "intentStatus": "complete",
7473
+ "intent": {
7474
+ "audience": "general",
7475
+ "status": "experimental",
7476
+ "summary": "Safety-score figure in a semantic fill at the three control densities.",
7477
+ "useWhen": [
7478
+ "A driver or fleet safety score needs its fair, good, or excellent fill and the numeric figure in one place.",
7479
+ "The same score treatment appears in Card Overview, an in-card summary, or a compact row such as a table group header."
7480
+ ],
7481
+ "avoidWhen": [
7482
+ "The figure is an ordinary metric without a safety-score color band; use Text.",
7483
+ "The score is one cell in a comparable measures grid that also needs period chrome; use CardOverview, which composes Score.",
7484
+ "The mark is a notification count or status label; use Badge or Tag.",
7485
+ "A comparison trend should sit beside the fill; keep trend in the owner. Card Overview already renders score trend in its copy column."
7486
+ ],
7487
+ "alternatives": [
7488
+ {
7489
+ "when": "The figure is one of several comparable measures under a shared period bar.",
7490
+ "component": "component:ds-card-overview",
7491
+ "reason": "CardOverview owns the summary grid, period chrome, score-cell alignment, and score trend; it renders Score at lg for the fill."
7492
+ },
7493
+ {
7494
+ "when": "The quantity is ordinary readable content without a safety-score fill.",
7495
+ "component": "component:ds-text",
7496
+ "reason": "Text preserves the figure as body content."
7497
+ },
7498
+ {
7499
+ "when": "The compact mark is unread count or notification presence.",
7500
+ "component": "component:ds-badge",
7501
+ "reason": "Badge owns supplemental notification chrome, not a scored figure."
7502
+ }
7503
+ ],
7504
+ "commonlyComposedWith": [
7505
+ "component:ds-card-overview",
7506
+ "component:ds-table",
7507
+ "component:ds-text",
7508
+ "component:ds-skeleton"
7509
+ ],
7510
+ "accessibility": [
7511
+ "Set label when the atomic score graphic needs a spoken prefix such as Safety score; the visible number remains in the fill.",
7512
+ "Colour never carries score meaning alone; the numeric figure stays visible inside the fill.",
7513
+ "Score is not interactive and is not a tab stop.",
7514
+ "While loading, the host exposes a busy state and a skeleton whose type metrics match the resolved size."
7515
+ ],
7516
+ "states": [
7517
+ "lg is the Card Overview fill: 56 by 40, display-small emphasis. md is the 32px control treatment: 40 by 32, title-large emphasis. sm is the 24px compact fill: 28 by 24, title-small emphasis. The fill box crops the type canvas so line-height does not change the declared size.",
7518
+ "A numeric value from 0–100 infers fair from 0–50, good from 51–80, and excellent from 81–100. Empty or whitespace-only values stay on the faint neutral surface. Supply level explicitly when another displayed value needs a semantic fill.",
7519
+ "The fill uses the safety-score background and keeps its foreground at AA text contrast in light and dark themes.",
7520
+ "isLoading replaces the figure with a skeleton at the matching type metrics. The skeleton uses the faint context when no score level is known and the bold context when a known or explicitly supplied level keeps its semantic fill."
7521
+ ],
7522
+ "responsiveBehavior": [
7523
+ "The owner selects sm, md, or lg to match the local layout. Score does not change size at breakpoints.",
7524
+ "sm is the density for table group headers. md is the in-card summary fill. lg is the Card Overview fill."
7525
+ ],
7526
+ "references": [
7527
+ {
7528
+ "label": "Storybook examples",
7529
+ "path": "src/wc/components/Score/Score.stories.ts"
7530
+ },
7531
+ {
7532
+ "label": "Safety-score level unit coverage",
7533
+ "path": "tests/score-model.test.ts"
7534
+ }
7535
+ ]
7536
+ },
7537
+ "props": {
7538
+ "isLoading": {
7539
+ "type": "boolean",
7540
+ "required": false
7541
+ },
7542
+ "label": {
7543
+ "type": "string",
7544
+ "required": false
7545
+ },
7546
+ "level": {
7547
+ "type": "SafetyScoreLevel | undefined",
7548
+ "required": false
7549
+ },
7550
+ "size": {
7551
+ "type": "ScoreSize",
7552
+ "required": false
7553
+ },
7554
+ "value": {
7555
+ "type": "string | number",
7556
+ "required": false
7557
+ }
7558
+ },
7559
+ "events": [],
7560
+ "slots": [],
7561
+ "exports": {
7562
+ "customElement": "ds-score",
7563
+ "react": "DsScore",
7564
+ "vue": "DsScore",
7565
+ "angular": "DsScore"
7566
+ }
7567
+ },
7568
+ "dependencies": [
7569
+ "@ds-mo/ui",
7570
+ "@ds-mo/tokens"
7571
+ ],
7572
+ "registryDependencies": [
7573
+ "skeleton",
7574
+ "text"
7575
+ ]
7576
+ },
7458
7577
  {
7459
7578
  "name": "scroll-overlay",
7460
7579
  "title": "ScrollOverlay",
@@ -9333,6 +9452,7 @@
9333
9452
  "component:ds-menu",
9334
9453
  "component:ds-tooltip",
9335
9454
  "component:ds-tag",
9455
+ "component:ds-score",
9336
9456
  "component:ds-icon"
9337
9457
  ],
9338
9458
  "patterns": [
@@ -9352,7 +9472,7 @@
9352
9472
  ],
9353
9473
  "states": [
9354
9474
  "Columns, rows, groups, grouping, sorting, selected row IDs, collapsed group IDs, highlightTerms, highlightFieldIds, hiddenColumnIds, columnOrder, dataMode, pagination, displayedCount, totalCount, and incremental-loading state are controlled inputs. Events communicate intent and never mutate those inputs. The optional header is one composable table-local surface: the component owns its 48px chrome, 8px inset on every side, and sticky placement while the application owns the leading slot's internal layout, controls, labels, filtering behavior, and action handling. highlightTerms only marks matching table-owned text and never filters rows, changes query semantics, or highlights Tag labels. highlightFieldIds optionally narrows that marking to matching column IDs or compound header-segment sort keys. Opting into dataModeSwitcher and columnCustomizer adds their trailing Menu triggers and requires caption visibility. When both are present, Customize precedes a decorative divider and the data-mode trigger remains the final action. The Customize trigger keeps one stable label and neutral resting foreground whether or not hiddenColumnIds or columnOrder differ from the catalog default; the configured state remains visible inside the Menu. The table closes one trailing Menu before opening the other. The footer retains its compact-bar composition: application-owned leading status sits left while a controlled result summary or Pagination aligns right, before any trailing action. Content-sized tables remain natural for sparse or fixed-count results. height bounds the complete header, frame, and footer composition. fitViewport reserves the compact-state composition height in the nearest vertical scrollport while growing the visible table into that reservation as surrounding page chrome collapses.",
9355
- "Grouping supports one level. The application supplies groups in a fixed product-defined order and supplies ordered member rows independently. Group section headers show an emphasized text-body-medium label followed by a middle dot and plain secondary loaded progress, for example Critical · 50 of 166. The loaded value comes from the supplied member rows and the total comes from totalCount. A localized countLabel total phrase remains available for the complete assistive progress announcement. Virtual mode shows totals only, for example Critical · 166, because there is no loaded window. Groups may declare an optional intent (brand, neutral, negative, warning, caution, positive) that paints an LTR gradient from the faint intent surface at the label edge into faint neutral at the trailing edge, plus a bold intent title color. Neutral groups remain solid faint neutral. Section separators are painted inside that viewport-width surface so translucent border tokens composite with each intent background. Internal sections keep their separators; a collapsed or empty section header yields its separator only when it is the table's final rendered item. A trailing visually neutral icon-only ButtonUnfilled uses the 24px md double-inset action recipe and toggles controlled collapsedGroupIds, showing ChevronUp while expanded and ChevronDown while collapsed. While any group is expanded, a ChevronDownUp action uses the xs sort-control recipe widened to a table-owned 24px lane and collapses every group. It appears at the inline-end edge of the trailing column declared with kind action when one exists; otherwise a button-hugging 24px by 16px medium-elevation surface floats at the visible scrollport's header edge so the action remains reachable while member columns scroll beneath it. With stickyHeader enabled, each contained section uses its one real section row as a native sticky header inside its real row-group boundary. The browser therefore owns pinning, push-off, scrolling, and resize layout in one pass without a duplicated lane, active-section state, transforms, or scroll-time geometry. Shared grid tracks retain exact header and member-cell alignment. The section surface also stays pinned to the visible horizontal scrollport and spans the smaller of the visible viewport or table width. Virtual grouped tables flatten headers and members into that same scrollport; expanding a section never introduces an inner scroller.",
9475
+ "Grouping supports one level. The application supplies groups in a fixed product-defined order and supplies ordered member rows independently. Group section headers show an emphasized text-body-medium label followed by a middle dot and plain secondary loaded progress, for example Critical · 50 of 166. The loaded value comes from the supplied member rows and the total comes from totalCount. A localized countLabel total phrase remains available for the complete assistive progress announcement. Virtual mode shows totals only, for example Critical · 166, because there is no loaded window. A collapsed section with no supplied member rows uses that same total-only copy so collapse does not advertise a zero loaded window, including 0 when no total is known. An expanded empty section still shows loaded progress, for example Critical · 0 of 166. Optional accessories occupy a second 24px track under the label and count, middle-dot separated, at most four items. An accessory with help uses the shared dotted underline and a bottom-start ds-tooltip from that copy; explicit line breaks create an unbulleted list. Without accessories the section stays the single-track row height; with accessories it matches a two-track body row, with the checkbox and disclosure kept on the label track. An optional hero accessory sits before the label and count. The first supported hero is a safety-score fill using ds-score at sm on both single-track and two-track headers, top-aligned with the label track. A score hero does not use group intent coloring. The hero does not change the 40 or 64 row height. Groups may declare an optional intent (brand, neutral, negative, warning, caution, positive) that paints an LTR gradient from the faint intent surface at the label edge into faint neutral at the trailing edge, plus a bold intent title color. Neutral groups remain solid faint neutral. Section separators are painted inside that viewport-width surface so translucent border tokens composite with each intent background. Internal sections keep their separators; a collapsed or empty section header yields its separator only when it is the table's final rendered item. The complete section header is the expand/collapse target and paints hover and press on that viewport-width surface. The section separator stays on the dedicated trailing-edge rule so the interaction wash cannot replace it. A trailing visually neutral icon-only ButtonUnfilled uses the 24px md double-inset action recipe, keeps the accessible disclosure name, and does not paint its own hover or press wash, showing ChevronUp while expanded and ChevronDown while collapsed. While any group is expanded, a ChevronDownUp action uses the xs sort-control recipe widened to a table-owned 24px lane and collapses every group. It appears at the inline-end edge of the trailing column declared with kind action when one exists; otherwise a button-hugging 24px by 16px medium-elevation surface floats at the visible scrollport's header edge so the action remains reachable while member columns scroll beneath it. With stickyHeader enabled, each contained section uses its one real section row as a native sticky header inside its real row-group boundary. The browser therefore owns pinning, push-off, scrolling, and resize layout in one pass without a duplicated lane, active-section state, transforms, or scroll-time geometry. Shared grid tracks retain exact header and member-cell alignment. The section surface also stays pinned to the visible horizontal scrollport and spans the smaller of the visible viewport or table width. Virtual grouped tables flatten headers and members into that same scrollport; expanding a section never introduces an inner scroller.",
9356
9476
  "When columnCustomizer is false, columns render in catalog order. When it is true, columns remains the catalog: hiddenColumnIds and columnOrder control visibility and data-column sequence, action columns stay last, cannot be hidden, and remain absent from the customizer Menu, and dsColumnsConfigChange reports the next hidden ids and data-column order without mutating those inputs. The customizer Menu live-applies show/hide and data-column reorder. The table does not persist preferences.",
9357
9477
  "An active member sort toggles only between ascending and descending; activating a different sortable label moves the one sorting state to that key. Applications may still clear the controlled sort state explicitly. Grouping does not introduce another interactive direction.",
9358
9478
  "Compound headers can expose multiple related labels with independent sort keys. Each label owns only its content-width interaction target while the active direction remains in the column's alignment-aware sort lane.",
@@ -9361,7 +9481,8 @@
9361
9481
  "When pagination enables Fit to page on a bounded table, the table proposes the number of complete top-level rows that fit below its column header. Grouped tables count group headers only; member rows never affect capacity. Selecting Fit captures that numeric snapshot. A changed fitIdentity requests one fresh snapshot for a new query shape, while viewport resizing alone does not change the active controlled page size.",
9362
9482
  "Rows opt into complete-row activation with interactive and emit dsRowActivate without owning navigation. Selection paints through the shared selected ::before layer; interactive hover and press paint through the shared ::after layer.",
9363
9483
  "Row selection owns the single sticky start lane. One explicitly sized application column can own the sticky end lane, or the start lane when selection is absent. Each sticky boundary owns one fixed divider and a row-clipped directional shadow that paints into the adjacent scrolling columns only while more inline content remains beyond that edge.",
9364
- "Cells accept scalar content, standard primary-and-secondary or dual-primary text primitives, declarative Tag, wrapping multiple-Tag content, icon-only, icon-and-text, 16:9 Image, or ButtonUnfilled Action content, or explicit Empty and Blank absence values. Text objects may declare an optional href (and target) on the primary track only; the table renders a native anchor with the shared brand text-action treatment when the URL is safe, and leaves scalars unlinked. Standard secondary copy defaults to the secondary foreground and may declare a semantic Text color when the application data carries intent; an optional tertiary track uses the same subdued body-small recipe as secondary. Secondary and tertiary may also be a short list of colorable runs, rendered on one line with the table's middle-dot separator. Dual-primary copy keeps both tracks primary unless explicitly colored and does not gain a tertiary track. Body data cells share 8px outer padding; header and group rows keep their own geometry. Text tracks, including Empty, keep 4px inline padding so copy lines up with column-header labels; Tag and icon-only tracks stay on the 8px cell chrome alone. Icon-and-text cells (`kind: 'icon-text'`) place one md prefix icon beside the same copy stack as a text cell. The icon slot takes 2px padding on every side, then a 2px flex gap before the copy; text-track padding stays on the copy. Omit iconLabel when the glyph is decorative. 20px content (body-medium text, md icon, and the row checkbox) sits in a 24px track so it stays optically aligned with 24px Tag and Action content. Single-track text, selection, tag-only, icon-only, icon-and-text, Action, Empty, Blank, and 1-track Image cells resolve a 40px base contract while two-track cells grow to 62px and three-track cells grow to 84px. Every later track adds 22px, so four tracks resolve to 106px, five to 128px, and the sequence may continue. Tracks stack with a 2px gap. Wrapping primary on a 1-track cell uses that same rhythm: two wrapped lines share the 62px row and three wrapped lines share the 84px row. Wrapping secondary keeps primary on the first track and consumes later tracks: two secondary lines share the 84px row and three secondary lines share a 106px fourth track. Keep the same track count in every row of a table or group when those rows should share one height. Tag cells use the inset Tag recipe: md double-inset is a 24px control for tag-only and tag-with-text, while text-with-tag uses sm single-inset at 20px so the second-track pill fills the body-small slot. Multiple-Tag cells use `kind: 'tags'`, a positive `tracks` count, and small single-inset Tags that wrap naturally at the column edge. Their 2px block inset creates the 24px first track and each later wrapped line adds a 20px track plus the shared 2px gap. The tallest cell establishes the native row height, so all sibling cells match even at four, five, or more tracks; virtual tables use the declared count as the initial estimate and measure responsive wrapping after paint. Action cells primarily use an icon-only Ellipses treatment, render a 24px small ButtonUnfilled, default to unbordered, and emit row, column, and action identities through dsCellAction. When an action cell declares items, that Ellipses trigger opens the shared ds-menu for commands, dividers, inactive rows, and destructive rows instead of emitting on click; choosing a command emits dsCellAction with that item's actionId. Omit items to keep a single-shot control. Image cells declare tracks 1, 2, or 3 so the 16:9 bordered preview fills that body-row content box (cell height minus 8px padding) and the column hugs the resulting width; omit tracks for the 1-track recipe, and keep image tracks aligned with the other cells in the table or group. Image cells fall back to an accessible placeholder when no source is supplied. Empty means the data applies but has no value and renders an em dash with localized assistive text; Blank means the data is not applicable and renders no content. Nullish values remain backward-compatible Empty values. Stable type, variant, and track-count hooks keep every cell family independently styleable.",
9484
+ "Cells accept scalar content, standard primary-and-secondary or dual-primary text primitives, declarative Tag, wrapping multiple-Tag content, icon-only, icon-and-text, 16:9 Image, or ButtonUnfilled Action content, or explicit Empty and Blank absence values. Text objects may declare an optional href (and target) on the primary track only; the table renders a native anchor with the shared brand text-action treatment when the URL is safe, and leaves scalars unlinked. Standard secondary copy defaults to the secondary foreground and may declare a semantic Text color when the application data carries intent; an optional tertiary track uses the same subdued body-small recipe as secondary. Secondary and tertiary may also be a short list of colorable runs, rendered on one line with the table's middle-dot separator. A run may supply help to add the shared dotted underline and a bottom-start Tooltip when compact visible copy summarizes supplementary details; explicit line breaks create a compact unbulleted list without obscuring the current cell's earlier tracks. Dual-primary copy keeps both tracks primary unless explicitly colored and does not gain a tertiary track. Body data cells share 8px outer padding; header and group rows keep their own geometry. Text tracks, including Empty, keep 4px inline padding so copy lines up with column-header labels; Tag and icon-only tracks stay on the 8px cell chrome alone. Icon-and-text cells (`kind: 'icon-text'`) place one md prefix icon beside the same copy stack as a text cell. The icon slot takes 2px padding on every side, then a 2px flex gap before the copy; text-track padding stays on the copy. Omit iconLabel when the glyph is decorative. 20px content (body-medium text, md icon, and the row checkbox) sits in a 24px track so it stays optically aligned with 24px Tag and Action content. Single-track text, selection, tag-only, icon-only, icon-and-text, Action, Empty, Blank, and 1-track Image cells resolve a 40px base contract while two-track cells grow to 64px and three-track cells grow to 88px. Every later track adds 24px, so four tracks resolve to 112px, five to 136px, and the sequence may continue. Tracks stack with no gap. Wrapping primary on a 1-track cell uses that same rhythm: two wrapped lines share the 64px row and three wrapped lines share the 88px row. Wrapping secondary keeps primary on the first track and consumes later tracks: two secondary lines share the 88px row and three secondary lines share a 112px fourth track. Keep the same track count in every row of a table or group when those rows should share one height. Tag cells use the inset Tag recipe: md double-inset is a 24px control for tag-only and tag-with-text, while text-with-tag uses sm single-inset at 20px so the second-track pill sits in the same 24px lane. Multiple-Tag cells use `kind: 'tags'`, a positive `tracks` count, and small single-inset Tags that wrap naturally at the column edge. Each wrap line is a 24px track with no stack gap, matching text. The tallest cell establishes the native row height, so all sibling cells match even at four, five, or more tracks; virtual tables use the declared count as the initial estimate and measure responsive wrapping after paint. Action cells primarily use an icon-only Ellipses treatment, render a 24px small ButtonUnfilled, default to unbordered, and emit row, column, and action identities through dsCellAction. When an action cell declares items, that Ellipses trigger opens the shared ds-menu for commands, dividers, inactive rows, and destructive rows instead of emitting on click; choosing a command emits dsCellAction with that item's actionId. Omit items to keep a single-shot control. Image cells declare tracks 1, 2, or 3 so the 16:9 bordered preview fills that body-row content box (cell height minus 8px padding) and the column hugs the resulting width; omit tracks for the 1-track recipe, and keep image tracks aligned with the other cells in the table or group. Image cells fall back to an accessible placeholder when no source is supplied. Empty means the data applies but has no value and renders an em dash with localized assistive text; Blank means the data is not applicable and renders no content. Nullish values remain backward-compatible Empty values. Stable type, variant, and track-count hooks keep every cell family independently styleable.",
9485
+ "Score-and-text cells (`kind: score-text`) place the small 24px safety score at the top-right of the cell while the same one-, two-, or three-track copy stack as a standard text cell fills from the start edge. The score is top-aligned with the first text track, adds no inner padding, and defaults its accessible name prefix to Safety score. Score-and-text loading geometry uses the matching small score skeleton and declared copy tracks.",
9365
9486
  "The public @ds-mo/ui/table.css export is the authoritative zero-specificity visual recipe. Override its --ds-table-* properties or target its stable element classes for product-specific styling."
9366
9487
  ],
9367
9488
  "responsiveBehavior": [
@@ -9372,8 +9493,8 @@
9372
9493
  "Without maxHeight the table grows the document and automatic lazy loading observes the browser viewport. Horizontal scrolling chains vertical wheel and trackpad movement to the page instead of trapping it.",
9373
9494
  "Explicit column sizes establish the horizontal overflow width; unsized columns share remaining space. When every visible data column is explicitly sized, one internal presentational spacer absorbs unused inline space without stretching the final data column and collapses to zero when those widths introduce horizontal overflow. The spacer sits before trailing action and sticky-end lanes so those controls remain at the visible edge. Set imageTracks on an image column to derive its fixed width from the matching 1-, 2-, or 3-track 16:9 image geometry plus table cell padding instead of copying a numeric width.",
9374
9495
  "Prefer the named xs through xl column sizes, which resolve through TokoMo's table-column width tokens; numeric pixel sizes remain an escape hatch for exceptional application-owned widths.",
9375
- "Column headers use one 32px geometry. Body rows use a 40px single-track minimum with shared 8px cell padding; every additional track adds 22px and grows the complete native row so sibling cells match. Image previews fill the same content box as their declared track count. Wrapping multiple-Tag cells may declare any positive track count. The second text track and the third text track share one subdued body-small recipe so line 3 lines up with line 2.",
9376
- "Long content truncates to one line by default. Hover (or keyboard-focus a primary link) shows the omitted value in one table-owned tooltip when that track overflows. maxLines 2 or 3 wrap onto the named 2-track and 3-track row heights, then ellipsize with the same tooltip. wrap: true remains unlimited and does not show a truncation tooltip. Wrapping 1-track primary occupies the named 2-track and 3-track row heights instead of a private line-height scale. Wrapping secondary on a 2-track cell occupies the named 3-track row and a 106px fourth track for three lines."
9496
+ "Column headers use one 32px geometry. Body rows use a 40px single-track minimum with shared 8px cell padding; every additional track adds 24px and grows the complete native row so sibling cells match. Image previews fill the same content box as their declared track count. Wrapping multiple-Tag cells may declare any positive track count. The second text track and the third text track share one subdued body-small recipe so line 3 lines up with line 2.",
9497
+ "Long content truncates to one line by default. Hover (or keyboard-focus a primary link) shows the omitted value in one table-owned tooltip when that track overflows. maxLines 2 or 3 wrap onto the named 2-track and 3-track row heights, then ellipsize with the same tooltip. wrap: true remains unlimited and does not show a truncation tooltip. Wrapping 1-track primary occupies the named 2-track and 3-track row heights instead of a private line-height scale. Wrapping secondary on a 2-track cell occupies the named 3-track row and a 112px fourth track for three lines."
9377
9498
  ],
9378
9499
  "frameworkCaveats": {
9379
9500
  "customElements": [
@@ -9714,6 +9835,7 @@
9714
9835
  "loader",
9715
9836
  "menu",
9716
9837
  "pagination",
9838
+ "score",
9717
9839
  "skeleton",
9718
9840
  "tag",
9719
9841
  "text",
@@ -9900,7 +10022,7 @@
9900
10022
  {
9901
10023
  "name": "table-group",
9902
10024
  "title": "TableGroup",
9903
- "description": "Two-panel toolbar control for choosing one table grouping data point and the ascending or descending order of its group sections.",
10025
+ "description": "Two-panel toolbar control for choosing one table grouping data point and the order of its group sections.",
9904
10026
  "type": "registry:ui",
9905
10027
  "meta": {
9906
10028
  "library": "@ds-mo/ui",
@@ -9911,7 +10033,7 @@
9911
10033
  "intent": {
9912
10034
  "audience": "general",
9913
10035
  "status": "stable",
9914
- "summary": "Two-panel toolbar control for choosing one table grouping data point and the ascending or descending order of its group sections.",
10036
+ "summary": "Two-panel toolbar control for choosing one table grouping data point and the order of its group sections.",
9915
10037
  "useWhen": [
9916
10038
  "A table toolbar needs explicit control of one grouping level and its section order.",
9917
10039
  "Grouping data-point labels differ from compact table-header labels."
@@ -9942,8 +10064,8 @@
9942
10064
  "The right pane remains present before a group is active as one complete empty state without the Order heading, and explains that a group must be selected."
9943
10065
  ],
9944
10066
  "states": [
9945
- "options and grouping are controlled. dsGroupChange reports a complete TableGroupingState and dsClear requests null grouping without mutating either input.",
9946
- "Selecting a new data point starts its order at ascending. Re-selecting the active data point preserves its direction.",
10067
+ "options and grouping are controlled. A data option may supply product-owned orderOptions; otherwise Order defaults to Ascending and Descending. dsGroupChange reports a complete TableGroupingState and dsClear requests null grouping without mutating either input.",
10068
+ "Selecting a new data point starts at its first custom order option, or ascending when it has no custom order options. Re-selecting the active data point preserves its complete order state.",
9947
10069
  "Selecting a data point or direction applies immediately and leaves the dialog open so the other pane can be changed."
9948
10070
  ],
9949
10071
  "responsiveBehavior": [
@@ -10872,6 +10994,217 @@
10872
10994
  ],
10873
10995
  "registryDependencies": []
10874
10996
  },
10997
+ {
10998
+ "name": "textarea",
10999
+ "title": "Textarea",
11000
+ "description": "Form-associated multiline text control with shared Input density, focus, validation, and field-composition behavior.",
11001
+ "type": "registry:ui",
11002
+ "meta": {
11003
+ "library": "@ds-mo/ui",
11004
+ "distribution": "npm",
11005
+ "storybook": "https://zainadeel.github.io/compomo/?path=/story/textarea",
11006
+ "source": "src/wc/components/Textarea/Textarea.tsx",
11007
+ "intentStatus": "complete",
11008
+ "intent": {
11009
+ "audience": "general",
11010
+ "status": "experimental",
11011
+ "summary": "Form-associated multiline text control with shared Input density, focus, validation, and field-composition behavior.",
11012
+ "useWhen": [
11013
+ "A person needs to enter freeform text that may span several lines.",
11014
+ "Notes, descriptions, comments, or explanations need native multiline editing and form submission.",
11015
+ "A multiline control must compose with Field for its visible label, guidance, and error presentation."
11016
+ ],
11017
+ "avoidWhen": [
11018
+ "The value is predictably one line; use Input instead.",
11019
+ "The content is a conversational prompt with submit, stop, and tool actions; use MessageComposer instead.",
11020
+ "The interface needs rich-text formatting, mentions, or structured blocks."
11021
+ ],
11022
+ "alternatives": [
11023
+ {
11024
+ "when": "The value is predictably one line.",
11025
+ "component": "component:ds-input",
11026
+ "reason": "Input supplies single-line semantics, adornments, search clearing, and numeric stepping."
11027
+ },
11028
+ {
11029
+ "when": "The field is a conversational prompt with submission actions.",
11030
+ "component": "component:ds-message-composer",
11031
+ "reason": "MessageComposer owns chat-specific growth, submission, stop, tools, and recovery behavior."
11032
+ }
11033
+ ],
11034
+ "commonlyComposedWith": [
11035
+ "component:ds-field",
11036
+ "component:ds-text"
11037
+ ],
11038
+ "accessibility": [
11039
+ "Give every Textarea an accessible name, preferably by wrapping it in Field with a persistent visible label.",
11040
+ "Use description text for lasting guidance; placeholder text is an example or short prompt, not a label.",
11041
+ "Required validation uses the native form contract and can provide a localized requiredMessage.",
11042
+ "Read-only text remains focusable and submittable; inactive text is unavailable and omitted from form submission.",
11043
+ "When Textarea renders its own errorMessage, it merges that message ID with authored aria-describedby references."
11044
+ ],
11045
+ "states": [
11046
+ "Textarea exposes data-filled, data-focused, data-dirty, data-touched, data-invalid, data-disabled, data-readonly, and data-required state hooks.",
11047
+ "The default four visible rows can be changed with rows; rows is clamped to at least one.",
11048
+ "Vertical resizing is enabled by default and can be disabled when the surrounding layout owns the field height.",
11049
+ "Size changes typography and inset spacing without changing the authored row count.",
11050
+ "Border, focus, error, placeholder, inactive, hover, and pressed treatments follow the same shared recipes as Input."
11051
+ ],
11052
+ "responsiveBehavior": [
11053
+ "Textarea fills its parent by default and follows the width supplied by Field or the form layout.",
11054
+ "The native value wraps within the available width and scrolls when its content exceeds the visible rows.",
11055
+ "Use width hug only in intrinsically sized layouts with an explicit surrounding constraint."
11056
+ ],
11057
+ "frameworkCaveats": {
11058
+ "customElements": [
11059
+ "Listen for dsChange; its detail is the complete current string value.",
11060
+ "Set value through the component property for controlled updates and use setFocus() for imperative focus."
11061
+ ],
11062
+ "react": [
11063
+ "Use the generated Textarea adapter and read the full string from the dsChange detail."
11064
+ ],
11065
+ "angular": [
11066
+ "Use the generated Textarea adapter with its text value accessor for form bindings."
11067
+ ]
11068
+ },
11069
+ "references": [
11070
+ {
11071
+ "label": "Storybook examples",
11072
+ "path": "src/wc/components/Textarea/Textarea.stories.ts"
11073
+ },
11074
+ {
11075
+ "label": "Cross-browser form and accessibility coverage",
11076
+ "path": "tests/e2e/forms.spec.ts"
11077
+ }
11078
+ ]
11079
+ },
11080
+ "props": {
11081
+ "ariaDescribedby": {
11082
+ "type": "string | undefined",
11083
+ "required": false
11084
+ },
11085
+ "ariaLabel": {
11086
+ "type": "string | null",
11087
+ "required": false
11088
+ },
11089
+ "ariaLabelledby": {
11090
+ "type": "string | undefined",
11091
+ "required": false
11092
+ },
11093
+ "autoComplete": {
11094
+ "type": "string | undefined",
11095
+ "required": false
11096
+ },
11097
+ "autoFocus": {
11098
+ "type": "boolean",
11099
+ "required": false
11100
+ },
11101
+ "disabled": {
11102
+ "type": "boolean",
11103
+ "required": false
11104
+ },
11105
+ "enterKeyHint": {
11106
+ "type": "string",
11107
+ "required": false
11108
+ },
11109
+ "error": {
11110
+ "type": "boolean",
11111
+ "required": false
11112
+ },
11113
+ "errorMessage": {
11114
+ "type": "string | undefined",
11115
+ "required": false
11116
+ },
11117
+ "form": {
11118
+ "type": "string | undefined",
11119
+ "required": false
11120
+ },
11121
+ "hasBorder": {
11122
+ "type": "boolean",
11123
+ "required": false
11124
+ },
11125
+ "hasInteractionFill": {
11126
+ "type": "boolean",
11127
+ "required": false
11128
+ },
11129
+ "inputId": {
11130
+ "type": "string | undefined",
11131
+ "required": false
11132
+ },
11133
+ "inputMode": {
11134
+ "type": "string",
11135
+ "required": false
11136
+ },
11137
+ "isInactive": {
11138
+ "type": "boolean",
11139
+ "required": false
11140
+ },
11141
+ "name": {
11142
+ "type": "string | undefined",
11143
+ "required": false
11144
+ },
11145
+ "placeholder": {
11146
+ "type": "string | undefined",
11147
+ "required": false
11148
+ },
11149
+ "readOnly": {
11150
+ "type": "boolean",
11151
+ "required": false
11152
+ },
11153
+ "required": {
11154
+ "type": "boolean",
11155
+ "required": false
11156
+ },
11157
+ "requiredMessage": {
11158
+ "type": "string",
11159
+ "required": false
11160
+ },
11161
+ "resize": {
11162
+ "type": "TextareaResize",
11163
+ "required": false
11164
+ },
11165
+ "rows": {
11166
+ "type": "number",
11167
+ "required": false
11168
+ },
11169
+ "size": {
11170
+ "type": "TextareaSize",
11171
+ "required": false
11172
+ },
11173
+ "spellCheck": {
11174
+ "type": "boolean",
11175
+ "required": false
11176
+ },
11177
+ "value": {
11178
+ "type": "string",
11179
+ "required": false
11180
+ },
11181
+ "width": {
11182
+ "type": "TextareaWidth",
11183
+ "required": false
11184
+ }
11185
+ },
11186
+ "events": [
11187
+ {
11188
+ "name": "dsChange",
11189
+ "detail": "string"
11190
+ }
11191
+ ],
11192
+ "slots": [],
11193
+ "exports": {
11194
+ "customElement": "ds-textarea",
11195
+ "react": "DsTextarea",
11196
+ "vue": "DsTextarea",
11197
+ "angular": "DsTextarea"
11198
+ }
11199
+ },
11200
+ "dependencies": [
11201
+ "@ds-mo/ui",
11202
+ "@ds-mo/tokens"
11203
+ ],
11204
+ "registryDependencies": [
11205
+ "text"
11206
+ ]
11207
+ },
10875
11208
  {
10876
11209
  "name": "toast",
10877
11210
  "title": "Toast",
@@ -11107,7 +11440,7 @@
11107
11440
  "responsiveBehavior": [
11108
11441
  "The portaled popup follows trigger and popup resize, viewport resize, and nested scrolling while open.",
11109
11442
  "Touch users rely on the trigger's accessible and visible context rather than tooltip disclosure.",
11110
- "Keep labels concise and non-wrapping by default; omitted table cell values may wrap at panel-xs."
11443
+ "Keep labels concise and non-wrapping by default; wrapLabel allows panel-xs wrapping and preserves explicit line breaks for compact, non-interactive lists."
11111
11444
  ],
11112
11445
  "frameworkCaveats": {
11113
11446
  "customElements": [