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.
@@ -1,5 +1,3 @@
1
- @import url('https://fonts.googleapis.com/css2?family=Instrument+Sans:ital,wght@0,400..700;1,400..700&display=swap');
2
-
3
1
  /*
4
2
  * PALETA DEL TEMA — el ÚNICO fichero que se toca para cambiar los colores
5
3
  * de la app (el equivalente cromático de config/brand.ts). Claro (:root) y
@@ -13,6 +11,20 @@
13
11
  :root {
14
12
  --radius: 0.625rem;
15
13
 
14
+ /* Tipografía: Instrument Sans (fuentes en qratia.fonts.css) */
15
+ --ds-font-sans: 'Instrument Sans', system-ui, -apple-system, 'Segoe UI', Roboto, sans-serif;
16
+ --ds-font-mono: ui-monospace, 'SF Mono', Menlo, monospace;
17
+
18
+ /*
19
+ * Dos sombras de tarjeta: reposo y realce al señalar, EN CAPAS y TINTADAS con
20
+ * la tinta del tema (no negro): una capa tensa pegada a la pieza + una suave más
21
+ * lejana, para que la tarjeta se despegue del lienzo de forma natural.
22
+ */
23
+ --ds-shadow-card:
24
+ 0 1px 2px oklch(0.186 0.048 269 / 0.08), 0 3px 10px oklch(0.186 0.048 269 / 0.07);
25
+ --ds-shadow-card-hover:
26
+ 0 3px 6px oklch(0.186 0.048 269 / 0.1), 0 14px 32px oklch(0.186 0.048 269 / 0.14);
27
+
16
28
  /*
17
29
  * TRES NIVELES DE SUPERFICIE, y cada uno se distingue del de debajo por su
18
30
  * propio color — no por el borde. El lienzo NO es blanco puro: si lo fuera no
@@ -233,15 +245,3 @@
233
245
  * propia tinta. */
234
246
  --sidebar: oklch(0.135 0.032 268); /* centro oscuro: --sb-bg #060B1C */
235
247
  }
236
-
237
- /* Tipografía del tema. */
238
- @theme inline {
239
- /*
240
- * FAMILIA. Instrument Sans es la del ecosistema; el resto de la pila es el
241
- * respaldo del sistema para el instante previo a que la fuente cargue.
242
- */
243
- --font-sans: 'Instrument Sans', system-ui, -apple-system, 'Segoe UI', Roboto, sans-serif;
244
-
245
- /* Cifras: la mono para tiempos, identificadores y números comparables. */
246
- --font-mono: ui-monospace, 'SF Mono', Menlo, monospace;
247
- }
@@ -0,0 +1,2 @@
1
+ /* Fuentes del tema qratia: Instrument Sans. Importar el PRIMERO del CSS de la app. */
2
+ @import url('https://fonts.googleapis.com/css2?family=Instrument+Sans:ital,wght@0,400..700;1,400..700&display=swap');
@@ -0,0 +1,247 @@
1
+ /*
2
+ * PALETA DEL TEMA — el ÚNICO fichero que se toca para cambiar los colores
3
+ * de la app (el equivalente cromático de config/brand.ts). Claro (:root) y
4
+ * oscuro (.dark), en OKLCH. Validado por `pnpm check:contraste`: una paleta
5
+ * nueva que rompa contraste WCAG hace fallar el verify.
6
+ *
7
+ * Qué es cada token y cómo se usa: ver los comentarios de cada bloque y
8
+ * DESIGN.md. Las utilidades de Tailwind se derivan en styles.css (@theme).
9
+ */
10
+
11
+ :root[data-theme='qratia'] {
12
+ --radius: 0.625rem;
13
+
14
+ /* Tipografía: Instrument Sans (fuentes en qratia.fonts.css) */
15
+ --ds-font-sans: 'Instrument Sans', system-ui, -apple-system, 'Segoe UI', Roboto, sans-serif;
16
+ --ds-font-mono: ui-monospace, 'SF Mono', Menlo, monospace;
17
+
18
+ /*
19
+ * Dos sombras de tarjeta: reposo y realce al señalar, EN CAPAS y TINTADAS con
20
+ * la tinta del tema (no negro): una capa tensa pegada a la pieza + una suave más
21
+ * lejana, para que la tarjeta se despegue del lienzo de forma natural.
22
+ */
23
+ --ds-shadow-card:
24
+ 0 1px 2px oklch(0.186 0.048 269 / 0.08), 0 3px 10px oklch(0.186 0.048 269 / 0.07);
25
+ --ds-shadow-card-hover:
26
+ 0 3px 6px oklch(0.186 0.048 269 / 0.1), 0 14px 32px oklch(0.186 0.048 269 / 0.14);
27
+
28
+ /*
29
+ * TRES NIVELES DE SUPERFICIE, y cada uno se distingue del de debajo por su
30
+ * propio color — no por el borde. El lienzo NO es blanco puro: si lo fuera no
31
+ * habría sitio por encima para dos niveles elevados, porque el blanco es el
32
+ * techo. De ahí que el orden sea lienzo gris claro -> tarjeta -> panel
33
+ * flotante, y no al revés.
34
+ */
35
+ --background: oklch(0.967 0.011 244); /* centro: --bg #EEF5FB */
36
+ --foreground: oklch(
37
+ 0.186 0.048 269
38
+ ); /* centro: --text #0A1128, la tinta de marca */
39
+
40
+ --card: oklch(1 0 0); /* centro: --card #FFFFFF */
41
+ --card-foreground: oklch(0.186 0.048 269);
42
+
43
+ /*
44
+ * TERCER nivel, DENTRO de la tarjeta: citas, evidencias, el reproductor. Un
45
+ * paso más oscuro que `card` y uno más claro que `background` — el contenido
46
+ * anidado se distingue sin una línea nueva.
47
+ */
48
+ --inset: oklch(0.98 0.007 248); /* centro: --row #F5F9FD */
49
+ --inset-foreground: oklch(0.186 0.048 269);
50
+
51
+ /* Con la tarjeta en blanco puro —el techo— el panel flotante ya no puede
52
+ * elevarse más: se distingue hundiéndose un paso, no subiendo. */
53
+ --popover: oklch(0.982 0.008 246);
54
+ --popover-foreground: oklch(0.186 0.048 269);
55
+
56
+ /*
57
+ * IDENTIDAD. `primary` es la TINTA (#0A1128), no el cian: el color sólido de
58
+ * acción es la tinta de marca, y el cian actúa de acento sobre ella. Un botón
59
+ * cian sobre lienzo claro no alcanzaría el contraste de texto.
60
+ */
61
+ --primary: oklch(0.186 0.048 269); /* centro: --primary #0A1128 */
62
+ --primary-foreground: oklch(1 0 0);
63
+
64
+ --secondary: oklch(0.941 0.016 245); /* centro: --muted-bg #E3EDF6 */
65
+ --secondary-foreground: oklch(0.271 0.056 268);
66
+
67
+ --muted: oklch(0.941 0.016 245);
68
+ --muted-foreground: oklch(0.524 0.044 259); /* centro: --muted #5B6B84 */
69
+
70
+ /*
71
+ * El cian, como TINTE de superficie: estado activo, resalte, selección. Aquí no
72
+ * es texto, así que su luminosidad alta no es un problema — al contrario, es lo
73
+ * que lo hace legible como fondo.
74
+ */
75
+ --accent: oklch(0.941 0.03 220); /* cian rebajado a superficie */
76
+ --accent-foreground: oklch(0.441 0.088 230);
77
+
78
+ /*
79
+ * TEXTO acentuado y enlaces — DISTINTO del acento de superficie: el cian de
80
+ * marca (#00B4D8, L 0.711) NO alcanza 4.5:1 sobre blanco por mucho que se vea
81
+ * bien. Usar `--accent` en texto es el error que este par de tokens evita.
82
+ */
83
+ --link: oklch(0.534 0.107 231); /* centro: --link #00779F */
84
+ --link-hover: oklch(0.441 0.088 230); /* centro: --link-hover #005B7A */
85
+
86
+ /* Cian pleno de marca. Superficies, trazos y focos — NUNCA texto sobre claro. */
87
+ --brand: oklch(0.711 0.129 219); /* centro: --accent #00B4D8 */
88
+ --brand-bright: oklch(
89
+ 0.844 0.146 209
90
+ ); /* centro: --accent-bright #00E5FF */
91
+
92
+ --destructive: oklch(0.577 0.215 27); /* centro: --risk #DC2626 */
93
+ --destructive-foreground: oklch(1 0 0);
94
+
95
+ /*
96
+ * `border` separa superficies y `input` delimita un CONTROL. No es lo mismo:
97
+ * el límite de un campo de formulario es información y WCAG le exige 3:1.
98
+ */
99
+ --border: oklch(0.92 0.017 248); /* centro: --border #DCE6F0 */
100
+ --input: oklch(0.62 0.045 250);
101
+
102
+ /* El foco es un elemento de interfaz y WCAG le exige 3:1: el cian pleno no lo
103
+ * alcanza sobre el lienzo claro. Lleva por tanto el tono de enlace. */
104
+ --ring: oklch(0.534 0.107 231);
105
+
106
+ /*
107
+ * ESTADO del dominio de calidad. Cuatro niveles, cada uno con su color pleno
108
+ * —texto, trazo, icono— y su versión suave para fondo de etiqueta.
109
+ * `sin-dato` es un nivel propio a propósito: un indicador sin medir no es un
110
+ * cero, y el color tiene que decir lo mismo.
111
+ */
112
+ --danger: oklch(0.5 0.2 27);
113
+ --danger-soft: oklch(0.94 0.035 27);
114
+
115
+ --warning: oklch(0.52 0.12 65);
116
+ --warning-soft: oklch(0.94 0.05 75);
117
+
118
+ --success: oklch(0.5 0.13 152);
119
+ --success-soft: oklch(0.93 0.04 152);
120
+
121
+ --neutral: oklch(0.518 0.03 262);
122
+ --neutral-soft: oklch(0.935 0.014 246);
123
+
124
+ /* `info` NO valora: no dice si algo va bien o mal, dice de dónde sale. Lleva
125
+ * el azul de la familia del enlace, distinto de los tres tonos que sí juzgan
126
+ * (rojo, ámbar, verde) y del gris de «sin dato». */
127
+ --info: oklch(0.49 0.105 231);
128
+ --info-soft: oklch(0.94 0.03 231);
129
+
130
+ /*
131
+ * Series de gráficas — paleta VALIDADA (daltonismo, croma, separación), no
132
+ * elegida por gusto. El ORDEN es estable: la ranura 1 es siempre la misma
133
+ * serie; un filtro que cambie cuántas series hay no repinta las que quedan.
134
+ */
135
+ --chart-1: #2a78d6; /* azul */
136
+ --chart-2: #eb6834; /* naranja */
137
+ --chart-3: #1baf7a; /* verde agua */
138
+ --chart-4: #eda100; /* amarillo */
139
+ --chart-5: #e87ba4; /* magenta */
140
+
141
+ /*
142
+ * SUPERFICIE DE MARCA — la tinta, y la MISMA en los dos modos. Es la pieza
143
+ * que identifica al producto: quien llega desde el centro reconoce el mismo
144
+ * chrome. Por eso NO se redefine en `.dark`.
145
+ */
146
+ --sidebar: oklch(0.186 0.048 269); /* centro: --sb-bg #0A1128 */
147
+ --sidebar-foreground: oklch(0.919 0.022 246); /* centro: --sb-fg #D9E6F2 */
148
+ /* Destino activo: el propio cian de marca al 12% sobre el fondo de la barra —
149
+ * un sólido inventado pesa de más y deja de leerse como tinte. */
150
+ --sidebar-accent: color-mix(
151
+ in oklch,
152
+ var(--brand-bright) 12%,
153
+ var(--sidebar)
154
+ );
155
+ --sidebar-accent-foreground: oklch(
156
+ 0.89 0.092 213
157
+ ); /* centro: --sb-active-fg #8FEBFF */
158
+ --sidebar-primary: oklch(0.844 0.146 209);
159
+ --sidebar-primary-foreground: oklch(0.186 0.048 269);
160
+ --sidebar-border: oklch(0.919 0.022 246 / 12%); /* centro: --sb-border */
161
+ --sidebar-ring: oklch(0.711 0.129 219);
162
+ }
163
+
164
+ :root[data-theme='qratia'].dark {
165
+ /*
166
+ * Gris elevado, no negro. Un fondo casi negro con texto claro produce halación
167
+ * y en jornadas de revisión eso cansa. Conserva los tres niveles de superficie.
168
+ */
169
+ --background: oklch(
170
+ 0.186 0.048 269
171
+ ); /* centro oscuro: --bg = la tinta #0A1128 */
172
+ --foreground: oklch(0.952 0.013 252); /* centro: --text #E9F0F8 */
173
+
174
+ --card: oklch(0.229 0.054 267); /* centro: --card #111B36 */
175
+ --card-foreground: oklch(0.952 0.013 252);
176
+
177
+ /* Mismo tono, paso propio de la superficie oscura: un escalón MÁS OSCURO que
178
+ * `card`, porque aquí elevar es aclarar y el incrustado va hundido. */
179
+ --inset: oklch(0.205 0.05 268);
180
+ --inset-foreground: oklch(0.952 0.013 252);
181
+
182
+ --popover: oklch(0.262 0.052 267);
183
+ --popover-foreground: oklch(0.952 0.013 252);
184
+
185
+ /*
186
+ * En oscuro se INVIERTE el reparto: aquí la acción sólida es el CIAN sobre
187
+ * tinta, porque la tinta ya es el lienzo y un botón del color del fondo no
188
+ * sería un botón. Es la misma identidad leída al revés.
189
+ */
190
+ --primary: oklch(0.844 0.146 209); /* centro oscuro: --primary #00E5FF */
191
+ --primary-foreground: oklch(0.186 0.048 269);
192
+
193
+ --secondary: oklch(0.275 0.048 267);
194
+ --secondary-foreground: oklch(0.952 0.013 252);
195
+
196
+ --muted: oklch(0.262 0.048 267);
197
+ --muted-foreground: oklch(0.711 0.041 259); /* centro: --muted #93A3BC */
198
+
199
+ --accent: oklch(0.3 0.055 240);
200
+ --accent-foreground: oklch(0.89 0.092 213);
201
+
202
+ /* Sobre fondo oscuro el cian SÍ se lee: aquí enlace y acento convergen. */
203
+ --link: oklch(0.89 0.092 213); /* centro: --link #66EDFF */
204
+ --link-hover: oklch(0.93 0.07 210); /* centro: --link-hover #9BF3FF */
205
+
206
+ --brand: oklch(0.844 0.146 209);
207
+ --brand-bright: oklch(0.844 0.146 209);
208
+
209
+ /* Sobre un rojo claro, el texto legible es el oscuro (medido: el claro daba 2.77:1). */
210
+ --destructive: oklch(0.711 0.166 22); /* centro: --risk #F87171 */
211
+ --destructive-foreground: oklch(0.16 0.02 27);
212
+
213
+ /* Bordes con color sólido y no con alfa sobre el fondo: el alfa hace que el
214
+ * mismo token se vea distinto según la superficie de debajo. */
215
+ --border: oklch(0.32 0.045 266);
216
+ --input: oklch(0.5 0.05 262);
217
+ --ring: oklch(0.844 0.146 209);
218
+
219
+ --danger: oklch(0.7 0.17 27);
220
+ --danger-soft: oklch(0.28 0.07 27);
221
+
222
+ --warning: oklch(0.78 0.13 75);
223
+ --warning-soft: oklch(0.3 0.06 75);
224
+
225
+ --success: oklch(0.74 0.14 155);
226
+ --success-soft: oklch(0.28 0.06 155);
227
+
228
+ --neutral: oklch(0.7 0.03 260);
229
+ --neutral-soft: oklch(0.265 0.035 266);
230
+
231
+ --info: oklch(0.82 0.1 220);
232
+ --info-soft: oklch(0.28 0.055 230);
233
+
234
+ /* Los MISMOS tonos, con el paso que corresponde a la superficie oscura — no
235
+ * una inversión automática del modo claro. Validado aparte: pasa todas las
236
+ * comprobaciones, contraste incluido. */
237
+ --chart-1: #3987e5; /* azul */
238
+ --chart-2: #d95926; /* naranja */
239
+ --chart-3: #199e70; /* verde agua */
240
+ --chart-4: #c98500; /* amarillo */
241
+ --chart-5: #d55181; /* magenta */
242
+
243
+ /* La barra NO se redefine aquí (superficie de MARCA, la misma en los dos
244
+ * modos). Solo se hunde un paso respecto al lienzo, que en oscuro ya es la
245
+ * propia tinta. */
246
+ --sidebar: oklch(0.135 0.032 268); /* centro oscuro: --sb-bg #060B1C */
247
+ }
@@ -1,57 +1,34 @@
1
1
  /*
2
- * TEMA zyro — «liquid glass» (traducido de faro-orbital-zyro-ui/global.css).
2
+ * TEMA zyro — «liquid glass» (traducido de faro-orbital-zyro-ui).
3
3
  *
4
- * Identidad: lienzo lavanda claro / azul muy oscuro, acento azul profundo
5
- * (claro) y cian (oscuro), cristal traslúcido con desenfoque y saturación, y
6
- * un fondo vivo. Cumple el MISMO contrato de tema que `qratia` (ver
7
- * `contract.json`): todo lo que cambia respecto a qratia es aspecto, no API.
4
+ * Personalidad: lavanda claro / azul muy oscuro, acento azul profundo (claro) y
5
+ * cian (oscuro). El cristal vive en la capa de NAVEGACIÓN y CONTROLES (sidebar,
6
+ * campos, menús); el CONTENIDO (tarjetas) se mantiene casi opaco, como indican
7
+ * las guías de cristal. Sidebar a ras de borde, sin silueta flotante. Acción
8
+ * primaria = píldora con degradado de marca y brillo.
8
9
  *
9
- * Importar DESPUÉS de la estructura (`orbital-ds/styles.css`), para que este
10
- * tema pueda sobrescribir también la escala de radios y las sombras:
10
+ * Estructura del fichero:
11
+ * 1. Variables claras (:root) y oscuras (.dark) — el CONTRATO del tema.
12
+ * 2. Capa de PERSONALIDAD — reglas sobre los ganchos del DOM (`data-slot`,
13
+ * `data-variant`…) escritas solo con variables. Va SIN capa para ganar a las
14
+ * utilidades de los componentes, así que define también los estados
15
+ * (hover, active). Es lo que da forma propia a los elementos.
11
16
  *
12
- * @import 'orbital-ds/styles.css';
13
- * @import 'orbital-ds/themes/zyro.css';
14
- *
15
- * Valores derivados (no vienen tal cual de zyro-ui): danger, danger-soft,
16
- * neutral(-soft), link-hover, brand-bright y inset, que zyro no define con
17
- * esos nombres; y el texto sobre el primario en oscuro, que se oscurece para
18
- * alcanzar contraste AA.
19
- *
20
- * Tipografía: Montserrat (titulares) + Roboto (cuerpo). Cárgalas en la app
21
- * (<link> a Google Fonts o self-host).
17
+ * Variables `--zy-*`: privadas de este tema (no son contrato).
18
+ * Importar DESPUÉS de la estructura. Fuentes: `zyro.fonts.css`, lo primero del CSS.
22
19
  */
23
20
 
24
- @theme inline {
25
- /* Tipografía */
26
- --font-sans: 'Roboto', system-ui, -apple-system, sans-serif;
27
- --font-display: 'Montserrat', system-ui, -apple-system, sans-serif;
28
- --font-mono: ui-monospace, 'SF Mono', Menlo, monospace;
29
-
30
- /* Escala de radios Zyro: el radio crece con el tamaño del contenedor. */
31
- --radius-sm: 7px;
32
- --radius-md: 10px;
33
- --radius-lg: 14px;
34
- --radius-xl: 18px;
35
- --radius-2xl: 22px;
36
- --radius-control: 10px;
37
- --radius-overlay: 22px;
38
-
39
- /* Sombras de cristal: capa tensa + difusa y brillo interior en el borde. */
40
- --shadow-card: 0 2px 14px rgba(28, 48, 100, 0.07);
41
- --shadow-card-hover:
42
- 0 4px 30px rgba(28, 48, 100, 0.08), inset 0 1px 0 rgba(255, 255, 255, 0.85);
43
- --shadow-raised:
44
- 0 4px 30px rgba(28, 48, 100, 0.08), inset 0 1px 0 rgba(255, 255, 255, 0.85);
45
- --shadow-overlay:
46
- 0 14px 52px rgba(28, 48, 100, 0.12), inset 0 1px 0 rgba(255, 255, 255, 0.95);
47
- --shadow-popover:
48
- 0 14px 52px rgba(28, 48, 100, 0.12), inset 0 1px 0 rgba(255, 255, 255, 0.95);
49
- }
50
-
51
- /* ── PIEL CLARA ─────────────────────────────────────────────────────────── */
21
+ /* ── 1. VARIABLES · PIEL CLARA ───────────────────────────────────────────── */
52
22
  :root {
53
23
  --radius: 18px;
54
24
 
25
+ /* Tipografía: Montserrat (titulares) + Roboto (cuerpo) */
26
+ --ds-font-sans: 'Roboto', system-ui, -apple-system, sans-serif;
27
+ --ds-font-display: 'Montserrat', system-ui, -apple-system, sans-serif;
28
+ --ds-font-mono: ui-monospace, 'SF Mono', Menlo, monospace;
29
+ --ds-heading-tracking: -0.01em;
30
+
31
+ /* Color */
55
32
  --background: #eaeefb;
56
33
  --foreground: rgba(14, 22, 48, 0.92);
57
34
 
@@ -81,16 +58,15 @@
81
58
  --chart-4: #eb1919;
82
59
  --chart-5: #9747ff;
83
60
 
84
- --sidebar: rgba(255, 255, 255, 0.4);
85
- --sidebar-foreground: rgba(14, 22, 48, 0.66);
61
+ --sidebar: rgba(255, 255, 255, 0.58);
62
+ --sidebar-foreground: rgba(14, 22, 48, 0.78);
86
63
  --sidebar-primary: #0349fe;
87
64
  --sidebar-primary-foreground: #ffffff;
88
65
  --sidebar-accent: rgba(3, 73, 254, 0.09);
89
66
  --sidebar-accent-foreground: #0349fe;
90
- --sidebar-border: rgba(168, 190, 235, 0.3);
67
+ --sidebar-border: rgba(168, 190, 235, 0.35);
91
68
  --sidebar-ring: #0349fe;
92
69
 
93
- /* Estados (variante oscura para texto sobre claro) */
94
70
  --danger: #c21414;
95
71
  --danger-soft: rgba(235, 25, 25, 0.1);
96
72
  --warning: #9a6e00;
@@ -109,19 +85,68 @@
109
85
  --brand: #0349fe;
110
86
  --brand-bright: #36b3ed;
111
87
 
112
- /* Materiales: cristal. El fondo vivo (malla WebGL en zyro-ui) se aproxima
113
- aquí con degradados; el componente de malla es opcional. */
88
+ /* Formas: la esquina crece con el tamaño del contenedor (7·10·14·18·22) */
89
+ --ds-radius-sm: 7px;
90
+ --ds-radius-md: 10px;
91
+ --ds-radius-lg: 14px;
92
+ --ds-radius-xl: 18px;
93
+ --ds-radius-2xl: 22px;
94
+ --ds-radius-control: 10px;
95
+ --ds-radius-overlay: 22px;
96
+
97
+ /* Sombras de cristal: capa tenue + brillo interior en el borde superior */
98
+ --ds-shadow-card: 0 2px 14px rgba(28, 48, 100, 0.07);
99
+ --ds-shadow-card-hover: 0 6px 26px rgba(28, 48, 100, 0.1);
100
+ --ds-shadow-raised: 0 4px 30px rgba(28, 48, 100, 0.08), inset 0 1px 0 rgba(255, 255, 255, 0.85);
101
+ --ds-shadow-overlay: 0 14px 52px rgba(28, 48, 100, 0.12), inset 0 1px 0 rgba(255, 255, 255, 0.95);
102
+ --ds-shadow-popover: 0 14px 52px rgba(28, 48, 100, 0.12), inset 0 1px 0 rgba(255, 255, 255, 0.95);
103
+
104
+ /* Medidas: controles algo más altos y holgados */
105
+ --ds-control-h-sm: 2.25rem;
106
+ --ds-control-h-md: 2.5rem;
107
+ --ds-control-h-lg: 2.75rem;
108
+ --ds-button-px-sm: 1rem;
109
+ --ds-button-px-md: 1.25rem;
110
+ --ds-button-px-lg: 1.5rem;
111
+ --ds-field-px: 1rem;
112
+
113
+ /* Materiales: cristal en navegación y controles; tarjetas sin desenfoque */
114
114
  --ds-sidebar-backdrop: blur(28px) saturate(180%);
115
115
  --ds-overlay-backdrop: blur(28px) saturate(180%);
116
116
  --ds-field-backdrop: blur(12px) saturate(160%);
117
117
  --ds-card-backdrop: none;
118
118
  --ds-page-backdrop:
119
- radial-gradient(60% 50% at 12% 8%, rgba(54, 179, 237, 0.4), transparent 70%),
120
- radial-gradient(55% 45% at 88% 18%, rgba(3, 73, 254, 0.24), transparent 70%),
121
- radial-gradient(50% 55% at 55% 100%, rgba(151, 71, 255, 0.2), transparent 70%);
119
+ radial-gradient(55% 45% at 78% 6%, rgba(54, 179, 237, 0.3), transparent 70%),
120
+ radial-gradient(50% 45% at 96% 58%, rgba(3, 73, 254, 0.16), transparent 70%),
121
+ radial-gradient(55% 50% at 40% 106%, rgba(151, 71, 255, 0.14), transparent 70%);
122
+
123
+ /* Sidebar a ras de borde: sin separación, sin silueta; filo de 1px */
124
+ --ds-sidebar-pad: 0px;
125
+ --ds-sidebar-radius: 0px;
126
+ --ds-sidebar-shadow: 0 0 #0000;
127
+ --ds-sidebar-ring: 0px;
128
+ --ds-sidebar-edge: 1px solid var(--zy-glass-bs);
129
+ --ds-sidebar-item-radius: var(--ds-radius-lg);
130
+
131
+ /* Privadas de zyro */
132
+ --zy-accent-g: linear-gradient(135deg, #0349fe, #36b3ed);
133
+ --zy-accent-glow: rgba(3, 73, 254, 0.24);
134
+ --zy-glass-bt: rgba(255, 255, 255, 0.95);
135
+ --zy-glass-bs: rgba(168, 190, 235, 0.4);
136
+ --zy-card-bt: rgba(255, 255, 255, 1);
137
+ --zy-card-bs: rgba(168, 190, 235, 0.46);
138
+ --zy-field-bg: rgba(255, 255, 255, 0.72);
139
+ --zy-field-b: rgba(168, 190, 235, 0.55);
140
+ --zy-field-bt: rgba(255, 255, 255, 1);
141
+ --zy-pill: rgba(255, 255, 255, 0.55);
142
+ --zy-pill-on: rgba(255, 255, 255, 0.98);
143
+ --zy-conv-h: rgba(20, 40, 90, 0.04);
144
+ --zy-conv-a: rgba(3, 73, 254, 0.07);
145
+ --zy-conv-ab: rgba(3, 73, 254, 0.24);
146
+ --zy-ease: cubic-bezier(0.2, 0.7, 0.2, 1);
122
147
  }
123
148
 
124
- /* ── PIEL OSCURA ────────────────────────────────────────────────────────── */
149
+ /* ── 1b. VARIABLES · PIEL OSCURA ─────────────────────────────────────────── */
125
150
  .dark {
126
151
  --background: #0e3148;
127
152
  --foreground: rgba(255, 255, 255, 0.94);
@@ -153,7 +178,7 @@
153
178
  --chart-5: #9747ff;
154
179
 
155
180
  --sidebar: rgba(255, 255, 255, 0.04);
156
- --sidebar-foreground: rgba(255, 255, 255, 0.68);
181
+ --sidebar-foreground: rgba(255, 255, 255, 0.72);
157
182
  --sidebar-primary: #36b3ed;
158
183
  --sidebar-primary-foreground: #04121c;
159
184
  --sidebar-accent: rgba(54, 179, 237, 0.16);
@@ -179,11 +204,140 @@
179
204
  --brand: #36b3ed;
180
205
  --brand-bright: #7fd0f5;
181
206
 
207
+ --ds-shadow-card: 0 2px 14px rgba(0, 0, 0, 0.3);
208
+ --ds-shadow-card-hover: 0 6px 26px rgba(0, 0, 0, 0.38);
209
+ --ds-shadow-raised: 0 8px 40px rgba(0, 0, 0, 0.28), inset 0 1px 0 rgba(255, 255, 255, 0.1);
210
+ --ds-shadow-overlay: 0 22px 64px rgba(0, 0, 0, 0.36), inset 0 1px 0 rgba(255, 255, 255, 0.13);
211
+ --ds-shadow-popover: 0 22px 64px rgba(0, 0, 0, 0.36), inset 0 1px 0 rgba(255, 255, 255, 0.13);
212
+
182
213
  --ds-sidebar-backdrop: blur(24px) saturate(180%);
183
214
  --ds-overlay-backdrop: blur(24px) saturate(180%);
184
- --ds-field-backdrop: blur(12px) saturate(160%);
185
215
  --ds-page-backdrop:
186
- radial-gradient(60% 50% at 12% 8%, rgba(54, 179, 237, 0.3), transparent 70%),
187
- radial-gradient(55% 45% at 88% 18%, rgba(3, 73, 254, 0.28), transparent 70%),
188
- radial-gradient(50% 55% at 55% 100%, rgba(151, 71, 255, 0.22), transparent 70%);
216
+ radial-gradient(55% 45% at 78% 6%, rgba(54, 179, 237, 0.26), transparent 70%),
217
+ radial-gradient(50% 45% at 96% 58%, rgba(3, 73, 254, 0.24), transparent 70%),
218
+ radial-gradient(55% 50% at 40% 106%, rgba(151, 71, 255, 0.2), transparent 70%);
219
+
220
+ --zy-accent-g: linear-gradient(135deg, #36b3ed, #0349fe);
221
+ --zy-accent-glow: rgba(54, 179, 237, 0.42);
222
+ --zy-glass-bt: rgba(255, 255, 255, 0.3);
223
+ --zy-glass-bs: rgba(255, 255, 255, 0.07);
224
+ --zy-card-bt: rgba(255, 255, 255, 0.11);
225
+ --zy-card-bs: rgba(255, 255, 255, 0.06);
226
+ --zy-field-bg: rgba(255, 255, 255, 0.06);
227
+ --zy-field-b: rgba(255, 255, 255, 0.12);
228
+ --zy-field-bt: rgba(255, 255, 255, 0.26);
229
+ --zy-pill: rgba(255, 255, 255, 0.05);
230
+ --zy-pill-on: rgba(255, 255, 255, 0.12);
231
+ --zy-conv-h: rgba(255, 255, 255, 0.05);
232
+ --zy-conv-a: rgba(54, 179, 237, 0.14);
233
+ --zy-conv-ab: rgba(54, 179, 237, 0.4);
234
+ }
235
+
236
+ /* ── 2. PERSONALIDAD ─────────────────────────────────────────────────────────
237
+ * Sin capa: gana a las utilidades de los componentes. Solo variables.
238
+ */
239
+ :root {
240
+ /* Botones: píldora. Acción primaria con degradado de marca y brillo. */
241
+ [data-slot='button'] {
242
+ border-radius: 9999px;
243
+ transition: all var(--ds-motion-base) var(--zy-ease);
244
+ }
245
+ [data-slot='button'][data-size^='icon'] {
246
+ border-radius: var(--ds-radius-xl);
247
+ }
248
+ [data-slot='button']:active:not(:disabled) {
249
+ transform: scale(0.98);
250
+ }
251
+ [data-slot='button'][data-variant='default'] {
252
+ background-color: transparent;
253
+ background-image: var(--zy-accent-g);
254
+ color: #ffffff;
255
+ border-color: transparent;
256
+ box-shadow: 0 4px 16px var(--zy-accent-glow);
257
+ }
258
+ [data-slot='button'][data-variant='default']:hover:not(:disabled) {
259
+ filter: brightness(1.1);
260
+ box-shadow: 0 6px 22px var(--zy-accent-glow);
261
+ }
262
+ [data-slot='button'][data-variant='destructive'] {
263
+ box-shadow: 0 4px 16px rgba(235, 25, 25, 0.3);
264
+ }
265
+ [data-slot='button'][data-variant='outline'],
266
+ [data-slot='button'][data-variant='secondary'] {
267
+ border: 1px solid var(--zy-field-b);
268
+ background: color-mix(in oklch, var(--foreground) 5%, var(--background));
269
+ color: var(--muted-foreground);
270
+ }
271
+ [data-slot='button'][data-variant='outline']:hover:not(:disabled),
272
+ [data-slot='button'][data-variant='secondary']:hover:not(:disabled) {
273
+ background: color-mix(in oklch, var(--foreground) 11%, var(--background));
274
+ color: var(--foreground);
275
+ }
276
+ [data-slot='button'][data-variant='ghost']:hover:not(:disabled) {
277
+ background: var(--zy-conv-h);
278
+ color: var(--foreground);
279
+ }
280
+
281
+ /* Tarjetas: contenido casi opaco con filo superior luminoso */
282
+ [data-slot='card'] {
283
+ border: 1px solid var(--zy-card-bs);
284
+ border-top-color: var(--zy-card-bt);
285
+ }
286
+
287
+ /* Campos: cristal claro con filo superior */
288
+ [data-slot='input'],
289
+ [data-slot='textarea'],
290
+ [data-slot='select-trigger'] {
291
+ background-color: var(--zy-field-bg);
292
+ border-color: var(--zy-field-b);
293
+ border-top-color: var(--zy-field-bt);
294
+ }
295
+
296
+ /* Capas flotantes: filo de cristal */
297
+ [data-slot='dialog-content'],
298
+ [data-slot='popover-content'],
299
+ [data-slot='dropdown-menu-content'],
300
+ [data-slot='select-content'] {
301
+ border: 1px solid var(--zy-glass-bs);
302
+ border-top-color: var(--zy-glass-bt);
303
+ }
304
+
305
+ /* Etiquetas en píldora */
306
+ [data-slot='badge'] {
307
+ border-radius: 9999px;
308
+ }
309
+
310
+ /* Pestañas: píldora de cristal con la activa elevada */
311
+ [data-slot='tabs-list'] {
312
+ background: var(--zy-pill);
313
+ border: 1px solid var(--zy-card-bs);
314
+ border-radius: 9999px;
315
+ }
316
+ [data-slot='tabs-trigger'] {
317
+ border-radius: 9999px;
318
+ }
319
+ [data-slot='tabs-trigger'][data-active] {
320
+ background: var(--zy-pill-on);
321
+ box-shadow: 0 1px 6px rgba(28, 48, 100, 0.12);
322
+ }
323
+
324
+ /* Interruptor y progreso: degradado de marca */
325
+ [data-slot='switch'][data-checked] {
326
+ background-image: var(--zy-accent-g);
327
+ background-color: transparent;
328
+ }
329
+ [data-slot='progress-indicator'] {
330
+ background-image: var(--zy-accent-g);
331
+ background-color: transparent;
332
+ }
333
+
334
+ /* Sidebar: destino activo con tinte y filo, como la conversación activa de zyro */
335
+ [data-sidebar='menu-button'][data-active='true'] {
336
+ background: var(--zy-conv-a);
337
+ box-shadow: inset 0 0 0 1px var(--zy-conv-ab);
338
+ color: var(--sidebar-accent-foreground);
339
+ }
340
+ [data-sidebar='menu-button']:hover:not([data-active='true']) {
341
+ background: var(--zy-conv-h);
342
+ }
189
343
  }
@@ -0,0 +1,2 @@
1
+ /* Fuentes del tema zyro: Montserrat (titulares) + Roboto (cuerpo). Importar el PRIMERO del CSS de la app. */
2
+ @import url('https://fonts.googleapis.com/css2?family=Montserrat:wght@500;600;700;800&family=Roboto:wght@300;400;500;600;700&display=swap');