orbital-ds 0.5.0 → 0.6.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/README.md +73 -64
- package/components.manifest.json +12 -1
- package/dist/styles.css +18 -0
- package/dist/themes/friendly.guide.md +38 -0
- package/dist/themes/friendly.meta.json +14 -0
- package/dist/themes/qratia.guide.md +34 -0
- package/dist/themes/qratia.meta.json +12 -0
- package/dist/themes/tactile.css +399 -0
- package/dist/themes/tactile.fonts.css +2 -0
- package/dist/themes/tactile.guide.md +49 -0
- package/dist/themes/tactile.meta.json +16 -0
- package/dist/themes/tactile.scoped.css +399 -0
- package/dist/themes/twitter.guide.md +35 -0
- package/dist/themes/twitter.meta.json +14 -0
- package/dist/themes/zyro.guide.md +33 -0
- package/dist/themes/zyro.meta.json +14 -0
- package/dist/ui/attachment.d.ts +1 -1
- package/dist/ui/button.d.ts +1 -1
- package/dist/ui/icon-tile.d.ts +11 -0
- package/dist/ui/icon-tile.js +47 -0
- package/dist/ui/input-group.d.ts +1 -1
- package/dist/ui/item.d.ts +1 -1
- package/dist/ui/marker.d.ts +1 -1
- package/package.json +3 -1
- package/scripts/doctor.mjs +237 -224
- package/scripts/init.mjs +89 -55
|
@@ -0,0 +1,399 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* TEMA tactile — interfaz táctil de papel y tinta, con rotulador.
|
|
3
|
+
*
|
|
4
|
+
* Dirección ORIGINAL (no copia ninguna referencia: toma un principio de cada una).
|
|
5
|
+
* - Lo que se pulsa lleva TINTA: contorno de 2px y una arista inferior de 5px que
|
|
6
|
+
* baja al pulsar, como una tecla. Las superficies llevan filete suave.
|
|
7
|
+
* - Un ROTULADOR mostaza translúcido bajo los títulos.
|
|
8
|
+
* - Papel cálido y tinta berenjena casi negra (nunca #000). Un acento vivo
|
|
9
|
+
* (mostaza, con texto de tinta: contraste 10:1) y uno pequeño (pino).
|
|
10
|
+
* - Formas: 8 · 12 · 14 · 16. Sin sombras difusas: la profundidad la dan las aristas.
|
|
11
|
+
* - Titulares en Fraunces (serifa suave) y cuerpo en Figtree.
|
|
12
|
+
*
|
|
13
|
+
* Importar DESPUÉS de la estructura. Variables `--zw-*`: privadas de este tema.
|
|
14
|
+
* Fuentes: `tactile.fonts.css`, lo primero del CSS de la app.
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
/* ── VARIABLES · PIEL CLARA («papel») ────────────────────────────────────── */
|
|
18
|
+
:root[data-theme='tactile'] {
|
|
19
|
+
--radius: 16px;
|
|
20
|
+
|
|
21
|
+
--ds-font-sans: 'Figtree', system-ui, -apple-system, 'Segoe UI', Roboto, sans-serif;
|
|
22
|
+
--ds-font-display: 'Fraunces', Georgia, 'Times New Roman', serif;
|
|
23
|
+
--ds-font-mono: ui-monospace, 'SF Mono', Menlo, monospace;
|
|
24
|
+
--ds-heading-tracking: -0.01em;
|
|
25
|
+
|
|
26
|
+
--background: #f6f0e3;
|
|
27
|
+
--foreground: #2a2233;
|
|
28
|
+
|
|
29
|
+
--card: #fffcf4;
|
|
30
|
+
--card-foreground: #2a2233;
|
|
31
|
+
--popover: #fffcf4;
|
|
32
|
+
--popover-foreground: #2a2233;
|
|
33
|
+
|
|
34
|
+
--primary: #f2b33d;
|
|
35
|
+
--primary-foreground: #2a2233;
|
|
36
|
+
--secondary: #ede3cd;
|
|
37
|
+
--secondary-foreground: #2a2233;
|
|
38
|
+
--muted: #ede3cd;
|
|
39
|
+
--muted-foreground: rgba(42, 34, 51, 0.7);
|
|
40
|
+
--accent: rgba(242, 179, 61, 0.3);
|
|
41
|
+
--accent-foreground: #2a2233;
|
|
42
|
+
--destructive: #b53a22;
|
|
43
|
+
--destructive-foreground: #fffcf4;
|
|
44
|
+
|
|
45
|
+
--border: rgba(42, 34, 51, 0.14);
|
|
46
|
+
--input: #2a2233;
|
|
47
|
+
--ring: #17624f;
|
|
48
|
+
|
|
49
|
+
--chart-1: #f2b33d;
|
|
50
|
+
--chart-2: #17624f;
|
|
51
|
+
--chart-3: #2f6fb0;
|
|
52
|
+
--chart-4: #b53a22;
|
|
53
|
+
--chart-5: #8b5a9e;
|
|
54
|
+
|
|
55
|
+
--sidebar: #ede3cd;
|
|
56
|
+
--sidebar-foreground: #2a2233;
|
|
57
|
+
--sidebar-primary: #f2b33d;
|
|
58
|
+
--sidebar-primary-foreground: #2a2233;
|
|
59
|
+
--sidebar-accent: #fffcf4;
|
|
60
|
+
--sidebar-accent-foreground: #2a2233;
|
|
61
|
+
--sidebar-border: rgba(42, 34, 51, 0.26);
|
|
62
|
+
--sidebar-ring: #17624f;
|
|
63
|
+
|
|
64
|
+
--danger: #b53a22;
|
|
65
|
+
--danger-soft: rgba(214, 69, 43, 0.13);
|
|
66
|
+
--warning: #7a5200;
|
|
67
|
+
--warning-soft: rgba(242, 179, 61, 0.3);
|
|
68
|
+
--success: #17624f;
|
|
69
|
+
--success-soft: rgba(23, 98, 79, 0.12);
|
|
70
|
+
--info: #2f6fb0;
|
|
71
|
+
--info-soft: rgba(47, 111, 176, 0.12);
|
|
72
|
+
--neutral: rgba(42, 34, 51, 0.72);
|
|
73
|
+
--neutral-soft: rgba(42, 34, 51, 0.08);
|
|
74
|
+
|
|
75
|
+
--link: #17624f;
|
|
76
|
+
--link-hover: #0f4538;
|
|
77
|
+
--inset: #ede3cd;
|
|
78
|
+
--inset-foreground: #2a2233;
|
|
79
|
+
--brand: #f2b33d;
|
|
80
|
+
--brand-bright: #f7c566;
|
|
81
|
+
|
|
82
|
+
/* Formas */
|
|
83
|
+
--ds-radius-sm: 8px;
|
|
84
|
+
--ds-radius-md: 12px;
|
|
85
|
+
--ds-radius-lg: 14px;
|
|
86
|
+
--ds-radius-xl: 16px;
|
|
87
|
+
--ds-radius-2xl: 20px;
|
|
88
|
+
--ds-radius-control: 12px;
|
|
89
|
+
--ds-radius-overlay: 18px;
|
|
90
|
+
|
|
91
|
+
/* Sin sombras difusas: la profundidad la dan las aristas (ver la personalidad) */
|
|
92
|
+
--ds-shadow-card: 0 0 #0000;
|
|
93
|
+
--ds-shadow-card-hover: 0 0 #0000;
|
|
94
|
+
--ds-shadow-control: 0 0 #0000;
|
|
95
|
+
--ds-shadow-raised: 0 0 #0000;
|
|
96
|
+
--ds-shadow-overlay: 0 8px 0 rgba(42, 34, 51, 0.12);
|
|
97
|
+
--ds-shadow-popover: 0 6px 0 rgba(42, 34, 51, 0.12);
|
|
98
|
+
|
|
99
|
+
/* Medidas: teclas generosas */
|
|
100
|
+
--ds-control-h-sm: 2.25rem;
|
|
101
|
+
--ds-control-h-md: 2.75rem;
|
|
102
|
+
--ds-control-h-lg: 3.25rem;
|
|
103
|
+
--ds-button-px-sm: 0.875rem;
|
|
104
|
+
--ds-button-px-md: 1.125rem;
|
|
105
|
+
--ds-button-px-lg: 1.5rem;
|
|
106
|
+
--ds-field-px: 0.875rem;
|
|
107
|
+
--ds-card-spacing: 1.25rem;
|
|
108
|
+
--ds-card-spacing-sm: 1rem;
|
|
109
|
+
|
|
110
|
+
/* Materiales: ninguno */
|
|
111
|
+
--ds-card-backdrop: none;
|
|
112
|
+
--ds-overlay-backdrop: none;
|
|
113
|
+
--ds-field-backdrop: none;
|
|
114
|
+
--ds-sidebar-backdrop: none;
|
|
115
|
+
--ds-page-backdrop: none;
|
|
116
|
+
|
|
117
|
+
/* Sidebar a ras de borde, papel más hondo, filas como teclas */
|
|
118
|
+
--ds-sidebar-pad: 0px;
|
|
119
|
+
--ds-sidebar-radius: 0px;
|
|
120
|
+
--ds-sidebar-shadow: 0 0 #0000;
|
|
121
|
+
--ds-sidebar-ring: 0px;
|
|
122
|
+
--ds-sidebar-edge: 2px solid var(--sidebar-border);
|
|
123
|
+
--ds-sidebar-item-radius: 14px;
|
|
124
|
+
--ds-sidebar-item-h: 2.75rem;
|
|
125
|
+
|
|
126
|
+
/* Baldosas de icono: grandes, tintadas y con relleno duotono suave */
|
|
127
|
+
--ds-icon-tile-sm: 2.25rem;
|
|
128
|
+
--ds-icon-tile-md: 3.5rem;
|
|
129
|
+
--ds-icon-tile-lg: 4.5rem;
|
|
130
|
+
--ds-icon-tile-radius: var(--ds-radius-xl);
|
|
131
|
+
--ds-icon-tile-fill: 0.2;
|
|
132
|
+
|
|
133
|
+
/* Privadas de tactile */
|
|
134
|
+
--zw-outline: #2a2233;
|
|
135
|
+
--zw-edge: rgba(42, 34, 51, 0.26);
|
|
136
|
+
--zw-mark: rgba(242, 179, 61, 0.62);
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
/* ── VARIABLES · PIEL OSCURA («noche») ───────────────────────────────────── */
|
|
140
|
+
:root[data-theme='tactile'].dark {
|
|
141
|
+
--background: #1d1824;
|
|
142
|
+
--foreground: #f4ebda;
|
|
143
|
+
|
|
144
|
+
--card: #2c2636;
|
|
145
|
+
--card-foreground: #f4ebda;
|
|
146
|
+
--popover: #2c2636;
|
|
147
|
+
--popover-foreground: #f4ebda;
|
|
148
|
+
|
|
149
|
+
--primary: #f2b33d;
|
|
150
|
+
--primary-foreground: #1d1824;
|
|
151
|
+
--secondary: #25202e;
|
|
152
|
+
--secondary-foreground: #f4ebda;
|
|
153
|
+
--muted: #25202e;
|
|
154
|
+
--muted-foreground: rgba(244, 235, 218, 0.72);
|
|
155
|
+
--accent: rgba(242, 179, 61, 0.18);
|
|
156
|
+
--accent-foreground: #f7c566;
|
|
157
|
+
--destructive: #ff8266;
|
|
158
|
+
--destructive-foreground: #1d1824;
|
|
159
|
+
|
|
160
|
+
--border: rgba(244, 235, 218, 0.14);
|
|
161
|
+
--input: rgba(244, 235, 218, 0.92);
|
|
162
|
+
--ring: #5cc9a8;
|
|
163
|
+
|
|
164
|
+
--chart-1: #f2b33d;
|
|
165
|
+
--chart-2: #5cc9a8;
|
|
166
|
+
--chart-3: #7db3f0;
|
|
167
|
+
--chart-4: #ff8266;
|
|
168
|
+
--chart-5: #c79ad8;
|
|
169
|
+
|
|
170
|
+
--sidebar: #25202e;
|
|
171
|
+
--sidebar-foreground: #f4ebda;
|
|
172
|
+
--sidebar-primary: #f2b33d;
|
|
173
|
+
--sidebar-primary-foreground: #1d1824;
|
|
174
|
+
--sidebar-accent: #2c2636;
|
|
175
|
+
--sidebar-accent-foreground: #f4ebda;
|
|
176
|
+
--sidebar-border: rgba(244, 235, 218, 0.26);
|
|
177
|
+
--sidebar-ring: #5cc9a8;
|
|
178
|
+
|
|
179
|
+
--danger: #ff8266;
|
|
180
|
+
--danger-soft: rgba(255, 130, 102, 0.16);
|
|
181
|
+
--warning: #f2b33d;
|
|
182
|
+
--warning-soft: rgba(242, 179, 61, 0.18);
|
|
183
|
+
--success: #5cc9a8;
|
|
184
|
+
--success-soft: rgba(92, 201, 168, 0.16);
|
|
185
|
+
--info: #7db3f0;
|
|
186
|
+
--info-soft: rgba(125, 179, 240, 0.16);
|
|
187
|
+
--neutral: rgba(244, 235, 218, 0.72);
|
|
188
|
+
--neutral-soft: rgba(244, 235, 218, 0.1);
|
|
189
|
+
|
|
190
|
+
--link: #5cc9a8;
|
|
191
|
+
--link-hover: #8ee0c4;
|
|
192
|
+
--inset: #25202e;
|
|
193
|
+
--inset-foreground: #f4ebda;
|
|
194
|
+
--brand: #f2b33d;
|
|
195
|
+
--brand-bright: #f7c566;
|
|
196
|
+
|
|
197
|
+
--ds-shadow-overlay: 0 8px 0 rgba(0, 0, 0, 0.4);
|
|
198
|
+
--ds-shadow-popover: 0 6px 0 rgba(0, 0, 0, 0.4);
|
|
199
|
+
|
|
200
|
+
--zw-outline: rgba(244, 235, 218, 0.92);
|
|
201
|
+
--zw-edge: rgba(244, 235, 218, 0.26);
|
|
202
|
+
--zw-mark: rgba(242, 179, 61, 0.45);
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
/* ── PERSONALIDAD ────────────────────────────────────────────────────────────
|
|
206
|
+
* Sin capa: gana a las utilidades de los componentes. Solo variables. No usa
|
|
207
|
+
* box-shadow en los controles, así el anillo de foco sigue funcionando.
|
|
208
|
+
*/
|
|
209
|
+
:root[data-theme='tactile'] {
|
|
210
|
+
/* Teclas: contorno de tinta y arista inferior; al pulsar, se hunden */
|
|
211
|
+
[data-slot='button'] {
|
|
212
|
+
border: 2px solid var(--zw-outline);
|
|
213
|
+
border-bottom-width: 5px;
|
|
214
|
+
border-radius: 14px;
|
|
215
|
+
font-weight: 700;
|
|
216
|
+
transition:
|
|
217
|
+
transform var(--ds-motion-fast) ease,
|
|
218
|
+
border-bottom-width var(--ds-motion-fast) ease,
|
|
219
|
+
background-color var(--ds-motion-base) ease;
|
|
220
|
+
}
|
|
221
|
+
[data-slot='button']:active:not(:disabled) {
|
|
222
|
+
transform: translateY(3px);
|
|
223
|
+
border-bottom-width: 2px;
|
|
224
|
+
}
|
|
225
|
+
[data-slot='button']:disabled {
|
|
226
|
+
opacity: 0.45;
|
|
227
|
+
}
|
|
228
|
+
[data-slot='button'][data-variant='default']:hover:not(:disabled) {
|
|
229
|
+
background-color: color-mix(in oklch, var(--primary) 78%, var(--card));
|
|
230
|
+
}
|
|
231
|
+
[data-slot='button'][data-variant='secondary'],
|
|
232
|
+
[data-slot='button'][data-variant='outline'] {
|
|
233
|
+
background: var(--card);
|
|
234
|
+
color: var(--foreground);
|
|
235
|
+
}
|
|
236
|
+
[data-slot='button'][data-variant='outline'] {
|
|
237
|
+
background: transparent;
|
|
238
|
+
}
|
|
239
|
+
[data-slot='button'][data-variant='secondary']:hover:not(:disabled),
|
|
240
|
+
[data-slot='button'][data-variant='outline']:hover:not(:disabled) {
|
|
241
|
+
background: var(--secondary);
|
|
242
|
+
}
|
|
243
|
+
[data-slot='button'][data-variant='ghost'] {
|
|
244
|
+
border-color: transparent;
|
|
245
|
+
border-bottom-width: 2px;
|
|
246
|
+
}
|
|
247
|
+
[data-slot='button'][data-variant='ghost']:hover:not(:disabled) {
|
|
248
|
+
background: var(--secondary);
|
|
249
|
+
}
|
|
250
|
+
[data-slot='button'][data-variant='destructive'] {
|
|
251
|
+
background: var(--destructive);
|
|
252
|
+
color: var(--destructive-foreground);
|
|
253
|
+
}
|
|
254
|
+
[data-slot='button'][data-variant='link'] {
|
|
255
|
+
border: 0;
|
|
256
|
+
font-weight: 700;
|
|
257
|
+
}
|
|
258
|
+
[data-slot='button'][data-variant='link']:active:not(:disabled) {
|
|
259
|
+
transform: none;
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
/* Superficies: filete suave y una arista inferior más marcada */
|
|
263
|
+
[data-slot='card'] {
|
|
264
|
+
border: 2px solid var(--border);
|
|
265
|
+
border-bottom: 5px solid var(--zw-edge);
|
|
266
|
+
box-shadow: none;
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
/* Campos: contorno de tinta */
|
|
270
|
+
[data-slot='input'],
|
|
271
|
+
[data-slot='textarea'],
|
|
272
|
+
[data-slot='select-trigger'] {
|
|
273
|
+
background: var(--card);
|
|
274
|
+
border: 2px solid var(--input);
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
/* Etiquetas: esquina de 8px, no píldora */
|
|
278
|
+
[data-slot='badge'] {
|
|
279
|
+
border-radius: 8px;
|
|
280
|
+
font-weight: 700;
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
/* Pestañas: teclas pequeñas; la activa, en mostaza */
|
|
284
|
+
[data-slot='tabs-list'] {
|
|
285
|
+
background: transparent;
|
|
286
|
+
gap: 8px;
|
|
287
|
+
}
|
|
288
|
+
[data-slot='tabs-trigger'] {
|
|
289
|
+
border: 2px solid var(--border);
|
|
290
|
+
border-bottom-width: 4px;
|
|
291
|
+
border-radius: 12px;
|
|
292
|
+
font-weight: 700;
|
|
293
|
+
background: transparent;
|
|
294
|
+
}
|
|
295
|
+
[data-slot='tabs-trigger'][data-active] {
|
|
296
|
+
background: var(--primary);
|
|
297
|
+
color: var(--primary-foreground);
|
|
298
|
+
border-color: var(--zw-outline);
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
/* Interruptor, casilla y progreso, con tinta */
|
|
302
|
+
[data-slot='switch'] {
|
|
303
|
+
border: 2px solid var(--zw-outline);
|
|
304
|
+
border-bottom-width: 4px;
|
|
305
|
+
border-radius: 12px;
|
|
306
|
+
}
|
|
307
|
+
[data-slot='switch'][data-checked] {
|
|
308
|
+
background: var(--primary);
|
|
309
|
+
}
|
|
310
|
+
[data-slot='switch-thumb'] {
|
|
311
|
+
border-radius: 7px;
|
|
312
|
+
background: var(--zw-outline);
|
|
313
|
+
}
|
|
314
|
+
[data-slot='checkbox'] {
|
|
315
|
+
border: 2px solid var(--zw-outline);
|
|
316
|
+
border-radius: 8px;
|
|
317
|
+
}
|
|
318
|
+
[data-slot='checkbox'][data-checked] {
|
|
319
|
+
background: var(--primary);
|
|
320
|
+
color: var(--primary-foreground);
|
|
321
|
+
}
|
|
322
|
+
[data-slot='progress'] {
|
|
323
|
+
border: 2px solid var(--zw-outline);
|
|
324
|
+
border-radius: 8px;
|
|
325
|
+
background: var(--background);
|
|
326
|
+
}
|
|
327
|
+
[data-slot='progress-indicator'] {
|
|
328
|
+
background: var(--primary);
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
/* Capas flotantes: contorno de tinta y arista inferior */
|
|
332
|
+
[data-slot='dialog-content'],
|
|
333
|
+
[data-slot='sheet-content'] {
|
|
334
|
+
border: 2px solid var(--zw-outline);
|
|
335
|
+
border-bottom-width: 6px;
|
|
336
|
+
}
|
|
337
|
+
[data-slot='popover-content'],
|
|
338
|
+
[data-slot='dropdown-menu-content'],
|
|
339
|
+
[data-slot='select-content'] {
|
|
340
|
+
border: 2px solid var(--zw-outline);
|
|
341
|
+
border-bottom-width: 4px;
|
|
342
|
+
}
|
|
343
|
+
|
|
344
|
+
/* Avisos con tinta */
|
|
345
|
+
[data-slot='alert'] {
|
|
346
|
+
border: 2px solid var(--zw-outline);
|
|
347
|
+
border-radius: 14px;
|
|
348
|
+
}
|
|
349
|
+
|
|
350
|
+
/* Tablas: filetes de 2px */
|
|
351
|
+
[data-slot='table-row'] {
|
|
352
|
+
border-top: 2px solid var(--border);
|
|
353
|
+
}
|
|
354
|
+
[data-slot='table-head'] {
|
|
355
|
+
text-transform: uppercase;
|
|
356
|
+
font-size: 0.75rem;
|
|
357
|
+
letter-spacing: 0.08em;
|
|
358
|
+
font-weight: 700;
|
|
359
|
+
color: var(--muted-foreground);
|
|
360
|
+
}
|
|
361
|
+
|
|
362
|
+
/* Teclas del teclado */
|
|
363
|
+
[data-slot='kbd'] {
|
|
364
|
+
border: 2px solid var(--zw-outline);
|
|
365
|
+
border-bottom-width: 4px;
|
|
366
|
+
border-radius: 8px;
|
|
367
|
+
background: var(--card);
|
|
368
|
+
font-weight: 700;
|
|
369
|
+
}
|
|
370
|
+
|
|
371
|
+
/* ROTULADOR: franja translúcida bajo el título (la mitad inferior de la letra) */
|
|
372
|
+
[data-slot='card-title'],
|
|
373
|
+
[data-slot='dialog-title'],
|
|
374
|
+
[data-slot='sheet-title'],
|
|
375
|
+
header h1 {
|
|
376
|
+
width: fit-content;
|
|
377
|
+
max-width: 100%;
|
|
378
|
+
background: linear-gradient(transparent 56%, var(--zw-mark) 56%);
|
|
379
|
+
padding-inline: 0.14em;
|
|
380
|
+
margin-inline: -0.14em;
|
|
381
|
+
-webkit-box-decoration-break: clone;
|
|
382
|
+
box-decoration-break: clone;
|
|
383
|
+
}
|
|
384
|
+
|
|
385
|
+
/* Sidebar: filas como teclas; la activa, elevada */
|
|
386
|
+
[data-sidebar='menu-button'] {
|
|
387
|
+
border: 2px solid transparent;
|
|
388
|
+
border-radius: 14px;
|
|
389
|
+
font-weight: 600;
|
|
390
|
+
}
|
|
391
|
+
[data-sidebar='menu-button']:hover:not([data-active='true']) {
|
|
392
|
+
background: var(--card);
|
|
393
|
+
}
|
|
394
|
+
[data-sidebar='menu-button'][data-active='true'] {
|
|
395
|
+
background: var(--card);
|
|
396
|
+
border-color: var(--zw-outline);
|
|
397
|
+
border-bottom-width: 5px;
|
|
398
|
+
}
|
|
399
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
# Tema `twitter` — guía de diseño
|
|
2
|
+
|
|
3
|
+
## Esencia
|
|
4
|
+
La interfaz de Twitter anterior a X (rediseño de 2021): plana, de alto contraste, con pocas decoraciones.
|
|
5
|
+
|
|
6
|
+
## Gesto firma
|
|
7
|
+
Separación por **filetes de 1px**, botones en píldora de peso 700, sidebar a ras sin fondo con filas en píldora (la activa en negrita) y pestañas con subrayado de acento.
|
|
8
|
+
|
|
9
|
+
## Principios
|
|
10
|
+
- Sin sombras ni cristal en el contenido.
|
|
11
|
+
- «Menos azul»: la acción más importante puede ir en tinta (negro/blanco).
|
|
12
|
+
- Tarjetas de 16px sin elevación.
|
|
13
|
+
|
|
14
|
+
## Referencias y qué se tomó de cada una
|
|
15
|
+
- **Twitter (2021)**: azul de marca `#1D9BF0` (confirmado), fuente Chirp (confirmada, propietaria), estructura plana y filetes. El resto se tomó de memoria.
|
|
16
|
+
|
|
17
|
+
## Paleta
|
|
18
|
+
- Claro: fondo `#FFFFFF`, texto `#0F1419`, primario `#1D9BF0`, borde `#EFF3F4`.
|
|
19
|
+
- Oscuro («Dim»): fondo `#15202B`, texto `#F7F9F9`.
|
|
20
|
+
|
|
21
|
+
## Tipografía
|
|
22
|
+
Chirp no se puede distribuir: el tema usa la **pila del sistema** como respaldo. No hay fuente que cargar (`twitter.fonts.css` solo lo documenta).
|
|
23
|
+
|
|
24
|
+
## Formas y profundidad
|
|
25
|
+
Radio 16px; sin sombras; filetes 1px.
|
|
26
|
+
|
|
27
|
+
## Qué evita
|
|
28
|
+
Sombras, cristal, elevación en tarjetas.
|
|
29
|
+
|
|
30
|
+
## Accesibilidad
|
|
31
|
+
Azul `#1D9BF0` con texto blanco: contraste limitado (≈3:1); por eso se admite la acción primaria en tinta.
|
|
32
|
+
|
|
33
|
+
## Estado de los valores
|
|
34
|
+
- **Confirmados**: azul `#1D9BF0` y la fuente Chirp.
|
|
35
|
+
- **Aproximados (de memoria)**: grises, bordes y fondos de «Dim»; contrastarlos con una captura de referencia antes de darlos por buenos.
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "twitter",
|
|
3
|
+
"label": "Twitter (2021)",
|
|
4
|
+
"essence": "Plano y de alto contraste: filetes de 1px, píldoras, sin sombras.",
|
|
5
|
+
"signature": ["filetes de 1px", "botones en píldora de peso 700", "sidebar a ras con filas en píldora"],
|
|
6
|
+
"fonts": { "display": "Chirp (sistema como respaldo)", "body": "Chirp (sistema como respaldo)", "file": "twitter.fonts.css", "distributable": false },
|
|
7
|
+
"palette": { "light": { "background": "#FFFFFF", "foreground": "#0F1419", "primary": "#1D9BF0" }, "dark": { "background": "#15202B" } },
|
|
8
|
+
"radii": [16, 999],
|
|
9
|
+
"references": [
|
|
10
|
+
{ "name": "Twitter (2021)", "tookFromIt": "estructura plana, azul de marca, filetes", "source": "memoria; azul y fuente documentados" }
|
|
11
|
+
],
|
|
12
|
+
"status": { "verified": ["azul #1D9BF0", "fuente Chirp"], "approximate": ["grises", "bordes", "fondos de Dim"], "designed": [], "pending": ["contrastar con captura de referencia"] },
|
|
13
|
+
"guide": "twitter.guide.md"
|
|
14
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
# Tema `zyro` — guía de diseño
|
|
2
|
+
|
|
3
|
+
## Esencia
|
|
4
|
+
«Liquid glass»: lavanda claro / azul muy oscuro, con cristal en la navegación y los controles y contenido casi opaco.
|
|
5
|
+
|
|
6
|
+
## Gesto firma
|
|
7
|
+
**Cristal** en sidebar, campos y menús; acción primaria como **píldora con degradado de marca y brillo**; sidebar a ras de borde.
|
|
8
|
+
|
|
9
|
+
## Principios
|
|
10
|
+
- El cristal vive en la capa de navegación y controles; el contenido (tarjetas) se mantiene casi opaco, como indican las guías de cristal.
|
|
11
|
+
- Radio generoso (18px).
|
|
12
|
+
|
|
13
|
+
## Referencias y qué se tomó de cada una
|
|
14
|
+
- **faro-orbital-zyro-ui** (biblioteca interna de Fractalia): paleta, fondo con deriva de color en CSS, cristal y botón primario. El tema es una traducción de ese diseño. La malla animada con shader no está activa (sería un componente opcional).
|
|
15
|
+
|
|
16
|
+
## Paleta
|
|
17
|
+
- Claro: fondo `#EAEEFB`, primario `#0349FE`, texto `rgba(14,22,48,.92)`, tarjeta casi opaca.
|
|
18
|
+
- Oscuro: fondo `#0E3148`, acento cian.
|
|
19
|
+
|
|
20
|
+
## Tipografía
|
|
21
|
+
Titulares **Montserrat**, cuerpo **Roboto** (`zyro.fonts.css`, lo primero del CSS de la app).
|
|
22
|
+
|
|
23
|
+
## Formas y profundidad
|
|
24
|
+
Radio 18px; translucidez y desenfoque en navegación; brillo en el primario.
|
|
25
|
+
|
|
26
|
+
## Qué evita
|
|
27
|
+
Cristal en el contenido principal (afecta a la legibilidad).
|
|
28
|
+
|
|
29
|
+
## Accesibilidad
|
|
30
|
+
Cristal sobre fondos variables exige vigilar el contraste del texto de navegación. Limitación conocida: la sombra de sus botones anula el anillo de foco (corrección prevista).
|
|
31
|
+
|
|
32
|
+
## Estado de los valores
|
|
33
|
+
Traducidos de la biblioteca interna de origen; no contrastados de nuevo en esta versión.
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "zyro",
|
|
3
|
+
"label": "Zyro",
|
|
4
|
+
"essence": "Liquid glass: cristal en navegación y controles, contenido casi opaco.",
|
|
5
|
+
"signature": ["cristal en sidebar, campos y menús", "primario en píldora con degradado y brillo"],
|
|
6
|
+
"fonts": { "display": "Montserrat", "body": "Roboto", "file": "zyro.fonts.css", "distributable": true },
|
|
7
|
+
"palette": { "light": { "background": "#EAEEFB", "foreground": "rgba(14,22,48,0.92)", "primary": "#0349FE" }, "dark": { "background": "#0E3148" } },
|
|
8
|
+
"radii": [18],
|
|
9
|
+
"references": [
|
|
10
|
+
{ "name": "faro-orbital-zyro-ui", "tookFromIt": "paleta, cristal, botón primario, fondo con deriva", "source": "biblioteca interna" }
|
|
11
|
+
],
|
|
12
|
+
"status": { "verified": [], "approximate": [], "designed": [], "pending": ["anillo de foco en botones", "malla animada opcional"] },
|
|
13
|
+
"guide": "zyro.guide.md"
|
|
14
|
+
}
|
package/dist/ui/attachment.d.ts
CHANGED
|
@@ -5,7 +5,7 @@ import { VariantProps } from 'class-variance-authority';
|
|
|
5
5
|
import { Button } from './button.js';
|
|
6
6
|
|
|
7
7
|
declare const attachmentVariants: (props?: ({
|
|
8
|
-
size?: "default" | "
|
|
8
|
+
size?: "default" | "sm" | "xs" | null | undefined;
|
|
9
9
|
orientation?: "horizontal" | "vertical" | null | undefined;
|
|
10
10
|
} & class_variance_authority_types.ClassProp) | undefined) => string;
|
|
11
11
|
declare function Attachment({ className, state, size, orientation, ...props }: React.ComponentProps<"div"> & VariantProps<typeof attachmentVariants> & {
|
package/dist/ui/button.d.ts
CHANGED
|
@@ -5,7 +5,7 @@ import { VariantProps } from 'class-variance-authority';
|
|
|
5
5
|
|
|
6
6
|
declare const buttonVariants: (props?: ({
|
|
7
7
|
variant?: "link" | "default" | "outline" | "secondary" | "ghost" | "destructive" | null | undefined;
|
|
8
|
-
size?: "default" | "
|
|
8
|
+
size?: "default" | "sm" | "xs" | "lg" | "icon" | "icon-xs" | "icon-sm" | "icon-lg" | null | undefined;
|
|
9
9
|
} & class_variance_authority_types.ClassProp) | undefined) => string;
|
|
10
10
|
declare function Button({ className, variant, size, render, nativeButton: _nativeButton, ...props }: useRender.ComponentProps<"button"> & VariantProps<typeof buttonVariants> & {
|
|
11
11
|
nativeButton?: boolean;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import * as class_variance_authority_types from 'class-variance-authority/types';
|
|
2
|
+
import { VariantProps } from 'class-variance-authority';
|
|
3
|
+
import * as React from 'react';
|
|
4
|
+
|
|
5
|
+
declare const iconTileVariants: (props?: ({
|
|
6
|
+
tone?: "neutral" | "primary" | "accent" | "success" | "warning" | "danger" | "info" | null | undefined;
|
|
7
|
+
size?: "sm" | "lg" | "md" | null | undefined;
|
|
8
|
+
} & class_variance_authority_types.ClassProp) | undefined) => string;
|
|
9
|
+
declare function IconTile({ className, tone, size, ...props }: React.ComponentProps<"div"> & VariantProps<typeof iconTileVariants>): React.JSX.Element;
|
|
10
|
+
|
|
11
|
+
export { IconTile, iconTileVariants };
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { jsx } from "react/jsx-runtime";
|
|
2
|
+
import { cva } from "class-variance-authority";
|
|
3
|
+
import { cn } from "../lib/utils";
|
|
4
|
+
const iconTileVariants = cva(
|
|
5
|
+
"inline-flex shrink-0 items-center justify-center rounded-(--ds-icon-tile-radius) [&>svg]:size-1/2",
|
|
6
|
+
{
|
|
7
|
+
variants: {
|
|
8
|
+
tone: {
|
|
9
|
+
neutral: "bg-muted text-foreground",
|
|
10
|
+
primary: "bg-primary text-primary-foreground",
|
|
11
|
+
accent: "bg-accent text-accent-foreground",
|
|
12
|
+
success: "bg-success-soft text-success",
|
|
13
|
+
warning: "bg-warning-soft text-warning",
|
|
14
|
+
danger: "bg-danger-soft text-danger",
|
|
15
|
+
info: "bg-info-soft text-info"
|
|
16
|
+
},
|
|
17
|
+
size: {
|
|
18
|
+
sm: "size-(--ds-icon-tile-sm)",
|
|
19
|
+
md: "size-(--ds-icon-tile-md)",
|
|
20
|
+
lg: "size-(--ds-icon-tile-lg)"
|
|
21
|
+
}
|
|
22
|
+
},
|
|
23
|
+
defaultVariants: { tone: "accent", size: "md" }
|
|
24
|
+
}
|
|
25
|
+
);
|
|
26
|
+
function IconTile({
|
|
27
|
+
className,
|
|
28
|
+
tone,
|
|
29
|
+
size,
|
|
30
|
+
...props
|
|
31
|
+
}) {
|
|
32
|
+
return /* @__PURE__ */ jsx(
|
|
33
|
+
"div",
|
|
34
|
+
{
|
|
35
|
+
"data-slot": "icon-tile",
|
|
36
|
+
"data-tone": tone ?? "accent",
|
|
37
|
+
"data-size": size ?? "md",
|
|
38
|
+
"aria-hidden": "true",
|
|
39
|
+
className: cn(iconTileVariants({ tone, size }), className),
|
|
40
|
+
...props
|
|
41
|
+
}
|
|
42
|
+
);
|
|
43
|
+
}
|
|
44
|
+
export {
|
|
45
|
+
IconTile,
|
|
46
|
+
iconTileVariants
|
|
47
|
+
};
|
package/dist/ui/input-group.d.ts
CHANGED
|
@@ -10,7 +10,7 @@ declare const inputGroupAddonVariants: (props?: ({
|
|
|
10
10
|
} & class_variance_authority_types.ClassProp) | undefined) => string;
|
|
11
11
|
declare function InputGroupAddon({ className, align, ...props }: React.ComponentProps<"div"> & VariantProps<typeof inputGroupAddonVariants>): React.JSX.Element;
|
|
12
12
|
declare const inputGroupButtonVariants: (props?: ({
|
|
13
|
-
size?: "
|
|
13
|
+
size?: "sm" | "xs" | "icon-xs" | "icon-sm" | null | undefined;
|
|
14
14
|
} & class_variance_authority_types.ClassProp) | undefined) => string;
|
|
15
15
|
declare function InputGroupButton({ className, type, variant, size, ...props }: Omit<React.ComponentProps<typeof Button>, "size" | "type"> & VariantProps<typeof inputGroupButtonVariants> & {
|
|
16
16
|
type?: "button" | "submit" | "reset";
|
package/dist/ui/item.d.ts
CHANGED
|
@@ -9,7 +9,7 @@ declare function ItemGroup({ className, ...props }: React.ComponentProps<"div">)
|
|
|
9
9
|
declare function ItemSeparator({ className, ...props }: React.ComponentProps<typeof Separator>): React.JSX.Element;
|
|
10
10
|
declare const itemVariants: (props?: ({
|
|
11
11
|
variant?: "default" | "outline" | "muted" | null | undefined;
|
|
12
|
-
size?: "default" | "
|
|
12
|
+
size?: "default" | "sm" | "xs" | null | undefined;
|
|
13
13
|
} & class_variance_authority_types.ClassProp) | undefined) => string;
|
|
14
14
|
declare function Item({ className, variant, size, render, ...props }: useRender.ComponentProps<"div"> & VariantProps<typeof itemVariants>): React.ReactElement<unknown, string | React.JSXElementConstructor<any>>;
|
|
15
15
|
declare const itemMediaVariants: (props?: ({
|
package/dist/ui/marker.d.ts
CHANGED
|
@@ -4,7 +4,7 @@ import { useRender } from '@base-ui/react/use-render';
|
|
|
4
4
|
import { VariantProps } from 'class-variance-authority';
|
|
5
5
|
|
|
6
6
|
declare const markerVariants: (props?: ({
|
|
7
|
-
variant?: "
|
|
7
|
+
variant?: "default" | "separator" | "border" | null | undefined;
|
|
8
8
|
} & class_variance_authority_types.ClassProp) | undefined) => string;
|
|
9
9
|
declare function Marker({ className, variant, render, ...props }: useRender.ComponentProps<"div"> & VariantProps<typeof markerVariants>): React.ReactElement<unknown, string | React.JSXElementConstructor<any>>;
|
|
10
10
|
declare function MarkerIcon({ className, ...props }: React.ComponentProps<"span">): React.JSX.Element;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "orbital-ds",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.6.0",
|
|
4
4
|
"description": "Sistema de diseño genérico: estructura común + temas con personalidad (qratia, zyro) + ~60 componentes sobre Base UI y Tailwind v4, con contrato verificable y legible por agentes.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"design-system",
|
|
@@ -31,6 +31,8 @@
|
|
|
31
31
|
"exports": {
|
|
32
32
|
"./styles.css": "./dist/styles.css",
|
|
33
33
|
"./themes/*.css": "./dist/themes/*.css",
|
|
34
|
+
"./themes/*.md": "./dist/themes/*.md",
|
|
35
|
+
"./themes/*.meta.json": "./dist/themes/*.meta.json",
|
|
34
36
|
"./ui/*": {
|
|
35
37
|
"types": "./dist/ui/*.d.ts",
|
|
36
38
|
"import": "./dist/ui/*.js"
|