orbital-ds 0.2.0 → 0.3.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 +57 -0
- package/README.md +22 -14
- package/components.manifest.json +1255 -0
- package/contract.json +82 -38
- package/dist/styles.css +486 -427
- package/dist/themes/qratia.css +14 -14
- package/dist/themes/qratia.fonts.css +2 -0
- package/dist/themes/qratia.scoped.css +247 -0
- package/dist/themes/zyro.css +214 -60
- package/dist/themes/zyro.fonts.css +2 -0
- package/dist/themes/zyro.scoped.css +343 -0
- package/dist/ui/attachment.d.ts +1 -1
- package/dist/ui/badge.d.ts +1 -1
- package/dist/ui/bubble.d.ts +1 -1
- package/dist/ui/button.d.ts +2 -2
- package/dist/ui/input-group.d.ts +1 -1
- package/dist/ui/item.d.ts +2 -2
- package/dist/ui/sidebar.js +4 -4
- package/dist/ui/tabs.d.ts +1 -1
- package/docs/CONTRACT.md +15 -5
- package/package.json +11 -6
- package/scripts/doctor.mjs +88 -28
- package/scripts/manifest.mjs +79 -0
package/dist/styles.css
CHANGED
|
@@ -1,427 +1,486 @@
|
|
|
1
|
-
/*
|
|
2
|
-
* orbital-ds · ESTRUCTURA común a todos los temas.
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
@
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
*
|
|
29
|
-
*
|
|
30
|
-
*
|
|
31
|
-
*
|
|
32
|
-
*
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
--
|
|
45
|
-
--
|
|
46
|
-
--
|
|
47
|
-
--
|
|
48
|
-
--
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
--
|
|
57
|
-
--
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
--ds-
|
|
64
|
-
--ds-
|
|
65
|
-
--ds-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
--
|
|
74
|
-
--
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
*
|
|
81
|
-
*
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
--ds-
|
|
89
|
-
--ds-
|
|
90
|
-
--ds-
|
|
91
|
-
--ds-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
--ds-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
--
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
*
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
--ds-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
--ds-
|
|
118
|
-
--ds-
|
|
119
|
-
--ds-
|
|
120
|
-
--ds-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
--ds-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
--
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
--
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
--
|
|
156
|
-
--
|
|
157
|
-
--
|
|
158
|
-
--
|
|
159
|
-
--
|
|
160
|
-
--
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
--
|
|
164
|
-
--
|
|
165
|
-
--
|
|
166
|
-
--
|
|
167
|
-
--
|
|
168
|
-
--
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
--
|
|
180
|
-
--
|
|
181
|
-
--
|
|
182
|
-
--
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
*
|
|
187
|
-
*
|
|
188
|
-
*
|
|
189
|
-
*/
|
|
190
|
-
--
|
|
191
|
-
--
|
|
192
|
-
--
|
|
193
|
-
--
|
|
194
|
-
--
|
|
195
|
-
--
|
|
196
|
-
--
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
--color-
|
|
200
|
-
|
|
201
|
-
--color-
|
|
202
|
-
--color-
|
|
203
|
-
--color-
|
|
204
|
-
--color-
|
|
205
|
-
--color-
|
|
206
|
-
--color-
|
|
207
|
-
--color-
|
|
208
|
-
--color-
|
|
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
|
-
[role='
|
|
308
|
-
[role='
|
|
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
|
-
[data-slot='
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
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
|
+
--ds-radius-sm: calc(var(--radius) - 4px);
|
|
95
|
+
--ds-radius-md: calc(var(--radius) - 2px);
|
|
96
|
+
--ds-radius-lg: var(--radius);
|
|
97
|
+
--ds-radius-xl: calc(var(--radius) + 6px);
|
|
98
|
+
--ds-radius-2xl: calc(var(--radius) + 8px);
|
|
99
|
+
--ds-radius-control: 2rem;
|
|
100
|
+
--ds-radius-overlay: 2rem;
|
|
101
|
+
|
|
102
|
+
/* ── ALTURA DE CONTROLES ────────────────────────────────────────────────
|
|
103
|
+
* Una escala para botón, campo y select: alineados en una misma fila.
|
|
104
|
+
*/
|
|
105
|
+
--ds-control-h-sm: 2rem;
|
|
106
|
+
--ds-control-h-md: 2.25rem;
|
|
107
|
+
--ds-control-h-lg: 2.5rem;
|
|
108
|
+
|
|
109
|
+
/* ── SOMBRAS ────────────────────────────────────────────────────────────
|
|
110
|
+
* Un hueco por tipo de pieza. `control` está vacío (`0 0 #0000`): existe para que
|
|
111
|
+
* un tema pueda dar relieve a los campos con solo dar valor. «Sin sombra» se
|
|
112
|
+
* escribe `0 0 #0000`, NUNCA `none`: una variable con `none` invalida todo el
|
|
113
|
+
* `box-shadow` (anillo de foco incluido).
|
|
114
|
+
* card/-hover: tarjeta (reposo y realce) · raised: piezas que flotan
|
|
115
|
+
* overlay: capas · popover: menús y selects
|
|
116
|
+
*/
|
|
117
|
+
--shadow-card: var(--ds-shadow-card);
|
|
118
|
+
--shadow-card-hover: var(--ds-shadow-card-hover);
|
|
119
|
+
--shadow-control: var(--ds-shadow-control);
|
|
120
|
+
--shadow-raised: var(--ds-shadow-raised);
|
|
121
|
+
--shadow-overlay: var(--ds-shadow-overlay);
|
|
122
|
+
--shadow-popover: var(--ds-shadow-popover);
|
|
123
|
+
|
|
124
|
+
--ds-shadow-card: 0 1px 2px rgb(0 0 0 / 0.08), 0 3px 10px rgb(0 0 0 / 0.07);
|
|
125
|
+
--ds-shadow-card-hover: 0 3px 6px rgb(0 0 0 / 0.1), 0 14px 32px rgb(0 0 0 / 0.14);
|
|
126
|
+
--ds-shadow-control: 0 0 #0000;
|
|
127
|
+
--ds-shadow-raised: 0 1px 3px rgb(0 0 0 / 0.1), 0 1px 2px rgb(0 0 0 / 0.1);
|
|
128
|
+
--ds-shadow-overlay: 0 10px 15px rgb(0 0 0 / 0.1), 0 4px 6px rgb(0 0 0 / 0.1);
|
|
129
|
+
--ds-shadow-popover: 0 25px 50px rgb(0 0 0 / 0.25);
|
|
130
|
+
|
|
131
|
+
/* ── CAPAS, MOVIMIENTO, FOCO, VELO ──────────────────────────────────────
|
|
132
|
+
* z-index con nombre (nunca un número en un componente) · dos o tres
|
|
133
|
+
* duraciones · grosor del anillo de foco · velo tras diálogos y paneles.
|
|
134
|
+
*/
|
|
135
|
+
--ds-z-raised: 10;
|
|
136
|
+
--ds-z-sticky: 20;
|
|
137
|
+
--ds-z-overlay: 50;
|
|
138
|
+
|
|
139
|
+
--ds-motion-fast: 100ms;
|
|
140
|
+
--ds-motion-base: 200ms;
|
|
141
|
+
--ds-motion-slow: 300ms;
|
|
142
|
+
--ds-motion-blink: 1s;
|
|
143
|
+
|
|
144
|
+
--ds-ring-width: 3px;
|
|
145
|
+
|
|
146
|
+
--color-scrim: var(--ds-scrim);
|
|
147
|
+
--ds-scrim: oklch(0 0 0 / 0.8);
|
|
148
|
+
|
|
149
|
+
/* ── ESPACIADO INTERNO ──────────────────────────────────────────────────
|
|
150
|
+
* Un hueco por tipo de pieza. Más aire o más densidad = cambiar estos valores.
|
|
151
|
+
* card (md / sm) · field: campos y selects · cell: celdas de tabla
|
|
152
|
+
* overlay: diálogos y paneles · popover · menu / menu-item: menús
|
|
153
|
+
* button: por tamaño · badge: etiquetas
|
|
154
|
+
*/
|
|
155
|
+
--ds-card-spacing: 1.5rem;
|
|
156
|
+
--ds-card-spacing-sm: 1rem;
|
|
157
|
+
--ds-field-px: 0.75rem;
|
|
158
|
+
--ds-cell-p: 0.75rem;
|
|
159
|
+
--ds-overlay-p: 1.5rem;
|
|
160
|
+
--ds-overlay-gap: 1.5rem;
|
|
161
|
+
--ds-popover-p: 1rem;
|
|
162
|
+
--ds-menu-p: 0.25rem;
|
|
163
|
+
--ds-menu-item-px: 0.75rem;
|
|
164
|
+
--ds-menu-item-py: 0.5rem;
|
|
165
|
+
--ds-button-px-sm: 0.75rem;
|
|
166
|
+
--ds-button-px-md: 1rem;
|
|
167
|
+
--ds-button-px-lg: 1rem;
|
|
168
|
+
--ds-badge-px: 0.625rem;
|
|
169
|
+
|
|
170
|
+
/* ── MATERIALES ─────────────────────────────────────────────────────────
|
|
171
|
+
* Cómo es la superficie, más allá del color. Cada valor es un
|
|
172
|
+
* `backdrop-filter` completo (p. ej. `blur(28px) saturate(180%)`); por
|
|
173
|
+
* defecto `none`: sin efecto y sin coste. `page-backdrop` es un
|
|
174
|
+
* `background-image` para el fondo de la página (degradado, imagen o none).
|
|
175
|
+
* Referencia: el cristal va en la capa de navegación y controles; el
|
|
176
|
+
* contenido (tarjetas) se mantiene casi opaco.
|
|
177
|
+
*/
|
|
178
|
+
--ds-card-backdrop: none;
|
|
179
|
+
--ds-overlay-backdrop: none;
|
|
180
|
+
--ds-field-backdrop: none;
|
|
181
|
+
--ds-sidebar-backdrop: none;
|
|
182
|
+
--ds-page-backdrop: none;
|
|
183
|
+
|
|
184
|
+
/* ── SIDEBAR: ANATOMÍA ──────────────────────────────────────────────────
|
|
185
|
+
* pad: hueco entre la barra y el borde de la ventana (0 = pegada al borde).
|
|
186
|
+
* radius / shadow / ring: silueta de la barra flotante (0 / none = sin silueta).
|
|
187
|
+
* edge: borde de la barra pegada (p. ej. `1px solid var(--sidebar-border)`).
|
|
188
|
+
* item-radius / item-h: forma y altura de las filas de navegación.
|
|
189
|
+
*/
|
|
190
|
+
--ds-sidebar-pad: 0.5rem;
|
|
191
|
+
--ds-sidebar-radius: var(--ds-radius-lg);
|
|
192
|
+
--ds-sidebar-shadow: var(--ds-shadow-raised);
|
|
193
|
+
--ds-sidebar-ring: 1px;
|
|
194
|
+
--ds-sidebar-edge: 0 solid transparent;
|
|
195
|
+
--ds-sidebar-item-radius: var(--ds-radius-md);
|
|
196
|
+
--ds-sidebar-item-h: 2.5rem;
|
|
197
|
+
|
|
198
|
+
/* ── COLOR (mapeo de las variables del tema a utilidades) ─────────────── */
|
|
199
|
+
--color-background: var(--background);
|
|
200
|
+
--color-foreground: var(--foreground);
|
|
201
|
+
--color-card: var(--card);
|
|
202
|
+
--color-card-foreground: var(--card-foreground);
|
|
203
|
+
--color-inset: var(--inset);
|
|
204
|
+
--color-inset-foreground: var(--inset-foreground);
|
|
205
|
+
--color-popover: var(--popover);
|
|
206
|
+
--color-popover-foreground: var(--popover-foreground);
|
|
207
|
+
--color-primary: var(--primary);
|
|
208
|
+
--color-primary-foreground: var(--primary-foreground);
|
|
209
|
+
/* Texto acentuado: SIEMPRE `text-link`, nunca el color de marca — puede no
|
|
210
|
+
* alcanzar contraste de texto sobre las superficies claras. */
|
|
211
|
+
--color-link: var(--link);
|
|
212
|
+
--color-link-hover: var(--link-hover);
|
|
213
|
+
--color-brand: var(--brand);
|
|
214
|
+
--color-brand-bright: var(--brand-bright);
|
|
215
|
+
--color-secondary: var(--secondary);
|
|
216
|
+
--color-secondary-foreground: var(--secondary-foreground);
|
|
217
|
+
--color-muted: var(--muted);
|
|
218
|
+
--color-muted-foreground: var(--muted-foreground);
|
|
219
|
+
--color-accent: var(--accent);
|
|
220
|
+
--color-accent-foreground: var(--accent-foreground);
|
|
221
|
+
--color-destructive: var(--destructive);
|
|
222
|
+
--color-destructive-foreground: var(--destructive-foreground);
|
|
223
|
+
--color-border: var(--border);
|
|
224
|
+
--color-input: var(--input);
|
|
225
|
+
--color-ring: var(--ring);
|
|
226
|
+
|
|
227
|
+
--color-chart-1: var(--chart-1);
|
|
228
|
+
--color-chart-2: var(--chart-2);
|
|
229
|
+
--color-chart-3: var(--chart-3);
|
|
230
|
+
--color-chart-4: var(--chart-4);
|
|
231
|
+
--color-chart-5: var(--chart-5);
|
|
232
|
+
|
|
233
|
+
/*
|
|
234
|
+
* Estado. Se exponen como colores del tema para que una etiqueta de severidad
|
|
235
|
+
* se escriba `bg-danger-soft text-danger` y nadie tenga que elegir un rojo a
|
|
236
|
+
* mano.
|
|
237
|
+
*/
|
|
238
|
+
--color-danger: var(--danger);
|
|
239
|
+
--color-danger-soft: var(--danger-soft);
|
|
240
|
+
--color-warning: var(--warning);
|
|
241
|
+
--color-warning-soft: var(--warning-soft);
|
|
242
|
+
--color-success: var(--success);
|
|
243
|
+
--color-success-soft: var(--success-soft);
|
|
244
|
+
--color-neutral: var(--neutral);
|
|
245
|
+
--color-neutral-soft: var(--neutral-soft);
|
|
246
|
+
--color-info: var(--info);
|
|
247
|
+
--color-info-soft: var(--info-soft);
|
|
248
|
+
|
|
249
|
+
--color-sidebar: var(--sidebar);
|
|
250
|
+
--color-sidebar-foreground: var(--sidebar-foreground);
|
|
251
|
+
--color-sidebar-primary: var(--sidebar-primary);
|
|
252
|
+
--color-sidebar-primary-foreground: var(--sidebar-primary-foreground);
|
|
253
|
+
--color-sidebar-accent: var(--sidebar-accent);
|
|
254
|
+
--color-sidebar-accent-foreground: var(--sidebar-accent-foreground);
|
|
255
|
+
--color-sidebar-border: var(--sidebar-border);
|
|
256
|
+
--color-sidebar-ring: var(--sidebar-ring);
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
@layer base {
|
|
260
|
+
* {
|
|
261
|
+
@apply border-border outline-ring/50;
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
html,
|
|
265
|
+
body,
|
|
266
|
+
#app {
|
|
267
|
+
min-height: 100%;
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
body {
|
|
271
|
+
@apply bg-background text-foreground font-sans m-0 antialiased;
|
|
272
|
+
background-image: var(--ds-page-backdrop);
|
|
273
|
+
background-attachment: fixed;
|
|
274
|
+
background-size: cover;
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
a {
|
|
278
|
+
@apply text-link hover:text-link-hover;
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
/* Títulos: fuente de titulares del tema (`--ds-font-display`). */
|
|
282
|
+
h1,
|
|
283
|
+
h2,
|
|
284
|
+
h3,
|
|
285
|
+
h4,
|
|
286
|
+
[data-slot='card-title'],
|
|
287
|
+
[data-slot='dialog-title'],
|
|
288
|
+
[data-slot='sheet-title'],
|
|
289
|
+
[data-slot='alert-title'] {
|
|
290
|
+
font-family: var(--font-display);
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
h1,
|
|
294
|
+
h2,
|
|
295
|
+
h3,
|
|
296
|
+
h4 {
|
|
297
|
+
letter-spacing: var(--ds-heading-tracking);
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
/*
|
|
301
|
+
* EXCEPCIÓN: los enlaces del CHROME no son enlaces de texto — son destinos de
|
|
302
|
+
* navegación. Deben heredar el color de su superficie, no el color de enlace.
|
|
303
|
+
*/
|
|
304
|
+
[data-slot='sidebar'] a,
|
|
305
|
+
[data-sidebar='menu-button'],
|
|
306
|
+
[role='menuitem'],
|
|
307
|
+
[role='menuitemradio'],
|
|
308
|
+
[role='option'] {
|
|
309
|
+
color: inherit;
|
|
310
|
+
}
|
|
311
|
+
[data-slot='sidebar'] a:hover,
|
|
312
|
+
[data-sidebar='menu-button']:hover {
|
|
313
|
+
color: inherit;
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
::selection {
|
|
317
|
+
background: color-mix(in oklch, var(--brand) 25%, transparent);
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
/*
|
|
321
|
+
* TARJETA: radio `xl`, borde de 1px y sombra de reposo. `ui/card.tsx` ya lleva
|
|
322
|
+
* estos valores; esta regla los GARANTIZA aunque se regenere con la CLI de
|
|
323
|
+
* shadcn. Material de la tarjeta: `--ds-card-backdrop`.
|
|
324
|
+
*/
|
|
325
|
+
[data-slot='card'] {
|
|
326
|
+
@apply rounded-xl shadow-card ring-0;
|
|
327
|
+
border: 1px solid var(--border);
|
|
328
|
+
-webkit-backdrop-filter: var(--ds-card-backdrop);
|
|
329
|
+
backdrop-filter: var(--ds-card-backdrop);
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
/*
|
|
333
|
+
* Estados de interacción, resueltos UNA vez para toda la aplicación. La lista
|
|
334
|
+
* de roles cubre lo que Base UI renderiza sin <button>: opciones de menú y
|
|
335
|
+
* select, pestañas, switches, checkboxes y radios.
|
|
336
|
+
*/
|
|
337
|
+
button:not(:disabled),
|
|
338
|
+
select:not(:disabled),
|
|
339
|
+
[role='button']:not([aria-disabled='true'], [data-disabled]),
|
|
340
|
+
[role='menuitem']:not([aria-disabled='true'], [data-disabled]),
|
|
341
|
+
[role='menuitemcheckbox']:not([aria-disabled='true'], [data-disabled]),
|
|
342
|
+
[role='menuitemradio']:not([aria-disabled='true'], [data-disabled]),
|
|
343
|
+
[role='option']:not([aria-disabled='true'], [data-disabled]),
|
|
344
|
+
[role='tab']:not([aria-disabled='true'], [data-disabled]),
|
|
345
|
+
[role='switch']:not([aria-disabled='true'], [data-disabled]),
|
|
346
|
+
[role='checkbox']:not([aria-disabled='true'], [data-disabled]),
|
|
347
|
+
[role='radio']:not([aria-disabled='true'], [data-disabled]),
|
|
348
|
+
[role='combobox']:not([aria-disabled='true'], [data-disabled]),
|
|
349
|
+
[role='slider']:not([aria-disabled='true'], [data-disabled]),
|
|
350
|
+
input[type='checkbox']:not(:disabled),
|
|
351
|
+
input[type='radio']:not(:disabled),
|
|
352
|
+
input[type='range']:not(:disabled),
|
|
353
|
+
a[href],
|
|
354
|
+
label[for],
|
|
355
|
+
summary {
|
|
356
|
+
@apply cursor-pointer;
|
|
357
|
+
}
|
|
358
|
+
|
|
359
|
+
button:disabled,
|
|
360
|
+
select:disabled,
|
|
361
|
+
input:disabled,
|
|
362
|
+
[aria-disabled='true'],
|
|
363
|
+
[data-disabled] {
|
|
364
|
+
@apply cursor-not-allowed;
|
|
365
|
+
}
|
|
366
|
+
|
|
367
|
+
/*
|
|
368
|
+
* Los primitivos de menú/select traen `cursor-default` como UTILIDAD, y las
|
|
369
|
+
* utilidades ganan a la capa base: aquí el pointer se IMPONE para los roles
|
|
370
|
+
* interactivos de esos popups.
|
|
371
|
+
*/
|
|
372
|
+
[role='menuitem']:not([aria-disabled='true'], [data-disabled]),
|
|
373
|
+
[role='menuitemcheckbox']:not([aria-disabled='true'], [data-disabled]),
|
|
374
|
+
[role='menuitemradio']:not([aria-disabled='true'], [data-disabled]),
|
|
375
|
+
[role='option']:not([aria-disabled='true'], [data-disabled]) {
|
|
376
|
+
cursor: pointer !important;
|
|
377
|
+
}
|
|
378
|
+
|
|
379
|
+
[aria-busy='true'] {
|
|
380
|
+
@apply cursor-progress;
|
|
381
|
+
}
|
|
382
|
+
|
|
383
|
+
/* Foco visible solo en navegación por teclado, nunca al hacer clic. */
|
|
384
|
+
:focus-visible {
|
|
385
|
+
@apply outline-ring outline-2 outline-offset-2;
|
|
386
|
+
}
|
|
387
|
+
|
|
388
|
+
/*
|
|
389
|
+
* MATERIALES de la capa de controles y navegación. Por `data-slot`, para que
|
|
390
|
+
* los hereden todos los componentes sin que ninguno escriba un efecto propio.
|
|
391
|
+
*/
|
|
392
|
+
[data-slot='popover-content'],
|
|
393
|
+
[data-slot='dropdown-menu-content'],
|
|
394
|
+
[data-slot='dropdown-menu-sub-content'],
|
|
395
|
+
[data-slot='select-content'],
|
|
396
|
+
[data-slot='dialog-content'],
|
|
397
|
+
[data-slot='sheet-content'],
|
|
398
|
+
[data-slot='tooltip-content'] {
|
|
399
|
+
-webkit-backdrop-filter: var(--ds-overlay-backdrop);
|
|
400
|
+
backdrop-filter: var(--ds-overlay-backdrop);
|
|
401
|
+
}
|
|
402
|
+
|
|
403
|
+
[data-slot='input'],
|
|
404
|
+
[data-slot='textarea'],
|
|
405
|
+
[data-slot='select-trigger'] {
|
|
406
|
+
-webkit-backdrop-filter: var(--ds-field-backdrop);
|
|
407
|
+
backdrop-filter: var(--ds-field-backdrop);
|
|
408
|
+
}
|
|
409
|
+
|
|
410
|
+
/*
|
|
411
|
+
* SIDEBAR. Anatomía por variables (ver arriba): `--ds-sidebar-*`. El borde de
|
|
412
|
+
* la barra pegada y el material de cristal van aquí; la silueta flotante
|
|
413
|
+
* (pad, radio, sombra, anillo) la aplica el propio componente.
|
|
414
|
+
*/
|
|
415
|
+
[data-slot='sidebar-inner'] {
|
|
416
|
+
border-right: var(--ds-sidebar-edge);
|
|
417
|
+
-webkit-backdrop-filter: var(--ds-sidebar-backdrop);
|
|
418
|
+
backdrop-filter: var(--ds-sidebar-backdrop);
|
|
419
|
+
}
|
|
420
|
+
|
|
421
|
+
/*
|
|
422
|
+
* TAMAÑO Y ALINEACIÓN DE LA NAVEGACIÓN (los `!important` baten a las
|
|
423
|
+
* utilidades que el primitivo trae escritas).
|
|
424
|
+
* EXPANDIDO: filas de altura `--ds-sidebar-item-h` con icono de 18px.
|
|
425
|
+
* COLAPSADO: botón de 40px y padding lateral de 12px → icono centrado en el
|
|
426
|
+
* raíl de 64px.
|
|
427
|
+
*/
|
|
428
|
+
[data-sidebar='menu-button'] {
|
|
429
|
+
min-height: var(--ds-sidebar-item-h);
|
|
430
|
+
}
|
|
431
|
+
[data-sidebar='menu-button'] svg {
|
|
432
|
+
width: 1.125rem !important;
|
|
433
|
+
height: 1.125rem !important;
|
|
434
|
+
}
|
|
435
|
+
|
|
436
|
+
[data-collapsible='icon'] [data-slot='sidebar-header'],
|
|
437
|
+
[data-collapsible='icon'] [data-slot='sidebar-footer'],
|
|
438
|
+
[data-collapsible='icon'] [data-slot='sidebar-group'] {
|
|
439
|
+
padding-inline: 0.75rem;
|
|
440
|
+
}
|
|
441
|
+
[data-collapsible='icon'] [data-sidebar='menu-button'] {
|
|
442
|
+
width: 2.5rem !important;
|
|
443
|
+
height: 2.5rem !important;
|
|
444
|
+
padding: 0.6875rem !important; /* (40−18)/2: icono centrado */
|
|
445
|
+
}
|
|
446
|
+
/* Botones lg (marca, cuenta): dentro va una ficha de 32px → 4px de aire. */
|
|
447
|
+
[data-collapsible='icon'] [data-sidebar='menu-button'][data-size='lg'] {
|
|
448
|
+
padding: 0.25rem !important;
|
|
449
|
+
}
|
|
450
|
+
|
|
451
|
+
/*
|
|
452
|
+
* `prefers-reduced-motion`: en un chrome que se pliega a diario, la animación
|
|
453
|
+
* de anchura es justo el movimiento que molesta a quien pide menos movimiento.
|
|
454
|
+
*/
|
|
455
|
+
@media (prefers-reduced-motion: reduce) {
|
|
456
|
+
*,
|
|
457
|
+
*::before,
|
|
458
|
+
*::after {
|
|
459
|
+
transition-duration: 0.01ms !important;
|
|
460
|
+
animation-duration: 0.01ms !important;
|
|
461
|
+
animation-iteration-count: 1 !important;
|
|
462
|
+
}
|
|
463
|
+
}
|
|
464
|
+
|
|
465
|
+
/*
|
|
466
|
+
* `prefers-reduced-transparency`: quien lo pide no debe recibir cristal. Se
|
|
467
|
+
* anulan los materiales (el soporte del navegador aún es limitado).
|
|
468
|
+
*/
|
|
469
|
+
@media (prefers-reduced-transparency: reduce) {
|
|
470
|
+
[data-slot='card'],
|
|
471
|
+
[data-slot='popover-content'],
|
|
472
|
+
[data-slot='dropdown-menu-content'],
|
|
473
|
+
[data-slot='dropdown-menu-sub-content'],
|
|
474
|
+
[data-slot='select-content'],
|
|
475
|
+
[data-slot='dialog-content'],
|
|
476
|
+
[data-slot='sheet-content'],
|
|
477
|
+
[data-slot='tooltip-content'],
|
|
478
|
+
[data-slot='input'],
|
|
479
|
+
[data-slot='textarea'],
|
|
480
|
+
[data-slot='select-trigger'],
|
|
481
|
+
[data-slot='sidebar-inner'] {
|
|
482
|
+
-webkit-backdrop-filter: none;
|
|
483
|
+
backdrop-filter: none;
|
|
484
|
+
}
|
|
485
|
+
}
|
|
486
|
+
}
|