@apliteni/apliteni-ui 0.69.0 → 0.70.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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@apliteni/apliteni-ui",
3
- "version": "0.69.0",
3
+ "version": "0.70.0",
4
4
  "workspaces": [
5
5
  "react"
6
6
  ],
@@ -420,6 +420,11 @@
420
420
  box-shadow: var(--ring);
421
421
  border-radius: 4px;
422
422
  }
423
+ .ui-table__selection input[type=checkbox]:focus-visible {
424
+ outline: 2px solid transparent;
425
+ box-shadow: var(--ring);
426
+ border-radius: var(--radius-xs);
427
+ }
423
428
  .rx-caret {
424
429
  margin-left: 2px;
425
430
  width: 16px;
@@ -67,6 +67,7 @@
67
67
  /* Tone ink keeps actions readable on the neutral surface. */
68
68
  .ui-toast__action { flex: none; align-self: center; background: none; border: 0; padding: 4px 9px; border-radius: var(--radius-xs); font: inherit; font-weight: var(--weight-medium); color: var(--toast-action-ink); cursor: pointer; }
69
69
  .ui-toast__action:hover { background: color-mix(in srgb, var(--bg) 55%, transparent); /* ring-gap: inherit — control paint; its focus indicator uses the containing surface. */ }
70
+ .ui-toast__action:focus-visible { outline: 2px solid transparent; box-shadow: var(--ring); }
70
71
 
71
72
  .ui-toast__close { flex: none; align-self: flex-start; background: none; border: 0; /* muted-ink: glyph — dismiss icon */ color: var(--muted); cursor: pointer; padding: 2px; display: grid; place-items: center; position: relative; font: inherit; }
72
73
  .ui-toast__close svg { width: 15px; height: 15px; stroke: currentColor; fill: none; stroke-width: 2.5; }
@@ -90,6 +91,7 @@
90
91
  transform: translate(-50%, -50%);
91
92
  }
92
93
  .ui-toast__close:hover { color: var(--text); }
94
+ .ui-toast__close:focus-visible { outline: 2px solid transparent; box-shadow: var(--ring); border-radius: var(--radius-xs); }
93
95
 
94
96
  /* auto-dismiss progress bar — .is-running is added by wireToastStack() */
95
97
  .ui-toast__timer { position: absolute; left: 0; bottom: 0; height: 3px; width: 100%; background: var(--toast-accent); opacity: 0.85; transform-origin: left; }
@@ -58,6 +58,7 @@
58
58
  }
59
59
  /* The lift alone: the kit casts no shadow anywhere (#295), and cards are flat (#284). */
60
60
  .ui-card--interactive:hover { transform: translateY(-2px); }
61
+ .ui-card--interactive:focus-visible { outline: 2px solid transparent; box-shadow: var(--ring); }
61
62
 
62
63
  /* card() emits the title as an h2, so the text face is named here rather than
63
64
  left to the element. why: docs/specification.md#labels-and-titles */
@@ -51,6 +51,7 @@
51
51
  }
52
52
  .ui-snippet__copy:hover { color: var(--accent); }
53
53
  .ui-snippet--reveal .ui-snippet__copy:hover { color: var(--strong); }
54
+ .ui-snippet__copy:focus-visible { outline: 2px solid transparent; box-shadow: var(--ring); border-radius: var(--radius-xs); }
54
55
  .ui-snippet__copy svg { width: 13px; height: 13px; stroke: currentColor; fill: none; stroke-width: 2.8; }
55
56
 
56
57
  /* Shell token highlighting (matches viz/account.mjs classes) */
@@ -95,6 +95,15 @@
95
95
  .ui-dropdown__panel.is-end { left: auto; right: 0; }
96
96
  .ui-dropdown__panel.is-scroll { max-height: 300px; overflow-y: auto; }
97
97
 
98
+ /* Chrome makes a scroll container a keyboard stop on its own — no tabindex, no
99
+ author rule — so `.is-scroll` took the browser's outline, black in light mode.
100
+ #457 refused that, and #487's review measured it here. Written for every panel
101
+ rather than the scrolling one, as the palette and the drawer write it, because
102
+ a panel that takes focus any other way has the same claim on the ring. The
103
+ ring is COMPOSED with the floating treatment rather than over it: a box-shadow
104
+ list replaces the whole list. why: docs/specification.md#elevation */
105
+ .ui-dropdown__panel:focus-visible { outline: 2px solid transparent; box-shadow: var(--ring), inset 0 0 0 1px var(--elev-edge, var(--border)), var(--elev-drop); }
106
+
98
107
  /* Opening upward. The kit releases its own `top` here so that nothing outside
99
108
  the kit has to: an absolute box with both edges pinned is stretched between
100
109
  them, and a consumer who set `bottom` and left our `top` standing got a
@@ -78,6 +78,7 @@
78
78
  .ui-fbc__chip svg { width: 14px; height: 14px; flex: none; opacity: .85; stroke-width: 2.7; }
79
79
  .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; }
80
80
  .ui-fbc__x:hover { color: var(--strong); }
81
+ .ui-fbc__x:focus-visible { outline: 2px solid transparent; box-shadow: var(--ring); }
81
82
  .ui-fbc__x svg { width: 14px; height: 14px; stroke-width: 2.7; }
82
83
  .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; }
83
84
  .ui-fbc__qm { color: var(--accent); font-size: var(--text-xl); font-weight: var(--weight-bold); line-height: .9; flex: none; opacity: .55; }
@@ -94,6 +95,7 @@
94
95
  .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); }
95
96
  .ui-fbbtn.ghost { background: transparent; color: var(--text); }
96
97
  .ui-fbbtn.ghost:hover { color: var(--strong); background: var(--surface); /* ring-gap: inherit — control paint; its focus indicator uses the containing surface. */ }
98
+ .ui-fbbtn:focus-visible { outline: 2px solid transparent; box-shadow: var(--ring); }
97
99
  .ui-fbbtn.primary { background: var(--accent-strong); color: var(--accent-contrast); display: inline-flex; align-items: center; gap: 9px; }
98
100
  .ui-fbbtn.primary:hover { filter: brightness(1.08); }
99
101
  /* Same flat pair as .ui-btn:disabled, for the same reason (#220). */
@@ -62,6 +62,7 @@
62
62
  transform var(--dur-fast) var(--ease);
63
63
  }
64
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); }
65
66
  .ui-footer__social svg { width: 17px; height: 17px; display: block; }
66
67
 
67
68
  /* Link columns */
@@ -85,6 +86,7 @@
85
86
  transition: color var(--dur-fast) var(--ease);
86
87
  }
87
88
  .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); }
88
90
 
89
91
  /* Legal bar — shared by every variant */
90
92
  .ui-footer__bar {
@@ -102,6 +104,7 @@
102
104
  .ui-footer__legal-links { display: flex; gap: 22px; flex-wrap: wrap; }
103
105
  .ui-footer__legal-links a { color: var(--footer-link); text-decoration: none; transition: color var(--dur-fast) var(--ease); }
104
106
  .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); }
105
108
  .ui-footer__switcher { display: inline-flex; align-items: center; gap: 12px; margin-left: auto; }
106
109
 
107
110
  /* slim — a single legal row, no divider above it. */
@@ -83,6 +83,7 @@
83
83
  /* Carries the shell's class as well as its own, for the same reason the rail
84
84
  rows do (see nav.css): a host stylesheet's `a:link` is (0,1,1). */
85
85
  .ui-app .ui-app__brand { color: var(--strong); }
86
+ .ui-app__brand:focus-visible { outline: 2px solid transparent; box-shadow: var(--ring); border-radius: var(--radius-xs); }
86
87
  .ui-app__brand svg { display: block; flex: none; }
87
88
 
88
89
  /* The head band: the product's mark, and the rail's own control at the far end of
@@ -41,6 +41,9 @@
41
41
  .brand svg { display: block; flex: none; }
42
42
  /* Topbar wordmark runs a touch smaller than the auth-card lockup. */
43
43
  .topbar .brand { font-size: var(--text-sm); }
44
+ /* The lockup is a link, so it takes focus: the shared ring, with a radius of its
45
+ own because the mark and the word have no box to borrow one from. #482 */
46
+ .brand:focus-visible { outline: 2px solid transparent; box-shadow: var(--ring); border-radius: var(--radius-xs); }
44
47
  .topbar .spacer { flex: 1; }
45
48
 
46
49
  /* Deck / Text (segmented, pill) */
@@ -67,6 +70,7 @@
67
70
  }
68
71
  .dtsw a:hover { color: var(--strong); }
69
72
  .dtsw a.cur { color: var(--strong); background: var(--surface); /* ring-gap: inherit — control paint; its focus indicator uses the containing surface. */ }
73
+ .dtsw a:focus-visible { outline: 2px solid transparent; box-shadow: var(--ring); }
70
74
 
71
75
  /* Theme toggle — a single icon-only switch (no label). */
72
76
  .toggle {
@@ -86,6 +90,7 @@
86
90
  border-color var(--dur-fast) var(--ease);
87
91
  }
88
92
  .toggle:hover { transform: translateY(-1px); border-color: var(--border-strong); }
93
+ .toggle:focus-visible { outline: 2px solid transparent; box-shadow: var(--ring); }
89
94
  .toggle .ic { width: 17px; height: 17px; display: inline-block; color: var(--text); }
90
95
  .toggle .ic svg { display: block; width: 100%; height: 100%; stroke-width: 2.2; }
91
96
 
@@ -107,6 +112,7 @@
107
112
  transition: border-color var(--dur-fast) var(--ease), background var(--dur-fast) var(--ease);
108
113
  }
109
114
  .vsw__btn:hover { border-color: var(--accent); }
115
+ .vsw__btn:focus-visible { outline: 2px solid transparent; box-shadow: var(--ring); }
110
116
  .vsw__btn .lbl { color: var(--text); }
111
117
  .vsw__btn .cur { color: var(--strong); font-weight: 600; letter-spacing: 0.01em; }
112
118
  .vsw__btn .car {
@@ -180,9 +186,14 @@
180
186
  transition: background var(--dur-fast) var(--ease);
181
187
  }
182
188
  /* Menu rows use the reading surface and an edge on hover — see
183
- src/styles/dropdown.css:155 `.ui-dropdown__item:hover`.
189
+ src/styles/dropdown.css:164 `.ui-dropdown__item:hover`.
184
190
  why: docs/specification.md#elevation */
185
191
  .vopt: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. */ }
192
+ /* The row is a keyboard stop: src/components/dropdown.js:554
193
+ `items[next < 0 ? 0 : next]?.focus()` moves focus onto a `[data-dd-item]` with
194
+ the arrow keys, and this is one. It takes the ring on its own 10px radius, the
195
+ same way `.amenu a` above does. #482 */
196
+ .vopt:focus-visible { outline: 2px solid transparent; box-shadow: var(--ring); }
186
197
  .vopt .vname { font-family: var(--font-sans); font-size: calc(var(--text-sm) - 0.5px); color: var(--strong); font-weight: 600; letter-spacing: 0.01em; }
187
198
  .vopt .vmeta { font-size: var(--text-xs); color: var(--text); margin-top: 2px; }
188
199
  .vopt .vbadge {
@@ -221,6 +232,7 @@
221
232
  transition: border-color var(--dur-fast) var(--ease);
222
233
  }
223
234
  .acct .avatar:hover { border-color: var(--accent); }
235
+ .avatar:focus-visible { outline: 2px solid transparent; box-shadow: var(--ring); }
224
236
  .amenu {
225
237
  position: absolute;
226
238
  right: 0; top: 44px;
@@ -259,6 +271,7 @@
259
271
  .amenu .ahead .aem { color: var(--text); font-size: calc(var(--text-xs) + 0.5px); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
260
272
  .amenu a { display: flex; align-items: center; gap: 11px; padding: 10px 15px; color: var(--text); text-decoration: none; font-family: var(--font-sans); font-size: var(--text-sm); cursor: pointer; }
261
273
  .amenu a: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. */ }
274
+ .amenu a:focus-visible { outline: 2px solid transparent; box-shadow: var(--ring); border-radius: var(--radius-xs); }
262
275
  .amenu a.cur { color: var(--accent); }
263
276
  .amenu a svg { width: 19px; height: 19px; flex: none; stroke: currentColor; fill: none; stroke-width: 2; opacity: 0.85; }
264
277
  .amenu .asep { height: 1px; background: var(--border); margin: 5px 0; }