@ds-mo/ui 13.12.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 (222) hide show
  1. package/dist/.package-ready.json +1 -1
  2. package/dist/agent-patterns.json +1 -1
  3. package/dist/agent.json +68 -16
  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 +7 -1
  9. package/dist/angular/ds-table.js +10 -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-overview.js +1 -1
  26. package/dist/components/ds-card-overview.js.map +1 -1
  27. package/dist/components/ds-card-setting.js +1 -1
  28. package/dist/components/ds-chart-legend.js +1 -1
  29. package/dist/components/ds-chart-legend.js.map +1 -1
  30. package/dist/components/ds-checkbox.js +1 -1
  31. package/dist/components/ds-chip.js +1 -1
  32. package/dist/components/ds-chip.js.map +1 -1
  33. package/dist/components/ds-code-block.js +1 -1
  34. package/dist/components/ds-conversation-list-item.js +1 -1
  35. package/dist/components/ds-conversation-list-item.js.map +1 -1
  36. package/dist/components/ds-empty-state.js +1 -1
  37. package/dist/components/ds-icon.js +1 -1
  38. package/dist/components/ds-input.js +1 -1
  39. package/dist/components/ds-input.js.map +1 -1
  40. package/dist/components/ds-markdown.js +1 -1
  41. package/dist/components/ds-menu.js +1 -1
  42. package/dist/components/ds-message-actions.js +1 -1
  43. package/dist/components/ds-message-composer.js +1 -1
  44. package/dist/components/ds-message-scroller.js +1 -1
  45. package/dist/components/ds-mobile-bar-nav.js +1 -1
  46. package/dist/components/ds-mobile-header.js +1 -1
  47. package/dist/components/ds-mobile-section-switcher.js +1 -1
  48. package/dist/components/ds-mobile-sheet-nav.js +1 -1
  49. package/dist/components/ds-modal.js +1 -1
  50. package/dist/components/ds-panel-nav.js +1 -1
  51. package/dist/components/ds-panel-sub-nav.js +1 -1
  52. package/dist/components/ds-panel-sub-nav.js.map +1 -1
  53. package/dist/components/ds-panel-tool-header.js +1 -1
  54. package/dist/components/ds-panel-tool-search.js +1 -1
  55. package/dist/components/ds-panel-tools.js +1 -1
  56. package/dist/components/ds-radio.js +1 -1
  57. package/dist/components/ds-radio.js.map +1 -1
  58. package/dist/components/ds-select.js +1 -1
  59. package/dist/components/ds-select.js.map +1 -1
  60. package/dist/components/ds-shell-app.js +1 -1
  61. package/dist/components/ds-shell-tools.js +1 -1
  62. package/dist/components/ds-tab-group.js +1 -1
  63. package/dist/components/ds-table.js +1 -1
  64. package/dist/components/ds-table.js.map +1 -1
  65. package/dist/components/ds-tag.js +1 -1
  66. package/dist/components/ds-toast.js +1 -1
  67. package/dist/components/ds-typing-indicator.js +1 -1
  68. package/dist/components/p-Azjx2SsL.js +2 -0
  69. package/dist/components/p-Azjx2SsL.js.map +1 -0
  70. package/dist/components/p-B1JB0Zn-.js +2 -0
  71. package/dist/components/{p-BYre-ZDg.js.map → p-B1JB0Zn-.js.map} +1 -1
  72. package/dist/components/p-B2t8alvH.js +2 -0
  73. package/dist/components/{p-DK4PGrHm.js.map → p-B2t8alvH.js.map} +1 -1
  74. package/dist/components/{p-DBchq8Zw.js → p-B6linhwY.js} +2 -2
  75. package/dist/components/p-B8HG9OFh.js +2 -0
  76. package/dist/components/p-B8HG9OFh.js.map +1 -0
  77. package/dist/components/{p-DcmqsAMP.js → p-BJVzrR_P.js} +2 -2
  78. package/dist/components/p-BL0JHLJp.js +2 -0
  79. package/dist/components/{p-BFXN4ioL.js.map → p-BL0JHLJp.js.map} +1 -1
  80. package/dist/components/p-BPS17WvI.js +2 -0
  81. package/dist/components/{p-x9jO4lZ7.js.map → p-BPS17WvI.js.map} +1 -1
  82. package/dist/components/{p-BX57q1Lo.js → p-BSdAFIcG.js} +2 -2
  83. package/dist/components/{p-DGkWMhHO.js → p-BULWzaBs.js} +2 -2
  84. package/dist/components/{p-B_eqa09C.js → p-C-aCs6ID.js} +2 -2
  85. package/dist/components/{p-BRajO-Za.js → p-C5ecLNZA.js} +2 -2
  86. package/dist/components/p-C8U5BsJf.js +2 -0
  87. package/dist/components/p-C8U5BsJf.js.map +1 -0
  88. package/dist/components/{p-DKftz0O8.js → p-COmqMfQo.js} +2 -2
  89. package/dist/components/{p-DxygUurH.js → p-CeyoHpPn.js} +2 -2
  90. package/dist/components/{p-CdFnvBem.js → p-CiUciD5Z.js} +2 -2
  91. package/dist/components/p-CuwopElg.js.map +1 -1
  92. package/dist/components/p-DAM4CDXT.js +2 -0
  93. package/dist/components/{p-BxJurXEn.js.map → p-DAM4CDXT.js.map} +1 -1
  94. package/dist/components/{p-DBJJiSP0.js → p-DMJEOAwP.js} +2 -2
  95. package/dist/components/p-DYAQVvOu.js +2 -0
  96. package/dist/components/{p-CIlO_j3q.js.map → p-DYAQVvOu.js.map} +1 -1
  97. package/dist/components/p-DyDkQ8H9.js +2 -0
  98. package/dist/components/p-DyDkQ8H9.js.map +1 -0
  99. package/dist/components/{p-DkhE3BsH.js → p-Dz3Ufmr4.js} +2 -2
  100. package/dist/components/p-cPh32CFB.js +2 -0
  101. package/dist/components/{p-Bj7KrXzw.js.map → p-cPh32CFB.js.map} +1 -1
  102. package/dist/components/{p-Doz2uwRv.js → p-fkQhr5s9.js} +2 -2
  103. package/dist/components/p-oOKTL-yx.js +2 -0
  104. package/dist/components/{p-C5gZHZHU.js.map → p-oOKTL-yx.js.map} +1 -1
  105. package/dist/docs/components.json +362 -10
  106. package/dist/lib/components/ButtonFilled/ButtonFilled.d.ts +6 -0
  107. package/dist/lib/utils/control-text.d.ts +2 -0
  108. package/dist/lib/utils/index.d.ts +1 -1
  109. package/dist/lib/utils/index.js.map +2 -2
  110. package/dist/mcp-data/registry/agent-activity.json +1 -1
  111. package/dist/mcp-data/registry/agent-response.json +1 -1
  112. package/dist/mcp-data/registry/agent-source-list.json +1 -1
  113. package/dist/mcp-data/registry/agent-tool-call.json +1 -1
  114. package/dist/mcp-data/registry/attachment-list.json +1 -1
  115. package/dist/mcp-data/registry/avatar.json +1 -1
  116. package/dist/mcp-data/registry/badge.json +1 -1
  117. package/dist/mcp-data/registry/banner.json +1 -1
  118. package/dist/mcp-data/registry/bar-nav.json +1 -1
  119. package/dist/mcp-data/registry/bar-title.json +1 -1
  120. package/dist/mcp-data/registry/bar-workflow.json +1 -1
  121. package/dist/mcp-data/registry/breadcrumb.json +1 -1
  122. package/dist/mcp-data/registry/button-filled.json +39 -2
  123. package/dist/mcp-data/registry/button-unfilled.json +45 -6
  124. package/dist/mcp-data/registry/card-chart.json +1 -1
  125. package/dist/mcp-data/registry/card-overview.json +1 -1
  126. package/dist/mcp-data/registry/card-setting.json +1 -1
  127. package/dist/mcp-data/registry/chart-legend.json +1 -1
  128. package/dist/mcp-data/registry/chart.json +1 -1
  129. package/dist/mcp-data/registry/checkbox.json +1 -1
  130. package/dist/mcp-data/registry/chip.json +1 -1
  131. package/dist/mcp-data/registry/code-block.json +1 -1
  132. package/dist/mcp-data/registry/conversation-list-item.json +1 -1
  133. package/dist/mcp-data/registry/conversation-list-section.json +1 -1
  134. package/dist/mcp-data/registry/conversation-list.json +1 -1
  135. package/dist/mcp-data/registry/divider.json +1 -1
  136. package/dist/mcp-data/registry/empty-state.json +1 -1
  137. package/dist/mcp-data/registry/field.json +1 -1
  138. package/dist/mcp-data/registry/icon.json +2 -2
  139. package/dist/mcp-data/registry/input.json +1 -1
  140. package/dist/mcp-data/registry/loader.json +1 -1
  141. package/dist/mcp-data/registry/markdown.json +1 -1
  142. package/dist/mcp-data/registry/menu.json +1 -1
  143. package/dist/mcp-data/registry/message-actions.json +1 -1
  144. package/dist/mcp-data/registry/message-bubble.json +1 -1
  145. package/dist/mcp-data/registry/message-composer.json +1 -1
  146. package/dist/mcp-data/registry/message-scroller.json +1 -1
  147. package/dist/mcp-data/registry/message.json +1 -1
  148. package/dist/mcp-data/registry/mobile-bar-nav.json +1 -1
  149. package/dist/mcp-data/registry/mobile-header.json +1 -1
  150. package/dist/mcp-data/registry/mobile-section-switcher.json +1 -1
  151. package/dist/mcp-data/registry/mobile-sheet-nav.json +1 -1
  152. package/dist/mcp-data/registry/modal.json +1 -1
  153. package/dist/mcp-data/registry/panel-nav.json +1 -1
  154. package/dist/mcp-data/registry/panel-sub-nav.json +1 -1
  155. package/dist/mcp-data/registry/panel-tool-header.json +1 -1
  156. package/dist/mcp-data/registry/panel-tool-search.json +1 -1
  157. package/dist/mcp-data/registry/panel-tools.json +1 -1
  158. package/dist/mcp-data/registry/radio.json +1 -1
  159. package/dist/mcp-data/registry/registry.json +68 -16
  160. package/dist/mcp-data/registry/scroll-overlay.json +1 -1
  161. package/dist/mcp-data/registry/select.json +1 -1
  162. package/dist/mcp-data/registry/shell-app.json +1 -1
  163. package/dist/mcp-data/registry/shell-page.json +1 -1
  164. package/dist/mcp-data/registry/shell-tools.json +1 -1
  165. package/dist/mcp-data/registry/skeleton.json +1 -1
  166. package/dist/mcp-data/registry/slider.json +1 -1
  167. package/dist/mcp-data/registry/swatch-picker.json +1 -1
  168. package/dist/mcp-data/registry/switch.json +1 -1
  169. package/dist/mcp-data/registry/tab-group.json +1 -1
  170. package/dist/mcp-data/registry/table.json +141 -21
  171. package/dist/mcp-data/registry/tag.json +23 -5
  172. package/dist/mcp-data/registry/text.json +1 -1
  173. package/dist/mcp-data/registry/toast.json +1 -1
  174. package/dist/mcp-data/registry/tooltip-chart.json +1 -1
  175. package/dist/mcp-data/registry/tooltip.json +1 -1
  176. package/dist/mcp-data/registry/typing-indicator.json +1 -1
  177. package/dist/react/ds-table.d.ts +3 -1
  178. package/dist/react/ds-table.js +3 -1
  179. package/dist/styles/table.css +491 -76
  180. package/dist/types/components/ButtonFilled/ButtonFilled.d.ts +6 -0
  181. package/dist/types/components/ButtonUnfilled/ButtonUnfilled.d.ts +13 -1
  182. package/dist/types/components/Table/Table.d.ts +41 -22
  183. package/dist/types/components/Table/index.d.ts +1 -1
  184. package/dist/types/components/Table/table-cell-model.d.ts +44 -0
  185. package/dist/types/components/Table/table-layout-controller.d.ts +65 -0
  186. package/dist/types/components/Table/table-load-controller.d.ts +49 -0
  187. package/dist/types/components/Table/table-model.d.ts +25 -0
  188. package/dist/types/components/Table/table-render-model.d.ts +41 -0
  189. package/dist/types/components/Table/table-types.d.ts +34 -2
  190. package/dist/types/components/Tag/Tag.d.ts +3 -0
  191. package/dist/types/components.d.ts +108 -8
  192. package/dist/types/utils/control-text.d.ts +2 -0
  193. package/dist/types/utils/index.d.ts +1 -1
  194. package/package.json +3 -3
  195. package/dist/components/p-BFXN4ioL.js +0 -2
  196. package/dist/components/p-BYre-ZDg.js +0 -2
  197. package/dist/components/p-Bj7KrXzw.js +0 -2
  198. package/dist/components/p-BxJurXEn.js +0 -2
  199. package/dist/components/p-C5gZHZHU.js +0 -2
  200. package/dist/components/p-CFNG0K3m.js +0 -2
  201. package/dist/components/p-CFNG0K3m.js.map +0 -1
  202. package/dist/components/p-CIlO_j3q.js +0 -2
  203. package/dist/components/p-DAbaMtEX.js +0 -2
  204. package/dist/components/p-DAbaMtEX.js.map +0 -1
  205. package/dist/components/p-DK4PGrHm.js +0 -2
  206. package/dist/components/p-DumWT7NN.js +0 -2
  207. package/dist/components/p-DumWT7NN.js.map +0 -1
  208. package/dist/components/p-c1pY-Mqq.js +0 -2
  209. package/dist/components/p-c1pY-Mqq.js.map +0 -1
  210. package/dist/components/p-x9jO4lZ7.js +0 -2
  211. /package/dist/components/{p-DBchq8Zw.js.map → p-B6linhwY.js.map} +0 -0
  212. /package/dist/components/{p-DcmqsAMP.js.map → p-BJVzrR_P.js.map} +0 -0
  213. /package/dist/components/{p-BX57q1Lo.js.map → p-BSdAFIcG.js.map} +0 -0
  214. /package/dist/components/{p-DGkWMhHO.js.map → p-BULWzaBs.js.map} +0 -0
  215. /package/dist/components/{p-B_eqa09C.js.map → p-C-aCs6ID.js.map} +0 -0
  216. /package/dist/components/{p-BRajO-Za.js.map → p-C5ecLNZA.js.map} +0 -0
  217. /package/dist/components/{p-DKftz0O8.js.map → p-COmqMfQo.js.map} +0 -0
  218. /package/dist/components/{p-DxygUurH.js.map → p-CeyoHpPn.js.map} +0 -0
  219. /package/dist/components/{p-CdFnvBem.js.map → p-CiUciD5Z.js.map} +0 -0
  220. /package/dist/components/{p-DBJJiSP0.js.map → p-DMJEOAwP.js.map} +0 -0
  221. /package/dist/components/{p-DkhE3BsH.js.map → p-Dz3Ufmr4.js.map} +0 -0
  222. /package/dist/components/{p-Doz2uwRv.js.map → p-fkQhr5s9.js.map} +0 -0
@@ -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));
@@ -26,9 +26,9 @@
26
26
  --_table-row-selected: var(--ds-table-row-selected, var(--color-interaction-active-brand));
27
27
  --_table-border: var(--ds-table-border, var(--color-border-secondary));
28
28
  --_table-column-border: var(--ds-table-column-border, var(--color-border-tertiary));
29
+ --_table-sticky-border: var(--ds-table-sticky-border, var(--color-border-secondary));
29
30
  --_table-border-strong: var(--ds-table-border-strong, var(--color-border-secondary));
30
- --_table-overflow-shadow: var(--ds-table-overflow-shadow, 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,7 +49,17 @@
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
+ --_table-sticky-start-shadow: var(
54
+ --ds-table-sticky-start-shadow,
55
+ inset var(--dimension-space-100) 0 var(--dimension-space-100)
56
+ calc(-1 * var(--dimension-space-100)) var(--color-elevation-shadow)
57
+ );
58
+ --_table-sticky-end-shadow: var(
59
+ --ds-table-sticky-end-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
+ );
53
63
  display: block;
54
64
  box-sizing: border-box;
55
65
  min-inline-size: 0;
@@ -61,53 +71,34 @@
61
71
 
62
72
  :where(.ds-table__frame) {
63
73
  position: relative;
74
+ timeline-scope: --ds-table-inline-scroll;
64
75
  box-sizing: border-box;
65
76
  min-inline-size: 0;
66
77
  max-inline-size: 100%;
67
- overflow: hidden;
68
- border: var(--dimension-stroke-width-012) solid var(--_table-border-strong);
78
+ overflow: visible;
79
+ border: 0;
69
80
  border-radius: var(--_table-radius);
70
81
  background: var(--_table-surface);
71
82
  }
72
83
 
73
- :where(.ds-table__frame)::before,
74
- :where(.ds-table__frame)::after {
75
- content: '';
76
- position: absolute;
77
- inset-block: 0;
78
- z-index: 3;
79
- inline-size: var(--dimension-space-200);
80
- pointer-events: none;
81
- opacity: 0;
82
- transition: opacity var(--effect-motion-short-2);
83
- }
84
-
85
- :where(.ds-table__frame)::before {
86
- inset-inline-start: 0;
87
- background: linear-gradient(to right, var(--_table-overflow-shadow), transparent);
88
- }
89
-
90
- :where(.ds-table__frame)::after {
91
- inset-inline-end: 0;
92
- background: linear-gradient(to left, var(--_table-overflow-shadow), transparent);
93
- }
94
-
95
- :where(.ds-table__frame--overflow-start)::before,
96
- :where(.ds-table__frame--overflow-end)::after {
97
- opacity: var(--effect-opacity-low);
98
- }
99
-
100
84
  :where(.ds-table__viewport) {
101
85
  box-sizing: border-box;
102
86
  max-block-size: var(--ds-table-max-block-size, none);
103
87
  max-inline-size: 100%;
104
88
  min-inline-size: 0;
105
89
  overflow: auto;
106
- overscroll-behavior: contain;
90
+ scroll-timeline: --ds-table-inline-scroll inline;
91
+ overscroll-behavior-x: none;
92
+ overscroll-behavior-y: auto;
107
93
  scrollbar-gutter: stable;
94
+ border-radius: var(--_table-radius);
108
95
  outline: none;
109
96
  }
110
97
 
98
+ :where(.ds-table--document-sticky-header .ds-table__viewport) {
99
+ scrollbar-gutter: auto;
100
+ }
101
+
111
102
  :where(.ds-table__viewport:focus-visible) {
112
103
  outline: var(--dimension-stroke-width-025) solid var(--color-interaction-focus);
113
104
  outline-offset: calc(-1 * var(--dimension-stroke-width-025));
@@ -116,7 +107,13 @@
116
107
  :where(.ds-table__table) {
117
108
  box-sizing: border-box;
118
109
  inline-size: 100%;
119
- 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
+ );
120
117
  border: 0;
121
118
  border-spacing: 0;
122
119
  border-collapse: separate;
@@ -127,21 +124,42 @@
127
124
 
128
125
  :where(.ds-table__table--selectable) {
129
126
  --_table-selection-column-contribution: var(--_table-selection-column-inline-size);
130
- min-inline-size: max(
131
- 100%,
132
- calc(var(--ds-table-explicit-min-inline-size, 0) + var(--_table-selection-column-contribution))
133
- );
134
127
  }
135
128
 
136
- :where(.ds-table__caption) {
137
- padding: var(--_table-cell-padding-inline);
138
- 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);
139
138
  background: var(--_table-surface);
140
139
  text-align: start;
141
140
  }
142
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
+
143
153
  :where(.ds-table__selection-column) {
144
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);
145
163
  }
146
164
 
147
165
  :where(.ds-table__head) {
@@ -149,12 +167,106 @@
149
167
  z-index: 1;
150
168
  }
151
169
 
152
- :where(.ds-table--sticky-header .ds-table__head) {
170
+ :where(.ds-table--contained-sticky-header .ds-table__head) {
153
171
  position: sticky;
154
172
  inset-block-start: 0;
155
173
  z-index: 2;
156
174
  }
157
175
 
176
+ :where(.ds-table__document-sticky-header) {
177
+ position: sticky;
178
+ inset-block-start: var(--ds-table-sticky-header-offset, 0);
179
+ z-index: 3;
180
+ block-size: var(--_table-header-min-block-size);
181
+ margin-block-end: calc(-1 * var(--_table-header-min-block-size));
182
+ max-inline-size: 100%;
183
+ overflow: hidden;
184
+ border-radius: var(--_table-radius) var(--_table-radius) 0 0;
185
+ background: var(--_table-header-surface);
186
+ }
187
+
188
+ :where(.ds-table__sticky-header-table) {
189
+ block-size: var(--_table-header-min-block-size);
190
+ transform: translate3d(calc(-1 * var(--ds-table-inline-scroll-offset, 0px)), 0, 0);
191
+ will-change: transform;
192
+ }
193
+
194
+ /*
195
+ * The document-flow header is visually duplicated so it can stick to the page
196
+ * while the semantic table remains inside the horizontal scrollport. Keep the
197
+ * duplicate out of a second scroll container: its columns follow the body's
198
+ * scroll timeline and its pinned lanes counter that exact movement.
199
+ */
200
+ :where(.ds-table__sticky-header-table .ds-table__cell--sticky-start) {
201
+ transform: translate3d(var(--ds-table-inline-scroll-offset, 0), 0, 0);
202
+ }
203
+
204
+ :where(.ds-table__sticky-header-table .ds-table__cell--sticky-end) {
205
+ transform: translate3d(
206
+ calc(
207
+ var(--ds-table-inline-scroll-offset, 0) -
208
+ var(--ds-table-inline-scroll-max-offset, 0)
209
+ ),
210
+ 0,
211
+ 0
212
+ );
213
+ }
214
+
215
+ @supports (animation-timeline: --ds-table-inline-scroll) {
216
+ :where(.ds-table__sticky-header-table) {
217
+ animation: ds-table-follow-inline-scroll var(--effect-motion-short-2) both;
218
+ animation-timeline: --ds-table-inline-scroll;
219
+ animation-range: 0% 100%;
220
+ animation-timing-function: linear;
221
+ }
222
+
223
+ :where(.ds-table__sticky-header-table .ds-table__cell--sticky-start) {
224
+ animation: ds-table-counter-inline-scroll-start var(--effect-motion-short-2) both;
225
+ animation-timeline: --ds-table-inline-scroll;
226
+ animation-range: 0% 100%;
227
+ animation-timing-function: linear;
228
+ }
229
+
230
+ :where(.ds-table__sticky-header-table .ds-table__cell--sticky-end) {
231
+ animation: ds-table-counter-inline-scroll-end var(--effect-motion-short-2) both;
232
+ animation-timeline: --ds-table-inline-scroll;
233
+ animation-range: 0% 100%;
234
+ animation-timing-function: linear;
235
+ }
236
+ }
237
+
238
+ @keyframes ds-table-follow-inline-scroll {
239
+ from { transform: translate3d(0, 0, 0); }
240
+ to {
241
+ transform: translate3d(
242
+ calc(-1 * var(--ds-table-inline-scroll-max-offset, 0)),
243
+ 0,
244
+ 0
245
+ );
246
+ }
247
+ }
248
+
249
+ @keyframes ds-table-counter-inline-scroll-start {
250
+ from { transform: translate3d(0, 0, 0); }
251
+ to { transform: translate3d(var(--ds-table-inline-scroll-max-offset, 0), 0, 0); }
252
+ }
253
+
254
+ @keyframes ds-table-counter-inline-scroll-end {
255
+ from {
256
+ transform: translate3d(
257
+ calc(-1 * var(--ds-table-inline-scroll-max-offset, 0)),
258
+ 0,
259
+ 0
260
+ );
261
+ }
262
+ to { transform: translate3d(0, 0, 0); }
263
+ }
264
+
265
+ :where(.ds-table__head--semantic-copy) {
266
+ opacity: 0;
267
+ pointer-events: none;
268
+ }
269
+
158
270
  :where(.ds-table__header-row) {
159
271
  min-block-size: var(--_table-header-min-block-size);
160
272
  background: var(--_table-header-surface);
@@ -173,6 +285,7 @@
173
285
  }
174
286
 
175
287
  :where(.ds-table__header-cell) {
288
+ position: relative;
176
289
  min-block-size: calc(
177
290
  var(--_table-header-min-block-size) - var(--dimension-space-100) - var(--dimension-space-100)
178
291
  );
@@ -181,27 +294,48 @@
181
294
  );
182
295
  padding: var(--dimension-space-100);
183
296
  border-block-end: 0;
184
- box-shadow: inset 0 calc(-1 * var(--dimension-stroke-width-012)) 0 var(--_table-border);
185
297
  background: var(--_table-header-surface);
186
298
  color: var(--color-foreground-secondary);
187
299
  }
188
300
 
301
+ :where(.ds-table__header-cell)::after {
302
+ content: '';
303
+ position: absolute;
304
+ inset-inline: 0;
305
+ inset-block-end: 0;
306
+ z-index: 1;
307
+ block-size: var(--dimension-stroke-width-012);
308
+ background: var(--_table-border-strong);
309
+ pointer-events: none;
310
+ }
311
+
189
312
  :where(.ds-table__cell) {
190
313
  min-block-size: var(--_table-row-min-block-size);
191
314
  block-size: var(--_table-row-min-block-size);
192
315
  padding: var(--_table-cell-padding-block) var(--_table-cell-padding-inline);
316
+ --ds-interaction-group-divider-width: var(--dimension-stroke-width-012);
317
+ --ds-interaction-group-divider-color: var(--_table-border);
193
318
  border-block-end: 0;
194
319
  background-color: inherit;
195
- background-image: linear-gradient(var(--_table-border), var(--_table-border));
196
- background-repeat: no-repeat;
197
- background-position: bottom;
198
- background-size: 100% var(--dimension-stroke-width-012);
199
320
  vertical-align: top;
200
321
  }
201
322
 
202
- :where(.ds-table__header-cell + .ds-table__header-cell),
323
+ :where(.ds-table__header-cell + .ds-table__header-cell) {
324
+ border-inline-start: 0;
325
+ }
326
+
327
+ :where(.ds-table__header-cell + .ds-table__header-cell)::before {
328
+ content: '';
329
+ position: absolute;
330
+ inset: 0;
331
+ z-index: 0;
332
+ box-shadow: inset var(--dimension-stroke-width-012) 0 0 var(--_table-column-border);
333
+ pointer-events: none;
334
+ }
335
+
203
336
  :where(.ds-table__cell + .ds-table__cell) {
204
- border-inline-start: var(--dimension-stroke-width-012) solid var(--_table-column-border);
337
+ --ds-interaction-group-divider-inline-start-width: var(--dimension-stroke-width-012);
338
+ --ds-interaction-group-divider-inline-start-color: var(--_table-column-border);
205
339
  }
206
340
 
207
341
  :where(.ds-table__header-labels),
@@ -252,9 +386,6 @@
252
386
  color: var(--color-foreground-primary);
253
387
  }
254
388
 
255
- :where(.ds-table__row:not(.ds-table__row--disabled):hover) {
256
- background: var(--_table-row-hover);
257
- }
258
389
  }
259
390
 
260
391
  :where(.ds-table__header-label--interactive:active) {
@@ -271,7 +402,7 @@
271
402
  :where(.ds-table__header-labels),
272
403
  :where(.ds-table__header-segment),
273
404
  :where(.ds-table__sort-slot),
274
- :where(.ds-table__group-content),
405
+ :where(.ds-table__collapse-slot),
275
406
  :where(.ds-table__load-content) {
276
407
  display: inline-flex;
277
408
  align-items: center;
@@ -284,6 +415,10 @@
284
415
  gap: var(--dimension-space-050);
285
416
  }
286
417
 
418
+ :where(.ds-table__header-content--collapse-all) {
419
+ justify-content: flex-end;
420
+ }
421
+
287
422
  :where(.ds-table__header-labels) {
288
423
  max-inline-size: 100%;
289
424
  gap: var(--dimension-space-025);
@@ -303,6 +438,44 @@
303
438
  flex: 0 0 auto;
304
439
  inline-size: var(--dimension-size-200);
305
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) {
306
479
  margin-inline-start: auto;
307
480
  }
308
481
 
@@ -384,7 +557,7 @@
384
557
 
385
558
  :where(.ds-table__cell--tag-tag-only),
386
559
  :where(.ds-table__cell--tag-tag-with-text) {
387
- padding: var(--dimension-space-075);
560
+ padding: var(--dimension-space-100);
388
561
  }
389
562
 
390
563
  :where(.ds-table__cell--tag-text-with-tag) {
@@ -412,6 +585,10 @@
412
585
  min-block-size: 0;
413
586
  }
414
587
 
588
+ :where(.ds-table__cell-tag-stack--tag-with-text) {
589
+ gap: var(--dimension-space-025);
590
+ }
591
+
415
592
  :where(.ds-table__cell-tag-stack--text-with-tag .ds-table__cell-tag-text) {
416
593
  padding-inline: var(--_table-cell-track-label-inset);
417
594
  min-block-size: 0;
@@ -428,7 +605,7 @@
428
605
  }
429
606
 
430
607
  :where(.ds-table__cell-tag-stack--text-with-tag .ds-table__cell-tag-control-track) {
431
- min-block-size: 0;
608
+ min-block-size: var(--dimension-size-250);
432
609
  }
433
610
 
434
611
  :where(.ds-table__cell--icon) {
@@ -443,7 +620,7 @@
443
620
  }
444
621
 
445
622
  :where(.ds-table__cell--image) {
446
- padding: var(--dimension-space-075);
623
+ padding: var(--dimension-space-100);
447
624
  }
448
625
 
449
626
  :where(.ds-table__cell-image) {
@@ -512,15 +689,26 @@
512
689
  :where(.ds-table__row) {
513
690
  min-block-size: var(--_table-row-min-block-size);
514
691
  background: var(--_table-surface);
515
- transition: background-color var(--effect-motion-short-2);
516
692
  }
517
693
 
518
- :where(.ds-table__row:active:not(.ds-table__row--disabled)) {
519
- background: var(--_table-row-pressed);
694
+ :where(.ds-table__row > .ds-table__cell.ds-interaction-fill) {
695
+ --ds-interaction-active: var(--_table-row-selected);
696
+ --ds-interaction-group-fill: transparent;
697
+ }
698
+
699
+ @media (hover: hover) and (pointer: fine) {
700
+ :where(.ds-table__row--interactive:hover > .ds-table__cell.ds-interaction-fill) {
701
+ --ds-interaction-group-fill: var(--_table-row-hover);
702
+ }
520
703
  }
521
704
 
522
- :where(.ds-table__row--selected) {
523
- background: var(--_table-row-selected);
705
+ :where(.ds-table__row--interactive:active > .ds-table__cell.ds-interaction-fill) {
706
+ --ds-interaction-group-fill: var(--_table-row-pressed);
707
+ }
708
+
709
+ :where(.ds-table__row--interactive:focus-visible) {
710
+ outline: var(--dimension-stroke-width-025) solid var(--color-interaction-focus);
711
+ outline-offset: calc(-1 * var(--dimension-stroke-width-025));
524
712
  }
525
713
 
526
714
  :where(.ds-table__row--disabled) {
@@ -530,10 +718,101 @@
530
718
 
531
719
  :where(.ds-table__selection-cell) {
532
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);
533
724
  padding: 0;
534
725
  text-align: center;
535
726
  }
536
727
 
728
+ :where(.ds-table__cell--sticky-start),
729
+ :where(.ds-table__cell--sticky-end) {
730
+ --ds-interaction-position: sticky;
731
+ --ds-interaction-z-index: 2;
732
+ position: sticky;
733
+ z-index: 2;
734
+ background-color: var(--_table-surface);
735
+ }
736
+
737
+ :where(.ds-table__cell--sticky-start) {
738
+ inset-inline-start: 0;
739
+ }
740
+
741
+ :where(.ds-table__cell--sticky-end) {
742
+ inset-inline-end: 0;
743
+ }
744
+
745
+ :where(.ds-table__header-cell.ds-table__cell--sticky-start),
746
+ :where(.ds-table__header-cell.ds-table__cell--sticky-end) {
747
+ z-index: 3;
748
+ background-color: var(--_table-header-surface);
749
+ }
750
+
751
+ :where(.ds-table__sticky-header-table .ds-table__cell--sticky-start),
752
+ :where(.ds-table__sticky-header-table .ds-table__cell--sticky-end) {
753
+ position: relative;
754
+ inset-inline: auto;
755
+ will-change: transform;
756
+ }
757
+
758
+ :where(.ds-table__selection-cell.ds-table__cell--sticky-start) {
759
+ --ds-interaction-group-divider-inline-end-width: 0px;
760
+ }
761
+
762
+ :where(.ds-table__cell--sticky-start + .ds-table__cell) {
763
+ --ds-interaction-group-divider-inline-start-width: 0px;
764
+ }
765
+
766
+ :where(.ds-table__cell--sticky-end) {
767
+ --ds-interaction-group-divider-inline-start-width: 0px;
768
+ }
769
+
770
+ :where(.ds-table__header-cell.ds-table__cell--sticky-start + .ds-table__header-cell)::before,
771
+ :where(.ds-table__header-cell.ds-table__cell--sticky-end)::before {
772
+ box-shadow: none;
773
+ }
774
+
775
+ :where(.ds-table__sticky-edge) {
776
+ position: absolute;
777
+ inset-block: 0 var(--dimension-stroke-width-012);
778
+ z-index: 4;
779
+ inline-size: var(--dimension-stroke-width-012);
780
+ background: var(--_table-sticky-border);
781
+ pointer-events: none;
782
+ }
783
+
784
+ :where(.ds-table__sticky-edge)::after {
785
+ content: '';
786
+ position: absolute;
787
+ inset-block: 0;
788
+ inline-size: var(--dimension-space-100);
789
+ pointer-events: none;
790
+ }
791
+
792
+ :where(.ds-table__sticky-edge--start) {
793
+ inset-inline-end: 0;
794
+ }
795
+
796
+ :where(.ds-table__sticky-edge--start)::after {
797
+ inset-inline-start: 100%;
798
+ }
799
+
800
+ :where(.ds-table__sticky-edge--end) {
801
+ inset-inline-start: 0;
802
+ }
803
+
804
+ :where(.ds-table__sticky-edge--end)::after {
805
+ inset-inline-end: 100%;
806
+ }
807
+
808
+ :where(.ds-table__frame--overflow-start .ds-table__sticky-edge--start)::after {
809
+ box-shadow: var(--_table-sticky-start-shadow);
810
+ }
811
+
812
+ :where(.ds-table__frame--overflow-end .ds-table__sticky-edge--end)::after {
813
+ box-shadow: var(--_table-sticky-end-shadow);
814
+ }
815
+
537
816
  :where(.ds-table__cell.ds-table__selection-cell) {
538
817
  padding: var(--dimension-space-125);
539
818
  }
@@ -572,13 +851,136 @@
572
851
  }
573
852
 
574
853
  :where(.ds-table__group-cell) {
575
- min-block-size: var(--_table-header-min-block-size);
576
- padding: var(--dimension-space-075) var(--_table-cell-padding-inline);
577
- 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);
578
897
  }
579
898
 
580
899
  :where(.ds-table__group-content) {
581
- 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;
582
984
  }
583
985
 
584
986
  :where(.ds-table__load-cell),
@@ -589,12 +991,23 @@
589
991
  }
590
992
 
591
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;
592
996
  justify-content: center;
593
997
  gap: var(--dimension-space-100);
998
+ min-block-size: var(--dimension-size-400);
594
999
  }
595
1000
 
596
1001
  :where(.ds-table__load-content--error) {
597
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);
598
1011
  }
599
1012
 
600
1013
  :where(.ds-table__auto-sentinel) {
@@ -615,7 +1028,7 @@
615
1028
  :where(.ds-table__state-row:last-child .ds-table__state-cell),
616
1029
  :where(.ds-table__body:last-child .ds-table__row:last-child .ds-table__cell) {
617
1030
  border-block-end: 0;
618
- background-image: none;
1031
+ --ds-interaction-group-divider-width: 0px;
619
1032
  }
620
1033
 
621
1034
  :where(.ds-visually-hidden) {
@@ -631,9 +1044,8 @@
631
1044
  }
632
1045
 
633
1046
  @media (prefers-reduced-motion: reduce) {
634
- :where(.ds-table__frame)::before,
635
- :where(.ds-table__frame)::after,
636
- :where(.ds-table__row) {
1047
+ :where(.ds-table__cell--sticky-start),
1048
+ :where(.ds-table__cell--sticky-end) {
637
1049
  transition: none;
638
1050
  }
639
1051
  }
@@ -649,14 +1061,17 @@
649
1061
  color: var(--ds-forced-color-content);
650
1062
  }
651
1063
 
652
- :where(.ds-table__frame)::before,
653
- :where(.ds-table__frame)::after {
654
- display: none;
1064
+ :where(.ds-table__frame--overflow-start .ds-table__sticky-edge--start)::after,
1065
+ :where(.ds-table__frame--overflow-end .ds-table__sticky-edge--end)::after {
1066
+ box-shadow: none;
655
1067
  }
656
1068
 
657
- :where(.ds-table__row--selected > .ds-table__cell) {
658
- background: var(--ds-forced-color-selected);
659
- color: var(--ds-forced-color-on-selected);
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);
660
1075
  }
661
1076
 
662
1077
  :where(.ds-table__row--disabled) {