@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,16 +1,13 @@
1
- /* ==========================================================================
2
- SALVIA SERENA — Framework CSS v1.0
1
+ /* ============================================================
2
+ Salvia Serena — Design Tokens v1.0
3
3
  Sistema de diseño de Higinio Sosa · light-first
4
4
  Fuente de verdad: DESIGN-salvia-serena.md
5
- Uso: enlazar este archivo antes de cualquier estilo propio y aplicar
6
- la clase .salvia-reset al <body>. Tema: data-theme="light|dark" en <html>.
7
- ========================================================================== */
5
+ Uso: importar ANTES de cualquier estilo propio.
6
+ Los componentes consumen SOLO aliases semánticos, nunca hex.
7
+ ============================================================ */
8
8
 
9
9
  @import url("https://fonts.googleapis.com/css2?family=Lora:ital,wght@0,600;0,700;1,600&family=Nunito+Sans:ital,wght@0,400;0,500;0,600;0,700;1,400&family=Source+Code+Pro:wght@400;500&display=swap");
10
10
 
11
- /* --------------------------------------------------------------------------
12
- 1. TOKENS (§13)
13
- -------------------------------------------------------------------------- */
14
11
  :root {
15
12
  /* == Primitivos: primario (Salvia) == */
16
13
  --primary-50: #e2eadf; --primary-100: #d4e0d1; --primary-200: #b8cbb7;
@@ -49,12 +46,6 @@
49
46
  --accent-soft: var(--primary-50);
50
47
  --accent-soft-strong: var(--primary-100);
51
48
  --link: var(--primary-600); /* AA 7.00:1 sobre --surface — texto de links y ghost */
52
- --overlay: rgba(44, 54, 48, .5);
53
- --tooltip-bg: var(--neutral-900);
54
- --tooltip-text: var(--neutral-0);
55
- --focus-color: var(--accent); /* contorno de foco de teclado */
56
- --text-on-danger: var(--neutral-0); /* texto del botón destructivo */
57
- --border-hover: var(--neutral-500); /* borde de campos en hover */
58
49
 
59
50
  /* == Tipografía == */
60
51
  --font-display: "Lora", Georgia, serif;
@@ -93,7 +84,6 @@
93
84
  /* == Focus == */
94
85
  --ring: 0 0 0 3px rgba(79,107,88,.25);
95
86
  --ring-color: rgba(79,107,88,.25);
96
- --ring-danger: 0 0 0 3px rgba(181,82,63,.22);
97
87
 
98
88
  /* == Motion (pausado: nada urge) == */
99
89
  --duration-instant: 100ms; --duration-fast: 150ms; --duration-base: 220ms;
@@ -105,9 +95,48 @@
105
95
  --stagger-step: 30ms;
106
96
 
107
97
  color-scheme: light;
108
- }
109
98
 
110
- /* Modo oscuro (§15, extendido con aliases derivados) */
99
+ --overlay: rgba(44, 54, 48, .5);
100
+ --tooltip-bg: var(--neutral-900);
101
+ --tooltip-text: var(--neutral-0);
102
+ --focus-color: var(--accent);
103
+ --text-on-danger: var(--neutral-0);
104
+ --border-hover: var(--neutral-500);
105
+ --ring-danger: 0 0 0 3px rgba(181,82,63,.22);
106
+
107
+ --action-bg: var(--accent);
108
+ --action-hover: var(--accent-hover);
109
+ --action-active: var(--accent-active);
110
+ --text-on-action: var(--text-on-primary);
111
+ --control-border: var(--border-strong);
112
+ --placeholder: var(--text-muted);
113
+ --selection-bg: var(--action-bg);
114
+ --selection-text: var(--text-on-action);
115
+ --font-ui-heading: var(--font-body);
116
+ --text-ui-title: 2rem;
117
+ --touch-target: 44px;
118
+ --text-display-fluid: clamp(2.5rem, 1.8rem + 2.4vw, 4.5rem);
119
+
120
+ /* Series categóricas: orden estable; acompañar con etiqueta o forma. */
121
+ --chart-1: #549864;
122
+ --chart-2: #8d4226;
123
+ --chart-3: #179a8e;
124
+ --chart-4: #81416d;
125
+ --chart-5: #8a8b39;
126
+ --chart-6: #195f91;
127
+ --chart-7: #996f18;
128
+ /* Ritmo de contenido y formularios. */
129
+ --field-gap: 6px;
130
+ --heading-gap: var(--space-2);
131
+ --content-gap: var(--space-4);
132
+ --card-content-gap: var(--space-4);
133
+ --card-group-gap: var(--space-8);
134
+
135
+ }
136
+
137
+ /* == Modo oscuro (variante) — alternar data-theme en <html> ==
138
+ Casi sin sombras: las capas se separan por superficie y borde, y solo
139
+ los overlays (lg/xl) conservan una sombra tenue. */
111
140
  [data-theme="dark"] {
112
141
  --bg: #151a17;
113
142
  --surface: #1d231f;
@@ -126,30 +155,49 @@
126
155
  --text-on-primary: #151a17;
127
156
  --text-on-primary-solid: #b5d2bc;
128
157
  --link: #b5d2bc;
129
- --overlay: rgba(0, 0, 0, .6);
130
- --tooltip-bg: #e3e8e2;
131
- --tooltip-text: #2c3630;
132
- --focus-color: var(--accent);
133
- --text-on-danger: #151a17;
134
- --border-hover: #a6b0a8;
135
158
  --success-500: #6cc3ac; --success-100: #14271f; --success-text: #8ad3bf;
136
159
  --warning-500: #d9a94f; --warning-100: #2a2213; --warning-text: #e6c17e;
137
160
  --danger-500: #d9806d; --danger-100: #2c1814; --danger-text: #e9a597;
138
161
  --info-500: #8fb0c9; --info-100: #18222b; --info-text: #a9c4d8;
139
162
  --ring: 0 0 0 3px rgba(159,194,168,.3);
140
163
  --ring-color: rgba(159,194,168,.3);
141
- --ring-danger: 0 0 0 3px rgba(217,128,109,.25);
142
164
  --shadow-xs: none;
143
165
  --shadow-sm: none;
144
166
  --shadow-md: none;
145
167
  --shadow-lg: 0 8px 24px rgba(8,10,9,.3);
146
168
  --shadow-xl: 0 16px 32px rgba(8,10,9,.35);
147
169
  color-scheme: dark;
170
+
171
+ --overlay: rgba(0, 0, 0, .6);
172
+ --tooltip-bg: #e3e8e2;
173
+ --tooltip-text: #2c3630;
174
+ --focus-color: var(--accent);
175
+ --text-on-danger: #151a17;
176
+ --border-hover: #a6b0a8;
177
+ --ring-danger: 0 0 0 3px rgba(217,128,109,.25);
178
+
179
+ --selection-bg: var(--action-bg);
180
+ --selection-text: var(--text-on-action);
181
+
182
+ /* Series categóricas: orden estable; acompañar con etiqueta o forma. */
183
+ --chart-1: #60a46f;
184
+ --chart-2: #a85a3f;
185
+ --chart-3: #2da79b;
186
+ --chart-4: #9b5986;
187
+ --chart-5: #818230;
188
+ --chart-6: #3678ac;
189
+ --chart-7: #946b10;
190
+ }
191
+
192
+ /* == Accesibilidad del movimiento == */
193
+
194
+ @media (prefers-reduced-motion: reduce) {
195
+ :root {
196
+ --duration-instant: 0ms; --duration-fast: 0ms; --duration-base: 0ms;
197
+ --duration-slow: 0ms; --duration-page: 0ms; --stagger-step: 0ms;
198
+ }
148
199
  }
149
200
 
150
- /* --------------------------------------------------------------------------
151
- 2. BASE (§6, §11.5, §13)
152
- -------------------------------------------------------------------------- */
153
201
  *, *::before, *::after { box-sizing: border-box; }
154
202
 
155
203
  /* Focus ring global de teclado — especificidad cero vía :where() */
@@ -191,17 +239,10 @@
191
239
  .salvia-reset h6 { font-size: var(--text-base); line-height: var(--leading-base); }
192
240
  .salvia-reset p { max-width: var(--measure); margin: 0 0 1em; }
193
241
  .salvia-reset table { font-variant-numeric: tabular-nums; }
194
- .salvia-reset ::placeholder { color: var(--text-disabled); }
242
+ .salvia-reset ::placeholder { color: var(--placeholder); }
195
243
  .salvia-reset ::selection { background: var(--ring-color); }
196
244
 
197
- @media (prefers-reduced-motion: reduce) {
198
- *, *::before, *::after {
199
- animation-duration: 0.01ms !important;
200
- animation-iteration-count: 1 !important;
201
- transition-duration: 0.01ms !important;
202
- scroll-behavior: auto !important;
203
- }
204
- }
245
+
205
246
 
206
247
  /* --------------------------------------------------------------------------
207
248
  3. LAYOUT — contenedor, grid 12 col (§14)
@@ -249,12 +290,12 @@
249
290
  /* Gating de hover (§11.5): los hover que mueven/elevan (transform, box-shadow) van
250
291
  dentro de @media (hover: hover) and (pointer: fine) — en touch el tap dispara
251
292
  hovers falsos que se quedan pegados. Los hover de solo color/fondo quedan fuera. */
252
- .btn--primary { background: var(--accent); color: var(--text-on-primary); }
253
- .btn--primary:hover:not(:disabled) { background: var(--accent-hover); }
293
+ .btn--primary { background: var(--action-bg); color: var(--text-on-action); }
294
+ .btn--primary:hover:not(:disabled) { background: var(--action-hover); }
254
295
  @media (hover: hover) and (pointer: fine) {
255
296
  .btn--primary:hover:not(:disabled) { box-shadow: var(--shadow-sm); }
256
297
  }
257
- .btn--primary:active:not(:disabled) { background: var(--accent-active); box-shadow: none; }
298
+ .btn--primary:active:not(:disabled) { background: var(--action-active); box-shadow: none; }
258
299
  .btn--primary:disabled { background: var(--border); color: var(--text-disabled); box-shadow: none; }
259
300
 
260
301
  .btn--secondary { background: var(--surface); border-color: var(--border-strong); color: var(--text-primary); }
@@ -321,7 +362,7 @@
321
362
  .input, .textarea, .select {
322
363
  width: 100%; font-family: var(--font-body); font-size: var(--text-base);
323
364
  color: var(--text-primary); background: var(--surface);
324
- border: var(--border-width) solid var(--border-strong); border-radius: var(--radius-sm);
365
+ border: var(--border-width) solid var(--control-border); border-radius: var(--radius-sm);
325
366
  transition: border-color var(--duration-fast) var(--ease-out),
326
367
  box-shadow var(--duration-fast) var(--ease-out);
327
368
  }
@@ -419,7 +460,7 @@
419
460
  }
420
461
  .checkbox__box {
421
462
  width: 20px; height: 20px; flex: none; display: grid; place-items: center;
422
- background: var(--surface); border: 2px solid var(--border-strong); border-radius: 4px;
463
+ background: var(--surface); border: 2px solid var(--control-border); border-radius: 4px;
423
464
  transition: background-color var(--duration-fast) var(--ease-out),
424
465
  border-color var(--duration-fast) var(--ease-out);
425
466
  }
@@ -429,7 +470,7 @@
429
470
  stroke-dasharray: 20; stroke-dashoffset: 20;
430
471
  transition: stroke-dashoffset var(--duration-base) var(--ease-spring);
431
472
  }
432
- .checkbox:hover .checkbox__box { border-color: var(--primary-400); }
473
+ .checkbox:hover .checkbox__box { border-color: var(--focus-color); }
433
474
  .checkbox input:checked ~ .checkbox__box { background: var(--accent); border-color: var(--accent); }
434
475
  .checkbox input:checked ~ .checkbox__box svg { stroke-dashoffset: 0; }
435
476
  .checkbox input:focus-visible ~ .checkbox__box { box-shadow: var(--ring); }
@@ -446,7 +487,7 @@
446
487
 
447
488
  .radio__dot {
448
489
  width: 20px; height: 20px; flex: none; display: grid; place-items: center;
449
- background: var(--surface); border: 2px solid var(--border-strong); border-radius: var(--radius-full);
490
+ background: var(--surface); border: 2px solid var(--control-border); border-radius: var(--radius-full);
450
491
  transition: background-color var(--duration-fast) var(--ease-out),
451
492
  border-color var(--duration-fast) var(--ease-out);
452
493
  }
@@ -455,7 +496,7 @@
455
496
  background: var(--text-on-primary); transform: scale(0);
456
497
  transition: transform var(--duration-base) var(--ease-spring);
457
498
  }
458
- .radio:hover .radio__dot { border-color: var(--primary-400); }
499
+ .radio:hover .radio__dot { border-color: var(--focus-color); }
459
500
  .radio input:checked ~ .radio__dot { background: var(--accent); border-color: var(--accent); }
460
501
  .radio input:checked ~ .radio__dot::after { transform: scale(1); }
461
502
  .radio input:focus-visible ~ .radio__dot { box-shadow: var(--ring); }
@@ -789,10 +830,14 @@
789
830
  background: var(--surface); border: var(--border-width) solid var(--border);
790
831
  border-radius: var(--radius-md); box-shadow: var(--shadow-lg);
791
832
  opacity: 0; transform: translateY(-4px); pointer-events: none;
792
- transition: opacity 160ms var(--ease-out), transform 160ms var(--ease-out);
833
+ transition: opacity var(--duration-fast) var(--ease-out), transform var(--duration-fast) var(--ease-out);
834
+
835
+ visibility: hidden;
836
+
837
+ display: none;
793
838
  }
794
839
  .menu--right { left: auto; right: 0; }
795
- .menu.is-open { opacity: 1; transform: none; pointer-events: auto; }
840
+ .menu.is-open { opacity: 1; transform: none; pointer-events: auto; visibility: visible; display: block; }
796
841
  .menu__item {
797
842
  display: flex; align-items: center; gap: 10px; width: 100%;
798
843
  padding: 9px 12px; border: 0; border-radius: var(--radius-sm);
@@ -1067,7 +1112,7 @@ button.metric-chip:focus-visible { outline: 2px solid var(--focus-color); outlin
1067
1112
  width: 100%; height: var(--control-height-md); padding: 0 14px;
1068
1113
  font-family: var(--font-body); font-size: var(--text-base);
1069
1114
  color: var(--text-primary); background: var(--surface);
1070
- border: var(--border-width) solid var(--border-strong); border-radius: var(--radius-sm);
1115
+ border: var(--border-width) solid var(--control-border); border-radius: var(--radius-sm);
1071
1116
  transition: border-color var(--duration-fast) var(--ease-out),
1072
1117
  box-shadow var(--duration-fast) var(--ease-out);
1073
1118
  }
@@ -1109,7 +1154,7 @@ button.metric-chip:focus-visible { outline: 2px solid var(--focus-color); outlin
1109
1154
  width: 100%; height: var(--control-height-md); padding: 0 40px;
1110
1155
  font-family: var(--font-body); font-size: var(--text-base);
1111
1156
  color: var(--text-primary); background: var(--surface);
1112
- border: var(--border-width) solid var(--border-strong); border-radius: var(--radius-sm);
1157
+ border: var(--border-width) solid var(--control-border); border-radius: var(--radius-sm);
1113
1158
  transition: border-color var(--duration-fast) var(--ease-out),
1114
1159
  box-shadow var(--duration-fast) var(--ease-out);
1115
1160
  }
@@ -1177,8 +1222,12 @@ button.metric-chip:focus-visible { outline: 2px solid var(--focus-color); outlin
1177
1222
  transform-origin: top left; opacity: 0; transform: scale(.96); pointer-events: none;
1178
1223
  transition: opacity var(--duration-base) var(--ease-out),
1179
1224
  transform var(--duration-base) var(--ease-out);
1225
+
1226
+ visibility: hidden;
1227
+
1228
+ display: none;
1180
1229
  }
1181
- .popover.is-open .popover__panel { opacity: 1; transform: none; pointer-events: auto; }
1230
+ .popover.is-open .popover__panel { opacity: 1; transform: none; pointer-events: auto; visibility: visible; display: block; }
1182
1231
  .popover--right .popover__panel { left: auto; right: 0; transform-origin: top right; }
1183
1232
 
1184
1233
  /* ButtonGroup (§10.31) */
@@ -1203,7 +1252,7 @@ button.metric-chip:focus-visible { outline: 2px solid var(--focus-color); outlin
1203
1252
  width: 100%; height: var(--control-height-md); padding: 0 40px 0 14px;
1204
1253
  font-family: var(--font-body); font-size: var(--text-base);
1205
1254
  color: var(--text-primary); background: var(--surface);
1206
- border: var(--border-width) solid var(--border-strong); border-radius: var(--radius-sm);
1255
+ border: var(--border-width) solid var(--control-border); border-radius: var(--radius-sm);
1207
1256
  transition: border-color var(--duration-fast) var(--ease-out),
1208
1257
  box-shadow var(--duration-fast) var(--ease-out);
1209
1258
  }
@@ -1222,8 +1271,12 @@ button.metric-chip:focus-visible { outline: 2px solid var(--focus-color); outlin
1222
1271
  transform-origin: top left; opacity: 0; transform: scale(.96); pointer-events: none;
1223
1272
  transition: opacity var(--duration-base) var(--ease-out),
1224
1273
  transform var(--duration-base) var(--ease-out);
1274
+
1275
+ visibility: hidden;
1276
+
1277
+ display: none;
1225
1278
  }
1226
- .datepicker.is-open .datepicker__calendar { opacity: 1; transform: none; pointer-events: auto; }
1279
+ .datepicker.is-open .datepicker__calendar { opacity: 1; transform: none; pointer-events: auto; visibility: visible; display: block; }
1227
1280
  .datepicker--right .datepicker__calendar { left: auto; right: 0; transform-origin: top right; }
1228
1281
 
1229
1282
  .calendar { width: 15.75rem; }
@@ -1368,3 +1421,168 @@ button.metric-chip:focus-visible { outline: 2px solid var(--focus-color); outlin
1368
1421
  .u-mono { font-family: var(--font-mono); font-variant-numeric: tabular-nums; }
1369
1422
  .u-muted { color: var(--text-muted); }
1370
1423
  .u-measure { max-width: var(--measure); }
1424
+
1425
+ /* CONTRATOS COMPARTIDOS GENERADOS */
1426
+ /* Contratos comunes de interacción; la identidad y los valores viven en tokens.css. */
1427
+ .grid { grid-template-columns: repeat(12, minmax(0, 1fr)); }
1428
+ .grid > *, .field, .card { min-inline-size: 0; }
1429
+ .stack, .card__content, .form-stack, .text-group { display: flex; flex-direction: column; align-items: stretch; }
1430
+ .stack, .card__content { gap: var(--content-gap); }
1431
+ .stack--tight, .text-group { gap: var(--heading-gap); }
1432
+ .stack--cards { gap: var(--card-group-gap); }
1433
+ .form-stack { gap: var(--form-gap); }
1434
+ .cluster { display: flex; flex-wrap: wrap; align-items: center; gap: var(--space-3); }
1435
+ .card { display: flex; flex-direction: column; gap: var(--card-content-gap); }
1436
+ .field { gap: var(--field-gap); }
1437
+ .field__label, .field__help, .field__error, .field > :is(label, p, span, div) { margin-block: 0; }
1438
+ :where(.field + .field, .field + .btn, .field + .cluster) { margin-block-start: var(--form-gap); }
1439
+ :where(.card + .card) { margin-block-start: var(--card-group-gap); }
1440
+ .stack > *, .card__content > *, .form-stack > *, .text-group > *, .grid > .card,
1441
+ .card > :is(h1, h2, h3, h4, h5, h6, p), .text-group > :is(h1, h2, h3, h4, h5, h6, p),
1442
+ .stack > :is(h1, h2, h3, h4, h5, h6, p) { margin-block: 0; }
1443
+ .form-stack > .field { margin-block: 0; }
1444
+ .btn {
1445
+ block-size: auto;
1446
+ min-block-size: var(--control-height-md);
1447
+ max-inline-size: 100%;
1448
+ white-space: normal;
1449
+ line-height: 1.35;
1450
+ text-align: center;
1451
+ }
1452
+ .btn--sm { min-block-size: var(--control-height-sm, 36px); }
1453
+ .btn--lg { min-block-size: var(--control-height-lg, 52px); }
1454
+ .btn--primary, .icon-btn--primary, .calendar__day--selected, .pagination__btn.is-active {
1455
+ background: var(--action-bg);
1456
+ color: var(--text-on-action);
1457
+ }
1458
+ .btn--primary:hover:not(:disabled), .icon-btn--primary:hover:not(:disabled) { background: var(--action-hover); color: var(--text-on-action); }
1459
+ .btn--primary:active:not(:disabled), .icon-btn--primary:active:not(:disabled) { background: var(--action-active); color: var(--text-on-action); }
1460
+ .input, .textarea, .select, .combobox__input, .search__input, .datepicker__input {
1461
+ max-inline-size: 100%;
1462
+ caret-color: var(--focus-color);
1463
+ }
1464
+ .input, .select, .combobox__input, .search__input, .datepicker__input {
1465
+ block-size: auto; min-block-size: var(--control-height-md);
1466
+ padding-block: var(--space-2); line-height: 1.5;
1467
+ }
1468
+ :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); }
1469
+ .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"]),
1470
+ .select:hover:not(:disabled):not(:focus), .combobox__input:hover:not(:disabled):not(:focus),
1471
+ .search__input:hover:not(:focus), .datepicker__input:hover:not(:disabled):not(:focus) { border-color: var(--border-hover); }
1472
+ .input:focus-visible, .textarea:focus-visible, .select:focus-visible,
1473
+ .combobox__input:focus-visible, .search__input:focus-visible, .datepicker__input:focus-visible {
1474
+ outline: 2px solid var(--focus-color);
1475
+ outline-offset: 2px;
1476
+ }
1477
+ .input[aria-invalid="true"], .textarea[aria-invalid="true"] { border-color: var(--danger-text, var(--danger)); }
1478
+ .input.input--error, .textarea.textarea--error,
1479
+ .input.input--error:hover:not(:disabled):not(:focus), .textarea.textarea--error:hover:not(:disabled):not(:focus),
1480
+ :is(.input, .textarea, .select, .combobox__input, .search__input, .datepicker__input)[aria-invalid="true"]:hover:not(:disabled):not(:focus) {
1481
+ border-color: var(--danger-text, var(--danger));
1482
+ }
1483
+ .input.input--success, .input.input--success:hover:not(:disabled):not(:focus) { border-color: var(--success-text, var(--success)); }
1484
+ .pagination { max-inline-size: 100%; flex-wrap: wrap; row-gap: var(--space-2); }
1485
+ .pagination__ellipsis { color: var(--text-muted); }
1486
+ .step--current .step__marker { color: var(--link); border-color: var(--focus-color); }
1487
+ .checkbox input:focus-visible ~ .checkbox__box,
1488
+ .radio input:focus-visible ~ .radio__dot,
1489
+ .switch input:focus-visible ~ .switch__track {
1490
+ outline: 2px solid var(--focus-color);
1491
+ outline-offset: 2px;
1492
+ }
1493
+ input.checkbox, input.radio { border-color: var(--control-border); }
1494
+ input.checkbox:hover, input.radio:hover { border-color: var(--focus-color); }
1495
+ input.checkbox:checked, input.checkbox:indeterminate, input.radio:checked { border-color: var(--focus-color); }
1496
+ .switch__track { background: var(--control-border); }
1497
+ .tabs { max-inline-size: 100%; overflow-x: auto; }
1498
+ .tabs__tab { flex-shrink: 0; }
1499
+ .segmented { max-inline-size: 100%; block-size: auto; min-block-size: var(--control-height-md); overflow-x: auto; }
1500
+ .segmented label { padding-block: var(--space-2); }
1501
+ .stat__row, .breadcrumbs, .check-row { flex-wrap: wrap; row-gap: var(--space-2); }
1502
+ .progress-row, .slider-row { flex-wrap: wrap; gap: var(--space-2); }
1503
+ .stat__value { max-inline-size: 100%; white-space: normal; overflow-wrap: anywhere; }
1504
+ .file-upload, .file-upload__label { min-inline-size: 0; max-inline-size: 100%; }
1505
+ .file-upload__button { max-inline-size: 100%; white-space: normal; text-align: center; }
1506
+ .file-upload__hint { overflow-wrap: anywhere; }
1507
+ .table-scroll { max-inline-size: 100%; overflow-x: auto; overscroll-behavior-inline: contain; }
1508
+ .popover__panel, .datepicker__calendar, .combobox__list {
1509
+ max-inline-size: calc(100vw - 2rem);
1510
+ max-block-size: min(32rem, 70dvh);
1511
+ overflow: auto;
1512
+ }
1513
+ .file-upload__input:focus-visible + .file-upload__label { outline: 2px solid var(--focus-color); outline-offset: 2px; }
1514
+ .calendar { max-inline-size: calc(100vw - 2rem); }
1515
+ .ui-title, :is(h1, h2, h3, h4, h5, h6).ui-title, [data-mode="operate"] :is(h1, h2, h3) {
1516
+ font-family: var(--font-ui-heading);
1517
+ letter-spacing: 0;
1518
+ line-height: 1.3;
1519
+ font-weight: var(--weight-semibold);
1520
+ }
1521
+ .ui-title, :is(h1, h2, h3, h4, h5, h6).ui-title, [data-mode="operate"] h1 { font-size: var(--text-ui-title); }
1522
+ [data-mode="operate"] h2 { font-size: var(--text-xl); }
1523
+ [data-mode="operate"] h3 { font-size: var(--text-lg); }
1524
+ .display, .reading-title, :is(h1, h2, h3, h4, h5, h6):is(.display, .reading-title) {
1525
+ font-family: var(--font-display);
1526
+ font-size: var(--text-display-fluid);
1527
+ line-height: 1.08;
1528
+ letter-spacing: var(--tracking-display);
1529
+ text-wrap: balance;
1530
+ }
1531
+ :where(.celeste-reset, .salvia-reset, .bruma-reset, .nocturna-reset, body[data-system]) {
1532
+ scrollbar-color: var(--control-border) var(--bg);
1533
+ }
1534
+ ::selection,
1535
+ .celeste-reset ::selection, .salvia-reset ::selection, .bruma-reset ::selection {
1536
+ background: var(--selection-bg); color: var(--selection-text);
1537
+ }
1538
+ ::placeholder { color: var(--placeholder); opacity: 1; }
1539
+ :where(a) { text-underline-offset: .2em; text-decoration-thickness: .08em; }
1540
+ .skip-link {
1541
+ position: fixed; inset-block-start: var(--space-2); inset-inline-start: var(--space-2);
1542
+ z-index: 1000; padding: var(--space-3) var(--space-4);
1543
+ background: var(--action-bg); color: var(--text-on-action);
1544
+ border-radius: var(--radius-sm); transform: translateY(-180%);
1545
+ }
1546
+ .skip-link:focus { transform: none; outline: 2px solid var(--focus-color); outline-offset: 2px; }
1547
+ [data-tooltip]::before, [data-tooltip]::after { display: none; }
1548
+ [data-tooltip]:focus-visible::before, [data-tooltip]:focus-visible::after { display: block; }
1549
+ .has-tooltip .tooltip { display: none; }
1550
+ .has-tooltip:has(:focus-visible) .tooltip { display: block; opacity: 1; transform: translate(-50%, 0); }
1551
+ @media (hover: hover) and (pointer: fine) {
1552
+ [data-tooltip]:hover::before, [data-tooltip]:hover::after { display: block; }
1553
+ .has-tooltip:hover .tooltip { display: block; }
1554
+ }
1555
+ @media (pointer: coarse) {
1556
+ .btn, .icon-btn, .segmented label, .pagination button,
1557
+ .tag__close, .search__clear, .toast__close, .check-row,
1558
+ .checkbox:not(input), .radio:not(input), .switch:not(input) {
1559
+ min-block-size: var(--touch-target);
1560
+ min-inline-size: var(--touch-target);
1561
+ }
1562
+ }
1563
+ @media (max-width: 479px) {
1564
+ .btn-group { flex-wrap: wrap; }
1565
+ .modal { max-inline-size: calc(100vw - 2rem); }
1566
+ .stepper { flex-direction: column; align-items: stretch; gap: var(--space-4); }
1567
+ .step { flex-direction: row; align-items: center; gap: var(--space-3); text-align: start; min-inline-size: 0; }
1568
+ .step__label { overflow-wrap: anywhere; }
1569
+ .step__connector { display: none; }
1570
+ }
1571
+ @media (prefers-reduced-motion: reduce) {
1572
+ html, html:focus-within { scroll-behavior: auto; }
1573
+ .spinner, .skeleton, .skeleton::after,
1574
+ .progress--indeterminate .progress__bar, .alert.is-leaving, .toast.is-leaving { animation: none; }
1575
+ .progress--indeterminate .progress__bar { transform: none; }
1576
+ .btn, .icon-btn, .card--interactive, .slider::-webkit-slider-thumb { transform: none; }
1577
+ .btn:active:not(:disabled), .icon-btn:active:not(:disabled), .card--interactive:hover { transform: none; }
1578
+ .btn, .icon-btn { transition: background-color 80ms linear, color 80ms linear; }
1579
+ .menu, .popover__panel, .datepicker__calendar, .link::after { transition: none; }
1580
+ .progress__bar, .progress-ring__value, .accordion__content, .accordion__body { transition: none; }
1581
+ }
1582
+ @media (forced-colors: active) {
1583
+ input.switch, .switch__track { border: 1px solid CanvasText; background: Canvas; }
1584
+ input.switch::after, .switch__track::after { background: CanvasText; }
1585
+ input.switch:checked, .switch input:checked ~ .switch__track { border-color: Highlight; }
1586
+ input.switch:checked::after, .switch input:checked ~ .switch__track::after { background: Highlight; }
1587
+ .checkbox__box, .radio__dot { border-color: CanvasText; }
1588
+ }