@apliteni/apliteni-ui 0.94.0 → 0.96.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.
@@ -17,14 +17,18 @@
17
17
  font-size: calc(var(--text-sm) - 0.5px);
18
18
  font-weight: 500;
19
19
  color: var(--text);
20
- background: var(--surface); /* ring-gap: inherit — control paint; its focus indicator uses the containing surface. */
20
+ background: var(--surface); /* code-bg: inherit — control paint; the containing surface is the ground, for a chip and for a band alike. */
21
21
  border: 1px solid var(--border);
22
22
  border-radius: var(--radius-pill);
23
23
  padding: 7px 11px 7px 13px;
24
24
  transition: border-color var(--dur-fast) var(--ease), background var(--dur-fast) var(--ease);
25
25
  }
26
- .ui-dropdown__trigger:hover { border-color: var(--accent); }
27
- .ui-dropdown__trigger:focus-visible { outline: 2px solid transparent; box-shadow: var(--ring); border-color: var(--accent); }
26
+ /* The hover edge steps aside under the band: an accent edge one pixel inside an
27
+ accent band is the second band #578 round r34 took off the focus rules, and a
28
+ pointer resting on a focused control would put it back. One indicator, which is
29
+ what the kit's rows already chose. why: docs/foundations.md#the-focus-ring */
30
+ .ui-dropdown__trigger:hover:not(:focus-visible) { border-color: var(--accent); }
31
+ .ui-dropdown__trigger:focus-visible { outline: var(--ring); outline-offset: var(--ring-offset); }
28
32
  .ui-dropdown__pre { color: var(--text); }
29
33
  .ui-dropdown__value { color: var(--strong); font-weight: 600; letter-spacing: 0.01em; }
30
34
 
@@ -52,6 +56,12 @@
52
56
  the portal's JS, so an upward panel cannot drift from a downward one.
53
57
  why: docs/components.md#the-dropdown-panel */
54
58
  --ui-dropdown-gap: 9px;
59
+ /* The least a panel keeps between itself and the edge of the view it is laid out
60
+ in. The wiring reads it off the panel and moves the panel along the inline axis
61
+ when the edge `align` asked for does not fit; a page wanting a panel flush with
62
+ the screen's edge sets it to 0.
63
+ why: docs/components.md#the-dropdown-panel */
64
+ --ui-dropdown-edge: 8px;
55
65
  /* Named for the same reason the offset is: a block pinned to an edge has to
56
66
  bleed back through it, and #306 is a page copying the number by hand.
57
67
  why: docs/components.md#the-dropdown-panel */
@@ -68,9 +78,27 @@
68
78
  top: calc(100% + var(--ui-dropdown-gap));
69
79
  left: 0;
70
80
  min-width: 240px;
81
+ /* …and no wider than the view it is laid out in, less the keep-out it owes each
82
+ edge. This bound is what holds a PORTALLED panel: that one is `position: fixed`,
83
+ so the room beside its own offsets is the whole view and a shrink-to-fit box
84
+ takes all of it — measured at 390px on a 390px screen with this line gone.
85
+ The floor above wins where the two disagree, which is a view under 2 × edge +
86
+ 240. The wiring writes the property off the LAYOUT viewport; the fallback is
87
+ for a page whose JS has not run, and is a classic scrollbar's width too
88
+ generous, because `100vw` counts a scrollbar the panel's own box does not.
89
+ why: docs/components.md#the-dropdown-panel */
90
+ max-width: var(--ui-dropdown-ceiling, calc(100vw - 2 * var(--ui-dropdown-edge)));
91
+ /* And this is what holds an IN-PLACE one, whose room is its trigger's block: a
92
+ shrink-to-fit box is its min-content wide at the least, and one 70-character
93
+ token's min-content was 508px on a 390px screen. Breaking anywhere takes that
94
+ to one character, so the panel settles on the floor above — and keeps the token
95
+ inside its own box, since overflowing inline text widens the page whatever the
96
+ box says. The treatment a filter row's panels and the rail's account block
97
+ already take. why: src/styles/filter-bar.css */
98
+ overflow-wrap: anywhere;
71
99
  /* The floating step, not the sunken one — a panel held open over a card cannot be
72
100
  painted the colour of an inset. why: docs/foundations.md#elevation */
73
- background: var(--bg-elevated); --ring-gap: var(--bg-elevated);
101
+ background: var(--bg-elevated);
74
102
  /* The two-step edge and the drop, through the level's own names: in DARK that is
75
103
  --border-strong outside and --border one pixel inside it, then the drop; in LIGHT
76
104
  both lines are transparent and the drop carries the whole separation.
@@ -101,10 +129,10 @@
101
129
  author rule — so `.is-scroll` took the browser's outline, black in light mode.
102
130
  #457 refused that, and #487's review measured it here. Written for every panel
103
131
  rather than the scrolling one, as the palette and the drawer write it, because
104
- a panel that takes focus any other way has the same claim on the ring. The
105
- ring is COMPOSED with the floating treatment rather than over it: a box-shadow
106
- list replaces the whole list. why: docs/foundations.md#elevation */
107
- .ui-dropdown__panel:focus-visible { outline: 2px solid transparent; box-shadow: var(--ring), inset 0 0 0 1px var(--elev-edge, var(--float-edge-inner)), var(--elev-drop); }
132
+ a panel that takes focus any other way has the same claim on the ring. The ring
133
+ is an outline since #578, so it leaves the box-shadow list that carries the panel's
134
+ edge and its drop standing. why: docs/foundations.md#elevation */
135
+ .ui-dropdown__panel:focus-visible { outline: var(--ring); outline-offset: var(--ring-offset); }
108
136
 
109
137
  /* Opening upward. The kit releases its own `top` here so that nothing outside
110
138
  the kit has to: an absolute box with both edges pinned is stretched between
@@ -172,9 +200,12 @@
172
200
  color: var(--text);
173
201
  transition: background var(--dur-fast) var(--ease);
174
202
  }
175
- /* Rows keep a reading surface; hover adds an edge. why: docs/foundations.md#elevation */
176
- .ui-dropdown__item:hover { outline: 1px solid var(--control-edge); outline-offset: -1px; background: var(--surface); /* ring-gap: inherit — control paint; its focus indicator uses the containing surface. */ }
177
- .ui-dropdown__item:focus-visible { outline: 2px solid transparent; background: var(--surface); /* ring-gap: inherit — control paint; its focus indicator uses the containing surface. */ box-shadow: var(--ring); }
203
+ /* Rows keep a reading surface; hover adds an edge. A row that is hovered AND focused
204
+ draws the ring and not the hover edge — both are outlines now, and the focus rule
205
+ comes later — which is one indicator rather than two.
206
+ why: docs/foundations.md#elevation */
207
+ .ui-dropdown__item:hover { outline: 1px solid var(--control-edge); outline-offset: -1px; background: var(--surface); /* code-bg: inherit — control paint; the containing surface is the ground, for a chip and for a band alike. */ }
208
+ .ui-dropdown__item:focus-visible { background: var(--surface); /* code-bg: inherit — control paint; the containing surface is the ground, for a chip and for a band alike. */ outline: var(--ring); outline-offset: var(--ring-offset); }
178
209
  .ui-dropdown__main { display: flex; flex-direction: column; gap: 2px; min-width: 0; }
179
210
  .ui-dropdown__label { font-family: var(--font-sans); font-size: calc(var(--text-sm) - 0.5px); color: var(--strong); font-weight: 600; letter-spacing: 0.01em; }
180
211
  .ui-dropdown__desc { font-size: var(--text-xs); color: var(--text); line-height: 1.35; }
@@ -200,11 +231,11 @@
200
231
  margin-left: auto;
201
232
  flex: none;
202
233
  color: var(--text);
203
- background: color-mix(in srgb, var(--muted) 12%, transparent); /* ring-gap: inherit — decorative or text-only surface has no nested focus target. */
234
+ background: color-mix(in srgb, var(--muted) 12%, transparent); /* code-bg: inherit — decorative or text-only paint; nothing nested reads a ground from it. */
204
235
  }
205
- .ui-dropdown__badge.is-live { color: var(--chip-success-ink); background: var(--chip-success-fill); /* ring-gap: inherit — decorative or text-only surface has no nested focus target. */ }
236
+ .ui-dropdown__badge.is-live { color: var(--chip-success-ink); background: var(--chip-success-fill); /* code-bg: inherit — decorative or text-only paint; nothing nested reads a ground from it. */ }
206
237
  :root[data-theme="light"] .ui-dropdown__badge:not(.is-live) {
207
- background: color-mix(in srgb, var(--muted) 15%, transparent); /* ring-gap: inherit — decorative or text-only surface has no nested focus target. */
238
+ background: color-mix(in srgb, var(--muted) 15%, transparent); /* code-bg: inherit — decorative or text-only paint; nothing nested reads a ground from it. */
208
239
  }
209
240
 
210
241
  /* Disabled + danger rows */
@@ -276,7 +307,7 @@
276
307
  font-size: calc(var(--text-sm) - 0.5px);
277
308
  color: var(--strong);
278
309
  /* The ground and line .ui-input takes. why: docs/foundations.md#elevation */
279
- background: var(--field-bg); /* ring-gap: inherit — control paint; its focus indicator uses the containing surface. */
310
+ background: var(--field-bg); /* code-bg: inherit — control paint; the containing surface is the ground, for a chip and for a band alike. */
280
311
  border: 1px solid var(--field-edge);
281
312
  border-radius: var(--radius-sm);
282
313
  padding: 8px 12px 8px 34px;
@@ -291,7 +322,7 @@
291
322
 
292
323
  .ui-dropdown__search-input::placeholder { /* muted-ink: placeholder — empty search field */ color: var(--muted); }
293
324
  .ui-dropdown__search-input:hover { border-color: var(--field-edge-hover); }
294
- .ui-dropdown__search-input:focus-visible { outline: 2px solid transparent; border-color: var(--accent); box-shadow: var(--ring); }
325
+ .ui-dropdown__search-input:focus-visible { outline: var(--ring); outline-offset: var(--ring-offset); }
295
326
 
296
327
  .ui-dropdown__list { max-height: 300px; overflow-y: auto; }
297
328
  /* Rows are `role="option" tabindex="-1"`, so the LIST takes the keyboard stop and
@@ -304,9 +335,12 @@
304
335
  query hides is put away here. */
305
336
  .ui-dropdown__list [hidden] { display: none; } /* motion: still — a row the query no longer matches is gone on the next keystroke */
306
337
 
307
- /* The row Enter would pick. Focus stays in the field, which carries the ring,
308
- so this row takes the hover fill and a bar rather than a second ring. */
309
- .ui-dropdown__item.is-active { background: var(--surface); /* ring-gap: inherit — control paint; its focus indicator uses the containing surface. */ box-shadow: inset 2px 0 0 var(--accent); }
338
+ /* The row Enter would pick. Focus stays in the field, which carries the ring, so this
339
+ row is marked by its fill alone — the inset accent bar beside it was an edge on a
340
+ selected row, which #578 round r34 took off every selected state. --surface-2, not
341
+ --surface: the panel is --bg-elevated, which --surface matches exactly in light, so
342
+ the bar had been the whole mark there. 1.183:1 in light, 1.234:1 in dark. */
343
+ .ui-dropdown__item.is-active { background: var(--surface-2); /* code-bg: inherit — control paint; the containing surface is the ground, for a chip and for a band alike. */ }
310
344
 
311
345
  /* No match — a nudge and no action, per Guidelines / Microcopy. Empty while
312
346
  anything matches, so it takes no room. */
@@ -66,7 +66,7 @@
66
66
  /* The composer panel (bottom-centre) */
67
67
  .ui-fbcomposer {
68
68
  position: fixed; z-index: 71; left: 50%; bottom: 26px; transform: translateX(-50%) translateY(14px);
69
- width: min(520px, calc(100vw - 32px)); background: var(--bg-elevated); --ring-gap: var(--bg-elevated); border-radius: 18px;
69
+ width: min(520px, calc(100vw - 32px)); background: var(--bg-elevated); border-radius: 18px;
70
70
  /* The shadow was its only edge until #295, which replaced it with the hairline; since
71
71
  #490 light is back on the drop and dark keeps the line.
72
72
  why: docs/foundations.md#elevation */
@@ -80,31 +80,31 @@
80
80
  .ui-fbc__head { display: flex; align-items: center; gap: 12px; padding: 17px 20px 0; }
81
81
  .ui-fbc__chip { display: inline-flex; align-items: center; gap: 8px; color: var(--accent); font-size: var(--text-sm); font-weight: var(--weight-semibold); letter-spacing: .01em; white-space: nowrap; min-width: 0; overflow: hidden; text-overflow: ellipsis; }
82
82
  .ui-fbc__chip svg { width: 14px; height: 14px; flex: none; opacity: .85; stroke-width: 2.7; }
83
- .ui-fbc__x { margin-left: auto; background: var(--surface); /* ring-gap: inherit — control paint; its focus indicator uses the containing surface. */ /* muted-ink: glyph — dismiss icon */ color: var(--dim); border: 0; width: 28px; height: 28px; border-radius: 8px; cursor: pointer; display: grid; place-items: center; flex: none; font: inherit; }
83
+ .ui-fbc__x { margin-left: auto; background: var(--surface); /* code-bg: inherit — control paint; the containing surface is the ground, for a chip and for a band alike. */ /* muted-ink: glyph — dismiss icon */ color: var(--dim); border: 0; width: 28px; height: 28px; border-radius: 8px; cursor: pointer; display: grid; place-items: center; flex: none; font: inherit; }
84
84
  .ui-fbc__x:hover { color: var(--strong); }
85
- .ui-fbc__x:focus-visible { outline: 2px solid transparent; box-shadow: var(--ring); }
85
+ .ui-fbc__x:focus-visible { outline: var(--ring); outline-offset: var(--ring-offset); }
86
86
  .ui-fbc__x svg { width: 14px; height: 14px; stroke-width: 2.7; }
87
- .ui-fbc__quote { margin: 14px 20px 0; background: var(--surface); /* ring-gap: inherit — decorative or text-only surface has no nested focus target. */ border-radius: 12px; padding: 12px 15px; display: flex; gap: 11px; }
87
+ .ui-fbc__quote { margin: 14px 20px 0; background: var(--surface); /* code-bg: inherit — decorative or text-only paint; nothing nested reads a ground from it. */ border-radius: 12px; padding: 12px 15px; display: flex; gap: 11px; }
88
88
  .ui-fbc__qm { color: var(--accent); font-size: var(--text-xl); font-weight: var(--weight-bold); line-height: .9; flex: none; opacity: .55; }
89
89
  .ui-fbc__quote q { quotes: none; color: var(--text); font-style: italic; font-size: calc(var(--text-sm) + 0.5px); line-height: 1.55; }
90
90
  .ui-fbc__body { padding: 14px 20px 0; }
91
91
  .ui-fbcomposer textarea {
92
92
  width: 100%; min-height: 96px; resize: vertical; font-family: var(--font-sans); font-size: var(--text-base); line-height: 1.55;
93
- color: var(--strong); background: var(--surface); /* ring-gap: inherit — control paint; its focus indicator uses the containing surface. */ border: 1px solid var(--field-edge); border-radius: 12px; padding: 13px 15px; transition: box-shadow var(--dur-fast) var(--ease);
93
+ 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. */ border: 1px solid var(--field-edge); border-radius: 12px; padding: 13px 15px; transition: box-shadow var(--dur-fast) var(--ease);
94
94
  }
95
95
  .ui-fbcomposer textarea::placeholder { /* muted-ink: placeholder — empty feedback field */ color: var(--muted); }
96
- .ui-fbcomposer textarea:focus-visible { outline: 2px solid transparent; box-shadow: var(--ring); }
96
+ .ui-fbcomposer textarea:focus-visible { outline: var(--ring); outline-offset: var(--ring-offset); }
97
97
  .ui-fbc__foot { display: flex; align-items: center; justify-content: flex-end; gap: 12px; padding: 16px 20px 18px; }
98
98
 
99
99
  .ui-fbbtn { font-family: var(--font-sans); font-size: calc(var(--text-sm) + 0.5px); font-weight: var(--weight-semibold); border-radius: 10px; padding: 9px 17px; cursor: pointer; border: 0; transition: filter var(--dur-fast) var(--ease), background var(--dur-fast) var(--ease), color var(--dur-fast) var(--ease); }
100
100
  .ui-fbbtn.ghost { background: transparent; color: var(--text); }
101
- .ui-fbbtn.ghost:hover { color: var(--strong); background: var(--surface); /* ring-gap: inherit — control paint; its focus indicator uses the containing surface. */ }
102
- .ui-fbbtn:focus-visible { outline: 2px solid transparent; box-shadow: var(--ring); }
101
+ .ui-fbbtn.ghost: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. */ }
102
+ .ui-fbbtn:focus-visible { outline: var(--ring); outline-offset: var(--ring-offset); }
103
103
  .ui-fbbtn.primary { background: var(--accent-strong); color: var(--accent-contrast); display: inline-flex; align-items: center; gap: 9px; }
104
104
  .ui-fbbtn.primary:hover { filter: brightness(1.08); }
105
105
  /* Same flat pair as .ui-btn:disabled, for the same reason (#220). */
106
106
  .ui-fbbtn.primary:disabled {
107
- background: var(--disabled-surface); /* ring-gap: inherit — control paint; its focus indicator uses the containing surface. */
107
+ background: var(--disabled-surface); /* code-bg: inherit — control paint; the containing surface is the ground, for a chip and for a band alike. */
108
108
  /* muted-ink: state — unavailable control */ color: var(--disabled-ink);
109
109
  cursor: default;
110
110
  filter: none;
@@ -114,7 +114,7 @@
114
114
  @keyframes uiFbSpin { to { transform: rotate(360deg); } }
115
115
 
116
116
  /* Success state */
117
- .ui-fbc__done { padding: 30px 26px 24px; text-align: center; background: radial-gradient(112% 60% at 50% 0%, var(--glow-green), transparent 62%); /* ring-gap: inherit — translucent wash retains the opaque containing gap. */ }
117
+ .ui-fbc__done { padding: 30px 26px 24px; text-align: center; background: radial-gradient(112% 60% at 50% 0%, var(--glow-green), transparent 62%); /* code-bg: inherit — a wash paints over a ground and behind a chip, so the opaque ground below it is the step. */ }
118
118
  .ui-fbc__ck { width: 88px; height: 88px; margin: 0 auto 13px; display: grid; place-items: center; }
119
119
  .ui-fbck { width: 88px; height: 88px; overflow: visible; display: block; transform-origin: center; animation: uiFbCkSpring 1s cubic-bezier(.22,1,.3,1) both; } /* motion: choreographed — the frame the mark and the comet are timed against */
120
120
  .ui-fbck-t { fill: none; stroke: var(--surface); stroke-width: 9; stroke-linecap: round; stroke-linejoin: round; }
@@ -129,7 +129,7 @@
129
129
  @keyframes uiFbCkSpring { 0% { transform: scale(1.32); } 62% { transform: scale(.965); } 82% { transform: scale(1.02); } 100% { transform: scale(1); } }
130
130
 
131
131
  /* Error banner */
132
- .ui-fbc__err { margin: 14px 20px 0; background: color-mix(in srgb, var(--pink) 14%, transparent); /* ring-gap: inherit — text-only validation message has no nested focus target. */ color: var(--pink); font-size: var(--text-sm); padding: 11px 15px; border-radius: 11px; display: none; }
132
+ .ui-fbc__err { margin: 14px 20px 0; background: color-mix(in srgb, var(--pink) 14%, transparent); /* code-bg: inherit — text-only validation message has no nested focus target. */ color: var(--pink); font-size: var(--text-sm); padding: 11px 15px; border-radius: 11px; display: none; }
133
133
  .ui-fbc__err.show { display: block; }
134
134
  /* A failed send's line fades in; wireFeedback() adds the class as it shows it. */
135
135
  .ui-fbc__err.is-entering { animation: m-fade var(--dur-fast) var(--ease-out) both; }
@@ -58,7 +58,7 @@
58
58
  width: 100%;
59
59
  height: 6px;
60
60
  border-radius: var(--radius-pill);
61
- background: var(--surface-2); /* ring-gap: inherit — a progress track holds no focus target. */
61
+ background: var(--surface-2); /* code-bg: inherit — a progress track holds no focus target. */
62
62
  overflow: hidden;
63
63
  }
64
64
  .ui-drop__bar span { display: block; height: 100%; background: var(--accent); }
@@ -73,7 +73,7 @@
73
73
  padding: var(--space-3);
74
74
  border: 1px dashed var(--accent);
75
75
  border-radius: var(--radius-md);
76
- background: var(--surface); /* ring-gap: inherit — the target is painted while a file is over the region and holds no focus target. */
76
+ background: var(--surface); /* code-bg: inherit — the target is painted while a file is over the region and holds no focus target. */
77
77
  color: var(--strong);
78
78
  font-size: var(--text-sm);
79
79
  text-align: center;
@@ -4,7 +4,7 @@
4
4
  .ui-filter-bar__chip .ui-dropdown__trigger { border: 0; background: transparent; padding: var(--space-1) var(--space-2); }
5
5
  .ui-filter-bar__remove { border: 0; background: transparent; color: var(--text); font: inherit; text-align: center; font-size: var(--text-lg); padding: 0; min-width: 24px; min-height: 24px; border-radius: var(--radius-xs); cursor: pointer; }
6
6
  .ui-filter-bar__remove:focus-visible,
7
- .ui-filter-bar:focus-visible { outline: 2px solid transparent; box-shadow: var(--ring); }
7
+ .ui-filter-bar:focus-visible { outline: var(--ring); outline-offset: var(--ring-offset); }
8
8
  .ui-filter-bar button:disabled { /* muted-ink: state — disabled filters */ color: var(--disabled-ink); cursor: not-allowed; }
9
9
 
10
10
  .ui-filter-bar .ui-dropdown__value { color: inherit; }
@@ -69,18 +69,20 @@
69
69
  check is what identifies the state under WCAG 1.4.1; Apple, Material, Carbon,
70
70
  Primer and Radix all tick a chosen menu row. #549
71
71
  why: docs/components.md#a-filter-row-holds-its-panels */
72
- .ui-filter-bar .ui-dropdown__item.is-selected { background: var(--glow-purple); /* ring-gap: inherit — translucent wash retains the opaque containing gap. */ }
72
+ .ui-filter-bar .ui-dropdown__item.is-selected { background: var(--glow-purple); /* code-bg: inherit — a translucent wash moves the ground, not the chip on it. */ }
73
73
  /* Kit-wide a chosen label steps down to --text, which left the row in force the
74
74
  faintest in the panel. Under the wash it holds --strong. */
75
75
  .ui-filter-bar .ui-dropdown__item.is-selected .ui-dropdown__label { color: var(--strong); }
76
- /* The keyboard cursor and focus each set an opaque --surface, which would take the
77
- wash off; restated here so the guarantee is one declaration a reader and
78
- filter-selected-mark.test.js can both find, and each still reads by its own paint.
76
+ /* Focus sets an opaque --surface, which would take the wash off; restated here so
77
+ the guarantee is one declaration a reader and filter-selected-mark.test.js can
78
+ both find. Focus still reads by its own paint — the kit's band, which #578 made a
79
+ real outline a pixel off the row.
79
80
  why: guidelines/accessibility-floor.md#measurable-pairs */
80
- .ui-filter-bar .ui-dropdown__item.is-selected:focus-visible,
81
- .ui-filter-bar .ui-dropdown__item.is-selected.is-active { background: var(--glow-purple); /* ring-gap: inherit — translucent wash retains the opaque containing gap. */ }
81
+ .ui-filter-bar .ui-dropdown__item.is-selected:focus-visible { background: var(--glow-purple); /* code-bg: inherit — a translucent wash moves the ground, not the chip on it. */ }
82
82
  /* Hover's other paint is a 1px edge, 1.06:1 on the wash, which left the row in force
83
83
  the one row a pointer got no answer from. Selection is a background highlight, so
84
84
  hover deepens it: 9% more accent, the step .ui-table--zebra gives a hovered row.
85
+ The arrow keys need nothing here: ddSetActive() writes no .is-active without a search
86
+ field and filterBar() builds none, so an arrow key moves real focus instead. #578
85
87
  why: docs/components.md#a-filter-row-holds-its-panels */
86
- .ui-filter-bar .ui-dropdown__item.is-selected:hover { background: color-mix(in srgb, var(--glow-purple), var(--accent) 9%); /* ring-gap: inherit — translucent wash retains the opaque containing gap. */ }
88
+ .ui-filter-bar .ui-dropdown__item.is-selected:hover { background: color-mix(in srgb, var(--glow-purple), var(--accent) 9%); /* code-bg: inherit — a translucent wash moves the ground, not the chip on it. */ }
@@ -14,7 +14,7 @@
14
14
  --footer-title: var(--strong);
15
15
  --footer-text: var(--text);
16
16
 
17
- background: var(--footer-surface); /* ring-gap: inherit — transparent footer inherits; the app variant composes its opaque surface. */
17
+ background: var(--footer-surface); /* code-bg: inherit — transparent footer inherits; the app variant composes its opaque surface. */
18
18
  border-top: 1px solid var(--footer-border);
19
19
  color: var(--footer-text);
20
20
  font-family: var(--font-sans);
@@ -55,14 +55,19 @@
55
55
  border-radius: 10px;
56
56
  border: 1px solid var(--footer-border);
57
57
  color: var(--footer-link);
58
- background: var(--surface); /* ring-gap: inherit — control paint; its focus indicator uses the containing surface. */
58
+ background: var(--surface); /* code-bg: inherit — control paint; the containing surface is the ground, for a chip and for a band alike. */
59
59
  transition:
60
60
  color var(--dur-fast) var(--ease),
61
61
  border-color var(--dur-fast) var(--ease),
62
62
  transform var(--dur-fast) var(--ease);
63
63
  }
64
- .ui-footer__social:hover { color: var(--accent); border-color: var(--accent); transform: translateY(-1px); }
65
- .ui-footer__social:focus-visible { outline: 2px solid transparent; box-shadow: var(--ring); }
64
+ .ui-footer__social:hover { color: var(--accent); transform: translateY(-1px); }
65
+ /* The hover edge steps aside under the band: an accent edge one pixel inside an
66
+ accent band is the second band #578 round r34 took off the focus rules, and a
67
+ pointer resting on a focused control would put it back. One indicator, which is
68
+ what the kit's rows already chose. why: docs/foundations.md#the-focus-ring */
69
+ .ui-footer__social:hover:not(:focus-visible) { border-color: var(--accent); }
70
+ .ui-footer__social:focus-visible { outline: var(--ring); outline-offset: var(--ring-offset); }
66
71
  .ui-footer__social svg { width: 17px; height: 17px; display: block; }
67
72
 
68
73
  /* Link columns */
@@ -86,7 +91,7 @@
86
91
  transition: color var(--dur-fast) var(--ease);
87
92
  }
88
93
  .ui-footer__links a:hover { color: var(--footer-link-hover); }
89
- .ui-footer__links a:focus-visible { outline: 2px solid transparent; box-shadow: var(--ring); border-radius: var(--radius-xs); }
94
+ .ui-footer__links a:focus-visible { outline: var(--ring); outline-offset: var(--ring-offset); border-radius: var(--radius-xs); }
90
95
 
91
96
  /* Legal bar — shared by every variant */
92
97
  .ui-footer__bar {
@@ -104,7 +109,7 @@
104
109
  .ui-footer__legal-links { display: flex; gap: 22px; flex-wrap: wrap; }
105
110
  .ui-footer__legal-links a { color: var(--footer-link); text-decoration: none; transition: color var(--dur-fast) var(--ease); }
106
111
  .ui-footer__legal-links a:hover { color: var(--footer-link-hover); }
107
- .ui-footer__legal-links a:focus-visible { outline: 2px solid transparent; box-shadow: var(--ring); border-radius: var(--radius-xs); }
112
+ .ui-footer__legal-links a:focus-visible { outline: var(--ring); outline-offset: var(--ring-offset); border-radius: var(--radius-xs); }
108
113
  .ui-footer__switcher { display: inline-flex; align-items: center; gap: 12px; margin-left: auto; }
109
114
 
110
115
  /* slim — a single legal row, no divider above it. */
@@ -113,7 +118,7 @@
113
118
 
114
119
  /* app — compact, in-product: surface background + tighter padding. */
115
120
  .ui-footer--app {
116
- --footer-surface: var(--surface); --ring-gap: var(--footer-surface);
121
+ --footer-surface: var(--surface);
117
122
  border-top: 1px solid var(--footer-border);
118
123
  }
119
124
  .ui-footer--app .ui-footer__in { max-width: none; padding: 12px clamp(14px, 2.4vw, 22px); }
@@ -25,7 +25,7 @@
25
25
  color: var(--strong);
26
26
  /* Fields use the card surface and an edge in both themes.
27
27
  why: docs/foundations.md#elevation */
28
- background: var(--field-bg); /* ring-gap: inherit — control paint; its focus indicator uses the containing surface. */
28
+ background: var(--field-bg); /* code-bg: inherit — control paint; the containing surface is the ground, for a chip and for a band alike. */
29
29
  border: 1px solid var(--field-edge);
30
30
  border-radius: var(--radius-md);
31
31
  padding: 12px 15px;
@@ -38,12 +38,16 @@
38
38
  .ui-textarea:hover,
39
39
  .ui-select:hover { border-color: var(--field-edge-hover); }
40
40
 
41
+ /* The band and nothing beside it. Recolouring the field's own 1px edge to the
42
+ accent drew a SECOND accent band one pixel inside the first, and the unpainted
43
+ pixel between them read as a halo on the light ground — which is the glow Artur
44
+ rejected on #578 round r34. The edge keeps its resting ink.
45
+ why: docs/foundations.md#the-focus-ring */
41
46
  .ui-input:focus-visible,
42
47
  .ui-textarea:focus-visible,
43
48
  .ui-select:focus-visible {
44
- outline: 2px solid transparent;
45
- border-color: var(--accent);
46
- box-shadow: var(--ring);
49
+ outline: var(--ring);
50
+ outline-offset: var(--ring-offset);
47
51
  }
48
52
 
49
53
  .ui-input::placeholder,
@@ -62,7 +66,7 @@
62
66
  .ui-input:disabled,
63
67
  .ui-select:disabled,
64
68
  .ui-textarea:disabled {
65
- background-color: var(--disabled-surface); /* ring-gap: inherit — control paint; its focus indicator uses the containing surface. */
69
+ background-color: var(--disabled-surface); /* code-bg: inherit — control paint; the containing surface is the ground, for a chip and for a band alike. */
66
70
  border-color: var(--disabled-border);
67
71
  /* muted-ink: state — unavailable control */ color: var(--disabled-ink);
68
72
  opacity: 1; /* fade-reset: the UA's select:disabled grey-out. #564 */
@@ -137,7 +141,7 @@
137
141
  margin-top: 1px;
138
142
  border: 1.5px solid var(--border-strong);
139
143
  border-radius: var(--radius-xs);
140
- background: var(--surface-2); /* ring-gap: inherit — control paint; its focus indicator uses the containing surface. */
144
+ background: var(--surface-2); /* code-bg: inherit — control paint; the containing surface is the ground, for a chip and for a band alike. */
141
145
  cursor: pointer;
142
146
  transition: border-color var(--dur-fast) var(--ease), background var(--dur-fast) var(--ease);
143
147
  position: relative;
@@ -163,7 +167,11 @@
163
167
  .ui-check input[type="radio"] { border-radius: 50%; }
164
168
  /* :enabled, or the accent lights the border of a box that cannot be clicked —
165
169
  the same "press me" a disabled control has to stop making. #429 */
166
- .ui-check input:enabled:hover { border-color: var(--accent); }
170
+ /* The hover edge steps aside under the band: an accent edge one pixel inside an
171
+ accent band is the second band #578 round r34 took off the focus rules, and a
172
+ pointer resting on a focused control would put it back. One indicator, which is
173
+ what the kit's rows already chose. why: docs/foundations.md#the-focus-ring */
174
+ .ui-check input:enabled:hover:not(:focus-visible) { border-color: var(--accent); }
167
175
  .ui-check input:checked { background: var(--accent); border-color: var(--accent); }
168
176
  .ui-check input[type="checkbox"]:checked::after {
169
177
  content: "";
@@ -181,7 +189,7 @@
181
189
  border-radius: 50%;
182
190
  background: var(--accent-contrast);
183
191
  }
184
- .ui-check input:focus-visible { outline: 2px solid transparent; box-shadow: var(--ring); }
192
+ .ui-check input:focus-visible { outline: var(--ring); outline-offset: var(--ring-offset); }
185
193
 
186
194
  /* Off. `.ui-check` had no disabled rule at all until #429 put a disabled checkbox
187
195
  on screen: the box kept --surface-2 and --border-strong, its words kept --text,
@@ -192,13 +200,13 @@
192
200
  button does: the accent IS the "press me". Its mark inverts to --disabled-surface,
193
201
  so the tick and the dot keep the measured --disabled-ink pair in both themes. */
194
202
  .ui-check input:disabled {
195
- background: var(--disabled-surface); /* ring-gap: inherit — control paint; its focus indicator uses the containing surface. */
203
+ background: var(--disabled-surface); /* code-bg: inherit — control paint; the containing surface is the ground, for a chip and for a band alike. */
196
204
  border-color: var(--disabled-border);
197
205
  cursor: not-allowed;
198
206
  }
199
207
  .ui-check input:disabled:checked { background: var(--disabled-ink); border-color: var(--disabled-ink); }
200
208
  .ui-check input[type="checkbox"]:disabled:checked::after { border-color: var(--disabled-surface); }
201
- .ui-check input[type="radio"]:disabled:checked::after { background: var(--disabled-surface); /* ring-gap: inherit — the mark inside the box; the box carries the focus indicator. */ }
209
+ .ui-check input[type="radio"]:disabled:checked::after { background: var(--disabled-surface); /* code-bg: inherit — the mark inside the box; the box carries the focus indicator. */ }
202
210
  /* The label is the click target, so the cursor belongs on it, and the words it
203
211
  holds go quiet with the box beside them. */
204
212
  .ui-check:has(input:disabled) { /* muted-ink: state — unavailable control */ color: var(--disabled-ink); cursor: not-allowed; }
@@ -217,7 +225,7 @@
217
225
  .ui-switch__track {
218
226
  position: absolute;
219
227
  inset: 0;
220
- background: var(--surface-3); /* ring-gap: inherit — control paint; its focus indicator uses the containing surface. */
228
+ background: var(--surface-3); /* code-bg: inherit — control paint; the containing surface is the ground, for a chip and for a band alike. */
221
229
  border-radius: var(--radius-pill);
222
230
  cursor: pointer;
223
231
  transition: background var(--dur-med) var(--ease);
@@ -243,5 +251,5 @@
243
251
  .ui-switch input:checked + .ui-switch__track::before {
244
252
  transform: translateX(calc(var(--sw-w) - var(--sw-h)));
245
253
  }
246
- .ui-switch input:focus-visible + .ui-switch__track { outline: 2px solid transparent; box-shadow: var(--ring); }
254
+ .ui-switch input:focus-visible + .ui-switch__track { outline: var(--ring); outline-offset: var(--ring-offset); }
247
255
  .ui-switch input:disabled + .ui-switch__track { opacity: 0.5; cursor: not-allowed; }
@@ -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); /* ring-gap: inherit — page background inherits root overrides. */
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); --ring-gap: 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));
@@ -67,8 +67,8 @@
67
67
  to the --surface-3 the folded rail already paints, a hovered row to half of it, so
68
68
  the pointer stays quieter than the reader's own row in both themes (#475 r34). The
69
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); /* ring-gap: inherit — translucent wash retains the opaque containing gap. */ }
71
- .ui-app__rail .ui-nav__item.is-active { background: var(--surface-3); /* ring-gap: inherit — control paint; its focus indicator uses the containing surface. */ }
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. */ }
72
72
  .ui-app__brand {
73
73
  display: flex;
74
74
  align-items: center;
@@ -88,7 +88,7 @@
88
88
  /* Carries the shell's class as well as its own, for the same reason the rail
89
89
  rows do (see nav.css): a host stylesheet's `a:link` is (0,1,1). */
90
90
  .ui-app .ui-app__brand { color: var(--strong); }
91
- .ui-app__brand:focus-visible { outline: 2px solid transparent; box-shadow: var(--ring); border-radius: var(--radius-xs); }
91
+ .ui-app__brand:focus-visible { outline: var(--ring); outline-offset: var(--ring-offset); border-radius: var(--radius-xs); }
92
92
  .ui-app__brand svg { display: block; flex: none; }
93
93
 
94
94
  /* The head band: the product's mark, and the rail's own control at the far end of
@@ -119,7 +119,7 @@
119
119
  resting step. */
120
120
  /* Re-tuned at #295, which took the light rail down a step with the page. Below 720px
121
121
  the glyph is the whole row, so it is held at text grade rather than at 1.4.11's bar —
122
- stories/apps/shell-states.test.js:1595 `a resting glyph is dimmer but still legible`. */
122
+ stories/apps/shell-states.test.js:1597 `a resting glyph is dimmer but still legible`. */
123
123
  .ui-app__rail .ui-nav__ic svg { opacity: 0.66; }
124
124
 
125
125
  /* A destructive row of the rail is a navigation row and rests like one; the danger
@@ -160,7 +160,7 @@
160
160
  width: var(--ui-app-av); height: var(--ui-app-av); flex: none;
161
161
  margin-inline-start: calc((var(--ui-nav-strip) - var(--ui-app-av)) / 2);
162
162
  border-radius: var(--radius-pill);
163
- background: var(--surface); /* ring-gap: inherit — decorative or text-only surface has no nested focus target. */
163
+ background: var(--surface); /* code-bg: inherit — decorative or text-only paint; nothing nested reads a ground from it. */
164
164
  color: var(--strong);
165
165
  display: grid; place-items: center;
166
166
  font-size: calc(var(--text-xs) + 1px);
@@ -194,7 +194,7 @@
194
194
  font-weight: inherit;
195
195
  letter-spacing: normal;
196
196
  }
197
- .ui-app .ui-app__user-trigger:hover { background: var(--surface); /* ring-gap: inherit — control paint; its focus indicator uses the containing 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. */ }
198
198
  .ui-app__user-trigger .ui-app__who { flex: 1 1 auto; text-align: left; }
199
199
  /* The panel is portalled onto <body>, so nothing here may hang off .ui-app: by the
200
200
  time it is open it is no longer inside the rail that drew it.
@@ -283,7 +283,7 @@
283
283
  does not do: an ordinary row drops its wash here, answered by the floating name below.
284
284
  nav.css's folded rules, a rung further. why: docs/components.md#the-page-shell */
285
285
  :where(.ui-app.is-collapsed) .ui-app__rail .ui-nav__item.is-active { isolation: isolate; background: 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); /* ring-gap: inherit — decorative or text-only surface has no nested focus target. */ z-index: -1; }
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
287
  :where(.ui-app.is-collapsed) .ui-app__rail .ui-nav__item:not(.is-danger):not(.is-active):hover { background: none; }
288
288
  /* The label IS the chip. `fixed` is the fallback placement, out of the rail's own
289
289
  clip; the @supports branch below pins it to the row and is the only one that
@@ -297,7 +297,7 @@
297
297
  why: docs/foundations.md#elevation */
298
298
  :where(.ui-app.is-collapsed) .ui-app__rail .ui-nav__item:is(:hover, :focus-visible) > .ui-nav__label,
299
299
  :where(.ui-app.is-collapsed) .ui-app__rail .ui-app__user-trigger:is(:hover, :focus-visible) > .ui-app__who,
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); /* ring-gap: inherit — decorative or text-only surface has no nested focus target. */ color: var(--strong); opacity: 1; pointer-events: none; }
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; }
301
301
  @supports (anchor-name: --a) and (anchor-scope: --a) {
302
302
  .ui-app.is-collapsed,
303
303
  .ui-app:has(.ui-app__fold) { anchor-scope: --ui-rail; }
@@ -346,7 +346,7 @@
346
346
  height: var(--ui-app-band);
347
347
  flex: none;
348
348
  padding-inline: clamp(24px, 4vw, 56px);
349
- background: var(--bg); /* ring-gap: inherit — page background inherits root overrides. */
349
+ background: var(--bg); /* code-bg: inherit — page background inherits root overrides. */
350
350
  border-bottom: 1px solid var(--border);
351
351
  /* Sticky for the reason the rail beside it is: chrome that scrolls away is chrome
352
352
  you scroll back up for. */
@@ -382,7 +382,7 @@
382
382
  color: var(--text);
383
383
  /* The band search uses the same reading surface as other text controls.
384
384
  why: docs/foundations.md#elevation */
385
- background: var(--surface); /* ring-gap: inherit — control paint; its focus indicator uses the containing surface. */
385
+ background: var(--surface); /* code-bg: inherit — control paint; the containing surface is the ground, for a chip and for a band alike. */
386
386
  border: 1px solid var(--border);
387
387
  border-radius: var(--radius-md);
388
388
  cursor: pointer;
@@ -393,10 +393,10 @@
393
393
  without `.ui-btn`, so base.css's shared rule never reached it and focus fell
394
394
  through to the browser's own square outline, drawn around a 12px radius.
395
395
  why: docs/foundations.md#the-focus-ring */
396
- .ui-app__search:focus-visible { outline: 2px solid transparent; box-shadow: var(--ring); border-color: var(--accent); }
396
+ .ui-app__search:focus-visible { outline: var(--ring); outline-offset: var(--ring-offset); }
397
397
  /* The same glyph the palette draws in its own search box, at the same box and the
398
398
  same stroke: the trigger and the thing it opens are not two search marks.
399
- src/styles/command-palette.css:109 `.ui-cmdk__search-ic svg` */
399
+ src/styles/command-palette.css:108 `.ui-cmdk__search-ic svg` */
400
400
  .ui-app__search-ic { display: flex; flex: none; }
401
401
  .ui-app__search-ic svg { width: 17px; height: 17px; stroke: currentColor; fill: none; stroke-width: 2.2; }
402
402
  /* Part of the button's name, so it is squeezed rather than dropped: an ellipsis
@@ -488,7 +488,7 @@
488
488
  .ui-app__rail .ui-nav__sub { margin-inline-start: 0; padding-inline-start: 0; border-inline-start-width: 0; }
489
489
  .ui-app__rail .ui-nav__item:not(:has(.ui-nav__ic))::after { opacity: 0.62; }
490
490
  .ui-app__rail .ui-nav__item.is-active { isolation: isolate; background: 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); /* ring-gap: inherit — decorative or text-only surface has no nested focus target. */ z-index: -1; }
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
492
  .ui-app__rail .ui-nav__item:not(.is-danger):not(.is-active):hover { background: none; }
493
493
  /* The one line of this block that is deliberately NOT the reader's fold: a finger
494
494
  is the only pointer this width has, so a row and the account block are held to
@@ -497,7 +497,7 @@
497
497
  .ui-app__rail .ui-nav__item,
498
498
  .ui-app__rail .ui-app__user-trigger { min-height: 44px; }
499
499
  .ui-app__rail .ui-nav__item:is(:hover, :focus-visible) > .ui-nav__label,
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); /* ring-gap: inherit — decorative or text-only surface has no nested focus target. */ color: var(--strong); opacity: 1; pointer-events: none; }
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; }
501
501
  @supports (anchor-name: --a) and (anchor-scope: --a) {
502
502
  .ui-app { anchor-scope: --ui-rail; }
503
503
  .ui-app__rail { anchor-name: --ui-rail; }
@@ -532,7 +532,7 @@
532
532
  /* Floats over a spotlit page, so it takes the floating step and the floating
533
533
  treatment: the two-step edge in dark, the drop alone in light.
534
534
  why: docs/foundations.md#elevation */
535
- background: var(--bg-elevated); --ring-gap: var(--bg-elevated);
535
+ background: var(--bg-elevated);
536
536
  border: 1px solid var(--float-edge);
537
537
  box-shadow: inset 0 0 0 1px var(--elev-edge, var(--float-edge-inner)), var(--elev-drop);
538
538
  border-radius: 22px;
@@ -555,7 +555,7 @@
555
555
  width: 38px; height: 38px; flex: none;
556
556
  border-radius: 11px;
557
557
  display: grid; place-items: center;
558
- background: var(--glow-purple); /* ring-gap: inherit — translucent wash retains the opaque containing gap. */
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. */
559
559
  color: var(--accent);
560
560
  }
561
561
  .ui-scope__icon svg { width: 21px; height: 21px; stroke: currentColor; fill: none; stroke-width: 1.8; }
@@ -576,7 +576,7 @@
576
576
  font-size: calc(var(--text-xs) + 1px);
577
577
  letter-spacing: 0.06em;
578
578
  color: var(--purple-mid);
579
- background: var(--glow-purple); /* ring-gap: inherit — translucent wash retains the opaque containing gap. */
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. */
580
580
  border-radius: 999px;
581
581
  padding: 6px 14px;
582
582
  margin-bottom: 26px;
@@ -621,7 +621,7 @@
621
621
  width: 46px; height: 46px;
622
622
  border-radius: 13px;
623
623
  display: grid; place-items: center;
624
- background: var(--glow-purple); /* ring-gap: inherit — translucent wash retains the opaque containing gap. */
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. */
625
625
  color: var(--accent);
626
626
  margin-bottom: 16px;
627
627
  }
@@ -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); /* ring-gap: inherit — decorative paint has no nested focus target. */
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;