trace-css 0.0.0-stage → 0.1.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.
Files changed (39) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +0 -3
  3. package/dist/trace.classless.conditional.css +1534 -0
  4. package/dist/trace.classless.conditional.min.css +1 -0
  5. package/dist/trace.classless.css +1532 -0
  6. package/dist/trace.classless.min.css +1 -0
  7. package/dist/trace.conditional.css +2138 -0
  8. package/dist/trace.conditional.min.css +1 -0
  9. package/dist/trace.css +2136 -0
  10. package/dist/trace.min.css +1 -0
  11. package/package.json +63 -4
  12. package/src/classless.css +16 -0
  13. package/src/content/link.css +75 -0
  14. package/src/content/table.css +108 -0
  15. package/src/content/table.extensions.css +45 -0
  16. package/src/content/typography.css +201 -0
  17. package/src/elements/button.css +168 -0
  18. package/src/elements/button.extensions.css +171 -0
  19. package/src/elements/icon.extensions.css +22 -0
  20. package/src/elements/loader.css +73 -0
  21. package/src/elements/loader.extensions.css +27 -0
  22. package/src/forms/checkbox.css +146 -0
  23. package/src/forms/checkbox.extensions.css +9 -0
  24. package/src/forms/file.css +39 -0
  25. package/src/forms/input.css +199 -0
  26. package/src/forms/input.extensions.css +171 -0
  27. package/src/forms/radio.css +112 -0
  28. package/src/forms/radio.extensions.css +9 -0
  29. package/src/forms/range.css +170 -0
  30. package/src/forms/range.extensions.css +13 -0
  31. package/src/forms/select.css +160 -0
  32. package/src/forms/select.extensions.css +107 -0
  33. package/src/forms/switch.css +156 -0
  34. package/src/forms/switch.extensions.css +122 -0
  35. package/src/forms/textarea.css +133 -0
  36. package/src/forms/textarea.extensions.css +15 -0
  37. package/src/foundation.css +35 -0
  38. package/src/index.css +14 -0
  39. package/src/variables.css +112 -0
@@ -0,0 +1,1532 @@
1
+ @layer trace.foundation {
2
+ :where(:root) {
3
+ --trace-bg-light: oklch(96.2441% .00418752 236.497);
4
+ --trace-bg-dark: oklch(19.7902% .0189863 235.357);
5
+ --trace-neutral: oklch(50% 0 0);
6
+ --trace-neutral-lighter: oklch(from var(--trace-neutral) calc(l + .5) c h);
7
+ --trace-neutral-light: oklch(from var(--trace-neutral) calc(l + .25) c h);
8
+ --trace-neutral-dark: oklch(from var(--trace-neutral) calc(l - .25) c h);
9
+ --trace-neutral-darker: oklch(from var(--trace-neutral) calc(l - .5) c h);
10
+ --trace-text-light: oklch(9.44872% .0654731 264.052);
11
+ --trace-text-dark: oklch(92.494% 0 0);
12
+ --trace-primary: oklch(37.662% .0682014 228.503);
13
+ --trace-secondary: oklch(87.9592% .170365 81.3235);
14
+ --trace-primary-lighter: oklch(from var(--trace-primary) calc(l + (1 - l) * .6) c h);
15
+ --trace-primary-light: oklch(from var(--trace-primary) calc(l + (1 - l) * .3) c h);
16
+ --trace-primary-dark: oklch(from var(--trace-primary) calc(l * .7) c h);
17
+ --trace-primary-darker: oklch(from var(--trace-primary) calc(l * .4) c h);
18
+ --trace-secondary-lighter: oklch(from var(--trace-secondary) calc(l + (1 - l) * .6) c h);
19
+ --trace-secondary-light: oklch(from var(--trace-secondary) calc(l + (1 - l) * .3) c h);
20
+ --trace-secondary-dark: oklch(from var(--trace-secondary) calc(l * .7) c h);
21
+ --trace-secondary-darker: oklch(from var(--trace-secondary) calc(l * .4) c h);
22
+ --trace-danger: oklch(52.3358% .198564 31.9584);
23
+ --trace-success: oklch(69.13% .14353 158.708);
24
+ --trace-font-family-emoji: "Apple Color Emoji", "Segoe UI Emoji", "Noto Color Emoji";
25
+ --trace-font-family-sans: system-ui, sans-serif, var(--trace-font-family-emoji);
26
+ --trace-font-family-mono: ui-monospace, "SFMono-Regular", Menlo, Consolas, "Liberation Mono",
27
+ monospace, var(--trace-font-family-emoji);
28
+ --trace-font-body: var(--trace-font-family-sans);
29
+ --trace-font-heading: var(--trace-font-body);
30
+ --trace-font-code: var(--trace-font-family-mono);
31
+ --trace-radius-none: 0;
32
+ --trace-radius-sm: 4px;
33
+ --trace-radius-full: 50%;
34
+ --trace-radius-control: var(--trace-radius-sm);
35
+ --trace-control-padding-block: .625rem;
36
+ --trace-control-padding-inline: 1rem;
37
+ --trace-shadow-color: light-dark(oklch(from var(--trace-neutral-darker) l c h / 25%), oklch(from var(--trace-neutral-lighter) l c h / 25%));
38
+ --trace-shadow: 5px 5px 0 0 var(--trace-shadow-color);
39
+ --trace-bg: light-dark(var(--trace-bg-light), var(--trace-bg-dark));
40
+ --trace-text: light-dark(var(--trace-text-light), var(--trace-text-dark));
41
+ --trace-control-bg: light-dark(var(--trace-neutral-lighter), var(--trace-bg-dark));
42
+ }
43
+
44
+ :where(*) {
45
+ box-sizing: border-box;
46
+ }
47
+
48
+ :where(body) {
49
+ font-family: var(--trace-font-body);
50
+ background-color: var(--trace-bg);
51
+ color: var(--trace-text);
52
+ margin: 0;
53
+ }
54
+
55
+ :where(button, input, select, textarea) {
56
+ font: inherit;
57
+ }
58
+
59
+ :where(:root) {
60
+ color-scheme: light dark;
61
+ }
62
+
63
+ :where([data-mode="light"], [data-mode="dark"]) {
64
+ background-color: var(--trace-bg);
65
+ color: var(--trace-text);
66
+ }
67
+
68
+ :where([data-mode="light"]) {
69
+ color-scheme: light;
70
+ }
71
+
72
+ :where([data-mode="dark"]) {
73
+ color-scheme: dark;
74
+ }
75
+ }
76
+
77
+ @layer trace.elements {
78
+ :where(:root) {
79
+ --trace-font-size-h1: 3rem;
80
+ --trace-font-size-h2: 2.5rem;
81
+ --trace-font-size-h3: 2rem;
82
+ --trace-font-size-h4: 1.5rem;
83
+ --trace-font-size-h5: 1.25rem;
84
+ --trace-font-size-h6: 1rem;
85
+ --trace-typography-line-height: 1.6;
86
+ --trace-heading-line-height: 1.25;
87
+ --trace-heading-margin-block-end: 1rem;
88
+ --trace-paragraph-margin-block-end: 1rem;
89
+ --trace-divider-margin-block: 2rem;
90
+ --trace-blockquote-margin-block: 1.5rem;
91
+ --trace-blockquote-padding-block: .75rem;
92
+ --trace-blockquote-padding-inline: 1.25rem;
93
+ --trace-typography-border: light-dark(var(--trace-neutral-light), var(--trace-neutral-dark));
94
+ --trace-mark-bg: var(--trace-secondary-lighter);
95
+ --trace-mark-text: var(--trace-neutral-darker);
96
+ --trace-kbd-bg: light-dark(var(--trace-neutral-dark), var(--trace-neutral-lighter));
97
+ --trace-kbd-text: light-dark(var(--trace-text-dark), var(--trace-text-light));
98
+ --trace-kbd-border: light-dark(var(--trace-neutral-darker), var(--trace-neutral-light));
99
+ --trace-kbd-shadow: 1px 1px 0 0
100
+ oklch(from var(--trace-neutral-darker) l c h / 25%);
101
+ --trace-blockquote-border: light-dark(var(--trace-primary), var(--trace-secondary));
102
+ --trace-blockquote-bg: light-dark(color-mix(in oklch,
103
+ var(--trace-bg-light),
104
+ var(--trace-neutral-darker) 5%), color-mix(in oklch, var(--trace-bg-dark), var(--trace-neutral-lighter) 8%));
105
+ }
106
+
107
+ @media (width < 48rem) {
108
+ :where(:root) {
109
+ --trace-font-size-h1: 2rem;
110
+ --trace-font-size-h2: 1.75rem;
111
+ --trace-font-size-h3: 1.5rem;
112
+ --trace-font-size-h4: 1.25rem;
113
+ --trace-font-size-h5: 1.125rem;
114
+ }
115
+ }
116
+
117
+ :where(body) {
118
+ line-height: var(--trace-typography-line-height);
119
+ overflow-wrap: anywhere;
120
+ }
121
+
122
+ :where(h1, h2, h3, h4, h5, h6) {
123
+ margin-block: 0 var(--trace-heading-margin-block-end);
124
+ font-family: var(--trace-font-heading);
125
+ font-weight: 700;
126
+ line-height: var(--trace-heading-line-height);
127
+ overflow-wrap: anywhere;
128
+ }
129
+
130
+ :where(h1) {
131
+ font-size: var(--trace-font-size-h1);
132
+ }
133
+
134
+ :where(h2) {
135
+ font-size: var(--trace-font-size-h2);
136
+ }
137
+
138
+ :where(h3) {
139
+ font-size: var(--trace-font-size-h3);
140
+ }
141
+
142
+ :where(h4) {
143
+ font-size: var(--trace-font-size-h4);
144
+ }
145
+
146
+ :where(h5) {
147
+ font-size: var(--trace-font-size-h5);
148
+ }
149
+
150
+ :where(h6) {
151
+ font-size: var(--trace-font-size-h6);
152
+ }
153
+
154
+ :where(code, pre, kbd, samp) {
155
+ font-family: var(--trace-font-code);
156
+ }
157
+
158
+ :where(pre) {
159
+ min-inline-size: 0;
160
+ max-inline-size: 100%;
161
+ overflow-x: auto;
162
+ }
163
+
164
+ :where(p) {
165
+ margin-block: 0 var(--trace-paragraph-margin-block-end);
166
+ line-height: var(--trace-typography-line-height);
167
+ }
168
+
169
+ :where(ul, ol, dl) {
170
+ line-height: var(--trace-typography-line-height);
171
+ }
172
+
173
+ :where(abbr[title]) {
174
+ text-underline-offset: .2em;
175
+ cursor: help;
176
+ -webkit-text-decoration: underline dotted;
177
+ text-decoration: underline dotted;
178
+ }
179
+
180
+ :where(strong, b) {
181
+ font-weight: 700;
182
+ }
183
+
184
+ :where(i, em, cite) {
185
+ font-style: italic;
186
+ }
187
+
188
+ :where(del, s) {
189
+ text-decoration: line-through;
190
+ }
191
+
192
+ :where(ins, u) {
193
+ text-underline-offset: .15em;
194
+ text-decoration: underline;
195
+ }
196
+
197
+ :where(kbd) {
198
+ border: 1px solid var(--trace-kbd-border);
199
+ border-radius: var(--trace-radius-sm);
200
+ background-color: var(--trace-kbd-bg);
201
+ color: var(--trace-kbd-text);
202
+ box-shadow: var(--trace-kbd-shadow);
203
+ vertical-align: baseline;
204
+ border-bottom-width: 2px;
205
+ padding: .125em .375em;
206
+ font-size: .875em;
207
+ line-height: 1.25;
208
+ display: inline-block;
209
+ }
210
+
211
+ :where(mark) {
212
+ border-radius: var(--trace-radius-sm);
213
+ background-color: var(--trace-mark-bg);
214
+ color: var(--trace-mark-text);
215
+ -webkit-box-decoration-break: clone;
216
+ box-decoration-break: clone;
217
+ padding: .125em .25em;
218
+ }
219
+
220
+ :where(small) {
221
+ font-size: .875em;
222
+ }
223
+
224
+ :where(sub, sup) {
225
+ vertical-align: baseline;
226
+ font-size: .75em;
227
+ line-height: 0;
228
+ position: relative;
229
+ }
230
+
231
+ :where(sub) {
232
+ bottom: -.25em;
233
+ }
234
+
235
+ :where(sup) {
236
+ top: -.5em;
237
+ }
238
+
239
+ :where(hr) {
240
+ height: 0;
241
+ margin-block: var(--trace-divider-margin-block);
242
+ border: 0;
243
+ border-block-start: 2px solid var(--trace-typography-border);
244
+ }
245
+
246
+ :where(blockquote) {
247
+ margin-block: var(--trace-blockquote-margin-block);
248
+ padding-block: var(--trace-blockquote-padding-block);
249
+ padding-inline: var(--trace-blockquote-padding-inline);
250
+ border-inline-start: .25rem solid var(--trace-blockquote-border);
251
+ background-color: var(--trace-blockquote-bg);
252
+ line-height: var(--trace-typography-line-height);
253
+ margin-inline: 0;
254
+ }
255
+
256
+ :where(blockquote > :last-child) {
257
+ margin-block-end: 0;
258
+ }
259
+
260
+ :where(:root) {
261
+ --trace-link-color: light-dark(var(--trace-primary), var(--trace-secondary));
262
+ --trace-link-hover: light-dark(var(--trace-primary-light), var(--trace-secondary-light));
263
+ --trace-link-active: light-dark(var(--trace-primary-dark), var(--trace-secondary-dark));
264
+ --trace-link-visited: var(--trace-link-color);
265
+ --trace-link-focus: var(--trace-link-color);
266
+ --trace-link-underline-offset: .2em;
267
+ --trace-link-underline-thickness: .08em;
268
+ }
269
+
270
+ :where(a[href]) {
271
+ color: var(--trace-link-color);
272
+ text-decoration-line: underline;
273
+ text-decoration-color: currentColor;
274
+ text-decoration-thickness: var(--trace-link-underline-thickness);
275
+ text-underline-offset: var(--trace-link-underline-offset);
276
+ -webkit-text-decoration-skip-ink: auto;
277
+ text-decoration-skip-ink: auto;
278
+ border-radius: var(--trace-radius-sm);
279
+ transition: color .15s ease-in-out;
280
+
281
+ &:visited {
282
+ color: var(--trace-link-visited);
283
+ }
284
+
285
+ &:hover {
286
+ color: var(--trace-link-hover);
287
+ text-decoration-thickness: calc(var(--trace-link-underline-thickness) * 2);
288
+ }
289
+
290
+ &:active {
291
+ color: var(--trace-link-active);
292
+ }
293
+
294
+ &:focus-visible {
295
+ outline: 2px solid var(--trace-link-focus);
296
+ outline-offset: 3px;
297
+ }
298
+ }
299
+
300
+ @media (prefers-reduced-motion: reduce) {
301
+ :where(a[href]) {
302
+ transition: none;
303
+ }
304
+ }
305
+
306
+ @media (forced-colors: active) {
307
+ :where(a[href]) {
308
+ color: linktext;
309
+
310
+ &:visited {
311
+ color: visitedtext;
312
+ }
313
+
314
+ &:active {
315
+ color: activetext;
316
+ }
317
+
318
+ &:focus-visible {
319
+ outline-color: highlight;
320
+ }
321
+ }
322
+ }
323
+
324
+ :where(:root) {
325
+ --trace-table-text: var(--trace-text);
326
+ --trace-table-accent: light-dark(var(--trace-primary), var(--trace-secondary));
327
+ --trace-table-border: color-mix(in oklch,
328
+ var(--trace-table-accent),
329
+ transparent 78%);
330
+ --trace-table-header-bg: transparent;
331
+ --trace-table-header-text: var(--trace-table-accent);
332
+ --trace-table-row-heading: var(--trace-table-text);
333
+ --trace-table-footer-bg: transparent;
334
+ --trace-table-stripe-bg: color-mix(in oklch,
335
+ var(--trace-table-accent),
336
+ transparent 97%);
337
+ --trace-table-hover-bg: light-dark(color-mix(in oklch, var(--trace-primary), transparent 93%), color-mix(in oklch, var(--trace-secondary), transparent 90%));
338
+ --trace-table-radius: 0;
339
+ --trace-table-padding-block: .75rem;
340
+ --trace-table-padding-inline: .75rem;
341
+ --trace-table-font-size: 1rem;
342
+ --trace-table-line-height: 1.5;
343
+ }
344
+
345
+ :where(table) {
346
+ border-collapse: separate;
347
+ border-spacing: 0;
348
+ inline-size: 100%;
349
+ color: var(--trace-table-text);
350
+ font-size: var(--trace-table-font-size);
351
+ line-height: var(--trace-table-line-height);
352
+ text-align: start;
353
+ }
354
+
355
+ :where(table > caption) {
356
+ caption-side: top;
357
+ text-align: start;
358
+ padding-block: 0 1rem;
359
+ padding-inline: 0;
360
+ font-size: 1em;
361
+ font-weight: 600;
362
+ line-height: 1.4;
363
+ }
364
+
365
+ :where(table > :is(thead, tbody, tfoot) > tr > :is(th, td), table > tr > :is(th, td)) {
366
+ padding: var(--trace-table-padding-block) var(--trace-table-padding-inline);
367
+ border-block-end: 1px solid var(--trace-table-border);
368
+ vertical-align: top;
369
+ text-align: inherit;
370
+ }
371
+
372
+ :where(table > :is(thead, tbody, tfoot) > tr > th, table > tr > th) {
373
+ font-weight: 600;
374
+ }
375
+
376
+ :where(table > thead > tr > :is(th, td)) {
377
+ background-color: var(--trace-table-header-bg);
378
+ color: var(--trace-table-header-text);
379
+ border-block-end: 2px solid var(--trace-table-accent);
380
+ vertical-align: middle;
381
+ letter-spacing: normal;
382
+ font-size: .875em;
383
+ }
384
+
385
+ :where(table > tbody > tr > th) {
386
+ color: var(--trace-table-row-heading);
387
+ }
388
+
389
+ :where(table > thead > tr:first-child > :first-child) {
390
+ border-start-start-radius: var(--trace-table-radius);
391
+ }
392
+
393
+ :where(table > thead > tr:first-child > :last-child) {
394
+ border-start-end-radius: var(--trace-table-radius);
395
+ }
396
+
397
+ :where(table:has( > tfoot) > tbody:last-of-type > tr:last-child > :is(th, td)) {
398
+ border-block-end: 0;
399
+ }
400
+
401
+ :where(table > tfoot > tr > :is(th, td)) {
402
+ background-color: var(--trace-table-footer-bg);
403
+ color: var(--trace-table-accent);
404
+ border-block-start: 2px solid var(--trace-table-accent);
405
+ border-block-end: 0;
406
+ font-weight: 600;
407
+ }
408
+
409
+ :where(table > tfoot > tr:last-child > :first-child) {
410
+ border-end-start-radius: var(--trace-table-radius);
411
+ }
412
+
413
+ :where(table > tfoot > tr:last-child > :last-child) {
414
+ border-end-end-radius: var(--trace-table-radius);
415
+ }
416
+
417
+ @keyframes trace-square-rotate {
418
+ 0% {
419
+ transform: rotateX(0) rotateY(0);
420
+ }
421
+
422
+ 25% {
423
+ transform: rotateX(180deg) rotateY(0);
424
+ }
425
+
426
+ 50% {
427
+ transform: rotateX(180deg) rotateY(180deg);
428
+ }
429
+
430
+ 75% {
431
+ transform: rotateX(0) rotateY(180deg);
432
+ }
433
+
434
+ 100% {
435
+ transform: rotateX(0) rotateY(0);
436
+ }
437
+ }
438
+
439
+ :where(div, section, article, main, aside, nav, header, footer, form, fieldset, figure):where([aria-busy="true"]) {
440
+ isolation: isolate;
441
+ cursor: wait;
442
+ position: relative;
443
+
444
+ &:before {
445
+ content: "";
446
+ z-index: 1;
447
+ border-radius: inherit;
448
+ background: var(--trace-loader-overlay, color-mix(in srgb, var(--trace-bg), transparent 30%));
449
+ position: absolute;
450
+ inset: 0;
451
+ }
452
+
453
+ &:after {
454
+ content: "";
455
+ z-index: 2;
456
+ inline-size: var(--trace-loader-size, 2rem);
457
+ block-size: var(--trace-loader-size, 2rem);
458
+ border-radius: var(--trace-loader-radius, 2px);
459
+ background-color: var(--trace-loader-color, light-dark(var(--trace-primary), var(--trace-secondary)));
460
+ animation: trace-square-rotate var(--trace-loader-duration, 3s)
461
+ ease-in-out infinite;
462
+ pointer-events: none;
463
+ margin: auto;
464
+ position: absolute;
465
+ inset: 0;
466
+ }
467
+
468
+ @media (prefers-reduced-motion: reduce) {
469
+ &:after {
470
+ animation: none;
471
+ }
472
+ }
473
+ }
474
+
475
+ :where(:root) {
476
+ --trace-button-color: light-dark(var(--trace-primary-darker), var(--trace-secondary));
477
+ --trace-button-contrast: light-dark(var(--trace-secondary), var(--trace-primary-dark));
478
+ --trace-button-outline-color: var(--trace-button-color);
479
+ --trace-button-radius: var(--trace-radius-control);
480
+ --trace-button-font-size: 1rem;
481
+ --trace-button-line-height: 1.5rem;
482
+ --trace-button-padding-block: .375rem;
483
+ --trace-button-padding-inline: .75rem;
484
+ --trace-button-box-shadow: var(--trace-shadow);
485
+ --trace-button-icon-gap: .5em;
486
+ }
487
+
488
+ :where(button[type="reset"], input[type="reset"]) {
489
+ --trace-button-color: var(--trace-primary-light);
490
+ --trace-button-contrast: var(--trace-secondary-lighter);
491
+ --trace-button-outline-color: var(--trace-button-color);
492
+ }
493
+
494
+ :where(button, input[type="button"], input[type="submit"], input[type="reset"]) {
495
+ justify-content: center;
496
+ align-items: center;
497
+ gap: var(--trace-button-icon-gap);
498
+ box-sizing: border-box;
499
+ padding: var(--trace-button-padding-block)
500
+ var(--trace-button-padding-inline);
501
+ border: 2px solid var(--trace-button-border, var(--trace-button-color));
502
+ border-radius: var(--trace-button-radius);
503
+ background-color: var(--trace-button-bg, var(--trace-button-color));
504
+ color: var(--trace-button-text, var(--trace-button-contrast));
505
+ font-size: var(--trace-button-font-size);
506
+ font-weight: 400;
507
+ line-height: var(--trace-button-line-height);
508
+ text-align: center;
509
+ cursor: pointer;
510
+ transition: background-color .2s ease-in-out, color .2s ease-in-out, border-color .2s ease-in-out, box-shadow .2s ease-in-out, transform .2s ease-in-out;
511
+ display: inline-flex;
512
+ }
513
+
514
+ :where(button:hover:not(:disabled), input[type="button"]:hover:not(:disabled), input[type="submit"]:hover:not(:disabled), input[type="reset"]:hover:not(:disabled)) {
515
+ box-shadow: var(--trace-button-box-shadow);
516
+ }
517
+
518
+ :where(button:active:not(:disabled), input[type="button"]:active:not(:disabled), input[type="submit"]:active:not(:disabled), input[type="reset"]:active:not(:disabled)) {
519
+ box-shadow: var(--trace-button-box-shadow);
520
+ transform: scale(.95);
521
+ }
522
+
523
+ :where(button:focus-visible, input[type="button"]:focus-visible, input[type="submit"]:focus-visible, input[type="reset"]:focus-visible) {
524
+ outline: 2px solid var(--trace-button-outline-color);
525
+ outline-offset: 2px;
526
+ box-shadow: none;
527
+ }
528
+
529
+ :where(button:disabled, input[type="button"]:disabled, input[type="submit"]:disabled, input[type="reset"]:disabled) {
530
+ opacity: .5;
531
+ cursor: not-allowed;
532
+ }
533
+
534
+ :where(button[aria-busy="true"]):after {
535
+ content: "";
536
+ inline-size: var(--trace-loader-size, 1em);
537
+ block-size: var(--trace-loader-size, 1em);
538
+ border-radius: var(--trace-loader-radius, 2px);
539
+ background-color: var(--trace-button-loader-color, var(--trace-button-text, var(--trace-button-contrast)));
540
+ animation: trace-square-rotate var(--trace-loader-duration, 3s) ease-in-out
541
+ infinite;
542
+ pointer-events: none;
543
+ margin: auto;
544
+ position: absolute;
545
+ inset: 0;
546
+ }
547
+
548
+ @media (prefers-reduced-motion: reduce) {
549
+ :where(button, input[type="button"], input[type="submit"], input[type="reset"]) {
550
+ transition: none;
551
+ transform: none;
552
+ }
553
+ }
554
+
555
+ @media (forced-colors: active) {
556
+ :where(button:disabled, input[type="button"]:disabled, input[type="submit"]:disabled, input[type="reset"]:disabled) {
557
+ opacity: 1;
558
+ color: graytext;
559
+ border-color: graytext;
560
+ }
561
+ }
562
+
563
+ :where(button[aria-busy="true"]) {
564
+ cursor: wait;
565
+ opacity: 1;
566
+ box-shadow: none;
567
+ color: #0000;
568
+ position: relative;
569
+ transform: none;
570
+ }
571
+
572
+ @media (prefers-reduced-motion: reduce) {
573
+ :where(button[aria-busy="true"]):after {
574
+ animation: none;
575
+ }
576
+ }
577
+
578
+ @media (forced-colors: active) {
579
+ :where(button[aria-busy="true"]) {
580
+ forced-color-adjust: none;
581
+ background-color: buttonface;
582
+ border-color: buttontext;
583
+ }
584
+
585
+ :where(button[aria-busy="true"]):after {
586
+ background-color: buttontext;
587
+ }
588
+ }
589
+
590
+ :where(button[aria-busy="true"] > *) {
591
+ opacity: 0;
592
+ }
593
+
594
+ :where(:root) {
595
+ --trace-switch-width: 2.125rem;
596
+ --trace-switch-height: 1.25rem;
597
+ --trace-switch-dot-size: .75rem;
598
+ --trace-switch-dot-active-size: .875rem;
599
+ --trace-switch-padding: .125rem;
600
+ --trace-switch-color: light-dark(var(--trace-primary), var(--trace-secondary));
601
+ --trace-switch-radius: var(--trace-radius-sm);
602
+ }
603
+
604
+ :where(input[type="checkbox"][role="switch"]) {
605
+ appearance: none;
606
+ box-sizing: border-box;
607
+ inline-size: var(--trace-switch-width);
608
+ block-size: var(--trace-switch-height);
609
+ padding: var(--trace-switch-padding);
610
+ border: 2px solid var(--trace-switch-color);
611
+ border-radius: var(--trace-switch-radius);
612
+ background-color: var(--trace-switch-bg, var(--trace-control-bg));
613
+ background-image: radial-gradient(ellipse at center,
614
+ var(--trace-switch-color) 50%,
615
+ transparent 50%);
616
+ vertical-align: middle;
617
+ cursor: pointer;
618
+ background-position: right -100% top 50%;
619
+ background-repeat: no-repeat;
620
+ background-size: 200% 300%;
621
+ flex-shrink: 0;
622
+ margin: 2px;
623
+ transition: transform .25s ease-in-out, background-position .25s ease-in-out;
624
+ display: inline-block;
625
+ position: relative;
626
+ overflow: hidden;
627
+ }
628
+
629
+ :where(input[type="checkbox"][role="switch"]):before {
630
+ content: "";
631
+ inline-size: var(--trace-switch-dot-size);
632
+ block-size: var(--trace-switch-dot-size);
633
+ background-color: var(--trace-switch-color);
634
+ border-radius: 2px;
635
+ transition: inset-inline-start .2s ease-in-out, inline-size .2s ease-in-out, background-color .2s ease-in-out;
636
+ position: absolute;
637
+ inset-block-start: var(--trace-switch-padding);
638
+ inset-inline-start: var(--trace-switch-padding);
639
+ }
640
+
641
+ :where(input[type="checkbox"][role="switch"]:checked) {
642
+ background-position: right 40% top 50%;
643
+ }
644
+
645
+ :where(input[type="checkbox"][role="switch"]:checked):before {
646
+ background-color: var(--trace-switch-dot-checked, var(--trace-switch-bg, var(--trace-control-bg)));
647
+ inset-inline-start: calc(100% - var(--trace-switch-dot-size) - var(--trace-switch-padding));
648
+ }
649
+
650
+ :where(input[type="checkbox"][role="switch"]:dir(rtl)) {
651
+ background-position: -100%;
652
+ }
653
+
654
+ :where(input[type="checkbox"][role="switch"]:dir(rtl):checked) {
655
+ background-position: 40%;
656
+ }
657
+
658
+ :where(input[type="checkbox"][role="switch"]:focus-visible) {
659
+ outline: 2px solid var(--trace-switch-color);
660
+ outline-offset: 2px;
661
+ }
662
+
663
+ :where(label:has( > input[type="checkbox"][role="switch"])) {
664
+ cursor: pointer;
665
+ align-items: center;
666
+ gap: .5rem;
667
+ display: inline-flex;
668
+ }
669
+
670
+ :where(input[type="checkbox"][role="switch"]:active:not(:disabled), label:active > input[type="checkbox"][role="switch"]:not(:disabled)) {
671
+ transform: scale(.9);
672
+ }
673
+
674
+ :where(input[type="checkbox"][role="switch"]:active:not(:disabled), label:active > input[type="checkbox"][role="switch"]:not(:disabled)):before {
675
+ inline-size: var(--trace-switch-dot-active-size);
676
+ }
677
+
678
+ :where(input[type="checkbox"][role="switch"]:active:checked:not(:disabled), label:active > input[type="checkbox"][role="switch"]:checked:not(:disabled)):before {
679
+ inset-inline-start: calc(100% - var(--trace-switch-dot-active-size) - var(--trace-switch-padding));
680
+ }
681
+
682
+ :where(input[type="checkbox"][role="switch"]:disabled) {
683
+ opacity: .5;
684
+ cursor: not-allowed;
685
+ }
686
+
687
+ :where(label:has( > input[type="checkbox"][role="switch"]:disabled)) {
688
+ cursor: not-allowed;
689
+ }
690
+
691
+ :where(label > input[type="checkbox"][role="switch"]:disabled ~ span) {
692
+ opacity: .5;
693
+ }
694
+
695
+ @media (prefers-reduced-motion: reduce) {
696
+ :where(input[type="checkbox"][role="switch"]), :where(input[type="checkbox"][role="switch"]):before {
697
+ transition: none;
698
+ transform: none;
699
+ }
700
+ }
701
+
702
+ @media (forced-colors: active) {
703
+ :where(input[type="checkbox"][role="switch"]) {
704
+ appearance: auto;
705
+ background: none;
706
+ }
707
+
708
+ :where(input[type="checkbox"][role="switch"]):before {
709
+ content: none;
710
+ }
711
+ }
712
+
713
+ :where(input[type="checkbox"][role="switch"][aria-invalid="true"]) {
714
+ --trace-switch-color: var(--trace-danger);
715
+ }
716
+
717
+ :where(:root) {
718
+ --trace-radio-size: 1.25rem;
719
+ --trace-radio-color: light-dark(var(--trace-primary), var(--trace-secondary));
720
+ }
721
+
722
+ :where(input[type="radio"]) {
723
+ appearance: none;
724
+ box-sizing: border-box;
725
+ inline-size: var(--trace-radio-size);
726
+ block-size: var(--trace-radio-size);
727
+ border: 2px solid var(--trace-radio-color);
728
+ background: var(--trace-radio-bg, var(--trace-control-bg));
729
+ vertical-align: middle;
730
+ cursor: pointer;
731
+ border-radius: 50%;
732
+ flex-shrink: 0;
733
+ margin: 2px;
734
+ padding: 0;
735
+ transition: transform .25s ease-in-out, border-color .25s ease-in-out;
736
+ display: inline-block;
737
+ position: relative;
738
+ }
739
+
740
+ :where(input[type="radio"]):before {
741
+ content: "";
742
+ box-sizing: border-box;
743
+ border: 2px solid var(--trace-radio-color);
744
+ background-color: #0000;
745
+ border-radius: 50%;
746
+ transition: border-color .25s ease-in-out, background-color .25s ease-in-out, transform .25s ease-in-out;
747
+ position: absolute;
748
+ inset: -2px;
749
+ }
750
+
751
+ :where(input[type="radio"]:checked):before {
752
+ background-color: var(--trace-radio-color);
753
+ transform: scale(.6);
754
+ }
755
+
756
+ :where(input[type="radio"]:focus-visible) {
757
+ outline: 2px solid var(--trace-radio-color);
758
+ outline-offset: 2px;
759
+ }
760
+
761
+ :where(label:has( > input[type="radio"])) {
762
+ cursor: pointer;
763
+ align-items: center;
764
+ gap: .5rem;
765
+ display: inline-flex;
766
+ }
767
+
768
+ :where(input[type="radio"]:active:not(:disabled), label:active > input[type="radio"]:not(:disabled)) {
769
+ transform: scale(.9);
770
+ }
771
+
772
+ :where(input[type="radio"]:disabled) {
773
+ opacity: .5;
774
+ cursor: not-allowed;
775
+ }
776
+
777
+ :where(label:has( > input[type="radio"]:disabled)) {
778
+ cursor: not-allowed;
779
+ }
780
+
781
+ :where(label > input[type="radio"]:disabled ~ span) {
782
+ opacity: .5;
783
+ }
784
+
785
+ @media (prefers-reduced-motion: reduce) {
786
+ :where(input[type="radio"]), :where(input[type="radio"]):before {
787
+ transition: none;
788
+ transform: none;
789
+ }
790
+
791
+ :where(input[type="radio"]:checked):before {
792
+ transform: scale(.6);
793
+ }
794
+ }
795
+
796
+ @media (forced-colors: active) {
797
+ :where(input[type="radio"]) {
798
+ appearance: auto;
799
+ }
800
+
801
+ :where(input[type="radio"]):before {
802
+ content: none;
803
+ }
804
+ }
805
+
806
+ :where(input[type="radio"][aria-invalid="true"]) {
807
+ --trace-radio-color: var(--trace-danger);
808
+ }
809
+
810
+ :where(:root) {
811
+ --trace-input-font-size: 1rem;
812
+ --trace-input-line-height: 1.5rem;
813
+ --trace-input-padding-block: .375rem;
814
+ --trace-input-padding-inline: .625rem;
815
+ --trace-input-radius: var(--trace-radius-control);
816
+ --trace-input-text: var(--trace-text);
817
+ --trace-input-border: light-dark(var(--trace-primary), var(--trace-secondary));
818
+ --trace-input-focus: light-dark(var(--trace-primary-light), var(--trace-secondary-light));
819
+ --trace-input-placeholder: light-dark(var(--trace-neutral), var(--trace-neutral-light));
820
+ --trace-input-error: var(--trace-danger);
821
+ --trace-input-shadow: var(--trace-shadow);
822
+ }
823
+
824
+ :where(input:not([type]), input:is([type="text"], [type="search"], [type="email"], [type="url"], [type="tel"], [type="password"], [type="number"], [type="date"], [type="datetime-local"], [type="month"], [type="week"], [type="time"], [type="color"], [type="file"])) {
825
+ --_trace-input-border: var(--trace-input-border);
826
+ box-sizing: border-box;
827
+ inline-size: 100%;
828
+ min-inline-size: 0;
829
+ padding: var(--trace-input-padding-block) var(--trace-input-padding-inline);
830
+ border: 2px solid var(--_trace-input-border);
831
+ border-radius: var(--trace-input-radius);
832
+ background-color: var(--trace-input-bg, var(--trace-control-bg));
833
+ color: var(--trace-input-text);
834
+ caret-color: var(--trace-input-focus);
835
+ font-family: var(--trace-font-body);
836
+ font-size: var(--trace-input-font-size);
837
+ line-height: var(--trace-input-line-height);
838
+ text-align: start;
839
+ cursor: text;
840
+ margin: 0;
841
+ transition: border-color .2s ease-in-out, box-shadow .2s ease-in-out;
842
+ display: block;
843
+
844
+ &::placeholder {
845
+ color: var(--trace-input-placeholder);
846
+ opacity: 1;
847
+ }
848
+
849
+ &:hover:not(:disabled):not([readonly]):not(:focus) {
850
+ box-shadow: var(--trace-input-shadow);
851
+ }
852
+
853
+ &:focus {
854
+ --_trace-input-border: var(--trace-input-focus);
855
+ outline-offset: 2px;
856
+ box-shadow: 0 0 0 4px
857
+ color-mix(in srgb, var(--trace-input-focus), transparent 70%);
858
+ outline: 2px solid #0000;
859
+ }
860
+
861
+ &[readonly] {
862
+ cursor: default;
863
+ }
864
+
865
+ &[aria-invalid="true"] {
866
+ --_trace-input-border: var(--trace-input-error);
867
+ }
868
+
869
+ &:user-invalid {
870
+ --_trace-input-border: var(--trace-input-error);
871
+ }
872
+
873
+ &:disabled {
874
+ opacity: .5;
875
+ cursor: not-allowed;
876
+ box-shadow: none;
877
+ }
878
+
879
+ @media (prefers-reduced-motion: reduce) {
880
+ transition: none;
881
+ }
882
+ }
883
+
884
+ :where(input[type="color"]) {
885
+ block-size: calc(var(--trace-input-line-height) + var(--trace-input-padding-block) * 2 +
886
+ 4px);
887
+ cursor: pointer;
888
+ padding: .25rem;
889
+ }
890
+
891
+ :where(input[type="color"])::-webkit-color-swatch-wrapper {
892
+ padding: 0;
893
+ }
894
+
895
+ :where(input[type="color"])::-webkit-color-swatch {
896
+ border: 0;
897
+ border-radius: 1px;
898
+ }
899
+
900
+ :where(input[type="color"])::-moz-color-swatch {
901
+ border: 0;
902
+ border-radius: 1px;
903
+ }
904
+
905
+ :where(label:has( > input:not([type]), > input:is([type="text"], [type="search"], [type="email"], [type="url"], [type="tel"], [type="password"], [type="number"], [type="date"], [type="datetime-local"], [type="month"], [type="week"], [type="time"], [type="color"], [type="file"]))) {
906
+ cursor: pointer;
907
+ min-inline-size: 0;
908
+ color: var(--trace-input-text);
909
+ gap: .25rem;
910
+ display: grid;
911
+
912
+ &:has( > input[aria-invalid="true"]) > small:last-child {
913
+ color: var(--trace-input-error);
914
+ }
915
+
916
+ &:has( > input:user-invalid) > small:last-child {
917
+ color: var(--trace-input-error);
918
+ }
919
+
920
+ &:has( > input:disabled) {
921
+ color: color-mix(in srgb, var(--trace-input-text), transparent 50%);
922
+ cursor: not-allowed;
923
+ }
924
+
925
+ & > small {
926
+ margin: 0;
927
+ line-height: 1.5;
928
+ }
929
+ }
930
+
931
+ :where(label:has(input) + small) {
932
+ margin-block-start: .25rem;
933
+ line-height: 1.5;
934
+ display: block;
935
+ }
936
+
937
+ :where(label:has(input[aria-invalid="true"], input:user-invalid) + small) {
938
+ color: var(--trace-input-error);
939
+ }
940
+
941
+ :where(label[for]:not(:has(input))) {
942
+ cursor: pointer;
943
+ color: var(--trace-input-text);
944
+ margin-block-end: .25rem;
945
+ display: inline-block;
946
+ }
947
+
948
+ :where(input[aria-invalid="true"] + small, input:user-invalid + small) {
949
+ color: var(--trace-input-error);
950
+ }
951
+
952
+ :where(label[for]:has( + input:disabled)) {
953
+ opacity: .5;
954
+ cursor: not-allowed;
955
+ }
956
+
957
+ :where(:root) {
958
+ --trace-file-button-bg: var(--trace-primary-light);
959
+ --trace-file-button-text: var(--trace-secondary-lighter);
960
+ }
961
+
962
+ :where(input[type="file"]) {
963
+ cursor: pointer;
964
+ padding-block: 0;
965
+ padding-inline-start: 0;
966
+ }
967
+
968
+ :where(input[type="file"])::file-selector-button {
969
+ padding: var(--trace-input-padding-block) var(--trace-input-padding-inline);
970
+ background: var(--trace-file-button-bg);
971
+ color: var(--trace-file-button-text);
972
+ font: inherit;
973
+ line-height: inherit;
974
+ cursor: pointer;
975
+ border: 0;
976
+ border-radius: 0;
977
+ margin: 0;
978
+ margin-inline-end: var(--trace-input-padding-inline);
979
+ }
980
+
981
+ :where(input[type="file"]:hover:not(:disabled):not([readonly]):not(:focus)) {
982
+ box-shadow: none;
983
+ }
984
+
985
+ :where(input[type="file"]:disabled)::file-selector-button {
986
+ cursor: not-allowed;
987
+ }
988
+
989
+ @media (forced-colors: active) {
990
+ :where(input[type="file"])::file-selector-button {
991
+ border-inline-end: 1px solid buttontext;
992
+ }
993
+ }
994
+
995
+ :where(:root) {
996
+ --trace-textarea-font-size: 1rem;
997
+ --trace-textarea-line-height: 1.5rem;
998
+ --trace-textarea-padding-block: .375rem;
999
+ --trace-textarea-padding-inline: .625rem;
1000
+ --trace-textarea-radius: var(--trace-radius-control);
1001
+ --trace-textarea-text: var(--trace-text);
1002
+ --trace-textarea-border: light-dark(var(--trace-primary), var(--trace-secondary));
1003
+ --trace-textarea-focus: light-dark(var(--trace-primary-light), var(--trace-secondary-light));
1004
+ --trace-textarea-placeholder: light-dark(var(--trace-neutral), var(--trace-neutral-light));
1005
+ --trace-textarea-error: var(--trace-danger);
1006
+ --trace-textarea-shadow: var(--trace-shadow);
1007
+ }
1008
+
1009
+ :where(textarea) {
1010
+ --_trace-textarea-border: var(--trace-textarea-border);
1011
+ box-sizing: border-box;
1012
+ inline-size: 100%;
1013
+ min-inline-size: 0;
1014
+ padding: var(--trace-textarea-padding-block)
1015
+ var(--trace-textarea-padding-inline);
1016
+ border: 2px solid var(--_trace-textarea-border);
1017
+ border-radius: var(--trace-textarea-radius);
1018
+ background: var(--trace-textarea-bg, var(--trace-control-bg));
1019
+ color: var(--trace-textarea-text);
1020
+ caret-color: var(--trace-textarea-focus);
1021
+ font-family: var(--trace-font-body);
1022
+ font-size: var(--trace-textarea-font-size);
1023
+ line-height: var(--trace-textarea-line-height);
1024
+ text-align: start;
1025
+ resize: vertical;
1026
+ cursor: text;
1027
+ margin: 0;
1028
+ transition: border-color .2s ease-in-out, box-shadow .2s ease-in-out;
1029
+ display: block;
1030
+
1031
+ &::placeholder {
1032
+ color: var(--trace-textarea-placeholder);
1033
+ opacity: 1;
1034
+ }
1035
+
1036
+ &:hover:not(:disabled):not([readonly]):not(:focus) {
1037
+ box-shadow: var(--trace-textarea-shadow);
1038
+ }
1039
+
1040
+ &:focus {
1041
+ --_trace-textarea-border: var(--trace-textarea-focus);
1042
+ outline-offset: 2px;
1043
+ box-shadow: 0 0 0 4px
1044
+ color-mix(in srgb, var(--trace-textarea-focus), transparent 70%);
1045
+ outline: 2px solid #0000;
1046
+ }
1047
+
1048
+ &[aria-invalid="true"] {
1049
+ --_trace-textarea-border: var(--trace-textarea-error);
1050
+ }
1051
+
1052
+ &:user-invalid {
1053
+ --_trace-textarea-border: var(--trace-textarea-error);
1054
+ }
1055
+
1056
+ &[readonly] {
1057
+ cursor: default;
1058
+ }
1059
+
1060
+ &:disabled {
1061
+ opacity: .5;
1062
+ cursor: not-allowed;
1063
+ box-shadow: none;
1064
+ }
1065
+
1066
+ @media (prefers-reduced-motion: reduce) {
1067
+ transition: none;
1068
+ }
1069
+ }
1070
+
1071
+ :where(label:has( > textarea)) {
1072
+ min-inline-size: 0;
1073
+ color: var(--trace-textarea-text);
1074
+ cursor: pointer;
1075
+ gap: .25rem;
1076
+ display: grid;
1077
+
1078
+ & > small {
1079
+ margin: 0;
1080
+ line-height: 1.5;
1081
+ }
1082
+
1083
+ &:has( > textarea:disabled) {
1084
+ color: color-mix(in srgb, var(--trace-textarea-text), transparent 50%);
1085
+ cursor: not-allowed;
1086
+ }
1087
+
1088
+ &:has( > textarea[aria-invalid="true"], > textarea:user-invalid) > small:last-child {
1089
+ color: var(--trace-textarea-error);
1090
+ }
1091
+ }
1092
+
1093
+ :where(label:has( > textarea) + small) {
1094
+ margin-block-start: .25rem;
1095
+ line-height: 1.5;
1096
+ display: block;
1097
+ }
1098
+
1099
+ :where(label:has( > textarea[aria-invalid="true"], > textarea:user-invalid) + small) {
1100
+ color: var(--trace-textarea-error);
1101
+ }
1102
+
1103
+ :where(label[for]:has( + textarea:disabled)) {
1104
+ opacity: .5;
1105
+ cursor: not-allowed;
1106
+ }
1107
+
1108
+ :where(textarea[aria-invalid="true"] + small, textarea:user-invalid + small) {
1109
+ color: var(--trace-textarea-error);
1110
+ }
1111
+
1112
+ :where(:root) {
1113
+ --trace-checkbox-size: 1.25rem;
1114
+ --trace-checkbox-radius: var(--trace-radius-control);
1115
+ --trace-checkbox-color: light-dark(var(--trace-primary), var(--trace-secondary));
1116
+ --trace-checkbox-mark: light-dark(var(--trace-neutral-lighter), var(--trace-primary-dark));
1117
+ }
1118
+
1119
+ :where(input[type="checkbox"]:not([role="switch"])) {
1120
+ appearance: none;
1121
+ isolation: isolate;
1122
+ box-sizing: border-box;
1123
+ inline-size: var(--trace-checkbox-size);
1124
+ block-size: var(--trace-checkbox-size);
1125
+ border: 2px solid var(--trace-checkbox-color);
1126
+ border-radius: var(--trace-checkbox-radius);
1127
+ background-color: var(--trace-checkbox-bg, var(--trace-control-bg));
1128
+ vertical-align: middle;
1129
+ cursor: pointer;
1130
+ flex-shrink: 0;
1131
+ margin: 2px;
1132
+ padding: 0;
1133
+ transition: transform .2s ease-in-out, border-color .2s ease-in-out;
1134
+ display: inline-block;
1135
+ position: relative;
1136
+
1137
+ &:before {
1138
+ content: "";
1139
+ z-index: 1;
1140
+ background: var(--trace-checkbox-mark);
1141
+ opacity: 0;
1142
+ transition: opacity .18s ease-in-out, transform .18s ease-in-out;
1143
+ position: absolute;
1144
+ inset: 10%;
1145
+ transform: scale(.6);
1146
+ mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='m5 12 4 4 10-10' fill='none' stroke='white' stroke-width='3' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E") center / contain no-repeat;
1147
+ }
1148
+
1149
+ &:after {
1150
+ content: "";
1151
+ z-index: 0;
1152
+ border-radius: max(0px, calc(var(--trace-checkbox-radius) - 2px));
1153
+ background-color: var(--trace-checkbox-color);
1154
+ opacity: 0;
1155
+ transition: opacity .18s ease-in-out, transform .18s ease-in-out;
1156
+ position: absolute;
1157
+ inset: 0;
1158
+ transform: scale(.6);
1159
+ }
1160
+
1161
+ &:checked:after, &:indeterminate:after, &:checked:before {
1162
+ opacity: 1;
1163
+ transform: scale(1);
1164
+ }
1165
+
1166
+ &:indeterminate:before {
1167
+ opacity: 1;
1168
+ border-radius: 1px;
1169
+ block-size: 2px;
1170
+ inline-size: 60%;
1171
+ margin: auto;
1172
+ inset: 0;
1173
+ transform: scale(1);
1174
+ mask: none;
1175
+ }
1176
+
1177
+ &:focus-visible {
1178
+ outline: 2px solid var(--trace-checkbox-color);
1179
+ outline-offset: 2px;
1180
+ }
1181
+
1182
+ &:active:not(:disabled) {
1183
+ transform: scale(.9);
1184
+ }
1185
+
1186
+ &:disabled {
1187
+ opacity: .5;
1188
+ cursor: not-allowed;
1189
+ }
1190
+
1191
+ &[aria-invalid="true"] {
1192
+ --trace-checkbox-color: var(--trace-danger);
1193
+ --trace-checkbox-mark: var(--trace-neutral-lighter);
1194
+ }
1195
+
1196
+ &:user-invalid {
1197
+ --trace-checkbox-color: var(--trace-danger);
1198
+ --trace-checkbox-mark: var(--trace-neutral-lighter);
1199
+ }
1200
+
1201
+ @media (prefers-reduced-motion: reduce) {
1202
+ transition: none;
1203
+ transform: none;
1204
+
1205
+ &:before, &:after {
1206
+ transition: none;
1207
+ transform: none;
1208
+ }
1209
+ }
1210
+
1211
+ @media (forced-colors: active) {
1212
+ appearance: auto;
1213
+ background: none;
1214
+
1215
+ &:before, &:after {
1216
+ content: none;
1217
+ }
1218
+ }
1219
+ }
1220
+
1221
+ :where(label:has( > input[type="checkbox"]:not([role="switch"]))) {
1222
+ color: var(--trace-text);
1223
+ cursor: pointer;
1224
+ align-items: center;
1225
+ gap: .5rem;
1226
+ display: inline-flex;
1227
+
1228
+ &:has( > input:disabled) {
1229
+ color: color-mix(in srgb, var(--trace-text), transparent 50%);
1230
+ cursor: not-allowed;
1231
+ }
1232
+ }
1233
+
1234
+ :where(:root) {
1235
+ --trace-select-font-size: 1rem;
1236
+ --trace-select-line-height: 1.5rem;
1237
+ --trace-select-padding-block: .375rem;
1238
+ --trace-select-padding-inline: .625rem;
1239
+ --trace-select-radius: var(--trace-radius-control);
1240
+ --trace-select-text: var(--trace-text);
1241
+ --trace-select-border: light-dark(var(--trace-primary), var(--trace-secondary));
1242
+ --trace-select-focus: light-dark(var(--trace-primary-light), var(--trace-secondary-light));
1243
+ --trace-select-error: var(--trace-danger);
1244
+ --trace-select-shadow: var(--trace-shadow);
1245
+ --trace-select-arrow: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23646b79' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='m6 9 6 6 6-6'/%3E%3C/svg%3E");
1246
+ --trace-select-arrow-offset: var(--trace-select-padding-inline);
1247
+ --trace-select-arrow-size: 1.25em;
1248
+ }
1249
+
1250
+ :where(select) {
1251
+ --_trace-select-border: var(--trace-select-border);
1252
+ box-sizing: border-box;
1253
+ inline-size: 100%;
1254
+ min-inline-size: 0;
1255
+ padding: var(--trace-select-padding-block)
1256
+ var(--trace-select-padding-inline);
1257
+ border: 2px solid var(--_trace-select-border);
1258
+ border-radius: var(--trace-select-radius);
1259
+ background: var(--trace-select-bg, var(--trace-control-bg));
1260
+ color: var(--trace-select-text);
1261
+ font-family: var(--trace-font-body);
1262
+ font-size: var(--trace-select-font-size);
1263
+ line-height: var(--trace-select-line-height);
1264
+ text-align: start;
1265
+ appearance: auto;
1266
+ cursor: pointer;
1267
+ margin: 0;
1268
+ transition: border-color .2s ease-in-out, box-shadow .2s ease-in-out;
1269
+ display: block;
1270
+
1271
+ &:hover:not(:disabled):not(:focus) {
1272
+ box-shadow: var(--trace-select-shadow);
1273
+ }
1274
+
1275
+ &:focus {
1276
+ --_trace-select-border: var(--trace-select-focus);
1277
+ outline-offset: 2px;
1278
+ box-shadow: 0 0 0 4px
1279
+ color-mix(in srgb, var(--trace-select-focus), transparent 70%);
1280
+ outline: 2px solid #0000;
1281
+ }
1282
+
1283
+ &[aria-invalid="true"] {
1284
+ --_trace-select-border: var(--trace-select-error);
1285
+ }
1286
+
1287
+ &:user-invalid {
1288
+ --_trace-select-border: var(--trace-select-error);
1289
+ }
1290
+
1291
+ &:disabled {
1292
+ opacity: .5;
1293
+ cursor: not-allowed;
1294
+ box-shadow: none;
1295
+ }
1296
+
1297
+ @media (prefers-reduced-motion: reduce) {
1298
+ transition: none;
1299
+ }
1300
+ }
1301
+
1302
+ :where(select:not([multiple]):not([size]), select:not([multiple])[size="0"], select:not([multiple])[size="1"]) {
1303
+ appearance: none;
1304
+ background-image: var(--trace-select-arrow);
1305
+ background-repeat: no-repeat;
1306
+ background-size: var(--trace-select-arrow-size)
1307
+ var(--trace-select-arrow-size);
1308
+ background-position: right var(--trace-select-arrow-offset) center;
1309
+ padding-inline-end: calc(var(--trace-select-arrow-offset) + var(--trace-select-arrow-size) +
1310
+ var(--trace-select-padding-inline));
1311
+
1312
+ &:dir(rtl) {
1313
+ background-position: left var(--trace-select-arrow-offset) center;
1314
+ }
1315
+
1316
+ @media (forced-colors: active) {
1317
+ appearance: auto;
1318
+ background-image: none;
1319
+ }
1320
+ }
1321
+
1322
+ :where(select option, select optgroup) {
1323
+ background-color: var(--trace-select-bg, var(--trace-control-bg));
1324
+ color: var(--trace-select-text);
1325
+ }
1326
+
1327
+ :where(select[multiple], select[size]:not([size="1"])) {
1328
+ cursor: default;
1329
+ }
1330
+
1331
+ :where(label:has( > select)) {
1332
+ min-inline-size: 0;
1333
+ color: var(--trace-select-text);
1334
+ cursor: pointer;
1335
+ gap: .25rem;
1336
+ display: grid;
1337
+
1338
+ & > small {
1339
+ margin: 0;
1340
+ line-height: 1.5;
1341
+ }
1342
+
1343
+ &:has( > select:disabled) {
1344
+ color: color-mix(in srgb, var(--trace-select-text), transparent 50%);
1345
+ cursor: not-allowed;
1346
+ }
1347
+
1348
+ &:has( > select[aria-invalid="true"]) > small:last-child {
1349
+ color: var(--trace-select-error);
1350
+ }
1351
+
1352
+ &:has( > select:user-invalid) > small:last-child {
1353
+ color: var(--trace-select-error);
1354
+ }
1355
+ }
1356
+
1357
+ :where(label:has( > select) + small) {
1358
+ margin-block-start: .25rem;
1359
+ line-height: 1.5;
1360
+ display: block;
1361
+ }
1362
+
1363
+ :where(label:has( > select[aria-invalid="true"]) + small), :where(label:has( > select:user-invalid) + small) {
1364
+ color: var(--trace-select-error);
1365
+ }
1366
+
1367
+ :where(label[for]:has( + select:disabled)) {
1368
+ opacity: .5;
1369
+ cursor: not-allowed;
1370
+ }
1371
+
1372
+ :where(select[aria-invalid="true"] + small, select:user-invalid + small) {
1373
+ color: var(--trace-select-error);
1374
+ }
1375
+
1376
+ :where(:root) {
1377
+ --trace-range-color: light-dark(var(--trace-primary), var(--trace-secondary));
1378
+ --trace-range-track-color: light-dark(var(--trace-primary-light), var(--trace-secondary-dark));
1379
+ --trace-range-error: var(--trace-danger);
1380
+ --trace-range-track-size: .375rem;
1381
+ --trace-range-thumb-size: 1.25rem;
1382
+ --trace-range-height: 2rem;
1383
+ --trace-range-active-scale: 1.15;
1384
+ --trace-range-duration: .15s;
1385
+ }
1386
+
1387
+ :where(input[type="range"]) {
1388
+ appearance: none;
1389
+ box-sizing: border-box;
1390
+ inline-size: 100%;
1391
+ min-inline-size: 0;
1392
+ block-size: var(--trace-range-height);
1393
+ color: var(--trace-range-color);
1394
+ accent-color: var(--trace-range-color);
1395
+ cursor: pointer;
1396
+ background: none;
1397
+ border: 0;
1398
+ margin: 0;
1399
+ padding: 0;
1400
+ display: block;
1401
+
1402
+ &:focus-visible {
1403
+ outline: 2px solid var(--trace-range-color);
1404
+ outline-offset: 2px;
1405
+ border-radius: var(--trace-radius-control);
1406
+ }
1407
+
1408
+ &:disabled {
1409
+ opacity: .5;
1410
+ cursor: not-allowed;
1411
+ }
1412
+
1413
+ &[aria-invalid="true"] {
1414
+ --trace-range-color: var(--trace-range-error);
1415
+ --trace-range-track-color: color-mix(in srgb,
1416
+ var(--trace-range-error),
1417
+ transparent 70%);
1418
+ }
1419
+ }
1420
+
1421
+ :where(input[type="range"])::-webkit-slider-runnable-track {
1422
+ box-sizing: border-box;
1423
+ block-size: var(--trace-range-track-size);
1424
+ background: var(--trace-range-track-color);
1425
+ border: 0;
1426
+ border-radius: 999px;
1427
+ }
1428
+
1429
+ :where(input[type="range"])::-moz-range-track {
1430
+ box-sizing: border-box;
1431
+ block-size: var(--trace-range-track-size);
1432
+ background: var(--trace-range-track-color);
1433
+ border: 0;
1434
+ border-radius: 999px;
1435
+ }
1436
+
1437
+ :where(input[type="range"])::-webkit-slider-thumb {
1438
+ appearance: none;
1439
+ box-sizing: border-box;
1440
+ inline-size: var(--trace-range-thumb-size);
1441
+ block-size: var(--trace-range-thumb-size);
1442
+ border: 2px solid var(--trace-range-color);
1443
+ background: var(--trace-range-color);
1444
+ transition: transform var(--trace-range-duration) ease-out,
1445
+ box-shadow .2s ease-in-out;
1446
+ border-radius: 50%;
1447
+ margin-block-start: calc((var(--trace-range-track-size) - var(--trace-range-thumb-size)) / 2);
1448
+ }
1449
+
1450
+ :where(input[type="range"])::-moz-range-thumb {
1451
+ appearance: none;
1452
+ box-sizing: border-box;
1453
+ inline-size: var(--trace-range-thumb-size);
1454
+ block-size: var(--trace-range-thumb-size);
1455
+ border: 2px solid var(--trace-range-color);
1456
+ background: var(--trace-range-color);
1457
+ transition: transform var(--trace-range-duration) ease-out,
1458
+ box-shadow .2s ease-in-out;
1459
+ border-radius: 50%;
1460
+ }
1461
+
1462
+ :where(input[type="range"]:focus:not(:disabled))::-webkit-slider-thumb {
1463
+ box-shadow: 0 0 0 4px
1464
+ color-mix(in srgb, var(--trace-range-color), transparent 70%);
1465
+ }
1466
+
1467
+ :where(input[type="range"]:focus:not(:disabled))::-moz-range-thumb {
1468
+ box-shadow: 0 0 0 4px
1469
+ color-mix(in srgb, var(--trace-range-color), transparent 70%);
1470
+ }
1471
+
1472
+ :where(input[type="range"]:active:not(:disabled))::-webkit-slider-thumb {
1473
+ transform: scale(var(--trace-range-active-scale));
1474
+ }
1475
+
1476
+ :where(input[type="range"]:active:not(:disabled))::-moz-range-thumb {
1477
+ transform: scale(var(--trace-range-active-scale));
1478
+ }
1479
+
1480
+ @media (prefers-reduced-motion: reduce) {
1481
+ :where(input[type="range"])::-webkit-slider-thumb {
1482
+ transition: none;
1483
+ transform: none;
1484
+ }
1485
+
1486
+ :where(input[type="range"]:active:not(:disabled))::-webkit-slider-thumb {
1487
+ transition: none;
1488
+ transform: none;
1489
+ }
1490
+
1491
+ :where(input[type="range"])::-moz-range-thumb {
1492
+ transition: none;
1493
+ transform: none;
1494
+ }
1495
+
1496
+ :where(input[type="range"]:active:not(:disabled))::-moz-range-thumb {
1497
+ transition: none;
1498
+ transform: none;
1499
+ }
1500
+ }
1501
+
1502
+ :where(label:has( > input[type="range"])) {
1503
+ min-inline-size: 0;
1504
+ color: var(--trace-text);
1505
+ cursor: pointer;
1506
+ gap: .25rem;
1507
+ display: grid;
1508
+
1509
+ & > small {
1510
+ margin: 0;
1511
+ line-height: 1.5;
1512
+ }
1513
+
1514
+ &:has( > input[aria-invalid="true"]) > small:last-child {
1515
+ color: var(--trace-range-error);
1516
+ }
1517
+
1518
+ &:has( > input:disabled) {
1519
+ cursor: not-allowed;
1520
+ color: color-mix(in srgb, var(--trace-text), transparent 50%);
1521
+ }
1522
+ }
1523
+
1524
+ @media (forced-colors: active) {
1525
+ :where(input[type="range"]) {
1526
+ --trace-range-color: ButtonText;
1527
+ --trace-range-track-color: GrayText;
1528
+ }
1529
+ }
1530
+ }
1531
+
1532
+ @layer trace.extensions;