@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
@@ -1 +1 @@
1
- {"schemaVersion":1,"package":"@ds-mo/ui","version":"14.25.0","components":77,"digest":"f1a7aa473f373792c783db432b2f12160c7403108897991076ee1fc0412b6863","completedAt":"2026-09-02T01:26:05.059Z"}
1
+ {"schemaVersion":1,"package":"@ds-mo/ui","version":"14.27.0","components":79,"digest":"3f4a2aa3da16b2566ef7fbfbe59b6f6f9c44162f372b7a15ddd5e32a8eec04ff","completedAt":"2026-09-03T01:43:04.704Z"}
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "schemaVersion": "1.0.0",
3
3
  "package": "@ds-mo/ui",
4
- "packageVersion": "14.25.0",
4
+ "packageVersion": "14.27.0",
5
5
  "kind": "patterns",
6
6
  "entries": [
7
7
  {
package/dist/agent.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "schemaVersion": "1.0.0",
3
3
  "package": "@ds-mo/ui",
4
- "packageVersion": "14.25.0",
4
+ "packageVersion": "14.27.0",
5
5
  "kind": "components",
6
6
  "entries": [
7
7
  {
@@ -2353,6 +2353,7 @@
2353
2353
  }
2354
2354
  ],
2355
2355
  "commonlyComposedWith": [
2356
+ "component:ds-score",
2356
2357
  "component:ds-select",
2357
2358
  "component:ds-button-unfilled",
2358
2359
  "component:ds-text",
@@ -2370,11 +2371,11 @@
2370
2371
  "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.",
2371
2372
  "Omit a trend when there is nothing to report; resolveMetricTrend returns null in that case so no zero change is rendered.",
2372
2373
  "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.",
2373
- "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.",
2374
+ "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.",
2374
2375
  "At most seven measures are shown. Keep larger collections outside the summary bar rather than turning it into a dense dashboard.",
2375
2376
  "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.",
2376
2377
  "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.",
2377
- "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.",
2378
+ "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.",
2378
2379
  "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.",
2379
2380
  "compact is exactly 48px high and renders only the reporting bar. It omits Score, measures, and footer."
2380
2381
  ],
@@ -2483,6 +2484,7 @@
2483
2484
  "@ds-mo/tokens"
2484
2485
  ],
2485
2486
  "componentDependencies": [
2487
+ "score",
2486
2488
  "skeleton",
2487
2489
  "text",
2488
2490
  "tooltip"
@@ -3743,14 +3745,14 @@
3743
3745
  "tag": "ds-field",
3744
3746
  "name": "field",
3745
3747
  "title": "Field",
3746
- "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.",
3748
+ "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.",
3747
3749
  "intentStatus": "complete",
3748
3750
  "intent": {
3749
3751
  "audience": "general",
3750
3752
  "status": "stable",
3751
- "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.",
3753
+ "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.",
3752
3754
  "useWhen": [
3753
- "An Input or Select needs a persistent visible label in a form.",
3755
+ "An Input, Textarea, or Select needs a persistent visible label in a form.",
3754
3756
  "Help text or an error message must be programmatically associated with one control.",
3755
3757
  "A form layout needs one consistent label-control-message rhythm."
3756
3758
  ],
@@ -3768,6 +3770,7 @@
3768
3770
  ],
3769
3771
  "commonlyComposedWith": [
3770
3772
  "component:ds-input",
3773
+ "component:ds-textarea",
3771
3774
  "component:ds-select",
3772
3775
  "component:ds-text"
3773
3776
  ],
@@ -3795,7 +3798,7 @@
3795
3798
  "Assign child component values and option arrays through their normal JavaScript properties."
3796
3799
  ],
3797
3800
  "react": [
3798
- "Compose one DsInput or DsSelect child and control validation timing in the form owner."
3801
+ "Compose one DsInput, DsTextarea, or DsSelect child and control validation timing in the form owner."
3799
3802
  ],
3800
3803
  "angular": [
3801
3804
  "Compose the generated Field adapter around the control adapter and its matching Angular value accessor."
@@ -6237,6 +6240,7 @@
6237
6240
  "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.",
6238
6241
  "While one parent is expanded in nested presentation, other top-level destinations retain secondary foreground; flat and collapsed presentations keep their existing foreground treatment.",
6239
6242
  "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.",
6243
+ "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.",
6240
6244
  "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.",
6241
6245
  "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.",
6242
6246
  "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.",
@@ -7277,6 +7281,118 @@
7277
7281
  "text"
7278
7282
  ]
7279
7283
  },
7284
+ {
7285
+ "id": "component:ds-score",
7286
+ "tag": "ds-score",
7287
+ "name": "score",
7288
+ "title": "Score",
7289
+ "summary": "Safety-score figure in a semantic fill at the three control densities.",
7290
+ "intentStatus": "complete",
7291
+ "intent": {
7292
+ "audience": "general",
7293
+ "status": "experimental",
7294
+ "summary": "Safety-score figure in a semantic fill at the three control densities.",
7295
+ "useWhen": [
7296
+ "A driver or fleet safety score needs its fair, good, or excellent fill and the numeric figure in one place.",
7297
+ "The same score treatment appears in Card Overview, an in-card summary, or a compact row such as a table group header."
7298
+ ],
7299
+ "avoidWhen": [
7300
+ "The figure is an ordinary metric without a safety-score color band; use Text.",
7301
+ "The score is one cell in a comparable measures grid that also needs period chrome; use CardOverview, which composes Score.",
7302
+ "The mark is a notification count or status label; use Badge or Tag.",
7303
+ "A comparison trend should sit beside the fill; keep trend in the owner. Card Overview already renders score trend in its copy column."
7304
+ ],
7305
+ "alternatives": [
7306
+ {
7307
+ "when": "The figure is one of several comparable measures under a shared period bar.",
7308
+ "component": "component:ds-card-overview",
7309
+ "reason": "CardOverview owns the summary grid, period chrome, score-cell alignment, and score trend; it renders Score at lg for the fill."
7310
+ },
7311
+ {
7312
+ "when": "The quantity is ordinary readable content without a safety-score fill.",
7313
+ "component": "component:ds-text",
7314
+ "reason": "Text preserves the figure as body content."
7315
+ },
7316
+ {
7317
+ "when": "The compact mark is unread count or notification presence.",
7318
+ "component": "component:ds-badge",
7319
+ "reason": "Badge owns supplemental notification chrome, not a scored figure."
7320
+ }
7321
+ ],
7322
+ "commonlyComposedWith": [
7323
+ "component:ds-card-overview",
7324
+ "component:ds-table",
7325
+ "component:ds-text",
7326
+ "component:ds-skeleton"
7327
+ ],
7328
+ "accessibility": [
7329
+ "Set label when the atomic score graphic needs a spoken prefix such as Safety score; the visible number remains in the fill.",
7330
+ "Colour never carries score meaning alone; the numeric figure stays visible inside the fill.",
7331
+ "Score is not interactive and is not a tab stop.",
7332
+ "While loading, the host exposes a busy state and a skeleton whose type metrics match the resolved size."
7333
+ ],
7334
+ "states": [
7335
+ "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.",
7336
+ "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.",
7337
+ "The fill uses the safety-score background and keeps its foreground at AA text contrast in light and dark themes.",
7338
+ "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."
7339
+ ],
7340
+ "responsiveBehavior": [
7341
+ "The owner selects sm, md, or lg to match the local layout. Score does not change size at breakpoints.",
7342
+ "sm is the density for table group headers. md is the in-card summary fill. lg is the Card Overview fill."
7343
+ ],
7344
+ "references": [
7345
+ {
7346
+ "label": "Storybook examples",
7347
+ "path": "src/wc/components/Score/Score.stories.ts"
7348
+ },
7349
+ {
7350
+ "label": "Safety-score level unit coverage",
7351
+ "path": "tests/score-model.test.ts"
7352
+ }
7353
+ ]
7354
+ },
7355
+ "api": {
7356
+ "props": {
7357
+ "isLoading": {
7358
+ "type": "boolean",
7359
+ "required": false
7360
+ },
7361
+ "label": {
7362
+ "type": "string",
7363
+ "required": false
7364
+ },
7365
+ "level": {
7366
+ "type": "SafetyScoreLevel | undefined",
7367
+ "required": false
7368
+ },
7369
+ "size": {
7370
+ "type": "ScoreSize",
7371
+ "required": false
7372
+ },
7373
+ "value": {
7374
+ "type": "string | number",
7375
+ "required": false
7376
+ }
7377
+ },
7378
+ "events": [],
7379
+ "slots": []
7380
+ },
7381
+ "exports": {
7382
+ "customElement": "ds-score",
7383
+ "react": "DsScore",
7384
+ "vue": "DsScore",
7385
+ "angular": "DsScore"
7386
+ },
7387
+ "dependencies": [
7388
+ "@ds-mo/ui",
7389
+ "@ds-mo/tokens"
7390
+ ],
7391
+ "componentDependencies": [
7392
+ "skeleton",
7393
+ "text"
7394
+ ]
7395
+ },
7280
7396
  {
7281
7397
  "id": "component:ds-scroll-overlay",
7282
7398
  "tag": "ds-scroll-overlay",
@@ -9121,6 +9237,7 @@
9121
9237
  "component:ds-menu",
9122
9238
  "component:ds-tooltip",
9123
9239
  "component:ds-tag",
9240
+ "component:ds-score",
9124
9241
  "component:ds-icon"
9125
9242
  ],
9126
9243
  "patterns": [
@@ -9140,7 +9257,7 @@
9140
9257
  ],
9141
9258
  "states": [
9142
9259
  "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.",
9143
- "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.",
9260
+ "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.",
9144
9261
  "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.",
9145
9262
  "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.",
9146
9263
  "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.",
@@ -9149,7 +9266,8 @@
9149
9266
  "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.",
9150
9267
  "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.",
9151
9268
  "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.",
9152
- "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.",
9269
+ "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.",
9270
+ "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.",
9153
9271
  "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."
9154
9272
  ],
9155
9273
  "responsiveBehavior": [
@@ -9160,8 +9278,8 @@
9160
9278
  "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.",
9161
9279
  "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.",
9162
9280
  "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.",
9163
- "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.",
9164
- "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."
9281
+ "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.",
9282
+ "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."
9165
9283
  ],
9166
9284
  "frameworkCaveats": {
9167
9285
  "customElements": [
@@ -9503,6 +9621,7 @@
9503
9621
  "loader",
9504
9622
  "menu",
9505
9623
  "pagination",
9624
+ "score",
9506
9625
  "skeleton",
9507
9626
  "tag",
9508
9627
  "text",
@@ -9688,12 +9807,12 @@
9688
9807
  "tag": "ds-table-group",
9689
9808
  "name": "table-group",
9690
9809
  "title": "TableGroup",
9691
- "summary": "Two-panel toolbar control for choosing one table grouping data point and the ascending or descending order of its group sections.",
9810
+ "summary": "Two-panel toolbar control for choosing one table grouping data point and the order of its group sections.",
9692
9811
  "intentStatus": "complete",
9693
9812
  "intent": {
9694
9813
  "audience": "general",
9695
9814
  "status": "stable",
9696
- "summary": "Two-panel toolbar control for choosing one table grouping data point and the ascending or descending order of its group sections.",
9815
+ "summary": "Two-panel toolbar control for choosing one table grouping data point and the order of its group sections.",
9697
9816
  "useWhen": [
9698
9817
  "A table toolbar needs explicit control of one grouping level and its section order.",
9699
9818
  "Grouping data-point labels differ from compact table-header labels."
@@ -9724,8 +9843,8 @@
9724
9843
  "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."
9725
9844
  ],
9726
9845
  "states": [
9727
- "options and grouping are controlled. dsGroupChange reports a complete TableGroupingState and dsClear requests null grouping without mutating either input.",
9728
- "Selecting a new data point starts its order at ascending. Re-selecting the active data point preserves its direction.",
9846
+ "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.",
9847
+ "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.",
9729
9848
  "Selecting a data point or direction applies immediately and leaves the dialog open so the other pane can be changed."
9730
9849
  ],
9731
9850
  "responsiveBehavior": [
@@ -10637,6 +10756,214 @@
10637
10756
  ],
10638
10757
  "componentDependencies": []
10639
10758
  },
10759
+ {
10760
+ "id": "component:ds-textarea",
10761
+ "tag": "ds-textarea",
10762
+ "name": "textarea",
10763
+ "title": "Textarea",
10764
+ "summary": "Form-associated multiline text control with shared Input density, focus, validation, and field-composition behavior.",
10765
+ "intentStatus": "complete",
10766
+ "intent": {
10767
+ "audience": "general",
10768
+ "status": "experimental",
10769
+ "summary": "Form-associated multiline text control with shared Input density, focus, validation, and field-composition behavior.",
10770
+ "useWhen": [
10771
+ "A person needs to enter freeform text that may span several lines.",
10772
+ "Notes, descriptions, comments, or explanations need native multiline editing and form submission.",
10773
+ "A multiline control must compose with Field for its visible label, guidance, and error presentation."
10774
+ ],
10775
+ "avoidWhen": [
10776
+ "The value is predictably one line; use Input instead.",
10777
+ "The content is a conversational prompt with submit, stop, and tool actions; use MessageComposer instead.",
10778
+ "The interface needs rich-text formatting, mentions, or structured blocks."
10779
+ ],
10780
+ "alternatives": [
10781
+ {
10782
+ "when": "The value is predictably one line.",
10783
+ "component": "component:ds-input",
10784
+ "reason": "Input supplies single-line semantics, adornments, search clearing, and numeric stepping."
10785
+ },
10786
+ {
10787
+ "when": "The field is a conversational prompt with submission actions.",
10788
+ "component": "component:ds-message-composer",
10789
+ "reason": "MessageComposer owns chat-specific growth, submission, stop, tools, and recovery behavior."
10790
+ }
10791
+ ],
10792
+ "commonlyComposedWith": [
10793
+ "component:ds-field",
10794
+ "component:ds-text"
10795
+ ],
10796
+ "accessibility": [
10797
+ "Give every Textarea an accessible name, preferably by wrapping it in Field with a persistent visible label.",
10798
+ "Use description text for lasting guidance; placeholder text is an example or short prompt, not a label.",
10799
+ "Required validation uses the native form contract and can provide a localized requiredMessage.",
10800
+ "Read-only text remains focusable and submittable; inactive text is unavailable and omitted from form submission.",
10801
+ "When Textarea renders its own errorMessage, it merges that message ID with authored aria-describedby references."
10802
+ ],
10803
+ "states": [
10804
+ "Textarea exposes data-filled, data-focused, data-dirty, data-touched, data-invalid, data-disabled, data-readonly, and data-required state hooks.",
10805
+ "The default four visible rows can be changed with rows; rows is clamped to at least one.",
10806
+ "Vertical resizing is enabled by default and can be disabled when the surrounding layout owns the field height.",
10807
+ "Size changes typography and inset spacing without changing the authored row count.",
10808
+ "Border, focus, error, placeholder, inactive, hover, and pressed treatments follow the same shared recipes as Input."
10809
+ ],
10810
+ "responsiveBehavior": [
10811
+ "Textarea fills its parent by default and follows the width supplied by Field or the form layout.",
10812
+ "The native value wraps within the available width and scrolls when its content exceeds the visible rows.",
10813
+ "Use width hug only in intrinsically sized layouts with an explicit surrounding constraint."
10814
+ ],
10815
+ "frameworkCaveats": {
10816
+ "customElements": [
10817
+ "Listen for dsChange; its detail is the complete current string value.",
10818
+ "Set value through the component property for controlled updates and use setFocus() for imperative focus."
10819
+ ],
10820
+ "react": [
10821
+ "Use the generated Textarea adapter and read the full string from the dsChange detail."
10822
+ ],
10823
+ "angular": [
10824
+ "Use the generated Textarea adapter with its text value accessor for form bindings."
10825
+ ]
10826
+ },
10827
+ "references": [
10828
+ {
10829
+ "label": "Storybook examples",
10830
+ "path": "src/wc/components/Textarea/Textarea.stories.ts"
10831
+ },
10832
+ {
10833
+ "label": "Cross-browser form and accessibility coverage",
10834
+ "path": "tests/e2e/forms.spec.ts"
10835
+ }
10836
+ ]
10837
+ },
10838
+ "api": {
10839
+ "props": {
10840
+ "ariaDescribedby": {
10841
+ "type": "string | undefined",
10842
+ "required": false
10843
+ },
10844
+ "ariaLabel": {
10845
+ "type": "string | null",
10846
+ "required": false
10847
+ },
10848
+ "ariaLabelledby": {
10849
+ "type": "string | undefined",
10850
+ "required": false
10851
+ },
10852
+ "autoComplete": {
10853
+ "type": "string | undefined",
10854
+ "required": false
10855
+ },
10856
+ "autoFocus": {
10857
+ "type": "boolean",
10858
+ "required": false
10859
+ },
10860
+ "disabled": {
10861
+ "type": "boolean",
10862
+ "required": false
10863
+ },
10864
+ "enterKeyHint": {
10865
+ "type": "string",
10866
+ "required": false
10867
+ },
10868
+ "error": {
10869
+ "type": "boolean",
10870
+ "required": false
10871
+ },
10872
+ "errorMessage": {
10873
+ "type": "string | undefined",
10874
+ "required": false
10875
+ },
10876
+ "form": {
10877
+ "type": "string | undefined",
10878
+ "required": false
10879
+ },
10880
+ "hasBorder": {
10881
+ "type": "boolean",
10882
+ "required": false
10883
+ },
10884
+ "hasInteractionFill": {
10885
+ "type": "boolean",
10886
+ "required": false
10887
+ },
10888
+ "inputId": {
10889
+ "type": "string | undefined",
10890
+ "required": false
10891
+ },
10892
+ "inputMode": {
10893
+ "type": "string",
10894
+ "required": false
10895
+ },
10896
+ "isInactive": {
10897
+ "type": "boolean",
10898
+ "required": false
10899
+ },
10900
+ "name": {
10901
+ "type": "string | undefined",
10902
+ "required": false
10903
+ },
10904
+ "placeholder": {
10905
+ "type": "string | undefined",
10906
+ "required": false
10907
+ },
10908
+ "readOnly": {
10909
+ "type": "boolean",
10910
+ "required": false
10911
+ },
10912
+ "required": {
10913
+ "type": "boolean",
10914
+ "required": false
10915
+ },
10916
+ "requiredMessage": {
10917
+ "type": "string",
10918
+ "required": false
10919
+ },
10920
+ "resize": {
10921
+ "type": "TextareaResize",
10922
+ "required": false
10923
+ },
10924
+ "rows": {
10925
+ "type": "number",
10926
+ "required": false
10927
+ },
10928
+ "size": {
10929
+ "type": "TextareaSize",
10930
+ "required": false
10931
+ },
10932
+ "spellCheck": {
10933
+ "type": "boolean",
10934
+ "required": false
10935
+ },
10936
+ "value": {
10937
+ "type": "string",
10938
+ "required": false
10939
+ },
10940
+ "width": {
10941
+ "type": "TextareaWidth",
10942
+ "required": false
10943
+ }
10944
+ },
10945
+ "events": [
10946
+ {
10947
+ "name": "dsChange",
10948
+ "detail": "string"
10949
+ }
10950
+ ],
10951
+ "slots": []
10952
+ },
10953
+ "exports": {
10954
+ "customElement": "ds-textarea",
10955
+ "react": "DsTextarea",
10956
+ "vue": "DsTextarea",
10957
+ "angular": "DsTextarea"
10958
+ },
10959
+ "dependencies": [
10960
+ "@ds-mo/ui",
10961
+ "@ds-mo/tokens"
10962
+ ],
10963
+ "componentDependencies": [
10964
+ "text"
10965
+ ]
10966
+ },
10640
10967
  {
10641
10968
  "id": "component:ds-toast",
10642
10969
  "tag": "ds-toast",
@@ -10865,7 +11192,7 @@
10865
11192
  "responsiveBehavior": [
10866
11193
  "The portaled popup follows trigger and popup resize, viewport resize, and nested scrolling while open.",
10867
11194
  "Touch users rely on the trigger's accessible and visible context rather than tooltip disclosure.",
10868
- "Keep labels concise and non-wrapping by default; omitted table cell values may wrap at panel-xs."
11195
+ "Keep labels concise and non-wrapping by default; wrapLabel allows panel-xs wrapping and preserves explicit line breaks for compact, non-interactive lists."
10869
11196
  ],
10870
11197
  "frameworkCaveats": {
10871
11198
  "customElements": [
@@ -0,0 +1,12 @@
1
+ import { ChangeDetectorRef, ElementRef, NgZone } from '@angular/core';
2
+ import type { Components } from '@ds-mo/ui/components';
3
+ import * as i0 from "@angular/core";
4
+ export declare class DsScore {
5
+ protected z: NgZone;
6
+ protected el: HTMLDsScoreElement;
7
+ constructor(c: ChangeDetectorRef, r: ElementRef, z: NgZone);
8
+ static ɵfac: i0.ɵɵFactoryDeclaration<DsScore, never>;
9
+ static ɵcmp: i0.ɵɵComponentDeclaration<DsScore, "ds-score", never, { "isLoading": { "alias": "isLoading"; "required": false; }; "label": { "alias": "label"; "required": false; }; "level": { "alias": "level"; "required": false; }; "size": { "alias": "size"; "required": false; }; "value": { "alias": "value"; "required": false; }; }, {}, never, ["*"], true, never>;
10
+ }
11
+ export declare interface DsScore extends Components.DsScore {
12
+ }
@@ -0,0 +1,38 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ /* tslint:disable */
8
+ /* auto-generated angular directive proxies */
9
+ import { ChangeDetectionStrategy, Component } from '@angular/core';
10
+ import { ProxyCmp } from './angular-component-lib/utils.js';
11
+ import { defineCustomElement as defineDsScore } from '@ds-mo/ui/components/ds-score.js';
12
+ import * as i0 from "@angular/core";
13
+ let DsScore = class DsScore {
14
+ constructor(c, r, z) {
15
+ this.z = z;
16
+ c.detach();
17
+ this.el = r.nativeElement;
18
+ }
19
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.0", ngImport: i0, type: DsScore, deps: [{ token: i0.ChangeDetectorRef }, { token: i0.ElementRef }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Component }); }
20
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "22.1.0", type: DsScore, isStandalone: true, selector: "ds-score", inputs: { isLoading: "isLoading", label: "label", level: "level", size: "size", value: "value" }, ngImport: i0, template: '<ng-content></ng-content>', isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
21
+ };
22
+ DsScore = __decorate([
23
+ ProxyCmp({
24
+ defineCustomElementFn: defineDsScore,
25
+ inputs: ['isLoading', 'label', 'level', 'size', 'value']
26
+ })
27
+ ], DsScore);
28
+ export { DsScore };
29
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.0", ngImport: i0, type: DsScore, decorators: [{
30
+ type: Component,
31
+ args: [{
32
+ selector: 'ds-score',
33
+ changeDetection: ChangeDetectionStrategy.OnPush,
34
+ template: '<ng-content></ng-content>',
35
+ // eslint-disable-next-line @angular-eslint/no-inputs-metadata-property
36
+ inputs: ['isLoading', 'label', 'level', 'size', 'value'],
37
+ }]
38
+ }], ctorParameters: () => [{ type: i0.ChangeDetectorRef }, { type: i0.ElementRef }, { type: i0.NgZone }] });
@@ -0,0 +1,15 @@
1
+ import { ChangeDetectorRef, ElementRef, NgZone, EventEmitter } from '@angular/core';
2
+ import type { Components } from '@ds-mo/ui/components';
3
+ import type { DsTextareaCustomEvent } from '@ds-mo/ui/components';
4
+ import * as i0 from "@angular/core";
5
+ export declare class DsTextarea {
6
+ protected z: NgZone;
7
+ protected el: HTMLDsTextareaElement;
8
+ dsChange: EventEmitter<DsTextareaCustomEvent<string>>;
9
+ constructor(c: ChangeDetectorRef, r: ElementRef, z: NgZone);
10
+ static ɵfac: i0.ɵɵFactoryDeclaration<DsTextarea, never>;
11
+ static ɵcmp: i0.ɵɵComponentDeclaration<DsTextarea, "ds-textarea", never, { "ariaDescribedby": { "alias": "ariaDescribedby"; "required": false; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; }; "ariaLabelledby": { "alias": "ariaLabelledby"; "required": false; }; "autoComplete": { "alias": "autoComplete"; "required": false; }; "autoFocus": { "alias": "autoFocus"; "required": false; }; "disabled": { "alias": "disabled"; "required": false; }; "enterKeyHint": { "alias": "enterKeyHint"; "required": false; }; "error": { "alias": "error"; "required": false; }; "errorMessage": { "alias": "errorMessage"; "required": false; }; "form": { "alias": "form"; "required": false; }; "hasBorder": { "alias": "hasBorder"; "required": false; }; "hasInteractionFill": { "alias": "hasInteractionFill"; "required": false; }; "inputId": { "alias": "inputId"; "required": false; }; "inputMode": { "alias": "inputMode"; "required": false; }; "isInactive": { "alias": "isInactive"; "required": false; }; "name": { "alias": "name"; "required": false; }; "placeholder": { "alias": "placeholder"; "required": false; }; "readOnly": { "alias": "readOnly"; "required": false; }; "required": { "alias": "required"; "required": false; }; "requiredMessage": { "alias": "requiredMessage"; "required": false; }; "resize": { "alias": "resize"; "required": false; }; "rows": { "alias": "rows"; "required": false; }; "size": { "alias": "size"; "required": false; }; "spellCheck": { "alias": "spellCheck"; "required": false; }; "value": { "alias": "value"; "required": false; }; "width": { "alias": "width"; "required": false; }; }, { "dsChange": "dsChange"; }, never, ["*"], true, never>;
12
+ }
13
+ export declare interface DsTextarea extends Components.DsTextarea {
14
+ dsChange: EventEmitter<DsTextareaCustomEvent<string>>;
15
+ }