opui-css 1.2.5 → 1.2.7

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