orbital-ds 0.8.0 → 0.9.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/AGENTS.md +145 -80
- package/components.manifest.json +1326 -1267
- package/contract.json +226 -168
- package/dist/hooks/use-ds-messages.d.ts +36 -0
- package/dist/hooks/use-ds-messages.js +12 -0
- package/dist/hooks/use-ds-motion.d.ts +17 -0
- package/dist/hooks/use-ds-motion.js +50 -0
- package/dist/lib/i18n.d.ts +46 -0
- package/dist/lib/i18n.js +109 -0
- package/dist/lib/motion.d.ts +74 -0
- package/dist/lib/motion.js +97 -0
- package/dist/styles.css +876 -528
- package/dist/themes/friendly.css +362 -318
- package/dist/themes/friendly.meta.json +75 -14
- package/dist/themes/friendly.scoped.css +362 -318
- package/dist/themes/qratia.meta.json +42 -12
- package/dist/themes/tactile.css +575 -430
- package/dist/themes/tactile.fonts.css +3 -2
- package/dist/themes/tactile.guide.md +82 -49
- package/dist/themes/tactile.meta.json +175 -82
- package/dist/themes/tactile.scoped.css +575 -430
- package/dist/themes/twitter.css +354 -298
- package/dist/themes/twitter.meta.json +83 -61
- package/dist/themes/twitter.scoped.css +354 -298
- package/dist/themes/zyro.css +443 -389
- package/dist/themes/zyro.meta.json +67 -14
- package/dist/themes/zyro.scoped.css +443 -389
- package/dist/ui/accordion.js +5 -5
- package/dist/ui/alert-dialog.js +3 -3
- package/dist/ui/alert.d.ts +1 -1
- package/dist/ui/alert.js +9 -3
- package/dist/ui/attachment.d.ts +1 -1
- package/dist/ui/attachment.js +4 -4
- package/dist/ui/avatar.js +6 -6
- package/dist/ui/ayuda.js +3 -2
- package/dist/ui/badge.d.ts +1 -1
- package/dist/ui/badge.js +9 -3
- package/dist/ui/banner.d.ts +14 -0
- package/dist/ui/banner.js +88 -0
- package/dist/ui/breadcrumb.js +7 -3
- package/dist/ui/bubble.js +6 -6
- package/dist/ui/button-group.js +4 -4
- package/dist/ui/button.d.ts +1 -1
- package/dist/ui/button.js +5 -5
- package/dist/ui/calendar.js +33 -6
- package/dist/ui/card.js +4 -4
- package/dist/ui/carousel.js +15 -8
- package/dist/ui/chart.js +7 -3
- package/dist/ui/checkbox.js +1 -1
- package/dist/ui/combobox.js +7 -7
- package/dist/ui/command.js +13 -11
- package/dist/ui/context-menu.js +8 -8
- package/dist/ui/dialog.js +10 -6
- package/dist/ui/drawer.js +9 -9
- package/dist/ui/dropdown-menu.js +8 -8
- package/dist/ui/empty.js +3 -3
- package/dist/ui/field.js +2 -2
- package/dist/ui/hover-card.js +1 -1
- package/dist/ui/i18n-provider.d.ts +11 -0
- package/dist/ui/i18n-provider.js +18 -0
- package/dist/ui/icon-tile.d.ts +1 -1
- package/dist/ui/input-group.d.ts +1 -1
- package/dist/ui/input-group.js +11 -9
- package/dist/ui/input-otp.js +3 -3
- package/dist/ui/input.js +1 -1
- package/dist/ui/item.d.ts +1 -1
- package/dist/ui/item.js +3 -3
- package/dist/ui/kbd.js +1 -1
- package/dist/ui/label.js +1 -1
- package/dist/ui/marker.d.ts +1 -1
- package/dist/ui/marker.js +2 -2
- package/dist/ui/menubar.js +9 -9
- package/dist/ui/message-scroller.js +5 -2
- package/dist/ui/message.js +2 -2
- package/dist/ui/motion-provider.d.ts +11 -0
- package/dist/ui/motion-provider.js +16 -0
- package/dist/ui/native-select.js +4 -4
- package/dist/ui/navigation-menu.js +7 -6
- package/dist/ui/pagination.js +19 -11
- package/dist/ui/popover.js +2 -2
- package/dist/ui/progress.js +2 -2
- package/dist/ui/questionnaire.js +20 -15
- package/dist/ui/radio-group.js +2 -2
- package/dist/ui/resizable.js +2 -2
- package/dist/ui/scroll-area.js +3 -3
- package/dist/ui/select.js +6 -6
- package/dist/ui/separator.js +1 -1
- package/dist/ui/sheet.js +6 -4
- package/dist/ui/sidebar.js +42 -30
- package/dist/ui/skeleton.js +1 -1
- package/dist/ui/slider.js +6 -6
- package/dist/ui/sonner.js +25 -8
- package/dist/ui/spinner.js +4 -1
- package/dist/ui/switch.js +2 -2
- package/dist/ui/table.js +3 -3
- package/dist/ui/tabs.js +5 -5
- package/dist/ui/textarea.js +1 -1
- package/dist/ui/toast.js +15 -12
- package/dist/ui/toggle-group.js +2 -2
- package/dist/ui/toggle.js +6 -4
- package/dist/ui/tooltip.js +2 -2
- package/docs/CONTRACT.md +183 -153
- package/package.json +160 -142
- package/scripts/brand-core.mjs +153 -0
- package/scripts/doctor.mjs +128 -7
- package/scripts/i18n.mjs +111 -0
- package/scripts/init.mjs +326 -351
- package/scripts/setup.mjs +99 -0
package/dist/styles.css
CHANGED
|
@@ -1,528 +1,876 @@
|
|
|
1
|
-
/*
|
|
2
|
-
* orbital-ds · ESTRUCTURA común a todos los temas.
|
|
3
|
-
*
|
|
4
|
-
* Reglas de oro:
|
|
5
|
-
* 1. Esta hoja no tiene colores ni fuentes concretas: eso lo aporta un TEMA
|
|
6
|
-
* (`orbital-ds/themes/<tema>.css`).
|
|
7
|
-
* 2. Todo lo que cambia el aspecto es una VARIABLE (`--ds-*` o las de color
|
|
8
|
-
* de shadcn). Las utilidades de Tailwind solo REFERENCIAN variables
|
|
9
|
-
* (`@theme inline { --radius-sm: var(--ds-radius-sm) }`), nunca llevan un
|
|
10
|
-
* valor escrito. Por eso un tema puede cambiar formas, sombras, fuentes,
|
|
11
|
-
* escala tipográfica y anatomía del sidebar, también EN VIVO.
|
|
12
|
-
* 3. Los valores por defecto viven en la capa `theme` de Tailwind: cualquier
|
|
13
|
-
* tema (CSS sin capa) los gana, sea cual sea el orden de importación.
|
|
14
|
-
*
|
|
15
|
-
* Uso en la app:
|
|
16
|
-
*
|
|
17
|
-
* @import 'orbital-ds/themes/<tema>.fonts.css'; <- lo PRIMERO del fichero
|
|
18
|
-
* @import 'tailwindcss';
|
|
19
|
-
* @import 'orbital-ds/styles.css'; <- esta estructura
|
|
20
|
-
* @import 'orbital-ds/themes/<tema>.css'; <- un tema
|
|
21
|
-
* @source '../node_modules/orbital-ds/dist'; <- que Tailwind vea las clases
|
|
22
|
-
*/
|
|
23
|
-
|
|
24
|
-
@custom-variant dark (&:is(.dark *));
|
|
25
|
-
|
|
26
|
-
@theme inline {
|
|
27
|
-
/* ── TIPOGRAFÍA ─────────────────────────────────────────────────────────
|
|
28
|
-
* Familias: las define el tema (--ds-font-sans / -display / -mono).
|
|
29
|
-
* Escala: Tailwind la lee de variables; cada paso lleva tamaño e interlineado.
|
|
30
|
-
* Los tamaños por defecto son los estándar de Tailwind.
|
|
31
|
-
* Display text-4xl · H1 text-3xl · H2 text-xl · H3 text-base · cuerpo text-sm
|
|
32
|
-
* etiqueta/ayuda text-xs. La jerarquía la hacen tamaño y peso, no el color.
|
|
33
|
-
*/
|
|
34
|
-
--font-sans: var(--ds-font-sans);
|
|
35
|
-
--font-display: var(--ds-font-display);
|
|
36
|
-
--font-mono: var(--ds-font-mono);
|
|
37
|
-
|
|
38
|
-
--ds-font-sans: system-ui, -apple-system, 'Segoe UI', Roboto, sans-serif;
|
|
39
|
-
--ds-font-display: var(--ds-font-sans);
|
|
40
|
-
--ds-font-mono: ui-monospace, 'SF Mono', Menlo, monospace;
|
|
41
|
-
|
|
42
|
-
--text-xs: var(--ds-text-xs);
|
|
43
|
-
--text-xs--line-height: var(--ds-leading-xs);
|
|
44
|
-
--text-sm: var(--ds-text-sm);
|
|
45
|
-
--text-sm--line-height: var(--ds-leading-sm);
|
|
46
|
-
--text-base: var(--ds-text-base);
|
|
47
|
-
--text-base--line-height: var(--ds-leading-base);
|
|
48
|
-
--text-lg: var(--ds-text-lg);
|
|
49
|
-
--text-lg--line-height: var(--ds-leading-lg);
|
|
50
|
-
--text-xl: var(--ds-text-xl);
|
|
51
|
-
--text-xl--line-height: var(--ds-leading-xl);
|
|
52
|
-
--text-2xl: var(--ds-text-2xl);
|
|
53
|
-
--text-2xl--line-height: var(--ds-leading-2xl);
|
|
54
|
-
--text-3xl: var(--ds-text-3xl);
|
|
55
|
-
--text-3xl--line-height: var(--ds-leading-3xl);
|
|
56
|
-
--text-4xl: var(--ds-text-4xl);
|
|
57
|
-
--text-4xl--line-height: var(--ds-leading-4xl);
|
|
58
|
-
|
|
59
|
-
--ds-text-xs: 0.75rem;
|
|
60
|
-
--ds-leading-xs: 1.3333;
|
|
61
|
-
--ds-text-sm: 0.875rem;
|
|
62
|
-
--ds-leading-sm: 1.4286;
|
|
63
|
-
--ds-text-base: 1rem;
|
|
64
|
-
--ds-leading-base: 1.5;
|
|
65
|
-
--ds-text-lg: 1.125rem;
|
|
66
|
-
--ds-leading-lg: 1.5556;
|
|
67
|
-
--ds-text-xl: 1.25rem;
|
|
68
|
-
--ds-leading-xl: 1.4;
|
|
69
|
-
--ds-text-2xl: 1.5rem;
|
|
70
|
-
--ds-leading-2xl: 1.3333;
|
|
71
|
-
--ds-text-3xl: 1.875rem;
|
|
72
|
-
--ds-leading-3xl: 1.2;
|
|
73
|
-
--ds-text-4xl: 2.25rem;
|
|
74
|
-
--ds-leading-4xl: 1.1111;
|
|
75
|
-
|
|
76
|
-
/* Espaciado de letras de los títulos (los que no traen su propia clase). */
|
|
77
|
-
--ds-heading-tracking: normal;
|
|
78
|
-
|
|
79
|
-
/* ── FORMAS ─────────────────────────────────────────────────────────────
|
|
80
|
-
* Rampa de radios, derivada de `--radius` (mover UN valor cambia la redondez
|
|
81
|
-
* del producto). Un tema puede además fijar cada paso con --ds-radius-*.
|
|
82
|
-
* sm chip · md control · lg fila · xl tarjeta · 2xl vista y barra
|
|
83
|
-
* Radios semánticos: los componentes piden el hueco, no una medida.
|
|
84
|
-
* control: campos, selects, pestañas, tooltips · overlay: diálogos y paneles
|
|
85
|
-
*/
|
|
86
|
-
--radius-sm: var(--ds-radius-sm);
|
|
87
|
-
--radius-md: var(--ds-radius-md);
|
|
88
|
-
--radius-lg: var(--ds-radius-lg);
|
|
89
|
-
--radius-xl: var(--ds-radius-xl);
|
|
90
|
-
--radius-2xl: var(--ds-radius-2xl);
|
|
91
|
-
--radius-control: var(--ds-radius-control);
|
|
92
|
-
--radius-overlay: var(--ds-radius-overlay);
|
|
93
|
-
|
|
94
|
-
--
|
|
95
|
-
--
|
|
96
|
-
--
|
|
97
|
-
--
|
|
98
|
-
--
|
|
99
|
-
--ds-radius-
|
|
100
|
-
--ds-radius-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
--ds-
|
|
106
|
-
--ds-
|
|
107
|
-
--ds-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
--
|
|
118
|
-
--
|
|
119
|
-
--
|
|
120
|
-
--
|
|
121
|
-
--
|
|
122
|
-
--
|
|
123
|
-
|
|
124
|
-
--ds-
|
|
125
|
-
--ds-
|
|
126
|
-
--ds-
|
|
127
|
-
--ds-
|
|
128
|
-
--ds-
|
|
129
|
-
--ds-
|
|
130
|
-
|
|
131
|
-
/*
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
--ds-
|
|
136
|
-
--ds-
|
|
137
|
-
--ds-
|
|
138
|
-
--ds-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
--ds-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
*
|
|
152
|
-
*
|
|
153
|
-
*
|
|
154
|
-
*
|
|
155
|
-
*/
|
|
156
|
-
--
|
|
157
|
-
--
|
|
158
|
-
--ds-
|
|
159
|
-
--ds-
|
|
160
|
-
--
|
|
161
|
-
--ds-
|
|
162
|
-
--ds-
|
|
163
|
-
|
|
164
|
-
--ds-
|
|
165
|
-
--ds-
|
|
166
|
-
--ds-
|
|
167
|
-
--ds-
|
|
168
|
-
--ds-
|
|
169
|
-
--ds-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
*
|
|
174
|
-
*
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
--ds-
|
|
180
|
-
|
|
181
|
-
--ds-
|
|
182
|
-
--ds-
|
|
183
|
-
--ds-
|
|
184
|
-
|
|
185
|
-
/*
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
--ds-
|
|
192
|
-
--ds-
|
|
193
|
-
--ds-
|
|
194
|
-
--ds-
|
|
195
|
-
--ds-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
--ds-
|
|
201
|
-
--ds-
|
|
202
|
-
--ds-
|
|
203
|
-
--ds-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
--
|
|
224
|
-
--
|
|
225
|
-
--
|
|
226
|
-
--
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
--
|
|
230
|
-
--
|
|
231
|
-
--
|
|
232
|
-
--
|
|
233
|
-
--
|
|
234
|
-
--
|
|
235
|
-
--
|
|
236
|
-
--
|
|
237
|
-
--
|
|
238
|
-
--
|
|
239
|
-
--
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
--
|
|
249
|
-
--
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
--
|
|
257
|
-
--
|
|
258
|
-
--
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
--
|
|
269
|
-
--
|
|
270
|
-
--
|
|
271
|
-
--
|
|
272
|
-
--
|
|
273
|
-
--
|
|
274
|
-
--
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
/*
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
/*
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
*
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
:
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
/*
|
|
407
|
-
*
|
|
408
|
-
*
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
*
|
|
442
|
-
*
|
|
443
|
-
*
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
/*
|
|
487
|
-
*
|
|
488
|
-
*
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
}
|
|
1
|
+
/*
|
|
2
|
+
* orbital-ds · ESTRUCTURA común a todos los temas.
|
|
3
|
+
*
|
|
4
|
+
* Reglas de oro:
|
|
5
|
+
* 1. Esta hoja no tiene colores ni fuentes concretas: eso lo aporta un TEMA
|
|
6
|
+
* (`orbital-ds/themes/<tema>.css`).
|
|
7
|
+
* 2. Todo lo que cambia el aspecto es una VARIABLE (`--ds-*` o las de color
|
|
8
|
+
* de shadcn). Las utilidades de Tailwind solo REFERENCIAN variables
|
|
9
|
+
* (`@theme inline { --radius-sm: var(--ds-radius-sm) }`), nunca llevan un
|
|
10
|
+
* valor escrito. Por eso un tema puede cambiar formas, sombras, fuentes,
|
|
11
|
+
* escala tipográfica y anatomía del sidebar, también EN VIVO.
|
|
12
|
+
* 3. Los valores por defecto viven en la capa `theme` de Tailwind: cualquier
|
|
13
|
+
* tema (CSS sin capa) los gana, sea cual sea el orden de importación.
|
|
14
|
+
*
|
|
15
|
+
* Uso en la app:
|
|
16
|
+
*
|
|
17
|
+
* @import 'orbital-ds/themes/<tema>.fonts.css'; <- lo PRIMERO del fichero
|
|
18
|
+
* @import 'tailwindcss';
|
|
19
|
+
* @import 'orbital-ds/styles.css'; <- esta estructura
|
|
20
|
+
* @import 'orbital-ds/themes/<tema>.css'; <- un tema
|
|
21
|
+
* @source '../node_modules/orbital-ds/dist'; <- que Tailwind vea las clases
|
|
22
|
+
*/
|
|
23
|
+
|
|
24
|
+
@custom-variant dark (&:is(.dark *));
|
|
25
|
+
|
|
26
|
+
@theme inline {
|
|
27
|
+
/* ── TIPOGRAFÍA ─────────────────────────────────────────────────────────
|
|
28
|
+
* Familias: las define el tema (--ds-font-sans / -display / -mono).
|
|
29
|
+
* Escala: Tailwind la lee de variables; cada paso lleva tamaño e interlineado.
|
|
30
|
+
* Los tamaños por defecto son los estándar de Tailwind.
|
|
31
|
+
* Display text-4xl · H1 text-3xl · H2 text-xl · H3 text-base · cuerpo text-sm
|
|
32
|
+
* etiqueta/ayuda text-xs. La jerarquía la hacen tamaño y peso, no el color.
|
|
33
|
+
*/
|
|
34
|
+
--font-sans: var(--ds-font-sans);
|
|
35
|
+
--font-display: var(--ds-font-display);
|
|
36
|
+
--font-mono: var(--ds-font-mono);
|
|
37
|
+
|
|
38
|
+
--ds-font-sans: system-ui, -apple-system, 'Segoe UI', Roboto, sans-serif;
|
|
39
|
+
--ds-font-display: var(--ds-font-sans);
|
|
40
|
+
--ds-font-mono: ui-monospace, 'SF Mono', Menlo, monospace;
|
|
41
|
+
|
|
42
|
+
--text-xs: var(--ds-text-xs);
|
|
43
|
+
--text-xs--line-height: var(--ds-leading-xs);
|
|
44
|
+
--text-sm: var(--ds-text-sm);
|
|
45
|
+
--text-sm--line-height: var(--ds-leading-sm);
|
|
46
|
+
--text-base: var(--ds-text-base);
|
|
47
|
+
--text-base--line-height: var(--ds-leading-base);
|
|
48
|
+
--text-lg: var(--ds-text-lg);
|
|
49
|
+
--text-lg--line-height: var(--ds-leading-lg);
|
|
50
|
+
--text-xl: var(--ds-text-xl);
|
|
51
|
+
--text-xl--line-height: var(--ds-leading-xl);
|
|
52
|
+
--text-2xl: var(--ds-text-2xl);
|
|
53
|
+
--text-2xl--line-height: var(--ds-leading-2xl);
|
|
54
|
+
--text-3xl: var(--ds-text-3xl);
|
|
55
|
+
--text-3xl--line-height: var(--ds-leading-3xl);
|
|
56
|
+
--text-4xl: var(--ds-text-4xl);
|
|
57
|
+
--text-4xl--line-height: var(--ds-leading-4xl);
|
|
58
|
+
|
|
59
|
+
--ds-text-xs: 0.75rem;
|
|
60
|
+
--ds-leading-xs: 1.3333;
|
|
61
|
+
--ds-text-sm: 0.875rem;
|
|
62
|
+
--ds-leading-sm: 1.4286;
|
|
63
|
+
--ds-text-base: 1rem;
|
|
64
|
+
--ds-leading-base: 1.5;
|
|
65
|
+
--ds-text-lg: 1.125rem;
|
|
66
|
+
--ds-leading-lg: 1.5556;
|
|
67
|
+
--ds-text-xl: 1.25rem;
|
|
68
|
+
--ds-leading-xl: 1.4;
|
|
69
|
+
--ds-text-2xl: 1.5rem;
|
|
70
|
+
--ds-leading-2xl: 1.3333;
|
|
71
|
+
--ds-text-3xl: 1.875rem;
|
|
72
|
+
--ds-leading-3xl: 1.2;
|
|
73
|
+
--ds-text-4xl: 2.25rem;
|
|
74
|
+
--ds-leading-4xl: 1.1111;
|
|
75
|
+
|
|
76
|
+
/* Espaciado de letras de los títulos (los que no traen su propia clase). */
|
|
77
|
+
--ds-heading-tracking: normal;
|
|
78
|
+
|
|
79
|
+
/* ── FORMAS ─────────────────────────────────────────────────────────────
|
|
80
|
+
* Rampa de radios, derivada de `--radius` (mover UN valor cambia la redondez
|
|
81
|
+
* del producto). Un tema puede además fijar cada paso con --ds-radius-*.
|
|
82
|
+
* sm chip · md control · lg fila · xl tarjeta · 2xl vista y barra
|
|
83
|
+
* Radios semánticos: los componentes piden el hueco, no una medida.
|
|
84
|
+
* control: campos, selects, pestañas, tooltips · overlay: diálogos y paneles
|
|
85
|
+
*/
|
|
86
|
+
--radius-sm: var(--ds-radius-sm);
|
|
87
|
+
--radius-md: var(--ds-radius-md);
|
|
88
|
+
--radius-lg: var(--ds-radius-lg);
|
|
89
|
+
--radius-xl: var(--ds-radius-xl);
|
|
90
|
+
--radius-2xl: var(--ds-radius-2xl);
|
|
91
|
+
--radius-control: var(--ds-radius-control);
|
|
92
|
+
--radius-overlay: var(--ds-radius-overlay);
|
|
93
|
+
/* Radios por PAPEL (un tema cambia uno y se mueven todas las piezas de ese papel). */
|
|
94
|
+
--radius-popover: var(--ds-radius-popover);
|
|
95
|
+
--radius-item: var(--ds-radius-item);
|
|
96
|
+
--radius-button: var(--ds-radius-button);
|
|
97
|
+
--radius-badge: var(--ds-radius-badge);
|
|
98
|
+
--radius-check: var(--ds-radius-check);
|
|
99
|
+
--radius-card: var(--ds-radius-card);
|
|
100
|
+
--radius-panel: var(--ds-radius-panel);
|
|
101
|
+
--radius-chip: var(--ds-radius-chip);
|
|
102
|
+
--radius-avatar: var(--ds-radius-avatar);
|
|
103
|
+
--radius-bubble: var(--ds-radius-bubble);
|
|
104
|
+
--radius-xs: var(--ds-radius-xs);
|
|
105
|
+
--radius-tooltip: var(--ds-radius-tooltip);
|
|
106
|
+
--radius-tab: var(--ds-radius-tab);
|
|
107
|
+
--radius-field-multiline: var(--ds-radius-field-multiline);
|
|
108
|
+
--radius-inset: var(--ds-radius-inset);
|
|
109
|
+
--radius-skeleton: var(--ds-radius-skeleton);
|
|
110
|
+
--radius-track: var(--ds-radius-track);
|
|
111
|
+
--text-2xs: var(--ds-text-2xs);
|
|
112
|
+
--text-2xs--line-height: var(--ds-leading-2xs);
|
|
113
|
+
|
|
114
|
+
--ds-radius-sm: calc(var(--radius) - 4px);
|
|
115
|
+
--ds-radius-md: calc(var(--radius) - 2px);
|
|
116
|
+
--ds-radius-lg: var(--radius);
|
|
117
|
+
--ds-radius-xl: calc(var(--radius) + 6px);
|
|
118
|
+
--ds-radius-2xl: calc(var(--radius) + 8px);
|
|
119
|
+
--ds-radius-control: 2rem;
|
|
120
|
+
--ds-radius-overlay: 2rem;
|
|
121
|
+
--ds-radius-popover: var(--ds-radius-2xl); /* menús, listas, popover, hover-card */
|
|
122
|
+
--ds-radius-item: var(--ds-radius-xl); /* filas de menú, lista y comando */
|
|
123
|
+
--ds-radius-button: var(--ds-radius-lg);
|
|
124
|
+
--ds-radius-badge: var(--ds-radius-md);
|
|
125
|
+
--ds-radius-check: 6px; /* casilla */
|
|
126
|
+
--ds-radius-card: var(--ds-radius-xl);
|
|
127
|
+
--ds-radius-panel: var(--ds-radius-2xl); /* acordeón y paneles agrupados */
|
|
128
|
+
--ds-radius-chip: var(--ds-radius-xl); /* adjuntos y fichas */
|
|
129
|
+
--ds-radius-avatar: var(--ds-radius-pill);
|
|
130
|
+
--ds-radius-bubble: var(--ds-radius-overlay);
|
|
131
|
+
--ds-radius-xs: 2px; /* marcas de leyenda y flecha del tooltip */
|
|
132
|
+
--ds-radius-tooltip: var(--ds-radius-2xl);
|
|
133
|
+
--ds-radius-tab: var(--ds-radius-xl);
|
|
134
|
+
--ds-radius-field-multiline: var(--ds-radius-md); /* textarea y campos de varias líneas */
|
|
135
|
+
--ds-radius-inset: var(--ds-radius-xl); /* contenido junto al lateral «inset» */
|
|
136
|
+
--ds-radius-skeleton: var(--ds-radius-xl);
|
|
137
|
+
--ds-radius-track: var(--ds-radius-lg); /* progreso y deslizador */
|
|
138
|
+
--ds-text-2xs: 0.625rem;
|
|
139
|
+
--ds-leading-2xs: 1.4;
|
|
140
|
+
|
|
141
|
+
/* ── ALTURA DE CONTROLES ────────────────────────────────────────────────
|
|
142
|
+
* Una escala para botón, campo y select: alineados en una misma fila.
|
|
143
|
+
*/
|
|
144
|
+
--ds-control-h-sm: 2rem;
|
|
145
|
+
--ds-control-h-md: 2.25rem;
|
|
146
|
+
--ds-control-h-lg: 2.5rem;
|
|
147
|
+
|
|
148
|
+
/* ── SOMBRAS ────────────────────────────────────────────────────────────
|
|
149
|
+
* Un hueco por tipo de pieza. `control` está vacío (`0 0 #0000`): existe para que
|
|
150
|
+
* un tema pueda dar relieve a los campos con solo dar valor. «Sin sombra» se
|
|
151
|
+
* escribe `0 0 #0000`, NUNCA `none`: una variable con `none` invalida todo el
|
|
152
|
+
* `box-shadow` (anillo de foco incluido).
|
|
153
|
+
* card/-hover: tarjeta (reposo y realce) · raised: piezas que flotan
|
|
154
|
+
* overlay: capas · popover: menús y selects
|
|
155
|
+
*/
|
|
156
|
+
--shadow-card: var(--ds-shadow-card);
|
|
157
|
+
--shadow-card-hover: var(--ds-shadow-card-hover);
|
|
158
|
+
--shadow-control: var(--ds-shadow-control);
|
|
159
|
+
--shadow-raised: var(--ds-shadow-raised);
|
|
160
|
+
--shadow-overlay: var(--ds-shadow-overlay);
|
|
161
|
+
--shadow-popover: var(--ds-shadow-popover);
|
|
162
|
+
--shadow-dialog: var(--ds-shadow-dialog);
|
|
163
|
+
|
|
164
|
+
--ds-shadow-card: 0 1px 2px rgb(0 0 0 / 0.08), 0 3px 10px rgb(0 0 0 / 0.07);
|
|
165
|
+
--ds-shadow-card-hover: 0 3px 6px rgb(0 0 0 / 0.1), 0 14px 32px rgb(0 0 0 / 0.14);
|
|
166
|
+
--ds-shadow-control: 0 0 #0000;
|
|
167
|
+
--ds-shadow-raised: 0 1px 3px rgb(0 0 0 / 0.1), 0 1px 2px rgb(0 0 0 / 0.1);
|
|
168
|
+
--ds-shadow-overlay: 0 10px 15px rgb(0 0 0 / 0.1), 0 4px 6px rgb(0 0 0 / 0.1);
|
|
169
|
+
--ds-shadow-popover: 0 25px 50px rgb(0 0 0 / 0.25);
|
|
170
|
+
--ds-shadow-dialog: 0 0 #0000; /* diálogos, alertas y cajones: sin sombra salvo que el tema la pida */
|
|
171
|
+
|
|
172
|
+
/* ── CAPAS, MOVIMIENTO, FOCO, VELO ──────────────────────────────────────
|
|
173
|
+
* z-index con nombre (nunca un número en un componente) · dos o tres
|
|
174
|
+
* duraciones · grosor del anillo de foco · velo tras diálogos y paneles.
|
|
175
|
+
*/
|
|
176
|
+
--ds-z-raised: 10;
|
|
177
|
+
--ds-z-sticky: 20;
|
|
178
|
+
--ds-z-sidebar: 21; /* por encima de la cabecera sticky: su filete no debe quedar tapado */
|
|
179
|
+
--ds-z-overlay: 50;
|
|
180
|
+
|
|
181
|
+
--ds-motion-fast: 100ms;
|
|
182
|
+
--ds-motion-base: 200ms;
|
|
183
|
+
--ds-motion-slow: 300ms;
|
|
184
|
+
--ds-motion-blink: 1s;
|
|
185
|
+
--ds-motion-snap: 150ms; /* ajustes de tamaño (altura de un toast) */
|
|
186
|
+
--ds-motion-layout: 350ms; /* desplazamientos de layout (menú de navegación) */
|
|
187
|
+
--ds-motion-swipe: 400ms; /* cierre por gesto (drawer), se multiplica por la fuerza */
|
|
188
|
+
--ds-motion-slower: 500ms; /* entradas y salidas apiladas (toasts) */
|
|
189
|
+
|
|
190
|
+
/* Curvas de aceleración: un tema cambia aquí su «personalidad de movimiento». */
|
|
191
|
+
--ds-ease-standard: cubic-bezier(0.22, 1, 0.36, 1); /* entrar y moverse */
|
|
192
|
+
--ds-ease-emphasized: cubic-bezier(0.32, 0.72, 0, 1); /* paneles que llegan desde el borde */
|
|
193
|
+
--ds-ease-enter: cubic-bezier(0.23, 1, 0.32, 1); /* aparecer */
|
|
194
|
+
--ds-ease-exit: cubic-bezier(0.7, 0, 0.84, 0); /* desaparecer */
|
|
195
|
+
--ds-ease-overshoot: cubic-bezier(0.45, 1.005, 0, 1.005); /* con un leve rebote */
|
|
196
|
+
|
|
197
|
+
/* Coreografía (la usan Motion y los presets de orbital-ds/lib/motion): recorrido al
|
|
198
|
+
* entrar, escala de partida, desenfoque de entrada, rebote del muelle, retardo en cascada
|
|
199
|
+
* y hundimiento al pulsar. Un tema los ajusta para tener su movimiento de fábrica. */
|
|
200
|
+
--ds-motion-distance: 8px;
|
|
201
|
+
--ds-motion-scale: 0.96;
|
|
202
|
+
--ds-motion-blur: 0px;
|
|
203
|
+
--ds-spring-bounce: 0.15;
|
|
204
|
+
--ds-motion-stagger: 40ms;
|
|
205
|
+
--ds-motion-press-scale: 0.97;
|
|
206
|
+
|
|
207
|
+
--ds-z-stack: 1000; /* base del apilado interno (toasts unos sobre otros) */
|
|
208
|
+
|
|
209
|
+
--ds-ring-width: 3px;
|
|
210
|
+
|
|
211
|
+
/* ── GESTO DE TECLA Y ROTULADOR ─────────────────────────────────────────
|
|
212
|
+
* Huecos que usa la PERSONALIDAD de un tema con piezas «pulsables» (tactile).
|
|
213
|
+
* Aquí viven sus valores neutros para que una app pueda fijarlos en su
|
|
214
|
+
* brand.css (el doctor rechaza en una marca las --ds-* que no existen).
|
|
215
|
+
* outline/edge: color del contorno y de la arista · border: grosor del
|
|
216
|
+
* contorno · edge-w(-sm): arista inferior en reposo (controles pequeños) ·
|
|
217
|
+
* edge-w-pressed: arista al pulsar · press(-sm): cuánto se hunde ·
|
|
218
|
+
* radius(-sm): radio de la tecla · weight: peso de su texto ·
|
|
219
|
+
* disabled-opacity · rule-w: filete de superficies · overlay-edge-w: arista de
|
|
220
|
+
* diálogos · marker(-thickness/-offset): rotulador bajo los títulos (gesto
|
|
221
|
+
* común: lo dibuja la estructura; transparent = apagado).
|
|
222
|
+
*/
|
|
223
|
+
--ds-key-outline: var(--foreground);
|
|
224
|
+
--ds-key-edge: var(--border);
|
|
225
|
+
--ds-key-border: 1px;
|
|
226
|
+
--ds-key-edge-w: 1px;
|
|
227
|
+
--ds-key-edge-w-sm: 1px;
|
|
228
|
+
--ds-key-edge-w-pressed: 1px;
|
|
229
|
+
--ds-key-press: 0px;
|
|
230
|
+
--ds-key-press-sm: 0px;
|
|
231
|
+
--ds-key-radius: var(--ds-radius-lg);
|
|
232
|
+
--ds-key-radius-sm: var(--ds-radius-control);
|
|
233
|
+
--ds-key-weight: 600;
|
|
234
|
+
--ds-key-disabled-opacity: 0.5;
|
|
235
|
+
--ds-rule-w: 1px;
|
|
236
|
+
--ds-overlay-edge-w: 1px;
|
|
237
|
+
--ds-marker: transparent; /* gesto COMÚN: dale un color y cualquier tema lo dibuja */
|
|
238
|
+
--ds-marker-thickness: 0.42em;
|
|
239
|
+
--ds-marker-offset: -0.3em;
|
|
240
|
+
|
|
241
|
+
/* ── TÍTULOS Y ETIQUETAS ────────────────────────────────────────────────
|
|
242
|
+
* display-variation: ejes de la fuente de titulares (`font-variation-settings`,
|
|
243
|
+
* p. ej. Fraunces `"SOFT" 50, "WONK" 1`) · heading-weight: h1–h3 ·
|
|
244
|
+
* title-weight: títulos de componentes · title-leading: su interlineado ·
|
|
245
|
+
* label-tracking: etiquetas en versalitas (cabeceras de tabla) · strong-weight:
|
|
246
|
+
* texto de control enfático · nav-weight: destinos del lateral.
|
|
247
|
+
*/
|
|
248
|
+
--ds-label-weight: 600;
|
|
249
|
+
--ds-display-variation: normal;
|
|
250
|
+
--ds-heading-weight: 700;
|
|
251
|
+
--ds-title-weight: 600;
|
|
252
|
+
--ds-title-leading: 1.25;
|
|
253
|
+
--ds-label-tracking: 0.05em;
|
|
254
|
+
--ds-strong-weight: 600;
|
|
255
|
+
--ds-nav-weight: 500;
|
|
256
|
+
--ds-nav-active-weight: 500;
|
|
257
|
+
--ds-tab-weight: 500;
|
|
258
|
+
--ds-tab-active-weight: 500;
|
|
259
|
+
|
|
260
|
+
/* ── PERSONALIDAD COMÚN (cualquier tema) ────────────────────────────────
|
|
261
|
+
* Huecos neutros para lo que un tema suele cambiar en su PERSONALIDAD, de modo
|
|
262
|
+
* que ninguna regla escriba un valor y una app pueda ajustarlo en brand.css.
|
|
263
|
+
* radius-pill: forma de píldora · button-case/-tracking: mayúsculas y espaciado
|
|
264
|
+
* del botón · button-outline-w: contorno del botón «outline» · shadow-button(-hover):
|
|
265
|
+
* brillo bajo el botón principal · hover-lift: cuánto sube al señalarlo ·
|
|
266
|
+
* hover-opacity: atenuado al señalar · tab-indicator-w: subrayado de la pestaña activa.
|
|
267
|
+
*/
|
|
268
|
+
--ds-radius-pill: 9999px;
|
|
269
|
+
--ds-button-case: none;
|
|
270
|
+
--ds-button-tracking: normal;
|
|
271
|
+
--ds-button-outline-w: 1px;
|
|
272
|
+
--ds-shadow-button: 0 0 #0000;
|
|
273
|
+
--ds-shadow-button-hover: 0 0 #0000;
|
|
274
|
+
--ds-hover-lift: 0px;
|
|
275
|
+
--ds-hover-opacity: 1;
|
|
276
|
+
--ds-tab-indicator-w: 0px;
|
|
277
|
+
|
|
278
|
+
--color-scrim: var(--ds-scrim);
|
|
279
|
+
--ds-scrim: oklch(0 0 0 / 0.8);
|
|
280
|
+
--ds-scrim-blur: 4px; /* desenfoque del velo */
|
|
281
|
+
|
|
282
|
+
/* ── ESTADOS DE INTERACCIÓN COMUNES ──────────────────────────────────────
|
|
283
|
+
* ring-color: color del anillo de foco · disabled-opacity: lo desactivado ·
|
|
284
|
+
* layer-ring(-w): filo de las capas flotantes y diálogos · separator: líneas de
|
|
285
|
+
* menús · control-h-xs: controles mínimos (chips, botones dentro de un campo).
|
|
286
|
+
*/
|
|
287
|
+
--ds-ring-color: color-mix(in oklch, var(--ring) 50%, transparent);
|
|
288
|
+
--ds-invalid-ring: color-mix(in oklch, var(--destructive) 20%, transparent);
|
|
289
|
+
--ds-disabled-opacity: 0.5;
|
|
290
|
+
--ds-layer-ring: color-mix(in oklch, var(--foreground) 5%, transparent);
|
|
291
|
+
--ds-layer-ring-w: 1px;
|
|
292
|
+
--ds-separator: color-mix(in oklch, var(--border) 50%, transparent);
|
|
293
|
+
--ds-control-h-xs: 1.5rem;
|
|
294
|
+
--ds-chip-h: 1.375rem;
|
|
295
|
+
--ds-field-bg: color-mix(in oklch, var(--input) 30%, transparent);
|
|
296
|
+
--ds-field-bg-hover: color-mix(in oklch, var(--input) 50%, transparent);
|
|
297
|
+
--ds-invalid-border: var(--destructive); /* borde de un campo con error */
|
|
298
|
+
--ds-switch-track-off: var(--input); /* carril del interruptor apagado */
|
|
299
|
+
--ds-check-bg: transparent; /* fondo de casilla y radio sin marcar */
|
|
300
|
+
--ds-row-hover: color-mix(in oklch, var(--muted) 50%, transparent); /* fila señalada (tabla, acordeón abierto, item muted) */
|
|
301
|
+
--ds-choice-selected: color-mix(in oklch, var(--primary) 10%, transparent); /* opción elegida en tarjeta */
|
|
302
|
+
--ds-choice-selected-border: color-mix(in oklch, var(--primary) 40%, transparent);
|
|
303
|
+
--ds-choice-card-bg: color-mix(in oklch, var(--primary) 5%, transparent); /* tarjeta de elección de Field */
|
|
304
|
+
--ds-choice-card-border: color-mix(in oklch, var(--primary) 30%, transparent);
|
|
305
|
+
--ds-tab-foreground: color-mix(in oklch, var(--foreground) 60%, transparent);
|
|
306
|
+
--ds-sidebar-label: color-mix(in oklch, var(--sidebar-foreground) 70%, transparent);
|
|
307
|
+
--ds-tooltip-bg: var(--foreground);
|
|
308
|
+
--ds-tooltip-fg: var(--background);
|
|
309
|
+
--ds-switch-thumb-bg: var(--background);
|
|
310
|
+
--ds-switch-thumb-checked-bg: var(--background);
|
|
311
|
+
--ds-drawer-edge: var(--popover);
|
|
312
|
+
--ds-bubble-tinted: oklch(from var(--primary) 0.93 calc(c * 0.4) h);
|
|
313
|
+
--ds-bubble-tinted-hover: oklch(from var(--primary) 0.88 calc(c * 0.5) h);
|
|
314
|
+
|
|
315
|
+
/* ── MEDIDAS DE PIEZAS ──────────────────────────────────────────────────
|
|
316
|
+
* Cada pieza pide su hueco; los valores son los que tenía escritos.
|
|
317
|
+
*/
|
|
318
|
+
--ds-check-size: 1rem; /* casilla y radio */
|
|
319
|
+
--ds-switch-w: 2rem;
|
|
320
|
+
--ds-switch-h: 1.15rem;
|
|
321
|
+
--ds-switch-w-sm: 1.5rem;
|
|
322
|
+
--ds-switch-h-sm: 0.875rem;
|
|
323
|
+
--ds-switch-thumb: 1rem;
|
|
324
|
+
--ds-switch-thumb-sm: 0.75rem;
|
|
325
|
+
--ds-track-h: 0.75rem; /* progreso y deslizador */
|
|
326
|
+
--ds-slider-thumb: 1rem;
|
|
327
|
+
--ds-tabs-list-p: 3px;
|
|
328
|
+
--ds-tab-line-w: 2px;
|
|
329
|
+
--ds-tab-line-offset: -5px;
|
|
330
|
+
--ds-table-head-h: 3rem;
|
|
331
|
+
--ds-popover-w: 18rem;
|
|
332
|
+
--ds-hover-card-w: 18rem;
|
|
333
|
+
--ds-sheet-w: 24rem;
|
|
334
|
+
--ds-drawer-w: 24rem;
|
|
335
|
+
--ds-drawer-inset: 0.5rem;
|
|
336
|
+
--ds-toast-w: 24rem;
|
|
337
|
+
--ds-toast-gap: 0.75rem;
|
|
338
|
+
--ds-toast-peek: 0.75rem;
|
|
339
|
+
--ds-toast-offset: 1rem;
|
|
340
|
+
--ds-scrollbar-w: 0.625rem;
|
|
341
|
+
--ds-touch-target: 2.75rem;
|
|
342
|
+
--ds-sidebar-w: 17.5rem;
|
|
343
|
+
--ds-sidebar-w-mobile: 18rem;
|
|
344
|
+
--ds-sidebar-item-h-lg: 3.5rem;
|
|
345
|
+
--ds-sidebar-sub-item-h: 1.75rem;
|
|
346
|
+
--ds-avatar-sm: 1.5rem;
|
|
347
|
+
--ds-avatar-md: 2rem;
|
|
348
|
+
--ds-avatar-lg: 2.5rem;
|
|
349
|
+
--ds-avatar-ring-w: 2px;
|
|
350
|
+
--ds-kbd-h: 1.25rem;
|
|
351
|
+
--ds-empty-p: 3rem;
|
|
352
|
+
--ds-item-px: 1rem;
|
|
353
|
+
--ds-item-py: 0.875rem;
|
|
354
|
+
--ds-alert-px: 1rem;
|
|
355
|
+
--ds-alert-py: 0.75rem;
|
|
356
|
+
--ds-badge-py: 0.25rem;
|
|
357
|
+
--ds-bubble-px: 0.875rem;
|
|
358
|
+
--ds-bubble-py: 0.625rem;
|
|
359
|
+
--ds-bubble-max-w: 80%;
|
|
360
|
+
--ds-overlay-close-inset: 1rem;
|
|
361
|
+
--ds-drawer-handle: 100px; /* zona de arrastre del cajón */
|
|
362
|
+
--ds-carousel-gap: 1rem; /* separación entre diapositivas */
|
|
363
|
+
--ds-menu-label-py: 0.625rem; /* etiquetas de grupo en menús */
|
|
364
|
+
--ds-sidebar-rail-handle-w: 2px; /* asa del raíl para plegar el lateral */
|
|
365
|
+
|
|
366
|
+
/* ── PESOS DE PIEZAS ────────────────────────────────────────────────────
|
|
367
|
+
* button: texto del botón · overlay-title: títulos de diálogo, hoja, cajón,
|
|
368
|
+
* popover y toast · table-head: cabecera de tabla.
|
|
369
|
+
*/
|
|
370
|
+
--ds-button-weight: 600;
|
|
371
|
+
--ds-overlay-title-weight: 500;
|
|
372
|
+
--ds-table-head-weight: 500;
|
|
373
|
+
|
|
374
|
+
/* ── MOVIMIENTO ADICIONAL ───────────────────────────────────────────── */
|
|
375
|
+
--ds-ease-panel: ease-in-out; /* hojas laterales */
|
|
376
|
+
--ds-ease-collapse: linear; /* plegar el lateral */
|
|
377
|
+
--ds-motion-spin: 1s;
|
|
378
|
+
--ds-motion-shimmer: 1.5s; /* brillo de carga */
|
|
379
|
+
--ds-scroll-fade: 2rem; /* fundido en el borde de una zona con scroll */ /* giro de los indicadores de carga */
|
|
380
|
+
--ds-z-toast: var(--ds-z-overlay); /* avisos efímeros (súbelo para que queden sobre los diálogos) */
|
|
381
|
+
|
|
382
|
+
/* ── ESPACIADO INTERNO ──────────────────────────────────────────────────
|
|
383
|
+
* Un hueco por tipo de pieza. Más aire o más densidad = cambiar estos valores.
|
|
384
|
+
* card (md / sm) · field: campos y selects · cell: celdas de tabla
|
|
385
|
+
* overlay: diálogos y paneles · popover · menu / menu-item: menús
|
|
386
|
+
* button: por tamaño · badge: etiquetas
|
|
387
|
+
*/
|
|
388
|
+
--ds-card-spacing: 1.5rem;
|
|
389
|
+
--ds-card-spacing-sm: 1rem;
|
|
390
|
+
--ds-field-px: 0.75rem;
|
|
391
|
+
--ds-cell-p: 0.75rem;
|
|
392
|
+
--ds-overlay-p: 1.5rem;
|
|
393
|
+
--ds-overlay-gap: 1.5rem;
|
|
394
|
+
--ds-popover-p: 1rem;
|
|
395
|
+
--ds-menu-p: 0.25rem;
|
|
396
|
+
--ds-menu-item-px: 0.75rem;
|
|
397
|
+
--ds-menu-item-py: 0.5rem;
|
|
398
|
+
--ds-button-px-sm: 0.75rem;
|
|
399
|
+
--ds-button-px-md: 1rem;
|
|
400
|
+
--ds-button-px-lg: 1rem;
|
|
401
|
+
--ds-badge-px: 0.625rem;
|
|
402
|
+
--ds-banner-px: 1rem; /* aviso de página (Banner) */
|
|
403
|
+
--ds-banner-py: 0.625rem;
|
|
404
|
+
--ds-tabs-gap: 0.25rem; /* separación entre pestañas cuando el tema las separa */
|
|
405
|
+
|
|
406
|
+
/* ── MATERIALES ─────────────────────────────────────────────────────────
|
|
407
|
+
* Cómo es la superficie, más allá del color. Cada valor es un
|
|
408
|
+
* `backdrop-filter` completo (p. ej. `blur(28px) saturate(180%)`); por
|
|
409
|
+
* defecto `none`: sin efecto y sin coste. `page-backdrop` es un
|
|
410
|
+
* `background-image` para el fondo de la página (degradado, imagen o none).
|
|
411
|
+
* Referencia: el cristal va en la capa de navegación y controles; el
|
|
412
|
+
* contenido (tarjetas) se mantiene casi opaco.
|
|
413
|
+
*/
|
|
414
|
+
--ds-card-backdrop: none;
|
|
415
|
+
--ds-overlay-backdrop: none;
|
|
416
|
+
--ds-field-backdrop: none;
|
|
417
|
+
--ds-sidebar-backdrop: none;
|
|
418
|
+
--ds-page-backdrop: none;
|
|
419
|
+
|
|
420
|
+
/* ── SIDEBAR: ANATOMÍA ──────────────────────────────────────────────────
|
|
421
|
+
* pad: hueco entre la barra y el borde de la ventana (0 = pegada al borde).
|
|
422
|
+
* radius / shadow / ring: silueta de la barra flotante (0 / none = sin silueta).
|
|
423
|
+
* edge: borde de la barra pegada (p. ej. `1px solid var(--sidebar-border)`).
|
|
424
|
+
* item-radius / item-h: forma y altura de las filas de navegación.
|
|
425
|
+
*/
|
|
426
|
+
--ds-sidebar-pad: 0.5rem;
|
|
427
|
+
--ds-sidebar-radius: var(--ds-radius-lg);
|
|
428
|
+
--ds-sidebar-shadow: var(--ds-shadow-raised);
|
|
429
|
+
--ds-sidebar-ring: 1px;
|
|
430
|
+
--ds-sidebar-edge: 0 solid transparent;
|
|
431
|
+
--ds-sidebar-rail-w: 4rem; /* ancho del lateral contraído (raíl de iconos) */
|
|
432
|
+
--ds-sidebar-rail-item: 2.5rem; /* lado del botón de cada destino en el raíl */
|
|
433
|
+
--ds-sidebar-icon: 1.125rem; /* tamaño de los iconos del lateral */
|
|
434
|
+
--ds-sidebar-icon-stroke: 2; /* grosor del trazo de esos iconos */
|
|
435
|
+
--ds-sidebar-logo: 2rem; /* ficha del logo y del avatar del lateral */
|
|
436
|
+
--ds-sidebar-sep-inset: 0rem; /* margen lateral de los separadores (negativo = de borde a borde) */
|
|
437
|
+
--ds-sidebar-item-radius: var(--ds-radius-md);
|
|
438
|
+
--ds-sidebar-item-h: 2.5rem;
|
|
439
|
+
|
|
440
|
+
/* ── BALDOSA DE ICONO ───────────────────────────────────────────────────
|
|
441
|
+
* Un icono grande (Lucide) dentro de una baldosa tintada: la «mascota» barata.
|
|
442
|
+
* sm / md / lg: lado de la baldosa; radius: su esquina; fill: cuánto relleno
|
|
443
|
+
* lleva el icono (0 = solo trazo; 0.2 = aspecto duotono suave).
|
|
444
|
+
*/
|
|
445
|
+
--ds-icon-tile-sm: 2rem;
|
|
446
|
+
--ds-icon-tile-md: 2.75rem;
|
|
447
|
+
--ds-icon-tile-lg: 3.75rem;
|
|
448
|
+
--ds-icon-tile-radius: var(--ds-radius-lg);
|
|
449
|
+
--ds-icon-tile-fill: 0;
|
|
450
|
+
|
|
451
|
+
/* ── COLOR (mapeo de las variables del tema a utilidades) ─────────────── */
|
|
452
|
+
--color-background: var(--background);
|
|
453
|
+
--color-foreground: var(--foreground);
|
|
454
|
+
--color-card: var(--card);
|
|
455
|
+
--color-card-foreground: var(--card-foreground);
|
|
456
|
+
--color-inset: var(--inset);
|
|
457
|
+
--color-inset-foreground: var(--inset-foreground);
|
|
458
|
+
--color-popover: var(--popover);
|
|
459
|
+
--color-popover-foreground: var(--popover-foreground);
|
|
460
|
+
--color-primary: var(--primary);
|
|
461
|
+
--color-primary-foreground: var(--primary-foreground);
|
|
462
|
+
/* Texto acentuado: SIEMPRE `text-link`, nunca el color de marca — puede no
|
|
463
|
+
* alcanzar contraste de texto sobre las superficies claras. */
|
|
464
|
+
--color-link: var(--link);
|
|
465
|
+
--color-link-hover: var(--link-hover);
|
|
466
|
+
--color-brand: var(--brand);
|
|
467
|
+
--color-brand-bright: var(--brand-bright);
|
|
468
|
+
--color-secondary: var(--secondary);
|
|
469
|
+
--color-secondary-foreground: var(--secondary-foreground);
|
|
470
|
+
--color-muted: var(--muted);
|
|
471
|
+
--color-muted-foreground: var(--muted-foreground);
|
|
472
|
+
--color-accent: var(--accent);
|
|
473
|
+
--color-accent-foreground: var(--accent-foreground);
|
|
474
|
+
--color-destructive: var(--destructive);
|
|
475
|
+
--color-destructive-foreground: var(--destructive-foreground);
|
|
476
|
+
--color-border: var(--border);
|
|
477
|
+
--color-input: var(--input);
|
|
478
|
+
--color-ring: var(--ring);
|
|
479
|
+
|
|
480
|
+
--color-chart-1: var(--chart-1);
|
|
481
|
+
--color-chart-2: var(--chart-2);
|
|
482
|
+
--color-chart-3: var(--chart-3);
|
|
483
|
+
--color-chart-4: var(--chart-4);
|
|
484
|
+
--color-chart-5: var(--chart-5);
|
|
485
|
+
|
|
486
|
+
/*
|
|
487
|
+
* Estado. Se exponen como colores del tema para que una etiqueta de severidad
|
|
488
|
+
* se escriba `bg-danger-soft text-danger` y nadie tenga que elegir un rojo a
|
|
489
|
+
* mano.
|
|
490
|
+
*/
|
|
491
|
+
--color-danger: var(--danger);
|
|
492
|
+
--color-danger-soft: var(--danger-soft);
|
|
493
|
+
--color-warning: var(--warning);
|
|
494
|
+
--color-warning-soft: var(--warning-soft);
|
|
495
|
+
--color-success: var(--success);
|
|
496
|
+
--color-success-soft: var(--success-soft);
|
|
497
|
+
--color-neutral: var(--neutral);
|
|
498
|
+
--color-neutral-soft: var(--neutral-soft);
|
|
499
|
+
--color-info: var(--info);
|
|
500
|
+
--color-info-soft: var(--info-soft);
|
|
501
|
+
|
|
502
|
+
--color-sidebar: var(--sidebar);
|
|
503
|
+
--color-sidebar-foreground: var(--sidebar-foreground);
|
|
504
|
+
--color-sidebar-primary: var(--sidebar-primary);
|
|
505
|
+
--color-sidebar-primary-foreground: var(--sidebar-primary-foreground);
|
|
506
|
+
--color-sidebar-accent: var(--sidebar-accent);
|
|
507
|
+
--color-sidebar-accent-foreground: var(--sidebar-accent-foreground);
|
|
508
|
+
--color-sidebar-border: var(--sidebar-border);
|
|
509
|
+
--color-sidebar-ring: var(--sidebar-ring);
|
|
510
|
+
}
|
|
511
|
+
|
|
512
|
+
/* Valores de la piel oscura que la ESTRUCTURA necesita (capa theme: un tema los gana). */
|
|
513
|
+
@layer theme {
|
|
514
|
+
.dark {
|
|
515
|
+
--ds-invalid-ring: color-mix(in oklch, var(--destructive) 40%, transparent);
|
|
516
|
+
--ds-check-bg: color-mix(in oklch, var(--input) 30%, transparent);
|
|
517
|
+
--ds-tab-foreground: var(--muted-foreground);
|
|
518
|
+
--ds-switch-thumb-bg: var(--foreground);
|
|
519
|
+
--ds-switch-thumb-checked-bg: var(--primary-foreground);
|
|
520
|
+
--ds-drawer-edge: var(--border);
|
|
521
|
+
--ds-invalid-border: color-mix(in oklch, var(--destructive) 50%, transparent);
|
|
522
|
+
--ds-choice-card-bg: color-mix(in oklch, var(--primary) 10%, transparent);
|
|
523
|
+
--ds-choice-card-border: color-mix(in oklch, var(--primary) 20%, transparent);
|
|
524
|
+
--ds-switch-track-off: color-mix(in oklch, var(--input) 80%, transparent);
|
|
525
|
+
--ds-layer-ring: color-mix(in oklch, var(--foreground) 10%, transparent);
|
|
526
|
+
--ds-bubble-tinted: oklch(from var(--primary) 0.3 calc(c * 0.4) h);
|
|
527
|
+
--ds-bubble-tinted-hover: oklch(from var(--primary) 0.35 calc(c * 0.5) h);
|
|
528
|
+
}
|
|
529
|
+
}
|
|
530
|
+
|
|
531
|
+
/* Utilidades que usan los componentes (antes no existían y no hacían nada). */
|
|
532
|
+
@utility scrollbar-none {
|
|
533
|
+
scrollbar-width: none;
|
|
534
|
+
&::-webkit-scrollbar {
|
|
535
|
+
display: none;
|
|
536
|
+
}
|
|
537
|
+
}
|
|
538
|
+
@utility no-scrollbar {
|
|
539
|
+
scrollbar-width: none;
|
|
540
|
+
&::-webkit-scrollbar {
|
|
541
|
+
display: none;
|
|
542
|
+
}
|
|
543
|
+
}
|
|
544
|
+
@utility scrollbar-thin {
|
|
545
|
+
scrollbar-width: thin;
|
|
546
|
+
}
|
|
547
|
+
@utility scrollbar-gutter-stable {
|
|
548
|
+
scrollbar-gutter: stable;
|
|
549
|
+
}
|
|
550
|
+
@utility scrollbar-thumb-transparent {
|
|
551
|
+
scrollbar-color: transparent transparent;
|
|
552
|
+
}
|
|
553
|
+
@utility scrollbar-track-transparent {
|
|
554
|
+
scrollbar-color: auto transparent;
|
|
555
|
+
}
|
|
556
|
+
@utility scroll-fade-b {
|
|
557
|
+
mask-image: linear-gradient(to bottom, #000 calc(100% - var(--ds-scroll-fade)), transparent);
|
|
558
|
+
}
|
|
559
|
+
@utility scroll-fade-x {
|
|
560
|
+
mask-image: linear-gradient(to right, transparent, #000 var(--ds-scroll-fade), #000 calc(100% - var(--ds-scroll-fade)), transparent);
|
|
561
|
+
}
|
|
562
|
+
@utility shimmer {
|
|
563
|
+
background-image: linear-gradient(90deg, transparent, color-mix(in oklch, var(--foreground) 8%, transparent), transparent);
|
|
564
|
+
background-size: 200% 100%;
|
|
565
|
+
animation: ds-shimmer var(--ds-motion-shimmer) linear infinite;
|
|
566
|
+
}
|
|
567
|
+
@keyframes ds-shimmer {
|
|
568
|
+
from {
|
|
569
|
+
background-position: 100% 0;
|
|
570
|
+
}
|
|
571
|
+
to {
|
|
572
|
+
background-position: -100% 0;
|
|
573
|
+
}
|
|
574
|
+
}
|
|
575
|
+
/* Acordeón de Base UI: anima hasta --accordion-panel-height (tw-animate solo conoce Radix y otros). */
|
|
576
|
+
@utility animate-accordion-open {
|
|
577
|
+
animation: ds-accordion-open var(--ds-motion-base) var(--ds-ease-standard);
|
|
578
|
+
}
|
|
579
|
+
@utility animate-accordion-close {
|
|
580
|
+
animation: ds-accordion-close var(--ds-motion-base) var(--ds-ease-standard);
|
|
581
|
+
}
|
|
582
|
+
@keyframes ds-accordion-open {
|
|
583
|
+
from {
|
|
584
|
+
height: 0;
|
|
585
|
+
}
|
|
586
|
+
to {
|
|
587
|
+
height: var(--accordion-panel-height, auto);
|
|
588
|
+
}
|
|
589
|
+
}
|
|
590
|
+
@keyframes ds-accordion-close {
|
|
591
|
+
from {
|
|
592
|
+
height: var(--accordion-panel-height, auto);
|
|
593
|
+
}
|
|
594
|
+
to {
|
|
595
|
+
height: 0;
|
|
596
|
+
}
|
|
597
|
+
}
|
|
598
|
+
|
|
599
|
+
@layer base {
|
|
600
|
+
* {
|
|
601
|
+
@apply border-border outline-ring/50;
|
|
602
|
+
}
|
|
603
|
+
|
|
604
|
+
html,
|
|
605
|
+
body,
|
|
606
|
+
#app {
|
|
607
|
+
min-height: 100%;
|
|
608
|
+
}
|
|
609
|
+
|
|
610
|
+
body {
|
|
611
|
+
@apply bg-background text-foreground font-sans m-0 antialiased;
|
|
612
|
+
background-image: var(--ds-page-backdrop);
|
|
613
|
+
background-attachment: fixed;
|
|
614
|
+
background-size: cover;
|
|
615
|
+
}
|
|
616
|
+
|
|
617
|
+
a {
|
|
618
|
+
@apply text-link hover:text-link-hover;
|
|
619
|
+
}
|
|
620
|
+
|
|
621
|
+
/* Títulos: fuente de titulares del tema (`--ds-font-display`), en TODOS los títulos
|
|
622
|
+
* de componente (familia «title» del contrato), no solo en algunos. */
|
|
623
|
+
h1,
|
|
624
|
+
h2,
|
|
625
|
+
h3,
|
|
626
|
+
h4,
|
|
627
|
+
[data-slot='card-title'],
|
|
628
|
+
[data-slot='dialog-title'],
|
|
629
|
+
[data-slot='sheet-title'],
|
|
630
|
+
[data-slot='alert-dialog-title'],
|
|
631
|
+
[data-slot='drawer-title'],
|
|
632
|
+
[data-slot='empty-title'],
|
|
633
|
+
[data-slot='popover-title'],
|
|
634
|
+
[data-slot='alert-title'] {
|
|
635
|
+
font-family: var(--font-display);
|
|
636
|
+
font-variation-settings: var(--ds-display-variation);
|
|
637
|
+
}
|
|
638
|
+
|
|
639
|
+
h1,
|
|
640
|
+
h2,
|
|
641
|
+
h3,
|
|
642
|
+
h4 {
|
|
643
|
+
letter-spacing: var(--ds-heading-tracking);
|
|
644
|
+
}
|
|
645
|
+
|
|
646
|
+
/*
|
|
647
|
+
* ROTULADOR (gesto común): franja translúcida bajo los títulos. Es un subrayado
|
|
648
|
+
* grueso, que se pinta DETRÁS de la letra, sigue el texto línea a línea y no
|
|
649
|
+
* ocupa sitio: con `--ds-marker: transparent` (por defecto) no se ve ni mueve nada.
|
|
650
|
+
* Lo enciende cualquier tema o el brand.css de una app con un color.
|
|
651
|
+
*/
|
|
652
|
+
[data-slot='card-title'],
|
|
653
|
+
[data-slot='dialog-title'],
|
|
654
|
+
[data-slot='sheet-title'],
|
|
655
|
+
[data-slot='alert-dialog-title'],
|
|
656
|
+
[data-slot='drawer-title'],
|
|
657
|
+
[data-slot='empty-title'],
|
|
658
|
+
header h1 {
|
|
659
|
+
text-decoration-line: underline;
|
|
660
|
+
text-decoration-color: var(--ds-marker);
|
|
661
|
+
text-decoration-thickness: var(--ds-marker-thickness);
|
|
662
|
+
text-underline-offset: var(--ds-marker-offset);
|
|
663
|
+
text-decoration-skip-ink: none;
|
|
664
|
+
}
|
|
665
|
+
|
|
666
|
+
/*
|
|
667
|
+
* EXCEPCIÓN: los enlaces del CHROME no son enlaces de texto — son destinos de
|
|
668
|
+
* navegación. Deben heredar el color de su superficie, no el color de enlace.
|
|
669
|
+
*/
|
|
670
|
+
[data-slot='sidebar'] a,
|
|
671
|
+
[data-sidebar='menu-button'],
|
|
672
|
+
[role='menuitem'],
|
|
673
|
+
[role='menuitemradio'],
|
|
674
|
+
[role='option'] {
|
|
675
|
+
color: inherit;
|
|
676
|
+
}
|
|
677
|
+
[data-slot='sidebar'] a:hover,
|
|
678
|
+
[data-sidebar='menu-button']:hover {
|
|
679
|
+
color: inherit;
|
|
680
|
+
}
|
|
681
|
+
|
|
682
|
+
::selection {
|
|
683
|
+
background: color-mix(in oklch, var(--brand) 25%, transparent);
|
|
684
|
+
}
|
|
685
|
+
|
|
686
|
+
/*
|
|
687
|
+
* TARJETA: radio `xl`, borde de 1px y sombra de reposo. `ui/card.tsx` ya lleva
|
|
688
|
+
* estos valores; esta regla los GARANTIZA aunque se regenere con la CLI de
|
|
689
|
+
* shadcn. Material de la tarjeta: `--ds-card-backdrop`.
|
|
690
|
+
*/
|
|
691
|
+
[data-slot='card'] {
|
|
692
|
+
@apply rounded-xl shadow-card ring-0;
|
|
693
|
+
border: 1px solid var(--border);
|
|
694
|
+
-webkit-backdrop-filter: var(--ds-card-backdrop);
|
|
695
|
+
backdrop-filter: var(--ds-card-backdrop);
|
|
696
|
+
}
|
|
697
|
+
|
|
698
|
+
/*
|
|
699
|
+
* Estados de interacción, resueltos UNA vez para toda la aplicación. La lista
|
|
700
|
+
* de roles cubre lo que Base UI renderiza sin <button>: opciones de menú y
|
|
701
|
+
* select, pestañas, switches, checkboxes y radios.
|
|
702
|
+
*/
|
|
703
|
+
button:not(:disabled),
|
|
704
|
+
select:not(:disabled),
|
|
705
|
+
[role='button']:not([aria-disabled='true'], [data-disabled]),
|
|
706
|
+
[role='menuitem']:not([aria-disabled='true'], [data-disabled]),
|
|
707
|
+
[role='menuitemcheckbox']:not([aria-disabled='true'], [data-disabled]),
|
|
708
|
+
[role='menuitemradio']:not([aria-disabled='true'], [data-disabled]),
|
|
709
|
+
[role='option']:not([aria-disabled='true'], [data-disabled]),
|
|
710
|
+
[role='tab']:not([aria-disabled='true'], [data-disabled]),
|
|
711
|
+
[role='switch']:not([aria-disabled='true'], [data-disabled]),
|
|
712
|
+
[role='checkbox']:not([aria-disabled='true'], [data-disabled]),
|
|
713
|
+
[role='radio']:not([aria-disabled='true'], [data-disabled]),
|
|
714
|
+
[role='combobox']:not([aria-disabled='true'], [data-disabled]),
|
|
715
|
+
[role='slider']:not([aria-disabled='true'], [data-disabled]),
|
|
716
|
+
input[type='checkbox']:not(:disabled),
|
|
717
|
+
input[type='radio']:not(:disabled),
|
|
718
|
+
input[type='range']:not(:disabled),
|
|
719
|
+
a[href],
|
|
720
|
+
label[for],
|
|
721
|
+
summary {
|
|
722
|
+
@apply cursor-pointer;
|
|
723
|
+
}
|
|
724
|
+
|
|
725
|
+
button:disabled,
|
|
726
|
+
select:disabled,
|
|
727
|
+
input:disabled,
|
|
728
|
+
[aria-disabled='true'],
|
|
729
|
+
[data-disabled] {
|
|
730
|
+
@apply cursor-not-allowed;
|
|
731
|
+
}
|
|
732
|
+
|
|
733
|
+
/*
|
|
734
|
+
* Los primitivos de menú/select traen `cursor-default` como UTILIDAD, y las
|
|
735
|
+
* utilidades ganan a la capa base: aquí el pointer se IMPONE para los roles
|
|
736
|
+
* interactivos de esos popups.
|
|
737
|
+
*/
|
|
738
|
+
[role='menuitem']:not([aria-disabled='true'], [data-disabled]),
|
|
739
|
+
[role='menuitemcheckbox']:not([aria-disabled='true'], [data-disabled]),
|
|
740
|
+
[role='menuitemradio']:not([aria-disabled='true'], [data-disabled]),
|
|
741
|
+
[role='option']:not([aria-disabled='true'], [data-disabled]) {
|
|
742
|
+
cursor: pointer !important;
|
|
743
|
+
}
|
|
744
|
+
|
|
745
|
+
[aria-busy='true'] {
|
|
746
|
+
@apply cursor-progress;
|
|
747
|
+
}
|
|
748
|
+
|
|
749
|
+
/* Foco visible solo en navegación por teclado, nunca al hacer clic. */
|
|
750
|
+
:focus-visible {
|
|
751
|
+
@apply outline-ring outline-2 outline-offset-2;
|
|
752
|
+
}
|
|
753
|
+
|
|
754
|
+
/*
|
|
755
|
+
* MATERIALES de la capa de controles y navegación. Por `data-slot`, para que
|
|
756
|
+
* los hereden todos los componentes sin que ninguno escriba un efecto propio.
|
|
757
|
+
*/
|
|
758
|
+
[data-slot='popover-content'],
|
|
759
|
+
[data-slot='dropdown-menu-content'],
|
|
760
|
+
[data-slot='dropdown-menu-sub-content'],
|
|
761
|
+
[data-slot='select-content'],
|
|
762
|
+
[data-slot='dialog-content'],
|
|
763
|
+
[data-slot='sheet-content'],
|
|
764
|
+
[data-slot='tooltip-content'] {
|
|
765
|
+
-webkit-backdrop-filter: var(--ds-overlay-backdrop);
|
|
766
|
+
backdrop-filter: var(--ds-overlay-backdrop);
|
|
767
|
+
}
|
|
768
|
+
|
|
769
|
+
[data-slot='input'],
|
|
770
|
+
[data-slot='textarea'],
|
|
771
|
+
[data-slot='select-trigger'] {
|
|
772
|
+
-webkit-backdrop-filter: var(--ds-field-backdrop);
|
|
773
|
+
backdrop-filter: var(--ds-field-backdrop);
|
|
774
|
+
}
|
|
775
|
+
|
|
776
|
+
/*
|
|
777
|
+
* SIDEBAR. Anatomía por variables (ver arriba): `--ds-sidebar-*`. El borde de
|
|
778
|
+
* la barra pegada y el material de cristal van aquí; la silueta flotante
|
|
779
|
+
* (pad, radio, sombra, anillo) la aplica el propio componente.
|
|
780
|
+
*/
|
|
781
|
+
[data-slot='sidebar-inner'] {
|
|
782
|
+
border-right: var(--ds-sidebar-edge);
|
|
783
|
+
-webkit-backdrop-filter: var(--ds-sidebar-backdrop);
|
|
784
|
+
backdrop-filter: var(--ds-sidebar-backdrop);
|
|
785
|
+
}
|
|
786
|
+
|
|
787
|
+
/*
|
|
788
|
+
* TAMAÑO Y ALINEACIÓN DE LA NAVEGACIÓN (los `!important` baten a las
|
|
789
|
+
* utilidades que el primitivo trae escritas).
|
|
790
|
+
* EXPANDIDO: filas de altura `--ds-sidebar-item-h` con icono de 18px.
|
|
791
|
+
* COLAPSADO: botón cuadrado de `--ds-sidebar-rail-item` con el icono centrado,
|
|
792
|
+
* sin etiqueta, y el botón centrado en el raíl (`--ds-sidebar-rail-w`).
|
|
793
|
+
*/
|
|
794
|
+
[data-sidebar='menu-button'] {
|
|
795
|
+
min-height: var(--ds-sidebar-item-h);
|
|
796
|
+
}
|
|
797
|
+
[data-sidebar='menu-button'] svg {
|
|
798
|
+
width: var(--ds-sidebar-icon) !important;
|
|
799
|
+
height: var(--ds-sidebar-icon) !important;
|
|
800
|
+
stroke-width: var(--ds-sidebar-icon-stroke);
|
|
801
|
+
}
|
|
802
|
+
/* Logo / avatar del lateral (botones lg: marca y cuenta) */
|
|
803
|
+
[data-sidebar='menu-button'][data-size='lg'] > :first-child {
|
|
804
|
+
width: var(--ds-sidebar-logo);
|
|
805
|
+
height: var(--ds-sidebar-logo);
|
|
806
|
+
flex: 0 0 var(--ds-sidebar-logo);
|
|
807
|
+
}
|
|
808
|
+
/* Separadores: alineados con las filas (0) o de borde a borde (negativo) */
|
|
809
|
+
[data-slot='sidebar-separator'] {
|
|
810
|
+
margin-inline: var(--ds-sidebar-sep-inset);
|
|
811
|
+
width: auto;
|
|
812
|
+
}
|
|
813
|
+
|
|
814
|
+
[data-collapsible='icon'] [data-slot='sidebar-header'],
|
|
815
|
+
[data-collapsible='icon'] [data-slot='sidebar-footer'],
|
|
816
|
+
[data-collapsible='icon'] [data-slot='sidebar-group'] {
|
|
817
|
+
padding-inline: 0.75rem;
|
|
818
|
+
}
|
|
819
|
+
/* Raíl: tecla cuadrada, centrada, con el icono centrado dentro y sin etiqueta */
|
|
820
|
+
[data-collapsible='icon'] [data-sidebar='menu-button'] {
|
|
821
|
+
width: var(--ds-sidebar-rail-item) !important;
|
|
822
|
+
height: var(--ds-sidebar-rail-item) !important;
|
|
823
|
+
min-height: var(--ds-sidebar-rail-item);
|
|
824
|
+
padding: 0 !important;
|
|
825
|
+
gap: 0;
|
|
826
|
+
justify-content: center;
|
|
827
|
+
margin-inline: auto;
|
|
828
|
+
}
|
|
829
|
+
[data-collapsible='icon'] [data-sidebar='menu-button'] > span:last-child:not(:first-child),
|
|
830
|
+
[data-collapsible='icon'] [data-sidebar='menu-button'][data-size='lg'] > :not(:first-child) {
|
|
831
|
+
display: none;
|
|
832
|
+
}
|
|
833
|
+
|
|
834
|
+
/*
|
|
835
|
+
* `prefers-reduced-motion`: en un chrome que se pliega a diario, la animación
|
|
836
|
+
* de anchura es justo el movimiento que molesta a quien pide menos movimiento.
|
|
837
|
+
*/
|
|
838
|
+
@media (prefers-reduced-motion: reduce) {
|
|
839
|
+
*,
|
|
840
|
+
*::before,
|
|
841
|
+
*::after {
|
|
842
|
+
transition-duration: 0.01ms !important;
|
|
843
|
+
animation-duration: 0.01ms !important;
|
|
844
|
+
animation-iteration-count: 1 !important;
|
|
845
|
+
}
|
|
846
|
+
}
|
|
847
|
+
|
|
848
|
+
/*
|
|
849
|
+
* `prefers-reduced-transparency`: quien lo pide no debe recibir cristal. Se
|
|
850
|
+
* anulan los materiales (el soporte del navegador aún es limitado).
|
|
851
|
+
*/
|
|
852
|
+
@media (prefers-reduced-transparency: reduce) {
|
|
853
|
+
[data-slot='card'],
|
|
854
|
+
[data-slot='popover-content'],
|
|
855
|
+
[data-slot='dropdown-menu-content'],
|
|
856
|
+
[data-slot='dropdown-menu-sub-content'],
|
|
857
|
+
[data-slot='select-content'],
|
|
858
|
+
[data-slot='dialog-content'],
|
|
859
|
+
[data-slot='sheet-content'],
|
|
860
|
+
[data-slot='tooltip-content'],
|
|
861
|
+
[data-slot='input'],
|
|
862
|
+
[data-slot='textarea'],
|
|
863
|
+
[data-slot='select-trigger'],
|
|
864
|
+
[data-slot='sidebar-inner'] {
|
|
865
|
+
-webkit-backdrop-filter: none;
|
|
866
|
+
backdrop-filter: none;
|
|
867
|
+
}
|
|
868
|
+
}
|
|
869
|
+
}
|
|
870
|
+
|
|
871
|
+
/* Baldosa de icono: el relleno del icono lo decide el tema (--ds-icon-tile-fill). */
|
|
872
|
+
@layer base {
|
|
873
|
+
[data-slot='icon-tile'] svg {
|
|
874
|
+
fill: color-mix(in oklch, currentColor calc(var(--ds-icon-tile-fill) * 100%), transparent);
|
|
875
|
+
}
|
|
876
|
+
}
|