@ds-mo/ui 13.13.0 → 13.14.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 (191) hide show
  1. package/dist/.package-ready.json +1 -1
  2. package/dist/agent-patterns.json +1 -1
  3. package/dist/agent.json +50 -17
  4. package/dist/angular/ds-button-filled.d.ts +1 -1
  5. package/dist/angular/ds-button-filled.js +3 -3
  6. package/dist/angular/ds-button-unfilled.d.ts +1 -1
  7. package/dist/angular/ds-button-unfilled.js +3 -3
  8. package/dist/angular/ds-table.d.ts +4 -1
  9. package/dist/angular/ds-table.js +7 -4
  10. package/dist/angular/ds-tag.d.ts +1 -1
  11. package/dist/angular/ds-tag.js +3 -3
  12. package/dist/components/ds-agent-activity.js +1 -1
  13. package/dist/components/ds-agent-response.js +1 -1
  14. package/dist/components/ds-agent-source-list.js +1 -1
  15. package/dist/components/ds-agent-tool-call.js +1 -1
  16. package/dist/components/ds-attachment-list.js +1 -1
  17. package/dist/components/ds-avatar.js +1 -1
  18. package/dist/components/ds-banner.js +1 -1
  19. package/dist/components/ds-bar-nav.js +1 -1
  20. package/dist/components/ds-bar-title.js +1 -1
  21. package/dist/components/ds-bar-workflow.js +1 -1
  22. package/dist/components/ds-button-filled.js +1 -1
  23. package/dist/components/ds-button-unfilled.js +1 -1
  24. package/dist/components/ds-card-chart.js +1 -1
  25. package/dist/components/ds-card-setting.js +1 -1
  26. package/dist/components/ds-chip.js +1 -1
  27. package/dist/components/ds-code-block.js +1 -1
  28. package/dist/components/ds-empty-state.js +1 -1
  29. package/dist/components/ds-icon.js +1 -1
  30. package/dist/components/ds-input.js +1 -1
  31. package/dist/components/ds-markdown.js +1 -1
  32. package/dist/components/ds-message-actions.js +1 -1
  33. package/dist/components/ds-message-composer.js +1 -1
  34. package/dist/components/ds-message-scroller.js +1 -1
  35. package/dist/components/ds-mobile-bar-nav.js +1 -1
  36. package/dist/components/ds-mobile-header.js +1 -1
  37. package/dist/components/ds-mobile-sheet-nav.js +1 -1
  38. package/dist/components/ds-modal.js +1 -1
  39. package/dist/components/ds-panel-nav.js +1 -1
  40. package/dist/components/ds-panel-tool-header.js +1 -1
  41. package/dist/components/ds-panel-tool-search.js +1 -1
  42. package/dist/components/ds-panel-tools.js +1 -1
  43. package/dist/components/ds-select.js +1 -1
  44. package/dist/components/ds-shell-app.js +1 -1
  45. package/dist/components/ds-shell-tools.js +1 -1
  46. package/dist/components/ds-tab-group.js +1 -1
  47. package/dist/components/ds-table.js +1 -1
  48. package/dist/components/ds-table.js.map +1 -1
  49. package/dist/components/ds-tag.js +1 -1
  50. package/dist/components/ds-toast.js +1 -1
  51. package/dist/components/{p-C3Z01Glr.js → p-Azjx2SsL.js} +2 -2
  52. package/dist/components/p-Azjx2SsL.js.map +1 -0
  53. package/dist/components/{p-DBchq8Zw.js → p-B6linhwY.js} +2 -2
  54. package/dist/components/{p-BEEYhbIb.js → p-B8HG9OFh.js} +2 -2
  55. package/dist/components/p-B8HG9OFh.js.map +1 -0
  56. package/dist/components/{p-BydCwx7x.js → p-BJVzrR_P.js} +2 -2
  57. package/dist/components/{p-Br0fwWUG.js → p-BL0JHLJp.js} +2 -2
  58. package/dist/components/{p-BNHPCCw8.js → p-BPS17WvI.js} +2 -2
  59. package/dist/components/{p-CSlTJWFG.js → p-BSdAFIcG.js} +2 -2
  60. package/dist/components/{p-DGkWMhHO.js → p-BULWzaBs.js} +2 -2
  61. package/dist/components/p-C-aCs6ID.js +2 -0
  62. package/dist/components/{p-Cw1bbiCG.js.map → p-C-aCs6ID.js.map} +1 -1
  63. package/dist/components/{p-BFMV9TJO.js → p-C5ecLNZA.js} +2 -2
  64. package/dist/components/p-C8U5BsJf.js +2 -0
  65. package/dist/components/p-C8U5BsJf.js.map +1 -0
  66. package/dist/components/{p-BUZLhvs1.js → p-COmqMfQo.js} +2 -2
  67. package/dist/components/{p-BAGTb6cZ.js → p-CeyoHpPn.js} +2 -2
  68. package/dist/components/{p-CdFnvBem.js → p-CiUciD5Z.js} +2 -2
  69. package/dist/components/p-CuwopElg.js.map +1 -1
  70. package/dist/components/p-DAM4CDXT.js +2 -0
  71. package/dist/components/{p-CzV4gIxd.js.map → p-DAM4CDXT.js.map} +1 -1
  72. package/dist/components/{p-DBJJiSP0.js → p-DMJEOAwP.js} +2 -2
  73. package/dist/components/{p-DGvzGGcu.js → p-DYAQVvOu.js} +2 -2
  74. package/dist/components/p-DyDkQ8H9.js +2 -0
  75. package/dist/components/p-DyDkQ8H9.js.map +1 -0
  76. package/dist/components/{p-bLCbOPYa.js → p-Dz3Ufmr4.js} +2 -2
  77. package/dist/components/{p-Doz2uwRv.js → p-fkQhr5s9.js} +2 -2
  78. package/dist/components/{p-BgaF83uh.js → p-oOKTL-yx.js} +2 -2
  79. package/dist/docs/components.json +277 -9
  80. package/dist/lib/components/ButtonFilled/ButtonFilled.d.ts +4 -0
  81. package/dist/lib/utils/control-text.d.ts +2 -0
  82. package/dist/lib/utils/index.d.ts +1 -1
  83. package/dist/lib/utils/index.js.map +2 -2
  84. package/dist/mcp-data/registry/agent-activity.json +1 -1
  85. package/dist/mcp-data/registry/agent-response.json +1 -1
  86. package/dist/mcp-data/registry/agent-source-list.json +1 -1
  87. package/dist/mcp-data/registry/agent-tool-call.json +1 -1
  88. package/dist/mcp-data/registry/attachment-list.json +1 -1
  89. package/dist/mcp-data/registry/avatar.json +1 -1
  90. package/dist/mcp-data/registry/badge.json +1 -1
  91. package/dist/mcp-data/registry/banner.json +1 -1
  92. package/dist/mcp-data/registry/bar-nav.json +1 -1
  93. package/dist/mcp-data/registry/bar-title.json +1 -1
  94. package/dist/mcp-data/registry/bar-workflow.json +1 -1
  95. package/dist/mcp-data/registry/breadcrumb.json +1 -1
  96. package/dist/mcp-data/registry/button-filled.json +21 -3
  97. package/dist/mcp-data/registry/button-unfilled.json +27 -7
  98. package/dist/mcp-data/registry/card-chart.json +1 -1
  99. package/dist/mcp-data/registry/card-overview.json +1 -1
  100. package/dist/mcp-data/registry/card-setting.json +1 -1
  101. package/dist/mcp-data/registry/chart-legend.json +1 -1
  102. package/dist/mcp-data/registry/chart.json +1 -1
  103. package/dist/mcp-data/registry/checkbox.json +1 -1
  104. package/dist/mcp-data/registry/chip.json +1 -1
  105. package/dist/mcp-data/registry/code-block.json +1 -1
  106. package/dist/mcp-data/registry/conversation-list-item.json +1 -1
  107. package/dist/mcp-data/registry/conversation-list-section.json +1 -1
  108. package/dist/mcp-data/registry/conversation-list.json +1 -1
  109. package/dist/mcp-data/registry/divider.json +1 -1
  110. package/dist/mcp-data/registry/empty-state.json +1 -1
  111. package/dist/mcp-data/registry/field.json +1 -1
  112. package/dist/mcp-data/registry/icon.json +2 -2
  113. package/dist/mcp-data/registry/input.json +1 -1
  114. package/dist/mcp-data/registry/loader.json +1 -1
  115. package/dist/mcp-data/registry/markdown.json +1 -1
  116. package/dist/mcp-data/registry/menu.json +1 -1
  117. package/dist/mcp-data/registry/message-actions.json +1 -1
  118. package/dist/mcp-data/registry/message-bubble.json +1 -1
  119. package/dist/mcp-data/registry/message-composer.json +1 -1
  120. package/dist/mcp-data/registry/message-scroller.json +1 -1
  121. package/dist/mcp-data/registry/message.json +1 -1
  122. package/dist/mcp-data/registry/mobile-bar-nav.json +1 -1
  123. package/dist/mcp-data/registry/mobile-header.json +1 -1
  124. package/dist/mcp-data/registry/mobile-section-switcher.json +1 -1
  125. package/dist/mcp-data/registry/mobile-sheet-nav.json +1 -1
  126. package/dist/mcp-data/registry/modal.json +1 -1
  127. package/dist/mcp-data/registry/panel-nav.json +1 -1
  128. package/dist/mcp-data/registry/panel-sub-nav.json +1 -1
  129. package/dist/mcp-data/registry/panel-tool-header.json +1 -1
  130. package/dist/mcp-data/registry/panel-tool-search.json +1 -1
  131. package/dist/mcp-data/registry/panel-tools.json +1 -1
  132. package/dist/mcp-data/registry/radio.json +1 -1
  133. package/dist/mcp-data/registry/registry.json +50 -17
  134. package/dist/mcp-data/registry/scroll-overlay.json +1 -1
  135. package/dist/mcp-data/registry/select.json +1 -1
  136. package/dist/mcp-data/registry/shell-app.json +1 -1
  137. package/dist/mcp-data/registry/shell-page.json +1 -1
  138. package/dist/mcp-data/registry/shell-tools.json +1 -1
  139. package/dist/mcp-data/registry/skeleton.json +1 -1
  140. package/dist/mcp-data/registry/slider.json +1 -1
  141. package/dist/mcp-data/registry/swatch-picker.json +1 -1
  142. package/dist/mcp-data/registry/switch.json +1 -1
  143. package/dist/mcp-data/registry/tab-group.json +1 -1
  144. package/dist/mcp-data/registry/table.json +121 -20
  145. package/dist/mcp-data/registry/tag.json +23 -5
  146. package/dist/mcp-data/registry/text.json +1 -1
  147. package/dist/mcp-data/registry/toast.json +1 -1
  148. package/dist/mcp-data/registry/tooltip-chart.json +1 -1
  149. package/dist/mcp-data/registry/tooltip.json +1 -1
  150. package/dist/mcp-data/registry/typing-indicator.json +1 -1
  151. package/dist/react/ds-table.d.ts +2 -1
  152. package/dist/react/ds-table.js +1 -0
  153. package/dist/styles/table.css +244 -26
  154. package/dist/types/components/ButtonFilled/ButtonFilled.d.ts +4 -0
  155. package/dist/types/components/ButtonUnfilled/ButtonUnfilled.d.ts +11 -1
  156. package/dist/types/components/Table/Table.d.ts +31 -23
  157. package/dist/types/components/Table/index.d.ts +1 -1
  158. package/dist/types/components/Table/table-cell-model.d.ts +44 -0
  159. package/dist/types/components/Table/table-layout-controller.d.ts +65 -0
  160. package/dist/types/components/Table/table-load-controller.d.ts +49 -0
  161. package/dist/types/components/Table/table-model.d.ts +25 -0
  162. package/dist/types/components/Table/table-render-model.d.ts +41 -0
  163. package/dist/types/components/Table/table-types.d.ts +23 -2
  164. package/dist/types/components/Tag/Tag.d.ts +3 -0
  165. package/dist/types/components.d.ts +84 -8
  166. package/dist/types/utils/control-text.d.ts +2 -0
  167. package/dist/types/utils/index.d.ts +1 -1
  168. package/package.json +3 -3
  169. package/dist/components/p-BEEYhbIb.js.map +0 -1
  170. package/dist/components/p-C3Z01Glr.js.map +0 -1
  171. package/dist/components/p-Cw1bbiCG.js +0 -2
  172. package/dist/components/p-CzV4gIxd.js +0 -2
  173. package/dist/components/p-D-F8eyXy.js +0 -2
  174. package/dist/components/p-D-F8eyXy.js.map +0 -1
  175. package/dist/components/p-DumWT7NN.js +0 -2
  176. package/dist/components/p-DumWT7NN.js.map +0 -1
  177. /package/dist/components/{p-DBchq8Zw.js.map → p-B6linhwY.js.map} +0 -0
  178. /package/dist/components/{p-BydCwx7x.js.map → p-BJVzrR_P.js.map} +0 -0
  179. /package/dist/components/{p-Br0fwWUG.js.map → p-BL0JHLJp.js.map} +0 -0
  180. /package/dist/components/{p-BNHPCCw8.js.map → p-BPS17WvI.js.map} +0 -0
  181. /package/dist/components/{p-CSlTJWFG.js.map → p-BSdAFIcG.js.map} +0 -0
  182. /package/dist/components/{p-DGkWMhHO.js.map → p-BULWzaBs.js.map} +0 -0
  183. /package/dist/components/{p-BFMV9TJO.js.map → p-C5ecLNZA.js.map} +0 -0
  184. /package/dist/components/{p-BUZLhvs1.js.map → p-COmqMfQo.js.map} +0 -0
  185. /package/dist/components/{p-BAGTb6cZ.js.map → p-CeyoHpPn.js.map} +0 -0
  186. /package/dist/components/{p-CdFnvBem.js.map → p-CiUciD5Z.js.map} +0 -0
  187. /package/dist/components/{p-DBJJiSP0.js.map → p-DMJEOAwP.js.map} +0 -0
  188. /package/dist/components/{p-DGvzGGcu.js.map → p-DYAQVvOu.js.map} +0 -0
  189. /package/dist/components/{p-bLCbOPYa.js.map → p-Dz3Ufmr4.js.map} +0 -0
  190. /package/dist/components/{p-Doz2uwRv.js.map → p-fkQhr5s9.js.map} +0 -0
  191. /package/dist/components/{p-BgaF83uh.js.map → p-oOKTL-yx.js.map} +0 -0
@@ -62,8 +62,8 @@
62
62
  "Neutral is ordinary metadata; brand marks Motive or product affiliation; AI marks AI-generated or AI-assisted content; positive, caution, warning, and negative communicate increasingly specific status meaning.",
63
63
  "Warning signals higher urgency or risk than caution, which asks for attention before a possible issue.",
64
64
  "Contrast changes visual prominence without changing semantic intent or parent surface context.",
65
- "Rounded is an optional visual style with no semantic difference.",
66
- "isInset opts into reduced outer geometry only when Tag is nested inside a control of the same density; semantic styling, typography, icons, gaps, radius, and interaction remain unchanged.",
65
+ "Rounded is an optional visual style with no semantic difference. Every size and inset depth keeps a minimum inline size equal to its resolved height, so short labels such as a one-digit count render as circles instead of vertically elongated pills.",
66
+ "isInset opts into reduced outer geometry only when Tag is nested inside a control of the same density. The default single inset removes 4px overall; insetDepth double removes 8px overall and falls back to single at xs to protect minimum icon geometry. Semantic styling, typography, icons, gaps, radius, and interaction remain unchanged.",
67
67
  "Labels stay on one line and truncate only when the owner supplies a maximum width.",
68
68
  "Omitted interactive renders static metadata with no focus, event, or suffix. Interactive adds the fixed ChevronUpDown suffix and emits dsClick without toggling expanded internally.",
69
69
  "isInactive disables only the interactive button and applies the shared inactive treatment."
@@ -126,6 +126,15 @@
126
126
  "mutable": false,
127
127
  "description": "Canonical icon name rendered before the visible label."
128
128
  },
129
+ "insetDepth": {
130
+ "type": "ControlInsetDepth",
131
+ "resolvedType": "\"double\" | \"single\"",
132
+ "attribute": "inset-depth",
133
+ "default": "'single'",
134
+ "required": false,
135
+ "mutable": false,
136
+ "description": "Single removes 4px overall; double removes 8px overall (xs stays single)."
137
+ },
129
138
  "intent": {
130
139
  "type": "TagIntent",
131
140
  "resolvedType": "\"ai\" | \"brand\" | \"caution\" | \"negative\" | \"neutral\" | \"positive\" | \"warning\"",
@@ -240,6 +249,15 @@
240
249
  "mutable": false,
241
250
  "description": "Canonical icon name rendered before the visible label."
242
251
  },
252
+ "insetDepth": {
253
+ "type": "ControlInsetDepth",
254
+ "resolvedType": "\"double\" | \"single\"",
255
+ "attribute": "inset-depth",
256
+ "default": "'single'",
257
+ "required": false,
258
+ "mutable": false,
259
+ "description": "Single removes 4px overall; double removes 8px overall (xs stays single)."
260
+ },
243
261
  "intent": {
244
262
  "type": "TagIntent",
245
263
  "resolvedType": "\"ai\" | \"brand\" | \"caution\" | \"negative\" | \"neutral\" | \"positive\" | \"warning\"",
@@ -341,7 +359,7 @@
341
359
  "peerDependencies": {
342
360
  "required": [
343
361
  "@ds-mo/tokens ^6.0.0",
344
- "@ds-mo/icons ^6.5.0"
362
+ "@ds-mo/icons ^6.6.0"
345
363
  ],
346
364
  "frameworks": "Custom Elements; React 18/19 wrappers; Angular 19-22 standalone adapters."
347
365
  }
@@ -359,12 +377,12 @@
359
377
  "files": [
360
378
  {
361
379
  "path": "src/wc/components/Tag/Tag.css",
362
- "content": "@import '../../utils/tag-chip.css';\n@import '../../utils/control-density-inset.css';\n\n/* ── Intent × Contrast — strong ─────────────────────────────────────────── */\n\n:host(.tag--intent-neutral.tag--contrast-strong) { background-color: var(--color-background-strong-neutral); color: var(--color-foreground-medium-neutral); }\n:host(.tag--intent-brand.tag--contrast-strong) { background-color: var(--color-background-strong-brand); color: var(--color-foreground-on-strong-background-primary); }\n:host(.tag--intent-ai.tag--contrast-strong) { background-color: var(--color-background-strong-ai); color: var(--color-foreground-medium-ai); }\n:host(.tag--intent-negative.tag--contrast-strong) { background-color: var(--color-background-strong-negative); color: var(--color-foreground-medium-negative); }\n:host(.tag--intent-warning.tag--contrast-strong) { background-color: var(--color-background-strong-warning); color: var(--color-foreground-medium-warning); }\n:host(.tag--intent-caution.tag--contrast-strong) { background-color: var(--color-background-strong-caution); color: var(--color-foreground-medium-caution); }\n:host(.tag--intent-positive.tag--contrast-strong) { background-color: var(--color-background-strong-positive); color: var(--color-foreground-medium-positive); }\n\n/* ── Intent × Contrast — bold ───────────────────────────────────────────── */\n\n:host(.tag--intent-neutral.tag--contrast-bold) { background-color: var(--color-background-bold-neutral); color: var(--color-foreground-on-bold-background-primary); }\n:host(.tag--intent-brand.tag--contrast-bold) { background-color: var(--color-background-bold-brand); color: var(--color-foreground-on-bold-background-primary); }\n:host(.tag--intent-ai.tag--contrast-bold) { background-color: var(--color-background-bold-ai); color: var(--color-foreground-on-bold-background-primary); }\n:host(.tag--intent-negative.tag--contrast-bold) { background-color: var(--color-background-bold-negative); color: var(--color-foreground-on-bold-background-primary); }\n:host(.tag--intent-warning.tag--contrast-bold) { background-color: var(--color-background-bold-warning); color: var(--color-foreground-on-bold-background-primary); }\n:host(.tag--intent-caution.tag--contrast-bold) { background-color: var(--color-background-bold-caution); color: var(--color-foreground-on-bold-background-primary); }\n:host(.tag--intent-positive.tag--contrast-bold) { background-color: var(--color-background-bold-positive); color: var(--color-foreground-on-bold-background-primary); }\n\n/* ── Intent × Contrast — medium ─────────────────────────────────────────── */\n\n:host(.tag--intent-neutral.tag--contrast-medium) { background-color: var(--color-background-medium-neutral); color: var(--color-foreground-strong-neutral); }\n:host(.tag--intent-brand.tag--contrast-medium) { background-color: var(--color-background-medium-brand); color: var(--color-foreground-on-medium-background-primary); }\n:host(.tag--intent-ai.tag--contrast-medium) { background-color: var(--color-background-medium-ai); color: var(--color-foreground-strong-ai); }\n:host(.tag--intent-negative.tag--contrast-medium) { background-color: var(--color-background-medium-negative); color: var(--color-foreground-strong-negative); }\n:host(.tag--intent-warning.tag--contrast-medium) { background-color: var(--color-background-medium-warning); color: var(--color-foreground-strong-warning); }\n:host(.tag--intent-caution.tag--contrast-medium) { background-color: var(--color-background-medium-caution); color: var(--color-foreground-strong-caution); }\n:host(.tag--intent-positive.tag--contrast-medium) { background-color: var(--color-background-medium-positive); color: var(--color-foreground-strong-positive); }\n\n/* ── Intent × Contrast — faint ──────────────────────────────────────────── */\n\n:host(.tag--intent-neutral.tag--contrast-faint) { background-color: var(--color-background-faint-neutral); color: var(--color-foreground-bold-neutral); }\n:host(.tag--intent-brand.tag--contrast-faint) { background-color: var(--color-background-faint-brand); color: var(--color-foreground-bold-brand); }\n:host(.tag--intent-ai.tag--contrast-faint) { background-color: var(--color-background-faint-ai); color: var(--color-foreground-bold-ai); }\n:host(.tag--intent-negative.tag--contrast-faint) { background-color: var(--color-background-faint-negative); color: var(--color-foreground-bold-negative); }\n:host(.tag--intent-warning.tag--contrast-faint) { background-color: var(--color-background-faint-warning); color: var(--color-foreground-bold-warning); }\n:host(.tag--intent-caution.tag--contrast-faint) { background-color: var(--color-background-faint-caution); color: var(--color-foreground-bold-caution); }\n:host(.tag--intent-positive.tag--contrast-faint) { background-color: var(--color-background-faint-positive); color: var(--color-foreground-bold-positive); }\n\n/* ── Interactive menu trigger ───────────────────────────────────────────── */\n\n:host(.tag--interactive) {\n padding: 0;\n gap: 0;\n}\n\n.tag__button {\n all: unset;\n position: relative;\n z-index: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n box-sizing: border-box;\n min-width: 0;\n max-width: 100%;\n height: 100%;\n padding: 0 var(--ds-control-padding-inline);\n gap: var(--ds-control-gap);\n border-radius: inherit;\n color: inherit;\n cursor: default;\n}\n\n.tag__button:disabled {\n cursor: not-allowed;\n}\n\n.tag__button--expanded::after {\n background: var(--ds-interaction-pressed);\n}\n\n/* Hover/press wash stays above the Tag's semantic background. */\n\n/* ── Icons ──────────────────────────────────────────────────────────────── */\n\n.tag__prefix-icon,\n.tag__suffix-icon {\n position: relative;\n z-index: 2;\n display: inline-flex;\n flex-shrink: 0;\n width: var(--ds-control-icon);\n height: var(--ds-control-icon);\n}\n",
380
+ "content": "@import '../../utils/tag-chip.css';\n@import '../../utils/control-density-inset.css';\n\n/* A one-character rounded Tag resolves to a circle at every density. */\n:host {\n min-inline-size: var(--ds-control-height);\n}\n\n/* ── Intent × Contrast — strong ─────────────────────────────────────────── */\n\n:host(.tag--intent-neutral.tag--contrast-strong) { background-color: var(--color-background-strong-neutral); color: var(--color-foreground-medium-neutral); }\n:host(.tag--intent-brand.tag--contrast-strong) { background-color: var(--color-background-strong-brand); color: var(--color-foreground-on-strong-background-primary); }\n:host(.tag--intent-ai.tag--contrast-strong) { background-color: var(--color-background-strong-ai); color: var(--color-foreground-medium-ai); }\n:host(.tag--intent-negative.tag--contrast-strong) { background-color: var(--color-background-strong-negative); color: var(--color-foreground-medium-negative); }\n:host(.tag--intent-warning.tag--contrast-strong) { background-color: var(--color-background-strong-warning); color: var(--color-foreground-medium-warning); }\n:host(.tag--intent-caution.tag--contrast-strong) { background-color: var(--color-background-strong-caution); color: var(--color-foreground-medium-caution); }\n:host(.tag--intent-positive.tag--contrast-strong) { background-color: var(--color-background-strong-positive); color: var(--color-foreground-medium-positive); }\n\n/* ── Intent × Contrast — bold ───────────────────────────────────────────── */\n\n:host(.tag--intent-neutral.tag--contrast-bold) { background-color: var(--color-background-bold-neutral); color: var(--color-foreground-on-bold-background-primary); }\n:host(.tag--intent-brand.tag--contrast-bold) { background-color: var(--color-background-bold-brand); color: var(--color-foreground-on-bold-background-primary); }\n:host(.tag--intent-ai.tag--contrast-bold) { background-color: var(--color-background-bold-ai); color: var(--color-foreground-on-bold-background-primary); }\n:host(.tag--intent-negative.tag--contrast-bold) { background-color: var(--color-background-bold-negative); color: var(--color-foreground-on-bold-background-primary); }\n:host(.tag--intent-warning.tag--contrast-bold) { background-color: var(--color-background-bold-warning); color: var(--color-foreground-on-bold-background-primary); }\n:host(.tag--intent-caution.tag--contrast-bold) { background-color: var(--color-background-bold-caution); color: var(--color-foreground-on-bold-background-primary); }\n:host(.tag--intent-positive.tag--contrast-bold) { background-color: var(--color-background-bold-positive); color: var(--color-foreground-on-bold-background-primary); }\n\n/* ── Intent × Contrast — medium ─────────────────────────────────────────── */\n\n:host(.tag--intent-neutral.tag--contrast-medium) { background-color: var(--color-background-medium-neutral); color: var(--color-foreground-strong-neutral); }\n:host(.tag--intent-brand.tag--contrast-medium) { background-color: var(--color-background-medium-brand); color: var(--color-foreground-on-medium-background-primary); }\n:host(.tag--intent-ai.tag--contrast-medium) { background-color: var(--color-background-medium-ai); color: var(--color-foreground-strong-ai); }\n:host(.tag--intent-negative.tag--contrast-medium) { background-color: var(--color-background-medium-negative); color: var(--color-foreground-strong-negative); }\n:host(.tag--intent-warning.tag--contrast-medium) { background-color: var(--color-background-medium-warning); color: var(--color-foreground-strong-warning); }\n:host(.tag--intent-caution.tag--contrast-medium) { background-color: var(--color-background-medium-caution); color: var(--color-foreground-strong-caution); }\n:host(.tag--intent-positive.tag--contrast-medium) { background-color: var(--color-background-medium-positive); color: var(--color-foreground-strong-positive); }\n\n/* ── Intent × Contrast — faint ──────────────────────────────────────────── */\n\n:host(.tag--intent-neutral.tag--contrast-faint) { background-color: var(--color-background-faint-neutral); color: var(--color-foreground-bold-neutral); }\n:host(.tag--intent-brand.tag--contrast-faint) { background-color: var(--color-background-faint-brand); color: var(--color-foreground-bold-brand); }\n:host(.tag--intent-ai.tag--contrast-faint) { background-color: var(--color-background-faint-ai); color: var(--color-foreground-bold-ai); }\n:host(.tag--intent-negative.tag--contrast-faint) { background-color: var(--color-background-faint-negative); color: var(--color-foreground-bold-negative); }\n:host(.tag--intent-warning.tag--contrast-faint) { background-color: var(--color-background-faint-warning); color: var(--color-foreground-bold-warning); }\n:host(.tag--intent-caution.tag--contrast-faint) { background-color: var(--color-background-faint-caution); color: var(--color-foreground-bold-caution); }\n:host(.tag--intent-positive.tag--contrast-faint) { background-color: var(--color-background-faint-positive); color: var(--color-foreground-bold-positive); }\n\n/* ── Interactive menu trigger ───────────────────────────────────────────── */\n\n:host(.tag--interactive) {\n padding: 0;\n gap: 0;\n}\n\n.tag__button {\n all: unset;\n position: relative;\n z-index: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n box-sizing: border-box;\n min-width: 0;\n max-width: 100%;\n height: 100%;\n padding: 0 var(--ds-control-padding-inline);\n gap: var(--ds-control-gap);\n border-radius: inherit;\n color: inherit;\n cursor: default;\n}\n\n.tag__button:disabled {\n cursor: not-allowed;\n}\n\n.tag__button--expanded::after {\n background: var(--ds-interaction-pressed);\n}\n\n/* Hover/press wash stays above the Tag's semantic background. */\n\n/* ── Icons ──────────────────────────────────────────────────────────────── */\n\n.tag__prefix-icon,\n.tag__suffix-icon {\n position: relative;\n z-index: 2;\n display: inline-flex;\n flex-shrink: 0;\n width: var(--ds-control-icon);\n height: var(--ds-control-icon);\n}\n",
363
381
  "type": "registry:ui"
364
382
  },
365
383
  {
366
384
  "path": "src/wc/components/Tag/Tag.tsx",
367
- "content": "import { Component, Event, EventEmitter, Prop, h, Host } from '@stencil/core';\nimport { CONTROL_TEXT_VARIANT } from '../../utils';\n\nexport type TagIntent = 'neutral' | 'brand' | 'ai' | 'negative' | 'warning' | 'caution' | 'positive';\nexport type TagContrast = 'strong' | 'bold' | 'medium' | 'faint';\nexport type TagSize = 'md' | 'sm' | 'xs';\n\n/**\n * `ds-icon` size prop matching control-density icon metrics\n * (md→20 / sm→16 / xs→12 via `--dimension-iconography-*`).\n */\nconst ICON_SIZE: Record<TagSize, 'md' | 'sm' | 'xs'> = {\n md: 'md',\n sm: 'sm',\n xs: 'xs',\n};\n\n@Component({\n tag: 'ds-tag',\n styleUrl: 'Tag.css',\n scoped: true,\n})\nexport class Tag {\n @Prop() label!: string;\n /** Canonical icon name rendered before the visible label. */\n @Prop() icon: string = '';\n @Prop() intent: TagIntent = 'neutral';\n @Prop() contrast: TagContrast = 'faint';\n @Prop() size: TagSize = 'md';\n /** Use the reduced outer geometry when nested inside a control of the same size. */\n @Prop() isInset: boolean = false;\n @Prop() rounded: boolean = false;\n @Prop() maxWidth: string | number | undefined;\n /** Render a menu-trigger button with a fixed ChevronUpDown suffix. */\n @Prop() interactive: boolean = false;\n /** Controlled open state for the menu triggered by an interactive Tag. */\n @Prop() expanded: boolean = false;\n /** ID of the menu controlled by an interactive Tag. */\n @Prop() ariaControls: string | undefined;\n /** Disable an interactive Tag and apply the shared inactive treatment. */\n @Prop() isInactive: boolean = false;\n\n /** Fired when the interactive Tag button is activated. */\n @Event() dsClick!: EventEmitter<MouseEvent>;\n\n private handleClick = (event: MouseEvent) => {\n if (!this.interactive || this.isInactive) return;\n this.dsClick.emit(event);\n };\n\n render() {\n const textVariant = CONTROL_TEXT_VARIANT[this.size];\n const iconSize = ICON_SIZE[this.size];\n\n const maxWidthStyle = this.maxWidth != null\n ? { maxWidth: typeof this.maxWidth === 'number' ? `${this.maxWidth}px` : this.maxWidth }\n : undefined;\n const hostClass = {\n 'tag': true,\n [`tag--intent-${this.intent}`]: true,\n [`tag--contrast-${this.contrast}`]: true,\n [`tag--size-${this.size}`]: true,\n 'ds-control--md': this.size === 'md',\n 'ds-control--sm': this.size === 'sm',\n 'ds-control--xs': this.size === 'xs',\n 'ds-control--inset': this.isInset,\n 'tag--rounded': this.rounded,\n 'tag--interactive': this.interactive,\n 'ds-control-inactive': this.interactive && this.isInactive,\n };\n const content = [\n this.icon && (\n <ds-icon\n class=\"tag__prefix-icon\"\n name={this.icon}\n size={iconSize}\n color=\"inherit\"\n ></ds-icon>\n ),\n <ds-text class=\"tag__label\" as=\"span\" variant={textVariant} color=\"inherit\">\n {this.label}\n </ds-text>,\n ];\n\n if (!this.interactive) {\n return <Host class={hostClass} style={maxWidthStyle}>{content}</Host>;\n }\n\n return (\n <Host class={hostClass} style={maxWidthStyle}>\n <button\n type=\"button\"\n class={{\n 'tag__button': true,\n 'tag__button--expanded': this.expanded,\n 'ds-interaction-fill': true,\n 'ds-focus-ring-inset': true,\n }}\n aria-haspopup=\"menu\"\n aria-expanded={this.expanded ? 'true' : 'false'}\n aria-controls={this.ariaControls}\n disabled={this.isInactive || undefined}\n onClick={this.handleClick}\n >\n {content}\n <ds-icon\n class=\"tag__suffix-icon\"\n name=\"ChevronUpDown\"\n size={iconSize}\n color=\"inherit\"\n ></ds-icon>\n </button>\n </Host>\n );\n }\n}\n",
385
+ "content": "import { Component, Event, EventEmitter, Prop, h, Host } from '@stencil/core';\nimport { CONTROL_TEXT_VARIANT, type ControlInsetDepth } from '../../utils';\n\nexport type TagIntent = 'neutral' | 'brand' | 'ai' | 'negative' | 'warning' | 'caution' | 'positive';\nexport type TagContrast = 'strong' | 'bold' | 'medium' | 'faint';\nexport type TagSize = 'md' | 'sm' | 'xs';\n\n/**\n * `ds-icon` size prop matching control-density icon metrics\n * (md→20 / sm→16 / xs→12 via `--dimension-iconography-*`).\n */\nconst ICON_SIZE: Record<TagSize, 'md' | 'sm' | 'xs'> = {\n md: 'md',\n sm: 'sm',\n xs: 'xs',\n};\n\n@Component({\n tag: 'ds-tag',\n styleUrl: 'Tag.css',\n scoped: true,\n})\nexport class Tag {\n @Prop() label!: string;\n /** Canonical icon name rendered before the visible label. */\n @Prop() icon: string = '';\n @Prop() intent: TagIntent = 'neutral';\n @Prop() contrast: TagContrast = 'faint';\n @Prop() size: TagSize = 'md';\n /** Use the reduced outer geometry when nested inside a control of the same size. */\n @Prop() isInset: boolean = false;\n /** Single removes 4px overall; double removes 8px overall (xs stays single). */\n @Prop() insetDepth: ControlInsetDepth = 'single';\n @Prop() rounded: boolean = false;\n @Prop() maxWidth: string | number | undefined;\n /** Render a menu-trigger button with a fixed ChevronUpDown suffix. */\n @Prop() interactive: boolean = false;\n /** Controlled open state for the menu triggered by an interactive Tag. */\n @Prop() expanded: boolean = false;\n /** ID of the menu controlled by an interactive Tag. */\n @Prop() ariaControls: string | undefined;\n /** Disable an interactive Tag and apply the shared inactive treatment. */\n @Prop() isInactive: boolean = false;\n\n /** Fired when the interactive Tag button is activated. */\n @Event() dsClick!: EventEmitter<MouseEvent>;\n\n private handleClick = (event: MouseEvent) => {\n if (!this.interactive || this.isInactive) return;\n this.dsClick.emit(event);\n };\n\n render() {\n const textVariant = CONTROL_TEXT_VARIANT[this.size];\n const iconSize = ICON_SIZE[this.size];\n const doubleInset = this.isInset && this.insetDepth === 'double' && this.size !== 'xs';\n\n const maxWidthStyle = this.maxWidth != null\n ? { maxWidth: typeof this.maxWidth === 'number' ? `${this.maxWidth}px` : this.maxWidth }\n : undefined;\n const hostClass = {\n 'tag': true,\n [`tag--intent-${this.intent}`]: true,\n [`tag--contrast-${this.contrast}`]: true,\n [`tag--size-${this.size}`]: true,\n 'ds-control--md': this.size === 'md',\n 'ds-control--sm': this.size === 'sm',\n 'ds-control--xs': this.size === 'xs',\n 'ds-control--inset': this.isInset && !doubleInset,\n 'ds-control--inset-double': doubleInset,\n 'tag--rounded': this.rounded,\n 'tag--interactive': this.interactive,\n 'ds-control-inactive': this.interactive && this.isInactive,\n };\n const content = [\n this.icon && (\n <ds-icon\n class=\"tag__prefix-icon\"\n name={this.icon}\n size={iconSize}\n color=\"inherit\"\n ></ds-icon>\n ),\n <ds-text class=\"tag__label\" as=\"span\" variant={textVariant} color=\"inherit\">\n {this.label}\n </ds-text>,\n ];\n\n if (!this.interactive) {\n return <Host class={hostClass} style={maxWidthStyle}>{content}</Host>;\n }\n\n return (\n <Host class={hostClass} style={maxWidthStyle}>\n <button\n type=\"button\"\n class={{\n 'tag__button': true,\n 'tag__button--expanded': this.expanded,\n 'ds-interaction-fill': true,\n 'ds-focus-ring-inset': true,\n }}\n aria-haspopup=\"menu\"\n aria-expanded={this.expanded ? 'true' : 'false'}\n aria-controls={this.ariaControls}\n disabled={this.isInactive || undefined}\n onClick={this.handleClick}\n >\n {content}\n <ds-icon\n class=\"tag__suffix-icon\"\n name=\"ChevronUpDown\"\n size={iconSize}\n color=\"inherit\"\n ></ds-icon>\n </button>\n </Host>\n );\n }\n}\n",
368
386
  "type": "registry:ui"
369
387
  }
370
388
  ]
@@ -335,7 +335,7 @@
335
335
  "peerDependencies": {
336
336
  "required": [
337
337
  "@ds-mo/tokens ^6.0.0",
338
- "@ds-mo/icons ^6.5.0"
338
+ "@ds-mo/icons ^6.6.0"
339
339
  ],
340
340
  "frameworks": "Custom Elements; React 18/19 wrappers; Angular 19-22 standalone adapters."
341
341
  }
@@ -308,7 +308,7 @@
308
308
  "peerDependencies": {
309
309
  "required": [
310
310
  "@ds-mo/tokens ^6.0.0",
311
- "@ds-mo/icons ^6.5.0"
311
+ "@ds-mo/icons ^6.6.0"
312
312
  ],
313
313
  "frameworks": "Custom Elements; React 18/19 wrappers; Angular 19-22 standalone adapters."
314
314
  }
@@ -225,7 +225,7 @@
225
225
  "peerDependencies": {
226
226
  "required": [
227
227
  "@ds-mo/tokens ^6.0.0",
228
- "@ds-mo/icons ^6.5.0"
228
+ "@ds-mo/icons ^6.6.0"
229
229
  ],
230
230
  "frameworks": "Custom Elements; React 18/19 wrappers; Angular 19-22 standalone adapters."
231
231
  }
@@ -278,7 +278,7 @@
278
278
  "peerDependencies": {
279
279
  "required": [
280
280
  "@ds-mo/tokens ^6.0.0",
281
- "@ds-mo/icons ^6.5.0"
281
+ "@ds-mo/icons ^6.6.0"
282
282
  ],
283
283
  "frameworks": "Custom Elements; React 18/19 wrappers; Angular 19-22 standalone adapters."
284
284
  }
@@ -99,7 +99,7 @@
99
99
  "peerDependencies": {
100
100
  "required": [
101
101
  "@ds-mo/tokens ^6.0.0",
102
- "@ds-mo/icons ^6.5.0"
102
+ "@ds-mo/icons ^6.6.0"
103
103
  ],
104
104
  "frameworks": "Custom Elements; React 18/19 wrappers; Angular 19-22 standalone adapters."
105
105
  }
@@ -3,12 +3,13 @@
3
3
  * Changes to this file may cause incorrect behavior and will be lost if the code is regenerated.
4
4
  */
5
5
  import type { EventName, StencilReactComponent } from './react-runtime.js';
6
- import { type DsTableCustomEvent, type TableCellActionDetail, type TableGroupingChangeDetail, type TableLoadMoreDetail, type TableRowActivateDetail, type TableSelectionChangeDetail, type TableSortChangeDetail } from "@ds-mo/ui";
6
+ import { type DsTableCustomEvent, type TableCellActionDetail, type TableGroupCollapseChangeDetail, type TableGroupingChangeDetail, type TableLoadMoreDetail, type TableRowActivateDetail, type TableSelectionChangeDetail, type TableSortChangeDetail } from "@ds-mo/ui";
7
7
  import type { Components } from "@ds-mo/ui/dist/components";
8
8
  import { DsTable as DsTableElement } from "@ds-mo/ui/dist/components/ds-table.js";
9
9
  export type DsTableEvents = {
10
10
  onDsSortChange: EventName<DsTableCustomEvent<TableSortChangeDetail>>;
11
11
  onDsGroupingChange: EventName<DsTableCustomEvent<TableGroupingChangeDetail>>;
12
+ onDsGroupCollapseChange: EventName<DsTableCustomEvent<TableGroupCollapseChangeDetail>>;
12
13
  onDsSelectionChange: EventName<DsTableCustomEvent<TableSelectionChangeDetail>>;
13
14
  onDsLoadMore: EventName<DsTableCustomEvent<TableLoadMoreDetail>>;
14
15
  onDsCellAction: EventName<DsTableCustomEvent<TableCellActionDetail>>;
@@ -10,6 +10,7 @@ export const DsTable = /*@__PURE__*/ createComponent({
10
10
  events: {
11
11
  onDsSortChange: 'dsSortChange',
12
12
  onDsGroupingChange: 'dsGroupingChange',
13
+ onDsGroupCollapseChange: 'dsGroupCollapseChange',
13
14
  onDsSelectionChange: 'dsSelectionChange',
14
15
  onDsLoadMore: 'dsLoadMore',
15
16
  onDsCellAction: 'dsCellAction',
@@ -16,7 +16,7 @@
16
16
  );
17
17
  --_table-cell-track-label-inset: var(--dimension-space-025);
18
18
  --_table-image-block-size: calc(
19
- var(--dimension-size-800) - var(--dimension-space-150)
19
+ var(--dimension-size-800) - var(--dimension-space-200)
20
20
  );
21
21
  --_table-surface: var(--ds-table-surface, var(--color-background-primary));
22
22
  --_table-header-surface: var(--ds-table-header-surface, var(--color-background-primary));
@@ -28,7 +28,7 @@
28
28
  --_table-column-border: var(--ds-table-column-border, var(--color-border-tertiary));
29
29
  --_table-sticky-border: var(--ds-table-sticky-border, var(--color-border-secondary));
30
30
  --_table-border-strong: var(--ds-table-border-strong, var(--color-border-secondary));
31
- --_table-radius: var(--ds-table-radius, var(--dimension-radius-075));
31
+ --_table-radius: var(--ds-table-radius, var(--dimension-radius-000));
32
32
  --_table-header-min-block-size: var(
33
33
  --ds-table-header-min-block-size,
34
34
  var(--dimension-size-400)
@@ -49,16 +49,16 @@
49
49
  --ds-table-selection-column-inline-size,
50
50
  var(--dimension-size-500)
51
51
  );
52
- --_table-selection-column-contribution: 0;
52
+ --_table-selection-column-contribution: 0px;
53
53
  --_table-sticky-start-shadow: var(
54
54
  --ds-table-sticky-start-shadow,
55
- inset var(--dimension-space-050) 0 var(--dimension-space-050)
56
- calc(-1 * var(--dimension-space-050)) var(--color-elevation-shadow)
55
+ inset var(--dimension-space-100) 0 var(--dimension-space-100)
56
+ calc(-1 * var(--dimension-space-100)) var(--color-elevation-shadow)
57
57
  );
58
58
  --_table-sticky-end-shadow: var(
59
59
  --ds-table-sticky-end-shadow,
60
- inset calc(-1 * var(--dimension-space-050)) 0 var(--dimension-space-050)
61
- calc(-1 * var(--dimension-space-050)) var(--color-elevation-shadow)
60
+ inset calc(-1 * var(--dimension-space-100)) 0 var(--dimension-space-100)
61
+ calc(-1 * var(--dimension-space-100)) var(--color-elevation-shadow)
62
62
  );
63
63
  display: block;
64
64
  box-sizing: border-box;
@@ -107,7 +107,13 @@
107
107
  :where(.ds-table__table) {
108
108
  box-sizing: border-box;
109
109
  inline-size: 100%;
110
- min-inline-size: max(100%, var(--ds-table-explicit-min-inline-size, 0));
110
+ min-inline-size: max(
111
+ 100%,
112
+ calc(
113
+ var(--ds-table-explicit-min-inline-size, 0px) +
114
+ var(--_table-selection-column-contribution)
115
+ )
116
+ );
111
117
  border: 0;
112
118
  border-spacing: 0;
113
119
  border-collapse: separate;
@@ -118,21 +124,42 @@
118
124
 
119
125
  :where(.ds-table__table--selectable) {
120
126
  --_table-selection-column-contribution: var(--_table-selection-column-inline-size);
121
- min-inline-size: max(
122
- 100%,
123
- calc(var(--ds-table-explicit-min-inline-size, 0) + var(--_table-selection-column-contribution))
124
- );
125
127
  }
126
128
 
127
- :where(.ds-table__caption) {
128
- padding: var(--_table-cell-padding-inline);
129
- border-block-end: var(--dimension-stroke-width-012) solid var(--_table-border);
129
+ :where(.ds-table__caption-bar),
130
+ :where(.ds-table__footer) {
131
+ box-sizing: border-box;
132
+ display: flex;
133
+ align-items: center;
134
+ inline-size: 100%;
135
+ min-block-size: var(--dimension-size-600);
136
+ block-size: var(--dimension-size-600);
137
+ padding-inline: var(--_table-cell-padding-inline);
130
138
  background: var(--_table-surface);
131
139
  text-align: start;
132
140
  }
133
141
 
142
+ :where(.ds-table__caption-bar) {
143
+ border-block-end: var(--dimension-stroke-width-012) solid var(--_table-border);
144
+ color: var(--color-foreground-primary);
145
+ }
146
+
147
+ /* Optional controlled result summary. */
148
+ :where(.ds-table__footer) {
149
+ border-block-start: var(--dimension-stroke-width-012) solid var(--_table-border);
150
+ color: var(--color-foreground-secondary);
151
+ }
152
+
134
153
  :where(.ds-table__selection-column) {
135
154
  inline-size: var(--_table-selection-column-inline-size);
155
+ width: var(--_table-selection-column-inline-size);
156
+ max-inline-size: var(--_table-selection-column-inline-size);
157
+ max-width: var(--_table-selection-column-inline-size);
158
+ }
159
+
160
+ :where(.ds-table__action-column) {
161
+ inline-size: var(--dimension-size-500);
162
+ width: var(--dimension-size-500);
136
163
  }
137
164
 
138
165
  :where(.ds-table__head) {
@@ -375,7 +402,7 @@
375
402
  :where(.ds-table__header-labels),
376
403
  :where(.ds-table__header-segment),
377
404
  :where(.ds-table__sort-slot),
378
- :where(.ds-table__group-content),
405
+ :where(.ds-table__collapse-slot),
379
406
  :where(.ds-table__load-content) {
380
407
  display: inline-flex;
381
408
  align-items: center;
@@ -388,6 +415,10 @@
388
415
  gap: var(--dimension-space-050);
389
416
  }
390
417
 
418
+ :where(.ds-table__header-content--collapse-all) {
419
+ justify-content: flex-end;
420
+ }
421
+
391
422
  :where(.ds-table__header-labels) {
392
423
  max-inline-size: 100%;
393
424
  gap: var(--dimension-space-025);
@@ -407,6 +438,44 @@
407
438
  flex: 0 0 auto;
408
439
  inline-size: var(--dimension-size-200);
409
440
  block-size: var(--dimension-size-200);
441
+ }
442
+
443
+ :where(.ds-table__collapse-slot) {
444
+ justify-content: center;
445
+ flex: 0 0 auto;
446
+ inline-size: var(--dimension-size-300);
447
+ block-size: var(--dimension-size-200);
448
+ margin-inline-start: auto;
449
+ }
450
+
451
+ :where(.ds-table__collapse-all-overlay) {
452
+ position: absolute;
453
+ inset-block-start: calc(
454
+ var(--ds-table-collapse-all-block-offset, 0px) + var(--dimension-space-100)
455
+ );
456
+ inset-inline-end: var(--dimension-space-100);
457
+ z-index: var(--dimension-z-index-floating);
458
+ box-sizing: border-box;
459
+ display: flex;
460
+ inline-size: var(--dimension-size-300);
461
+ block-size: var(--dimension-size-200);
462
+ pointer-events: none;
463
+ }
464
+
465
+ :where(.ds-table__collapse-all-surface) {
466
+ box-sizing: border-box;
467
+ display: inline-flex;
468
+ align-items: center;
469
+ justify-content: center;
470
+ inline-size: 100%;
471
+ block-size: 100%;
472
+ padding: 0;
473
+ border-radius: var(--dimension-radius-025);
474
+ background: var(--_table-header-surface);
475
+ pointer-events: auto;
476
+ }
477
+
478
+ :where(.ds-table__sort-slot) {
410
479
  margin-inline-start: auto;
411
480
  }
412
481
 
@@ -488,7 +557,7 @@
488
557
 
489
558
  :where(.ds-table__cell--tag-tag-only),
490
559
  :where(.ds-table__cell--tag-tag-with-text) {
491
- padding: var(--dimension-space-075);
560
+ padding: var(--dimension-space-100);
492
561
  }
493
562
 
494
563
  :where(.ds-table__cell--tag-text-with-tag) {
@@ -516,6 +585,10 @@
516
585
  min-block-size: 0;
517
586
  }
518
587
 
588
+ :where(.ds-table__cell-tag-stack--tag-with-text) {
589
+ gap: var(--dimension-space-025);
590
+ }
591
+
519
592
  :where(.ds-table__cell-tag-stack--text-with-tag .ds-table__cell-tag-text) {
520
593
  padding-inline: var(--_table-cell-track-label-inset);
521
594
  min-block-size: 0;
@@ -532,7 +605,7 @@
532
605
  }
533
606
 
534
607
  :where(.ds-table__cell-tag-stack--text-with-tag .ds-table__cell-tag-control-track) {
535
- min-block-size: 0;
608
+ min-block-size: var(--dimension-size-250);
536
609
  }
537
610
 
538
611
  :where(.ds-table__cell--icon) {
@@ -547,7 +620,7 @@
547
620
  }
548
621
 
549
622
  :where(.ds-table__cell--image) {
550
- padding: var(--dimension-space-075);
623
+ padding: var(--dimension-space-100);
551
624
  }
552
625
 
553
626
  :where(.ds-table__cell-image) {
@@ -573,11 +646,11 @@
573
646
  }
574
647
 
575
648
  :where(.ds-table__cell--action) {
576
- padding: var(--dimension-space-075);
649
+ padding: var(--dimension-space-100);
577
650
  }
578
651
 
579
652
  :where(.ds-table__cell--action .ds-table__cell-content) {
580
- min-block-size: var(--_table-cell-track-min-block-size);
653
+ min-block-size: var(--dimension-size-300);
581
654
  }
582
655
 
583
656
  :where(.ds-table__cell-primary),
@@ -645,6 +718,9 @@
645
718
 
646
719
  :where(.ds-table__selection-cell) {
647
720
  inline-size: var(--_table-selection-column-inline-size);
721
+ width: var(--_table-selection-column-inline-size);
722
+ max-inline-size: var(--_table-selection-column-inline-size);
723
+ max-width: var(--_table-selection-column-inline-size);
648
724
  padding: 0;
649
725
  text-align: center;
650
726
  }
@@ -709,7 +785,7 @@
709
785
  content: '';
710
786
  position: absolute;
711
787
  inset-block: 0;
712
- inline-size: var(--dimension-space-050);
788
+ inline-size: var(--dimension-space-100);
713
789
  pointer-events: none;
714
790
  }
715
791
 
@@ -775,13 +851,136 @@
775
851
  }
776
852
 
777
853
  :where(.ds-table__group-cell) {
778
- min-block-size: var(--_table-header-min-block-size);
779
- padding: var(--dimension-space-075) var(--_table-cell-padding-inline);
780
- background: var(--_table-group-surface);
854
+ /* Surface + chrome live on `.ds-table__group-content` (viewport-width). The
855
+ * th only spans the table for row structure so body columns can scroll. */
856
+ min-block-size: var(--_table-row-min-block-size);
857
+ padding: 0;
858
+ border-block-end: 0;
859
+ background: transparent;
860
+ }
861
+
862
+ /* Intentful groups resolve from their faint signal into neutral at the trailing edge. */
863
+ :where(.ds-table__group-cell--intent-brand),
864
+ :where(.ds-table__group-cell--intent-negative),
865
+ :where(.ds-table__group-cell--intent-warning),
866
+ :where(.ds-table__group-cell--intent-caution),
867
+ :where(.ds-table__group-cell--intent-positive) {
868
+ --_table-group-surface: linear-gradient(
869
+ to right,
870
+ var(--_table-group-intent-surface),
871
+ var(--color-background-faint-neutral)
872
+ );
873
+ }
874
+
875
+ :where(.ds-table__group-cell--intent-brand) {
876
+ --_table-group-intent-surface: var(--color-background-faint-brand);
877
+ }
878
+
879
+ :where(.ds-table__group-cell--intent-neutral) {
880
+ --_table-group-surface: var(--color-background-faint-neutral);
881
+ }
882
+
883
+ :where(.ds-table__group-cell--intent-negative) {
884
+ --_table-group-intent-surface: var(--color-background-faint-negative);
885
+ }
886
+
887
+ :where(.ds-table__group-cell--intent-warning) {
888
+ --_table-group-intent-surface: var(--color-background-faint-warning);
889
+ }
890
+
891
+ :where(.ds-table__group-cell--intent-caution) {
892
+ --_table-group-intent-surface: var(--color-background-faint-caution);
893
+ }
894
+
895
+ :where(.ds-table__group-cell--intent-positive) {
896
+ --_table-group-intent-surface: var(--color-background-faint-positive);
781
897
  }
782
898
 
783
899
  :where(.ds-table__group-content) {
784
- gap: var(--dimension-space-075);
900
+ position: sticky;
901
+ inset-inline-start: 0;
902
+ z-index: 1;
903
+ box-sizing: border-box;
904
+ display: flex;
905
+ align-items: center;
906
+ gap: var(--dimension-space-100);
907
+ /* Use a measured length because WebKit expands min()/percentage widths to
908
+ * the spanning table cell instead of honoring the visible scrollport. */
909
+ inline-size: var(--ds-table-visible-inline-size, 100%);
910
+ max-inline-size: var(--ds-table-visible-inline-size, 100%);
911
+ min-block-size: var(--_table-row-min-block-size);
912
+ padding: var(--dimension-space-100);
913
+ border-block-end: 0;
914
+ background: var(--_table-group-surface);
915
+ background-clip: border-box;
916
+ }
917
+
918
+ :where(.ds-table__group-content)::after {
919
+ content: '';
920
+ position: absolute;
921
+ inset-inline: 0;
922
+ inset-block-end: 0;
923
+ block-size: var(--dimension-stroke-width-012);
924
+ background: var(--_table-border);
925
+ pointer-events: none;
926
+ }
927
+
928
+ :where(.ds-table__group:last-child[data-collapsed='true'] .ds-table__group-content)::after {
929
+ display: none;
930
+ }
931
+
932
+ :where(.ds-table__table--selectable .ds-table__group-content) {
933
+ /* Selection lane is the real 40px column — don't add start pad or flex gap. */
934
+ gap: 0;
935
+ padding-inline-start: 0;
936
+ }
937
+
938
+ :where(.ds-table__group-selection) {
939
+ /* 40px column (same as body), with a 24px-tall checkbox lane. */
940
+ box-sizing: border-box;
941
+ display: inline-flex;
942
+ flex: 0 0 var(--_table-selection-column-inline-size);
943
+ align-items: center;
944
+ justify-content: center;
945
+ padding-block: var(--dimension-space-025);
946
+ padding-inline: var(--dimension-space-050);
947
+ }
948
+
949
+ :where(.ds-table__group-selection .ds-table__selection-control) {
950
+ inline-size: var(--dimension-iconography-md);
951
+ min-block-size: var(--dimension-iconography-md);
952
+ block-size: var(--dimension-iconography-md);
953
+ }
954
+
955
+ :where(.ds-table__group-copy) {
956
+ /* The full-size sm count tag owns the 24px content height; inline padding
957
+ * preserves the shared text track without making the 40px section row grow. */
958
+ box-sizing: border-box;
959
+ display: inline-flex;
960
+ align-items: center;
961
+ min-inline-size: 0;
962
+ flex: 1 1 auto;
963
+ gap: var(--dimension-space-100);
964
+ padding-block: 0;
965
+ padding-inline: var(--dimension-space-050);
966
+ }
967
+
968
+ :where(.ds-table__table--selectable .ds-table__group-copy) {
969
+ padding-inline-start: calc(
970
+ var(--dimension-space-100) + var(--_table-cell-track-label-inset)
971
+ );
972
+ }
973
+
974
+ :where(.ds-table__group-count) {
975
+ display: inline-flex;
976
+ flex: 0 0 auto;
977
+ border-radius: var(--dimension-radius-half);
978
+ }
979
+
980
+ :where(.ds-table__group-toggle) {
981
+ align-self: center;
982
+ flex: 0 0 auto;
983
+ margin-inline-start: auto;
785
984
  }
786
985
 
787
986
  :where(.ds-table__load-cell),
@@ -792,12 +991,23 @@
792
991
  }
793
992
 
794
993
  :where(.ds-table__load-content) {
994
+ /* Match md ButtonUnfilled height so text-only / loading / button states share one box. */
995
+ box-sizing: border-box;
795
996
  justify-content: center;
796
997
  gap: var(--dimension-space-100);
998
+ min-block-size: var(--dimension-size-400);
797
999
  }
798
1000
 
799
1001
  :where(.ds-table__load-content--error) {
800
1002
  flex-wrap: wrap;
1003
+ /* 16px between the icon/text cluster and the retry button. */
1004
+ gap: var(--dimension-space-200);
1005
+ }
1006
+
1007
+ :where(.ds-table__load-copy) {
1008
+ display: inline-flex;
1009
+ align-items: center;
1010
+ gap: var(--dimension-space-100);
801
1011
  }
802
1012
 
803
1013
  :where(.ds-table__auto-sentinel) {
@@ -856,6 +1066,14 @@
856
1066
  box-shadow: none;
857
1067
  }
858
1068
 
1069
+ :where(.ds-table__collapse-all-surface) {
1070
+ --ds-control-elevation-shadow: none;
1071
+ --ds-control-elevation-highlight: none;
1072
+ outline: var(--dimension-stroke-width-012) solid var(--ds-forced-color-control-boundary);
1073
+ outline-offset: calc(-1 * var(--dimension-stroke-width-012));
1074
+ background: var(--ds-forced-color-surface);
1075
+ }
1076
+
859
1077
  :where(.ds-table__row--disabled) {
860
1078
  color: var(--ds-forced-color-disabled);
861
1079
  opacity: 1;
@@ -1,5 +1,6 @@
1
1
  import { EventEmitter } from '../../stencil-public-runtime';
2
2
  import type { ChoiceBackground } from '../../utils/choice-list';
3
+ import type { ControlInsetDepth } from '../../utils/control-text';
3
4
  import type { ButtonPopup, ButtonSize, ButtonVariant, ButtonWidth } from '../../utils/button-types';
4
5
  export type ButtonFilledIntent = 'neutral' | 'brand' | 'ai' | 'negative' | 'warning' | 'caution' | 'positive' | 'guide' | 'walkthrough';
5
6
  export type ButtonFilledContrast = 'bold' | 'strong' | 'medium' | 'faint';
@@ -19,6 +20,8 @@ export declare class ButtonFilled {
19
20
  size: ButtonFilledSize;
20
21
  /** Use reduced outer geometry when nested inside a control of the same size. */
21
22
  isInset: boolean;
23
+ /** Single removes 4px overall; double removes 8px overall (xs stays single). */
24
+ insetDepth: ControlInsetDepth;
22
25
  /** Width fit — hug content (default) or fill the parent. */
23
26
  width: ButtonFilledWidth;
24
27
  /** Visible text for `label` / `icon-label` variants. */
@@ -81,6 +84,7 @@ export declare class ButtonFilled {
81
84
  private handleClick;
82
85
  private get resolvedHaspopup();
83
86
  private get accessibleName();
87
+ private get doubleInset();
84
88
  render(): any;
85
89
  }
86
90
  //# sourceMappingURL=ButtonFilled.d.ts.map
@@ -1,4 +1,5 @@
1
1
  import { EventEmitter } from '../../stencil-public-runtime';
2
+ import type { ControlInsetDepth } from '../../utils/control-text';
2
3
  import type { ButtonPopup, ButtonSize, ButtonVariant, ButtonWidth } from '../../utils/button-types';
3
4
  export type ButtonUnfilledBackground = 'faint' | 'medium' | 'bold' | 'strong' | 'translucent' | 'inverted' | 'media' | 'always-dark';
4
5
  export type ButtonUnfilledVariant = ButtonVariant;
@@ -16,6 +17,8 @@ export declare class ButtonUnfilled {
16
17
  size: ButtonUnfilledSize;
17
18
  /** Use reduced outer geometry when nested inside a control of the same size. */
18
19
  isInset: boolean;
20
+ /** Single removes 4px overall; double removes 8px overall (xs stays single). */
21
+ insetDepth: ControlInsetDepth;
19
22
  /** Width fit — hug content (default) or fill the parent. */
20
23
  width: ButtonUnfilledWidth;
21
24
  /** Visible text for `label` / `icon-label` variants. */
@@ -55,6 +58,11 @@ export declare class ButtonUnfilled {
55
58
  /** Accessible name override. Required for icon-only buttons. */
56
59
  ariaLabel: string | null;
57
60
  controls: string | undefined;
61
+ /**
62
+ * Controlled disclosure or popup state forwarded to `aria-expanded`.
63
+ * Popup triggers hold a pressed visual while open; ordinary disclosures
64
+ * retain the normal resting appearance.
65
+ */
58
66
  expanded: boolean | undefined;
59
67
  haspopup: ButtonUnfilledPopup | undefined;
60
68
  /**
@@ -86,7 +94,9 @@ export declare class ButtonUnfilled {
86
94
  private handleClick;
87
95
  private get showDot();
88
96
  private get resolvedHaspopup();
89
- /** An expanded popup trigger is visually active even when selection is controlled separately. */
97
+ private get doubleInset();
98
+ /** Only popup triggers hold a pressed visual while expanded. */
99
+ private get expandedPopup();
90
100
  private get visuallyActive();
91
101
  /** Knock-out ring: selected fill → active wash; otherwise surface token. */
92
102
  private get dotRing();