@apliteni/apliteni-ui 0.93.0 → 0.95.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.
- package/guidelines/accessibility-floor.md +3 -3
- package/guidelines/colour-and-theming.md +2 -0
- package/guidelines/state-set.md +3 -3
- package/package.json +1 -1
- package/react/dist/index.css +19 -12
- package/src/styles/back.css +2 -2
- package/src/styles/badge.css +11 -11
- package/src/styles/base.css +6 -6
- package/src/styles/button.css +16 -13
- package/src/styles/callout.css +11 -11
- package/src/styles/card.css +5 -5
- package/src/styles/code.css +15 -26
- package/src/styles/command-palette.css +13 -10
- package/src/styles/confirm.css +5 -5
- package/src/styles/drawer.css +6 -7
- package/src/styles/dropdown.css +29 -19
- package/src/styles/feedback.css +11 -11
- package/src/styles/file-drop.css +2 -2
- package/src/styles/filter-bar.css +10 -8
- package/src/styles/footer.css +12 -7
- package/src/styles/input.css +20 -12
- package/src/styles/layout.css +38 -41
- package/src/styles/loading.css +1 -1
- package/src/styles/motion.css +1 -1
- package/src/styles/nav.css +51 -62
- package/src/styles/pagination.css +6 -1
- package/src/styles/segmented.css +26 -18
- package/src/styles/success.css +4 -4
- package/src/styles/table.css +10 -10
- package/src/styles/tabs.css +2 -2
- package/src/styles/tooltip.css +1 -1
- package/src/styles/topbar.css +29 -21
- package/src/tokens/tokens.css +23 -31
package/src/styles/layout.css
CHANGED
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
display: grid;
|
|
14
14
|
grid-template-columns: max-content 1fr;
|
|
15
15
|
min-height: calc(100vh - var(--ui-app-top, 0px));
|
|
16
|
-
background: var(--bg); /*
|
|
16
|
+
background: var(--bg); /* code-bg: inherit — page background inherits root overrides. */
|
|
17
17
|
color: var(--text);
|
|
18
18
|
font-family: var(--font-sans);
|
|
19
19
|
/* The rail's width, and the one property the fold moves: the nav's own column
|
|
@@ -42,7 +42,7 @@
|
|
|
42
42
|
padding: var(--space-5) var(--space-4);
|
|
43
43
|
border-right: var(--ui-rail-rule) solid var(--rail-edge);
|
|
44
44
|
box-shadow: var(--elev-rail);
|
|
45
|
-
background: var(--surface);
|
|
45
|
+
background: var(--surface);
|
|
46
46
|
position: sticky;
|
|
47
47
|
top: var(--ui-app-top, 0px);
|
|
48
48
|
height: calc(100vh - var(--ui-app-top, 0px));
|
|
@@ -62,11 +62,13 @@
|
|
|
62
62
|
.ui-app__rail > .ui-app__head,
|
|
63
63
|
.ui-app__rail > .ui-app__user,
|
|
64
64
|
.ui-app__rail > .ui-app__foot { width: var(--ui-nav-col); flex: none; }
|
|
65
|
-
/*
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
65
|
+
/* The rail is itself --surface, so nav.css's plate has no step here: 1.000:1, with a
|
|
66
|
+
hairline as the whole resting mark. Both marks go a rung further — the current row
|
|
67
|
+
to the --surface-3 the folded rail already paints, a hovered row to half of it, so
|
|
68
|
+
the pointer stays quieter than the reader's own row in both themes (#475 r34). The
|
|
69
|
+
danger and current rows are named out: this rule outranks nav.css's states. */
|
|
70
|
+
.ui-app__rail .ui-nav__item:not(.is-danger):not(.is-active):hover { background: color-mix(in srgb, var(--surface-3) 50%, transparent); /* code-bg: inherit — The wash keeps the containing ground. */ }
|
|
71
|
+
.ui-app__rail .ui-nav__item.is-active { background: var(--surface-3); /* code-bg: inherit — The control keeps the containing ground. */ }
|
|
70
72
|
.ui-app__brand {
|
|
71
73
|
display: flex;
|
|
72
74
|
align-items: center;
|
|
@@ -86,7 +88,7 @@
|
|
|
86
88
|
/* Carries the shell's class as well as its own, for the same reason the rail
|
|
87
89
|
rows do (see nav.css): a host stylesheet's `a:link` is (0,1,1). */
|
|
88
90
|
.ui-app .ui-app__brand { color: var(--strong); }
|
|
89
|
-
.ui-app__brand:focus-visible { outline:
|
|
91
|
+
.ui-app__brand:focus-visible { outline: var(--ring); outline-offset: var(--ring-offset); border-radius: var(--radius-xs); }
|
|
90
92
|
.ui-app__brand svg { display: block; flex: none; }
|
|
91
93
|
|
|
92
94
|
/* The head band: the product's mark, and the rail's own control at the far end of
|
|
@@ -107,18 +109,18 @@
|
|
|
107
109
|
anywhere — so the rail's foot is the account block alone. */
|
|
108
110
|
.ui-app__rail .ui-nav--side { flex: 1 1 auto; }
|
|
109
111
|
|
|
110
|
-
/* Which row is current is structural here, not chromatic: the resting glyphs
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
The current glyph's own ink is nav.css's rule
|
|
115
|
-
EVERY rail reads it that way, so the rail's copy
|
|
116
|
-
second file. What is left here is the rail's own
|
|
112
|
+
/* Which row is current is structural here, not chromatic: the resting glyphs step
|
|
113
|
+
down so the current one is the brightest whatever --accent is doing, and the
|
|
114
|
+
plate nav.css draws around it carries no hue at all. #475 took the accent bar
|
|
115
|
+
that used to stand beside the glyph off every rail, so the line that grew it to
|
|
116
|
+
the taller tile here went with it. The current glyph's own ink is nav.css's rule
|
|
117
|
+
too, not a copy here: since #429 EVERY rail reads it that way, so the rail's copy
|
|
118
|
+
was the same sentence in a second file. What is left here is the rail's own
|
|
119
|
+
resting step. */
|
|
117
120
|
/* Re-tuned at #295, which took the light rail down a step with the page. Below 720px
|
|
118
121
|
the glyph is the whole row, so it is held at text grade rather than at 1.4.11's bar —
|
|
119
|
-
stories/apps/shell-states.test.js:
|
|
122
|
+
stories/apps/shell-states.test.js:1597 `a resting glyph is dimmer but still legible`. */
|
|
120
123
|
.ui-app__rail .ui-nav__ic svg { opacity: 0.66; }
|
|
121
|
-
.ui-app__rail .ui-nav__item.is-active::before { width: 3px; height: 62%; }
|
|
122
124
|
|
|
123
125
|
/* A destructive row of the rail is a navigation row and rests like one; the danger
|
|
124
126
|
intent is the step nav.css writes for it. Both of nav.css's danger states are
|
|
@@ -158,7 +160,7 @@
|
|
|
158
160
|
width: var(--ui-app-av); height: var(--ui-app-av); flex: none;
|
|
159
161
|
margin-inline-start: calc((var(--ui-nav-strip) - var(--ui-app-av)) / 2);
|
|
160
162
|
border-radius: var(--radius-pill);
|
|
161
|
-
background: var(--surface); /*
|
|
163
|
+
background: var(--surface); /* code-bg: inherit — decorative or text-only paint; nothing nested reads a ground from it. */
|
|
162
164
|
color: var(--strong);
|
|
163
165
|
display: grid; place-items: center;
|
|
164
166
|
font-size: calc(var(--text-xs) + 1px);
|
|
@@ -192,7 +194,7 @@
|
|
|
192
194
|
font-weight: inherit;
|
|
193
195
|
letter-spacing: normal;
|
|
194
196
|
}
|
|
195
|
-
.ui-app .ui-app__user-trigger:hover { background: var(--surface); /*
|
|
197
|
+
.ui-app .ui-app__user-trigger:hover { background: var(--surface); /* code-bg: inherit — control paint; the containing surface is the ground, for a chip and for a band alike. */ }
|
|
196
198
|
.ui-app__user-trigger .ui-app__who { flex: 1 1 auto; text-align: left; }
|
|
197
199
|
/* The panel is portalled onto <body>, so nothing here may hang off .ui-app: by the
|
|
198
200
|
time it is open it is no longer inside the rail that drew it.
|
|
@@ -277,16 +279,12 @@
|
|
|
277
279
|
:where(.ui-app:not(.ui-app--topbar).is-collapsed) .ui-app__brand { opacity: 0; visibility: hidden; pointer-events: none; }
|
|
278
280
|
:where(.ui-app.is-collapsed) .ui-app__rail .ui-nav__sub { margin-inline-start: 0; padding-inline-start: 0; border-inline-start-width: 0; }
|
|
279
281
|
:where(.ui-app.is-collapsed) .ui-app__rail .ui-nav__item:not(:has(.ui-nav__ic))::after { opacity: 0.62; }
|
|
280
|
-
/* The current row
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
drawn on a row that keeps the open column, so its right edge is off the strip;
|
|
284
|
-
and --ui-nav-strip is twice the glyph's centre, so a box that wide at the row's
|
|
285
|
-
edge is centred on the glyph. why: docs/components.md#the-page-shell */
|
|
282
|
+
/* The current row's plate on the glyph column, and beside it the one thing a bare rail
|
|
283
|
+
does not do: an ordinary row drops its wash here, answered by the floating name below.
|
|
284
|
+
nav.css's folded rules, a rung further. why: docs/components.md#the-page-shell */
|
|
286
285
|
:where(.ui-app.is-collapsed) .ui-app__rail .ui-nav__item.is-active { isolation: isolate; background: none; }
|
|
287
|
-
:where(.ui-app.is-collapsed) .ui-app__rail .ui-nav__item.is-active:
|
|
288
|
-
:where(.ui-app.is-collapsed) .ui-app__rail .ui-nav__item.is-
|
|
289
|
-
:where(.ui-app.is-collapsed) .ui-app__rail .ui-nav__item:hover:not(:focus-visible) { outline: none; }
|
|
286
|
+
:where(.ui-app.is-collapsed) .ui-app__rail .ui-nav__item.is-active::before { content: ""; position: absolute; left: 0; top: 50%; width: var(--ui-nav-strip); height: 100%; border-radius: 10px; transform: translateY(-50%); /* motion: still — a mark on the current row, whose own highlight already transitions; this centres it, it does not travel */ background: var(--surface-3); /* code-bg: inherit — The plate contains no focus target. */ z-index: -1; }
|
|
287
|
+
:where(.ui-app.is-collapsed) .ui-app__rail .ui-nav__item:not(.is-danger):not(.is-active):hover { background: none; }
|
|
290
288
|
/* The label IS the chip. `fixed` is the fallback placement, out of the rail's own
|
|
291
289
|
clip; the @supports branch below pins it to the row and is the only one that
|
|
292
290
|
survives a scroll. The toggle's selector is unscoped, because it is wordless at
|
|
@@ -299,7 +297,7 @@
|
|
|
299
297
|
why: docs/foundations.md#elevation */
|
|
300
298
|
:where(.ui-app.is-collapsed) .ui-app__rail .ui-nav__item:is(:hover, :focus-visible) > .ui-nav__label,
|
|
301
299
|
:where(.ui-app.is-collapsed) .ui-app__rail .ui-app__user-trigger:is(:hover, :focus-visible) > .ui-app__who,
|
|
302
|
-
.ui-app__rail .ui-app__fold:is(:hover, :focus-visible) > .ui-nav__label { position: fixed; left: calc(var(--ui-rail-w) + var(--space-2)); z-index: var(--z-dropdown); width: max-content; max-width: 15rem; margin-block: -7px; padding: 6px 10px; border: 1px solid var(--float-edge); box-shadow: inset 0 0 0 1px var(--elev-edge, var(--float-edge-inner)), var(--elev-drop); border-radius: var(--radius-xs); background: var(--surface); /*
|
|
300
|
+
.ui-app__rail .ui-app__fold:is(:hover, :focus-visible) > .ui-nav__label { position: fixed; left: calc(var(--ui-rail-w) + var(--space-2)); z-index: var(--z-dropdown); width: max-content; max-width: 15rem; margin-block: -7px; padding: 6px 10px; border: 1px solid var(--float-edge); box-shadow: inset 0 0 0 1px var(--elev-edge, var(--float-edge-inner)), var(--elev-drop); border-radius: var(--radius-xs); background: var(--surface); /* code-bg: inherit — decorative or text-only paint; nothing nested reads a ground from it. */ color: var(--strong); opacity: 1; pointer-events: none; }
|
|
303
301
|
@supports (anchor-name: --a) and (anchor-scope: --a) {
|
|
304
302
|
.ui-app.is-collapsed,
|
|
305
303
|
.ui-app:has(.ui-app__fold) { anchor-scope: --ui-rail; }
|
|
@@ -348,7 +346,7 @@
|
|
|
348
346
|
height: var(--ui-app-band);
|
|
349
347
|
flex: none;
|
|
350
348
|
padding-inline: clamp(24px, 4vw, 56px);
|
|
351
|
-
background: var(--bg); /*
|
|
349
|
+
background: var(--bg); /* code-bg: inherit — page background inherits root overrides. */
|
|
352
350
|
border-bottom: 1px solid var(--border);
|
|
353
351
|
/* Sticky for the reason the rail beside it is: chrome that scrolls away is chrome
|
|
354
352
|
you scroll back up for. */
|
|
@@ -384,7 +382,7 @@
|
|
|
384
382
|
color: var(--text);
|
|
385
383
|
/* The band search uses the same reading surface as other text controls.
|
|
386
384
|
why: docs/foundations.md#elevation */
|
|
387
|
-
background: var(--surface); /*
|
|
385
|
+
background: var(--surface); /* code-bg: inherit — control paint; the containing surface is the ground, for a chip and for a band alike. */
|
|
388
386
|
border: 1px solid var(--border);
|
|
389
387
|
border-radius: var(--radius-md);
|
|
390
388
|
cursor: pointer;
|
|
@@ -395,10 +393,10 @@
|
|
|
395
393
|
without `.ui-btn`, so base.css's shared rule never reached it and focus fell
|
|
396
394
|
through to the browser's own square outline, drawn around a 12px radius.
|
|
397
395
|
why: docs/foundations.md#the-focus-ring */
|
|
398
|
-
.ui-app__search:focus-visible { outline:
|
|
396
|
+
.ui-app__search:focus-visible { outline: var(--ring); outline-offset: var(--ring-offset); }
|
|
399
397
|
/* The same glyph the palette draws in its own search box, at the same box and the
|
|
400
398
|
same stroke: the trigger and the thing it opens are not two search marks.
|
|
401
|
-
src/styles/command-palette.css:
|
|
399
|
+
src/styles/command-palette.css:108 `.ui-cmdk__search-ic svg` */
|
|
402
400
|
.ui-app__search-ic { display: flex; flex: none; }
|
|
403
401
|
.ui-app__search-ic svg { width: 17px; height: 17px; stroke: currentColor; fill: none; stroke-width: 2.2; }
|
|
404
402
|
/* Part of the button's name, so it is squeezed rather than dropped: an ellipsis
|
|
@@ -490,9 +488,8 @@
|
|
|
490
488
|
.ui-app__rail .ui-nav__sub { margin-inline-start: 0; padding-inline-start: 0; border-inline-start-width: 0; }
|
|
491
489
|
.ui-app__rail .ui-nav__item:not(:has(.ui-nav__ic))::after { opacity: 0.62; }
|
|
492
490
|
.ui-app__rail .ui-nav__item.is-active { isolation: isolate; background: none; }
|
|
493
|
-
.ui-app__rail .ui-nav__item.is-active:
|
|
494
|
-
.ui-app__rail .ui-nav__item.is-
|
|
495
|
-
.ui-app__rail .ui-nav__item:hover:not(:focus-visible) { outline: none; }
|
|
491
|
+
.ui-app__rail .ui-nav__item.is-active::before { content: ""; position: absolute; left: 0; top: 50%; width: var(--ui-nav-strip); height: 100%; border-radius: 10px; transform: translateY(-50%); /* motion: still — a mark on the current row, whose own highlight already transitions; this centres it, it does not travel */ background: var(--surface-3); /* code-bg: inherit — The plate contains no focus target. */ z-index: -1; }
|
|
492
|
+
.ui-app__rail .ui-nav__item:not(.is-danger):not(.is-active):hover { background: none; }
|
|
496
493
|
/* The one line of this block that is deliberately NOT the reader's fold: a finger
|
|
497
494
|
is the only pointer this width has, so a row and the account block are held to
|
|
498
495
|
44px. Neither floor can spread to the press, where growing the box is the one
|
|
@@ -500,7 +497,7 @@
|
|
|
500
497
|
.ui-app__rail .ui-nav__item,
|
|
501
498
|
.ui-app__rail .ui-app__user-trigger { min-height: 44px; }
|
|
502
499
|
.ui-app__rail .ui-nav__item:is(:hover, :focus-visible) > .ui-nav__label,
|
|
503
|
-
.ui-app__rail .ui-app__user-trigger:is(:hover, :focus-visible) > .ui-app__who { position: fixed; left: calc(var(--ui-rail-w) + var(--space-2)); z-index: var(--z-dropdown); width: max-content; max-width: 15rem; margin-block: -7px; padding: 6px 10px; border: 1px solid var(--float-edge); box-shadow: inset 0 0 0 1px var(--elev-edge, var(--float-edge-inner)), var(--elev-drop); border-radius: var(--radius-xs); background: var(--surface); /*
|
|
500
|
+
.ui-app__rail .ui-app__user-trigger:is(:hover, :focus-visible) > .ui-app__who { position: fixed; left: calc(var(--ui-rail-w) + var(--space-2)); z-index: var(--z-dropdown); width: max-content; max-width: 15rem; margin-block: -7px; padding: 6px 10px; border: 1px solid var(--float-edge); box-shadow: inset 0 0 0 1px var(--elev-edge, var(--float-edge-inner)), var(--elev-drop); border-radius: var(--radius-xs); background: var(--surface); /* code-bg: inherit — decorative or text-only paint; nothing nested reads a ground from it. */ color: var(--strong); opacity: 1; pointer-events: none; }
|
|
504
501
|
@supports (anchor-name: --a) and (anchor-scope: --a) {
|
|
505
502
|
.ui-app { anchor-scope: --ui-rail; }
|
|
506
503
|
.ui-app__rail { anchor-name: --ui-rail; }
|
|
@@ -535,7 +532,7 @@
|
|
|
535
532
|
/* Floats over a spotlit page, so it takes the floating step and the floating
|
|
536
533
|
treatment: the two-step edge in dark, the drop alone in light.
|
|
537
534
|
why: docs/foundations.md#elevation */
|
|
538
|
-
background: var(--bg-elevated);
|
|
535
|
+
background: var(--bg-elevated);
|
|
539
536
|
border: 1px solid var(--float-edge);
|
|
540
537
|
box-shadow: inset 0 0 0 1px var(--elev-edge, var(--float-edge-inner)), var(--elev-drop);
|
|
541
538
|
border-radius: 22px;
|
|
@@ -558,7 +555,7 @@
|
|
|
558
555
|
width: 38px; height: 38px; flex: none;
|
|
559
556
|
border-radius: 11px;
|
|
560
557
|
display: grid; place-items: center;
|
|
561
|
-
background: var(--glow-purple); /*
|
|
558
|
+
background: var(--glow-purple); /* code-bg: inherit — a wash paints over a ground and behind a chip, so the opaque ground below it is the step. */
|
|
562
559
|
color: var(--accent);
|
|
563
560
|
}
|
|
564
561
|
.ui-scope__icon svg { width: 21px; height: 21px; stroke: currentColor; fill: none; stroke-width: 1.8; }
|
|
@@ -579,7 +576,7 @@
|
|
|
579
576
|
font-size: calc(var(--text-xs) + 1px);
|
|
580
577
|
letter-spacing: 0.06em;
|
|
581
578
|
color: var(--purple-mid);
|
|
582
|
-
background: var(--glow-purple); /*
|
|
579
|
+
background: var(--glow-purple); /* code-bg: inherit — a wash paints over a ground and behind a chip, so the opaque ground below it is the step. */
|
|
583
580
|
border-radius: 999px;
|
|
584
581
|
padding: 6px 14px;
|
|
585
582
|
margin-bottom: 26px;
|
|
@@ -624,7 +621,7 @@
|
|
|
624
621
|
width: 46px; height: 46px;
|
|
625
622
|
border-radius: 13px;
|
|
626
623
|
display: grid; place-items: center;
|
|
627
|
-
background: var(--glow-purple); /*
|
|
624
|
+
background: var(--glow-purple); /* code-bg: inherit — a wash paints over a ground and behind a chip, so the opaque ground below it is the step. */
|
|
628
625
|
color: var(--accent);
|
|
629
626
|
margin-bottom: 16px;
|
|
630
627
|
}
|
package/src/styles/loading.css
CHANGED
|
@@ -99,7 +99,7 @@
|
|
|
99
99
|
display: grid;
|
|
100
100
|
place-items: center;
|
|
101
101
|
/* muted-ink: glyph — permission seal */ color: var(--dim);
|
|
102
|
-
background: color-mix(in srgb, var(--text) 7%, transparent); /*
|
|
102
|
+
background: color-mix(in srgb, var(--text) 7%, transparent); /* code-bg: inherit — decorative paint has no nested focus target. */
|
|
103
103
|
}
|
|
104
104
|
.ui-denied__seal svg {
|
|
105
105
|
width: 20px;
|
package/src/styles/motion.css
CHANGED
|
@@ -81,7 +81,7 @@
|
|
|
81
81
|
.m-skeleton {
|
|
82
82
|
position: relative;
|
|
83
83
|
overflow: hidden;
|
|
84
|
-
background: color-mix(in srgb, var(--text) 8%, transparent); /*
|
|
84
|
+
background: color-mix(in srgb, var(--text) 8%, transparent); /* code-bg: inherit — loading placeholder has no nested focus target. */
|
|
85
85
|
border-radius: var(--radius-sm, 8px);
|
|
86
86
|
}
|
|
87
87
|
.m-skeleton::after {
|
package/src/styles/nav.css
CHANGED
|
@@ -75,34 +75,27 @@
|
|
|
75
75
|
transition: background var(--dur-fast) var(--ease), color var(--dur-fast) var(--ease);
|
|
76
76
|
}
|
|
77
77
|
.ui-nav .ui-nav__item { color: var(--text); } /* (0,2,0): a host sheet's a:link is (0,1,1) — why: docs/components.md#the-page-shell */
|
|
78
|
-
.ui-nav__item:hover {
|
|
78
|
+
.ui-nav__item:hover { background: color-mix(in srgb, var(--surface) 50%, transparent); /* code-bg: inherit — The wash keeps the containing ground. */ color: var(--strong); }
|
|
79
79
|
.ui-nav__item.is-active {
|
|
80
|
-
background: var(--surface); /*
|
|
80
|
+
background: var(--surface); /* code-bg: inherit — control paint; the containing surface is the ground, for a chip and for a band alike. */
|
|
81
81
|
color: var(--strong);
|
|
82
82
|
font-weight: 500;
|
|
83
83
|
}
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
left: 4px; top: 50%;
|
|
92
|
-
width: 3px; height: 17px;
|
|
93
|
-
border-radius: 3px;
|
|
94
|
-
background: var(--accent);
|
|
95
|
-
transform: translateY(-50%); /* motion: still — a mark on the current row, whose own highlight already transitions; this centres it, it does not travel */
|
|
96
|
-
}
|
|
97
|
-
.ui-nav__item:focus-visible { outline: 2px solid transparent; box-shadow: var(--ring); }
|
|
98
|
-
.ui-nav__item.is-active:focus-visible { outline: 2px solid transparent; box-shadow: var(--ring); }
|
|
84
|
+
/* The current row's one mark is a plate, and nothing closes it: on a rail row an
|
|
85
|
+
outline means focus and only focus. The plate is the quiet fill a rung off the
|
|
86
|
+
ground the rail stands on, so layout.css takes it the next rung where the rail
|
|
87
|
+
is itself --surface. #475 r33/r34. why: docs/components.md#the-page-shell */
|
|
88
|
+
|
|
89
|
+
.ui-nav__item:focus-visible { outline: var(--ring); outline-offset: var(--ring-offset); }
|
|
90
|
+
.ui-nav__item.is-active:focus-visible { outline: var(--ring); outline-offset: var(--ring-offset); }
|
|
99
91
|
|
|
100
92
|
.ui-nav__ic { display: inline-flex; flex: none; }
|
|
101
93
|
.ui-nav__ic svg { width: 17px; height: 17px; stroke: currentColor; fill: none; stroke-width: 2.2; opacity: 0.72; }
|
|
102
|
-
/* The glyph brightens with its row and takes the row's ink, not the accent.
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
94
|
+
/* The glyph brightens with its row and takes the row's ink, not the accent. A
|
|
95
|
+
rail row carries no accent at all since #475: the plate above is what means
|
|
96
|
+
"here", and the glyph's own step to full ink is the other half of that pair.
|
|
97
|
+
A glyph in --accent beside it was the same sentence said twice, and beside an
|
|
98
|
+
accent counter it was said three times. See #429 and #475. */
|
|
106
99
|
.ui-nav__item.is-active .ui-nav__ic svg,
|
|
107
100
|
.ui-nav__item.is-current .ui-nav__ic svg { opacity: 1; stroke: currentColor; } /* motion: still — the glyph brightens with its row, whose own highlight already transitions */
|
|
108
101
|
.ui-nav__label {
|
|
@@ -119,20 +112,14 @@
|
|
|
119
112
|
/* Destructive row (sign out, revoke). Body ink at rest, --pink once a pointer or
|
|
120
113
|
the keyboard reaches it — as .ui-btn--danger and .ui-dropdown__item do. */
|
|
121
114
|
.ui-nav__item.is-danger { color: var(--text); }
|
|
122
|
-
.ui-nav__item.is-danger:hover { background: var(--glow-pink); /*
|
|
115
|
+
.ui-nav__item.is-danger:hover { background: var(--glow-pink); /* code-bg: inherit — a wash paints over a ground and behind a chip, so the opaque ground below it is the step. */ color: var(--pink); }
|
|
123
116
|
/* Tabbing onto it is the same "about to click this" the pointer means. The ring
|
|
124
117
|
says where you are; only this says what the row does. */
|
|
125
|
-
.ui-nav__item.is-danger:focus-visible { background: var(--glow-pink); /*
|
|
118
|
+
.ui-nav__item.is-danger:focus-visible { background: var(--glow-pink); /* code-bg: inherit — a wash paints over a ground and behind a chip, so the opaque ground below it is the step. */ color: var(--pink); }
|
|
126
119
|
/* An unavailable row uses disabled ink directly; opacity would also fade its
|
|
127
120
|
background and pull its label toward the rail behind it (#220). */
|
|
128
121
|
.ui-nav__item.is-disabled { /* muted-ink: state — unavailable control */ color: var(--disabled-ink); cursor: default; pointer-events: none; }
|
|
129
122
|
|
|
130
|
-
/* Hover adds an edge without changing the current row's reading surface.
|
|
131
|
-
The danger row keeps its own state treatment. */
|
|
132
|
-
.ui-nav__item.is-active:not(.is-danger):hover {
|
|
133
|
-
background: var(--surface); outline: 1px solid var(--control-edge); outline-offset: -1px; /* ring-gap: inherit — control paint; its focus indicator uses the containing surface. */
|
|
134
|
-
}
|
|
135
|
-
|
|
136
123
|
/* Per-item badge / counter */
|
|
137
124
|
.ui-nav__badge {
|
|
138
125
|
flex: none;
|
|
@@ -147,25 +134,25 @@
|
|
|
147
134
|
font-size: var(--text-xs);
|
|
148
135
|
font-weight: 600;
|
|
149
136
|
line-height: 1;
|
|
150
|
-
background: var(--surface); /*
|
|
137
|
+
background: var(--surface); /* code-bg: inherit — decorative or text-only paint; nothing nested reads a ground from it. */
|
|
151
138
|
color: var(--text);
|
|
152
139
|
/* The count fades with the words. It is never lost: sidebarNav() spells it
|
|
153
140
|
into the row's aria-label, so "Pending 3" is what a reader hears at either
|
|
154
141
|
width. */
|
|
155
142
|
transition: opacity var(--dur-fast) var(--ease);
|
|
156
143
|
}
|
|
157
|
-
.ui-nav__badge.is-accent { background: var(--glow-purple); /*
|
|
158
|
-
.ui-nav__badge.is-live { background: var(--chip-success-fill); /*
|
|
159
|
-
.ui-nav__badge.is-danger { background: var(--glow-pink); /*
|
|
160
|
-
.ui-nav__item.is-active .ui-nav__badge.is-neutral { background: var(--surface); /*
|
|
144
|
+
.ui-nav__badge.is-accent { background: var(--glow-purple); /* code-bg: inherit — a wash paints over a ground and behind a chip, so the opaque ground below it is the step. */ color: var(--accent); }
|
|
145
|
+
.ui-nav__badge.is-live { background: var(--chip-success-fill); /* code-bg: inherit — decorative or text-only paint; nothing nested reads a ground from it. */ color: var(--chip-success-ink); }
|
|
146
|
+
.ui-nav__badge.is-danger { background: var(--glow-pink); /* code-bg: inherit — a wash paints over a ground and behind a chip, so the opaque ground below it is the step. */ color: var(--pink); }
|
|
147
|
+
.ui-nav__item.is-active .ui-nav__badge.is-neutral { background: var(--surface); /* code-bg: inherit — decorative or text-only paint; nothing nested reads a ground from it. */ color: var(--strong); }
|
|
161
148
|
/* Same shape, one row up: on the current row the accent counter drops both the
|
|
162
149
|
wash and the accent and reads as the neutral one beside it. The row already
|
|
163
|
-
carries the one
|
|
164
|
-
|
|
150
|
+
carries the one mark it is allowed — the plate — and the count is a number,
|
|
151
|
+
not a second answer to "where am I". It also retires the pair #157
|
|
165
152
|
recorded: accent ink on --surface fell under WCAG AA in four of the eight
|
|
166
153
|
theme x accent cells (4.08 in dark Nebula), and no alpha cleared it. Nothing
|
|
167
154
|
now paints that pair. See #429 and docs/foundations.md#colour-and-contrast. */
|
|
168
|
-
.ui-nav__item.is-active .ui-nav__badge.is-accent { background: var(--surface); /*
|
|
155
|
+
.ui-nav__item.is-active .ui-nav__badge.is-accent { background: var(--surface); /* code-bg: inherit — decorative or text-only paint; nothing nested reads a ground from it. */ color: var(--strong); }
|
|
169
156
|
|
|
170
157
|
/* Collapsible group */
|
|
171
158
|
.ui-nav__group { display: flex; flex-direction: column; }
|
|
@@ -195,12 +182,10 @@
|
|
|
195
182
|
animation: m-slide-down var(--dur-fast) var(--ease-out) both;
|
|
196
183
|
}
|
|
197
184
|
.ui-nav__item--sub { font-size: calc(var(--text-base) - 0.5px); padding: 7px 12px; }
|
|
198
|
-
/*
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
/* Hangs back onto the guide hairline the indent above draws. */
|
|
203
|
-
.ui-nav--side .ui-nav__item--sub.is-active::before { left: calc(-1 * var(--space-3)); height: 15px; }
|
|
185
|
+
/* A nested current row takes the plate whole, like a top-level one. It used to
|
|
186
|
+
take neither half — the bar hung back onto the guide hairline and the plate's
|
|
187
|
+
own hairline was switched off so the two would not stack — and a fill with no
|
|
188
|
+
edge is not a mark the kit accepts. See #475. */
|
|
204
189
|
|
|
205
190
|
/* Footer slot (divider + trailing links, e.g. sign-out) */
|
|
206
191
|
.ui-nav__foot { margin-top: 12px; padding-top: 10px; border-top: 1px solid var(--border); }
|
|
@@ -272,27 +257,31 @@
|
|
|
272
257
|
/* The current row on a folded rail: one plate on the glyph column, and nothing else.
|
|
273
258
|
The open rail's 3px marker would stand in the rail's edge at this width, and a
|
|
274
259
|
nested row would put it outside the rail; the hairline would be the same mark said
|
|
275
|
-
twice. The plate is the strip, so it is centred on the glyph, and
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
260
|
+
twice. The plate is the strip, so it is centred on the glyph, and its fill is the
|
|
261
|
+
rung the open row takes — one off the ground the rail stands on, which layout.css
|
|
262
|
+
takes one further in the shell — so a rail marks the same row with the same
|
|
263
|
+
material at both widths. The glyph's own step from 0.66 to full ink is the second
|
|
264
|
+
half of that pair. `isolation` is what puts the plate behind the glyph: a
|
|
265
|
+
positioned ::before paints over its row's content, and a negative z-index with no
|
|
266
|
+
stacking context of its own would drop it behind the rail.
|
|
267
|
+
why: #429 and #475 */
|
|
281
268
|
.ui-nav--side.is-collapsed .ui-nav__item.is-active { isolation: isolate; background: none; }
|
|
282
|
-
/* At rest only — box-shadow carries the hairline AND the focus ring (WCAG 2.4.7). */
|
|
283
|
-
.ui-nav--side.is-collapsed .ui-nav__item.is-active:not(:focus-visible) { box-shadow: none; }
|
|
284
269
|
.ui-nav--side.is-collapsed .ui-nav__item.is-active::before {
|
|
285
|
-
|
|
270
|
+
content: "";
|
|
271
|
+
position: absolute;
|
|
272
|
+
left: 0; top: 50%;
|
|
286
273
|
width: var(--ui-nav-strip);
|
|
287
274
|
height: 100%;
|
|
288
275
|
border-radius: 10px;
|
|
289
|
-
|
|
276
|
+
transform: translateY(-50%); /* motion: still — a mark on the current row, whose own highlight already transitions; this centres it, it does not travel */
|
|
277
|
+
background: var(--surface); /* code-bg: inherit — The plate contains no focus target. */
|
|
290
278
|
z-index: -1;
|
|
291
279
|
}
|
|
292
|
-
/*
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
.
|
|
280
|
+
/* Nothing switches the hover wash off here: since #588 a folded row is only as wide
|
|
281
|
+
as the rail draws, so the wash is the box the plate paints, a rung quieter. It is
|
|
282
|
+
the whole answer a pointer gets outside the shell, where the floating name is
|
|
283
|
+
layout.css's. (The `outline: none` that stood here switched off an edge #475
|
|
284
|
+
removed.) #475 */
|
|
296
285
|
|
|
297
286
|
/* -- Horizontal tabs ----------------------------------------------------- */
|
|
298
287
|
.ui-nav--tabs {
|
|
@@ -316,7 +305,7 @@
|
|
|
316
305
|
transition: color var(--dur-fast) var(--ease), background var(--dur-fast) var(--ease);
|
|
317
306
|
}
|
|
318
307
|
.ui-nav__tab:hover { color: var(--strong); }
|
|
319
|
-
.ui-nav__tab:focus-visible { outline:
|
|
308
|
+
.ui-nav__tab:focus-visible { outline: var(--ring); outline-offset: var(--ring-offset); border-radius: 8px; }
|
|
320
309
|
.ui-nav__tab.is-active { color: var(--strong); }
|
|
321
310
|
|
|
322
311
|
/* underline variant */
|
|
@@ -335,9 +324,9 @@
|
|
|
335
324
|
|
|
336
325
|
/* pill variant */
|
|
337
326
|
.ui-nav--tabs.is-pill .ui-nav__tab { border-radius: var(--radius-pill); padding: 8px 15px; }
|
|
338
|
-
.ui-nav--tabs.is-pill .ui-nav__tab:hover { background: var(--surface); /*
|
|
327
|
+
.ui-nav--tabs.is-pill .ui-nav__tab:hover { background: var(--surface); /* code-bg: inherit — control paint; the containing surface is the ground, for a chip and for a band alike. */ }
|
|
339
328
|
.ui-nav--tabs.is-pill .ui-nav__tab.is-active {
|
|
340
|
-
background: var(--glow-purple); /*
|
|
329
|
+
background: var(--glow-purple); /* code-bg: inherit — a wash paints over a ground and behind a chip, so the opaque ground below it is the step. */
|
|
341
330
|
color: var(--accent);
|
|
342
331
|
}
|
|
343
332
|
|
|
@@ -372,7 +361,7 @@
|
|
|
372
361
|
does above: a linked crumb is an <a>, and a host stylesheet's `a:link` is
|
|
373
362
|
(0,1,1), which outranks a bare (0,1,0) class. */
|
|
374
363
|
.ui-nav .ui-nav__crumb { color: var(--text); }
|
|
375
|
-
a.ui-nav__crumb:hover { color: var(--strong); background: var(--surface); /*
|
|
376
|
-
a.ui-nav__crumb:focus-visible { outline:
|
|
364
|
+
a.ui-nav__crumb:hover { color: var(--strong); background: var(--surface); /* code-bg: inherit — control paint; the containing surface is the ground, for a chip and for a band alike. */ }
|
|
365
|
+
a.ui-nav__crumb:focus-visible { outline: var(--ring); outline-offset: var(--ring-offset); }
|
|
377
366
|
.ui-nav__crumb.is-current { color: var(--strong); font-weight: 500; }
|
|
378
367
|
.ui-nav__crumb .ui-nav__ic svg { width: 15px; height: 15px; stroke: currentColor; fill: none; stroke-width: 2.5; }
|
|
@@ -68,8 +68,13 @@
|
|
|
68
68
|
selector for the markup this component emits, and the spelling that keeps a
|
|
69
69
|
rule about an ENABLED control out of the disabled-rule sweep in
|
|
70
70
|
stories/guidelines/accessibility-floor.test.js, which reads selector text. */
|
|
71
|
+
/* The one selected mark #578 round r34 LEFT as an edge, and why. A pager stands on
|
|
72
|
+
the page in one showcase and on a card in another; --surface steps off the page at
|
|
73
|
+
1.110:1 and off a card at 1.000:1, so a fill that marks the current page on one
|
|
74
|
+
ground marks nothing on the other. The hairline is what survives both. Open for
|
|
75
|
+
Artur on #578. */
|
|
71
76
|
.ui-pager__page.is-current:not([disabled]) {
|
|
72
|
-
background: var(--surface); /*
|
|
77
|
+
background: var(--surface); /* code-bg: inherit — control paint; the containing surface is the ground, for a chip and for a band alike. */
|
|
73
78
|
border-color: var(--border);
|
|
74
79
|
color: var(--strong);
|
|
75
80
|
font-weight: var(--weight-semibold);
|
package/src/styles/segmented.css
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
/* ============================================================================
|
|
2
2
|
* Segmented control — .ui-seg (the deck's pill switch: theme, Deck/Text, plan)
|
|
3
|
-
* The
|
|
3
|
+
* The chosen button is a fill that steps off the track, and a step of ink.
|
|
4
4
|
* ========================================================================== */
|
|
5
5
|
|
|
6
6
|
/* The strip wraps rather than overflows: a track wider than its column used to
|
|
7
7
|
push the page's scrollWidth past the viewport, which drags every sibling with
|
|
8
|
-
it. Wrapping keeps the focus
|
|
9
|
-
|
|
8
|
+
it. Wrapping keeps the focus band unclipped, which `overflow: auto` here
|
|
9
|
+
would not. #435 */
|
|
10
10
|
.ui-seg {
|
|
11
11
|
display: inline-flex;
|
|
12
12
|
/* `inline-flex` sizes the track to its pills, but a flex or grid parent stretches a
|
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
states its own alignment; --block and --underline ask for the width back. */
|
|
15
15
|
align-self: start;
|
|
16
16
|
justify-self: start;
|
|
17
|
-
background: var(--surface);
|
|
17
|
+
background: var(--surface);
|
|
18
18
|
flex-wrap: wrap;
|
|
19
19
|
max-width: 100%;
|
|
20
20
|
border-radius: var(--radius-2xl);
|
|
@@ -37,12 +37,19 @@
|
|
|
37
37
|
.ui-seg button:hover { color: var(--strong); }
|
|
38
38
|
/* aria-pressed is what segmented() emits now; aria-selected is kept so markup
|
|
39
39
|
copied from an older release keeps painting its active pill. */
|
|
40
|
+
/* The chosen pill is its fill and its ink. The accent outline it also drew was an
|
|
41
|
+
outline used for selection, which is the property and the shape the focus band
|
|
42
|
+
takes — on a chosen pill the two sat one pixel apart. Artur separated them on #578
|
|
43
|
+
round r34, and the fill left behind has to be the mark: the track is --surface, and
|
|
44
|
+
--surface on --surface is 1.000:1, so the pill read as its ink alone. --surface-3 is
|
|
45
|
+
the kit's quiet non-text fill and steps off the track in both themes — 1.140:1 light,
|
|
46
|
+
1.160:1 dark — which stories/selected-fill.test.js measures.
|
|
47
|
+
why: docs/foundations.md#the-focus-ring */
|
|
40
48
|
.ui-seg button.is-active,
|
|
41
49
|
.ui-seg button[aria-pressed="true"],
|
|
42
50
|
.ui-seg button[aria-selected="true"] {
|
|
43
51
|
color: var(--strong);
|
|
44
|
-
background: var(--surface); /*
|
|
45
|
-
outline: 1px solid var(--accent);
|
|
52
|
+
background: var(--surface-3); /* code-bg: inherit — a control's own selected fill; nothing nested reads a ground from it. */
|
|
46
53
|
}
|
|
47
54
|
|
|
48
55
|
/* Standard pills tighten on phones so six short month names fit one row. */
|
|
@@ -65,7 +72,11 @@
|
|
|
65
72
|
cursor: pointer;
|
|
66
73
|
position: relative;
|
|
67
74
|
background: var(--swatch, var(--accent));
|
|
68
|
-
|
|
75
|
+
/* One band of the surface the strip stands on, so a swatch reads as a circle
|
|
76
|
+
rather than as a tile edge-to-edge with its neighbour. #472 took the selected
|
|
77
|
+
swatch's own ring off the second layer and left the layer behind, restating
|
|
78
|
+
this one; two layers at the same spread paint once. */
|
|
79
|
+
box-shadow: 0 0 0 2px var(--surface);
|
|
69
80
|
transition: transform var(--dur-fast) var(--ease), box-shadow var(--dur-fast) var(--ease);
|
|
70
81
|
}
|
|
71
82
|
.ui-accent-picker button:hover { transform: scale(1.08); }
|
|
@@ -88,12 +99,12 @@
|
|
|
88
99
|
border-width: 0 2px 2px 0;
|
|
89
100
|
transform: translate(-50%, -50%) rotate(45deg); /* motion: still — the turn is the tick's shape, not travel, and the mark lands with the press that asked for it. Nothing else on the swatch changes with selection, so there is no paint for it to arrive with. */
|
|
90
101
|
}
|
|
91
|
-
.ui-accent-picker button:focus-visible { outline:
|
|
102
|
+
.ui-accent-picker button:focus-visible { outline: var(--ring); outline-offset: var(--ring-offset); }
|
|
92
103
|
|
|
93
104
|
/* Underline tabs wrap for the reason the pills above do — #435 — and draw no
|
|
94
105
|
rule of their own: the chosen tab carries the selection. #527, #545
|
|
95
106
|
why: docs/components.md#the-chosen-tab-in-an-underline-strip */
|
|
96
|
-
.ui-seg--underline { flex-wrap: wrap; overflow: visible; row-gap: var(--space-1); align-self: stretch; justify-self: stretch; background: transparent;
|
|
107
|
+
.ui-seg--underline { flex-wrap: wrap; overflow: visible; row-gap: var(--space-1); align-self: stretch; justify-self: stretch; background: transparent; border-radius: 0; padding: var(--space-1); max-width: 100%; }
|
|
97
108
|
/* `anywhere` is the half `break-word` cannot do: it lowers the tab's min-content
|
|
98
109
|
width, so one unbreakable word narrows rather than widening the page. The
|
|
99
110
|
padding is the scale's own step and the height is the tap floor, so the tab
|
|
@@ -104,15 +115,16 @@
|
|
|
104
115
|
why: guidelines/layout-and-density.md, the spacing scale */
|
|
105
116
|
.ui-seg--underline button { position: relative; border-radius: var(--radius-sm); padding: var(--space-3); min-height: var(--tap-min, 44px); white-space: normal; overflow-wrap: anywhere; font-weight: var(--weight-medium); }
|
|
106
117
|
/* The chosen tab is its label and one bar under it: no plate, no hairline, no
|
|
107
|
-
upright rail — those read as a list-row grip. `outline: 0`
|
|
108
|
-
outline the pill rule
|
|
109
|
-
#
|
|
118
|
+
upright rail — those read as a list-row grip. #527 r31. The `outline: 0` that
|
|
119
|
+
stood here cancelled the accent outline the pill rule gave every chosen button;
|
|
120
|
+
#578 round r34 took that outline off, so there is nothing left to cancel — and
|
|
121
|
+
nothing outranking the kit's focus rule, which is why the restatement under the
|
|
122
|
+
bar is gone with it. why: docs/components.md#the-chosen-tab-in-an-underline-strip */
|
|
110
123
|
.ui-seg--underline button.is-active,
|
|
111
124
|
.ui-seg--underline button[aria-pressed="true"] {
|
|
112
125
|
background: none;
|
|
113
126
|
color: var(--strong);
|
|
114
127
|
font-weight: var(--weight-semibold);
|
|
115
|
-
outline: 0;
|
|
116
128
|
}
|
|
117
129
|
/* Every tab reserves the bar and hides it, so the mark grows in place when the
|
|
118
130
|
choice moves rather than appearing — the structure and the timing
|
|
@@ -133,15 +145,11 @@
|
|
|
133
145
|
}
|
|
134
146
|
.ui-seg--underline button.is-active::before,
|
|
135
147
|
.ui-seg--underline button[aria-pressed="true"]::before { opacity: 1; transform: scaleX(1); }
|
|
136
|
-
/* `outline: 0` above outranks the kit's :focus-visible rule — (0,3,0) against
|
|
137
|
-
(0,2,1) — so the chosen tab would focus with no indicator. Restated here. */
|
|
138
|
-
.ui-seg--underline button.is-active:focus-visible,
|
|
139
|
-
.ui-seg--underline button[aria-pressed="true"]:focus-visible { outline: 2px solid transparent; box-shadow: var(--ring); }
|
|
140
148
|
/* The mode repaints an author colour, so the bar comes back as the labels' own
|
|
141
149
|
ink. `Highlight` is kept where it is named: one mark the mode cannot flatten. */
|
|
142
150
|
@media (forced-colors: active) {
|
|
143
151
|
.ui-seg--underline button.is-active::before,
|
|
144
152
|
.ui-seg--underline button[aria-pressed="true"]::before { background: Highlight; }
|
|
145
153
|
}
|
|
146
|
-
.ui-seg button:focus-visible { outline:
|
|
154
|
+
.ui-seg button:focus-visible { outline: var(--ring); outline-offset: var(--ring-offset); }
|
|
147
155
|
.ui-seg button:disabled { /* muted-ink: state — unavailable choice */ color: var(--disabled-ink); cursor: not-allowed; }
|
package/src/styles/success.css
CHANGED
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
position: relative;
|
|
17
17
|
overflow: hidden;
|
|
18
18
|
border-radius: 20px;
|
|
19
|
-
background: var(--bg-elevated);
|
|
19
|
+
background: var(--bg-elevated); /* Elevated surface for the confirmation and its actions. */
|
|
20
20
|
/* The floating treatment, like every other surface on that step.
|
|
21
21
|
why: docs/foundations.md#elevation */
|
|
22
22
|
border: 1px solid var(--float-edge);
|
|
@@ -50,7 +50,7 @@
|
|
|
50
50
|
}
|
|
51
51
|
.ui-sx--split .ui-sx__visual {
|
|
52
52
|
display: grid; place-items: center; padding: 40px 24px;
|
|
53
|
-
background: color-mix(in srgb, var(--green) 8%, transparent); /*
|
|
53
|
+
background: color-mix(in srgb, var(--green) 8%, transparent); /* code-bg: inherit — decorative illustration has no nested focus target. */
|
|
54
54
|
border-right: 1px solid var(--border);
|
|
55
55
|
}
|
|
56
56
|
.ui-sx--split .ui-sx__check { width: 72px; height: 72px; }
|
|
@@ -119,7 +119,7 @@
|
|
|
119
119
|
.ui-sx--hero .ui-sx__count { justify-content: center; }
|
|
120
120
|
.ui-sx__count-ring {
|
|
121
121
|
flex: none; width: 16px; height: 16px; border-radius: 50%;
|
|
122
|
-
background: conic-gradient(var(--green) var(--sx-a, 360deg), var(--surface-2) 0); /*
|
|
122
|
+
background: conic-gradient(var(--green) var(--sx-a, 360deg), var(--surface-2) 0); /* code-bg: inherit — decorative or text-only paint; nothing nested reads a ground from it. */
|
|
123
123
|
mask: radial-gradient(circle, transparent 5px, #000 6px);
|
|
124
124
|
-webkit-mask: radial-gradient(circle, transparent 5px, #000 6px);
|
|
125
125
|
animation: ui-sx-sweep var(--sx-secs, 5s) linear forwards; /* motion: ambient — the caller sets the countdown; the ring just spends it */
|
|
@@ -132,7 +132,7 @@
|
|
|
132
132
|
@media (prefers-reduced-motion: reduce) {
|
|
133
133
|
.ui-sx__check--line .ui-sx__tick { animation: none; stroke-dashoffset: 0; }
|
|
134
134
|
.ui-sx__confetti { display: none; }
|
|
135
|
-
.ui-sx__count-ring { animation: none; background: var(--surface-2); /*
|
|
135
|
+
.ui-sx__count-ring { animation: none; background: var(--surface-2); /* code-bg: inherit — decorative or text-only paint; nothing nested reads a ground from it. */ }
|
|
136
136
|
}
|
|
137
137
|
|
|
138
138
|
/* ---- Narrow — split stacks -------------------------------------------- */
|