orbital-ds 0.7.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.
Files changed (109) hide show
  1. package/AGENTS.md +145 -80
  2. package/README.md +87 -73
  3. package/components.manifest.json +1326 -1267
  4. package/contract.json +226 -168
  5. package/dist/hooks/use-ds-messages.d.ts +36 -0
  6. package/dist/hooks/use-ds-messages.js +12 -0
  7. package/dist/hooks/use-ds-motion.d.ts +17 -0
  8. package/dist/hooks/use-ds-motion.js +50 -0
  9. package/dist/lib/i18n.d.ts +46 -0
  10. package/dist/lib/i18n.js +109 -0
  11. package/dist/lib/motion.d.ts +74 -0
  12. package/dist/lib/motion.js +97 -0
  13. package/dist/styles.css +876 -528
  14. package/dist/themes/friendly.css +362 -318
  15. package/dist/themes/friendly.meta.json +75 -14
  16. package/dist/themes/friendly.scoped.css +362 -318
  17. package/dist/themes/qratia.meta.json +42 -12
  18. package/dist/themes/tactile.css +575 -429
  19. package/dist/themes/tactile.fonts.css +3 -2
  20. package/dist/themes/tactile.guide.md +82 -49
  21. package/dist/themes/tactile.meta.json +175 -16
  22. package/dist/themes/tactile.scoped.css +575 -429
  23. package/dist/themes/twitter.css +354 -298
  24. package/dist/themes/twitter.meta.json +83 -61
  25. package/dist/themes/twitter.scoped.css +354 -298
  26. package/dist/themes/zyro.css +443 -389
  27. package/dist/themes/zyro.meta.json +67 -14
  28. package/dist/themes/zyro.scoped.css +443 -389
  29. package/dist/ui/accordion.js +5 -5
  30. package/dist/ui/alert-dialog.js +3 -3
  31. package/dist/ui/alert.d.ts +1 -1
  32. package/dist/ui/alert.js +9 -3
  33. package/dist/ui/attachment.d.ts +1 -1
  34. package/dist/ui/attachment.js +4 -4
  35. package/dist/ui/avatar.js +6 -6
  36. package/dist/ui/ayuda.js +3 -2
  37. package/dist/ui/badge.d.ts +1 -1
  38. package/dist/ui/badge.js +9 -3
  39. package/dist/ui/banner.d.ts +14 -0
  40. package/dist/ui/banner.js +88 -0
  41. package/dist/ui/breadcrumb.js +7 -3
  42. package/dist/ui/bubble.js +6 -6
  43. package/dist/ui/button-group.js +4 -4
  44. package/dist/ui/button.d.ts +1 -1
  45. package/dist/ui/button.js +5 -5
  46. package/dist/ui/calendar.js +33 -6
  47. package/dist/ui/card.js +4 -4
  48. package/dist/ui/carousel.js +15 -8
  49. package/dist/ui/chart.js +7 -3
  50. package/dist/ui/checkbox.js +1 -1
  51. package/dist/ui/combobox.js +7 -7
  52. package/dist/ui/command.js +13 -11
  53. package/dist/ui/context-menu.js +8 -8
  54. package/dist/ui/dialog.js +10 -6
  55. package/dist/ui/drawer.js +9 -9
  56. package/dist/ui/dropdown-menu.js +8 -8
  57. package/dist/ui/empty.js +3 -3
  58. package/dist/ui/field.js +2 -2
  59. package/dist/ui/hover-card.js +1 -1
  60. package/dist/ui/i18n-provider.d.ts +11 -0
  61. package/dist/ui/i18n-provider.js +18 -0
  62. package/dist/ui/icon-tile.d.ts +1 -1
  63. package/dist/ui/input-group.d.ts +1 -1
  64. package/dist/ui/input-group.js +11 -9
  65. package/dist/ui/input-otp.js +3 -3
  66. package/dist/ui/input.js +1 -1
  67. package/dist/ui/item.d.ts +1 -1
  68. package/dist/ui/item.js +3 -3
  69. package/dist/ui/kbd.js +1 -1
  70. package/dist/ui/label.js +1 -1
  71. package/dist/ui/marker.d.ts +1 -1
  72. package/dist/ui/marker.js +2 -2
  73. package/dist/ui/menubar.js +9 -9
  74. package/dist/ui/message-scroller.js +5 -2
  75. package/dist/ui/message.js +2 -2
  76. package/dist/ui/motion-provider.d.ts +11 -0
  77. package/dist/ui/motion-provider.js +16 -0
  78. package/dist/ui/native-select.js +4 -4
  79. package/dist/ui/navigation-menu.js +7 -6
  80. package/dist/ui/pagination.js +19 -11
  81. package/dist/ui/popover.js +2 -2
  82. package/dist/ui/progress.js +2 -2
  83. package/dist/ui/questionnaire.js +20 -15
  84. package/dist/ui/radio-group.js +2 -2
  85. package/dist/ui/resizable.js +2 -2
  86. package/dist/ui/scroll-area.js +3 -3
  87. package/dist/ui/select.js +6 -6
  88. package/dist/ui/separator.js +1 -1
  89. package/dist/ui/sheet.js +6 -4
  90. package/dist/ui/sidebar.js +42 -30
  91. package/dist/ui/skeleton.js +1 -1
  92. package/dist/ui/slider.js +6 -6
  93. package/dist/ui/sonner.js +25 -8
  94. package/dist/ui/spinner.js +4 -1
  95. package/dist/ui/switch.js +2 -2
  96. package/dist/ui/table.js +3 -3
  97. package/dist/ui/tabs.js +5 -5
  98. package/dist/ui/textarea.js +1 -1
  99. package/dist/ui/toast.js +15 -12
  100. package/dist/ui/toggle-group.js +2 -2
  101. package/dist/ui/toggle.js +6 -4
  102. package/dist/ui/tooltip.js +2 -2
  103. package/docs/CONTRACT.md +183 -153
  104. package/package.json +160 -142
  105. package/scripts/brand-core.mjs +153 -0
  106. package/scripts/doctor.mjs +128 -7
  107. package/scripts/i18n.mjs +111 -0
  108. package/scripts/init.mjs +294 -57
  109. package/scripts/setup.mjs +99 -0
@@ -1,298 +1,354 @@
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
-
26
- /* Lateral: iconos, raíl, logo y separadores (cada tema fija su forma y tamaño) */
27
- --ds-sidebar-icon: 1.5rem;
28
- --ds-sidebar-icon-stroke: 2;
29
- --ds-sidebar-rail-w: 4.5rem;
30
- --ds-sidebar-rail-item: 3rem;
31
- --ds-sidebar-logo: 2.25rem;
32
- --ds-sidebar-sep-inset: 0rem;
33
- --ds-heading-tracking: normal;
34
-
35
- /* Color */
36
- --background: #ffffff;
37
- --foreground: #0f1419;
38
-
39
- --card: #ffffff;
40
- --card-foreground: #0f1419;
41
- --popover: #ffffff;
42
- --popover-foreground: #0f1419;
43
-
44
- --primary: #1d9bf0;
45
- --primary-foreground: #ffffff;
46
- --secondary: #eff3f4;
47
- --secondary-foreground: #0f1419;
48
- --muted: #f7f9f9;
49
- --muted-foreground: #536471;
50
- --accent: rgba(29, 155, 240, 0.1);
51
- --accent-foreground: #1a8cd8;
52
- --destructive: #e51f2b;
53
- --destructive-foreground: #ffffff;
54
-
55
- --border: #eff3f4;
56
- --input: #cfd9de;
57
- --ring: #1d9bf0;
58
-
59
- --chart-1: #1d9bf0;
60
- --chart-2: #00ba7c;
61
- --chart-3: #ffd400;
62
- --chart-4: #f91880;
63
- --chart-5: #7856ff;
64
-
65
- --sidebar: transparent;
66
- --sidebar-foreground: #0f1419;
67
- --sidebar-primary: #1d9bf0;
68
- --sidebar-primary-foreground: #ffffff;
69
- --sidebar-accent: rgba(15, 20, 25, 0.1);
70
- --sidebar-accent-foreground: #0f1419;
71
- --sidebar-border: #eff3f4;
72
- --sidebar-ring: #1d9bf0;
73
-
74
- --danger: #d4141f;
75
- --danger-soft: rgba(244, 33, 46, 0.1);
76
- --warning: #8a6d00;
77
- --warning-soft: rgba(255, 212, 0, 0.2);
78
- --success: #007c53;
79
- --success-soft: rgba(0, 186, 124, 0.12);
80
- --info: #1573b1;
81
- --info-soft: rgba(29, 155, 240, 0.1);
82
- --neutral: #536471;
83
- --neutral-soft: #eff3f4;
84
-
85
- --link: #1d9bf0;
86
- --link-hover: #1a8cd8;
87
- --inset: #f7f9f9;
88
- --inset-foreground: #0f1419;
89
- --brand: #1d9bf0;
90
- --brand-bright: #1d9bf0;
91
-
92
- /* Formas: píldoras para acciones, 16px para superficies */
93
- --ds-radius-sm: 8px;
94
- --ds-radius-md: 12px;
95
- --ds-radius-lg: 16px;
96
- --ds-radius-xl: 16px;
97
- --ds-radius-2xl: 20px;
98
- --ds-radius-control: 9999px;
99
- --ds-radius-overlay: 16px;
100
-
101
- /* Sin elevación: solo los menús flotantes llevan sombra, muy suave */
102
- --ds-shadow-card: 0 0 #0000;
103
- --ds-shadow-card-hover: 0 0 #0000;
104
- --ds-shadow-control: 0 0 #0000;
105
- --ds-shadow-raised: 0 0 #0000;
106
- --ds-shadow-overlay: 0 0 15px rgba(101, 119, 134, 0.2), 0 0 3px 1px rgba(101, 119, 134, 0.15);
107
- --ds-shadow-popover: 0 0 15px rgba(101, 119, 134, 0.2), 0 0 3px 1px rgba(101, 119, 134, 0.15);
108
-
109
- /* Medidas */
110
- --ds-control-h-sm: 2rem;
111
- --ds-control-h-md: 2.25rem;
112
- --ds-control-h-lg: 3.25rem;
113
- --ds-button-px-sm: 1rem;
114
- --ds-button-px-md: 1.25rem;
115
- --ds-button-px-lg: 2rem;
116
- --ds-field-px: 1rem;
117
- --ds-card-spacing: 1rem;
118
- --ds-card-spacing-sm: 0.75rem;
119
-
120
- /* Materiales: ninguno (plano) */
121
- --ds-card-backdrop: none;
122
- --ds-overlay-backdrop: none;
123
- --ds-field-backdrop: none;
124
- --ds-sidebar-backdrop: none;
125
- --ds-page-backdrop: none;
126
-
127
- /* Sidebar a ras de borde, sin silueta; filas en píldora grandes */
128
- --ds-sidebar-pad: 0px;
129
- --ds-sidebar-radius: 0px;
130
- --ds-sidebar-shadow: 0 0 #0000;
131
- --ds-sidebar-ring: 0px;
132
- --ds-sidebar-edge: 1px solid var(--sidebar-border);
133
- --ds-sidebar-item-radius: 9999px;
134
- --ds-sidebar-item-h: 3.25rem;
135
-
136
- /* Privadas de twitter */
137
- --zt-hover: rgba(15, 20, 25, 0.1);
138
- --zt-hover-soft: rgba(15, 20, 25, 0.03);
139
- --zt-line-strong: #cfd9de;
140
- --zt-ink: #0f1419;
141
- --zt-ink-foreground: #ffffff;
142
- }
143
-
144
- /* ── VARIABLES · PIEL OSCURA («Dim») ─────────────────────────────────────── */
145
- .dark {
146
- --background: #15202b;
147
- --foreground: #f7f9f9;
148
-
149
- --card: #15202b;
150
- --card-foreground: #f7f9f9;
151
- --popover: #1e2732;
152
- --popover-foreground: #f7f9f9;
153
-
154
- --primary: #1d9bf0;
155
- --primary-foreground: #ffffff;
156
- --secondary: #1e2732;
157
- --secondary-foreground: #f7f9f9;
158
- --muted: #1e2732;
159
- --muted-foreground: #8b98a5;
160
- --accent: rgba(29, 155, 240, 0.15);
161
- --accent-foreground: #4db3f5;
162
- --destructive: #e51f2b;
163
- --destructive-foreground: #ffffff;
164
-
165
- --border: #38444d;
166
- --input: #536471;
167
- --ring: #1d9bf0;
168
-
169
- --sidebar: transparent;
170
- --sidebar-foreground: #f7f9f9;
171
- --sidebar-primary: #1d9bf0;
172
- --sidebar-primary-foreground: #ffffff;
173
- --sidebar-accent: rgba(247, 249, 249, 0.1);
174
- --sidebar-accent-foreground: #f7f9f9;
175
- --sidebar-border: #38444d;
176
- --sidebar-ring: #1d9bf0;
177
-
178
- --danger: #ff5a64;
179
- --danger-soft: rgba(244, 33, 46, 0.18);
180
- --warning: #ffd400;
181
- --warning-soft: rgba(255, 212, 0, 0.16);
182
- --success: #00ba7c;
183
- --success-soft: rgba(0, 186, 124, 0.16);
184
- --info: #4db3f5;
185
- --info-soft: rgba(29, 155, 240, 0.18);
186
- --neutral: #8b98a5;
187
- --neutral-soft: #1e2732;
188
-
189
- --link: #4db3f5;
190
- --link-hover: #8dcdf8;
191
- --inset: #1e2732;
192
- --inset-foreground: #f7f9f9;
193
- --brand: #1d9bf0;
194
- --brand-bright: #4db3f5;
195
-
196
- --ds-shadow-overlay: 0 0 15px rgba(255, 255, 255, 0.2), 0 0 3px 1px rgba(255, 255, 255, 0.15);
197
- --ds-shadow-popover: 0 0 15px rgba(255, 255, 255, 0.2), 0 0 3px 1px rgba(255, 255, 255, 0.15);
198
-
199
- --zt-hover: rgba(247, 249, 249, 0.1);
200
- --zt-hover-soft: rgba(247, 249, 249, 0.03);
201
- --zt-line-strong: #536471;
202
- --zt-ink: #eff3f4;
203
- --zt-ink-foreground: #0f1419;
204
- }
205
-
206
- /* ── PERSONALIDAD ────────────────────────────────────────────────────────────
207
- * Sin capa: gana a las utilidades de los componentes. Solo variables.
208
- */
209
- :root {
210
- /* Botones: píldora en peso 700; primario en azul; contorno con filete */
211
- [data-slot='button'] {
212
- border-radius: 9999px;
213
- font-weight: 700;
214
- }
215
- [data-slot='button'][data-variant='default']:hover:not(:disabled) {
216
- background-color: var(--link-hover);
217
- }
218
- [data-slot='button'][data-variant='secondary'] {
219
- background: var(--zt-ink);
220
- color: var(--zt-ink-foreground);
221
- }
222
- [data-slot='button'][data-variant='secondary']:hover:not(:disabled) {
223
- opacity: 0.88;
224
- }
225
- [data-slot='button'][data-variant='outline'] {
226
- background: transparent;
227
- border: 1px solid var(--zt-line-strong);
228
- color: var(--foreground);
229
- }
230
- [data-slot='button'][data-variant='outline']:hover:not(:disabled),
231
- [data-slot='button'][data-variant='ghost']:hover:not(:disabled) {
232
- background: var(--zt-hover);
233
- }
234
- [data-slot='button'][data-variant='destructive'] {
235
- background: var(--destructive);
236
- color: var(--destructive-foreground);
237
- }
238
-
239
- /* Tarjetas: planas, con filete, sin elevación */
240
- [data-slot='card'] {
241
- border: 1px solid var(--border);
242
- box-shadow: none;
243
- }
244
-
245
- /* Campos: píldora/16px con filete; foco azul lo da el anillo */
246
- [data-slot='input'],
247
- [data-slot='textarea'],
248
- [data-slot='select-trigger'] {
249
- background: transparent;
250
- border: 1px solid var(--input);
251
- }
252
- [data-slot='textarea'] {
253
- border-radius: var(--ds-radius-lg);
254
- }
255
-
256
- /* Etiquetas en píldora */
257
- [data-slot='badge'] {
258
- border-radius: 9999px;
259
- }
260
-
261
- /* Pestañas: sin fondo, subrayado de acento en la activa */
262
- [data-slot='tabs-list'] {
263
- background: transparent;
264
- border-bottom: 1px solid var(--border);
265
- border-radius: 0;
266
- }
267
- [data-slot='tabs-trigger'] {
268
- border-radius: 0;
269
- background: transparent;
270
- font-weight: 500;
271
- }
272
- [data-slot='tabs-trigger']:hover {
273
- background: var(--zt-hover-soft);
274
- }
275
- [data-slot='tabs-trigger'][data-active] {
276
- background: transparent;
277
- box-shadow: inset 0 -4px 0 var(--primary);
278
- font-weight: 700;
279
- }
280
-
281
- /* Sidebar: filas grandes en píldora; la activa en negrita, sin relleno */
282
- [data-sidebar='menu-button'] {
283
- font-size: 1.125rem;
284
- border-radius: 9999px;
285
- }
286
- [data-sidebar='menu-button']:hover {
287
- background: var(--zt-hover);
288
- }
289
- [data-sidebar='menu-button'][data-active='true'] {
290
- background: transparent;
291
- font-weight: 700;
292
- }
293
-
294
- /* Interruptor y progreso en el azul de marca, planos */
295
- [data-slot='progress-indicator'] {
296
- background: var(--primary);
297
- }
298
- }
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
+
26
+ /* Lateral: iconos, raíl, logo y separadores (cada tema fija su forma y tamaño) */
27
+ --ds-sidebar-icon: 1.5rem;
28
+ --ds-sidebar-icon-stroke: 2;
29
+ --ds-sidebar-rail-w: 4.5rem;
30
+ --ds-sidebar-rail-item: 3rem;
31
+ --ds-sidebar-logo: 2.25rem;
32
+ --ds-sidebar-sep-inset: 0rem;
33
+ --ds-heading-tracking: normal;
34
+
35
+ /* Color */
36
+ --background: #ffffff;
37
+ --foreground: #0f1419;
38
+
39
+ --card: #ffffff;
40
+ --card-foreground: #0f1419;
41
+ --popover: #ffffff;
42
+ --popover-foreground: #0f1419;
43
+
44
+ --primary: #1d9bf0;
45
+ --primary-foreground: #ffffff;
46
+ --secondary: #eff3f4;
47
+ --secondary-foreground: #0f1419;
48
+ --muted: #f7f9f9;
49
+ --muted-foreground: #536471;
50
+ --accent: rgba(29, 155, 240, 0.1);
51
+ --accent-foreground: #1a8cd8;
52
+ --destructive: #e51f2b;
53
+ --destructive-foreground: #ffffff;
54
+
55
+ --border: #eff3f4;
56
+ --input: #cfd9de;
57
+ --ring: #1d9bf0;
58
+
59
+ --chart-1: #1d9bf0;
60
+ --chart-2: #00ba7c;
61
+ --chart-3: #ffd400;
62
+ --chart-4: #f91880;
63
+ --chart-5: #7856ff;
64
+
65
+ --sidebar: transparent;
66
+ --sidebar-foreground: #0f1419;
67
+ --sidebar-primary: #1d9bf0;
68
+ --sidebar-primary-foreground: #ffffff;
69
+ --sidebar-accent: rgba(15, 20, 25, 0.1);
70
+ --sidebar-accent-foreground: #0f1419;
71
+ --sidebar-border: #eff3f4;
72
+ --sidebar-ring: #1d9bf0;
73
+
74
+ --danger: #d4141f;
75
+ --danger-soft: rgba(244, 33, 46, 0.1);
76
+ --warning: #8a6d00;
77
+ --warning-soft: rgba(255, 212, 0, 0.2);
78
+ --success: #007c53;
79
+ --success-soft: rgba(0, 186, 124, 0.12);
80
+ --info: #1573b1;
81
+ --info-soft: rgba(29, 155, 240, 0.1);
82
+ --neutral: #536471;
83
+ --neutral-soft: #eff3f4;
84
+
85
+ --link: #1d9bf0;
86
+ --link-hover: #1a8cd8;
87
+ --inset: #f7f9f9;
88
+ --inset-foreground: #0f1419;
89
+ --brand: #1d9bf0;
90
+ --brand-bright: #1d9bf0;
91
+
92
+ /* Formas: píldoras para acciones, 16px para superficies */
93
+ --ds-radius-sm: 8px;
94
+ --ds-radius-md: 12px;
95
+ --ds-radius-lg: 16px;
96
+ --ds-radius-xl: 16px;
97
+ --ds-radius-2xl: 20px;
98
+ --ds-radius-control: 9999px;
99
+ --ds-radius-overlay: 16px;
100
+
101
+ /* Sin elevación: solo los menús flotantes llevan sombra, muy suave */
102
+ --ds-shadow-card: 0 0 #0000;
103
+ --ds-shadow-card-hover: 0 0 #0000;
104
+ --ds-shadow-control: 0 0 #0000;
105
+ --ds-shadow-raised: 0 0 #0000;
106
+ --ds-shadow-overlay: 0 0 15px rgba(101, 119, 134, 0.2), 0 0 3px 1px rgba(101, 119, 134, 0.15);
107
+ --ds-shadow-popover: 0 0 15px rgba(101, 119, 134, 0.2), 0 0 3px 1px rgba(101, 119, 134, 0.15);
108
+
109
+ /* Medidas */
110
+ --ds-control-h-sm: 2rem;
111
+ --ds-control-h-md: 2.25rem;
112
+ --ds-control-h-lg: 3.25rem;
113
+ --ds-button-px-sm: 1rem;
114
+ --ds-button-px-md: 1.25rem;
115
+ --ds-button-px-lg: 2rem;
116
+ --ds-field-px: 1rem;
117
+ --ds-card-spacing: 1rem;
118
+ --ds-card-spacing-sm: 0.75rem;
119
+
120
+ /* Materiales: ninguno (plano) */
121
+ --ds-card-backdrop: none;
122
+ --ds-overlay-backdrop: none;
123
+ --ds-field-backdrop: none;
124
+ --ds-sidebar-backdrop: none;
125
+ --ds-page-backdrop: none;
126
+
127
+ /* Sidebar a ras de borde, sin silueta; filas en píldora grandes */
128
+ --ds-sidebar-pad: 0px;
129
+ --ds-sidebar-radius: 0px;
130
+ --ds-sidebar-shadow: 0 0 #0000;
131
+ --ds-sidebar-ring: 0px;
132
+ --ds-sidebar-edge: 1px solid var(--sidebar-border);
133
+ --ds-sidebar-item-radius: 9999px;
134
+ --ds-sidebar-item-h: 3.25rem;
135
+
136
+ /* Privadas de twitter */
137
+ --zt-hover: rgba(15, 20, 25, 0.1);
138
+ --zt-hover-soft: rgba(15, 20, 25, 0.03);
139
+ --zt-line-strong: #cfd9de;
140
+ --zt-ink: #0f1419;
141
+ --zt-ink-foreground: #ffffff;
142
+ }
143
+
144
+ /* ── VARIABLES · PIEL OSCURA («Dim») ─────────────────────────────────────── */
145
+ .dark {
146
+ --background: #15202b;
147
+ --foreground: #f7f9f9;
148
+
149
+ --card: #15202b;
150
+ --card-foreground: #f7f9f9;
151
+ --popover: #1e2732;
152
+ --popover-foreground: #f7f9f9;
153
+
154
+ --primary: #1d9bf0;
155
+ --primary-foreground: #ffffff;
156
+ --secondary: #1e2732;
157
+ --secondary-foreground: #f7f9f9;
158
+ --muted: #1e2732;
159
+ --muted-foreground: #8b98a5;
160
+ --accent: rgba(29, 155, 240, 0.15);
161
+ --accent-foreground: #4db3f5;
162
+ --destructive: #e51f2b;
163
+ --destructive-foreground: #ffffff;
164
+
165
+ --border: #38444d;
166
+ --input: #536471;
167
+ --ring: #1d9bf0;
168
+
169
+ --sidebar: transparent;
170
+ --sidebar-foreground: #f7f9f9;
171
+ --sidebar-primary: #1d9bf0;
172
+ --sidebar-primary-foreground: #ffffff;
173
+ --sidebar-accent: rgba(247, 249, 249, 0.1);
174
+ --sidebar-accent-foreground: #f7f9f9;
175
+ --sidebar-border: #38444d;
176
+ --sidebar-ring: #1d9bf0;
177
+
178
+ --danger: #ff5a64;
179
+ --danger-soft: rgba(244, 33, 46, 0.18);
180
+ --warning: #ffd400;
181
+ --warning-soft: rgba(255, 212, 0, 0.16);
182
+ --success: #00ba7c;
183
+ --success-soft: rgba(0, 186, 124, 0.16);
184
+ --info: #4db3f5;
185
+ --info-soft: rgba(29, 155, 240, 0.18);
186
+ --neutral: #8b98a5;
187
+ --neutral-soft: #1e2732;
188
+
189
+ --link: #4db3f5;
190
+ --link-hover: #8dcdf8;
191
+ --inset: #1e2732;
192
+ --inset-foreground: #f7f9f9;
193
+ --brand: #1d9bf0;
194
+ --brand-bright: #4db3f5;
195
+
196
+ --ds-shadow-overlay: 0 0 15px rgba(255, 255, 255, 0.2), 0 0 3px 1px rgba(255, 255, 255, 0.15);
197
+ --ds-shadow-popover: 0 0 15px rgba(255, 255, 255, 0.2), 0 0 3px 1px rgba(255, 255, 255, 0.15);
198
+
199
+ --zt-hover: rgba(247, 249, 249, 0.1);
200
+ --zt-hover-soft: rgba(247, 249, 249, 0.03);
201
+ --zt-line-strong: #536471;
202
+ --zt-ink: #eff3f4;
203
+ --zt-ink-foreground: #0f1419;
204
+ }
205
+
206
+ /* ── VARIABLES DE LA PERSONALIDAD ────────────────────────────────────────────
207
+ * Lo que las reglas de abajo piden: cámbialo aquí (o en el brand.css de la app),
208
+ * nunca en las reglas.
209
+ */
210
+ :root {
211
+ /* Movimiento: funcional y rápido, la curva estándar de una app */
212
+ --ds-motion-fast: 100ms;
213
+ --ds-motion-base: 150ms;
214
+ --ds-motion-slow: 250ms;
215
+ --ds-ease-standard: cubic-bezier(0.4, 0, 0.2, 1);
216
+ --ds-ease-enter: cubic-bezier(0, 0, 0.2, 1);
217
+ --ds-ease-exit: cubic-bezier(0.4, 0, 1, 1);
218
+ --ds-motion-distance: 4px;
219
+ --ds-motion-scale: 0.98;
220
+ --ds-motion-blur: 0px;
221
+ --ds-spring-bounce: 0;
222
+ --ds-motion-stagger: 25ms;
223
+ --ds-motion-press-scale: 0.98;
224
+ --ds-key-weight: 700;
225
+ --ds-rule-w: 1px;
226
+ --ds-button-outline-w: 1px;
227
+ --ds-hover-opacity: 0.88;
228
+ --ds-tab-weight: 500;
229
+ --ds-tab-active-weight: 700;
230
+ --ds-tab-indicator-w: 4px;
231
+ --ds-nav-active-weight: 700;
232
+ }
233
+
234
+ /* ── PERSONALIDAD ────────────────────────────────────────────────────────────
235
+ * Sin capa: gana a las utilidades de los componentes. Solo variables (lo comprueba
236
+ * el doctor: tema `conformance: strict`). Familias completas.
237
+ */
238
+ :root {
239
+ /* Botones: píldora en peso 700; primario en azul; contorno con filete */
240
+ [data-slot='button'] {
241
+ border-radius: var(--ds-radius-pill);
242
+ font-weight: var(--ds-key-weight);
243
+ }
244
+ [data-slot='button'][data-variant='default']:hover:not(:disabled) {
245
+ background-color: var(--link-hover);
246
+ }
247
+ [data-slot='button'][data-variant='secondary'] {
248
+ background: var(--zt-ink);
249
+ color: var(--zt-ink-foreground);
250
+ }
251
+ [data-slot='button'][data-variant='secondary']:hover:not(:disabled) {
252
+ opacity: var(--ds-hover-opacity);
253
+ }
254
+ [data-slot='button'][data-variant='outline'] {
255
+ background: transparent;
256
+ border: var(--ds-button-outline-w) solid var(--zt-line-strong);
257
+ color: var(--foreground);
258
+ }
259
+ [data-slot='button'][data-variant='outline']:hover:not(:disabled),
260
+ [data-slot='button'][data-variant='ghost']:hover:not(:disabled) {
261
+ background: var(--zt-hover);
262
+ }
263
+ [data-slot='button'][data-variant='destructive'] {
264
+ background: var(--destructive);
265
+ color: var(--destructive-foreground);
266
+ }
267
+
268
+ /* Tarjetas: planas, con filete, sin elevación */
269
+ [data-slot='card'] {
270
+ border: var(--ds-rule-w) solid var(--border);
271
+ box-shadow: none;
272
+ }
273
+
274
+ /* Campos con filete (familia «field»); foco azul lo da el anillo */
275
+ [data-slot='input'],
276
+ [data-slot='textarea'],
277
+ [data-slot='select-trigger'],
278
+ [data-slot='native-select'],
279
+ [data-slot='input-group'] {
280
+ background: transparent;
281
+ border: var(--ds-rule-w) solid var(--input);
282
+ }
283
+ /* El OTP es una fila de casillas pegadas: solo color, sin duplicar sus bordes */
284
+ [data-slot='input-otp-slot'] {
285
+ background: transparent;
286
+ border-color: var(--input);
287
+ }
288
+ [data-slot='textarea'] {
289
+ border-radius: var(--ds-radius-lg);
290
+ }
291
+
292
+ /* Etiquetas en píldora */
293
+ [data-slot='badge'] {
294
+ border-radius: var(--ds-radius-pill);
295
+ }
296
+
297
+ /* Conmutadores (familia «toggle»): sin fondo; el activo, en negrita */
298
+ [data-slot='tabs-list'] {
299
+ background: transparent;
300
+ border-bottom: var(--ds-rule-w) solid var(--border);
301
+ border-radius: 0;
302
+ }
303
+ [data-slot='tabs-trigger'],
304
+ [data-slot='toggle'],
305
+ [data-slot='toggle-group-item'] {
306
+ background: transparent;
307
+ font-weight: var(--ds-tab-weight);
308
+ }
309
+ [data-slot='tabs-trigger'] {
310
+ border-radius: 0;
311
+ }
312
+ [data-slot='toggle'],
313
+ [data-slot='toggle-group-item'] {
314
+ border-radius: var(--ds-radius-pill);
315
+ }
316
+ [data-slot='tabs-trigger']:hover,
317
+ [data-slot='toggle']:hover,
318
+ [data-slot='toggle-group-item']:hover {
319
+ background: var(--zt-hover-soft);
320
+ }
321
+ [data-slot='tabs-trigger'][data-active],
322
+ [data-slot='toggle'][aria-pressed='true'],
323
+ [data-slot='toggle-group-item'][aria-pressed='true'] {
324
+ font-weight: var(--ds-tab-active-weight);
325
+ }
326
+ /* La pestaña activa, subrayada con el acento */
327
+ [data-slot='tabs-trigger'][data-active] {
328
+ background: transparent;
329
+ box-shadow: inset 0 calc(var(--ds-tab-indicator-w) * -1) 0 var(--primary);
330
+ }
331
+ /* El toggle activo, con el tinte de señalado */
332
+ [data-slot='toggle'][aria-pressed='true'],
333
+ [data-slot='toggle-group-item'][aria-pressed='true'] {
334
+ background: var(--zt-hover);
335
+ }
336
+
337
+ /* Sidebar: filas grandes en píldora; la activa en negrita, sin relleno */
338
+ [data-sidebar='menu-button'] {
339
+ font-size: var(--ds-text-lg);
340
+ border-radius: var(--ds-radius-pill);
341
+ }
342
+ [data-sidebar='menu-button']:hover {
343
+ background: var(--zt-hover);
344
+ }
345
+ [data-sidebar='menu-button'][data-active='true'] {
346
+ background: transparent;
347
+ font-weight: var(--ds-nav-active-weight);
348
+ }
349
+
350
+ /* Interruptor y progreso en el azul de marca, planos */
351
+ [data-slot='progress-indicator'] {
352
+ background: var(--primary);
353
+ }
354
+ }