@web-my-money/tokens 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,6 @@
1
+ import {
2
+ wmmPreset
3
+ } from "./chunk-4FF2FHY6.mjs";
4
+ export {
5
+ wmmPreset
6
+ };
@@ -0,0 +1,140 @@
1
+ /* GENERATED by scripts/gen-theme-css.mjs — DO NOT EDIT.
2
+ Source of truth: src/themes/palette.mjs · variant: app (wmm-native vocab)
3
+ Themes: light (default), dark, wmm — switch via [data-theme]. */
4
+
5
+ @theme inline {
6
+ --color-background: var(--bg);
7
+ --color-surface: var(--surface);
8
+ --color-card: var(--card);
9
+ --color-overlay: var(--overlay);
10
+ --color-foreground: var(--fg);
11
+ --color-muted: var(--muted);
12
+ --color-faint: var(--faint);
13
+ --color-border: var(--border);
14
+ --color-border-strong: var(--border-strong);
15
+ --color-primary: var(--primary);
16
+ --color-primary-dim: var(--primary-dim);
17
+ --color-accent: var(--accent);
18
+ --color-danger: var(--danger);
19
+ --color-warn: var(--warn);
20
+ --color-ok: var(--ok);
21
+ --color-ring: var(--ring);
22
+ --color-chart-1: var(--chart-1);
23
+ --color-chart-2: var(--chart-2);
24
+ --color-chart-3: var(--chart-3);
25
+ --color-chart-4: var(--chart-4);
26
+ --color-chart-5: var(--chart-5);
27
+ --color-chart-6: var(--chart-6);
28
+ --color-chart-7: var(--chart-7);
29
+ --color-chart-8: var(--chart-8);
30
+ --radius-sm: var(--radius-sm);
31
+ --radius-md: var(--radius-md);
32
+ --radius-lg: var(--radius-lg);
33
+ --radius-xl: var(--radius-xl);
34
+ --radius-2xl: var(--radius-2xl);
35
+ --radius-3xl: var(--radius-3xl);
36
+ --radius-4xl: var(--radius-4xl);
37
+ }
38
+
39
+ :root {
40
+ --radius: 0.625rem;
41
+ --radius-sm: calc(var(--radius) * 0.6);
42
+ --radius-md: calc(var(--radius) * 0.8);
43
+ --radius-lg: var(--radius);
44
+ --radius-xl: calc(var(--radius) * 1.4);
45
+ --radius-2xl: calc(var(--radius) * 1.8);
46
+ --radius-3xl: calc(var(--radius) * 2.2);
47
+ --radius-4xl: calc(var(--radius) * 2.6);
48
+ --wmm-aqua: #8fccb6;
49
+ --wmm-periwinkle: #869ce2;
50
+ --wmm-blue-lift: #7388cf;
51
+ --wmm-navy: #1f2d56;
52
+ --wmm-glow: rgba(143, 204, 182, 0.15);
53
+ --wmm-teal: #8fccb6;
54
+ --wmm-violet: #869ce2;
55
+ --wmm-sky: #7388cf;
56
+ }
57
+
58
+ :root, [data-theme="light"] {
59
+ color-scheme: light;
60
+ --bg: oklch(0.985 0.003 250);
61
+ --surface: oklch(1 0 0);
62
+ --card: oklch(1 0 0);
63
+ --overlay: oklch(0.965 0.004 250);
64
+ --fg: oklch(0.22 0.012 260);
65
+ --muted: oklch(0.42 0.012 260);
66
+ --faint: oklch(0.58 0.01 260);
67
+ --border: oklch(0 0 0 / 8%);
68
+ --border-strong: oklch(0 0 0 / 14%);
69
+ --primary: #4f8a72;
70
+ --primary-dim: rgba(79, 138, 114, 0.10);
71
+ --accent: #4a5fb0;
72
+ --danger: oklch(0.56 0.22 25);
73
+ --warn: oklch(0.62 0.16 65);
74
+ --ok: oklch(0.55 0.16 150);
75
+ --ring: #4f8a72;
76
+ --chart-1: #0284c7;
77
+ --chart-2: #16a34a;
78
+ --chart-3: #b45309;
79
+ --chart-4: #7c3aed;
80
+ --chart-5: #dc2626;
81
+ --chart-6: #0d9488;
82
+ --chart-7: #db2777;
83
+ --chart-8: #475569;
84
+ }
85
+
86
+ [data-theme="dark"] {
87
+ color-scheme: dark;
88
+ --bg: oklch(0.13 0.005 260);
89
+ --surface: oklch(0.16 0.006 260);
90
+ --card: oklch(0.18 0.006 260);
91
+ --overlay: oklch(0.21 0.008 260);
92
+ --fg: oklch(0.97 0 0);
93
+ --muted: oklch(0.74 0.012 260);
94
+ --faint: oklch(0.58 0.011 260);
95
+ --border: oklch(1 0 0 / 9%);
96
+ --border-strong: oklch(1 0 0 / 16%);
97
+ --primary: #8fccb6;
98
+ --primary-dim: rgba(143, 204, 182, 0.16);
99
+ --accent: #869ce2;
100
+ --danger: oklch(0.66 0.22 25);
101
+ --warn: oklch(0.80 0.16 75);
102
+ --ok: oklch(0.78 0.17 150);
103
+ --ring: #8fccb6;
104
+ --chart-1: #38bdf8;
105
+ --chart-2: #4ade80;
106
+ --chart-3: #fbbf24;
107
+ --chart-4: #a78bfa;
108
+ --chart-5: #f87171;
109
+ --chart-6: #2dd4bf;
110
+ --chart-7: #f472b6;
111
+ --chart-8: #94a3b8;
112
+ }
113
+
114
+ [data-theme="wmm"] {
115
+ color-scheme: dark;
116
+ --bg: #080b14;
117
+ --surface: #0b1322;
118
+ --card: #0f172a;
119
+ --overlay: #16203a;
120
+ --fg: #f8fafc;
121
+ --muted: #94a3b8;
122
+ --faint: #64748b;
123
+ --border: rgba(255, 255, 255, 0.08);
124
+ --border-strong: rgba(255, 255, 255, 0.14);
125
+ --primary: #8fccb6;
126
+ --primary-dim: rgba(143, 204, 182, 0.16);
127
+ --accent: #869ce2;
128
+ --danger: #ef4444;
129
+ --warn: #f59e0b;
130
+ --ok: #22c55e;
131
+ --ring: #8fccb6;
132
+ --chart-1: #38bdf8;
133
+ --chart-2: #4ade80;
134
+ --chart-3: #fbbf24;
135
+ --chart-4: #a78bfa;
136
+ --chart-5: #f87171;
137
+ --chart-6: #2dd4bf;
138
+ --chart-7: #f472b6;
139
+ --chart-8: #94a3b8;
140
+ }
@@ -0,0 +1,50 @@
1
+ /* GENERATED client theme: Acme (base: light). DO NOT EDIT — regenerate.
2
+ Import AFTER the base theme; set <html data-theme="acme">. */
3
+
4
+ /* shadcn vocab (primitives / blocks / charts) */
5
+ [data-theme="acme"] {
6
+ color-scheme: light;
7
+ --background: oklch(0.985 0.003 250);
8
+ --foreground: oklch(0.22 0.012 260);
9
+ --card: oklch(1 0 0);
10
+ --card-foreground: oklch(0.22 0.012 260);
11
+ --popover: oklch(0.965 0.004 250);
12
+ --popover-foreground: oklch(0.22 0.012 260);
13
+ --primary: #e11d48;
14
+ --primary-foreground: #ffffff;
15
+ --secondary: oklch(1 0 0);
16
+ --secondary-foreground: oklch(0.22 0.012 260);
17
+ --muted: oklch(1 0 0);
18
+ --muted-foreground: oklch(0.42 0.012 260);
19
+ --accent: oklch(0.965 0.004 250);
20
+ --accent-foreground: oklch(0.22 0.012 260);
21
+ --destructive: oklch(0.56 0.22 25);
22
+ --border: oklch(0 0 0 / 8%);
23
+ --input: oklch(0 0 0 / 14%);
24
+ --ring: #e11d48;
25
+ --chart-1: #e11d48;
26
+ --chart-2: #2563eb;
27
+ --chart-3: oklch(0.55 0.16 150);
28
+ --chart-4: oklch(0.62 0.16 65);
29
+ --chart-5: oklch(0.56 0.22 25);
30
+ }
31
+
32
+ /* wmm-native vocab (apps on --bg/--fg/… ) */
33
+ [data-theme="acme"] {
34
+ --bg: oklch(0.985 0.003 250);
35
+ --surface: oklch(1 0 0);
36
+ --card: oklch(1 0 0);
37
+ --overlay: oklch(0.965 0.004 250);
38
+ --fg: oklch(0.22 0.012 260);
39
+ --muted: oklch(0.42 0.012 260);
40
+ --faint: oklch(0.58 0.01 260);
41
+ --border: oklch(0 0 0 / 8%);
42
+ --border-strong: oklch(0 0 0 / 14%);
43
+ --primary: #e11d48;
44
+ --primary-dim: oklch(0.58 0.15 175 / 12%);
45
+ --accent: #2563eb;
46
+ --danger: oklch(0.56 0.22 25);
47
+ --warn: oklch(0.62 0.16 65);
48
+ --ok: oklch(0.55 0.16 150);
49
+ --ring: #e11d48;
50
+ }
@@ -0,0 +1,453 @@
1
+ /* @web-my-money/tokens/themes/extended.css
2
+ Extended design tokens — typography scale, gradients, glass, glow, shadows.
3
+ Imported automatically via @web-my-money/tokens/theme (do not import separately). */
4
+
5
+ /* ── Typography ─────────────────────────────────────────────── */
6
+ :root {
7
+ /* Font stacks (next/font populates the var()s; these are the fallback chains) */
8
+ --font-sans: var(--font-inter, ui-sans-serif, system-ui, sans-serif);
9
+ --font-display: var(--font-space-grotesk, "Space Grotesk", var(--font-inter, ui-sans-serif));
10
+ --font-mono: ui-monospace, "JetBrains Mono", "Fira Code", monospace;
11
+
12
+ /* Type scale — rem, 4px base */
13
+ --text-xs: 0.75rem; /* 12px */
14
+ --text-sm: 0.875rem; /* 14px */
15
+ --text-base: 1rem; /* 16px */
16
+ --text-lg: 1.125rem; /* 18px */
17
+ --text-xl: 1.25rem; /* 20px */
18
+ --text-2xl: 1.5rem; /* 24px */
19
+ --text-3xl: 1.875rem; /* 30px */
20
+ --text-4xl: 2.25rem; /* 36px */
21
+ --text-5xl: 3rem; /* 48px */
22
+ --text-6xl: 3.75rem; /* 60px */
23
+ --text-display: clamp(2.5rem, 4.5vw + 0.5rem, 4.5rem); /* fluid hero */
24
+
25
+ /* Line heights */
26
+ --leading-none: 1;
27
+ --leading-tight: 1.25;
28
+ --leading-snug: 1.375;
29
+ --leading-normal: 1.5;
30
+ --leading-relaxed: 1.625;
31
+ --leading-loose: 2;
32
+
33
+ /* Font weights */
34
+ --font-normal: 400;
35
+ --font-medium: 500;
36
+ --font-semibold: 600;
37
+ --font-bold: 700;
38
+ --font-black: 900;
39
+
40
+ /* Letter spacing */
41
+ --tracking-tight: -0.025em;
42
+ --tracking-normal: 0em;
43
+ --tracking-wide: 0.025em;
44
+ --tracking-wider: 0.05em;
45
+ --tracking-widest: 0.1em;
46
+ }
47
+
48
+ /* ── Font-size accessibility preference ───────────────────────
49
+ Three-step text-size preference (Settings → Appearance), set by
50
+ FontSizeToggle / useFontSizePreference (@web-my-money/tokens/react) and
51
+ persisted under localStorage['wmm-font-size']. Rescales the whole UI
52
+ because the type scale above (and Tailwind's rem-based utilities) resolve
53
+ against <html>'s font-size. Generalizes wmm-finance-hr's real, proven
54
+ font-size-toggle.tsx pattern (own key there) — same 14/16/18px steps. */
55
+ html.font-md { font-size: 14px; } /* default */
56
+ html.font-lg { font-size: 16px; } /* comfortable */
57
+ html.font-xl { font-size: 18px; } /* large */
58
+
59
+ /* ── Motion ──────────────────────────────────────────────────── */
60
+ :root {
61
+ /* Durations */
62
+ --duration-instant: 80ms;
63
+ --duration-fast: 150ms;
64
+ --duration-base: 200ms;
65
+ --duration-slow: 300ms;
66
+ --duration-slower: 500ms;
67
+ --duration-glacial: 800ms;
68
+
69
+ /* Easings */
70
+ --ease-linear: linear;
71
+ --ease-in: cubic-bezier(0.4, 0, 1, 1);
72
+ --ease-out: cubic-bezier(0, 0, 0.2, 1);
73
+ --ease-in-out: cubic-bezier(0.4, 0, 0.2, 1);
74
+ --ease-spring: cubic-bezier(0.34, 1.56, 0.64, 1); /* overshoot */
75
+ --ease-bounce: cubic-bezier(0.68, -0.55, 0.27, 1.55);
76
+ --ease-smooth: cubic-bezier(0.25, 0.46, 0.45, 0.94);
77
+
78
+ /* Transition shorthands */
79
+ --transition-colors: color var(--duration-base) var(--ease-out),
80
+ background-color var(--duration-base) var(--ease-out),
81
+ border-color var(--duration-base) var(--ease-out);
82
+ --transition-opacity: opacity var(--duration-fast) var(--ease-out);
83
+ --transition-transform: transform var(--duration-base) var(--ease-spring);
84
+ --transition-all: all var(--duration-base) var(--ease-out);
85
+ }
86
+
87
+ /* ── Z-index scale ───────────────────────────────────────────── */
88
+ :root {
89
+ --z-hide: -1;
90
+ --z-base: 0;
91
+ --z-raised: 10;
92
+ --z-dropdown: 1000;
93
+ --z-sticky: 1100;
94
+ --z-overlay: 1200;
95
+ --z-modal: 1300;
96
+ --z-toast: 1400;
97
+ --z-tooltip: 1500;
98
+ }
99
+
100
+ /* ── Border radius scale ─────────────────────────────────────── */
101
+ :root {
102
+ --radius-none: 0;
103
+ --radius-xs: 0.125rem; /* 2px */
104
+ --radius-sm: 0.25rem; /* 4px */
105
+ --radius-md: 0.375rem; /* 6px */
106
+ --radius-lg: 0.5rem; /* 8px */
107
+ --radius-xl: 0.75rem; /* 12px */
108
+ --radius-2xl: 1rem; /* 16px */
109
+ --radius-3xl: 1.5rem; /* 24px */
110
+ --radius-full: 9999px;
111
+ }
112
+
113
+ /* ── Spacing scale (4px base) ────────────────────────────────── */
114
+ :root {
115
+ --space-px: 1px;
116
+ --space-0: 0;
117
+ --space-1: 0.25rem; /* 4px */
118
+ --space-2: 0.5rem; /* 8px */
119
+ --space-3: 0.75rem; /* 12px */
120
+ --space-4: 1rem; /* 16px */
121
+ --space-5: 1.25rem; /* 20px */
122
+ --space-6: 1.5rem; /* 24px */
123
+ --space-8: 2rem; /* 32px */
124
+ --space-10: 2.5rem; /* 40px */
125
+ --space-12: 3rem; /* 48px */
126
+ --space-16: 4rem; /* 64px */
127
+ --space-20: 5rem; /* 80px */
128
+ --space-24: 6rem; /* 96px */
129
+ --space-32: 8rem; /* 128px */
130
+ }
131
+
132
+ /* ── Light theme ───────────────────────────────────────────── */
133
+ :root, [data-theme="light"] {
134
+ /* Gradients */
135
+ --gradient-hero: linear-gradient(160deg, oklch(0.985 0.003 250) 0%, oklch(0.96 0.008 200) 60%, oklch(0.985 0.003 250) 100%);
136
+ --gradient-cta: linear-gradient(135deg, oklch(0.58 0.15 175) 0%, oklch(0.50 0.22 295) 100%);
137
+ --gradient-primary: linear-gradient(135deg, oklch(0.58 0.15 175) 0%, oklch(0.50 0.22 295) 100%);
138
+ --gradient-card: none;
139
+ --gradient-shine: linear-gradient(105deg, transparent 40%, oklch(0.58 0.15 175 / 6%) 50%, transparent 60%);
140
+ --gradient-teal-glow: radial-gradient(ellipse at 50% 0%, oklch(0.58 0.15 175 / 12%) 0%, transparent 70%);
141
+ --gradient-violet-glow: radial-gradient(ellipse at 80% 80%, oklch(0.50 0.22 295 / 10%) 0%, transparent 60%);
142
+
143
+ /* Glass — uses foreground (dark on light) for brand-adaptive glass */
144
+ --glass-bg: color-mix(in srgb, var(--foreground) 3%, transparent);
145
+ --glass-bg-strong: color-mix(in srgb, var(--foreground) 6%, transparent);
146
+ --glass-border: color-mix(in srgb, var(--foreground) 10%, transparent);
147
+ --glass-blur: blur(16px);
148
+
149
+ /* Glow — uses OKLCH for accuracy */
150
+ --glow-primary-sm: 0 0 20px oklch(0.58 0.15 175 / 15%);
151
+ --glow-primary: 0 0 40px oklch(0.58 0.15 175 / 12%);
152
+ --glow-primary-lg: 0 0 80px oklch(0.58 0.15 175 / 10%);
153
+ --glow-accent-sm: 0 0 20px oklch(0.50 0.22 295 / 15%);
154
+ --glow-teal-bar: inset 0 1px 0 oklch(0.58 0.15 175 / 20%);
155
+
156
+ /* Shadows */
157
+ --shadow-xs: 0 1px 2px rgba(0,0,0,0.05);
158
+ --shadow-card: 0 2px 8px rgba(0,0,0,0.06), 0 1px 2px rgba(0,0,0,0.04);
159
+ --shadow-elevated: 0 8px 32px rgba(0,0,0,0.10), 0 2px 8px rgba(0,0,0,0.06);
160
+ --shadow-dialog: 0 20px 60px rgba(0,0,0,0.15), 0 4px 16px rgba(0,0,0,0.08);
161
+ --shadow-glow: 0 4px 24px oklch(0.58 0.15 175 / 18%);
162
+ /* A second, more restrained elevation option ("Linear-quality" — soft
163
+ blur + hairline ring, no heavy shadow) alongside --shadow-card above,
164
+ not replacing it: --shadow-card already ships and other consumers may
165
+ render it as-is, so this is additive rather than a retroactive change.
166
+ Verified against wmm-tasks' production values (2026-07). */
167
+ --shadow-card-subtle: 0 1px 2px rgba(0,0,0,0.04), 0 0 0 1px rgba(0,0,0,0.03);
168
+ --shadow-card-subtle-hover: 0 0 0 1px rgba(79,138,114,0.20), 0 8px 24px rgba(0,0,0,0.10);
169
+ }
170
+
171
+ /* ── Dark theme ────────────────────────────────────────────── */
172
+ [data-theme="dark"] {
173
+ --gradient-hero: linear-gradient(160deg, oklch(0.13 0.005 260) 0%, oklch(0.17 0.012 270) 60%, oklch(0.13 0.005 260) 100%);
174
+ --gradient-cta: linear-gradient(135deg, oklch(0.78 0.15 175) 0%, oklch(0.66 0.22 295) 100%);
175
+ --gradient-primary: linear-gradient(135deg, oklch(0.78 0.15 175) 0%, oklch(0.66 0.22 295) 100%);
176
+ --gradient-card: linear-gradient(145deg, rgba(255,255,255,0.04) 0%, rgba(255,255,255,0.01) 100%);
177
+ --gradient-shine: linear-gradient(105deg, transparent 40%, oklch(0.78 0.15 175 / 8%) 50%, transparent 60%);
178
+ --gradient-teal-glow: radial-gradient(ellipse at 50% 0%, oklch(0.78 0.15 175 / 16%) 0%, transparent 70%);
179
+ --gradient-violet-glow: radial-gradient(ellipse at 80% 80%, oklch(0.66 0.22 295 / 12%) 0%, transparent 60%);
180
+
181
+ --glass-bg: rgba(255,255,255,0.04);
182
+ --glass-bg-strong: rgba(255,255,255,0.08);
183
+ --glass-border: rgba(255,255,255,0.08);
184
+ --glass-blur: blur(20px);
185
+
186
+ --glow-primary-sm: 0 0 20px oklch(0.78 0.15 175 / 25%);
187
+ --glow-primary: 0 0 40px oklch(0.78 0.15 175 / 20%);
188
+ --glow-primary-lg: 0 0 80px oklch(0.78 0.15 175 / 15%);
189
+ --glow-accent-sm: 0 0 20px oklch(0.66 0.22 295 / 25%);
190
+ --glow-teal-bar: inset 0 1px 0 oklch(0.78 0.15 175 / 20%);
191
+
192
+ --shadow-xs: 0 1px 2px rgba(0,0,0,0.2);
193
+ --shadow-card: 0 4px 24px rgba(0,0,0,0.4), 0 1px 4px rgba(0,0,0,0.2);
194
+ --shadow-elevated: 0 8px 32px rgba(0,0,0,0.4), 0 2px 8px rgba(0,0,0,0.2);
195
+ --shadow-dialog: 0 20px 60px rgba(0,0,0,0.5), 0 4px 16px rgba(0,0,0,0.3);
196
+ --shadow-glow: 0 4px 24px oklch(0.78 0.15 175 / 22%);
197
+ /* See light theme's comment above — additive, near-invisible inset
198
+ highlight instead of a heavy drop shadow. */
199
+ --shadow-card-subtle: 0 1px 0 rgba(255,255,255,0.04) inset;
200
+ --shadow-card-subtle-hover: 0 0 0 1px rgba(143,204,182,0.25), 0 8px 30px rgba(0,0,0,0.4);
201
+ }
202
+
203
+ /* ── WMM brand theme ───────────────────────────────────────── */
204
+ [data-theme="wmm"] {
205
+ --gradient-hero: linear-gradient(180deg, #070b13 0%, #080c14 46%, #0a1220 100%);
206
+ --gradient-cta: linear-gradient(135deg, #1f2d56 0%, #8fccb6 100%);
207
+ --gradient-primary: linear-gradient(135deg, #1f2d56 0%, #8fccb6 100%);
208
+ --gradient-card: linear-gradient(145deg, rgba(255,255,255,0.05) 0%, rgba(255,255,255,0.01) 100%);
209
+ --gradient-shine: linear-gradient(105deg, transparent 40%, rgba(143,204,182,0.10) 50%, transparent 60%);
210
+ --gradient-teal-glow: radial-gradient(ellipse at 50% 0%, rgba(143,204,182,0.18) 0%, transparent 70%);
211
+ --gradient-violet-glow: radial-gradient(ellipse at 84% 6%, rgba(115,136,207,0.14) 0%, transparent 60%);
212
+ --gradient-hero-full: var(--gradient-hero), var(--gradient-teal-glow), var(--gradient-violet-glow);
213
+
214
+ --glass-bg: rgba(255,255,255,0.04);
215
+ --glass-bg-strong: rgba(255,255,255,0.08);
216
+ --glass-border: rgba(255,255,255,0.09);
217
+ --glass-blur: blur(20px);
218
+
219
+ --glow-primary-sm: 0 0 20px rgba(143,204,182,0.32);
220
+ --glow-primary: 0 0 40px rgba(143,204,182,0.24);
221
+ --glow-primary-lg: 0 0 80px rgba(143,204,182,0.16);
222
+ --glow-accent-sm: 0 0 20px rgba(134,156,226,0.32);
223
+ --glow-accent: 0 0 40px rgba(134,156,226,0.24);
224
+ --glow-teal-bar: inset 0 1px 0 rgba(143,204,182,0.25);
225
+
226
+ --shadow-xs: 0 1px 2px rgba(0,0,0,0.3);
227
+ --shadow-card: 0 4px 24px rgba(0,0,0,0.5), 0 1px 4px rgba(0,0,0,0.3), var(--glow-teal-bar);
228
+ --shadow-elevated: 0 8px 32px rgba(0,0,0,0.5), 0 2px 8px rgba(0,0,0,0.3);
229
+ --shadow-dialog: 0 20px 60px rgba(0,0,0,0.6), 0 4px 16px rgba(0,0,0,0.4);
230
+ --shadow-glow: 0 4px 24px rgba(143,204,182,0.28), var(--glow-teal-bar);
231
+ /* Reuses dark's subtle values (same precedent as this theme's chart
232
+ palette above) — a low-key option for internal-tool-style surfaces
233
+ that land on the marketing-flavored wmm theme. */
234
+ --shadow-card-subtle: 0 1px 0 rgba(255,255,255,0.04) inset;
235
+ --shadow-card-subtle-hover: 0 0 0 1px rgba(143,204,182,0.25), 0 8px 30px rgba(0,0,0,0.4);
236
+ }
237
+
238
+ /* ── Native form controls ─────────────────────────────────────
239
+ Selects/date-pickers must follow the active theme, or the OS paints its
240
+ own light popup over a dark page. Ported from wmm-tasks' production fix
241
+ (verified there before centralizing here). light is the default (matches
242
+ :root above); dark + wmm are both dark-scheme themes. */
243
+ select,
244
+ input[type="date"],
245
+ input[type="datetime-local"],
246
+ input[type="time"] {
247
+ color-scheme: light;
248
+ }
249
+ [data-theme="dark"] select,
250
+ [data-theme="dark"] input[type="date"],
251
+ [data-theme="dark"] input[type="datetime-local"],
252
+ [data-theme="dark"] input[type="time"],
253
+ [data-theme="wmm"] select,
254
+ [data-theme="wmm"] input[type="date"],
255
+ [data-theme="wmm"] input[type="datetime-local"],
256
+ [data-theme="wmm"] input[type="time"] {
257
+ color-scheme: dark;
258
+ }
259
+
260
+ /* ── Accessible focus ring (fallback) ──────────────────────────
261
+ Ported from wmm-tasks. :where() keeps this at ZERO specificity, so it
262
+ only applies where nothing more specific already does — @web-my-money/
263
+ primitives' own focus-visible:ring-* utilities (real specificity) always
264
+ win over this rule; it exists purely as a safety net for apps that don't
265
+ use primitives and hand-roll their own interactive elements. Triggers
266
+ only on :focus-visible (keyboard/AT), never on a mouse click. */
267
+ :where(button, a, [role="button"], input, select, textarea):focus-visible {
268
+ outline: 2px solid var(--primary);
269
+ outline-offset: 1px;
270
+ }
271
+
272
+ /* ── Text gradient utilities ─────────────────────────────────── */
273
+ /* Usage: class="text-transparent bg-clip-text" style="backgroundImage:var(--text-gradient-primary)" */
274
+ /* Var-driven so they auto-follow whatever theme (and client brand) is active. */
275
+ :root, [data-theme="light"], [data-theme="dark"], [data-theme="wmm"] {
276
+ --text-gradient-primary: linear-gradient(90deg, var(--primary), var(--accent));
277
+ --text-gradient-brand: linear-gradient(90deg, var(--accent), var(--primary));
278
+ --text-gradient-subtle: linear-gradient(90deg, var(--foreground), color-mix(in srgb, var(--foreground) 58%, transparent));
279
+ --text-gradient-reversed: linear-gradient(90deg, var(--accent), var(--primary));
280
+ }
281
+
282
+ /* ── Mask / fade edges ───────────────────────────────────────── */
283
+ /* Usage: style={{ WebkitMaskImage: "var(--mask-fade-bottom)" }} */
284
+ :root {
285
+ --mask-fade-bottom: linear-gradient(to bottom, black 60%, transparent 100%);
286
+ --mask-fade-top: linear-gradient(to top, black 60%, transparent 100%);
287
+ --mask-fade-x: linear-gradient(to right, transparent 0%, black 8%, black 92%, transparent 100%);
288
+ --mask-fade-sides: linear-gradient(to right, transparent, black 12%, black 88%, transparent);
289
+ --mask-fade-center: radial-gradient(ellipse at center, black 50%, transparent 100%);
290
+ }
291
+
292
+ /* ── Grid / texture backgrounds ─────────────────────────────── */
293
+ /* Usage: style={{ backgroundImage: "var(--grid-hero)" }} */
294
+ :root, [data-theme="light"] {
295
+ --grid-dot: radial-gradient(circle, oklch(0.5 0 0 / 12%) 1px, transparent 1px);
296
+ --grid-dot-size: 24px 24px;
297
+ --grid-line: linear-gradient(var(--border) 1px, transparent 1px),
298
+ linear-gradient(90deg, var(--border) 1px, transparent 1px);
299
+ --grid-line-size: 40px 40px;
300
+ }
301
+ [data-theme="dark"], [data-theme="wmm"] {
302
+ --grid-dot: radial-gradient(circle, rgba(255,255,255,0.10) 1px, transparent 1px);
303
+ --grid-dot-size: 24px 24px;
304
+ --grid-line: linear-gradient(rgba(255,255,255,0.05) 1px, transparent 1px),
305
+ linear-gradient(90deg, rgba(255,255,255,0.05) 1px, transparent 1px);
306
+ --grid-line-size: 40px 40px;
307
+ }
308
+
309
+ /* ── Keyframes ───────────────────────────────────────────────── */
310
+ @keyframes wmm-pulse-glow {
311
+ 0%, 100% { opacity: 0.6; transform: scale(1); }
312
+ 50% { opacity: 1; transform: scale(1.04); }
313
+ }
314
+ @keyframes wmm-fade-up {
315
+ from { opacity: 0; transform: translateY(20px); }
316
+ to { opacity: 1; transform: translateY(0); }
317
+ }
318
+ @keyframes wmm-shimmer {
319
+ from { background-position: -200% center; }
320
+ to { background-position: 200% center; }
321
+ }
322
+ @keyframes wmm-spin-slow {
323
+ to { transform: rotate(360deg); }
324
+ }
325
+
326
+ /* Utility references (read-only — apply these animation names in component styles) */
327
+ :root {
328
+ --animate-pulse-glow: wmm-pulse-glow 2.4s ease-in-out infinite;
329
+ --animate-fade-up: wmm-fade-up var(--duration-slow) var(--ease-spring) both;
330
+ --animate-shimmer: wmm-shimmer 2.5s linear infinite;
331
+ --animate-spin-slow: wmm-spin-slow 8s linear infinite;
332
+ }
333
+
334
+ /* ── FX keyframes (dynamic backgrounds + effects) ───────────── */
335
+ @keyframes wmm-aurora-drift {
336
+ 0% { transform: translate3d(-8%, -6%, 0) scale(1); }
337
+ 33% { transform: translate3d(6%, 4%, 0) scale(1.15); }
338
+ 66% { transform: translate3d(-4%, 8%, 0) scale(0.95); }
339
+ 100% { transform: translate3d(-8%, -6%, 0) scale(1); }
340
+ }
341
+ @keyframes wmm-aurora-drift-2 {
342
+ 0% { transform: translate3d(6%, 8%, 0) scale(1.1); }
343
+ 50% { transform: translate3d(-6%, -4%, 0) scale(0.9); }
344
+ 100% { transform: translate3d(6%, 8%, 0) scale(1.1); }
345
+ }
346
+ @keyframes wmm-mesh-pan {
347
+ 0% { background-position: 0% 50%; }
348
+ 50% { background-position: 100% 50%; }
349
+ 100% { background-position: 0% 50%; }
350
+ }
351
+ @keyframes wmm-border-spin {
352
+ to { transform: translate(-50%, -50%) rotate(360deg); }
353
+ }
354
+ @keyframes wmm-float {
355
+ 0%, 100% { transform: translateY(0); }
356
+ 50% { transform: translateY(-10px); }
357
+ }
358
+
359
+ /* ── Component animations ───────────────────────────────────── */
360
+ /* Accordion panel — smooth height via Base UI's --accordion-panel-height var.
361
+ Applied through the .wmm-accordion-panel class set by @web-my-money/primitives. */
362
+ .wmm-accordion-panel {
363
+ overflow: hidden;
364
+ height: var(--accordion-panel-height);
365
+ transition: height var(--duration, 200ms) var(--ease-spring, ease-out);
366
+ }
367
+ .wmm-accordion-panel[data-starting-style],
368
+ .wmm-accordion-panel[data-ending-style] {
369
+ height: 0;
370
+ }
371
+
372
+ /* Collapsible panel — same smooth-height pattern via Base UI's var. */
373
+ .wmm-collapsible-panel {
374
+ overflow: hidden;
375
+ height: var(--collapsible-panel-height);
376
+ transition: height var(--duration, 200ms) var(--ease-spring, ease-out);
377
+ }
378
+ .wmm-collapsible-panel[data-starting-style],
379
+ .wmm-collapsible-panel[data-ending-style] {
380
+ height: 0;
381
+ }
382
+
383
+ /* Dialog / Sheet overlay + content — fade (+ scale for Dialog, directional slide
384
+ for Sheet) via Base UI's [data-starting-style]/[data-ending-style] transition
385
+ states. NOTE: tailwindcss-animate is NOT installed in this repo — Dialog's
386
+ className still carries harmless `data-open:animate-in fade-in-0 zoom-in-95`
387
+ utility names from before this was noticed; they compile to nothing (real
388
+ state attrs, fake utility names) and are superseded by the rules below, which
389
+ are the actual working animation. */
390
+ [data-slot="dialog-overlay"],
391
+ [data-slot="sheet-overlay"] {
392
+ transition: opacity var(--duration, 150ms) var(--ease-smooth, ease-out);
393
+ }
394
+ [data-slot="dialog-overlay"][data-starting-style],
395
+ [data-slot="dialog-overlay"][data-ending-style],
396
+ [data-slot="sheet-overlay"][data-starting-style],
397
+ [data-slot="sheet-overlay"][data-ending-style] {
398
+ opacity: 0;
399
+ }
400
+
401
+ [data-slot="dialog-content"] {
402
+ opacity: 1;
403
+ transform: scale(1);
404
+ transition: opacity var(--duration, 150ms) var(--ease-spring, ease-out),
405
+ transform var(--duration, 150ms) var(--ease-spring, ease-out);
406
+ }
407
+ [data-slot="dialog-content"][data-starting-style],
408
+ [data-slot="dialog-content"][data-ending-style] {
409
+ opacity: 0;
410
+ transform: scale(0.96);
411
+ }
412
+
413
+ [data-slot="sheet-content"] {
414
+ opacity: 1;
415
+ transform: translate(0, 0);
416
+ transition: opacity var(--duration, 200ms) var(--ease-spring, ease-out),
417
+ transform var(--duration, 200ms) var(--ease-spring, ease-out);
418
+ }
419
+ [data-slot="sheet-content"][data-starting-style],
420
+ [data-slot="sheet-content"][data-ending-style] { opacity: 0; }
421
+ [data-slot="sheet-content"][data-side="bottom"][data-starting-style],
422
+ [data-slot="sheet-content"][data-side="bottom"][data-ending-style] { transform: translateY(100%); }
423
+ [data-slot="sheet-content"][data-side="top"][data-starting-style],
424
+ [data-slot="sheet-content"][data-side="top"][data-ending-style] { transform: translateY(-100%); }
425
+ [data-slot="sheet-content"][data-side="right"][data-starting-style],
426
+ [data-slot="sheet-content"][data-side="right"][data-ending-style] { transform: translateX(100%); }
427
+ [data-slot="sheet-content"][data-side="left"][data-starting-style],
428
+ [data-slot="sheet-content"][data-side="left"][data-ending-style] { transform: translateX(-100%); }
429
+
430
+ /* SlideOver content — subtle rise + fade (mobile full-bleed, desktop a
431
+ centered large panel). Shares dialog-overlay's fade for the backdrop. */
432
+ [data-slot="slide-over-content"] {
433
+ opacity: 1;
434
+ transform: translateY(0);
435
+ transition: opacity var(--duration, 180ms) var(--ease-spring, ease-out),
436
+ transform var(--duration, 180ms) var(--ease-spring, ease-out);
437
+ }
438
+ [data-slot="slide-over-content"][data-starting-style],
439
+ [data-slot="slide-over-content"][data-ending-style] {
440
+ opacity: 0;
441
+ transform: translateY(12px);
442
+ }
443
+
444
+ /* Respect reduced-motion globally for FX animations */
445
+ @media (prefers-reduced-motion: reduce) {
446
+ [data-wmm-fx] { animation: none !important; }
447
+ .wmm-accordion-panel,
448
+ .wmm-collapsible-panel,
449
+ [data-slot="dialog-overlay"],
450
+ [data-slot="dialog-content"],
451
+ [data-slot="sheet-overlay"],
452
+ [data-slot="sheet-content"] { transition: none; }
453
+ }