@slotted/styles 0.1.0-beta.4 → 0.1.0-beta.6

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.
@@ -189,8 +189,14 @@
189
189
  }
190
190
 
191
191
  /* The ring is drawn inside, because a scroller flush against the frame would
192
- otherwise draw half its ring outside it. */
193
- [data-ui='table'] [data-part='scroll']:focus-visible {
192
+ otherwise draw half its ring outside it. It is drawn for a focus from the
193
+ keyboard: a click on a cell focuses the scroller too, and the next Shift
194
+ would make it match `:focus-visible` (`createFocusOrigin`). The browser's own
195
+ ring is suppressed for the same focus. */
196
+ [data-ui='table'] [data-part='scroll']:focus {
197
+ outline: none;
198
+ }
199
+ [data-ui='table'] [data-part='scroll']:focus-visible[data-focus-origin='keyboard'] {
194
200
  outline: var(--slotted-focus-ring-width, 2px) solid var(--slotted-focus-ring-color, Highlight);
195
201
  outline-offset: calc(var(--slotted-focus-ring-offset, 2px) * -1);
196
202
  }
package/src/tabs/tabs.css CHANGED
@@ -47,23 +47,35 @@
47
47
  min(calc(var(--_icon-size) + 2 * var(--slotted-space-2, 0.25rem)), var(--_inner-size))
48
48
  );
49
49
  --_dismiss-overhang: calc((var(--_dismiss-size) - var(--_icon-size)) / 2);
50
- --_marker-size: var(--slotted-border-width-thick, 2px);
50
+ /**
51
+ * The marker: one bar the list draws under the selected tab, and the hover
52
+ * bar under the tab the pointer is on, in the same geometry — the tab's
53
+ * content box, a pill just above the list's edge. It is never thinner than the
54
+ * thick border width, the floor the high-contrast scheme keeps for a mark
55
+ * that carries state, and its thickness, its rounding and its inset are
56
+ * tokens of their own: tied to the thick border width, a theme could not
57
+ * thicken the marker without thickening sixty other rules.
58
+ */
59
+ --_marker-size: max(
60
+ var(--slotted-tabs-marker-size, 3px),
61
+ var(--slotted-border-width-thick, 2px)
62
+ );
63
+ --_marker-radius: var(--slotted-tabs-marker-radius, var(--slotted-radius-full, 9999px));
64
+ --_marker-inset: var(--slotted-tabs-marker-inset, var(--_padding-inline));
65
+ /**
66
+ * The gap between the bars and the list's edge: the selected marker and the
67
+ * hover bar stand this far above the track, so the line reads as a line and
68
+ * the bar as a mark on it. An inset rather than a transform, because the
69
+ * marker's `translate` is its slide between tabs.
70
+ */
71
+ --_marker-offset: var(--slotted-tabs-marker-offset, 1px);
72
+ --_track-color: var(--slotted-tabs-track-color, var(--slotted-border-subtle, ButtonBorder));
51
73
  /**
52
74
  * The length of the fade a scrolling list takes at an edge that has more
53
75
  * behind it, read once here so the five mask gradients below state a
54
76
  * length and no public property of their own.
55
77
  */
56
78
  --_fade: var(--slotted-tabs-fade-size, var(--slotted-space-6, 1rem));
57
- /**
58
- * Which way the selection travelled, resolved into a transform origin. The
59
- * marker of the tab being left collapses toward the direction of travel
60
- * and the marker of the tab being entered grows from the side the reader
61
- * came from, so the pair reads as one bar moving. Nothing is measured:
62
- * every surveyed indicator reads the active tab's box, which is why Base UI
63
- * ships `renderBeforeHydration` and Ark UI a `setIndicatorRect`.
64
- */
65
- --_marker-origin: 50%;
66
- --_marker-origin-selected: 50%;
67
79
 
68
80
  /**
69
81
  * No column gap on the grid itself: three gaps stood around two empty
@@ -112,6 +124,9 @@
112
124
  * it the panel's first letter touched the track on the list's end edge.
113
125
  */
114
126
  [data-ui='tabs'][data-orientation='vertical'] {
127
+ /* The inset runs along the block axis, where a tab has no padding. */
128
+ --_marker-inset: var(--slotted-tabs-marker-inset, 0px);
129
+
115
130
  column-gap: var(--slotted-tabs-gap, var(--slotted-space-6, 1rem));
116
131
  grid-template-columns: auto minmax(0, 1fr);
117
132
  grid-template-rows: auto auto;
@@ -140,6 +155,8 @@
140
155
  overflow-x: auto;
141
156
  overflow-y: hidden;
142
157
  overscroll-behavior-inline: contain;
158
+ /* The containing block of the marker, which scrolls with the tabs. */
159
+ position: relative;
143
160
  /**
144
161
  * The platform's scrollbar is the affordance until the family draws its
145
162
  * own. It is hidden only once `data-overflowing` says the paging controls
@@ -153,9 +170,19 @@
153
170
  scrollbar-width: none;
154
171
  }
155
172
 
173
+ /**
174
+ * The track is an inset shadow on the list's own padding rather than its
175
+ * border. The list is a scroll container, which clips what it draws to its
176
+ * padding box, so a marker standing over a border was cut along it; inside
177
+ * the padding the marker lies over the line, flush with the list's edge. The
178
+ * shadow is the box's, so the line does not scroll with the tabs.
179
+ */
156
180
  [data-ui='tabs'][data-variant='line'][data-track='line'] > [data-part='list'] {
157
- border-block-end: var(--_track-size) solid
158
- var(--slotted-tabs-track-color, var(--slotted-border-subtle, ButtonBorder));
181
+ /* How far the hover bar reaches past an item to stand on the track. */
182
+ --_track-reach: var(--_track-size);
183
+
184
+ box-shadow: inset 0 calc(-1 * var(--_track-size)) 0 var(--_track-color);
185
+ padding-block-end: var(--_track-size);
159
186
  }
160
187
 
161
188
  /**
@@ -169,24 +196,10 @@
169
196
  * variant for the same case, which is a second family's worth of paint to
170
197
  * remove one line.
171
198
  *
172
- * The marker then sits on the item's own edge rather than a track's width
173
- * below it, so it lands on the line the page already drew. Where that line is
174
- * is the page's business: the family stops at its own box.
199
+ * The marker then sits on the list's own edge, which is the items' edge, so
200
+ * it lands on the line the page already drew. Where that line is is the
201
+ * page's business: the family stops at its own box.
175
202
  */
176
- [data-ui='tabs'][data-track='none'] > :where([data-part='list']) > [data-part='item']::before,
177
- [data-ui='tabs'][data-track='none'] > :where([data-part='list']) > [data-part='item']::after {
178
- inset-block-end: 0;
179
- }
180
-
181
- [data-ui='tabs'][data-track='none'][data-orientation='vertical']
182
- > :where([data-part='list'])
183
- > [data-part='item']::before,
184
- [data-ui='tabs'][data-track='none'][data-orientation='vertical']
185
- > :where([data-part='list'])
186
- > [data-part='item']::after {
187
- inset-block-end: auto;
188
- inset-inline-end: 0;
189
- }
190
203
 
191
204
  /**
192
205
  * A column of labels reads down its own start edge. Centring them is what the
@@ -209,11 +222,17 @@
209
222
  overflow-y: auto;
210
223
  }
211
224
 
225
+ /* A shadow takes no logical offset, so the line's side is mirrored by hand. */
212
226
  [data-ui='tabs'][data-orientation='vertical'][data-variant='line'][data-track='line']
213
227
  > [data-part='list'] {
214
- border-block-end: 0;
215
- border-inline-end: var(--_track-size) solid
216
- var(--slotted-tabs-track-color, var(--slotted-border-subtle, ButtonBorder));
228
+ box-shadow: inset calc(-1 * var(--_track-size)) 0 0 var(--_track-color);
229
+ padding-block-end: 0;
230
+ padding-inline-end: var(--_track-size);
231
+ }
232
+
233
+ [data-ui='tabs'][data-orientation='vertical'][data-variant='line'][data-track='line']:dir(rtl)
234
+ > [data-part='list'] {
235
+ box-shadow: inset var(--_track-size) 0 0 var(--_track-color);
217
236
  }
218
237
 
219
238
  /**
@@ -251,10 +270,9 @@
251
270
  /* ── One tab, and the box that holds it ───────────────────────────────── */
252
271
 
253
272
  /**
254
- * The item is presentational, and it exists for two reasons a `button`
255
- * cannot answer: a `button` may not contain a `button`, so a dismissible tab
256
- * needs a box for its second control, and the marker has to span the pair
257
- * rather than only the label.
273
+ * The item is presentational, and it exists because a `button` may not
274
+ * contain a `button`: a dismissible tab needs a box for its second control.
275
+ * It also carries the hover bar, under the tab and not the control.
258
276
  */
259
277
  [data-ui='tabs'] > :where([data-part='list']) > [data-part='item'] {
260
278
  align-items: stretch;
@@ -438,52 +456,111 @@
438
456
  /* ── The marker ───────────────────────────────────────────────────────── */
439
457
 
440
458
  /**
441
- * Drawn on the item, on the edge the list runs along, and present on every
442
- * item rather than only on the selected one: a mark that appears has nothing
443
- * to transition from. It is scaled to nothing across the axis it marks, and
444
- * the transform origin is what the direction of travel decides.
445
- *
446
- * It is pulled over the track by exactly the track's own width, so the two
447
- * lines are one line rather than a hairline with a thicker line beside it.
459
+ * One bar, drawn by the list rather than by each item, that slides from the
460
+ * tab being left to the tab being entered: a mark per item can only appear
461
+ * or scale from an edge, and one mark moving is what says the selection
462
+ * moved. The binding creates it with `createIndicator` from
463
+ * `@slotted/core/measure`, which writes the selected tab's start and length
464
+ * in the list's scroll coordinates; everything else is decided here.
448
465
  *
449
- * There are two of them in the same place. `::after` is the mark, in the
450
- * accent, and the one that travels. `::before` is the hover, in a neutral
451
- * a step darker than the track: the same bar, under the tab the pointer is
452
- * on, saying where the mark would go. It fades rather than grows — a bar
453
- * that slid in from one side on every pass of the pointer would be the
454
- * travelling animation with nothing travelling — and it is never on the
455
- * selected item, where the mark already is.
456
- */
457
- [data-ui='tabs'] > :where([data-part='list']) > [data-part='item']::before,
458
- [data-ui='tabs'] > :where([data-part='list']) > [data-part='item']::after {
459
- border-start-end-radius: var(--slotted-radius-xs, 2px);
460
- border-start-start-radius: var(--slotted-radius-xs, 2px);
466
+ * It spans the tab's content box — the icon and the label — through
467
+ * `--slotted-tabs-marker-inset`, which defaults to the tab's own inline
468
+ * padding, and never the closing control: a tab followed by one gives up its
469
+ * end padding, so the end inset is nought there. Below the width of a short
470
+ * label it keeps a minimum length, centred on the content. It stands
471
+ * `--slotted-tabs-marker-offset` above the list's edge, over the track, and the axes are physical in this one rule
472
+ * because the measurement is: the translate is from the list's left edge.
473
+ */
474
+ [data-ui='tabs'] > :where([data-part='list']) > [data-part='marker'] {
475
+ --_start-inset: var(--_marker-inset);
476
+ --_end-inset: var(--_marker-inset);
477
+ --_left-inset: var(--_start-inset);
478
+ --_span: calc(var(--_indicator-length, 0px) - var(--_start-inset) - var(--_end-inset));
479
+ --_length: max(var(--slotted-space-6, 1rem), var(--_span));
480
+
481
+ background-color: var(--slotted-tabs-marker-color, var(--slotted-tone-accent-solid));
461
482
  block-size: var(--_marker-size);
462
- content: '';
463
- inset-block-end: calc(-1 * var(--_track-size));
464
- inset-inline: 0;
465
- opacity: 0;
483
+ border-radius: var(--_marker-radius);
484
+ inline-size: var(--_length);
485
+ inset-block-end: calc(var(--_marker-lift, 0px) + var(--_marker-offset));
486
+ left: 0;
466
487
  pointer-events: none;
467
488
  position: absolute;
489
+ translate: calc(
490
+ var(--_indicator-start, 0px) + var(--_left-inset) + (var(--_span) - var(--_length)) / 2
491
+ )
492
+ 0;
493
+ }
494
+
495
+ [data-ui='tabs']:dir(rtl) > :where([data-part='list']) > [data-part='marker'] {
496
+ --_left-inset: var(--_end-inset);
497
+ }
498
+
499
+ [data-ui='tabs']:not([data-orientation='vertical'])
500
+ > [data-part='list']:has(> [data-part='item'][data-selected] > [data-part='dismiss'])
501
+ > [data-part='marker'] {
502
+ --_end-inset: 0px;
503
+ }
504
+
505
+ [data-ui='tabs'] > :where([data-part='list']) > [data-part='marker'][hidden] {
506
+ display: none;
507
+ }
508
+
509
+ /**
510
+ * It slides only when the selection moves: `data-moving` arrives with a
511
+ * position whose tab changed, and leaves with a re-measurement of the same
512
+ * tab, so the first position, a font arriving and a resized list place the
513
+ * bar without motion. The slide takes the medium duration on a curve that
514
+ * starts and ends slowly, `--slotted-tabs-marker-easing`: the control
515
+ * duration on the theme's decelerating curve covered a third of the
516
+ * distance in its first frame and read as a jump. Under reduced motion it
517
+ * jumps.
518
+ */
519
+ [data-ui='tabs'] > :where([data-part='list']) > [data-part='marker'][data-moving] {
520
+ --_marker-easing: var(--slotted-tabs-marker-easing, cubic-bezier(0.4, 0, 0.2, 1));
521
+
522
+ transition:
523
+ translate var(--slotted-duration-medium) var(--_marker-easing),
524
+ inline-size var(--slotted-duration-medium) var(--_marker-easing),
525
+ block-size var(--slotted-duration-medium) var(--_marker-easing);
468
526
  }
469
527
 
528
+ @media (prefers-reduced-motion: reduce) {
529
+ [data-ui='tabs'] > :where([data-part='list']) > [data-part='marker'][data-moving] {
530
+ transition: none;
531
+ }
532
+ }
533
+
534
+ /**
535
+ * The hover bar: the marker's geometry under the tab the pointer is on, in a
536
+ * neutral at a reduced opacity, saying where the mark would go. It is drawn
537
+ * on the item, and it fades rather than slides — a bar that travelled on
538
+ * every pass of the pointer would be the selection's motion with nothing
539
+ * selected. It reaches past the item by the track's width to lie on it, and
540
+ * stops at the tab where a closing control follows: that control is the
541
+ * tab's inline padding on either side of the glyph.
542
+ */
470
543
  [data-ui='tabs'] > :where([data-part='list']) > [data-part='item']::before {
471
- /* No system colour as a last resort: unthemed, the bar disappears rather
472
- than shouts, as the mark beside it already does. */
473
544
  background-color: var(--slotted-tabs-hover-marker-color, var(--slotted-border-strong));
545
+ block-size: var(--_marker-size);
546
+ border-radius: var(--_marker-radius);
547
+ content: '';
548
+ inset-block-end: calc(var(--_marker-offset) - var(--_track-reach, 0px));
549
+ inset-inline: var(--_marker-inset);
550
+ min-inline-size: var(--slotted-space-6, 1rem);
551
+ opacity: 0;
552
+ pointer-events: none;
553
+ position: absolute;
474
554
  transition:
475
555
  background-color var(--slotted-control-transition-duration)
476
556
  var(--slotted-control-transition-easing),
477
557
  opacity var(--slotted-control-transition-duration) var(--slotted-control-transition-easing);
478
558
  }
479
559
 
480
- [data-ui='tabs'] > :where([data-part='list']) > [data-part='item']::after {
481
- background-color: var(--slotted-tabs-marker-color, var(--slotted-tone-accent-solid));
482
- transform: scale(0, 1);
483
- transform-origin: var(--_marker-origin) 50%;
484
- transition:
485
- opacity var(--slotted-control-transition-duration) var(--slotted-control-transition-easing),
486
- transform var(--slotted-control-transition-duration) var(--slotted-control-transition-easing);
560
+ [data-ui='tabs']:not([data-orientation='vertical'])
561
+ > :where([data-part='list'])
562
+ > [data-part='item']:has(> [data-part='dismiss'])::before {
563
+ inset-inline-end: calc(2 * var(--_padding-inline) + var(--_icon-size));
487
564
  }
488
565
 
489
566
  [data-ui='tabs'][data-variant='line']
@@ -491,7 +568,7 @@
491
568
  > [data-part='item']:not([data-selected]):has(
492
569
  > [data-part='tab']:not(:disabled):hover
493
570
  )::before {
494
- opacity: 1;
571
+ opacity: var(--slotted-tabs-hover-marker-opacity, 0.5);
495
572
  }
496
573
 
497
574
  /** Press takes the bar to the label's own ink: the two say one thing. */
@@ -503,67 +580,31 @@
503
580
  background-color: var(--slotted-tabs-active-marker-color, var(--slotted-text));
504
581
  }
505
582
 
506
- [data-ui='tabs'] > :where([data-part='list']) > [data-part='item'][data-selected]::after {
507
- opacity: 1;
508
- transform: scale(1, 1);
509
- transform-origin: var(--_marker-origin-selected) 50%;
510
- }
511
-
512
583
  /**
513
- * Forward is toward the end of the list. The tab being left collapses toward
514
- * the end and the tab being entered grows from the start, which is one bar
515
- * travelling. `transform-origin` takes no logical keyword, so the two
516
- * percentages swap under `:dir(rtl)` — the one place in this stylesheet
517
- * where a rule is mirrored by hand.
584
+ * A quarter turn: both bars stand on the list's inline-end edge and run along
585
+ * the block axis, where the inset defaults to nought because a tab has no
586
+ * block padding.
518
587
  */
519
- [data-ui='tabs'][data-activation-direction='forward'] {
520
- --_marker-origin: 100%;
521
- --_marker-origin-selected: 0%;
522
- }
523
-
524
- [data-ui='tabs'][data-activation-direction='backward'] {
525
- --_marker-origin: 0%;
526
- --_marker-origin-selected: 100%;
527
- }
528
-
529
- [data-ui='tabs'][data-activation-direction='forward']:dir(rtl) {
530
- --_marker-origin: 0%;
531
- --_marker-origin-selected: 100%;
532
- }
533
-
534
- [data-ui='tabs'][data-activation-direction='backward']:dir(rtl) {
535
- --_marker-origin: 100%;
536
- --_marker-origin-selected: 0%;
537
- }
538
-
539
- /** A quarter turn: the bar stands on the list's own edge and grows in block. */
540
588
  [data-ui='tabs'][data-orientation='vertical']
541
589
  > :where([data-part='list'])
542
- > [data-part='item']::before,
543
- [data-ui='tabs'][data-orientation='vertical']
544
- > :where([data-part='list'])
545
- > [data-part='item']::after {
546
- block-size: auto;
547
- border-start-end-radius: var(--slotted-radius-xs, 2px);
548
- border-start-start-radius: 0;
549
- border-end-end-radius: var(--slotted-radius-xs, 2px);
590
+ > [data-part='marker'] {
591
+ block-size: var(--_length);
550
592
  inline-size: var(--_marker-size);
551
- inset-block: 0;
552
- inset-inline: auto calc(-1 * var(--_track-size));
553
- }
554
-
555
- [data-ui='tabs'][data-orientation='vertical']
556
- > :where([data-part='list'])
557
- > [data-part='item']::after {
558
- transform: scale(1, 0);
559
- transform-origin: 50% var(--_marker-origin);
593
+ inset-block: 0 auto;
594
+ inset-inline: auto calc(var(--_marker-lift, 0px) + var(--_marker-offset));
595
+ translate: 0
596
+ calc(var(--_indicator-start, 0px) + var(--_start-inset) + (var(--_span) - var(--_length)) / 2);
560
597
  }
561
598
 
562
599
  [data-ui='tabs'][data-orientation='vertical']
563
600
  > :where([data-part='list'])
564
- > [data-part='item'][data-selected]::after {
565
- transform: scale(1, 1);
566
- transform-origin: 50% var(--_marker-origin-selected);
601
+ > [data-part='item']::before {
602
+ block-size: auto;
603
+ inline-size: var(--_marker-size);
604
+ inset-block: var(--_marker-inset);
605
+ inset-inline: auto calc(var(--_marker-offset) - var(--_track-reach, 0px));
606
+ min-block-size: var(--slotted-space-6, 1rem);
607
+ min-inline-size: 0;
567
608
  }
568
609
 
569
610
  /* ── Contained ────────────────────────────────────────────────────────── */
@@ -582,6 +623,9 @@
582
623
  * there the track is the edge of the panel below it.
583
624
  */
584
625
  [data-ui='tabs'][data-variant='contained'] > [data-part='list'] {
626
+ /* The marker underlines the label inside the selected surface, a step above its edge. */
627
+ --_marker-lift: calc(2 * var(--slotted-space-1, 0.125rem));
628
+
585
629
  background-color: var(--slotted-tabs-contained-background, var(--slotted-surface-sunken));
586
630
  border-radius: var(--slotted-radius-md, 6px);
587
631
  justify-self: start;
@@ -602,26 +646,6 @@
602
646
  box-shadow: var(--slotted-shadow-xs);
603
647
  }
604
648
 
605
- /**
606
- * Inset from the corners by the radius, so the bar underlines the label
607
- * instead of tracing the edge of the surface it sits on. Sitting on the
608
- * edge, it read as a second border of a different colour, and the capture
609
- * showed a pill with one blue side.
610
- */
611
- [data-ui='tabs'][data-variant='contained']
612
- > :where([data-part='list'])
613
- > [data-part='item']::after {
614
- inset-block-end: var(--slotted-space-1, 0.125rem);
615
- inset-inline: var(--slotted-radius-sm, 4px);
616
- }
617
-
618
- [data-ui='tabs'][data-variant='contained'][data-orientation='vertical']
619
- > :where([data-part='list'])
620
- > [data-part='item']::after {
621
- inset-block: var(--slotted-radius-sm, 4px);
622
- inset-inline: auto var(--slotted-space-1, 0.125rem);
623
- }
624
-
625
649
  /* ── The dismiss control ──────────────────────────────────────────────── */
626
650
 
627
651
  /**
@@ -963,8 +987,8 @@
963
987
  * adds is the track: a disabled family should not read as a live one with
964
988
  * grey labels.
965
989
  */
966
- [data-ui='tabs'][data-disabled][data-variant='line'][data-track='line'] > [data-part='list'] {
967
- border-color: var(--slotted-disabled-border, GrayText);
990
+ [data-ui='tabs'][data-disabled] {
991
+ --_track-color: var(--slotted-disabled-border, GrayText);
968
992
  }
969
993
 
970
994
  [data-ui='tabs'][data-disabled][data-variant='contained'] > [data-part='list'] {
@@ -976,21 +1000,38 @@
976
1000
  * decoration in an unthemed page should disappear rather than shout, and a
977
1001
  * marker painted `GrayText` with no theme would be the loudest thing on it.
978
1002
  */
979
- [data-ui='tabs'][data-disabled]
980
- > :where([data-part='list'])
981
- > [data-part='item'][data-selected]::after {
1003
+ [data-ui='tabs'][data-disabled] > :where([data-part='list']) > [data-part='marker'] {
982
1004
  background-color: var(--slotted-disabled-border);
983
1005
  }
984
1006
 
985
1007
  /* ── Forced colours ──────────────────────────────────────────────────── */
986
1008
 
987
1009
  /**
988
- * The theme maps every scheme token to a system colour, so the only rule
989
- * here is about paint the theme cannot reach: a selected tab in the
990
- * contained variant has a fill that flattens to `Canvas` along with the
991
- * track it stands in.
1010
+ * The theme maps every scheme token to a system colour, so the rules here
1011
+ * are about paint the theme cannot reach: the track drawn as a shadow, the
1012
+ * marker's ground, and a selected tab in the contained variant, whose fill
1013
+ * flattens to `Canvas` along with the track it stands in.
992
1014
  */
993
1015
  @media (forced-colors: active) {
1016
+ /* A shadow is not drawn under forced colours: the track is a border again. */
1017
+ [data-ui='tabs'][data-variant='line'][data-track='line'] > [data-part='list'] {
1018
+ border-block-end: var(--_track-size) solid CanvasText;
1019
+ padding-block-end: 0;
1020
+ }
1021
+
1022
+ [data-ui='tabs'][data-orientation='vertical'][data-variant='line'][data-track='line']
1023
+ > [data-part='list'] {
1024
+ border-block-end: 0;
1025
+ border-inline-end: var(--_track-size) solid CanvasText;
1026
+ padding-inline-end: 0;
1027
+ }
1028
+
1029
+ /* The marker's ground would flatten to Canvas with every other ground. */
1030
+ [data-ui='tabs'] > :where([data-part='list']) > [data-part='marker'] {
1031
+ background-color: Highlight;
1032
+ forced-color-adjust: none;
1033
+ }
1034
+
994
1035
  [data-ui='tabs'][data-variant='contained']
995
1036
  > :where([data-part='list'])
996
1037
  > [data-part='item'][data-selected] {
@@ -31,6 +31,7 @@
31
31
  "--slotted-disabled-background",
32
32
  "--slotted-disabled-border",
33
33
  "--slotted-disabled-foreground",
34
+ "--slotted-duration-medium",
34
35
  "--slotted-duration-short",
35
36
  "--slotted-easing-enter",
36
37
  "--slotted-focus-ring-color",
@@ -39,7 +40,6 @@
39
40
  "--slotted-radius-full",
40
41
  "--slotted-radius-md",
41
42
  "--slotted-radius-sm",
42
- "--slotted-radius-xs",
43
43
  "--slotted-shadow-xs",
44
44
  "--slotted-space-1",
45
45
  "--slotted-space-2",
@@ -63,8 +63,14 @@
63
63
  "--slotted-tabs-hover-background",
64
64
  "--slotted-tabs-hover-color",
65
65
  "--slotted-tabs-hover-marker-color",
66
+ "--slotted-tabs-hover-marker-opacity",
66
67
  "--slotted-tabs-list-gap",
67
68
  "--slotted-tabs-marker-color",
69
+ "--slotted-tabs-marker-easing",
70
+ "--slotted-tabs-marker-inset",
71
+ "--slotted-tabs-marker-offset",
72
+ "--slotted-tabs-marker-radius",
73
+ "--slotted-tabs-marker-size",
68
74
  "--slotted-tabs-scroll-color",
69
75
  "--slotted-tabs-selected-color",
70
76
  "--slotted-tabs-track-color",