@ds-mo/ui 13.16.1 → 13.17.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.
@@ -163,6 +163,66 @@
163
163
  --_table-selection-column-contribution: var(--_table-selection-column-inline-size);
164
164
  }
165
165
 
166
+ /*
167
+ * A contained grouped table uses native sticky positioning without a scroll
168
+ * listener or duplicated section lane. Turning its table formatting boxes into
169
+ * explicit blocks makes every real tbody a section boundary; shared grid tracks
170
+ * retain exact header/body alignment while the browser performs push-off in the
171
+ * same layout pass as scrolling and container resize.
172
+ */
173
+ :where(.ds-table__table--native-group-sticky) {
174
+ display: block;
175
+ }
176
+
177
+ :where(.ds-table__table--native-group-sticky > colgroup) {
178
+ display: none;
179
+ }
180
+
181
+ :where(.ds-table__table--native-group-sticky > .ds-table__head),
182
+ :where(.ds-table__table--native-group-sticky > .ds-table__body) {
183
+ display: block;
184
+ inline-size: 100%;
185
+ }
186
+
187
+ :where(.ds-table__table--native-group-sticky > .ds-table__group) {
188
+ position: relative;
189
+ contain: layout style;
190
+ }
191
+
192
+ :where(.ds-table__table--native-group-sticky .ds-table__header-row),
193
+ :where(.ds-table__table--native-group-sticky .ds-table__row),
194
+ :where(.ds-table__table--native-group-sticky .ds-table__skeleton-row) {
195
+ display: grid;
196
+ grid-template-columns: var(--_table-grid-template-columns);
197
+ inline-size: 100%;
198
+ }
199
+
200
+ :where(.ds-table__table--native-group-sticky .ds-table__group-row),
201
+ :where(.ds-table__table--native-group-sticky .ds-table__state-row),
202
+ :where(.ds-table__table--native-group-sticky .ds-table__load-row) {
203
+ display: block;
204
+ inline-size: 100%;
205
+ }
206
+
207
+ :where(.ds-table__table--native-group-sticky .ds-table__header-cell),
208
+ :where(.ds-table__table--native-group-sticky .ds-table__cell),
209
+ :where(.ds-table__table--native-group-sticky .ds-table__group-cell),
210
+ :where(.ds-table__table--native-group-sticky .ds-table__state-cell),
211
+ :where(.ds-table__table--native-group-sticky .ds-table__load-cell) {
212
+ display: block;
213
+ inline-size: auto;
214
+ width: auto;
215
+ max-inline-size: none;
216
+ max-width: none;
217
+ }
218
+
219
+ :where(.ds-table__table--native-group-sticky .ds-table__group-cell),
220
+ :where(.ds-table__table--native-group-sticky .ds-table__state-cell),
221
+ :where(.ds-table__table--native-group-sticky .ds-table__load-cell) {
222
+ inline-size: 100%;
223
+ width: 100%;
224
+ }
225
+
166
226
  :where(.ds-table__caption-bar),
167
227
  :where(.ds-table__footer) {
168
228
  box-sizing: border-box;
@@ -184,6 +244,20 @@
184
244
  color: var(--color-foreground-primary);
185
245
  }
186
246
 
247
+ :where(.ds-table__caption-content) {
248
+ display: grid;
249
+ flex: 1 1 auto;
250
+ grid-template-columns: minmax(0, 1fr);
251
+ align-items: center;
252
+ box-sizing: border-box;
253
+ min-inline-size: 0;
254
+ max-inline-size: 100%;
255
+ }
256
+
257
+ :where(.ds-table__caption-content > slot) {
258
+ display: contents;
259
+ }
260
+
187
261
  :where(.ds-table--caption-visible .ds-table__frame),
188
262
  :where(.ds-table--caption-visible .ds-table__viewport) {
189
263
  border-start-start-radius: 0;
@@ -306,9 +380,18 @@
306
380
  inline-size: 100%;
307
381
  block-size: var(--_table-row-min-block-size);
308
382
  overflow: hidden;
383
+ }
384
+
385
+ :where(.ds-table--document-sticky-header .ds-table__sticky-group) {
309
386
  will-change: inset-block-start;
310
387
  }
311
388
 
389
+ :where(.ds-table--contained-sticky-header .ds-table__sticky-group) {
390
+ inset-block-start: var(--_table-header-min-block-size);
391
+ transform: translateY(var(--_table-sticky-group-push, 0));
392
+ will-change: transform;
393
+ }
394
+
312
395
  :where(.ds-table__sticky-group .ds-table__group-content) {
313
396
  position: relative;
314
397
  }
@@ -452,6 +535,21 @@
452
535
  vertical-align: top;
453
536
  }
454
537
 
538
+ /*
539
+ * Native table cells add their block padding outside the declared content
540
+ * height and grow together with their row. Grid items use border-box sizing,
541
+ * so restore intrinsic sizing and grid-track stretch for the grouped-sticky
542
+ * renderer instead of turning the native recipe's base sizes into hard caps.
543
+ */
544
+ :where(.ds-table__table--native-group-sticky .ds-table__header-cell) {
545
+ min-block-size: var(--_table-header-min-block-size);
546
+ block-size: auto;
547
+ }
548
+
549
+ :where(.ds-table__table--native-group-sticky .ds-table__cell) {
550
+ block-size: auto;
551
+ }
552
+
455
553
  :where(.ds-table__header-cell + .ds-table__header-cell) {
456
554
  border-inline-start: 0;
457
555
  }
@@ -991,6 +1089,13 @@
991
1089
  background: transparent;
992
1090
  }
993
1091
 
1092
+ /* Each real section owns one sticky row and its own push-off boundary. */
1093
+ :where(.ds-table--contained-sticky-header .ds-table__group-row--native-sticky) {
1094
+ position: sticky;
1095
+ inset-block-start: var(--_table-header-min-block-size);
1096
+ z-index: 5;
1097
+ }
1098
+
994
1099
  /* Intentful groups resolve from their faint signal into neutral at the trailing edge. */
995
1100
  :where(.ds-table__group-cell--intent-brand),
996
1101
  :where(.ds-table__group-cell--intent-negative),
@@ -81,9 +81,7 @@ export declare class Table {
81
81
  private announcement;
82
82
  private activeStickyGroupId;
83
83
  private viewportFitSettled;
84
- private headerLeadingPresent;
85
- private headerCopyPresent;
86
- private headerTrailingPresent;
84
+ private headerPresent;
87
85
  private rootEl;
88
86
  private viewportEl;
89
87
  private frameEl;
@@ -108,6 +106,7 @@ export declare class Table {
108
106
  private syncHeaderSlotPresence;
109
107
  private connectHeaderSlotObserver;
110
108
  private connectStickyGroup;
109
+ private syncStickyGroupConnection;
111
110
  private disconnectStickyGroup;
112
111
  private readonly updateStickyGroup;
113
112
  handleStructureChange(): void;
@@ -1,6 +1,5 @@
1
1
  export interface TableLayoutElements {
2
2
  viewport: HTMLElement | null;
3
- table: HTMLTableElement | null;
4
3
  stickyHeaderTable: HTMLTableElement | null;
5
4
  collapseAllOverlay: HTMLElement | null;
6
5
  frame: HTMLElement | null;
@@ -28,7 +27,6 @@ export interface TableLayoutMetricInput {
28
27
  scrollInlineSize: number;
29
28
  scrollBlockSize: number;
30
29
  scrollInlineOffset: number;
31
- tableInlineSize: number;
32
30
  collapseHeadBlockStart?: number;
33
31
  collapseFrameBlockStart?: number;
34
32
  }
@@ -51,7 +49,6 @@ export declare class TableLayoutController {
51
49
  private readonly options;
52
50
  private connected;
53
51
  private connectedViewport;
54
- private observedTable;
55
52
  private resizeObserver;
56
53
  private frame;
57
54
  private overflow;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ds-mo/ui",
3
- "version": "13.16.1",
3
+ "version": "13.17.0",
4
4
  "description": "CompoMo — composable web components styled with TokoMo design tokens",
5
5
  "keywords": [
6
6
  "web-components",