@higinio/design-mcp 0.2.0 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,41 +1,39 @@
1
- /* ============================================================================
2
- NOCTURNA ELÉCTRICA — Framework CSS v2.0
3
- Sistema de diseño dark-first de Higinio Sosa.
1
+ /* ============================================================
2
+ Nocturna Eléctrica — Design Tokens v2.0
3
+ Sistema de diseño de Higinio Sosa · dark-first
4
4
  Fuente de verdad: DESIGN-nocturna-electrica.md
5
- Uso: enlazar este archivo antes de cualquier estilo propio.
6
- Tema: dark por defecto; <html data-theme="light"> activa la variante clara.
7
- Los componentes consumen SOLO aliases semánticos — nunca hex directos.
8
- ========================================================================== */
5
+ Uso: importar ANTES de cualquier estilo propio.
6
+ Los componentes consumen SOLO aliases semánticos, nunca hex.
7
+ ============================================================ */
9
8
 
10
9
  @import url('https://fonts.googleapis.com/css2?family=Space+Grotesk:wght@500;600;700&family=Manrope:wght@400;500;600;700&family=JetBrains+Mono:wght@400;500&display=swap');
11
10
 
12
- /* ============================================================
13
- 1. TOKENS — primitivos + aliases (dark por defecto)
14
- ============================================================ */
15
11
  :root {
16
- /* -- Primitivos: acento -- */
12
+ /* == Primitivos: acento (Celeste Eléctrico) ==
13
+ accent-600 sobre blanco da 4.01:1 — vale como UI (≥3) pero NO como texto (<4.5).
14
+ Para texto sobre claro se usa accent-700 (5.95:1) y accent-800 (8.74:1). */
17
15
  --accent-100: #d9f0fb; --accent-200: #a8ddf6; --accent-300: #7dccf1;
18
16
  --accent-400: #52baed; --accent-500: #2fa3dd; --accent-600: #1f87bb; --accent-700: #186a94;
19
- --accent-800: #12506f; /* solo light: texto de acción en hover */
17
+ --accent-800: #12506f;
20
18
 
21
- /* -- Primitivos: índigo -- */
19
+ /* == Primitivos: índigo (Índigo Profundo) — nunca texto sobre negro == */
22
20
  --indigo-300: #7a83c4; --indigo-400: #565fa3; --indigo-500: #353d7c;
23
21
  --indigo-600: #2b3264; --indigo-700: #22284f; --indigo-800: #1a1e3b;
24
22
 
25
- /* -- Primitivos: escala nocturna -- */
23
+ /* == Primitivos: escala nocturna == */
26
24
  --night-950: #010203; --night-900: #0b0d12; --night-800: #14171f;
27
25
  --night-700: #1e222d; --night-600: #2a2f3d; --night-500: #3d4354;
28
- --night-450: #5f6575; /* texto atenuado en light */
26
+ --night-450: #5f6575; /* texto atenuado en light: night-400 caía a 4.27:1 sobre --surface-3 */
29
27
  --night-400: #6b7183; --night-300: #9aa0b0; --night-200: #c5c9d4;
30
28
  --night-100: #e8eaef; --night-50: #f6f7f9;
31
29
 
32
- /* -- Primitivos: semánticos -- */
30
+ /* == Primitivos: semánticos (calibrados para dark) == */
33
31
  --success-400: #4ade80; --success-bg: #0a2617;
34
32
  --warning-400: #fbbf24; --warning-bg: #2a2005;
35
33
  --danger-400: #f87171; --danger-bg: #2c0f0f;
36
34
  --info-400: #52baed; --info-bg: #0d1f2c;
37
35
 
38
- /* -- Aliases semánticos (los componentes consumen SOLO esto) -- */
36
+ /* == Aliases semánticos (los componentes consumen SOLO esto) == */
39
37
  --bg: var(--night-950);
40
38
  --surface-1: var(--night-900);
41
39
  --surface-2: var(--night-800);
@@ -50,47 +48,17 @@
50
48
  --text-muted: var(--night-300);
51
49
  --text-disabled: var(--night-400);
52
50
  --text-heading: var(--night-50);
53
- --text-on-accent: var(--night-950);
54
- --success: var(--success-400);
55
- --warning: var(--warning-400);
56
- --danger: var(--danger-400);
57
- --info: var(--info-400);
51
+ --text-on-accent: var(--night-950); /* texto de CTA oscuro, nunca blanco */
52
+ --success: var(--success-400); --warning: var(--warning-400);
53
+ --danger: var(--danger-400); --info: var(--info-400);
54
+ --link: var(--accent-400);
55
+ --link-hover: var(--accent-200);
58
56
  --accent-ghost-hover: rgba(82,186,237,.08);
59
57
  --accent-ghost-active: rgba(82,186,237,.14);
60
58
  --accent-selected: rgba(82,186,237,.12);
61
59
  --overlay: rgba(1,2,3,.7);
62
60
 
63
- /* -- Aliases de componentes (derivados; cambian con el tema) -- */
64
- --link: var(--accent-400);
65
- --link-hover: var(--accent-200);
66
- --focus-color: var(--accent-400);
67
- --border-hover: var(--night-400);
68
- --outline-hover-bg: var(--surface-2);
69
- --outline-active-bg: var(--surface-3);
70
- --text-on-danger: var(--night-950);
71
- --data-color: var(--accent-400); /* cifras/datos clave */
72
- --elevated-border: var(--night-600); /* borde de toasts, modales, menús */
73
- --card-border: var(--night-600);
74
- --code-color: var(--accent-300);
75
- --code-border: var(--night-700);
76
- --table-header-bg: var(--night-900);
77
- --row-border: var(--night-800);
78
- --row-hover: var(--night-700);
79
- --navbar-bg: rgba(1,2,3,.8);
80
- --nav-active: var(--accent-400);
81
- --sidebar-bg: var(--night-900);
82
- --sidebar-active-bg: var(--indigo-800);
83
- --sidebar-active-text: var(--night-50);
84
- --sidebar-active-icon: var(--accent-400);
85
- --switch-off: var(--night-600);
86
- --tooltip-bg: var(--night-700);
87
- --tooltip-border: var(--night-600);
88
- --tooltip-text: var(--night-100);
89
- --skeleton-base: var(--night-800);
90
- --skeleton-sheen: var(--night-700);
91
- --empty-icon: var(--indigo-400);
92
-
93
- /* -- Tipografía -- */
61
+ /* == Tipografía == */
94
62
  --font-display: "Space Grotesk", system-ui, sans-serif;
95
63
  --font-body: "Manrope", system-ui, sans-serif;
96
64
  --font-mono: "JetBrains Mono", monospace;
@@ -102,7 +70,7 @@
102
70
  --tracking-display: -0.02em; --tracking-overline: 0.08em;
103
71
  --measure: 65ch;
104
72
 
105
- /* -- Espaciado -- */
73
+ /* == Espaciado (escala base 4px) == */
106
74
  --space-1: 4px; --space-2: 8px; --space-3: 12px; --space-4: 16px;
107
75
  --space-5: 20px; --space-6: 24px; --space-8: 32px; --space-10: 40px;
108
76
  --space-12: 48px; --space-16: 64px; --space-20: 80px; --space-24: 96px;
@@ -111,37 +79,106 @@
111
79
  --button-padding: 12px 20px; --touch-target: 44px;
112
80
  --grid-gutter: 24px; --grid-gutter-mobile: 16px;
113
81
 
114
- /* -- Radios y bordes -- */
82
+ /* == Radios y bordes == */
115
83
  --radius-sm: 8px; --radius-md: 12px; --radius-lg: 16px;
116
84
  --radius-xl: 24px; --radius-full: 9999px;
117
85
  --border-default: 1px solid var(--night-500);
118
86
  --border-emphasis: 1px solid var(--night-400); /* ver --border-strong */
119
- --focus-ring: 2px solid var(--accent-400);
87
+ --focus-ring: 2px solid var(--focus-color);
120
88
  --focus-ring-offset: 2px;
121
89
 
122
- /* -- Elevación -- */
90
+ /* == Elevación (superficie + sombra + borde) == */
123
91
  --shadow-1: 0 1px 2px rgba(0,0,0,.4);
124
92
  --shadow-2: 0 4px 12px rgba(0,0,0,.5);
125
93
  --shadow-3: 0 12px 32px rgba(0,0,0,.6);
126
- --glow-accent: 0 0 0 1px rgba(82,186,237,.35), 0 4px 20px rgba(82,186,237,.18);
94
+ --glow-accent: 0 0 0 1px rgba(82,186,237,.35), 0 4px 20px rgba(82,186,237,.18); /* máx. uno por pantalla */
127
95
  --ring: 0 0 0 3px rgba(82,186,237,.2);
128
96
  --ring-danger: 0 0 0 3px rgba(248,113,113,.2);
129
97
 
130
- /* -- Motion -- */
98
+ /* == Motion == */
131
99
  --duration-instant: 100ms; --duration-fast: 150ms; --duration-base: 220ms;
132
100
  --duration-slow: 250ms; --duration-page: 350ms;
133
101
  --ease-out: cubic-bezier(0.2, 0, 0, 1);
134
102
  --ease-in: cubic-bezier(0.4, 0, 1, 1);
135
103
  --ease-in-out: cubic-bezier(0.65, 0, 0.35, 1); /* moverse de A a B en pantalla */
136
104
  --ease-spring: cubic-bezier(0.34, 1.4, 0.64, 1);
105
+ --stagger-step: 30ms;
137
106
 
138
107
  color-scheme: dark;
139
- }
140
108
 
141
- /* ============================================================
142
- 2. VARIANTE LIGHT — <html data-theme="light">
143
- El CTA primario NO cambia (fondo #52baed, texto #010203).
144
- ============================================================ */
109
+ --focus-color: var(--accent-400);
110
+ --border-hover: var(--night-400);
111
+ --outline-hover-bg: var(--surface-2);
112
+ --outline-active-bg: var(--surface-3);
113
+ --text-on-danger: var(--night-950);
114
+ --data-color: var(--accent-400);
115
+ --elevated-border: var(--night-600);
116
+ --card-border: var(--night-600);
117
+ --code-color: var(--accent-300);
118
+ --code-border: var(--night-700);
119
+ --table-header-bg: var(--night-900);
120
+ --row-border: var(--night-800);
121
+ --row-hover: var(--night-700);
122
+ --navbar-bg: rgba(1,2,3,.8);
123
+ --nav-active: var(--accent-400);
124
+ --sidebar-bg: var(--night-900);
125
+ --sidebar-active-bg: var(--indigo-800);
126
+ --sidebar-active-text: var(--night-50);
127
+ --sidebar-active-icon: var(--accent-400);
128
+ --switch-off: var(--night-600);
129
+ --tooltip-bg: var(--night-700);
130
+ --tooltip-border: var(--night-600);
131
+ --tooltip-text: var(--night-100);
132
+ --skeleton-base: var(--night-800);
133
+ --skeleton-sheen: var(--night-700);
134
+ --empty-icon: var(--indigo-400);
135
+
136
+ --action-bg: var(--accent);
137
+ --action-hover: var(--accent-hover);
138
+ --action-active: var(--accent-active);
139
+ --text-on-action: var(--text-on-accent);
140
+ --control-border: var(--border-strong);
141
+ --placeholder: var(--text-muted);
142
+ --selection-bg: var(--action-bg);
143
+ --selection-text: var(--text-on-action);
144
+ --font-ui-heading: var(--font-body);
145
+ --text-ui-title: 2rem;
146
+ --control-height-md: 44px;
147
+ --button-padding-md: 12px 20px;
148
+ --surface: var(--surface-1);
149
+ --surface-alt: var(--surface-2);
150
+ --accent: var(--accent-400);
151
+ --accent-hover: var(--accent-300);
152
+ --accent-active: var(--accent-500);
153
+ --text-display-fluid: clamp(2.5rem, 1.5rem + 3.4vw, 5rem);
154
+ --text-on-primary-solid: var(--link);
155
+ --weight-regular: 400;
156
+ --weight-medium: 500;
157
+ --weight-semibold: 600;
158
+ --weight-bold: 700;
159
+ --leading-base: 1.6;
160
+ --leading-lg: 1.55;
161
+ --gutter: 24px;
162
+ --gutter-mobile: 16px;
163
+
164
+ /* Series categóricas: orden estable; acompañar con etiqueta o forma. */
165
+ --chart-1: #52baed;
166
+ --chart-2: #a0587c;
167
+ --chart-3: #2aa79e;
168
+ --chart-4: #aa5849;
169
+ --chart-5: #67a369;
170
+ --chart-6: #946a1c;
171
+ --chart-7: #877cc3;
172
+ /* Ritmo de contenido y formularios. */
173
+ --field-gap: 6px;
174
+ --heading-gap: var(--space-2);
175
+ --content-gap: var(--space-4);
176
+ --card-content-gap: var(--space-4);
177
+ --card-group-gap: var(--space-6);
178
+
179
+ }
180
+
181
+ /* == Modo claro (variante) — alternar data-theme en <html> == */
145
182
  [data-theme="light"] {
146
183
  --bg: #f5f8fb;
147
184
  --surface-1: #ffffff;
@@ -153,28 +190,37 @@
153
190
  1.53-1.78:1, bajo el mínimo de 3:1 para UI. */
154
191
  --text-primary: #14171f;
155
192
  --text-secondary: #3d4354;
156
- --text-muted: #5f6575; /* night-400 caía a 4.27:1 sobre --surface-3 */
193
+ --text-muted: var(--night-450); /* no night-400: ese caía a 4.27:1 sobre --surface-3 */
157
194
  --text-disabled: #9aa0b0;
158
- --text-heading: #0b0d12;
159
- --text-on-accent: #010203; /* el CTA no cambia */
160
- /* Los semánticos son texto sobre su propio --*-bg tintado: se calibran contra ese fondo. */
161
- --success: #166534; --success-bg: #e3f5ea;
162
- --warning: #854d0e; --warning-bg: #fbf3dd;
163
- --danger: #b02c2c; --danger-bg: #fbe7e7;
164
- --info: #186a94; --info-bg: #e3f2fb;
195
+ --text-heading: #14171f;
196
+ --link: #186a94; /* accent-700 · 5.95:1 sobre blanco — accent-600 solo daba 4.01:1 */
197
+ --link-hover: #12506f; /* accent-800 · en light el hover OSCURECE (en dark aclara) */
198
+ --text-on-accent: #010203; /* CTA no cambia entre modos */
199
+ /* Semánticos de light: son a la vez relleno y TEXTO sobre su propio --*-bg tintado,
200
+ así que se calibran contra ese fondo, no contra blanco. */
201
+ --success: #166534;
202
+ --warning: #854d0e;
203
+ --danger: #b02c2c;
204
+ --info: #186a94;
205
+ --success-bg: #e3f5ea; --warning-bg: #fbf3dd;
206
+ --danger-bg: #fbe7e7; --info-bg: #e3f2fb;
165
207
  --accent-ghost-hover: rgba(31,135,187,.08);
166
208
  --accent-ghost-active: rgba(31,135,187,.14);
167
209
  --accent-selected: rgba(82,186,237,.12);
168
210
  --overlay: rgba(20,23,31,.45);
211
+ --ring: 0 0 0 3px rgba(31,135,187,.25);
212
+ --shadow-1: 0 1px 3px rgba(53,61,124,.08);
213
+ --shadow-2: 0 4px 10px rgba(53,61,124,.10);
214
+ --shadow-3: 0 12px 28px rgba(53,61,124,.14);
215
+ --glow-accent: 0 0 0 1px rgba(82,186,237,.4), 0 4px 16px rgba(82,186,237,.25);
216
+ color-scheme: light;
169
217
 
170
- --link: #186a94; /* accent-700 · 5.95:1 — accent-600 solo daba 4.01:1 */
171
- --link-hover: #12506f; /* accent-800 · en light el hover oscurece */
172
- --focus-color: #1f87bb; /* accent-600 se queda: es UI (4.01 ≥ 3), no texto */
173
- --border-hover: #b9c3d1;
218
+ --focus-color: #186a94;
219
+ --border-hover: #5f6575;
174
220
  --outline-hover-bg: #eaf1f7;
175
221
  --outline-active-bg: #d8dfe8;
176
222
  --text-on-danger: #ffffff;
177
- --data-color: #186a94; /* pinta cifras y .progress__value: es TEXTO, necesita 4.5 */
223
+ --data-color: #186a94;
178
224
  --elevated-border: #d8dfe8;
179
225
  --card-border: #d8dfe8;
180
226
  --code-color: #186a94;
@@ -188,38 +234,36 @@
188
234
  --sidebar-active-bg: #e3f2fb;
189
235
  --sidebar-active-text: #14171f;
190
236
  --sidebar-active-icon: #1f87bb;
191
- --switch-off: #b9c3d1;
237
+ --switch-off: var(--control-border);
192
238
  --tooltip-bg: #14171f;
193
239
  --tooltip-border: #14171f;
194
240
  --tooltip-text: #f6f7f9;
195
241
  --skeleton-base: #eaf1f7;
196
242
  --skeleton-sheen: #f5f8fb;
197
-
198
- --ring: 0 0 0 3px rgba(31,135,187,.25);
199
243
  --ring-danger: 0 0 0 3px rgba(192,53,53,.2);
200
- --shadow-1: 0 1px 3px rgba(53,61,124,.08);
201
- --shadow-2: 0 4px 10px rgba(53,61,124,.10);
202
- --shadow-3: 0 12px 28px rgba(53,61,124,.14);
203
- --glow-accent: 0 0 0 1px rgba(82,186,237,.4), 0 4px 16px rgba(82,186,237,.25);
204
244
 
205
- color-scheme: light;
245
+ --selection-bg: var(--action-bg);
246
+ --selection-text: var(--text-on-action);
247
+
248
+ /* Series categóricas: orden estable; acompañar con etiqueta o forma. */
249
+ --chart-1: #186a94;
250
+ --chart-2: #853f63;
251
+ --chart-3: #129a92;
252
+ --chart-4: #8e4031;
253
+ --chart-5: #5b975e;
254
+ --chart-6: #8a600a;
255
+ --chart-7: #857bc1;
206
256
  }
207
257
 
208
- /* ============================================================
209
- 3. ACCESIBILIDAD DEL MOVIMIENTO
210
- ============================================================ */
258
+ /* == Accesibilidad del movimiento == */
259
+
211
260
  @media (prefers-reduced-motion: reduce) {
212
- *, *::before, *::after {
213
- animation-duration: 0.01ms !important;
214
- animation-iteration-count: 1 !important;
215
- transition-duration: 0.01ms !important;
216
- scroll-behavior: auto !important;
261
+ :root {
262
+ --duration-instant: 0ms; --duration-fast: 0ms; --duration-base: 0ms;
263
+ --duration-slow: 0ms; --duration-page: 0ms; --stagger-step: 0ms;
217
264
  }
218
265
  }
219
266
 
220
- /* ============================================================
221
- 4. BASE
222
- ============================================================ */
223
267
  *, *::before, *::after { box-sizing: border-box; }
224
268
 
225
269
  body {
@@ -250,7 +294,7 @@ p { max-width: var(--measure); margin: 0 0 var(--space-4); }
250
294
  a { color: var(--link); text-decoration: none; transition: color var(--duration-fast) var(--ease-out); }
251
295
  a:hover { color: var(--link-hover); }
252
296
 
253
- ::placeholder { color: var(--text-disabled); }
297
+ ::placeholder { color: var(--placeholder); }
254
298
  ::selection { background: rgba(82,186,237,.3); }
255
299
 
256
300
  :focus-visible {
@@ -304,12 +348,12 @@ a:hover { color: var(--link-hover); }
304
348
  /* Gating de hover (§11.5): los hover que mueven/elevan (transform, box-shadow, glow)
305
349
  van dentro de @media (hover: hover) and (pointer: fine) — en touch el tap dispara
306
350
  hovers falsos que se quedan pegados. Los hover de solo color/fondo quedan fuera. */
307
- .btn--primary { background: var(--accent-400); color: var(--text-on-accent); }
308
- .btn--primary:hover:not(:disabled) { background: var(--accent-500); }
351
+ .btn--primary { background: var(--action-bg); color: var(--text-on-action); }
352
+ .btn--primary:hover:not(:disabled) { background: var(--action-hover); }
309
353
  @media (hover: hover) and (pointer: fine) {
310
354
  .btn--primary:hover:not(:disabled) { box-shadow: var(--glow-accent); }
311
355
  }
312
- .btn--primary:active:not(:disabled) { background: var(--accent-600); box-shadow: none; }
356
+ .btn--primary:active:not(:disabled) { background: var(--action-active); box-shadow: none; }
313
357
  .btn--primary:disabled { background: var(--surface-3); color: var(--text-disabled); }
314
358
 
315
359
  /* Secundario — índigo (idéntico en ambos temas) */
@@ -395,7 +439,7 @@ a:hover { color: var(--link-hover); }
395
439
 
396
440
  .input, .textarea, .select {
397
441
  width: 100%; background: var(--surface-2);
398
- border: 1px solid var(--border); border-radius: var(--radius-sm);
442
+ border: 1px solid var(--control-border); border-radius: var(--radius-sm);
399
443
  color: var(--text-primary); font-family: var(--font-body); font-size: var(--text-base);
400
444
  transition: border-color var(--duration-fast) var(--ease-out),
401
445
  box-shadow var(--duration-fast) var(--ease-out);
@@ -471,7 +515,7 @@ a:hover { color: var(--link-hover); }
471
515
  }
472
516
  .segmented--sm label { padding: 0 12px; font-size: var(--text-xs); }
473
517
  .segmented input:checked + label {
474
- background: var(--surface-3); color: var(--accent-300);
518
+ background: var(--surface-3); color: var(--link);
475
519
  font-weight: 600; box-shadow: var(--shadow-1);
476
520
  }
477
521
  .segmented input:focus-visible + label { outline: var(--focus-ring); outline-offset: 2px; }
@@ -501,8 +545,8 @@ a:hover { color: var(--link-hover); }
501
545
  }
502
546
  .slider:active::-moz-range-thumb { transform: scale(1.15); }
503
547
  @media (prefers-reduced-motion: reduce) {
504
- .slider::-webkit-slider-thumb { transition-duration: 0.01ms !important; }
505
- .slider::-moz-range-thumb { transition-duration: 0.01ms !important; }
548
+ .slider::-webkit-slider-thumb { transition: none; }
549
+ .slider::-moz-range-thumb { transition: none; }
506
550
  }
507
551
 
508
552
  /* ============================================================
@@ -678,7 +722,7 @@ a:hover { color: var(--link-hover); }
678
722
  font-variant-numeric: tabular-nums;
679
723
  }
680
724
  button.metric-chip {
681
- min-height: var(--touch-target); padding-inline: var(--space-4);
725
+ min-height: var(--control-height-md); padding-inline: var(--space-4);
682
726
  cursor: pointer; text-align: left;
683
727
  transition: background-color var(--duration-fast) var(--ease-out),
684
728
  border-color var(--duration-fast) var(--ease-out),
@@ -1077,7 +1121,7 @@ button.metric-chip:focus-visible { outline: var(--focus-ring); outline-offset: v
1077
1121
  font-weight: 600; color: var(--data-color); font-variant-numeric: tabular-nums;
1078
1122
  }
1079
1123
  @media (prefers-reduced-motion: reduce) {
1080
- .progress-ring__bar { transition-duration: 0.01ms !important; }
1124
+ .progress-ring__bar { transition: none; }
1081
1125
  }
1082
1126
 
1083
1127
  /* ============================================================
@@ -1244,13 +1288,13 @@ button.metric-chip:focus-visible { outline: var(--focus-ring); outline-offset: v
1244
1288
  transition: opacity var(--duration-base) var(--ease-out),
1245
1289
  transform var(--duration-base) var(--ease-out),
1246
1290
  visibility 0s linear var(--duration-base);
1247
- }
1291
+ display: none; }
1248
1292
  .popover.is-open .popover__panel {
1249
1293
  opacity: 1; transform: none; visibility: visible;
1250
1294
  transition: opacity var(--duration-base) var(--ease-out),
1251
1295
  transform var(--duration-base) var(--ease-out),
1252
1296
  visibility 0s;
1253
- }
1297
+ display: block; }
1254
1298
  /* Alineado a la derecha del disparador */
1255
1299
  .popover--right .popover__panel { left: auto; right: 0; transform-origin: top right; }
1256
1300
 
@@ -1404,3 +1448,168 @@ button.metric-chip:focus-visible { outline: var(--focus-ring); outline-offset: v
1404
1448
  color: var(--text-secondary); background: var(--surface-2);
1405
1449
  border: 1px solid var(--border-strong); border-radius: 6px; box-shadow: var(--shadow-1);
1406
1450
  }
1451
+
1452
+ /* CONTRATOS COMPARTIDOS GENERADOS */
1453
+ /* Contratos comunes de interacción; la identidad y los valores viven en tokens.css. */
1454
+ .grid { grid-template-columns: repeat(12, minmax(0, 1fr)); }
1455
+ .grid > *, .field, .card { min-inline-size: 0; }
1456
+ .stack, .card__content, .form-stack, .text-group { display: flex; flex-direction: column; align-items: stretch; }
1457
+ .stack, .card__content { gap: var(--content-gap); }
1458
+ .stack--tight, .text-group { gap: var(--heading-gap); }
1459
+ .stack--cards { gap: var(--card-group-gap); }
1460
+ .form-stack { gap: var(--form-gap); }
1461
+ .cluster { display: flex; flex-wrap: wrap; align-items: center; gap: var(--space-3); }
1462
+ .card { display: flex; flex-direction: column; gap: var(--card-content-gap); }
1463
+ .field { gap: var(--field-gap); }
1464
+ .field__label, .field__help, .field__error, .field > :is(label, p, span, div) { margin-block: 0; }
1465
+ :where(.field + .field, .field + .btn, .field + .cluster) { margin-block-start: var(--form-gap); }
1466
+ :where(.card + .card) { margin-block-start: var(--card-group-gap); }
1467
+ .stack > *, .card__content > *, .form-stack > *, .text-group > *, .grid > .card,
1468
+ .card > :is(h1, h2, h3, h4, h5, h6, p), .text-group > :is(h1, h2, h3, h4, h5, h6, p),
1469
+ .stack > :is(h1, h2, h3, h4, h5, h6, p) { margin-block: 0; }
1470
+ .form-stack > .field { margin-block: 0; }
1471
+ .btn {
1472
+ block-size: auto;
1473
+ min-block-size: var(--control-height-md);
1474
+ max-inline-size: 100%;
1475
+ white-space: normal;
1476
+ line-height: 1.35;
1477
+ text-align: center;
1478
+ }
1479
+ .btn--sm { min-block-size: var(--control-height-sm, 36px); }
1480
+ .btn--lg { min-block-size: var(--control-height-lg, 52px); }
1481
+ .btn--primary, .icon-btn--primary, .calendar__day--selected, .pagination__btn.is-active {
1482
+ background: var(--action-bg);
1483
+ color: var(--text-on-action);
1484
+ }
1485
+ .btn--primary:hover:not(:disabled), .icon-btn--primary:hover:not(:disabled) { background: var(--action-hover); color: var(--text-on-action); }
1486
+ .btn--primary:active:not(:disabled), .icon-btn--primary:active:not(:disabled) { background: var(--action-active); color: var(--text-on-action); }
1487
+ .input, .textarea, .select, .combobox__input, .search__input, .datepicker__input {
1488
+ max-inline-size: 100%;
1489
+ caret-color: var(--focus-color);
1490
+ }
1491
+ .input, .select, .combobox__input, .search__input, .datepicker__input {
1492
+ block-size: auto; min-block-size: var(--control-height-md);
1493
+ padding-block: var(--space-2); line-height: 1.5;
1494
+ }
1495
+ :is(.input, .textarea, .select, .combobox__input, .search__input, .datepicker__input):not(.input--error, .input--success, .textarea--error, [aria-invalid="true"]) { border-color: var(--control-border); }
1496
+ .input:hover:not(:disabled):not(:focus):not(.input--error, .input--success, [aria-invalid="true"]), .textarea:hover:not(:disabled):not(:focus):not(.textarea--error, [aria-invalid="true"]),
1497
+ .select:hover:not(:disabled):not(:focus), .combobox__input:hover:not(:disabled):not(:focus),
1498
+ .search__input:hover:not(:focus), .datepicker__input:hover:not(:disabled):not(:focus) { border-color: var(--border-hover); }
1499
+ .input:focus-visible, .textarea:focus-visible, .select:focus-visible,
1500
+ .combobox__input:focus-visible, .search__input:focus-visible, .datepicker__input:focus-visible {
1501
+ outline: 2px solid var(--focus-color);
1502
+ outline-offset: 2px;
1503
+ }
1504
+ .input[aria-invalid="true"], .textarea[aria-invalid="true"] { border-color: var(--danger-text, var(--danger)); }
1505
+ .input.input--error, .textarea.textarea--error,
1506
+ .input.input--error:hover:not(:disabled):not(:focus), .textarea.textarea--error:hover:not(:disabled):not(:focus),
1507
+ :is(.input, .textarea, .select, .combobox__input, .search__input, .datepicker__input)[aria-invalid="true"]:hover:not(:disabled):not(:focus) {
1508
+ border-color: var(--danger-text, var(--danger));
1509
+ }
1510
+ .input.input--success, .input.input--success:hover:not(:disabled):not(:focus) { border-color: var(--success-text, var(--success)); }
1511
+ .pagination { max-inline-size: 100%; flex-wrap: wrap; row-gap: var(--space-2); }
1512
+ .pagination__ellipsis { color: var(--text-muted); }
1513
+ .step--current .step__marker { color: var(--link); border-color: var(--focus-color); }
1514
+ .checkbox input:focus-visible ~ .checkbox__box,
1515
+ .radio input:focus-visible ~ .radio__dot,
1516
+ .switch input:focus-visible ~ .switch__track {
1517
+ outline: 2px solid var(--focus-color);
1518
+ outline-offset: 2px;
1519
+ }
1520
+ input.checkbox, input.radio { border-color: var(--control-border); }
1521
+ input.checkbox:hover, input.radio:hover { border-color: var(--focus-color); }
1522
+ input.checkbox:checked, input.checkbox:indeterminate, input.radio:checked { border-color: var(--focus-color); }
1523
+ .switch__track { background: var(--control-border); }
1524
+ .tabs { max-inline-size: 100%; overflow-x: auto; }
1525
+ .tabs__tab { flex-shrink: 0; }
1526
+ .segmented { max-inline-size: 100%; block-size: auto; min-block-size: var(--control-height-md); overflow-x: auto; }
1527
+ .segmented label { padding-block: var(--space-2); }
1528
+ .stat__row, .breadcrumbs, .check-row { flex-wrap: wrap; row-gap: var(--space-2); }
1529
+ .progress-row, .slider-row { flex-wrap: wrap; gap: var(--space-2); }
1530
+ .stat__value { max-inline-size: 100%; white-space: normal; overflow-wrap: anywhere; }
1531
+ .file-upload, .file-upload__label { min-inline-size: 0; max-inline-size: 100%; }
1532
+ .file-upload__button { max-inline-size: 100%; white-space: normal; text-align: center; }
1533
+ .file-upload__hint { overflow-wrap: anywhere; }
1534
+ .table-scroll { max-inline-size: 100%; overflow-x: auto; overscroll-behavior-inline: contain; }
1535
+ .popover__panel, .datepicker__calendar, .combobox__list {
1536
+ max-inline-size: calc(100vw - 2rem);
1537
+ max-block-size: min(32rem, 70dvh);
1538
+ overflow: auto;
1539
+ }
1540
+ .file-upload__input:focus-visible + .file-upload__label { outline: 2px solid var(--focus-color); outline-offset: 2px; }
1541
+ .calendar { max-inline-size: calc(100vw - 2rem); }
1542
+ .ui-title, :is(h1, h2, h3, h4, h5, h6).ui-title, [data-mode="operate"] :is(h1, h2, h3) {
1543
+ font-family: var(--font-ui-heading);
1544
+ letter-spacing: 0;
1545
+ line-height: 1.3;
1546
+ font-weight: var(--weight-semibold);
1547
+ }
1548
+ .ui-title, :is(h1, h2, h3, h4, h5, h6).ui-title, [data-mode="operate"] h1 { font-size: var(--text-ui-title); }
1549
+ [data-mode="operate"] h2 { font-size: var(--text-xl); }
1550
+ [data-mode="operate"] h3 { font-size: var(--text-lg); }
1551
+ .display, .reading-title, :is(h1, h2, h3, h4, h5, h6):is(.display, .reading-title) {
1552
+ font-family: var(--font-display);
1553
+ font-size: var(--text-display-fluid);
1554
+ line-height: 1.08;
1555
+ letter-spacing: var(--tracking-display);
1556
+ text-wrap: balance;
1557
+ }
1558
+ :where(.celeste-reset, .salvia-reset, .bruma-reset, .nocturna-reset, body[data-system]) {
1559
+ scrollbar-color: var(--control-border) var(--bg);
1560
+ }
1561
+ ::selection,
1562
+ .celeste-reset ::selection, .salvia-reset ::selection, .bruma-reset ::selection {
1563
+ background: var(--selection-bg); color: var(--selection-text);
1564
+ }
1565
+ ::placeholder { color: var(--placeholder); opacity: 1; }
1566
+ :where(a) { text-underline-offset: .2em; text-decoration-thickness: .08em; }
1567
+ .skip-link {
1568
+ position: fixed; inset-block-start: var(--space-2); inset-inline-start: var(--space-2);
1569
+ z-index: 1000; padding: var(--space-3) var(--space-4);
1570
+ background: var(--action-bg); color: var(--text-on-action);
1571
+ border-radius: var(--radius-sm); transform: translateY(-180%);
1572
+ }
1573
+ .skip-link:focus { transform: none; outline: 2px solid var(--focus-color); outline-offset: 2px; }
1574
+ [data-tooltip]::before, [data-tooltip]::after { display: none; }
1575
+ [data-tooltip]:focus-visible::before, [data-tooltip]:focus-visible::after { display: block; }
1576
+ .has-tooltip .tooltip { display: none; }
1577
+ .has-tooltip:has(:focus-visible) .tooltip { display: block; opacity: 1; transform: translate(-50%, 0); }
1578
+ @media (hover: hover) and (pointer: fine) {
1579
+ [data-tooltip]:hover::before, [data-tooltip]:hover::after { display: block; }
1580
+ .has-tooltip:hover .tooltip { display: block; }
1581
+ }
1582
+ @media (pointer: coarse) {
1583
+ .btn, .icon-btn, .segmented label, .pagination button,
1584
+ .tag__close, .search__clear, .toast__close, .check-row,
1585
+ .checkbox:not(input), .radio:not(input), .switch:not(input) {
1586
+ min-block-size: var(--touch-target);
1587
+ min-inline-size: var(--touch-target);
1588
+ }
1589
+ }
1590
+ @media (max-width: 479px) {
1591
+ .btn-group { flex-wrap: wrap; }
1592
+ .modal { max-inline-size: calc(100vw - 2rem); }
1593
+ .stepper { flex-direction: column; align-items: stretch; gap: var(--space-4); }
1594
+ .step { flex-direction: row; align-items: center; gap: var(--space-3); text-align: start; min-inline-size: 0; }
1595
+ .step__label { overflow-wrap: anywhere; }
1596
+ .step__connector { display: none; }
1597
+ }
1598
+ @media (prefers-reduced-motion: reduce) {
1599
+ html, html:focus-within { scroll-behavior: auto; }
1600
+ .spinner, .skeleton, .skeleton::after,
1601
+ .progress--indeterminate .progress__bar, .alert.is-leaving, .toast.is-leaving { animation: none; }
1602
+ .progress--indeterminate .progress__bar { transform: none; }
1603
+ .btn, .icon-btn, .card--interactive, .slider::-webkit-slider-thumb { transform: none; }
1604
+ .btn:active:not(:disabled), .icon-btn:active:not(:disabled), .card--interactive:hover { transform: none; }
1605
+ .btn, .icon-btn { transition: background-color 80ms linear, color 80ms linear; }
1606
+ .menu, .popover__panel, .datepicker__calendar, .link::after { transition: none; }
1607
+ .progress__bar, .progress-ring__value, .accordion__content, .accordion__body { transition: none; }
1608
+ }
1609
+ @media (forced-colors: active) {
1610
+ input.switch, .switch__track { border: 1px solid CanvasText; background: Canvas; }
1611
+ input.switch::after, .switch__track::after { background: CanvasText; }
1612
+ input.switch:checked, .switch input:checked ~ .switch__track { border-color: Highlight; }
1613
+ input.switch:checked::after, .switch input:checked ~ .switch__track::after { background: Highlight; }
1614
+ .checkbox__box, .radio__dot { border-color: CanvasText; }
1615
+ }