@apliteni/apliteni-ui 0.94.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.
@@ -61,7 +61,7 @@
61
61
  flex-direction: column;
62
62
  gap: var(--space-2);
63
63
  padding: var(--space-5);
64
- background: var(--confirm-surface); --ring-gap: var(--confirm-surface);
64
+ background: var(--confirm-surface);
65
65
  /* The two-step edge and the drop, through the level's own names: in DARK that is
66
66
  --border-strong outside and --border one pixel inside it, then the drop; in LIGHT
67
67
  both lines are transparent and the drop carries the whole separation.
@@ -76,11 +76,11 @@
76
76
  transform var(--dur-med) var(--ease);
77
77
  }
78
78
  .ui-confirm.is-open .ui-confirm__panel { opacity: 1; transform: none; }
79
- /* The ring is COMPOSED with the floating treatment, not written over it: a
80
- box-shadow list replaces the whole list, so `box-shadow: var(--ring)` alone
81
- took the panel's edge and its drop off for as long as it held focus.
79
+ /* The ring leaves the panel's own elevation alone: it is an outline since #578, so
80
+ it no longer has to be composed into the box-shadow list that carries the edge and
81
+ the drop — and the list no longer has to be restated here to survive focus.
82
82
  why: docs/foundations.md#elevation */
83
- .ui-confirm__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); }
83
+ .ui-confirm__panel:focus-visible { outline: var(--ring); outline-offset: var(--ring-offset); }
84
84
 
85
85
  /* -- Slots ----------------------------------------------------------------- */
86
86
  /* The question and the answers keep their size; the consequence between them is
@@ -57,7 +57,7 @@
57
57
  position: absolute;
58
58
  display: flex;
59
59
  flex-direction: column;
60
- background: var(--drawer-surface); --ring-gap: var(--drawer-surface);
60
+ background: var(--drawer-surface);
61
61
  /* A drawer is flush to a screen edge, so it has one edge rather than four and the
62
62
  two-step edge runs along that one: --border-strong on the edge rule below, the
63
63
  inner line one pixel inside it. This is the one floating surface that writes no
@@ -111,11 +111,10 @@
111
111
  transform: translateY(100%);
112
112
  }
113
113
 
114
- /* The ring is COMPOSED with the floating treatment rather than written over it — a
115
- box-shadow list replaces the whole list, so a bare `box-shadow: var(--ring)` would
116
- take the drawer's edge and its drop off for as long as it held focus.
114
+ /* The ring leaves the drawer's own elevation alone: it is an outline since #578, so
115
+ the edge and the drop no longer have to be restated here to survive focus.
117
116
  why: docs/foundations.md#elevation */
118
- .ui-drawer__panel:focus-visible { outline: 2px solid transparent; box-shadow: var(--ring), var(--drawer-line), var(--elev-drop); }
117
+ .ui-drawer__panel:focus-visible { outline: var(--ring); outline-offset: var(--ring-offset); }
119
118
 
120
119
  /* -- Sizes ----------------------------------------------------------------- */
121
120
  /* left|right → width; top|bottom → height. Same names, axis chosen by side. */
@@ -166,8 +165,8 @@
166
165
  background var(--dur-fast) var(--ease),
167
166
  border-color var(--dur-fast) var(--ease);
168
167
  }
169
- .ui-drawer__close:hover { color: var(--strong); background: var(--surface-3); /* ring-gap: inherit — control paint; its focus indicator uses the containing surface. */ }
170
- .ui-drawer__close:focus-visible { outline: 2px solid transparent; box-shadow: var(--ring); border-color: var(--accent); }
168
+ .ui-drawer__close:hover { color: var(--strong); background: var(--surface-3); /* code-bg: inherit — control paint; the containing surface is the ground, for a chip and for a band alike. */ }
169
+ .ui-drawer__close:focus-visible { outline: var(--ring); outline-offset: var(--ring-offset); }
171
170
  .ui-drawer__close svg { width: 18px; height: 18px; stroke: currentColor; fill: none; stroke-width: 2.1; }
172
171
 
173
172
  .ui-drawer__body {
@@ -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
 
@@ -70,7 +74,7 @@
70
74
  min-width: 240px;
71
75
  /* The floating step, not the sunken one — a panel held open over a card cannot be
72
76
  painted the colour of an inset. why: docs/foundations.md#elevation */
73
- background: var(--bg-elevated); --ring-gap: var(--bg-elevated);
77
+ background: var(--bg-elevated);
74
78
  /* The two-step edge and the drop, through the level's own names: in DARK that is
75
79
  --border-strong outside and --border one pixel inside it, then the drop; in LIGHT
76
80
  both lines are transparent and the drop carries the whole separation.
@@ -101,10 +105,10 @@
101
105
  author rule — so `.is-scroll` took the browser's outline, black in light mode.
102
106
  #457 refused that, and #487's review measured it here. Written for every panel
103
107
  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); }
108
+ a panel that takes focus any other way has the same claim on the ring. The ring
109
+ is an outline since #578, so it leaves the box-shadow list that carries the panel's
110
+ edge and its drop standing. why: docs/foundations.md#elevation */
111
+ .ui-dropdown__panel:focus-visible { outline: var(--ring); outline-offset: var(--ring-offset); }
108
112
 
109
113
  /* Opening upward. The kit releases its own `top` here so that nothing outside
110
114
  the kit has to: an absolute box with both edges pinned is stretched between
@@ -172,9 +176,12 @@
172
176
  color: var(--text);
173
177
  transition: background var(--dur-fast) var(--ease);
174
178
  }
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); }
179
+ /* Rows keep a reading surface; hover adds an edge. A row that is hovered AND focused
180
+ draws the ring and not the hover edge — both are outlines now, and the focus rule
181
+ comes later — which is one indicator rather than two.
182
+ why: docs/foundations.md#elevation */
183
+ .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. */ }
184
+ .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
185
  .ui-dropdown__main { display: flex; flex-direction: column; gap: 2px; min-width: 0; }
179
186
  .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
187
  .ui-dropdown__desc { font-size: var(--text-xs); color: var(--text); line-height: 1.35; }
@@ -200,11 +207,11 @@
200
207
  margin-left: auto;
201
208
  flex: none;
202
209
  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. */
210
+ 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
211
  }
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. */ }
212
+ .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
213
  :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. */
214
+ 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
215
  }
209
216
 
210
217
  /* Disabled + danger rows */
@@ -276,7 +283,7 @@
276
283
  font-size: calc(var(--text-sm) - 0.5px);
277
284
  color: var(--strong);
278
285
  /* 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. */
286
+ background: var(--field-bg); /* code-bg: inherit — control paint; the containing surface is the ground, for a chip and for a band alike. */
280
287
  border: 1px solid var(--field-edge);
281
288
  border-radius: var(--radius-sm);
282
289
  padding: 8px 12px 8px 34px;
@@ -291,7 +298,7 @@
291
298
 
292
299
  .ui-dropdown__search-input::placeholder { /* muted-ink: placeholder — empty search field */ color: var(--muted); }
293
300
  .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); }
301
+ .ui-dropdown__search-input:focus-visible { outline: var(--ring); outline-offset: var(--ring-offset); }
295
302
 
296
303
  .ui-dropdown__list { max-height: 300px; overflow-y: auto; }
297
304
  /* Rows are `role="option" tabindex="-1"`, so the LIST takes the keyboard stop and
@@ -304,9 +311,12 @@
304
311
  query hides is put away here. */
305
312
  .ui-dropdown__list [hidden] { display: none; } /* motion: still — a row the query no longer matches is gone on the next keystroke */
306
313
 
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); }
314
+ /* The row Enter would pick. Focus stays in the field, which carries the ring, so this
315
+ row is marked by its fill alone — the inset accent bar beside it was an edge on a
316
+ selected row, which #578 round r34 took off every selected state. --surface-2, not
317
+ --surface: the panel is --bg-elevated, which --surface matches exactly in light, so
318
+ the bar had been the whole mark there. 1.183:1 in light, 1.234:1 in dark. */
319
+ .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
320
 
311
321
  /* No match — a nudge and no action, per Guidelines / Microcopy. Empty while
312
322
  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; }