@ponchia/ui 0.2.2 → 0.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +108 -79
- package/behaviors/index.d.ts +53 -0
- package/behaviors/index.js +745 -34
- package/classes/index.d.ts +216 -3
- package/classes/index.js +85 -10
- package/classes/vscode.css-custom-data.json +407 -0
- package/css/app.css +53 -44
- package/css/base.css +14 -23
- package/css/content.css +37 -2
- package/css/core.css +5 -5
- package/css/disclosure.css +17 -5
- package/css/dots.css +1 -1
- package/css/feedback.css +87 -2
- package/css/forms.css +128 -2
- package/css/navigation.css +16 -85
- package/css/overlay.css +73 -2
- package/css/primitives.css +100 -3
- package/css/site.css +295 -0
- package/css/table.css +59 -0
- package/css/tokens.css +79 -24
- package/dist/bronto.css +1 -1
- package/dist/css/app.css +1 -0
- package/dist/css/base.css +1 -0
- package/dist/css/content.css +1 -0
- package/dist/css/disclosure.css +1 -0
- package/dist/css/dots.css +1 -0
- package/dist/css/feedback.css +1 -0
- package/dist/css/fonts.css +1 -0
- package/dist/css/forms.css +1 -0
- package/dist/css/motion.css +1 -0
- package/dist/css/navigation.css +1 -0
- package/dist/css/overlay.css +1 -0
- package/dist/css/primitives.css +1 -0
- package/dist/css/site.css +1 -0
- package/dist/css/table.css +1 -0
- package/dist/css/tokens.css +1 -0
- package/package.json +60 -30
- package/shiki/nothing.json +83 -0
- package/tokens/index.d.ts +18 -10
- package/tokens/index.js +49 -16
- package/tokens/index.json +98 -32
- package/tokens/tokens.dtcg.json +241 -22
- package/css/cards.css +0 -336
- package/css/index.css +0 -5
- package/css/layout.css +0 -219
- package/css/responsive.css +0 -157
- package/css/typography.css +0 -139
- package/dist/bronto-core.css +0 -1
package/css/app.css
CHANGED
|
@@ -3,19 +3,19 @@
|
|
|
3
3
|
For admin / operator dashboards.
|
|
4
4
|
========================================================================== */
|
|
5
5
|
|
|
6
|
-
.app-shell {
|
|
6
|
+
.ui-app-shell {
|
|
7
7
|
display: grid;
|
|
8
8
|
grid-template-columns: var(--app-rail, 14rem) minmax(0, 1fr);
|
|
9
9
|
min-block-size: 100vh;
|
|
10
10
|
}
|
|
11
11
|
|
|
12
|
-
.app-shell--full {
|
|
12
|
+
.ui-app-shell--full {
|
|
13
13
|
grid-template-columns: minmax(0, 1fr);
|
|
14
14
|
}
|
|
15
15
|
|
|
16
16
|
/* --- Sidebar rail --- */
|
|
17
17
|
|
|
18
|
-
.app-rail {
|
|
18
|
+
.ui-app-rail {
|
|
19
19
|
background: var(--panel);
|
|
20
20
|
border-inline-end: 1px solid var(--line);
|
|
21
21
|
display: flex;
|
|
@@ -28,7 +28,7 @@
|
|
|
28
28
|
overflow-y: auto;
|
|
29
29
|
}
|
|
30
30
|
|
|
31
|
-
.app-rail__brand {
|
|
31
|
+
.ui-app-rail__brand {
|
|
32
32
|
align-items: center;
|
|
33
33
|
color: var(--text);
|
|
34
34
|
display: flex;
|
|
@@ -40,7 +40,7 @@
|
|
|
40
40
|
text-transform: uppercase;
|
|
41
41
|
}
|
|
42
42
|
|
|
43
|
-
.app-rail__brand::before {
|
|
43
|
+
.ui-app-rail__brand::before {
|
|
44
44
|
background: var(--accent);
|
|
45
45
|
border-radius: 50%;
|
|
46
46
|
content: '';
|
|
@@ -48,12 +48,12 @@
|
|
|
48
48
|
inline-size: 0.5rem;
|
|
49
49
|
}
|
|
50
50
|
|
|
51
|
-
.app-nav {
|
|
51
|
+
.ui-app-nav {
|
|
52
52
|
display: grid;
|
|
53
53
|
gap: 0.15rem;
|
|
54
54
|
}
|
|
55
55
|
|
|
56
|
-
.app-nav__section {
|
|
56
|
+
.ui-app-nav__section {
|
|
57
57
|
color: var(--text-dim);
|
|
58
58
|
font-family: var(--mono);
|
|
59
59
|
font-size: var(--text-2xs);
|
|
@@ -63,7 +63,7 @@
|
|
|
63
63
|
text-transform: uppercase;
|
|
64
64
|
}
|
|
65
65
|
|
|
66
|
-
.app-nav a {
|
|
66
|
+
.ui-app-nav a {
|
|
67
67
|
align-items: center;
|
|
68
68
|
border-inline-start: 2px solid transparent;
|
|
69
69
|
color: var(--text-soft);
|
|
@@ -78,7 +78,7 @@
|
|
|
78
78
|
color var(--duration-fast) var(--ease-standard);
|
|
79
79
|
}
|
|
80
80
|
|
|
81
|
-
.app-nav a::before {
|
|
81
|
+
.ui-app-nav a::before {
|
|
82
82
|
background: currentColor;
|
|
83
83
|
border-radius: 50%;
|
|
84
84
|
content: '';
|
|
@@ -87,22 +87,22 @@
|
|
|
87
87
|
inline-size: 0.34rem;
|
|
88
88
|
}
|
|
89
89
|
|
|
90
|
-
.app-nav a:hover {
|
|
90
|
+
.ui-app-nav a:hover {
|
|
91
91
|
background: var(--bg-accent);
|
|
92
92
|
color: var(--text);
|
|
93
93
|
}
|
|
94
94
|
|
|
95
|
-
.app-nav a.is-active {
|
|
95
|
+
.ui-app-nav a.is-active {
|
|
96
96
|
background: var(--accent-soft);
|
|
97
97
|
border-inline-start-color: var(--accent);
|
|
98
|
-
color: var(--accent);
|
|
98
|
+
color: var(--accent-text);
|
|
99
99
|
}
|
|
100
100
|
|
|
101
|
-
.app-nav a.is-active::before {
|
|
101
|
+
.ui-app-nav a.is-active::before {
|
|
102
102
|
opacity: 1;
|
|
103
103
|
}
|
|
104
104
|
|
|
105
|
-
.app-rail__foot {
|
|
105
|
+
.ui-app-rail__foot {
|
|
106
106
|
border-block-start: 1px solid var(--line);
|
|
107
107
|
color: var(--text-dim);
|
|
108
108
|
font-family: var(--mono);
|
|
@@ -113,13 +113,13 @@
|
|
|
113
113
|
|
|
114
114
|
/* --- Main column --- */
|
|
115
115
|
|
|
116
|
-
.app-main {
|
|
116
|
+
.ui-app-main {
|
|
117
117
|
display: flex;
|
|
118
118
|
flex-direction: column;
|
|
119
119
|
min-inline-size: 0;
|
|
120
120
|
}
|
|
121
121
|
|
|
122
|
-
.app-topbar {
|
|
122
|
+
.ui-app-topbar {
|
|
123
123
|
align-items: center;
|
|
124
124
|
background: color-mix(in srgb, var(--bg) 86%, transparent);
|
|
125
125
|
backdrop-filter: blur(8px);
|
|
@@ -130,10 +130,10 @@
|
|
|
130
130
|
padding: 0.75rem var(--space-lg);
|
|
131
131
|
position: sticky;
|
|
132
132
|
inset-block-start: 0;
|
|
133
|
-
z-index:
|
|
133
|
+
z-index: var(--z-raised);
|
|
134
134
|
}
|
|
135
135
|
|
|
136
|
-
.app-topbar__title {
|
|
136
|
+
.ui-app-topbar__title {
|
|
137
137
|
color: var(--text);
|
|
138
138
|
font-family: var(--display);
|
|
139
139
|
font-size: 1.1rem;
|
|
@@ -142,7 +142,7 @@
|
|
|
142
142
|
text-transform: uppercase;
|
|
143
143
|
}
|
|
144
144
|
|
|
145
|
-
.app-content {
|
|
145
|
+
.ui-app-content {
|
|
146
146
|
display: grid;
|
|
147
147
|
gap: var(--space-lg);
|
|
148
148
|
padding: var(--space-lg);
|
|
@@ -150,7 +150,7 @@
|
|
|
150
150
|
|
|
151
151
|
/* --- Toolbar --- */
|
|
152
152
|
|
|
153
|
-
.app-toolbar {
|
|
153
|
+
.ui-app-toolbar {
|
|
154
154
|
align-items: center;
|
|
155
155
|
background: var(--panel);
|
|
156
156
|
border: 1px solid var(--line);
|
|
@@ -162,7 +162,7 @@
|
|
|
162
162
|
padding: 0.7rem 0.85rem;
|
|
163
163
|
}
|
|
164
164
|
|
|
165
|
-
.app-toolbar__group {
|
|
165
|
+
.ui-app-toolbar__group {
|
|
166
166
|
align-items: center;
|
|
167
167
|
display: flex;
|
|
168
168
|
flex-wrap: wrap;
|
|
@@ -171,7 +171,7 @@
|
|
|
171
171
|
|
|
172
172
|
/* --- Panel --- */
|
|
173
173
|
|
|
174
|
-
.app-panel {
|
|
174
|
+
.ui-app-panel {
|
|
175
175
|
background: var(--panel);
|
|
176
176
|
border: 1px solid var(--line);
|
|
177
177
|
border-radius: var(--radius-md);
|
|
@@ -180,14 +180,14 @@
|
|
|
180
180
|
padding: var(--space-md);
|
|
181
181
|
}
|
|
182
182
|
|
|
183
|
-
.app-panel__head {
|
|
183
|
+
.ui-app-panel__head {
|
|
184
184
|
align-items: flex-start;
|
|
185
185
|
display: flex;
|
|
186
186
|
gap: 0.7rem;
|
|
187
187
|
justify-content: space-between;
|
|
188
188
|
}
|
|
189
189
|
|
|
190
|
-
.app-panel__title {
|
|
190
|
+
.ui-app-panel__title {
|
|
191
191
|
color: var(--text);
|
|
192
192
|
font-family: var(--display);
|
|
193
193
|
font-size: 0.95rem;
|
|
@@ -196,21 +196,30 @@
|
|
|
196
196
|
text-transform: uppercase;
|
|
197
197
|
}
|
|
198
198
|
|
|
199
|
-
.app-panel__head p,
|
|
200
|
-
.app-empty-state p {
|
|
199
|
+
.ui-app-panel__head p,
|
|
200
|
+
.ui-app-empty-state p {
|
|
201
201
|
color: var(--text-dim);
|
|
202
202
|
margin: 0.3rem 0 0;
|
|
203
203
|
}
|
|
204
204
|
|
|
205
205
|
/* --- Metric tiles --- */
|
|
206
206
|
|
|
207
|
-
.app-metrics {
|
|
207
|
+
.ui-app-metrics {
|
|
208
208
|
display: grid;
|
|
209
209
|
gap: var(--space-md);
|
|
210
210
|
grid-template-columns: repeat(auto-fit, minmax(11rem, 1fr));
|
|
211
211
|
}
|
|
212
212
|
|
|
213
|
-
.
|
|
213
|
+
/* Inside an opt-in .ui-cq container, collapse to one column when the
|
|
214
|
+
container (not the viewport) is narrow — keeps metric tiles usable
|
|
215
|
+
in a slim panel. Inert without .ui-cq, so baselines are unaffected. */
|
|
216
|
+
@container bronto (max-width: 30rem) {
|
|
217
|
+
.ui-app-metrics {
|
|
218
|
+
grid-template-columns: 1fr;
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
.ui-app-metric {
|
|
214
223
|
background: var(--panel);
|
|
215
224
|
border: 1px solid var(--line);
|
|
216
225
|
border-radius: var(--radius-md);
|
|
@@ -219,7 +228,7 @@
|
|
|
219
228
|
padding: var(--space-md);
|
|
220
229
|
}
|
|
221
230
|
|
|
222
|
-
.app-metric__label {
|
|
231
|
+
.ui-app-metric__label {
|
|
223
232
|
color: var(--text-dim);
|
|
224
233
|
font-family: var(--mono);
|
|
225
234
|
font-size: var(--text-2xs);
|
|
@@ -227,7 +236,7 @@
|
|
|
227
236
|
text-transform: uppercase;
|
|
228
237
|
}
|
|
229
238
|
|
|
230
|
-
.app-metric__value {
|
|
239
|
+
.ui-app-metric__value {
|
|
231
240
|
color: var(--text);
|
|
232
241
|
font-family: var(--display);
|
|
233
242
|
font-size: 1.9rem;
|
|
@@ -236,22 +245,22 @@
|
|
|
236
245
|
line-height: 1;
|
|
237
246
|
}
|
|
238
247
|
|
|
239
|
-
.app-metric__delta {
|
|
248
|
+
.ui-app-metric__delta {
|
|
240
249
|
font-family: var(--mono);
|
|
241
250
|
font-size: var(--text-xs);
|
|
242
251
|
}
|
|
243
252
|
|
|
244
|
-
.app-metric__delta.is-pos {
|
|
253
|
+
.ui-app-metric__delta.is-pos {
|
|
245
254
|
color: var(--success);
|
|
246
255
|
}
|
|
247
256
|
|
|
248
|
-
.app-metric__delta.is-neg {
|
|
257
|
+
.ui-app-metric__delta.is-neg {
|
|
249
258
|
color: var(--danger);
|
|
250
259
|
}
|
|
251
260
|
|
|
252
261
|
/* --- Empty state --- */
|
|
253
262
|
|
|
254
|
-
.app-empty-state {
|
|
263
|
+
.ui-app-empty-state {
|
|
255
264
|
border: 1px dashed var(--line-strong);
|
|
256
265
|
border-radius: var(--radius-md);
|
|
257
266
|
color: var(--text-dim);
|
|
@@ -261,49 +270,49 @@
|
|
|
261
270
|
|
|
262
271
|
/* --- Mobile rail collapse --- */
|
|
263
272
|
|
|
264
|
-
.app-rail__toggle {
|
|
273
|
+
.ui-app-rail__toggle {
|
|
265
274
|
display: none;
|
|
266
275
|
}
|
|
267
276
|
|
|
268
277
|
@media (max-width: 880px) {
|
|
269
|
-
.app-shell {
|
|
278
|
+
.ui-app-shell {
|
|
270
279
|
grid-template-columns: minmax(0, 1fr);
|
|
271
280
|
}
|
|
272
281
|
|
|
273
|
-
.app-rail {
|
|
282
|
+
.ui-app-rail {
|
|
274
283
|
flex-direction: row;
|
|
275
284
|
block-size: auto;
|
|
276
285
|
overflow-x: auto;
|
|
277
286
|
position: sticky;
|
|
278
287
|
inset-block-start: 0;
|
|
279
|
-
z-index:
|
|
288
|
+
z-index: calc(var(--z-raised) + 1);
|
|
280
289
|
}
|
|
281
290
|
|
|
282
|
-
.app-rail__foot {
|
|
291
|
+
.ui-app-rail__foot {
|
|
283
292
|
display: none;
|
|
284
293
|
}
|
|
285
294
|
|
|
286
|
-
.app-nav {
|
|
295
|
+
.ui-app-nav {
|
|
287
296
|
grid-auto-flow: column;
|
|
288
297
|
gap: 0.15rem;
|
|
289
298
|
}
|
|
290
299
|
|
|
291
|
-
.app-nav__section {
|
|
300
|
+
.ui-app-nav__section {
|
|
292
301
|
display: none;
|
|
293
302
|
}
|
|
294
303
|
|
|
295
|
-
.app-nav a {
|
|
304
|
+
.ui-app-nav a {
|
|
296
305
|
border-inline-start: 0;
|
|
297
306
|
border-block-end: 2px solid transparent;
|
|
298
307
|
white-space: nowrap;
|
|
299
308
|
}
|
|
300
309
|
|
|
301
|
-
.app-nav a.is-active {
|
|
310
|
+
.ui-app-nav a.is-active {
|
|
302
311
|
border-inline-start: 0;
|
|
303
312
|
border-block-end-color: var(--accent);
|
|
304
313
|
}
|
|
305
314
|
|
|
306
|
-
.app-content {
|
|
315
|
+
.ui-app-content {
|
|
307
316
|
padding: var(--space-md);
|
|
308
317
|
}
|
|
309
318
|
}
|
package/css/base.css
CHANGED
|
@@ -161,26 +161,10 @@ input:focus-visible,
|
|
|
161
161
|
select:focus-visible,
|
|
162
162
|
textarea:focus-visible,
|
|
163
163
|
[tabindex]:focus-visible {
|
|
164
|
-
outline: 2px solid var(--
|
|
164
|
+
outline: 2px solid var(--focus-ring);
|
|
165
165
|
outline-offset: 2px;
|
|
166
166
|
}
|
|
167
167
|
|
|
168
|
-
.skip-link {
|
|
169
|
-
background: var(--panel-strong);
|
|
170
|
-
border: 1px solid var(--line-strong);
|
|
171
|
-
border-radius: var(--radius-md);
|
|
172
|
-
color: var(--text);
|
|
173
|
-
inset-inline-start: 1rem;
|
|
174
|
-
padding: 0.7rem 1rem;
|
|
175
|
-
position: fixed;
|
|
176
|
-
inset-block-start: -4rem;
|
|
177
|
-
z-index: 40;
|
|
178
|
-
}
|
|
179
|
-
|
|
180
|
-
.skip-link:focus {
|
|
181
|
-
inset-block-start: 1rem;
|
|
182
|
-
}
|
|
183
|
-
|
|
184
168
|
/* Small global helpers reused across apps. */
|
|
185
169
|
.ui-muted {
|
|
186
170
|
color: var(--text-dim);
|
|
@@ -196,7 +180,6 @@ textarea:focus-visible,
|
|
|
196
180
|
}
|
|
197
181
|
|
|
198
182
|
.ui-visually-hidden {
|
|
199
|
-
clip: rect(0 0 0 0);
|
|
200
183
|
clip-path: inset(50%);
|
|
201
184
|
block-size: 1px;
|
|
202
185
|
overflow: hidden;
|
|
@@ -236,6 +219,14 @@ textarea:focus-visible,
|
|
|
236
219
|
outline-offset: -2px;
|
|
237
220
|
}
|
|
238
221
|
|
|
222
|
+
/* The active tab signals selection only via accent colour/border, both
|
|
223
|
+
flattened by the forced palette — re-assert it with a system colour
|
|
224
|
+
so the selected tab stays distinguishable (a11y review L3). */
|
|
225
|
+
.ui-tab.is-active {
|
|
226
|
+
border-block-end-color: Highlight;
|
|
227
|
+
color: Highlight;
|
|
228
|
+
}
|
|
229
|
+
|
|
239
230
|
/* Keyboard focus must never depend on a colour that gets overridden. */
|
|
240
231
|
a:focus-visible,
|
|
241
232
|
button:focus-visible,
|
|
@@ -262,11 +253,11 @@ textarea:focus-visible,
|
|
|
262
253
|
/* Decorative / interactive chrome never prints. */
|
|
263
254
|
.ui-dotfield,
|
|
264
255
|
.ui-toast-stack,
|
|
265
|
-
.app-rail,
|
|
266
|
-
.app-topbar,
|
|
267
|
-
.
|
|
268
|
-
.
|
|
269
|
-
.
|
|
256
|
+
.ui-app-rail,
|
|
257
|
+
.ui-app-topbar,
|
|
258
|
+
.ui-sitenav,
|
|
259
|
+
.ui-themetoggle__button,
|
|
260
|
+
.ui-sitemenu,
|
|
270
261
|
.ui-spinner,
|
|
271
262
|
.ui-dotloader,
|
|
272
263
|
.ui-dotspinner,
|
package/css/content.css
CHANGED
|
@@ -120,7 +120,7 @@
|
|
|
120
120
|
|
|
121
121
|
@media (hover: hover) {
|
|
122
122
|
.ui-prose a:hover {
|
|
123
|
-
color: var(--accent);
|
|
123
|
+
color: var(--accent-text);
|
|
124
124
|
text-decoration-color: var(--accent);
|
|
125
125
|
}
|
|
126
126
|
}
|
|
@@ -136,7 +136,7 @@
|
|
|
136
136
|
}
|
|
137
137
|
|
|
138
138
|
.ui-prose li::marker {
|
|
139
|
-
color: var(--accent);
|
|
139
|
+
color: var(--accent-text);
|
|
140
140
|
}
|
|
141
141
|
|
|
142
142
|
.ui-prose ul {
|
|
@@ -287,3 +287,38 @@
|
|
|
287
287
|
.ui-prose--compact > * + :is(h1, h2, h3, h4, h5, h6) {
|
|
288
288
|
margin-block-start: var(--space-lg);
|
|
289
289
|
}
|
|
290
|
+
|
|
291
|
+
/* ==========================================================================
|
|
292
|
+
ui-quote — pull-quote with attribution. A long-form companion to
|
|
293
|
+
.ui-prose (works inside it or standalone). Emphasis via scale + a
|
|
294
|
+
short accent rule, not a tinted box. Use <figure>/<blockquote> +
|
|
295
|
+
<figcaption>; tag-agnostic.
|
|
296
|
+
========================================================================== */
|
|
297
|
+
|
|
298
|
+
.ui-quote {
|
|
299
|
+
color: var(--text);
|
|
300
|
+
display: grid;
|
|
301
|
+
font-family: var(--display);
|
|
302
|
+
font-size: var(--text-xl);
|
|
303
|
+
gap: var(--space-sm);
|
|
304
|
+
line-height: 1.2;
|
|
305
|
+
margin-block: var(--space-xl);
|
|
306
|
+
max-inline-size: 40ch;
|
|
307
|
+
text-wrap: balance;
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
.ui-quote::before {
|
|
311
|
+
background: var(--accent);
|
|
312
|
+
block-size: 2px;
|
|
313
|
+
content: '';
|
|
314
|
+
inline-size: 2.5rem;
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
.ui-quote__cite {
|
|
318
|
+
color: var(--text-dim);
|
|
319
|
+
font-family: var(--mono);
|
|
320
|
+
font-size: var(--text-2xs);
|
|
321
|
+
font-style: normal;
|
|
322
|
+
letter-spacing: var(--tracking-wide);
|
|
323
|
+
text-transform: uppercase;
|
|
324
|
+
}
|
package/css/core.css
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
|
-
/* @ponchia/ui —
|
|
2
|
-
|
|
1
|
+
/* @ponchia/ui — the CSS bundle (single source entrypoint).
|
|
2
|
+
The legacy non-ui-* vocabulary and the separate responsive layer were
|
|
3
|
+
removed in 0.3.0; the ui-* components carry their own breakpoints, so
|
|
4
|
+
there is one bundle, not a core/full split.
|
|
3
5
|
|
|
4
6
|
Everything ships inside the `bronto` cascade layer. Any un-layered CSS
|
|
5
7
|
in the consuming app therefore wins over the framework without a
|
|
@@ -12,9 +14,8 @@
|
|
|
12
14
|
@import url('./base.css') layer(bronto);
|
|
13
15
|
@import url('./motion.css') layer(bronto);
|
|
14
16
|
@import url('./dots.css') layer(bronto);
|
|
15
|
-
@import url('./layout.css') layer(bronto);
|
|
16
17
|
@import url('./navigation.css') layer(bronto);
|
|
17
|
-
@import url('./
|
|
18
|
+
@import url('./site.css') layer(bronto);
|
|
18
19
|
@import url('./content.css') layer(bronto);
|
|
19
20
|
@import url('./primitives.css') layer(bronto);
|
|
20
21
|
@import url('./forms.css') layer(bronto);
|
|
@@ -22,5 +23,4 @@
|
|
|
22
23
|
@import url('./overlay.css') layer(bronto);
|
|
23
24
|
@import url('./disclosure.css') layer(bronto);
|
|
24
25
|
@import url('./table.css') layer(bronto);
|
|
25
|
-
@import url('./cards.css') layer(bronto);
|
|
26
26
|
@import url('./app.css') layer(bronto);
|
package/css/disclosure.css
CHANGED
|
@@ -46,7 +46,19 @@
|
|
|
46
46
|
|
|
47
47
|
.ui-tab.is-active {
|
|
48
48
|
border-block-end-color: var(--accent);
|
|
49
|
-
color: var(--accent);
|
|
49
|
+
color: var(--accent-text);
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
.ui-tab:focus-visible {
|
|
53
|
+
/* An inset box, deliberately distinct from the .is-active bottom-border
|
|
54
|
+
so focus ≠ selection for low-vision keyboard users: the global
|
|
55
|
+
button:focus-visible ring would otherwise sit exactly on the active
|
|
56
|
+
underline. Geometry (inset offset), not colour, carries the
|
|
57
|
+
distinction — colour stays the solid accent used by every other
|
|
58
|
+
control's ring (the --focus-ring token wiring is decided globally,
|
|
59
|
+
not per-component). */
|
|
60
|
+
outline: 2px solid var(--focus-ring);
|
|
61
|
+
outline-offset: -3px;
|
|
50
62
|
}
|
|
51
63
|
|
|
52
64
|
.ui-tabs__panel[hidden] {
|
|
@@ -99,7 +111,7 @@
|
|
|
99
111
|
}
|
|
100
112
|
|
|
101
113
|
.ui-accordion__item[open] .ui-accordion__summary {
|
|
102
|
-
color: var(--accent);
|
|
114
|
+
color: var(--accent-text);
|
|
103
115
|
}
|
|
104
116
|
|
|
105
117
|
.ui-accordion__item[open] .ui-accordion__summary::before {
|
|
@@ -157,7 +169,7 @@
|
|
|
157
169
|
}
|
|
158
170
|
|
|
159
171
|
.ui-segmented__option:has(input:focus-visible) {
|
|
160
|
-
outline: 2px solid var(--
|
|
172
|
+
outline: 2px solid var(--focus-ring);
|
|
161
173
|
outline-offset: 2px;
|
|
162
174
|
}
|
|
163
175
|
|
|
@@ -209,7 +221,7 @@
|
|
|
209
221
|
|
|
210
222
|
@media (hover: hover) {
|
|
211
223
|
.ui-breadcrumb__item a:hover {
|
|
212
|
-
color: var(--accent);
|
|
224
|
+
color: var(--accent-text);
|
|
213
225
|
}
|
|
214
226
|
}
|
|
215
227
|
|
|
@@ -246,7 +258,7 @@
|
|
|
246
258
|
|
|
247
259
|
.ui-pagination__item.is-active {
|
|
248
260
|
border-color: var(--accent);
|
|
249
|
-
color: var(--accent);
|
|
261
|
+
color: var(--accent-text);
|
|
250
262
|
}
|
|
251
263
|
|
|
252
264
|
.ui-pagination__item[aria-disabled='true'] {
|
package/css/dots.css
CHANGED
package/css/feedback.css
CHANGED
|
@@ -114,7 +114,14 @@
|
|
|
114
114
|
max-inline-size: min(22rem, calc(100vw - 2rem));
|
|
115
115
|
pointer-events: none;
|
|
116
116
|
position: fixed;
|
|
117
|
-
z-index:
|
|
117
|
+
z-index: var(--z-toast);
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
/* Assertive (error) region — anchored top inline-end so it never
|
|
121
|
+
overlaps the polite bottom stack and reads as a distinct, urgent
|
|
122
|
+
channel. */
|
|
123
|
+
.ui-toast-stack--assertive {
|
|
124
|
+
inset-block: 1.25rem auto;
|
|
118
125
|
}
|
|
119
126
|
|
|
120
127
|
.ui-toast {
|
|
@@ -154,6 +161,30 @@
|
|
|
154
161
|
text-transform: uppercase;
|
|
155
162
|
}
|
|
156
163
|
|
|
164
|
+
.ui-toast__close {
|
|
165
|
+
align-self: start;
|
|
166
|
+
background: none;
|
|
167
|
+
border: 0;
|
|
168
|
+
block-size: 1.4rem;
|
|
169
|
+
color: var(--text-dim);
|
|
170
|
+
cursor: pointer;
|
|
171
|
+
font: inherit;
|
|
172
|
+
grid-column: 3;
|
|
173
|
+
grid-row: 1 / -1;
|
|
174
|
+
inline-size: 1.4rem;
|
|
175
|
+
padding: 0;
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
.ui-toast__close::before {
|
|
179
|
+
content: '\00d7'; /* × — glyph via CSS so the button has no text node */
|
|
180
|
+
font-size: 1.1rem;
|
|
181
|
+
line-height: 1;
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
.ui-toast__close:hover {
|
|
185
|
+
color: var(--text);
|
|
186
|
+
}
|
|
187
|
+
|
|
157
188
|
.ui-toast--accent::before {
|
|
158
189
|
background: var(--accent);
|
|
159
190
|
}
|
|
@@ -196,7 +227,7 @@
|
|
|
196
227
|
opacity var(--duration-fast) var(--ease-standard),
|
|
197
228
|
transform var(--duration-fast) var(--ease-standard);
|
|
198
229
|
white-space: nowrap;
|
|
199
|
-
z-index:
|
|
230
|
+
z-index: var(--z-popover);
|
|
200
231
|
}
|
|
201
232
|
|
|
202
233
|
.ui-tooltip:hover .ui-tooltip__bubble,
|
|
@@ -205,6 +236,60 @@
|
|
|
205
236
|
transform: translate(-50%, 0);
|
|
206
237
|
}
|
|
207
238
|
|
|
239
|
+
/* Progressive enhancement: where CSS anchor positioning exists, lift
|
|
240
|
+
the bubble out of the normal flow so it can't be clipped by an
|
|
241
|
+
ancestor's overflow/scroll and auto-flips at the viewport edge.
|
|
242
|
+
Unsupported browsers keep the absolutely-positioned fallback above
|
|
243
|
+
(fine for short labels; use .ui-popover + initPopover for rich or
|
|
244
|
+
edge-critical content). */
|
|
245
|
+
@supports (anchor-name: --x) {
|
|
246
|
+
.ui-tooltip {
|
|
247
|
+
anchor-name: --ui-tooltip;
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
.ui-tooltip__bubble {
|
|
251
|
+
inset: auto;
|
|
252
|
+
margin-block-end: 0.5rem;
|
|
253
|
+
position: fixed;
|
|
254
|
+
position-anchor: --ui-tooltip;
|
|
255
|
+
position-area: block-start center;
|
|
256
|
+
position-try-fallbacks: flip-block;
|
|
257
|
+
transform: translateY(4px);
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
.ui-tooltip:hover .ui-tooltip__bubble,
|
|
261
|
+
.ui-tooltip:focus-within .ui-tooltip__bubble {
|
|
262
|
+
transform: translateY(0);
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
/* Popover surface — a top-layer panel positioned by initPopover (JS
|
|
267
|
+
collision-aware, dependency-free). Uses the native [popover] top
|
|
268
|
+
layer when available so it never clips; the class styles it either
|
|
269
|
+
way. */
|
|
270
|
+
.ui-popover {
|
|
271
|
+
background: var(--panel-strong);
|
|
272
|
+
border: 1px solid var(--line-strong);
|
|
273
|
+
border-radius: var(--radius-md);
|
|
274
|
+
box-shadow: var(--shadow-raised);
|
|
275
|
+
color: var(--text-soft);
|
|
276
|
+
font-size: var(--text-sm);
|
|
277
|
+
inline-size: max-content;
|
|
278
|
+
margin: 0;
|
|
279
|
+
max-inline-size: min(22rem, calc(100vw - 2rem));
|
|
280
|
+
padding: var(--space-sm) var(--space-md);
|
|
281
|
+
position: fixed;
|
|
282
|
+
z-index: var(--z-popover);
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
.ui-popover:not([popover], .is-open) {
|
|
286
|
+
display: none;
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
.ui-popover[popover]:not(:popover-open) {
|
|
290
|
+
display: none;
|
|
291
|
+
}
|
|
292
|
+
|
|
208
293
|
/* --- Progress — linear, determinate or indeterminate --- */
|
|
209
294
|
|
|
210
295
|
.ui-progress {
|