opui-css 3.2.0 → 3.3.0

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