@caffeinebounce/ui 0.62.2
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.
- package/LICENSE +21 -0
- package/README.md +39 -0
- package/dist/FinancialStatementTable-BNUrdTU4.d.cts +249 -0
- package/dist/FinancialStatementTable-BNUrdTU4.d.ts +249 -0
- package/dist/NewsletterSignup-BPreFi5W.d.cts +37 -0
- package/dist/NewsletterSignup-BPreFi5W.d.ts +37 -0
- package/dist/TestimonialsSection-DtPu2OeR.d.ts +736 -0
- package/dist/TestimonialsSection-z-yotRfv.d.cts +736 -0
- package/dist/UnifiedTableControls-CG299y9h.d.ts +1233 -0
- package/dist/UnifiedTableControls-CIjRpNhy.d.cts +1233 -0
- package/dist/blog.d.cts +99 -0
- package/dist/blog.d.ts +99 -0
- package/dist/blog.js +292 -0
- package/dist/blog.mjs +279 -0
- package/dist/button-BHnoRUkF.d.cts +34 -0
- package/dist/button-BHnoRUkF.d.ts +34 -0
- package/dist/charts.d.cts +80 -0
- package/dist/charts.d.ts +80 -0
- package/dist/charts.js +19 -0
- package/dist/charts.mjs +2 -0
- package/dist/chunk-33JR5SYE.js +44 -0
- package/dist/chunk-3NDB4YPC.js +247 -0
- package/dist/chunk-5RW4PYZ6.js +1504 -0
- package/dist/chunk-5THF4YP6.mjs +155 -0
- package/dist/chunk-6BUBNZPG.mjs +164 -0
- package/dist/chunk-6DVWMJ3H.mjs +7029 -0
- package/dist/chunk-6TGV2DNP.js +120 -0
- package/dist/chunk-72JGQ7IJ.mjs +1498 -0
- package/dist/chunk-7DHKQODW.mjs +2932 -0
- package/dist/chunk-7IKHZKAC.js +160 -0
- package/dist/chunk-ADIDI7AJ.js +11 -0
- package/dist/chunk-BFWX5GJZ.mjs +940 -0
- package/dist/chunk-BMFQG6RA.mjs +5537 -0
- package/dist/chunk-C4UT5V3P.js +65 -0
- package/dist/chunk-CC4KUIKC.js +2004 -0
- package/dist/chunk-D3QXPL47.mjs +1814 -0
- package/dist/chunk-DQWHYBV2.js +36 -0
- package/dist/chunk-E42B4GSB.js +993 -0
- package/dist/chunk-ESZ7CBA2.js +1007 -0
- package/dist/chunk-EYJJQVV4.js +111 -0
- package/dist/chunk-FRRS2YZH.mjs +129 -0
- package/dist/chunk-G5TQWWQA.mjs +37 -0
- package/dist/chunk-GAIQJCAZ.js +5612 -0
- package/dist/chunk-GMBGWOCR.mjs +48 -0
- package/dist/chunk-GUSTCU2W.mjs +105 -0
- package/dist/chunk-HBLKVQIQ.mjs +23 -0
- package/dist/chunk-HMAMMC72.js +26 -0
- package/dist/chunk-IMKLN273.mjs +9 -0
- package/dist/chunk-J6OLBSZR.js +250 -0
- package/dist/chunk-JAE45W2T.js +28 -0
- package/dist/chunk-JORVSG52.js +606 -0
- package/dist/chunk-KB7UXIQZ.mjs +984 -0
- package/dist/chunk-KGGQ5NZV.js +186 -0
- package/dist/chunk-KHCC5UKW.mjs +22 -0
- package/dist/chunk-KRRIRS6A.mjs +1945 -0
- package/dist/chunk-LQCVRWVF.js +48 -0
- package/dist/chunk-MHZXUOGN.mjs +168 -0
- package/dist/chunk-MPZFPU4X.js +349 -0
- package/dist/chunk-MVYRNJA6.js +74 -0
- package/dist/chunk-N6AFNFZR.mjs +565 -0
- package/dist/chunk-OFQLWSUR.mjs +214 -0
- package/dist/chunk-OLAAXLXY.mjs +219 -0
- package/dist/chunk-OZZWDIOY.js +1859 -0
- package/dist/chunk-PZRI43EZ.js +111 -0
- package/dist/chunk-Q256HRYD.js +176 -0
- package/dist/chunk-Q52ZEL62.mjs +223 -0
- package/dist/chunk-R26Y7LGJ.js +142 -0
- package/dist/chunk-RBUYW6QQ.js +39 -0
- package/dist/chunk-RVEFPVZF.mjs +43 -0
- package/dist/chunk-SORWLKOK.js +96 -0
- package/dist/chunk-STEP6C4C.mjs +33 -0
- package/dist/chunk-T5R6HUDG.mjs +22 -0
- package/dist/chunk-T6ZBA6VJ.js +7109 -0
- package/dist/chunk-UM7WMXIU.js +2995 -0
- package/dist/chunk-VBD4Q5LL.mjs +117 -0
- package/dist/chunk-WOITB4JL.js +195 -0
- package/dist/chunk-YKZEKJMZ.mjs +71 -0
- package/dist/chunk-YL7RZRHM.mjs +103 -0
- package/dist/chunk-YSLD2HLP.mjs +346 -0
- package/dist/chunk-ZFLZA7UP.mjs +140 -0
- package/dist/chunk-ZKUIUE7W.mjs +26 -0
- package/dist/chunk-ZOA7B32D.js +248 -0
- package/dist/data-table.d.cts +46 -0
- package/dist/data-table.d.ts +46 -0
- package/dist/data-table.js +270 -0
- package/dist/data-table.mjs +13 -0
- package/dist/editor.d.cts +89 -0
- package/dist/editor.d.ts +89 -0
- package/dist/editor.js +10 -0
- package/dist/editor.mjs +1 -0
- package/dist/forms.d.cts +142 -0
- package/dist/forms.d.ts +142 -0
- package/dist/forms.js +24 -0
- package/dist/forms.mjs +11 -0
- package/dist/hooks-8ORd7T1A.d.cts +751 -0
- package/dist/hooks-B2jU1GVT.d.ts +751 -0
- package/dist/hooks.d.cts +6 -0
- package/dist/hooks.d.ts +6 -0
- package/dist/hooks.js +99 -0
- package/dist/hooks.mjs +10 -0
- package/dist/index.d.cts +3141 -0
- package/dist/index.d.ts +3141 -0
- package/dist/index.js +7332 -0
- package/dist/index.mjs +5876 -0
- package/dist/layouts-DPfDDF53.d.cts +1001 -0
- package/dist/layouts-DPfDDF53.d.ts +1001 -0
- package/dist/layouts.d.cts +4 -0
- package/dist/layouts.d.ts +4 -0
- package/dist/layouts.js +100 -0
- package/dist/layouts.mjs +11 -0
- package/dist/marketing-3d.d.cts +51 -0
- package/dist/marketing-3d.d.ts +51 -0
- package/dist/marketing-3d.js +553 -0
- package/dist/marketing-3d.mjs +526 -0
- package/dist/marketing.d.cts +583 -0
- package/dist/marketing.d.ts +583 -0
- package/dist/marketing.js +299 -0
- package/dist/marketing.mjs +10 -0
- package/dist/media.d.cts +29 -0
- package/dist/media.d.ts +29 -0
- package/dist/media.js +189 -0
- package/dist/media.mjs +182 -0
- package/dist/navigation.d.cts +591 -0
- package/dist/navigation.d.ts +591 -0
- package/dist/navigation.js +108 -0
- package/dist/navigation.mjs +15 -0
- package/dist/portal.d.cts +58 -0
- package/dist/portal.d.ts +58 -0
- package/dist/portal.js +403 -0
- package/dist/portal.mjs +395 -0
- package/dist/primitives.d.cts +508 -0
- package/dist/primitives.d.ts +508 -0
- package/dist/primitives.js +295 -0
- package/dist/primitives.mjs +14 -0
- package/dist/settings.d.cts +216 -0
- package/dist/settings.d.ts +216 -0
- package/dist/settings.js +34 -0
- package/dist/settings.mjs +9 -0
- package/dist/shared-Dqn36QHZ.d.cts +4 -0
- package/dist/shared-Dqn36QHZ.d.ts +4 -0
- package/dist/styles.css +1213 -0
- package/package.json +189 -0
- package/styles.css +1 -0
package/dist/styles.css
ADDED
|
@@ -0,0 +1,1213 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @caffeinebounce/ui Base Styles
|
|
3
|
+
*
|
|
4
|
+
* Import this in your app's globals.css after @import "tailwindcss":
|
|
5
|
+
*
|
|
6
|
+
* @import "tailwindcss";
|
|
7
|
+
* @import "@caffeinebounce/ui/styles.css";
|
|
8
|
+
*
|
|
9
|
+
* // Required plugins (must be in app's CSS for proper resolution)
|
|
10
|
+
* @plugin "tailwindcss-animate";
|
|
11
|
+
* @plugin "@tailwindcss/typography";
|
|
12
|
+
*
|
|
13
|
+
* Then add your product-specific @source directives and overrides.
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
/* Dark mode variant - enables dark: prefix classes */
|
|
17
|
+
@custom-variant dark (&:is(.dark *));
|
|
18
|
+
|
|
19
|
+
/* ===========================================
|
|
20
|
+
CSS Custom Properties (Variables)
|
|
21
|
+
Products can override these in their own :root block
|
|
22
|
+
=========================================== */
|
|
23
|
+
|
|
24
|
+
:root {
|
|
25
|
+
/* Border radius scale */
|
|
26
|
+
--radius: 0.625rem;
|
|
27
|
+
--box-radius: var(--radius);
|
|
28
|
+
|
|
29
|
+
/* Layout variables - centralized width settings */
|
|
30
|
+
--layout-max-width: 1280px;
|
|
31
|
+
--layout-max-width-narrow: 640px;
|
|
32
|
+
--layout-max-width-wide: 1536px;
|
|
33
|
+
--layout-padding-mobile: 1rem;
|
|
34
|
+
--layout-padding-tablet: 1.5rem;
|
|
35
|
+
--layout-padding-desktop: 2rem;
|
|
36
|
+
--layout-navbar-height: 56px;
|
|
37
|
+
|
|
38
|
+
/* Sidebar variables */
|
|
39
|
+
--sidebar-width: 16rem;
|
|
40
|
+
--sidebar-width-mobile: 18rem;
|
|
41
|
+
--sidebar-width-icon: 3rem;
|
|
42
|
+
|
|
43
|
+
/* Typography - base */
|
|
44
|
+
--text-base: 0.875rem;
|
|
45
|
+
|
|
46
|
+
/* CTA buttons */
|
|
47
|
+
--button-cta-font-family: var(
|
|
48
|
+
--font-sans,
|
|
49
|
+
ui-sans-serif,
|
|
50
|
+
system-ui,
|
|
51
|
+
sans-serif
|
|
52
|
+
);
|
|
53
|
+
--button-cta-font-weight: 500;
|
|
54
|
+
--button-cta-letter-spacing: 0;
|
|
55
|
+
--button-cta-text-transform: none;
|
|
56
|
+
--button-cta-theme-overlay-opacity: 1;
|
|
57
|
+
--button-cta-theme-overlay-hover-opacity: 1;
|
|
58
|
+
--button-cta-theme-overlay-offset: calc(100% + 2px);
|
|
59
|
+
--button-cta-theme-hover-scale: 1;
|
|
60
|
+
--button-cta-theme-hover-shadow: none;
|
|
61
|
+
|
|
62
|
+
--button-default-bg: var(--primary);
|
|
63
|
+
--button-default-fg: var(--primary-foreground);
|
|
64
|
+
--button-default-border: transparent;
|
|
65
|
+
--button-default-hover-bg: color-mix(in srgb, var(--primary) 90%, black);
|
|
66
|
+
--button-default-hover-fg: var(--primary-foreground);
|
|
67
|
+
--button-default-hover-border: transparent;
|
|
68
|
+
--button-default-active-bg: color-mix(in srgb, var(--primary) 82%, black);
|
|
69
|
+
--button-default-active-fg: var(--primary-foreground);
|
|
70
|
+
--button-default-active-border: transparent;
|
|
71
|
+
|
|
72
|
+
--button-outline-bg: var(--background);
|
|
73
|
+
--button-outline-fg: var(--foreground);
|
|
74
|
+
--button-outline-border: var(--border);
|
|
75
|
+
--button-outline-hover-bg: var(--accent);
|
|
76
|
+
--button-outline-hover-fg: var(--accent-foreground);
|
|
77
|
+
--button-outline-hover-border: var(--border);
|
|
78
|
+
--button-outline-active-bg: color-mix(in srgb, var(--accent) 90%, black);
|
|
79
|
+
--button-outline-active-fg: var(--accent-foreground);
|
|
80
|
+
--button-outline-active-border: var(--border);
|
|
81
|
+
|
|
82
|
+
--button-secondary-bg: var(--secondary);
|
|
83
|
+
--button-secondary-fg: var(--secondary-foreground);
|
|
84
|
+
--button-secondary-border: transparent;
|
|
85
|
+
--button-secondary-hover-bg: color-mix(in srgb, var(--secondary) 90%, black);
|
|
86
|
+
--button-secondary-hover-fg: var(--secondary-foreground);
|
|
87
|
+
--button-secondary-hover-border: transparent;
|
|
88
|
+
--button-secondary-active-bg: color-mix(in srgb, var(--secondary) 82%, black);
|
|
89
|
+
--button-secondary-active-fg: var(--secondary-foreground);
|
|
90
|
+
--button-secondary-active-border: transparent;
|
|
91
|
+
|
|
92
|
+
--button-premium-bg: white;
|
|
93
|
+
--button-premium-fg: black;
|
|
94
|
+
--button-premium-border: white;
|
|
95
|
+
--button-premium-hover-bg: var(--primary);
|
|
96
|
+
--button-premium-hover-fg: var(--primary-foreground);
|
|
97
|
+
--button-premium-hover-border: var(--primary);
|
|
98
|
+
--button-premium-active-bg: color-mix(in srgb, var(--primary) 86%, black);
|
|
99
|
+
--button-premium-active-fg: var(--primary-foreground);
|
|
100
|
+
--button-premium-active-border: color-mix(in srgb, var(--primary) 86%, black);
|
|
101
|
+
|
|
102
|
+
/* ===========================================
|
|
103
|
+
Brand Customization Variables (Phase 2)
|
|
104
|
+
Products can override these for differentiation
|
|
105
|
+
=========================================== */
|
|
106
|
+
|
|
107
|
+
/* Brand accent - secondary brand color for highlights, gradients */
|
|
108
|
+
--brand-accent: var(--primary);
|
|
109
|
+
|
|
110
|
+
/* Brand gradients - for hero sections, buttons, backgrounds */
|
|
111
|
+
--brand-gradient-from: var(--primary);
|
|
112
|
+
--brand-gradient-to: var(--brand-accent);
|
|
113
|
+
|
|
114
|
+
/* Highlight color - for text highlights, selections */
|
|
115
|
+
--highlight-color: oklch(0.95 0.05 90);
|
|
116
|
+
|
|
117
|
+
/*
|
|
118
|
+
* Shadow intensity - multiplier for shadow depth (0.5 = subtle, 1.5 = dramatic)
|
|
119
|
+
* Usage: Apply in custom shadow definitions, e.g.:
|
|
120
|
+
* box-shadow: 0 4px calc(12px * var(--shadow-intensity)) rgba(0,0,0,0.1);
|
|
121
|
+
* Products can override to create subtler or more dramatic shadow effects.
|
|
122
|
+
*/
|
|
123
|
+
--shadow-intensity: 1;
|
|
124
|
+
|
|
125
|
+
/* Typography customization */
|
|
126
|
+
--font-headers: var(--font-sans);
|
|
127
|
+
--font-display: var(--font-sans);
|
|
128
|
+
--heading-weight: 600;
|
|
129
|
+
--heading-tracking: -0.025em;
|
|
130
|
+
|
|
131
|
+
/*
|
|
132
|
+
* Spacing scale - multiplier for consistent spacing adjustments
|
|
133
|
+
* Usage: Apply in custom spacing calculations, e.g.:
|
|
134
|
+
* padding: calc(1rem * var(--spacing-scale));
|
|
135
|
+
* Products can override to create tighter (0.875) or looser (1.125) layouts.
|
|
136
|
+
*/
|
|
137
|
+
--spacing-scale: 1;
|
|
138
|
+
|
|
139
|
+
/* ===========================================
|
|
140
|
+
Semantic Color Tokens (Light Mode)
|
|
141
|
+
Override --primary for brand customization
|
|
142
|
+
=========================================== */
|
|
143
|
+
|
|
144
|
+
--background: oklch(1 0 0);
|
|
145
|
+
--foreground: oklch(0.145 0 0);
|
|
146
|
+
|
|
147
|
+
--card: oklch(1 0 0);
|
|
148
|
+
--card-foreground: oklch(0.145 0 0);
|
|
149
|
+
|
|
150
|
+
--popover: oklch(1 0 0);
|
|
151
|
+
--popover-foreground: oklch(0.145 0 0);
|
|
152
|
+
|
|
153
|
+
/* Primary - override this for brand color */
|
|
154
|
+
--primary: oklch(0.205 0 0);
|
|
155
|
+
--primary-foreground: oklch(0.985 0 0);
|
|
156
|
+
|
|
157
|
+
--secondary: oklch(0.97 0 0);
|
|
158
|
+
--secondary-foreground: oklch(0.205 0 0);
|
|
159
|
+
|
|
160
|
+
--muted: oklch(0.97 0 0);
|
|
161
|
+
--muted-foreground: oklch(0.556 0 0);
|
|
162
|
+
|
|
163
|
+
--accent: oklch(0.97 0 0);
|
|
164
|
+
--accent-foreground: oklch(0.205 0 0);
|
|
165
|
+
|
|
166
|
+
--destructive: oklch(0.577 0.245 27.325);
|
|
167
|
+
--success: oklch(0.527 0.154 150.069);
|
|
168
|
+
|
|
169
|
+
--border: oklch(0.922 0 0);
|
|
170
|
+
--input: oklch(0.922 0 0);
|
|
171
|
+
--ring: oklch(0.708 0 0);
|
|
172
|
+
|
|
173
|
+
/* Chart colors */
|
|
174
|
+
--chart-1: oklch(0.646 0.222 41.116);
|
|
175
|
+
--chart-2: oklch(0.6 0.118 184.704);
|
|
176
|
+
--chart-3: oklch(0.398 0.07 227.392);
|
|
177
|
+
--chart-4: oklch(0.828 0.189 84.429);
|
|
178
|
+
--chart-5: oklch(0.769 0.188 70.08);
|
|
179
|
+
|
|
180
|
+
/* Sidebar colors */
|
|
181
|
+
--sidebar: oklch(1 0 0);
|
|
182
|
+
--sidebar-foreground: oklch(0.145 0 0);
|
|
183
|
+
--sidebar-primary: oklch(0.205 0 0);
|
|
184
|
+
--sidebar-primary-foreground: oklch(0.985 0 0);
|
|
185
|
+
--sidebar-accent: oklch(0.97 0 0);
|
|
186
|
+
--sidebar-accent-foreground: oklch(0.205 0 0);
|
|
187
|
+
--sidebar-border: oklch(0.922 0 0);
|
|
188
|
+
--sidebar-ring: oklch(0.708 0 0);
|
|
189
|
+
|
|
190
|
+
/* Icon colors */
|
|
191
|
+
--icon: oklch(0.45 0 0);
|
|
192
|
+
--icon-hover: oklch(0.145 0 0);
|
|
193
|
+
|
|
194
|
+
/* Neutral colors for effects */
|
|
195
|
+
--color-neutral-100: oklch(0.97 0 0);
|
|
196
|
+
--color-neutral-300: oklch(0.87 0 0);
|
|
197
|
+
--color-neutral-500: oklch(0.55 0 0);
|
|
198
|
+
|
|
199
|
+
/* BackgroundRippleEffect component colors */
|
|
200
|
+
--cell-border-color: oklch(0.92 0 0);
|
|
201
|
+
--cell-fill-color: oklch(0.98 0 0);
|
|
202
|
+
--cell-shadow-color: oklch(0.85 0 0);
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
/* ===========================================
|
|
206
|
+
Dark Mode Color Overrides
|
|
207
|
+
=========================================== */
|
|
208
|
+
|
|
209
|
+
.dark {
|
|
210
|
+
--background: oklch(0 0 0);
|
|
211
|
+
--foreground: oklch(1 0 0);
|
|
212
|
+
|
|
213
|
+
--card: oklch(0.145 0 0);
|
|
214
|
+
--card-foreground: oklch(1 0 0);
|
|
215
|
+
|
|
216
|
+
--popover: oklch(0.145 0 0);
|
|
217
|
+
--popover-foreground: oklch(1 0 0);
|
|
218
|
+
|
|
219
|
+
/*
|
|
220
|
+
* Primary colors: NOT overridden in dark mode.
|
|
221
|
+
* This allows brand colors set in :root to work consistently in both modes.
|
|
222
|
+
* Products with dark brand primaries (L < 0.7) get white text automatically.
|
|
223
|
+
* If you need white buttons in dark mode, override in your product CSS:
|
|
224
|
+
* .dark { --primary: oklch(1 0 0); --primary-foreground: oklch(0 0 0); }
|
|
225
|
+
*/
|
|
226
|
+
|
|
227
|
+
--secondary: oklch(0.205 0 0);
|
|
228
|
+
--secondary-foreground: oklch(1 0 0);
|
|
229
|
+
|
|
230
|
+
--muted: oklch(0.205 0 0);
|
|
231
|
+
--muted-foreground: oklch(0.7 0 0);
|
|
232
|
+
|
|
233
|
+
--accent: oklch(1 0 0 / 0.15);
|
|
234
|
+
--accent-foreground: oklch(1 0 0);
|
|
235
|
+
|
|
236
|
+
--destructive: oklch(0.704 0.191 22.216);
|
|
237
|
+
--success: oklch(0.627 0.194 149.214);
|
|
238
|
+
|
|
239
|
+
--border: oklch(1 0 0 / 0.15);
|
|
240
|
+
--input: oklch(1 0 0 / 0.15);
|
|
241
|
+
--ring: oklch(0.556 0 0);
|
|
242
|
+
|
|
243
|
+
/* Chart colors - dark mode */
|
|
244
|
+
--chart-1: oklch(0.488 0.243 264.376);
|
|
245
|
+
--chart-2: oklch(0.696 0.17 162.48);
|
|
246
|
+
--chart-3: oklch(0.769 0.188 70.08);
|
|
247
|
+
--chart-4: oklch(0.627 0.265 303.9);
|
|
248
|
+
--chart-5: oklch(0.645 0.246 16.439);
|
|
249
|
+
|
|
250
|
+
/* Sidebar colors - dark mode */
|
|
251
|
+
--sidebar: oklch(0 0 0);
|
|
252
|
+
--sidebar-foreground: oklch(1 0 0);
|
|
253
|
+
/* Sidebar primary inherits from :root for brand consistency */
|
|
254
|
+
--sidebar-accent: oklch(1 0 0 / 0.1);
|
|
255
|
+
--sidebar-accent-foreground: oklch(1 0 0);
|
|
256
|
+
--sidebar-border: oklch(1 0 0 / 0.15);
|
|
257
|
+
--sidebar-ring: oklch(0.556 0 0);
|
|
258
|
+
|
|
259
|
+
/* Icon colors - dark mode */
|
|
260
|
+
--icon: oklch(1 0 0 / 0.7);
|
|
261
|
+
--icon-hover: oklch(1 0 0);
|
|
262
|
+
|
|
263
|
+
--button-outline-bg: color-mix(in srgb, var(--input) 30%, transparent);
|
|
264
|
+
--button-outline-border: var(--input);
|
|
265
|
+
--button-outline-hover-bg: color-mix(in srgb, var(--input) 50%, transparent);
|
|
266
|
+
--button-outline-hover-fg: var(--foreground);
|
|
267
|
+
--button-outline-hover-border: var(--input);
|
|
268
|
+
--button-outline-active-bg: color-mix(in srgb, var(--input) 65%, transparent);
|
|
269
|
+
--button-outline-active-fg: var(--foreground);
|
|
270
|
+
--button-outline-active-border: var(--input);
|
|
271
|
+
|
|
272
|
+
/* BackgroundRippleEffect - dark mode */
|
|
273
|
+
--cell-border-color: oklch(1 0 0 / 0.2);
|
|
274
|
+
--cell-fill-color: oklch(1 0 0 / 0.08);
|
|
275
|
+
--cell-shadow-color: oklch(1 0 0 / 0.1);
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
/* ===========================================
|
|
279
|
+
Data-Theme Attribute Support (Phase 2)
|
|
280
|
+
Enables theme switching via data-theme attribute
|
|
281
|
+
Works alongside existing .dark class pattern
|
|
282
|
+
=========================================== */
|
|
283
|
+
|
|
284
|
+
/*
|
|
285
|
+
* Light theme (explicit)
|
|
286
|
+
* Intentionally only sets color-scheme and relies on :root for all color variables.
|
|
287
|
+
* This ensures that switching from other data-theme values correctly falls back to
|
|
288
|
+
* the base light theme defined in :root. Keep :root in sync with desired light palette.
|
|
289
|
+
*/
|
|
290
|
+
[data-theme="light"] {
|
|
291
|
+
color-scheme: light;
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
/*
|
|
295
|
+
* Dark theme via data-theme attribute
|
|
296
|
+
* Note: These values intentionally duplicate .dark class for completeness.
|
|
297
|
+
* This allows the data-theme system to work independently of the .dark class,
|
|
298
|
+
* enabling pure attribute-based theming without relying on class toggling.
|
|
299
|
+
* The ThemeProvider adds both for backward compatibility, but new implementations
|
|
300
|
+
* can use data-theme exclusively.
|
|
301
|
+
*/
|
|
302
|
+
[data-theme="dark"] {
|
|
303
|
+
color-scheme: dark;
|
|
304
|
+
--background: oklch(0 0 0);
|
|
305
|
+
--foreground: oklch(1 0 0);
|
|
306
|
+
--card: oklch(0.145 0 0);
|
|
307
|
+
--card-foreground: oklch(1 0 0);
|
|
308
|
+
--popover: oklch(0.145 0 0);
|
|
309
|
+
--popover-foreground: oklch(1 0 0);
|
|
310
|
+
--secondary: oklch(0.205 0 0);
|
|
311
|
+
--secondary-foreground: oklch(1 0 0);
|
|
312
|
+
--muted: oklch(0.205 0 0);
|
|
313
|
+
--muted-foreground: oklch(0.7 0 0);
|
|
314
|
+
--accent: oklch(1 0 0 / 0.15);
|
|
315
|
+
--accent-foreground: oklch(1 0 0);
|
|
316
|
+
--destructive: oklch(0.704 0.191 22.216);
|
|
317
|
+
--success: oklch(0.627 0.194 149.214);
|
|
318
|
+
--border: oklch(1 0 0 / 0.15);
|
|
319
|
+
--input: oklch(1 0 0 / 0.15);
|
|
320
|
+
--ring: oklch(0.556 0 0);
|
|
321
|
+
--chart-1: oklch(0.488 0.243 264.376);
|
|
322
|
+
--chart-2: oklch(0.696 0.17 162.48);
|
|
323
|
+
--chart-3: oklch(0.769 0.188 70.08);
|
|
324
|
+
--chart-4: oklch(0.627 0.265 303.9);
|
|
325
|
+
--chart-5: oklch(0.645 0.246 16.439);
|
|
326
|
+
--sidebar: oklch(0 0 0);
|
|
327
|
+
--sidebar-foreground: oklch(1 0 0);
|
|
328
|
+
--sidebar-accent: oklch(1 0 0 / 0.1);
|
|
329
|
+
--sidebar-accent-foreground: oklch(1 0 0);
|
|
330
|
+
--sidebar-border: oklch(1 0 0 / 0.15);
|
|
331
|
+
--sidebar-ring: oklch(0.556 0 0);
|
|
332
|
+
--icon: oklch(1 0 0 / 0.7);
|
|
333
|
+
--icon-hover: oklch(1 0 0);
|
|
334
|
+
--button-outline-bg: color-mix(in srgb, var(--input) 30%, transparent);
|
|
335
|
+
--button-outline-border: var(--input);
|
|
336
|
+
--button-outline-hover-bg: color-mix(in srgb, var(--input) 50%, transparent);
|
|
337
|
+
--button-outline-hover-fg: var(--foreground);
|
|
338
|
+
--button-outline-hover-border: var(--input);
|
|
339
|
+
--button-outline-active-bg: color-mix(in srgb, var(--input) 65%, transparent);
|
|
340
|
+
--button-outline-active-fg: var(--foreground);
|
|
341
|
+
--button-outline-active-border: var(--input);
|
|
342
|
+
--highlight-color: oklch(0.3 0.05 90);
|
|
343
|
+
--cell-border-color: oklch(1 0 0 / 0.2);
|
|
344
|
+
--cell-fill-color: oklch(1 0 0 / 0.08);
|
|
345
|
+
--cell-shadow-color: oklch(1 0 0 / 0.1);
|
|
346
|
+
}
|
|
347
|
+
|
|
348
|
+
/* Colorful theme - vibrant, saturated colors */
|
|
349
|
+
[data-theme="colorful"] {
|
|
350
|
+
color-scheme: light;
|
|
351
|
+
--background: oklch(0.99 0.01 280);
|
|
352
|
+
--foreground: oklch(0.2 0.02 280);
|
|
353
|
+
--card: oklch(1 0 0);
|
|
354
|
+
--card-foreground: oklch(0.2 0.02 280);
|
|
355
|
+
--muted: oklch(0.95 0.02 280);
|
|
356
|
+
--muted-foreground: oklch(0.5 0.03 280);
|
|
357
|
+
--accent: oklch(0.92 0.05 200);
|
|
358
|
+
--accent-foreground: oklch(0.2 0.02 200);
|
|
359
|
+
--highlight-color: oklch(0.92 0.1 90);
|
|
360
|
+
}
|
|
361
|
+
|
|
362
|
+
/* High contrast theme - designed for strong contrast (WCAG-focused) */
|
|
363
|
+
[data-theme="high-contrast"] {
|
|
364
|
+
color-scheme: light;
|
|
365
|
+
--background: oklch(1 0 0);
|
|
366
|
+
--foreground: oklch(0 0 0);
|
|
367
|
+
--card: oklch(1 0 0);
|
|
368
|
+
--card-foreground: oklch(0 0 0);
|
|
369
|
+
--popover: oklch(1 0 0);
|
|
370
|
+
--popover-foreground: oklch(0 0 0);
|
|
371
|
+
--primary: oklch(0.1 0 0);
|
|
372
|
+
--primary-foreground: oklch(1 0 0);
|
|
373
|
+
--secondary: oklch(0.95 0 0);
|
|
374
|
+
--secondary-foreground: oklch(0 0 0);
|
|
375
|
+
--muted: oklch(0.9 0 0);
|
|
376
|
+
--muted-foreground: oklch(0.2 0 0);
|
|
377
|
+
--accent: oklch(0.9 0 0);
|
|
378
|
+
--accent-foreground: oklch(0 0 0);
|
|
379
|
+
--destructive: oklch(0.45 0.3 25);
|
|
380
|
+
--success: oklch(0.35 0.2 145);
|
|
381
|
+
--border: oklch(0 0 0);
|
|
382
|
+
--input: oklch(0.8 0 0);
|
|
383
|
+
--ring: oklch(0 0 0);
|
|
384
|
+
}
|
|
385
|
+
|
|
386
|
+
/* High contrast dark theme */
|
|
387
|
+
[data-theme="high-contrast-dark"] {
|
|
388
|
+
color-scheme: dark;
|
|
389
|
+
--background: oklch(0 0 0);
|
|
390
|
+
--foreground: oklch(1 0 0);
|
|
391
|
+
--card: oklch(0.05 0 0);
|
|
392
|
+
--card-foreground: oklch(1 0 0);
|
|
393
|
+
--popover: oklch(0.05 0 0);
|
|
394
|
+
--popover-foreground: oklch(1 0 0);
|
|
395
|
+
--primary: oklch(1 0 0);
|
|
396
|
+
--primary-foreground: oklch(0 0 0);
|
|
397
|
+
--secondary: oklch(0.15 0 0);
|
|
398
|
+
--secondary-foreground: oklch(1 0 0);
|
|
399
|
+
--muted: oklch(0.2 0 0);
|
|
400
|
+
--muted-foreground: oklch(0.85 0 0);
|
|
401
|
+
--accent: oklch(0.2 0 0);
|
|
402
|
+
--accent-foreground: oklch(1 0 0);
|
|
403
|
+
--destructive: oklch(0.65 0.25 25);
|
|
404
|
+
--success: oklch(0.7 0.2 145);
|
|
405
|
+
--border: oklch(1 0 0);
|
|
406
|
+
--input: oklch(0.3 0 0);
|
|
407
|
+
--ring: oklch(1 0 0);
|
|
408
|
+
}
|
|
409
|
+
|
|
410
|
+
/*
|
|
411
|
+
* Deuteranopia theme - green-weak colorblind safe
|
|
412
|
+
* Deuteranopia affects M-cones (green), making green-based colors harder to distinguish.
|
|
413
|
+
* Uses blue as primary, orange for warnings, and avoids green entirely.
|
|
414
|
+
*/
|
|
415
|
+
[data-theme="deuteranopia"] {
|
|
416
|
+
color-scheme: light;
|
|
417
|
+
--primary: oklch(0.55 0.18 250);
|
|
418
|
+
--primary-foreground: oklch(1 0 0);
|
|
419
|
+
--destructive: oklch(0.55 0.22 25);
|
|
420
|
+
--success: oklch(0.55 0.18 250);
|
|
421
|
+
--chart-1: oklch(0.55 0.18 250);
|
|
422
|
+
--chart-2: oklch(0.7 0.18 70);
|
|
423
|
+
--chart-3: oklch(0.45 0.12 290);
|
|
424
|
+
--chart-4: oklch(0.65 0.1 200);
|
|
425
|
+
--chart-5: oklch(0.5 0.15 40);
|
|
426
|
+
}
|
|
427
|
+
|
|
428
|
+
/*
|
|
429
|
+
* Protanopia theme - red-weak colorblind safe
|
|
430
|
+
* Protanopia affects L-cones (red), making reds appear darker and harder to distinguish.
|
|
431
|
+
* Uses cyan/teal as primary (avoiding red spectrum), brightens warm colors for visibility.
|
|
432
|
+
*/
|
|
433
|
+
[data-theme="protanopia"] {
|
|
434
|
+
color-scheme: light;
|
|
435
|
+
--primary: oklch(0.55 0.15 200);
|
|
436
|
+
--primary-foreground: oklch(1 0 0);
|
|
437
|
+
--destructive: oklch(0.6 0.2 55);
|
|
438
|
+
--success: oklch(0.55 0.15 200);
|
|
439
|
+
--chart-1: oklch(0.55 0.15 200);
|
|
440
|
+
--chart-2: oklch(0.7 0.18 80);
|
|
441
|
+
--chart-3: oklch(0.5 0.12 260);
|
|
442
|
+
--chart-4: oklch(0.65 0.08 180);
|
|
443
|
+
--chart-5: oklch(0.45 0.15 300);
|
|
444
|
+
}
|
|
445
|
+
|
|
446
|
+
/* Tritanopia theme - blue-yellow colorblind safe */
|
|
447
|
+
[data-theme="tritanopia"] {
|
|
448
|
+
color-scheme: light;
|
|
449
|
+
--primary: oklch(0.55 0.2 15);
|
|
450
|
+
--primary-foreground: oklch(1 0 0);
|
|
451
|
+
--destructive: oklch(0.5 0.25 15);
|
|
452
|
+
--success: oklch(0.55 0.15 170);
|
|
453
|
+
--chart-1: oklch(0.55 0.2 15);
|
|
454
|
+
--chart-2: oklch(0.55 0.15 170);
|
|
455
|
+
--chart-3: oklch(0.7 0.1 15);
|
|
456
|
+
--chart-4: oklch(0.4 0.15 170);
|
|
457
|
+
--chart-5: oklch(0.6 0.05 0);
|
|
458
|
+
}
|
|
459
|
+
|
|
460
|
+
/* ===========================================
|
|
461
|
+
Accessibility Media Queries (Phase 2)
|
|
462
|
+
Auto-adjusts for user preferences
|
|
463
|
+
=========================================== */
|
|
464
|
+
|
|
465
|
+
/*
|
|
466
|
+
* High contrast preference - enhance contrast for users who prefer it
|
|
467
|
+
* Applies to both automatic (no data-theme) and explicit theme selections.
|
|
468
|
+
* When data-theme is set to a high-contrast variant, those values take precedence.
|
|
469
|
+
*/
|
|
470
|
+
@media (prefers-contrast: more) {
|
|
471
|
+
:root:not([data-theme^="high-contrast"]) {
|
|
472
|
+
--foreground: oklch(0 0 0);
|
|
473
|
+
--muted-foreground: oklch(0.3 0 0);
|
|
474
|
+
--border: oklch(0.5 0 0);
|
|
475
|
+
}
|
|
476
|
+
|
|
477
|
+
.dark:not([data-theme^="high-contrast"]) {
|
|
478
|
+
--foreground: oklch(1 0 0);
|
|
479
|
+
--muted-foreground: oklch(0.8 0 0);
|
|
480
|
+
--border: oklch(0.6 0 0);
|
|
481
|
+
}
|
|
482
|
+
}
|
|
483
|
+
|
|
484
|
+
/*
|
|
485
|
+
* Reduced motion preference - minimize animations for accessibility
|
|
486
|
+
* Uses extremely short durations instead of completely disabling, which preserves
|
|
487
|
+
* visual feedback for state changes while eliminating motion discomfort.
|
|
488
|
+
* Components may use [data-essential-motion] to override for critical UI feedback
|
|
489
|
+
* (e.g., loading indicators, focus states).
|
|
490
|
+
*/
|
|
491
|
+
@media (prefers-reduced-motion: reduce) {
|
|
492
|
+
*:not([data-essential-motion]),
|
|
493
|
+
*:not([data-essential-motion])::before,
|
|
494
|
+
*:not([data-essential-motion])::after {
|
|
495
|
+
animation-duration: 0.01ms;
|
|
496
|
+
animation-iteration-count: 1;
|
|
497
|
+
transition-duration: 0.01ms;
|
|
498
|
+
}
|
|
499
|
+
}
|
|
500
|
+
|
|
501
|
+
/* ===========================================
|
|
502
|
+
Tailwind Theme Configuration
|
|
503
|
+
Maps CSS variables to Tailwind utilities
|
|
504
|
+
=========================================== */
|
|
505
|
+
|
|
506
|
+
@theme inline {
|
|
507
|
+
/* Font families - map Tailwind utilities to Geist fonts */
|
|
508
|
+
--font-sans: var(--font-geist-sans), ui-sans-serif, system-ui, sans-serif;
|
|
509
|
+
--font-mono: var(--font-geist-mono), ui-monospace, monospace;
|
|
510
|
+
|
|
511
|
+
/* Border radius scale */
|
|
512
|
+
--radius-box: var(--box-radius);
|
|
513
|
+
--radius-sm: max(calc(var(--radius) - 4px), 0px);
|
|
514
|
+
--radius-md: max(calc(var(--radius) - 2px), 0px);
|
|
515
|
+
--radius-lg: var(--radius);
|
|
516
|
+
--radius-xl: calc(var(--radius) + 4px);
|
|
517
|
+
|
|
518
|
+
/* Color mappings */
|
|
519
|
+
--color-background: var(--background);
|
|
520
|
+
--color-foreground: var(--foreground);
|
|
521
|
+
--color-card: var(--card);
|
|
522
|
+
--color-card-foreground: var(--card-foreground);
|
|
523
|
+
--color-popover: var(--popover);
|
|
524
|
+
--color-popover-foreground: var(--popover-foreground);
|
|
525
|
+
--color-primary: var(--primary);
|
|
526
|
+
--color-primary-foreground: var(--primary-foreground);
|
|
527
|
+
--color-secondary: var(--secondary);
|
|
528
|
+
--color-secondary-foreground: var(--secondary-foreground);
|
|
529
|
+
--color-muted: var(--muted);
|
|
530
|
+
--color-muted-foreground: var(--muted-foreground);
|
|
531
|
+
--color-accent: var(--accent);
|
|
532
|
+
--color-accent-foreground: var(--accent-foreground);
|
|
533
|
+
--color-destructive: var(--destructive);
|
|
534
|
+
--color-success: var(--success);
|
|
535
|
+
--color-border: var(--border);
|
|
536
|
+
--color-input: var(--input);
|
|
537
|
+
--color-ring: var(--ring);
|
|
538
|
+
--color-chart-1: var(--chart-1);
|
|
539
|
+
--color-chart-2: var(--chart-2);
|
|
540
|
+
--color-chart-3: var(--chart-3);
|
|
541
|
+
--color-chart-4: var(--chart-4);
|
|
542
|
+
--color-chart-5: var(--chart-5);
|
|
543
|
+
--color-sidebar: var(--sidebar);
|
|
544
|
+
--color-sidebar-foreground: var(--sidebar-foreground);
|
|
545
|
+
--color-sidebar-primary: var(--sidebar-primary);
|
|
546
|
+
--color-sidebar-primary-foreground: var(--sidebar-primary-foreground);
|
|
547
|
+
--color-sidebar-accent: var(--sidebar-accent);
|
|
548
|
+
--color-sidebar-accent-foreground: var(--sidebar-accent-foreground);
|
|
549
|
+
--color-sidebar-border: var(--sidebar-border);
|
|
550
|
+
--color-sidebar-ring: var(--sidebar-ring);
|
|
551
|
+
--color-icon: var(--icon);
|
|
552
|
+
--color-icon-hover: var(--icon-hover);
|
|
553
|
+
|
|
554
|
+
/* Brand customization colors */
|
|
555
|
+
--color-brand-accent: var(--brand-accent);
|
|
556
|
+
--color-brand-gradient-from: var(--brand-gradient-from);
|
|
557
|
+
--color-brand-gradient-to: var(--brand-gradient-to);
|
|
558
|
+
--color-highlight: var(--highlight-color);
|
|
559
|
+
|
|
560
|
+
/* BackgroundRippleEffect Animation */
|
|
561
|
+
--animate-cell-ripple: cell-ripple var(--duration, 200ms) ease-out none 1
|
|
562
|
+
var(--delay, 0ms);
|
|
563
|
+
|
|
564
|
+
@keyframes cell-ripple {
|
|
565
|
+
0% {
|
|
566
|
+
opacity: 0.4;
|
|
567
|
+
}
|
|
568
|
+
50% {
|
|
569
|
+
opacity: 0.8;
|
|
570
|
+
}
|
|
571
|
+
100% {
|
|
572
|
+
opacity: 0.4;
|
|
573
|
+
}
|
|
574
|
+
}
|
|
575
|
+
}
|
|
576
|
+
|
|
577
|
+
/* ===========================================
|
|
578
|
+
Global Cursor Rules
|
|
579
|
+
=========================================== */
|
|
580
|
+
|
|
581
|
+
body {
|
|
582
|
+
cursor: default;
|
|
583
|
+
/* Hide text caret by default - only show in actual text inputs */
|
|
584
|
+
caret-color: transparent;
|
|
585
|
+
}
|
|
586
|
+
|
|
587
|
+
/* Text cursor for editable elements - also restore caret visibility */
|
|
588
|
+
input,
|
|
589
|
+
textarea,
|
|
590
|
+
[contenteditable="true"] {
|
|
591
|
+
cursor: text;
|
|
592
|
+
caret-color: auto;
|
|
593
|
+
}
|
|
594
|
+
|
|
595
|
+
/* Restore pointer cursor for interactive elements */
|
|
596
|
+
button,
|
|
597
|
+
a,
|
|
598
|
+
[role="button"],
|
|
599
|
+
[role="link"],
|
|
600
|
+
[role="tab"],
|
|
601
|
+
[role="menuitem"],
|
|
602
|
+
[role="option"],
|
|
603
|
+
select,
|
|
604
|
+
label[for],
|
|
605
|
+
summary {
|
|
606
|
+
cursor: pointer;
|
|
607
|
+
}
|
|
608
|
+
|
|
609
|
+
/* Disabled elements should show not-allowed cursor */
|
|
610
|
+
button:disabled,
|
|
611
|
+
input:disabled,
|
|
612
|
+
textarea:disabled,
|
|
613
|
+
select:disabled,
|
|
614
|
+
[aria-disabled="true"] {
|
|
615
|
+
cursor: not-allowed;
|
|
616
|
+
}
|
|
617
|
+
|
|
618
|
+
/* ===========================================
|
|
619
|
+
Container Utilities
|
|
620
|
+
=========================================== */
|
|
621
|
+
|
|
622
|
+
.container {
|
|
623
|
+
width: 100%;
|
|
624
|
+
max-width: var(--layout-max-width);
|
|
625
|
+
margin-left: auto;
|
|
626
|
+
margin-right: auto;
|
|
627
|
+
padding-left: var(--layout-padding-mobile);
|
|
628
|
+
padding-right: var(--layout-padding-mobile);
|
|
629
|
+
}
|
|
630
|
+
|
|
631
|
+
@media (min-width: 640px) {
|
|
632
|
+
.container {
|
|
633
|
+
padding-left: var(--layout-padding-tablet);
|
|
634
|
+
padding-right: var(--layout-padding-tablet);
|
|
635
|
+
}
|
|
636
|
+
}
|
|
637
|
+
|
|
638
|
+
@media (min-width: 1024px) {
|
|
639
|
+
.container {
|
|
640
|
+
padding-left: var(--layout-padding-desktop);
|
|
641
|
+
padding-right: var(--layout-padding-desktop);
|
|
642
|
+
}
|
|
643
|
+
}
|
|
644
|
+
|
|
645
|
+
.container-narrow {
|
|
646
|
+
max-width: var(--layout-max-width-narrow);
|
|
647
|
+
}
|
|
648
|
+
|
|
649
|
+
.container-wide {
|
|
650
|
+
max-width: var(--layout-max-width-wide);
|
|
651
|
+
}
|
|
652
|
+
|
|
653
|
+
/* ===========================================
|
|
654
|
+
Base Layer Styles
|
|
655
|
+
=========================================== */
|
|
656
|
+
|
|
657
|
+
@layer base {
|
|
658
|
+
* {
|
|
659
|
+
@apply border-border outline-ring/50;
|
|
660
|
+
}
|
|
661
|
+
html,
|
|
662
|
+
body {
|
|
663
|
+
@apply h-full;
|
|
664
|
+
}
|
|
665
|
+
body {
|
|
666
|
+
@apply bg-background text-foreground;
|
|
667
|
+
}
|
|
668
|
+
html.dark {
|
|
669
|
+
background-color: #000000;
|
|
670
|
+
color: #ffffff;
|
|
671
|
+
}
|
|
672
|
+
html.dark body {
|
|
673
|
+
background-color: #000000;
|
|
674
|
+
color: #ffffff;
|
|
675
|
+
}
|
|
676
|
+
|
|
677
|
+
/* Header font customization */
|
|
678
|
+
h1,
|
|
679
|
+
h2,
|
|
680
|
+
h3,
|
|
681
|
+
h4,
|
|
682
|
+
h5,
|
|
683
|
+
h6 {
|
|
684
|
+
font-family: var(--font-headers, inherit);
|
|
685
|
+
font-weight: var(--heading-weight, 600);
|
|
686
|
+
letter-spacing: var(--heading-tracking, -0.025em);
|
|
687
|
+
}
|
|
688
|
+
|
|
689
|
+
/* Monospace font customization */
|
|
690
|
+
code,
|
|
691
|
+
pre,
|
|
692
|
+
kbd,
|
|
693
|
+
samp {
|
|
694
|
+
font-family: var(--font-mono, ui-monospace, monospace);
|
|
695
|
+
}
|
|
696
|
+
}
|
|
697
|
+
|
|
698
|
+
/* ===========================================
|
|
699
|
+
BackgroundRippleEffect Utilities
|
|
700
|
+
=========================================== */
|
|
701
|
+
|
|
702
|
+
/* Ripple effect mask utilities */
|
|
703
|
+
.mask-radial-from-70\%,
|
|
704
|
+
[class*="mask-radial-from-70"] {
|
|
705
|
+
mask-image: radial-gradient(
|
|
706
|
+
ellipse farthest-corner at top,
|
|
707
|
+
black 70%,
|
|
708
|
+
transparent 100%
|
|
709
|
+
);
|
|
710
|
+
-webkit-mask-image: radial-gradient(
|
|
711
|
+
ellipse farthest-corner at top,
|
|
712
|
+
black 70%,
|
|
713
|
+
transparent 100%
|
|
714
|
+
);
|
|
715
|
+
}
|
|
716
|
+
|
|
717
|
+
/* Ripple grid cell styling */
|
|
718
|
+
.cell {
|
|
719
|
+
border-width: 0.5px;
|
|
720
|
+
}
|
|
721
|
+
|
|
722
|
+
/* Fractional border width utility */
|
|
723
|
+
.border-\[0\.5px\] {
|
|
724
|
+
border-width: 0.5px;
|
|
725
|
+
}
|
|
726
|
+
|
|
727
|
+
/* Z-index utilities */
|
|
728
|
+
.z-2 {
|
|
729
|
+
z-index: 2;
|
|
730
|
+
}
|
|
731
|
+
|
|
732
|
+
.z-3 {
|
|
733
|
+
z-index: 3;
|
|
734
|
+
}
|
|
735
|
+
|
|
736
|
+
/* ===========================================
|
|
737
|
+
Prose Styles (for legal pages, markdown content)
|
|
738
|
+
=========================================== */
|
|
739
|
+
|
|
740
|
+
.prose ul {
|
|
741
|
+
list-style-type: disc;
|
|
742
|
+
padding-left: 1.5rem;
|
|
743
|
+
margin-top: 1rem;
|
|
744
|
+
margin-bottom: 1rem;
|
|
745
|
+
}
|
|
746
|
+
|
|
747
|
+
.prose ol {
|
|
748
|
+
list-style-type: decimal;
|
|
749
|
+
padding-left: 1.5rem;
|
|
750
|
+
margin-top: 1rem;
|
|
751
|
+
margin-bottom: 1rem;
|
|
752
|
+
}
|
|
753
|
+
|
|
754
|
+
.prose li {
|
|
755
|
+
margin-top: 0.5rem;
|
|
756
|
+
margin-bottom: 0.5rem;
|
|
757
|
+
}
|
|
758
|
+
|
|
759
|
+
.prose a {
|
|
760
|
+
color: var(--primary);
|
|
761
|
+
text-decoration: underline;
|
|
762
|
+
text-underline-offset: 2px;
|
|
763
|
+
}
|
|
764
|
+
|
|
765
|
+
.prose a:hover {
|
|
766
|
+
opacity: 0.8;
|
|
767
|
+
}
|
|
768
|
+
|
|
769
|
+
/* ===========================================
|
|
770
|
+
Form Element Fixes
|
|
771
|
+
=========================================== */
|
|
772
|
+
|
|
773
|
+
/* Fix placeholder text scaling on smaller screens */
|
|
774
|
+
input::placeholder,
|
|
775
|
+
textarea::placeholder {
|
|
776
|
+
font-size: inherit;
|
|
777
|
+
}
|
|
778
|
+
|
|
779
|
+
@media (max-width: 640px) {
|
|
780
|
+
input::placeholder,
|
|
781
|
+
textarea::placeholder {
|
|
782
|
+
font-size: 0.875rem;
|
|
783
|
+
}
|
|
784
|
+
}
|
|
785
|
+
|
|
786
|
+
/*
|
|
787
|
+
* Autofill / password-manager fill styling
|
|
788
|
+
*
|
|
789
|
+
* Centralize the filled-input treatment so shared Input/PasswordInput components
|
|
790
|
+
* stay readable across browser autofill and extension-based password managers.
|
|
791
|
+
*
|
|
792
|
+
* Known coverage:
|
|
793
|
+
* - WebKit/Blink native autofill (:autofill / :-webkit-autofill)
|
|
794
|
+
* - Firefox autofill (:-moz-autofill)
|
|
795
|
+
* - 1Password extension fills (data-com-onepassword-filled)
|
|
796
|
+
*
|
|
797
|
+
* Components opt in via [data-autofill-aware="true"], which keeps this extensible
|
|
798
|
+
* for additional provider-specific selectors without requiring app-level overrides.
|
|
799
|
+
*/
|
|
800
|
+
:root {
|
|
801
|
+
--autofill-fg: var(--foreground);
|
|
802
|
+
--autofill-bg: var(--background);
|
|
803
|
+
--autofill-border: var(--input);
|
|
804
|
+
}
|
|
805
|
+
|
|
806
|
+
.dark {
|
|
807
|
+
--autofill-fg: rgb(248 250 252);
|
|
808
|
+
--autofill-bg: rgb(17 24 39);
|
|
809
|
+
--autofill-border: rgb(55 65 81);
|
|
810
|
+
}
|
|
811
|
+
|
|
812
|
+
:is(
|
|
813
|
+
input[data-autofill-aware="true"],
|
|
814
|
+
textarea[data-autofill-aware="true"]
|
|
815
|
+
):-webkit-autofill,
|
|
816
|
+
:is(
|
|
817
|
+
input[data-autofill-aware="true"],
|
|
818
|
+
textarea[data-autofill-aware="true"]
|
|
819
|
+
):-webkit-autofill:hover,
|
|
820
|
+
:is(
|
|
821
|
+
input[data-autofill-aware="true"],
|
|
822
|
+
textarea[data-autofill-aware="true"]
|
|
823
|
+
):-webkit-autofill:focus,
|
|
824
|
+
:is(
|
|
825
|
+
input[data-autofill-aware="true"],
|
|
826
|
+
textarea[data-autofill-aware="true"]
|
|
827
|
+
):-webkit-autofill:active {
|
|
828
|
+
-webkit-text-fill-color: var(--autofill-fg) !important;
|
|
829
|
+
color: var(--autofill-fg) !important;
|
|
830
|
+
caret-color: var(--autofill-fg) !important;
|
|
831
|
+
background-color: var(--autofill-bg) !important;
|
|
832
|
+
-webkit-box-shadow: 0 0 0 1000px var(--autofill-bg) inset !important;
|
|
833
|
+
box-shadow: 0 0 0 1000px var(--autofill-bg) inset !important;
|
|
834
|
+
border-color: var(--autofill-border) !important;
|
|
835
|
+
border-radius: inherit !important;
|
|
836
|
+
transition: background-color 99999s ease-in-out 0s;
|
|
837
|
+
}
|
|
838
|
+
|
|
839
|
+
:is(
|
|
840
|
+
input[data-autofill-aware="true"],
|
|
841
|
+
textarea[data-autofill-aware="true"]
|
|
842
|
+
):-webkit-autofill::first-line {
|
|
843
|
+
color: var(--autofill-fg) !important;
|
|
844
|
+
-webkit-text-fill-color: var(--autofill-fg) !important;
|
|
845
|
+
}
|
|
846
|
+
|
|
847
|
+
:is(
|
|
848
|
+
input[data-autofill-aware="true"],
|
|
849
|
+
textarea[data-autofill-aware="true"]
|
|
850
|
+
):-moz-autofill {
|
|
851
|
+
color: var(--autofill-fg) !important;
|
|
852
|
+
background-color: var(--autofill-bg) !important;
|
|
853
|
+
box-shadow: 0 0 0 1000px var(--autofill-bg) inset !important;
|
|
854
|
+
border-color: var(--autofill-border) !important;
|
|
855
|
+
}
|
|
856
|
+
|
|
857
|
+
:is(
|
|
858
|
+
input[data-autofill-aware="true"][data-com-onepassword-filled],
|
|
859
|
+
textarea[data-autofill-aware="true"][data-com-onepassword-filled],
|
|
860
|
+
input[data-autofill-aware="true"][data-com-onepassword-filled="light"],
|
|
861
|
+
input[data-autofill-aware="true"][data-com-onepassword-filled="dark"],
|
|
862
|
+
textarea[data-autofill-aware="true"][data-com-onepassword-filled="light"],
|
|
863
|
+
textarea[data-autofill-aware="true"][data-com-onepassword-filled="dark"]
|
|
864
|
+
) {
|
|
865
|
+
color: var(--autofill-fg) !important;
|
|
866
|
+
-webkit-text-fill-color: var(--autofill-fg) !important;
|
|
867
|
+
caret-color: var(--autofill-fg) !important;
|
|
868
|
+
background-color: var(--autofill-bg) !important;
|
|
869
|
+
box-shadow: 0 0 0 1000px var(--autofill-bg) inset !important;
|
|
870
|
+
border-color: var(--autofill-border) !important;
|
|
871
|
+
}
|
|
872
|
+
|
|
873
|
+
/* ===========================================
|
|
874
|
+
Button Slide Hover Effect
|
|
875
|
+
=========================================== */
|
|
876
|
+
|
|
877
|
+
/* CTA button theme contract */
|
|
878
|
+
[data-slot="button"].button-cta {
|
|
879
|
+
font-family: var(--button-cta-font-family) !important;
|
|
880
|
+
font-weight: var(--button-cta-font-weight) !important;
|
|
881
|
+
letter-spacing: var(--button-cta-letter-spacing) !important;
|
|
882
|
+
text-transform: var(--button-cta-text-transform) !important;
|
|
883
|
+
background-color: var(--button-cta-bg);
|
|
884
|
+
color: var(--button-cta-fg);
|
|
885
|
+
border-color: var(--button-cta-border);
|
|
886
|
+
}
|
|
887
|
+
|
|
888
|
+
[data-slot="button"].button-cta-default {
|
|
889
|
+
--button-cta-bg: var(--button-default-bg);
|
|
890
|
+
--button-cta-fg: var(--button-default-fg);
|
|
891
|
+
--button-cta-border: var(--button-default-border);
|
|
892
|
+
--button-cta-hover-bg: var(--button-default-hover-bg);
|
|
893
|
+
--button-cta-hover-fg: var(--button-default-hover-fg);
|
|
894
|
+
--button-cta-hover-border: var(--button-default-hover-border);
|
|
895
|
+
--button-cta-active-bg: var(--button-default-active-bg);
|
|
896
|
+
--button-cta-active-fg: var(--button-default-active-fg);
|
|
897
|
+
--button-cta-active-border: var(--button-default-active-border);
|
|
898
|
+
}
|
|
899
|
+
|
|
900
|
+
[data-slot="button"].button-cta-outline {
|
|
901
|
+
--button-cta-bg: var(--button-outline-bg);
|
|
902
|
+
--button-cta-fg: var(--button-outline-fg);
|
|
903
|
+
--button-cta-border: var(--button-outline-border);
|
|
904
|
+
--button-cta-hover-bg: var(--button-outline-hover-bg);
|
|
905
|
+
--button-cta-hover-fg: var(--button-outline-hover-fg);
|
|
906
|
+
--button-cta-hover-border: var(--button-outline-hover-border);
|
|
907
|
+
--button-cta-active-bg: var(--button-outline-active-bg);
|
|
908
|
+
--button-cta-active-fg: var(--button-outline-active-fg);
|
|
909
|
+
--button-cta-active-border: var(--button-outline-active-border);
|
|
910
|
+
}
|
|
911
|
+
|
|
912
|
+
[data-slot="button"].button-cta-secondary {
|
|
913
|
+
--button-cta-bg: var(--button-secondary-bg);
|
|
914
|
+
--button-cta-fg: var(--button-secondary-fg);
|
|
915
|
+
--button-cta-border: var(--button-secondary-border);
|
|
916
|
+
--button-cta-hover-bg: var(--button-secondary-hover-bg);
|
|
917
|
+
--button-cta-hover-fg: var(--button-secondary-hover-fg);
|
|
918
|
+
--button-cta-hover-border: var(--button-secondary-hover-border);
|
|
919
|
+
--button-cta-active-bg: var(--button-secondary-active-bg);
|
|
920
|
+
--button-cta-active-fg: var(--button-secondary-active-fg);
|
|
921
|
+
--button-cta-active-border: var(--button-secondary-active-border);
|
|
922
|
+
}
|
|
923
|
+
|
|
924
|
+
[data-slot="button"].button-cta-premium {
|
|
925
|
+
--button-cta-bg: var(--button-premium-bg);
|
|
926
|
+
--button-cta-fg: var(--button-premium-fg);
|
|
927
|
+
--button-cta-border: var(--button-premium-border);
|
|
928
|
+
--button-cta-hover-bg: var(--button-premium-hover-bg);
|
|
929
|
+
--button-cta-hover-fg: var(--button-premium-hover-fg);
|
|
930
|
+
--button-cta-hover-border: var(--button-premium-hover-border);
|
|
931
|
+
--button-cta-active-bg: var(--button-premium-active-bg);
|
|
932
|
+
--button-cta-active-fg: var(--button-premium-active-fg);
|
|
933
|
+
--button-cta-active-border: var(--button-premium-active-border);
|
|
934
|
+
}
|
|
935
|
+
|
|
936
|
+
[data-slot="button"].button-cta:not([data-hover-effect="slide"]):not(
|
|
937
|
+
[data-hover-effect="theme"]
|
|
938
|
+
):hover {
|
|
939
|
+
background-color: var(--button-cta-hover-bg);
|
|
940
|
+
color: var(--button-cta-hover-fg);
|
|
941
|
+
border-color: var(--button-cta-hover-border);
|
|
942
|
+
}
|
|
943
|
+
|
|
944
|
+
[data-slot="button"].button-cta:not([data-hover-effect="slide"]):not(
|
|
945
|
+
[data-hover-effect="theme"]
|
|
946
|
+
):active {
|
|
947
|
+
background-color: var(--button-cta-active-bg);
|
|
948
|
+
color: var(--button-cta-active-fg);
|
|
949
|
+
border-color: var(--button-cta-active-border);
|
|
950
|
+
}
|
|
951
|
+
|
|
952
|
+
[data-slot="button"].button-cta[data-hover-effect="theme"],
|
|
953
|
+
[data-slot="button"].button-cta[data-hover-effect="slide"] {
|
|
954
|
+
position: relative;
|
|
955
|
+
overflow: hidden;
|
|
956
|
+
z-index: 0;
|
|
957
|
+
}
|
|
958
|
+
|
|
959
|
+
[data-slot="button"].button-cta[data-hover-effect="theme"]::before,
|
|
960
|
+
[data-slot="button"].button-cta[data-hover-effect="slide"]::before {
|
|
961
|
+
content: "";
|
|
962
|
+
position: absolute;
|
|
963
|
+
inset: 0;
|
|
964
|
+
background-color: var(--button-cta-hover-bg);
|
|
965
|
+
opacity: var(--button-cta-theme-overlay-opacity);
|
|
966
|
+
transform: translate3d(0, var(--button-cta-theme-overlay-offset), 0);
|
|
967
|
+
transition: transform 300ms ease-out;
|
|
968
|
+
will-change: transform;
|
|
969
|
+
backface-visibility: hidden;
|
|
970
|
+
pointer-events: none;
|
|
971
|
+
z-index: -1;
|
|
972
|
+
}
|
|
973
|
+
|
|
974
|
+
[data-slot="button"].button-cta[data-hover-effect="theme"]:hover::before,
|
|
975
|
+
[data-slot="button"].button-cta[data-hover-effect="slide"]:hover::before {
|
|
976
|
+
transform: translate3d(0, 0, 0);
|
|
977
|
+
opacity: var(--button-cta-theme-overlay-hover-opacity);
|
|
978
|
+
}
|
|
979
|
+
|
|
980
|
+
[data-slot="button"].button-cta[data-hover-effect="theme"]:hover,
|
|
981
|
+
[data-slot="button"].button-cta[data-hover-effect="slide"]:hover {
|
|
982
|
+
color: var(--button-cta-hover-fg);
|
|
983
|
+
border-color: var(--button-cta-hover-border);
|
|
984
|
+
}
|
|
985
|
+
|
|
986
|
+
[data-slot="button"].button-cta[data-hover-effect="theme"]:active,
|
|
987
|
+
[data-slot="button"].button-cta[data-hover-effect="slide"]:active {
|
|
988
|
+
color: var(--button-cta-active-fg);
|
|
989
|
+
border-color: var(--button-cta-active-border);
|
|
990
|
+
}
|
|
991
|
+
|
|
992
|
+
[data-slot="button"].button-cta[data-hover-effect="theme"]:hover {
|
|
993
|
+
box-shadow: var(--button-cta-theme-hover-shadow);
|
|
994
|
+
transform: scale(var(--button-cta-theme-hover-scale));
|
|
995
|
+
}
|
|
996
|
+
|
|
997
|
+
/* Destructive button with slide effect - starts light, fills with red on hover */
|
|
998
|
+
[data-slot="button"][data-variant="destructive"][data-hover-effect="slide"] {
|
|
999
|
+
position: relative;
|
|
1000
|
+
overflow: hidden;
|
|
1001
|
+
z-index: 0;
|
|
1002
|
+
background-color: var(--background);
|
|
1003
|
+
color: var(--destructive);
|
|
1004
|
+
border: 1px solid var(--destructive);
|
|
1005
|
+
}
|
|
1006
|
+
|
|
1007
|
+
[data-slot="button"][data-variant="destructive"][data-hover-effect="slide"]::before {
|
|
1008
|
+
content: "";
|
|
1009
|
+
position: absolute;
|
|
1010
|
+
inset: 0;
|
|
1011
|
+
background-color: var(--destructive);
|
|
1012
|
+
transform: translate3d(0, calc(100% + 2px), 0);
|
|
1013
|
+
transition: transform 300ms ease-out;
|
|
1014
|
+
will-change: transform;
|
|
1015
|
+
backface-visibility: hidden;
|
|
1016
|
+
pointer-events: none;
|
|
1017
|
+
z-index: -1;
|
|
1018
|
+
}
|
|
1019
|
+
|
|
1020
|
+
[data-slot="button"][data-variant="destructive"][data-hover-effect="slide"]:hover::before,
|
|
1021
|
+
[data-slot="button"][data-variant="destructive"][data-hover-effect="slide"][data-active]::before {
|
|
1022
|
+
transform: translate3d(0, 0, 0);
|
|
1023
|
+
}
|
|
1024
|
+
|
|
1025
|
+
[data-slot="button"][data-variant="destructive"][data-hover-effect="slide"]:hover,
|
|
1026
|
+
[data-slot="button"][data-variant="destructive"][data-hover-effect="slide"][data-active] {
|
|
1027
|
+
color: white;
|
|
1028
|
+
}
|
|
1029
|
+
|
|
1030
|
+
/* ===========================================
|
|
1031
|
+
Segmented Switcher
|
|
1032
|
+
=========================================== */
|
|
1033
|
+
|
|
1034
|
+
[data-slot="segmented-switcher"] {
|
|
1035
|
+
display: block;
|
|
1036
|
+
width: 100%;
|
|
1037
|
+
overflow-x: auto;
|
|
1038
|
+
-webkit-overflow-scrolling: touch;
|
|
1039
|
+
scrollbar-width: none;
|
|
1040
|
+
}
|
|
1041
|
+
|
|
1042
|
+
[data-slot="segmented-switcher"]::-webkit-scrollbar {
|
|
1043
|
+
display: none;
|
|
1044
|
+
}
|
|
1045
|
+
|
|
1046
|
+
[data-slot="segmented-switcher-track"] {
|
|
1047
|
+
position: relative;
|
|
1048
|
+
display: inline-flex;
|
|
1049
|
+
min-width: 100%;
|
|
1050
|
+
flex-wrap: nowrap;
|
|
1051
|
+
align-items: center;
|
|
1052
|
+
gap: 0.375rem;
|
|
1053
|
+
border-radius: 9999px;
|
|
1054
|
+
border: 1px solid color-mix(in srgb, var(--foreground) 14%, transparent);
|
|
1055
|
+
background: color-mix(in srgb, var(--background) 84%, var(--foreground) 4%);
|
|
1056
|
+
padding: 0.25rem;
|
|
1057
|
+
}
|
|
1058
|
+
|
|
1059
|
+
[data-slot="segmented-switcher-item"] {
|
|
1060
|
+
position: relative;
|
|
1061
|
+
display: inline-flex;
|
|
1062
|
+
flex: 0 0 auto;
|
|
1063
|
+
align-items: center;
|
|
1064
|
+
justify-content: center;
|
|
1065
|
+
white-space: nowrap;
|
|
1066
|
+
border-radius: 9999px;
|
|
1067
|
+
text-decoration: none;
|
|
1068
|
+
color: color-mix(in srgb, var(--foreground) 65%, transparent);
|
|
1069
|
+
transition: transform 180ms ease;
|
|
1070
|
+
}
|
|
1071
|
+
|
|
1072
|
+
[data-slot="segmented-switcher-item"]:not([aria-disabled="true"]):not(
|
|
1073
|
+
[data-active]
|
|
1074
|
+
):hover {
|
|
1075
|
+
color: color-mix(in srgb, var(--foreground) 82%, transparent);
|
|
1076
|
+
}
|
|
1077
|
+
|
|
1078
|
+
[data-slot="segmented-switcher-item"][data-active],
|
|
1079
|
+
[data-slot="segmented-switcher-item"][data-active]:hover {
|
|
1080
|
+
color: #080808;
|
|
1081
|
+
}
|
|
1082
|
+
|
|
1083
|
+
[data-slot="segmented-switcher-item"][data-disabled],
|
|
1084
|
+
[data-slot="segmented-switcher-item"][aria-disabled="true"] {
|
|
1085
|
+
cursor: not-allowed;
|
|
1086
|
+
opacity: 0.42;
|
|
1087
|
+
}
|
|
1088
|
+
|
|
1089
|
+
[data-slot="segmented-switcher-item"]:focus-visible {
|
|
1090
|
+
outline: none;
|
|
1091
|
+
box-shadow: 0 0 0 2px var(--ring);
|
|
1092
|
+
}
|
|
1093
|
+
|
|
1094
|
+
[data-slot="segmented-switcher-indicator"] {
|
|
1095
|
+
position: absolute;
|
|
1096
|
+
inset: 0;
|
|
1097
|
+
border-radius: inherit;
|
|
1098
|
+
border: 1px solid color-mix(in srgb, #ffffff 18%, transparent);
|
|
1099
|
+
background: linear-gradient(180deg, #ffffff 0%, #ececec 100%);
|
|
1100
|
+
}
|
|
1101
|
+
|
|
1102
|
+
[data-slot="segmented-switcher-item-label"] {
|
|
1103
|
+
position: relative;
|
|
1104
|
+
z-index: 1;
|
|
1105
|
+
}
|
|
1106
|
+
|
|
1107
|
+
[data-slot="segmented-switcher"][data-variant="investor"]
|
|
1108
|
+
[data-slot="segmented-switcher-track"] {
|
|
1109
|
+
min-height: 2.75rem;
|
|
1110
|
+
padding: 0.25rem;
|
|
1111
|
+
}
|
|
1112
|
+
|
|
1113
|
+
[data-slot="segmented-switcher"][data-variant="investor"]
|
|
1114
|
+
[data-slot="segmented-switcher-item"] {
|
|
1115
|
+
min-height: 2.25rem;
|
|
1116
|
+
padding: 0.5rem 1.05rem;
|
|
1117
|
+
font-size: 0.94rem;
|
|
1118
|
+
font-weight: 600;
|
|
1119
|
+
letter-spacing: 0.01em;
|
|
1120
|
+
}
|
|
1121
|
+
|
|
1122
|
+
[data-slot="segmented-switcher"][data-variant="admin"]
|
|
1123
|
+
[data-slot="segmented-switcher-track"] {
|
|
1124
|
+
min-height: 2.5rem;
|
|
1125
|
+
padding: 0.2rem;
|
|
1126
|
+
border-color: color-mix(in srgb, var(--foreground) 18%, transparent);
|
|
1127
|
+
}
|
|
1128
|
+
|
|
1129
|
+
[data-slot="segmented-switcher"][data-variant="admin"]
|
|
1130
|
+
[data-slot="segmented-switcher-item"] {
|
|
1131
|
+
min-height: 2.05rem;
|
|
1132
|
+
padding: 0.45rem 0.82rem;
|
|
1133
|
+
font-size: 0.7rem;
|
|
1134
|
+
font-weight: 700;
|
|
1135
|
+
letter-spacing: 0.14em;
|
|
1136
|
+
text-transform: uppercase;
|
|
1137
|
+
}
|
|
1138
|
+
|
|
1139
|
+
[data-slot="segmented-switcher"][data-variant="admin"]
|
|
1140
|
+
[data-slot="segmented-switcher-item"][data-active],
|
|
1141
|
+
[data-slot="segmented-switcher"][data-variant="admin"]
|
|
1142
|
+
[data-slot="segmented-switcher-item"][data-active]:hover {
|
|
1143
|
+
color: #111111;
|
|
1144
|
+
}
|
|
1145
|
+
|
|
1146
|
+
[data-slot="segmented-switcher"][data-track-border="false"]
|
|
1147
|
+
[data-slot="segmented-switcher-track"] {
|
|
1148
|
+
border-color: transparent;
|
|
1149
|
+
}
|
|
1150
|
+
|
|
1151
|
+
[data-slot="segmented-switcher"][data-track-background="false"]
|
|
1152
|
+
[data-slot="segmented-switcher-track"] {
|
|
1153
|
+
background: transparent;
|
|
1154
|
+
}
|
|
1155
|
+
|
|
1156
|
+
@media (prefers-reduced-motion: reduce) {
|
|
1157
|
+
[data-slot="segmented-switcher-item"] {
|
|
1158
|
+
transition-duration: 0ms;
|
|
1159
|
+
}
|
|
1160
|
+
}
|
|
1161
|
+
|
|
1162
|
+
/* ===========================================
|
|
1163
|
+
Features Grid With Large Skeletons
|
|
1164
|
+
=========================================== */
|
|
1165
|
+
|
|
1166
|
+
[data-slot="feature-workflow-skeleton-panel"] {
|
|
1167
|
+
transform: translate3d(1rem, -1rem, 0);
|
|
1168
|
+
transition: transform 300ms ease;
|
|
1169
|
+
will-change: transform;
|
|
1170
|
+
}
|
|
1171
|
+
|
|
1172
|
+
[data-slot="feature-workflow-skeleton"]:hover
|
|
1173
|
+
[data-slot="feature-workflow-skeleton-panel"],
|
|
1174
|
+
[data-slot="features-grid-large-skeleton-card"]:hover
|
|
1175
|
+
[data-slot="feature-workflow-skeleton-panel"],
|
|
1176
|
+
[data-slot="features-grid-large-skeleton-card"]:focus-within
|
|
1177
|
+
[data-slot="feature-workflow-skeleton-panel"] {
|
|
1178
|
+
transform: translate3d(0, 0, 0);
|
|
1179
|
+
}
|
|
1180
|
+
|
|
1181
|
+
@media (prefers-reduced-motion: reduce) {
|
|
1182
|
+
[data-slot="feature-workflow-skeleton-panel"] {
|
|
1183
|
+
transition-duration: 0ms;
|
|
1184
|
+
}
|
|
1185
|
+
}
|
|
1186
|
+
|
|
1187
|
+
/* ===========================================
|
|
1188
|
+
Text Highlight Animation
|
|
1189
|
+
=========================================== */
|
|
1190
|
+
|
|
1191
|
+
@keyframes text-highlight-draw {
|
|
1192
|
+
from {
|
|
1193
|
+
background-size: 0% 100%;
|
|
1194
|
+
}
|
|
1195
|
+
to {
|
|
1196
|
+
background-size: 100% 100%;
|
|
1197
|
+
}
|
|
1198
|
+
}
|
|
1199
|
+
|
|
1200
|
+
/* Animated text highlight - uses CSS custom properties for duration/delay */
|
|
1201
|
+
.text-highlight-animated {
|
|
1202
|
+
background-size: 0% 100%;
|
|
1203
|
+
animation: text-highlight-draw var(--highlight-duration, 2s) linear
|
|
1204
|
+
var(--highlight-delay, 0.5s) forwards;
|
|
1205
|
+
}
|
|
1206
|
+
|
|
1207
|
+
/* Respect prefers-reduced-motion: show highlight instantly without animation */
|
|
1208
|
+
@media (prefers-reduced-motion: reduce) {
|
|
1209
|
+
.text-highlight-animated {
|
|
1210
|
+
animation: none;
|
|
1211
|
+
background-size: 100% 100%;
|
|
1212
|
+
}
|
|
1213
|
+
}
|