@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.
- package/package.json +1 -1
- package/src/chart/chart.css +8 -2
- package/src/page-header/page-header.css +37 -0
- package/src/page-header/page-header.tokens.json +1 -0
- package/src/scroll-area/scroll-area.css +11 -1
- package/src/segmented-control/segmented-control.css +133 -54
- package/src/segmented-control/segmented-control.tokens.json +7 -11
- package/src/stat-card/stat-card.css +317 -227
- package/src/table/table.css +8 -2
- package/src/tabs/tabs.css +192 -151
- package/src/tabs/tabs.tokens.json +7 -1
package/src/table/table.css
CHANGED
|
@@ -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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
158
|
-
|
|
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
|
|
173
|
-
*
|
|
174
|
-
*
|
|
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
|
-
|
|
215
|
-
|
|
216
|
-
|
|
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
|
|
255
|
-
*
|
|
256
|
-
*
|
|
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
|
-
*
|
|
442
|
-
*
|
|
443
|
-
*
|
|
444
|
-
*
|
|
445
|
-
*
|
|
446
|
-
*
|
|
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
|
-
*
|
|
450
|
-
*
|
|
451
|
-
*
|
|
452
|
-
*
|
|
453
|
-
*
|
|
454
|
-
*
|
|
455
|
-
*
|
|
456
|
-
*/
|
|
457
|
-
[data-ui='tabs'] > :where([data-part='list']) > [data-part='
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
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
|
-
|
|
463
|
-
|
|
464
|
-
inset-
|
|
465
|
-
|
|
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']
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
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:
|
|
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
|
-
*
|
|
514
|
-
* the
|
|
515
|
-
*
|
|
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='
|
|
543
|
-
|
|
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(-
|
|
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']
|
|
565
|
-
|
|
566
|
-
|
|
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]
|
|
967
|
-
|
|
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
|
|
989
|
-
*
|
|
990
|
-
*
|
|
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",
|