@ds-mo/ui 14.24.0 → 14.26.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 (219) hide show
  1. package/dist/.package-ready.json +1 -1
  2. package/dist/agent-patterns.json +1 -1
  3. package/dist/agent.json +341 -13
  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-saved-views.js +1 -1
  76. package/dist/components/ds-table-search.js +1 -1
  77. package/dist/components/ds-table-sort.js +1 -1
  78. package/dist/components/ds-table-toolbar.js +1 -1
  79. package/dist/components/ds-table.js +1 -1
  80. package/dist/components/ds-table.js.map +1 -1
  81. package/dist/components/ds-tag.js +1 -1
  82. package/dist/components/ds-text.js +1 -1
  83. package/dist/components/ds-textarea.d.ts +11 -0
  84. package/dist/components/ds-textarea.js +2 -0
  85. package/dist/components/ds-textarea.js.map +1 -0
  86. package/dist/components/ds-toast.js +1 -1
  87. package/dist/components/ds-tooltip-chart.js +1 -1
  88. package/dist/components/ds-tooltip.js +1 -1
  89. package/dist/components/ds-typing-indicator.js +1 -1
  90. package/dist/components/{p-DLaN9BPq.js → p-1604KY3B.js} +2 -2
  91. package/dist/components/{p-CYMKmJ2s.js → p-2wIPUcSL.js} +2 -2
  92. package/dist/components/{p-CEfxLsbX.js → p-537t6oRD.js} +2 -2
  93. package/dist/components/{p-kslioYhf.js → p-6_CNVbqa.js} +2 -2
  94. package/dist/components/{p-PXdvBMXB.js → p-B3Z5sQin.js} +2 -2
  95. package/dist/components/{p-CZjjDhUl.js → p-B3sRZBZk.js} +2 -2
  96. package/dist/components/{p-BZlhBJZL.js → p-B9esvbYk.js} +2 -2
  97. package/dist/components/{p-5Z4oYuiK.js → p-BEXkJ9lg.js} +2 -2
  98. package/dist/components/{p-DbLLH3hr.js → p-BIGpc__9.js} +2 -2
  99. package/dist/components/{p-DzPtYdXy.js → p-BMzn2Cmw.js} +2 -2
  100. package/dist/components/{p-BSRIF4m8.js → p-BRLDf-NK.js} +2 -2
  101. package/dist/components/{p-0X-4KGQf.js → p-BUh2GkPJ.js} +2 -2
  102. package/dist/components/{p-pUOA3iDG.js → p-BVpn_e-r.js} +2 -2
  103. package/dist/components/{p-CpeJMKJ5.js → p-BVz-r3g0.js} +2 -2
  104. package/dist/components/{p-CBymzuOO.js → p-BXDLR072.js} +2 -2
  105. package/dist/components/{p-DiS5BgLA.js → p-BZiGtBBk.js} +2 -2
  106. package/dist/components/{p-BcxidW9k.js → p-Bb9dA7sl.js} +2 -2
  107. package/dist/components/{p-BR1ayqMU.js → p-Bjt_8sLe.js} +2 -2
  108. package/dist/components/{p-BqbdABo3.js → p-BssZ4SbT.js} +2 -2
  109. package/dist/components/{p-bHnk8t5I.js → p-C68oSTb1.js} +2 -2
  110. package/dist/components/{p-C_FFU6W3.js → p-CGQnHNuW.js} +2 -2
  111. package/dist/components/{p-BqVXMEJm.js → p-CQjUOHiN.js} +2 -2
  112. package/dist/components/{p-w9fkkwL2.js → p-CaF5WCci.js} +2 -2
  113. package/dist/components/{p-Bjq1KP_Y.js → p-Cf5Ai4xx.js} +2 -2
  114. package/dist/components/{p-B0kSlcaw.js → p-Cr6pDY-e.js} +2 -2
  115. package/dist/components/{p-FxtgCvhA.js → p-Cy1oWIaV.js} +2 -2
  116. package/dist/components/{p-CTH3dSYg.js → p-DDqRCDXh.js} +2 -2
  117. package/dist/components/{p-x5u5Ueli.js → p-DIqAdmui.js} +2 -2
  118. package/dist/components/{p-Cd1JnnVK.js → p-DQQsS9Rx.js} +2 -2
  119. package/dist/components/{p-CZHIkVgj.js → p-DQsFmleZ.js} +2 -2
  120. package/dist/components/p-DRyrcR2k.js +2 -0
  121. package/dist/components/p-DRyrcR2k.js.map +1 -0
  122. package/dist/components/{p-CE2b5GPu.js → p-DVLghmNY.js} +2 -2
  123. package/dist/components/p-DW8ssbfI.js +2 -0
  124. package/dist/components/p-DW8ssbfI.js.map +1 -0
  125. package/dist/components/{p-BXv6RpoF.js → p-DZcIt_JJ.js} +2 -2
  126. package/dist/components/{p-CglHiyY2.js → p-DkxOEFHN.js} +2 -2
  127. package/dist/components/{p-DeK_6Uym.js → p-DlbhmXjH.js} +2 -2
  128. package/dist/components/{p-Bq8svcPs.js → p-GEi3hDJQ.js} +2 -2
  129. package/dist/components/p-LMmrjmI_.js +2 -0
  130. package/dist/components/p-LMmrjmI_.js.map +1 -0
  131. package/dist/components/{p-DI8DUozc.js → p-Q0dkeoJ6.js} +2 -2
  132. package/dist/components/{p-XaCYqck3.js → p-Q7AOgrg5.js} +2 -2
  133. package/dist/components/{p-B0OZx3JB.js → p-WFo1x6dN.js} +2 -2
  134. package/dist/components/{p-CEXchU5N.js → p-to8BxxgT.js} +2 -2
  135. package/dist/docs/components.json +1104 -3
  136. package/dist/mcp-data/registry/card-overview.json +8 -6
  137. package/dist/mcp-data/registry/field.json +5 -4
  138. package/dist/mcp-data/registry/panel-nav.json +2 -1
  139. package/dist/mcp-data/registry/registry.json +346 -12
  140. package/dist/mcp-data/registry/score.json +241 -0
  141. package/dist/mcp-data/registry/shell-app.json +1 -0
  142. package/dist/mcp-data/registry/table.json +17 -14
  143. package/dist/mcp-data/registry/textarea.json +600 -0
  144. package/dist/mcp-data/registry/tooltip.json +5 -5
  145. package/dist/react/components.d.ts +2 -0
  146. package/dist/react/components.js +2 -0
  147. package/dist/react/ds-score.d.ts +9 -0
  148. package/dist/react/ds-score.js +12 -0
  149. package/dist/react/ds-textarea.d.ts +12 -0
  150. package/dist/react/ds-textarea.js +12 -0
  151. package/dist/styles/table.css +201 -70
  152. package/dist/types/components/CardOverview/card-overview-controller.d.ts +2 -2
  153. package/dist/types/components/CardOverview/card-overview-types.d.ts +2 -1
  154. package/dist/types/components/Score/Score.d.ts +21 -0
  155. package/dist/types/components/Score/index.d.ts +3 -0
  156. package/dist/types/components/Score/score-model.d.ts +14 -0
  157. package/dist/types/components/Score/score-types.d.ts +5 -0
  158. package/dist/types/components/Table/Table.d.ts +5 -2
  159. package/dist/types/components/Table/index.d.ts +1 -1
  160. package/dist/types/components/Table/table-cell-model.d.ts +12 -0
  161. package/dist/types/components/Table/table-model.d.ts +10 -1
  162. package/dist/types/components/Table/table-render-model.d.ts +3 -1
  163. package/dist/types/components/Table/table-row-view.d.ts +2 -1
  164. package/dist/types/components/Table/table-types.d.ts +60 -1
  165. package/dist/types/components/Table/table-virtual-model.d.ts +6 -5
  166. package/dist/types/components/Textarea/Textarea.d.ts +66 -0
  167. package/dist/types/components/Textarea/index.d.ts +2 -0
  168. package/dist/types/components/Tooltip/Tooltip.d.ts +1 -1
  169. package/dist/types/components.d.ts +324 -2
  170. package/dist/vue/components.d.ts +2 -0
  171. package/dist/vue/components.js +2 -0
  172. package/dist/vue/ds-score.d.ts +3 -0
  173. package/dist/vue/ds-score.js +12 -0
  174. package/dist/vue/ds-textarea.d.ts +3 -0
  175. package/dist/vue/ds-textarea.js +36 -0
  176. package/package.json +1 -1
  177. package/dist/components/p-9X_p0bHr.js +0 -2
  178. package/dist/components/p-9X_p0bHr.js.map +0 -1
  179. package/dist/components/p-Bo6uW_8T.js +0 -2
  180. package/dist/components/p-Bo6uW_8T.js.map +0 -1
  181. /package/dist/components/{p-DLaN9BPq.js.map → p-1604KY3B.js.map} +0 -0
  182. /package/dist/components/{p-CYMKmJ2s.js.map → p-2wIPUcSL.js.map} +0 -0
  183. /package/dist/components/{p-CEfxLsbX.js.map → p-537t6oRD.js.map} +0 -0
  184. /package/dist/components/{p-kslioYhf.js.map → p-6_CNVbqa.js.map} +0 -0
  185. /package/dist/components/{p-PXdvBMXB.js.map → p-B3Z5sQin.js.map} +0 -0
  186. /package/dist/components/{p-CZjjDhUl.js.map → p-B3sRZBZk.js.map} +0 -0
  187. /package/dist/components/{p-BZlhBJZL.js.map → p-B9esvbYk.js.map} +0 -0
  188. /package/dist/components/{p-5Z4oYuiK.js.map → p-BEXkJ9lg.js.map} +0 -0
  189. /package/dist/components/{p-DbLLH3hr.js.map → p-BIGpc__9.js.map} +0 -0
  190. /package/dist/components/{p-DzPtYdXy.js.map → p-BMzn2Cmw.js.map} +0 -0
  191. /package/dist/components/{p-BSRIF4m8.js.map → p-BRLDf-NK.js.map} +0 -0
  192. /package/dist/components/{p-0X-4KGQf.js.map → p-BUh2GkPJ.js.map} +0 -0
  193. /package/dist/components/{p-pUOA3iDG.js.map → p-BVpn_e-r.js.map} +0 -0
  194. /package/dist/components/{p-CpeJMKJ5.js.map → p-BVz-r3g0.js.map} +0 -0
  195. /package/dist/components/{p-CBymzuOO.js.map → p-BXDLR072.js.map} +0 -0
  196. /package/dist/components/{p-DiS5BgLA.js.map → p-BZiGtBBk.js.map} +0 -0
  197. /package/dist/components/{p-BcxidW9k.js.map → p-Bb9dA7sl.js.map} +0 -0
  198. /package/dist/components/{p-BR1ayqMU.js.map → p-Bjt_8sLe.js.map} +0 -0
  199. /package/dist/components/{p-BqbdABo3.js.map → p-BssZ4SbT.js.map} +0 -0
  200. /package/dist/components/{p-bHnk8t5I.js.map → p-C68oSTb1.js.map} +0 -0
  201. /package/dist/components/{p-C_FFU6W3.js.map → p-CGQnHNuW.js.map} +0 -0
  202. /package/dist/components/{p-BqVXMEJm.js.map → p-CQjUOHiN.js.map} +0 -0
  203. /package/dist/components/{p-w9fkkwL2.js.map → p-CaF5WCci.js.map} +0 -0
  204. /package/dist/components/{p-Bjq1KP_Y.js.map → p-Cf5Ai4xx.js.map} +0 -0
  205. /package/dist/components/{p-B0kSlcaw.js.map → p-Cr6pDY-e.js.map} +0 -0
  206. /package/dist/components/{p-FxtgCvhA.js.map → p-Cy1oWIaV.js.map} +0 -0
  207. /package/dist/components/{p-CTH3dSYg.js.map → p-DDqRCDXh.js.map} +0 -0
  208. /package/dist/components/{p-x5u5Ueli.js.map → p-DIqAdmui.js.map} +0 -0
  209. /package/dist/components/{p-Cd1JnnVK.js.map → p-DQQsS9Rx.js.map} +0 -0
  210. /package/dist/components/{p-CZHIkVgj.js.map → p-DQsFmleZ.js.map} +0 -0
  211. /package/dist/components/{p-CE2b5GPu.js.map → p-DVLghmNY.js.map} +0 -0
  212. /package/dist/components/{p-BXv6RpoF.js.map → p-DZcIt_JJ.js.map} +0 -0
  213. /package/dist/components/{p-CglHiyY2.js.map → p-DkxOEFHN.js.map} +0 -0
  214. /package/dist/components/{p-DeK_6Uym.js.map → p-DlbhmXjH.js.map} +0 -0
  215. /package/dist/components/{p-Bq8svcPs.js.map → p-GEi3hDJQ.js.map} +0 -0
  216. /package/dist/components/{p-DI8DUozc.js.map → p-Q0dkeoJ6.js.map} +0 -0
  217. /package/dist/components/{p-XaCYqck3.js.map → p-Q7AOgrg5.js.map} +0 -0
  218. /package/dist/components/{p-B0OZx3JB.js.map → p-WFo1x6dN.js.map} +0 -0
  219. /package/dist/components/{p-CEXchU5N.js.map → p-to8BxxgT.js.map} +0 -0
@@ -13,12 +13,8 @@
13
13
  --_table-cell-track-label-inset: var(--dimension-space-025);
14
14
  --_table-caption-bar-block-size: var(--dimension-size-600);
15
15
  --_table-image-block-size: var(--_table-cell-track-min-block-size);
16
- --_table-image-block-size-multi: calc(
17
- var(--_table-cell-track-min-block-size) + var(--dimension-space-025) + var(--dimension-size-250)
18
- );
19
- --_table-image-block-size-triple: calc(
20
- var(--_table-image-block-size-multi) + var(--dimension-space-025) + var(--dimension-size-250)
21
- );
16
+ --_table-image-block-size-multi: calc(2 * var(--_table-cell-track-min-block-size));
17
+ --_table-image-block-size-triple: calc(3 * var(--_table-cell-track-min-block-size));
22
18
  --_table-image-column-inline-size: calc(
23
19
  ((var(--_table-image-block-size) * 16) / 9) + (var(--_table-cell-padding-inline) * 2)
24
20
  );
@@ -29,27 +25,13 @@
29
25
  ((var(--_table-image-block-size-triple) * 16) / 9) + (var(--_table-cell-padding-inline) * 2)
30
26
  );
31
27
  /*
32
- * Wrapping primary on a 1-track cell occupies later tracks instead of a
33
- * private leading scale. Keep body-medium size; add the 2px stack gap to
34
- * line-height and leave the leftover first-track inset as padding-block
35
- * so 1 / 2 / 3 wrapped lines measure 40 / 62 / 84 like named tracks.
28
+ * Every body-row track is 24px with no stack gap (40 / 64 / 88 / 112).
29
+ * Wrapping primary and secondary use that same 24px as line-height so
30
+ * extra lines land on named tracks without a private leading scale.
36
31
  */
37
- --_table-wrap-primary-line-height: calc(
38
- var(--typography-lineheight-md) + var(--dimension-space-025)
39
- );
40
- --_table-wrap-primary-padding-block: calc(
41
- (
42
- var(--_table-cell-track-min-block-size) - var(--typography-lineheight-md) -
43
- var(--dimension-space-025)
44
- ) /
45
- 2
46
- );
47
- /*
48
- * Wrapping secondary on a 2-track cell occupies later tracks. Zero the copy
49
- * gap and use later-track + gap as line-height so 1 / 2 / 3 secondary lines
50
- * land on 62 / 84 / 106 with primary remaining the first 24px track.
51
- */
52
- --_table-wrap-secondary-line-height: calc(var(--dimension-size-250) + var(--dimension-space-025));
32
+ --_table-wrap-primary-line-height: var(--_table-cell-track-min-block-size);
33
+ --_table-wrap-primary-padding-block: 0px;
34
+ --_table-wrap-secondary-line-height: var(--_table-cell-track-min-block-size);
53
35
  --_table-wrap-secondary-padding-block: 0;
54
36
  --_table-surface: var(--ds-table-surface, var(--color-background-primary));
55
37
  --_table-header-surface: var(--ds-table-header-surface, var(--color-background-primary));
@@ -209,10 +191,22 @@
209
191
  }
210
192
 
211
193
  /* Bound style and layout invalidation to recycled row shells during window updates. */
212
- :where(.ds-table__table--virtual .ds-table__row) {
194
+ :where(.ds-table__table--windowed .ds-table__row) {
213
195
  contain: layout style;
214
196
  }
215
197
 
198
+ /*
199
+ * Pagination and infinite windows keep every loaded semantic row in the DOM.
200
+ * Let the browser skip off-screen row contents while retaining a stable scroll
201
+ * range from the same token-aligned row estimates used by virtual mode. The
202
+ * `auto` form caches each real height after the row has been laid out.
203
+ */
204
+ :where(.ds-table__table--deferred-rows .ds-table__row) {
205
+ content-visibility: auto;
206
+ contain-intrinsic-block-size: auto
207
+ var(--_table-row-intrinsic-block-size, var(--_table-row-min-block-size));
208
+ }
209
+
216
210
  :where(.ds-table__table--native-group-sticky .ds-table__header-row),
217
211
  :where(.ds-table__table--native-group-sticky .ds-table__row),
218
212
  :where(.ds-table__table--native-group-sticky .ds-table__skeleton-row) {
@@ -882,18 +876,18 @@
882
876
 
883
877
  :where(.ds-table__cell--text-multi .ds-table__cell-copy),
884
878
  :where(.ds-table__cell--text-triple .ds-table__cell-copy) {
885
- gap: var(--dimension-space-025);
879
+ gap: 0;
886
880
  }
887
881
 
888
882
  /*
889
- * Body cells share 8px chrome. 20px content (body-medium text, md icon,
890
- * checkbox) sits in a 24px track (2px block inset). Text tracks keep that
891
- * 2px plus the 2px label inset, so padding-inline is 4px and copy lines up
892
- * with column-header labels. Later body-small tracks stay 20px, stacked with
893
- * a 2px gap. Wrapping 1-track primary folds that gap into line-height so
894
- * extra lines land on the same 62px and 84px rows as 2- and 3-track cells.
895
- * Wrapping secondary keeps primary on track 1 and consumes later tracks the
896
- * same way, including a 106px fourth track when secondary wraps to three lines.
883
+ * Body cells share 8px chrome. Every named track is 24px with no stack gap,
884
+ * so 20px content (body-medium text, md icon, checkbox, sm tag) sits in that
885
+ * track with a 2px block inset. Text tracks keep that 2px plus the 2px label
886
+ * inset, so padding-inline is 4px and copy lines up with column-header labels.
887
+ * Wrapping 1-track primary uses the 24px track as line-height so extra lines
888
+ * land on the same 64px and 88px rows as 2- and 3-track cells. Wrapping
889
+ * secondary keeps primary on track 1 and consumes later tracks the same way,
890
+ * including a 112px fourth track when secondary wraps to three lines.
897
891
  * Header and group rows keep their own recipes.
898
892
  */
899
893
  :where(.ds-table__cell-primary),
@@ -903,12 +897,16 @@
903
897
 
904
898
  :where(.ds-table__cell--text-multi .ds-table__cell-secondary),
905
899
  :where(.ds-table__cell--text-triple .ds-table__cell-secondary),
906
- :where(.ds-table__cell--text-triple .ds-table__cell-tertiary) {
907
- padding-block: var(--dimension-space-025);
908
- }
909
-
900
+ :where(.ds-table__cell--text-triple .ds-table__cell-tertiary),
901
+ :where(.ds-table__cell--icon-text-multi .ds-table__cell-secondary),
902
+ :where(.ds-table__cell--icon-text-triple .ds-table__cell-secondary),
903
+ :where(.ds-table__cell--icon-text-triple .ds-table__cell-tertiary),
904
+ :where(.ds-table__cell--score-text-multi .ds-table__cell-secondary),
905
+ :where(.ds-table__cell--score-text-triple .ds-table__cell-secondary),
906
+ :where(.ds-table__cell--score-text-triple .ds-table__cell-tertiary),
910
907
  :where(.ds-table__cell--primary-text .ds-table__cell-secondary) {
911
- padding-block: 0;
908
+ padding-block: var(--dimension-space-025);
909
+ min-block-size: var(--_table-cell-track-min-block-size);
912
910
  }
913
911
 
914
912
  :where(.ds-table__cell--tag-tag-only .ds-table__cell-content) {
@@ -916,10 +914,10 @@
916
914
  }
917
915
 
918
916
  /*
919
- * Multiple Tags use the 20px small single-inset control so each wrapped line
920
- * occupies one later-track slot. The 2px block inset forms the 24px first
921
- * track; subsequent lines add a 20px track and 2px gap, preserving the named
922
- * row ladder for any declared number of tracks.
917
+ * Multiple Tags use the 20px small single-inset control. Each wrap line is a
918
+ * 24px track (2px block margin around the tag) with no row-gap, so wrap lines
919
+ * land on the same 40 / 64 / 88 ladder as text. Same-line tags keep a 2px
920
+ * column gap.
923
921
  */
924
922
  :where(.ds-table__cell--tags .ds-table__cell-content) {
925
923
  min-block-size: 0;
@@ -930,18 +928,19 @@
930
928
  flex-wrap: wrap;
931
929
  align-content: flex-start;
932
930
  align-items: center;
933
- gap: var(--dimension-space-025);
931
+ gap: 0 var(--dimension-space-025);
934
932
  box-sizing: border-box;
935
933
  inline-size: 100%;
936
934
  min-inline-size: 0;
937
935
  max-inline-size: 100%;
938
936
  min-block-size: var(--_table-cell-tags-min-block-size, var(--_table-cell-track-min-block-size));
939
- padding-block: var(--dimension-space-025);
937
+ padding-block: 0;
940
938
  }
941
939
 
942
940
  :where(.ds-table__cell-tags > ds-tag) {
943
941
  flex: none;
944
942
  max-inline-size: 100%;
943
+ margin-block: var(--dimension-space-025);
945
944
  }
946
945
 
947
946
  :where(.ds-table__cell-tag-stack) {
@@ -960,21 +959,21 @@
960
959
  :where(.ds-table__cell-tag-stack--tag-with-text .ds-table__cell-tag-text) {
961
960
  padding-inline: var(--_table-cell-track-padding-inline);
962
961
  padding-block: var(--dimension-space-025);
963
- min-block-size: 0;
962
+ min-block-size: var(--_table-cell-track-min-block-size);
964
963
  }
965
964
 
966
965
  :where(.ds-table__cell-tag-stack--tag-with-text) {
967
- gap: var(--dimension-space-025);
966
+ gap: 0;
968
967
  }
969
968
 
970
969
  :where(.ds-table__cell-tag-stack--text-with-tag .ds-table__cell-tag-text) {
971
970
  padding-inline: var(--_table-cell-track-padding-inline);
972
971
  padding-block: var(--dimension-space-025);
973
- min-block-size: 0;
972
+ min-block-size: var(--_table-cell-track-min-block-size);
974
973
  }
975
974
 
976
975
  :where(.ds-table__cell-tag-stack--text-with-tag) {
977
- gap: var(--dimension-space-025);
976
+ gap: 0;
978
977
  }
979
978
 
980
979
  :where(.ds-table__cell-tag-control-track) {
@@ -983,10 +982,6 @@
983
982
  min-block-size: var(--_table-cell-track-min-block-size);
984
983
  }
985
984
 
986
- :where(.ds-table__cell-tag-stack--text-with-tag .ds-table__cell-tag-control-track) {
987
- min-block-size: var(--dimension-size-250);
988
- }
989
-
990
985
  :where(.ds-table__cell--icon .ds-table__cell-content) {
991
986
  align-items: center;
992
987
  justify-content: center;
@@ -1023,19 +1018,58 @@
1023
1018
 
1024
1019
  :where(.ds-table__cell--icon-text-multi .ds-table__cell-copy),
1025
1020
  :where(.ds-table__cell--icon-text-triple .ds-table__cell-copy) {
1026
- gap: var(--dimension-space-025);
1021
+ gap: 0;
1027
1022
  }
1028
1023
 
1029
1024
  :where(.ds-table__cell--icon-text-multi .ds-table__cell-secondary),
1030
1025
  :where(.ds-table__cell--icon-text-triple .ds-table__cell-secondary),
1031
1026
  :where(.ds-table__cell--icon-text-triple .ds-table__cell-tertiary) {
1032
1027
  padding-block: var(--dimension-space-025);
1028
+ min-block-size: var(--_table-cell-track-min-block-size);
1029
+ }
1030
+
1031
+ /*
1032
+ * Score-and-text: copy fills from the start edge while the sm Score owns the
1033
+ * top-right 24px track. The score has no padding that would enlarge or
1034
+ * misalign its fill.
1035
+ */
1036
+ :where(.ds-table__cell-score-text) {
1037
+ display: flex;
1038
+ align-items: flex-start;
1039
+ gap: var(--dimension-space-075);
1040
+ inline-size: 100%;
1041
+ min-inline-size: 0;
1042
+ max-inline-size: 100%;
1043
+ }
1044
+
1045
+ :where(.ds-table__cell-score-text-score) {
1046
+ box-sizing: border-box;
1047
+ display: flex;
1048
+ flex: none;
1049
+ align-items: flex-start;
1050
+ min-block-size: var(--_table-cell-track-min-block-size);
1051
+ }
1052
+
1053
+ :where(.ds-table__cell--score-text .ds-table__cell-content),
1054
+ :where(.ds-table__cell--score-text .ds-table__cell-track) {
1055
+ min-block-size: 0;
1056
+ }
1057
+
1058
+ :where(.ds-table__cell--score-text-multi .ds-table__cell-copy),
1059
+ :where(.ds-table__cell--score-text-triple .ds-table__cell-copy) {
1060
+ gap: 0;
1061
+ }
1062
+
1063
+ :where(.ds-table__cell--score-text-multi .ds-table__cell-secondary),
1064
+ :where(.ds-table__cell--score-text-triple .ds-table__cell-secondary),
1065
+ :where(.ds-table__cell--score-text-triple .ds-table__cell-tertiary) {
1066
+ padding-block: var(--dimension-space-025);
1067
+ min-block-size: var(--_table-cell-track-min-block-size);
1033
1068
  }
1034
1069
 
1035
1070
  /*
1036
1071
  * Image previews fill the matching body-row content box (cell height minus
1037
- * 8px padding) at 16:9. Track 1 is the 24px first-track stack; tracks 2 and
1038
- * 3 add the same 20px later-track and 2px gap as text.
1072
+ * 8px padding) at 16:9. Each track is 24px with no stack gap.
1039
1073
  */
1040
1074
  :where(.ds-table__cell-image) {
1041
1075
  display: block;
@@ -1109,25 +1143,32 @@
1109
1143
  * to the 40px single-track row.
1110
1144
  */
1111
1145
  :where(.ds-table__cell--text-wrap .ds-table__cell-track--text),
1112
- :where(.ds-table__cell--icon-text-wrap .ds-table__cell-track--text) {
1146
+ :where(.ds-table__cell--icon-text-wrap .ds-table__cell-track--text),
1147
+ :where(.ds-table__cell--score-text-wrap .ds-table__cell-track--text) {
1113
1148
  display: block;
1114
1149
  }
1115
1150
 
1116
1151
  :where(.ds-table__cell--text-wrap.ds-table__cell--text-single .ds-table__cell-primary),
1117
1152
  :where(.ds-table__cell--text-wrap.ds-table__cell--text-multi .ds-table__cell-primary),
1118
1153
  :where(.ds-table__cell--icon-text-wrap.ds-table__cell--icon-text-single .ds-table__cell-primary),
1119
- :where(.ds-table__cell--icon-text-wrap.ds-table__cell--icon-text-multi .ds-table__cell-primary) {
1154
+ :where(.ds-table__cell--icon-text-wrap.ds-table__cell--icon-text-multi .ds-table__cell-primary),
1155
+ :where(.ds-table__cell--score-text-wrap.ds-table__cell--score-text-single .ds-table__cell-primary),
1156
+ :where(.ds-table__cell--score-text-wrap.ds-table__cell--score-text-multi .ds-table__cell-primary) {
1120
1157
  line-height: var(--_table-wrap-primary-line-height);
1121
1158
  padding-block: var(--_table-wrap-primary-padding-block);
1122
1159
  }
1123
1160
 
1124
1161
  :where(.ds-table__cell--text-wrap.ds-table__cell--text-multi .ds-table__cell-copy),
1125
- :where(.ds-table__cell--icon-text-wrap.ds-table__cell--icon-text-multi .ds-table__cell-copy) {
1162
+ :where(.ds-table__cell--icon-text-wrap.ds-table__cell--icon-text-multi .ds-table__cell-copy),
1163
+ :where(.ds-table__cell--score-text-wrap.ds-table__cell--score-text-multi .ds-table__cell-copy) {
1126
1164
  gap: 0;
1127
1165
  }
1128
1166
 
1129
1167
  :where(.ds-table__cell--text-wrap.ds-table__cell--text-multi .ds-table__cell-secondary),
1130
- :where(.ds-table__cell--icon-text-wrap.ds-table__cell--icon-text-multi .ds-table__cell-secondary) {
1168
+ :where(.ds-table__cell--icon-text-wrap.ds-table__cell--icon-text-multi .ds-table__cell-secondary),
1169
+ :where(
1170
+ .ds-table__cell--score-text-wrap.ds-table__cell--score-text-multi .ds-table__cell-secondary
1171
+ ) {
1131
1172
  line-height: var(--_table-wrap-secondary-line-height);
1132
1173
  padding-block: var(--_table-wrap-secondary-padding-block);
1133
1174
  }
@@ -1390,6 +1431,28 @@
1390
1431
  border-block-end: 0;
1391
1432
  background: var(--_table-group-surface);
1392
1433
  background-clip: border-box;
1434
+ cursor: default;
1435
+ }
1436
+
1437
+ /* Hover/press wash. Keep this on ::before so the dedicated trailing-edge
1438
+ * separator on ::after stays the original 1px surface rule. */
1439
+ :where(.ds-table__group-content)::before {
1440
+ content: '';
1441
+ position: absolute;
1442
+ inset: 0;
1443
+ z-index: 0;
1444
+ background: transparent;
1445
+ pointer-events: none;
1446
+ }
1447
+
1448
+ @media (hover: hover) and (pointer: fine) {
1449
+ :where(.ds-table__group-content:hover)::before {
1450
+ background: var(--_table-row-hover);
1451
+ }
1452
+ }
1453
+
1454
+ :where(.ds-table__group-content:active)::before {
1455
+ background: var(--_table-row-pressed);
1393
1456
  }
1394
1457
 
1395
1458
  :where(.ds-table__group-content)::after {
@@ -1397,6 +1460,7 @@
1397
1460
  position: absolute;
1398
1461
  inset-inline: 0;
1399
1462
  inset-block-end: 0;
1463
+ z-index: 1;
1400
1464
  block-size: var(--dimension-stroke-width-012);
1401
1465
  background: var(--_table-border);
1402
1466
  pointer-events: none;
@@ -1434,31 +1498,94 @@
1434
1498
  block-size: var(--dimension-iconography-md);
1435
1499
  }
1436
1500
 
1437
- :where(.ds-table__group-copy) {
1438
- /* The full-size sm count tag owns the 24px content height; inline padding
1439
- * preserves the shared text track without making the 40px section row grow. */
1501
+ :where(.ds-table__group-content--hero) {
1502
+ align-items: flex-start;
1503
+ }
1504
+
1505
+ :where(.ds-table__group-hero) {
1506
+ position: relative;
1440
1507
  box-sizing: border-box;
1441
1508
  display: inline-flex;
1442
- align-items: center;
1509
+ flex: 0 0 auto;
1510
+ align-self: flex-start;
1511
+ /* Same 6px as the extra group-copy inset so the sm figure sits on the text column. */
1512
+ margin-inline-start: var(--dimension-space-075);
1513
+ }
1514
+
1515
+ :where(.ds-table__group-hero)::after {
1516
+ content: '';
1517
+ position: absolute;
1518
+ inset: 0;
1519
+ z-index: 1;
1520
+ box-sizing: border-box;
1521
+ border-radius: var(--dimension-radius-025);
1522
+ border: var(--dimension-stroke-width-012) solid var(--color-border-tertiary);
1523
+ pointer-events: none;
1524
+ }
1525
+
1526
+ :where(.ds-table__table--selectable .ds-table__group-hero),
1527
+ :where(.ds-table__sticky-group--selectable .ds-table__group-hero) {
1528
+ /* Margin, not padding: ::after inset:0 must hug the 24px sm fill. */
1529
+ margin-inline-end: var(--dimension-space-100);
1530
+ }
1531
+
1532
+ :where(.ds-table__group-content--multi) {
1533
+ align-items: flex-start;
1534
+ min-block-size: calc(var(--_table-row-min-block-size) + var(--_table-cell-track-min-block-size));
1535
+ }
1536
+
1537
+ :where(.ds-table__group-copy) {
1538
+ /* One or two 24px tracks; 8px chrome on group-content keeps 40 / 64 row height. */
1539
+ box-sizing: border-box;
1540
+ display: flex;
1541
+ flex-direction: column;
1542
+ justify-content: center;
1443
1543
  min-inline-size: 0;
1444
1544
  flex: 1 1 auto;
1445
- gap: var(--dimension-space-050);
1545
+ gap: 0;
1446
1546
  padding-block: 0;
1447
1547
  padding-inline: var(--dimension-space-050);
1448
1548
  }
1449
1549
 
1550
+ :where(.ds-table__group-primary),
1551
+ :where(.ds-table__group-accessories) {
1552
+ box-sizing: border-box;
1553
+ display: inline-flex;
1554
+ align-items: center;
1555
+ min-inline-size: 0;
1556
+ min-block-size: var(--_table-cell-track-min-block-size);
1557
+ gap: var(--dimension-space-050);
1558
+ }
1559
+
1560
+ :where(.ds-table__group-accessories ds-tooltip),
1561
+ :where(.ds-table__group-accessory-tip) {
1562
+ display: inline-flex;
1563
+ align-items: center;
1564
+ min-inline-size: 0;
1565
+ max-inline-size: 100%;
1566
+ min-block-size: var(--_table-cell-track-min-block-size);
1567
+ }
1568
+
1450
1569
  :where(.ds-table__table--selectable .ds-table__group-copy),
1451
1570
  :where(.ds-table__sticky-group--selectable .ds-table__group-copy) {
1452
- padding-inline-start: calc(var(--dimension-space-100) + var(--_table-cell-track-label-inset));
1571
+ /* 8px cell chrome + 4px text-track inset matches header 8+2+2 and body copy. */
1572
+ padding-inline-start: calc(var(--dimension-space-100) + var(--_table-cell-track-padding-inline));
1573
+ }
1574
+
1575
+ :where(.ds-table__table--selectable .ds-table__group-content--hero .ds-table__group-copy),
1576
+ :where(.ds-table__sticky-group--selectable .ds-table__group-content--hero .ds-table__group-copy) {
1577
+ padding-inline-start: var(--dimension-space-050);
1453
1578
  }
1454
1579
 
1455
1580
  :where(.ds-table__group-separator),
1456
- :where(.ds-table__group-count) {
1581
+ :where(.ds-table__group-count),
1582
+ :where(.ds-table__group-accessory-separator) {
1457
1583
  flex: 0 0 auto;
1458
1584
  }
1459
1585
 
1460
1586
  :where(.ds-table__group-toggle) {
1461
- align-self: center;
1587
+ --color-interaction-hover: transparent;
1588
+ --color-interaction-pressed: transparent;
1462
1589
  flex: 0 0 auto;
1463
1590
  margin-inline-start: auto;
1464
1591
  }
@@ -1611,6 +1738,10 @@
1611
1738
  background: var(--ds-forced-color-surface);
1612
1739
  }
1613
1740
 
1741
+ :where(.ds-table__group-hero)::after {
1742
+ border-color: var(--ds-forced-color-content);
1743
+ }
1744
+
1614
1745
  :where(.ds-table__row--disabled) {
1615
1746
  color: var(--ds-forced-color-disabled);
1616
1747
  opacity: 1;
@@ -1,4 +1,5 @@
1
- import type { CardOverviewVariant, OverviewMetric, SafetyScoreLevel } from './card-overview-types';
1
+ import type { CardOverviewVariant, OverviewMetric } from './card-overview-types';
2
+ export { resolveSafetyScoreLevel } from '../Score/score-model';
2
3
  export interface CardOverviewCollapseGeometry {
3
4
  active: boolean;
4
5
  expandedHeight: number;
@@ -33,7 +34,6 @@ export declare function resolveCardOverviewCollapseGeometry(options: {
33
34
  expandedHeight: number;
34
35
  compactHeight: number;
35
36
  }): CardOverviewCollapseGeometry;
36
- export declare function resolveSafetyScoreLevel(value: string | number): SafetyScoreLevel | undefined;
37
37
  export declare function resolveOverviewRovingIndex(metrics: readonly OverviewMetric[], focusedIndex: number): number;
38
38
  export declare function findNextOverviewMetricIndex(metrics: readonly OverviewMetric[], from: number, step: -1 | 1): number;
39
39
  //# sourceMappingURL=card-overview-controller.d.ts.map
@@ -1,7 +1,8 @@
1
1
  import type { MetricTrend } from '../../utils/metric-change';
2
+ import type { SafetyScoreLevel } from '../Score/score-types';
3
+ export type { SafetyScoreLevel } from '../Score/score-types';
2
4
  export type CardOverviewVariant = 'default' | 'compact';
3
5
  export type CardOverviewLayout = 'auto' | 'stacked';
4
- export type SafetyScoreLevel = 'fair' | 'good' | 'excellent';
5
6
  /**
6
7
  * Leading summary block — the headline figure the rest of the bar contextualises.
7
8
  *
@@ -0,0 +1,21 @@
1
+ import type { SafetyScoreLevel, ScoreSize } from './score-types';
2
+ export declare class Score {
3
+ /** Display-ready headline figure. */
4
+ value: string | number;
5
+ /**
6
+ * Visual density matching control height: `sm` 24px, `md` 32px, `lg` 40px.
7
+ * `lg` is the Card Overview recipe.
8
+ */
9
+ size: ScoreSize;
10
+ /**
11
+ * Safety-score color level. Numeric values from 0–100 infer fair (0–50),
12
+ * good (51–80), or excellent (81–100) when this is omitted.
13
+ */
14
+ level: SafetyScoreLevel | undefined;
15
+ /** Replace the figure with a skeleton while data resolves. */
16
+ isLoading: boolean;
17
+ /** Accessible name prefix, for example “Safety score”. */
18
+ label: string;
19
+ render(): any;
20
+ }
21
+ //# sourceMappingURL=Score.d.ts.map
@@ -0,0 +1,3 @@
1
+ export type { SafetyScoreLevel, ScoreSize } from './score-types';
2
+ export { resolveSafetyScoreLevel, resolveScoreLevel } from './score-model';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1,14 @@
1
+ import { type SafetyScoreLevel } from './score-types';
2
+ export declare function isSafetyScoreLevel(value: unknown): value is SafetyScoreLevel;
3
+ /**
4
+ * Infer a safety-score color level from a 0–100 figure. Non-numeric or out-of-range
5
+ * values return undefined so the owner can supply `level` explicitly.
6
+ */
7
+ export declare function resolveSafetyScoreLevel(value: string | number): SafetyScoreLevel | undefined;
8
+ export declare function resolveScoreLevel(value: string | number, level?: SafetyScoreLevel): SafetyScoreLevel | undefined;
9
+ export declare const SCORE_VALUE_VARIANT: {
10
+ readonly sm: "text-title-small";
11
+ readonly md: "text-title-large";
12
+ readonly lg: "text-display-small";
13
+ };
14
+ //# sourceMappingURL=score-model.d.ts.map
@@ -0,0 +1,5 @@
1
+ export type SafetyScoreLevel = 'fair' | 'good' | 'excellent';
2
+ export type ScoreSize = 'sm' | 'md' | 'lg';
3
+ export declare const SCORE_SIZES: readonly ["sm", "md", "lg"];
4
+ export declare const SAFETY_SCORE_LEVELS: readonly ["fair", "good", "excellent"];
5
+ //# sourceMappingURL=score-types.d.ts.map
@@ -230,13 +230,13 @@ export declare class Table {
230
230
  private currentLoadedRowCount;
231
231
  private createRenderModel;
232
232
  private get highlightMatcher();
233
- private get virtualizationEnabled();
233
+ private get rowWindowingEnabled();
234
234
  private get virtualViewportMissing();
235
235
  private get hasVirtualViewportBounds();
236
236
  private estimateVirtualViewportSize;
237
237
  private virtualPinnedRowIds;
238
238
  private syncVirtualItems;
239
- private shouldVirtualize;
239
+ private shouldWindowRows;
240
240
  private get resolvedMaxHeight();
241
241
  private get resolvedHeight();
242
242
  private warnModelIssues;
@@ -248,6 +248,8 @@ export declare class Table {
248
248
  private emitAllSelection;
249
249
  private emitGroupSelection;
250
250
  private rowEventOwnsActivation;
251
+ private groupRowEventOwnsCollapse;
252
+ private handleGroupRowClick;
251
253
  private emitRowActivation;
252
254
  private syncActionMenu;
253
255
  private closeActionMenu;
@@ -275,6 +277,7 @@ export declare class Table {
275
277
  private renderRow;
276
278
  private emitGroupCollapse;
277
279
  private emitAllGroupsCollapse;
280
+ private renderGroupAccessory;
278
281
  private renderGroupContent;
279
282
  private formatGroupLoadLabel;
280
283
  private renderGroupLoadRow;
@@ -1,2 +1,2 @@
1
- export type { TableCaptionVisibility, TableCellAlign, TableCellAction, TableCellActionDetail, TableCellActionDivider, TableCellActionMenuEntry, TableCellActionMenuItem, TableCellBlank, TableCellEmpty, TableCellLinkTarget, TableCellIcon, TableCellIconText, TableCellImage, TableCellImageTracks, TableCellPrimaryText, TableCellSkeleton, TableCellText, TableCellTextRun, TableCellTextTrack, TableCellTag, TableCellTagItem, TableCellTags, TableCellTagVariant, TableCellValue, TableSkeletonWidth, TableColumn, TableColumnsConfigChangeDetail, TableColumnSticky, TableColumnWidth, TableDataMode, TableDataModeChangeDetail, TableGroup, TableGroupCollapseChangeDetail, TableGroupLoadMoreDetail, TableGroupIntent, TableHeaderSegment, TableGroupingState, TableLoadMoreDetail, TableLoadMoreMode, TableLoadMoreReason, TablePaginationState, TableRow, TableRowActivateDetail, TableSelectionChangeDetail, TableSelectionMode, TableSortChangeDetail, TableSortDirection, TableSortState, } from './table-types';
1
+ export type { TableCaptionVisibility, TableCellAlign, TableCellAction, TableCellActionDetail, TableCellActionDivider, TableCellActionMenuEntry, TableCellActionMenuItem, TableCellBlank, TableCellEmpty, TableCellLinkTarget, TableCellIcon, TableCellIconText, TableCellScoreText, TableCellImage, TableCellImageTracks, TableCellPrimaryText, TableCellSkeleton, TableCellText, TableCellTextRun, TableCellTextTrack, TableCellTag, TableCellTagItem, TableCellTags, TableCellTagVariant, TableCellValue, TableSkeletonWidth, TableColumn, TableColumnsConfigChangeDetail, TableColumnSticky, TableColumnWidth, TableDataMode, TableDataModeChangeDetail, TableGroup, TableGroupAccessory, TableGroupHero, TableGroupCollapseChangeDetail, TableGroupLoadMoreDetail, TableGroupIntent, TableHeaderSegment, TableGroupingState, TableLoadMoreDetail, TableLoadMoreMode, TableLoadMoreReason, TablePaginationState, TableRow, TableRowActivateDetail, TableSelectionChangeDetail, TableSelectionMode, TableSortChangeDetail, TableSortDirection, TableSortState, } from './table-types';
2
2
  //# sourceMappingURL=index.d.ts.map
@@ -1,5 +1,6 @@
1
1
  import type { TableCellAction, TableCellBlank, TableCellEmpty, TableCellIcon, TableCellImage, TableCellImageTracks, TableCellTag, TableCellTags, TableCellTagVariant, TableCellTextRun, TableCellTextTrack, TableCellValue, TableCellLinkTarget, TableCellLineClamp, TableCellMaxLines, TableColumn } from './table-types';
2
2
  import type { IconColor } from '../Icon/Icon';
3
+ import type { SafetyScoreLevel } from '../Score/score-types';
3
4
  import type { TextColor } from '../Text/text-types';
4
5
  /** Maximum independently colored runs on one secondary or tertiary track. */
5
6
  export declare const TABLE_CELL_TEXT_RUN_LIMIT = 3;
@@ -36,6 +37,17 @@ export type TableCellPresentation = {
36
37
  variant: 'single' | 'multi' | 'triple';
37
38
  wraps: boolean;
38
39
  lineClamp: TableCellLineClamp;
40
+ } | {
41
+ kind: 'score-text';
42
+ cellType: 'score-text';
43
+ score: string | number;
44
+ scoreLevel?: SafetyScoreLevel;
45
+ scoreLabel: string;
46
+ scoreLoading: boolean;
47
+ value: ResolvedTableCellText;
48
+ variant: 'single' | 'multi' | 'triple';
49
+ wraps: boolean;
50
+ lineClamp: TableCellLineClamp;
39
51
  } | {
40
52
  kind: 'image';
41
53
  cellType: 'image';
@@ -1,4 +1,4 @@
1
- import type { TableCellBlank, TableCellAction, TableCellEmpty, TableCellIcon, TableCellIconText, TableCellImage, TableCellPrimaryText, TableCellText, TableCellTag, TableCellTags, TableCellValue, TableColumn, TableGroup, TableRow, TableSortState } from './table-types';
1
+ import type { TableCellBlank, TableCellAction, TableCellEmpty, TableCellIcon, TableCellIconText, TableCellScoreText, TableCellImage, TableCellPrimaryText, TableCellText, TableCellTag, TableCellTags, TableCellValue, TableColumn, TableGroup, TableGroupAccessory, TableGroupHero, TableRow, TableSortState } from './table-types';
2
2
  export interface TableSelectionState {
3
3
  selectableRowIds: string[];
4
4
  selectedLoadedCount: number;
@@ -11,6 +11,7 @@ export declare function isTableCellTag(value: TableCellValue): value is TableCel
11
11
  export declare function isTableCellTags(value: TableCellValue): value is TableCellTags;
12
12
  export declare function isTableCellIcon(value: TableCellValue): value is TableCellIcon;
13
13
  export declare function isTableCellIconText(value: TableCellValue): value is TableCellIconText;
14
+ export declare function isTableCellScoreText(value: TableCellValue): value is TableCellScoreText;
14
15
  export declare function isTableCellImage(value: TableCellValue): value is TableCellImage;
15
16
  export declare function isTableCellAction(value: TableCellValue): value is TableCellAction;
16
17
  export declare function isTableCellEmpty(value: TableCellValue): value is TableCellEmpty;
@@ -44,6 +45,14 @@ export declare function toggleAllLoadedTableRows(selectedRowIds: readonly string
44
45
  /** Toggle every selectable loaded row that belongs to a group. */
45
46
  export declare function toggleTableGroupSelection(selectedRowIds: readonly string[], groupRows: TableRow[]): string[];
46
47
  export declare function resolvedTableGroupCount(group: TableGroup): number;
48
+ /** Accessory items shown on a group header's second track. */
49
+ export declare const TABLE_GROUP_ACCESSORY_LIMIT = 4;
50
+ /** Trim, drop empty copy, and cap accessories at the second-track limit. */
51
+ export declare function tableGroupAccessories(group: TableGroup): TableGroupAccessory[];
52
+ /** Group-header score fill. Same sm density on one- and two-track headers. */
53
+ export declare const TABLE_GROUP_HERO_SCORE_SIZE: "sm";
54
+ /** Resolve a supported group-header hero, or undefined when none is supplied. */
55
+ export declare function tableGroupHero(group: TableGroup): TableGroupHero | undefined;
47
56
  export declare const TABLE_GROUP_INTENTS: readonly ["brand", "neutral", "negative", "warning", "caution", "positive"];
48
57
  export declare function isTableGroupIntent(value: unknown): value is (typeof TABLE_GROUP_INTENTS)[number];
49
58
  export declare function tableGroupIntentClass(intent: (typeof TABLE_GROUP_INTENTS)[number] | undefined): string | undefined;
@@ -1,5 +1,5 @@
1
1
  import { tableGroupLabelColor, type TableCollapseAllHost, type TableSelectionState } from './table-model';
2
- import type { TableColumn, TableGroup, TableGroupIntent, TableRow, TableSelectionMode } from './table-types';
2
+ import type { TableColumn, TableGroup, TableGroupAccessory, TableGroupHero, TableGroupIntent, TableRow, TableSelectionMode } from './table-types';
3
3
  export type TableGroupCountPresentation = 'loaded-progress' | 'total';
4
4
  export interface TableGroupRenderModel {
5
5
  group: TableGroup;
@@ -11,6 +11,8 @@ export interface TableGroupRenderModel {
11
11
  intentClass: string | undefined;
12
12
  labelColor: ReturnType<typeof tableGroupLabelColor>;
13
13
  collapsed: boolean;
14
+ accessories: TableGroupAccessory[];
15
+ hero: TableGroupHero | undefined;
14
16
  selection: TableSelectionState | null;
15
17
  }
16
18
  export interface TableRenderModel {
@@ -15,6 +15,7 @@ export interface TableRowViewOptions {
15
15
  highlightFieldIds: string[];
16
16
  ariaRowIndex?: number;
17
17
  variableVirtualSize?: boolean;
18
+ intrinsicBlockSize?: number;
18
19
  rowKey?: string;
19
20
  renderSelectionControl: (label: string, checked: boolean, indeterminate: boolean, disabled: boolean, onActivate: () => void) => unknown;
20
21
  renderStickyEdge: (sticky: TableColumn['sticky']) => unknown;
@@ -25,5 +26,5 @@ export interface TableRowViewOptions {
25
26
  onActionMenuToggle: (row: TableRow, column: TableColumn, event: MouseEvent) => void;
26
27
  }
27
28
  /** Render one semantic body row and the complete declarative table-cell vocabulary. */
28
- export declare function renderTableRow({ row, model, visibleColumns, emptyCellLabel, actionMenuElementId, actionMenu, highlightMatcher, highlightFieldIds, ariaRowIndex, variableVirtualSize, rowKey, renderSelectionControl, renderStickyEdge, onRowActivate, onRowKeyDown, onRowSelection, onCellAction, onActionMenuToggle, }: TableRowViewOptions): any;
29
+ export declare function renderTableRow({ row, model, visibleColumns, emptyCellLabel, actionMenuElementId, actionMenu, highlightMatcher, highlightFieldIds, ariaRowIndex, variableVirtualSize, intrinsicBlockSize, rowKey, renderSelectionControl, renderStickyEdge, onRowActivate, onRowKeyDown, onRowSelection, onCellAction, onActionMenuToggle, }: TableRowViewOptions): any;
29
30
  //# sourceMappingURL=table-row-view.d.ts.map