@aurea-uds/core 0.25.0 → 0.28.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/dist/aurea.css +225 -119
- package/dist/aurea.js +150 -1
- package/package.json +1 -1
package/dist/aurea.css
CHANGED
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
--brand-yellow-foreground:oklch(0.421 0.095 57.708);
|
|
6
6
|
--brand-yellow-text:oklch(0.516 0.105 86.047);
|
|
7
7
|
--font-ui:"Atkinson Hyperlegible Next","Segoe UI",sans-serif;
|
|
8
|
+
--font-heading:"Atkinson Hyperlegible Next","Segoe UI",sans-serif;
|
|
8
9
|
--font-editorial:"Atkinson Hyperlegible Next","Segoe UI",sans-serif;
|
|
9
10
|
--font-code:"Atkinson Hyperlegible Mono",SFMono-Regular,Consolas,monospace;
|
|
10
11
|
--text-xs:0.75rem;
|
|
@@ -117,6 +118,7 @@
|
|
|
117
118
|
--weight-medium:500;
|
|
118
119
|
--weight-semibold:600;
|
|
119
120
|
--weight-bold:700;
|
|
121
|
+
--weight-extrabold:800;
|
|
120
122
|
--icon-sm:1rem;
|
|
121
123
|
--icon-md:1.25rem;
|
|
122
124
|
--icon-lg:1.5rem;
|
|
@@ -130,53 +132,53 @@
|
|
|
130
132
|
--tracking-widest:0.12em;
|
|
131
133
|
}
|
|
132
134
|
[data-theme="dark"]{
|
|
133
|
-
--background
|
|
134
|
-
--foreground
|
|
135
|
-
--card
|
|
136
|
-
--card-foreground
|
|
137
|
-
--popover
|
|
138
|
-
--popover-foreground
|
|
135
|
+
--background:#1f1f1f;
|
|
136
|
+
--foreground:#ffffff;
|
|
137
|
+
--card:#292929;
|
|
138
|
+
--card-foreground:#ffffff;
|
|
139
|
+
--popover:#292929;
|
|
140
|
+
--popover-foreground:#ffffff;
|
|
139
141
|
--primary:var(--brand-yellow);
|
|
140
142
|
--primary-foreground:var(--brand-yellow-foreground);
|
|
141
143
|
--link:var(--brand-yellow);
|
|
142
144
|
--link-hover:var(--brand-yellow);
|
|
143
|
-
--secondary
|
|
144
|
-
--secondary-foreground
|
|
145
|
-
--muted
|
|
146
|
-
--muted-foreground
|
|
147
|
-
--accent
|
|
148
|
-
--accent-foreground
|
|
149
|
-
--destructive
|
|
150
|
-
--destructive-foreground
|
|
151
|
-
--border
|
|
152
|
-
--input
|
|
153
|
-
--ring
|
|
145
|
+
--secondary:#333333;
|
|
146
|
+
--secondary-foreground:#ffffff;
|
|
147
|
+
--muted:#333333;
|
|
148
|
+
--muted-foreground:#adadad;
|
|
149
|
+
--accent:#333333;
|
|
150
|
+
--accent-foreground:#ffffff;
|
|
151
|
+
--destructive:#c50f1f;
|
|
152
|
+
--destructive-foreground:#ffffff;
|
|
153
|
+
--border:#525252;
|
|
154
|
+
--input:#525252;
|
|
155
|
+
--ring:#666666;
|
|
154
156
|
--chart-1:oklch(0.809 0.105 251.813);
|
|
155
157
|
--chart-2:oklch(0.623 0.214 259.815);
|
|
156
158
|
--chart-3:oklch(0.546 0.245 262.881);
|
|
157
159
|
--chart-4:oklch(0.488 0.243 264.376);
|
|
158
160
|
--chart-5:oklch(0.424 0.199 265.638);
|
|
159
|
-
--sidebar
|
|
160
|
-
--sidebar-foreground
|
|
161
|
+
--sidebar:#292929;
|
|
162
|
+
--sidebar-foreground:#ffffff;
|
|
161
163
|
--sidebar-primary:var(--brand-yellow);
|
|
162
164
|
--sidebar-primary-foreground:var(--brand-yellow-foreground);
|
|
163
|
-
--sidebar-accent
|
|
164
|
-
--sidebar-accent-foreground
|
|
165
|
-
--sidebar-border
|
|
166
|
-
--sidebar-ring
|
|
165
|
+
--sidebar-accent:#333333;
|
|
166
|
+
--sidebar-accent-foreground:#ffffff;
|
|
167
|
+
--sidebar-border:#525252;
|
|
168
|
+
--sidebar-ring:#666666;
|
|
167
169
|
--surface-1:var(--card);
|
|
168
170
|
--surface-2:var(--secondary);
|
|
169
171
|
--surface-3:var(--muted);
|
|
170
|
-
--surface-inset
|
|
171
|
-
--surface-hover
|
|
172
|
+
--surface-inset:#141414;
|
|
173
|
+
--surface-hover:#383838;
|
|
172
174
|
--foreground-strong:var(--foreground);
|
|
173
|
-
--subtle-foreground
|
|
174
|
-
--border-strong
|
|
175
|
+
--subtle-foreground:#adadad;
|
|
176
|
+
--border-strong:#adadad;
|
|
175
177
|
--field-bg:var(--muted);
|
|
176
|
-
--overlay:oklch(0 0 0 / 0.
|
|
178
|
+
--overlay:oklch(0 0 0 / 0.5);
|
|
177
179
|
--primary-hover:oklch(0.835 0.19 89);
|
|
178
180
|
--primary-active:oklch(0.74 0.17 84);
|
|
179
|
-
--secondary-hover
|
|
181
|
+
--secondary-hover:#3d3d3d;
|
|
180
182
|
--segment:oklch(0.3964 0.01 285.93);
|
|
181
183
|
--focus:var(--primary);
|
|
182
184
|
--focus-strong:var(--primary);
|
|
@@ -185,66 +187,85 @@
|
|
|
185
187
|
--control-selected:var(--primary);
|
|
186
188
|
--control-selected-foreground:var(--primary-foreground);
|
|
187
189
|
--selection:oklch(0.795 0.184 86.047 / 0.22);
|
|
188
|
-
--success-bg
|
|
189
|
-
--warning-bg
|
|
190
|
-
--danger-bg
|
|
191
|
-
--info-bg
|
|
192
|
-
--
|
|
193
|
-
--
|
|
194
|
-
--
|
|
195
|
-
--
|
|
196
|
-
--
|
|
197
|
-
--
|
|
198
|
-
--
|
|
199
|
-
--
|
|
200
|
-
--
|
|
201
|
-
--
|
|
190
|
+
--success-bg:#052505;
|
|
191
|
+
--warning-bg:#4a1e04;
|
|
192
|
+
--danger-bg:#3b0509;
|
|
193
|
+
--info-bg:#002440;
|
|
194
|
+
--category-red:oklch(0.85 0.08 25);
|
|
195
|
+
--category-red-bg:oklch(0.28 0.07 25 / 0.62);
|
|
196
|
+
--category-orange:oklch(0.76 0.13 55);
|
|
197
|
+
--category-orange-bg:oklch(0.36 0.089 55 / 0.62);
|
|
198
|
+
--category-green:oklch(0.85 0.13 150);
|
|
199
|
+
--category-green-bg:oklch(0.28 0.07 150 / 0.62);
|
|
200
|
+
--category-teal:oklch(0.76 0.13 180);
|
|
201
|
+
--category-teal-bg:oklch(0.36 0.065 180 / 0.62);
|
|
202
|
+
--category-cyan:oklch(0.85 0.098 225);
|
|
203
|
+
--category-cyan-bg:oklch(0.28 0.053 225 / 0.62);
|
|
204
|
+
--category-blue:oklch(0.76 0.121 260);
|
|
205
|
+
--category-blue-bg:oklch(0.36 0.09 260 / 0.62);
|
|
206
|
+
--category-violet:oklch(0.85 0.086 300);
|
|
207
|
+
--category-violet-bg:oklch(0.28 0.07 300 / 0.62);
|
|
208
|
+
--category-pink:oklch(0.76 0.13 350);
|
|
209
|
+
--category-pink-bg:oklch(0.36 0.09 350 / 0.62);
|
|
210
|
+
--warning-400:#faa06b;
|
|
211
|
+
--success-400:#54b054;
|
|
212
|
+
--danger-400:#eeacb2;
|
|
213
|
+
--info-400:#5caae5;
|
|
214
|
+
--success:#107c10;
|
|
215
|
+
--success-foreground:#ffffff;
|
|
216
|
+
--success-hover:#0e700e;
|
|
217
|
+
--info:#0078d4;
|
|
218
|
+
--info-foreground:#ffffff;
|
|
219
|
+
--info-hover:#006cbf;
|
|
220
|
+
--warning:#f7630c;
|
|
221
|
+
--warning-foreground:#242424;
|
|
222
|
+
--warning-hover:#de590b;
|
|
202
223
|
}
|
|
203
224
|
[data-theme="light"]{
|
|
204
|
-
--background
|
|
205
|
-
--foreground
|
|
206
|
-
--card
|
|
207
|
-
--card-foreground
|
|
208
|
-
--popover
|
|
209
|
-
--popover-foreground
|
|
225
|
+
--background:#f5f5f5;
|
|
226
|
+
--foreground:#242424;
|
|
227
|
+
--card:#ffffff;
|
|
228
|
+
--card-foreground:#242424;
|
|
229
|
+
--popover:#ffffff;
|
|
230
|
+
--popover-foreground:#242424;
|
|
210
231
|
--primary:var(--brand-yellow);
|
|
211
232
|
--primary-foreground:var(--brand-yellow-foreground);
|
|
212
233
|
--link:oklch(0.52 0.106 86.047);
|
|
213
234
|
--link-hover:oklch(0.44 0.106 86.047);
|
|
214
|
-
--secondary
|
|
215
|
-
--secondary-foreground
|
|
235
|
+
--secondary:#ebebeb;
|
|
236
|
+
--secondary-foreground:#242424;
|
|
216
237
|
--muted:var(--secondary);
|
|
217
|
-
--muted-foreground
|
|
238
|
+
--muted-foreground:#616161;
|
|
218
239
|
--accent:var(--secondary);
|
|
219
|
-
--accent-foreground
|
|
220
|
-
--destructive
|
|
221
|
-
--destructive-foreground
|
|
222
|
-
--border
|
|
223
|
-
--input
|
|
224
|
-
--ring
|
|
240
|
+
--accent-foreground:#242424;
|
|
241
|
+
--destructive:#c50f1f;
|
|
242
|
+
--destructive-foreground:#ffffff;
|
|
243
|
+
--border:#e0e0e0;
|
|
244
|
+
--input:#e0e0e0;
|
|
245
|
+
--ring:#d1d1d1;
|
|
225
246
|
--chart-1:oklch(0.809 0.105 251.813);
|
|
226
247
|
--chart-2:oklch(0.623 0.214 259.815);
|
|
227
248
|
--chart-3:oklch(0.546 0.245 262.881);
|
|
228
249
|
--chart-4:oklch(0.488 0.243 264.376);
|
|
229
250
|
--chart-5:oklch(0.424 0.199 265.638);
|
|
230
251
|
--sidebar:var(--card);
|
|
231
|
-
--sidebar-foreground
|
|
252
|
+
--sidebar-foreground:#242424;
|
|
232
253
|
--sidebar-primary:var(--primary-emphasis);
|
|
233
254
|
--sidebar-primary-foreground:var(--brand-yellow-foreground);
|
|
234
255
|
--sidebar-accent:var(--secondary);
|
|
235
|
-
--sidebar-accent-foreground
|
|
236
|
-
--sidebar-border
|
|
237
|
-
--sidebar-ring
|
|
256
|
+
--sidebar-accent-foreground:#242424;
|
|
257
|
+
--sidebar-border:#e0e0e0;
|
|
258
|
+
--sidebar-ring:#d1d1d1;
|
|
238
259
|
--surface-1:var(--card);
|
|
239
260
|
--surface-2:var(--secondary);
|
|
240
261
|
--surface-3:var(--muted);
|
|
241
|
-
--surface-inset
|
|
242
|
-
--surface-hover
|
|
262
|
+
--surface-inset:#f0f0f0;
|
|
263
|
+
--surface-hover:#e6e6e6;
|
|
243
264
|
--foreground-strong:var(--foreground);
|
|
244
|
-
--subtle-foreground
|
|
245
|
-
--border-strong
|
|
265
|
+
--subtle-foreground:#616161;
|
|
266
|
+
--border-strong:#616161;
|
|
246
267
|
--field-bg:var(--muted);
|
|
247
|
-
--overlay:oklch(0
|
|
268
|
+
--overlay:oklch(0 0 0 / 0.4);
|
|
248
269
|
--primary-hover:oklch(0.835 0.19 89);
|
|
249
270
|
--primary-active:oklch(0.74 0.17 84);
|
|
250
271
|
--secondary-hover:var(--surface-hover);
|
|
@@ -255,26 +276,42 @@
|
|
|
255
276
|
--primary-outline:var(--brand-yellow-text);
|
|
256
277
|
--control-selected:var(--brand-yellow-foreground);
|
|
257
278
|
--control-selected-foreground:oklch(0.985 0 0);
|
|
258
|
-
--success-400
|
|
259
|
-
--warning-400
|
|
260
|
-
--danger-400:#
|
|
261
|
-
--info-400
|
|
279
|
+
--success-400:#0e700e;
|
|
280
|
+
--warning-400:#8a3707;
|
|
281
|
+
--danger-400:#b10e1c;
|
|
282
|
+
--info-400:#006cbf;
|
|
262
283
|
--oracle-300:var(--chart-4);
|
|
263
284
|
--oracle-400:var(--chart-4);
|
|
264
285
|
--selection:oklch(0.795 0.184 86.047 / 0.18);
|
|
265
|
-
--success-bg
|
|
266
|
-
--warning-bg
|
|
267
|
-
--danger-bg
|
|
268
|
-
--info-bg
|
|
269
|
-
--
|
|
270
|
-
--
|
|
271
|
-
--
|
|
272
|
-
--
|
|
273
|
-
--
|
|
274
|
-
--
|
|
275
|
-
--
|
|
276
|
-
--
|
|
277
|
-
--
|
|
286
|
+
--success-bg:#f1faf1;
|
|
287
|
+
--warning-bg:#fff9f5;
|
|
288
|
+
--danger-bg:#fdf3f4;
|
|
289
|
+
--info-bg:#f3f9fd;
|
|
290
|
+
--category-red:oklch(0.52 0.15 25);
|
|
291
|
+
--category-red-bg:oklch(0.96 0.019 25);
|
|
292
|
+
--category-orange:oklch(0.47 0.115 55);
|
|
293
|
+
--category-orange-bg:oklch(0.925 0.044 55);
|
|
294
|
+
--category-green:oklch(0.52 0.141 150);
|
|
295
|
+
--category-green-bg:oklch(0.96 0.035 150);
|
|
296
|
+
--category-teal:oklch(0.47 0.084 180);
|
|
297
|
+
--category-teal-bg:oklch(0.925 0.055 180);
|
|
298
|
+
--category-cyan:oklch(0.52 0.097 225);
|
|
299
|
+
--category-cyan-bg:oklch(0.96 0.025 225);
|
|
300
|
+
--category-blue:oklch(0.47 0.15 260);
|
|
301
|
+
--category-blue-bg:oklch(0.925 0.035 260);
|
|
302
|
+
--category-violet:oklch(0.52 0.15 300);
|
|
303
|
+
--category-violet-bg:oklch(0.96 0.022 300);
|
|
304
|
+
--category-pink:oklch(0.47 0.15 350);
|
|
305
|
+
--category-pink-bg:oklch(0.925 0.044 350);
|
|
306
|
+
--success:#107c10;
|
|
307
|
+
--success-foreground:#ffffff;
|
|
308
|
+
--success-hover:#0e700e;
|
|
309
|
+
--info:#0078d4;
|
|
310
|
+
--info-foreground:#ffffff;
|
|
311
|
+
--info-hover:#006cbf;
|
|
312
|
+
--warning:#f7630c;
|
|
313
|
+
--warning-foreground:#242424;
|
|
314
|
+
--warning-hover:#de590b;
|
|
278
315
|
}
|
|
279
316
|
[data-brand="lory"][data-theme="dark"]{
|
|
280
317
|
--background:oklch(0.16 0.018 250);
|
|
@@ -817,7 +854,9 @@ img,svg { display:block; }
|
|
|
817
854
|
/* O rótulo de grupo também sai da escala da LATERAL, pelo mesmo motivo: `--subtle-foreground` é
|
|
818
855
|
apagado contra a página, e contra um painel escuro num tema claro ele some. Derivado do próprio
|
|
819
856
|
`--sidebar-foreground` em vez de token novo — a lateral não publica um "muted" dela. */
|
|
820
|
-
|
|
857
|
+
/* 72% e não 62% desde a 0.27.0 (ADR-0061): com a letra da paleta nova (#242424, menos preta) os 62%
|
|
858
|
+
davam 4,4:1 sobre o branco — o axe pegou na varredura. 72% é o cinza de texto apagado da paleta. */
|
|
859
|
+
.sidebar-group-label { margin:var(--space-3) var(--space-3) var(--space-1); color:color-mix(in oklab, var(--sidebar-foreground) 72%, transparent); font-size:var(--text-xs); font-weight:var(--weight-medium); letter-spacing:var(--tracking-widest); text-transform:uppercase; }
|
|
821
860
|
.sidebar-sub { padding-inline-start:var(--space-5); }
|
|
822
861
|
/* RECOLHIDA — a lateral vira trilho de ícones. O rótulo NÃO some do DOM: o React troca a
|
|
823
862
|
classe dele por `.sr-only`, então quem usa leitor de tela continua ouvindo o nome. Ícone
|
|
@@ -1196,7 +1235,11 @@ img,svg { display:block; }
|
|
|
1196
1235
|
/* A base do botão carrega as VARIÁVEIS DE PASSO da camada responsiva (`--step-*`), e cada
|
|
1197
1236
|
fallback é exatamente o valor fixo de antes — então o botão sem valor responsivo desenha o
|
|
1198
1237
|
mesmo pixel. É o que permite a camada `size-*` repor a grandeza sem tocar no componente. */
|
|
1199
|
-
.btn { --btn-bg:transparent; --btn-fg:var(--foreground); --btn-border:transparent; display:inline-flex; align-items:center; justify-content:center; gap:var(--step-gap,8px); block-size:var(--step-h,var(--control-h-md));
|
|
1238
|
+
.btn { --btn-bg:transparent; --btn-fg:var(--foreground); --btn-border:transparent; display:inline-flex; align-items:center; justify-content:center; gap:var(--step-gap,8px); block-size:var(--step-h,var(--control-h-md)); border:1px solid var(--btn-border); border-radius:var(--radius-control); background:var(--btn-bg); color:var(--btn-fg); font-size:var(--step-fs,var(--text-sm)); font-weight:var(--weight-medium); line-height:var(--leading-none); text-decoration:none; white-space:nowrap; cursor:pointer; transition:transform var(--duration-fast) var(--ease-standard),background var(--duration-fast),border-color var(--duration-fast),color var(--duration-fast),opacity var(--duration-fast); }
|
|
1239
|
+
/* GAR-14 (0.28.0): o recheio do botão vale também para o aviso preso a ele (`.toast-anchored`),
|
|
1240
|
+
que tem a MEDIDA do botão — pedido do Victor na bancada. Uma regra só, para os dois nunca
|
|
1241
|
+
divergirem e para o número não se repetir. */
|
|
1242
|
+
.btn,.toast-anchored { padding-inline:var(--step-px,15px); }
|
|
1200
1243
|
.btn:hover:not(:disabled):not([aria-disabled="true"]) { transform:none; } .btn:active:not(:disabled) { transform:scale(.97); opacity:.9; }
|
|
1201
1244
|
/* Duas formas de "não dá para fazer isto", e a diferença é QUEM alcança a explicação.
|
|
1202
1245
|
`:disabled` tira o controle da ordem de foco — medido em 13/08/2026: quem usa teclado nunca
|
|
@@ -1259,11 +1302,11 @@ img,svg { display:block; }
|
|
|
1259
1302
|
.btn-primary-outline:hover:not(:disabled) { --btn-bg:color-mix(in oklab, var(--primary) 14%, transparent); }
|
|
1260
1303
|
.btn-primary-ghost { --btn-bg:transparent; --btn-fg:var(--primary); --btn-border:transparent; }
|
|
1261
1304
|
.btn-primary-ghost:hover:not(:disabled) { --btn-bg:color-mix(in oklab, var(--primary) 14%, transparent); }
|
|
1262
|
-
.btn-danger-outline { --btn-bg:transparent; --btn-fg:var(--
|
|
1305
|
+
.btn-danger-outline { --btn-bg:transparent; --btn-fg:var(--danger-400); --btn-border:var(--danger-400); }
|
|
1263
1306
|
.btn-danger-outline:hover:not(:disabled):not([aria-disabled="true"]) { --btn-bg:color-mix(in oklab, var(--destructive) 14%, transparent); }
|
|
1264
|
-
.btn-danger-ghost { --btn-bg:transparent; --btn-fg:var(--
|
|
1307
|
+
.btn-danger-ghost { --btn-bg:transparent; --btn-fg:var(--danger-400); --btn-border:transparent; }
|
|
1265
1308
|
.btn-danger-ghost:hover:not(:disabled):not([aria-disabled="true"]) { --btn-bg:color-mix(in oklab, var(--destructive) 14%, transparent); }
|
|
1266
|
-
[data-theme="light"] .btn-danger-outline:where(:not([data-theme="dark"] *),[data-theme="dark"] [data-theme="light"] *),[data-theme="light"] .btn-danger-ghost:where(:not([data-theme="dark"] *),[data-theme="dark"] [data-theme="light"] *),[data-theme="light"] .btn-link-danger:where(:not([data-theme="dark"] *),[data-theme="dark"] [data-theme="light"] *) { --btn-fg:
|
|
1309
|
+
[data-theme="light"] .btn-danger-outline:where(:not([data-theme="dark"] *),[data-theme="dark"] [data-theme="light"] *),[data-theme="light"] .btn-danger-ghost:where(:not([data-theme="dark"] *),[data-theme="dark"] [data-theme="light"] *),[data-theme="light"] .btn-link-danger:where(:not([data-theme="dark"] *),[data-theme="dark"] [data-theme="light"] *) { --btn-fg:var(--danger-400); }
|
|
1267
1310
|
/* A MESMA correção para a marca, que estava faltando. Medido em 21/08/2026 na varredura de AA
|
|
1268
1311
|
da matriz de tom: `.btn-primary-outline` e `.btn-primary-ghost` pintavam o rótulo com
|
|
1269
1312
|
`--primary` cru, e no tema claro isso dá **1.73:1** — reprovação grave, em componente
|
|
@@ -1283,7 +1326,7 @@ img,svg { display:block; }
|
|
|
1283
1326
|
.btn-link:hover:not(:disabled):not([aria-disabled="true"]) { text-decoration-thickness:2px; }
|
|
1284
1327
|
.btn-link-primary { --btn-fg:var(--primary); }
|
|
1285
1328
|
[data-theme="light"] .btn-link-primary:where(:not([data-theme="dark"] *),[data-theme="dark"] [data-theme="light"] *) { --btn-fg:color-mix(in oklab, var(--primary) 45%, var(--foreground)); }
|
|
1286
|
-
.btn-link-danger { --btn-fg:var(--
|
|
1329
|
+
.btn-link-danger { --btn-fg:var(--danger-400); }
|
|
1287
1330
|
/* pressed entra na linguagem única de "selecionado" acima; só-ícone não leva o fio. */
|
|
1288
1331
|
/* Kbd — a tecla que dispara a ação, dentro ou fora do botão. Peça própria, não decoração. */
|
|
1289
1332
|
.kbd { display:inline-flex; align-items:center; justify-content:center; gap:2px; min-width:20px; height:20px; padding:0 6px; border:1px solid var(--border-strong); border-radius:var(--radius-sm); background:var(--secondary); color:var(--muted-foreground); font:500 11px/1 var(--font-code); }
|
|
@@ -1326,24 +1369,26 @@ img,svg { display:block; }
|
|
|
1326
1369
|
.btn-solid.btn-tone-info:hover:not(:disabled) { --btn-bg:var(--info-hover); --btn-fg:var(--info-foreground); }
|
|
1327
1370
|
.btn-solid.btn-tone-warning { --btn-bg:var(--warning); --btn-fg:var(--warning-foreground); --btn-border:transparent; }
|
|
1328
1371
|
.btn-solid.btn-tone-warning:hover:not(:disabled) { --btn-bg:var(--warning-hover); --btn-fg:var(--warning-foreground); }
|
|
1329
|
-
/* e o mesmo tom SEM caixa: contorno, fantasma, link e navegação.
|
|
1330
|
-
|
|
1372
|
+
/* e o mesmo tom SEM caixa: contorno, fantasma, link e navegação. ⚠ Desde a 0.27.0 (ADR-0061) o
|
|
1373
|
+
token de tom (`--success`) é o FUNDO cheio — a mesma cor funda nos dois temas —, e não serve
|
|
1374
|
+
de letra no escuro. Letra, ícone, borda e barra sobre a superfície usam o par de letra
|
|
1375
|
+
(`--success-400`, `--info-400`, `--warning-400`, `--danger-400`), que cada tema ajusta. */
|
|
1331
1376
|
.btn-tone-brand,.btn-tone-brand:hover:not(:disabled) { --btn-fg:var(--primary); }
|
|
1332
1377
|
[data-theme="light"] .btn-tone-brand:where(:not([data-theme="dark"] *),[data-theme="dark"] [data-theme="light"] *),[data-theme="light"] .btn-tone-brand:hover:not(:disabled):where(:not([data-theme="dark"] *),[data-theme="dark"] [data-theme="light"] *) { --btn-fg:color-mix(in oklab, var(--primary) 45%, var(--foreground)); }
|
|
1333
1378
|
.btn-outline.btn-tone-brand { --btn-border:var(--primary); }
|
|
1334
1379
|
.btn-tone-brand:not(.btn-link):hover:not(:disabled) { --btn-bg:color-mix(in oklab, var(--primary) 14%, transparent); }
|
|
1335
|
-
.btn-tone-danger,.btn-tone-danger:hover:not(:disabled) { --btn-fg:var(--
|
|
1336
|
-
[data-theme="light"] .btn-tone-danger:where(:not([data-theme="dark"] *),[data-theme="dark"] [data-theme="light"] *),[data-theme="light"] .btn-tone-danger:hover:not(:disabled):where(:not([data-theme="dark"] *),[data-theme="dark"] [data-theme="light"] *) { --btn-fg:
|
|
1337
|
-
.btn-outline.btn-tone-danger { --btn-border:var(--
|
|
1380
|
+
.btn-tone-danger,.btn-tone-danger:hover:not(:disabled) { --btn-fg:var(--danger-400); }
|
|
1381
|
+
[data-theme="light"] .btn-tone-danger:where(:not([data-theme="dark"] *),[data-theme="dark"] [data-theme="light"] *),[data-theme="light"] .btn-tone-danger:hover:not(:disabled):where(:not([data-theme="dark"] *),[data-theme="dark"] [data-theme="light"] *) { --btn-fg:var(--danger-400); }
|
|
1382
|
+
.btn-outline.btn-tone-danger { --btn-border:var(--danger-400); }
|
|
1338
1383
|
.btn-tone-danger:not(.btn-link):hover:not(:disabled) { --btn-bg:color-mix(in oklab, var(--destructive) 14%, transparent); }
|
|
1339
|
-
.btn-tone-success,.btn-tone-success:hover:not(:disabled) { --btn-fg:var(--success); }
|
|
1340
|
-
.btn-outline.btn-tone-success { --btn-border:var(--success); }
|
|
1384
|
+
.btn-tone-success,.btn-tone-success:hover:not(:disabled) { --btn-fg:var(--success-400); }
|
|
1385
|
+
.btn-outline.btn-tone-success { --btn-border:var(--success-400); }
|
|
1341
1386
|
.btn-tone-success:not(.btn-link):not(.btn-solid):hover:not(:disabled) { --btn-bg:color-mix(in oklab, var(--success) 14%, transparent); }
|
|
1342
|
-
.btn-tone-info,.btn-tone-info:hover:not(:disabled) { --btn-fg:var(--info); }
|
|
1343
|
-
.btn-outline.btn-tone-info { --btn-border:var(--info); }
|
|
1387
|
+
.btn-tone-info,.btn-tone-info:hover:not(:disabled) { --btn-fg:var(--info-400); }
|
|
1388
|
+
.btn-outline.btn-tone-info { --btn-border:var(--info-400); }
|
|
1344
1389
|
.btn-tone-info:not(.btn-link):not(.btn-solid):hover:not(:disabled) { --btn-bg:color-mix(in oklab, var(--info) 14%, transparent); }
|
|
1345
|
-
.btn-tone-warning,.btn-tone-warning:hover:not(:disabled) { --btn-fg:var(--warning); }
|
|
1346
|
-
.btn-outline.btn-tone-warning { --btn-border:var(--warning); }
|
|
1390
|
+
.btn-tone-warning,.btn-tone-warning:hover:not(:disabled) { --btn-fg:var(--warning-400); }
|
|
1391
|
+
.btn-outline.btn-tone-warning { --btn-border:var(--warning-400); }
|
|
1347
1392
|
.btn-tone-warning:not(.btn-link):not(.btn-solid):hover:not(:disabled) { --btn-bg:color-mix(in oklab, var(--warning) 14%, transparent); }
|
|
1348
1393
|
.btn-nav:hover:not(:disabled):not([aria-disabled="true"]) { --btn-fg:var(--foreground); }
|
|
1349
1394
|
/* O botão só de ícone é REDONDO, em todos os tamanhos — decisão do Victor, 25/09/2026
|
|
@@ -1440,7 +1485,7 @@ img,svg { display:block; }
|
|
|
1440
1485
|
Largura em token para caber de 3 a 4 dígitos sem virar caixa de texto. */
|
|
1441
1486
|
.number-field { display:inline-flex; }
|
|
1442
1487
|
.number-field-group { display:inline-flex; align-items:center; gap:var(--space-1); }
|
|
1443
|
-
.number-field-input { width:var(--space-16); text-align:center; }
|
|
1488
|
+
.number-field-input { width:var(--space-16); text-align:center; font-variant-numeric:tabular-nums; }
|
|
1444
1489
|
/* A ALÇA DE ARRASTO (G-API-02), e só quando `scrubbable` está ligada.
|
|
1445
1490
|
O motor já põe por ESTILO EM LINHA tudo o que é mecânica — `touch-action:none` e
|
|
1446
1491
|
`user-select:none` na alça, e `position:fixed` mais o `transform` no cursor virtual, que ele
|
|
@@ -1795,10 +1840,22 @@ img,svg { display:block; }
|
|
|
1795
1840
|
o contador cai sobre a cor da marca e precisa da mesma inversão do botão primário. Os outros
|
|
1796
1841
|
seis deixam o contador sobre a superfície da barra, onde ele já se lê. */
|
|
1797
1842
|
|
|
1798
|
-
.badge-success { --badge-accent:var(--success-400); color:var(--success-400); background:var(--success-bg); border-color:color-mix(in srgb,var(--success-400) 35%,var(--border)); }
|
|
1799
|
-
.badge-warning { --badge-accent:var(--warning-400); color:var(--warning-400); background:var(--warning-bg); border-color:color-mix(in srgb,var(--warning-400) 35%,var(--border)); }
|
|
1800
|
-
.badge-danger { --badge-accent:var(--danger-400); color:var(--danger-400); background:var(--danger-bg); border-color:color-mix(in srgb,var(--danger-400) 35%,var(--border)); }
|
|
1801
|
-
.badge-info,.badge-running { --badge-accent:var(--info-400); color:var(--info-400); background:var(--info-bg); border-color:color-mix(in srgb,var(--info-400) 35%,var(--border)); }
|
|
1843
|
+
.badge-success { --badge-accent:var(--success-400); --badge-fill:var(--success); --badge-on:var(--success-foreground); color:var(--success-400); background:var(--success-bg); border-color:color-mix(in srgb,var(--success-400) 35%,var(--border)); }
|
|
1844
|
+
.badge-warning { --badge-accent:var(--warning-400); --badge-fill:var(--warning); --badge-on:var(--warning-foreground); color:var(--warning-400); background:var(--warning-bg); border-color:color-mix(in srgb,var(--warning-400) 35%,var(--border)); }
|
|
1845
|
+
.badge-danger { --badge-accent:var(--danger-400); --badge-fill:var(--destructive); --badge-on:var(--destructive-foreground); color:var(--danger-400); background:var(--danger-bg); border-color:color-mix(in srgb,var(--danger-400) 35%,var(--border)); }
|
|
1846
|
+
.badge-info,.badge-running { --badge-accent:var(--info-400); --badge-fill:var(--info); --badge-on:var(--info-foreground); color:var(--info-400); background:var(--info-bg); border-color:color-mix(in srgb,var(--info-400) 35%,var(--border)); }
|
|
1847
|
+
/* AS OITO CORES DE CATEGORIA (GAR-07, ADR-0060, 09/10/2026): marcam GRUPO, não estado — "Motos" e
|
|
1848
|
+
"Carros" num site de notícias. Mesma receita dos quatro propósitos acima (acento, fundo suave e
|
|
1849
|
+
o fio misturado com a borda), e por isso as três ênfases valem para elas sem regra nova. O
|
|
1850
|
+
amarelo fica de fora: é da marca. Quem cobra o AA nos dois temas é o `badge-categoria.spec.ts`. */
|
|
1851
|
+
.badge-red { --badge-accent:var(--category-red); color:var(--category-red); background:var(--category-red-bg); border-color:color-mix(in srgb,var(--category-red) 35%,var(--border)); }
|
|
1852
|
+
.badge-orange { --badge-accent:var(--category-orange); color:var(--category-orange); background:var(--category-orange-bg); border-color:color-mix(in srgb,var(--category-orange) 35%,var(--border)); }
|
|
1853
|
+
.badge-green { --badge-accent:var(--category-green); color:var(--category-green); background:var(--category-green-bg); border-color:color-mix(in srgb,var(--category-green) 35%,var(--border)); }
|
|
1854
|
+
.badge-teal { --badge-accent:var(--category-teal); color:var(--category-teal); background:var(--category-teal-bg); border-color:color-mix(in srgb,var(--category-teal) 35%,var(--border)); }
|
|
1855
|
+
.badge-cyan { --badge-accent:var(--category-cyan); color:var(--category-cyan); background:var(--category-cyan-bg); border-color:color-mix(in srgb,var(--category-cyan) 35%,var(--border)); }
|
|
1856
|
+
.badge-blue { --badge-accent:var(--category-blue); color:var(--category-blue); background:var(--category-blue-bg); border-color:color-mix(in srgb,var(--category-blue) 35%,var(--border)); }
|
|
1857
|
+
.badge-violet { --badge-accent:var(--category-violet); color:var(--category-violet); background:var(--category-violet-bg); border-color:color-mix(in srgb,var(--category-violet) 35%,var(--border)); }
|
|
1858
|
+
.badge-pink { --badge-accent:var(--category-pink); color:var(--category-pink); background:var(--category-pink-bg); border-color:color-mix(in srgb,var(--category-pink) 35%,var(--border)); }
|
|
1802
1859
|
/* ── AS TRÊS ÊNFASES — e elas vêm DEPOIS das variantes de propósito ─────────────────
|
|
1803
1860
|
Cada variante declara só o ACENTO; as ênfases saem dele. Antes cada variante escrevia
|
|
1804
1861
|
cor + fundo + borda na mão, e uma ênfase nova custaria seis regras novas.
|
|
@@ -1808,7 +1865,10 @@ img,svg { display:block; }
|
|
|
1808
1865
|
número do `soft`. É a mesma armadilha que o `.banner` e o `.data-list` já pagaram aqui.
|
|
1809
1866
|
`--background` como texto do sólido serve aos DOIS temas porque o acento já vira com o
|
|
1810
1867
|
tema: `--success-400` é verde CLARO no escuro e verde ESCURO no claro. */
|
|
1811
|
-
|
|
1868
|
+
/* O selo CHEIO de estado é o botão cheio do mesmo tom (ADR-0061): a mesma cor funda e a mesma letra
|
|
1869
|
+
(`--badge-fill`/`--badge-on`). Quem não declara o par (as categorias, a marca, o neutro) segue
|
|
1870
|
+
enchendo com o acento, como antes. */
|
|
1871
|
+
.badge-solid { background:var(--badge-fill, var(--badge-accent)); color:var(--badge-on, var(--background)); border-color:transparent; }
|
|
1812
1872
|
.badge-outline { background:transparent; color:var(--badge-accent); border-color:var(--badge-accent); }
|
|
1813
1873
|
.status-dot { width:8px; height:8px; border-radius:50%; background:currentColor; box-shadow:0 0 0 3px color-mix(in srgb,currentColor 14%,transparent); }
|
|
1814
1874
|
/* Status: condição operacional (DIRECTION §3.6) — NÃO é o pill do Badge; é ponto + rótulo
|
|
@@ -1817,10 +1877,10 @@ img,svg { display:block; }
|
|
|
1817
1877
|
nomes operacionais e os semânticos apontam pro mesmo par de tokens de propósito. */
|
|
1818
1878
|
.status { display:inline-flex; align-items:center; gap:var(--space-2); color:var(--muted-foreground); font-size:var(--text-sm); }
|
|
1819
1879
|
.status-label { color:var(--foreground); }
|
|
1820
|
-
.status-online,.status-success { color:var(--success); }
|
|
1821
|
-
.status-away,.status-warning { color:var(--warning); }
|
|
1880
|
+
.status-online,.status-success { color:var(--success-400); }
|
|
1881
|
+
.status-away,.status-warning { color:var(--warning-400); }
|
|
1822
1882
|
.status-busy,.status-danger { color:var(--danger-400); }
|
|
1823
|
-
.status-running,.status-info { color:var(--info); }
|
|
1883
|
+
.status-running,.status-info { color:var(--info-400); }
|
|
1824
1884
|
/* offline é o único que NÃO é "mais uma cor": --subtle-foreground e --muted-foreground
|
|
1825
1885
|
colapsam no MESMO valor no tema claro, então offline sairia idêntico ao neutral. Ponto
|
|
1826
1886
|
VAZADO resolve nos dois temas e ainda diz a coisa certa (ausência, não outro estado).
|
|
@@ -1881,7 +1941,7 @@ img,svg { display:block; }
|
|
|
1881
1941
|
.alert h4,.alert strong { display:block; margin:0 0 2px; font-size:var(--text-sm); } .alert p { margin:0; color:var(--muted-foreground); font-size:var(--text-sm); }
|
|
1882
1942
|
/* A cor do glifo é a da variante, senão o ícone vira enfeite cinza e não repete o sinal.
|
|
1883
1943
|
Só o ícone DIRETO do alerta: um ícone dentro do corpo (num botão, num link) é do corpo. */
|
|
1884
|
-
.alert>.icon { color:var(--info); } .alert-success>.icon { color:var(--success); } .alert-warning>.icon { color:var(--warning); } .alert-danger>.icon { color:var(--danger-400); }
|
|
1944
|
+
.alert>.icon { color:var(--info-400); } .alert-success>.icon { color:var(--success-400); } .alert-warning>.icon { color:var(--warning-400); } .alert-danger>.icon { color:var(--danger-400); }
|
|
1885
1945
|
.banner strong { font-size:var(--text-sm); } .banner p { margin:0; color:var(--muted-foreground); font-size:var(--text-sm); }
|
|
1886
1946
|
@media (max-width:640px) { .banner { grid-template-columns:auto minmax(0,1fr); } .banner>:last-child { grid-column:2; justify-self:start; } }
|
|
1887
1947
|
.progress { height:8px; overflow:hidden; border-radius:999px; background:var(--surface-3); }
|
|
@@ -1893,10 +1953,10 @@ img,svg { display:block; }
|
|
|
1893
1953
|
.progress-field { display:grid; gap:var(--space-1); }
|
|
1894
1954
|
.progress-detail { justify-self:end; color:var(--muted-foreground); font-size:var(--text-sm); font-weight:var(--weight-medium); font-variant-numeric:tabular-nums; }
|
|
1895
1955
|
.progress-tone-neutral>span { background:var(--muted-foreground); }
|
|
1896
|
-
.progress-tone-success>span { background:var(--success); }
|
|
1897
|
-
.progress-tone-warning>span { background:var(--warning); }
|
|
1898
|
-
.progress-tone-danger>span { background:var(--
|
|
1899
|
-
.progress-tone-info>span { background:var(--info); }
|
|
1956
|
+
.progress-tone-success>span { background:var(--success-400); }
|
|
1957
|
+
.progress-tone-warning>span { background:var(--warning-400); }
|
|
1958
|
+
.progress-tone-danger>span { background:var(--danger-400); }
|
|
1959
|
+
.progress-tone-info>span { background:var(--info-400); }
|
|
1900
1960
|
/* Sem total, um pedaço de 2/5 corre pelo trilho: os números da referência (a largura de 2/5, de -100% a 350%
|
|
1901
1961
|
da própria largura, 1,5 s, a curva dela). A referência anda com `translateX`; aqui anda a MARGEM LÓGICA
|
|
1902
1962
|
(de -40% a 140% do trilho, o mesmo percurso), para correr ao contrário na escrita da direita para
|
|
@@ -1990,7 +2050,9 @@ img,svg { display:block; }
|
|
|
1990
2050
|
`tabIndex=0` (região rolável precisa ser alcançável pelo teclado) e o `.table-wrap` não é. */
|
|
1991
2051
|
.table-wrap,.table-region { overflow:auto; border:1px solid var(--border); border-radius:var(--radius-card); background:var(--card); }
|
|
1992
2052
|
.table,.table-wrap table { width:100%; border-collapse:collapse; min-width:720px; }
|
|
1993
|
-
.
|
|
2053
|
+
/* GAR-16 (0.28.0): a tabela inteira com algarismos da mesma largura — a coluna de preço e de ano
|
|
2054
|
+
alinha. Só os algarismos mudam; o texto das outras colunas fica igual. */
|
|
2055
|
+
.table th,.table td,.table-wrap th,.table-wrap td { height:var(--row-h); padding:0 14px; text-align:start; border-bottom:1px solid var(--border); font-variant-numeric:tabular-nums; }
|
|
1994
2056
|
.table th,.table-wrap th { color:var(--subtle-foreground); background:var(--surface-2); font-size:var(--text-xs); letter-spacing:var(--tracking-wider); text-transform:uppercase; }
|
|
1995
2057
|
.table tr:last-child td,.table-wrap tr:last-child td { border-bottom:0; }
|
|
1996
2058
|
.table tbody tr:hover,.table-wrap tbody tr:hover { background:var(--surface-2); }
|
|
@@ -2047,13 +2109,27 @@ img,svg { display:block; }
|
|
|
2047
2109
|
/* O "+N" é um avatar como os outros — mesma caixa, mesma borda —, só que menor por dentro e sem
|
|
2048
2110
|
peso de nome próprio: ele conta, não identifica. */
|
|
2049
2111
|
.avatar-count { background:var(--secondary); color:var(--muted-foreground); font-size:var(--text-xs); font-weight:var(--weight-medium); }
|
|
2050
|
-
.kpi { display:flex; flex-direction:column; gap:
|
|
2112
|
+
.kpi { display:flex; flex-direction:column; gap:var(--space-1); }
|
|
2051
2113
|
/* O NÚMERO do KPI (08/10/2026, pedido de um consumidor com baixa visão): a ficha sempre prometeu
|
|
2052
2114
|
`--text-3xl`, e o CSS nunca aplicou — medido no navegador, o valor saía com 14, igual ao rótulo,
|
|
2053
2115
|
e a tendência com 11,7 (o `small` do navegador encolhe a letra). O número é a razão do
|
|
2054
2116
|
componente; os algarismos ficam tabulares para não dançar quando o valor muda. */
|
|
2055
2117
|
.kpi > strong { font-size:var(--text-3xl); line-height:var(--leading-tight); font-variant-numeric:tabular-nums; }
|
|
2056
2118
|
.kpi > small { font-size:var(--text-sm); }
|
|
2119
|
+
/* A TENDÊNCIA COM DIREÇÃO (GAR-09, ADR-0060, 09/10/2026): seta, palavra para o leitor de tela e cor,
|
|
2120
|
+
nunca a cor sozinha. A seta é o `trend-up`/`trend-down`/`minus` do Phosphor (o mesmo desenho do
|
|
2121
|
+
sprite), por máscara — o KPI é marcação pura e o `Icon` precisa de hook; o menu do `Header` já
|
|
2122
|
+
faz assim. A cor é a do texto do selo de cada estado, que já passa AA nos dois temas. */
|
|
2123
|
+
/* A seta fica na PRIMEIRA linha: com `center`, uma tendência que quebra em duas linhas deixava a
|
|
2124
|
+
seta solta entre elas (visto na bancada, 09/10/2026). `1lh` é a altura da linha do próprio texto. */
|
|
2125
|
+
.kpi-trend { display:inline-flex; align-items:flex-start; gap:var(--space-1); }
|
|
2126
|
+
.kpi-trend-icon { flex:none; inline-size:var(--icon-sm); block-size:var(--icon-sm); margin-block-start:calc((1lh - var(--icon-sm)) / 2); background:currentColor; -webkit-mask:var(--kpi-glifo) center/contain no-repeat; mask:var(--kpi-glifo) center/contain no-repeat; }
|
|
2127
|
+
.kpi-trend-up { --kpi-glifo:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 256 256'%3E%3Cpath d='M240,56v64a8,8,0,0,1-16,0V75.31l-82.34,82.35a8,8,0,0,1-11.32,0L96,123.31,29.66,189.66a8,8,0,0,1-11.32-11.32l72-72a8,8,0,0,1,11.32,0L136,140.69,212.69,64H168a8,8,0,0,1,0-16h64A8,8,0,0,1,240,56Z'/%3E%3C/svg%3E"); }
|
|
2128
|
+
.kpi-trend-down { --kpi-glifo:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 256 256'%3E%3Cpath d='M240,128v64a8,8,0,0,1-8,8H168a8,8,0,0,1,0-16h44.69L136,107.31l-34.34,34.35a8,8,0,0,1-11.32,0l-72-72A8,8,0,0,1,29.66,58.34L96,124.69l34.34-34.35a8,8,0,0,1,11.32,0L224,172.69V128a8,8,0,0,1,16,0Z'/%3E%3C/svg%3E"); }
|
|
2129
|
+
.kpi-trend-flat { --kpi-glifo:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 256 256'%3E%3Cpath d='M224,128a8,8,0,0,1-8,8H40a8,8,0,0,1,0-16H216A8,8,0,0,1,224,128Z'/%3E%3C/svg%3E"); }
|
|
2130
|
+
.kpi-tone-success { color:var(--success-400); }
|
|
2131
|
+
.kpi-tone-danger { color:var(--danger-400); }
|
|
2132
|
+
.kpi-tone-neutral { color:var(--muted-foreground); }
|
|
2057
2133
|
/* DataList: chave/valor em duas colunas. O termo é secundário — mesmo idioma do cabeçalho de
|
|
2058
2134
|
tabela. Sem a regra (achado A13) o <dl> saía cru: dt e dd empilhados, com o recuo de 40px
|
|
2059
2135
|
que o navegador dá ao <dd>. */
|
|
@@ -2161,7 +2237,7 @@ img,svg { display:block; }
|
|
|
2161
2237
|
log e a cor primária da Aurea são duas intenções, e ficavam indistinguíveis. `text-transform`
|
|
2162
2238
|
porque o React passa o valor em minúsculas (é ele que casa a regra) e o nível tem de LER como
|
|
2163
2239
|
nível. */
|
|
2164
|
-
.log-line { display:grid; grid-template-columns:86px 72px minmax(0,1fr); gap:12px; padding:3px 0; } .log-time { color:var(--subtle-foreground); } .log-level { color:var(--primary); text-transform:uppercase; } .log-level.info { color:var(--info); } .log-level.warn { color:var(--warning); } .log-level.error { color:var(--danger-400); }
|
|
2240
|
+
.log-line { display:grid; grid-template-columns:86px 72px minmax(0,1fr); gap:12px; padding:3px 0; } .log-time { color:var(--subtle-foreground); } .log-level { color:var(--primary); text-transform:uppercase; } .log-level.info { color:var(--info-400); } .log-level.warn { color:var(--warning-400); } .log-level.error { color:var(--danger-400); }
|
|
2165
2241
|
|
|
2166
2242
|
/* ========================================================================== */
|
|
2167
2243
|
/* 05. GRÁFICOS E VISUALIZAÇÃO */
|
|
@@ -2325,6 +2401,18 @@ img,svg { display:block; }
|
|
|
2325
2401
|
.image { display:block; width:100%; height:auto; object-fit:cover; border-radius:var(--radius-lg); background:var(--surface-3); }
|
|
2326
2402
|
.image-contain { object-fit:contain; background:transparent; }
|
|
2327
2403
|
.image-broken { display:grid; place-items:center; color:var(--muted-foreground); }
|
|
2404
|
+
/* GAR-15 (0.28.0): a moldura de celular do `Image frame="phone"`. GENÉRICA de propósito — sem ilha,
|
|
2405
|
+
sem entalhe, sem botões: as regras de marketing de um fabricante proíbem simular o aparelho dele,
|
|
2406
|
+
e a Aurea não leva marca de terceiro. A moldura segue o tema (a superfície do cartão, a borda e a
|
|
2407
|
+
sombra de sempre) e o canto é o da folha de baixo, o maior que a Aurea tem; o de dentro acompanha. */
|
|
2408
|
+
.image-frame { display:block; }
|
|
2409
|
+
.image-frame-phone { padding:var(--space-2); border:var(--border-width) solid var(--border); border-radius:var(--radius-sheet); background:var(--card); box-shadow:var(--shadow-md); }
|
|
2410
|
+
.image-frame-phone > .image { aspect-ratio:9 / 19.5; object-position:top; border-radius:calc(var(--radius-sheet) - var(--space-2)); }
|
|
2411
|
+
/* A captura de cada tema (`srcDark`). Sem `data-theme` na página, vale a clara. A guarda é a do
|
|
2412
|
+
GAR-05 espelhada: uma faixa CLARA dentro da página escura volta a mostrar a captura clara. */
|
|
2413
|
+
.image-theme-dark { display:none; }
|
|
2414
|
+
[data-theme="dark"] .image-theme-dark:where(:not([data-theme="light"] *),[data-theme="light"] [data-theme="dark"] *) { display:block; }
|
|
2415
|
+
[data-theme="dark"] .image-theme-light:where(:not([data-theme="light"] *),[data-theme="light"] [data-theme="dark"] *) { display:none; }
|
|
2328
2416
|
|
|
2329
2417
|
/* VÍDEO INCORPORADO (achado N-10, 24/09/2026). A caixa é a mesma superfície do `.media-player` —
|
|
2330
2418
|
raio de cartão, borda e o fundo `--media-canvas` —, então um trailer do YouTube e um vídeo
|
|
@@ -2390,7 +2478,7 @@ img,svg { display:block; }
|
|
|
2390
2478
|
A margem vai a zero porque `h1`…`h6` e `p` trazem a do navegador; o espaço entre blocos é de
|
|
2391
2479
|
quem os empilha (`Stack`), não do texto. */
|
|
2392
2480
|
.typography { margin:0; color:var(--foreground); }
|
|
2393
|
-
.typography-h1,.typography-h2,.typography-h3,.typography-h4,.typography-h5,.typography-h6 { font-weight:var(--weight-semibold); line-height:var(--leading-tight); letter-spacing:var(--tracking-tight); }
|
|
2481
|
+
.typography-h1,.typography-h2,.typography-h3,.typography-h4,.typography-h5,.typography-h6 { font-family:var(--font-heading); font-weight:var(--weight-semibold); line-height:var(--leading-tight); letter-spacing:var(--tracking-tight); }
|
|
2394
2482
|
.typography-h1 { font-size:var(--text-4xl); }
|
|
2395
2483
|
.typography-h2 { font-size:var(--text-3xl); }
|
|
2396
2484
|
.typography-h3 { font-size:var(--text-2xl); }
|
|
@@ -2406,6 +2494,10 @@ img,svg { display:block; }
|
|
|
2406
2494
|
.typography-weight-medium { font-weight:var(--weight-medium); }
|
|
2407
2495
|
.typography-weight-semibold { font-weight:var(--weight-semibold); }
|
|
2408
2496
|
.typography-weight-bold { font-weight:var(--weight-bold); }
|
|
2497
|
+
.typography-weight-extrabold { font-weight:var(--weight-extrabold); }
|
|
2498
|
+
/* GAR-16 (0.28.0): algarismos da mesma largura, para número que alinha em coluna ou muda na tela.
|
|
2499
|
+
Ligado só onde se pede — no texto corrido o "1" estreito é o certo. */
|
|
2500
|
+
.typography-numeric { font-variant-numeric:tabular-nums; }
|
|
2409
2501
|
.typography-align-start { text-align:start; }
|
|
2410
2502
|
.typography-align-center { text-align:center; }
|
|
2411
2503
|
.typography-align-end { text-align:end; }
|
|
@@ -2559,6 +2651,20 @@ img,svg { display:block; }
|
|
|
2559
2651
|
.toast-success { border-color:color-mix(in srgb,var(--success-400) 38%,var(--border)); background:var(--success-bg); }
|
|
2560
2652
|
.toast-warning { border-color:color-mix(in srgb,var(--warning-400) 38%,var(--border)); background:var(--warning-bg); }
|
|
2561
2653
|
.toast-danger { border-color:color-mix(in srgb,var(--danger-400) 38%,var(--border)); background:var(--danger-bg); }
|
|
2654
|
+
/* GAR-14 (0.28.0): o aviso do `Button share`, preso ao botão — "Link copiado", ou o erro com o link à
|
|
2655
|
+
mostra. Tem a medida do botão (a altura, o recheio da regra de cima, a letra e a cápsula) e a pele
|
|
2656
|
+
do aviso de sempre. O ícone é desenho de máscara, como a seta do `KPI`: a mesma marcação serve ao
|
|
2657
|
+
React (o motor posiciona) e ao HTML puro (o `aurea.js` posiciona, com `.toast-anchored-fixed`). */
|
|
2658
|
+
.toast-anchored { display:inline-flex; align-items:center; gap:var(--space-2); min-block-size:var(--step-h,var(--control-h-md)); max-inline-size:calc(100vw - 2 * var(--space-4)); padding-block:var(--space-1); border:var(--border-width) solid var(--border); border-radius:var(--radius-control); background:var(--popover); color:var(--popover-foreground); box-shadow:var(--shadow-md); font-size:var(--step-fs,var(--text-sm)); font-weight:var(--weight-medium); line-height:var(--leading-tight); transition:opacity var(--duration-fast) var(--ease-standard); }
|
|
2659
|
+
.toast-anchored[data-starting-style],.toast-anchored[data-ending-style] { opacity:0; }
|
|
2660
|
+
.toast-anchored-icon { --toast-glifo:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 256 256'%3E%3Cpath d='M229.66,77.66l-128,128a8,8,0,0,1-11.32,0l-56-56a8,8,0,0,1,11.32-11.32L96,188.69,218.34,66.34a8,8,0,0,1,11.32,11.32Z'/%3E%3C/svg%3E"); flex:none; inline-size:var(--icon-sm); block-size:var(--icon-sm); background:currentColor; color:var(--success-400); -webkit-mask:var(--toast-glifo) center/contain no-repeat; mask:var(--toast-glifo) center/contain no-repeat; }
|
|
2661
|
+
.toast-anchored-danger { border-color:color-mix(in srgb,var(--danger-400) 38%,var(--border)); background:var(--danger-bg); }
|
|
2662
|
+
.toast-anchored-danger .toast-anchored-icon { --toast-glifo:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 256 256'%3E%3Cpath d='M128,24A104,104,0,1,0,232,128,104.11,104.11,0,0,0,128,24Zm0,192a88,88,0,1,1,88-88A88.1,88.1,0,0,1,128,216Zm-8-80V80a8,8,0,0,1,16,0v56a8,8,0,0,1-16,0Zm20,36a12,12,0,1,1-12-12A12,12,0,0,1,140,172Z'/%3E%3C/svg%3E"); color:var(--danger-400); }
|
|
2663
|
+
/* O erro leva o link logo abaixo do aviso, já selecionado, para a pessoa copiar com o teclado. */
|
|
2664
|
+
.toast-anchored-stack { display:flex; flex-direction:column; align-items:flex-start; gap:var(--space-2); inline-size:max-content; max-inline-size:calc(100vw - 2 * var(--space-4)); }
|
|
2665
|
+
.toast-anchored-link { inline-size:100%; }
|
|
2666
|
+
.toast-anchored-fixed { position:fixed; z-index:var(--z-toast); }
|
|
2667
|
+
.toast-anchored-positioner { z-index:var(--z-toast); }
|
|
2562
2668
|
/* CommandPaletteShell (Fase 11, achado A13). A superfície já existia aqui sob o nome
|
|
2563
2669
|
`.command` — e `.command` é chrome da página de docs manual: nenhum componente React a
|
|
2564
2670
|
emite. Ela passava no check 15 por ACIDENTE, porque o rótulo padrão "Type a command…" põe
|
package/dist/aurea.js
CHANGED
|
@@ -47,15 +47,48 @@
|
|
|
47
47
|
activateTab(tabs[next]);
|
|
48
48
|
});
|
|
49
49
|
|
|
50
|
+
// O texto padrão dos avisos que este script escreve sozinho, pela língua da página. Quem emite a
|
|
51
|
+
// marcação (o React, o catálogo) pode mandar o seu pelo atributo `data-aurea-*` de cada gatilho.
|
|
52
|
+
var PT = /^pt/i.test(root.lang || "");
|
|
53
|
+
var TEXTO = PT
|
|
54
|
+
? {copied: "Copiado", linkCopied: "Link copiado", linkCopyFailed: "Não deu para copiar. Copie o link abaixo."}
|
|
55
|
+
: {copied: "Copied", linkCopied: "Link copied", linkCopyFailed: "Could not copy. Copy the link below."};
|
|
56
|
+
|
|
57
|
+
// GAR-14 (0.28.0) · UMA região de status, montada cedo, para os avisos que não têm outra voz.
|
|
58
|
+
// Região que nasce junto com o texto nem sempre é lida; a que já existe, é (WCAG 4.1.3, a
|
|
59
|
+
// mensagem de status). Para repetir o mesmo texto, ela é esvaziada e preenchida de novo um
|
|
60
|
+
// instante depois.
|
|
61
|
+
var regiao = null;
|
|
62
|
+
function regiaoDeStatus() {
|
|
63
|
+
if (regiao && regiao.isConnected) return regiao;
|
|
64
|
+
regiao = document.createElement("div");
|
|
65
|
+
regiao.className = "sr-only";
|
|
66
|
+
regiao.setAttribute("role", "status");
|
|
67
|
+
regiao.setAttribute("aria-live", "polite");
|
|
68
|
+
regiao.setAttribute("data-aurea-status", "");
|
|
69
|
+
document.body.appendChild(regiao);
|
|
70
|
+
return regiao;
|
|
71
|
+
}
|
|
72
|
+
function anunciar(texto) {
|
|
73
|
+
var r = regiaoDeStatus();
|
|
74
|
+
r.textContent = "";
|
|
75
|
+
setTimeout(function () { r.textContent = texto; }, 100);
|
|
76
|
+
}
|
|
77
|
+
if (document.body) regiaoDeStatus();
|
|
78
|
+
else document.addEventListener("DOMContentLoaded", regiaoDeStatus);
|
|
79
|
+
|
|
50
80
|
// Copiar código: comportamento do CORE, não do catálogo. Quem marca o gatilho com
|
|
51
81
|
// [data-aurea-copy] ganha o copiar de graça — o CodeBlock do React emite esse mesmo
|
|
52
82
|
// markup. Sem permissão de área de transferência, seleciona o texto pro Ctrl+C.
|
|
83
|
+
// 0.28.0: o "copiado" também é dito ao leitor de tela — antes só o ícone mudava, e quem não vê
|
|
84
|
+
// não sabia se tinha copiado.
|
|
53
85
|
function copy(trigger) {
|
|
54
86
|
var scope = trigger.closest("[data-aurea-copy-scope]") || trigger.parentElement;
|
|
55
87
|
var source = scope && scope.querySelector("code, pre, [data-aurea-copy-source]");
|
|
56
88
|
if (!source) return;
|
|
57
89
|
function done() {
|
|
58
90
|
trigger.classList.add("is-done");
|
|
91
|
+
anunciar(trigger.getAttribute("data-aurea-copy-done") || TEXTO.copied);
|
|
59
92
|
setTimeout(function () { trigger.classList.remove("is-done"); }, 1500);
|
|
60
93
|
}
|
|
61
94
|
function select() {
|
|
@@ -75,6 +108,121 @@
|
|
|
75
108
|
if (trigger) copy(trigger);
|
|
76
109
|
});
|
|
77
110
|
|
|
111
|
+
// GAR-14 (0.28.0) · COMPARTILHAR. O gatilho marcado com [data-aurea-share] (o `Button share` do
|
|
112
|
+
// React emite isto) pergunta ao navegador se ele sabe compartilhar ESTE link — detectar o recurso,
|
|
113
|
+
// e não adivinhar o aparelho, é o padrão da web. Sabe: abre a janela do aparelho; a pessoa
|
|
114
|
+
// cancelar (`AbortError`) não é erro e não diz nada. Não sabe: copia o link e mostra "Link
|
|
115
|
+
// copiado" preso ao botão. A cópia falhou: avisa e mostra o link selecionado, para o Ctrl+C.
|
|
116
|
+
// O aviso tem a medida do botão (`.toast-anchored`, no aurea.css).
|
|
117
|
+
var avisoAberto = null;
|
|
118
|
+
function fecharAviso(devolverFoco) {
|
|
119
|
+
if (!avisoAberto) return;
|
|
120
|
+
var a = avisoAberto;
|
|
121
|
+
avisoAberto = null;
|
|
122
|
+
clearTimeout(a.timer);
|
|
123
|
+
window.removeEventListener("scroll", a.fechar, true);
|
|
124
|
+
window.removeEventListener("resize", a.fechar);
|
|
125
|
+
document.removeEventListener("keydown", a.tecla, true);
|
|
126
|
+
document.removeEventListener("pointerdown", a.fora, true);
|
|
127
|
+
a.el.remove();
|
|
128
|
+
if (devolverFoco && a.gatilho.isConnected) a.gatilho.focus();
|
|
129
|
+
}
|
|
130
|
+
function posicionar(el, gatilho) {
|
|
131
|
+
var r = gatilho.getBoundingClientRect();
|
|
132
|
+
// A distância é o token, lido da página — não um número escrito aqui.
|
|
133
|
+
var rem = parseFloat(getComputedStyle(root).fontSize) || 16;
|
|
134
|
+
var espaco = (parseFloat(getComputedStyle(root).getPropertyValue("--space-2")) || 0) * rem;
|
|
135
|
+
el.style.top = (r.bottom + espaco) + "px";
|
|
136
|
+
var largura = el.getBoundingClientRect().width;
|
|
137
|
+
var rtl = getComputedStyle(gatilho).direction === "rtl";
|
|
138
|
+
var x = rtl ? r.right - largura : r.left;
|
|
139
|
+
el.style.left = Math.max(espaco, Math.min(x, window.innerWidth - largura - espaco)) + "px";
|
|
140
|
+
}
|
|
141
|
+
function avisoAncorado(gatilho, falhou, texto, url) {
|
|
142
|
+
fecharAviso(false);
|
|
143
|
+
var aviso = document.createElement("div");
|
|
144
|
+
aviso.className = "toast-anchored" + (falhou ? " toast-anchored-danger" : "");
|
|
145
|
+
var icone = document.createElement("span");
|
|
146
|
+
icone.className = "toast-anchored-icon";
|
|
147
|
+
icone.setAttribute("aria-hidden", "true");
|
|
148
|
+
var rotulo = document.createElement("span");
|
|
149
|
+
rotulo.textContent = texto;
|
|
150
|
+
aviso.appendChild(icone);
|
|
151
|
+
aviso.appendChild(rotulo);
|
|
152
|
+
var el = aviso, campo = null;
|
|
153
|
+
if (falhou) {
|
|
154
|
+
el = document.createElement("div");
|
|
155
|
+
el.className = "toast-anchored-stack toast-anchored-fixed";
|
|
156
|
+
el.appendChild(aviso);
|
|
157
|
+
campo = document.createElement("input");
|
|
158
|
+
campo.className = "input toast-anchored-link";
|
|
159
|
+
campo.readOnly = true;
|
|
160
|
+
campo.value = url;
|
|
161
|
+
campo.setAttribute("aria-label", texto);
|
|
162
|
+
el.appendChild(campo);
|
|
163
|
+
} else {
|
|
164
|
+
aviso.className += " toast-anchored-fixed";
|
|
165
|
+
// O texto vai pela região de status; o desenho é só para quem vê, e não fala duas vezes.
|
|
166
|
+
aviso.setAttribute("aria-hidden", "true");
|
|
167
|
+
}
|
|
168
|
+
document.body.appendChild(el);
|
|
169
|
+
posicionar(el, gatilho);
|
|
170
|
+
var estado = {el: el, gatilho: gatilho, timer: 0};
|
|
171
|
+
// Rolar a PÁGINA solta o aviso do botão, e ele fecha. Mas o campo do link rola o próprio texto
|
|
172
|
+
// quando é selecionado — rolagem de dentro do aviso não conta (medido no navegador: sem esta
|
|
173
|
+
// guarda, o aviso de erro fechava no mesmo instante em que abria).
|
|
174
|
+
estado.fechar = function (e) { if (e && e.target && e.target.nodeType === 1 && el.contains(e.target)) return; fecharAviso(false); };
|
|
175
|
+
estado.tecla = function (e) { if (e.key === "Escape") fecharAviso(true); };
|
|
176
|
+
estado.fora = function (e) { if (!el.contains(e.target) && e.target !== gatilho) fecharAviso(false); };
|
|
177
|
+
avisoAberto = estado;
|
|
178
|
+
window.addEventListener("scroll", estado.fechar, true);
|
|
179
|
+
window.addEventListener("resize", estado.fechar);
|
|
180
|
+
if (falhou) {
|
|
181
|
+
// O erro fica até a pessoa resolver: Esc devolve o foco ao botão, clicar fora fecha.
|
|
182
|
+
document.addEventListener("keydown", estado.tecla, true);
|
|
183
|
+
document.addEventListener("pointerdown", estado.fora, true);
|
|
184
|
+
campo.focus();
|
|
185
|
+
campo.select();
|
|
186
|
+
} else {
|
|
187
|
+
estado.timer = setTimeout(estado.fechar, 1500);
|
|
188
|
+
}
|
|
189
|
+
anunciar(texto);
|
|
190
|
+
}
|
|
191
|
+
function share(trigger) {
|
|
192
|
+
var url = trigger.getAttribute("data-aurea-share-url") || location.href;
|
|
193
|
+
var dados = {url: url};
|
|
194
|
+
var titulo = trigger.getAttribute("data-aurea-share-title");
|
|
195
|
+
var texto = trigger.getAttribute("data-aurea-share-text");
|
|
196
|
+
if (titulo) dados.title = titulo;
|
|
197
|
+
if (texto) dados.text = texto;
|
|
198
|
+
var copiado = trigger.getAttribute("data-aurea-share-copied") || TEXTO.linkCopied;
|
|
199
|
+
var falhou = trigger.getAttribute("data-aurea-share-failed") || TEXTO.linkCopyFailed;
|
|
200
|
+
function copiar() {
|
|
201
|
+
if (!navigator.clipboard || !navigator.clipboard.writeText) {
|
|
202
|
+
avisoAncorado(trigger, true, falhou, url);
|
|
203
|
+
return Promise.resolve();
|
|
204
|
+
}
|
|
205
|
+
return navigator.clipboard.writeText(url).then(
|
|
206
|
+
function () { avisoAncorado(trigger, false, copiado); },
|
|
207
|
+
function () { avisoAncorado(trigger, true, falhou, url); });
|
|
208
|
+
}
|
|
209
|
+
if (typeof navigator.share === "function" && (!navigator.canShare || navigator.canShare(dados))) {
|
|
210
|
+
return navigator.share(dados).catch(function (e) {
|
|
211
|
+
if (!e || e.name !== "AbortError") return copiar();
|
|
212
|
+
});
|
|
213
|
+
}
|
|
214
|
+
return copiar();
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
document.addEventListener("click", function (event) {
|
|
218
|
+
// O `Button` do React faz o mesmo no próprio clique e marca o evento com `preventDefault`,
|
|
219
|
+
// para não compartilhar duas vezes quando os dois estão na página.
|
|
220
|
+
if (event.defaultPrevented) return;
|
|
221
|
+
var trigger = event.target.closest && event.target.closest("[data-aurea-share]");
|
|
222
|
+
if (!trigger || trigger.disabled || trigger.getAttribute("aria-disabled") === "true") return;
|
|
223
|
+
share(trigger);
|
|
224
|
+
});
|
|
225
|
+
|
|
78
226
|
// TableOfContents: marca sozinho a seção em vista. IntersectionObserver com uma faixa
|
|
79
227
|
// estreita no alto da janela — a seção "atual" é a que cruza essa faixa, não a maior
|
|
80
228
|
// visível, senão o item pisca entre duas ao rolar. Sem observer (browser antigo), o
|
|
@@ -258,6 +406,7 @@
|
|
|
258
406
|
root.dataset.theme = root.dataset.theme === "dark" ? "light" : "dark";
|
|
259
407
|
},
|
|
260
408
|
showToast: showToast,
|
|
261
|
-
copy: copy
|
|
409
|
+
copy: copy,
|
|
410
|
+
share: share
|
|
262
411
|
};
|
|
263
412
|
})();
|