opui-css 1.2.4

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