@sebgroup/green-core 3.9.0 → 3.10.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 (39) hide show
  1. package/components/card/card.styles.js +1 -0
  2. package/components/table/table.component.d.ts +27 -7
  3. package/components/table/table.component.js +730 -101
  4. package/components/table/table.imports.js +8 -0
  5. package/components/table/table.stories.data.d.ts +8 -5
  6. package/components/table/table.stories.data.js +705 -31
  7. package/components/table/table.styles.js +409 -189
  8. package/components/table/table.types.d.ts +97 -11
  9. package/custom-elements.json +107543 -107433
  10. package/gds-element.js +1 -1
  11. package/generated/locales/da.d.ts +4 -1
  12. package/generated/locales/da.js +4 -1
  13. package/generated/locales/de.d.ts +4 -1
  14. package/generated/locales/de.js +4 -1
  15. package/generated/locales/fi.d.ts +4 -1
  16. package/generated/locales/fi.js +4 -1
  17. package/generated/locales/fr.d.ts +4 -1
  18. package/generated/locales/fr.js +4 -1
  19. package/generated/locales/it.d.ts +4 -1
  20. package/generated/locales/it.js +4 -1
  21. package/generated/locales/nl.d.ts +4 -1
  22. package/generated/locales/nl.js +4 -1
  23. package/generated/locales/no.d.ts +4 -1
  24. package/generated/locales/no.js +4 -1
  25. package/generated/locales/sv.d.ts +4 -1
  26. package/generated/locales/sv.js +4 -1
  27. package/generated/mcp/components.json +1 -1
  28. package/generated/mcp/icons.json +1 -1
  29. package/generated/mcp/index.json +1 -1
  30. package/generated/mcp/table/angular.md +1 -0
  31. package/generated/mcp/table/api.md +32 -2
  32. package/generated/mcp/table/react.md +1 -0
  33. package/generated/mcp/tokens.json +1 -1
  34. package/generated/react/index.d.ts +6 -6
  35. package/generated/react/index.js +6 -6
  36. package/generated/react/table/index.d.ts +10 -4
  37. package/package.json +1 -1
  38. package/shared-styles/rbcb-toggle.style.js +1 -1
  39. package/utils/helpers/custom-element-scoping.js +1 -1
@@ -10,6 +10,24 @@ const TableStyles = css`
10
10
  --_table-height: 80vh;
11
11
  --_table-border-width: var(--gds-sys-space-5xs);
12
12
  --_table-border-color: var(--gds-sys-color-border-neutral-02);
13
+ --_skeleton-base: color-mix(
14
+ in srgb,
15
+ var(--gds-sys-color-content-neutral-01) 7%,
16
+ transparent
17
+ );
18
+ --_skeleton-highlight: color-mix(
19
+ in srgb,
20
+ var(--gds-sys-color-content-neutral-01) 15%,
21
+ transparent
22
+ );
23
+ --table-skeleton-text-height: 18px;
24
+ --table-skeleton-title-height: 20px;
25
+ --table-skeleton-block-height: 56px;
26
+ --table-expanded-full-skeleton-padding: var(--gds-sys-space-s);
27
+ --table-expanded-full-skeleton-gap: var(--gds-sys-space-s);
28
+ --table-expanded-full-skeleton-min-height: calc(
29
+ var(--table-row-min-height, var(--gds-sys-space-4xl)) * 3.25
30
+ );
13
31
  }
14
32
 
15
33
  /* Density Modes */
@@ -25,6 +43,14 @@ const TableStyles = css`
25
43
  --table-border-spacing: 0 var(--gds-sys-space-5xs);
26
44
  --table-data-padding: var(--gds-sys-space-5xs) var(--gds-sys-space-4xs);
27
45
  --table-data-padding-x: var(--gds-sys-space-4xs);
46
+ --table-skeleton-text-height: 18px;
47
+ --table-skeleton-title-height: 16px;
48
+ --table-skeleton-block-height: 48px;
49
+ --table-expanded-full-skeleton-padding: var(--gds-sys-space-xs);
50
+ --table-expanded-full-skeleton-gap: var(--gds-sys-space-xs);
51
+ --table-expanded-full-skeleton-min-height: calc(
52
+ var(--table-row-min-height) * 3
53
+ );
28
54
  }
29
55
 
30
56
  /* Comfortable default */
@@ -39,6 +65,14 @@ const TableStyles = css`
39
65
  --table-border-spacing: 0 var(--gds-sys-space-4xs);
40
66
  --table-data-padding: var(--gds-sys-space-3xs) var(--gds-sys-space-2xs);
41
67
  --table-data-padding-x: var(--gds-sys-space-2xs);
68
+ --table-skeleton-text-height: 18px;
69
+ --table-skeleton-title-height: 20px;
70
+ --table-skeleton-block-height: 56px;
71
+ --table-expanded-full-skeleton-padding: var(--gds-sys-space-s);
72
+ --table-expanded-full-skeleton-gap: var(--gds-sys-space-s);
73
+ --table-expanded-full-skeleton-min-height: calc(
74
+ var(--table-row-min-height) * 3.25
75
+ );
42
76
  }
43
77
 
44
78
  /* Spacious density */
@@ -53,33 +87,71 @@ const TableStyles = css`
53
87
  --table-border-spacing: 0 var(--gds-sys-space-3xs);
54
88
  --table-data-padding: var(--gds-sys-space-3xs) var(--gds-sys-space-xs);
55
89
  --table-data-padding-x: var(--gds-sys-space-xs);
90
+ --table-skeleton-text-height: 20px;
91
+ --table-skeleton-title-height: 24px;
92
+ --table-skeleton-block-height: 64px;
93
+ --table-expanded-full-skeleton-padding: var(--gds-sys-space-m);
94
+ --table-expanded-full-skeleton-gap: var(--gds-sys-space-m);
95
+ --table-expanded-full-skeleton-min-height: calc(
96
+ var(--table-row-min-height) * 3.5
97
+ );
56
98
  }
57
99
 
58
100
  /* Neutral 02 variants */
59
101
  .data.variant-neutral-02,
60
102
  .data.variant-neutral-02-outlined {
61
- --_table-header-bg: var(--gds-sys-color-l2-neutral-01);
62
- --_table-header-hover: var(--gds-sys-color-l3-neutral-02);
63
- --_table-header-active: var(--gds-sys-color-l3-neutral-03);
64
- --_table-row-hover: var(--gds-sys-color-l2-neutral-01);
65
- --_table-row-selected-hover: var(--gds-sys-color-l3-neutral-03-2);
66
- --_table-row-striped: var(--gds-sys-color-l2-neutral-01);
67
- --_table-card-bg: var(--gds-sys-color-l1-neutral-01);
103
+ --_table-header-bg: var(--gds-sys-color-l2-neutral-02-2);
104
+ --_table-header-hover: color-mix(
105
+ in srgb,
106
+ var(--_table-header-bg),
107
+ var(--gds-sys-color-state-neutral-03)
108
+ );
109
+ --_table-header-active: color-mix(
110
+ in srgb,
111
+ var(--_table-header-bg),
112
+ var(--gds-sys-color-state-neutral-04)
113
+ );
114
+ --_table-row-hover: var(--gds-sys-color-l2-neutral-02-2);
115
+ --_table-row-expanded: var(--gds-sys-color-l3-neutral-02);
116
+ --_table-row-selected: var(--gds-sys-color-l3-neutral-02);
117
+ --_table-row-selected-hover: color-mix(
118
+ in srgb,
119
+ var(--gds-sys-color-l3-neutral-02),
120
+ var(--gds-sys-color-state-neutral-01)
121
+ );
122
+ --_table-row-striped: var(--gds-sys-color-l2-neutral-02-2);
123
+ --_table-row-striped-hover: color-mix(
124
+ in srgb,
125
+ var(--_table-row-striped),
126
+ var(--gds-sys-color-state-neutral-01)
127
+ );
128
+ --_table-card-bg: var(--gds-card-variant-background);
68
129
  }
69
130
 
70
131
  /* Neutral 01 variant */
71
132
  .data.variant-neutral-01 {
72
133
  --_table-header-bg: var(--gds-sys-color-l2-neutral-02);
73
- --_table-header-hover: var(--gds-sys-color-l3-neutral-02);
74
- --_table-header-active: var(--gds-sys-color-l3-neutral-03);
75
- --_table-row-hover: color-mix(
134
+ --_table-header-hover: color-mix(
76
135
  in srgb,
77
- var(--gds-sys-color-l3-neutral-02),
78
- var(--gds-sys-color-state-neutral-01)
136
+ var(--_table-header-bg),
137
+ var(--gds-sys-color-state-neutral-03)
138
+ );
139
+ --_table-header-active: color-mix(
140
+ in srgb,
141
+ var(--_table-header-bg),
142
+ var(--gds-sys-color-state-neutral-04)
79
143
  );
144
+ --_table-row-expanded: var(--gds-sys-color-l3-neutral-02);
145
+ --_table-row-hover: var(--gds-sys-color-l2-neutral-02-2);
146
+ --_table-row-selected: var(--gds-sys-color-l3-neutral-02);
80
147
  --_table-row-selected-hover: var(--gds-sys-color-l3-neutral-01-2);
81
- --_table-row-striped: var(--gds-sys-color-l2-neutral-01);
82
- --_table-card-bg: var(--gds-sys-color-l2-neutral-01);
148
+ --_table-row-striped: var(--gds-sys-color-l2-neutral-02-2);
149
+ --_table-row-striped-hover: color-mix(
150
+ in srgb,
151
+ var(--_table-row-striped),
152
+ var(--gds-sys-color-state-neutral-01)
153
+ );
154
+ --_table-card-bg: var(--gds-card-variant-background);
83
155
  }
84
156
 
85
157
  /* Apply density variables */
@@ -99,7 +171,6 @@ const TableStyles = css`
99
171
  overflow-y: auto;
100
172
  max-height: var(--_table-height);
101
173
  box-sizing: border-box;
102
- padding: var(--table-data-padding);
103
174
  position: relative;
104
175
  border-radius: var(--gds-sys-radius-m);
105
176
  }
@@ -130,18 +201,22 @@ const TableStyles = css`
130
201
  border: none;
131
202
  border-collapse: separate;
132
203
  border-spacing: var(--table-border-spacing);
204
+ padding-top: var(--table-data-padding-x);
205
+ padding-inline: var(--table-data-padding-x);
133
206
  }
134
207
 
135
208
  tbody td {
136
209
  font-weight: normal;
210
+ min-height: var(--table-row-min-height);
137
211
  padding-block: var(--table-cell-padding-y);
138
212
  padding-inline: var(--table-cell-padding-x);
213
+ background-color: var(--_table-current-row-bg, var(--_table-card-bg));
139
214
  }
140
215
 
141
216
  thead tr th:first-child,
142
- tbody tr:hover td:first-child,
143
- tbody tr.selected td:first-child,
144
- .striped tbody tr td:first-child {
217
+ tbody tr:hover:not(.expanded-row, .expanded-parent) td:first-child,
218
+ tbody tr.selected:not(.expanded-row, .expanded-parent) td:first-child,
219
+ .striped tbody tr:not(.expanded-row, .expanded-parent) td:first-child {
145
220
  border-top-left-radius: var(--gds-sys-radius-s);
146
221
  border-bottom-left-radius: var(--gds-sys-radius-s);
147
222
  }
@@ -149,7 +224,7 @@ const TableStyles = css`
149
224
  thead tr th:last-child,
150
225
  tbody tr:hover td:last-child,
151
226
  tbody tr.selected td:last-child,
152
- .striped tbody tr td:last-child {
227
+ .striped tbody tr:not(.expanded-row, .expanded-parent) td:last-child {
153
228
  border-top-right-radius: var(--gds-sys-radius-s);
154
229
  border-bottom-right-radius: var(--gds-sys-radius-s);
155
230
  }
@@ -219,6 +294,10 @@ const TableStyles = css`
219
294
  border-top-color: var(--_table-border-color);
220
295
  }
221
296
 
297
+ tbody tr {
298
+ --_table-current-row-bg: var(--_table-card-bg);
299
+ }
300
+
222
301
  tbody tr.loading {
223
302
  opacity: 0.3;
224
303
  pointer-events: none;
@@ -235,8 +314,173 @@ const TableStyles = css`
235
314
  width: var(--gds-sys-space-l);
236
315
  max-width: var(--gds-sys-space-l);
237
316
  padding: var(--table-cell-padding-y) var(--table-cell-padding-x);
317
+ position: sticky;
318
+ left: 0;
319
+ z-index: 4;
320
+ }
321
+
322
+ .cell-center {
323
+ display: flex;
324
+ align-items: center;
325
+ justify-content: center;
326
+ width: 100%;
327
+ height: 100%;
328
+ }
329
+
330
+ /* Expanded */
331
+
332
+ .expander-cell {
333
+ min-width: var(--gds-sys-space-xl);
334
+ width: var(--gds-sys-space-xl);
335
+ max-width: var(--gds-sys-space-xl);
336
+ position: sticky;
337
+ left: 0;
338
+ z-index: 3;
339
+ }
340
+
341
+ th.expander-cell {
342
+ padding-inline: var(--table-cell-padding-x);
343
+ }
344
+
345
+ /* When both expander and checkbox are present, offset checkbox past expander.
346
+ Expander width = its content width + both inline paddings (content-box), plus container padding. */
347
+ .expander-cell + .checkbox-cell {
348
+ left: calc(var(--gds-sys-space-xl) + 2 * var(--table-cell-padding-x));
349
+ }
350
+
351
+ /* Sticky-like data cells follow the current row background. */
352
+ td.expander-cell,
353
+ td.checkbox-cell,
354
+ td.sticky-left,
355
+ td.sticky-right {
356
+ background: var(--_table-current-row-bg, var(--_table-card-bg));
357
+ }
358
+
359
+ /* Border-right divider on the outermost left sticky control column.
360
+ Uses container state classes instead of per-row sibling checks. */
361
+ .overflows-x.is-selectable:not(.scrolled-x-start):not(.has-sticky-left)
362
+ .checkbox-cell,
363
+ .overflows-x.is-expandable:not(.is-selectable):not(.scrolled-x-start):not(
364
+ .has-sticky-left
365
+ )
366
+ .expander-cell {
367
+ border-right: var(--_table-border-width) solid var(--_table-border-color);
368
+ }
369
+
370
+ /* ---- User-defined sticky columns ---- */
371
+
372
+ th.sticky-left,
373
+ td.sticky-left {
374
+ position: sticky;
375
+ z-index: 2;
376
+ }
377
+
378
+ th.sticky-left {
379
+ background: var(--_table-header-bg);
380
+ }
381
+
382
+ th.sticky-right,
383
+ td.sticky-right {
384
+ position: sticky;
385
+ z-index: 2;
238
386
  }
239
387
 
388
+ th.sticky-right {
389
+ background: var(--_table-header-bg);
390
+ }
391
+
392
+ /* tfoot sticky-left/right get header bg */
393
+ tfoot td.sticky-left,
394
+ tfoot th.sticky-left,
395
+ tfoot td.sticky-right,
396
+ tfoot th.sticky-right {
397
+ background: var(--_table-header-bg);
398
+ }
399
+
400
+ /* Divider borders — only the outermost column on each side shows the line */
401
+ .overflows-x:not(.scrolled-x-start) td.sticky-left-last,
402
+ .overflows-x:not(.scrolled-x-start) th.sticky-left-last {
403
+ border-right: var(--_table-border-width) solid var(--_table-border-color);
404
+ }
405
+
406
+ .overflows-x:not(.scrolled-x-end) td.sticky-right-last,
407
+ .overflows-x:not(.scrolled-x-end) th.sticky-right-last {
408
+ border-left: var(--_table-border-width) solid var(--_table-border-color);
409
+ }
410
+
411
+ tr.expanded-parent {
412
+ --_table-current-row-bg: var(--_table-row-expanded);
413
+ background: var(--_table-row-expanded);
414
+ }
415
+
416
+ tr.expanded-parent td:last-child {
417
+ border-bottom-right-radius: 0;
418
+ }
419
+
420
+ tr.expanded-parent td:first-child {
421
+ border-top-left-radius: var(--gds-sys-radius-s);
422
+ border-bottom-left-radius: 0;
423
+ }
424
+
425
+ tr.expanded-parent td:last-child {
426
+ border-top-right-radius: var(--gds-sys-radius-s);
427
+ border-bottom-right-radius: 0;
428
+ }
429
+
430
+ tr.expanded-parent td {
431
+ border-top-color: transparent;
432
+ }
433
+
434
+ /* Expanded row */
435
+ tr.expanded-row td {
436
+ border-top-color: transparent;
437
+ }
438
+
439
+ tr.expanded-row {
440
+ --_table-current-row-bg: var(--_table-row-expanded);
441
+ background: var(--_table-row-expanded);
442
+ }
443
+
444
+ tr.expanded-row:not([aria-busy='true']) td {
445
+ transition-property: opacity, translate;
446
+ transition-duration: var(--gds-sys-motion-duration-fast);
447
+ transition-timing-function: var(--gds-sys-motion-easing-enter);
448
+ opacity: 1;
449
+ translate: 0 0;
450
+
451
+ @starting-style {
452
+ opacity: 0;
453
+ translate: 0 4px;
454
+ }
455
+ }
456
+
457
+ tr.expanded-row.full:not([aria-busy='true']) .expanded-full-cell > * {
458
+ transition-property: opacity, translate;
459
+ transition-duration: var(--gds-sys-motion-duration-fast);
460
+ transition-timing-function: var(--gds-sys-motion-easing-enter);
461
+ opacity: 1;
462
+ translate: 0 0;
463
+
464
+ @starting-style {
465
+ opacity: 0;
466
+ translate: 0 6px;
467
+ }
468
+ }
469
+
470
+ tr.expanded-row.expanded-group-end td:first-child {
471
+ border-bottom-left-radius: var(--gds-sys-radius-s);
472
+ }
473
+
474
+ tr.expanded-row.expanded-group-end td:last-child {
475
+ border-bottom-right-radius: var(--gds-sys-radius-s);
476
+ }
477
+
478
+ tr.expanded-row + tr td {
479
+ border-top-color: transparent;
480
+ }
481
+
482
+ /* End · Expanded */
483
+
240
484
  tbody tr:hover td,
241
485
  tbody tr.selected td,
242
486
  tbody tr:first-child td {
@@ -253,17 +497,42 @@ const TableStyles = css`
253
497
  }
254
498
 
255
499
  tbody tr.selected {
256
- background-color: var(--gds-sys-color-l3-neutral-02);
500
+ --_table-current-row-bg: var(--_table-row-selected);
501
+ background-color: var(--_table-row-selected);
257
502
  }
258
503
 
259
504
  @media (hover: hover) and (min-width: 768px) {
260
505
  tbody tr.selected:hover {
506
+ --_table-current-row-bg: var(--_table-row-selected-hover);
261
507
  background-color: var(--_table-row-selected-hover);
262
508
  }
263
509
 
264
- tbody tr:hover:not(.selected) {
510
+ tbody tr:hover:not(.selected, .expanded-row, .expanded-parent) {
511
+ --_table-current-row-bg: var(--_table-row-hover);
265
512
  background-color: var(--_table-row-hover);
266
513
  }
514
+
515
+ .striped tbody tr:nth-child(even):hover:not(.selected) {
516
+ --_table-current-row-bg: var(--_table-row-striped-hover);
517
+ background-color: var(--_table-row-striped-hover);
518
+ }
519
+
520
+ .striped tbody tr.expanded-parent:nth-child(even):hover:not(.selected),
521
+ .striped tbody tr.expanded-row:nth-child(even):hover:not(.selected) {
522
+ --_table-current-row-bg: var(--_table-row-striped-hover);
523
+ background: var(--_table-row-striped-hover);
524
+ }
525
+
526
+ .striped
527
+ tbody
528
+ tr.expanded-parent:nth-child(even):hover:not(.selected)
529
+ td:not(.sticky-left):not(.sticky-right),
530
+ .striped
531
+ tbody
532
+ tr.expanded-row:nth-child(even):hover:not(.selected)
533
+ td:not(.sticky-left):not(.sticky-right) {
534
+ background-color: var(--_table-row-striped-hover);
535
+ }
267
536
  }
268
537
 
269
538
  tbody tr:hover,
@@ -272,7 +541,31 @@ const TableStyles = css`
272
541
  }
273
542
 
274
543
  /* Striped */
275
- .striped tbody tr:not(.selected, :hover):nth-child(even) td {
544
+ .striped tbody tr:nth-child(even):not(.selected):not(:hover) {
545
+ --_table-current-row-bg: var(--_table-row-striped);
546
+ }
547
+
548
+ .striped tbody tr.expanded-parent:nth-child(even):not(.selected):not(:hover),
549
+ .striped tbody tr.expanded-row:nth-child(even):not(.selected):not(:hover) {
550
+ --_table-current-row-bg: var(--_table-row-striped);
551
+ background: var(--_table-row-striped);
552
+ }
553
+
554
+ .striped
555
+ tbody
556
+ tr:nth-child(even):not(.selected):not(:hover)
557
+ td:not(.sticky-left):not(.sticky-right) {
558
+ background-color: var(--_table-row-striped);
559
+ }
560
+
561
+ .striped
562
+ tbody
563
+ tr.expanded-parent:nth-child(even):not(.selected):not(:hover)
564
+ td:not(.sticky-left):not(.sticky-right),
565
+ .striped
566
+ tbody
567
+ tr.expanded-row:nth-child(even):not(.selected):not(:hover)
568
+ td:not(.sticky-left):not(.sticky-right) {
276
569
  background-color: var(--_table-row-striped);
277
570
  }
278
571
 
@@ -280,6 +573,13 @@ const TableStyles = css`
280
573
  border-color: transparent;
281
574
  }
282
575
 
576
+ /* Keep expanded parent connected with its expanded rows */
577
+ tbody tr.expanded-parent td:last-child,
578
+ tbody tr.expanded-parent:hover td:last-child,
579
+ tbody tr.expanded-parent.selected td:last-child {
580
+ border-bottom-right-radius: 0;
581
+ }
582
+
283
583
  /* Header & Footer Layout */
284
584
 
285
585
  .header {
@@ -312,6 +612,11 @@ const TableStyles = css`
312
612
  display: flex;
313
613
  align-items: center;
314
614
  gap: 10px;
615
+ transition: all 420ms;
616
+
617
+ @starting-style {
618
+ opacity: 0;
619
+ }
315
620
  }
316
621
 
317
622
  /* Wrapping utilities */
@@ -357,116 +662,6 @@ const TableStyles = css`
357
662
  flex-direction: row-reverse;
358
663
  }
359
664
 
360
- th.actions {
361
- padding-inline: 0;
362
- }
363
-
364
- th.actions.justify-end .column-header {
365
- justify-content: flex-end;
366
- }
367
-
368
- /* Sticky actions column */
369
- th.actions.sticky,
370
- td.actions-cell.sticky {
371
- position: sticky;
372
- right: calc(-1 * var(--table-data-padding-x, 0px));
373
- z-index: 1;
374
- width: max-content;
375
- padding-right: calc(
376
- var(--table-cell-padding-x) + var(--table-data-padding-x, 0px)
377
- );
378
- }
379
-
380
- th.actions.sticky {
381
- z-index: 2;
382
- background: var(--_table-header-bg);
383
- }
384
-
385
- th.actions.sticky .column-header {
386
- justify-content: flex-end;
387
- }
388
-
389
- td.actions-cell.sticky {
390
- background: var(--_table-card-bg);
391
- }
392
-
393
- td.actions-cell.sticky .cell-content {
394
- justify-content: flex-end;
395
- position: relative;
396
- }
397
-
398
- /* Left gradient fade on sticky action cells */
399
- td.actions-cell.sticky::before {
400
- content: '';
401
- position: absolute;
402
- inset-block: 0;
403
- right: 100%;
404
- width: var(--gds-sys-space-4xl);
405
- pointer-events: none;
406
- background: linear-gradient(to right, transparent, var(--_table-card-bg));
407
- }
408
-
409
- th.actions.sticky::before {
410
- content: '';
411
- position: absolute;
412
- inset-block: 0;
413
- right: 100%;
414
- width: var(--gds-sys-space-4xl);
415
- pointer-events: none;
416
- background: linear-gradient(to right, transparent, var(--_table-header-bg));
417
- }
418
-
419
- /* Sticky action inherits row hover/selected/striped backgrounds */
420
- tbody tr:hover td.actions-cell.sticky {
421
- background: var(--_table-row-hover);
422
- }
423
-
424
- tbody tr:hover td.actions-cell.sticky::before {
425
- background: linear-gradient(to right, transparent, var(--_table-row-hover));
426
- }
427
-
428
- tbody tr.selected td.actions-cell.sticky {
429
- background: var(--gds-sys-color-l3-neutral-02);
430
- }
431
-
432
- tbody tr.selected td.actions-cell.sticky::before {
433
- background: linear-gradient(
434
- to right,
435
- transparent,
436
- var(--gds-sys-color-l3-neutral-02)
437
- );
438
- }
439
-
440
- tbody tr.selected:hover td.actions-cell.sticky {
441
- background: var(--_table-row-selected-hover);
442
- }
443
-
444
- tbody tr.selected:hover td.actions-cell.sticky::before {
445
- background: linear-gradient(
446
- to right,
447
- transparent,
448
- var(--_table-row-selected-hover)
449
- );
450
- }
451
-
452
- .striped
453
- tbody
454
- tr:not(.selected, :hover):nth-child(even)
455
- td.actions-cell.sticky {
456
- background: var(--_table-row-striped);
457
- }
458
-
459
- .striped
460
- tbody
461
- tr:not(.selected, :hover):nth-child(even)
462
- td.actions-cell.sticky::before {
463
- background: linear-gradient(
464
- to right,
465
- transparent,
466
- var(--_table-row-striped)
467
- );
468
- }
469
-
470
665
  /* Table Footer Row */
471
666
 
472
667
  tfoot.tablefoot tr td,
@@ -506,16 +701,6 @@ const TableStyles = css`
506
701
  will-change: transform;
507
702
  }
508
703
 
509
- /* When sticky tablefoot: move padding from .data to table, keep tfoot edge-to-edge */
510
- .data:has(tfoot.tablefoot.sticky) {
511
- padding: 0;
512
- }
513
-
514
- .data:has(tfoot.tablefoot.sticky) table {
515
- padding-top: var(--table-data-padding-x);
516
- padding-inline: var(--table-data-padding-x);
517
- }
518
-
519
704
  tfoot.tablefoot.sticky tr td,
520
705
  tfoot.tablefoot.sticky tr th[scope='row'] {
521
706
  border-radius: 0;
@@ -561,6 +746,7 @@ const TableStyles = css`
561
746
  @media (max-width: 760px) {
562
747
  .responsive.data {
563
748
  display: contents;
749
+ --_table-row-striped: transparent;
564
750
  }
565
751
 
566
752
  .responsive table {
@@ -614,6 +800,22 @@ const TableStyles = css`
614
800
  border: none;
615
801
  }
616
802
 
803
+ .responsive td.expander-cell,
804
+ .responsive td.checkbox-cell {
805
+ width: auto;
806
+ max-width: none;
807
+ padding-top: 0;
808
+ padding-bottom: var(--gds-sys-space-xs);
809
+ }
810
+
811
+ .responsive .expand-toggle {
812
+ align-self: flex-start;
813
+ }
814
+
815
+ .responsive tr.expanded-row {
816
+ margin-top: 0;
817
+ }
818
+
617
819
  .responsive td .column-label {
618
820
  text-align: left;
619
821
  flex: 1;
@@ -632,11 +834,6 @@ const TableStyles = css`
632
834
  justify-content: flex-end;
633
835
  text-align: right;
634
836
  }
635
-
636
- .responsive tr:hover,
637
- .responsive tr td:hover {
638
- background: none;
639
- }
640
837
  }
641
838
 
642
839
  /* Medium screens: input and dropdown side by side */
@@ -712,14 +909,13 @@ const TableStyles = css`
712
909
  display: inline-block;
713
910
  background: linear-gradient(
714
911
  90deg,
715
- var(--gds-sys-color-l3-neutral-01) 25%,
716
- var(--gds-sys-color-l2-neutral-01) 50%,
717
- var(--gds-sys-color-l3-neutral-01) 75%
912
+ var(--_skeleton-base) 25%,
913
+ var(--_skeleton-highlight) 50%,
914
+ var(--_skeleton-base) 75%
718
915
  );
719
916
  background-size: 200% 100%;
720
917
  animation: skeleton-shimmer 1.5s ease-in-out infinite;
721
918
  border-radius: var(--gds-sys-space-max);
722
- opacity: 0.1;
723
919
  }
724
920
 
725
921
  @keyframes skeleton-shimmer {
@@ -733,7 +929,7 @@ const TableStyles = css`
733
929
 
734
930
  /* Skeleton elements */
735
931
  .skeleton-text {
736
- height: 14px;
932
+ height: var(--table-skeleton-text-height);
737
933
  width: 80%;
738
934
  min-width: 60px;
739
935
  }
@@ -750,6 +946,41 @@ const TableStyles = css`
750
946
  border-radius: var(--gds-sys-radius-max);
751
947
  }
752
948
 
949
+ .skeleton-title {
950
+ height: var(--table-skeleton-title-height);
951
+ width: min(34ch, 70%);
952
+ }
953
+
954
+ .skeleton-block {
955
+ height: var(--table-skeleton-block-height);
956
+ border-radius: var(--gds-sys-radius-s);
957
+ }
958
+
959
+ .expanded-full-skeleton {
960
+ display: flex;
961
+ flex-direction: column;
962
+ gap: var(--table-expanded-full-skeleton-gap);
963
+ padding: var(--table-expanded-full-skeleton-padding);
964
+ min-height: var(--table-expanded-full-skeleton-min-height);
965
+ }
966
+
967
+ .expanded-full-skeleton-meta {
968
+ display: grid;
969
+ gap: var(--table-expanded-full-skeleton-gap);
970
+ grid-template-columns: repeat(3, minmax(120px, 1fr));
971
+ }
972
+
973
+ tr.expanded-row.skeleton-leave td {
974
+ transition-property: opacity;
975
+ transition-duration: var(--gds-sys-motion-duration-fast);
976
+ transition-timing-function: var(--gds-sys-motion-easing-leave);
977
+ opacity: 0;
978
+ }
979
+
980
+ tr.expanded-row.skeleton-leave .skeleton {
981
+ animation-play-state: paused;
982
+ }
983
+
753
984
  /* Skeleton row styling */
754
985
  .skeleton-row {
755
986
  opacity: 1;
@@ -786,32 +1017,12 @@ const TableStyles = css`
786
1017
  /* Scroll driven animation */
787
1018
  @supports (animation-timeline: scroll()) {
788
1019
  @media (prefers-reduced-motion: no-preference) {
789
- tbody tr {
790
- animation-name: ROW_ANIMATION_VERTICAL, ROW_ANIMATION_VERTICAL;
791
- animation-fill-mode: both;
792
- animation-timing-function: ease-in-out;
793
- animation-direction: normal, reverse;
794
- animation-timeline: view(block);
795
- animation-range:
796
- entry -40px,
797
- exit -40px;
798
- }
799
-
800
- @keyframes ROW_ANIMATION_VERTICAL {
801
- 0% {
802
- opacity: 0;
803
- filter: blur(12px);
804
- translate: 0 12px;
805
- }
806
- }
807
-
808
1020
  thead {
809
1021
  position: sticky;
810
1022
  top: 4px;
811
1023
  z-index: 10;
812
1024
  transition: box-shadow 200ms ease;
813
1025
  border-radius: var(--gds-sys-radius-s);
814
- will-change: transform;
815
1026
  }
816
1027
 
817
1028
  thead {
@@ -820,21 +1031,11 @@ const TableStyles = css`
820
1031
 
821
1032
  .data.scrolled thead {
822
1033
  box-shadow:
1034
+ 0 -10px 0 0 var(--gds-card-variant-background),
1035
+ -10px -10px 0 0 var(--gds-card-variant-background),
1036
+ 10px -10px 0 0 var(--gds-card-variant-background),
823
1037
  var(--gds-sys-shadow-l-01),
824
- var(--gds-sys-shadow-l-02),
825
- inset 0 -4px 6px var(--gds-sys-color-l1-neutral-01);
826
- backdrop-filter: blur(8px);
827
- background: color-mix(
828
- in srgb,
829
- var(--gds-sys-color-l2-neutral-01),
830
- transparent 30%
831
- );
832
- }
833
-
834
- @media (prefers-reduced-transparency: no-preference) {
835
- .data.scrolled thead tr th {
836
- background: transparent;
837
- }
1038
+ var(--gds-sys-shadow-l-02);
838
1039
  }
839
1040
 
840
1041
  /* Sticky table footer */
@@ -891,8 +1092,8 @@ const TableStyles = css`
891
1092
  animation-timeline: scroll(self inline);
892
1093
  }
893
1094
 
894
- /* When sticky actions are present, remove the right fade.*/
895
- .data:has(td.actions-cell.sticky) {
1095
+ /* When sticky-right column is present, remove the right fade. */
1096
+ .data.has-sticky-right {
896
1097
  mask: linear-gradient(
897
1098
  to right,
898
1099
  #0000,
@@ -900,6 +1101,23 @@ const TableStyles = css`
900
1101
  #ffff 100%
901
1102
  );
902
1103
  }
1104
+
1105
+ /* When expandable, selectable, or sticky-left column is present, remove the left fade. */
1106
+ .data.is-expandable,
1107
+ .data.is-selectable,
1108
+ .data.has-sticky-left {
1109
+ mask: linear-gradient(
1110
+ to right,
1111
+ #ffff,
1112
+ #ffff calc(100% - var(--_end-fade)),
1113
+ #0000
1114
+ );
1115
+ }
1116
+
1117
+ /* When both left and right sticky columns are present, remove both fades. */
1118
+ .data.no-mask {
1119
+ mask: none;
1120
+ }
903
1121
  }
904
1122
  }
905
1123
 
@@ -960,7 +1178,9 @@ const TableStyles = css`
960
1178
  thead th .column-header,
961
1179
  .sort-icon,
962
1180
  .column-header,
963
- .header {
1181
+ .header,
1182
+ tr.expanded-row.skeleton-leave td,
1183
+ tr.expanded-row.full:not([aria-busy='true']) .expanded-full-cell > * {
964
1184
  transition: none;
965
1185
  animation: none;
966
1186
  }