@apliteni/apliteni-ui 0.35.0 → 0.37.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/README.md +7 -0
- package/package.json +1 -1
- package/react/README.md +5 -0
- package/react/dist/index.css +4 -2
- package/react/dist/index.js +2 -1
- package/src/components/dropdown.js +2 -1
- package/src/styles/back.css +3 -3
- package/src/styles/badge.css +16 -16
- package/src/styles/base.css +6 -6
- package/src/styles/button.css +13 -13
- package/src/styles/callout.css +22 -22
- package/src/styles/card.css +6 -6
- package/src/styles/code.css +6 -6
- package/src/styles/command-palette.css +22 -22
- package/src/styles/confirm.css +3 -3
- package/src/styles/drawer.css +7 -7
- package/src/styles/dropdown.css +25 -23
- package/src/styles/empty.css +2 -2
- package/src/styles/feedback.css +14 -14
- package/src/styles/footer.css +5 -5
- package/src/styles/input.css +15 -15
- package/src/styles/layout.css +27 -27
- package/src/styles/loading.css +3 -3
- package/src/styles/motion.css +1 -1
- package/src/styles/nav.css +28 -28
- package/src/styles/pagination.css +6 -6
- package/src/styles/segmented.css +4 -4
- package/src/styles/stat.css +6 -6
- package/src/styles/success.css +7 -7
- package/src/styles/table.css +7 -7
- package/src/styles/tabs.css +4 -4
- package/src/styles/tooltip.css +3 -3
- package/src/styles/topbar.css +17 -17
- package/src/tokens/tokens.css +49 -7
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); /* ring-gap: 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
|
|
@@ -39,7 +39,7 @@
|
|
|
39
39
|
gap: var(--space-5);
|
|
40
40
|
padding: var(--space-5) var(--space-4);
|
|
41
41
|
border-right: var(--ui-rail-rule) solid var(--border);
|
|
42
|
-
background: var(--surface-2);
|
|
42
|
+
background: var(--surface-2); --ring-gap: var(--surface-2);
|
|
43
43
|
position: sticky;
|
|
44
44
|
top: var(--ui-app-top, 0px);
|
|
45
45
|
height: calc(100vh - var(--ui-app-top, 0px));
|
|
@@ -63,7 +63,7 @@
|
|
|
63
63
|
hovering a row do nothing. The danger row and the current row are left out by
|
|
64
64
|
name, because this rule outranks the states nav.css writes for them.
|
|
65
65
|
why: CONTRIBUTING.md#a-rule-that-outranks-another-cancels-every-state-that-other-one-writes */
|
|
66
|
-
.ui-app__rail .ui-nav__item:not(.is-danger):not(.is-active):hover { background: var(--surface-3); }
|
|
66
|
+
.ui-app__rail .ui-nav__item:not(.is-danger):not(.is-active):hover { background: var(--surface-3); /* ring-gap: inherit — control paint; its focus indicator uses the containing surface. */ }
|
|
67
67
|
.ui-app__brand {
|
|
68
68
|
display: flex;
|
|
69
69
|
align-items: center;
|
|
@@ -109,7 +109,7 @@
|
|
|
109
109
|
smallest of three weak signals doing the most work, so it grows with the row. */
|
|
110
110
|
/* Re-tuned at #295, which took the light rail down a step with the page. Below 720px
|
|
111
111
|
the glyph is the whole row, so it is held at text grade rather than at 1.4.11's bar —
|
|
112
|
-
stories/apps/shell-states.test.js:
|
|
112
|
+
stories/apps/shell-states.test.js:1403 `a resting glyph is dimmer but still legible`. */
|
|
113
113
|
.ui-app__rail .ui-nav__ic svg { opacity: 0.66; }
|
|
114
114
|
.ui-app__rail .ui-nav__item.is-active .ui-nav__ic svg,
|
|
115
115
|
.ui-app__rail .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 */
|
|
@@ -153,7 +153,7 @@
|
|
|
153
153
|
width: var(--ui-app-av); height: var(--ui-app-av); flex: none;
|
|
154
154
|
margin-inline-start: calc((var(--ui-nav-strip) - var(--ui-app-av)) / 2);
|
|
155
155
|
border-radius: var(--radius-pill);
|
|
156
|
-
background: var(--surface-3);
|
|
156
|
+
background: var(--surface-3); /* ring-gap: inherit — decorative or text-only surface has no nested focus target. */
|
|
157
157
|
color: var(--strong);
|
|
158
158
|
display: grid; place-items: center;
|
|
159
159
|
font-size: calc(var(--text-xs) + 1px);
|
|
@@ -163,7 +163,7 @@
|
|
|
163
163
|
.ui-app__who b { display: block; color: var(--strong); font-weight: var(--weight-semibold); }
|
|
164
164
|
/* nowrap is what makes the ellipsis fire — without it the address wraps, and
|
|
165
165
|
the rail column is max-content, so a long one widens the rail instead. */
|
|
166
|
-
.ui-app__who span { display: block; color: var(--
|
|
166
|
+
.ui-app__who span { display: block; color: var(--text); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
|
|
167
167
|
|
|
168
168
|
/* -- the reader's menu ---------------------------------------------------- */
|
|
169
169
|
/* The account block is a dropdown() trigger, so it takes the rail's own row skin
|
|
@@ -187,7 +187,7 @@
|
|
|
187
187
|
font-weight: inherit;
|
|
188
188
|
letter-spacing: normal;
|
|
189
189
|
}
|
|
190
|
-
.ui-app .ui-app__user-trigger:hover { background: var(--surface-3); }
|
|
190
|
+
.ui-app .ui-app__user-trigger:hover { background: var(--surface-3); /* ring-gap: inherit — control paint; its focus indicator uses the containing surface. */ }
|
|
191
191
|
.ui-app__user-trigger .ui-app__who { flex: 1 1 auto; text-align: left; }
|
|
192
192
|
/* The panel is portalled onto <body>, so nothing here may hang off .ui-app: by the
|
|
193
193
|
time it is open it is no longer inside the rail that drew it.
|
|
@@ -198,7 +198,7 @@
|
|
|
198
198
|
`text-overflow` would have nothing to fire against — the inert pair
|
|
199
199
|
.ui-app__who's own comment warns about. `anywhere` keeps an address with no
|
|
200
200
|
break in it from widening the panel instead. */
|
|
201
|
-
.ui-app__user-panel .ui-dropdown__head span { display: block; color: var(--
|
|
201
|
+
.ui-app__user-panel .ui-dropdown__head span { display: block; color: var(--text); font-size: var(--text-xs); overflow-wrap: anywhere; }
|
|
202
202
|
|
|
203
203
|
/* The toggle's cell, at the far end of the brand row: the auto margin puts it there
|
|
204
204
|
with or without a wordmark beside it, and the offset below rides it back onto the
|
|
@@ -221,7 +221,7 @@
|
|
|
221
221
|
row under it. The glyph box carries the line instead, in both states.
|
|
222
222
|
why: docs/specification.md#the-page-shell */
|
|
223
223
|
.ui-app__fold .ui-nav__ic { height: 1lh; }
|
|
224
|
-
.ui-app .ui-app__fold { color: var(--
|
|
224
|
+
.ui-app .ui-app__fold { color: var(--text); }
|
|
225
225
|
.ui-app .ui-app__fold:hover,
|
|
226
226
|
.ui-app .ui-app__fold:focus-visible { color: var(--strong); }
|
|
227
227
|
/* The width's own clock, not the words', so the mark and the closing edge arrive
|
|
@@ -269,7 +269,7 @@
|
|
|
269
269
|
why: docs/specification.md#elevation */
|
|
270
270
|
:where(.ui-app.is-collapsed) .ui-app__rail .ui-nav__item:is(:hover, :focus-visible) > .ui-nav__label,
|
|
271
271
|
:where(.ui-app.is-collapsed) .ui-app__rail .ui-app__user-trigger:is(:hover, :focus-visible) > .ui-app__who,
|
|
272
|
-
.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(--border-strong); box-shadow: inset 0 0 0 1px var(--elev-edge, var(--border)), var(--elev-drop); border-radius: var(--radius-xs); background: var(--surface-3); color: var(--strong); opacity: 1; pointer-events: none; }
|
|
272
|
+
.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(--border-strong); box-shadow: inset 0 0 0 1px var(--elev-edge, var(--border)), var(--elev-drop); border-radius: var(--radius-xs); background: var(--surface-3); /* ring-gap: inherit — decorative or text-only surface has no nested focus target. */ color: var(--strong); opacity: 1; pointer-events: none; }
|
|
273
273
|
@supports (anchor-name: --a) and (anchor-scope: --a) {
|
|
274
274
|
.ui-app.is-collapsed,
|
|
275
275
|
.ui-app:has(.ui-app__fold) { anchor-scope: --ui-rail; }
|
|
@@ -318,7 +318,7 @@
|
|
|
318
318
|
height: var(--ui-app-band);
|
|
319
319
|
flex: none;
|
|
320
320
|
padding-inline: clamp(24px, 4vw, 56px);
|
|
321
|
-
background: var(--bg);
|
|
321
|
+
background: var(--bg); /* ring-gap: inherit — page background inherits root overrides. */
|
|
322
322
|
border-bottom: 1px solid var(--border);
|
|
323
323
|
/* Sticky for the reason the rail beside it is: chrome that scrolls away is chrome
|
|
324
324
|
you scroll back up for. */
|
|
@@ -351,7 +351,7 @@
|
|
|
351
351
|
font: inherit;
|
|
352
352
|
font-size: var(--text-sm);
|
|
353
353
|
text-align: start;
|
|
354
|
-
color: var(--
|
|
354
|
+
color: var(--text);
|
|
355
355
|
/* --surface, not the sunken --surface-2 every other field in the kit takes:
|
|
356
356
|
those sit on a card and this one sits on the band, and the band IS --bg, the
|
|
357
357
|
bottom of the ladder — so a sunken fill has nowhere to go but down into its
|
|
@@ -362,7 +362,7 @@
|
|
|
362
362
|
Artur chose this over three alternatives on #318; the survey of what seven
|
|
363
363
|
other systems do is docs/reviews/318-search-field.md.
|
|
364
364
|
why: docs/specification.md#elevation */
|
|
365
|
-
background: var(--surface);
|
|
365
|
+
background: var(--surface); /* ring-gap: inherit — control paint; its focus indicator uses the containing surface. */
|
|
366
366
|
border: 1px solid var(--border);
|
|
367
367
|
border-radius: var(--radius-md);
|
|
368
368
|
cursor: pointer;
|
|
@@ -373,7 +373,7 @@
|
|
|
373
373
|
without `.ui-btn`, so base.css's shared rule never reached it and focus fell
|
|
374
374
|
through to the browser's own square outline, drawn around a 12px radius.
|
|
375
375
|
why: docs/specification.md#the-focus-ring */
|
|
376
|
-
.ui-app__search:focus-visible { outline:
|
|
376
|
+
.ui-app__search:focus-visible { outline: 2px solid transparent; box-shadow: var(--ring); border-color: var(--accent); }
|
|
377
377
|
/* The same glyph the palette draws in its own search box, at the same box and the
|
|
378
378
|
same stroke: the trigger and the thing it opens are not two search marks.
|
|
379
379
|
src/styles/command-palette.css:107 `.ui-cmdk__search-ic svg` */
|
|
@@ -402,7 +402,7 @@
|
|
|
402
402
|
letter-spacing: var(--tracking-tight);
|
|
403
403
|
margin-bottom: 8px;
|
|
404
404
|
}
|
|
405
|
-
.ui-app__sub { color: var(--
|
|
405
|
+
.ui-app__sub { color: var(--text); font-size: calc(var(--text-base) + 0.5px); line-height: 1.6; max-width: var(--prose-body); margin-bottom: 32px; }
|
|
406
406
|
.ui-app__body { display: flex; flex-direction: column; gap: var(--space-5); }
|
|
407
407
|
/* A flex child's min-width is its content by default, so one wide block — a
|
|
408
408
|
ledger, a code sample — pushes the whole page sideways instead of scrolling
|
|
@@ -467,7 +467,7 @@
|
|
|
467
467
|
.ui-app__rail .ui-nav__item,
|
|
468
468
|
.ui-app__rail .ui-app__user-trigger { min-height: 44px; }
|
|
469
469
|
.ui-app__rail .ui-nav__item:is(:hover, :focus-visible) > .ui-nav__label,
|
|
470
|
-
.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(--border-strong); box-shadow: inset 0 0 0 1px var(--elev-edge, var(--border)), var(--elev-drop); border-radius: var(--radius-xs); background: var(--surface-3); color: var(--strong); opacity: 1; pointer-events: none; }
|
|
470
|
+
.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(--border-strong); box-shadow: inset 0 0 0 1px var(--elev-edge, var(--border)), var(--elev-drop); border-radius: var(--radius-xs); background: var(--surface-3); /* ring-gap: inherit — decorative or text-only surface has no nested focus target. */ color: var(--strong); opacity: 1; pointer-events: none; }
|
|
471
471
|
@supports (anchor-name: --a) and (anchor-scope: --a) {
|
|
472
472
|
.ui-app { anchor-scope: --ui-rail; }
|
|
473
473
|
.ui-app__rail { anchor-name: --ui-rail; }
|
|
@@ -501,7 +501,7 @@
|
|
|
501
501
|
max-width: var(--panel-md);
|
|
502
502
|
/* Floats over a spotlit page, so it takes the floating step and the hairline.
|
|
503
503
|
why: docs/specification.md#elevation */
|
|
504
|
-
background: var(--bg-elevated);
|
|
504
|
+
background: var(--bg-elevated); --ring-gap: var(--bg-elevated);
|
|
505
505
|
border: 1px solid var(--border);
|
|
506
506
|
border-radius: 22px;
|
|
507
507
|
padding: 38px 36px 32px;
|
|
@@ -509,10 +509,10 @@
|
|
|
509
509
|
.ui-auth__brand { display: inline-flex; align-items: center; gap: 10px; margin-bottom: 26px; }
|
|
510
510
|
.ui-auth__brand span { font-size: calc(var(--text-base) + 0.5px); font-weight: 600; color: var(--strong); }
|
|
511
511
|
.ui-auth__title { color: var(--strong); font-size: calc(var(--text-xl) + 2px); font-weight: 600; letter-spacing: -0.01em; margin-bottom: 7px; }
|
|
512
|
-
.ui-auth__sub { color: var(--
|
|
513
|
-
.ui-auth__foot { margin-top: 24px; text-align: center; font-size: var(--text-sm); color: var(--
|
|
512
|
+
.ui-auth__sub { color: var(--text); font-size: var(--text-base); line-height: 1.55; margin-bottom: 26px; }
|
|
513
|
+
.ui-auth__foot { margin-top: 24px; text-align: center; font-size: var(--text-sm); color: var(--text); }
|
|
514
514
|
.ui-auth__foot a { color: var(--accent); }
|
|
515
|
-
.ui-divider { display: flex; align-items: center; gap: 14px; margin: 22px 0; color: var(--
|
|
515
|
+
.ui-divider { display: flex; align-items: center; gap: 14px; margin: 22px 0; color: var(--text); font-size: calc(var(--text-xs) + 1px); }
|
|
516
516
|
.ui-divider::before, .ui-divider::after { content: ""; flex: 1; height: 1px; background: var(--border); }
|
|
517
517
|
|
|
518
518
|
/* App scope grant list (OAuth consent) */
|
|
@@ -523,12 +523,12 @@
|
|
|
523
523
|
width: 38px; height: 38px; flex: none;
|
|
524
524
|
border-radius: 11px;
|
|
525
525
|
display: grid; place-items: center;
|
|
526
|
-
background: var(--glow-purple);
|
|
526
|
+
background: var(--glow-purple); /* ring-gap: inherit — translucent wash retains the opaque containing gap. */
|
|
527
527
|
color: var(--accent);
|
|
528
528
|
}
|
|
529
529
|
.ui-scope__icon svg { width: 21px; height: 21px; stroke: currentColor; fill: none; stroke-width: 1.8; }
|
|
530
530
|
.ui-scope__t { color: var(--strong); font-size: calc(var(--text-base) - 0.5px); font-weight: 500; }
|
|
531
|
-
.ui-scope__d { color: var(--
|
|
531
|
+
.ui-scope__d { color: var(--text); font-size: var(--text-sm); margin-top: 2px; line-height: 1.5; }
|
|
532
532
|
|
|
533
533
|
/* -- Landing hero -------------------------------------------------------- */
|
|
534
534
|
.ui-hero {
|
|
@@ -544,7 +544,7 @@
|
|
|
544
544
|
font-size: calc(var(--text-xs) + 1px);
|
|
545
545
|
letter-spacing: 0.06em;
|
|
546
546
|
color: var(--purple-mid);
|
|
547
|
-
background: var(--glow-purple);
|
|
547
|
+
background: var(--glow-purple); /* ring-gap: inherit — translucent wash retains the opaque containing gap. */
|
|
548
548
|
border-radius: 999px;
|
|
549
549
|
padding: 6px 14px;
|
|
550
550
|
margin-bottom: 26px;
|
|
@@ -567,7 +567,7 @@
|
|
|
567
567
|
}
|
|
568
568
|
.ui-hero__sub {
|
|
569
569
|
font-size: clamp(16px, 2.1vw, 20px);
|
|
570
|
-
color: var(--
|
|
570
|
+
color: var(--text);
|
|
571
571
|
max-width: var(--prose-lede);
|
|
572
572
|
margin: 0 auto 34px;
|
|
573
573
|
line-height: 1.6;
|
|
@@ -589,14 +589,14 @@
|
|
|
589
589
|
width: 46px; height: 46px;
|
|
590
590
|
border-radius: 13px;
|
|
591
591
|
display: grid; place-items: center;
|
|
592
|
-
background: var(--glow-purple);
|
|
592
|
+
background: var(--glow-purple); /* ring-gap: inherit — translucent wash retains the opaque containing gap. */
|
|
593
593
|
color: var(--accent);
|
|
594
594
|
margin-bottom: 16px;
|
|
595
595
|
}
|
|
596
596
|
.ui-feature__icon svg { width: 25px; height: 25px; stroke: currentColor; fill: none; stroke-width: 1.8; }
|
|
597
597
|
.ui-feature h3 { color: var(--strong); font-size: calc(var(--text-lg) - 1px); font-weight: 600; margin-bottom: 7px; }
|
|
598
|
-
.ui-feature p { color: var(--
|
|
598
|
+
.ui-feature p { color: var(--text); font-size: var(--text-base); line-height: 1.6; }
|
|
599
599
|
|
|
600
600
|
.ui-section-head { text-align: center; max-width: var(--panel-lg); margin: 0 auto clamp(40px, 6vh, 64px); }
|
|
601
601
|
.ui-section-head h2 { color: var(--strong); font-size: clamp(28px, 4vw, 40px); font-weight: 700; letter-spacing: -0.02em; margin-bottom: 14px; }
|
|
602
|
-
.ui-section-head p { color: var(--
|
|
602
|
+
.ui-section-head p { color: var(--text); font-size: calc(var(--text-lg) - 1px); line-height: 1.6; }
|
package/src/styles/loading.css
CHANGED
|
@@ -89,7 +89,7 @@
|
|
|
89
89
|
text-align: center;
|
|
90
90
|
gap: 8px;
|
|
91
91
|
padding: 48px 24px;
|
|
92
|
-
color: var(--
|
|
92
|
+
color: var(--text);
|
|
93
93
|
}
|
|
94
94
|
.ui-denied__seal {
|
|
95
95
|
width: 44px;
|
|
@@ -98,8 +98,8 @@
|
|
|
98
98
|
border-radius: 50%;
|
|
99
99
|
display: grid;
|
|
100
100
|
place-items: center;
|
|
101
|
-
color: var(--dim);
|
|
102
|
-
background: color-mix(in srgb, var(--text) 7%, transparent);
|
|
101
|
+
/* muted-ink: glyph — permission seal */ color: var(--dim);
|
|
102
|
+
background: color-mix(in srgb, var(--text) 7%, transparent); /* ring-gap: 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); /* ring-gap: 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
|
@@ -41,7 +41,7 @@
|
|
|
41
41
|
/* rank: label */
|
|
42
42
|
font-size: var(--text-sm);
|
|
43
43
|
font-weight: var(--weight-medium);
|
|
44
|
-
color: var(--
|
|
44
|
+
color: var(--text);
|
|
45
45
|
padding: 4px 12px 8px;
|
|
46
46
|
/* Goes on the labels' clock — a section heading is words, and the fold takes
|
|
47
47
|
every word on the rail together. */
|
|
@@ -69,9 +69,9 @@
|
|
|
69
69
|
transition: background var(--dur-fast) var(--ease), color var(--dur-fast) var(--ease);
|
|
70
70
|
}
|
|
71
71
|
.ui-nav .ui-nav__item { color: var(--text); } /* (0,2,0): a host sheet's a:link is (0,1,1) — why: docs/specification.md#the-page-shell */
|
|
72
|
-
.ui-nav__item:hover { background: var(--surface-2); color: var(--strong); }
|
|
72
|
+
.ui-nav__item:hover { background: var(--surface-2); /* ring-gap: inherit — control paint; its focus indicator uses the containing surface. */ color: var(--strong); }
|
|
73
73
|
.ui-nav__item.is-active {
|
|
74
|
-
background: var(--surface-3);
|
|
74
|
+
background: var(--surface-3); /* ring-gap: inherit — control paint; its focus indicator uses the containing surface. */
|
|
75
75
|
color: var(--strong);
|
|
76
76
|
font-weight: 500;
|
|
77
77
|
}
|
|
@@ -88,8 +88,8 @@
|
|
|
88
88
|
background: var(--accent);
|
|
89
89
|
transform: translateY(-50%); /* motion: still — a mark on the current row, whose own highlight already transitions; this centres it, it does not travel */
|
|
90
90
|
}
|
|
91
|
-
.ui-nav__item:focus-visible { outline:
|
|
92
|
-
.ui-nav__item.is-active:focus-visible { box-shadow: var(--ring); }
|
|
91
|
+
.ui-nav__item:focus-visible { outline: 2px solid transparent; box-shadow: var(--ring); }
|
|
92
|
+
.ui-nav__item.is-active:focus-visible { outline: 2px solid transparent; box-shadow: var(--ring); }
|
|
93
93
|
|
|
94
94
|
.ui-nav__ic { display: inline-flex; flex: none; }
|
|
95
95
|
.ui-nav__ic svg { width: 17px; height: 17px; stroke: currentColor; fill: none; stroke-width: 2.2; opacity: 0.72; }
|
|
@@ -105,16 +105,16 @@
|
|
|
105
105
|
transition: opacity var(--dur-fast) var(--ease);
|
|
106
106
|
}
|
|
107
107
|
|
|
108
|
-
/* Destructive row (sign out, revoke).
|
|
108
|
+
/* Destructive row (sign out, revoke). Body ink at rest, --pink once a pointer or
|
|
109
109
|
the keyboard reaches it — as .ui-btn--danger and .ui-dropdown__item do. */
|
|
110
|
-
.ui-nav__item.is-danger { color: var(--
|
|
111
|
-
.ui-nav__item.is-danger:hover { background: var(--glow-pink); color: var(--pink); }
|
|
110
|
+
.ui-nav__item.is-danger { color: var(--text); }
|
|
111
|
+
.ui-nav__item.is-danger:hover { background: var(--glow-pink); /* ring-gap: inherit — translucent wash retains the opaque containing gap. */ color: var(--pink); }
|
|
112
112
|
/* Tabbing onto it is the same "about to click this" the pointer means. The ring
|
|
113
113
|
says where you are; only this says what the row does. */
|
|
114
|
-
.ui-nav__item.is-danger:focus-visible { background: var(--glow-pink); color: var(--pink); }
|
|
115
|
-
/*
|
|
116
|
-
|
|
117
|
-
.ui-nav__item.is-disabled { color: var(--disabled-ink); cursor: default; pointer-events: none; }
|
|
114
|
+
.ui-nav__item.is-danger:focus-visible { background: var(--glow-pink); /* ring-gap: inherit — translucent wash retains the opaque containing gap. */ color: var(--pink); }
|
|
115
|
+
/* An unavailable row uses disabled ink directly; opacity would also fade its
|
|
116
|
+
background and pull its label toward the rail behind it (#220). */
|
|
117
|
+
.ui-nav__item.is-disabled { /* muted-ink: state — unavailable control */ color: var(--disabled-ink); cursor: default; pointer-events: none; }
|
|
118
118
|
|
|
119
119
|
/* The current row under the pointer. It rests on --surface-3, which is also what
|
|
120
120
|
a resting row hovers to, so the one row with no hover response was the row the
|
|
@@ -124,7 +124,7 @@
|
|
|
124
124
|
rules so it cannot out-rank them — sign out is never the current row, but a
|
|
125
125
|
rule that could take its wash would be one to argue with later. */
|
|
126
126
|
.ui-nav__item.is-active:not(.is-danger):hover {
|
|
127
|
-
background: color-mix(in srgb, var(--text) 10%, var(--surface-3));
|
|
127
|
+
background: color-mix(in srgb, var(--text) 10%, var(--surface-3)); /* ring-gap: inherit — control paint; its focus indicator uses the containing surface. */
|
|
128
128
|
}
|
|
129
129
|
|
|
130
130
|
/* Per-item badge / counter */
|
|
@@ -140,17 +140,17 @@
|
|
|
140
140
|
font-size: var(--text-xs);
|
|
141
141
|
font-weight: 600;
|
|
142
142
|
line-height: 1;
|
|
143
|
-
background: var(--surface-3);
|
|
144
|
-
color: var(--
|
|
143
|
+
background: var(--surface-3); /* ring-gap: inherit — decorative or text-only surface has no nested focus target. */
|
|
144
|
+
color: var(--text);
|
|
145
145
|
/* The count fades with the words. It is never lost: sidebarNav() spells it
|
|
146
146
|
into the row's aria-label, so "Pending 3" is what a reader hears at either
|
|
147
147
|
width. */
|
|
148
148
|
transition: opacity var(--dur-fast) var(--ease);
|
|
149
149
|
}
|
|
150
|
-
.ui-nav__badge.is-accent { background: var(--glow-purple); color: var(--accent); }
|
|
151
|
-
.ui-nav__badge.is-live { background: var(--chip-success-fill); color: var(--chip-success-ink); }
|
|
152
|
-
.ui-nav__badge.is-danger { background: var(--glow-pink); color: var(--pink); }
|
|
153
|
-
.ui-nav__item.is-active .ui-nav__badge.is-neutral { background: var(--surface-3); color: var(--strong); }
|
|
150
|
+
.ui-nav__badge.is-accent { background: var(--glow-purple); /* ring-gap: inherit — translucent wash retains the opaque containing gap. */ color: var(--accent); }
|
|
151
|
+
.ui-nav__badge.is-live { background: var(--chip-success-fill); /* ring-gap: inherit — decorative or text-only surface has no nested focus target. */ color: var(--chip-success-ink); }
|
|
152
|
+
.ui-nav__badge.is-danger { background: var(--glow-pink); /* ring-gap: inherit — translucent wash retains the opaque containing gap. */ color: var(--pink); }
|
|
153
|
+
.ui-nav__item.is-active .ui-nav__badge.is-neutral { background: var(--surface-3); /* ring-gap: inherit — decorative or text-only surface has no nested focus target. */ color: var(--strong); }
|
|
154
154
|
/* Same shape, one row up: on an active row the accent counter takes the row's
|
|
155
155
|
OWN surface instead of laying its wash over it. An active row is already
|
|
156
156
|
painted --surface-3, so --glow-purple there is two tints stacked. Every
|
|
@@ -160,7 +160,7 @@
|
|
|
160
160
|
it, the largest that clears being 0.06 in dark Nebula and 0.02 in light
|
|
161
161
|
Emerald. So the accent wash is painted on a base surface, never a raised one.
|
|
162
162
|
See #157 and docs/specification.md#colour-and-contrast. */
|
|
163
|
-
.ui-nav__item.is-active .ui-nav__badge.is-accent { background: var(--surface-3); color: var(--accent); }
|
|
163
|
+
.ui-nav__item.is-active .ui-nav__badge.is-accent { background: var(--surface-3); /* ring-gap: inherit — decorative or text-only surface has no nested focus target. */ color: var(--accent); }
|
|
164
164
|
|
|
165
165
|
/* Collapsible group */
|
|
166
166
|
.ui-nav__group { display: flex; flex-direction: column; }
|
|
@@ -267,7 +267,7 @@
|
|
|
267
267
|
align-items: center;
|
|
268
268
|
gap: 8px;
|
|
269
269
|
padding: 11px 14px;
|
|
270
|
-
color: var(--
|
|
270
|
+
color: var(--text);
|
|
271
271
|
text-decoration: none;
|
|
272
272
|
font-size: calc(var(--text-base) - 0.5px);
|
|
273
273
|
font-weight: 500;
|
|
@@ -275,7 +275,7 @@
|
|
|
275
275
|
transition: color var(--dur-fast) var(--ease), background var(--dur-fast) var(--ease);
|
|
276
276
|
}
|
|
277
277
|
.ui-nav__tab:hover { color: var(--strong); }
|
|
278
|
-
.ui-nav__tab:focus-visible { outline:
|
|
278
|
+
.ui-nav__tab:focus-visible { outline: 2px solid transparent; box-shadow: var(--ring); border-radius: 8px; }
|
|
279
279
|
.ui-nav__tab.is-active { color: var(--strong); }
|
|
280
280
|
|
|
281
281
|
/* underline variant */
|
|
@@ -294,13 +294,13 @@
|
|
|
294
294
|
|
|
295
295
|
/* pill variant */
|
|
296
296
|
.ui-nav--tabs.is-pill .ui-nav__tab { border-radius: var(--radius-pill); padding: 8px 15px; }
|
|
297
|
-
.ui-nav--tabs.is-pill .ui-nav__tab:hover { background: var(--surface-2); }
|
|
297
|
+
.ui-nav--tabs.is-pill .ui-nav__tab:hover { background: var(--surface-2); /* ring-gap: inherit — control paint; its focus indicator uses the containing surface. */ }
|
|
298
298
|
.ui-nav--tabs.is-pill .ui-nav__tab.is-active {
|
|
299
|
-
background: var(--glow-purple);
|
|
299
|
+
background: var(--glow-purple); /* ring-gap: inherit — translucent wash retains the opaque containing gap. */
|
|
300
300
|
color: var(--accent);
|
|
301
301
|
}
|
|
302
302
|
|
|
303
|
-
.ui-nav__tab.is-disabled { color: var(--disabled-ink); cursor: default; }
|
|
303
|
+
.ui-nav__tab.is-disabled { /* muted-ink: state — unavailable control */ color: var(--disabled-ink); cursor: default; }
|
|
304
304
|
.ui-nav__tab .ui-nav__badge { height: 18px; }
|
|
305
305
|
|
|
306
306
|
/* -- Breadcrumbs --------------------------------------------------------- */
|
|
@@ -328,8 +328,8 @@
|
|
|
328
328
|
/* Carries the block's class as well as its own, for the reason .ui-nav__item
|
|
329
329
|
does above: a linked crumb is an <a>, and a host stylesheet's `a:link` is
|
|
330
330
|
(0,1,1), which outranks a bare (0,1,0) class. */
|
|
331
|
-
.ui-nav .ui-nav__crumb { color: var(--
|
|
332
|
-
a.ui-nav__crumb:hover { color: var(--strong); background: var(--surface-2); }
|
|
333
|
-
a.ui-nav__crumb:focus-visible { outline:
|
|
331
|
+
.ui-nav .ui-nav__crumb { color: var(--text); }
|
|
332
|
+
a.ui-nav__crumb:hover { color: var(--strong); background: var(--surface-2); /* ring-gap: inherit — control paint; its focus indicator uses the containing surface. */ }
|
|
333
|
+
a.ui-nav__crumb:focus-visible { outline: 2px solid transparent; box-shadow: var(--ring); }
|
|
334
334
|
.ui-nav__crumb.is-current { color: var(--strong); font-weight: 500; }
|
|
335
335
|
.ui-nav__crumb .ui-nav__ic svg { width: 15px; height: 15px; stroke: currentColor; fill: none; stroke-width: 2.5; }
|
|
@@ -20,7 +20,7 @@
|
|
|
20
20
|
target group in one place as the row count changes width. */
|
|
21
21
|
.ui-pager__status {
|
|
22
22
|
margin: 0 auto 0 0;
|
|
23
|
-
color: var(--
|
|
23
|
+
color: var(--text);
|
|
24
24
|
font-variant-numeric: tabular-nums;
|
|
25
25
|
}
|
|
26
26
|
|
|
@@ -29,7 +29,7 @@
|
|
|
29
29
|
align-items: center;
|
|
30
30
|
gap: var(--space-2);
|
|
31
31
|
}
|
|
32
|
-
.ui-pager__size-label { color: var(--
|
|
32
|
+
.ui-pager__size-label { color: var(--text); }
|
|
33
33
|
|
|
34
34
|
/* .ui-select is a form field sized for a form — full width, 12px/15px padding.
|
|
35
35
|
In a pager it sits in a row of sm buttons, so it takes their scale. Two things
|
|
@@ -69,7 +69,7 @@
|
|
|
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
71
|
.ui-pager__page.is-current:not([disabled]) {
|
|
72
|
-
background: var(--surface-3);
|
|
72
|
+
background: var(--surface-3); /* ring-gap: inherit — control paint; its focus indicator uses the containing surface. */
|
|
73
73
|
border-color: var(--border);
|
|
74
74
|
color: var(--strong);
|
|
75
75
|
font-weight: var(--weight-semibold);
|
|
@@ -77,14 +77,14 @@
|
|
|
77
77
|
|
|
78
78
|
.ui-pager__gap {
|
|
79
79
|
padding: 0 var(--space-1);
|
|
80
|
-
color: var(--muted);
|
|
80
|
+
/* muted-ink: glyph — ellipsis for omitted page controls */ color: var(--muted);
|
|
81
81
|
}
|
|
82
82
|
|
|
83
83
|
.ui-pager__jump {
|
|
84
84
|
display: inline-flex;
|
|
85
85
|
align-items: center;
|
|
86
86
|
gap: var(--space-2);
|
|
87
|
-
color: var(--
|
|
87
|
+
color: var(--text);
|
|
88
88
|
padding: 0 var(--space-1);
|
|
89
89
|
}
|
|
90
90
|
/* Wide enough for four digits and the spinner a number input draws beside them;
|
|
@@ -120,6 +120,6 @@
|
|
|
120
120
|
discovered.
|
|
121
121
|
why: docs/specification.md#pagination */
|
|
122
122
|
a.ui-pager__step,
|
|
123
|
-
a.ui-pager__page { color: var(--
|
|
123
|
+
a.ui-pager__page { color: var(--text); }
|
|
124
124
|
a.ui-pager__step:hover,
|
|
125
125
|
a.ui-pager__page:hover { color: var(--strong); }
|
package/src/styles/segmented.css
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
|
|
6
6
|
.ui-seg {
|
|
7
7
|
display: inline-flex;
|
|
8
|
-
background: var(--surface-2);
|
|
8
|
+
background: var(--surface-2); --ring-gap: var(--surface-2);
|
|
9
9
|
border-radius: var(--radius-2xl);
|
|
10
10
|
padding: 3px;
|
|
11
11
|
gap: 2px;
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
font-size: calc(var(--text-sm) + 0.5px);
|
|
16
16
|
font-weight: var(--weight-semibold);
|
|
17
17
|
letter-spacing: 0.02em;
|
|
18
|
-
color: var(--
|
|
18
|
+
color: var(--text);
|
|
19
19
|
background: none;
|
|
20
20
|
border: 0;
|
|
21
21
|
padding: 7px 18px;
|
|
@@ -23,7 +23,7 @@
|
|
|
23
23
|
cursor: pointer;
|
|
24
24
|
transition: color var(--dur-med) var(--ease), background var(--dur-med) var(--ease);
|
|
25
25
|
}
|
|
26
|
-
.ui-seg button:hover { color: var(--
|
|
26
|
+
.ui-seg button:hover { color: var(--strong); }
|
|
27
27
|
/* aria-pressed is what segmented() emits now; aria-selected is kept so markup
|
|
28
28
|
copied from an older release keeps painting its active pill. */
|
|
29
29
|
.ui-seg button.is-active,
|
|
@@ -54,4 +54,4 @@
|
|
|
54
54
|
.ui-accent-picker button.is-active {
|
|
55
55
|
box-shadow: 0 0 0 2px var(--surface), 0 0 0 4px var(--swatch, var(--accent));
|
|
56
56
|
}
|
|
57
|
-
.ui-accent-picker button:focus-visible { outline:
|
|
57
|
+
.ui-accent-picker button:focus-visible { outline: 2px solid transparent; box-shadow: var(--ring); }
|
package/src/styles/stat.css
CHANGED
|
@@ -27,7 +27,7 @@
|
|
|
27
27
|
figure's parts are held close, so the label keeps the band's tighter line.
|
|
28
28
|
It sits outside the rank table for that one reason, and claims no rank. */
|
|
29
29
|
.ui-stat__label {
|
|
30
|
-
color: var(--
|
|
30
|
+
color: var(--text);
|
|
31
31
|
font-size: var(--text-sm);
|
|
32
32
|
font-weight: var(--weight-medium);
|
|
33
33
|
line-height: var(--leading-snug);
|
|
@@ -55,15 +55,15 @@
|
|
|
55
55
|
align-items: center;
|
|
56
56
|
gap: 2px var(--space-1);
|
|
57
57
|
margin-top: var(--space-2);
|
|
58
|
-
color: var(--
|
|
58
|
+
color: var(--text);
|
|
59
59
|
font-size: var(--text-sm);
|
|
60
60
|
font-weight: var(--weight-medium);
|
|
61
61
|
line-height: var(--leading-snug);
|
|
62
62
|
}
|
|
63
63
|
.ui-stat__delta svg { width: 14px; height: 14px; flex: none; stroke-width: 2.7; } /* 2.7 of a 24 box drawn at 14px = 1.58 CSS px. docs/specification.md#icons-and-glyphs */
|
|
64
64
|
.ui-stat__change { font-variant-numeric: tabular-nums; white-space: nowrap; }
|
|
65
|
-
.ui-stat__basis { color: var(--
|
|
66
|
-
.ui-stat__delta--none { color: var(--
|
|
65
|
+
.ui-stat__basis { color: var(--text); font-weight: var(--weight-normal); }
|
|
66
|
+
.ui-stat__delta--none { color: var(--text); font-weight: var(--weight-normal); }
|
|
67
67
|
|
|
68
68
|
/* Tone is set by the caller and says good or bad news. Direction is the arrow's
|
|
69
69
|
job, so an unset tone keeps the change neutral whichever way it points. */
|
|
@@ -72,7 +72,7 @@
|
|
|
72
72
|
|
|
73
73
|
/* The trend is the caller's <svg>. margin-top: auto seats it on the bottom of
|
|
74
74
|
the figure, so trends line up across figures whose text wraps differently. */
|
|
75
|
-
.ui-stat__trend { margin-top: auto; padding-top: var(--space-4); color: var(--muted); }
|
|
75
|
+
.ui-stat__trend { margin-top: auto; padding-top: var(--space-4); /* muted-ink: glyph — caller-supplied sparkline */ color: var(--muted); }
|
|
76
76
|
.ui-stat__trend svg { display: block; width: 100%; height: 32px; overflow: visible; }
|
|
77
77
|
.ui-stat--good .ui-stat__trend { color: var(--chip-success-ink); }
|
|
78
78
|
.ui-stat--bad .ui-stat__trend { color: var(--chip-danger-ink); }
|
|
@@ -82,7 +82,7 @@
|
|
|
82
82
|
margin is under it because it leads the row. */
|
|
83
83
|
.ui-stats__basis {
|
|
84
84
|
margin: 0 0 var(--space-5);
|
|
85
|
-
color: var(--
|
|
85
|
+
color: var(--text);
|
|
86
86
|
font-size: var(--text-xs);
|
|
87
87
|
line-height: var(--leading-snug);
|
|
88
88
|
}
|
package/src/styles/success.css
CHANGED
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
position: relative;
|
|
20
20
|
overflow: hidden;
|
|
21
21
|
border-radius: 20px;
|
|
22
|
-
background: var(--bg-elevated); /* the
|
|
22
|
+
background: var(--bg-elevated); --ring-gap: var(--bg-elevated); /* Elevated surface for the confirmation and its actions. */
|
|
23
23
|
border: 1px solid var(--border);
|
|
24
24
|
isolation: isolate;
|
|
25
25
|
}
|
|
@@ -64,7 +64,7 @@
|
|
|
64
64
|
letter-spacing: -.02em; line-height: 1.2; margin: 0;
|
|
65
65
|
}
|
|
66
66
|
.ui-sx__body {
|
|
67
|
-
color: var(--
|
|
67
|
+
color: var(--text); font-size: var(--text-base); line-height: 1.6; margin: 9px 0 0; max-width: var(--prose-caption);
|
|
68
68
|
}
|
|
69
69
|
.ui-sx__actions { display: flex; flex-wrap: wrap; gap: 10px; margin-top: 20px; }
|
|
70
70
|
|
|
@@ -82,7 +82,7 @@
|
|
|
82
82
|
}
|
|
83
83
|
.ui-sx--split .ui-sx__visual {
|
|
84
84
|
display: grid; place-items: center; padding: 40px 24px;
|
|
85
|
-
background: color-mix(in srgb, var(--green) 8%, transparent);
|
|
85
|
+
background: color-mix(in srgb, var(--green) 8%, transparent); /* ring-gap: inherit — decorative illustration has no nested focus target. */
|
|
86
86
|
border-right: 1px solid var(--border);
|
|
87
87
|
}
|
|
88
88
|
.ui-sx--split .ui-sx__check { width: 120px; height: 120px; }
|
|
@@ -160,14 +160,14 @@
|
|
|
160
160
|
.ui-sx--hero .ui-sx__count { justify-content: center; }
|
|
161
161
|
.ui-sx__count-ring {
|
|
162
162
|
flex: none; width: 16px; height: 16px; border-radius: 50%;
|
|
163
|
-
background: conic-gradient(var(--green) var(--sx-a, 360deg), var(--surface-2) 0);
|
|
163
|
+
background: conic-gradient(var(--green) var(--sx-a, 360deg), var(--surface-2) 0); /* ring-gap: inherit — decorative or text-only surface has no nested focus target. */
|
|
164
164
|
mask: radial-gradient(circle, transparent 5px, #000 6px);
|
|
165
165
|
-webkit-mask: radial-gradient(circle, transparent 5px, #000 6px);
|
|
166
166
|
animation: ui-sx-sweep var(--sx-secs, 5s) linear forwards; /* motion: ambient — the caller sets the countdown; the ring just spends it */
|
|
167
167
|
}
|
|
168
168
|
@keyframes ui-sx-sweep { from { --sx-a: 360deg; } to { --sx-a: 0deg; } }
|
|
169
|
-
.ui-sx__count-text { color: var(--
|
|
170
|
-
.ui-sx__count-text b { color: var(--
|
|
169
|
+
.ui-sx__count-text { color: var(--text); font-size: var(--text-sm); }
|
|
170
|
+
.ui-sx__count-text b { color: var(--text); font-weight: var(--weight-semibold); font-variant-numeric: tabular-nums; }
|
|
171
171
|
|
|
172
172
|
/* ---- Reduced motion — static check, no burst / confetti / sweep ---------- */
|
|
173
173
|
@media (prefers-reduced-motion: reduce) {
|
|
@@ -176,7 +176,7 @@
|
|
|
176
176
|
.ui-sx__tick { animation: none; stroke-dashoffset: 0; }
|
|
177
177
|
.ui-sx__ring { display: none; }
|
|
178
178
|
.ui-sx__confetti { display: none; }
|
|
179
|
-
.ui-sx__count-ring { animation: none; background: var(--surface-2); }
|
|
179
|
+
.ui-sx__count-ring { animation: none; background: var(--surface-2); /* ring-gap: inherit — decorative or text-only surface has no nested focus target. */ }
|
|
180
180
|
}
|
|
181
181
|
|
|
182
182
|
/* ---- Narrow — split stacks -------------------------------------------- */
|
package/src/styles/table.css
CHANGED
|
@@ -13,14 +13,14 @@
|
|
|
13
13
|
/* rank: label */
|
|
14
14
|
font-size: var(--text-sm);
|
|
15
15
|
font-weight: var(--weight-medium);
|
|
16
|
-
color: var(--
|
|
16
|
+
color: var(--text);
|
|
17
17
|
padding: 0 var(--space-4) var(--space-3) 0;
|
|
18
18
|
border-bottom: 1px solid var(--border);
|
|
19
19
|
}
|
|
20
20
|
.ui-table td {
|
|
21
21
|
padding: var(--space-4) var(--space-4) var(--space-4) 0;
|
|
22
22
|
border-bottom: 1px solid var(--border);
|
|
23
|
-
color: var(--
|
|
23
|
+
color: var(--text);
|
|
24
24
|
vertical-align: middle;
|
|
25
25
|
white-space: nowrap;
|
|
26
26
|
}
|
|
@@ -28,7 +28,7 @@
|
|
|
28
28
|
.ui-table td.ui-table__title { color: var(--strong); font-weight: var(--weight-medium); width: 99%; white-space: normal; }
|
|
29
29
|
.ui-table th:last-child,
|
|
30
30
|
.ui-table td.ui-table__act { padding-right: 0; text-align: right; }
|
|
31
|
-
.ui-table tr.is-dead td { color: var(--muted); }
|
|
31
|
+
.ui-table tr.is-dead td { /* muted-ink: state — revoked row */ color: var(--muted); }
|
|
32
32
|
.ui-table tr.is-dead td.ui-table__title { text-decoration: line-through; }
|
|
33
33
|
.ui-table tbody tr { transition: background var(--dur-fast) var(--ease); }
|
|
34
34
|
|
|
@@ -42,7 +42,7 @@
|
|
|
42
42
|
border-spacing: 0;
|
|
43
43
|
padding: 0 var(--space-2);
|
|
44
44
|
}
|
|
45
|
-
.ui-table--hover:not(.ui-table--zebra) tbody tr:hover td { background: var(--surface-2); }
|
|
45
|
+
.ui-table--hover:not(.ui-table--zebra) tbody tr:hover td { background: var(--surface-2); --ring-gap: var(--surface-2); }
|
|
46
46
|
.ui-table--hover:not(.ui-table--zebra) tbody tr:hover td:first-child {
|
|
47
47
|
border-top-left-radius: var(--radius-sm); border-bottom-left-radius: var(--radius-sm); }
|
|
48
48
|
.ui-table--hover:not(.ui-table--zebra) tbody tr:hover td:last-child {
|
|
@@ -63,7 +63,7 @@
|
|
|
63
63
|
|
|
64
64
|
.ui-table--zebra th { border-bottom-width: 2px; }
|
|
65
65
|
.ui-table--zebra td { border-bottom: 0; }
|
|
66
|
-
.ui-table--zebra tbody tr:nth-child(even) td { background: var(--surface-2); }
|
|
66
|
+
.ui-table--zebra tbody tr:nth-child(even) td { background: var(--surface-2); --ring-gap: var(--surface-2); }
|
|
67
67
|
/* The stripe stays full-bleed (the #71 inset above is hover only), but it only reads right
|
|
68
68
|
* if the end cells are inset from the tint's own edge, and `.ui-table td` sets
|
|
69
69
|
* `padding-left: 0`. Only `--dense` supplied that inset, so `--zebra` without `--dense` —
|
|
@@ -74,12 +74,12 @@
|
|
|
74
74
|
.ui-table--zebra th:last-child,
|
|
75
75
|
.ui-table--zebra td:last-child { padding-right: var(--space-3); }
|
|
76
76
|
.ui-table--zebra.ui-table--hover tbody tr:hover td,
|
|
77
|
-
.ui-table--zebra tbody tr:hover td { background: color-mix(in srgb, var(--accent) 8%, transparent); }
|
|
77
|
+
.ui-table--zebra tbody tr:hover td { --ring-gap: inherit; background: color-mix(in srgb, var(--accent) 8%, transparent); /* ring-gap: inherit — translucent wash retains the opaque containing gap. */ }
|
|
78
78
|
|
|
79
79
|
.ui-table__num { text-align: right; font-variant-numeric: tabular-nums; }
|
|
80
80
|
.ui-table th.ui-table__num { text-align: right; }
|
|
81
81
|
.ui-table__num--strong { color: var(--strong); font-weight: var(--weight-semibold); }
|
|
82
|
-
.ui-table__code { font-family: var(--font-mono); font-size: var(--text-sm); color: var(--
|
|
82
|
+
.ui-table__code { font-family: var(--font-mono); font-size: var(--text-sm); color: var(--text); }
|
|
83
83
|
|
|
84
84
|
/* The empty state (.ui-empty) — shown when a table/list has no rows — now
|
|
85
85
|
lives in styles/empty.css as a standalone component (illustration support). */
|