orbital-ds 0.2.0 → 0.4.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
+ }
@@ -0,0 +1,290 @@
1
+ /*
2
+ * TEMA twitter — la interfaz de Twitter anterior a X (rediseño de 2021).
3
+ *
4
+ * Personalidad: PLANO y de alto contraste. Sin sombras ni cristal en el contenido;
5
+ * separación por filetes de 1px; botones en píldora con peso 700; tarjetas de 16px
6
+ * sin elevación; sidebar a ras de borde, sin fondo, con filas en píldora y la activa
7
+ * en negrita; pestañas con subrayado de acento. Azul de marca #1D9BF0 (confirmado) con
8
+ * «menos azul»: la acción más importante puede ir en tinta (negro/blanco).
9
+ *
10
+ * VALORES APROXIMADOS: el azul de marca y la fuente (Chirp, propietaria) están
11
+ * documentados; los grises, bordes y los fondos de «Dim» son de memoria y NO se han
12
+ * contrastado con la hoja de estilos real — ajústalos con una captura de referencia.
13
+ * Chirp no se puede distribuir: se usa la pila del sistema como respaldo.
14
+ *
15
+ * Importar DESPUÉS de la estructura. Variables `--zt-*`: privadas de este tema.
16
+ */
17
+
18
+ /* ── VARIABLES · PIEL CLARA ──────────────────────────────────────────────── */
19
+ :root {
20
+ --radius: 16px;
21
+
22
+ --ds-font-sans: 'Chirp', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif;
23
+ --ds-font-display: var(--ds-font-sans);
24
+ --ds-font-mono: ui-monospace, 'SF Mono', Menlo, monospace;
25
+ --ds-heading-tracking: normal;
26
+
27
+ /* Color */
28
+ --background: #ffffff;
29
+ --foreground: #0f1419;
30
+
31
+ --card: #ffffff;
32
+ --card-foreground: #0f1419;
33
+ --popover: #ffffff;
34
+ --popover-foreground: #0f1419;
35
+
36
+ --primary: #1d9bf0;
37
+ --primary-foreground: #ffffff;
38
+ --secondary: #eff3f4;
39
+ --secondary-foreground: #0f1419;
40
+ --muted: #f7f9f9;
41
+ --muted-foreground: #536471;
42
+ --accent: rgba(29, 155, 240, 0.1);
43
+ --accent-foreground: #1a8cd8;
44
+ --destructive: #f4212e;
45
+ --destructive-foreground: #ffffff;
46
+
47
+ --border: #eff3f4;
48
+ --input: #cfd9de;
49
+ --ring: #1d9bf0;
50
+
51
+ --chart-1: #1d9bf0;
52
+ --chart-2: #00ba7c;
53
+ --chart-3: #ffd400;
54
+ --chart-4: #f91880;
55
+ --chart-5: #7856ff;
56
+
57
+ --sidebar: transparent;
58
+ --sidebar-foreground: #0f1419;
59
+ --sidebar-primary: #1d9bf0;
60
+ --sidebar-primary-foreground: #ffffff;
61
+ --sidebar-accent: rgba(15, 20, 25, 0.1);
62
+ --sidebar-accent-foreground: #0f1419;
63
+ --sidebar-border: #eff3f4;
64
+ --sidebar-ring: #1d9bf0;
65
+
66
+ --danger: #d4141f;
67
+ --danger-soft: rgba(244, 33, 46, 0.1);
68
+ --warning: #8a6d00;
69
+ --warning-soft: rgba(255, 212, 0, 0.2);
70
+ --success: #00875a;
71
+ --success-soft: rgba(0, 186, 124, 0.12);
72
+ --info: #1a8cd8;
73
+ --info-soft: rgba(29, 155, 240, 0.1);
74
+ --neutral: #536471;
75
+ --neutral-soft: #eff3f4;
76
+
77
+ --link: #1d9bf0;
78
+ --link-hover: #1a8cd8;
79
+ --inset: #f7f9f9;
80
+ --inset-foreground: #0f1419;
81
+ --brand: #1d9bf0;
82
+ --brand-bright: #1d9bf0;
83
+
84
+ /* Formas: píldoras para acciones, 16px para superficies */
85
+ --ds-radius-sm: 8px;
86
+ --ds-radius-md: 12px;
87
+ --ds-radius-lg: 16px;
88
+ --ds-radius-xl: 16px;
89
+ --ds-radius-2xl: 20px;
90
+ --ds-radius-control: 9999px;
91
+ --ds-radius-overlay: 16px;
92
+
93
+ /* Sin elevación: solo los menús flotantes llevan sombra, muy suave */
94
+ --ds-shadow-card: 0 0 #0000;
95
+ --ds-shadow-card-hover: 0 0 #0000;
96
+ --ds-shadow-control: 0 0 #0000;
97
+ --ds-shadow-raised: 0 0 #0000;
98
+ --ds-shadow-overlay: 0 0 15px rgba(101, 119, 134, 0.2), 0 0 3px 1px rgba(101, 119, 134, 0.15);
99
+ --ds-shadow-popover: 0 0 15px rgba(101, 119, 134, 0.2), 0 0 3px 1px rgba(101, 119, 134, 0.15);
100
+
101
+ /* Medidas */
102
+ --ds-control-h-sm: 2rem;
103
+ --ds-control-h-md: 2.25rem;
104
+ --ds-control-h-lg: 3.25rem;
105
+ --ds-button-px-sm: 1rem;
106
+ --ds-button-px-md: 1.25rem;
107
+ --ds-button-px-lg: 2rem;
108
+ --ds-field-px: 1rem;
109
+ --ds-card-spacing: 1rem;
110
+ --ds-card-spacing-sm: 0.75rem;
111
+
112
+ /* Materiales: ninguno (plano) */
113
+ --ds-card-backdrop: none;
114
+ --ds-overlay-backdrop: none;
115
+ --ds-field-backdrop: none;
116
+ --ds-sidebar-backdrop: none;
117
+ --ds-page-backdrop: none;
118
+
119
+ /* Sidebar a ras de borde, sin silueta; filas en píldora grandes */
120
+ --ds-sidebar-pad: 0px;
121
+ --ds-sidebar-radius: 0px;
122
+ --ds-sidebar-shadow: 0 0 #0000;
123
+ --ds-sidebar-ring: 0px;
124
+ --ds-sidebar-edge: 1px solid var(--sidebar-border);
125
+ --ds-sidebar-item-radius: 9999px;
126
+ --ds-sidebar-item-h: 3.25rem;
127
+
128
+ /* Privadas de twitter */
129
+ --zt-hover: rgba(15, 20, 25, 0.1);
130
+ --zt-hover-soft: rgba(15, 20, 25, 0.03);
131
+ --zt-line-strong: #cfd9de;
132
+ --zt-ink: #0f1419;
133
+ --zt-ink-foreground: #ffffff;
134
+ }
135
+
136
+ /* ── VARIABLES · PIEL OSCURA («Dim») ─────────────────────────────────────── */
137
+ .dark {
138
+ --background: #15202b;
139
+ --foreground: #f7f9f9;
140
+
141
+ --card: #15202b;
142
+ --card-foreground: #f7f9f9;
143
+ --popover: #1e2732;
144
+ --popover-foreground: #f7f9f9;
145
+
146
+ --primary: #1d9bf0;
147
+ --primary-foreground: #ffffff;
148
+ --secondary: #1e2732;
149
+ --secondary-foreground: #f7f9f9;
150
+ --muted: #1e2732;
151
+ --muted-foreground: #8b98a5;
152
+ --accent: rgba(29, 155, 240, 0.15);
153
+ --accent-foreground: #4db3f5;
154
+ --destructive: #f4212e;
155
+ --destructive-foreground: #ffffff;
156
+
157
+ --border: #38444d;
158
+ --input: #536471;
159
+ --ring: #1d9bf0;
160
+
161
+ --sidebar: transparent;
162
+ --sidebar-foreground: #f7f9f9;
163
+ --sidebar-primary: #1d9bf0;
164
+ --sidebar-primary-foreground: #ffffff;
165
+ --sidebar-accent: rgba(247, 249, 249, 0.1);
166
+ --sidebar-accent-foreground: #f7f9f9;
167
+ --sidebar-border: #38444d;
168
+ --sidebar-ring: #1d9bf0;
169
+
170
+ --danger: #ff5a64;
171
+ --danger-soft: rgba(244, 33, 46, 0.18);
172
+ --warning: #ffd400;
173
+ --warning-soft: rgba(255, 212, 0, 0.16);
174
+ --success: #00ba7c;
175
+ --success-soft: rgba(0, 186, 124, 0.16);
176
+ --info: #4db3f5;
177
+ --info-soft: rgba(29, 155, 240, 0.18);
178
+ --neutral: #8b98a5;
179
+ --neutral-soft: #1e2732;
180
+
181
+ --link: #4db3f5;
182
+ --link-hover: #8dcdf8;
183
+ --inset: #1e2732;
184
+ --inset-foreground: #f7f9f9;
185
+ --brand: #1d9bf0;
186
+ --brand-bright: #4db3f5;
187
+
188
+ --ds-shadow-overlay: 0 0 15px rgba(255, 255, 255, 0.2), 0 0 3px 1px rgba(255, 255, 255, 0.15);
189
+ --ds-shadow-popover: 0 0 15px rgba(255, 255, 255, 0.2), 0 0 3px 1px rgba(255, 255, 255, 0.15);
190
+
191
+ --zt-hover: rgba(247, 249, 249, 0.1);
192
+ --zt-hover-soft: rgba(247, 249, 249, 0.03);
193
+ --zt-line-strong: #536471;
194
+ --zt-ink: #eff3f4;
195
+ --zt-ink-foreground: #0f1419;
196
+ }
197
+
198
+ /* ── PERSONALIDAD ────────────────────────────────────────────────────────────
199
+ * Sin capa: gana a las utilidades de los componentes. Solo variables.
200
+ */
201
+ :root {
202
+ /* Botones: píldora en peso 700; primario en azul; contorno con filete */
203
+ [data-slot='button'] {
204
+ border-radius: 9999px;
205
+ font-weight: 700;
206
+ }
207
+ [data-slot='button'][data-variant='default']:hover:not(:disabled) {
208
+ background-color: var(--link-hover);
209
+ }
210
+ [data-slot='button'][data-variant='secondary'] {
211
+ background: var(--zt-ink);
212
+ color: var(--zt-ink-foreground);
213
+ }
214
+ [data-slot='button'][data-variant='secondary']:hover:not(:disabled) {
215
+ opacity: 0.88;
216
+ }
217
+ [data-slot='button'][data-variant='outline'] {
218
+ background: transparent;
219
+ border: 1px solid var(--zt-line-strong);
220
+ color: var(--foreground);
221
+ }
222
+ [data-slot='button'][data-variant='outline']:hover:not(:disabled),
223
+ [data-slot='button'][data-variant='ghost']:hover:not(:disabled) {
224
+ background: var(--zt-hover);
225
+ }
226
+ [data-slot='button'][data-variant='destructive'] {
227
+ background: var(--destructive);
228
+ color: var(--destructive-foreground);
229
+ }
230
+
231
+ /* Tarjetas: planas, con filete, sin elevación */
232
+ [data-slot='card'] {
233
+ border: 1px solid var(--border);
234
+ box-shadow: none;
235
+ }
236
+
237
+ /* Campos: píldora/16px con filete; foco azul lo da el anillo */
238
+ [data-slot='input'],
239
+ [data-slot='textarea'],
240
+ [data-slot='select-trigger'] {
241
+ background: transparent;
242
+ border: 1px solid var(--input);
243
+ }
244
+ [data-slot='textarea'] {
245
+ border-radius: var(--ds-radius-lg);
246
+ }
247
+
248
+ /* Etiquetas en píldora */
249
+ [data-slot='badge'] {
250
+ border-radius: 9999px;
251
+ }
252
+
253
+ /* Pestañas: sin fondo, subrayado de acento en la activa */
254
+ [data-slot='tabs-list'] {
255
+ background: transparent;
256
+ border-bottom: 1px solid var(--border);
257
+ border-radius: 0;
258
+ }
259
+ [data-slot='tabs-trigger'] {
260
+ border-radius: 0;
261
+ background: transparent;
262
+ font-weight: 500;
263
+ }
264
+ [data-slot='tabs-trigger']:hover {
265
+ background: var(--zt-hover-soft);
266
+ }
267
+ [data-slot='tabs-trigger'][data-active] {
268
+ background: transparent;
269
+ box-shadow: inset 0 -4px 0 var(--primary);
270
+ font-weight: 700;
271
+ }
272
+
273
+ /* Sidebar: filas grandes en píldora; la activa en negrita, sin relleno */
274
+ [data-sidebar='menu-button'] {
275
+ font-size: 1.125rem;
276
+ border-radius: 9999px;
277
+ }
278
+ [data-sidebar='menu-button']:hover {
279
+ background: var(--zt-hover);
280
+ }
281
+ [data-sidebar='menu-button'][data-active='true'] {
282
+ background: transparent;
283
+ font-weight: 700;
284
+ }
285
+
286
+ /* Interruptor y progreso en el azul de marca, planos */
287
+ [data-slot='progress-indicator'] {
288
+ background: var(--primary);
289
+ }
290
+ }
@@ -0,0 +1,6 @@
1
+ /*
2
+ * Fuentes del tema twitter. Chirp (la fuente de Twitter) es propietaria y no se
3
+ * puede distribuir: no hay nada que cargar. El tema usa la pila del sistema como
4
+ * respaldo (`-apple-system, Segoe UI, Roboto…`). Si tienes licencia de Chirp, defínela
5
+ * con @font-face en tu app y quedará aplicada.
6
+ */