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.
@@ -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 {
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
+ .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 {
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,2 @@
1
+ /* Fuentes del tema tactile: Fraunces (titulares) + Figtree (cuerpo). Importar la PRIMERA del CSS de la app. */
2
+ @import url('https://fonts.googleapis.com/css2?family=Fraunces:opsz,wght@9..144,600..800&family=Figtree:wght@400;500;600;700&display=swap');
@@ -0,0 +1,49 @@
1
+ # Tema `tactile` — guía de diseño
2
+
3
+ ## Esencia
4
+ Una interfaz que se **toca**: papel cálido, tinta oscura y un rotulador. Pensada para SaaS que quieren sentirse cercanos y con humor, sin el aspecto genérico de «app de IA» (degradado índigo, Inter, tarjetas idénticas, brillos).
5
+
6
+ ## Gesto firma
7
+ 1. **Tecla**: todo lo que se pulsa lleva contorno de tinta de 2px y una arista inferior de 5px que **baja al pulsar** (la pieza se hunde).
8
+ 2. **Rotulador**: una banda mostaza translúcida bajo los títulos (`card-title`, `dialog-title`, `sheet-title`, título de página).
9
+
10
+ ## Principios
11
+ - Lo accionable se distingue de lo informativo por **materia**, no solo por color: lo pulsable tiene arista; lo demás, filete suave.
12
+ - Sin sombras difusas: la profundidad la dan las aristas.
13
+ - Un acento vivo (mostaza) y uno pequeño (pino). Nunca negro puro: tinta berenjena.
14
+ - Formas con jerarquía: 8 · 12 · 14 · 16 (no un único radio para todo).
15
+ - Carácter barato y reutilizable: baldosa de icono (`IconTile`) con tono, en vez de ilustraciones.
16
+
17
+ ## Referencias y qué se tomó de cada una
18
+ Dirección **original**; no copia ninguna. Se tomó un principio de cada una:
19
+ - **Duolingo** (según fuentes de terceros): la arista inferior que baja al pulsar.
20
+ - **Endorsal** (analizada en navegador): títulos con rotulador de color al 25%, iconos duotono, filas con arista inferior.
21
+ - **SerpWatch** (analizada en navegador): lienzo no blanco y sombras teñidas; aquí se sustituyen por papel y aristas.
22
+ - **Reglas anti-IA** (síntesis propia): evitar degradado morado-índigo, Inter por defecto, un único radio, brillos decorativos, bordes de color en un solo lado.
23
+
24
+ ## Paleta
25
+ Dos pieles. Valores de diseño, no medidos contra una referencia externa.
26
+ - **Papel (claro)**: fondo `#F6F0E3`, tarjeta `#FFFCF4`, tinta `#2A2233`, primario mostaza `#F2B33D` con texto de tinta, pino `#17624F`, tomate `#B53A22`, cielo `#2F6FB0`.
27
+ - **Noche**: fondo `#1D1824` con las mismas familias aclaradas.
28
+ - Variante **índigo** (en estudio, no incluida en el paquete): tinta `#232450`, papel `#F4F5FB`, primario `#4B5BBF`, marcador naranja `#FBB232`.
29
+
30
+ ## Tipografía
31
+ - Titulares: **Fraunces** (serifa suave con carácter; evita la sans de moda).
32
+ - Cuerpo: **Figtree** (legible, ligeramente humanista).
33
+ - Fuentes en `tactile.fonts.css`: debe ser lo **primero** del CSS de la app.
34
+
35
+ ## Formas y profundidad
36
+ Radios 8 · 12 · 14 · 16. Arista inferior 5px (4px en controles pequeños) que baja a 2px al pulsar. Filetes de 2px.
37
+
38
+ ## Qué evita
39
+ Sombras difusas, brillos, degradados decorativos, iconos grises sin carácter, mismo radio en todo, bordes de color en un solo lado.
40
+
41
+ ## Qué hace
42
+ Teclas con arista, rotulador bajo títulos, baldosas de icono con tono, sidebar a ras con la fila activa como tecla pulsada.
43
+
44
+ ## Accesibilidad
45
+ Texto de tinta sobre mostaza: contraste ≈ 10:1. El foco usa un anillo propio de 3px. Las aristas no sustituyen al texto del estado.
46
+
47
+ ## Estado de los valores
48
+ - **Diseño propio**: todos los de este tema; ninguno proviene de una referencia medida.
49
+ - **Pendiente**: validar la piel noche con captura en pantalla real y la variante índigo.
@@ -0,0 +1,16 @@
1
+ {
2
+ "name": "tactile",
3
+ "label": "Táctil",
4
+ "essence": "Interfaz de papel y tinta que se toca: teclas con arista y rotulador bajo los títulos.",
5
+ "signature": ["tecla con arista inferior que baja al pulsar", "rotulador bajo los títulos"],
6
+ "fonts": { "display": "Fraunces", "body": "Figtree", "file": "tactile.fonts.css", "distributable": true },
7
+ "palette": { "light": { "background": "#F6F0E3", "foreground": "#2A2233", "primary": "#F2B33D" }, "dark": { "background": "#1D1824" } },
8
+ "radii": [8, 12, 14, 16],
9
+ "references": [
10
+ { "name": "Duolingo", "tookFromIt": "arista inferior que baja al pulsar", "source": "fuentes de terceros" },
11
+ { "name": "Endorsal", "tookFromIt": "rotulador bajo títulos, iconos duotono", "source": "análisis en navegador" },
12
+ { "name": "SerpWatch", "tookFromIt": "lienzo no blanco", "source": "análisis en navegador" }
13
+ ],
14
+ "status": { "verified": [], "approximate": [], "designed": ["todos los valores"], "pending": ["piel noche con captura real", "variante índigo"] },
15
+ "guide": "tactile.guide.md"
16
+ }