orbital-ds 0.6.0 → 0.7.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.
@@ -21,6 +21,14 @@
21
21
  --ds-font-sans: 'Figtree', system-ui, -apple-system, 'Segoe UI', Roboto, sans-serif;
22
22
  --ds-font-display: 'Fraunces', Georgia, 'Times New Roman', serif;
23
23
  --ds-font-mono: ui-monospace, 'SF Mono', Menlo, monospace;
24
+
25
+ /* Lateral: iconos, raíl, logo y separadores (cada tema fija su forma y tamaño) */
26
+ --ds-sidebar-icon: 1.5rem;
27
+ --ds-sidebar-icon-stroke: 2.1;
28
+ --ds-sidebar-rail-w: 5rem;
29
+ --ds-sidebar-rail-item: 3rem;
30
+ --ds-sidebar-logo: 2.5rem;
31
+ --ds-sidebar-sep-inset: -0.5rem;
24
32
  --ds-heading-tracking: -0.01em;
25
33
 
26
34
  --background: #f6f0e3;
@@ -37,7 +45,7 @@
37
45
  --secondary-foreground: #2a2233;
38
46
  --muted: #ede3cd;
39
47
  --muted-foreground: rgba(42, 34, 51, 0.7);
40
- --accent: rgba(242, 179, 61, 0.3);
48
+ --accent: color-mix(in srgb, var(--primary) 30%, transparent);
41
49
  --accent-foreground: #2a2233;
42
50
  --destructive: #b53a22;
43
51
  --destructive-foreground: #fffcf4;
@@ -61,13 +69,13 @@
61
69
  --sidebar-border: rgba(42, 34, 51, 0.26);
62
70
  --sidebar-ring: #17624f;
63
71
 
64
- --danger: #b53a22;
72
+ --danger: #ae3821;
65
73
  --danger-soft: rgba(214, 69, 43, 0.13);
66
74
  --warning: #7a5200;
67
75
  --warning-soft: rgba(242, 179, 61, 0.3);
68
76
  --success: #17624f;
69
77
  --success-soft: rgba(23, 98, 79, 0.12);
70
- --info: #2f6fb0;
78
+ --info: #2a649e;
71
79
  --info-soft: rgba(47, 111, 176, 0.12);
72
80
  --neutral: rgba(42, 34, 51, 0.72);
73
81
  --neutral-soft: rgba(42, 34, 51, 0.08);
@@ -121,7 +129,7 @@
121
129
  --ds-sidebar-ring: 0px;
122
130
  --ds-sidebar-edge: 2px solid var(--sidebar-border);
123
131
  --ds-sidebar-item-radius: 14px;
124
- --ds-sidebar-item-h: 2.75rem;
132
+ --ds-sidebar-item-h: 3rem;
125
133
 
126
134
  /* Baldosas de icono: grandes, tintadas y con relleno duotono suave */
127
135
  --ds-icon-tile-sm: 2.25rem;
@@ -133,7 +141,7 @@
133
141
  /* Privadas de tactile */
134
142
  --zw-outline: #2a2233;
135
143
  --zw-edge: rgba(42, 34, 51, 0.26);
136
- --zw-mark: rgba(242, 179, 61, 0.62);
144
+ --zw-mark: color-mix(in srgb, var(--primary) 62%, transparent);
137
145
  }
138
146
 
139
147
  /* ── VARIABLES · PIEL OSCURA («noche») ───────────────────────────────────── */
@@ -152,7 +160,7 @@
152
160
  --secondary-foreground: #f4ebda;
153
161
  --muted: #25202e;
154
162
  --muted-foreground: rgba(244, 235, 218, 0.72);
155
- --accent: rgba(242, 179, 61, 0.18);
163
+ --accent: color-mix(in srgb, var(--primary) 18%, transparent);
156
164
  --accent-foreground: #f7c566;
157
165
  --destructive: #ff8266;
158
166
  --destructive-foreground: #1d1824;
@@ -199,7 +207,7 @@
199
207
 
200
208
  --zw-outline: rgba(244, 235, 218, 0.92);
201
209
  --zw-edge: rgba(244, 235, 218, 0.26);
202
- --zw-mark: rgba(242, 179, 61, 0.45);
210
+ --zw-mark: color-mix(in srgb, var(--primary) 45%, transparent);
203
211
  }
204
212
 
205
213
  /* ── PERSONALIDAD ────────────────────────────────────────────────────────────
@@ -382,18 +390,40 @@
382
390
  box-decoration-break: clone;
383
391
  }
384
392
 
385
- /* Sidebar: filas como teclas; la activa, elevada */
393
+ /* Sidebar: filas como teclas */
386
394
  [data-sidebar='menu-button'] {
387
395
  border: 2px solid transparent;
388
396
  border-radius: 14px;
389
397
  font-weight: 600;
398
+ font-size: 1rem;
390
399
  }
400
+ /* Señalada: la tecla se asoma (papel de tarjeta, contorno de tinta y arista); pulsada, se hunde */
391
401
  [data-sidebar='menu-button']:hover:not([data-active='true']) {
392
402
  background: var(--card);
403
+ border-color: var(--zw-outline);
404
+ border-bottom-width: 4px;
393
405
  }
406
+ [data-sidebar='menu-button']:active:not([data-active='true']) {
407
+ border-bottom-width: 2px;
408
+ transform: translateY(2px);
409
+ }
410
+ /* Activa: la tecla pulsada y rellena con el color principal */
394
411
  [data-sidebar='menu-button'][data-active='true'] {
395
- background: var(--card);
412
+ background: var(--primary);
413
+ color: var(--primary-foreground);
396
414
  border-color: var(--zw-outline);
397
415
  border-bottom-width: 5px;
398
416
  }
417
+ /* Tooltips: etiqueta de tinta con arista inferior, como una tecla invertida */
418
+ [data-slot='tooltip-content'] {
419
+ background: var(--foreground);
420
+ color: var(--background);
421
+ border-radius: 12px;
422
+ border-bottom: 4px solid var(--zw-edge);
423
+ font-weight: 700;
424
+ }
425
+ /* Sin flecha: un rombo de tinta tapaba la primera letra de la etiqueta */
426
+ [data-slot='tooltip-arrow'] {
427
+ display: none;
428
+ }
399
429
  }
@@ -15,12 +15,20 @@
15
15
  */
16
16
 
17
17
  /* ── VARIABLES · PIEL CLARA («papel») ────────────────────────────────────── */
18
- :root[data-theme='tactile'] {
18
+ :root:where([data-theme='tactile']) {
19
19
  --radius: 16px;
20
20
 
21
21
  --ds-font-sans: 'Figtree', system-ui, -apple-system, 'Segoe UI', Roboto, sans-serif;
22
22
  --ds-font-display: 'Fraunces', Georgia, 'Times New Roman', serif;
23
23
  --ds-font-mono: ui-monospace, 'SF Mono', Menlo, monospace;
24
+
25
+ /* Lateral: iconos, raíl, logo y separadores (cada tema fija su forma y tamaño) */
26
+ --ds-sidebar-icon: 1.5rem;
27
+ --ds-sidebar-icon-stroke: 2.1;
28
+ --ds-sidebar-rail-w: 5rem;
29
+ --ds-sidebar-rail-item: 3rem;
30
+ --ds-sidebar-logo: 2.5rem;
31
+ --ds-sidebar-sep-inset: -0.5rem;
24
32
  --ds-heading-tracking: -0.01em;
25
33
 
26
34
  --background: #f6f0e3;
@@ -37,7 +45,7 @@
37
45
  --secondary-foreground: #2a2233;
38
46
  --muted: #ede3cd;
39
47
  --muted-foreground: rgba(42, 34, 51, 0.7);
40
- --accent: rgba(242, 179, 61, 0.3);
48
+ --accent: color-mix(in srgb, var(--primary) 30%, transparent);
41
49
  --accent-foreground: #2a2233;
42
50
  --destructive: #b53a22;
43
51
  --destructive-foreground: #fffcf4;
@@ -61,13 +69,13 @@
61
69
  --sidebar-border: rgba(42, 34, 51, 0.26);
62
70
  --sidebar-ring: #17624f;
63
71
 
64
- --danger: #b53a22;
72
+ --danger: #ae3821;
65
73
  --danger-soft: rgba(214, 69, 43, 0.13);
66
74
  --warning: #7a5200;
67
75
  --warning-soft: rgba(242, 179, 61, 0.3);
68
76
  --success: #17624f;
69
77
  --success-soft: rgba(23, 98, 79, 0.12);
70
- --info: #2f6fb0;
78
+ --info: #2a649e;
71
79
  --info-soft: rgba(47, 111, 176, 0.12);
72
80
  --neutral: rgba(42, 34, 51, 0.72);
73
81
  --neutral-soft: rgba(42, 34, 51, 0.08);
@@ -121,7 +129,7 @@
121
129
  --ds-sidebar-ring: 0px;
122
130
  --ds-sidebar-edge: 2px solid var(--sidebar-border);
123
131
  --ds-sidebar-item-radius: 14px;
124
- --ds-sidebar-item-h: 2.75rem;
132
+ --ds-sidebar-item-h: 3rem;
125
133
 
126
134
  /* Baldosas de icono: grandes, tintadas y con relleno duotono suave */
127
135
  --ds-icon-tile-sm: 2.25rem;
@@ -133,11 +141,11 @@
133
141
  /* Privadas de tactile */
134
142
  --zw-outline: #2a2233;
135
143
  --zw-edge: rgba(42, 34, 51, 0.26);
136
- --zw-mark: rgba(242, 179, 61, 0.62);
144
+ --zw-mark: color-mix(in srgb, var(--primary) 62%, transparent);
137
145
  }
138
146
 
139
147
  /* ── VARIABLES · PIEL OSCURA («noche») ───────────────────────────────────── */
140
- :root[data-theme='tactile'].dark {
148
+ :where(:root[data-theme='tactile']).dark {
141
149
  --background: #1d1824;
142
150
  --foreground: #f4ebda;
143
151
 
@@ -152,7 +160,7 @@
152
160
  --secondary-foreground: #f4ebda;
153
161
  --muted: #25202e;
154
162
  --muted-foreground: rgba(244, 235, 218, 0.72);
155
- --accent: rgba(242, 179, 61, 0.18);
163
+ --accent: color-mix(in srgb, var(--primary) 18%, transparent);
156
164
  --accent-foreground: #f7c566;
157
165
  --destructive: #ff8266;
158
166
  --destructive-foreground: #1d1824;
@@ -199,14 +207,14 @@
199
207
 
200
208
  --zw-outline: rgba(244, 235, 218, 0.92);
201
209
  --zw-edge: rgba(244, 235, 218, 0.26);
202
- --zw-mark: rgba(242, 179, 61, 0.45);
210
+ --zw-mark: color-mix(in srgb, var(--primary) 45%, transparent);
203
211
  }
204
212
 
205
213
  /* ── PERSONALIDAD ────────────────────────────────────────────────────────────
206
214
  * Sin capa: gana a las utilidades de los componentes. Solo variables. No usa
207
215
  * box-shadow en los controles, así el anillo de foco sigue funcionando.
208
216
  */
209
- :root[data-theme='tactile'] {
217
+ :root:where([data-theme='tactile']) {
210
218
  /* Teclas: contorno de tinta y arista inferior; al pulsar, se hunden */
211
219
  [data-slot='button'] {
212
220
  border: 2px solid var(--zw-outline);
@@ -382,18 +390,40 @@
382
390
  box-decoration-break: clone;
383
391
  }
384
392
 
385
- /* Sidebar: filas como teclas; la activa, elevada */
393
+ /* Sidebar: filas como teclas */
386
394
  [data-sidebar='menu-button'] {
387
395
  border: 2px solid transparent;
388
396
  border-radius: 14px;
389
397
  font-weight: 600;
398
+ font-size: 1rem;
390
399
  }
400
+ /* Señalada: la tecla se asoma (papel de tarjeta, contorno de tinta y arista); pulsada, se hunde */
391
401
  [data-sidebar='menu-button']:hover:not([data-active='true']) {
392
402
  background: var(--card);
403
+ border-color: var(--zw-outline);
404
+ border-bottom-width: 4px;
393
405
  }
406
+ [data-sidebar='menu-button']:active:not([data-active='true']) {
407
+ border-bottom-width: 2px;
408
+ transform: translateY(2px);
409
+ }
410
+ /* Activa: la tecla pulsada y rellena con el color principal */
394
411
  [data-sidebar='menu-button'][data-active='true'] {
395
- background: var(--card);
412
+ background: var(--primary);
413
+ color: var(--primary-foreground);
396
414
  border-color: var(--zw-outline);
397
415
  border-bottom-width: 5px;
398
416
  }
417
+ /* Tooltips: etiqueta de tinta con arista inferior, como una tecla invertida */
418
+ [data-slot='tooltip-content'] {
419
+ background: var(--foreground);
420
+ color: var(--background);
421
+ border-radius: 12px;
422
+ border-bottom: 4px solid var(--zw-edge);
423
+ font-weight: 700;
424
+ }
425
+ /* Sin flecha: un rombo de tinta tapaba la primera letra de la etiqueta */
426
+ [data-slot='tooltip-arrow'] {
427
+ display: none;
428
+ }
399
429
  }
@@ -22,6 +22,14 @@
22
22
  --ds-font-sans: 'Chirp', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif;
23
23
  --ds-font-display: var(--ds-font-sans);
24
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;
25
33
  --ds-heading-tracking: normal;
26
34
 
27
35
  /* Color */
@@ -41,7 +49,7 @@
41
49
  --muted-foreground: #536471;
42
50
  --accent: rgba(29, 155, 240, 0.1);
43
51
  --accent-foreground: #1a8cd8;
44
- --destructive: #f4212e;
52
+ --destructive: #e51f2b;
45
53
  --destructive-foreground: #ffffff;
46
54
 
47
55
  --border: #eff3f4;
@@ -67,9 +75,9 @@
67
75
  --danger-soft: rgba(244, 33, 46, 0.1);
68
76
  --warning: #8a6d00;
69
77
  --warning-soft: rgba(255, 212, 0, 0.2);
70
- --success: #00875a;
78
+ --success: #007c53;
71
79
  --success-soft: rgba(0, 186, 124, 0.12);
72
- --info: #1a8cd8;
80
+ --info: #1573b1;
73
81
  --info-soft: rgba(29, 155, 240, 0.1);
74
82
  --neutral: #536471;
75
83
  --neutral-soft: #eff3f4;
@@ -151,7 +159,7 @@
151
159
  --muted-foreground: #8b98a5;
152
160
  --accent: rgba(29, 155, 240, 0.15);
153
161
  --accent-foreground: #4db3f5;
154
- --destructive: #f4212e;
162
+ --destructive: #e51f2b;
155
163
  --destructive-foreground: #ffffff;
156
164
 
157
165
  --border: #38444d;
@@ -2,13 +2,60 @@
2
2
  "name": "twitter",
3
3
  "label": "Twitter (2021)",
4
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],
5
+ "signature": [
6
+ "filetes de 1px",
7
+ "botones en píldora de peso 700",
8
+ "sidebar a ras con filas en píldora"
9
+ ],
10
+ "fonts": {
11
+ "display": "Chirp (sistema como respaldo)",
12
+ "body": "Chirp (sistema como respaldo)",
13
+ "file": "twitter.fonts.css",
14
+ "distributable": false
15
+ },
16
+ "palette": {
17
+ "light": {
18
+ "background": "#FFFFFF",
19
+ "foreground": "#0F1419",
20
+ "primary": "#1D9BF0"
21
+ },
22
+ "dark": {
23
+ "background": "#15202B"
24
+ }
25
+ },
26
+ "radii": [
27
+ 16,
28
+ 999
29
+ ],
9
30
  "references": [
10
- { "name": "Twitter (2021)", "tookFromIt": "estructura plana, azul de marca, filetes", "source": "memoria; azul y fuente documentados" }
31
+ {
32
+ "name": "Twitter (2021)",
33
+ "tookFromIt": "estructura plana, azul de marca, filetes",
34
+ "source": "memoria; azul y fuente documentados"
35
+ }
11
36
  ],
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"
37
+ "status": {
38
+ "verified": [
39
+ "azul #1D9BF0",
40
+ "fuente Chirp"
41
+ ],
42
+ "approximate": [
43
+ "grises",
44
+ "bordes",
45
+ "fondos de Dim"
46
+ ],
47
+ "designed": [],
48
+ "pending": [
49
+ "contrastar con captura de referencia"
50
+ ]
51
+ },
52
+ "guide": "twitter.guide.md",
53
+ "a11y": {
54
+ "level": "AA",
55
+ "exceptions": [
56
+ "primary-foreground/primary",
57
+ "sidebar-primary-foreground/sidebar-primary"
58
+ ],
59
+ "note": "El azul de marca confirmado (#1D9BF0) con texto blanco da 3:1; la acción primaria puede ir en tinta."
60
+ }
14
61
  }
@@ -16,12 +16,20 @@
16
16
  */
17
17
 
18
18
  /* ── VARIABLES · PIEL CLARA ──────────────────────────────────────────────── */
19
- :root[data-theme='twitter'] {
19
+ :root:where([data-theme='twitter']) {
20
20
  --radius: 16px;
21
21
 
22
22
  --ds-font-sans: 'Chirp', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif;
23
23
  --ds-font-display: var(--ds-font-sans);
24
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;
25
33
  --ds-heading-tracking: normal;
26
34
 
27
35
  /* Color */
@@ -41,7 +49,7 @@
41
49
  --muted-foreground: #536471;
42
50
  --accent: rgba(29, 155, 240, 0.1);
43
51
  --accent-foreground: #1a8cd8;
44
- --destructive: #f4212e;
52
+ --destructive: #e51f2b;
45
53
  --destructive-foreground: #ffffff;
46
54
 
47
55
  --border: #eff3f4;
@@ -67,9 +75,9 @@
67
75
  --danger-soft: rgba(244, 33, 46, 0.1);
68
76
  --warning: #8a6d00;
69
77
  --warning-soft: rgba(255, 212, 0, 0.2);
70
- --success: #00875a;
78
+ --success: #007c53;
71
79
  --success-soft: rgba(0, 186, 124, 0.12);
72
- --info: #1a8cd8;
80
+ --info: #1573b1;
73
81
  --info-soft: rgba(29, 155, 240, 0.1);
74
82
  --neutral: #536471;
75
83
  --neutral-soft: #eff3f4;
@@ -134,7 +142,7 @@
134
142
  }
135
143
 
136
144
  /* ── VARIABLES · PIEL OSCURA («Dim») ─────────────────────────────────────── */
137
- :root[data-theme='twitter'].dark {
145
+ :where(:root[data-theme='twitter']).dark {
138
146
  --background: #15202b;
139
147
  --foreground: #f7f9f9;
140
148
 
@@ -151,7 +159,7 @@
151
159
  --muted-foreground: #8b98a5;
152
160
  --accent: rgba(29, 155, 240, 0.15);
153
161
  --accent-foreground: #4db3f5;
154
- --destructive: #f4212e;
162
+ --destructive: #e51f2b;
155
163
  --destructive-foreground: #ffffff;
156
164
 
157
165
  --border: #38444d;
@@ -198,7 +206,7 @@
198
206
  /* ── PERSONALIDAD ────────────────────────────────────────────────────────────
199
207
  * Sin capa: gana a las utilidades de los componentes. Solo variables.
200
208
  */
201
- :root[data-theme='twitter'] {
209
+ :root:where([data-theme='twitter']) {
202
210
  /* Botones: píldora en peso 700; primario en azul; contorno con filete */
203
211
  [data-slot='button'] {
204
212
  border-radius: 9999px;
@@ -26,6 +26,14 @@
26
26
  --ds-font-sans: 'Roboto', system-ui, -apple-system, sans-serif;
27
27
  --ds-font-display: 'Montserrat', system-ui, -apple-system, sans-serif;
28
28
  --ds-font-mono: ui-monospace, 'SF Mono', Menlo, monospace;
29
+
30
+ /* Lateral: iconos, raíl, logo y separadores (cada tema fija su forma y tamaño) */
31
+ --ds-sidebar-icon: 1.25rem;
32
+ --ds-sidebar-icon-stroke: 2;
33
+ --ds-sidebar-rail-w: 4.5rem;
34
+ --ds-sidebar-rail-item: 2.75rem;
35
+ --ds-sidebar-logo: 2.25rem;
36
+ --ds-sidebar-sep-inset: 0rem;
29
37
  --ds-heading-tracking: -0.01em;
30
38
 
31
39
  /* Color */
@@ -45,7 +53,7 @@
45
53
  --muted-foreground: rgba(14, 22, 48, 0.66);
46
54
  --accent: rgba(3, 73, 254, 0.09);
47
55
  --accent-foreground: #0349fe;
48
- --destructive: #eb1919;
56
+ --destructive: #e61919;
49
57
  --destructive-foreground: #ffffff;
50
58
 
51
59
  --border: rgba(168, 190, 235, 0.3);
@@ -69,13 +77,13 @@
69
77
 
70
78
  --danger: #c21414;
71
79
  --danger-soft: rgba(235, 25, 25, 0.1);
72
- --warning: #9a6e00;
80
+ --warning: #845f00;
73
81
  --warning-soft: rgba(255, 179, 0, 0.16);
74
- --success: #0e8f34;
82
+ --success: #0b742a;
75
83
  --success-soft: rgba(20, 189, 68, 0.12);
76
- --info: #136ba8;
84
+ --info: #1267a1;
77
85
  --info-soft: rgba(42, 147, 213, 0.12);
78
- --neutral: rgba(14, 22, 48, 0.6);
86
+ --neutral: rgba(14, 22, 48, 0.63);
79
87
  --neutral-soft: rgba(14, 22, 48, 0.06);
80
88
 
81
89
  --link: #0349fe;
@@ -164,7 +172,7 @@
164
172
  --muted-foreground: rgba(255, 255, 255, 0.68);
165
173
  --accent: rgba(54, 179, 237, 0.16);
166
174
  --accent-foreground: #36b3ed;
167
- --destructive: #eb1919;
175
+ --destructive: #e61919;
168
176
  --destructive-foreground: #ffffff;
169
177
 
170
178
  --border: rgba(255, 255, 255, 0.07);
@@ -190,9 +198,9 @@
190
198
  --danger-soft: rgba(235, 25, 25, 0.2);
191
199
  --warning: #ffb300;
192
200
  --warning-soft: rgba(255, 179, 0, 0.18);
193
- --success: #14bd44;
201
+ --success: #3cc864;
194
202
  --success-soft: rgba(20, 189, 68, 0.18);
195
- --info: #2a93d5;
203
+ --info: #70b7e3;
196
204
  --info-soft: rgba(42, 147, 213, 0.2);
197
205
  --neutral: rgba(255, 255, 255, 0.6);
198
206
  --neutral-soft: rgba(255, 255, 255, 0.08);
@@ -19,13 +19,21 @@
19
19
  */
20
20
 
21
21
  /* ── 1. VARIABLES · PIEL CLARA ───────────────────────────────────────────── */
22
- :root[data-theme='zyro'] {
22
+ :root:where([data-theme='zyro']) {
23
23
  --radius: 18px;
24
24
 
25
25
  /* Tipografía: Montserrat (titulares) + Roboto (cuerpo) */
26
26
  --ds-font-sans: 'Roboto', system-ui, -apple-system, sans-serif;
27
27
  --ds-font-display: 'Montserrat', system-ui, -apple-system, sans-serif;
28
28
  --ds-font-mono: ui-monospace, 'SF Mono', Menlo, monospace;
29
+
30
+ /* Lateral: iconos, raíl, logo y separadores (cada tema fija su forma y tamaño) */
31
+ --ds-sidebar-icon: 1.25rem;
32
+ --ds-sidebar-icon-stroke: 2;
33
+ --ds-sidebar-rail-w: 4.5rem;
34
+ --ds-sidebar-rail-item: 2.75rem;
35
+ --ds-sidebar-logo: 2.25rem;
36
+ --ds-sidebar-sep-inset: 0rem;
29
37
  --ds-heading-tracking: -0.01em;
30
38
 
31
39
  /* Color */
@@ -45,7 +53,7 @@
45
53
  --muted-foreground: rgba(14, 22, 48, 0.66);
46
54
  --accent: rgba(3, 73, 254, 0.09);
47
55
  --accent-foreground: #0349fe;
48
- --destructive: #eb1919;
56
+ --destructive: #e61919;
49
57
  --destructive-foreground: #ffffff;
50
58
 
51
59
  --border: rgba(168, 190, 235, 0.3);
@@ -69,13 +77,13 @@
69
77
 
70
78
  --danger: #c21414;
71
79
  --danger-soft: rgba(235, 25, 25, 0.1);
72
- --warning: #9a6e00;
80
+ --warning: #845f00;
73
81
  --warning-soft: rgba(255, 179, 0, 0.16);
74
- --success: #0e8f34;
82
+ --success: #0b742a;
75
83
  --success-soft: rgba(20, 189, 68, 0.12);
76
- --info: #136ba8;
84
+ --info: #1267a1;
77
85
  --info-soft: rgba(42, 147, 213, 0.12);
78
- --neutral: rgba(14, 22, 48, 0.6);
86
+ --neutral: rgba(14, 22, 48, 0.63);
79
87
  --neutral-soft: rgba(14, 22, 48, 0.06);
80
88
 
81
89
  --link: #0349fe;
@@ -147,7 +155,7 @@
147
155
  }
148
156
 
149
157
  /* ── 1b. VARIABLES · PIEL OSCURA ─────────────────────────────────────────── */
150
- :root[data-theme='zyro'].dark {
158
+ :where(:root[data-theme='zyro']).dark {
151
159
  --background: #0e3148;
152
160
  --foreground: rgba(255, 255, 255, 0.94);
153
161
 
@@ -164,7 +172,7 @@
164
172
  --muted-foreground: rgba(255, 255, 255, 0.68);
165
173
  --accent: rgba(54, 179, 237, 0.16);
166
174
  --accent-foreground: #36b3ed;
167
- --destructive: #eb1919;
175
+ --destructive: #e61919;
168
176
  --destructive-foreground: #ffffff;
169
177
 
170
178
  --border: rgba(255, 255, 255, 0.07);
@@ -190,9 +198,9 @@
190
198
  --danger-soft: rgba(235, 25, 25, 0.2);
191
199
  --warning: #ffb300;
192
200
  --warning-soft: rgba(255, 179, 0, 0.18);
193
- --success: #14bd44;
201
+ --success: #3cc864;
194
202
  --success-soft: rgba(20, 189, 68, 0.18);
195
- --info: #2a93d5;
203
+ --info: #70b7e3;
196
204
  --info-soft: rgba(42, 147, 213, 0.2);
197
205
  --neutral: rgba(255, 255, 255, 0.6);
198
206
  --neutral-soft: rgba(255, 255, 255, 0.08);
@@ -236,7 +244,7 @@
236
244
  /* ── 2. PERSONALIDAD ─────────────────────────────────────────────────────────
237
245
  * Sin capa: gana a las utilidades de los componentes. Solo variables.
238
246
  */
239
- :root[data-theme='zyro'] {
247
+ :root:where([data-theme='zyro']) {
240
248
  /* Botones: píldora. Acción primaria con degradado de marca y brillo. */
241
249
  [data-slot='button'] {
242
250
  border-radius: 9999px;
@@ -343,7 +351,7 @@
343
351
  }
344
352
 
345
353
  /* Ajustes de personalidad (vistos en el banco de pruebas) */
346
- :root[data-theme='zyro'] {
354
+ :root:where([data-theme='zyro']) {
347
355
  /* Grupos de botones: píldora solo en los extremos, el interior recto */
348
356
  [data-slot='button-group'] [data-slot='button'] {
349
357
  border-radius: 0;
@@ -365,7 +373,7 @@
365
373
 
366
374
  /* Fondo vivo: los degradados derivan despacio (aproximación ligera, sin WebGL de la
367
375
  malla original). `prefers-reduced-motion` ya detiene la animación en la estructura. */
368
- :root[data-theme='zyro'] {
376
+ :root:where([data-theme='zyro']) {
369
377
  body {
370
378
  background-size: 160% 160%;
371
379
  animation: zy-drift 40s ease-in-out infinite alternate;
@@ -26,7 +26,7 @@ const SIDEBAR_COOKIE_NAME = "sidebar_state";
26
26
  const SIDEBAR_COOKIE_MAX_AGE = 60 * 60 * 24 * 7;
27
27
  const SIDEBAR_WIDTH = "17.5rem";
28
28
  const SIDEBAR_WIDTH_MOBILE = "18rem";
29
- const SIDEBAR_WIDTH_ICON = "4rem";
29
+ const SIDEBAR_WIDTH_ICON = "var(--ds-sidebar-rail-w, 4rem)";
30
30
  const SIDEBAR_KEYBOARD_SHORTCUT = "b";
31
31
  const SidebarContext = React.createContext(null);
32
32
  function useSidebar() {
@@ -180,7 +180,7 @@ function Sidebar({
180
180
  "data-slot": "sidebar-container",
181
181
  "data-side": side,
182
182
  className: cn(
183
- "fixed inset-y-0 z-(--ds-z-raised) hidden h-svh w-(--sidebar-width) transition-[left,right,width] duration-(--ds-motion-base) ease-linear data-[side=left]:left-0 data-[side=left]:group-data-[collapsible=offcanvas]:left-[calc(var(--sidebar-width)*-1)] data-[side=right]:right-0 data-[side=right]:group-data-[collapsible=offcanvas]:right-[calc(var(--sidebar-width)*-1)] md:flex",
183
+ "fixed inset-y-0 z-(--ds-z-sidebar) hidden h-svh w-(--sidebar-width) transition-[left,right,width] duration-(--ds-motion-base) ease-linear data-[side=left]:left-0 data-[side=left]:group-data-[collapsible=offcanvas]:left-[calc(var(--sidebar-width)*-1)] data-[side=right]:right-0 data-[side=right]:group-data-[collapsible=offcanvas]:right-[calc(var(--sidebar-width)*-1)] md:flex",
184
184
  // Adjust the padding for floating and inset variants.
185
185
  variant === "floating" || variant === "inset" ? "p-(--ds-sidebar-pad) group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)+(var(--ds-sidebar-pad)*2)+2px)]" : "group-data-[collapsible=icon]:w-(--sidebar-width-icon) group-data-[side=left]:border-r group-data-[side=right]:border-l",
186
186
  className
@@ -421,7 +421,7 @@ function SidebarMenuItem({ className, ...props }) {
421
421
  );
422
422
  }
423
423
  const sidebarMenuButtonVariants = cva(
424
- "peer/menu-button group/menu-button flex w-full items-center gap-2 overflow-hidden rounded-(--ds-sidebar-item-radius) px-3 py-2 text-left text-sm ring-sidebar-ring outline-hidden transition-[width,height,padding] group-has-data-[sidebar=menu-action]/menu-item:pr-8 group-data-[collapsible=icon]:size-8! group-data-[collapsible=icon]:p-2! hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 active:bg-sidebar-accent active:text-sidebar-accent-foreground disabled:pointer-events-none disabled:opacity-50 aria-disabled:pointer-events-none aria-disabled:opacity-50 data-open:hover:bg-sidebar-accent data-open:hover:text-sidebar-accent-foreground data-[active=true]:bg-sidebar-accent data-[active=true]:font-medium data-[active=true]:text-sidebar-accent-foreground [&_svg]:size-4 [&_svg]:shrink-0 [&>span:last-child]:truncate",
424
+ "peer/menu-button group/menu-button flex w-full items-center gap-2 overflow-hidden rounded-(--ds-sidebar-item-radius) px-3 py-2 text-left text-sm ring-sidebar-ring outline-hidden transition-[width,height,padding] group-has-data-[sidebar=menu-action]/menu-item:pr-8 group-data-[collapsible=icon]:mx-auto group-data-[collapsible=icon]:size-8! group-data-[collapsible=icon]:p-2! hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 active:bg-sidebar-accent active:text-sidebar-accent-foreground disabled:pointer-events-none disabled:opacity-50 aria-disabled:pointer-events-none aria-disabled:opacity-50 data-open:hover:bg-sidebar-accent data-open:hover:text-sidebar-accent-foreground data-[active=true]:bg-sidebar-accent data-[active=true]:font-medium data-[active=true]:text-sidebar-accent-foreground [&_svg]:size-4 [&_svg]:shrink-0 [&>span:last-child]:truncate",
425
425
  {
426
426
  variants: {
427
427
  variant: {
@@ -48,7 +48,7 @@ function TooltipContent({
48
48
  ...props,
49
49
  children: [
50
50
  children,
51
- /* @__PURE__ */ jsx(TooltipPrimitive.Arrow, { className: "z-(--ds-z-overlay) size-2.5 translate-y-[calc(-50%_-_2px)] rotate-45 rounded-[2px] bg-foreground fill-foreground data-[side=left]:translate-x-[-1.5px] data-[side=right]:translate-x-[1.5px]" })
51
+ /* @__PURE__ */ jsx(TooltipPrimitive.Arrow, { "data-slot": "tooltip-arrow", className: "z-(--ds-z-overlay) size-2.5 translate-y-[calc(-50%_-_2px)] rotate-45 rounded-[2px] bg-foreground fill-foreground data-[side=left]:translate-x-[-1.5px] data-[side=right]:translate-x-[1.5px]" })
52
52
  ]
53
53
  }
54
54
  )
package/docs/CONTRACT.md CHANGED
@@ -74,9 +74,10 @@ Los define la estructura con un valor neutro; un tema los sobrescribe si quiere.
74
74
  | Sombras | `--shadow-card`, `--shadow-card-hover`, `--shadow-control`, `--shadow-raised`, `--shadow-overlay`, `--shadow-popover` |
75
75
  | Altura de controles | `--ds-control-h-sm`, `-md`, `-lg` |
76
76
  | Espaciado interno | `--ds-card-spacing`, `--ds-card-spacing-sm`, `--ds-field-px`, `--ds-cell-p`, `--ds-overlay-p`, `--ds-overlay-gap`, `--ds-popover-p`, `--ds-menu-p`, `--ds-menu-item-px`, `--ds-menu-item-py`, `--ds-button-px-sm/md/lg`, `--ds-badge-px` |
77
- | Capas | `--ds-z-raised`, `--ds-z-sticky`, `--ds-z-overlay` |
77
+ | Capas | `--ds-z-raised`, `--ds-z-sticky`, `--ds-z-sidebar` (sobre la cabecera sticky), `--ds-z-overlay` |
78
78
  | Movimiento | `--ds-motion-fast`, `--ds-motion-base`, `--ds-motion-slow`, `--ds-motion-blink` |
79
79
  | Foco | `--ds-ring-width` |
80
+ | Lateral | `--ds-sidebar-icon`, `--ds-sidebar-icon-stroke` (iconos), `--ds-sidebar-rail-w` (ancho contraído), `--ds-sidebar-rail-item` (tecla del raíl), `--ds-sidebar-logo` (logo y avatar), `--ds-sidebar-sep-inset` (separadores; negativo = de borde a borde). **Todo tema los define** (contrato) |
80
81
  | Velo | `--color-scrim` |
81
82
  | **Materiales** | `--ds-card-backdrop`, `--ds-overlay-backdrop`, `--ds-field-backdrop`, `--ds-sidebar-backdrop` (un `backdrop-filter` completo; por defecto `none`) y `--ds-page-backdrop` (un `background-image` para el fondo de la página; por defecto `none`) |
82
83