@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
- BRUMA LAVANDA — Framework CSS v1.0
1
+ /* ============================================================
2
+ Bruma Lavanda — Design Tokens v1.0
3
3
  Sistema de diseño de Higinio Sosa · light-first
4
4
  Fuente de verdad: DESIGN-bruma-lavanda.md
5
- Uso: enlazar este archivo antes de cualquier estilo propio y aplicar
6
- la clase .bruma-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=Bricolage+Grotesque:wght@600;700&family=Atkinson+Hyperlegible+Next:ital,wght@0,400;0,500;0,600;0,700;1,400&family=Atkinson+Hyperlegible+Mono:wght@400;500&display=swap");
10
10
 
11
- /* --------------------------------------------------------------------------
12
- 1. TOKENS (§13)
13
- -------------------------------------------------------------------------- */
14
11
  :root {
15
12
  /* == Primitivos: primario (Lavanda) ==
16
13
  Lavanda apagada, nunca violeta saturado. El acento no rellena áreas grandes:
@@ -51,12 +48,6 @@
51
48
  --accent-soft: var(--primary-50);
52
49
  --accent-soft-strong: var(--primary-100);
53
50
  --link: var(--primary-600); /* AA 7.98:1 sobre --surface — texto de links y ghost */
54
- --overlay: rgba(31, 30, 40, .5);
55
- --tooltip-bg: var(--neutral-900); /* 15.94:1 con --tooltip-text */
56
- --tooltip-text: var(--neutral-0);
57
- --focus-color: var(--accent); /* contorno de foco de teclado: 6.40:1 sobre --surface */
58
- --text-on-danger: var(--neutral-0); /* texto del botón destructivo: 5.01:1 sobre --danger-500 */
59
- --border-hover: var(--neutral-500); /* borde de campos en hover: 6.38:1 sobre --surface */
60
51
 
61
52
  /* == Tipografía == */
62
53
  --font-display: "Bricolage Grotesque", system-ui, sans-serif;
@@ -97,7 +88,6 @@
97
88
  /* == Focus == */
98
89
  --ring: 0 0 0 3px rgba(91,87,138,.25);
99
90
  --ring-color: rgba(91,87,138,.25);
100
- --ring-danger: 0 0 0 3px rgba(178,76,85,.22);
101
91
 
102
92
  /* == Motion (corto y preciso) == */
103
93
  --duration-instant: 100ms; --duration-fast: 140ms; --duration-base: 180ms;
@@ -109,9 +99,48 @@
109
99
  --stagger-step: 30ms;
110
100
 
111
101
  color-scheme: light;
112
- }
113
102
 
114
- /* Modo oscuro (§15) */
103
+ --overlay: rgba(31, 30, 40, .5);
104
+ --tooltip-bg: var(--neutral-900);
105
+ --tooltip-text: var(--neutral-0);
106
+ --focus-color: var(--accent);
107
+ --text-on-danger: var(--neutral-0);
108
+ --border-hover: var(--neutral-500);
109
+ --ring-danger: 0 0 0 3px rgba(178,76,85,.22);
110
+
111
+ --action-bg: var(--accent);
112
+ --action-hover: var(--accent-hover);
113
+ --action-active: var(--accent-active);
114
+ --text-on-action: var(--text-on-primary);
115
+ --control-border: var(--border-strong);
116
+ --placeholder: var(--text-muted);
117
+ --selection-bg: var(--action-bg);
118
+ --selection-text: var(--text-on-action);
119
+ --font-ui-heading: var(--font-body);
120
+ --text-ui-title: 2rem;
121
+ --touch-target: 44px;
122
+ --text-display-fluid: clamp(2.5rem, 1.8rem + 2.2vw, 4.25rem);
123
+
124
+ /* Series categóricas: orden estable; acompañar con etiqueta o forma. */
125
+ --chart-1: #857bc1;
126
+ --chart-2: #8a600a;
127
+ --chart-3: #4a8cc1;
128
+ --chart-4: #853f63;
129
+ --chart-5: #129a92;
130
+ --chart-6: #8e4031;
131
+ --chart-7: #5b975e;
132
+ /* Ritmo de contenido y formularios. */
133
+ --field-gap: 6px;
134
+ --heading-gap: var(--space-2);
135
+ --content-gap: var(--space-4);
136
+ --card-content-gap: var(--space-4);
137
+ --card-group-gap: var(--space-5);
138
+
139
+ }
140
+
141
+ /* == Modo oscuro (variante) — alternar data-theme en <html> ==
142
+ Sin sombras en las capas: se separan por superficie y borde, y solo
143
+ los overlays (lg/xl) conservan una sombra tenue. */
115
144
  [data-theme="dark"] {
116
145
  --bg: #16151c;
117
146
  --surface: #1f1e27;
@@ -130,31 +159,49 @@
130
159
  --text-on-primary: #16151c;
131
160
  --text-on-primary-solid: #c4c1e6;
132
161
  --link: #c4c1e6;
133
- --overlay: rgba(0, 0, 0, .6);
134
- --tooltip-bg: #e7e6ef; /* 13.31:1 con --tooltip-text */
135
- --tooltip-text: #1f1e28;
136
- --focus-color: var(--accent); /* 7.68:1 sobre --surface */
137
- --text-on-danger: #16151c; /* 6.99:1 sobre --danger-500 */
138
- --border-hover: #aaa8bb; /* 7.09:1 sobre --surface */
139
162
  --success-500: #6cc1ad; --success-100: #13261f; --success-text: #8bd1c0;
140
163
  --warning-500: #d6a752; --warning-100: #29220f; --warning-text: #e4c07f;
141
164
  --danger-500: #e08890; --danger-100: #2c171a; --danger-text: #eba4ab;
142
165
  --info-500: #8daecb; --info-100: #172129; --info-text: #a8c3da;
143
166
  --ring: 0 0 0 3px rgba(176,172,220,.3);
144
167
  --ring-color: rgba(176,172,220,.3);
145
- --ring-danger: 0 0 0 3px rgba(224,136,144,.25);
146
168
  --shadow-xs: none;
147
169
  --shadow-sm: none;
148
170
  --shadow-md: none;
149
171
  --shadow-lg: 0 8px 20px rgba(8,8,12,.28);
150
172
  --shadow-xl: 0 16px 32px rgba(8,8,12,.32);
151
173
  color-scheme: dark;
174
+
175
+ --overlay: rgba(0, 0, 0, .6);
176
+ --tooltip-bg: #e7e6ef;
177
+ --tooltip-text: #1f1e28;
178
+ --focus-color: var(--accent);
179
+ --text-on-danger: #16151c;
180
+ --border-hover: #aaa8bb;
181
+ --ring-danger: 0 0 0 3px rgba(224,136,144,.25);
182
+
183
+ --selection-bg: var(--action-bg);
184
+ --selection-text: var(--text-on-action);
185
+
186
+ /* Series categóricas: orden estable; acompañar con etiqueta o forma. */
187
+ --chart-1: #877cc3;
188
+ --chart-2: #946a1c;
189
+ --chart-3: #5798ce;
190
+ --chart-4: #a0587c;
191
+ --chart-5: #2aa79e;
192
+ --chart-6: #aa5849;
193
+ --chart-7: #67a369;
152
194
  }
153
195
 
196
+ /* == Accesibilidad del movimiento == */
197
+
198
+ @media (prefers-reduced-motion: reduce) {
199
+ :root {
200
+ --duration-instant: 0ms; --duration-fast: 0ms; --duration-base: 0ms;
201
+ --duration-slow: 0ms; --duration-page: 0ms; --stagger-step: 0ms;
202
+ }
203
+ }
154
204
 
155
- /* --------------------------------------------------------------------------
156
- 2. BASE (§6, §11.5, §13)
157
- -------------------------------------------------------------------------- */
158
205
  *, *::before, *::after { box-sizing: border-box; }
159
206
 
160
207
  /* Focus ring global de teclado — especificidad cero vía :where() */
@@ -196,17 +243,10 @@
196
243
  .bruma-reset h6 { font-size: var(--text-base); line-height: var(--leading-base); }
197
244
  .bruma-reset p { max-width: var(--measure); margin: 0 0 1em; }
198
245
  .bruma-reset table { font-variant-numeric: tabular-nums; }
199
- .bruma-reset ::placeholder { color: var(--text-disabled); }
246
+ .bruma-reset ::placeholder { color: var(--placeholder); }
200
247
  .bruma-reset ::selection { background: var(--ring-color); }
201
248
 
202
- @media (prefers-reduced-motion: reduce) {
203
- *, *::before, *::after {
204
- animation-duration: 0.01ms !important;
205
- animation-iteration-count: 1 !important;
206
- transition-duration: 0.01ms !important;
207
- scroll-behavior: auto !important;
208
- }
209
- }
249
+
210
250
 
211
251
  /* --------------------------------------------------------------------------
212
252
  3. LAYOUT — contenedor, grid 12 col (§14)
@@ -254,12 +294,12 @@
254
294
  /* Gating de hover (§11.5): los hover que mueven/elevan (transform, box-shadow) van
255
295
  dentro de @media (hover: hover) and (pointer: fine) — en touch el tap dispara
256
296
  hovers falsos que se quedan pegados. Los hover de solo color/fondo quedan fuera. */
257
- .btn--primary { background: var(--accent); color: var(--text-on-primary); }
258
- .btn--primary:hover:not(:disabled) { background: var(--accent-hover); }
297
+ .btn--primary { background: var(--action-bg); color: var(--text-on-action); }
298
+ .btn--primary:hover:not(:disabled) { background: var(--action-hover); }
259
299
  @media (hover: hover) and (pointer: fine) {
260
300
  .btn--primary:hover:not(:disabled) { box-shadow: var(--shadow-sm); }
261
301
  }
262
- .btn--primary:active:not(:disabled) { background: var(--accent-active); box-shadow: none; }
302
+ .btn--primary:active:not(:disabled) { background: var(--action-active); box-shadow: none; }
263
303
  .btn--primary:disabled { background: var(--border); color: var(--text-disabled); box-shadow: none; }
264
304
 
265
305
  .btn--secondary { background: var(--surface); border-color: var(--border-strong); color: var(--text-primary); }
@@ -326,7 +366,7 @@
326
366
  .input, .textarea, .select {
327
367
  width: 100%; font-family: var(--font-body); font-size: var(--text-base);
328
368
  color: var(--text-primary); background: var(--surface);
329
- border: var(--border-width) solid var(--border-strong); border-radius: var(--radius-sm);
369
+ border: var(--border-width) solid var(--control-border); border-radius: var(--radius-sm);
330
370
  transition: border-color var(--duration-fast) var(--ease-out),
331
371
  box-shadow var(--duration-fast) var(--ease-out);
332
372
  }
@@ -424,7 +464,7 @@
424
464
  }
425
465
  .checkbox__box {
426
466
  width: 20px; height: 20px; flex: none; display: grid; place-items: center;
427
- background: var(--surface); border: 2px solid var(--border-strong); border-radius: 4px;
467
+ background: var(--surface); border: 2px solid var(--control-border); border-radius: 4px;
428
468
  transition: background-color var(--duration-fast) var(--ease-out),
429
469
  border-color var(--duration-fast) var(--ease-out);
430
470
  }
@@ -434,7 +474,7 @@
434
474
  stroke-dasharray: 20; stroke-dashoffset: 20;
435
475
  transition: stroke-dashoffset var(--duration-base) var(--ease-spring);
436
476
  }
437
- .checkbox:hover .checkbox__box { border-color: var(--primary-400); }
477
+ .checkbox:hover .checkbox__box { border-color: var(--focus-color); }
438
478
  .checkbox input:checked ~ .checkbox__box { background: var(--accent); border-color: var(--accent); }
439
479
  .checkbox input:checked ~ .checkbox__box svg { stroke-dashoffset: 0; }
440
480
  .checkbox input:focus-visible ~ .checkbox__box { box-shadow: var(--ring); }
@@ -451,7 +491,7 @@
451
491
 
452
492
  .radio__dot {
453
493
  width: 20px; height: 20px; flex: none; display: grid; place-items: center;
454
- background: var(--surface); border: 2px solid var(--border-strong); border-radius: var(--radius-full);
494
+ background: var(--surface); border: 2px solid var(--control-border); border-radius: var(--radius-full);
455
495
  transition: background-color var(--duration-fast) var(--ease-out),
456
496
  border-color var(--duration-fast) var(--ease-out);
457
497
  }
@@ -460,7 +500,7 @@
460
500
  background: var(--text-on-primary); transform: scale(0);
461
501
  transition: transform var(--duration-base) var(--ease-spring);
462
502
  }
463
- .radio:hover .radio__dot { border-color: var(--primary-400); }
503
+ .radio:hover .radio__dot { border-color: var(--focus-color); }
464
504
  .radio input:checked ~ .radio__dot { background: var(--accent); border-color: var(--accent); }
465
505
  .radio input:checked ~ .radio__dot::after { transform: scale(1); }
466
506
  .radio input:focus-visible ~ .radio__dot { box-shadow: var(--ring); }
@@ -793,10 +833,14 @@
793
833
  background: var(--surface); border: var(--border-width) solid var(--border);
794
834
  border-radius: var(--radius-md); box-shadow: var(--shadow-lg);
795
835
  opacity: 0; transform: translateY(-4px); pointer-events: none;
796
- transition: opacity 160ms var(--ease-out), transform 160ms var(--ease-out);
836
+ transition: opacity var(--duration-fast) var(--ease-out), transform var(--duration-fast) var(--ease-out);
837
+
838
+ visibility: hidden;
839
+
840
+ display: none;
797
841
  }
798
842
  .menu--right { left: auto; right: 0; }
799
- .menu.is-open { opacity: 1; transform: none; pointer-events: auto; }
843
+ .menu.is-open { opacity: 1; transform: none; pointer-events: auto; visibility: visible; display: block; }
800
844
  .menu__item {
801
845
  display: flex; align-items: center; gap: 10px; width: 100%;
802
846
  padding: 9px 12px; border: 0; border-radius: var(--radius-sm);
@@ -1071,7 +1115,7 @@ button.metric-chip:focus-visible { outline: 2px solid var(--focus-color); outlin
1071
1115
  width: 100%; height: var(--control-height-md); padding: 0 14px;
1072
1116
  font-family: var(--font-body); font-size: var(--text-base);
1073
1117
  color: var(--text-primary); background: var(--surface);
1074
- border: var(--border-width) solid var(--border-strong); border-radius: var(--radius-sm);
1118
+ border: var(--border-width) solid var(--control-border); border-radius: var(--radius-sm);
1075
1119
  transition: border-color var(--duration-fast) var(--ease-out),
1076
1120
  box-shadow var(--duration-fast) var(--ease-out);
1077
1121
  }
@@ -1113,7 +1157,7 @@ button.metric-chip:focus-visible { outline: 2px solid var(--focus-color); outlin
1113
1157
  width: 100%; height: var(--control-height-md); padding: 0 40px;
1114
1158
  font-family: var(--font-body); font-size: var(--text-base);
1115
1159
  color: var(--text-primary); background: var(--surface);
1116
- border: var(--border-width) solid var(--border-strong); border-radius: var(--radius-sm);
1160
+ border: var(--border-width) solid var(--control-border); border-radius: var(--radius-sm);
1117
1161
  transition: border-color var(--duration-fast) var(--ease-out),
1118
1162
  box-shadow var(--duration-fast) var(--ease-out);
1119
1163
  }
@@ -1181,8 +1225,12 @@ button.metric-chip:focus-visible { outline: 2px solid var(--focus-color); outlin
1181
1225
  transform-origin: top left; opacity: 0; transform: scale(.96); pointer-events: none;
1182
1226
  transition: opacity var(--duration-base) var(--ease-out),
1183
1227
  transform var(--duration-base) var(--ease-out);
1228
+
1229
+ visibility: hidden;
1230
+
1231
+ display: none;
1184
1232
  }
1185
- .popover.is-open .popover__panel { opacity: 1; transform: none; pointer-events: auto; }
1233
+ .popover.is-open .popover__panel { opacity: 1; transform: none; pointer-events: auto; visibility: visible; display: block; }
1186
1234
  .popover--right .popover__panel { left: auto; right: 0; transform-origin: top right; }
1187
1235
 
1188
1236
  /* ButtonGroup (§10.31) */
@@ -1207,7 +1255,7 @@ button.metric-chip:focus-visible { outline: 2px solid var(--focus-color); outlin
1207
1255
  width: 100%; height: var(--control-height-md); padding: 0 40px 0 14px;
1208
1256
  font-family: var(--font-body); font-size: var(--text-base);
1209
1257
  color: var(--text-primary); background: var(--surface);
1210
- border: var(--border-width) solid var(--border-strong); border-radius: var(--radius-sm);
1258
+ border: var(--border-width) solid var(--control-border); border-radius: var(--radius-sm);
1211
1259
  transition: border-color var(--duration-fast) var(--ease-out),
1212
1260
  box-shadow var(--duration-fast) var(--ease-out);
1213
1261
  }
@@ -1226,8 +1274,12 @@ button.metric-chip:focus-visible { outline: 2px solid var(--focus-color); outlin
1226
1274
  transform-origin: top left; opacity: 0; transform: scale(.96); pointer-events: none;
1227
1275
  transition: opacity var(--duration-base) var(--ease-out),
1228
1276
  transform var(--duration-base) var(--ease-out);
1277
+
1278
+ visibility: hidden;
1279
+
1280
+ display: none;
1229
1281
  }
1230
- .datepicker.is-open .datepicker__calendar { opacity: 1; transform: none; pointer-events: auto; }
1282
+ .datepicker.is-open .datepicker__calendar { opacity: 1; transform: none; pointer-events: auto; visibility: visible; display: block; }
1231
1283
  .datepicker--right .datepicker__calendar { left: auto; right: 0; transform-origin: top right; }
1232
1284
 
1233
1285
  .calendar { width: 15.75rem; }
@@ -1372,3 +1424,168 @@ button.metric-chip:focus-visible { outline: 2px solid var(--focus-color); outlin
1372
1424
  .u-mono { font-family: var(--font-mono); font-variant-numeric: tabular-nums; }
1373
1425
  .u-muted { color: var(--text-muted); }
1374
1426
  .u-measure { max-width: var(--measure); }
1427
+
1428
+ /* CONTRATOS COMPARTIDOS GENERADOS */
1429
+ /* Contratos comunes de interacción; la identidad y los valores viven en tokens.css. */
1430
+ .grid { grid-template-columns: repeat(12, minmax(0, 1fr)); }
1431
+ .grid > *, .field, .card { min-inline-size: 0; }
1432
+ .stack, .card__content, .form-stack, .text-group { display: flex; flex-direction: column; align-items: stretch; }
1433
+ .stack, .card__content { gap: var(--content-gap); }
1434
+ .stack--tight, .text-group { gap: var(--heading-gap); }
1435
+ .stack--cards { gap: var(--card-group-gap); }
1436
+ .form-stack { gap: var(--form-gap); }
1437
+ .cluster { display: flex; flex-wrap: wrap; align-items: center; gap: var(--space-3); }
1438
+ .card { display: flex; flex-direction: column; gap: var(--card-content-gap); }
1439
+ .field { gap: var(--field-gap); }
1440
+ .field__label, .field__help, .field__error, .field > :is(label, p, span, div) { margin-block: 0; }
1441
+ :where(.field + .field, .field + .btn, .field + .cluster) { margin-block-start: var(--form-gap); }
1442
+ :where(.card + .card) { margin-block-start: var(--card-group-gap); }
1443
+ .stack > *, .card__content > *, .form-stack > *, .text-group > *, .grid > .card,
1444
+ .card > :is(h1, h2, h3, h4, h5, h6, p), .text-group > :is(h1, h2, h3, h4, h5, h6, p),
1445
+ .stack > :is(h1, h2, h3, h4, h5, h6, p) { margin-block: 0; }
1446
+ .form-stack > .field { margin-block: 0; }
1447
+ .btn {
1448
+ block-size: auto;
1449
+ min-block-size: var(--control-height-md);
1450
+ max-inline-size: 100%;
1451
+ white-space: normal;
1452
+ line-height: 1.35;
1453
+ text-align: center;
1454
+ }
1455
+ .btn--sm { min-block-size: var(--control-height-sm, 36px); }
1456
+ .btn--lg { min-block-size: var(--control-height-lg, 52px); }
1457
+ .btn--primary, .icon-btn--primary, .calendar__day--selected, .pagination__btn.is-active {
1458
+ background: var(--action-bg);
1459
+ color: var(--text-on-action);
1460
+ }
1461
+ .btn--primary:hover:not(:disabled), .icon-btn--primary:hover:not(:disabled) { background: var(--action-hover); color: var(--text-on-action); }
1462
+ .btn--primary:active:not(:disabled), .icon-btn--primary:active:not(:disabled) { background: var(--action-active); color: var(--text-on-action); }
1463
+ .input, .textarea, .select, .combobox__input, .search__input, .datepicker__input {
1464
+ max-inline-size: 100%;
1465
+ caret-color: var(--focus-color);
1466
+ }
1467
+ .input, .select, .combobox__input, .search__input, .datepicker__input {
1468
+ block-size: auto; min-block-size: var(--control-height-md);
1469
+ padding-block: var(--space-2); line-height: 1.5;
1470
+ }
1471
+ :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); }
1472
+ .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"]),
1473
+ .select:hover:not(:disabled):not(:focus), .combobox__input:hover:not(:disabled):not(:focus),
1474
+ .search__input:hover:not(:focus), .datepicker__input:hover:not(:disabled):not(:focus) { border-color: var(--border-hover); }
1475
+ .input:focus-visible, .textarea:focus-visible, .select:focus-visible,
1476
+ .combobox__input:focus-visible, .search__input:focus-visible, .datepicker__input:focus-visible {
1477
+ outline: 2px solid var(--focus-color);
1478
+ outline-offset: 2px;
1479
+ }
1480
+ .input[aria-invalid="true"], .textarea[aria-invalid="true"] { border-color: var(--danger-text, var(--danger)); }
1481
+ .input.input--error, .textarea.textarea--error,
1482
+ .input.input--error:hover:not(:disabled):not(:focus), .textarea.textarea--error:hover:not(:disabled):not(:focus),
1483
+ :is(.input, .textarea, .select, .combobox__input, .search__input, .datepicker__input)[aria-invalid="true"]:hover:not(:disabled):not(:focus) {
1484
+ border-color: var(--danger-text, var(--danger));
1485
+ }
1486
+ .input.input--success, .input.input--success:hover:not(:disabled):not(:focus) { border-color: var(--success-text, var(--success)); }
1487
+ .pagination { max-inline-size: 100%; flex-wrap: wrap; row-gap: var(--space-2); }
1488
+ .pagination__ellipsis { color: var(--text-muted); }
1489
+ .step--current .step__marker { color: var(--link); border-color: var(--focus-color); }
1490
+ .checkbox input:focus-visible ~ .checkbox__box,
1491
+ .radio input:focus-visible ~ .radio__dot,
1492
+ .switch input:focus-visible ~ .switch__track {
1493
+ outline: 2px solid var(--focus-color);
1494
+ outline-offset: 2px;
1495
+ }
1496
+ input.checkbox, input.radio { border-color: var(--control-border); }
1497
+ input.checkbox:hover, input.radio:hover { border-color: var(--focus-color); }
1498
+ input.checkbox:checked, input.checkbox:indeterminate, input.radio:checked { border-color: var(--focus-color); }
1499
+ .switch__track { background: var(--control-border); }
1500
+ .tabs { max-inline-size: 100%; overflow-x: auto; }
1501
+ .tabs__tab { flex-shrink: 0; }
1502
+ .segmented { max-inline-size: 100%; block-size: auto; min-block-size: var(--control-height-md); overflow-x: auto; }
1503
+ .segmented label { padding-block: var(--space-2); }
1504
+ .stat__row, .breadcrumbs, .check-row { flex-wrap: wrap; row-gap: var(--space-2); }
1505
+ .progress-row, .slider-row { flex-wrap: wrap; gap: var(--space-2); }
1506
+ .stat__value { max-inline-size: 100%; white-space: normal; overflow-wrap: anywhere; }
1507
+ .file-upload, .file-upload__label { min-inline-size: 0; max-inline-size: 100%; }
1508
+ .file-upload__button { max-inline-size: 100%; white-space: normal; text-align: center; }
1509
+ .file-upload__hint { overflow-wrap: anywhere; }
1510
+ .table-scroll { max-inline-size: 100%; overflow-x: auto; overscroll-behavior-inline: contain; }
1511
+ .popover__panel, .datepicker__calendar, .combobox__list {
1512
+ max-inline-size: calc(100vw - 2rem);
1513
+ max-block-size: min(32rem, 70dvh);
1514
+ overflow: auto;
1515
+ }
1516
+ .file-upload__input:focus-visible + .file-upload__label { outline: 2px solid var(--focus-color); outline-offset: 2px; }
1517
+ .calendar { max-inline-size: calc(100vw - 2rem); }
1518
+ .ui-title, :is(h1, h2, h3, h4, h5, h6).ui-title, [data-mode="operate"] :is(h1, h2, h3) {
1519
+ font-family: var(--font-ui-heading);
1520
+ letter-spacing: 0;
1521
+ line-height: 1.3;
1522
+ font-weight: var(--weight-semibold);
1523
+ }
1524
+ .ui-title, :is(h1, h2, h3, h4, h5, h6).ui-title, [data-mode="operate"] h1 { font-size: var(--text-ui-title); }
1525
+ [data-mode="operate"] h2 { font-size: var(--text-xl); }
1526
+ [data-mode="operate"] h3 { font-size: var(--text-lg); }
1527
+ .display, .reading-title, :is(h1, h2, h3, h4, h5, h6):is(.display, .reading-title) {
1528
+ font-family: var(--font-display);
1529
+ font-size: var(--text-display-fluid);
1530
+ line-height: 1.08;
1531
+ letter-spacing: var(--tracking-display);
1532
+ text-wrap: balance;
1533
+ }
1534
+ :where(.celeste-reset, .salvia-reset, .bruma-reset, .nocturna-reset, body[data-system]) {
1535
+ scrollbar-color: var(--control-border) var(--bg);
1536
+ }
1537
+ ::selection,
1538
+ .celeste-reset ::selection, .salvia-reset ::selection, .bruma-reset ::selection {
1539
+ background: var(--selection-bg); color: var(--selection-text);
1540
+ }
1541
+ ::placeholder { color: var(--placeholder); opacity: 1; }
1542
+ :where(a) { text-underline-offset: .2em; text-decoration-thickness: .08em; }
1543
+ .skip-link {
1544
+ position: fixed; inset-block-start: var(--space-2); inset-inline-start: var(--space-2);
1545
+ z-index: 1000; padding: var(--space-3) var(--space-4);
1546
+ background: var(--action-bg); color: var(--text-on-action);
1547
+ border-radius: var(--radius-sm); transform: translateY(-180%);
1548
+ }
1549
+ .skip-link:focus { transform: none; outline: 2px solid var(--focus-color); outline-offset: 2px; }
1550
+ [data-tooltip]::before, [data-tooltip]::after { display: none; }
1551
+ [data-tooltip]:focus-visible::before, [data-tooltip]:focus-visible::after { display: block; }
1552
+ .has-tooltip .tooltip { display: none; }
1553
+ .has-tooltip:has(:focus-visible) .tooltip { display: block; opacity: 1; transform: translate(-50%, 0); }
1554
+ @media (hover: hover) and (pointer: fine) {
1555
+ [data-tooltip]:hover::before, [data-tooltip]:hover::after { display: block; }
1556
+ .has-tooltip:hover .tooltip { display: block; }
1557
+ }
1558
+ @media (pointer: coarse) {
1559
+ .btn, .icon-btn, .segmented label, .pagination button,
1560
+ .tag__close, .search__clear, .toast__close, .check-row,
1561
+ .checkbox:not(input), .radio:not(input), .switch:not(input) {
1562
+ min-block-size: var(--touch-target);
1563
+ min-inline-size: var(--touch-target);
1564
+ }
1565
+ }
1566
+ @media (max-width: 479px) {
1567
+ .btn-group { flex-wrap: wrap; }
1568
+ .modal { max-inline-size: calc(100vw - 2rem); }
1569
+ .stepper { flex-direction: column; align-items: stretch; gap: var(--space-4); }
1570
+ .step { flex-direction: row; align-items: center; gap: var(--space-3); text-align: start; min-inline-size: 0; }
1571
+ .step__label { overflow-wrap: anywhere; }
1572
+ .step__connector { display: none; }
1573
+ }
1574
+ @media (prefers-reduced-motion: reduce) {
1575
+ html, html:focus-within { scroll-behavior: auto; }
1576
+ .spinner, .skeleton, .skeleton::after,
1577
+ .progress--indeterminate .progress__bar, .alert.is-leaving, .toast.is-leaving { animation: none; }
1578
+ .progress--indeterminate .progress__bar { transform: none; }
1579
+ .btn, .icon-btn, .card--interactive, .slider::-webkit-slider-thumb { transform: none; }
1580
+ .btn:active:not(:disabled), .icon-btn:active:not(:disabled), .card--interactive:hover { transform: none; }
1581
+ .btn, .icon-btn { transition: background-color 80ms linear, color 80ms linear; }
1582
+ .menu, .popover__panel, .datepicker__calendar, .link::after { transition: none; }
1583
+ .progress__bar, .progress-ring__value, .accordion__content, .accordion__body { transition: none; }
1584
+ }
1585
+ @media (forced-colors: active) {
1586
+ input.switch, .switch__track { border: 1px solid CanvasText; background: Canvas; }
1587
+ input.switch::after, .switch__track::after { background: CanvasText; }
1588
+ input.switch:checked, .switch input:checked ~ .switch__track { border-color: Highlight; }
1589
+ input.switch:checked::after, .switch input:checked ~ .switch__track::after { background: Highlight; }
1590
+ .checkbox__box, .radio__dot { border-color: CanvasText; }
1591
+ }