opui-css 3.2.0 → 3.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,4388 @@
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: background-color var(--_transition-time)
1976
+ 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: background-color var(--_transition-time)
1996
+ 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
+ /* Required dot */
2018
+ &:has([required]:not(:checked)) {
2019
+ .label:after {
2020
+ color: var(--red);
2021
+ content: "*";
2022
+ inset: 0 -0.25ex auto auto;
2023
+ position: absolute;
2024
+ }
2025
+ }
2026
+
2027
+ /* Disabled */
2028
+ &:has([disabled]) {
2029
+ cursor: not-allowed;
2030
+ opacity: 0.64;
2031
+ user-select: none;
2032
+
2033
+ input {
2034
+ cursor: not-allowed;
2035
+ }
2036
+ }
2037
+
2038
+ /* Label */
2039
+ .label {
2040
+ grid-column: 2;
2041
+ grid-row: 1;
2042
+ min-width: 0;
2043
+ padding-inline: 0 1ex;
2044
+ position: relative;
2045
+ user-select: none;
2046
+ }
2047
+
2048
+ /* Supporting text */
2049
+ .supporting-text {
2050
+ color: var(--text-color-2);
2051
+ font-size: var(--font-size-xs);
2052
+ grid-column: 2;
2053
+ grid-row: 2;
2054
+ line-height: 1.5;
2055
+ z-index: 1;
2056
+ }
2057
+
2058
+ /* Size */
2059
+ &.small {
2060
+ --_dot-size: 0.75rem;
2061
+ --_track-height: var(--size-4);
2062
+ --_track-width: 2.5rem;
2063
+ }
2064
+
2065
+ /* Stacked layout */
2066
+ &.stack {
2067
+ justify-items: center;
2068
+ grid-auto-columns: unset;
2069
+
2070
+ .label {
2071
+ grid-column: 1/-1;
2072
+ grid-row: 2;
2073
+ margin-block-start: var(--size-1);
2074
+ padding-inline: 1ex;
2075
+ }
2076
+
2077
+ .supporting-text {
2078
+ grid-column: 1/-1;
2079
+ grid-row: 3;
2080
+ }
2081
+ }
2082
+
2083
+ /* Validation */
2084
+ &.error {
2085
+ input {
2086
+ outline: 2px solid var(--color-9);
2087
+ border-radius: var(--radius-round);
2088
+ }
2089
+
2090
+ .label,
2091
+ .supporting-text {
2092
+ color: var(--color-9);
2093
+ }
2094
+ }
2095
+ }
2096
+ }
2097
+
2098
+ @layer components.root {
2099
+ :where(.range > input[type="range"]) {
2100
+ --thumb-bg: var(--primary);
2101
+ --thumb-highlight-color: oklch(from var(--primary) 70% 100% h / 20%);
2102
+ --thumb-highlight-size: 0px;
2103
+ --thumb-offset: -1ex;
2104
+ --thumb-size: 3ex;
2105
+ --track-color: var(--field-border-color);
2106
+ --track-fill: 0%;
2107
+ --track-height: 1ex;
2108
+
2109
+ appearance: none;
2110
+ background: transparent;
2111
+ display: block;
2112
+ inline-size: 100%;
2113
+ margin: 1ex 0 3ex;
2114
+ outline-offset: 1ex;
2115
+
2116
+ @media (hover: none) {
2117
+ --thumb-offset: -14px;
2118
+ --thumb-size: 30px;
2119
+ }
2120
+
2121
+ /* Track */
2122
+ &::-webkit-slider-runnable-track {
2123
+ appearance: none;
2124
+ background: linear-gradient(
2125
+ to right,
2126
+ transparent var(--track-fill),
2127
+ var(--track-color) 0%
2128
+ ),
2129
+ var(--primary);
2130
+ block-size: var(--track-height);
2131
+ border-radius: 5ex;
2132
+ box-shadow: var(--inner-shadow-1);
2133
+ }
2134
+
2135
+ &::-moz-range-track {
2136
+ appearance: none;
2137
+ background: linear-gradient(
2138
+ to right,
2139
+ transparent var(--track-fill),
2140
+ var(--track-color) 0%
2141
+ ),
2142
+ var(--primary);
2143
+ block-size: var(--track-height);
2144
+ border-radius: 5ex;
2145
+ box-shadow: var(--inner-shadow-2);
2146
+ }
2147
+
2148
+ /* Ring */
2149
+ &::-webkit-slider-thumb {
2150
+ appearance: none;
2151
+ background: var(--thumb-bg);
2152
+ block-size: var(--thumb-size);
2153
+ border-radius: 50%;
2154
+ border: 3px solid var(--surface-default);
2155
+ box-shadow: 0 0 0 var(--thumb-highlight-size) var(--thumb-highlight-color);
2156
+ cursor: ew-resize;
2157
+ inline-size: var(--thumb-size);
2158
+ margin-block-start: var(--thumb-offset);
2159
+
2160
+ @media (prefers-reduced-motion: no-preference) {
2161
+ transition: box-shadow 0.1s ease;
2162
+ }
2163
+
2164
+ .fieldset-item:focus-within & {
2165
+ border-color: var(--gray-14);
2166
+ }
2167
+ }
2168
+
2169
+ &::-moz-range-thumb {
2170
+ appearance: none;
2171
+ background: var(--thumb-bg);
2172
+ block-size: var(--thumb-size);
2173
+ border-radius: 50%;
2174
+ border: 3px solid var(--primary);
2175
+ box-shadow: 0 0 0 var(--thumb-highlight-size) var(--thumb-highlight-color);
2176
+ cursor: ew-resize;
2177
+ inline-size: var(--thumb-size);
2178
+ margin-block-start: var(--thumb-offset);
2179
+
2180
+ @media (prefers-reduced-motion: no-preference) {
2181
+ transition: box-shadow 0.1s ease;
2182
+ }
2183
+
2184
+ .fieldset-item:focus-within & {
2185
+ border-color: var(--gray-14);
2186
+ }
2187
+ }
2188
+
2189
+ /* Element state */
2190
+ &:not([disabled]) {
2191
+ &:hover {
2192
+ --thumb-highlight-size: var(--size-1);
2193
+ }
2194
+
2195
+ &:active {
2196
+ --thumb-highlight-size: var(--size-2);
2197
+ --track-color: light-dark(
2198
+ oklch(from var(--field-border-color) calc(l * 0.9) c h),
2199
+ oklch(from var(--field-border-color) calc(l * 1.1) c h)
2200
+ );
2201
+ }
2202
+ }
2203
+
2204
+ &[disabled] {
2205
+ --thumb-bg: oklch(from var(--text-color-1) l c h / 50%);
2206
+ --track-color: var(--field-border-color);
2207
+
2208
+ cursor: not-allowed;
2209
+
2210
+ &::-webkit-slider-thumb {
2211
+ cursor: not-allowed;
2212
+ }
2213
+ &::-moz-range-thumb {
2214
+ cursor: not-allowed;
2215
+ }
2216
+ }
2217
+ }
2218
+ }
2219
+
2220
+ @layer components.root {
2221
+ /* Base typography */
2222
+ :where(h1, .h1, h2, .h2, h3, .h3, h4, .h4, h5, .h5, h6, .h6) {
2223
+ color: var(--text-color-1);
2224
+ font-weight: 700;
2225
+ text-wrap: pretty;
2226
+ }
2227
+
2228
+ :where(h1, .h1) {
2229
+ font-size: var(--font-size-h1, var(--font-size-7));
2230
+ letter-spacing: -0.02em;
2231
+ line-height: 1.15;
2232
+ }
2233
+
2234
+ :where(h2, .h2) {
2235
+ font-size: var(--font-size-h2, var(--font-size-5, 2rem));
2236
+ letter-spacing: -0.02em;
2237
+ line-height: 1.2;
2238
+ }
2239
+
2240
+ :where(h3, .h3) {
2241
+ font-size: var(--font-size-h3, var(--font-size-4, 1.5rem));
2242
+ letter-spacing: -0.01em;
2243
+ line-height: 1.167;
2244
+ }
2245
+
2246
+ :where(h4, .h4) {
2247
+ font-size: var(--font-size-h4, var(--font-size-3, 1.25rem));
2248
+ letter-spacing: -0.01em;
2249
+ line-height: 1.235;
2250
+ }
2251
+
2252
+ :where(h5, .h5) {
2253
+ font-size: var(--font-size-h5, var(--font-size-2, 1.1rem));
2254
+ line-height: 1.334;
2255
+ }
2256
+
2257
+ :where(h6, .h6) {
2258
+ font-size: var(--font-size-h6, var(--font-size-1, 1rem));
2259
+ line-height: 1;
2260
+ }
2261
+
2262
+ :where(hgroup) {
2263
+ & > :where(p, .p) {
2264
+ margin: 0;
2265
+ }
2266
+
2267
+ & > :where(h1, .h1, h2, .h2, h3, .h3, h4, .h4, h5, .h5, h6, .h6) {
2268
+ margin-block-end: 0.4em;
2269
+ }
2270
+
2271
+ /* The second p element */
2272
+ & > :where(p, .p):last-of-type:last-child:not(:first-child) {
2273
+ color: oklch(from currentColor l c h / 75%);
2274
+ font-size: var(--font-size-lg);
2275
+ line-height: 1.6;
2276
+ }
2277
+ }
2278
+
2279
+ /** Overline */
2280
+ :where(.overline, hgroup > :where(p, .p):first-of-type:first-child) {
2281
+ color: light-dark(
2282
+ oklch(from var(--text-color-2) calc(l * 1.25) c h),
2283
+ oklch(from var(--text-color-2) calc(l * 0.75) c h)
2284
+ );
2285
+ font-size: var(--font-size-xs);
2286
+ font-weight: 500;
2287
+ letter-spacing: 0.06em;
2288
+ line-height: 2.5;
2289
+ text-transform: uppercase;
2290
+ }
2291
+
2292
+ :where(p, .p) {
2293
+ text-wrap: pretty;
2294
+
2295
+ &.small {
2296
+ font-size: var(--font-size-md);
2297
+ }
2298
+ &.large {
2299
+ font-size: var(--font-size-lg);
2300
+ }
2301
+ }
2302
+
2303
+ /* Inline text elements */
2304
+ :where(ins, u, abbr, dfn) {
2305
+ text-decoration: underline;
2306
+ text-underline-offset: 1px;
2307
+
2308
+ @supports (-moz-appearance: none) {
2309
+ text-underline-offset: 2px;
2310
+ }
2311
+ }
2312
+
2313
+ :where(abbr, dfn) {
2314
+ font-style: normal;
2315
+ text-decoration: var(--color-9) underline dotted;
2316
+
2317
+ &[title] {
2318
+ cursor: help;
2319
+ text-underline-offset: 1px;
2320
+ }
2321
+
2322
+ @supports (-moz-appearance: none) {
2323
+ text-underline-offset: 2px;
2324
+ }
2325
+ }
2326
+
2327
+ :where(sup) {
2328
+ font-size: 0.5em;
2329
+ }
2330
+
2331
+ :where(del, ins) {
2332
+ color: var(--color-9);
2333
+ }
2334
+
2335
+ :where(small) {
2336
+ font-size: max(0.5em, var(--font-size-0, 0.75rem));
2337
+ max-inline-size: var(--size-content-1);
2338
+ }
2339
+
2340
+ :where(cite) {
2341
+ font-style: italic;
2342
+ }
2343
+
2344
+ /* Blockquote */
2345
+ :where(blockquote) {
2346
+ border-inline-start-width: var(--border-size-3);
2347
+ display: grid;
2348
+ gap: var(--size-3);
2349
+ padding-block: var(--size-3);
2350
+ padding-inline: var(--size-4);
2351
+
2352
+ :first-child {
2353
+ margin-block-start: 0;
2354
+ }
2355
+
2356
+ :last-child {
2357
+ margin-block-end: 0;
2358
+ }
2359
+
2360
+ footer {
2361
+ color: var(--text-color-2);
2362
+ }
2363
+ }
2364
+
2365
+ /* Code */
2366
+ :where(pre) {
2367
+ border-radius: 0.375rem;
2368
+ direction: ltr;
2369
+ font-size: 0.875rem;
2370
+ line-height: 1.7142857;
2371
+ margin-block: 1.7142857em;
2372
+ max-inline-size: max-content;
2373
+ min-inline-size: 0;
2374
+ padding-block: 0.8571429em;
2375
+ padding-inline: 1.1428571em;
2376
+ white-space: pre;
2377
+ writing-mode: lr;
2378
+ }
2379
+
2380
+ :where(code, kbd, samp, pre) {
2381
+ font-family: var(--font-mono);
2382
+ }
2383
+
2384
+ :where(code) {
2385
+ background-color: oklch(00 0 0 /18%);
2386
+ border-radius: var(--border-size-3);
2387
+ font-size: 0.9em;
2388
+ padding: 0.2ex 0.5ex;
2389
+ }
2390
+
2391
+ :where(kbd, var) {
2392
+ background-color: var(--text-color-2);
2393
+ border-color: var(--text-color-2);
2394
+ border-radius: var(--border-radius, var(--radius-2));
2395
+ border-width: var(--border-size-1);
2396
+ color: var(--text-color-2-contrast);
2397
+ padding: calc(var(--size-1) / 2) var(--size-1);
2398
+ }
2399
+
2400
+ :where(:not(pre) code, kbd) {
2401
+ word-break: break-word;
2402
+ }
2403
+
2404
+ :where(:not(pre) code) {
2405
+ border-radius: var(--border-radius, var(--radius-2));
2406
+ padding: var(--size-1) var(--size-2);
2407
+ writing-mode: lr;
2408
+ }
2409
+
2410
+ :where(mark) {
2411
+ border-radius: var(--border-radius, 0);
2412
+ box-decoration-break: clone;
2413
+ padding: calc(var(--size-1) / 2) var(--size-1);
2414
+ vertical-align: baseline;
2415
+ }
2416
+
2417
+ /* Misc */
2418
+ :where(dt) {
2419
+ font-weight: 700;
2420
+ }
2421
+
2422
+ :where(figure) {
2423
+ & > :where(figcaption) {
2424
+ font-size: var(--font-size-1, 1rem);
2425
+ text-wrap: balance;
2426
+ }
2427
+ }
2428
+ }
2429
+
2430
+ /*** Extended components (has dependencies) */
2431
+
2432
+ @layer components.extended {
2433
+ :where([role="group"].button-group) {
2434
+ --_border-radius: var(--button-border-radius);
2435
+
2436
+ border-radius: var(--_border-radius);
2437
+ display: inline-flex;
2438
+ min-width: max-content;
2439
+
2440
+ button {
2441
+ border-radius: 0;
2442
+
2443
+ svg {
2444
+ max-inline-size: 0.7lh;
2445
+ }
2446
+
2447
+ &:focus-visible {
2448
+ outline-offset: -4px;
2449
+ }
2450
+
2451
+ & + & {
2452
+ border-inline-width: 1px;
2453
+ margin-inline-start: -1px;
2454
+ }
2455
+
2456
+ &:first-of-type {
2457
+ border-bottom-left-radius: var(--_border-radius);
2458
+ border-top-left-radius: var(--_border-radius);
2459
+ }
2460
+ &:last-of-type {
2461
+ border-bottom-right-radius: var(--_border-radius);
2462
+ border-top-right-radius: var(--_border-radius);
2463
+ }
2464
+
2465
+ /* Variants */
2466
+ /*** Text & Elevated */
2467
+ &:not(:where(.tonal, .filled, .outlined)) {
2468
+ & + button {
2469
+ border-inline-start: 1px solid var(--border-color);
2470
+ }
2471
+ }
2472
+
2473
+ &:where(.tonal, .filled) {
2474
+ & + button {
2475
+ border-inline-start-color: var(--color-7);
2476
+ }
2477
+ }
2478
+
2479
+ &:where(.tonal, .filled, .elevated) {
2480
+ & + &[disabled] {
2481
+ border-inline-start-color: color-mix(
2482
+ in oklch,
2483
+ var(--border-color) 90%,
2484
+ white
2485
+ );
2486
+ }
2487
+ }
2488
+
2489
+ &:where(.elevated) {
2490
+ box-shadow: var(--shadow-1);
2491
+
2492
+ button {
2493
+ &:not(:hover) {
2494
+ box-shadow: none;
2495
+ }
2496
+ }
2497
+ }
2498
+ }
2499
+ }
2500
+ }
2501
+
2502
+ @layer components.extended {
2503
+ :where(details) {
2504
+ --_accordion-transition-time: 0.2s;
2505
+ --_bg-color: transparent;
2506
+ --_margin-inline: var(--size-1);
2507
+ --_shadow: none;
2508
+
2509
+ background-color: var(--_bg-color);
2510
+ box-shadow: var(--_shadow);
2511
+ border-radius: var(--border-radius, 4px);
2512
+ display: block;
2513
+ margin-inline: var(--_margin-inline);
2514
+ transition: all var(--_accordion-transition-time) ease-out;
2515
+
2516
+ /* Accordion animation */
2517
+ /* https://nerdy.dev/open-and-close-transitions-for-the-details-element */
2518
+ @media (prefers-reduced-motion: no-preference) {
2519
+ interpolate-size: allow-keywords;
2520
+ }
2521
+
2522
+ &::details-content {
2523
+ block-size: 0;
2524
+ opacity: 0;
2525
+ overflow-y: clip;
2526
+ transition: content-visibility var(--_accordion-transition-time)
2527
+ allow-discrete,
2528
+ opacity var(--_accordion-transition-time),
2529
+ block-size var(--_accordion-transition-time);
2530
+ }
2531
+
2532
+ &[open]::details-content {
2533
+ block-size: auto;
2534
+ opacity: 1;
2535
+ }
2536
+ /***/
2537
+
2538
+ & > summary {
2539
+ background-color: inherit;
2540
+ cursor: pointer;
2541
+ font-weight: 700;
2542
+ padding-block: var(--size-3);
2543
+ user-select: none;
2544
+ }
2545
+
2546
+ /* Custom arrow */
2547
+ /* summary {
2548
+ align-items: center;
2549
+ background-color: inherit;
2550
+ cursor: pointer;
2551
+ display: flex;
2552
+ justify-content: space-between;
2553
+ list-style: none;
2554
+ padding-block: var(--size-3);
2555
+ user-select: none;
2556
+
2557
+ &::marker,
2558
+ &::-webkit-details-marker {
2559
+ display: none;
2560
+ }
2561
+
2562
+ svg {
2563
+ transition: rotate 0.2s ease-out;
2564
+ }
2565
+ }
2566
+
2567
+ &[open] > summary svg {
2568
+ rotate: 180deg;
2569
+ } */
2570
+
2571
+ & > .content {
2572
+ margin-block-start: 0;
2573
+ padding-block: var(--size-2) var(--size-3);
2574
+ }
2575
+
2576
+ & > .actions {
2577
+ display: flex;
2578
+ gap: var(--size-1);
2579
+ justify-content: end;
2580
+ margin-block-start: var(--size-3);
2581
+ padding-block-end: var(--size-1);
2582
+ padding-inline: var(--size-3) var(--size-1);
2583
+ }
2584
+
2585
+ /* Variants */
2586
+ &.card,
2587
+ &.text {
2588
+ --_bg-color: transparent;
2589
+ --_margin-inline: var(--size-1);
2590
+ }
2591
+
2592
+ &.elevated {
2593
+ --_bg-color: var(--surface-elevated);
2594
+ --_margin-inline: 0;
2595
+ --_shadow: var(--shadow-2);
2596
+ }
2597
+
2598
+ &.outlined {
2599
+ --_bg-color: var(--surface-default);
2600
+ --_margin-inline: 0;
2601
+ border: 1px solid var(--border-color);
2602
+ }
2603
+
2604
+ &.tonal {
2605
+ --_bg-color: var(--surface-tonal);
2606
+ --_margin-inline: 0;
2607
+ }
2608
+
2609
+ &:where(.elevated, .outlined, .tonal) > * {
2610
+ padding-inline: var(--size-3);
2611
+ }
2612
+ }
2613
+
2614
+ /* Accordion group */
2615
+ :where(.card:has(details)) {
2616
+ --_gutter-color: var(--border-color);
2617
+
2618
+ display: block;
2619
+
2620
+ & > .content {
2621
+ margin-block: 0;
2622
+ padding: 0;
2623
+ }
2624
+
2625
+ &.card,
2626
+ &.text {
2627
+ &:not(.tonal, .outlined, .elevated) {
2628
+ summary {
2629
+ padding-inline: 0;
2630
+ }
2631
+ }
2632
+ }
2633
+
2634
+ details {
2635
+ --_margin-inline: 0;
2636
+
2637
+ border: 0;
2638
+ box-shadow: none;
2639
+
2640
+ & > * {
2641
+ padding-inline: var(--size-3);
2642
+ }
2643
+
2644
+ /* Border between accordion items */
2645
+ & + & {
2646
+ summary {
2647
+ border-radius: 0;
2648
+ border-block-start: 1px solid var(--_gutter-color);
2649
+ }
2650
+ }
2651
+
2652
+ /* First item */
2653
+ &:first-of-type {
2654
+ border-start-start-radius: var(--border-radius, 0.25rem);
2655
+ border-start-end-radius: var(--border-radius, 0.25rem);
2656
+ summary {
2657
+ border-start-start-radius: var(--border-radius, 0.25rem);
2658
+ border-start-end-radius: var(--border-radius, 0.25rem);
2659
+ }
2660
+ }
2661
+
2662
+ /* Last item */
2663
+ &:last-of-type {
2664
+ border-end-start-radius: var(--border-radius, 0.25rem);
2665
+ border-end-end-radius: var(--border-radius, 0.25rem);
2666
+ summary {
2667
+ border-end-start-radius: var(--border-radius, 0.25rem);
2668
+ border-end-end-radius: var(--border-radius, 0.25rem);
2669
+ }
2670
+ }
2671
+ }
2672
+ }
2673
+ }
2674
+
2675
+ @layer components.extended {
2676
+ /*
2677
+ Lists meant to be used stand-alone or as part of Select elements
2678
+
2679
+ Intended use-case:
2680
+ - ul.list > li
2681
+ - .select > .list > option
2682
+ */
2683
+ :where(.list) {
2684
+ --_bg-color: light-dark(var(--gray-1), var(--gray-15));
2685
+ --_bg-color-hover: light-dark(var(--gray-2), var(--gray-14));
2686
+
2687
+ background-color: var(--_bg-color);
2688
+ list-style: none;
2689
+ padding: var(--size-2) 0;
2690
+
2691
+ @media (pointer: coarse) {
2692
+ &,
2693
+ * {
2694
+ user-select: none;
2695
+ }
2696
+ }
2697
+
2698
+ /* Borders on all list items */
2699
+ &.bordered {
2700
+ :where(li + li, option + option) {
2701
+ margin-block-start: var(--size-3);
2702
+ &::before {
2703
+ block-size: 1px;
2704
+ border-block-start: 1px solid var(--border-color);
2705
+ content: "";
2706
+ display: block;
2707
+ inline-size: 100%;
2708
+ inset: calc(-1 * var(--size-2)) 0 auto 0;
2709
+ position: absolute;
2710
+ visibility: visible; /* override select > option:before style */
2711
+ }
2712
+ }
2713
+ }
2714
+
2715
+ /* Dense - less gaps and spacing */
2716
+ &.dense {
2717
+ :where(li, option) {
2718
+ gap: var(--size-2);
2719
+ min-block-size: var(--size-7);
2720
+ padding: var(--size-1) var(--size-2);
2721
+
2722
+ &.border-top {
2723
+ margin-block-start: var(--size-2);
2724
+ &::before {
2725
+ inset: calc(-1 * var(--size-1)) 0 auto 0;
2726
+ }
2727
+ }
2728
+
2729
+ /* Clickable list item */
2730
+ &:has(> a, > button, > label) {
2731
+ min-block-size: auto;
2732
+ padding: 0;
2733
+ }
2734
+
2735
+ & > :where(a, button, label) {
2736
+ gap: var(--size-2);
2737
+ min-block-size: var(--size-7);
2738
+ padding: var(--size-1) var(--size-2);
2739
+ }
2740
+
2741
+ /* Checkbox / Radio */
2742
+ & > label {
2743
+ .end {
2744
+ padding-inline-end: 0.125rem;
2745
+ }
2746
+ }
2747
+
2748
+ /* Leading and trailing content */
2749
+ .start,
2750
+ .end {
2751
+ .avatar {
2752
+ max-inline-size: var(--size-6);
2753
+ }
2754
+
2755
+ .icon-button,
2756
+ svg {
2757
+ max-inline-size: var(--size-4);
2758
+ }
2759
+
2760
+ .checkbox,
2761
+ .radio {
2762
+ max-inline-size: var(--size-3);
2763
+ }
2764
+ }
2765
+ }
2766
+ }
2767
+
2768
+ /* Gutterless */
2769
+ &.gutterless {
2770
+ :where(li, option) {
2771
+ padding-inline: 0;
2772
+
2773
+ & > :where(a, button, label) {
2774
+ padding-inline: 0;
2775
+ }
2776
+ }
2777
+ }
2778
+
2779
+ /* List item */
2780
+ :where(li, option, [role="group"] > label) {
2781
+ align-items: center;
2782
+ background: var(--_bg-color) var(--ripple, none);
2783
+ display: flex;
2784
+ font-size: var(--font-size-sm);
2785
+ gap: var(--size-3);
2786
+ isolation: isolate;
2787
+ min-block-size: 40px;
2788
+ padding: var(--size-2) var(--size-3);
2789
+ position: relative;
2790
+
2791
+ &::before {
2792
+ display: none; /* removing checkmark from option */
2793
+ }
2794
+
2795
+ * {
2796
+ font-size: inherit;
2797
+ }
2798
+
2799
+ /* Clickable list item */
2800
+ &:has(> a, > button, > label) {
2801
+ background: transparent;
2802
+ display: block;
2803
+ min-block-size: auto;
2804
+ padding: 0;
2805
+ }
2806
+
2807
+ /* Select option */
2808
+ &:where(option) {
2809
+ align-items: center;
2810
+ background-color: var(--_bg-color);
2811
+ color: inherit;
2812
+ cursor: pointer;
2813
+ display: flex;
2814
+ gap: var(--size-3);
2815
+ inline-size: 100%;
2816
+ margin: 0;
2817
+ min-block-size: 40px;
2818
+ padding: var(--size-2) var(--size-3);
2819
+ text-align: start;
2820
+ text-decoration: none;
2821
+ z-index: 0;
2822
+
2823
+ &:hover {
2824
+ background-color: var(--_bg-color-hover);
2825
+ }
2826
+
2827
+ &:checked {
2828
+ background-color: oklch(from var(--primary) l c h / 30%);
2829
+ }
2830
+ }
2831
+
2832
+ & > a,
2833
+ & > button,
2834
+ & > label {
2835
+ align-items: center;
2836
+ background: var(--_bg-color) var(--ripple, none);
2837
+ color: inherit;
2838
+ cursor: pointer;
2839
+ display: flex;
2840
+ gap: var(--size-3);
2841
+ inline-size: 100%;
2842
+ margin: 0;
2843
+ min-block-size: 40px;
2844
+ outline-offset: -3px;
2845
+ padding: var(--size-2) var(--size-3);
2846
+ text-align: start;
2847
+ text-decoration: none;
2848
+ z-index: 0;
2849
+
2850
+ /*** Ripple effect */
2851
+ background-position: center;
2852
+ transition: background var(--button-ripple-duration);
2853
+ &:where(:not(:active):hover) {
2854
+ --ripple: radial-gradient(circle, transparent 1%, var(--_bg-color) 1%)
2855
+ center/15000%;
2856
+ }
2857
+
2858
+ &:where(:hover:active) {
2859
+ background-size: var(--button-ripple-size);
2860
+ transition: background 0s;
2861
+ }
2862
+
2863
+ &:hover {
2864
+ background-color: var(--_bg-color-hover);
2865
+ }
2866
+
2867
+ /*** Remove ripple effect when trailing button is clicked */
2868
+ &:has(.end:hover) {
2869
+ &:where(:not(:active):hover) {
2870
+ --ripple: none;
2871
+ }
2872
+ }
2873
+ }
2874
+
2875
+ /* Checkbox / Radio / Switch */
2876
+ & > label {
2877
+ .end {
2878
+ padding-inline-end: var(--size-1);
2879
+ }
2880
+
2881
+ &:where(.checkbox, .radio) {
2882
+ inline-size: 100%;
2883
+ }
2884
+
2885
+ &.switch {
2886
+ --_dot-size: 0.75rem;
2887
+ --_track-height: var(--size-4);
2888
+ --_track-width: 2.5rem;
2889
+ }
2890
+ }
2891
+
2892
+ /* Video */
2893
+ &:has(video) {
2894
+ padding: 0.75rem var(--size-3) 0.75rem 0;
2895
+ }
2896
+
2897
+ /* Border between list items */
2898
+ &.border-top {
2899
+ margin-block-start: var(--size-3);
2900
+ &::before {
2901
+ block-size: 1px;
2902
+ border-block-start: 1px solid var(--border-color);
2903
+ content: "";
2904
+ display: block;
2905
+ inline-size: 100%;
2906
+ inset: calc(-1 * var(--size-2)) 0 auto 0;
2907
+ position: absolute;
2908
+ }
2909
+ }
2910
+
2911
+ /* Text */
2912
+ .text {
2913
+ flex: 1;
2914
+ line-height: 1.6;
2915
+
2916
+ :where(h1, h2, h3, h4, h5, h6, p, span) {
2917
+ color: inherit;
2918
+ font-weight: 400;
2919
+ }
2920
+
2921
+ p + p {
2922
+ font-size: var(--font-size-xs);
2923
+ }
2924
+ }
2925
+
2926
+ /* Leading content */
2927
+ .start {
2928
+ align-self: center;
2929
+ align-items: center;
2930
+ display: grid;
2931
+ z-index: 1;
2932
+
2933
+ &:has(svg) {
2934
+ max-inline-size: var(--size-5);
2935
+ }
2936
+
2937
+ svg {
2938
+ padding-block-start: 0.125rem;
2939
+ }
2940
+
2941
+ img {
2942
+ aspect-ratio: 1;
2943
+ inline-size: 56px;
2944
+ object-fit: cover;
2945
+ }
2946
+
2947
+ video {
2948
+ aspect-ratio: 16/9;
2949
+ block-size: 64px;
2950
+ object-fit: cover;
2951
+ }
2952
+ }
2953
+
2954
+ /* Trailing content */
2955
+ .end {
2956
+ align-items: center;
2957
+ display: flex;
2958
+ font-size: var(--font-size-xs);
2959
+ text-align: end;
2960
+ z-index: 1;
2961
+
2962
+ &:not(:has(a, button, input)) {
2963
+ pointer-events: none;
2964
+ }
2965
+
2966
+ kbd {
2967
+ background-color: transparent;
2968
+ border: 0;
2969
+ color: inherit;
2970
+ opacity: 0.6;
2971
+ }
2972
+
2973
+ svg {
2974
+ max-inline-size: var(--size-5);
2975
+ inline-size: 100%;
2976
+ }
2977
+ }
2978
+
2979
+ /* Inset */
2980
+ &.inset {
2981
+ .text {
2982
+ padding-inline-start: calc(var(--size-5) + var(--size-3));
2983
+ }
2984
+
2985
+ /* Safety measure so it won't look bad if there for some reason should exist a leading element inside. */
2986
+ .start {
2987
+ display: none;
2988
+ }
2989
+ }
2990
+ }
2991
+ }
2992
+ }
2993
+
2994
+ @layer components.extended {
2995
+ :where(.alert) {
2996
+ --_bg-color: var(--surface-tonal);
2997
+ --_border-color: var(--surface-tonal);
2998
+ --_color: var(--text-color-1);
2999
+
3000
+ &.outlined {
3001
+ --_bg-color: var(--surface-default);
3002
+ --_border-color: var(--border-color);
3003
+ --_color: var(--text-color-1);
3004
+ }
3005
+
3006
+ background-color: var(--_bg-color);
3007
+ border: 1px solid var(--_border-color);
3008
+ border-radius: var(--border-radius);
3009
+ color: var(--_color);
3010
+ padding: var(--size-3);
3011
+
3012
+ & > .content {
3013
+ display: grid;
3014
+ gap: var(--size-2);
3015
+ font-size: var(--font-size-sm);
3016
+
3017
+ h1,
3018
+ h2,
3019
+ h3,
3020
+ h4,
3021
+ h5,
3022
+ h6 {
3023
+ color: inherit;
3024
+ font-size: var(--font-size-md);
3025
+ font-weight: 600;
3026
+
3027
+ * {
3028
+ font-size: inherit;
3029
+ }
3030
+ }
3031
+ }
3032
+
3033
+ /* Colors */
3034
+ &.error,
3035
+ &.ok,
3036
+ &.warning {
3037
+ --_bg-color: var(--color-4);
3038
+ --_border-color: var(--color-9);
3039
+ --_color: var(--color-15);
3040
+
3041
+ &.outlined {
3042
+ --_bg-color: var(--surface-default);
3043
+ --_border-color: var(--color-9);
3044
+ --_color: light-dark(var(--color-15), var(--color-1));
3045
+ }
3046
+
3047
+ svg {
3048
+ margin-block-start: 0.15rem;
3049
+ stroke: var(--color-9);
3050
+ }
3051
+ }
3052
+
3053
+ /* Links
3054
+ * Can't make sure contrast will be acceptable (yet) so we use the current text color instead.
3055
+ */
3056
+ &:not(.outlined) {
3057
+ a[href] {
3058
+ color: inherit;
3059
+
3060
+ &:hover {
3061
+ color: var(--primary);
3062
+ }
3063
+ }
3064
+ }
3065
+
3066
+ /* Icon */
3067
+ &:has(svg) {
3068
+ display: grid;
3069
+ gap: var(--size-3);
3070
+ grid-template-columns: var(--size-4) 1fr;
3071
+
3072
+ svg {
3073
+ margin-block-start: 0.15rem;
3074
+ stroke: currentColor;
3075
+ }
3076
+ }
3077
+ }
3078
+ }
3079
+
3080
+ @layer components.extended {
3081
+ :where(dialog) {
3082
+ margin-block-start: 15%; /* vertical alignment */
3083
+ padding-block: 0;
3084
+ pointer-events: none;
3085
+
3086
+ &::backdrop {
3087
+ background-color: rgba(0, 0, 0, 0.5);
3088
+ backdrop-filter: blur(5px);
3089
+
3090
+ @media (prefers-reduced-motion: reduce) {
3091
+ backdrop-filter: none;
3092
+ }
3093
+ }
3094
+
3095
+ &:not([open]) {
3096
+ display: none;
3097
+ }
3098
+
3099
+ &[open] {
3100
+ pointer-events: all;
3101
+ }
3102
+
3103
+ .actions {
3104
+ justify-content: end;
3105
+ padding-inline: var(--size-3) var(--size-1);
3106
+ }
3107
+
3108
+ /* Animation */
3109
+ /* There's no close animation, intentionally */
3110
+ opacity: 0;
3111
+
3112
+ &[open] {
3113
+ opacity: 1;
3114
+ transition: display 0.2s allow-discrete,
3115
+ margin-block-start 0.3s var(--ease-1), overlay 0.2s allow-discrete,
3116
+ opacity 0.2s var(--ease-out-1);
3117
+
3118
+ @starting-style {
3119
+ opacity: 0;
3120
+ }
3121
+ }
3122
+
3123
+ @media (prefers-reduced-motion: no-preference) {
3124
+ margin-block-start: 17%;
3125
+ &[open] {
3126
+ margin-block-start: 15%;
3127
+
3128
+ @starting-style {
3129
+ margin-block-start: 17%;
3130
+ }
3131
+ }
3132
+ }
3133
+ }
3134
+
3135
+ :where(html:has(dialog[open])) {
3136
+ overflow: hidden;
3137
+ }
3138
+ }
3139
+
3140
+ @layer components.extended {
3141
+ :where(.snackbar) {
3142
+ align-items: center;
3143
+ /* Inverse surface-filled */
3144
+ background-color: light-dark(var(--gray-15), var(--gray-2));
3145
+ border-radius: var(--border-radius);
3146
+ box-shadow: var(--shadow-2);
3147
+ color: var(--text-color-1-contrast);
3148
+ display: flex;
3149
+ font-size: var(--font-size-sm);
3150
+ gap: var(--size-3);
3151
+ inset-block: auto var(--size-3);
3152
+ inset-inline: var(--size-3) auto;
3153
+ justify-content: space-between;
3154
+ min-inline-size: min(100%, 37ch);
3155
+ padding: var(--size-2) var(--size-3);
3156
+ position: fixed;
3157
+ inline-size: calc(100% - var(--size-6, 1.75rem));
3158
+ z-index: 100;
3159
+
3160
+ &::backdrop {
3161
+ display: none;
3162
+ }
3163
+
3164
+ * {
3165
+ word-break: break-word;
3166
+ }
3167
+
3168
+ /* Global positioning (in relation to the window) */
3169
+ /*** Default (end-start) */
3170
+ inset-block: auto var(--size-3);
3171
+ inset-inline: 50% 0;
3172
+ translate: -50% 0;
3173
+
3174
+ &.start-start,
3175
+ &.start-center,
3176
+ &.start-end {
3177
+ inset-block: var(--size-3) auto;
3178
+ }
3179
+
3180
+ /* TODO use @custom-media instead? */
3181
+ @container (width > 480px) {
3182
+ /* Default (end-start) */
3183
+ inset-block: auto var(--size-7, 2rem);
3184
+ inset-inline: var(--size-7, 2rem) auto;
3185
+ translate: revert;
3186
+ inline-size: fit-content;
3187
+
3188
+ &.end-start,
3189
+ &.end-end,
3190
+ &.start-start,
3191
+ &.start-end {
3192
+ translate: revert;
3193
+ }
3194
+
3195
+ &.start-start {
3196
+ inset-block: var(--size-7, 2rem) auto;
3197
+ inset-inline: var(--size-7, 2rem) auto;
3198
+ }
3199
+ &.start-center {
3200
+ inset-block: var(--size-7, 2rem) auto;
3201
+ inset-inline: 50% 0;
3202
+ translate: -50% 0;
3203
+ }
3204
+ &.start-end {
3205
+ inset-block: var(--size-7, 2rem) auto;
3206
+ inset-inline: auto var(--size-7, 2rem);
3207
+ }
3208
+ &.end-start {
3209
+ inset-block-end: var(--size-7, 2rem);
3210
+ inset-inline: var(--size-7, 2rem) auto;
3211
+ }
3212
+ &.end-center {
3213
+ inset-block: auto var(--size-7, 2rem);
3214
+ inset-inline: 50% 0;
3215
+ translate: -50% 0;
3216
+ }
3217
+ &.end-end {
3218
+ inset-block: auto var(--size-7, 2rem);
3219
+ inset-inline: auto var(--size-7, 2rem);
3220
+ }
3221
+ }
3222
+
3223
+ /* Absolute positioning */
3224
+ &.absolute {
3225
+ position: absolute;
3226
+ }
3227
+
3228
+ /* Actions */
3229
+ .actions {
3230
+ align-items: center;
3231
+ display: flex;
3232
+ flex-shrink: 0;
3233
+ gap: var(--size-3);
3234
+ padding-inline: 0;
3235
+
3236
+ button {
3237
+ /* Inverse hover and active backgrounds */
3238
+ &:where(:not([disabled])) {
3239
+ &:where(:not(:active):hover) {
3240
+ --_bg-color: light-dark(
3241
+ color-mix(in oklch, white 40%, black),
3242
+ color-mix(in oklch, white 85%, black)
3243
+ );
3244
+ }
3245
+
3246
+ &:where(:hover:active) {
3247
+ --_bg-color: light-dark(
3248
+ color-mix(in oklch, white 45%, black),
3249
+ color-mix(in oklch, white 80%, black)
3250
+ );
3251
+ }
3252
+ }
3253
+ }
3254
+
3255
+ button:not(:has(svg)) {
3256
+ border-radius: var(--border-radius);
3257
+ font-size: inherit;
3258
+ max-block-size: var(--size-6, 1.5rem);
3259
+ padding: 1ex;
3260
+ }
3261
+
3262
+ button:has(svg) {
3263
+ color: inherit;
3264
+ max-inline-size: var(--size-6, 1.75rem);
3265
+ margin: var(--size-00);
3266
+ padding: var(--size-1);
3267
+ }
3268
+ }
3269
+
3270
+ /* Animations */
3271
+ opacity: 0;
3272
+ transition: display 0.075s allow-discrete, overlay 0.075s allow-discrete,
3273
+ opacity 0.075s var(--ease-out-1);
3274
+
3275
+ &:popover-open,
3276
+ &:popover-open::backdrop,
3277
+ &.visible {
3278
+ opacity: 1;
3279
+ transition: display 0.25s allow-discrete, overlay 0.25s allow-discrete,
3280
+ opacity 0.25s var(--ease-out-1);
3281
+
3282
+ @starting-style {
3283
+ opacity: 0;
3284
+ }
3285
+ }
3286
+ }
3287
+ }
3288
+
3289
+ @layer components.extended {
3290
+ /* Common styling for checkbox, radio and switch groups */
3291
+ :where(fieldset.field-group) {
3292
+ border: 0;
3293
+ border-radius: 0;
3294
+ gap: 0;
3295
+ padding: 0;
3296
+ z-index: 1;
3297
+
3298
+ legend {
3299
+ color: var(--text-color-2);
3300
+ padding: 0 1ex 0 0;
3301
+ }
3302
+
3303
+ /* Disabled */
3304
+ &[disabled] {
3305
+ cursor: not-allowed;
3306
+ opacity: 0.64;
3307
+ user-select: none;
3308
+
3309
+ input {
3310
+ cursor: not-allowed;
3311
+ }
3312
+ }
3313
+
3314
+ /* Validation */
3315
+ &.error {
3316
+ legend,
3317
+ .supporting-text {
3318
+ color: var(--color-9);
3319
+ }
3320
+ }
3321
+
3322
+ /* Required */
3323
+ &:has([required]) {
3324
+ &:not(:has(input:where([type="radio"], [type="checkbox"]):checked)) {
3325
+ legend {
3326
+ position: relative;
3327
+
3328
+ &::after {
3329
+ color: var(--red);
3330
+ content: "*";
3331
+ inset: 0 -0.25ex auto auto;
3332
+ position: absolute;
3333
+ }
3334
+ }
3335
+ }
3336
+ }
3337
+ :where(.radio, .checkbox, .switch) .label:after {
3338
+ display: none;
3339
+ }
3340
+
3341
+ /* Supporting text */
3342
+ .supporting-text {
3343
+ color: var(--text-color-2);
3344
+ font-size: var(--font-size-xs);
3345
+ line-height: 1.5;
3346
+ z-index: 1;
3347
+ }
3348
+
3349
+ /* Fields */
3350
+ .fields {
3351
+ display: flex;
3352
+ flex-direction: column;
3353
+ gap: var(--size-2);
3354
+
3355
+ * ~ & {
3356
+ padding: var(--size-2) 0;
3357
+ }
3358
+ }
3359
+
3360
+ :last-child {
3361
+ padding-block-end: 0;
3362
+ }
3363
+
3364
+ /* Directions */
3365
+ &.row {
3366
+ .fields {
3367
+ flex-direction: row;
3368
+ }
3369
+ }
3370
+ }
3371
+ }
3372
+
3373
+ @layer components.extended {
3374
+ /*
3375
+ - Common styling for input, textarea and select
3376
+ - Form related styles such as: label, supporting text, error handling
3377
+ */
3378
+ :where(.field) {
3379
+ --_accent-color: var(--primary);
3380
+ --_bg-color: var(--surface-default);
3381
+ --_border-color: var(--field-border-color);
3382
+ --_field-padding-block: 0.75rem;
3383
+ --_field-padding-inline: var(--size-2);
3384
+ --_filled-border-color: var(--text-color-1);
3385
+ --_height: var(--field-size);
3386
+ --_label-color: var(--text-color-2);
3387
+ --_supporting-text-color: var(--text-color-2);
3388
+
3389
+ contain: layout;
3390
+ display: inline-grid;
3391
+ position: relative;
3392
+
3393
+ /* Input/Select base */
3394
+ & input,
3395
+ & textarea,
3396
+ & select {
3397
+ background-color: var(--_bg-color);
3398
+ block-size: var(--_height);
3399
+ border-radius: var(--field-border-radius);
3400
+ border: var(--field-border-width) solid var(--_border-color);
3401
+ color: var(--text-color-1);
3402
+ font-family: var(--font-sans);
3403
+ font-size: var(--font-size-1);
3404
+ grid-column: 1/-1;
3405
+ grid-row: 1;
3406
+ inline-size: 100%;
3407
+ line-height: var(--font-lineheight-1);
3408
+ min-inline-size: 0;
3409
+ padding: var(--_field-padding-block) var(--_field-padding-inline);
3410
+
3411
+ @media (prefers-reduced-motion: no-preference) {
3412
+ transition: border-color 0.2s cubic-bezier(0.4, 0, 0.2, 1),
3413
+ padding-block 0.2s var(--ease-3);
3414
+ }
3415
+ }
3416
+
3417
+ /* Required/Invalid */
3418
+ &:has(
3419
+ :not(:placeholder-shown):invalid,
3420
+ :where(
3421
+ :placeholder-shown,
3422
+ option[value=""]:not(:checked),
3423
+ option:checked:not([value=""])
3424
+ ):required
3425
+ ) {
3426
+ .label:after {
3427
+ color: var(--red);
3428
+ content: "*";
3429
+ margin: -0.25em auto auto 0.25em;
3430
+ }
3431
+ }
3432
+
3433
+ /* File */
3434
+ &:has(input[type="file"]) {
3435
+ cursor: pointer;
3436
+
3437
+ input {
3438
+ align-self: flex-start;
3439
+ block-size: var(--_height);
3440
+ box-shadow: none;
3441
+ color: var(--text-color-1);
3442
+ cursor: inherit;
3443
+ max-inline-size: 100%;
3444
+ padding: 0;
3445
+ transition: font-size 0.2s var(--ease-3);
3446
+
3447
+ &::-webkit-file-upload-button,
3448
+ &::file-selector-button {
3449
+ background-color: var(--surface-tonal);
3450
+ border: none;
3451
+ block-size: calc(100% - var(--size-2) * 2);
3452
+ border-radius: var(--field-border-radius);
3453
+ cursor: pointer;
3454
+ margin-inline-end: 1ex;
3455
+ margin-block-start: var(--size-2);
3456
+ margin-inline-start: var(--size-2);
3457
+ }
3458
+ }
3459
+
3460
+ /* Variants */
3461
+ &.filled {
3462
+ input {
3463
+ &::-webkit-file-upload-button,
3464
+ &::file-selector-button {
3465
+ background-color: var(--surface-default);
3466
+ block-size: calc(100% - var(--size-2) * 2);
3467
+ border-radius: var(--field-border-radius);
3468
+ cursor: pointer;
3469
+ margin-block-start: var(--size-2);
3470
+ }
3471
+ }
3472
+ }
3473
+
3474
+ /* Sizes */
3475
+ &.small {
3476
+ input {
3477
+ font-size: var(--font-size-sm);
3478
+ &::-webkit-file-upload-button,
3479
+ &::file-selector-button {
3480
+ block-size: calc(100% - var(--size-2));
3481
+ margin-block-start: var(--size-1);
3482
+ }
3483
+ }
3484
+ }
3485
+ }
3486
+
3487
+ /* Autosuggest */
3488
+ &:has(input[list]) {
3489
+ .label {
3490
+ /* Make sure chevron is visible */
3491
+ inline-size: calc(100% - var(--size-6));
3492
+ }
3493
+ }
3494
+
3495
+ /* Select */
3496
+ &:has(select) {
3497
+ .label {
3498
+ /* Make sure chevron is visible */
3499
+ inline-size: calc(100% - var(--size-6));
3500
+ }
3501
+ }
3502
+
3503
+ /* Experimental Select */
3504
+ &:has(select button) {
3505
+ select {
3506
+ padding: 0;
3507
+
3508
+ button {
3509
+ outline: 0;
3510
+ padding: var(--_field-padding-block) var(--size-8)
3511
+ var(--_field-padding-block) var(--_field-padding-inline);
3512
+ }
3513
+ }
3514
+ }
3515
+
3516
+ /* Non-experimental Select */
3517
+ &:has(select):not(:has(button)) {
3518
+ select {
3519
+ padding: var(--_field-padding-block) var(--size-8)
3520
+ var(--_field-padding-block) var(--_field-padding-inline);
3521
+ }
3522
+ }
3523
+
3524
+ /* Input - color */
3525
+ &:has(input[type="color"]) {
3526
+ input {
3527
+ appearance: none;
3528
+ background: none;
3529
+ block-size: var(--_height);
3530
+ overflow: hidden;
3531
+ padding: 0;
3532
+
3533
+ &::-webkit-color-swatch {
3534
+ border: none;
3535
+ }
3536
+
3537
+ &::-webkit-color-swatch-wrapper {
3538
+ padding: 0;
3539
+ }
3540
+ }
3541
+
3542
+ .label {
3543
+ border: 1px solid var(--field-border-color);
3544
+ inline-size: fit-content;
3545
+ margin-inline-start: var(--size-2);
3546
+ }
3547
+ }
3548
+
3549
+ /* Textarea */
3550
+ &:has(textarea) {
3551
+ .label {
3552
+ align-self: start;
3553
+ margin-block-start: var(--_field-padding-block);
3554
+ }
3555
+ }
3556
+
3557
+ /*
3558
+ * Variant: Outlined
3559
+ */
3560
+ &:not(.filled) {
3561
+ /* Element states */
3562
+ &:hover {
3563
+ &:not(.error) {
3564
+ :where(input, textarea, select) {
3565
+ --_border-color: var(--text-color-1);
3566
+ }
3567
+ }
3568
+ }
3569
+ }
3570
+
3571
+ &:not(.filled):focus-within {
3572
+ & input,
3573
+ & textarea,
3574
+ & select {
3575
+ border-color: var(--_accent-color);
3576
+ outline-offset: -2px;
3577
+ outline: 2px solid var(--_accent-color);
3578
+ }
3579
+ }
3580
+
3581
+ /* Label */
3582
+ .label {
3583
+ align-self: center;
3584
+ background-color: var(--_bg-color);
3585
+ border-radius: var(--field-border-radius);
3586
+ color: var(--_label-color);
3587
+ border-radius: var(--radius-1);
3588
+ display: inline-flex;
3589
+ font-size: var(--font-size-md);
3590
+ grid-column: 1/-1;
3591
+ grid-row: 1;
3592
+ inline-size: calc(100% - (var(--field-border-width) * 2));
3593
+ margin-inline-start: var(--field-border-width);
3594
+ padding-inline: var(--_field-padding-inline);
3595
+ pointer-events: none;
3596
+ z-index: 1;
3597
+
3598
+ @media (prefers-reduced-motion: no-preference) {
3599
+ transition: border-color 0.2s var(--ease-3),
3600
+ font-size 0.2s var(--ease-3), inline-size 0.05s var(--ease-3),
3601
+ margin 0.2s var(--ease-3), padding-inline 0.2s var(--ease-3);
3602
+ }
3603
+ }
3604
+
3605
+ /*
3606
+ * Label transitions
3607
+ * Triggered by:
3608
+ * - focus
3609
+ * - filled form fields (except color inputs)
3610
+ * - non-empty select options
3611
+ */
3612
+ &:focus-within,
3613
+ &:has(:where(input:not([type="color"]), textarea):not(:placeholder-shown)),
3614
+ &:has(option[value=""]:not(:checked)),
3615
+ &:has(option:checked:not([value=""])) {
3616
+ .label {
3617
+ border-color: transparent;
3618
+ color: var(--_accent-color);
3619
+ font-size: 0.75rem;
3620
+ inline-size: max-content;
3621
+ letter-spacing: 0.15px;
3622
+ line-height: 1.15;
3623
+ margin-block-start: -2.7rem;
3624
+ margin-inline-start: var(--_field-padding-inline);
3625
+ padding-inline: 0.125rem;
3626
+ }
3627
+
3628
+ /* Neutral label color reset */
3629
+ &:not(:focus-within):not(.error) {
3630
+ .label {
3631
+ color: var(--text-color-2);
3632
+ }
3633
+ }
3634
+
3635
+ &:has(textarea) {
3636
+ .label {
3637
+ margin-block-start: -0.35rem;
3638
+ }
3639
+
3640
+ &.small {
3641
+ .label {
3642
+ align-self: start;
3643
+ margin-block-start: var(--_field-padding-block);
3644
+ }
3645
+ }
3646
+ }
3647
+ }
3648
+
3649
+ /* Supporting text */
3650
+ .supporting-text {
3651
+ color: var(--_supporting-text-color);
3652
+ font-size: var(--font-size-xs);
3653
+ grid-row: 3;
3654
+ line-height: 1.5;
3655
+ margin-inline-start: var(--field-border-width);
3656
+ padding-inline: var(--_field-padding-inline);
3657
+ z-index: 1;
3658
+ }
3659
+
3660
+ /* Auto-fit */
3661
+ &.auto-fit {
3662
+ inline-size: auto;
3663
+ :where(& input, & textarea) {
3664
+ field-sizing: content;
3665
+ }
3666
+ }
3667
+
3668
+ /* Validation */
3669
+ &.error {
3670
+ --_accent-color: var(--color-9);
3671
+ --_border-color: var(--color-9);
3672
+ --_filled-border-color: var(--color-9);
3673
+ --_label-color: var(--color-9);
3674
+ --_supporting-text-color: var(--color-9);
3675
+ }
3676
+
3677
+ /*
3678
+ * Variant: Filled
3679
+ */
3680
+ &.filled {
3681
+ --_bg-color: var(--surface-tonal);
3682
+ *:focus-visible {
3683
+ outline: 0;
3684
+ }
3685
+
3686
+ /* Base style */
3687
+ & input,
3688
+ & textarea,
3689
+ & select {
3690
+ border-block-end-color: var(--_filled-border-color);
3691
+ border-block-start-color: transparent;
3692
+ border-inline-color: transparent;
3693
+ border-radius: 0;
3694
+ }
3695
+
3696
+ & input[type="color"] {
3697
+ border-inline: none;
3698
+ }
3699
+
3700
+ /* Bottom line */
3701
+ &::before {
3702
+ background-color: var(--_filled-border-color);
3703
+ block-size: calc(var(--field-border-width) + 1px);
3704
+ content: "";
3705
+ inline-size: 100%;
3706
+ margin-block-end: calc(-1 * (var(--field-border-width) * 2));
3707
+ transform: scaleX(0);
3708
+ translate: 0 calc(-1 * (var(--field-border-width) * 2));
3709
+ z-index: 1;
3710
+
3711
+ @media (prefers-reduced-motion: no-preference) {
3712
+ transition: transform 0.3s var(--ease-3), translate 0.2s var(--ease-3);
3713
+ }
3714
+ }
3715
+
3716
+ /* Label */
3717
+ .label {
3718
+ background-color: var(--_bg-color);
3719
+ }
3720
+
3721
+ &:not(:has([disabled], :has(input[type="color"]))) {
3722
+ /* Hover */
3723
+ &:hover {
3724
+ --_bg-color: light-dark(
3725
+ oklch(from var(--surface-tonal) calc(l * 0.93) c h),
3726
+ oklch(from var(--surface-tonal) calc(l * 1.1) c h)
3727
+ );
3728
+ }
3729
+ }
3730
+
3731
+ /*
3732
+ * Label transitions
3733
+ * Triggered by:
3734
+ * - focus
3735
+ * - filled form fields (except color inputs)
3736
+ * - non-empty select options
3737
+ */
3738
+ &:has(.label) {
3739
+ &:focus-within,
3740
+ &:has(
3741
+ :where(input:not(:where([type="color"])), textarea):not(
3742
+ :placeholder-shown
3743
+ )
3744
+ ),
3745
+ &:has(option[value=""]:not(:checked)),
3746
+ &:has(option:checked:not([value=""])) {
3747
+ :where(input, textarea) {
3748
+ padding-block: calc(var(--_field-padding-block) * 1.7)
3749
+ calc(var(--_field-padding-block) * 0.3);
3750
+ }
3751
+
3752
+ select > button,
3753
+ select:not(:has(button)) {
3754
+ padding-block: calc(var(--_field-padding-block) * 1.7)
3755
+ calc(var(--_field-padding-block) * 0.3);
3756
+ }
3757
+
3758
+ .label {
3759
+ margin-block-start: calc(-1 * var(--size-5));
3760
+ margin-inline-start: calc(var(--_field-padding-inline) / 2);
3761
+ padding-inline: calc(var(--_field-padding-inline) / 2);
3762
+ }
3763
+
3764
+ &:has(textarea) {
3765
+ .label {
3766
+ margin-block-start: var(--size-1);
3767
+ }
3768
+ }
3769
+ }
3770
+ }
3771
+
3772
+ /* Element states */
3773
+ &:hover {
3774
+ &::before {
3775
+ transform: scaleX(1);
3776
+ }
3777
+ }
3778
+ &:focus-within {
3779
+ & input,
3780
+ & textarea,
3781
+ & select {
3782
+ border-block-end-color: var(--_accent-color);
3783
+ }
3784
+
3785
+ &::before {
3786
+ background-color: var(--_accent-color);
3787
+ transform: scaleX(1) translateX(0px);
3788
+ }
3789
+ }
3790
+ }
3791
+
3792
+ /* Disabled */
3793
+ &:where(:has([disabled])) {
3794
+ &::before {
3795
+ display: none;
3796
+ }
3797
+ :where(input, textarea, select) {
3798
+ cursor: not-allowed;
3799
+ opacity: 0.7;
3800
+
3801
+ * {
3802
+ pointer-events: none;
3803
+ }
3804
+ }
3805
+ }
3806
+
3807
+ /* Read-only */
3808
+ &:where(:has([readonly])) {
3809
+ &::before {
3810
+ display: none;
3811
+ }
3812
+ :where(input, textarea, select) {
3813
+ cursor: not-allowed;
3814
+
3815
+ * {
3816
+ pointer-events: none;
3817
+ }
3818
+ }
3819
+ }
3820
+
3821
+ /* Sizes */
3822
+ &.small {
3823
+ --_field-padding-block: var(--size-2);
3824
+ --_height: var(--field-size-small);
3825
+
3826
+ &:has(input[type="color"]) {
3827
+ .label {
3828
+ line-height: 1.5;
3829
+ }
3830
+ }
3831
+
3832
+ &:has(textarea) {
3833
+ .label {
3834
+ align-self: center;
3835
+ margin-block-start: unset;
3836
+ }
3837
+ }
3838
+
3839
+ /*
3840
+ * Label transitions
3841
+ * Triggered by:
3842
+ * - focus
3843
+ * - filled form fields (except color inputs)
3844
+ * - non-empty select options
3845
+ */
3846
+ &:focus-within,
3847
+ &:has(
3848
+ :where(input:not([type="color"]), textarea):not(:placeholder-shown)
3849
+ ),
3850
+ &:has(option[value=""]:not(:checked)),
3851
+ &:has(option:checked:not([value=""])) {
3852
+ .label {
3853
+ margin-block-start: -2.2rem;
3854
+ margin-inline-start: var(--size-1);
3855
+ padding-inline: var(--size-1);
3856
+ }
3857
+
3858
+ &:not(.filled):has(textarea) {
3859
+ .label {
3860
+ margin-block-start: -0.35rem;
3861
+ }
3862
+ }
3863
+ }
3864
+ }
3865
+ }
3866
+ }
3867
+
3868
+ @layer components.extended {
3869
+ :where(.field > select) {
3870
+ position: relative;
3871
+
3872
+ /* Default arrow */
3873
+ &::picker-icon {
3874
+ block-size: 0;
3875
+ border-block-start: 5px solid;
3876
+ border-inline: 5px solid transparent;
3877
+ color: currentColor;
3878
+ content: "";
3879
+ inline-size: 0;
3880
+ inset: 50% var(--size-3) auto auto;
3881
+ pointer-events: none;
3882
+ position: absolute;
3883
+ translate: 0 -50%;
3884
+ }
3885
+
3886
+ &:open {
3887
+ &::picker-icon {
3888
+ rotate: 180deg;
3889
+ }
3890
+ }
3891
+
3892
+ /* Select popover */
3893
+ &::picker(select) {
3894
+ /* Animation on-stage styles */
3895
+ border: 0;
3896
+ box-shadow: var(--shadow-2);
3897
+ opacity: 1;
3898
+ padding: 0;
3899
+ scale: 1;
3900
+
3901
+ /* Animation starting styles */
3902
+ @starting-style {
3903
+ opacity: 0;
3904
+ transform: scale(0.9);
3905
+ }
3906
+
3907
+ @media (prefers-reduced-motion: no-preference) {
3908
+ transition: display 0.2s allow-discrete, opacity 0.2s var(--ease-3),
3909
+ overlay 0.2s allow-discrete, scale 0.2s var(--ease-3);
3910
+ }
3911
+ }
3912
+
3913
+ /* Animation off-stage styles */
3914
+ &:not(:open)::picker(select) {
3915
+ opacity: 0;
3916
+ scale: 0.9;
3917
+ }
3918
+
3919
+ button {
3920
+ background-color: transparent;
3921
+ display: flex;
3922
+ inline-size: 100%;
3923
+ margin: 0;
3924
+ position: relative;
3925
+
3926
+ selectedcontent {
3927
+ overflow: hidden;
3928
+ text-overflow: ellipsis;
3929
+ white-space: nowrap;
3930
+ }
3931
+ }
3932
+
3933
+ .list {
3934
+ /* Groups */
3935
+ [role="group"] {
3936
+ label {
3937
+ background-color: light-dark(var(--gray-3), var(--gray-13));
3938
+ color: light-dark(
3939
+ oklch(from var(--text-color-1) calc(l * 0.75) c h),
3940
+ oklch(from var(--text-color-1) calc(l * 1.25) c h)
3941
+ );
3942
+ font-weight: 500;
3943
+ overflow: hidden;
3944
+ padding-inline: var(--size-2);
3945
+ text-overflow: ellipsis;
3946
+ white-space: nowrap;
3947
+ }
3948
+
3949
+ &:not(:first-child),
3950
+ option:first-of-type {
3951
+ margin-block-start: var(--size-2);
3952
+ }
3953
+
3954
+ option:last-of-type,
3955
+ &:last-child {
3956
+ option:last-of-type {
3957
+ margin-block-end: 0;
3958
+ }
3959
+ }
3960
+ }
3961
+
3962
+ /* Option */
3963
+ option {
3964
+ /* Checkmark */
3965
+ /* TODO - checkmark should be the final version of the checkmark API. Follow the development of this and remove redundant psuedo stuff. */
3966
+ &::check {
3967
+ display: none;
3968
+ }
3969
+ &::checkmark {
3970
+ display: none;
3971
+ }
3972
+ &::before {
3973
+ display: none;
3974
+ }
3975
+
3976
+ &:focus-visible {
3977
+ outline-offset: -1px;
3978
+ }
3979
+ }
3980
+ }
3981
+ }
3982
+
3983
+ :where(.field:has(> select)) {
3984
+ /* Size */
3985
+ &.small {
3986
+ button {
3987
+ padding-block: var(--size-1);
3988
+ padding-inline: var(--size-2) var(--size-7);
3989
+
3990
+ &::after {
3991
+ inset-inline-end: var(--size-2);
3992
+ }
3993
+ }
3994
+ }
3995
+
3996
+ /*
3997
+ * Non-experimental Select
3998
+ *
3999
+ * 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`.
4000
+ */
4001
+ &:not(:has(button)) {
4002
+ select {
4003
+ appearance: none;
4004
+ }
4005
+
4006
+ /* Arrow */
4007
+ &::after {
4008
+ align-self: center;
4009
+ block-size: 0;
4010
+ border-block-start: 5px solid;
4011
+ border-inline: 5px solid transparent;
4012
+ content: "";
4013
+ display: inline-block;
4014
+ flex-shrink: 0;
4015
+ grid-column: 1/-1;
4016
+ grid-row: 1;
4017
+ inline-size: 0;
4018
+ inset-inline-end: var(--size-3);
4019
+ justify-self: end;
4020
+ pointer-events: none;
4021
+ position: relative;
4022
+ }
4023
+ }
4024
+ }
4025
+
4026
+ select:has(button),
4027
+ ::picker(select) {
4028
+ appearance: base-select;
4029
+ }
4030
+ }
4031
+
4032
+ @layer components.extended {
4033
+ :where(
4034
+ .field:has(
4035
+ :where(
4036
+ input[type="date"],
4037
+ input[type="datetime-local"],
4038
+ input[type="email"],
4039
+ input[type="month"],
4040
+ input[type="number"],
4041
+ input[type="password"],
4042
+ input[type="search"],
4043
+ input[type="tel"],
4044
+ input[type="text"],
4045
+ input[type="time"],
4046
+ input[type="url"],
4047
+ input[type="week"]
4048
+ )
4049
+ )
4050
+ ) {
4051
+ /* Sizes */
4052
+ &.small {
4053
+ input {
4054
+ padding-inline: var(--size-2);
4055
+ }
4056
+ }
4057
+ }
4058
+
4059
+ /* Autosuggest */
4060
+ :where(.field:has(input[list])) {
4061
+ /* Hide native arrow */
4062
+ input::-webkit-calendar-picker-indicator {
4063
+ opacity: 0;
4064
+ position: absolute;
4065
+ cursor: pointer;
4066
+ pointer-events: none;
4067
+ }
4068
+ }
4069
+ :where(
4070
+ .field:has(input[list]:placeholder-shown),
4071
+ .field:has(input[list]):where(:focus-within, :hover)
4072
+ ) {
4073
+ /* Arrow */
4074
+ &::after {
4075
+ block-size: 0;
4076
+ border-block-start: 5px solid;
4077
+ border-inline: 5px solid transparent;
4078
+ content: "";
4079
+ display: inline-block;
4080
+ flex-shrink: 0;
4081
+ inline-size: 0;
4082
+ inset: 50% var(--size-3) auto auto;
4083
+ pointer-events: none;
4084
+ position: absolute;
4085
+ translate: 0 -50%;
4086
+ }
4087
+ }
4088
+ }
4089
+
4090
+ @layer components.extended {
4091
+ :where(.field:has(textarea)) {
4092
+ textarea {
4093
+ block-size: auto;
4094
+ field-sizing: content;
4095
+ min-block-size: 5rem;
4096
+ resize: vertical;
4097
+ }
4098
+
4099
+ /* Size */
4100
+ &.small {
4101
+ textarea {
4102
+ min-block-size: var(--_height);
4103
+ }
4104
+ }
4105
+
4106
+ /* Auto-fit */
4107
+ &.auto-fit {
4108
+ textarea {
4109
+ min-block-size: var(--_height);
4110
+ resize: both;
4111
+ }
4112
+ }
4113
+ }
4114
+ }
4115
+
4116
+ @layer components.extended {
4117
+ @scope (.rich-text) to (.not-rich-text) {
4118
+ a {
4119
+ color: var(--primary);
4120
+ cursor: pointer;
4121
+ font-size: inherit;
4122
+ font-weight: 700;
4123
+ line-height: inherit;
4124
+ text-decoration: underline;
4125
+ text-decoration-color: var(--primary);
4126
+ text-underline-offset: 2px;
4127
+
4128
+ &[href] {
4129
+ &:hover,
4130
+ &:focus-visible {
4131
+ color: var(--primary-light);
4132
+ }
4133
+ }
4134
+ }
4135
+
4136
+ /* Blockquote */
4137
+ blockquote {
4138
+ font-size: inherit;
4139
+ line-height: inherit;
4140
+ :first-child {
4141
+ margin-block-start: 0;
4142
+ }
4143
+
4144
+ :last-child {
4145
+ margin-block-end: 0;
4146
+ }
4147
+ }
4148
+
4149
+ /* Text */
4150
+ p {
4151
+ font-size: inherit;
4152
+ line-height: inherit;
4153
+ margin-block: 1.25em;
4154
+ }
4155
+
4156
+ :is(h1, .h1, h2, .h2, h3, .h3, h4, .h4, h5, .h5, h6, .h6) {
4157
+ color: var(--text-color-1);
4158
+
4159
+ & + *:not(&) {
4160
+ margin-block-start: 0;
4161
+ }
4162
+ }
4163
+
4164
+ h1,
4165
+ .h1 {
4166
+ font-size: var(--font-size-h1, var(--font-size-7));
4167
+ letter-spacing: -0.02em;
4168
+ line-height: 1.1111111;
4169
+ margin-block: 0 0.8888889em;
4170
+ }
4171
+
4172
+ h2,
4173
+ .h2 {
4174
+ font-size: var(--font-size-h2, var(--font-size-5, 2rem));
4175
+ letter-spacing: -0.02em;
4176
+ line-height: 1.3333333;
4177
+ margin-block: 2em 1em;
4178
+ }
4179
+
4180
+ h3,
4181
+ .h3 {
4182
+ font-size: var(--font-size-h3, var(--font-size-4, 1.5rem));
4183
+ letter-spacing: -0.01em;
4184
+ line-height: 1.6;
4185
+ margin-block: 1.6em 0.6em;
4186
+ }
4187
+
4188
+ h4,
4189
+ .h4 {
4190
+ font-size: var(--font-size-h4, var(--font-size-3, 1.25rem));
4191
+ letter-spacing: -0.01em;
4192
+ line-height: 1.5;
4193
+ margin-block: 1.5em 0.5em;
4194
+ }
4195
+
4196
+ h5,
4197
+ .h5 {
4198
+ font-size: var(--font-size-h5, var(--font-size-2, 1.1rem));
4199
+ line-height: 1;
4200
+ margin-block: 0 var(--size-1);
4201
+ }
4202
+
4203
+ h6,
4204
+ .h6 {
4205
+ font-size: var(--font-size-h6, var(--font-size-1, 1rem));
4206
+ line-height: 1;
4207
+ margin-block: 0 var(--size-1);
4208
+ }
4209
+
4210
+ /** Overline */
4211
+ :where(.overline, hgroup > :where(p, .p):first-of-type:first-child) {
4212
+ color: light-dark(
4213
+ oklch(from var(--text-color-2) calc(l * 1.25) c h),
4214
+ oklch(from var(--text-color-2) calc(l * 0.75) c h)
4215
+ );
4216
+ font-size: var(--font-size-xs);
4217
+ font-weight: 500;
4218
+ letter-spacing: 0.06em;
4219
+ line-height: 2.5;
4220
+ text-transform: uppercase;
4221
+ }
4222
+
4223
+ hgroup {
4224
+ & > p {
4225
+ margin: 0;
4226
+ }
4227
+
4228
+ & > :where(h1, .h1, h2, .h2, h3, .h3, h4, .h4, h5, .h5, h6, .h6) {
4229
+ margin-block-end: 0.4em;
4230
+ }
4231
+
4232
+ & + * {
4233
+ margin-block-start: 3em;
4234
+ }
4235
+
4236
+ /* The second p element */
4237
+ & > :where(p, .p):last-of-type:last-child:not(:first-child) {
4238
+ color: oklch(from currentColor l c h / 75%);
4239
+ font-size: var(--font-size-lg);
4240
+ line-height: 1.6;
4241
+ }
4242
+ }
4243
+
4244
+ /* Lists */
4245
+ ul:not([class]) {
4246
+ list-style-type: disc;
4247
+ }
4248
+
4249
+ ol:not([class]) {
4250
+ list-style-type: decimal;
4251
+ }
4252
+
4253
+ :where(ul, ol):not([class]) {
4254
+ display: grid;
4255
+ font-size: inherit;
4256
+ gap: 0.5em;
4257
+ line-height: inherit;
4258
+ margin-block-start: 1.25em;
4259
+ margin-block-end: 1.25em;
4260
+ padding-inline-start: 1.625em;
4261
+
4262
+ li {
4263
+ padding-inline-start: 0.375em;
4264
+ }
4265
+ }
4266
+
4267
+ /* Nested lists */
4268
+ :where(ul ul),
4269
+ :where(ul ol),
4270
+ :where(ol ul),
4271
+ :where(ol ol) {
4272
+ margin-block-start: 0.75em;
4273
+ margin-block-end: 0.75em;
4274
+ }
4275
+
4276
+ /* Description lists */
4277
+ :where(dl) {
4278
+ font-size: inherit;
4279
+ line-height: inherit;
4280
+ margin-block-start: 1.25em;
4281
+ margin-block-end: 1.25em;
4282
+
4283
+ dt {
4284
+ margin-block-start: 1.25em;
4285
+ }
4286
+
4287
+ dd {
4288
+ margin-block-start: 0.5em;
4289
+ padding-inline-start: 1.625em;
4290
+ }
4291
+ }
4292
+
4293
+ /* Figures */
4294
+ figure {
4295
+ margin-block: 2em;
4296
+
4297
+ & > * {
4298
+ margin-block: 0;
4299
+ }
4300
+
4301
+ & figcaption {
4302
+ font-size: 0.875em;
4303
+ line-height: 1.4285714;
4304
+ margin-block-start: 0.8571429em;
4305
+ }
4306
+ }
4307
+
4308
+ /* Remove top margin from first child */
4309
+ & > :first-child {
4310
+ margin-block-start: 0;
4311
+ }
4312
+
4313
+ /* Remove bottom margin from last child */
4314
+ & > :last-child {
4315
+ margin-block-end: 0;
4316
+ }
4317
+
4318
+ /* Horizontal rules */
4319
+ hr {
4320
+ & + * {
4321
+ margin-block-start: 0;
4322
+ }
4323
+ }
4324
+ }
4325
+ }
4326
+
4327
+ /* Utils */
4328
+
4329
+ @layer utils {
4330
+ /*
4331
+ Screen-reader only
4332
+ When you visibly want to hide an element but make it accessible for screen readers.
4333
+ */
4334
+ .sr-only {
4335
+ block-size: 1px;
4336
+ clip-path: inset(50%);
4337
+ inline-size: 1px;
4338
+ overflow: hidden;
4339
+ position: absolute;
4340
+ white-space: nowrap;
4341
+ }
4342
+
4343
+ /* Hover and active effect for checkbox, radio and icon buttons */
4344
+ :where(.checkbox input, .radio input, .icon-button) {
4345
+ --isLTR: 1;
4346
+ --isRTL: -1;
4347
+
4348
+ position: relative;
4349
+ transform-style: preserve-3d;
4350
+
4351
+ &:dir(rtl) {
4352
+ --isLTR: -1;
4353
+ --isRTL: 1;
4354
+ }
4355
+
4356
+ &:where(:not([disabled])) {
4357
+ &:hover:before {
4358
+ --thumb-scale: 1;
4359
+ }
4360
+
4361
+ &:active:before {
4362
+ --thumb-scale: 1.1;
4363
+ }
4364
+
4365
+ &::before {
4366
+ --thumb-scale: 0.01;
4367
+ --highlight-size: 150%;
4368
+
4369
+ background-color: oklch(0.6 0 0 / 0.2);
4370
+ block-size: var(--highlight-size);
4371
+ clip-path: circle(50%);
4372
+ content: "";
4373
+ inline-size: var(--highlight-size);
4374
+ inset-block-start: 50%;
4375
+ inset-inline-start: 50%;
4376
+ position: absolute;
4377
+ transform-origin: center center;
4378
+ transform: translateX(calc(var(--isRTL) * 50%)) translateY(-50%)
4379
+ translateZ(-1px) scale(var(--thumb-scale));
4380
+ will-change: transform;
4381
+
4382
+ @media (prefers-reduced-motion: no-preference) {
4383
+ transition: transform 0.2s ease;
4384
+ }
4385
+ }
4386
+ }
4387
+ }
4388
+ }