opui-css 3.1.1 → 3.2.0

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