opui-css 2.2.3 → 2.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (79) hide show
  1. package/README.md +23 -7
  2. package/dist/{op+ui.css → theme-one+op.css} +290 -143
  3. package/dist/{ui.css → theme-one.css} +168 -12
  4. package/dist/theme-two+op.css +4021 -0
  5. package/dist/theme-two.css +3975 -0
  6. package/package.json +6 -5
  7. package/src/themes/theme-one/components/table.css +100 -0
  8. package/src/{components → themes/theme-one/components}/toggle-button-group.css +1 -5
  9. package/src/themes/theme-one/components.css +37 -0
  10. package/src/{theme.css → themes/theme-one/setup.css} +1 -1
  11. package/src/themes/theme-one/theme+op.css +5 -0
  12. package/src/themes/theme-one/theme.css +13 -0
  13. package/src/themes/theme-two/components/accordion.css +172 -0
  14. package/src/themes/theme-two/components/alert.css +85 -0
  15. package/src/themes/theme-two/components/avatar.css +68 -0
  16. package/src/themes/theme-two/components/badge.css +101 -0
  17. package/src/themes/theme-two/components/button-group.css +50 -0
  18. package/src/themes/theme-two/components/button.css +217 -0
  19. package/src/themes/theme-two/components/card.css +82 -0
  20. package/src/themes/theme-two/components/checkbox-radio.css +123 -0
  21. package/src/themes/theme-two/components/chip.css +135 -0
  22. package/src/themes/theme-two/components/definition-list.css +65 -0
  23. package/src/themes/theme-two/components/dialog.css +59 -0
  24. package/src/themes/theme-two/components/divider.css +7 -0
  25. package/src/themes/theme-two/components/field-group.css +83 -0
  26. package/src/themes/theme-two/components/field.css +281 -0
  27. package/src/themes/theme-two/components/icon-button.css +40 -0
  28. package/src/themes/theme-two/components/link.css +21 -0
  29. package/src/themes/theme-two/components/list.css +317 -0
  30. package/src/themes/theme-two/components/progress.css +83 -0
  31. package/src/themes/theme-two/components/range.css +121 -0
  32. package/src/themes/theme-two/components/rich-text.css +210 -0
  33. package/src/themes/theme-two/components/select.css +162 -0
  34. package/src/themes/theme-two/components/snackbar.css +148 -0
  35. package/src/themes/theme-two/components/spinner.css +38 -0
  36. package/src/themes/theme-two/components/switch.css +189 -0
  37. package/src/themes/theme-two/components/tab-buttons.css +120 -0
  38. package/src/themes/theme-two/components/text-field.css +57 -0
  39. package/src/themes/theme-two/components/textarea.css +25 -0
  40. package/src/themes/theme-two/components/toggle-button-group.css +135 -0
  41. package/src/themes/theme-two/components/tooltip.css +94 -0
  42. package/src/themes/theme-two/components/typography.css +209 -0
  43. package/src/themes/theme-two/components.css +37 -0
  44. package/src/themes/theme-two/setup.css +158 -0
  45. package/src/themes/theme-two/theme+op.css +5 -0
  46. package/src/themes/theme-two/theme.css +13 -0
  47. package/src/core/components.css +0 -37
  48. package/src/main.css +0 -13
  49. package/src/opui.css +0 -10
  50. /package/src/{components → themes/theme-one/components}/accordion.css +0 -0
  51. /package/src/{components → themes/theme-one/components}/alert.css +0 -0
  52. /package/src/{components → themes/theme-one/components}/avatar.css +0 -0
  53. /package/src/{components → themes/theme-one/components}/badge.css +0 -0
  54. /package/src/{components → themes/theme-one/components}/button-group.css +0 -0
  55. /package/src/{components → themes/theme-one/components}/button.css +0 -0
  56. /package/src/{components → themes/theme-one/components}/card.css +0 -0
  57. /package/src/{components → themes/theme-one/components}/checkbox-radio.css +0 -0
  58. /package/src/{components → themes/theme-one/components}/chip.css +0 -0
  59. /package/src/{components → themes/theme-one/components}/definition-list.css +0 -0
  60. /package/src/{components → themes/theme-one/components}/dialog.css +0 -0
  61. /package/src/{components → themes/theme-one/components}/divider.css +0 -0
  62. /package/src/{components → themes/theme-one/components}/field-group.css +0 -0
  63. /package/src/{components → themes/theme-one/components}/field.css +0 -0
  64. /package/src/{components → themes/theme-one/components}/icon-button.css +0 -0
  65. /package/src/{components → themes/theme-one/components}/link.css +0 -0
  66. /package/src/{components → themes/theme-one/components}/list.css +0 -0
  67. /package/src/{components → themes/theme-one/components}/progress.css +0 -0
  68. /package/src/{components → themes/theme-one/components}/range.css +0 -0
  69. /package/src/{components → themes/theme-one/components}/rich-text.css +0 -0
  70. /package/src/{components → themes/theme-one/components}/select.css +0 -0
  71. /package/src/{components → themes/theme-one/components}/snackbar.css +0 -0
  72. /package/src/{components → themes/theme-one/components}/spinner.css +0 -0
  73. /package/src/{components → themes/theme-one/components}/switch.css +0 -0
  74. /package/src/{components → themes/theme-one/components}/tab-buttons.css +0 -0
  75. /package/src/{components → themes/theme-one/components}/text-field.css +0 -0
  76. /package/src/{components → themes/theme-one/components}/textarea.css +0 -0
  77. /package/src/{components → themes/theme-one/components}/tooltip.css +0 -0
  78. /package/src/{components → themes/theme-one/components}/typography.css +0 -0
  79. /package/src/{components → themes/theme-two/components}/table.css +0 -0
@@ -0,0 +1,3975 @@
1
+ @layer openprops, normalize, utils, theme, components.root, components.extended;
2
+
3
+ /* Normalize */
4
+
5
+ @layer normalize {
6
+ *,
7
+ ::before,
8
+ ::after {
9
+ /* Set box sizing instead of inheriting */
10
+ /* https://www.oddbird.net/2025/09/04/box-model/ */
11
+ box-sizing: border-box;
12
+ }
13
+
14
+ * {
15
+ scrollbar-width: thin;
16
+ }
17
+
18
+ :where(html) {
19
+ --_page-bg-color: var(--surface-default);
20
+
21
+ accent-color: var(--primary);
22
+ background-color: var(--_page-bg-color);
23
+ block-size: 100%;
24
+ caret-color: var(--primary);
25
+ color: var(--text-color-2);
26
+ font-family: var(--font-sans);
27
+ interpolate-size: allow-keywords;
28
+ line-height: var(--font-lineheight-4);
29
+
30
+ /* https://kilianvalkhof.com/2022/css-html/your-css-reset-needs-text-size-adjust-probably/ */
31
+ -moz-text-size-adjust: none;
32
+ -webkit-text-size-adjust: none;
33
+ text-size-adjust: none;
34
+
35
+ @media (--motionOK) {
36
+ scroll-behavior: smooth;
37
+ }
38
+ }
39
+
40
+ :where(body) {
41
+ -moz-osx-font-smoothing: grayscale;
42
+ -webkit-font-smoothing: antialiased;
43
+ container-type: inline-size;
44
+ font-size: 16px;
45
+ font-synthesis: style;
46
+ font-weight: 400;
47
+ inline-size: 100%;
48
+ margin: 0;
49
+ min-block-size: 100%;
50
+ min-inline-size: 320px;
51
+ position: relative;
52
+ text-rendering: optimizeLegibility;
53
+ }
54
+
55
+ /* TODO */
56
+ :where(:not(dialog, popover)) {
57
+ margin: 0;
58
+ }
59
+
60
+ :where(:not(fieldset, progress, meter)) {
61
+ background-origin: border-box;
62
+ background-repeat: no-repeat;
63
+ border-style: solid;
64
+ border-width: 0;
65
+ }
66
+
67
+ :where(fieldset) {
68
+ border: var(--field-border-width) solid var(--field-border-color);
69
+ border-radius: var(--field-border-radius);
70
+ padding: var(--size-3);
71
+ display: grid;
72
+ gap: var(--size-3);
73
+ }
74
+
75
+ :where(input, button, textarea),
76
+ :where(input[type="file"])::-webkit-file-upload-button {
77
+ color: inherit;
78
+ font-size: inherit;
79
+ font: inherit;
80
+ letter-spacing: inherit;
81
+ }
82
+
83
+ :where(input):-webkit-autofill,
84
+ :where(input):-webkit-autofill:hover,
85
+ :where(input):-webkit-autofill:focus,
86
+ :where(textarea):-webkit-autofill,
87
+ :where(textarea):-webkit-autofill:hover,
88
+ :where(textarea):-webkit-autofill:focus,
89
+ :where(select):-webkit-autofill,
90
+ :where(select):-webkit-autofill:hover,
91
+ :where(select):-webkit-autofill:focus,
92
+ :where(input):autofill,
93
+ :where(input):autofill:hover,
94
+ :where(input):autofill:focus,
95
+ :where(textarea):autofill,
96
+ :where(textarea):autofill:hover,
97
+ :where(textarea):autofill:focus,
98
+ :where(select):autofill,
99
+ :where(select):autofill:hover,
100
+ :where(select):autofill:focus {
101
+ -webkit-text-fill-color: var(--text-color-2);
102
+ -webkit-box-shadow: 0 0 0px 1e5px var(--well-1) inset;
103
+ transition: background-color 5000s ease-in-out 0s;
104
+ }
105
+
106
+ ::placeholder {
107
+ color: var(--text-color-2);
108
+ }
109
+
110
+ ::-moz-placeholder {
111
+ opacity: 1;
112
+ }
113
+
114
+ :focus-visible {
115
+ /* Inverts the --_page-bg-color */
116
+ --_focus-visible-color: rgb(
117
+ from var(--_page-bg-color) calc(255 - r) calc(255 - g) calc(255 - b)
118
+ );
119
+
120
+ border-radius: var(--border-radius, 0px);
121
+ outline: 2px solid var(--_focus-visible-color);
122
+ outline-offset: 2px;
123
+ }
124
+
125
+ @media (--motionOK) {
126
+ :where(:focus-visible) {
127
+ transition: outline-offset 145ms var(--ease-2);
128
+ }
129
+ :where(:not(:active):focus-visible) {
130
+ transition-duration: 0.15s;
131
+ }
132
+ }
133
+
134
+ :where(:not(:active):focus-visible) {
135
+ outline-offset: var(--outline-offset, 0px);
136
+ }
137
+
138
+ :where(
139
+ a[href],
140
+ area,
141
+ button,
142
+ input:not(
143
+ [type="text"],
144
+ [type="email"],
145
+ [type="number"],
146
+ [type="password"],
147
+ [type=""],
148
+ [type="tel"],
149
+ [type="url"]
150
+ ),
151
+ label[for],
152
+ select,
153
+ summary
154
+ ) {
155
+ cursor: pointer;
156
+ }
157
+
158
+ :where(
159
+ a[href],
160
+ area,
161
+ button,
162
+ [role="button"],
163
+ input,
164
+ label[for],
165
+ select,
166
+ summary,
167
+ textarea,
168
+ [tabindex]:not([tabindex*="-"])
169
+ ) {
170
+ -webkit-tap-highlight-color: transparent;
171
+ touch-action: manipulation;
172
+ }
173
+
174
+ :where(img, svg, video, canvas, audio, iframe, embed, object) {
175
+ display: block;
176
+ }
177
+
178
+ :where(img, svg, video) {
179
+ block-size: auto;
180
+ max-inline-size: 100%;
181
+ }
182
+
183
+ :where(svg:not([width])) {
184
+ inline-size: var(--size-7);
185
+ }
186
+
187
+ :where(dt:not(:first-of-type)) {
188
+ margin-block-start: var(--size-5);
189
+ }
190
+
191
+ :where(figure) {
192
+ display: grid;
193
+ gap: var(--size-2);
194
+ place-items: center;
195
+ }
196
+
197
+ :target {
198
+ scroll-margin-block-start: 2rem;
199
+ }
200
+ }
201
+
202
+ /* Utils */
203
+
204
+ @layer utils {
205
+ /*
206
+ Screen-reader only
207
+ When you visibly want to hide an element but make it accessible for screen readers.
208
+ */
209
+ .sr-only {
210
+ block-size: 1px;
211
+ clip-path: inset(50%);
212
+ inline-size: 1px;
213
+ overflow: hidden;
214
+ position: absolute;
215
+ white-space: nowrap;
216
+ }
217
+
218
+ /* Hover and active effect for checkbox, radio and icon buttons */
219
+ :where(.checkbox input, .radio input, .icon-button) {
220
+ --isLTR: 1;
221
+ --isRTL: -1;
222
+
223
+ position: relative;
224
+ transform-style: preserve-3d;
225
+
226
+ &:dir(rtl) {
227
+ --isLTR: -1;
228
+ --isRTL: 1;
229
+ }
230
+
231
+ &:where(:not([disabled])) {
232
+ &:hover:before {
233
+ --thumb-scale: 1;
234
+ }
235
+
236
+ &:active:before {
237
+ --thumb-scale: 1.1;
238
+ }
239
+
240
+ &::before {
241
+ --thumb-scale: 0.01;
242
+ --highlight-size: 150%;
243
+
244
+ background-color: oklch(0.6 0 0 / 0.2);
245
+ block-size: var(--highlight-size);
246
+ clip-path: circle(50%);
247
+ content: "";
248
+ inline-size: var(--highlight-size);
249
+ inset-block-start: 50%;
250
+ inset-inline-start: 50%;
251
+ position: absolute;
252
+ transform-origin: center center;
253
+ transform: translateX(calc(var(--isRTL) * 50%)) translateY(-50%)
254
+ translateZ(-1px) scale(var(--thumb-scale));
255
+ will-change: transform;
256
+
257
+ @media (prefers-reduced-motion: no-preference) {
258
+ transition: transform 0.2s ease;
259
+ }
260
+ }
261
+ }
262
+ }
263
+ }
264
+
265
+ /* Components */
266
+
267
+ /*
268
+ * Components are divided into two categories - if they are stand-alone (root) or if they are built on top of others (extended).
269
+ */
270
+
271
+ /*** Root components (no dependencies) */
272
+
273
+ @layer components.root {
274
+ :where(.button) {
275
+ --_bg-color: transparent;
276
+ --_border-color: transparent;
277
+ --_border-radius: var(--button-border-radius);
278
+ --_font-size: initial;
279
+ --_min-height: 2.375rem;
280
+ --_text-color: var(--primary);
281
+
282
+ -webkit-tap-highlight-color: transparent;
283
+ -webkit-touch-callout: none;
284
+ align-items: center;
285
+ background: var(--_bg-color) var(--ripple, none);
286
+ border-radius: var(--_border-radius);
287
+ border: var(--border-size-1) solid var(--_border-color);
288
+ color: var(--_text-color);
289
+ display: inline-flex;
290
+ font-size: var(--_font-size);
291
+ font-weight: 700;
292
+ gap: var(--size-2);
293
+ justify-content: center;
294
+ min-block-size: var(--_min-height);
295
+ padding-block: 0.5ex;
296
+ padding-inline: 1.5ex;
297
+ text-align: center;
298
+ text-decoration: none;
299
+
300
+ user-select: none;
301
+
302
+ &:where([disabled]) {
303
+ cursor: not-allowed;
304
+ opacity: 0.64;
305
+ }
306
+
307
+ @media (prefers-reduced-motion: no-preference) {
308
+ transition: background-color 0.2s var(--ease-out-3),
309
+ box-shadow 0.2s var(--ease-out-3), border-color 0.2s var(--ease-out-3),
310
+ color 0.2s var(--ease-out-3), outline-offset 0.05s var(--ease-1);
311
+
312
+ /* Ripple effect */
313
+ background-position: center;
314
+
315
+ &:where(:not([disabled])) {
316
+ &:where(:not(:active):hover) {
317
+ --ripple: radial-gradient(circle, transparent 1%, var(--_bg-color) 1%)
318
+ center/15000%;
319
+
320
+ transition: background var(--button-ripple-duration);
321
+ }
322
+
323
+ &:where(:hover:active) {
324
+ background-size: var(--button-ripple-size);
325
+ transition: background 0s;
326
+ }
327
+ }
328
+ }
329
+
330
+ /* Element states */
331
+ &:where(:not([disabled])) {
332
+ &:where(:not(:active):hover) {
333
+ --_bg-color: light-dark(
334
+ oklch(from var(--primary) l 0.01 h / 20%),
335
+ oklch(from var(--primary) l 0.01 h / 40%)
336
+ );
337
+ }
338
+
339
+ &:where(:hover:active) {
340
+ --_bg-color: light-dark(
341
+ oklch(from var(--primary) l 0.06 h / 30%),
342
+ oklch(from var(--primary) l 0.06 h / 40%)
343
+ );
344
+ }
345
+ }
346
+
347
+ /* Disabled */
348
+ &:where([disabled]) {
349
+ --_text-color: color-mix(
350
+ in oklch,
351
+ var(--text-color-2) 50%,
352
+ var(--surface-default)
353
+ );
354
+ }
355
+
356
+ /* Icon */
357
+ &:where(:has(svg), &.icon-only) {
358
+ gap: 1ex;
359
+
360
+ svg {
361
+ max-block-size: 0.7lh;
362
+ color: currentColor;
363
+ }
364
+ }
365
+
366
+ /* Sizes */
367
+ &.small {
368
+ --_min-height: 1.875rem;
369
+ padding-block: 0;
370
+ padding-inline: 1ex;
371
+ }
372
+
373
+ &.large {
374
+ --_min-height: 2.875rem;
375
+ padding-inline: 4ex;
376
+ }
377
+
378
+ /* Variants */
379
+ &.outlined {
380
+ --_bg-color: var(--surface-default);
381
+ --_border-color: var(--color-8);
382
+ --_text-color: var(--color-8);
383
+
384
+ &:where(:not([disabled])) {
385
+ &:where(:not(:active):hover) {
386
+ --_bg-color: var(--color-10);
387
+ --_border-color: var(--color-10);
388
+ --_text-color: var(--color-1);
389
+ }
390
+
391
+ &:where(:active) {
392
+ --_bg-color: var(--color-9);
393
+ --_border-color: var(--color-9);
394
+ --_text-color: var(--color-1);
395
+ }
396
+ }
397
+
398
+ &:where([disabled]) {
399
+ --_bg-color: var(--surface-default);
400
+ --_border-color: color-mix(
401
+ in oklch,
402
+ var(--text-color-2) 20%,
403
+ var(--surface-default)
404
+ );
405
+ --_text-color: color-mix(
406
+ in oklch,
407
+ var(--text-color-2) 40%,
408
+ var(--surface-default)
409
+ );
410
+ }
411
+ }
412
+ &.tonal {
413
+ --_bg-color: var(--color-6);
414
+ --_text-color: var(--color-16);
415
+
416
+ &:where(:not([disabled])) {
417
+ &:where(:not(:active):hover) {
418
+ --_bg-color: var(--color-9);
419
+ --_border-color: var(--color-9);
420
+ }
421
+
422
+ &:where(:active) {
423
+ --_bg-color: var(--color-7);
424
+ --_border-color: var(--color-7);
425
+ }
426
+ }
427
+
428
+ &:where([disabled]) {
429
+ --_bg-color: color-mix(
430
+ in oklch,
431
+ var(--text-color-2) 8%,
432
+ var(--surface-default)
433
+ );
434
+ --_text-color: color-mix(
435
+ in oklch,
436
+ var(--text-color-2) 70%,
437
+ var(--surface-default)
438
+ );
439
+ }
440
+ }
441
+ &.filled {
442
+ --_bg-color: var(--color-8);
443
+ --_text-color: var(--color-1);
444
+
445
+ &:where(:not([disabled])) {
446
+ &:where(:not(:active):hover) {
447
+ --_bg-color: var(--color-10);
448
+ --_border-color: var(--color-10);
449
+ }
450
+
451
+ &:where(:active) {
452
+ --_bg-color: var(--color-9);
453
+ --_border-color: var(--color-9);
454
+ }
455
+ }
456
+
457
+ &:where([disabled]) {
458
+ --_bg-color: color-mix(
459
+ in oklch,
460
+ var(--text-color-2) 20%,
461
+ var(--surface-default)
462
+ );
463
+ --_text-color: color-mix(
464
+ in oklch,
465
+ var(--text-color-2) 70%,
466
+ var(--surface-default)
467
+ );
468
+ }
469
+ }
470
+ }
471
+
472
+ /* file input */
473
+ :where(input[type="file"]) {
474
+ align-self: flex-start;
475
+ border-radius: var(--radius-2);
476
+ border: var(--border-size-1) solid var(--surface-filled);
477
+ box-shadow: var(--inner-shadow-4);
478
+ color: var(--text-color-2-contrast);
479
+ cursor: initial;
480
+ max-inline-size: 100%;
481
+ padding: 0;
482
+ }
483
+
484
+ :where(input[type="file"])::-webkit-file-upload-button,
485
+ :where(input[type="file"])::file-selector-button {
486
+ cursor: pointer;
487
+ margin-inline-end: var(--size-relative-6);
488
+ }
489
+ }
490
+
491
+ @layer components.root {
492
+ :where(.icon-button) {
493
+ --_text-color: inherit;
494
+
495
+ align-items: center;
496
+ aspect-ratio: 1;
497
+ background-color: transparent;
498
+ border: 0;
499
+ border-radius: var(--radius-round);
500
+ display: inline-flex;
501
+ inline-size: var(--size-6);
502
+ justify-content: center;
503
+ padding: 0;
504
+ transform-style: preserve-3d;
505
+
506
+ &:where([disabled]) {
507
+ color: light-dark(rgb(0, 0, 0/0.3), rgb(255, 255, 255/0.26));
508
+ cursor: not-allowed;
509
+ opacity: 0.64;
510
+ }
511
+
512
+ svg {
513
+ max-inline-size: var(--size-5);
514
+ pointer-events: none;
515
+ }
516
+
517
+ /* Ripple effect, utils.css */
518
+ &::before {
519
+ --highlight-size: 130%;
520
+ }
521
+
522
+ /* Size */
523
+ &.small {
524
+ inline-size: var(--size-4);
525
+ svg {
526
+ max-inline-size: var(--size-4);
527
+ }
528
+ }
529
+ }
530
+ }
531
+
532
+ @layer components.root {
533
+ :where(nav.tabs) {
534
+ --_bg-color: transparent;
535
+
536
+ & > [role="tablist"] {
537
+ button {
538
+ outline-color: transparent;
539
+ outline-offset: -4px;
540
+
541
+ &[aria-selected="true"] {
542
+ &:focus-visible {
543
+ outline: 2px solid var(--text-color-1);
544
+ }
545
+ }
546
+ }
547
+ }
548
+
549
+ /* Underlined */
550
+ &.underlined {
551
+ /* Tab list */
552
+ & > [role="tablist"] {
553
+ border-bottom: 1px solid var(--border-color);
554
+
555
+ button {
556
+ --_ripple-color: light-dark(
557
+ color-mix(in oklch, var(--gray-2) 80%, var(--color-8)),
558
+ color-mix(in oklch, var(--gray-13) 80%, var(--color-8))
559
+ );
560
+
561
+ background: var(--_bg-color) var(--ripple, none);
562
+ font-weight: 500;
563
+ line-height: var(--font-lineheight-4);
564
+ padding: var(--size-2) var(--size-3);
565
+
566
+ &:focus-visible {
567
+ border-radius: 0;
568
+ }
569
+
570
+ &[aria-selected="true"] {
571
+ border-block-end: 2px solid var(--primary);
572
+ color: var(--primary);
573
+ }
574
+
575
+ @media (prefers-reduced-motion: no-preference) {
576
+ transition: background-color 0.2s var(--ease-out-3),
577
+ border-color 0.2s var(--ease-out-3), color 0.2s var(--ease-out-3),
578
+ outline-offset 0.05s var(--ease-1);
579
+
580
+ /*** Ripple effect */
581
+ background-position: center;
582
+ transition: background var(--button-ripple-duration);
583
+ &:where(:not(:active):hover) {
584
+ --ripple: radial-gradient(
585
+ circle,
586
+ transparent 1%,
587
+ var(--_ripple-color) 1%
588
+ )
589
+ center/15000%;
590
+ }
591
+
592
+ &:where(:hover:active) {
593
+ background-size: var(--button-ripple-size);
594
+ transition: background 0s;
595
+ }
596
+
597
+ &:hover {
598
+ background-color: light-dark(
599
+ oklch(from var(--primary) calc(l * 0.75) none h / 5%),
600
+ oklch(from var(--primary) calc(l * 1.25) none h / 5%)
601
+ );
602
+ }
603
+ }
604
+ }
605
+ }
606
+ }
607
+
608
+ /* Filled */
609
+ &.filled {
610
+ --_bg-color: var(--surface-default);
611
+ --_radius: var(--border-radius);
612
+ --_selected-bg: var(--surface-filled);
613
+
614
+ & > [role="tablist"] {
615
+ background-color: var(--_bg-color);
616
+ border: var(--border-width) solid var(--border-color);
617
+ border-radius: var(--_radius);
618
+ overflow: hidden;
619
+ padding: 0.792ex;
620
+ width: fit-content;
621
+
622
+ button {
623
+ background-color: var(--_bg-color);
624
+ border-radius: var(--_radius);
625
+ line-height: var(--font-lineheight-4);
626
+ padding-inline: var(--size-3);
627
+
628
+ &:hover {
629
+ background-color: oklch(from var(--_bg-color) calc(l * 1.25) c h);
630
+ }
631
+
632
+ &[aria-selected="true"] {
633
+ background-color: var(--_selected-bg);
634
+
635
+ &:hover {
636
+ background-color: oklch(
637
+ from var(--_selected-bg) calc(l * 1.25) c h
638
+ );
639
+ }
640
+ }
641
+
642
+ @media (prefers-reduced-motion: no-preference) {
643
+ transition: background-color 0.2s var(--ease-out-3),
644
+ border-color 0.2s var(--ease-out-3), color 0.2s var(--ease-out-3),
645
+ outline-offset 0.05s var(--ease-1);
646
+ }
647
+ }
648
+ }
649
+ }
650
+ }
651
+ }
652
+
653
+ @layer components.root {
654
+ :where([role="group"].toggle-button-group) {
655
+ --_border-radius: var(--button-border-radius);
656
+ --_button-padding-inline: clamp(var(--size-2), 3cqi, var(--size-4));
657
+ --_max-width: auto;
658
+ --_icon-size: var(--size-4);
659
+
660
+ background-color: var(--surface-default);
661
+ border: 1px solid var(--border-color);
662
+ border-radius: var(--_border-radius);
663
+ display: flex;
664
+ grid-auto-columns: 1fr;
665
+ grid-auto-flow: column;
666
+ max-inline-size: var(--_max-width);
667
+ min-inline-size: max-content;
668
+ overflow: clip;
669
+
670
+ /* Size */
671
+ &.small {
672
+ button {
673
+ min-block-size: 2.1875rem; /* 35px */
674
+ }
675
+ }
676
+
677
+ &.x-small {
678
+ button {
679
+ min-block-size: var(--size-6); /* 30px */
680
+ }
681
+ }
682
+
683
+ &.fullwidth {
684
+ inline-size: 100%;
685
+ }
686
+
687
+ /* Button */
688
+ button {
689
+ --_bg-color: transparent;
690
+
691
+ align-items: center;
692
+ background: var(--_bg-color) var(--ripple, none);
693
+ border-radius: 0;
694
+ border-inline: 1px solid var(--border-color);
695
+ border-inline-start-width: 0;
696
+ color: var(--text-color-1);
697
+ display: inline-flex;
698
+ flex: auto;
699
+ gap: 1ex;
700
+ justify-content: center;
701
+ min-block-size: 2.5rem; /* 40px */
702
+ min-inline-size: 5ex;
703
+ outline-offset: calc(-1 * var(--size-2));
704
+ padding: 0 var(--_button-padding-inline);
705
+ position: relative;
706
+ user-select: none;
707
+
708
+ @media (prefers-reduced-motion: no-preference) {
709
+ transition: background-color 0.2s var(--ease-out-3),
710
+ box-shadow 0.2s var(--ease-out-3), border-color 0.2s var(--ease-out-3),
711
+ color 0.2s var(--ease-out-3), outline-offset 0.05s var(--ease-1);
712
+ }
713
+
714
+ /* Element states */
715
+ &:hover {
716
+ --_bg-color: light-dark(oklch(0% 0 0 / 0.04), oklch(100% 0 0 / 0.08));
717
+ }
718
+
719
+ &:focus-visible {
720
+ outline-offset: -6px;
721
+ }
722
+
723
+ /* Disabled */
724
+ &[disabled] {
725
+ border-color: color-mix(in oklch, var(--border-color) 50%, transparent);
726
+ cursor: not-allowed;
727
+ color: color-mix(in oklch, var(--text-color-1) 30%, transparent);
728
+ }
729
+
730
+ &[disabled] + &:not([disabled]):not(:last-of-type) {
731
+ border-inline-end-width: 1px;
732
+ }
733
+
734
+ /* Assign border radius for outline */
735
+ &:first-of-type {
736
+ border-bottom-left-radius: var(--_border-radius);
737
+ border-top-left-radius: var(--_border-radius);
738
+ }
739
+ &:last-of-type {
740
+ border-bottom-right-radius: var(--_border-radius);
741
+ border-top-right-radius: var(--_border-radius);
742
+ }
743
+
744
+ &:last-of-type {
745
+ border-inline-end-width: 0;
746
+ }
747
+
748
+ /* Ripple effect */
749
+ background-position: center;
750
+
751
+ &:where(:not([disabled])) {
752
+ &:where(:not(:active):hover) {
753
+ --ripple: radial-gradient(circle, transparent 1%, var(--_bg-color) 1%)
754
+ center/15000%;
755
+
756
+ transition: background var(--button-ripple-duration);
757
+ }
758
+
759
+ &:where(:hover:active) {
760
+ background-size: var(--button-ripple-size);
761
+ transition: background 0s;
762
+ }
763
+ }
764
+
765
+ /* Icons */
766
+ svg {
767
+ inline-size: var(--_icon-size);
768
+ inset-inline-start: calc(var(--_button-padding-inline));
769
+
770
+ & + svg {
771
+ max-block-size: var(--size-5);
772
+ max-inline-size: var(--size-7);
773
+ }
774
+ }
775
+
776
+ /* Selected */
777
+ &.selected {
778
+ --_bg-color: oklch(from var(--primary) l c h / 25%);
779
+
780
+ /* Checkmark */
781
+ svg:first-of-type {
782
+ margin-block-end: -3px;
783
+ }
784
+ }
785
+ }
786
+ }
787
+ }
788
+
789
+ @layer components.root {
790
+ :where(.avatar) {
791
+ --_bg-color: var(--color-8);
792
+ --_color: var(--text-color-1);
793
+ --_width: 40px;
794
+
795
+ align-items: center;
796
+ background-color: var(--_bg-color);
797
+ color: var(--_color);
798
+ aspect-ratio: 1;
799
+ border-radius: 100vmax;
800
+ display: inline-flex;
801
+ inline-size: var(--_width);
802
+ justify-content: center;
803
+ overflow: clip;
804
+ position: relative;
805
+ text-align: center;
806
+ text-decoration: none;
807
+
808
+ &:has(img) {
809
+ background-color: transparent;
810
+ }
811
+
812
+ svg {
813
+ max-inline-size: var(--size-5);
814
+ }
815
+
816
+ img {
817
+ block-size: 100%;
818
+ inline-size: 100%;
819
+ inset: 0;
820
+ object-fit: cover;
821
+ position: absolute;
822
+ }
823
+
824
+ &.squared {
825
+ border-radius: 0;
826
+ }
827
+
828
+ &.rounded {
829
+ border-radius: var(--border-size-3);
830
+ }
831
+ }
832
+
833
+ /*
834
+ TODO: implement reading-order if that becomes a thing.
835
+ https://developer.chrome.com/blog/reading-order/
836
+ */
837
+ :where(.avatar-group) {
838
+ --_margin: var(--size-1);
839
+
840
+ display: flex;
841
+ flex-direction: row-reverse;
842
+
843
+ &.gap-small {
844
+ --_margin: var(--size-2);
845
+ }
846
+
847
+ &.gap-x-small {
848
+ --_margin: var(--size-3);
849
+ }
850
+
851
+ .avatar {
852
+ margin-inline-end: calc(-1 * var(--_margin));
853
+ outline: 2px solid var(--surface-default);
854
+ }
855
+ }
856
+ }
857
+
858
+ @layer components.root {
859
+ :where(.badge) {
860
+ --_bg-color: var(--primary);
861
+ --_border-color: var(--primary);
862
+ --_color: var(--gray-1);
863
+ --_inset-offset: 16px;
864
+ --_inset: auto auto calc(100% - var(--_inset-offset))
865
+ calc(100% - var(--_inset-offset));
866
+ --_translate: 0;
867
+
868
+ display: inline-flex;
869
+ position: relative;
870
+
871
+ &::after {
872
+ background-color: var(--_bg-color);
873
+ border: 2px solid var(--_border-color);
874
+ border-radius: 100vmax;
875
+ color: var(--_color);
876
+ content: attr(aria-label);
877
+ font-size: 12px;
878
+ font-weight: 500;
879
+ block-size: var(--size-4);
880
+ line-height: normal;
881
+ min-inline-size: var(--size-4, 1.125rem);
882
+ padding-inline: var(--size-1);
883
+ inset: var(--_inset);
884
+ position: absolute;
885
+ text-align: center;
886
+ translate: var(--_translate);
887
+ transition: opacity 0.2s var(--ease-out-1);
888
+ inline-size: max-content;
889
+ }
890
+
891
+ /* Alignment */
892
+ &.start-start {
893
+ --_inset: auto calc(100% - var(--_inset-offset))
894
+ calc(100% - var(--_inset-offset)) auto;
895
+ }
896
+ &.start-end {
897
+ --_inset: auto auto calc(100% - var(--_inset-offset))
898
+ calc(100% - var(--_inset-offset));
899
+ }
900
+ &.end-start {
901
+ --_inset: calc(100% - var(--_inset-offset))
902
+ calc(100% - var(--_inset-offset)) auto auto;
903
+ }
904
+ &.end-end {
905
+ --_inset: calc(100% - var(--_inset-offset)) auto auto
906
+ calc(100% - var(--_inset-offset));
907
+ }
908
+
909
+ /* Dot */
910
+ &.dot {
911
+ --_inset: 0 -1px auto auto;
912
+ &::after {
913
+ content: "";
914
+ min-inline-size: var(--size-2);
915
+ block-size: var(--size-2);
916
+ inline-size: var(--size-2);
917
+ padding: 0;
918
+ }
919
+ }
920
+
921
+ /* Visibility */
922
+ &.invisible {
923
+ &::after {
924
+ opacity: 0;
925
+ pointer-events: none;
926
+ }
927
+ }
928
+
929
+ /* Colors */
930
+ &.error,
931
+ &.good,
932
+ &.ok,
933
+ &.warning {
934
+ --_bg-color: var(--color-8);
935
+ --_border-color: var(--color-8);
936
+ }
937
+ }
938
+
939
+ [dir="rtl"] {
940
+ :where(.badge) {
941
+ --_inset: auto calc(100% - 16px) calc(100% - 16px) auto;
942
+
943
+ /* Alignment */
944
+ &.start-start {
945
+ --_inset: auto auto calc(100% - 16px) calc(100% - 16px);
946
+ }
947
+ &.start-end {
948
+ --_inset: auto calc(100% - 16px) calc(100% - 16px) auto;
949
+ }
950
+ &.end-start {
951
+ --_inset: calc(100% - 16px) auto auto calc(100% - 16px);
952
+ }
953
+ &.end-end {
954
+ --_inset: calc(100% - 16px) calc(100% - 16px) auto auto;
955
+ }
956
+ }
957
+ }
958
+ }
959
+
960
+ @layer components.root {
961
+ :where(.card) {
962
+ --_bg-color: transparent;
963
+ --_border-color: transparent;
964
+ --_border-width: 0;
965
+ --_shadow: none;
966
+
967
+ background-color: var(--_bg-color);
968
+ border-color: var(--_border-color);
969
+ border-radius: var(--border-radius, 0.25rem);
970
+ border-style: solid;
971
+ border-width: var(--_border-width);
972
+ box-shadow: var(--_shadow);
973
+ display: flex;
974
+ flex-direction: column;
975
+ gap: var(--size-3);
976
+ overflow: hidden;
977
+ padding-inline: 0;
978
+
979
+ /* Variants */
980
+ &.text {
981
+ --_bg-color: transparent;
982
+ --_border-color: transparent;
983
+ --_border-width: 0;
984
+ --_shadow: none;
985
+ padding-inline: 0;
986
+ }
987
+
988
+ &.tonal {
989
+ --_bg-color: var(--surface-tonal);
990
+ --_border-width: 1px;
991
+ }
992
+
993
+ &.elevated {
994
+ --_bg-color: var(--surface-elevated);
995
+ --_border-color: transparent;
996
+ --_border-width: 0;
997
+ --_shadow: var(--shadow-3);
998
+
999
+ /* Adjust shadow in dark mode */
1000
+ @container style(--color-scheme: dark) {
1001
+ --_shadow: var(--shadow-4);
1002
+ }
1003
+ }
1004
+
1005
+ &.outlined {
1006
+ --_bg-color: var(--surface-default);
1007
+ --_border-color: var(--border-color);
1008
+ --_border-width: 1px;
1009
+ }
1010
+
1011
+ & > :where(hgroup, .content) {
1012
+ padding-inline: var(--size-3);
1013
+ }
1014
+
1015
+ & > hgroup {
1016
+ padding-block: var(--size-3) 0;
1017
+
1018
+ /* Top paragraph */
1019
+ & > p:first-of-type:first-child {
1020
+ line-height: 1.3;
1021
+ }
1022
+
1023
+ /* Bottom paragraph */
1024
+ & > p:last-of-type:last-child:not(:first-child) {
1025
+ font-size: var(--font-size-1, 1rem);
1026
+ }
1027
+ }
1028
+
1029
+ & > .content:where(:only-child, :first-child) {
1030
+ padding-block: var(--size-3) var(--size-4);
1031
+ }
1032
+
1033
+ & > .actions {
1034
+ display: flex;
1035
+ gap: var(--size-1);
1036
+ margin-block: var(--size-2) 0;
1037
+ padding-block-end: var(--size-1);
1038
+ padding-inline: var(--size-1) var(--size-3);
1039
+ }
1040
+ }
1041
+ }
1042
+
1043
+ @layer components.root {
1044
+ :where(.chip) {
1045
+ --_bg-color: var(--surface-tonal);
1046
+ --_border-color: var(--border-color);
1047
+ --_color: var(--text-color-1);
1048
+
1049
+ align-items: center;
1050
+ background: var(--_bg-color) var(--ripple, none);
1051
+ border: 1px solid var(--_border-color);
1052
+ border-radius: var(--radius-2, 0.5rem);
1053
+ color: var(--_color);
1054
+ display: inline-flex;
1055
+ font-size: var(--font-size-0, 0.75rem);
1056
+ gap: var(--size-1);
1057
+ block-size: var(--size-7, 2rem);
1058
+ padding-inline: var(--size-2);
1059
+ text-decoration: none;
1060
+
1061
+ /* Variants */
1062
+ &.tonal {
1063
+ --_bg-color: var(--surface-tonal);
1064
+ --_color: var(--text-color-1);
1065
+ }
1066
+
1067
+ &.outlined {
1068
+ --_bg-color: var(--surface-default);
1069
+ --_color: var(--text-color-1);
1070
+ }
1071
+
1072
+ /* TODO: should this be out of the box? */
1073
+ /* Colors */
1074
+ /* &:hover {
1075
+ --_bg-color: var(--color-11);
1076
+ --_border-color: var(--color-11);
1077
+ --_color: var(--text-color-1);
1078
+ } */
1079
+ /* &.red,
1080
+ &.blue,
1081
+ &.green,
1082
+ &.orange,
1083
+ &.primary {
1084
+ --_bg-color: var(--color-5);
1085
+ --_border-color: var(--color-7);
1086
+ --_color: var(--text-color-1-contrast);
1087
+
1088
+ &:hover {
1089
+ --_bg-color: var(--color-7);
1090
+ --_border-color: var(--color-7);
1091
+ --_color: var(--text-color-1-contrast);
1092
+
1093
+ &:active {
1094
+ --_bg-color: var(--color-8);
1095
+ --_border-color: var(--color-8);
1096
+ }
1097
+ }
1098
+
1099
+ &.outlined {
1100
+ --_bg-color: var(--surface-tonal);
1101
+ --_color: var(--text-color-1);
1102
+ --_border-color: var(--color-9);
1103
+
1104
+ &:hover {
1105
+ --_bg-color: var(--color-9);
1106
+ --_border-color: var(--color-9);
1107
+ --_color: var(--text-color-1);
1108
+
1109
+ &:active {
1110
+ --_bg-color: var(--color-11);
1111
+ --_border-color: var(--color-11);
1112
+ }
1113
+ }
1114
+ }
1115
+ } */
1116
+
1117
+ &:where(button, a):where(:not([disabled])) {
1118
+ &:where(:not(:active)):hover {
1119
+ --_bg-color: light-dark(
1120
+ oklch(from var(--surface-tonal) calc(l * 0.98) c h),
1121
+ oklch(from var(--surface-tonal) calc(l * 1.1) c h)
1122
+ );
1123
+ }
1124
+ }
1125
+
1126
+ /* Icon */
1127
+ &:has(svg:first-child) {
1128
+ padding-inline: var(--size-1) var(--size-2);
1129
+ }
1130
+ &:has(svg:last-child) {
1131
+ padding-inline: var(--size-2) var(--size-1);
1132
+ }
1133
+
1134
+ &:has(svg) {
1135
+ svg {
1136
+ flex-shrink: 0;
1137
+ inline-size: var(--size-3);
1138
+ }
1139
+ }
1140
+
1141
+ /* Sizes */
1142
+ &.small {
1143
+ block-size: var(--size-5);
1144
+ }
1145
+ &.multiline {
1146
+ block-size: auto;
1147
+ }
1148
+
1149
+ /* Ripple effect */
1150
+ background-position: center;
1151
+
1152
+ &:where(:not([disabled])) {
1153
+ &:where(:not(:active):hover) {
1154
+ --ripple: radial-gradient(circle, transparent 1%, var(--_bg-color) 1%)
1155
+ center/15000%;
1156
+
1157
+ transition: background var(--button-ripple-duration);
1158
+ }
1159
+
1160
+ &:where(:hover:active) {
1161
+ background-size: var(--button-ripple-size);
1162
+ transition: background 0s;
1163
+ }
1164
+ }
1165
+
1166
+ /* Disabled */
1167
+ &:where([disabled]) {
1168
+ opacity: 0.64;
1169
+ --_text-color: color-mix(
1170
+ in oklch,
1171
+ var(--text-color-2) 50%,
1172
+ var(--surface-default)
1173
+ );
1174
+ cursor: not-allowed;
1175
+ }
1176
+ }
1177
+ }
1178
+
1179
+ @layer components.root {
1180
+ :where(.definition-list) {
1181
+ --_border-style: solid;
1182
+ --_border-width: 1px;
1183
+
1184
+ display: grid;
1185
+ gap: var(--size-3);
1186
+ padding: 0;
1187
+
1188
+ &.dotted {
1189
+ --_border-style: dotted;
1190
+ --_border-width: 2px;
1191
+ }
1192
+
1193
+ li {
1194
+ display: grid;
1195
+ margin: 0;
1196
+ padding: 0;
1197
+
1198
+ .term {
1199
+ display: block;
1200
+ font-weight: 700;
1201
+ overflow: hidden;
1202
+ position: relative;
1203
+ }
1204
+
1205
+ hr {
1206
+ display: none;
1207
+ margin: 0;
1208
+ }
1209
+ }
1210
+
1211
+ @container (width > 45ch) {
1212
+ gap: var(--size-1);
1213
+
1214
+ li {
1215
+ align-items: baseline;
1216
+ display: grid;
1217
+ gap: var(--size-1);
1218
+ grid-template-columns: 1fr auto;
1219
+
1220
+ &:has(hr) {
1221
+ grid-template-columns: auto 1fr auto;
1222
+ }
1223
+
1224
+ hr {
1225
+ background-color: transparent;
1226
+ border-block-end: var(--_border-width) var(--_border-style)
1227
+ var(--border-color);
1228
+ block-size: 2px;
1229
+ display: block;
1230
+ }
1231
+
1232
+ .term {
1233
+ &::after {
1234
+ display: inline-block;
1235
+ }
1236
+ }
1237
+ .description {
1238
+ color: var(--text-color-2);
1239
+ }
1240
+ }
1241
+ }
1242
+ }
1243
+ }
1244
+
1245
+ @layer components.root {
1246
+ :where(hr) {
1247
+ background-color: var(--border-color);
1248
+ block-size: var(--border-size-1);
1249
+ margin-block: var(--size-fluid-3);
1250
+ }
1251
+ }
1252
+
1253
+ @layer components.root {
1254
+ :where(.link) {
1255
+ color: var(--primary);
1256
+ cursor: pointer;
1257
+ font-weight: 700;
1258
+ text-decoration: underline;
1259
+ text-decoration-color: var(--primary);
1260
+ text-underline-offset: 2px;
1261
+
1262
+ &[href] {
1263
+ &:hover,
1264
+ &:focus-visible {
1265
+ color: var(--primary-light);
1266
+ }
1267
+ }
1268
+
1269
+ @supports (-moz-appearance: none) {
1270
+ text-underline-offset: 2px;
1271
+ }
1272
+ }
1273
+ }
1274
+
1275
+ @layer components.root {
1276
+ :where(table) {
1277
+ border-collapse: collapse;
1278
+ display: block;
1279
+ margin: var(--size-3) 0;
1280
+ max-inline-size: 100%;
1281
+ position: relative;
1282
+
1283
+ /* Rows */
1284
+ tr {
1285
+ background-color: var(--surface-default);
1286
+ border-top: 1px solid var(--border-color);
1287
+
1288
+ &:hover {
1289
+ background-color: oklch(from var(--surface-filled) l c h / 75%);
1290
+ }
1291
+ }
1292
+
1293
+ /* Cells */
1294
+ th,
1295
+ td {
1296
+ border: 1px solid var(--border-color);
1297
+ padding: var(--size-1) var(--size-2);
1298
+ }
1299
+
1300
+ th {
1301
+ background-color: var(--surface-filled);
1302
+ color: var(--text-color-1);
1303
+ font-size: var(--font-size-sm, 0.75rem);
1304
+ font-weight: 600;
1305
+ text-align: start;
1306
+ }
1307
+
1308
+ td {
1309
+ font-size: var(--font-size-sm, 0.75rem);
1310
+ }
1311
+
1312
+ /* Caption */
1313
+ caption {
1314
+ caption-side: bottom;
1315
+ color: var(--text-color-2);
1316
+ font-size: var(--font-size-sm, 0.75rem);
1317
+ padding: var(--size-2) 0;
1318
+ text-align: start;
1319
+ }
1320
+
1321
+ /* Header */
1322
+ thead {
1323
+ position: sticky;
1324
+ top: 0;
1325
+ z-index: 1;
1326
+ }
1327
+
1328
+ /* Footer */
1329
+ tfoot {
1330
+ border-top: 2px solid var(--border-color);
1331
+
1332
+ tr {
1333
+ background-color: var(--surface-filled);
1334
+ }
1335
+
1336
+ td {
1337
+ color: var(--text-color-1);
1338
+ font-weight: 600;
1339
+ }
1340
+ }
1341
+
1342
+ /* Column group */
1343
+ colgroup col {
1344
+ border: none;
1345
+ }
1346
+
1347
+ @container (width < 60ch) {
1348
+ th,
1349
+ td {
1350
+ padding: var(--size-1) 0.875rem;
1351
+ }
1352
+ }
1353
+
1354
+ /* Sticky header */
1355
+ &.sticky-header thead {
1356
+ background-color: var(--surface-filled);
1357
+ position: sticky;
1358
+ inset-block-start: 0;
1359
+ z-index: 1;
1360
+ }
1361
+
1362
+ /* Dense */
1363
+ &.dense {
1364
+ th,
1365
+ td {
1366
+ padding: var(--size-1) var(--size-2);
1367
+ }
1368
+
1369
+ caption {
1370
+ padding: var(--size-1) 0;
1371
+ }
1372
+
1373
+ @container (width < 60ch) {
1374
+ th,
1375
+ td {
1376
+ padding: var(--size-1) var(--size-2);
1377
+ }
1378
+ }
1379
+ }
1380
+ }
1381
+ }
1382
+
1383
+ @layer components.root {
1384
+ :where(progress) {
1385
+ --_accent-color: var(--primary);
1386
+ --_bg-color: var(--surface-tonal);
1387
+
1388
+ appearance: none;
1389
+ background-color: var(--_bg-color);
1390
+ border-radius: var(--border-radius, 0.25rem);
1391
+ border: 0;
1392
+ display: inline-block;
1393
+ block-size: var(--size-1);
1394
+ overflow: hidden;
1395
+ position: relative;
1396
+ vertical-align: baseline;
1397
+ inline-size: 100%;
1398
+
1399
+ &::-webkit-progress-bar {
1400
+ border-radius: var(--border-radius, 0.25rem);
1401
+ background: none;
1402
+ }
1403
+
1404
+ &[value]::-webkit-progress-value {
1405
+ background-color: var(--_accent-color);
1406
+
1407
+ @media (prefers-reduced-motion: no-preference) {
1408
+ transition: inline-size 0.2s
1409
+ var(--ease-out-4, cubic-bezier(0, 0, 0.1, 1));
1410
+ }
1411
+ }
1412
+
1413
+ &::-moz-progress-bar {
1414
+ background-color: var(--_accent-color);
1415
+ }
1416
+ }
1417
+
1418
+ @media (prefers-reduced-motion: no-preference) {
1419
+ progress:indeterminate {
1420
+ background-color: var(--_bg-color);
1421
+
1422
+ &::after {
1423
+ animation: indeterminate 2s linear infinite;
1424
+ background-color: var(--_accent-color);
1425
+ content: "";
1426
+ inset: 0 auto 0 0;
1427
+ position: absolute;
1428
+ will-change: inset-inline-start, inset-inline-end;
1429
+ }
1430
+
1431
+ &[value]::-webkit-progress-value {
1432
+ background-color: transparent;
1433
+ }
1434
+
1435
+ &::-moz-progress-bar {
1436
+ background-color: transparent;
1437
+ }
1438
+ }
1439
+
1440
+ [dir="rtl"] {
1441
+ :where(progress):indeterminate {
1442
+ animation-direction: reverse;
1443
+
1444
+ &::after {
1445
+ animation-direction: reverse;
1446
+ }
1447
+ }
1448
+ }
1449
+ }
1450
+
1451
+ @keyframes indeterminate {
1452
+ 0% {
1453
+ left: -200%;
1454
+ right: 100%;
1455
+ }
1456
+ 60% {
1457
+ left: 107%;
1458
+ right: -8%;
1459
+ }
1460
+ 100% {
1461
+ left: 107%;
1462
+ right: -8%;
1463
+ }
1464
+ }
1465
+ }
1466
+
1467
+ @layer components.root {
1468
+ [aria-busy="true"]:not(
1469
+ input,
1470
+ select,
1471
+ textarea,
1472
+ html,
1473
+ progress,
1474
+ [aria-describedby]
1475
+ ) {
1476
+ position: relative;
1477
+
1478
+ &::before {
1479
+ animation: spin 0.7s linear infinite;
1480
+ border-color: transparent currentColor currentColor;
1481
+ border-radius: 50%;
1482
+ border-style: solid;
1483
+ border-width: 3px;
1484
+ content: "";
1485
+ display: inline-block;
1486
+ block-size: 1em;
1487
+ opacity: 0.5;
1488
+ vertical-align: -0.14em;
1489
+ inline-size: 1em;
1490
+ }
1491
+
1492
+ &:not(button.button):not(:empty) {
1493
+ &::before {
1494
+ margin-inline-end: 0.5em;
1495
+ }
1496
+ }
1497
+ }
1498
+
1499
+ @keyframes spin {
1500
+ to {
1501
+ transform: rotate(1turn);
1502
+ }
1503
+ }
1504
+ }
1505
+
1506
+ @layer components.root {
1507
+ label:where(.checkbox, .radio) {
1508
+ align-items: center;
1509
+ color: var(--text-color-1);
1510
+ cursor: pointer;
1511
+ display: inline-grid;
1512
+ gap: 0 var(--size-2);
1513
+ grid-auto-columns: auto;
1514
+ grid-auto-flow: column;
1515
+ inline-size: fit-content;
1516
+ line-height: 1.5;
1517
+ transform: translateZ(0);
1518
+ user-select: none;
1519
+
1520
+ /* Disabled */
1521
+ &:has([disabled]) {
1522
+ cursor: not-allowed;
1523
+ opacity: 0.64;
1524
+ user-select: none;
1525
+
1526
+ input {
1527
+ cursor: not-allowed;
1528
+ }
1529
+ }
1530
+
1531
+ /* Required dot */
1532
+ &:has([required]:not([type="checkbox"]:checked)) {
1533
+ .label:after {
1534
+ color: var(--red);
1535
+ content: "*";
1536
+ inset: 0 -0.25ex auto auto;
1537
+ position: absolute;
1538
+ }
1539
+ }
1540
+
1541
+ /* Label */
1542
+ .label {
1543
+ grid-column: 2;
1544
+ grid-row: 1;
1545
+ position: relative;
1546
+ padding-inline: 0 1ex;
1547
+ }
1548
+
1549
+ /* Supporting text */
1550
+ .supporting-text {
1551
+ color: var(--text-color-2);
1552
+ font-size: var(--font-size-xs);
1553
+ grid-column: 2;
1554
+ grid-row: 2;
1555
+ line-height: 1.5;
1556
+ z-index: 1;
1557
+ }
1558
+
1559
+ /* Stacked layout */
1560
+ &.stack {
1561
+ justify-items: center;
1562
+ grid-auto-columns: unset;
1563
+
1564
+ .label {
1565
+ grid-column: 1/-1;
1566
+ grid-row: 2;
1567
+ margin-block-start: var(--size-1);
1568
+ padding-inline: 1ex;
1569
+
1570
+ /* Required dot */
1571
+ &::after {
1572
+ inset: 0 -0.25ex auto auto;
1573
+ }
1574
+ }
1575
+
1576
+ .supporting-text {
1577
+ grid-column: 1/-1;
1578
+ grid-row: 3;
1579
+ }
1580
+ }
1581
+
1582
+ /* Input */
1583
+ input {
1584
+ aspect-ratio: 1;
1585
+ block-size: 1.125rem;
1586
+ cursor: pointer;
1587
+ inline-size: 1.125rem;
1588
+
1589
+ &::before {
1590
+ --highlight-size: 175%;
1591
+ }
1592
+ }
1593
+
1594
+ /* Sizes */
1595
+ &.small {
1596
+ input {
1597
+ block-size: var(--size-3);
1598
+ inline-size: var(--size-3);
1599
+ }
1600
+ }
1601
+
1602
+ &.large {
1603
+ input {
1604
+ block-size: var(--size-4);
1605
+ inline-size: var(--size-4);
1606
+ }
1607
+ }
1608
+
1609
+ /* Validation */
1610
+ &.error {
1611
+ input[type="checkbox"] {
1612
+ accent-color: var(--color-9);
1613
+
1614
+ & ~ :where(.label, .supporting-text) {
1615
+ color: var(--color-9);
1616
+ }
1617
+ }
1618
+ }
1619
+
1620
+ /* Touch devices */
1621
+ @media (pointer: coarse) {
1622
+ input {
1623
+ block-size: var(--size-4);
1624
+ inline-size: var(--size-4);
1625
+ }
1626
+ }
1627
+ }
1628
+ }
1629
+
1630
+ @layer components.root {
1631
+ :where(.switch) {
1632
+ --_accent-color: var(--primary);
1633
+ --_accent-contrast: var(--primary-contrast);
1634
+
1635
+ --_dot-bg-color: light-dark(var(--gray-11), var(--gray-14));
1636
+ --_dot-inset: var(--size-1) auto auto var(--size-1);
1637
+ --_dot-outline-size: 0;
1638
+ --_dot-size: var(--size-3);
1639
+
1640
+ --_track-bg-color: light-dark(var(--gray-3), var(--gray-8));
1641
+ --_track-height: var(--size-5);
1642
+ --_track-width: var(--size-8);
1643
+ --_transition-tf: var(--ease-4);
1644
+ --_transition-time: 0.2s;
1645
+
1646
+ align-items: center;
1647
+ color: var(--text-color-1);
1648
+ display: inline-grid;
1649
+ gap: 0 var(--size-2);
1650
+ grid-auto-columns: auto;
1651
+ grid-auto-flow: column;
1652
+ inline-size: fit-content;
1653
+
1654
+ input[type="checkbox"][role="switch"] {
1655
+ appearance: none;
1656
+ block-size: var(--_track-height);
1657
+ cursor: pointer;
1658
+ inline-size: var(--_track-width);
1659
+ margin: 0;
1660
+ position: relative;
1661
+
1662
+ /* Track */
1663
+ &::before {
1664
+ background-color: var(--_track-bg-color);
1665
+ block-size: var(--_track-height);
1666
+ border: 1px solid var(--_dot-bg-color);
1667
+ border-radius: 100vmax;
1668
+ content: "";
1669
+ inline-size: var(--_track-width);
1670
+ inset: 0;
1671
+ position: absolute;
1672
+ }
1673
+
1674
+ &:focus-visible {
1675
+ outline-offset: 2px;
1676
+ outline: 2px solid currentColor;
1677
+ }
1678
+
1679
+ /* Dot */
1680
+ &::after {
1681
+ background-color: var(--_dot-bg-color);
1682
+ block-size: var(--_dot-size);
1683
+ border-radius: 100vmax;
1684
+ content: "";
1685
+ inline-size: var(--_dot-size);
1686
+ inset: var(--_dot-inset);
1687
+ outline-offset: -1px;
1688
+ outline: var(--_dot-outline-size) solid var(--_dot-bg-color);
1689
+ position: absolute;
1690
+ }
1691
+
1692
+ /* Checked */
1693
+ &:checked {
1694
+ &::before {
1695
+ background-color: var(--_accent-color);
1696
+ border-color: var(--_accent-color);
1697
+ transition: background-color var(--_transition-time)
1698
+ var(--_transition-tf),
1699
+ border-color var(--_transition-time) var(--_transition-tf);
1700
+ }
1701
+
1702
+ /* Dot */
1703
+ &::after {
1704
+ --_dot-bg-color: var(--_accent-contrast);
1705
+ --_dot-outline-size: calc(var(--size-1) - 1px);
1706
+
1707
+ inset-inline-start: calc(
1708
+ var(--_track-width) - var(--_dot-size) - var(--size-1)
1709
+ );
1710
+ }
1711
+ }
1712
+
1713
+ /* Animation */
1714
+ @media (prefers-reduced-motion: no-preference) {
1715
+ /* Track */
1716
+ &::before {
1717
+ transition: background-color var(--_transition-time)
1718
+ var(--_transition-tf),
1719
+ border-color var(--_transition-time) var(--_transition-tf);
1720
+ }
1721
+
1722
+ /* Dot */
1723
+ &::after {
1724
+ transition: all var(--_transition-time) var(--_transition-tf);
1725
+ }
1726
+
1727
+ &:active:after {
1728
+ --_dot-outline-size: calc(var(--size-1) + 1px);
1729
+ }
1730
+
1731
+ &:checked {
1732
+ &:active:after {
1733
+ --_dot-outline-size: calc(var(--size-1) + 1px);
1734
+ }
1735
+ }
1736
+ }
1737
+ }
1738
+
1739
+ /* Required dot */
1740
+ &:has([required]:not(:checked)) {
1741
+ .label:after {
1742
+ color: var(--red);
1743
+ content: "*";
1744
+ inset: 0 -0.25ex auto auto;
1745
+ position: absolute;
1746
+ }
1747
+ }
1748
+
1749
+ /* Disabled */
1750
+ &:has([disabled]) {
1751
+ cursor: not-allowed;
1752
+ opacity: 0.64;
1753
+ user-select: none;
1754
+
1755
+ input {
1756
+ cursor: not-allowed;
1757
+ }
1758
+ }
1759
+
1760
+ /* Label */
1761
+ .label {
1762
+ grid-column: 2;
1763
+ grid-row: 1;
1764
+ min-width: 0;
1765
+ padding-inline: 0 1ex;
1766
+ position: relative;
1767
+ user-select: none;
1768
+ }
1769
+
1770
+ /* Supporting text */
1771
+ .supporting-text {
1772
+ color: var(--text-color-2);
1773
+ font-size: var(--font-size-xs);
1774
+ grid-column: 2;
1775
+ grid-row: 2;
1776
+ line-height: 1.5;
1777
+ z-index: 1;
1778
+ }
1779
+
1780
+ /* Size */
1781
+ &.small {
1782
+ --_dot-size: 0.75rem;
1783
+ --_track-height: var(--size-4);
1784
+ --_track-width: 2.5rem;
1785
+ }
1786
+
1787
+ /* Stacked layout */
1788
+ &.stack {
1789
+ justify-items: center;
1790
+ grid-auto-columns: unset;
1791
+
1792
+ .label {
1793
+ grid-column: 1/-1;
1794
+ grid-row: 2;
1795
+ margin-block-start: var(--size-1);
1796
+ padding-inline: 1ex;
1797
+ }
1798
+
1799
+ .supporting-text {
1800
+ grid-column: 1/-1;
1801
+ grid-row: 3;
1802
+ }
1803
+ }
1804
+
1805
+ /* Validation */
1806
+ &.error {
1807
+ input {
1808
+ outline: 2px solid var(--color-9);
1809
+ border-radius: var(--radius-round);
1810
+ }
1811
+
1812
+ .label,
1813
+ .supporting-text {
1814
+ color: var(--color-9);
1815
+ }
1816
+ }
1817
+ }
1818
+ }
1819
+
1820
+ @layer components.root {
1821
+ :where(.range > input[type="range"]) {
1822
+ --thumb-bg: var(--primary);
1823
+ --thumb-highlight-color: oklch(from var(--primary) 70% 100% h / 20%);
1824
+ --thumb-highlight-size: 0px;
1825
+ --thumb-offset: -1ex;
1826
+ --thumb-size: 3ex;
1827
+ --track-color: var(--field-border-color);
1828
+ --track-fill: 0%;
1829
+ --track-height: 1ex;
1830
+
1831
+ appearance: none;
1832
+ background: transparent;
1833
+ display: block;
1834
+ inline-size: 100%;
1835
+ margin: 1ex 0 3ex;
1836
+ outline-offset: 1ex;
1837
+
1838
+ @media (hover: none) {
1839
+ --thumb-offset: -14px;
1840
+ --thumb-size: 30px;
1841
+ }
1842
+
1843
+ /* Track */
1844
+ &::-webkit-slider-runnable-track {
1845
+ appearance: none;
1846
+ background: linear-gradient(
1847
+ to right,
1848
+ transparent var(--track-fill),
1849
+ var(--track-color) 0%
1850
+ ),
1851
+ var(--primary);
1852
+ block-size: var(--track-height);
1853
+ border-radius: 5ex;
1854
+ box-shadow: var(--inner-shadow-1);
1855
+ }
1856
+
1857
+ &::-moz-range-track {
1858
+ appearance: none;
1859
+ background: linear-gradient(
1860
+ to right,
1861
+ transparent var(--track-fill),
1862
+ var(--track-color) 0%
1863
+ ),
1864
+ var(--primary);
1865
+ block-size: var(--track-height);
1866
+ border-radius: 5ex;
1867
+ box-shadow: var(--inner-shadow-2);
1868
+ }
1869
+
1870
+ /* Ring */
1871
+ &::-webkit-slider-thumb {
1872
+ appearance: none;
1873
+ background: var(--thumb-bg);
1874
+ block-size: var(--thumb-size);
1875
+ border-radius: 50%;
1876
+ border: 3px solid var(--surface-default);
1877
+ box-shadow: 0 0 0 var(--thumb-highlight-size) var(--thumb-highlight-color);
1878
+ cursor: ew-resize;
1879
+ inline-size: var(--thumb-size);
1880
+ margin-block-start: var(--thumb-offset);
1881
+
1882
+ @media (prefers-reduced-motion: no-preference) {
1883
+ transition: box-shadow 0.1s ease;
1884
+ }
1885
+
1886
+ .fieldset-item:focus-within & {
1887
+ border-color: var(--gray-14);
1888
+ }
1889
+ }
1890
+
1891
+ &::-moz-range-thumb {
1892
+ appearance: none;
1893
+ background: var(--thumb-bg);
1894
+ block-size: var(--thumb-size);
1895
+ border-radius: 50%;
1896
+ border: 3px solid var(--primary);
1897
+ box-shadow: 0 0 0 var(--thumb-highlight-size) var(--thumb-highlight-color);
1898
+ cursor: ew-resize;
1899
+ inline-size: var(--thumb-size);
1900
+ margin-block-start: var(--thumb-offset);
1901
+
1902
+ @media (prefers-reduced-motion: no-preference) {
1903
+ transition: box-shadow 0.1s ease;
1904
+ }
1905
+
1906
+ .fieldset-item:focus-within & {
1907
+ border-color: var(--gray-14);
1908
+ }
1909
+ }
1910
+
1911
+ /* Element state */
1912
+ &:not([disabled]) {
1913
+ &:hover {
1914
+ --thumb-highlight-size: var(--size-1);
1915
+ }
1916
+
1917
+ &:active {
1918
+ --thumb-highlight-size: var(--size-2);
1919
+ --track-color: light-dark(
1920
+ oklch(from var(--field-border-color) calc(l * 0.9) c h),
1921
+ oklch(from var(--field-border-color) calc(l * 1.1) c h)
1922
+ );
1923
+ }
1924
+ }
1925
+
1926
+ &[disabled] {
1927
+ --thumb-bg: oklch(from var(--text-color-1) l c h / 50%);
1928
+ --track-color: var(--field-border-color);
1929
+
1930
+ cursor: not-allowed;
1931
+
1932
+ &::-webkit-slider-thumb {
1933
+ cursor: not-allowed;
1934
+ }
1935
+ &::-moz-range-thumb {
1936
+ cursor: not-allowed;
1937
+ }
1938
+ }
1939
+ }
1940
+ }
1941
+
1942
+ @layer components.root {
1943
+ /* Base typography */
1944
+ :where(h1, .h1, h2, .h2, h3, .h3, h4, .h4, h5, .h5, h6, .h6) {
1945
+ color: var(--text-color-1);
1946
+ font-weight: 700;
1947
+ text-wrap: pretty;
1948
+ }
1949
+
1950
+ :where(h1, .h1) {
1951
+ font-size: var(--font-size-h1, var(--font-size-7));
1952
+ letter-spacing: -0.02em;
1953
+ line-height: 1.15;
1954
+ }
1955
+
1956
+ :where(h2, .h2) {
1957
+ font-size: var(--font-size-h2, var(--font-size-5, 2rem));
1958
+ letter-spacing: -0.02em;
1959
+ line-height: 1.2;
1960
+ }
1961
+
1962
+ :where(h3, .h3) {
1963
+ font-size: var(--font-size-h3, var(--font-size-4, 1.5rem));
1964
+ letter-spacing: -0.01em;
1965
+ line-height: 1.167;
1966
+ }
1967
+
1968
+ :where(h4, .h4) {
1969
+ font-size: var(--font-size-h4, var(--font-size-3, 1.25rem));
1970
+ letter-spacing: -0.01em;
1971
+ line-height: 1.235;
1972
+ }
1973
+
1974
+ :where(h5, .h5) {
1975
+ font-size: var(--font-size-h5, var(--font-size-2, 1.1rem));
1976
+ line-height: 1.334;
1977
+ }
1978
+
1979
+ :where(h6, .h6) {
1980
+ font-size: var(--font-size-h6, var(--font-size-1, 1rem));
1981
+ line-height: 1;
1982
+ }
1983
+
1984
+ :where(hgroup) {
1985
+ & > :where(p, .p) {
1986
+ margin: 0;
1987
+ }
1988
+
1989
+ & > :where(h1, .h1, h2, .h2, h3, .h3, h4, .h4, h5, .h5, h6, .h6) {
1990
+ margin-block-end: 0.4em;
1991
+ }
1992
+
1993
+ /* The second p element */
1994
+ & > :where(p, .p):last-of-type:last-child:not(:first-child) {
1995
+ color: oklch(from currentColor l c h / 75%);
1996
+ font-size: var(--font-size-lg);
1997
+ line-height: 1.6;
1998
+ }
1999
+ }
2000
+
2001
+ /** Overline */
2002
+ :where(.overline, hgroup > :where(p, .p):first-of-type:first-child) {
2003
+ color: light-dark(
2004
+ oklch(from var(--text-color-2) calc(l * 1.25) c h),
2005
+ oklch(from var(--text-color-2) calc(l * 0.75) c h)
2006
+ );
2007
+ font-size: var(--font-size-xs);
2008
+ font-weight: 500;
2009
+ letter-spacing: 0.06em;
2010
+ line-height: 2.5;
2011
+ text-transform: uppercase;
2012
+ }
2013
+
2014
+ :where(p, .p) {
2015
+ text-wrap: pretty;
2016
+
2017
+ &.small {
2018
+ font-size: var(--font-size-md);
2019
+ }
2020
+ &.large {
2021
+ font-size: var(--font-size-lg);
2022
+ }
2023
+ }
2024
+
2025
+ /* Inline text elements */
2026
+ :where(ins, u, abbr, dfn) {
2027
+ text-decoration: underline;
2028
+ text-underline-offset: 1px;
2029
+
2030
+ @supports (-moz-appearance: none) {
2031
+ text-underline-offset: 2px;
2032
+ }
2033
+ }
2034
+
2035
+ :where(abbr, dfn) {
2036
+ font-style: normal;
2037
+ text-decoration: var(--color-9) underline dotted;
2038
+
2039
+ &[title] {
2040
+ cursor: help;
2041
+ text-underline-offset: 1px;
2042
+ }
2043
+
2044
+ @supports (-moz-appearance: none) {
2045
+ text-underline-offset: 2px;
2046
+ }
2047
+ }
2048
+
2049
+ :where(sup) {
2050
+ font-size: 0.5em;
2051
+ }
2052
+
2053
+ :where(del, ins) {
2054
+ color: var(--color-9);
2055
+ }
2056
+
2057
+ :where(small) {
2058
+ font-size: max(0.5em, var(--font-size-0, 0.75rem));
2059
+ max-inline-size: var(--size-content-1);
2060
+ }
2061
+
2062
+ :where(cite) {
2063
+ font-style: italic;
2064
+ }
2065
+
2066
+ /* Blockquote */
2067
+ :where(blockquote) {
2068
+ border-inline-start-width: var(--border-size-3);
2069
+ display: grid;
2070
+ gap: var(--size-3);
2071
+ padding-block: var(--size-3);
2072
+ padding-inline: var(--size-4);
2073
+
2074
+ :first-child {
2075
+ margin-block-start: 0;
2076
+ }
2077
+
2078
+ :last-child {
2079
+ margin-block-end: 0;
2080
+ }
2081
+
2082
+ footer {
2083
+ color: var(--text-color-2);
2084
+ }
2085
+ }
2086
+
2087
+ /* Code */
2088
+ :where(pre) {
2089
+ border-radius: 0.375rem;
2090
+ direction: ltr;
2091
+ font-size: 0.875rem;
2092
+ line-height: 1.7142857;
2093
+ margin-block: 1.7142857em;
2094
+ max-inline-size: max-content;
2095
+ min-inline-size: 0;
2096
+ padding-block: 0.8571429em;
2097
+ padding-inline: 1.1428571em;
2098
+ white-space: pre;
2099
+ writing-mode: lr;
2100
+ }
2101
+
2102
+ :where(code, kbd, samp, pre) {
2103
+ font-family: var(--font-mono);
2104
+ }
2105
+
2106
+ :where(code) {
2107
+ background-color: oklch(00 0 0 /18%);
2108
+ border-radius: var(--border-size-3);
2109
+ font-size: 0.9em;
2110
+ padding: 0.2ex 0.5ex;
2111
+ }
2112
+
2113
+ :where(kbd, var) {
2114
+ background-color: var(--text-color-2);
2115
+ border-color: var(--text-color-2);
2116
+ border-radius: var(--border-radius, var(--radius-2));
2117
+ border-width: var(--border-size-1);
2118
+ color: var(--text-color-2-contrast);
2119
+ padding: calc(var(--size-1) / 2) var(--size-1);
2120
+ }
2121
+
2122
+ :where(:not(pre) code, kbd) {
2123
+ word-break: break-word;
2124
+ }
2125
+
2126
+ :where(:not(pre) code) {
2127
+ border-radius: var(--border-radius, var(--radius-2));
2128
+ padding: var(--size-1) var(--size-2);
2129
+ writing-mode: lr;
2130
+ }
2131
+
2132
+ :where(mark) {
2133
+ border-radius: var(--border-radius, 0);
2134
+ box-decoration-break: clone;
2135
+ padding: calc(var(--size-1) / 2) var(--size-1);
2136
+ vertical-align: baseline;
2137
+ }
2138
+
2139
+ /* Misc */
2140
+ :where(dt) {
2141
+ font-weight: 700;
2142
+ }
2143
+
2144
+ :where(figure) {
2145
+ & > :where(figcaption) {
2146
+ font-size: var(--font-size-1, 1rem);
2147
+ text-wrap: balance;
2148
+ }
2149
+ }
2150
+ }
2151
+
2152
+ /*** Extended components (has dependencies) */
2153
+
2154
+ @layer components.extended {
2155
+ :where([role="group"].button-group) {
2156
+ --_border-radius: var(--button-border-radius);
2157
+
2158
+ border-radius: var(--_border-radius);
2159
+ display: inline-flex;
2160
+ min-width: max-content;
2161
+
2162
+ button {
2163
+ border-radius: 0;
2164
+
2165
+ svg {
2166
+ max-inline-size: 0.7lh;
2167
+ }
2168
+
2169
+ &:focus-visible {
2170
+ outline-offset: -4px;
2171
+ }
2172
+
2173
+ & + & {
2174
+ border-inline-width: 1px;
2175
+ margin-inline-start: -1px;
2176
+ }
2177
+
2178
+ &:first-of-type {
2179
+ border-bottom-left-radius: var(--_border-radius);
2180
+ border-top-left-radius: var(--_border-radius);
2181
+ }
2182
+ &:last-of-type {
2183
+ border-bottom-right-radius: var(--_border-radius);
2184
+ border-top-right-radius: var(--_border-radius);
2185
+ }
2186
+
2187
+ /* Variants */
2188
+ &:where(.tonal, .filled) {
2189
+ & + button {
2190
+ border-inline-start-color: var(--color-7);
2191
+ }
2192
+
2193
+ & + &[disabled] {
2194
+ border-inline-start-color: color-mix(
2195
+ in oklch,
2196
+ var(--border-color) 90%,
2197
+ white
2198
+ );
2199
+ }
2200
+ }
2201
+ }
2202
+ }
2203
+ }
2204
+
2205
+ @layer components.extended {
2206
+ :where(details) {
2207
+ --_accordion-transition-time: 0.2s;
2208
+ --_bg-color: transparent;
2209
+ --_margin-inline: var(--size-1);
2210
+ --_shadow: none;
2211
+
2212
+ background-color: var(--_bg-color);
2213
+ box-shadow: var(--_shadow);
2214
+ border-radius: var(--border-radius, 4px);
2215
+ display: block;
2216
+ margin-inline: var(--_margin-inline);
2217
+ transition: all var(--_accordion-transition-time) ease-out;
2218
+
2219
+ /* Accordion animation */
2220
+ /* https://nerdy.dev/open-and-close-transitions-for-the-details-element */
2221
+ @media (prefers-reduced-motion: no-preference) {
2222
+ interpolate-size: allow-keywords;
2223
+ }
2224
+
2225
+ &::details-content {
2226
+ block-size: 0;
2227
+ opacity: 0;
2228
+ overflow-y: clip;
2229
+ transition: content-visibility var(--_accordion-transition-time)
2230
+ allow-discrete,
2231
+ opacity var(--_accordion-transition-time),
2232
+ block-size var(--_accordion-transition-time);
2233
+ }
2234
+
2235
+ &[open]::details-content {
2236
+ block-size: auto;
2237
+ opacity: 1;
2238
+ }
2239
+ /***/
2240
+
2241
+ & > summary {
2242
+ background-color: inherit;
2243
+ cursor: pointer;
2244
+ font-weight: 700;
2245
+ padding-block: var(--size-3);
2246
+ user-select: none;
2247
+ }
2248
+
2249
+ /* Custom arrow */
2250
+ /* summary {
2251
+ align-items: center;
2252
+ background-color: inherit;
2253
+ cursor: pointer;
2254
+ display: flex;
2255
+ justify-content: space-between;
2256
+ list-style: none;
2257
+ padding-block: var(--size-3);
2258
+ user-select: none;
2259
+
2260
+ &::marker,
2261
+ &::-webkit-details-marker {
2262
+ display: none;
2263
+ }
2264
+
2265
+ svg {
2266
+ transition: rotate 0.2s ease-out;
2267
+ }
2268
+ }
2269
+
2270
+ &[open] > summary svg {
2271
+ rotate: 180deg;
2272
+ } */
2273
+
2274
+ & > .content {
2275
+ margin-block-start: 0;
2276
+ padding-block: var(--size-2) var(--size-3);
2277
+ }
2278
+
2279
+ & > .actions {
2280
+ display: flex;
2281
+ gap: var(--size-1);
2282
+ justify-content: end;
2283
+ margin-block-start: var(--size-3);
2284
+ padding-block-end: var(--size-1);
2285
+ padding-inline: var(--size-3) var(--size-1);
2286
+ }
2287
+
2288
+ /* Variants */
2289
+ &.card,
2290
+ &.text {
2291
+ --_bg-color: transparent;
2292
+ --_margin-inline: var(--size-1);
2293
+ }
2294
+
2295
+ &.elevated {
2296
+ --_bg-color: var(--surface-elevated);
2297
+ --_margin-inline: 0;
2298
+ --_shadow: var(--shadow-2);
2299
+ }
2300
+
2301
+ &.outlined {
2302
+ --_bg-color: var(--surface-default);
2303
+ --_margin-inline: 0;
2304
+ border: 1px solid var(--border-color);
2305
+ }
2306
+
2307
+ &.tonal {
2308
+ --_bg-color: var(--surface-tonal);
2309
+ --_margin-inline: 0;
2310
+ }
2311
+
2312
+ &:where(.elevated, .outlined, .tonal) > * {
2313
+ padding-inline: var(--size-3);
2314
+ }
2315
+ }
2316
+
2317
+ /* Accordion group */
2318
+ :where(.card:has(details)) {
2319
+ --_gutter-color: var(--border-color);
2320
+
2321
+ display: block;
2322
+
2323
+ & > .content {
2324
+ margin-block: 0;
2325
+ padding: 0;
2326
+ }
2327
+
2328
+ &.card,
2329
+ &.text {
2330
+ &:not(.tonal, .outlined, .elevated) {
2331
+ summary {
2332
+ padding-inline: 0;
2333
+ }
2334
+ }
2335
+ }
2336
+
2337
+ details {
2338
+ --_margin-inline: 0;
2339
+
2340
+ border: 0;
2341
+ box-shadow: none;
2342
+
2343
+ & > * {
2344
+ padding-inline: var(--size-3);
2345
+ }
2346
+
2347
+ /* Border between accordion items */
2348
+ & + & {
2349
+ summary {
2350
+ border-radius: 0;
2351
+ border-block-start: 1px solid var(--_gutter-color);
2352
+ }
2353
+ }
2354
+
2355
+ /* First item */
2356
+ &:first-of-type {
2357
+ border-start-start-radius: var(--border-radius, 0.25rem);
2358
+ border-start-end-radius: var(--border-radius, 0.25rem);
2359
+ summary {
2360
+ border-start-start-radius: var(--border-radius, 0.25rem);
2361
+ border-start-end-radius: var(--border-radius, 0.25rem);
2362
+ }
2363
+ }
2364
+
2365
+ /* Last item */
2366
+ &:last-of-type {
2367
+ border-end-start-radius: var(--border-radius, 0.25rem);
2368
+ border-end-end-radius: var(--border-radius, 0.25rem);
2369
+ summary {
2370
+ border-end-start-radius: var(--border-radius, 0.25rem);
2371
+ border-end-end-radius: var(--border-radius, 0.25rem);
2372
+ }
2373
+ }
2374
+ }
2375
+ }
2376
+ }
2377
+
2378
+ @layer components.extended {
2379
+ /*
2380
+ Lists meant to be used stand-alone or as part of Select elements
2381
+
2382
+ Intended use-case:
2383
+ - ul.list > li
2384
+ - .select > .list > option
2385
+ */
2386
+ :where(.list) {
2387
+ --_bg-color: light-dark(var(--gray-1), var(--gray-15));
2388
+
2389
+ background-color: var(--_bg-color);
2390
+ list-style: none;
2391
+ padding: var(--size-2) 0;
2392
+
2393
+ @media (pointer: coarse) {
2394
+ &,
2395
+ * {
2396
+ user-select: none;
2397
+ }
2398
+ }
2399
+
2400
+ /* Borders on all list items */
2401
+ &.bordered {
2402
+ :where(li + li, option + option) {
2403
+ margin-block-start: var(--size-3);
2404
+ &::before {
2405
+ block-size: 1px;
2406
+ border-block-start: 1px solid var(--border-color);
2407
+ content: "";
2408
+ display: block;
2409
+ inline-size: 100%;
2410
+ inset: calc(-1 * var(--size-2)) 0 auto 0;
2411
+ position: absolute;
2412
+ visibility: visible; /* override select > option:before style */
2413
+ }
2414
+ }
2415
+ }
2416
+
2417
+ /* Dense - less gaps and spacing */
2418
+ &.dense {
2419
+ :where(li, option) {
2420
+ gap: var(--size-2);
2421
+ min-block-size: var(--size-7);
2422
+ padding: var(--size-1) var(--size-2);
2423
+
2424
+ &.border-top {
2425
+ margin-block-start: var(--size-2);
2426
+ &::before {
2427
+ inset: calc(-1 * var(--size-1)) 0 auto 0;
2428
+ }
2429
+ }
2430
+
2431
+ /* Clickable list item */
2432
+ &:has(> a, > button, > label) {
2433
+ min-block-size: auto;
2434
+ padding: 0;
2435
+ }
2436
+
2437
+ & > :where(a, button, label) {
2438
+ gap: var(--size-2);
2439
+ min-block-size: var(--size-7);
2440
+ padding: var(--size-1) var(--size-2);
2441
+ }
2442
+
2443
+ /* Checkbox / Radio */
2444
+ & > label {
2445
+ .end {
2446
+ padding-inline-end: 0.125rem;
2447
+ }
2448
+ }
2449
+
2450
+ /* Leading and trailing content */
2451
+ .start,
2452
+ .end {
2453
+ .avatar {
2454
+ max-inline-size: var(--size-6);
2455
+ }
2456
+
2457
+ .icon-button,
2458
+ svg {
2459
+ max-inline-size: var(--size-4);
2460
+ }
2461
+
2462
+ .checkbox,
2463
+ .radio {
2464
+ max-inline-size: var(--size-3);
2465
+ }
2466
+ }
2467
+ }
2468
+ }
2469
+
2470
+ /* Gutterless */
2471
+ &.gutterless {
2472
+ :where(li, option) {
2473
+ padding-inline: 0;
2474
+
2475
+ & > :where(a, button, label) {
2476
+ padding-inline: 0;
2477
+ }
2478
+ }
2479
+ }
2480
+
2481
+ /* List item */
2482
+ :where(li, option, [role="group"] > label) {
2483
+ align-items: center;
2484
+ background: var(--_bg-color) var(--ripple, none);
2485
+ display: flex;
2486
+ font-size: var(--font-size-sm);
2487
+ gap: var(--size-3);
2488
+ isolation: isolate;
2489
+ min-block-size: 40px;
2490
+ padding: var(--size-2) var(--size-3);
2491
+ position: relative;
2492
+
2493
+ &::before {
2494
+ display: none; /* removing checkmark from option */
2495
+ }
2496
+
2497
+ * {
2498
+ font-size: inherit;
2499
+ }
2500
+
2501
+ /* Clickable list item */
2502
+ &:has(> a, > button, > label) {
2503
+ background: transparent;
2504
+ display: block;
2505
+ min-block-size: auto;
2506
+ padding: 0;
2507
+ }
2508
+
2509
+ /* Select option */
2510
+ &:where(option) {
2511
+ align-items: center;
2512
+ background-color: var(--_bg-color);
2513
+ color: inherit;
2514
+ cursor: pointer;
2515
+ display: flex;
2516
+ gap: var(--size-3);
2517
+ inline-size: 100%;
2518
+ margin: 0;
2519
+ min-block-size: 40px;
2520
+ padding: var(--size-2) var(--size-3);
2521
+ text-align: start;
2522
+ text-decoration: none;
2523
+ z-index: 0;
2524
+
2525
+ &:hover {
2526
+ background-color: light-dark(var(--gray-2), var(--gray-14));
2527
+ }
2528
+
2529
+ &:checked {
2530
+ background-color: oklch(from var(--primary) l c h / 30%);
2531
+ }
2532
+ }
2533
+
2534
+ & > a,
2535
+ & > button,
2536
+ & > label {
2537
+ align-items: center;
2538
+ background: var(--_bg-color) var(--ripple, none);
2539
+ color: inherit;
2540
+ cursor: pointer;
2541
+ display: flex;
2542
+ gap: var(--size-3);
2543
+ inline-size: 100%;
2544
+ margin: 0;
2545
+ min-block-size: 40px;
2546
+ outline-offset: -3px;
2547
+ padding: var(--size-2) var(--size-3);
2548
+ text-align: start;
2549
+ text-decoration: none;
2550
+ z-index: 0;
2551
+
2552
+ /*** Ripple effect */
2553
+ background-position: center;
2554
+ transition: background var(--button-ripple-duration);
2555
+ &:where(:not(:active):hover) {
2556
+ --ripple: radial-gradient(circle, transparent 1%, var(--_bg-color) 1%)
2557
+ center/15000%;
2558
+ }
2559
+
2560
+ &:where(:hover:active) {
2561
+ background-size: var(--button-ripple-size);
2562
+ transition: background 0s;
2563
+ }
2564
+
2565
+ &:hover {
2566
+ background-color: light-dark(var(--gray-2), var(--gray-14));
2567
+ }
2568
+
2569
+ /*** Remove ripple effect when trailing button is clicked */
2570
+ &:has(.end:hover) {
2571
+ &:where(:not(:active):hover) {
2572
+ --ripple: none;
2573
+ }
2574
+ }
2575
+ }
2576
+
2577
+ /* Checkbox / Radio / Switch */
2578
+ & > label {
2579
+ .end {
2580
+ padding-inline-end: var(--size-1);
2581
+ }
2582
+
2583
+ &:where(.checkbox, .radio) {
2584
+ inline-size: 100%;
2585
+ }
2586
+
2587
+ &.switch {
2588
+ --_dot-size: 0.75rem;
2589
+ --_track-height: var(--size-4);
2590
+ --_track-width: 2.5rem;
2591
+ }
2592
+ }
2593
+
2594
+ /* Video */
2595
+ &:has(video) {
2596
+ padding: 0.75rem var(--size-3) 0.75rem 0;
2597
+ }
2598
+
2599
+ /* Border between list items */
2600
+ &.border-top {
2601
+ margin-block-start: var(--size-3);
2602
+ &::before {
2603
+ block-size: 1px;
2604
+ border-block-start: 1px solid var(--border-color);
2605
+ content: "";
2606
+ display: block;
2607
+ inline-size: 100%;
2608
+ inset: calc(-1 * var(--size-2)) 0 auto 0;
2609
+ position: absolute;
2610
+ }
2611
+ }
2612
+
2613
+ /* Text */
2614
+ .text {
2615
+ flex: 1;
2616
+ line-height: 1.6;
2617
+
2618
+ :where(h1, h2, h3, h4, h5, h6, p, span) {
2619
+ color: inherit;
2620
+ font-weight: 400;
2621
+ }
2622
+
2623
+ p + p {
2624
+ font-size: var(--font-size-xs);
2625
+ }
2626
+ }
2627
+
2628
+ /* Leading content */
2629
+ .start {
2630
+ align-self: center;
2631
+ align-items: center;
2632
+ display: grid;
2633
+ z-index: 1;
2634
+
2635
+ &:has(svg) {
2636
+ max-inline-size: var(--size-5);
2637
+ }
2638
+
2639
+ svg {
2640
+ padding-block-start: 0.125rem;
2641
+ }
2642
+
2643
+ img {
2644
+ aspect-ratio: 1;
2645
+ inline-size: 56px;
2646
+ object-fit: cover;
2647
+ }
2648
+
2649
+ video {
2650
+ aspect-ratio: 16/9;
2651
+ block-size: 64px;
2652
+ object-fit: cover;
2653
+ }
2654
+ }
2655
+
2656
+ /* Trailing content */
2657
+ .end {
2658
+ align-items: center;
2659
+ display: flex;
2660
+ font-size: var(--font-size-xs);
2661
+ text-align: end;
2662
+ z-index: 1;
2663
+
2664
+ &:not(:has(a, button, input)) {
2665
+ pointer-events: none;
2666
+ }
2667
+
2668
+ kbd {
2669
+ background-color: transparent;
2670
+ border: 0;
2671
+ color: inherit;
2672
+ opacity: 0.6;
2673
+ }
2674
+
2675
+ svg {
2676
+ max-inline-size: var(--size-5);
2677
+ inline-size: 100%;
2678
+ }
2679
+ }
2680
+
2681
+ /* Inset */
2682
+ &.inset {
2683
+ .text {
2684
+ padding-inline-start: calc(var(--size-5) + var(--size-3));
2685
+ }
2686
+
2687
+ /* Safety measure so it won't look bad if there for some reason should exist a leading element inside. */
2688
+ .start {
2689
+ display: none;
2690
+ }
2691
+ }
2692
+ }
2693
+ }
2694
+ }
2695
+
2696
+ @layer components.extended {
2697
+ :where(.alert) {
2698
+ --_bg-color: var(--surface-tonal);
2699
+ --_border-color: var(--surface-tonal);
2700
+ --_color: var(--text-color-1);
2701
+
2702
+ &.outlined {
2703
+ --_bg-color: var(--surface-default);
2704
+ --_border-color: var(--border-color);
2705
+ --_color: var(--text-color-1);
2706
+ }
2707
+
2708
+ background-color: var(--_bg-color);
2709
+ border: 1px solid var(--_border-color);
2710
+ border-radius: var(--border-radius);
2711
+ color: var(--_color);
2712
+ padding: var(--size-3);
2713
+
2714
+ & > .content {
2715
+ display: grid;
2716
+ gap: var(--size-2);
2717
+ font-size: var(--font-size-sm);
2718
+
2719
+ h1,
2720
+ h2,
2721
+ h3,
2722
+ h4,
2723
+ h5,
2724
+ h6 {
2725
+ color: inherit;
2726
+ font-size: var(--font-size-md);
2727
+ font-weight: 600;
2728
+
2729
+ * {
2730
+ font-size: inherit;
2731
+ }
2732
+ }
2733
+ }
2734
+
2735
+ /* Colors */
2736
+ &.error,
2737
+ &.ok,
2738
+ &.warning {
2739
+ --_bg-color: var(--color-4);
2740
+ --_border-color: var(--color-9);
2741
+ --_color: var(--color-15);
2742
+
2743
+ &.outlined {
2744
+ --_bg-color: var(--surface-default);
2745
+ --_border-color: var(--color-9);
2746
+ --_color: light-dark(var(--color-15), var(--color-1));
2747
+ }
2748
+
2749
+ svg {
2750
+ margin-block-start: 0.15rem;
2751
+ stroke: var(--color-9);
2752
+ }
2753
+ }
2754
+
2755
+ /* Links
2756
+ * Can't make sure contrast will be acceptable (yet) so we use the current text color instead.
2757
+ */
2758
+ &:not(.outlined) {
2759
+ a[href] {
2760
+ color: inherit;
2761
+
2762
+ &:hover {
2763
+ color: var(--primary);
2764
+ }
2765
+ }
2766
+ }
2767
+
2768
+ /* Icon */
2769
+ &:has(svg) {
2770
+ display: grid;
2771
+ gap: var(--size-3);
2772
+ grid-template-columns: var(--size-4) 1fr;
2773
+
2774
+ svg {
2775
+ margin-block-start: 0.15rem;
2776
+ stroke: currentColor;
2777
+ }
2778
+ }
2779
+ }
2780
+ }
2781
+
2782
+ @layer components.extended {
2783
+ :where(dialog) {
2784
+ margin-block-start: 15%; /* vertical alignment */
2785
+ padding-block: 0;
2786
+ pointer-events: none;
2787
+
2788
+ &::backdrop {
2789
+ background-color: rgba(0, 0, 0, 0.5);
2790
+ backdrop-filter: blur(5px);
2791
+
2792
+ @media (prefers-reduced-motion: reduce) {
2793
+ backdrop-filter: none;
2794
+ }
2795
+ }
2796
+
2797
+ &:not([open]) {
2798
+ display: none;
2799
+ }
2800
+
2801
+ &[open] {
2802
+ pointer-events: all;
2803
+ }
2804
+
2805
+ .actions {
2806
+ justify-content: end;
2807
+ padding-inline: var(--size-3) var(--size-1);
2808
+ }
2809
+
2810
+ /* Animation */
2811
+ /* There's no close animation, intentionally */
2812
+ opacity: 0;
2813
+
2814
+ &[open] {
2815
+ opacity: 1;
2816
+ transition: display 0.2s allow-discrete,
2817
+ margin-block-start 0.3s var(--ease-1), overlay 0.2s allow-discrete,
2818
+ opacity 0.2s var(--ease-out-1);
2819
+
2820
+ @starting-style {
2821
+ opacity: 0;
2822
+ }
2823
+ }
2824
+
2825
+ @media (prefers-reduced-motion: no-preference) {
2826
+ margin-block-start: 17%;
2827
+ &[open] {
2828
+ margin-block-start: 15%;
2829
+
2830
+ @starting-style {
2831
+ margin-block-start: 17%;
2832
+ }
2833
+ }
2834
+ }
2835
+ }
2836
+
2837
+ :where(html:has(dialog[open])) {
2838
+ overflow: hidden;
2839
+ }
2840
+ }
2841
+
2842
+ @layer components.extended {
2843
+ :where(.snackbar) {
2844
+ align-items: center;
2845
+ /* Inverse surface-filled */
2846
+ background-color: light-dark(var(--gray-15), var(--gray-2));
2847
+ border-radius: var(--border-radius);
2848
+ box-shadow: var(--shadow-2);
2849
+ color: var(--text-color-1-contrast);
2850
+ display: flex;
2851
+ font-size: var(--font-size-sm);
2852
+ gap: var(--size-3);
2853
+ inset-block: auto var(--size-3);
2854
+ inset-inline: var(--size-3) auto;
2855
+ justify-content: space-between;
2856
+ min-inline-size: min(100%, 37ch);
2857
+ padding: var(--size-2) var(--size-3);
2858
+ position: fixed;
2859
+ inline-size: calc(100% - var(--size-6, 1.75rem));
2860
+ z-index: 100;
2861
+
2862
+ &::backdrop {
2863
+ display: none;
2864
+ }
2865
+
2866
+ * {
2867
+ word-break: break-word;
2868
+ }
2869
+
2870
+ /* Global positioning (in relation to the window) */
2871
+ /*** Default (end-start) */
2872
+ inset-block: auto var(--size-3);
2873
+ inset-inline: 50% 0;
2874
+ translate: -50% 0;
2875
+
2876
+ &.start-start,
2877
+ &.start-center,
2878
+ &.start-end {
2879
+ inset-block: var(--size-3) auto;
2880
+ }
2881
+
2882
+ /* TODO use @custom-media instead? */
2883
+ @container (width > 480px) {
2884
+ /* Default (end-start) */
2885
+ inset-block: auto var(--size-7, 2rem);
2886
+ inset-inline: var(--size-7, 2rem) auto;
2887
+ translate: revert;
2888
+ inline-size: fit-content;
2889
+
2890
+ &.end-start,
2891
+ &.end-end,
2892
+ &.start-start,
2893
+ &.start-end {
2894
+ translate: revert;
2895
+ }
2896
+
2897
+ &.start-start {
2898
+ inset-block: var(--size-7, 2rem) auto;
2899
+ inset-inline: var(--size-7, 2rem) auto;
2900
+ }
2901
+ &.start-center {
2902
+ inset-block: var(--size-7, 2rem) auto;
2903
+ inset-inline: 50% 0;
2904
+ translate: -50% 0;
2905
+ }
2906
+ &.start-end {
2907
+ inset-block: var(--size-7, 2rem) auto;
2908
+ inset-inline: auto var(--size-7, 2rem);
2909
+ }
2910
+ &.end-start {
2911
+ inset-block-end: var(--size-7, 2rem);
2912
+ inset-inline: var(--size-7, 2rem) auto;
2913
+ }
2914
+ &.end-center {
2915
+ inset-block: auto var(--size-7, 2rem);
2916
+ inset-inline: 50% 0;
2917
+ translate: -50% 0;
2918
+ }
2919
+ &.end-end {
2920
+ inset-block: auto var(--size-7, 2rem);
2921
+ inset-inline: auto var(--size-7, 2rem);
2922
+ }
2923
+ }
2924
+
2925
+ /* Absolute positioning */
2926
+ &.absolute {
2927
+ position: absolute;
2928
+ }
2929
+
2930
+ /* Actions */
2931
+ .actions {
2932
+ align-items: center;
2933
+ display: flex;
2934
+ flex-shrink: 0;
2935
+ gap: var(--size-3);
2936
+ padding-inline: 0;
2937
+
2938
+ button {
2939
+ /* Inverse hover and active backgrounds */
2940
+ &:where(:not([disabled])) {
2941
+ &:where(:not(:active):hover) {
2942
+ --_bg-color: light-dark(
2943
+ color-mix(in oklch, white 40%, black),
2944
+ color-mix(in oklch, white 85%, black)
2945
+ );
2946
+ }
2947
+
2948
+ &:where(:hover:active) {
2949
+ --_bg-color: light-dark(
2950
+ color-mix(in oklch, white 45%, black),
2951
+ color-mix(in oklch, white 80%, black)
2952
+ );
2953
+ }
2954
+ }
2955
+ }
2956
+
2957
+ button:not(:has(svg)) {
2958
+ border-radius: var(--border-radius);
2959
+ font-size: inherit;
2960
+ max-block-size: var(--size-6, 1.5rem);
2961
+ padding: 1ex;
2962
+ }
2963
+
2964
+ button:has(svg) {
2965
+ color: inherit;
2966
+ max-inline-size: var(--size-6, 1.75rem);
2967
+ margin: var(--size-00);
2968
+ padding: var(--size-1);
2969
+ }
2970
+ }
2971
+
2972
+ /* Animations */
2973
+ opacity: 0;
2974
+ transition: display 0.075s allow-discrete, overlay 0.075s allow-discrete,
2975
+ opacity 0.075s var(--ease-out-1);
2976
+
2977
+ &:popover-open,
2978
+ &:popover-open::backdrop,
2979
+ &.visible {
2980
+ opacity: 1;
2981
+ transition: display 0.25s allow-discrete, overlay 0.25s allow-discrete,
2982
+ opacity 0.25s var(--ease-out-1);
2983
+
2984
+ @starting-style {
2985
+ opacity: 0;
2986
+ }
2987
+ }
2988
+ }
2989
+ }
2990
+
2991
+ @layer components.extended {
2992
+ /* Common styling for checkbox, radio and switch groups */
2993
+ :where(fieldset.field-group) {
2994
+ border: 0;
2995
+ border-radius: 0;
2996
+ gap: 0;
2997
+ padding: 0;
2998
+ z-index: 1;
2999
+
3000
+ legend {
3001
+ color: var(--text-color-2);
3002
+ padding: 0 1ex 0 0;
3003
+ }
3004
+
3005
+ /* Disabled */
3006
+ &[disabled] {
3007
+ cursor: not-allowed;
3008
+ opacity: 0.64;
3009
+ user-select: none;
3010
+
3011
+ input {
3012
+ cursor: not-allowed;
3013
+ }
3014
+ }
3015
+
3016
+ /* Validation */
3017
+ &.error {
3018
+ legend,
3019
+ .supporting-text {
3020
+ color: var(--color-9);
3021
+ }
3022
+ }
3023
+
3024
+ /* Required */
3025
+ &:has([required]) {
3026
+ &:not(:has(input:where([type="radio"], [type="checkbox"]):checked)) {
3027
+ legend {
3028
+ position: relative;
3029
+
3030
+ &::after {
3031
+ color: var(--red);
3032
+ content: "*";
3033
+ inset: 0 -0.25ex auto auto;
3034
+ position: absolute;
3035
+ }
3036
+ }
3037
+ }
3038
+ }
3039
+ :where(.radio, .checkbox, .switch) .label:after {
3040
+ display: none;
3041
+ }
3042
+
3043
+ /* Supporting text */
3044
+ .supporting-text {
3045
+ color: var(--text-color-2);
3046
+ font-size: var(--font-size-xs);
3047
+ line-height: 1.5;
3048
+ z-index: 1;
3049
+ }
3050
+
3051
+ /* Fields */
3052
+ .fields {
3053
+ display: flex;
3054
+ flex-direction: column;
3055
+ gap: var(--size-2);
3056
+
3057
+ * ~ & {
3058
+ padding: var(--size-2) 0;
3059
+ }
3060
+ }
3061
+
3062
+ :last-child {
3063
+ padding-block-end: 0;
3064
+ }
3065
+
3066
+ /* Directions */
3067
+ &.row {
3068
+ .fields {
3069
+ flex-direction: row;
3070
+ }
3071
+ }
3072
+ }
3073
+ }
3074
+
3075
+ @layer components.extended {
3076
+ /*
3077
+ - Common styling for input, textarea and select
3078
+ - Form related styles such as: label, supporting text, error handling
3079
+ */
3080
+ :where(.field) {
3081
+ --_accent-color: var(--primary);
3082
+ --_bg-color: var(--surface-default);
3083
+ --_border-color: var(--field-border-color);
3084
+ --_field-padding-block: 0.75rem;
3085
+ --_field-padding-inline: var(--size-2);
3086
+ --_filled-border-color: var(--text-color-1);
3087
+ --_height: var(--field-size);
3088
+ --_label-color: var(--text-color-2);
3089
+ --_supporting-text-color: var(--text-color-2);
3090
+
3091
+ display: grid;
3092
+ position: relative;
3093
+
3094
+ /* Input/Select base */
3095
+ :where(& input, & textarea, & select) {
3096
+ background-color: var(--_bg-color);
3097
+ block-size: var(--_height);
3098
+ border-radius: var(--field-border-radius);
3099
+ border: var(--field-border-width) solid var(--_border-color);
3100
+ color: var(--text-color-1);
3101
+ font-family: var(--font-sans);
3102
+ font-size: var(--font-size-1);
3103
+ grid-column: 1/-1;
3104
+ grid-row: 2;
3105
+ inline-size: 100%;
3106
+ line-height: var(--font-lineheight-1);
3107
+ min-inline-size: 0;
3108
+ padding: var(--_field-padding-block) var(--_field-padding-inline);
3109
+
3110
+ @media (prefers-reduced-motion: no-preference) {
3111
+ transition: border-color 0.2s cubic-bezier(0.4, 0, 0.2, 1),
3112
+ padding-block 0.2s var(--ease-3);
3113
+ }
3114
+ }
3115
+
3116
+ /* Required/Invalid */
3117
+ &:has(
3118
+ :not(:placeholder-shown):invalid,
3119
+ :where(
3120
+ :placeholder-shown,
3121
+ option[value=""]:not(:checked),
3122
+ option:checked:not([value=""])
3123
+ ):required
3124
+ ) {
3125
+ .label:after {
3126
+ color: var(--red);
3127
+ content: "*";
3128
+ margin: -0.25em auto auto 0.25em;
3129
+ }
3130
+ }
3131
+
3132
+ /* File */
3133
+ &:has(input[type="file"]) {
3134
+ cursor: pointer;
3135
+
3136
+ input {
3137
+ align-self: flex-start;
3138
+ block-size: var(--_height);
3139
+ box-shadow: none;
3140
+ color: var(--text-color-1);
3141
+ cursor: inherit;
3142
+ max-inline-size: 100%;
3143
+ padding: 0;
3144
+ transition: font-size 0.2s var(--ease-3);
3145
+
3146
+ &::-webkit-file-upload-button,
3147
+ &::file-selector-button {
3148
+ background-color: var(--surface-tonal);
3149
+ border: none;
3150
+ block-size: calc(100% - var(--size-2) * 2);
3151
+ border-radius: var(--field-border-radius);
3152
+ cursor: pointer;
3153
+ margin-inline-end: 1ex;
3154
+ margin-block-start: var(--size-2);
3155
+ margin-inline-start: var(--size-2);
3156
+ }
3157
+ }
3158
+
3159
+ /* Variants */
3160
+ &.filled {
3161
+ input {
3162
+ &::-webkit-file-upload-button,
3163
+ &::file-selector-button {
3164
+ background-color: var(--surface-default);
3165
+ block-size: calc(100% - var(--size-2) * 2);
3166
+ border-radius: var(--field-border-radius);
3167
+ cursor: pointer;
3168
+ margin-block-start: var(--size-2);
3169
+ }
3170
+ }
3171
+ }
3172
+
3173
+ /* Sizes */
3174
+ &.small {
3175
+ input {
3176
+ font-size: var(--font-size-sm);
3177
+ &::-webkit-file-upload-button,
3178
+ &::file-selector-button {
3179
+ block-size: calc(100% - var(--size-2));
3180
+ margin-block-start: var(--size-1);
3181
+ }
3182
+ }
3183
+ }
3184
+ }
3185
+
3186
+ /* Autosuggest */
3187
+ &:has(input[list]) {
3188
+ .label {
3189
+ /* Make sure chevron is visible */
3190
+ inline-size: calc(100% - var(--size-6));
3191
+ }
3192
+ }
3193
+
3194
+ /* Select */
3195
+ &:has(select) {
3196
+ .label {
3197
+ /* Make sure chevron is visible */
3198
+ inline-size: calc(100% - var(--size-6));
3199
+ }
3200
+ }
3201
+
3202
+ /* Experimental Select */
3203
+ &:has(select button) {
3204
+ select {
3205
+ padding: 0;
3206
+
3207
+ button {
3208
+ outline: 0;
3209
+ padding: var(--_field-padding-block) var(--size-8)
3210
+ var(--_field-padding-block) var(--_field-padding-inline);
3211
+ }
3212
+ }
3213
+ }
3214
+
3215
+ /* Non-experimental Select */
3216
+ &:has(select):not(:has(button)) {
3217
+ select {
3218
+ padding: var(--_field-padding-block) var(--size-8)
3219
+ var(--_field-padding-block) var(--_field-padding-inline);
3220
+ }
3221
+ }
3222
+
3223
+ /* Input - color */
3224
+ &:has(input[type="color"]) {
3225
+ input {
3226
+ appearance: none;
3227
+ background: none;
3228
+ block-size: var(--_height);
3229
+ inline-size: var(--_height);
3230
+ overflow: hidden;
3231
+ padding: 0;
3232
+
3233
+ &::-webkit-color-swatch {
3234
+ border: none;
3235
+ }
3236
+
3237
+ &::-webkit-color-swatch-wrapper {
3238
+ padding: 0;
3239
+ }
3240
+ }
3241
+ }
3242
+
3243
+ /* Element states */
3244
+ &:hover {
3245
+ &:not(.error) {
3246
+ :where(input, textarea, select) {
3247
+ --_border-color: var(--text-color-1);
3248
+ }
3249
+ }
3250
+ }
3251
+
3252
+ &:focus-within {
3253
+ & input,
3254
+ & textarea,
3255
+ & select {
3256
+ border-color: var(--_accent-color);
3257
+ outline-offset: -2px;
3258
+ outline: 2px solid var(--_accent-color);
3259
+ }
3260
+ }
3261
+
3262
+ /* Label */
3263
+ .label {
3264
+ font-size: var(--font-size-sm);
3265
+ grid-column: 1/-1;
3266
+ grid-row: 1;
3267
+ }
3268
+
3269
+ /* Supporting text */
3270
+ .supporting-text {
3271
+ color: var(--_supporting-text-color);
3272
+ font-size: var(--font-size-xs);
3273
+ grid-column: 1/-1;
3274
+ grid-row: 3;
3275
+ line-height: 1.5;
3276
+ }
3277
+
3278
+ /* Auto-fit */
3279
+ &.auto-fit {
3280
+ inline-size: auto;
3281
+
3282
+ :where(& input, & textarea) {
3283
+ field-sizing: content;
3284
+ inline-size: auto;
3285
+ }
3286
+ }
3287
+
3288
+ /* Validation */
3289
+ &.error {
3290
+ --_accent-color: var(--color-9);
3291
+ --_border-color: var(--color-9);
3292
+ --_filled-border-color: var(--color-9);
3293
+ --_label-color: var(--color-9);
3294
+ --_supporting-text-color: var(--color-9);
3295
+ }
3296
+
3297
+ /*
3298
+ * Variant: Filled
3299
+ */
3300
+ &.filled {
3301
+ --_bg-color: var(--surface-tonal);
3302
+
3303
+ &:not(:has([disabled], :has(input[type="color"]))) {
3304
+ /* Hover */
3305
+ &:hover {
3306
+ --_bg-color: light-dark(
3307
+ oklch(from var(--surface-tonal) calc(l * 0.93) c h),
3308
+ oklch(from var(--surface-tonal) calc(l * 1.1) c h)
3309
+ );
3310
+ }
3311
+ }
3312
+ }
3313
+
3314
+ /* Disabled */
3315
+ &:where(:has([disabled])) {
3316
+ &::before {
3317
+ display: none;
3318
+ }
3319
+ :where(input, textarea, select) {
3320
+ cursor: not-allowed;
3321
+ opacity: 0.7;
3322
+
3323
+ * {
3324
+ pointer-events: none;
3325
+ }
3326
+ }
3327
+ }
3328
+
3329
+ /* Read-only */
3330
+ &:where(:has([readonly])) {
3331
+ &::before {
3332
+ display: none;
3333
+ }
3334
+ :where(input, textarea, select) {
3335
+ cursor: not-allowed;
3336
+
3337
+ * {
3338
+ pointer-events: none;
3339
+ }
3340
+ }
3341
+ }
3342
+
3343
+ /* Sizes */
3344
+ &.small {
3345
+ --_field-padding-block: var(--size-2);
3346
+ --_height: var(--field-size-small);
3347
+
3348
+ &:has(input[type="color"]) {
3349
+ .label {
3350
+ line-height: 1.5;
3351
+ }
3352
+ }
3353
+ }
3354
+ }
3355
+ }
3356
+
3357
+ @layer components.extended {
3358
+ :where(.field > select) {
3359
+ position: relative;
3360
+
3361
+ /* Default arrow */
3362
+ &::picker-icon {
3363
+ block-size: 0;
3364
+ border-block-start: 5px solid;
3365
+ border-inline: 5px solid transparent;
3366
+ color: currentColor;
3367
+ content: "";
3368
+ inline-size: 0;
3369
+ inset: 50% var(--size-3) auto auto;
3370
+ pointer-events: none;
3371
+ position: absolute;
3372
+ translate: 0 -50%;
3373
+ }
3374
+
3375
+ &:open {
3376
+ &::picker-icon {
3377
+ rotate: 180deg;
3378
+ }
3379
+ }
3380
+
3381
+ /* Select popover */
3382
+ &::picker(select) {
3383
+ /* Animation on-stage styles */
3384
+ border: 0;
3385
+ box-shadow: var(--shadow-2);
3386
+ opacity: 1;
3387
+ padding: 0;
3388
+ scale: 1;
3389
+
3390
+ /* Animation starting styles */
3391
+ @starting-style {
3392
+ opacity: 0;
3393
+ transform: scale(0.9);
3394
+ }
3395
+
3396
+ @media (prefers-reduced-motion: no-preference) {
3397
+ transition: display 0.2s allow-discrete, opacity 0.2s var(--ease-3),
3398
+ overlay 0.2s allow-discrete, scale 0.2s var(--ease-3);
3399
+ }
3400
+ }
3401
+
3402
+ /* Animation off-stage styles */
3403
+ &:not(:open)::picker(select) {
3404
+ opacity: 0;
3405
+ scale: 0.9;
3406
+ }
3407
+
3408
+ button {
3409
+ background-color: transparent;
3410
+ display: flex;
3411
+ inline-size: 100%;
3412
+ margin: 0;
3413
+ position: relative;
3414
+
3415
+ selectedcontent {
3416
+ overflow: hidden;
3417
+ text-overflow: ellipsis;
3418
+ white-space: nowrap;
3419
+ }
3420
+ }
3421
+
3422
+ .list {
3423
+ /* Groups */
3424
+ [role="group"] {
3425
+ label {
3426
+ background-color: light-dark(var(--gray-3), var(--gray-13));
3427
+ color: light-dark(
3428
+ oklch(from var(--text-color-1) calc(l * 0.75) c h),
3429
+ oklch(from var(--text-color-1) calc(l * 1.25) c h)
3430
+ );
3431
+ font-weight: 500;
3432
+ overflow: hidden;
3433
+ padding-inline: var(--size-2);
3434
+ text-overflow: ellipsis;
3435
+ white-space: nowrap;
3436
+ }
3437
+
3438
+ &:not(:first-child),
3439
+ option:first-of-type {
3440
+ margin-block-start: var(--size-2);
3441
+ }
3442
+
3443
+ option:last-of-type,
3444
+ &:last-child {
3445
+ option:last-of-type {
3446
+ margin-block-end: 0;
3447
+ }
3448
+ }
3449
+ }
3450
+
3451
+ /* Option */
3452
+ option {
3453
+ /* Checkmark */
3454
+ /* TODO - checkmark should be the final version of the checkmark API. Follow the development of this and remove redundant psuedo stuff. */
3455
+ &::check {
3456
+ display: none;
3457
+ }
3458
+ &::checkmark {
3459
+ display: none;
3460
+ }
3461
+ &::before {
3462
+ display: none;
3463
+ }
3464
+
3465
+ &:focus-visible {
3466
+ outline-offset: -1px;
3467
+ }
3468
+ }
3469
+ }
3470
+ }
3471
+
3472
+ :where(.field:has(> select)) {
3473
+ /* Size */
3474
+ &.small {
3475
+ button {
3476
+ padding-inline: var(--size-2) var(--size-7);
3477
+
3478
+ &::after {
3479
+ inset-inline-end: var(--size-2);
3480
+ }
3481
+ }
3482
+ }
3483
+
3484
+ /*
3485
+ * Non-experimental Select
3486
+ *
3487
+ * Hack to get the arrow working. Pseudo elements aren't allowed on the `<select>` element, so need to add it on the `.field` class instead. Noting this down if an `:after` element would be needed on a `.field`.
3488
+ */
3489
+ &:not(:has(button)) {
3490
+ select {
3491
+ appearance: none;
3492
+ }
3493
+
3494
+ /* Arrow */
3495
+ &::after {
3496
+ align-self: center;
3497
+ block-size: 0;
3498
+ border-block-start: 5px solid;
3499
+ border-inline: 5px solid transparent;
3500
+ content: "";
3501
+ display: inline-block;
3502
+ flex-shrink: 0;
3503
+ grid-column: 1/-1;
3504
+ grid-row: 2;
3505
+ inline-size: 0;
3506
+ inset-inline-end: var(--size-3);
3507
+ justify-self: end;
3508
+ pointer-events: none;
3509
+ position: relative;
3510
+ }
3511
+ }
3512
+ }
3513
+
3514
+ select:has(button),
3515
+ ::picker(select) {
3516
+ appearance: base-select;
3517
+ }
3518
+ }
3519
+
3520
+ @layer components.extended {
3521
+ :where(
3522
+ .field:has(
3523
+ :where(
3524
+ input[type="date"],
3525
+ input[type="datetime-local"],
3526
+ input[type="email"],
3527
+ input[type="month"],
3528
+ input[type="number"],
3529
+ input[type="password"],
3530
+ input[type="search"],
3531
+ input[type="tel"],
3532
+ input[type="text"],
3533
+ input[type="time"],
3534
+ input[type="url"],
3535
+ input[type="week"]
3536
+ )
3537
+ )
3538
+ ) {
3539
+ /* Sizes */
3540
+ &.small {
3541
+ input {
3542
+ padding-inline: var(--size-2);
3543
+ }
3544
+ }
3545
+ }
3546
+
3547
+ /* Autosuggest */
3548
+ :where(.field:has(input[list])) {
3549
+ /* Hide native arrow */
3550
+ input::-webkit-calendar-picker-indicator {
3551
+ opacity: 0;
3552
+ position: absolute;
3553
+ cursor: pointer;
3554
+ pointer-events: none;
3555
+ }
3556
+ }
3557
+ :where(
3558
+ .field:has(input[list]:placeholder-shown),
3559
+ .field:has(input[list]):where(:focus-within, :hover)
3560
+ ) {
3561
+ /* Arrow */
3562
+ &::after {
3563
+ block-size: 0;
3564
+ border-block-start: 5px solid;
3565
+ border-inline: 5px solid transparent;
3566
+ content: "";
3567
+ display: inline-block;
3568
+ flex-shrink: 0;
3569
+ inline-size: 0;
3570
+ inset: 50% var(--size-3) auto auto;
3571
+ pointer-events: none;
3572
+ position: absolute;
3573
+ translate: 0 -50%;
3574
+ }
3575
+ }
3576
+ }
3577
+
3578
+ @layer components.extended {
3579
+ :where(.field:has(textarea)) {
3580
+ textarea {
3581
+ block-size: auto;
3582
+ field-sizing: content;
3583
+ min-block-size: 5rem;
3584
+ resize: vertical;
3585
+ }
3586
+
3587
+ /* Size */
3588
+ &.small {
3589
+ textarea {
3590
+ min-block-size: var(--_height);
3591
+ }
3592
+ }
3593
+
3594
+ /* Auto-fit */
3595
+ &.auto-fit {
3596
+ textarea {
3597
+ min-block-size: var(--_height);
3598
+ resize: both;
3599
+ }
3600
+ }
3601
+ }
3602
+ }
3603
+
3604
+ @layer components.extended {
3605
+ @scope (.rich-text) to (.not-rich-text) {
3606
+ a {
3607
+ color: var(--primary);
3608
+ cursor: pointer;
3609
+ font-size: inherit;
3610
+ font-weight: 700;
3611
+ line-height: inherit;
3612
+ text-decoration: underline;
3613
+ text-decoration-color: var(--primary);
3614
+ text-underline-offset: 2px;
3615
+
3616
+ &[href] {
3617
+ &:hover,
3618
+ &:focus-visible {
3619
+ color: var(--primary-light);
3620
+ }
3621
+ }
3622
+ }
3623
+
3624
+ /* Blockquote */
3625
+ blockquote {
3626
+ font-size: inherit;
3627
+ line-height: inherit;
3628
+ :first-child {
3629
+ margin-block-start: 0;
3630
+ }
3631
+
3632
+ :last-child {
3633
+ margin-block-end: 0;
3634
+ }
3635
+ }
3636
+
3637
+ /* Text */
3638
+ p {
3639
+ font-size: inherit;
3640
+ line-height: inherit;
3641
+ margin-block: 1.25em;
3642
+ }
3643
+
3644
+ :is(h1, .h1, h2, .h2, h3, .h3, h4, .h4, h5, .h5, h6, .h6) {
3645
+ color: var(--text-color-1);
3646
+
3647
+ & + *:not(&) {
3648
+ margin-block-start: 0;
3649
+ }
3650
+ }
3651
+
3652
+ h1,
3653
+ .h1 {
3654
+ font-size: var(--font-size-h1, var(--font-size-7));
3655
+ letter-spacing: -0.02em;
3656
+ line-height: 1.1111111;
3657
+ margin-block: 0 0.8888889em;
3658
+ }
3659
+
3660
+ h2,
3661
+ .h2 {
3662
+ font-size: var(--font-size-h2, var(--font-size-5, 2rem));
3663
+ letter-spacing: -0.02em;
3664
+ line-height: 1.3333333;
3665
+ margin-block: 2em 1em;
3666
+ }
3667
+
3668
+ h3,
3669
+ .h3 {
3670
+ font-size: var(--font-size-h3, var(--font-size-4, 1.5rem));
3671
+ letter-spacing: -0.01em;
3672
+ line-height: 1.6;
3673
+ margin-block: 1.6em 0.6em;
3674
+ }
3675
+
3676
+ h4,
3677
+ .h4 {
3678
+ font-size: var(--font-size-h4, var(--font-size-3, 1.25rem));
3679
+ letter-spacing: -0.01em;
3680
+ line-height: 1.5;
3681
+ margin-block: 1.5em 0.5em;
3682
+ }
3683
+
3684
+ h5,
3685
+ .h5 {
3686
+ font-size: var(--font-size-h5, var(--font-size-2, 1.1rem));
3687
+ line-height: 1;
3688
+ margin-block: 0 var(--size-1);
3689
+ }
3690
+
3691
+ h6,
3692
+ .h6 {
3693
+ font-size: var(--font-size-h6, var(--font-size-1, 1rem));
3694
+ line-height: 1;
3695
+ margin-block: 0 var(--size-1);
3696
+ }
3697
+
3698
+ /** Overline */
3699
+ :where(.overline, hgroup > :where(p, .p):first-of-type:first-child) {
3700
+ color: light-dark(
3701
+ oklch(from var(--text-color-2) calc(l * 1.25) c h),
3702
+ oklch(from var(--text-color-2) calc(l * 0.75) c h)
3703
+ );
3704
+ font-size: var(--font-size-xs);
3705
+ font-weight: 500;
3706
+ letter-spacing: 0.06em;
3707
+ line-height: 2.5;
3708
+ text-transform: uppercase;
3709
+ }
3710
+
3711
+ hgroup {
3712
+ & > p {
3713
+ margin: 0;
3714
+ }
3715
+
3716
+ & > :where(h1, .h1, h2, .h2, h3, .h3, h4, .h4, h5, .h5, h6, .h6) {
3717
+ margin-block-end: 0.4em;
3718
+ }
3719
+
3720
+ & + * {
3721
+ margin-block-start: 3em;
3722
+ }
3723
+
3724
+ /* The second p element */
3725
+ & > :where(p, .p):last-of-type:last-child:not(:first-child) {
3726
+ color: oklch(from currentColor l c h / 75%);
3727
+ font-size: var(--font-size-lg);
3728
+ line-height: 1.6;
3729
+ }
3730
+ }
3731
+
3732
+ /* Lists */
3733
+ ul:not([class]) {
3734
+ list-style-type: disc;
3735
+ }
3736
+
3737
+ ol:not([class]) {
3738
+ list-style-type: decimal;
3739
+ }
3740
+
3741
+ :where(ul, ol):not([class]) {
3742
+ display: grid;
3743
+ font-size: inherit;
3744
+ gap: 0.5em;
3745
+ line-height: inherit;
3746
+ margin-block-start: 1.25em;
3747
+ margin-block-end: 1.25em;
3748
+ padding-inline-start: 1.625em;
3749
+
3750
+ li {
3751
+ padding-inline-start: 0.375em;
3752
+ }
3753
+ }
3754
+
3755
+ /* Nested lists */
3756
+ :where(ul ul),
3757
+ :where(ul ol),
3758
+ :where(ol ul),
3759
+ :where(ol ol) {
3760
+ margin-block-start: 0.75em;
3761
+ margin-block-end: 0.75em;
3762
+ }
3763
+
3764
+ /* Description lists */
3765
+ :where(dl) {
3766
+ font-size: inherit;
3767
+ line-height: inherit;
3768
+ margin-block-start: 1.25em;
3769
+ margin-block-end: 1.25em;
3770
+
3771
+ dt {
3772
+ margin-block-start: 1.25em;
3773
+ }
3774
+
3775
+ dd {
3776
+ margin-block-start: 0.5em;
3777
+ padding-inline-start: 1.625em;
3778
+ }
3779
+ }
3780
+
3781
+ /* Figures */
3782
+ figure {
3783
+ margin-block: 2em;
3784
+
3785
+ & > * {
3786
+ margin-block: 0;
3787
+ }
3788
+
3789
+ & figcaption {
3790
+ font-size: 0.875em;
3791
+ line-height: 1.4285714;
3792
+ margin-block-start: 0.8571429em;
3793
+ }
3794
+ }
3795
+
3796
+ /* Remove top margin from first child */
3797
+ & > :first-child {
3798
+ margin-block-start: 0;
3799
+ }
3800
+
3801
+ /* Remove bottom margin from last child */
3802
+ & > :last-child {
3803
+ margin-block-end: 0;
3804
+ }
3805
+
3806
+ /* Horizontal rules */
3807
+ hr {
3808
+ & + * {
3809
+ margin-block-start: 0;
3810
+ }
3811
+ }
3812
+ }
3813
+ }
3814
+
3815
+ /* Setup */
3816
+
3817
+ /*
3818
+ theme two theme setup
3819
+ */
3820
+
3821
+ @layer theme {
3822
+ .light {
3823
+ --color-scheme: light;
3824
+ }
3825
+ .dark {
3826
+ --color-scheme: dark;
3827
+ }
3828
+
3829
+ :where(html) {
3830
+ color-scheme: var(--color-scheme, light dark);
3831
+
3832
+ --palette-hue: var(--oklch-orange);
3833
+ --palette-hue-rotate-by: 0;
3834
+ --palette-chroma: 0.89;
3835
+
3836
+ /* Primary */
3837
+ --primary: var(--color-8);
3838
+ --primary-light: oklch(from var(--primary) calc(l * 1.25) c h);
3839
+ --primary-dark: oklch(from var(--primary) calc(l * 0.75) c h);
3840
+ --primary-contrast: var(--gray-1);
3841
+
3842
+ /* Text */
3843
+ --text-color-1: light-dark(var(--gray-15), var(--gray-1));
3844
+ --text-color-1-contrast: light-dark(var(--gray-2), var(--gray-15));
3845
+ --text-color-2: light-dark(var(--gray-13), var(--gray-4));
3846
+ --text-color-2-contrast: light-dark(var(--gray-4), var(--gray-13));
3847
+
3848
+ /* Surface */
3849
+ --surface-default: light-dark(var(--gray-1), var(--gray-13));
3850
+ --surface-filled: light-dark(var(--gray-3), var(--gray-15));
3851
+ --surface-tonal: light-dark(var(--gray-3), var(--gray-12));
3852
+ --surface-elevated: light-dark(var(--gray-1), var(--gray-12));
3853
+
3854
+ /* Shadows */
3855
+ --shadow-color: light-dark(220 3% 15%, 220 40% 2%);
3856
+ --shadow-strength: light-dark(1%, 10%);
3857
+ --inner-shadow-highlight: light-dark(
3858
+ inset 0 -0.5px 0 0 #fff,
3859
+ inset 0 0.5px 0 0 #0001,
3860
+ inset 0 -0.5px 0 0 #fff1,
3861
+ inset 0 0.5px 0 0 #0007
3862
+ );
3863
+
3864
+ /* Typography */
3865
+ --font-size-h1: var(--font-size-fluid-3, 3.5rem);
3866
+ --font-size-h2: var(--font-size-fluid-2, 2rem);
3867
+ --font-size-h3: var(--font-size-fluid-1, 1.5rem);
3868
+ --font-size-h4: var(--font-size-3, 1.25rem);
3869
+ --font-size-h5: var(--font-size-2, 1.1rem);
3870
+ --font-size-h6: var(--font-size-fluid-0, 1rem);
3871
+ --font-size-lg: var(--font-size-3, 1.25rem);
3872
+ --font-size-md: var(--font-size-fluid-0, 1rem);
3873
+ --font-size-sm: 0.875rem;
3874
+ --font-size-xs: var(--font-size-0, 0.75rem);
3875
+
3876
+ /* Borders */
3877
+ --border-color: light-dark(var(--gray-4), var(--gray-12));
3878
+ --border-radius: var(--size-2);
3879
+ --border-width: 1px;
3880
+
3881
+ /* Input Field */
3882
+ --field-border-color: var(--border-color);
3883
+ --field-border-radius: var(--size-2);
3884
+ --field-border-width: 1px;
3885
+ --field-size: 2.3lh;
3886
+ --field-size-small: 1.9lh;
3887
+
3888
+ /* Button */
3889
+ --button-border-radius: var(--size-2);
3890
+ }
3891
+
3892
+ /* Highlight colors */
3893
+ :where(.red, .error, del) {
3894
+ --palette-hue: var(--oklch-red, 25);
3895
+ --palette-chroma: 1;
3896
+ --palette-hue-rotate-by: 1;
3897
+ }
3898
+ :where(.blue, .ok, abbr, dfn) {
3899
+ --palette-hue: var(--oklch-blue, 210);
3900
+ --palette-chroma: 1;
3901
+ --palette-hue-rotate-by: 1;
3902
+ }
3903
+ :where(.green, .good, ins) {
3904
+ --palette-hue: var(--oklch-green, 145);
3905
+ --palette-chroma: 1;
3906
+ --palette-hue-rotate-by: 1;
3907
+ }
3908
+ :where(.orange, .warning) {
3909
+ --palette-hue: var(--oklch-orange, 75);
3910
+ --palette-chroma: 1;
3911
+ --palette-hue-rotate-by: 1;
3912
+ }
3913
+
3914
+ :where(html) {
3915
+ --red: oklch(from var(--color-9) l 0.2 25);
3916
+ --blue: oklch(from var(--color-9) l 0.2 210);
3917
+ --green: oklch(from var(--color-9) l 0.2 145);
3918
+ --orange: oklch(from var(--color-7) l 0.2 75);
3919
+ }
3920
+
3921
+ /* Gray palette */
3922
+ :where(html) {
3923
+ --gray-chroma: 0.01;
3924
+ --gray-lightness: 255;
3925
+
3926
+ --gray-1: oklch(
3927
+ from var(--color-1) l var(--gray-chroma) var(--gray-lightness)
3928
+ );
3929
+ --gray-2: oklch(
3930
+ from var(--color-2) l var(--gray-chroma) var(--gray-lightness)
3931
+ );
3932
+ --gray-3: oklch(
3933
+ from var(--color-3) l var(--gray-chroma) var(--gray-lightness)
3934
+ );
3935
+ --gray-4: oklch(
3936
+ from var(--color-4) l var(--gray-chroma) var(--gray-lightness)
3937
+ );
3938
+ --gray-5: oklch(
3939
+ from var(--color-5) l var(--gray-chroma) var(--gray-lightness)
3940
+ );
3941
+ --gray-6: oklch(
3942
+ from var(--color-6) l var(--gray-chroma) var(--gray-lightness)
3943
+ );
3944
+ --gray-7: oklch(
3945
+ from var(--color-7) l var(--gray-chroma) var(--gray-lightness)
3946
+ );
3947
+ --gray-8: oklch(
3948
+ from var(--color-8) l var(--gray-chroma) var(--gray-lightness)
3949
+ );
3950
+ --gray-9: oklch(
3951
+ from var(--color-9) l var(--gray-chroma) var(--gray-lightness)
3952
+ );
3953
+ --gray-10: oklch(
3954
+ from var(--color-10) l var(--gray-chroma) var(--gray-lightness)
3955
+ );
3956
+ --gray-11: oklch(
3957
+ from var(--color-11) l var(--gray-chroma) var(--gray-lightness)
3958
+ );
3959
+ --gray-12: oklch(
3960
+ from var(--color-12) l var(--gray-chroma) var(--gray-lightness)
3961
+ );
3962
+ --gray-13: oklch(
3963
+ from var(--color-13) l var(--gray-chroma) var(--gray-lightness)
3964
+ );
3965
+ --gray-14: oklch(
3966
+ from var(--color-14) l var(--gray-chroma) var(--gray-lightness)
3967
+ );
3968
+ --gray-15: oklch(
3969
+ from var(--color-15) l var(--gray-chroma) var(--gray-lightness)
3970
+ );
3971
+ --gray-16: oklch(
3972
+ from var(--color-16) l var(--gray-chroma) var(--gray-lightness)
3973
+ );
3974
+ }
3975
+ }