@l.x/mycelium 1.0.2 → 1.0.3

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/.depcheckrc ADDED
@@ -0,0 +1,9 @@
1
+ ignores: [
2
+ # Standard ignores
3
+ "typescript",
4
+ "@typescript/native-preview",
5
+ "depcheck",
6
+
7
+ # Internal packages / workspaces
8
+ "@universe/mycelium",
9
+ ]
package/.eslintrc.js ADDED
@@ -0,0 +1,10 @@
1
+ module.exports = {
2
+ extends: ['@luxamm/eslint-config/lib'],
3
+ parserOptions: {
4
+ tsconfigRootDir: __dirname,
5
+ },
6
+ // Note: no-relative-import-paths is disabled for mycelium because
7
+ // this package uses `exports` in package.json (required for ./tailwind CSS export).
8
+ // Packages with `exports` cannot use absolute internal imports like
9
+ // '@luxexchange/mycelium/src/types' since they're blocked by the exports restriction.
10
+ }
package/README.md ADDED
@@ -0,0 +1,53 @@
1
+ # @universe/mycelium
2
+
3
+ Mycelium is Uniswap's shared Tailwind CSS design system for Tailwind v4.
4
+
5
+ ## Usage
6
+
7
+ ### CSS (in your app's main CSS file)
8
+
9
+ ```css
10
+ @import "tailwindcss";
11
+ @import "@universe/mycelium/tailwind";
12
+ @import "@universe/mycelium/fonts"; /* Optional: for web apps */
13
+ ```
14
+
15
+ `@universe/mycelium/tailwind` imports:
16
+ - Theme tokens (colors, typography, breakpoints, border radius)
17
+ - CSS variables (shadows, dark mode)
18
+ - Base styles
19
+ - Animations
20
+
21
+ `@universe/mycelium/fonts` imports:
22
+ - Basel Grotesk font faces (bundled, no CORS issues)
23
+
24
+ ### JavaScript (for the cn utility)
25
+
26
+ ```typescript
27
+ import { cn } from '@universe/mycelium'
28
+
29
+ // Merge class names with Tailwind conflict resolution
30
+ cn('text-sm', 'text-body-1') // => 'text-body-1'
31
+ cn('bg-red-500', isActive && 'bg-blue-500') // => conditional classes
32
+ ```
33
+
34
+ ## What's Included
35
+
36
+ ### Typography Scale
37
+ - `text-heading-1`, `text-heading-2`, `text-heading-3`
38
+ - `text-subheading-1`, `text-subheading-2`
39
+ - `text-body-1`, `text-body-2`, `text-body-3`, `text-body-4`
40
+ - `text-button-1`, `text-button-2`, `text-button-3`, `text-button-4`
41
+
42
+ ### Color Tokens
43
+ - Semantic: `neutral1-3`, `surface1-5`, `accent1-4`
44
+ - Status: `success`, `warning`, `critical`
45
+ - Network: `network-ethereum`, `network-optimism`, etc.
46
+ - Full palettes: gray, pink, red, yellow, green, blue, gold, magenta, purple
47
+
48
+ ### Animations
49
+ - View transitions
50
+ - Dialog animations
51
+ - Button loading states
52
+ - Console terminal effects
53
+ - Logo carousel
@@ -0,0 +1,280 @@
1
+ /* Keyframe Animations */
2
+
3
+ /* View Transitions */
4
+ ::view-transition-old(crossfade) {
5
+ animation: hide 200ms cubic-bezier(0.4, 0, 0.2, 1) forwards;
6
+ }
7
+
8
+ ::view-transition-new(crossfade) {
9
+ opacity: 0;
10
+ animation: appear 300ms cubic-bezier(0.4, 0, 0.2, 1) 80ms forwards;
11
+ }
12
+
13
+ @keyframes hide {
14
+ 0% {
15
+ opacity: 1;
16
+ transform: translateY(0);
17
+ filter: blur(0);
18
+ }
19
+ 100% {
20
+ opacity: 0;
21
+ transform: translateY(8px);
22
+ filter: blur(4px);
23
+ }
24
+ }
25
+
26
+ @keyframes appear {
27
+ 0% {
28
+ opacity: 0;
29
+ transform: translateY(5px);
30
+ filter: blur(4px);
31
+ }
32
+ 100% {
33
+ opacity: 1;
34
+ transform: translateY(0);
35
+ filter: blur(0);
36
+ }
37
+ }
38
+
39
+ /* Dialog Animation - Subtle crossfade style */
40
+ @keyframes dialog-appear {
41
+ 0% {
42
+ opacity: 0;
43
+ transform: translate(-50%, calc(-50% + 4px));
44
+ }
45
+ 100% {
46
+ opacity: 1;
47
+ transform: translate(-50%, -50%);
48
+ }
49
+ }
50
+
51
+ @keyframes dialog-hide {
52
+ 0% {
53
+ opacity: 1;
54
+ transform: translate(-50%, -50%);
55
+ }
56
+ 100% {
57
+ opacity: 0;
58
+ transform: translate(-50%, calc(-50% + 4px));
59
+ }
60
+ }
61
+
62
+ .dialog-content[data-state="open"] {
63
+ animation: dialog-appear 200ms cubic-bezier(0.6, 0, 0.8, 1) forwards;
64
+ }
65
+
66
+ .dialog-content[data-state="closed"] {
67
+ animation: dialog-hide 150ms cubic-bezier(0.6, 0, 0.8, 1) forwards;
68
+ }
69
+
70
+ /* Blur Fade Animations */
71
+ @keyframes blur-fade-in {
72
+ 0% {
73
+ opacity: 0;
74
+ filter: blur(4px);
75
+ }
76
+ 100% {
77
+ opacity: 1;
78
+ filter: blur(0);
79
+ }
80
+ }
81
+
82
+ @keyframes blur-fade-out {
83
+ 0% {
84
+ opacity: 1;
85
+ filter: blur(0);
86
+ }
87
+ 100% {
88
+ opacity: 0;
89
+ filter: blur(4px);
90
+ }
91
+ }
92
+
93
+ /* No entrance animation - just show immediately */
94
+ .animate-entrance {
95
+ opacity: 1;
96
+ }
97
+
98
+ /* Blur fade in with translate - for elements that appear on mount */
99
+ .animate-blur-fade-in {
100
+ animation: blur-fade-in-translate 0.2s cubic-bezier(0.4, 0, 0.2, 1) forwards;
101
+ }
102
+
103
+ @keyframes blur-fade-in-translate {
104
+ 0% {
105
+ opacity: 0;
106
+ transform: translateY(-4px);
107
+ filter: blur(4px);
108
+ }
109
+ 100% {
110
+ opacity: 1;
111
+ transform: translateY(0);
112
+ filter: blur(0);
113
+ }
114
+ }
115
+
116
+ /* Blur fade out with translate and height collapse - for elements that exit */
117
+ .animate-blur-fade-out {
118
+ animation: blur-fade-out-translate 0.3s cubic-bezier(0.4, 0, 0.2, 1) forwards;
119
+ overflow: hidden;
120
+ }
121
+
122
+ @keyframes blur-fade-out-translate {
123
+ 0% {
124
+ opacity: 1;
125
+ transform: translateY(0);
126
+ filter: blur(0);
127
+ max-height: 500px;
128
+ margin-bottom: 0;
129
+ }
130
+ 50% {
131
+ opacity: 0;
132
+ transform: translateY(4px);
133
+ filter: blur(4px);
134
+ }
135
+ 100% {
136
+ opacity: 0;
137
+ transform: translateY(4px);
138
+ filter: blur(4px);
139
+ max-height: 0;
140
+ margin-bottom: -40px;
141
+ }
142
+ }
143
+
144
+ /* State-driven blur fade for elements inside stateful containers */
145
+ [data-state="open"] .blur-fade-item {
146
+ animation: blur-fade-in 0.2s cubic-bezier(0.4, 0, 0.2, 1) forwards;
147
+ }
148
+
149
+ [data-state="closed"] .blur-fade-item {
150
+ animation: blur-fade-out 0.2s cubic-bezier(0.4, 0, 0.2, 1) forwards;
151
+ pointer-events: none;
152
+ }
153
+
154
+ /* Button Loading Crossfade - Pure CSS Transitions */
155
+ .button-loading-text {
156
+ opacity: 1;
157
+ transform: translateY(0);
158
+ filter: blur(0);
159
+ transition:
160
+ opacity 200ms cubic-bezier(0.4, 0, 0.2, 1),
161
+ transform 200ms cubic-bezier(0.4, 0, 0.2, 1),
162
+ filter 200ms cubic-bezier(0.4, 0, 0.2, 1);
163
+ }
164
+
165
+ .button-loading-text[data-loading="true"] {
166
+ opacity: 0;
167
+ transform: translateY(4px);
168
+ filter: blur(4px);
169
+ }
170
+
171
+ .button-loading-spinner {
172
+ opacity: 0;
173
+ transform: translateY(-4px);
174
+ filter: blur(4px);
175
+ pointer-events: none;
176
+ transition:
177
+ opacity 200ms cubic-bezier(0.4, 0, 0.2, 1) 50ms,
178
+ transform 200ms cubic-bezier(0.4, 0, 0.2, 1) 50ms,
179
+ filter 200ms cubic-bezier(0.4, 0, 0.2, 1) 50ms;
180
+ }
181
+
182
+ .button-loading-spinner[data-loading="true"] {
183
+ opacity: 1;
184
+ transform: translateY(0);
185
+ filter: blur(0);
186
+ pointer-events: auto;
187
+ }
188
+
189
+ /* Button State Icons - Crossfade between spinner and success checkmark */
190
+ .button-state-spinner,
191
+ .button-state-success {
192
+ opacity: 0;
193
+ transform: translateY(-4px);
194
+ filter: blur(4px);
195
+ pointer-events: none;
196
+ transition:
197
+ opacity 200ms cubic-bezier(0.4, 0, 0.2, 1),
198
+ transform 200ms cubic-bezier(0.4, 0, 0.2, 1),
199
+ filter 200ms cubic-bezier(0.4, 0, 0.2, 1);
200
+ }
201
+
202
+ .button-state-spinner[data-visible="true"],
203
+ .button-state-success[data-visible="true"] {
204
+ opacity: 1;
205
+ transform: translateY(0);
206
+ filter: blur(0);
207
+ pointer-events: auto;
208
+ }
209
+
210
+ /* Console Terminal Animations */
211
+ @keyframes blink {
212
+ 0%,
213
+ 50% {
214
+ opacity: 1;
215
+ }
216
+ 51%,
217
+ 100% {
218
+ opacity: 0;
219
+ }
220
+ }
221
+
222
+ .console-cursor {
223
+ animation: blink 1s step-end infinite;
224
+ }
225
+
226
+ @keyframes console-fade-in {
227
+ 0% {
228
+ opacity: 0;
229
+ transform: translateY(10px);
230
+ }
231
+ 100% {
232
+ opacity: 1;
233
+ transform: translateY(0);
234
+ }
235
+ }
236
+
237
+ .console-fade-in {
238
+ animation: console-fade-in 400ms cubic-bezier(0.4, 0, 0.2, 1) forwards;
239
+ }
240
+
241
+ /* Logo Carousel Animation - scrolls through one third of content for 3x duplicated logos */
242
+ @keyframes logo-scroll {
243
+ 0% {
244
+ transform: translateX(0) translateZ(0);
245
+ }
246
+ 100% {
247
+ transform: translateX(calc(-33.333%)) translateZ(0);
248
+ }
249
+ }
250
+
251
+ /* Overlay Animations - matches view transition timings */
252
+ @keyframes overlay-hide {
253
+ 0% {
254
+ opacity: 1;
255
+ backdrop-filter: blur(4px);
256
+ }
257
+ 100% {
258
+ opacity: 0;
259
+ backdrop-filter: blur(0);
260
+ }
261
+ }
262
+
263
+ @keyframes overlay-appear {
264
+ 0% {
265
+ opacity: 0;
266
+ backdrop-filter: blur(0);
267
+ }
268
+ 100% {
269
+ opacity: 1;
270
+ backdrop-filter: blur(4px);
271
+ }
272
+ }
273
+
274
+ .overlay-backdrop[data-state="open"] {
275
+ animation: overlay-appear 300ms cubic-bezier(0.4, 0, 0.2, 1) forwards;
276
+ }
277
+
278
+ .overlay-backdrop[data-state="closed"] {
279
+ animation: overlay-hide 200ms cubic-bezier(0.4, 0, 0.2, 1) forwards;
280
+ }
package/css/base.css ADDED
@@ -0,0 +1,13 @@
1
+ /* Base Layer Styles */
2
+
3
+ @custom-variant dark (&:is(.dark *));
4
+
5
+ @layer base {
6
+ html,
7
+ body {
8
+ @apply bg-background text-foreground font-basel;
9
+ }
10
+ * {
11
+ @apply border-border outline-ring/50;
12
+ }
13
+ }
package/css/fonts.css ADDED
@@ -0,0 +1,25 @@
1
+ /* Basel Grotesk Font Faces */
2
+
3
+ @font-face {
4
+ font-family: "Basel Grotesk";
5
+ src:
6
+ url("../fonts/Basel-Grotesk-Book.woff2") format("woff2"),
7
+ url("../fonts/Basel-Grotesk-Book.woff") format("woff");
8
+ font-weight: 485;
9
+ font-style: normal;
10
+ font-display: swap;
11
+ -webkit-font-smoothing: antialiased;
12
+ text-rendering: optimizeLegibility;
13
+ }
14
+
15
+ @font-face {
16
+ font-family: "Basel Grotesk";
17
+ src:
18
+ url("../fonts/Basel-Grotesk-Medium.woff2") format("woff2"),
19
+ url("../fonts/Basel-Grotesk-Medium.woff") format("woff");
20
+ font-weight: 535;
21
+ font-style: normal;
22
+ font-display: swap;
23
+ -webkit-font-smoothing: antialiased;
24
+ text-rendering: optimizeLegibility;
25
+ }
package/css/theme.css ADDED
@@ -0,0 +1,322 @@
1
+ /* Mycelium Theme Tokens for Tailwind v4 */
2
+
3
+ @theme {
4
+ /* Font Families - these create font-* utilities */
5
+ --font-basel: "Basel Grotesk", sans-serif;
6
+ --font-basel-book: "Basel Grotesk Book", -apple-system, system-ui, BlinkMacSystemFont, "Segoe UI",
7
+ Roboto, Helvetica, Arial, sans-serif;
8
+ --font-basel-medium: "Basel Grotesk Medium", -apple-system, system-ui, BlinkMacSystemFont,
9
+ "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
10
+ --font-mono: "InputMono-Regular", monospace;
11
+
12
+ /* Font Weights */
13
+ --font-weight-book: 485;
14
+ --font-weight-medium: 535;
15
+
16
+ /* Breakpoints */
17
+ --breakpoint-xxs: 360px;
18
+ --breakpoint-xs: 380px;
19
+ --breakpoint-sm: 450px;
20
+ --breakpoint-md: 640px;
21
+ --breakpoint-lg: 768px;
22
+ --breakpoint-xl: 1024px;
23
+ --breakpoint-xxl: 1280px;
24
+ --breakpoint-xxxl: 1536px;
25
+
26
+ /* Typography Scale - Headings (creates text-heading-* utilities) */
27
+ --text-heading-1: 52px;
28
+ --text-heading-1--line-height: 60px;
29
+ --text-heading-1--letter-spacing: -0.02em;
30
+ --text-heading-1--font-weight: 485;
31
+
32
+ --text-heading-2: 36px;
33
+ --text-heading-2--line-height: 44px;
34
+ --text-heading-2--letter-spacing: -0.01em;
35
+ --text-heading-2--font-weight: 485;
36
+
37
+ --text-heading-3: 24px;
38
+ --text-heading-3--line-height: 32px;
39
+ --text-heading-3--letter-spacing: -0.005em;
40
+ --text-heading-3--font-weight: 485;
41
+
42
+ /* Typography Scale - Subheadings */
43
+ --text-subheading-1: 18px;
44
+ --text-subheading-1--line-height: 24px;
45
+ --text-subheading-1--font-weight: 485;
46
+
47
+ --text-subheading-2: 16px;
48
+ --text-subheading-2--line-height: 24px;
49
+ --text-subheading-2--font-weight: 485;
50
+
51
+ /* Typography Scale - Body */
52
+ --text-body-1: 18px;
53
+ --text-body-1--line-height: 24px;
54
+ --text-body-1--font-weight: 485;
55
+
56
+ --text-body-2: 16px;
57
+ --text-body-2--line-height: 24px;
58
+ --text-body-2--font-weight: 485;
59
+
60
+ --text-body-3: 14px;
61
+ --text-body-3--line-height: 20px;
62
+ --text-body-3--font-weight: 485;
63
+
64
+ --text-body-4: 12px;
65
+ --text-body-4--line-height: 16px;
66
+ --text-body-4--font-weight: 485;
67
+
68
+ /* Typography Scale - Buttons */
69
+ --text-button-1: 18px;
70
+ --text-button-1--line-height: 24px;
71
+ --text-button-1--font-weight: 535;
72
+
73
+ --text-button-2: 16px;
74
+ --text-button-2--line-height: 24px;
75
+ --text-button-2--font-weight: 535;
76
+
77
+ --text-button-3: 14px;
78
+ --text-button-3--line-height: 20px;
79
+ --text-button-3--font-weight: 535;
80
+
81
+ --text-button-4: 12px;
82
+ --text-button-4--line-height: 16px;
83
+ --text-button-4--font-weight: 535;
84
+
85
+ /* Base Colors */
86
+ --color-white: #ffffff;
87
+ --color-black: #000000;
88
+
89
+ /* Semantic Colors - Background */
90
+ --color-background: #ffffff;
91
+ --color-background-dark: #000000;
92
+
93
+ /* Semantic Colors - Neutrals */
94
+ --color-neutral1-light: #222222;
95
+ --color-neutral1-dark: #ffffff;
96
+ --color-neutral2-light: #7d7d7d;
97
+ --color-neutral2-dark: #9b9b9b;
98
+ --color-neutral3-light: #cecece;
99
+ --color-neutral3-dark: #5e5e5e;
100
+
101
+ /* Semantic Colors - Surfaces */
102
+ --color-surface1-light: #ffffff;
103
+ --color-surface1-dark: #131313;
104
+ --color-surface1-hovered: #f5f5f5;
105
+ --color-surface1-hovered-dark: #181818;
106
+
107
+ --color-surface2-light: #f9f9f9;
108
+ --color-surface2-dark: #1b1b1b;
109
+ --color-surface2-hovered: #f2f2f2;
110
+ --color-surface2-hovered-dark: #242424;
111
+
112
+ --color-surface3-light: #22222212;
113
+ --color-surface3-dark: #ffffff12;
114
+ --color-surface3-hovered: rgba(34, 34, 34, 0.12);
115
+ --color-surface3-hovered-dark: rgba(255, 255, 255, 0.16);
116
+
117
+ --color-surface4-light: #ffffff64;
118
+ --color-surface4-dark: #ffffff20;
119
+
120
+ --color-surface5-light: #00000004;
121
+ --color-surface5-dark: #00000004;
122
+
123
+ /* Semantic Colors - Accents */
124
+ --color-accent1-light: #ff37c7;
125
+ --color-accent1-dark: #ff37c7;
126
+ --color-accent2-light: #ffefff;
127
+ --color-accent2-dark: #311c31;
128
+ --color-accent3: #4c82fb;
129
+ --color-accent3-dark: #4c82fb;
130
+ --color-accent4: #fdaff0;
131
+ --color-accent4-light: #fef4ff;
132
+
133
+ /* Token Colors */
134
+ --color-token0: #fc72ff;
135
+ --color-token0-dark: #fc72ff;
136
+ --color-token1: #4c82fb;
137
+ --color-token1-dark: #4c82fb;
138
+
139
+ /* Status Colors */
140
+ --color-success-light: #0c8911;
141
+ --color-success-dark: #21c95e;
142
+ --color-critical-light: #e10f0f;
143
+ --color-critical-dark: #ff593c;
144
+ --color-critical-secondary: #fff2f1;
145
+ --color-critical-secondary-dark: #2e0805;
146
+ --color-warning: #eeb317;
147
+
148
+ /* Network Colors */
149
+ --color-network-ethereum: #627eea;
150
+ --color-network-optimism: #ff0420;
151
+ --color-network-polygon: #a457ff;
152
+ --color-network-arbitrum: #28a0f0;
153
+ --color-network-bsc: #f0b90b;
154
+ --color-network-base: #0052ff;
155
+ --color-network-blast: #fcfc03;
156
+
157
+ /* Decorative/Pattern Colors */
158
+ --color-pattern-dots-dark: rgba(252, 116, 254, 0.08);
159
+ --color-pattern-dots-light: rgba(252, 116, 254, 0.2);
160
+
161
+ /* Gray Palette */
162
+ --color-gray-50: #f5f6fc;
163
+ --color-gray-100: #e8ecfb;
164
+ --color-gray-150: #d2d9ee;
165
+ --color-gray-200: #b8c0dc;
166
+ --color-gray-250: #a6afca;
167
+ --color-gray-300: #98a1c0;
168
+ --color-gray-350: #888fab;
169
+ --color-gray-400: #7780a0;
170
+ --color-gray-450: #6b7594;
171
+ --color-gray-500: #5d6785;
172
+ --color-gray-550: #505a78;
173
+ --color-gray-600: #404a67;
174
+ --color-gray-650: #333d59;
175
+ --color-gray-700: #293249;
176
+ --color-gray-750: #1b2236;
177
+ --color-gray-800: #131a2a;
178
+ --color-gray-850: #0e1524;
179
+ --color-gray-900: #0d111c;
180
+ --color-gray-950: #080b11;
181
+
182
+ /* Pink Palette */
183
+ --color-pink-50: #f9ecf1;
184
+ --color-pink-100: #ffd9e4;
185
+ --color-pink-200: #fba4c0;
186
+ --color-pink-300: #ff6fa3;
187
+ --color-pink-400: #fb118e;
188
+ --color-pink-500: #c41969;
189
+ --color-pink-600: #8c0f49;
190
+ --color-pink-700: #55072a;
191
+ --color-pink-800: #350318;
192
+ --color-pink-900: #2b000b;
193
+ --color-pink-vibrant: #f50db4;
194
+ --color-pink-base: #fc74fe;
195
+
196
+ /* Red Palette */
197
+ --color-red-50: #faecea;
198
+ --color-red-100: #fed5cf;
199
+ --color-red-200: #fea79b;
200
+ --color-red-300: #fd766b;
201
+ --color-red-400: #fa2b39;
202
+ --color-red-500: #c4292f;
203
+ --color-red-600: #891e20;
204
+ --color-red-700: #530f0f;
205
+ --color-red-800: #380a03;
206
+ --color-red-900: #240800;
207
+ --color-red-vibrant: #f14544;
208
+
209
+ /* Yellow Palette */
210
+ --color-yellow-50: #f6f2d5;
211
+ --color-yellow-100: #dbbc19;
212
+ --color-yellow-200: #dbbc19;
213
+ --color-yellow-300: #bb9f13;
214
+ --color-yellow-400: #a08116;
215
+ --color-yellow-500: #866311;
216
+ --color-yellow-600: #5d4204;
217
+ --color-yellow-700: #3e2b04;
218
+ --color-yellow-800: #231902;
219
+ --color-yellow-900: #180f02;
220
+ --color-yellow-vibrant: #faf40a;
221
+
222
+ /* Green Palette */
223
+ --color-green-50: #e3f3e6;
224
+ --color-green-100: #bfeeca;
225
+ --color-green-200: #76d191;
226
+ --color-green-300: #40b66b;
227
+ --color-green-400: #209853;
228
+ --color-green-500: #0b783e;
229
+ --color-green-600: #0c522a;
230
+ --color-green-700: #053117;
231
+ --color-green-800: #091f10;
232
+ --color-green-900: #09130b;
233
+ --color-green-vibrant: #5cfe9d;
234
+
235
+ /* Blue Palette */
236
+ --color-blue-50: #edeff8;
237
+ --color-blue-100: #dee1ff;
238
+ --color-blue-200: #adbcff;
239
+ --color-blue-300: #869eff;
240
+ --color-blue-400: #4c82fb;
241
+ --color-blue-500: #1267d6;
242
+ --color-blue-600: #1d4294;
243
+ --color-blue-700: #09265e;
244
+ --color-blue-800: #0b193f;
245
+ --color-blue-900: #040e34;
246
+ --color-blue-vibrant: #587bff;
247
+
248
+ /* Gold Palette */
249
+ --color-gold-200: #eeb317;
250
+ --color-gold-400: #b17900;
251
+ --color-gold-vibrant: #feb239;
252
+
253
+ /* Magenta Palette */
254
+ --color-magenta-300: #fd82ff;
255
+ --color-magenta-vibrant: #fc72ff;
256
+
257
+ /* Purple Palette */
258
+ --color-purple-300: #8440f2;
259
+ --color-purple-900: #1c0337;
260
+ --color-purple-vibrant: #6100ff;
261
+
262
+ /* Unicon Avatar Colors - Light Mode */
263
+ --color-unicon-0-light: #f50db4;
264
+ --color-unicon-1-light: #ffbf17;
265
+ --color-unicon-2-light: #ff8934;
266
+ --color-unicon-3-light: #85754a;
267
+ --color-unicon-4-light: #0c8911;
268
+ --color-unicon-5-light: #78e744;
269
+ --color-unicon-6-light: #00c3a0;
270
+ --color-unicon-7-light: #23a3ff;
271
+ --color-unicon-8-light: #4981ff;
272
+ --color-unicon-9-light: #4300b0;
273
+
274
+ /* Unicon Avatar Colors - Dark Mode */
275
+ --color-unicon-0-dark: #fc74fe;
276
+ --color-unicon-1-dark: #fff612;
277
+ --color-unicon-2-dark: #ff4d00;
278
+ --color-unicon-3-dark: #996f01;
279
+ --color-unicon-4-dark: #21c95e;
280
+ --color-unicon-5-dark: #b1f13c;
281
+ --color-unicon-6-dark: #5cfe9d;
282
+ --color-unicon-7-dark: #3adcff;
283
+ --color-unicon-8-dark: #0047ff;
284
+ --color-unicon-9-dark: #9e62ff;
285
+
286
+ /* Legacy/Compatibility Colors */
287
+ --color-border: #f9f9f9;
288
+ --color-input: #f9f9f9;
289
+ --color-ring: #222222;
290
+ --color-foreground: #222222;
291
+ --color-card: #ffffff;
292
+ --color-card-foreground: #222222;
293
+ --color-popover: #ffffff;
294
+ --color-popover-foreground: #222222;
295
+ --color-primary: #222222;
296
+ --color-primary-foreground: #f9f9f9;
297
+ --color-secondary: #f9f9f9;
298
+ --color-secondary-foreground: #222222;
299
+ --color-muted: #f9f9f9;
300
+ --color-muted-foreground: #7d7d7d;
301
+ --color-destructive: #ff5f52;
302
+ --color-destructive-foreground: #f9f9f9;
303
+ --color-scrim: rgba(0, 0, 0, 0.6);
304
+
305
+ /* Border Radius */
306
+ --radius-none: 0px;
307
+ --radius-4: 4px;
308
+ --radius-6: 6px;
309
+ --radius-8: 8px;
310
+ --radius-12: 12px;
311
+ --radius-16: 16px;
312
+ --radius-20: 20px;
313
+ --radius-24: 24px;
314
+ --radius-28: 28px;
315
+ --radius-32: 32px;
316
+ --radius-full: 999999px;
317
+
318
+ /* Box Shadows */
319
+ --shadow-short: var(--shadow-short);
320
+ --shadow-medium: var(--shadow-medium);
321
+ --shadow-large: var(--shadow-large);
322
+ }