@sudobility/components 2.0.24 → 2.0.26

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,3543 +0,0 @@
1
- const r = {
2
- // Blue palette - primary brand color
3
- blue: {
4
- 50: "#eff6ff",
5
- 100: "#dbeafe",
6
- 200: "#bfdbfe",
7
- 300: "#93c5fd",
8
- 400: "#60a5fa",
9
- 500: "#3b82f6",
10
- 600: "#2563eb",
11
- 700: "#1d4ed8",
12
- 800: "#1e40af",
13
- 900: "#1e3a8a",
14
- 950: "#172554"
15
- },
16
- // Purple palette - secondary brand color
17
- purple: {
18
- 50: "#faf5ff",
19
- 100: "#f3e8ff",
20
- 200: "#e9d5ff",
21
- 300: "#d8b4fe",
22
- 400: "#c084fc",
23
- 500: "#a855f7",
24
- 600: "#9333ea",
25
- 700: "#7c3aed",
26
- 800: "#6b21a8",
27
- 900: "#581c87",
28
- 950: "#3b0764"
29
- },
30
- // Neutral palette - backgrounds, text, borders
31
- neutral: {
32
- 0: "#ffffff",
33
- 50: "#f9fafb",
34
- 100: "#f3f4f6",
35
- 200: "#e5e7eb",
36
- 300: "#d1d5db",
37
- 400: "#9ca3af",
38
- 500: "#6b7280",
39
- 600: "#4b5563",
40
- 700: "#374151",
41
- 800: "#1f2937",
42
- 900: "#111827",
43
- 950: "#030712"
44
- },
45
- // Semantic state colors
46
- red: {
47
- 50: "#fef2f2",
48
- 100: "#fee2e2",
49
- 200: "#fecaca",
50
- 300: "#fca5a5",
51
- 400: "#f87171",
52
- 500: "#ef4444",
53
- 600: "#dc2626",
54
- 700: "#b91c1c",
55
- 800: "#991b1b",
56
- 900: "#7f1d1d",
57
- 950: "#450a0a"
58
- },
59
- orange: {
60
- 50: "#fff7ed",
61
- 100: "#ffedd5",
62
- 200: "#fed7aa",
63
- 300: "#fdba74",
64
- 400: "#fb923c",
65
- 500: "#f97316",
66
- 600: "#ea580c",
67
- 700: "#c2410c",
68
- 800: "#9a3412",
69
- 900: "#7c2d12",
70
- 950: "#431407"
71
- },
72
- amber: {
73
- 50: "#fffbeb",
74
- 100: "#fef3c7",
75
- 200: "#fde68a",
76
- 300: "#fcd34d",
77
- 400: "#fbbf24",
78
- 500: "#f59e0b",
79
- 600: "#d97706",
80
- 700: "#b45309",
81
- 800: "#92400e",
82
- 900: "#78350f",
83
- 950: "#451a03"
84
- },
85
- green: {
86
- 50: "#f0fdf4",
87
- 100: "#dcfce7",
88
- 200: "#bbf7d0",
89
- 300: "#86efac",
90
- 400: "#4ade80",
91
- 500: "#22c55e",
92
- 600: "#16a34a",
93
- 700: "#15803d",
94
- 800: "#166534",
95
- 900: "#14532d",
96
- 950: "#052e16"
97
- },
98
- // Web3 specific colors
99
- web3: {
100
- ethereum: {
101
- light: "#627eea",
102
- DEFAULT: "#627eea",
103
- dark: "#4c63d2"
104
- },
105
- solana: {
106
- light: "#9945ff",
107
- DEFAULT: "#9945ff",
108
- dark: "#7d37d9"
109
- },
110
- polygon: {
111
- light: "#8247e5",
112
- DEFAULT: "#8247e5",
113
- dark: "#6a3bc0"
114
- },
115
- bitcoin: {
116
- light: "#f7931a",
117
- DEFAULT: "#f7931a",
118
- dark: "#e07f00"
119
- },
120
- binance: {
121
- light: "#f3ba2f",
122
- DEFAULT: "#f3ba2f",
123
- dark: "#d4a423"
124
- },
125
- cardano: {
126
- light: "#0033ad",
127
- DEFAULT: "#0033ad",
128
- dark: "#002488"
129
- },
130
- avalanche: {
131
- light: "#e84142",
132
- DEFAULT: "#e84142",
133
- dark: "#d1383a"
134
- },
135
- fantom: {
136
- light: "#1969ff",
137
- DEFAULT: "#1969ff",
138
- dark: "#0052ff"
139
- },
140
- arbitrum: {
141
- light: "#2d374b",
142
- DEFAULT: "#2d374b",
143
- dark: "#1e2532"
144
- },
145
- optimism: {
146
- light: "#ff0420",
147
- DEFAULT: "#ff0420",
148
- dark: "#e6031c"
149
- },
150
- chainlink: {
151
- light: "#375bd2",
152
- DEFAULT: "#375bd2",
153
- dark: "#2d4bb5"
154
- },
155
- cosmos: {
156
- light: "#2e3148",
157
- DEFAULT: "#2e3148",
158
- dark: "#1f2030"
159
- },
160
- polkadot: {
161
- light: "#e6007a",
162
- DEFAULT: "#e6007a",
163
- dark: "#cc006e"
164
- }
165
- }
166
- }, u = {
167
- // Text colors
168
- text: {
169
- primary: {
170
- light: r.neutral[900],
171
- dark: r.neutral[0]
172
- },
173
- secondary: {
174
- light: r.neutral[600],
175
- dark: r.neutral[400]
176
- },
177
- tertiary: {
178
- light: r.neutral[500],
179
- dark: r.neutral[500]
180
- },
181
- disabled: {
182
- light: r.neutral[400],
183
- dark: r.neutral[600]
184
- },
185
- inverse: {
186
- light: r.neutral[0],
187
- dark: r.neutral[900]
188
- },
189
- link: {
190
- light: r.blue[600],
191
- dark: r.blue[400]
192
- },
193
- linkHover: {
194
- light: r.blue[700],
195
- dark: r.blue[300]
196
- }
197
- },
198
- // Background colors
199
- background: {
200
- primary: {
201
- light: r.neutral[0],
202
- dark: r.neutral[900]
203
- },
204
- secondary: {
205
- light: r.neutral[50],
206
- dark: r.neutral[800]
207
- },
208
- tertiary: {
209
- light: r.neutral[100],
210
- dark: r.neutral[700]
211
- },
212
- elevated: {
213
- light: r.neutral[0],
214
- dark: r.neutral[800]
215
- },
216
- overlay: {
217
- light: "rgba(0, 0, 0, 0.5)",
218
- dark: "rgba(0, 0, 0, 0.7)"
219
- },
220
- page: {
221
- light: r.neutral[50],
222
- dark: r.neutral[950]
223
- }
224
- },
225
- // Border colors
226
- border: {
227
- primary: {
228
- light: r.neutral[200],
229
- dark: r.neutral[700]
230
- },
231
- secondary: {
232
- light: r.neutral[100],
233
- dark: r.neutral[800]
234
- },
235
- focus: {
236
- light: r.blue[500],
237
- dark: r.blue[400]
238
- },
239
- error: {
240
- light: r.red[300],
241
- dark: r.red[700]
242
- }
243
- },
244
- // Brand colors
245
- brand: {
246
- primary: {
247
- light: r.blue[600],
248
- dark: r.blue[500]
249
- },
250
- primaryHover: {
251
- light: r.blue[700],
252
- dark: r.blue[400]
253
- },
254
- secondary: {
255
- light: r.purple[600],
256
- dark: r.purple[500]
257
- },
258
- secondaryHover: {
259
- light: r.purple[700],
260
- dark: r.purple[400]
261
- }
262
- },
263
- // State colors
264
- state: {
265
- success: {
266
- light: r.green[600],
267
- dark: r.green[500]
268
- },
269
- successBg: {
270
- light: r.green[100],
271
- dark: `${r.green[900]}/30`
272
- },
273
- successText: {
274
- light: r.green[700],
275
- dark: r.green[300]
276
- },
277
- warning: {
278
- light: r.amber[500],
279
- dark: r.amber[400]
280
- },
281
- warningBg: {
282
- light: r.amber[100],
283
- dark: `${r.amber[900]}/30`
284
- },
285
- warningText: {
286
- light: r.amber[700],
287
- dark: r.amber[300]
288
- },
289
- error: {
290
- light: r.red[600],
291
- dark: r.red[500]
292
- },
293
- errorBg: {
294
- light: r.red[100],
295
- dark: `${r.red[900]}/30`
296
- },
297
- errorText: {
298
- light: r.red[700],
299
- dark: r.red[300]
300
- },
301
- info: {
302
- light: r.blue[600],
303
- dark: r.blue[500]
304
- },
305
- infoBg: {
306
- light: r.blue[100],
307
- dark: `${r.blue[900]}/30`
308
- },
309
- infoText: {
310
- light: r.blue[700],
311
- dark: r.blue[300]
312
- },
313
- selected: {
314
- light: r.blue[100],
315
- dark: `${r.blue[900]}/30`
316
- }
317
- },
318
- // Action colors
319
- action: {
320
- primary: {
321
- light: r.blue[600],
322
- dark: r.blue[600]
323
- },
324
- primaryHover: {
325
- light: r.blue[700],
326
- dark: r.blue[700]
327
- },
328
- secondary: {
329
- light: r.neutral[100],
330
- dark: r.neutral[800]
331
- },
332
- danger: {
333
- light: r.red[600],
334
- dark: r.red[600]
335
- }
336
- },
337
- // Web3 specific colors
338
- web3: {
339
- ethereum: {
340
- light: r.web3.ethereum.light,
341
- dark: r.web3.ethereum.dark
342
- },
343
- ethereumBg: {
344
- light: `${r.blue[100]}`,
345
- dark: `${r.blue[900]}/30`
346
- },
347
- solana: {
348
- light: r.web3.solana.light,
349
- dark: r.web3.solana.dark
350
- },
351
- solanaBg: {
352
- light: `${r.purple[100]}`,
353
- dark: `${r.purple[900]}/30`
354
- },
355
- polygon: {
356
- light: r.web3.polygon.light,
357
- dark: r.web3.polygon.dark
358
- },
359
- polygonBg: {
360
- light: `${r.purple[50]}`,
361
- dark: `${r.purple[900]}/20`
362
- },
363
- bitcoin: {
364
- light: r.web3.bitcoin.light,
365
- dark: r.web3.bitcoin.dark
366
- },
367
- bitcoinBg: {
368
- light: `${r.orange[100]}`,
369
- dark: `${r.orange[900]}/30`
370
- },
371
- binance: {
372
- light: r.web3.binance.light,
373
- dark: r.web3.binance.dark
374
- },
375
- binanceBg: {
376
- light: `${r.amber[100]}`,
377
- dark: `${r.amber[900]}/30`
378
- },
379
- cardano: {
380
- light: r.web3.cardano.light,
381
- dark: r.web3.cardano.dark
382
- },
383
- cardanoBg: {
384
- light: `${r.blue[50]}`,
385
- dark: `${r.blue[900]}/20`
386
- },
387
- avalanche: {
388
- light: r.web3.avalanche.light,
389
- dark: r.web3.avalanche.dark
390
- },
391
- avalancheBg: {
392
- light: `${r.red[100]}`,
393
- dark: `${r.red[900]}/30`
394
- },
395
- arbitrum: {
396
- light: r.web3.arbitrum.light,
397
- dark: r.web3.arbitrum.dark
398
- },
399
- arbitrumBg: {
400
- light: `${r.neutral[100]}`,
401
- dark: `${r.neutral[800]}/50`
402
- },
403
- optimism: {
404
- light: r.web3.optimism.light,
405
- dark: r.web3.optimism.dark
406
- },
407
- optimismBg: {
408
- light: `${r.red[50]}`,
409
- dark: `${r.red[900]}/20`
410
- }
411
- }
412
- }, g = {
413
- button: {
414
- // Primary button - main brand actions
415
- primary: {
416
- base: "bg-blue-600 hover:bg-blue-700 active:bg-blue-800 text-white border-transparent",
417
- dark: "dark:bg-blue-600 dark:hover:bg-blue-700 dark:active:bg-blue-800 dark:text-white",
418
- focus: "focus-visible:ring-2 focus-visible:ring-blue-500 focus-visible:ring-offset-2 dark:focus-visible:ring-blue-400",
419
- disabled: "disabled:opacity-50 disabled:cursor-not-allowed disabled:hover:bg-blue-600"
420
- },
421
- // Secondary button - alternative actions
422
- secondary: {
423
- base: "bg-gray-100 hover:bg-gray-200 active:bg-gray-300 text-gray-900 border-transparent",
424
- dark: "dark:bg-gray-800 dark:hover:bg-gray-700 dark:active:bg-gray-600 dark:text-gray-50",
425
- focus: "focus-visible:ring-2 focus-visible:ring-gray-500 focus-visible:ring-offset-2",
426
- disabled: "disabled:opacity-50 disabled:cursor-not-allowed"
427
- },
428
- // Outline button - secondary emphasis
429
- outline: {
430
- base: "bg-transparent hover:bg-gray-50 active:bg-gray-100 text-gray-900 border-gray-300",
431
- dark: "dark:bg-transparent dark:hover:bg-gray-800 dark:active:bg-gray-700 dark:text-gray-50 dark:border-gray-600",
432
- focus: "focus-visible:ring-2 focus-visible:ring-blue-500 focus-visible:ring-offset-2",
433
- disabled: "disabled:opacity-50 disabled:cursor-not-allowed"
434
- },
435
- // Ghost button - minimal emphasis
436
- ghost: {
437
- base: "bg-transparent hover:bg-gray-100 active:bg-gray-200 text-gray-700 border-transparent",
438
- dark: "dark:bg-transparent dark:hover:bg-gray-800 dark:active:bg-gray-700 dark:text-gray-300",
439
- focus: "focus-visible:ring-2 focus-visible:ring-gray-500 focus-visible:ring-offset-2",
440
- disabled: "disabled:opacity-50 disabled:cursor-not-allowed"
441
- },
442
- // Destructive button - dangerous actions
443
- destructive: {
444
- base: "bg-red-600 hover:bg-red-700 active:bg-red-800 text-white border-transparent",
445
- dark: "dark:bg-red-600 dark:hover:bg-red-700 dark:active:bg-red-800 dark:text-white",
446
- focus: "focus-visible:ring-2 focus-visible:ring-red-500 focus-visible:ring-offset-2",
447
- disabled: "disabled:opacity-50 disabled:cursor-not-allowed"
448
- },
449
- // Success button - positive actions
450
- success: {
451
- base: "bg-green-600 hover:bg-green-700 active:bg-green-800 text-white border-transparent",
452
- dark: "dark:bg-green-600 dark:hover:bg-green-700 dark:active:bg-green-800 dark:text-white",
453
- focus: "focus-visible:ring-2 focus-visible:ring-green-500 focus-visible:ring-offset-2",
454
- disabled: "disabled:opacity-50 disabled:cursor-not-allowed"
455
- },
456
- // Link button - text-like appearance
457
- link: {
458
- base: "bg-transparent hover:bg-transparent active:bg-transparent text-blue-600 border-transparent underline-offset-4 hover:underline",
459
- dark: "dark:text-blue-400",
460
- focus: "focus-visible:ring-2 focus-visible:ring-blue-500 focus-visible:ring-offset-2",
461
- disabled: "disabled:opacity-50 disabled:cursor-not-allowed disabled:no-underline"
462
- },
463
- // Gradient variants for special emphasis
464
- gradient: {
465
- primary: "bg-gradient-to-r from-blue-600 to-purple-600 hover:from-blue-700 hover:to-purple-700 text-white border-transparent shadow-lg hover:shadow-xl",
466
- secondary: "bg-gradient-to-r from-gray-100 to-gray-200 hover:from-gray-200 hover:to-gray-300 text-gray-900 border-transparent",
467
- success: "bg-gradient-to-r from-green-500 to-emerald-600 hover:from-green-600 hover:to-emerald-700 text-white border-transparent"
468
- }
469
- },
470
- card: {
471
- // Default card styling
472
- default: {
473
- base: "bg-white border-gray-200",
474
- dark: "dark:bg-gray-800 dark:border-gray-700",
475
- hover: "hover:shadow-md transition-shadow duration-200"
476
- },
477
- // Elevated card with shadow
478
- elevated: {
479
- base: "bg-white shadow-sm border-gray-200",
480
- dark: "dark:bg-gray-800 dark:border-gray-700",
481
- hover: "hover:shadow-lg transition-shadow duration-200"
482
- },
483
- // Interactive card that can be clicked
484
- interactive: {
485
- base: "bg-white border-gray-200 cursor-pointer",
486
- dark: "dark:bg-gray-800 dark:border-gray-700",
487
- hover: "hover:bg-gray-50 hover:shadow-md dark:hover:bg-gray-700 transition-all duration-200",
488
- focus: "focus:ring-2 focus:ring-blue-500 focus:ring-offset-2"
489
- },
490
- // Success state card
491
- success: {
492
- base: "bg-green-50 border-green-200",
493
- dark: "dark:bg-green-900/20 dark:border-green-800",
494
- text: "text-green-800 dark:text-green-200"
495
- },
496
- // Warning state card
497
- warning: {
498
- base: "bg-amber-50 border-amber-200",
499
- dark: "dark:bg-amber-900/20 dark:border-amber-800",
500
- text: "text-amber-800 dark:text-amber-200"
501
- },
502
- // Error state card
503
- error: {
504
- base: "bg-red-50 border-red-200",
505
- dark: "dark:bg-red-900/20 dark:border-red-800",
506
- text: "text-red-800 dark:text-red-200"
507
- }
508
- },
509
- badge: {
510
- // Default badge
511
- default: {
512
- base: "bg-gray-100 text-gray-800",
513
- dark: "dark:bg-gray-800 dark:text-gray-300"
514
- },
515
- // Primary badge
516
- primary: {
517
- base: "bg-blue-100 text-blue-800",
518
- dark: "dark:bg-blue-900/30 dark:text-blue-300"
519
- },
520
- // Success badge
521
- success: {
522
- base: "bg-green-100 text-green-800",
523
- dark: "dark:bg-green-900/30 dark:text-green-300"
524
- },
525
- // Warning badge
526
- warning: {
527
- base: "bg-amber-100 text-amber-800",
528
- dark: "dark:bg-amber-900/30 dark:text-amber-300"
529
- },
530
- // Error badge
531
- error: {
532
- base: "bg-red-100 text-red-800",
533
- dark: "dark:bg-red-900/30 dark:text-red-300"
534
- },
535
- // Web3 specific badges
536
- ethereum: {
537
- base: "bg-blue-100 text-blue-800",
538
- dark: "dark:bg-blue-900/30 dark:text-blue-300"
539
- },
540
- solana: {
541
- base: "bg-purple-100 text-purple-800",
542
- dark: "dark:bg-purple-900/30 dark:text-purple-300"
543
- },
544
- polygon: {
545
- base: "bg-purple-50 text-purple-800",
546
- dark: "dark:bg-purple-900/20 dark:text-purple-300"
547
- },
548
- bitcoin: {
549
- base: "bg-orange-100 text-orange-800",
550
- dark: "dark:bg-orange-900/30 dark:text-orange-300"
551
- },
552
- binance: {
553
- base: "bg-amber-100 text-amber-800",
554
- dark: "dark:bg-amber-900/30 dark:text-amber-300"
555
- },
556
- cardano: {
557
- base: "bg-blue-50 text-blue-900",
558
- dark: "dark:bg-blue-900/20 dark:text-blue-200"
559
- },
560
- avalanche: {
561
- base: "bg-red-100 text-red-800",
562
- dark: "dark:bg-red-900/30 dark:text-red-300"
563
- },
564
- arbitrum: {
565
- base: "bg-gray-100 text-gray-800",
566
- dark: "dark:bg-gray-800/50 dark:text-gray-300"
567
- },
568
- optimism: {
569
- base: "bg-red-50 text-red-900",
570
- dark: "dark:bg-red-900/20 dark:text-red-200"
571
- }
572
- },
573
- input: {
574
- // Default input styling
575
- default: {
576
- base: "bg-white border-gray-300 text-gray-900 placeholder:text-gray-500",
577
- dark: "dark:bg-gray-900 dark:border-gray-600 dark:text-gray-100 dark:placeholder:text-gray-400",
578
- focus: "focus:ring-2 focus:ring-blue-500 focus:border-blue-500 dark:focus:ring-blue-400 dark:focus:border-blue-400",
579
- error: "border-red-300 focus:border-red-500 focus:ring-red-500 dark:border-red-700"
580
- },
581
- // Search input styling
582
- search: {
583
- base: "bg-gray-50 border-gray-200 text-gray-900 placeholder:text-gray-500",
584
- dark: "dark:bg-gray-800 dark:border-gray-700 dark:text-gray-100 dark:placeholder:text-gray-400",
585
- focus: "focus:bg-white focus:ring-2 focus:ring-blue-500 focus:border-blue-500 dark:focus:bg-gray-900"
586
- }
587
- },
588
- alert: {
589
- // Info alert
590
- info: {
591
- base: "bg-blue-50 border-blue-200 text-blue-800",
592
- dark: "dark:bg-blue-900/20 dark:border-blue-800 dark:text-blue-200",
593
- icon: "text-blue-600 dark:text-blue-400"
594
- },
595
- // Success alert
596
- success: {
597
- base: "bg-green-50 border-green-200 text-green-800",
598
- dark: "dark:bg-green-900/20 dark:border-green-800 dark:text-green-200",
599
- icon: "text-green-600 dark:text-green-400"
600
- },
601
- // Warning alert
602
- warning: {
603
- base: "bg-amber-50 border-amber-200 text-amber-800",
604
- dark: "dark:bg-amber-900/20 dark:border-amber-800 dark:text-amber-200",
605
- icon: "text-amber-600 dark:text-amber-400"
606
- },
607
- // Error alert
608
- error: {
609
- base: "bg-red-50 border-red-200 text-red-800",
610
- dark: "dark:bg-red-900/20 dark:border-red-800 dark:text-red-200",
611
- icon: "text-red-600 dark:text-red-400"
612
- }
613
- }
614
- }, x = (i, t, a = ["focus"]) => {
615
- const d = g[i][t];
616
- return d ? [
617
- d.base,
618
- d.dark,
619
- ...a.map((l) => d[l]).filter(Boolean)
620
- ].join(" ") : (console.warn(`Color variant '${t}' not found for component '${i}'`), "");
621
- }, c = (i, t, a, o) => {
622
- const d = [`bg-${i}`, `text-${t}`];
623
- return a && d.push(`border-${a}`), o?.hover && (o.hover.background && d.push(`hover:bg-${o.hover.background}`), o.hover.text && d.push(`hover:text-${o.hover.text}`), o.hover.border && d.push(`hover:border-${o.hover.border}`)), o?.focus?.ring && d.push(`focus:ring-2 focus:ring-${o.focus.ring}`), o?.dark && (o.dark.background && d.push(`dark:bg-${o.dark.background}`), o.dark.text && d.push(`dark:text-${o.dark.text}`), o.dark.border && d.push(`dark:border-${o.dark.border}`)), d.join(" ");
624
- }, p = {
625
- // Raw color palette (use sparingly, prefer semantic tokens)
626
- raw: r,
627
- // Semantic color tokens (recommended for most use cases)
628
- semantic: u,
629
- // Component-specific colors (use for components)
630
- component: g,
631
- // Utilities
632
- utils: {
633
- getColorClasses: x,
634
- buildColorClass: c
635
- }
636
- }, e = {
637
- // Spacing scale (based on 4px grid)
638
- spacing: {
639
- xs: "p-1",
640
- // 4px
641
- sm: "p-2",
642
- // 8px
643
- md: "p-4",
644
- // 16px
645
- lg: "p-6",
646
- // 24px
647
- xl: "p-8",
648
- // 32px
649
- "2xl": "p-12",
650
- // 48px
651
- "3xl": "p-16",
652
- // 64px
653
- "4xl": "p-20",
654
- // 80px
655
- "5xl": "p-24"
656
- // 96px
657
- },
658
- // Margin utilities
659
- margin: {
660
- xs: "m-1",
661
- sm: "m-2",
662
- md: "m-4",
663
- lg: "m-6",
664
- xl: "m-8",
665
- "2xl": "m-12",
666
- "3xl": "m-16",
667
- "4xl": "m-20",
668
- "5xl": "m-24"
669
- },
670
- // Padding utilities
671
- padding: {
672
- xs: "p-1",
673
- sm: "p-2",
674
- md: "p-4",
675
- lg: "p-6",
676
- xl: "p-8",
677
- "2xl": "p-12",
678
- "3xl": "p-16"
679
- },
680
- // Gap utilities for flex/grid
681
- gap: {
682
- xs: "gap-1",
683
- sm: "gap-2",
684
- md: "gap-4",
685
- lg: "gap-6",
686
- xl: "gap-8",
687
- "2xl": "gap-12",
688
- "3xl": "gap-16"
689
- },
690
- // Border radius scale
691
- radius: {
692
- none: "rounded-none",
693
- sm: "rounded-sm",
694
- // 2px
695
- md: "rounded-md",
696
- // 6px
697
- lg: "rounded-lg",
698
- // 8px
699
- xl: "rounded-xl",
700
- // 12px
701
- "2xl": "rounded-2xl",
702
- // 16px
703
- "3xl": "rounded-3xl",
704
- // 24px
705
- full: "rounded-full"
706
- },
707
- // Shadow scale
708
- shadow: {
709
- none: "shadow-none",
710
- sm: "shadow-sm",
711
- md: "shadow-md",
712
- lg: "shadow-lg",
713
- xl: "shadow-xl",
714
- "2xl": "shadow-2xl"
715
- },
716
- // Typography scale
717
- typography: {
718
- // Font families
719
- family: {
720
- // Sans-serif fonts (default for UI)
721
- sans: "font-sans",
722
- // Inter, system-ui, sans-serif
723
- // Serif fonts (for editorial content)
724
- serif: "font-serif",
725
- // ui-serif, Georgia, serif
726
- // Monospace fonts (for code)
727
- mono: "font-mono",
728
- // ui-monospace, Menlo, Monaco, Consolas
729
- // Display fonts (for headings)
730
- display: "font-sans",
731
- // Same as sans for consistency
732
- // Body text font
733
- body: "font-sans"
734
- // Same as sans for consistency
735
- },
736
- // Font sizes with semantic names
737
- size: {
738
- // Micro text (10px)
739
- micro: "text-[10px]",
740
- // Extra small (12px)
741
- xs: "text-xs",
742
- // Small (14px)
743
- sm: "text-sm",
744
- // Base/Body (16px) - Default browser size
745
- base: "text-base",
746
- md: "text-base",
747
- // Alias for base
748
- // Large (18px)
749
- lg: "text-lg",
750
- // Extra large (20px)
751
- xl: "text-xl",
752
- // 2X large (24px)
753
- "2xl": "text-2xl",
754
- // 3X large (30px)
755
- "3xl": "text-3xl",
756
- // 4X large (36px)
757
- "4xl": "text-4xl",
758
- // 5X large (48px)
759
- "5xl": "text-5xl",
760
- // 6X large (60px)
761
- "6xl": "text-6xl",
762
- // 7X large (72px)
763
- "7xl": "text-7xl",
764
- // 8X large (96px)
765
- "8xl": "text-8xl",
766
- // 9X large (128px)
767
- "9xl": "text-9xl"
768
- },
769
- // Semantic font sizes for specific use cases
770
- semantic: {
771
- // Caption text
772
- caption: "text-xs",
773
- // 12px
774
- // Small body text
775
- small: "text-sm",
776
- // 14px
777
- // Regular body text
778
- body: "text-base",
779
- // 16px
780
- // Large body text
781
- bodyLarge: "text-lg",
782
- // 18px
783
- // Subheading text
784
- subheading: "text-xl",
785
- // 20px
786
- // Heading 6
787
- h6: "text-base",
788
- // 16px
789
- // Heading 5
790
- h5: "text-lg",
791
- // 18px
792
- // Heading 4
793
- h4: "text-xl",
794
- // 20px
795
- // Heading 3
796
- h3: "text-2xl",
797
- // 24px
798
- // Heading 2
799
- h2: "text-3xl",
800
- // 30px
801
- // Heading 1
802
- h1: "text-4xl",
803
- // 36px
804
- // Display text (hero headings)
805
- display: "text-6xl",
806
- // 60px
807
- // Giant display text
808
- hero: "text-8xl"
809
- // 96px
810
- },
811
- // Font weights with semantic names
812
- weight: {
813
- // Numeric weights
814
- thin: "font-thin",
815
- // 100
816
- extralight: "font-extralight",
817
- // 200
818
- light: "font-light",
819
- // 300
820
- normal: "font-normal",
821
- // 400
822
- medium: "font-medium",
823
- // 500
824
- semibold: "font-semibold",
825
- // 600
826
- bold: "font-bold",
827
- // 700
828
- extrabold: "font-extrabold",
829
- // 800
830
- black: "font-black",
831
- // 900
832
- // Semantic weights
833
- body: "font-normal",
834
- // For body text
835
- emphasis: "font-medium",
836
- // For emphasized text
837
- strong: "font-semibold",
838
- // For strong text
839
- heading: "font-bold",
840
- // For headings
841
- display: "font-extrabold"
842
- // For display text
843
- },
844
- // Font styles
845
- style: {
846
- normal: "not-italic",
847
- italic: "italic",
848
- oblique: "italic"
849
- // Maps to italic (closest approximation)
850
- },
851
- // Text decoration
852
- decoration: {
853
- none: "no-underline",
854
- underline: "underline",
855
- overline: "overline",
856
- lineThrough: "line-through"
857
- },
858
- // Text decoration style
859
- decorationStyle: {
860
- solid: "decoration-solid",
861
- double: "decoration-double",
862
- dotted: "decoration-dotted",
863
- dashed: "decoration-dashed",
864
- wavy: "decoration-wavy"
865
- },
866
- // Text decoration thickness
867
- decorationThickness: {
868
- auto: "decoration-auto",
869
- fromFont: "decoration-from-font",
870
- thin: "decoration-1",
871
- medium: "decoration-2",
872
- thick: "decoration-4"
873
- },
874
- // Text underline offset
875
- underlineOffset: {
876
- auto: "underline-offset-auto",
877
- small: "underline-offset-1",
878
- medium: "underline-offset-2",
879
- large: "underline-offset-4",
880
- xl: "underline-offset-8"
881
- },
882
- // Line heights with semantic names
883
- leading: {
884
- // Numeric values
885
- none: "leading-none",
886
- // 1
887
- tight: "leading-tight",
888
- // 1.25
889
- snug: "leading-snug",
890
- // 1.375
891
- normal: "leading-normal",
892
- // 1.5
893
- relaxed: "leading-relaxed",
894
- // 1.625
895
- loose: "leading-loose",
896
- // 2
897
- // Semantic values
898
- heading: "leading-tight",
899
- // For headings
900
- body: "leading-relaxed",
901
- // For body text
902
- caption: "leading-normal",
903
- // For captions
904
- display: "leading-none"
905
- // For display text
906
- },
907
- // Letter spacing with semantic names
908
- tracking: {
909
- // Numeric values
910
- tighter: "tracking-tighter",
911
- // -0.05em
912
- tight: "tracking-tight",
913
- // -0.025em
914
- normal: "tracking-normal",
915
- // 0em
916
- wide: "tracking-wide",
917
- // 0.025em
918
- wider: "tracking-wider",
919
- // 0.05em
920
- widest: "tracking-widest",
921
- // 0.1em
922
- // Semantic values
923
- heading: "tracking-tight",
924
- // For headings
925
- body: "tracking-normal",
926
- // For body text
927
- caption: "tracking-normal",
928
- // For captions
929
- button: "tracking-wide",
930
- // For button text
931
- uppercase: "tracking-wider"
932
- // For uppercase text
933
- },
934
- // Text transform
935
- transform: {
936
- none: "normal-case",
937
- uppercase: "uppercase",
938
- lowercase: "lowercase",
939
- capitalize: "capitalize"
940
- },
941
- // Text alignment
942
- align: {
943
- left: "text-left",
944
- center: "text-center",
945
- right: "text-right",
946
- justify: "text-justify",
947
- start: "text-start",
948
- end: "text-end"
949
- },
950
- // Vertical alignment
951
- verticalAlign: {
952
- baseline: "align-baseline",
953
- top: "align-top",
954
- middle: "align-middle",
955
- bottom: "align-bottom",
956
- textTop: "align-text-top",
957
- textBottom: "align-text-bottom",
958
- sub: "align-sub",
959
- super: "align-super"
960
- },
961
- // White space handling
962
- whitespace: {
963
- normal: "whitespace-normal",
964
- nowrap: "whitespace-nowrap",
965
- pre: "whitespace-pre",
966
- preLine: "whitespace-pre-line",
967
- preWrap: "whitespace-pre-wrap",
968
- break: "whitespace-break-spaces"
969
- },
970
- // Word breaking
971
- wordBreak: {
972
- normal: "break-normal",
973
- words: "break-words",
974
- all: "break-all",
975
- keep: "break-keep"
976
- },
977
- // Text overflow
978
- overflow: {
979
- clip: "text-clip",
980
- ellipsis: "text-ellipsis"
981
- },
982
- // Text indent
983
- indent: {
984
- none: "indent-0",
985
- sm: "indent-1",
986
- md: "indent-4",
987
- lg: "indent-8"
988
- }
989
- },
990
- // Animation durations
991
- animation: {
992
- none: "duration-0",
993
- fastest: "duration-75",
994
- fast: "duration-150",
995
- normal: "duration-200",
996
- slow: "duration-300",
997
- slower: "duration-500",
998
- slowest: "duration-700"
999
- },
1000
- // Animation easing
1001
- ease: {
1002
- linear: "ease-linear",
1003
- in: "ease-in",
1004
- out: "ease-out",
1005
- inOut: "ease-in-out"
1006
- },
1007
- // Z-index scale
1008
- zIndex: {
1009
- auto: "z-auto",
1010
- base: "z-0",
1011
- docked: "z-10",
1012
- dropdown: "z-20",
1013
- sticky: "z-30",
1014
- banner: "z-40",
1015
- overlay: "z-50",
1016
- modal: "z-60",
1017
- popover: "z-70",
1018
- skipLink: "z-80",
1019
- toast: "z-90",
1020
- tooltip: "z-100"
1021
- },
1022
- // Breakpoints (for reference - these are handled by Tailwind)
1023
- breakpoints: {
1024
- sm: "640px",
1025
- md: "768px",
1026
- lg: "1024px",
1027
- xl: "1280px",
1028
- "2xl": "1536px"
1029
- },
1030
- // Grid columns
1031
- grid: {
1032
- cols1: "grid-cols-1",
1033
- cols2: "grid-cols-2",
1034
- cols3: "grid-cols-3",
1035
- cols4: "grid-cols-4",
1036
- cols5: "grid-cols-5",
1037
- cols6: "grid-cols-6",
1038
- cols12: "grid-cols-12"
1039
- },
1040
- // Responsive grid patterns
1041
- gridResponsive: {
1042
- responsive2: "grid-cols-1 md:grid-cols-2",
1043
- responsive3: "grid-cols-1 md:grid-cols-2 lg:grid-cols-3",
1044
- responsive4: "grid-cols-1 md:grid-cols-2 lg:grid-cols-4",
1045
- responsive6: "grid-cols-2 md:grid-cols-3 lg:grid-cols-6"
1046
- },
1047
- // Flex utilities
1048
- flex: {
1049
- center: "flex items-center justify-center",
1050
- between: "flex items-center justify-between",
1051
- start: "flex items-center justify-start",
1052
- end: "flex items-center justify-end",
1053
- col: "flex flex-col",
1054
- colCenter: "flex flex-col items-center justify-center",
1055
- wrap: "flex flex-wrap"
1056
- },
1057
- // Common width utilities
1058
- width: {
1059
- full: "w-full",
1060
- screen: "w-screen",
1061
- auto: "w-auto",
1062
- fit: "w-fit",
1063
- container: "w-full max-w-7xl mx-auto",
1064
- containerSm: "w-full max-w-3xl mx-auto",
1065
- containerLg: "w-full max-w-full mx-auto"
1066
- },
1067
- // Common height utilities
1068
- height: {
1069
- full: "h-full",
1070
- screen: "h-screen",
1071
- auto: "h-auto",
1072
- fit: "h-fit",
1073
- min: "min-h-0",
1074
- minScreen: "min-h-screen"
1075
- }
1076
- }, f = {
1077
- // =============================================================================
1078
- // HEADINGS
1079
- // =============================================================================
1080
- heading: {
1081
- // Display headings (hero sections, landing pages)
1082
- display: {
1083
- // Massive display text (128px)
1084
- hero: () => `${e.typography.family.display} ${e.typography.semantic.hero} ${e.typography.weight.display} ${e.typography.leading.display} ${e.typography.tracking.heading} text-gray-900 dark:text-white`,
1085
- // Large display text (96px)
1086
- xl: () => `${e.typography.family.display} text-7xl ${e.typography.weight.display} ${e.typography.leading.display} ${e.typography.tracking.heading} text-gray-900 dark:text-white`,
1087
- // Medium display text (72px)
1088
- lg: () => `${e.typography.family.display} text-6xl ${e.typography.weight.bold} ${e.typography.leading.display} ${e.typography.tracking.heading} text-gray-900 dark:text-white`,
1089
- // Small display text (60px)
1090
- md: () => `${e.typography.family.display} text-5xl ${e.typography.weight.bold} ${e.typography.leading.tight} ${e.typography.tracking.heading} text-gray-900 dark:text-white`,
1091
- // Extra small display text (48px)
1092
- sm: () => `${e.typography.family.display} text-4xl ${e.typography.weight.bold} ${e.typography.leading.tight} ${e.typography.tracking.heading} text-gray-900 dark:text-white`
1093
- },
1094
- // Standard headings (H1-H6)
1095
- h1: () => `${e.typography.family.sans} ${e.typography.semantic.h1} ${e.typography.weight.heading} ${e.typography.leading.heading} ${e.typography.tracking.heading} text-gray-900 dark:text-white`,
1096
- h2: () => `${e.typography.family.sans} ${e.typography.semantic.h2} ${e.typography.weight.heading} ${e.typography.leading.heading} ${e.typography.tracking.heading} text-gray-900 dark:text-white`,
1097
- h3: () => `${e.typography.family.sans} ${e.typography.semantic.h3} ${e.typography.weight.heading} ${e.typography.leading.heading} ${e.typography.tracking.heading} text-gray-900 dark:text-white`,
1098
- h4: () => `${e.typography.family.sans} ${e.typography.semantic.h4} ${e.typography.weight.semibold} ${e.typography.leading.heading} ${e.typography.tracking.heading} text-gray-900 dark:text-white`,
1099
- h5: () => `${e.typography.family.sans} ${e.typography.semantic.h5} ${e.typography.weight.semibold} ${e.typography.leading.heading} ${e.typography.tracking.heading} text-gray-900 dark:text-white`,
1100
- h6: () => `${e.typography.family.sans} ${e.typography.semantic.h6} ${e.typography.weight.semibold} ${e.typography.leading.heading} ${e.typography.tracking.heading} text-gray-900 dark:text-white`,
1101
- // Responsive headings that scale with screen size
1102
- responsive: {
1103
- h1: () => `${e.typography.family.sans} text-2xl sm:text-3xl md:text-4xl lg:text-5xl ${e.typography.weight.heading} ${e.typography.leading.heading} ${e.typography.tracking.heading} text-gray-900 dark:text-white`,
1104
- h2: () => `${e.typography.family.sans} text-xl sm:text-2xl md:text-3xl lg:text-4xl ${e.typography.weight.heading} ${e.typography.leading.heading} ${e.typography.tracking.heading} text-gray-900 dark:text-white`,
1105
- h3: () => `${e.typography.family.sans} text-lg sm:text-xl md:text-2xl lg:text-3xl ${e.typography.weight.semibold} ${e.typography.leading.heading} ${e.typography.tracking.heading} text-gray-900 dark:text-white`,
1106
- display: () => `${e.typography.family.display} text-4xl sm:text-5xl md:text-6xl lg:text-7xl xl:text-8xl ${e.typography.weight.display} ${e.typography.leading.display} ${e.typography.tracking.heading} text-gray-900 dark:text-white`
1107
- }
1108
- },
1109
- // =============================================================================
1110
- // BODY TEXT
1111
- // =============================================================================
1112
- body: {
1113
- // Large body text (18px)
1114
- xl: () => `${e.typography.family.body} ${e.typography.semantic.bodyLarge} ${e.typography.weight.body} ${e.typography.leading.body} ${e.typography.tracking.body} text-gray-700 dark:text-gray-300`,
1115
- // Regular body text (16px) - Default
1116
- lg: () => `${e.typography.family.body} ${e.typography.semantic.body} ${e.typography.weight.body} ${e.typography.leading.body} ${e.typography.tracking.body} text-gray-700 dark:text-gray-300`,
1117
- // Medium body text (16px) - Alias for lg
1118
- md: () => `${e.typography.family.body} ${e.typography.semantic.body} ${e.typography.weight.body} ${e.typography.leading.body} ${e.typography.tracking.body} text-gray-700 dark:text-gray-300`,
1119
- // Small body text (14px)
1120
- sm: () => `${e.typography.family.body} ${e.typography.semantic.small} ${e.typography.weight.body} ${e.typography.leading.body} ${e.typography.tracking.body} text-gray-600 dark:text-gray-400`,
1121
- // Extra small body text (12px)
1122
- xs: () => `${e.typography.family.body} ${e.typography.semantic.caption} ${e.typography.weight.body} ${e.typography.leading.body} ${e.typography.tracking.body} text-gray-600 dark:text-gray-400`,
1123
- // Emphasized/strong body text variants
1124
- strong: {
1125
- xl: () => `${e.typography.family.body} ${e.typography.semantic.bodyLarge} ${e.typography.weight.strong} ${e.typography.leading.body} ${e.typography.tracking.body} text-gray-900 dark:text-white`,
1126
- lg: () => `${e.typography.family.body} ${e.typography.semantic.body} ${e.typography.weight.strong} ${e.typography.leading.body} ${e.typography.tracking.body} text-gray-900 dark:text-white`,
1127
- md: () => `${e.typography.family.body} ${e.typography.semantic.body} ${e.typography.weight.strong} ${e.typography.leading.body} ${e.typography.tracking.body} text-gray-900 dark:text-white`,
1128
- sm: () => `${e.typography.family.body} ${e.typography.semantic.small} ${e.typography.weight.strong} ${e.typography.leading.body} ${e.typography.tracking.body} text-gray-900 dark:text-white`
1129
- },
1130
- // Emphasized/medium body text variants
1131
- emphasis: {
1132
- xl: () => `${e.typography.family.body} ${e.typography.semantic.bodyLarge} ${e.typography.weight.emphasis} ${e.typography.leading.body} ${e.typography.tracking.body} text-gray-900 dark:text-white`,
1133
- lg: () => `${e.typography.family.body} ${e.typography.semantic.body} ${e.typography.weight.emphasis} ${e.typography.leading.body} ${e.typography.tracking.body} text-gray-900 dark:text-white`,
1134
- md: () => `${e.typography.family.body} ${e.typography.semantic.body} ${e.typography.weight.emphasis} ${e.typography.leading.body} ${e.typography.tracking.body} text-gray-900 dark:text-white`,
1135
- sm: () => `${e.typography.family.body} ${e.typography.semantic.small} ${e.typography.weight.emphasis} ${e.typography.leading.body} ${e.typography.tracking.body} text-gray-900 dark:text-white`
1136
- },
1137
- // Muted/secondary body text variants
1138
- muted: {
1139
- xl: () => `${e.typography.family.body} ${e.typography.semantic.bodyLarge} ${e.typography.weight.body} ${e.typography.leading.body} ${e.typography.tracking.body} text-gray-600 dark:text-gray-400`,
1140
- lg: () => `${e.typography.family.body} ${e.typography.semantic.body} ${e.typography.weight.body} ${e.typography.leading.body} ${e.typography.tracking.body} text-gray-600 dark:text-gray-400`,
1141
- md: () => `${e.typography.family.body} ${e.typography.semantic.body} ${e.typography.weight.body} ${e.typography.leading.body} ${e.typography.tracking.body} text-gray-600 dark:text-gray-400`,
1142
- sm: () => `${e.typography.family.body} ${e.typography.semantic.small} ${e.typography.weight.body} ${e.typography.leading.body} ${e.typography.tracking.body} text-gray-600 dark:text-gray-400`
1143
- }
1144
- },
1145
- // =============================================================================
1146
- // SPECIALIZED TEXT
1147
- // =============================================================================
1148
- // Caption and small text
1149
- caption: {
1150
- // Default caption (12px)
1151
- default: () => `${e.typography.family.body} ${e.typography.semantic.caption} ${e.typography.weight.body} ${e.typography.leading.caption} ${e.typography.tracking.caption} text-gray-500 dark:text-gray-500`,
1152
- // Emphasized caption
1153
- emphasis: () => `${e.typography.family.body} ${e.typography.semantic.caption} ${e.typography.weight.emphasis} ${e.typography.leading.caption} ${e.typography.tracking.caption} text-gray-600 dark:text-gray-400`,
1154
- // Uppercase caption (for labels)
1155
- uppercase: () => `${e.typography.family.body} ${e.typography.semantic.caption} ${e.typography.weight.emphasis} ${e.typography.leading.caption} ${e.typography.tracking.uppercase} ${e.typography.transform.uppercase} text-gray-500 dark:text-gray-500`
1156
- },
1157
- // Lead text (introduction paragraphs)
1158
- lead: {
1159
- // Large lead text
1160
- lg: () => `${e.typography.family.body} text-xl ${e.typography.weight.body} ${e.typography.leading.relaxed} ${e.typography.tracking.body} text-gray-700 dark:text-gray-300`,
1161
- // Medium lead text
1162
- md: () => `${e.typography.family.body} ${e.typography.semantic.bodyLarge} ${e.typography.weight.body} ${e.typography.leading.relaxed} ${e.typography.tracking.body} text-gray-700 dark:text-gray-300`,
1163
- // Small lead text
1164
- sm: () => `${e.typography.family.body} ${e.typography.semantic.body} ${e.typography.weight.body} ${e.typography.leading.relaxed} ${e.typography.tracking.body} text-gray-700 dark:text-gray-300`
1165
- },
1166
- // Links
1167
- link: {
1168
- // Default link
1169
- default: () => `${e.typography.decoration.underline} ${e.typography.underlineOffset.medium} text-blue-600 dark:text-blue-400 hover:text-blue-700 dark:hover:text-blue-300 transition-colors duration-150`,
1170
- // Link without underline
1171
- subtle: () => `${e.typography.decoration.none} text-blue-600 dark:text-blue-400 hover:text-blue-700 dark:hover:text-blue-300 hover:${e.typography.decoration.underline} hover:${e.typography.underlineOffset.medium} transition-all duration-150`,
1172
- // Muted link
1173
- muted: () => `${e.typography.decoration.underline} ${e.typography.underlineOffset.medium} text-gray-600 dark:text-gray-400 hover:text-gray-900 dark:hover:text-gray-100 transition-colors duration-150`,
1174
- // External link (with icon space)
1175
- external: () => `${e.typography.decoration.underline} ${e.typography.underlineOffset.medium} text-blue-600 dark:text-blue-400 hover:text-blue-700 dark:hover:text-blue-300 transition-colors duration-150 inline-flex items-center gap-1`
1176
- },
1177
- // Code and monospace text
1178
- code: {
1179
- // Inline code
1180
- inline: () => `${e.typography.family.mono} text-sm ${e.typography.weight.medium} px-1.5 py-0.5 rounded bg-gray-100 dark:bg-gray-800 text-gray-900 dark:text-gray-100`,
1181
- // Code block
1182
- block: () => `${e.typography.family.mono} text-sm ${e.typography.weight.body} ${e.typography.leading.relaxed} p-4 rounded-lg bg-gray-100 dark:bg-gray-800 text-gray-900 dark:text-gray-100 overflow-x-auto`,
1183
- // Small inline code
1184
- small: () => `${e.typography.family.mono} text-xs ${e.typography.weight.medium} px-1 py-0.5 rounded bg-gray-100 dark:bg-gray-800 text-gray-900 dark:text-gray-100`
1185
- },
1186
- // UI Labels and form text
1187
- label: {
1188
- // Form labels
1189
- default: () => `${e.typography.family.body} text-sm ${e.typography.weight.emphasis} text-gray-900 dark:text-white`,
1190
- // Required field labels
1191
- required: () => `${e.typography.family.body} text-sm ${e.typography.weight.emphasis} text-gray-900 dark:text-white after:content-['*'] after:ml-0.5 after:text-red-500`,
1192
- // Optional field labels
1193
- optional: () => `${e.typography.family.body} text-sm ${e.typography.weight.body} text-gray-600 dark:text-gray-400`,
1194
- // Helper text
1195
- helper: () => `${e.typography.family.body} text-sm ${e.typography.weight.body} text-gray-500 dark:text-gray-500`,
1196
- // Error text
1197
- error: () => `${e.typography.family.body} text-sm ${e.typography.weight.body} text-red-600 dark:text-red-400`,
1198
- // Success text
1199
- success: () => `${e.typography.family.body} text-sm ${e.typography.weight.body} text-green-600 dark:text-green-400`
1200
- },
1201
- // =============================================================================
1202
- // WEB3 SPECIFIC
1203
- // =============================================================================
1204
- web3: {
1205
- // Wallet addresses
1206
- address: () => `${e.typography.family.mono} text-sm ${e.typography.weight.body} text-gray-900 dark:text-white break-all`,
1207
- // Short wallet addresses (truncated)
1208
- addressShort: () => `${e.typography.family.mono} text-sm ${e.typography.weight.body} text-gray-900 dark:text-white`,
1209
- // Transaction hashes
1210
- hash: () => `${e.typography.family.mono} text-xs ${e.typography.weight.body} text-gray-500 dark:text-gray-500 break-all`,
1211
- // Cryptocurrency amounts
1212
- amount: () => `${e.typography.family.mono} text-base ${e.typography.weight.emphasis} text-gray-900 dark:text-white`,
1213
- // Chain names
1214
- chain: () => `${e.typography.family.body} text-sm ${e.typography.weight.emphasis} text-gray-900 dark:text-white`,
1215
- // Token symbols
1216
- symbol: () => `${e.typography.family.body} text-sm ${e.typography.weight.bold} ${e.typography.transform.uppercase} text-gray-900 dark:text-white`
1217
- },
1218
- // =============================================================================
1219
- // UTILITY CLASSES
1220
- // =============================================================================
1221
- // Truncation utilities
1222
- truncate: {
1223
- // Single line truncation
1224
- line: () => `${e.typography.overflow.ellipsis} ${e.typography.whitespace.nowrap} overflow-hidden`,
1225
- // Multi-line truncation (2 lines)
1226
- lines2: () => "line-clamp-2",
1227
- // Multi-line truncation (3 lines)
1228
- lines3: () => "line-clamp-3",
1229
- // Multi-line truncation (4 lines)
1230
- lines4: () => "line-clamp-4"
1231
- },
1232
- // Selection styles
1233
- selection: {
1234
- // Default text selection
1235
- default: () => "selection:bg-blue-200 dark:selection:bg-blue-800 selection:text-blue-900 dark:selection:text-blue-100",
1236
- // Brand colored selection
1237
- brand: () => "selection:bg-purple-200 dark:selection:bg-purple-800 selection:text-purple-900 dark:selection:text-purple-100"
1238
- }
1239
- }, m = (i = "body", t = "body", a = "body", o = "text-gray-900 dark:text-white", d = {}) => {
1240
- const {
1241
- leading: n = "body",
1242
- tracking: l = "body",
1243
- transform: b = "none",
1244
- decoration: y = "none"
1245
- } = d;
1246
- return [
1247
- e.typography.family[i],
1248
- e.typography.semantic[t],
1249
- e.typography.weight[a],
1250
- e.typography.leading[n],
1251
- e.typography.tracking[l],
1252
- e.typography.transform[b],
1253
- e.typography.decoration[y],
1254
- o
1255
- ].filter(Boolean).join(" ");
1256
- }, h = (...i) => i.filter(Boolean).join(" "), k = (i, t) => {
1257
- const a = [];
1258
- return a.push(i), t.sm && a.push(`sm:${t.sm}`), t.md && a.push(`md:${t.md}`), t.lg && a.push(`lg:${t.lg}`), t.xl && a.push(`xl:${t.xl}`), t["2xl"] && a.push(`2xl:${t["2xl"]}`), a.join(" ");
1259
- }, w = {
1260
- // Button variants with complete styling
1261
- button: {
1262
- primary: {
1263
- default: () => "bg-blue-600 text-white hover:bg-blue-700 active:bg-blue-800 border-transparent focus-visible:ring-2 focus-visible:ring-blue-500 focus-visible:ring-offset-2 disabled:opacity-50 disabled:cursor-not-allowed dark:bg-blue-600 dark:hover:bg-blue-700 dark:active:bg-blue-800 dark:text-white dark:focus-visible:ring-blue-400 inline-flex items-center justify-center rounded-md px-4 py-2 text-sm font-medium transition-colors duration-200",
1264
- small: () => "bg-blue-600 text-white hover:bg-blue-700 active:bg-blue-800 border-transparent focus-visible:ring-2 focus-visible:ring-blue-500 focus-visible:ring-offset-2 disabled:opacity-50 disabled:cursor-not-allowed dark:bg-blue-600 dark:hover:bg-blue-700 dark:active:bg-blue-800 dark:text-white dark:focus-visible:ring-blue-400 inline-flex items-center justify-center rounded-md px-3 py-1.5 text-xs font-medium transition-colors duration-200 h-8",
1265
- large: () => "bg-blue-600 text-white hover:bg-blue-700 active:bg-blue-800 border-transparent focus-visible:ring-2 focus-visible:ring-blue-500 focus-visible:ring-offset-2 disabled:opacity-50 disabled:cursor-not-allowed dark:bg-blue-600 dark:hover:bg-blue-700 dark:active:bg-blue-800 dark:text-white dark:focus-visible:ring-blue-400 inline-flex items-center justify-center rounded-md px-6 py-3 text-base font-medium transition-colors duration-200 h-12",
1266
- withIcon: () => "bg-blue-600 text-white hover:bg-blue-700 active:bg-blue-800 border-transparent focus-visible:ring-2 focus-visible:ring-blue-500 focus-visible:ring-offset-2 disabled:opacity-50 disabled:cursor-not-allowed dark:bg-blue-600 dark:hover:bg-blue-700 dark:active:bg-blue-800 dark:text-white dark:focus-visible:ring-blue-400 inline-flex items-center justify-center gap-2 rounded-md px-4 py-2 text-sm font-medium transition-colors duration-200",
1267
- fullWidth: () => "bg-blue-600 text-white hover:bg-blue-700 active:bg-blue-800 border-transparent focus-visible:ring-2 focus-visible:ring-blue-500 focus-visible:ring-offset-2 disabled:opacity-50 disabled:cursor-not-allowed dark:bg-blue-600 dark:hover:bg-blue-700 dark:active:bg-blue-800 dark:text-white dark:focus-visible:ring-blue-400 flex items-center justify-center w-full rounded-md px-4 py-2 text-sm font-medium transition-colors duration-200"
1268
- },
1269
- secondary: {
1270
- default: () => "bg-gray-100 text-gray-900 hover:bg-gray-200 active:bg-gray-300 border-transparent focus-visible:ring-2 focus-visible:ring-gray-500 focus-visible:ring-offset-2 disabled:opacity-50 disabled:cursor-not-allowed dark:bg-gray-800 dark:text-gray-50 dark:hover:bg-gray-700 dark:active:bg-gray-600 inline-flex items-center justify-center rounded-md px-4 py-2 text-sm font-medium transition-colors duration-200",
1271
- small: () => "bg-gray-100 text-gray-900 hover:bg-gray-200 active:bg-gray-300 border-transparent focus-visible:ring-2 focus-visible:ring-gray-500 focus-visible:ring-offset-2 disabled:opacity-50 disabled:cursor-not-allowed dark:bg-gray-800 dark:text-gray-50 dark:hover:bg-gray-700 dark:active:bg-gray-600 inline-flex items-center justify-center rounded-md px-3 py-1.5 text-xs font-medium transition-colors duration-200 h-8",
1272
- large: () => "bg-gray-100 text-gray-900 hover:bg-gray-200 active:bg-gray-300 border-transparent focus-visible:ring-2 focus-visible:ring-gray-500 focus-visible:ring-offset-2 disabled:opacity-50 disabled:cursor-not-allowed dark:bg-gray-800 dark:text-gray-50 dark:hover:bg-gray-700 dark:active:bg-gray-600 inline-flex items-center justify-center rounded-md px-6 py-3 text-base font-medium transition-colors duration-200 h-12",
1273
- withIcon: () => "bg-gray-100 text-gray-900 hover:bg-gray-200 active:bg-gray-300 border-transparent focus-visible:ring-2 focus-visible:ring-gray-500 focus-visible:ring-offset-2 disabled:opacity-50 disabled:cursor-not-allowed dark:bg-gray-800 dark:text-gray-50 dark:hover:bg-gray-700 dark:active:bg-gray-600 inline-flex items-center justify-center gap-2 rounded-md px-4 py-2 text-sm font-medium transition-colors duration-200"
1274
- },
1275
- outline: {
1276
- default: () => "bg-transparent hover:bg-gray-50 active:bg-gray-100 text-gray-900 border border-gray-300 focus-visible:ring-2 focus-visible:ring-blue-500 focus-visible:ring-offset-2 disabled:opacity-50 disabled:cursor-not-allowed dark:bg-transparent dark:hover:bg-gray-800 dark:active:bg-gray-700 dark:text-gray-50 dark:border-gray-600 inline-flex items-center justify-center rounded-md px-4 py-2 text-sm font-medium transition-colors duration-200",
1277
- small: () => "bg-transparent hover:bg-gray-50 active:bg-gray-100 text-gray-900 border border-gray-300 focus-visible:ring-2 focus-visible:ring-blue-500 focus-visible:ring-offset-2 disabled:opacity-50 disabled:cursor-not-allowed dark:bg-transparent dark:hover:bg-gray-800 dark:active:bg-gray-700 dark:text-gray-50 dark:border-gray-600 inline-flex items-center justify-center rounded-md px-3 py-1.5 text-xs font-medium transition-colors duration-200 h-8",
1278
- large: () => "bg-transparent hover:bg-gray-50 active:bg-gray-100 text-gray-900 border border-gray-300 focus-visible:ring-2 focus-visible:ring-blue-500 focus-visible:ring-offset-2 disabled:opacity-50 disabled:cursor-not-allowed dark:bg-transparent dark:hover:bg-gray-800 dark:active:bg-gray-700 dark:text-gray-50 dark:border-gray-600 inline-flex items-center justify-center rounded-md px-6 py-3 text-base font-medium transition-colors duration-200 h-12",
1279
- withIcon: () => "bg-transparent hover:bg-gray-50 active:bg-gray-100 text-gray-900 border border-gray-300 focus-visible:ring-2 focus-visible:ring-blue-500 focus-visible:ring-offset-2 disabled:opacity-50 disabled:cursor-not-allowed dark:bg-transparent dark:hover:bg-gray-800 dark:active:bg-gray-700 dark:text-gray-50 dark:border-gray-600 inline-flex items-center justify-center gap-2 rounded-md px-4 py-2 text-sm font-medium transition-colors duration-200"
1280
- },
1281
- destructive: {
1282
- default: () => "bg-red-600 text-white hover:bg-red-700 active:bg-red-800 border-transparent focus-visible:ring-2 focus-visible:ring-red-500 focus-visible:ring-offset-2 disabled:opacity-50 disabled:cursor-not-allowed dark:bg-red-600 dark:hover:bg-red-700 dark:active:bg-red-800 dark:text-white inline-flex items-center justify-center rounded-md px-4 py-2 text-sm font-medium transition-colors duration-200",
1283
- outline: () => "bg-transparent hover:bg-red-50 active:bg-red-100 text-red-600 border border-red-300 focus-visible:ring-2 focus-visible:ring-red-500 focus-visible:ring-offset-2 disabled:opacity-50 disabled:cursor-not-allowed dark:hover:bg-red-900/20 dark:text-red-400 dark:border-red-800 inline-flex items-center justify-center rounded-md px-4 py-2 text-sm font-medium transition-colors duration-200",
1284
- small: () => "bg-red-600 text-white hover:bg-red-700 active:bg-red-800 border-transparent focus-visible:ring-2 focus-visible:ring-red-500 focus-visible:ring-offset-2 disabled:opacity-50 disabled:cursor-not-allowed dark:bg-red-600 dark:hover:bg-red-700 dark:active:bg-red-800 dark:text-white inline-flex items-center justify-center rounded-md px-3 py-1.5 text-xs font-medium transition-colors duration-200 h-8"
1285
- },
1286
- ghost: {
1287
- default: () => "bg-transparent hover:bg-gray-100 active:bg-gray-200 text-gray-700 border-transparent focus-visible:ring-2 focus-visible:ring-gray-500 focus-visible:ring-offset-2 disabled:opacity-50 disabled:cursor-not-allowed dark:bg-transparent dark:hover:bg-gray-800 dark:active:bg-gray-700 dark:text-gray-300 inline-flex items-center justify-center rounded-md px-4 py-2 text-sm font-medium transition-colors duration-200",
1288
- small: () => "bg-transparent hover:bg-gray-100 active:bg-gray-200 text-gray-700 border-transparent focus-visible:ring-2 focus-visible:ring-gray-500 focus-visible:ring-offset-2 disabled:opacity-50 disabled:cursor-not-allowed dark:bg-transparent dark:hover:bg-gray-800 dark:active:bg-gray-700 dark:text-gray-300 inline-flex items-center justify-center rounded-md px-2 py-1 text-xs font-medium transition-colors duration-200 h-8",
1289
- icon: () => "bg-transparent hover:bg-gray-100 active:bg-gray-200 text-gray-700 border-transparent focus-visible:ring-2 focus-visible:ring-gray-500 focus-visible:ring-offset-2 disabled:opacity-50 disabled:cursor-not-allowed dark:bg-transparent dark:hover:bg-gray-800 dark:active:bg-gray-700 dark:text-gray-300 inline-flex items-center justify-center rounded-md p-2 transition-colors duration-200 h-10 w-10"
1290
- },
1291
- link: {
1292
- default: () => "bg-transparent hover:bg-transparent active:bg-transparent text-blue-600 border-transparent underline-offset-4 hover:underline focus-visible:ring-2 focus-visible:ring-blue-500 focus-visible:ring-offset-2 disabled:opacity-50 disabled:cursor-not-allowed disabled:no-underline dark:text-blue-400 inline-flex items-center justify-center rounded-md px-0 py-0 text-sm font-medium transition-colors duration-200",
1293
- muted: () => "bg-transparent hover:bg-transparent active:bg-transparent text-gray-600 dark:text-gray-400 hover:text-gray-700 dark:hover:text-gray-300 border-transparent underline-offset-4 hover:underline focus-visible:ring-2 focus-visible:ring-gray-500 focus-visible:ring-offset-2 disabled:opacity-50 disabled:cursor-not-allowed disabled:no-underline inline-flex items-center justify-center rounded-md px-0 py-0 text-sm font-medium transition-colors duration-200"
1294
- },
1295
- gradient: {
1296
- primary: () => "bg-gradient-to-r from-blue-600 to-purple-600 hover:from-blue-700 hover:to-purple-700 text-white border-transparent shadow-lg hover:shadow-xl focus-visible:ring-2 focus-visible:ring-blue-500 focus-visible:ring-offset-2 disabled:opacity-50 disabled:cursor-not-allowed inline-flex items-center justify-center rounded-md px-4 py-2 text-sm font-medium transition-all duration-200",
1297
- secondary: () => "bg-gradient-to-r from-gray-100 to-gray-200 hover:from-gray-200 hover:to-gray-300 text-gray-900 border-transparent focus-visible:ring-2 focus-visible:ring-gray-500 focus-visible:ring-offset-2 disabled:opacity-50 disabled:cursor-not-allowed inline-flex items-center justify-center rounded-md px-4 py-2 text-sm font-medium transition-all duration-200",
1298
- success: () => "bg-gradient-to-r from-green-500 to-emerald-600 hover:from-green-600 hover:to-emerald-700 text-white border-transparent shadow-lg hover:shadow-xl focus-visible:ring-2 focus-visible:ring-green-500 focus-visible:ring-offset-2 disabled:opacity-50 disabled:cursor-not-allowed inline-flex items-center justify-center rounded-md px-4 py-2 text-sm font-medium transition-all duration-200"
1299
- },
1300
- // Web3 specific button variants
1301
- web3: {
1302
- wallet: () => "bg-white dark:bg-gray-800 border border-gray-300 dark:border-gray-600 hover:bg-gray-50 dark:hover:bg-gray-700 text-gray-900 dark:text-gray-100 focus-visible:ring-2 focus-visible:ring-blue-500 focus-visible:ring-offset-2 disabled:opacity-50 disabled:cursor-not-allowed inline-flex items-center justify-center gap-2 rounded-md px-4 py-2 text-sm font-medium transition-colors duration-200",
1303
- connect: () => "bg-gradient-to-r from-blue-600 to-purple-600 hover:from-blue-700 hover:to-purple-700 text-white border-transparent shadow-lg hover:shadow-xl focus-visible:ring-2 focus-visible:ring-blue-500 focus-visible:ring-offset-2 disabled:opacity-50 disabled:cursor-not-allowed inline-flex items-center justify-center gap-2 rounded-md px-4 py-2 text-sm font-medium transition-all duration-200",
1304
- disconnect: () => "bg-transparent hover:bg-red-50 active:bg-red-100 text-red-600 border border-red-300 focus-visible:ring-2 focus-visible:ring-red-500 focus-visible:ring-offset-2 disabled:opacity-50 disabled:cursor-not-allowed dark:hover:bg-red-900/20 dark:text-red-400 dark:border-red-800 inline-flex items-center justify-center gap-2 rounded-md px-4 py-2 text-sm font-medium transition-colors duration-200"
1305
- }
1306
- },
1307
- // Card variants
1308
- card: {
1309
- default: {
1310
- base: () => "bg-white dark:bg-gray-800 border border-gray-200 dark:border-gray-700 rounded-lg",
1311
- padded: () => "bg-white dark:bg-gray-800 border border-gray-200 dark:border-gray-700 rounded-lg p-6",
1312
- interactive: () => "bg-white dark:bg-gray-800 border border-gray-200 dark:border-gray-700 rounded-lg p-6 transition-all duration-200 hover:shadow-md cursor-pointer"
1313
- },
1314
- elevated: {
1315
- base: () => "bg-white dark:bg-gray-800 border border-gray-200 dark:border-gray-700 rounded-lg shadow-sm",
1316
- padded: () => "bg-white dark:bg-gray-800 border border-gray-200 dark:border-gray-700 rounded-lg shadow-sm p-6",
1317
- interactive: () => "bg-white dark:bg-gray-800 border border-gray-200 dark:border-gray-700 rounded-lg shadow-sm p-6 transition-all duration-200 hover:shadow-lg cursor-pointer"
1318
- },
1319
- state: {
1320
- success: () => "bg-green-50 border-green-200 dark:bg-green-900/20 dark:border-green-800 text-green-800 dark:text-green-200 rounded-lg border p-4",
1321
- warning: () => "bg-amber-50 border-amber-200 dark:bg-amber-900/20 dark:border-amber-800 text-amber-800 dark:text-amber-200 rounded-lg border p-4",
1322
- error: () => "bg-red-50 border-red-200 dark:bg-red-900/20 dark:border-red-800 text-red-800 dark:text-red-200 rounded-lg border p-4",
1323
- info: () => "bg-blue-50 border-blue-200 dark:bg-blue-900/20 dark:border-blue-800 text-blue-800 dark:text-blue-200 rounded-lg border p-4"
1324
- }
1325
- },
1326
- // Badge variants
1327
- badge: {
1328
- default: () => "bg-gray-100 text-gray-800 dark:bg-gray-800 dark:text-gray-300 inline-flex items-center px-2.5 py-0.5 rounded-full text-xs font-medium",
1329
- primary: () => "bg-blue-100 text-blue-800 dark:bg-blue-900/30 dark:text-blue-300 inline-flex items-center px-2.5 py-0.5 rounded-full text-xs font-medium",
1330
- success: () => "bg-green-100 text-green-800 dark:bg-green-900/30 dark:text-green-300 inline-flex items-center px-2.5 py-0.5 rounded-full text-xs font-medium",
1331
- warning: () => "bg-amber-100 text-amber-800 dark:bg-amber-900/30 dark:text-amber-300 inline-flex items-center px-2.5 py-0.5 rounded-full text-xs font-medium",
1332
- error: () => "bg-red-100 text-red-800 dark:bg-red-900/30 dark:text-red-300 inline-flex items-center px-2.5 py-0.5 rounded-full text-xs font-medium",
1333
- // Web3 specific
1334
- ethereum: () => "bg-blue-100 text-blue-800 dark:bg-blue-900/30 dark:text-blue-300 inline-flex items-center px-2.5 py-0.5 rounded-full text-xs font-medium",
1335
- solana: () => "bg-purple-100 text-purple-800 dark:bg-purple-900/30 dark:text-purple-300 inline-flex items-center px-2.5 py-0.5 rounded-full text-xs font-medium",
1336
- // Sizes
1337
- small: (i = "default") => {
1338
- const t = {
1339
- default: "bg-gray-100 text-gray-800 dark:bg-gray-800 dark:text-gray-300",
1340
- primary: "bg-blue-100 text-blue-800 dark:bg-blue-900/30 dark:text-blue-300",
1341
- success: "bg-green-100 text-green-800 dark:bg-green-900/30 dark:text-green-300",
1342
- warning: "bg-amber-100 text-amber-800 dark:bg-amber-900/30 dark:text-amber-300",
1343
- error: "bg-red-100 text-red-800 dark:bg-red-900/30 dark:text-red-300"
1344
- };
1345
- return `${t[i] || t.default} inline-flex items-center px-2 py-0.5 rounded-full text-xs font-medium`;
1346
- },
1347
- large: (i = "default") => {
1348
- const t = {
1349
- default: "bg-gray-100 text-gray-800 dark:bg-gray-800 dark:text-gray-300",
1350
- primary: "bg-blue-100 text-blue-800 dark:bg-blue-900/30 dark:text-blue-300",
1351
- success: "bg-green-100 text-green-800 dark:bg-green-900/30 dark:text-green-300",
1352
- warning: "bg-amber-100 text-amber-800 dark:bg-amber-900/30 dark:text-amber-300",
1353
- error: "bg-red-100 text-red-800 dark:bg-red-900/30 dark:text-red-300"
1354
- };
1355
- return `${t[i] || t.default} inline-flex items-center px-3 py-1 rounded-full text-sm font-medium`;
1356
- }
1357
- },
1358
- // Input variants
1359
- input: {
1360
- default: () => "bg-white dark:bg-gray-900 border-gray-300 dark:border-gray-600 text-gray-900 dark:text-gray-100 focus:border-blue-500 focus:ring-blue-500 dark:focus:border-blue-400 dark:focus:ring-blue-400 block w-full rounded-md px-3 py-2 text-sm placeholder:text-gray-500 dark:placeholder:text-gray-400 transition-colors duration-200 focus:outline-none focus:ring-2 focus:ring-offset-2",
1361
- search: () => "bg-white dark:bg-gray-900 border-gray-300 dark:border-gray-600 text-gray-900 dark:text-gray-100 focus:border-blue-500 focus:ring-blue-500 dark:focus:border-blue-400 dark:focus:ring-blue-400 block w-full rounded-md px-3 py-2 text-sm placeholder:text-gray-500 dark:placeholder:text-gray-400 transition-colors duration-200 focus:outline-none focus:ring-2 focus:ring-offset-2",
1362
- error: () => "bg-white dark:bg-gray-900 border-red-300 dark:border-red-700 text-gray-900 dark:text-gray-100 focus:border-red-500 focus:ring-red-500 block w-full rounded-md px-3 py-2 text-sm placeholder:text-gray-500 dark:placeholder:text-gray-400 transition-colors duration-200 focus:outline-none focus:ring-2 focus:ring-offset-2",
1363
- // Sizes
1364
- small: () => "bg-white dark:bg-gray-900 border-gray-300 dark:border-gray-600 text-gray-900 dark:text-gray-100 focus:border-blue-500 focus:ring-blue-500 dark:focus:border-blue-400 dark:focus:ring-blue-400 block w-full rounded-md px-2 py-1.5 text-xs placeholder:text-gray-500 dark:placeholder:text-gray-400 transition-colors duration-200 focus:outline-none focus:ring-2 focus:ring-offset-2",
1365
- large: () => "bg-white dark:bg-gray-900 border-gray-300 dark:border-gray-600 text-gray-900 dark:text-gray-100 focus:border-blue-500 focus:ring-blue-500 dark:focus:border-blue-400 dark:focus:ring-blue-400 block w-full rounded-md px-4 py-3 text-base placeholder:text-gray-500 dark:placeholder:text-gray-400 transition-colors duration-200 focus:outline-none focus:ring-2 focus:ring-offset-2",
1366
- // Special variants
1367
- withIcon: () => "bg-white dark:bg-gray-900 border-gray-300 dark:border-gray-600 text-gray-900 dark:text-gray-100 focus:border-blue-500 focus:ring-blue-500 dark:focus:border-blue-400 dark:focus:ring-blue-400 block w-full rounded-md pl-10 pr-3 py-2 text-sm placeholder:text-gray-500 dark:placeholder:text-gray-400 transition-colors duration-200 focus:outline-none focus:ring-2 focus:ring-offset-2"
1368
- },
1369
- // Alert variants
1370
- alert: {
1371
- info: () => "bg-blue-50 border-blue-200 dark:bg-blue-900/20 dark:border-blue-800 text-blue-800 dark:text-blue-200 rounded-md border p-4 flex items-start gap-3",
1372
- success: () => "bg-green-50 border-green-200 dark:bg-green-900/20 dark:border-green-800 text-green-800 dark:text-green-200 rounded-md border p-4 flex items-start gap-3",
1373
- warning: () => "bg-amber-50 border-amber-200 dark:bg-amber-900/20 dark:border-amber-800 text-amber-800 dark:text-amber-200 rounded-md border p-4 flex items-start gap-3",
1374
- error: () => "bg-red-50 border-red-200 dark:bg-red-900/20 dark:border-red-800 text-red-800 dark:text-red-200 rounded-md border p-4 flex items-start gap-3",
1375
- // Compact variants
1376
- compact: {
1377
- info: () => "bg-blue-50 border-blue-200 dark:bg-blue-900/20 dark:border-blue-800 text-blue-800 dark:text-blue-200 rounded border px-3 py-2 text-sm",
1378
- success: () => "bg-green-50 border-green-200 dark:bg-green-900/20 dark:border-green-800 text-green-800 dark:text-green-200 rounded border px-3 py-2 text-sm",
1379
- warning: () => "bg-amber-50 border-amber-200 dark:bg-amber-900/20 dark:border-amber-800 text-amber-800 dark:text-amber-200 rounded border px-3 py-2 text-sm",
1380
- error: () => "bg-red-50 border-red-200 dark:bg-red-900/20 dark:border-red-800 text-red-800 dark:text-red-200 rounded border px-3 py-2 text-sm"
1381
- }
1382
- },
1383
- // Loading/Spinner variants
1384
- loading: {
1385
- // Spinner variants
1386
- spinner: {
1387
- default: () => "animate-spin rounded-full border-2 border-gray-200 border-t-blue-600 dark:border-gray-700 dark:border-t-blue-400 w-5 h-5",
1388
- small: () => "animate-spin rounded-full border-2 border-gray-200 border-t-blue-600 dark:border-gray-700 dark:border-t-blue-400 w-4 h-4",
1389
- large: () => "animate-spin rounded-full border-2 border-gray-200 border-t-blue-600 dark:border-gray-700 dark:border-t-blue-400 w-8 h-8",
1390
- extraLarge: () => "animate-spin rounded-full border-4 border-gray-200 border-t-blue-600 dark:border-gray-700 dark:border-t-blue-400 w-16 h-16",
1391
- // Color variants
1392
- white: () => "animate-spin rounded-full border-2 border-white/30 border-t-white w-5 h-5",
1393
- success: () => "animate-spin rounded-full border-2 border-green-200 border-t-green-600 dark:border-green-700 dark:border-t-green-400 w-5 h-5",
1394
- warning: () => "animate-spin rounded-full border-2 border-amber-200 border-t-amber-600 dark:border-amber-700 dark:border-t-amber-400 w-5 h-5",
1395
- error: () => "animate-spin rounded-full border-2 border-red-200 border-t-red-600 dark:border-red-700 dark:border-t-red-400 w-5 h-5"
1396
- },
1397
- // Loading state containers
1398
- state: {
1399
- default: () => "flex flex-col items-center justify-center py-8 px-4",
1400
- fullScreen: () => "flex flex-col items-center justify-center min-h-screen bg-white dark:bg-gray-900",
1401
- inline: () => "inline-flex items-center gap-2",
1402
- center: () => "flex items-center justify-center"
1403
- },
1404
- // Loading buttons
1405
- button: {
1406
- default: () => "inline-flex items-center gap-2 opacity-70 cursor-wait pointer-events-none",
1407
- primary: () => "bg-blue-600 text-white hover:bg-blue-700 inline-flex items-center gap-2 opacity-70 cursor-wait pointer-events-none px-4 py-2 rounded-md text-sm font-medium",
1408
- secondary: () => "bg-gray-100 text-gray-900 hover:bg-gray-200 inline-flex items-center gap-2 opacity-70 cursor-wait pointer-events-none px-4 py-2 rounded-md text-sm font-medium dark:bg-gray-800 dark:text-gray-50"
1409
- },
1410
- // Skeleton loading
1411
- skeleton: {
1412
- default: () => "animate-pulse bg-gray-200 dark:bg-gray-700 rounded",
1413
- text: () => "animate-pulse bg-gray-200 dark:bg-gray-700 rounded h-4",
1414
- title: () => "animate-pulse bg-gray-200 dark:bg-gray-700 rounded h-6",
1415
- avatar: () => "animate-pulse bg-gray-200 dark:bg-gray-700 rounded-full w-10 h-10",
1416
- card: () => "animate-pulse bg-gray-200 dark:bg-gray-700 rounded-lg h-32"
1417
- },
1418
- // Progress indicators
1419
- progress: {
1420
- bar: () => "w-full bg-gray-200 rounded-full h-2 dark:bg-gray-700",
1421
- fill: () => "bg-blue-600 h-2 rounded-full transition-all duration-300",
1422
- indeterminate: () => "w-full bg-gray-200 rounded-full h-2 dark:bg-gray-700 overflow-hidden relative before:absolute before:inset-0 before:bg-blue-600 before:rounded-full before:animate-pulse"
1423
- },
1424
- // Dots indicator
1425
- dots: {
1426
- default: () => "flex space-x-1 justify-center items-center",
1427
- dot: () => "w-2 h-2 bg-blue-600 dark:bg-blue-400 rounded-full animate-pulse",
1428
- dotStaggered: (i = 0) => `w-2 h-2 bg-blue-600 dark:bg-blue-400 rounded-full animate-pulse animation-delay-${i}`
1429
- }
1430
- },
1431
- // Modal/Dialog variants
1432
- modal: {
1433
- // Overlay variants
1434
- overlay: {
1435
- default: () => "fixed inset-0 bg-black/50 backdrop-blur-sm z-50 flex items-center justify-center p-4",
1436
- dark: () => "fixed inset-0 bg-black/70 backdrop-blur-sm z-50 flex items-center justify-center p-4",
1437
- light: () => "fixed inset-0 bg-black/30 backdrop-blur-sm z-50 flex items-center justify-center p-4"
1438
- },
1439
- // Container variants
1440
- container: {
1441
- default: () => "bg-white dark:bg-gray-800 rounded-lg shadow-xl border border-gray-200 dark:border-gray-700 max-h-[90vh] overflow-hidden",
1442
- small: () => "bg-white dark:bg-gray-800 rounded-lg shadow-xl border border-gray-200 dark:border-gray-700 max-h-[90vh] overflow-hidden w-full max-w-sm",
1443
- medium: () => "bg-white dark:bg-gray-800 rounded-lg shadow-xl border border-gray-200 dark:border-gray-700 max-h-[90vh] overflow-hidden w-full max-w-md",
1444
- large: () => "bg-white dark:bg-gray-800 rounded-lg shadow-xl border border-gray-200 dark:border-gray-700 max-h-[90vh] overflow-hidden w-full max-w-2xl",
1445
- extraLarge: () => "bg-white dark:bg-gray-800 rounded-lg shadow-xl border border-gray-200 dark:border-gray-700 max-h-[90vh] overflow-hidden w-full max-w-4xl",
1446
- fullScreen: () => "bg-white dark:bg-gray-800 shadow-xl border border-gray-200 dark:border-gray-700 w-full h-full overflow-hidden"
1447
- },
1448
- // Header variants
1449
- header: {
1450
- default: () => "px-6 py-4 border-b border-gray-200 dark:border-gray-700 flex items-center justify-between",
1451
- centered: () => "px-6 py-4 border-b border-gray-200 dark:border-gray-700 text-center",
1452
- minimal: () => "px-6 py-4 flex items-center justify-between"
1453
- },
1454
- // Content variants
1455
- content: {
1456
- default: () => "px-6 py-4 overflow-y-auto flex-1",
1457
- padded: () => "px-6 py-6 overflow-y-auto flex-1",
1458
- compact: () => "px-4 py-3 overflow-y-auto flex-1",
1459
- scrollable: () => "px-6 py-4 overflow-y-auto flex-1 max-h-96"
1460
- },
1461
- // Footer variants
1462
- footer: {
1463
- default: () => "px-6 py-4 border-t border-gray-200 dark:border-gray-700 flex items-center justify-end gap-3",
1464
- centered: () => "px-6 py-4 border-t border-gray-200 dark:border-gray-700 flex items-center justify-center gap-3",
1465
- spaceBetween: () => "px-6 py-4 border-t border-gray-200 dark:border-gray-700 flex items-center justify-between",
1466
- minimal: () => "px-6 py-4 flex items-center justify-end gap-3"
1467
- },
1468
- // Close button variants
1469
- close: {
1470
- default: () => "text-gray-400 hover:text-gray-600 dark:text-gray-500 dark:hover:text-gray-300 transition-colors duration-200 p-2 rounded-md hover:bg-gray-100 dark:hover:bg-gray-700",
1471
- subtle: () => "text-gray-400 hover:text-gray-600 dark:text-gray-500 dark:hover:text-gray-300 transition-colors duration-200",
1472
- prominent: () => "text-gray-500 hover:text-gray-700 dark:text-gray-400 dark:hover:text-gray-200 transition-colors duration-200 p-2 rounded-md hover:bg-gray-100 dark:hover:bg-gray-700 border border-gray-200 dark:border-gray-600"
1473
- },
1474
- // Web3 specific modal variants
1475
- web3: {
1476
- wallet: () => "bg-white dark:bg-gray-800 rounded-lg shadow-xl border border-gray-200 dark:border-gray-700 max-h-[90vh] overflow-hidden w-full max-w-md",
1477
- transaction: () => "bg-white dark:bg-gray-800 rounded-lg shadow-xl border border-gray-200 dark:border-gray-700 max-h-[90vh] overflow-hidden w-full max-w-lg",
1478
- confirmation: () => "bg-white dark:bg-gray-800 rounded-lg shadow-xl border border-gray-200 dark:border-gray-700 max-h-[90vh] overflow-hidden w-full max-w-sm"
1479
- },
1480
- // Animation variants
1481
- animation: {
1482
- fadeIn: () => "animate-in fade-in-0 duration-200",
1483
- slideIn: () => "animate-in fade-in-0 zoom-in-95 duration-200",
1484
- slideUp: () => "animate-in fade-in-0 slide-in-from-bottom-4 duration-200",
1485
- fadeOut: () => "animate-out fade-out-0 duration-150",
1486
- slideOut: () => "animate-out fade-out-0 zoom-out-95 duration-150"
1487
- }
1488
- },
1489
- // Navigation variants
1490
- navigation: {
1491
- // Breadcrumb variants
1492
- breadcrumb: {
1493
- container: () => "flex items-center justify-between text-sm",
1494
- list: () => "flex items-center space-x-1",
1495
- item: () => "flex items-center",
1496
- separator: () => "h-4 w-4 text-gray-400 dark:text-gray-500 mx-2 flex-shrink-0",
1497
- link: () => "flex items-center text-gray-500 dark:text-gray-400 hover:text-gray-700 dark:hover:text-gray-300 transition-colors focus:outline-none focus:ring-2 focus:ring-blue-500 focus:rounded-sm",
1498
- current: () => "flex items-center text-gray-900 dark:text-white font-medium",
1499
- home: () => "h-4 w-4 mr-1 flex-shrink-0"
1500
- },
1501
- // Tab variants
1502
- tabs: {
1503
- root: () => "",
1504
- list: () => "inline-flex h-10 items-center justify-center rounded-md bg-gray-100 dark:bg-gray-800 p-1 text-gray-500 dark:text-gray-400",
1505
- listUnderlined: () => "flex border-b border-gray-200 dark:border-gray-700",
1506
- listPills: () => "flex space-x-1 bg-gray-100 dark:bg-gray-800 rounded-lg p-1",
1507
- trigger: () => "inline-flex items-center justify-center whitespace-nowrap rounded-sm px-3 py-1.5 text-sm font-medium ring-offset-white transition-all focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-blue-500 focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 data-[state=active]:bg-white data-[state=active]:text-gray-950 data-[state=active]:shadow-sm dark:ring-offset-gray-950 dark:focus-visible:ring-blue-400 dark:data-[state=active]:bg-gray-950 dark:data-[state=active]:text-gray-50",
1508
- triggerUnderlined: () => "inline-flex items-center justify-center whitespace-nowrap px-4 py-2 text-sm font-medium text-gray-500 dark:text-gray-400 border-b-2 border-transparent hover:text-gray-700 dark:hover:text-gray-300 hover:border-gray-300 dark:hover:border-gray-600 focus:outline-none focus:text-blue-600 focus:border-blue-600 dark:focus:text-blue-400 dark:focus:border-blue-400 data-[state=active]:text-blue-600 data-[state=active]:border-blue-600 dark:data-[state=active]:text-blue-400 dark:data-[state=active]:border-blue-400 transition-colors",
1509
- triggerPills: () => "inline-flex items-center justify-center whitespace-nowrap rounded-md px-3 py-1.5 text-sm font-medium text-gray-600 dark:text-gray-400 hover:text-gray-900 dark:hover:text-gray-100 hover:bg-white dark:hover:bg-gray-700 focus:outline-none focus:ring-2 focus:ring-blue-500 data-[state=active]:bg-white data-[state=active]:text-gray-900 data-[state=active]:shadow-sm dark:data-[state=active]:bg-gray-700 dark:data-[state=active]:text-gray-100 transition-all",
1510
- content: () => "mt-2 ring-offset-white focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-blue-500 focus-visible:ring-offset-2 dark:ring-offset-gray-950 dark:focus-visible:ring-blue-400"
1511
- },
1512
- // Menu/Dropdown variants
1513
- menu: {
1514
- trigger: () => "inline-flex items-center justify-center whitespace-nowrap rounded-md px-4 py-2 text-sm font-medium text-gray-700 dark:text-gray-300 hover:bg-gray-100 dark:hover:bg-gray-800 hover:text-gray-900 dark:hover:text-gray-100 focus:outline-none focus:ring-2 focus:ring-blue-500 focus:ring-offset-2 transition-colors",
1515
- content: () => "z-50 min-w-[12rem] overflow-hidden rounded-md border border-gray-200 dark:border-gray-700 bg-white dark:bg-gray-800 p-1 text-gray-900 dark:text-gray-100 shadow-lg",
1516
- item: () => "relative flex cursor-default select-none items-center rounded-sm px-2 py-1.5 text-sm font-medium outline-none focus:bg-gray-100 focus:text-gray-900 dark:focus:bg-gray-700 dark:focus:text-gray-100 data-[disabled]:pointer-events-none data-[disabled]:opacity-50 hover:bg-gray-100 dark:hover:bg-gray-700 transition-colors",
1517
- separator: () => "-mx-1 my-1 h-px bg-gray-200 dark:bg-gray-700",
1518
- label: () => "px-2 py-1.5 text-sm font-semibold text-gray-900 dark:text-gray-100",
1519
- shortcut: () => "ml-auto text-xs tracking-widest text-gray-500 dark:text-gray-400"
1520
- },
1521
- // Pagination variants
1522
- pagination: {
1523
- container: () => "flex items-center justify-between border-t border-gray-200 dark:border-gray-700 bg-white dark:bg-gray-800 px-4 py-3 sm:px-6",
1524
- info: () => "flex flex-1 justify-between sm:hidden",
1525
- nav: () => "hidden sm:flex sm:flex-1 sm:items-center sm:justify-between",
1526
- results: () => "text-sm text-gray-700 dark:text-gray-300",
1527
- buttons: () => "relative z-0 inline-flex rounded-md shadow-sm -space-x-px",
1528
- button: () => "relative inline-flex items-center px-2 py-2 text-sm font-medium text-gray-500 dark:text-gray-400 bg-white dark:bg-gray-800 border border-gray-300 dark:border-gray-600 hover:bg-gray-50 dark:hover:bg-gray-700 focus:z-10 focus:outline-none focus:ring-1 focus:ring-blue-500 focus:border-blue-500 transition-colors",
1529
- buttonActive: () => "relative inline-flex items-center px-4 py-2 text-sm font-medium text-blue-600 dark:text-blue-400 bg-blue-50 dark:bg-blue-900/20 border border-blue-300 dark:border-blue-700 z-10",
1530
- buttonFirst: () => "rounded-l-md",
1531
- buttonLast: () => "rounded-r-md",
1532
- // Mobile variants
1533
- mobileButton: () => "relative inline-flex items-center px-4 py-2 text-sm font-medium text-gray-700 dark:text-gray-300 bg-white dark:bg-gray-800 border border-gray-300 dark:border-gray-600 hover:bg-gray-50 dark:hover:bg-gray-700 rounded-md transition-colors"
1534
- },
1535
- // Sidebar/Menu navigation
1536
- sidebar: {
1537
- container: () => "flex flex-col h-full bg-white dark:bg-gray-800 border-r border-gray-200 dark:border-gray-700",
1538
- nav: () => "flex-1 px-4 py-6 space-y-1",
1539
- item: () => "group flex items-center px-3 py-2 text-sm font-medium rounded-md text-gray-700 dark:text-gray-300 hover:bg-gray-100 dark:hover:bg-gray-700 hover:text-gray-900 dark:hover:text-gray-100 transition-colors",
1540
- itemActive: () => "group flex items-center px-3 py-2 text-sm font-medium rounded-md bg-blue-100 dark:bg-blue-900/20 text-blue-700 dark:text-blue-300 border-r-2 border-blue-500",
1541
- icon: () => "mr-3 h-5 w-5 flex-shrink-0 text-gray-400 group-hover:text-gray-500 dark:text-gray-500 dark:group-hover:text-gray-400",
1542
- iconActive: () => "mr-3 h-5 w-5 flex-shrink-0 text-blue-500 dark:text-blue-400"
1543
- },
1544
- // Step navigation
1545
- steps: {
1546
- container: () => "flex items-center justify-center",
1547
- list: () => "flex items-center space-x-4",
1548
- step: () => "flex items-center space-x-2",
1549
- circle: () => "flex items-center justify-center w-8 h-8 rounded-full border-2 border-gray-300 dark:border-gray-600 bg-white dark:bg-gray-800 text-gray-500 dark:text-gray-400 text-sm font-medium",
1550
- circleActive: () => "flex items-center justify-center w-8 h-8 rounded-full border-2 border-blue-600 dark:border-blue-400 bg-blue-600 dark:bg-blue-400 text-white text-sm font-medium",
1551
- circleCompleted: () => "flex items-center justify-center w-8 h-8 rounded-full border-2 border-green-600 dark:border-green-400 bg-green-600 dark:bg-green-400 text-white text-sm font-medium",
1552
- label: () => "text-sm font-medium text-gray-900 dark:text-gray-100",
1553
- labelInactive: () => "text-sm font-medium text-gray-500 dark:text-gray-400",
1554
- connector: () => "w-12 h-px bg-gray-300 dark:bg-gray-600",
1555
- connectorActive: () => "w-12 h-px bg-blue-600 dark:bg-blue-400"
1556
- }
1557
- },
1558
- // Data Display variants
1559
- dataDisplay: {
1560
- // Table variants
1561
- table: {
1562
- container: () => "w-full overflow-hidden rounded-lg border border-gray-200 dark:border-gray-700",
1563
- wrapper: () => "overflow-x-auto",
1564
- table: () => "min-w-full divide-y divide-gray-200 dark:divide-gray-700",
1565
- thead: () => "bg-gray-50 dark:bg-gray-800",
1566
- tbody: () => "bg-white dark:bg-gray-900 divide-y divide-gray-200 dark:divide-gray-700",
1567
- tfoot: () => "bg-gray-50 dark:bg-gray-800",
1568
- tr: () => "hover:bg-gray-50 dark:hover:bg-gray-800 transition-colors",
1569
- trSelected: () => "bg-blue-50 dark:bg-blue-900/20 hover:bg-blue-100 dark:hover:bg-blue-900/30",
1570
- th: () => "px-6 py-3 text-left text-xs font-medium text-gray-500 dark:text-gray-400 uppercase tracking-wider",
1571
- thSortable: () => "px-6 py-3 text-left text-xs font-medium text-gray-500 dark:text-gray-400 uppercase tracking-wider cursor-pointer hover:text-gray-700 dark:hover:text-gray-200 transition-colors",
1572
- td: () => "px-6 py-4 whitespace-nowrap text-sm text-gray-900 dark:text-gray-100",
1573
- tdCompact: () => "px-3 py-2 whitespace-nowrap text-sm text-gray-900 dark:text-gray-100"
1574
- },
1575
- // List variants
1576
- list: {
1577
- container: () => "bg-white dark:bg-gray-900 shadow overflow-hidden rounded-lg",
1578
- ul: () => "divide-y divide-gray-200 dark:divide-gray-700",
1579
- li: () => "px-4 py-4 sm:px-6 hover:bg-gray-50 dark:hover:bg-gray-800 transition-colors",
1580
- liActive: () => "px-4 py-4 sm:px-6 bg-blue-50 dark:bg-blue-900/20 border-l-4 border-blue-500",
1581
- // Email list specific
1582
- emailItem: () => "flex items-center px-4 py-3 hover:bg-gray-50 dark:hover:bg-gray-800 cursor-pointer transition-colors",
1583
- emailItemRead: () => "flex items-center px-4 py-3 hover:bg-gray-50 dark:hover:bg-gray-800 cursor-pointer transition-colors opacity-60",
1584
- emailItemSelected: () => "flex items-center px-4 py-3 bg-blue-50 dark:bg-blue-900/20 hover:bg-blue-100 dark:hover:bg-blue-900/30 cursor-pointer"
1585
- },
1586
- // Grid variants
1587
- grid: {
1588
- container: () => "grid gap-4",
1589
- twoColumn: () => "grid grid-cols-1 md:grid-cols-2 gap-4",
1590
- threeColumn: () => "grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4",
1591
- fourColumn: () => "grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-4",
1592
- autoFit: () => "grid grid-cols-[repeat(auto-fit,minmax(250px,1fr))] gap-4"
1593
- },
1594
- // Key-Value pairs
1595
- keyValue: {
1596
- container: () => "bg-white dark:bg-gray-900 shadow overflow-hidden rounded-lg",
1597
- list: () => "divide-y divide-gray-200 dark:divide-gray-700",
1598
- row: () => "px-4 py-4 sm:px-6 sm:grid sm:grid-cols-3 sm:gap-4",
1599
- key: () => "text-sm font-medium text-gray-500 dark:text-gray-400",
1600
- value: () => "mt-1 text-sm text-gray-900 dark:text-gray-100 sm:mt-0 sm:col-span-2",
1601
- // Inline variant
1602
- inline: () => "flex items-center space-x-2",
1603
- inlineKey: () => "text-sm font-medium text-gray-500 dark:text-gray-400",
1604
- inlineValue: () => "text-sm text-gray-900 dark:text-gray-100"
1605
- },
1606
- // Code display
1607
- code: {
1608
- inline: () => "font-mono text-sm text-pink-600 dark:text-pink-400 bg-gray-100 dark:bg-gray-800 px-1.5 py-0.5 rounded",
1609
- block: () => "font-mono text-sm text-gray-900 dark:text-gray-100 bg-gray-100 dark:bg-gray-800 p-4 rounded-lg overflow-x-auto",
1610
- // Web3 specific
1611
- address: () => "font-mono text-sm text-blue-600 dark:text-blue-400 bg-blue-50 dark:bg-blue-900/20 px-2 py-1 rounded select-all",
1612
- hash: () => "font-mono text-sm text-purple-600 dark:text-purple-400 bg-purple-50 dark:bg-purple-900/20 px-2 py-1 rounded select-all",
1613
- // Syntax highlighting
1614
- keyword: () => "text-purple-600 dark:text-purple-400",
1615
- string: () => "text-green-600 dark:text-green-400",
1616
- number: () => "text-blue-600 dark:text-blue-400",
1617
- comment: () => "text-gray-500 dark:text-gray-500 italic"
1618
- },
1619
- // Stats/Metrics
1620
- stats: {
1621
- container: () => "bg-white dark:bg-gray-900 overflow-hidden shadow rounded-lg",
1622
- grid: () => "grid grid-cols-1 md:grid-cols-3 divide-y md:divide-y-0 md:divide-x divide-gray-200 dark:divide-gray-700",
1623
- item: () => "px-4 py-5 sm:p-6",
1624
- label: () => "text-sm font-medium text-gray-500 dark:text-gray-400 truncate",
1625
- value: () => "mt-1 text-3xl font-semibold text-gray-900 dark:text-gray-100",
1626
- change: () => "mt-2 flex items-center text-sm",
1627
- changePositive: () => "text-green-600 dark:text-green-400",
1628
- changeNegative: () => "text-red-600 dark:text-red-400"
1629
- },
1630
- // Empty states
1631
- empty: {
1632
- container: () => "text-center py-12",
1633
- icon: () => "mx-auto h-12 w-12 text-gray-400",
1634
- title: () => "mt-2 text-sm font-medium text-gray-900 dark:text-gray-100",
1635
- description: () => "mt-1 text-sm text-gray-500 dark:text-gray-400",
1636
- action: () => "mt-6"
1637
- },
1638
- // Timeline
1639
- timeline: {
1640
- container: () => "flow-root",
1641
- list: () => "-mb-8",
1642
- item: () => "relative pb-8",
1643
- itemLast: () => "relative",
1644
- connector: () => "absolute top-4 left-4 -ml-px h-full w-0.5 bg-gray-200 dark:bg-gray-700",
1645
- dot: () => "relative flex h-8 w-8 items-center justify-center rounded-full bg-white dark:bg-gray-800 ring-8 ring-white dark:ring-gray-900",
1646
- dotActive: () => "bg-blue-600 dark:bg-blue-400",
1647
- dotComplete: () => "bg-green-600 dark:bg-green-400",
1648
- content: () => "ml-12 flex flex-col",
1649
- time: () => "text-xs text-gray-500 dark:text-gray-400",
1650
- title: () => "text-sm font-medium text-gray-900 dark:text-gray-100",
1651
- description: () => "mt-1 text-sm text-gray-500 dark:text-gray-400"
1652
- }
1653
- },
1654
- // Forms Advanced variants
1655
- formsAdvanced: {
1656
- // Multi-step wizard
1657
- wizard: {
1658
- container: () => "w-full",
1659
- steps: () => "flex items-center justify-between mb-8",
1660
- step: () => "flex flex-col items-center",
1661
- stepCircle: () => "w-10 h-10 rounded-full flex items-center justify-center text-sm font-medium border-2 transition-all",
1662
- stepCompleted: () => "bg-green-100 border-green-500 text-green-700 dark:bg-green-900/30 dark:border-green-400 dark:text-green-300",
1663
- stepCurrent: () => "bg-blue-100 border-blue-500 text-blue-700 dark:bg-blue-900/30 dark:border-blue-400 dark:text-blue-300",
1664
- stepInactive: () => "bg-gray-100 border-gray-300 text-gray-500 dark:bg-gray-800 dark:border-gray-600 dark:text-gray-400",
1665
- stepContent: () => "mt-2 text-center",
1666
- stepTitle: () => "text-sm font-medium",
1667
- stepDescription: () => "text-xs text-gray-500 dark:text-gray-400 mt-1",
1668
- connector: () => "flex-1 h-px bg-gray-200 dark:bg-gray-700 mt-5",
1669
- connectorCompleted: () => "flex-1 h-px bg-green-300 dark:bg-green-600 mt-5"
1670
- },
1671
- // File upload components
1672
- fileUpload: {
1673
- dropzone: () => "border-2 border-dashed border-gray-300 dark:border-gray-600 rounded-lg p-8 text-center transition-colors hover:border-gray-400 dark:hover:border-gray-500 cursor-pointer",
1674
- dropzoneActive: () => "border-blue-400 bg-blue-50 dark:bg-blue-900/20 dark:border-blue-500",
1675
- dropzoneError: () => "border-red-400 bg-red-50 dark:bg-red-900/20 dark:border-red-500",
1676
- icon: () => "h-12 w-12 text-gray-400 mx-auto mb-4",
1677
- text: () => "text-lg font-medium text-gray-900 dark:text-gray-100 mb-2",
1678
- subtext: () => "text-sm text-gray-500 dark:text-gray-400 mb-4",
1679
- button: () => "inline-flex items-center px-4 py-2 border border-gray-300 dark:border-gray-600 rounded-md shadow-sm text-sm font-medium text-gray-700 dark:text-gray-300 bg-white dark:bg-gray-800 hover:bg-gray-50 dark:hover:bg-gray-700 cursor-pointer transition-colors",
1680
- input: () => "sr-only",
1681
- fileList: () => "mt-6 space-y-2",
1682
- fileItem: () => "flex items-center justify-between p-3 bg-gray-50 dark:bg-gray-800 rounded-lg",
1683
- fileIcon: () => "w-8 h-8 bg-blue-100 dark:bg-blue-900 rounded flex items-center justify-center mr-3",
1684
- fileName: () => "text-sm font-medium text-gray-900 dark:text-gray-100",
1685
- fileSize: () => "text-xs text-gray-500 dark:text-gray-400",
1686
- removeButton: () => "p-1 text-gray-400 hover:text-red-500 transition-colors"
1687
- },
1688
- // Web3 specific inputs
1689
- web3: {
1690
- container: () => "space-y-2",
1691
- label: () => "text-sm font-medium text-gray-700 dark:text-gray-300 mb-2 flex items-center",
1692
- labelIcon: () => "h-4 w-4 inline mr-1",
1693
- inputGroup: () => "flex rounded-md shadow-sm",
1694
- tokenInput: () => "rounded-r-none font-mono",
1695
- tokenSymbol: () => "inline-flex items-center px-3 rounded-r-md border border-l-0 border-gray-300 dark:border-gray-600 bg-gray-50 dark:bg-gray-700 text-gray-500 dark:text-gray-400 text-sm font-medium",
1696
- balance: () => "text-sm text-gray-500 dark:text-gray-400",
1697
- balanceActions: () => "flex space-x-2",
1698
- maxButton: () => "text-xs",
1699
- addressInput: () => "font-mono text-sm",
1700
- addressValid: () => "border-green-300 dark:border-green-600 pr-10",
1701
- addressInvalid: () => "border-red-300 dark:border-red-600 pr-10",
1702
- gasSettings: () => "grid grid-cols-3 gap-2",
1703
- gasOption: () => "p-2 text-center border rounded-md transition-colors cursor-pointer",
1704
- gasOptionActive: () => "border-blue-300 bg-blue-50 dark:border-blue-600 dark:bg-blue-900/20",
1705
- gasOptionInactive: () => "border-gray-300 dark:border-gray-600 hover:border-gray-400 dark:hover:border-gray-500"
1706
- },
1707
- // Advanced validation
1708
- validation: {
1709
- container: () => "space-y-1",
1710
- label: () => "text-sm font-medium text-gray-700 dark:text-gray-300",
1711
- input: () => "block w-full rounded-md border-gray-300 dark:border-gray-600 shadow-sm focus:border-blue-500 focus:ring-blue-500 dark:bg-gray-800 dark:text-gray-100",
1712
- inputSuccess: () => "border-green-300 dark:border-green-600 focus:border-green-500 focus:ring-green-500 pr-10",
1713
- inputError: () => "border-red-300 dark:border-red-600 focus:border-red-500 focus:ring-red-500 pr-10",
1714
- inputWarning: () => "border-yellow-300 dark:border-yellow-600 focus:border-yellow-500 focus:ring-yellow-500 pr-10",
1715
- successIcon: () => "absolute right-3 top-1/2 transform -translate-y-1/2 h-4 w-4 text-green-500",
1716
- errorIcon: () => "absolute right-3 top-1/2 transform -translate-y-1/2 h-4 w-4 text-red-500",
1717
- warningIcon: () => "absolute right-3 top-1/2 transform -translate-y-1/2 h-4 w-4 text-yellow-500",
1718
- loadingIcon: () => "absolute right-3 top-1/2 transform -translate-y-1/2 h-4 w-4 animate-spin text-blue-600",
1719
- successMessage: () => "text-xs text-green-600 dark:text-green-400",
1720
- errorMessage: () => "text-xs text-red-600 dark:text-red-400",
1721
- warningMessage: () => "text-xs text-yellow-600 dark:text-yellow-400",
1722
- helpMessage: () => "text-xs text-gray-500 dark:text-gray-400",
1723
- requirements: () => "space-y-1 mt-2",
1724
- requirement: () => "flex items-center text-xs",
1725
- requirementMet: () => "text-green-600 dark:text-green-400",
1726
- requirementUnmet: () => "text-gray-500 dark:text-gray-400",
1727
- requirementIcon: () => "h-3 w-3 mr-1"
1728
- },
1729
- // Form sections and layouts
1730
- layout: {
1731
- section: () => "space-y-6",
1732
- sectionTitle: () => "text-lg font-medium text-gray-900 dark:text-gray-100",
1733
- sectionDescription: () => "text-sm text-gray-500 dark:text-gray-400",
1734
- fieldGroup: () => "space-y-4",
1735
- fieldRow: () => "grid grid-cols-1 md:grid-cols-2 gap-4",
1736
- fieldColumn: () => "space-y-4",
1737
- actions: () => "flex justify-between pt-6 border-t border-gray-200 dark:border-gray-700",
1738
- actionsRight: () => "flex justify-end space-x-4 pt-6 border-t border-gray-200 dark:border-gray-700",
1739
- actionsCenter: () => "flex justify-center space-x-4 pt-6 border-t border-gray-200 dark:border-gray-700"
1740
- },
1741
- // Security and sensitive inputs
1742
- security: {
1743
- container: () => "relative",
1744
- input: () => "font-mono",
1745
- toggleButton: () => "absolute inset-y-0 right-0 pr-3 flex items-center text-gray-400 hover:text-gray-600 dark:hover:text-gray-200",
1746
- strengthMeter: () => "mt-2 h-2 bg-gray-200 dark:bg-gray-700 rounded-full overflow-hidden",
1747
- strengthBar: () => "h-full transition-all duration-300",
1748
- strengthWeak: () => "bg-red-500 w-1/4",
1749
- strengthMedium: () => "bg-yellow-500 w-1/2",
1750
- strengthStrong: () => "bg-green-500 w-3/4",
1751
- strengthVeryStrong: () => "bg-green-600 w-full"
1752
- },
1753
- // Conditional fields and dynamic forms
1754
- conditional: {
1755
- container: () => "space-y-4",
1756
- trigger: () => "flex items-center space-x-2",
1757
- content: () => "ml-6 mt-4 pl-4 border-l-2 border-gray-200 dark:border-gray-700 space-y-4",
1758
- contentVisible: () => "opacity-100 max-h-none",
1759
- contentHidden: () => "opacity-0 max-h-0 overflow-hidden"
1760
- }
1761
- },
1762
- // Notifications & Feedback variants
1763
- notifications: {
1764
- // Toast notifications
1765
- toast: {
1766
- container: () => "fixed top-4 right-4 z-50 max-w-sm w-full transform transition-all duration-300 ease-out",
1767
- content: () => "bg-white dark:bg-gray-800 border border-gray-200 dark:border-gray-700 rounded-lg shadow-lg p-4",
1768
- // Toast with icon and content
1769
- wrapper: () => "flex items-start space-x-3",
1770
- icon: () => "flex-shrink-0 mt-0.5",
1771
- successIcon: () => "h-5 w-5 text-green-500",
1772
- errorIcon: () => "h-5 w-5 text-red-500",
1773
- warningIcon: () => "h-5 w-5 text-yellow-500",
1774
- infoIcon: () => "h-5 w-5 text-blue-500",
1775
- text: () => "flex-1 min-w-0",
1776
- title: () => "text-sm font-medium text-gray-900 dark:text-gray-100",
1777
- message: () => "mt-1 text-sm text-gray-500 dark:text-gray-400",
1778
- action: () => "mt-2 text-sm text-blue-600 dark:text-blue-400 hover:text-blue-800 dark:hover:text-blue-200 cursor-pointer",
1779
- closeButton: () => "ml-4 flex-shrink-0 text-gray-400 hover:text-gray-500 dark:hover:text-gray-300 cursor-pointer",
1780
- // Toast variants by type
1781
- success: () => "border-green-200 dark:border-green-800 bg-green-50 dark:bg-green-900/20",
1782
- error: () => "border-red-200 dark:border-red-800 bg-red-50 dark:bg-red-900/20",
1783
- warning: () => "border-yellow-200 dark:border-yellow-800 bg-yellow-50 dark:bg-yellow-900/20",
1784
- info: () => "border-blue-200 dark:border-blue-800 bg-blue-50 dark:bg-blue-900/20"
1785
- },
1786
- // Progress indicators
1787
- progress: {
1788
- container: () => "w-full",
1789
- content: () => "flex items-center justify-between mb-2",
1790
- text: () => "flex-1 min-w-0 mr-4",
1791
- title: () => "text-sm font-medium text-gray-700 dark:text-gray-300",
1792
- message: () => "text-xs text-gray-500 dark:text-gray-400 mt-1",
1793
- // Progress bar
1794
- bar: () => "w-full bg-gray-200 dark:bg-gray-700 rounded-full h-2 overflow-hidden",
1795
- fill: () => "h-full bg-blue-600 rounded-full transition-all duration-300",
1796
- fillSuccess: () => "h-full bg-green-600 rounded-full transition-all duration-300",
1797
- fillError: () => "h-full bg-red-600 rounded-full transition-all duration-300",
1798
- fillWarning: () => "h-full bg-yellow-600 rounded-full transition-all duration-300",
1799
- percentage: () => "text-sm text-gray-500 dark:text-gray-400 ml-2 flex-shrink-0",
1800
- // Circular progress
1801
- circle: () => "relative w-8 h-8",
1802
- circleTrack: () => "absolute inset-0 rounded-full border-2 border-gray-200 dark:border-gray-700",
1803
- circleFill: () => "absolute inset-0 rounded-full border-2 border-transparent transition-all duration-300",
1804
- // Loading spinners
1805
- spinner: () => "animate-spin rounded-full border-2 border-transparent",
1806
- spinnerPrimary: () => "border-t-blue-600 border-r-blue-600",
1807
- spinnerSuccess: () => "border-t-green-600 border-r-green-600",
1808
- spinnerError: () => "border-t-red-600 border-r-red-600",
1809
- spinnerWarning: () => "border-t-yellow-600 border-r-yellow-600"
1810
- },
1811
- // Transaction status
1812
- transaction: {
1813
- container: () => "border border-gray-200 dark:border-gray-700 rounded-lg p-4 bg-white dark:bg-gray-800",
1814
- wrapper: () => "flex items-start space-x-3",
1815
- icon: () => "w-10 h-10 rounded-full flex items-center justify-center flex-shrink-0",
1816
- iconPending: () => "bg-yellow-100 dark:bg-yellow-900/30 text-yellow-600 dark:text-yellow-400",
1817
- iconConfirming: () => "bg-blue-100 dark:bg-blue-900/30 text-blue-600 dark:text-blue-400",
1818
- iconConfirmed: () => "bg-green-100 dark:bg-green-900/30 text-green-600 dark:text-green-400",
1819
- iconFailed: () => "bg-red-100 dark:bg-red-900/30 text-red-600 dark:text-red-400",
1820
- content: () => "flex-1 min-w-0",
1821
- header: () => "flex items-center justify-between mb-1",
1822
- type: () => "text-sm font-medium text-gray-900 dark:text-gray-100",
1823
- status: () => "px-2 py-1 text-xs rounded-full font-medium",
1824
- statusPending: () => "bg-yellow-100 text-yellow-800 dark:bg-yellow-900/30 dark:text-yellow-300",
1825
- statusConfirming: () => "bg-blue-100 text-blue-800 dark:bg-blue-900/30 dark:text-blue-300",
1826
- statusConfirmed: () => "bg-green-100 text-green-800 dark:bg-green-900/30 dark:text-green-300",
1827
- statusFailed: () => "bg-red-100 text-red-800 dark:bg-red-900/30 dark:text-red-300",
1828
- details: () => "text-xs text-gray-500 dark:text-gray-400 mt-1",
1829
- hash: () => "font-mono text-xs text-gray-500 dark:text-gray-400",
1830
- amount: () => "text-sm text-gray-600 dark:text-gray-400 ml-2",
1831
- confirmations: () => "mt-2 text-xs text-gray-500 dark:text-gray-400",
1832
- confirmationBar: () => "w-full bg-gray-200 dark:bg-gray-700 rounded-full h-1.5 mt-1",
1833
- confirmationProgress: () => "h-1.5 bg-blue-600 rounded-full transition-all duration-300"
1834
- },
1835
- // System status indicators
1836
- status: {
1837
- indicator: () => "flex items-center space-x-2",
1838
- dot: () => "w-3 h-3 rounded-full flex-shrink-0",
1839
- text: () => "text-sm font-medium",
1840
- // Status variants
1841
- online: () => "text-green-700 dark:text-green-300",
1842
- onlineDot: () => "bg-green-500",
1843
- degraded: () => "text-yellow-700 dark:text-yellow-300",
1844
- degradedDot: () => "bg-yellow-500",
1845
- offline: () => "text-red-700 dark:text-red-300",
1846
- offlineDot: () => "bg-red-500",
1847
- // Animated indicators
1848
- pulse: () => "animate-pulse",
1849
- // Connection status
1850
- connection: () => "flex items-center justify-between p-3 bg-gray-50 dark:bg-gray-800 rounded-lg",
1851
- connectionLabel: () => "text-sm font-medium text-gray-900 dark:text-gray-100",
1852
- connectionDescription: () => "text-xs text-gray-500 dark:text-gray-400",
1853
- connectionStatus: () => "px-2 py-1 text-xs rounded-full font-medium"
1854
- },
1855
- // Notification badges
1856
- badge: {
1857
- container: () => "relative inline-block",
1858
- badge: () => "absolute -top-1 -right-1 text-white text-xs rounded-full flex items-center justify-center font-medium",
1859
- // Size variants
1860
- small: () => "h-3 w-3 text-xs",
1861
- medium: () => "h-4 w-4 text-xs",
1862
- large: () => "h-5 w-5 text-xs",
1863
- // Color variants
1864
- primary: () => "bg-blue-500",
1865
- success: () => "bg-green-500",
1866
- error: () => "bg-red-500",
1867
- warning: () => "bg-yellow-500",
1868
- // Special states
1869
- dot: () => "w-2 h-2 rounded-full animate-pulse",
1870
- count: () => "min-w-[1rem] px-1",
1871
- countOverflow: () => "min-w-[1.25rem] px-1"
1872
- // for 99+
1873
- },
1874
- // Contextual feedback
1875
- feedback: {
1876
- container: () => "p-3 rounded-lg border",
1877
- content: () => "flex items-start",
1878
- icon: () => "flex-shrink-0 mr-2 mt-0.5",
1879
- text: () => "flex-1 min-w-0",
1880
- title: () => "text-sm font-medium",
1881
- message: () => "text-sm mt-1",
1882
- action: () => "ml-auto flex-shrink-0",
1883
- // Feedback variants
1884
- success: () => "bg-green-50 dark:bg-green-900/20 border-green-200 dark:border-green-800",
1885
- successIcon: () => "h-4 w-4 text-green-600 dark:text-green-400",
1886
- successTitle: () => "text-green-800 dark:text-green-200",
1887
- successMessage: () => "text-green-700 dark:text-green-300",
1888
- error: () => "bg-red-50 dark:bg-red-900/20 border-red-200 dark:border-red-800",
1889
- errorIcon: () => "h-4 w-4 text-red-600 dark:text-red-400",
1890
- errorTitle: () => "text-red-800 dark:text-red-200",
1891
- errorMessage: () => "text-red-700 dark:text-red-300",
1892
- warning: () => "bg-yellow-50 dark:bg-yellow-900/20 border-yellow-200 dark:border-yellow-800",
1893
- warningIcon: () => "h-4 w-4 text-yellow-600 dark:text-yellow-400",
1894
- warningTitle: () => "text-yellow-800 dark:text-yellow-200",
1895
- warningMessage: () => "text-yellow-700 dark:text-yellow-300",
1896
- info: () => "bg-blue-50 dark:bg-blue-900/20 border-blue-200 dark:border-blue-800",
1897
- infoIcon: () => "h-4 w-4 text-blue-600 dark:text-blue-400",
1898
- infoTitle: () => "text-blue-800 dark:text-blue-200",
1899
- infoMessage: () => "text-blue-700 dark:text-blue-300",
1900
- neutral: () => "bg-gray-50 dark:bg-gray-800 border-gray-200 dark:border-gray-700",
1901
- neutralIcon: () => "h-4 w-4 text-gray-600 dark:text-gray-400",
1902
- neutralTitle: () => "text-gray-900 dark:text-gray-100",
1903
- neutralMessage: () => "text-gray-600 dark:text-gray-400"
1904
- },
1905
- // Alert banners (different from alerts component)
1906
- banner: {
1907
- container: () => "border-l-4 p-4",
1908
- content: () => "flex items-center justify-between",
1909
- text: () => "flex items-center",
1910
- icon: () => "flex-shrink-0 mr-3",
1911
- message: () => "text-sm font-medium",
1912
- action: () => "flex-shrink-0 ml-4",
1913
- closeButton: () => "text-gray-400 hover:text-gray-500 dark:hover:text-gray-300",
1914
- // Banner variants
1915
- success: () => "bg-green-50 dark:bg-green-900/20 border-green-400",
1916
- error: () => "bg-red-50 dark:bg-red-900/20 border-red-400",
1917
- warning: () => "bg-yellow-50 dark:bg-yellow-900/20 border-yellow-400",
1918
- info: () => "bg-blue-50 dark:bg-blue-900/20 border-blue-400"
1919
- },
1920
- // Loading states
1921
- loading: {
1922
- overlay: () => "fixed inset-0 bg-black bg-opacity-50 flex items-center justify-center z-50",
1923
- container: () => "bg-white dark:bg-gray-800 rounded-lg p-6 max-w-sm mx-4",
1924
- content: () => "text-center",
1925
- spinner: () => "mx-auto mb-4",
1926
- title: () => "text-lg font-medium text-gray-900 dark:text-gray-100 mb-2",
1927
- message: () => "text-sm text-gray-500 dark:text-gray-400",
1928
- // Inline loading
1929
- inline: () => "flex items-center space-x-2",
1930
- inlineSpinner: () => "flex-shrink-0",
1931
- inlineText: () => "text-sm text-gray-600 dark:text-gray-400"
1932
- }
1933
- },
1934
- // Layout & Spacing variants
1935
- layout: {
1936
- // Container variants
1937
- container: {
1938
- narrow: () => "max-w-2xl mx-auto px-4 sm:px-6",
1939
- default: () => "max-w-7xl mx-auto px-4 sm:px-6 lg:px-8",
1940
- wide: () => "max-w-7xl mx-auto px-4 sm:px-6 lg:px-8",
1941
- full: () => "w-full px-4 sm:px-6 lg:px-8",
1942
- fluid: () => "w-full"
1943
- },
1944
- // Grid layouts
1945
- grid: {
1946
- // Responsive columns
1947
- responsive: {
1948
- oneToTwo: () => "grid grid-cols-1 md:grid-cols-2 gap-4 md:gap-6",
1949
- oneToThree: () => "grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4 md:gap-6",
1950
- oneToFour: () => "grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-4 md:gap-6",
1951
- twoToFour: () => "grid grid-cols-2 md:grid-cols-4 gap-4 md:gap-6",
1952
- threeToSix: () => "grid grid-cols-3 md:grid-cols-6 gap-4 md:gap-6"
1953
- },
1954
- // Fixed columns with responsive gaps
1955
- fixed: {
1956
- one: () => "grid grid-cols-1 gap-4 md:gap-6",
1957
- two: () => "grid grid-cols-2 gap-4 md:gap-6",
1958
- three: () => "grid grid-cols-3 gap-4 md:gap-6",
1959
- four: () => "grid grid-cols-4 gap-4 md:gap-6",
1960
- five: () => "grid grid-cols-5 gap-4 md:gap-6",
1961
- six: () => "grid grid-cols-6 gap-4 md:gap-6"
1962
- },
1963
- // Auto-fit patterns
1964
- autoFit: {
1965
- small: () => "grid grid-cols-[repeat(auto-fit,minmax(200px,1fr))] gap-4 md:gap-6",
1966
- medium: () => "grid grid-cols-[repeat(auto-fit,minmax(300px,1fr))] gap-4 md:gap-6",
1967
- large: () => "grid grid-cols-[repeat(auto-fit,minmax(400px,1fr))] gap-4 md:gap-6"
1968
- },
1969
- // Dashboard layouts
1970
- dashboard: {
1971
- sidebar: () => "grid grid-cols-1 lg:grid-cols-4 gap-6",
1972
- sidebarContent: () => "lg:col-span-3",
1973
- sidebarAside: () => "lg:col-span-1",
1974
- twoColumn: () => "grid grid-cols-1 lg:grid-cols-2 gap-6",
1975
- threeColumn: () => "grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6",
1976
- // Masonry-style layouts
1977
- masonry: () => "columns-1 md:columns-2 lg:columns-3 xl:columns-4 gap-6 space-y-6",
1978
- masonryItem: () => "break-inside-avoid mb-6"
1979
- }
1980
- },
1981
- // Flexbox patterns
1982
- flex: {
1983
- // Basic layouts
1984
- row: () => "flex flex-row",
1985
- column: () => "flex flex-col",
1986
- rowReverse: () => "flex flex-row-reverse",
1987
- columnReverse: () => "flex flex-col-reverse",
1988
- // Common patterns
1989
- center: () => "flex items-center justify-center",
1990
- centerVertical: () => "flex items-center",
1991
- centerHorizontal: () => "flex justify-center",
1992
- spaceBetween: () => "flex items-center justify-between",
1993
- spaceAround: () => "flex items-center justify-around",
1994
- spaceEvenly: () => "flex items-center justify-evenly",
1995
- // Responsive flex direction
1996
- responsiveColumn: () => "flex flex-col md:flex-row",
1997
- responsiveRow: () => "flex flex-row md:flex-col",
1998
- // Common component layouts
1999
- header: () => "flex items-center justify-between w-full",
2000
- toolbar: () => "flex items-center space-x-2",
2001
- buttonGroup: () => "flex items-center space-x-2",
2002
- iconText: () => "flex items-center space-x-2",
2003
- // List layouts
2004
- listItem: () => "flex items-start space-x-3",
2005
- listItemCenter: () => "flex items-center space-x-3",
2006
- listItemEnd: () => "flex items-end space-x-3",
2007
- // Card content layouts
2008
- cardContent: () => "flex flex-col space-y-4",
2009
- cardActions: () => "flex items-center justify-end space-x-2 pt-4",
2010
- cardHeader: () => "flex items-start justify-between",
2011
- // Form layouts
2012
- formRow: () => "flex flex-col sm:flex-row sm:items-center sm:space-x-4 space-y-2 sm:space-y-0",
2013
- formActions: () => "flex flex-col sm:flex-row-reverse sm:justify-start space-y-2 sm:space-y-0 sm:space-x-2 sm:space-x-reverse",
2014
- // Wrap variants
2015
- wrap: () => "flex flex-wrap",
2016
- nowrap: () => "flex flex-nowrap",
2017
- wrapReverse: () => "flex flex-wrap-reverse",
2018
- // Gap utilities (for flex layouts)
2019
- gapSm: () => "gap-2",
2020
- gapMd: () => "gap-4",
2021
- gapLg: () => "gap-6",
2022
- gapXl: () => "gap-8"
2023
- },
2024
- // Spacing utilities
2025
- spacing: {
2026
- // Margin utilities
2027
- margin: {
2028
- none: () => "m-0",
2029
- xs: () => "m-1",
2030
- sm: () => "m-2",
2031
- md: () => "m-4",
2032
- lg: () => "m-6",
2033
- xl: () => "m-8",
2034
- xxl: () => "m-12",
2035
- // Directional margins
2036
- top: {
2037
- none: () => "mt-0",
2038
- xs: () => "mt-1",
2039
- sm: () => "mt-2",
2040
- md: () => "mt-4",
2041
- lg: () => "mt-6",
2042
- xl: () => "mt-8",
2043
- xxl: () => "mt-12"
2044
- },
2045
- bottom: {
2046
- none: () => "mb-0",
2047
- xs: () => "mb-1",
2048
- sm: () => "mb-2",
2049
- md: () => "mb-4",
2050
- lg: () => "mb-6",
2051
- xl: () => "mb-8",
2052
- xxl: () => "mb-12"
2053
- },
2054
- left: {
2055
- none: () => "ml-0",
2056
- xs: () => "ml-1",
2057
- sm: () => "ml-2",
2058
- md: () => "ml-4",
2059
- lg: () => "ml-6",
2060
- xl: () => "ml-8",
2061
- xxl: () => "ml-12"
2062
- },
2063
- right: {
2064
- none: () => "mr-0",
2065
- xs: () => "mr-1",
2066
- sm: () => "mr-2",
2067
- md: () => "mr-4",
2068
- lg: () => "mr-6",
2069
- xl: () => "mr-8",
2070
- xxl: () => "mr-12"
2071
- },
2072
- horizontal: {
2073
- none: () => "mx-0",
2074
- xs: () => "mx-1",
2075
- sm: () => "mx-2",
2076
- md: () => "mx-4",
2077
- lg: () => "mx-6",
2078
- xl: () => "mx-8",
2079
- xxl: () => "mx-12",
2080
- auto: () => "mx-auto"
2081
- },
2082
- vertical: {
2083
- none: () => "my-0",
2084
- xs: () => "my-1",
2085
- sm: () => "my-2",
2086
- md: () => "my-4",
2087
- lg: () => "my-6",
2088
- xl: () => "my-8",
2089
- xxl: () => "my-12"
2090
- }
2091
- },
2092
- // Padding utilities
2093
- padding: {
2094
- none: () => "p-0",
2095
- xs: () => "p-1",
2096
- sm: () => "p-2",
2097
- md: () => "p-4",
2098
- lg: () => "p-6",
2099
- xl: () => "p-8",
2100
- xxl: () => "p-12",
2101
- // Directional padding
2102
- top: {
2103
- none: () => "pt-0",
2104
- xs: () => "pt-1",
2105
- sm: () => "pt-2",
2106
- md: () => "pt-4",
2107
- lg: () => "pt-6",
2108
- xl: () => "pt-8",
2109
- xxl: () => "pt-12"
2110
- },
2111
- bottom: {
2112
- none: () => "pb-0",
2113
- xs: () => "pb-1",
2114
- sm: () => "pb-2",
2115
- md: () => "pb-4",
2116
- lg: () => "pb-6",
2117
- xl: () => "pb-8",
2118
- xxl: () => "pb-12"
2119
- },
2120
- left: {
2121
- none: () => "pl-0",
2122
- xs: () => "pl-1",
2123
- sm: () => "pl-2",
2124
- md: () => "pl-4",
2125
- lg: () => "pl-6",
2126
- xl: () => "pl-8",
2127
- xxl: () => "pl-12"
2128
- },
2129
- right: {
2130
- none: () => "pr-0",
2131
- xs: () => "pr-1",
2132
- sm: () => "pr-2",
2133
- md: () => "pr-4",
2134
- lg: () => "pr-6",
2135
- xl: () => "pr-8",
2136
- xxl: () => "pr-12"
2137
- },
2138
- horizontal: {
2139
- none: () => "px-0",
2140
- xs: () => "px-1",
2141
- sm: () => "px-2",
2142
- md: () => "px-4",
2143
- lg: () => "px-6",
2144
- xl: () => "px-8",
2145
- xxl: () => "px-12"
2146
- },
2147
- vertical: {
2148
- none: () => "py-0",
2149
- xs: () => "py-1",
2150
- sm: () => "py-2",
2151
- md: () => "py-4",
2152
- lg: () => "py-6",
2153
- xl: () => "py-8",
2154
- xxl: () => "py-12"
2155
- }
2156
- },
2157
- // Common spacing combinations
2158
- section: () => "py-12 md:py-16 lg:py-20",
2159
- subsection: () => "py-8 md:py-12",
2160
- cardSpacing: () => "p-6 md:p-8",
2161
- listSpacing: () => "space-y-4",
2162
- buttonSpacing: () => "space-x-2"
2163
- },
2164
- // Web3-specific layouts
2165
- web3: {
2166
- // Wallet interface layouts
2167
- wallet: {
2168
- connect: () => "flex flex-col items-center space-y-4 p-6",
2169
- connected: () => "flex items-center justify-between p-4 bg-green-50 dark:bg-green-900/20 rounded-lg",
2170
- balance: () => "grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-4 gap-4",
2171
- portfolio: () => "grid grid-cols-1 lg:grid-cols-3 gap-6"
2172
- },
2173
- // Transaction layouts
2174
- transaction: {
2175
- form: () => "space-y-6",
2176
- preview: () => "bg-gray-50 dark:bg-gray-800 rounded-lg p-4 space-y-3",
2177
- history: () => "space-y-2",
2178
- historyItem: () => "flex items-center justify-between p-3 bg-white dark:bg-gray-800 rounded-lg border border-gray-200 dark:border-gray-700",
2179
- details: () => "grid grid-cols-1 md:grid-cols-2 gap-4"
2180
- },
2181
- // NFT layouts
2182
- nft: {
2183
- gallery: () => "grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4 gap-4 md:gap-6",
2184
- card: () => "bg-white dark:bg-gray-800 rounded-lg border border-gray-200 dark:border-gray-700 overflow-hidden",
2185
- cardContent: () => "p-4 space-y-3",
2186
- cardActions: () => "flex items-center justify-between pt-3 border-t border-gray-200 dark:border-gray-700",
2187
- // Collection view
2188
- collection: () => "grid grid-cols-1 lg:grid-cols-4 gap-6",
2189
- collectionSidebar: () => "lg:col-span-1 space-y-6",
2190
- collectionGrid: () => "lg:col-span-3"
2191
- },
2192
- // DeFi layouts
2193
- defi: {
2194
- dashboard: () => "grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6",
2195
- pool: () => "bg-white dark:bg-gray-800 rounded-lg border border-gray-200 dark:border-gray-700 p-6",
2196
- poolStats: () => "grid grid-cols-2 md:grid-cols-4 gap-4",
2197
- liquidity: () => "space-y-4",
2198
- farming: () => "grid grid-cols-1 lg:grid-cols-2 gap-6"
2199
- },
2200
- // DAO layouts
2201
- dao: {
2202
- governance: () => "grid grid-cols-1 lg:grid-cols-3 gap-6",
2203
- proposal: () => "bg-white dark:bg-gray-800 rounded-lg border border-gray-200 dark:border-gray-700 p-6",
2204
- proposalHeader: () => "flex items-start justify-between mb-6",
2205
- proposalContent: () => "space-y-6",
2206
- voting: () => "grid grid-cols-1 md:grid-cols-2 gap-4"
2207
- }
2208
- },
2209
- // Positioning utilities
2210
- position: {
2211
- relative: () => "relative",
2212
- absolute: () => "absolute",
2213
- fixed: () => "fixed",
2214
- sticky: () => "sticky",
2215
- // Common absolute positions
2216
- topLeft: () => "absolute top-0 left-0",
2217
- topRight: () => "absolute top-0 right-0",
2218
- bottomLeft: () => "absolute bottom-0 left-0",
2219
- bottomRight: () => "absolute bottom-0 right-0",
2220
- center: () => "absolute top-1/2 left-1/2 transform -translate-x-1/2 -translate-y-1/2",
2221
- // Overlay positions
2222
- overlay: () => "fixed inset-0 z-50",
2223
- backdrop: () => "fixed inset-0 bg-black bg-opacity-50 z-40"
2224
- },
2225
- // Overflow utilities
2226
- overflow: {
2227
- hidden: () => "overflow-hidden",
2228
- auto: () => "overflow-auto",
2229
- scroll: () => "overflow-scroll",
2230
- xHidden: () => "overflow-x-hidden",
2231
- yHidden: () => "overflow-y-hidden",
2232
- xAuto: () => "overflow-x-auto",
2233
- yAuto: () => "overflow-y-auto",
2234
- xScroll: () => "overflow-x-scroll",
2235
- yScroll: () => "overflow-y-scroll"
2236
- },
2237
- // Z-index utilities
2238
- zIndex: {
2239
- base: () => "z-0",
2240
- dropdown: () => "z-10",
2241
- sticky: () => "z-20",
2242
- modal: () => "z-50",
2243
- popover: () => "z-60",
2244
- tooltip: () => "z-70"
2245
- },
2246
- // Display utilities
2247
- display: {
2248
- block: () => "block",
2249
- inline: () => "inline",
2250
- inlineBlock: () => "inline-block",
2251
- flex: () => "flex",
2252
- inlineFlex: () => "inline-flex",
2253
- grid: () => "grid",
2254
- inlineGrid: () => "inline-grid",
2255
- hidden: () => "hidden",
2256
- // Responsive display
2257
- hiddenMobile: () => "hidden sm:block",
2258
- hiddenTablet: () => "hidden md:block",
2259
- hiddenDesktop: () => "block md:hidden",
2260
- mobileOnly: () => "block sm:hidden",
2261
- tabletOnly: () => "hidden sm:block md:hidden",
2262
- desktopOnly: () => "hidden md:block"
2263
- },
2264
- // Common layout patterns
2265
- patterns: {
2266
- // Page layouts
2267
- fullHeight: () => "min-h-screen flex flex-col",
2268
- centeredPage: () => "min-h-screen flex items-center justify-center",
2269
- // Header patterns
2270
- header: () => "sticky top-0 z-40 bg-white dark:bg-gray-900 border-b border-gray-200 dark:border-gray-700",
2271
- headerContent: () => "max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 h-16 flex items-center justify-between",
2272
- // Sidebar patterns
2273
- sidebarLayout: () => "flex h-screen bg-gray-100 dark:bg-gray-900",
2274
- sidebar: () => "w-64 bg-white dark:bg-gray-800 border-r border-gray-200 dark:border-gray-700",
2275
- mainContent: () => "flex-1 flex flex-col overflow-hidden",
2276
- // Modal patterns
2277
- modalOverlay: () => "fixed inset-0 bg-black bg-opacity-50 flex items-center justify-center p-4 z-50",
2278
- modalContent: () => "bg-white dark:bg-gray-800 rounded-lg shadow-xl max-w-lg w-full max-h-[90vh] overflow-hidden",
2279
- // Card patterns
2280
- cardGrid: () => "grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6",
2281
- cardStack: () => "space-y-6",
2282
- // List patterns
2283
- dividedList: () => "divide-y divide-gray-200 dark:divide-gray-700",
2284
- spacedList: () => "space-y-4",
2285
- // Form patterns
2286
- formStack: () => "space-y-6",
2287
- formGrid: () => "grid grid-cols-1 md:grid-cols-2 gap-6",
2288
- fieldset: () => "space-y-4",
2289
- // Loading patterns
2290
- loadingOverlay: () => "absolute inset-0 bg-white bg-opacity-75 dark:bg-gray-900 dark:bg-opacity-75 flex items-center justify-center",
2291
- loadingInline: () => "flex items-center space-x-2",
2292
- // Empty state patterns
2293
- emptyState: () => "text-center py-12",
2294
- emptyStateIcon: () => "mx-auto h-12 w-12 text-gray-400 mb-4"
2295
- }
2296
- },
2297
- // Table variants
2298
- table: {
2299
- container: () => "overflow-hidden rounded-lg border border-gray-200 dark:border-gray-700 bg-white dark:bg-gray-800",
2300
- table: () => "min-w-full divide-y divide-gray-200 dark:divide-gray-700",
2301
- header: {
2302
- row: () => "bg-gray-50 dark:bg-gray-900/50",
2303
- cell: () => "px-6 py-3 text-left text-xs font-medium text-gray-500 dark:text-gray-400 uppercase tracking-wider",
2304
- sortable: () => "px-6 py-3 text-left text-xs font-medium text-gray-500 dark:text-gray-400 uppercase tracking-wider cursor-pointer hover:bg-gray-100 dark:hover:bg-gray-800 select-none group"
2305
- },
2306
- body: {
2307
- row: () => "bg-white dark:bg-gray-800 hover:bg-gray-50 dark:hover:bg-gray-700/50 transition-colors duration-200",
2308
- rowSelected: () => "bg-blue-50 dark:bg-blue-900/20 hover:bg-blue-100 dark:hover:bg-blue-900/30 transition-colors duration-200",
2309
- rowClickable: () => "bg-white dark:bg-gray-800 hover:bg-gray-50 dark:hover:bg-gray-700/50 transition-colors duration-200 cursor-pointer",
2310
- cell: () => "px-6 py-4 whitespace-nowrap text-sm text-gray-900 dark:text-gray-100",
2311
- cellMuted: () => "px-6 py-4 whitespace-nowrap text-sm text-gray-500 dark:text-gray-400",
2312
- cellAction: () => "px-6 py-4 whitespace-nowrap text-right text-sm font-medium"
2313
- },
2314
- // Compact table variants
2315
- compact: {
2316
- header: {
2317
- cell: () => "px-4 py-2 text-left text-xs font-medium text-gray-500 dark:text-gray-400 uppercase tracking-wider",
2318
- sortable: () => "px-4 py-2 text-left text-xs font-medium text-gray-500 dark:text-gray-400 uppercase tracking-wider cursor-pointer hover:bg-gray-100 dark:hover:bg-gray-800 select-none group"
2319
- },
2320
- body: {
2321
- cell: () => "px-4 py-3 whitespace-nowrap text-sm text-gray-900 dark:text-gray-100",
2322
- cellMuted: () => "px-4 py-3 whitespace-nowrap text-sm text-gray-500 dark:text-gray-400",
2323
- cellAction: () => "px-4 py-3 whitespace-nowrap text-right text-sm font-medium"
2324
- }
2325
- },
2326
- // Table states
2327
- states: {
2328
- loading: () => "opacity-50 pointer-events-none",
2329
- empty: () => "text-center py-12 text-gray-500 dark:text-gray-400",
2330
- error: () => "text-center py-12 text-red-500 dark:text-red-400"
2331
- },
2332
- // Pagination styles
2333
- pagination: {
2334
- container: () => "bg-white dark:bg-gray-800 px-4 py-3 flex items-center justify-between border-t border-gray-200 dark:border-gray-700 sm:px-6",
2335
- info: () => "flex-1 flex justify-between sm:hidden text-sm text-gray-700 dark:text-gray-300",
2336
- nav: () => "hidden sm:flex-1 sm:flex sm:items-center sm:justify-between",
2337
- button: () => "relative inline-flex items-center px-4 py-2 border border-gray-300 dark:border-gray-600 text-sm font-medium rounded-md text-gray-700 dark:text-gray-300 bg-white dark:bg-gray-800 hover:bg-gray-50 dark:hover:bg-gray-700 disabled:opacity-50 disabled:cursor-not-allowed transition-colors duration-200",
2338
- buttonCurrent: () => "relative inline-flex items-center px-4 py-2 border border-blue-500 dark:border-blue-400 text-sm font-medium rounded-md text-blue-600 dark:text-blue-400 bg-blue-50 dark:bg-blue-900/20 hover:bg-blue-100 dark:hover:bg-blue-900/30 transition-colors duration-200"
2339
- },
2340
- // Data grid specific variants
2341
- grid: {
2342
- container: () => "overflow-auto rounded-lg border border-gray-200 dark:border-gray-700",
2343
- table: () => "min-w-full table-fixed",
2344
- resizeHandle: () => "absolute right-0 top-0 bottom-0 w-1 cursor-col-resize hover:bg-blue-500 dark:hover:bg-blue-400 transition-colors duration-200",
2345
- filterContainer: () => "border-b border-gray-200 dark:border-gray-700 bg-gray-50 dark:bg-gray-900/50 p-3",
2346
- filterInput: () => "block w-full rounded-md border-gray-300 dark:border-gray-600 bg-white dark:bg-gray-800 px-3 py-2 text-sm focus:border-blue-500 focus:ring-blue-500 dark:focus:border-blue-400 dark:focus:ring-blue-400 focus:outline-none focus:ring-2"
2347
- },
2348
- // Sorting indicators
2349
- sort: {
2350
- indicator: () => "ml-2 h-4 w-4 flex-none rounded text-gray-400 group-hover:text-gray-500 dark:group-hover:text-gray-300",
2351
- ascending: () => "ml-2 h-4 w-4 flex-none rounded text-gray-400 group-hover:text-gray-500 dark:group-hover:text-gray-300 transform rotate-0",
2352
- descending: () => "ml-2 h-4 w-4 flex-none rounded text-gray-400 group-hover:text-gray-500 dark:group-hover:text-gray-300 transform rotate-180"
2353
- }
2354
- },
2355
- // Icon variants
2356
- icon: {
2357
- // Size variants
2358
- size: {
2359
- xs: () => "h-3 w-3",
2360
- sm: () => "h-4 w-4",
2361
- md: () => "h-5 w-5",
2362
- lg: () => "h-6 w-6",
2363
- xl: () => "h-8 w-8",
2364
- xxl: () => "h-10 w-10",
2365
- xxxl: () => "h-12 w-12"
2366
- },
2367
- // Color variants
2368
- color: {
2369
- // Neutral colors
2370
- default: () => "text-gray-500 dark:text-gray-400",
2371
- muted: () => "text-gray-400 dark:text-gray-500",
2372
- subtle: () => "text-gray-300 dark:text-gray-600",
2373
- primary: () => "text-gray-900 dark:text-gray-100",
2374
- // Brand colors
2375
- brand: () => "text-blue-600 dark:text-blue-400",
2376
- brandMuted: () => "text-blue-500 dark:text-blue-500",
2377
- // Semantic colors
2378
- success: () => "text-green-600 dark:text-green-400",
2379
- warning: () => "text-amber-600 dark:text-amber-400",
2380
- error: () => "text-red-600 dark:text-red-400",
2381
- info: () => "text-blue-600 dark:text-blue-400",
2382
- // Interactive colors
2383
- interactive: () => "text-blue-600 hover:text-blue-700 dark:text-blue-400 dark:hover:text-blue-300 transition-colors duration-200",
2384
- interactiveSubtle: () => "text-gray-500 hover:text-gray-700 dark:text-gray-400 dark:hover:text-gray-200 transition-colors duration-200",
2385
- // Web3 specific colors
2386
- ethereum: () => "text-blue-600 dark:text-blue-400",
2387
- solana: () => "text-purple-600 dark:text-purple-400",
2388
- bitcoin: () => "text-orange-600 dark:text-orange-400"
2389
- },
2390
- // Combined size and color variants
2391
- variant: {
2392
- // Default variants (most common combinations)
2393
- default: {
2394
- xs: () => "h-3 w-3 text-gray-500 dark:text-gray-400",
2395
- sm: () => "h-4 w-4 text-gray-500 dark:text-gray-400",
2396
- md: () => "h-5 w-5 text-gray-500 dark:text-gray-400",
2397
- lg: () => "h-6 w-6 text-gray-500 dark:text-gray-400",
2398
- xl: () => "h-8 w-8 text-gray-500 dark:text-gray-400"
2399
- },
2400
- // Interactive variants
2401
- interactive: {
2402
- xs: () => "h-3 w-3 text-blue-600 hover:text-blue-700 dark:text-blue-400 dark:hover:text-blue-300 transition-colors duration-200 cursor-pointer",
2403
- sm: () => "h-4 w-4 text-blue-600 hover:text-blue-700 dark:text-blue-400 dark:hover:text-blue-300 transition-colors duration-200 cursor-pointer",
2404
- md: () => "h-5 w-5 text-blue-600 hover:text-blue-700 dark:text-blue-400 dark:hover:text-blue-300 transition-colors duration-200 cursor-pointer",
2405
- lg: () => "h-6 w-6 text-blue-600 hover:text-blue-700 dark:text-blue-400 dark:hover:text-blue-300 transition-colors duration-200 cursor-pointer",
2406
- xl: () => "h-8 w-8 text-blue-600 hover:text-blue-700 dark:text-blue-400 dark:hover:text-blue-300 transition-colors duration-200 cursor-pointer"
2407
- },
2408
- // Success variants
2409
- success: {
2410
- xs: () => "h-3 w-3 text-green-600 dark:text-green-400",
2411
- sm: () => "h-4 w-4 text-green-600 dark:text-green-400",
2412
- md: () => "h-5 w-5 text-green-600 dark:text-green-400",
2413
- lg: () => "h-6 w-6 text-green-600 dark:text-green-400",
2414
- xl: () => "h-8 w-8 text-green-600 dark:text-green-400"
2415
- },
2416
- // Warning variants
2417
- warning: {
2418
- xs: () => "h-3 w-3 text-amber-600 dark:text-amber-400",
2419
- sm: () => "h-4 w-4 text-amber-600 dark:text-amber-400",
2420
- md: () => "h-5 w-5 text-amber-600 dark:text-amber-400",
2421
- lg: () => "h-6 w-6 text-amber-600 dark:text-amber-400",
2422
- xl: () => "h-8 w-8 text-amber-600 dark:text-amber-400"
2423
- },
2424
- // Error variants
2425
- error: {
2426
- xs: () => "h-3 w-3 text-red-600 dark:text-red-400",
2427
- sm: () => "h-4 w-4 text-red-600 dark:text-red-400",
2428
- md: () => "h-5 w-5 text-red-600 dark:text-red-400",
2429
- lg: () => "h-6 w-6 text-red-600 dark:text-red-400",
2430
- xl: () => "h-8 w-8 text-red-600 dark:text-red-400"
2431
- },
2432
- // Muted variants
2433
- muted: {
2434
- xs: () => "h-3 w-3 text-gray-400 dark:text-gray-500",
2435
- sm: () => "h-4 w-4 text-gray-400 dark:text-gray-500",
2436
- md: () => "h-5 w-5 text-gray-400 dark:text-gray-500",
2437
- lg: () => "h-6 w-6 text-gray-400 dark:text-gray-500",
2438
- xl: () => "h-8 w-8 text-gray-400 dark:text-gray-500"
2439
- }
2440
- },
2441
- // Context-specific icon patterns
2442
- context: {
2443
- // Button icons
2444
- button: {
2445
- leading: () => "h-4 w-4 mr-2 flex-shrink-0",
2446
- trailing: () => "h-4 w-4 ml-2 flex-shrink-0",
2447
- only: () => "h-4 w-4",
2448
- small: () => "h-3 w-3",
2449
- large: () => "h-5 w-5"
2450
- },
2451
- // Input icons
2452
- input: {
2453
- leading: () => "absolute left-3 top-1/2 transform -translate-y-1/2 h-4 w-4 text-gray-400 pointer-events-none",
2454
- trailing: () => "absolute right-3 top-1/2 transform -translate-y-1/2 h-4 w-4 text-gray-400",
2455
- interactive: () => "absolute right-3 top-1/2 transform -translate-y-1/2 h-4 w-4 text-gray-400 hover:text-gray-600 cursor-pointer transition-colors duration-200"
2456
- },
2457
- // Navigation icons
2458
- navigation: {
2459
- menu: () => "h-5 w-5 text-gray-600 dark:text-gray-400",
2460
- menuActive: () => "h-5 w-5 text-blue-600 dark:text-blue-400",
2461
- breadcrumb: () => "h-4 w-4 text-gray-400 mx-2",
2462
- tab: () => "h-4 w-4 mr-2"
2463
- },
2464
- // Status icons
2465
- status: {
2466
- success: () => "h-5 w-5 text-green-500 flex-shrink-0",
2467
- warning: () => "h-5 w-5 text-amber-500 flex-shrink-0",
2468
- error: () => "h-5 w-5 text-red-500 flex-shrink-0",
2469
- info: () => "h-5 w-5 text-blue-500 flex-shrink-0",
2470
- loading: () => "h-5 w-5 text-gray-400 animate-spin flex-shrink-0"
2471
- },
2472
- // Avatar/Profile icons
2473
- avatar: {
2474
- small: () => "h-6 w-6 text-gray-400",
2475
- medium: () => "h-8 w-8 text-gray-400",
2476
- large: () => "h-10 w-10 text-gray-400",
2477
- fallback: () => "h-full w-full text-gray-300"
2478
- },
2479
- // Web3 context icons
2480
- web3: {
2481
- wallet: () => "h-5 w-5 text-gray-600 dark:text-gray-400",
2482
- walletConnected: () => "h-5 w-5 text-green-600 dark:text-green-400",
2483
- walletDisconnected: () => "h-5 w-5 text-gray-400 dark:text-gray-500",
2484
- transaction: () => "h-4 w-4 text-blue-600 dark:text-blue-400",
2485
- blockchain: {
2486
- ethereum: () => "h-5 w-5 text-blue-600 dark:text-blue-400",
2487
- solana: () => "h-5 w-5 text-purple-600 dark:text-purple-400",
2488
- bitcoin: () => "h-5 w-5 text-orange-600 dark:text-orange-400"
2489
- }
2490
- },
2491
- // Card and content icons
2492
- card: {
2493
- header: () => "h-5 w-5 text-gray-600 dark:text-gray-400 mr-2",
2494
- action: () => "h-4 w-4 text-gray-500 hover:text-gray-700 dark:text-gray-400 dark:hover:text-gray-200 transition-colors duration-200",
2495
- feature: () => "h-6 w-6 text-blue-600 dark:text-blue-400",
2496
- featureLarge: () => "h-8 w-8 text-blue-600 dark:text-blue-400"
2497
- },
2498
- // List and table icons
2499
- list: {
2500
- item: () => "h-4 w-4 text-gray-500 dark:text-gray-400 mr-3 flex-shrink-0",
2501
- action: () => "h-4 w-4 text-gray-400 hover:text-gray-600 dark:text-gray-500 dark:hover:text-gray-300 transition-colors duration-200",
2502
- bullet: () => "h-1.5 w-1.5 text-gray-400 mt-2 mr-3 flex-shrink-0"
2503
- }
2504
- },
2505
- // Decorative icon patterns
2506
- decorative: {
2507
- hero: {
2508
- small: () => "h-12 w-12 text-blue-600 dark:text-blue-400",
2509
- medium: () => "h-16 w-16 text-blue-600 dark:text-blue-400",
2510
- large: () => "h-20 w-20 text-blue-600 dark:text-blue-400",
2511
- xlarge: () => "h-24 w-24 text-blue-600 dark:text-blue-400"
2512
- },
2513
- feature: {
2514
- small: () => "h-8 w-8 text-gray-600 dark:text-gray-400",
2515
- medium: () => "h-10 w-10 text-gray-600 dark:text-gray-400",
2516
- large: () => "h-12 w-12 text-gray-600 dark:text-gray-400"
2517
- },
2518
- background: {
2519
- subtle: () => "h-32 w-32 text-gray-100 dark:text-gray-800 opacity-50",
2520
- muted: () => "h-24 w-24 text-gray-200 dark:text-gray-700 opacity-30"
2521
- },
2522
- empty: {
2523
- small: () => "h-8 w-8 text-gray-400 dark:text-gray-500 mb-2",
2524
- medium: () => "h-12 w-12 text-gray-400 dark:text-gray-500 mb-4",
2525
- large: () => "h-16 w-16 text-gray-400 dark:text-gray-500 mb-6"
2526
- }
2527
- }
2528
- },
2529
- // Overlays & Portals variants
2530
- overlays: {
2531
- // Modal/Dialog overlays
2532
- modal: {
2533
- backdrop: () => "fixed inset-0 z-40 bg-black/50 dark:bg-black/70 backdrop-blur-sm transition-all duration-300 ease-out",
2534
- backdropEntering: () => "opacity-0",
2535
- backdropEntered: () => "opacity-100",
2536
- backdropExiting: () => "opacity-0",
2537
- container: () => "fixed inset-0 z-50 flex items-center justify-center p-4 transition-all duration-300 ease-out",
2538
- containerEntering: () => "opacity-0 scale-95",
2539
- containerEntered: () => "opacity-100 scale-100",
2540
- containerExiting: () => "opacity-0 scale-95",
2541
- content: () => "relative w-full max-w-lg bg-white dark:bg-gray-900 rounded-lg shadow-xl border border-gray-200 dark:border-gray-700 max-h-[80vh] overflow-hidden",
2542
- // Size variants
2543
- small: () => "max-w-sm",
2544
- medium: () => "max-w-lg",
2545
- large: () => "max-w-2xl",
2546
- extraLarge: () => "max-w-4xl",
2547
- fullWidth: () => "max-w-[95vw]",
2548
- // Header and content areas
2549
- header: () => "flex items-center justify-between p-4 sm:p-6 border-b border-gray-200 dark:border-gray-700",
2550
- title: () => "text-lg font-semibold text-gray-900 dark:text-gray-100",
2551
- closeButton: () => "p-1 hover:bg-gray-100 dark:hover:bg-gray-700 rounded-md transition-colors",
2552
- body: () => "p-4 sm:p-6 overflow-y-auto",
2553
- footer: () => "flex items-center justify-end space-x-3 p-4 sm:p-6 border-t border-gray-200 dark:border-gray-700 bg-gray-50 dark:bg-gray-800/50"
2554
- },
2555
- // Tooltip overlays
2556
- tooltip: {
2557
- container: () => "absolute z-50 px-2 py-1 text-xs font-medium text-white bg-gray-900 dark:bg-gray-800 rounded shadow-lg transition-all duration-200 pointer-events-none",
2558
- arrow: () => "absolute w-2 h-2 bg-gray-900 dark:bg-gray-800 transform rotate-45",
2559
- // Position variants
2560
- top: () => "-translate-x-1/2 -translate-y-full left-1/2 bottom-full mb-2",
2561
- topArrow: () => "top-full left-1/2 -translate-x-1/2 -translate-y-1/2",
2562
- bottom: () => "-translate-x-1/2 translate-y-full left-1/2 top-full mt-2",
2563
- bottomArrow: () => "bottom-full left-1/2 -translate-x-1/2 translate-y-1/2",
2564
- left: () => "-translate-y-1/2 -translate-x-full top-1/2 right-full mr-2",
2565
- leftArrow: () => "left-full top-1/2 -translate-y-1/2 -translate-x-1/2",
2566
- right: () => "-translate-y-1/2 translate-x-full top-1/2 left-full ml-2",
2567
- rightArrow: () => "right-full top-1/2 -translate-y-1/2 translate-x-1/2",
2568
- // Content variants
2569
- light: () => "text-gray-900 bg-white border border-gray-200 shadow-md",
2570
- dark: () => "text-white bg-gray-900 dark:bg-gray-800",
2571
- info: () => "text-blue-50 bg-blue-600",
2572
- success: () => "text-green-50 bg-green-600",
2573
- warning: () => "text-amber-50 bg-amber-600",
2574
- error: () => "text-red-50 bg-red-600"
2575
- },
2576
- // Popover overlays (more complex than tooltips)
2577
- popover: {
2578
- backdrop: () => "fixed inset-0 z-30",
2579
- container: () => "absolute z-40 w-64 bg-white dark:bg-gray-800 rounded-lg shadow-lg border border-gray-200 dark:border-gray-700 transition-all duration-200",
2580
- arrow: () => "absolute w-3 h-3 bg-white dark:bg-gray-800 border-l border-t border-gray-200 dark:border-gray-700 transform rotate-45",
2581
- // Size variants
2582
- small: () => "w-48",
2583
- medium: () => "w-64",
2584
- large: () => "w-80",
2585
- auto: () => "w-auto min-w-48 max-w-xs",
2586
- // Position variants (similar to tooltip but adjusted for larger content)
2587
- top: () => "-translate-x-1/2 -translate-y-full left-1/2 bottom-full mb-3",
2588
- topArrow: () => "top-full left-1/2 -translate-x-1/2 -translate-y-1/2",
2589
- bottom: () => "-translate-x-1/2 translate-y-full left-1/2 top-full mt-3",
2590
- bottomArrow: () => "bottom-full left-1/2 -translate-x-1/2 translate-y-1/2",
2591
- left: () => "-translate-y-1/2 -translate-x-full top-1/2 right-full mr-3",
2592
- leftArrow: () => "left-full top-1/2 -translate-y-1/2 -translate-x-1/2",
2593
- right: () => "-translate-y-1/2 translate-x-full top-1/2 left-full ml-3",
2594
- rightArrow: () => "right-full top-1/2 -translate-y-1/2 translate-x-1/2",
2595
- // Content areas
2596
- header: () => "px-4 py-3 border-b border-gray-200 dark:border-gray-700",
2597
- title: () => "text-sm font-medium text-gray-900 dark:text-gray-100",
2598
- body: () => "px-4 py-3",
2599
- footer: () => "px-4 py-3 border-t border-gray-200 dark:border-gray-700 bg-gray-50 dark:bg-gray-700/50",
2600
- // Animation states
2601
- entering: () => "opacity-0 scale-95 transform",
2602
- entered: () => "opacity-100 scale-100 transform",
2603
- exiting: () => "opacity-0 scale-95 transform"
2604
- },
2605
- // Dropdown menus
2606
- dropdown: {
2607
- container: () => "relative inline-block",
2608
- trigger: () => "inline-flex justify-center items-center",
2609
- menu: () => "absolute z-50 w-56 bg-white dark:bg-gray-800 rounded-md shadow-lg border border-gray-200 dark:border-gray-700 focus:outline-none transition-all duration-200",
2610
- menuSmall: () => "w-40",
2611
- menuLarge: () => "w-72",
2612
- menuAuto: () => "w-auto min-w-40",
2613
- // Position variants
2614
- menuTop: () => "bottom-full mb-1",
2615
- menuBottom: () => "top-full mt-1",
2616
- menuLeft: () => "right-0",
2617
- menuRight: () => "left-0",
2618
- // Animation states
2619
- menuEntering: () => "opacity-0 scale-95 transform origin-top",
2620
- menuEntered: () => "opacity-100 scale-100 transform origin-top",
2621
- menuExiting: () => "opacity-0 scale-95 transform origin-top",
2622
- // Menu items
2623
- itemContainer: () => "py-1 px-1",
2624
- item: () => "flex items-center w-full text-left px-4 py-2 text-sm text-gray-700 dark:text-gray-300 hover:bg-blue-50 dark:hover:bg-blue-900/20 hover:text-blue-700 dark:hover:text-blue-300 transition-all duration-200 cursor-pointer hover:shadow-sm rounded-sm",
2625
- itemActive: () => "bg-blue-100 dark:bg-blue-900/30 text-blue-700 dark:text-blue-300 shadow-sm",
2626
- itemDisabled: () => "text-gray-400 dark:text-gray-600 cursor-not-allowed hover:bg-transparent hover:text-gray-400 dark:hover:text-gray-600",
2627
- // Special item types
2628
- divider: () => "my-1 border-t border-gray-200 dark:border-gray-700",
2629
- header: () => "px-4 py-2 text-xs font-medium text-gray-500 dark:text-gray-400 uppercase tracking-wide",
2630
- // Icons in menu items
2631
- itemIcon: () => "mr-3 h-4 w-4 flex-shrink-0",
2632
- itemIconRight: () => "ml-auto h-4 w-4 flex-shrink-0"
2633
- },
2634
- // Drawer/Sidebar overlays
2635
- drawer: {
2636
- backdrop: () => "fixed inset-0 z-40 bg-black/50 dark:bg-black/70 transition-opacity duration-300",
2637
- container: () => "fixed inset-y-0 z-50 flex w-full justify-end transition-transform duration-300 ease-in-out",
2638
- // Position variants
2639
- right: () => "right-0",
2640
- left: () => "left-0 justify-start",
2641
- // Size variants
2642
- narrow: () => "max-w-xs",
2643
- default: () => "max-w-md",
2644
- wide: () => "max-w-lg",
2645
- extraWide: () => "max-w-2xl",
2646
- // Content
2647
- content: () => "relative flex w-full flex-col bg-white dark:bg-gray-900 border-l border-gray-200 dark:border-gray-700 shadow-xl",
2648
- contentLeft: () => "border-r border-l-0 border-gray-200 dark:border-gray-700",
2649
- header: () => "flex items-center justify-between px-4 sm:px-6 py-4 border-b border-gray-200 dark:border-gray-700",
2650
- title: () => "text-lg font-semibold text-gray-900 dark:text-gray-100",
2651
- closeButton: () => "p-2 hover:bg-gray-100 dark:hover:bg-gray-700 rounded-md transition-colors",
2652
- body: () => "flex-1 px-4 sm:px-6 py-4 overflow-y-auto",
2653
- footer: () => "flex items-center justify-end space-x-3 px-4 sm:px-6 py-4 border-t border-gray-200 dark:border-gray-700 bg-gray-50 dark:bg-gray-800/50",
2654
- // Animation states
2655
- entering: () => "translate-x-full",
2656
- enteringLeft: () => "-translate-x-full",
2657
- entered: () => "translate-x-0",
2658
- exiting: () => "translate-x-full",
2659
- exitingLeft: () => "-translate-x-full"
2660
- },
2661
- // Sheet overlays (bottom sheets, action sheets)
2662
- sheet: {
2663
- backdrop: () => "fixed inset-0 z-40 bg-black/50 dark:bg-black/70 transition-opacity duration-300",
2664
- container: () => "fixed inset-x-0 bottom-0 z-50 transition-transform duration-300 ease-out",
2665
- content: () => "relative bg-white dark:bg-gray-900 rounded-t-lg shadow-xl border-t border-gray-200 dark:border-gray-700 max-h-[85vh] overflow-hidden",
2666
- handle: () => "flex justify-center py-2",
2667
- handleBar: () => "w-10 h-1 bg-gray-300 dark:bg-gray-600 rounded-full",
2668
- header: () => "flex items-center justify-between px-4 sm:px-6 py-4 border-b border-gray-200 dark:border-gray-700",
2669
- title: () => "text-lg font-semibold text-gray-900 dark:text-gray-100",
2670
- closeButton: () => "p-2 hover:bg-gray-100 dark:hover:bg-gray-700 rounded-md transition-colors",
2671
- body: () => "px-4 sm:px-6 py-4 overflow-y-auto",
2672
- footer: () => "flex items-center justify-center space-x-3 px-4 sm:px-6 py-4 border-t border-gray-200 dark:border-gray-700 bg-gray-50 dark:bg-gray-800/50",
2673
- // Animation states
2674
- entering: () => "translate-y-full",
2675
- entered: () => "translate-y-0",
2676
- exiting: () => "translate-y-full"
2677
- },
2678
- // Context menus (right-click menus)
2679
- contextMenu: {
2680
- backdrop: () => "fixed inset-0 z-30",
2681
- container: () => "absolute z-50 w-48 bg-white dark:bg-gray-800 rounded-md shadow-lg border border-gray-200 dark:border-gray-700 py-1 focus:outline-none transition-all duration-150",
2682
- item: () => "flex items-center px-3 py-2 text-sm text-gray-700 dark:text-gray-300 hover:bg-gray-100 dark:hover:bg-gray-700 hover:text-gray-900 dark:hover:text-gray-100 transition-colors cursor-pointer",
2683
- itemDisabled: () => "text-gray-400 dark:text-gray-600 cursor-not-allowed hover:bg-transparent",
2684
- itemDanger: () => "text-red-600 dark:text-red-400 hover:bg-red-50 dark:hover:bg-red-900/20 hover:text-red-700 dark:hover:text-red-300",
2685
- divider: () => "my-1 border-t border-gray-200 dark:border-gray-700",
2686
- icon: () => "mr-2 h-4 w-4 flex-shrink-0",
2687
- shortcut: () => "ml-auto text-xs text-gray-400 dark:text-gray-500",
2688
- // Nested menu indicators
2689
- submenuIndicator: () => "ml-auto h-4 w-4 text-gray-400 dark:text-gray-500",
2690
- submenu: () => "absolute left-full top-0 ml-1"
2691
- },
2692
- // Loading overlays
2693
- loading: {
2694
- backdrop: () => "fixed inset-0 z-50 bg-white/80 dark:bg-gray-900/80 backdrop-blur-sm flex items-center justify-center transition-all duration-300",
2695
- container: () => "flex flex-col items-center space-y-4 p-6 bg-white dark:bg-gray-800 rounded-lg shadow-lg border border-gray-200 dark:border-gray-700",
2696
- spinner: () => "w-8 h-8 border-2 border-blue-600 border-t-transparent rounded-full animate-spin",
2697
- spinnerLarge: () => "w-12 h-12 border-3 border-blue-600 border-t-transparent rounded-full animate-spin",
2698
- text: () => "text-sm font-medium text-gray-900 dark:text-gray-100",
2699
- subtext: () => "text-xs text-gray-500 dark:text-gray-400 text-center max-w-xs"
2700
- },
2701
- // Portal utilities for managing overlay z-index and positioning
2702
- portal: {
2703
- // Z-index layers (ensure proper stacking)
2704
- backdrop: () => "z-40",
2705
- dropdown: () => "z-50",
2706
- tooltip: () => "z-50",
2707
- popover: () => "z-40",
2708
- modal: () => "z-50",
2709
- drawer: () => "z-50",
2710
- sheet: () => "z-50",
2711
- contextMenu: () => "z-50",
2712
- loading: () => "z-60",
2713
- notification: () => "z-70",
2714
- // Focus trap utilities
2715
- focusTrap: () => "focus:outline-none",
2716
- focusVisible: () => "focus-visible:ring-2 focus-visible:ring-blue-500 focus-visible:ring-offset-2",
2717
- // Screen reader utilities
2718
- srOnly: () => "sr-only",
2719
- ariaLabel: () => "aria-label"
2720
- }
2721
- },
2722
- // Micro-Interactions & Animations variants
2723
- animations: {
2724
- // Hover effects
2725
- hover: {
2726
- // Card hover effects
2727
- card: {
2728
- subtle: () => "transition-all duration-200 hover:shadow-md hover:-translate-y-0.5",
2729
- lift: () => "transition-all duration-300 hover:shadow-lg hover:-translate-y-1",
2730
- glow: () => "transition-all duration-200 hover:shadow-lg hover:shadow-blue-500/25 dark:hover:shadow-blue-400/25",
2731
- scale: () => "transition-transform duration-200 hover:scale-105",
2732
- border: () => "transition-all duration-200 hover:border-blue-300 dark:hover:border-blue-600",
2733
- // Web3 specific card hovers
2734
- nft: () => "transition-all duration-300 hover:shadow-xl hover:shadow-purple-500/30 hover:scale-[1.02]",
2735
- wallet: () => "transition-all duration-200 hover:shadow-md hover:bg-gradient-to-r hover:from-blue-50 hover:to-indigo-50 dark:hover:from-blue-900/20 dark:hover:to-indigo-900/20",
2736
- transaction: () => "transition-all duration-200 hover:shadow-md hover:border-green-300 dark:hover:border-green-600"
2737
- },
2738
- // Button hover effects
2739
- button: {
2740
- lift: () => "transition-all duration-150 hover:-translate-y-0.5 hover:shadow-md",
2741
- glow: () => "transition-all duration-200 hover:shadow-lg hover:shadow-current/25",
2742
- scale: () => "transition-transform duration-150 hover:scale-105",
2743
- shimmer: () => "relative overflow-hidden transition-all duration-200 before:absolute before:inset-0 before:-translate-x-full before:animate-shimmer before:bg-gradient-to-r before:from-transparent before:via-white/20 before:to-transparent hover:before:translate-x-full",
2744
- // Web3 button hovers
2745
- connect: () => "transition-all duration-200 hover:shadow-lg hover:shadow-blue-500/30 hover:scale-[1.02]",
2746
- transaction: () => "transition-all duration-200 hover:shadow-lg hover:shadow-green-500/30",
2747
- disconnect: () => "transition-all duration-200 hover:shadow-lg hover:shadow-red-500/30"
2748
- },
2749
- // Icon hover effects
2750
- icon: {
2751
- bounce: () => "transition-transform duration-200 hover:scale-110 hover:-translate-y-0.5",
2752
- rotate: () => "transition-transform duration-200 hover:rotate-12",
2753
- pulse: () => "transition-all duration-200 hover:scale-110 hover:text-blue-600 dark:hover:text-blue-400",
2754
- glow: () => "transition-all duration-200 hover:text-blue-600 dark:hover:text-blue-400 hover:drop-shadow-sm"
2755
- }
2756
- },
2757
- // Loading animations
2758
- loading: {
2759
- // Spinner variants
2760
- spinner: {
2761
- default: () => "animate-spin",
2762
- slow: () => "animate-spin-slow",
2763
- fast: () => "animate-spin-fast",
2764
- bounce: () => "animate-bounce",
2765
- pulse: () => "animate-pulse",
2766
- ping: () => "animate-ping"
2767
- },
2768
- // Skeleton loaders
2769
- skeleton: {
2770
- base: () => "animate-pulse bg-gray-200 dark:bg-gray-700 rounded",
2771
- line: () => "animate-pulse bg-gray-200 dark:bg-gray-700 h-4 rounded",
2772
- circle: () => "animate-pulse bg-gray-200 dark:bg-gray-700 rounded-full",
2773
- card: () => "animate-pulse bg-gray-200 dark:bg-gray-700 rounded-lg h-32",
2774
- // Shimmer effect
2775
- shimmer: () => "relative overflow-hidden bg-gray-200 dark:bg-gray-700 before:absolute before:inset-0 before:-translate-x-full before:animate-shimmer before:bg-gradient-to-r before:from-gray-200 before:via-white before:to-gray-200 dark:before:from-gray-700 dark:before:via-gray-600 dark:before:to-gray-700",
2776
- // Progressive loading
2777
- progressive: () => "bg-gradient-to-r from-gray-200 via-gray-300 to-gray-200 dark:from-gray-700 dark:via-gray-600 dark:to-gray-700 bg-[length:200%_100%] animate-shimmer-bg"
2778
- },
2779
- // Progress indicators
2780
- progress: {
2781
- bar: () => "transition-all duration-300 ease-out",
2782
- indeterminate: () => "animate-progress-indeterminate bg-gradient-to-r from-blue-500 via-purple-500 to-blue-500 bg-[length:200%_100%]",
2783
- // Web3 progress indicators
2784
- transaction: () => "animate-progress-glow bg-gradient-to-r from-green-400 to-blue-500",
2785
- minting: () => "animate-progress-rainbow bg-gradient-to-r from-pink-500 via-purple-500 to-indigo-500"
2786
- }
2787
- },
2788
- // Transition animations
2789
- transitions: {
2790
- // Slide transitions
2791
- slide: {
2792
- up: () => "transition-transform duration-300 ease-out",
2793
- upEnter: () => "translate-y-full",
2794
- upEntered: () => "translate-y-0",
2795
- upExit: () => "translate-y-full",
2796
- down: () => "transition-transform duration-300 ease-out",
2797
- downEnter: () => "-translate-y-full",
2798
- downEntered: () => "translate-y-0",
2799
- downExit: () => "-translate-y-full",
2800
- left: () => "transition-transform duration-300 ease-out",
2801
- leftEnter: () => "translate-x-full",
2802
- leftEntered: () => "translate-x-0",
2803
- leftExit: () => "translate-x-full",
2804
- right: () => "transition-transform duration-300 ease-out",
2805
- rightEnter: () => "-translate-x-full",
2806
- rightEntered: () => "translate-x-0",
2807
- rightExit: () => "-translate-x-full"
2808
- },
2809
- // Fade transitions
2810
- fade: {
2811
- default: () => "transition-opacity duration-300 ease-out",
2812
- enter: () => "opacity-0",
2813
- entered: () => "opacity-100",
2814
- exit: () => "opacity-0",
2815
- fast: () => "transition-opacity duration-150 ease-out",
2816
- slow: () => "transition-opacity duration-500 ease-out",
2817
- // Fade with scale
2818
- scale: () => "transition-all duration-300 ease-out",
2819
- scaleEnter: () => "opacity-0 scale-95",
2820
- scaleEntered: () => "opacity-100 scale-100",
2821
- scaleExit: () => "opacity-0 scale-95"
2822
- },
2823
- // Page transitions
2824
- page: {
2825
- slideLeft: () => "transition-transform duration-300 ease-in-out",
2826
- slideRight: () => "transition-transform duration-300 ease-in-out",
2827
- fadeScale: () => "transition-all duration-300 ease-in-out"
2828
- }
2829
- },
2830
- // Gesture feedback
2831
- feedback: {
2832
- // Click/tap feedback
2833
- tap: {
2834
- ripple: () => "relative overflow-hidden transition-all duration-150 active:scale-95",
2835
- scale: () => "transition-transform duration-100 active:scale-95",
2836
- glow: () => "transition-all duration-150 active:shadow-lg active:shadow-current/30",
2837
- // Material Design ripple effect
2838
- materialRipple: () => "relative overflow-hidden after:absolute after:inset-0 after:rounded-[inherit] after:pointer-events-none after:transition-opacity after:duration-300 after:opacity-0 active:after:opacity-100 active:after:bg-white/20"
2839
- },
2840
- // Focus feedback
2841
- focus: {
2842
- ring: () => "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-blue-500 focus-visible:ring-offset-2",
2843
- glow: () => "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-blue-500 focus-visible:shadow-lg focus-visible:shadow-blue-500/25",
2844
- scale: () => "focus-visible:outline-none focus-visible:scale-105 focus-visible:ring-2 focus-visible:ring-blue-500",
2845
- // Web3 focus styles
2846
- wallet: () => "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-blue-500 focus-visible:ring-offset-2 focus-visible:bg-blue-50 dark:focus-visible:bg-blue-900/20"
2847
- },
2848
- // Drag feedback
2849
- drag: {
2850
- dragging: () => "opacity-50 scale-95 rotate-3 shadow-xl z-50",
2851
- dropzone: () => "transition-all duration-200 border-2 border-dashed",
2852
- dropzoneActive: () => "border-blue-400 bg-blue-50 dark:bg-blue-900/20 scale-105",
2853
- dropzoneInactive: () => "border-gray-300 dark:border-gray-600"
2854
- }
2855
- },
2856
- // Scroll animations
2857
- scroll: {
2858
- // Reveal animations
2859
- reveal: {
2860
- fadeUp: () => "opacity-0 translate-y-8 transition-all duration-700 ease-out",
2861
- fadeUpVisible: () => "opacity-100 translate-y-0",
2862
- fadeDown: () => "opacity-0 -translate-y-8 transition-all duration-700 ease-out",
2863
- fadeDownVisible: () => "opacity-100 translate-y-0",
2864
- fadeLeft: () => "opacity-0 translate-x-8 transition-all duration-700 ease-out",
2865
- fadeLeftVisible: () => "opacity-100 translate-x-0",
2866
- fadeRight: () => "opacity-0 -translate-x-8 transition-all duration-700 ease-out",
2867
- fadeRightVisible: () => "opacity-100 translate-x-0",
2868
- scale: () => "opacity-0 scale-90 transition-all duration-700 ease-out",
2869
- scaleVisible: () => "opacity-100 scale-100"
2870
- },
2871
- // Parallax effects
2872
- parallax: {
2873
- slow: () => "transform transition-transform duration-75",
2874
- medium: () => "transform transition-transform duration-100",
2875
- fast: () => "transform transition-transform duration-150"
2876
- },
2877
- // Sticky animations
2878
- sticky: {
2879
- shrink: () => "transition-all duration-300 ease-out",
2880
- shrinkActive: () => "py-2 shadow-lg backdrop-blur-md",
2881
- shrinkInactive: () => "py-4"
2882
- }
2883
- },
2884
- // Web3-specific animations
2885
- web3: {
2886
- // Wallet connection animations
2887
- wallet: {
2888
- connecting: () => "animate-pulse bg-gradient-to-r from-blue-500 via-purple-500 to-blue-500 bg-[length:200%_100%] animate-shimmer-bg",
2889
- connected: () => "animate-bounce-gentle bg-gradient-to-r from-green-400 to-blue-500",
2890
- disconnected: () => "animate-fade-out opacity-50",
2891
- error: () => "animate-shake bg-red-100 dark:bg-red-900/20"
2892
- },
2893
- // Transaction animations
2894
- transaction: {
2895
- pending: () => "animate-pulse border border-yellow-300 bg-yellow-50 dark:border-yellow-700 dark:bg-yellow-900/20",
2896
- confirming: () => "animate-progress-dots bg-gradient-to-r from-blue-500 to-purple-500",
2897
- confirmed: () => "animate-success-pulse border border-green-300 bg-green-50 dark:border-green-700 dark:bg-green-900/20",
2898
- failed: () => "animate-error-flash border border-red-300 bg-red-50 dark:border-red-700 dark:bg-red-900/20"
2899
- },
2900
- // Blockchain activity
2901
- blockchain: {
2902
- mining: () => "animate-mining-pulse bg-gradient-to-r from-yellow-400 via-orange-500 to-yellow-400 bg-[length:200%_100%]",
2903
- minting: () => "animate-rainbow bg-gradient-to-r from-pink-500 via-purple-500 via-blue-500 to-pink-500 bg-[length:300%_100%]",
2904
- staking: () => "animate-glow-pulse bg-gradient-to-r from-green-400 to-emerald-500",
2905
- burning: () => "animate-fire bg-gradient-to-r from-red-500 via-orange-500 to-yellow-500 bg-[length:200%_100%]"
2906
- }
2907
- },
2908
- // Utility animations
2909
- utility: {
2910
- // Attention grabbing
2911
- attention: {
2912
- bounce: () => "animate-bounce",
2913
- pulse: () => "animate-pulse",
2914
- ping: () => "animate-ping",
2915
- shake: () => "animate-shake",
2916
- wiggle: () => "animate-wiggle",
2917
- heartbeat: () => "animate-heartbeat"
2918
- },
2919
- // State indicators
2920
- state: {
2921
- success: () => "animate-success-checkmark",
2922
- error: () => "animate-error-x",
2923
- warning: () => "animate-warning-triangle",
2924
- info: () => "animate-info-circle"
2925
- },
2926
- // Performance considerations
2927
- reduced: {
2928
- // Reduced motion variants for accessibility
2929
- fadeOnly: () => "transition-opacity duration-300 ease-out",
2930
- scaleOnly: () => "transition-transform duration-200 ease-out",
2931
- instant: () => "transition-none",
2932
- respectPrefers: () => "motion-safe:transition-all motion-safe:duration-300 motion-reduce:transition-none"
2933
- }
2934
- }
2935
- },
2936
- // Accessibility & A11Y variants
2937
- accessibility: {
2938
- // Screen reader and assistive technology support
2939
- screenReader: {
2940
- // Visually hidden but accessible to screen readers
2941
- only: () => "sr-only",
2942
- focusable: () => "sr-only focus:not-sr-only focus:absolute focus:top-0 focus:left-0 focus:z-50 focus:p-2 focus:bg-white focus:text-black focus:border focus:rounded",
2943
- // Skip links for navigation
2944
- skipLink: () => "sr-only focus:not-sr-only focus:absolute focus:top-0 focus:left-0 focus:z-50 focus:px-4 focus:py-2 focus:bg-blue-600 focus:text-white focus:rounded focus:m-2 focus:no-underline"
2945
- },
2946
- // Focus management
2947
- focus: {
2948
- // Focus indicators
2949
- ring: () => "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-blue-500 focus-visible:ring-offset-2",
2950
- ringInset: () => "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-blue-500",
2951
- ringDark: () => "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-blue-400 focus-visible:ring-offset-2 focus-visible:ring-offset-gray-900",
2952
- // High contrast focus for better visibility
2953
- highContrast: () => "focus-visible:outline-none focus-visible:ring-4 focus-visible:ring-yellow-400 focus-visible:ring-offset-2 focus-visible:bg-yellow-50 dark:focus-visible:bg-yellow-900/20",
2954
- // Web3 specific focus styles
2955
- wallet: () => "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-blue-500 focus-visible:ring-offset-2 focus-visible:bg-blue-50 dark:focus-visible:bg-blue-900/20",
2956
- transaction: () => "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-green-500 focus-visible:ring-offset-2",
2957
- error: () => "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-red-500 focus-visible:ring-offset-2"
2958
- },
2959
- // Color contrast and visibility
2960
- contrast: {
2961
- // High contrast text
2962
- text: {
2963
- high: () => "text-gray-900 dark:text-gray-100",
2964
- medium: () => "text-gray-700 dark:text-gray-300",
2965
- low: () => "text-gray-600 dark:text-gray-400",
2966
- inverse: () => "text-white dark:text-gray-900"
2967
- },
2968
- // High contrast backgrounds
2969
- background: {
2970
- primary: () => "bg-blue-700 text-white dark:bg-blue-300 dark:text-gray-900",
2971
- secondary: () => "bg-gray-700 text-white dark:bg-gray-300 dark:text-gray-900",
2972
- success: () => "bg-green-700 text-white dark:bg-green-300 dark:text-gray-900",
2973
- warning: () => "bg-yellow-700 text-white dark:bg-yellow-300 dark:text-gray-900",
2974
- error: () => "bg-red-700 text-white dark:bg-red-300 dark:text-gray-900"
2975
- },
2976
- // Link contrast
2977
- link: {
2978
- default: () => "text-blue-700 dark:text-blue-300 underline hover:text-blue-900 dark:hover:text-blue-100",
2979
- visited: () => "text-purple-700 dark:text-purple-300 underline hover:text-purple-900 dark:hover:text-purple-100"
2980
- }
2981
- },
2982
- // Motion and animation preferences
2983
- motion: {
2984
- // Respect user's motion preferences
2985
- respectPrefers: () => "motion-safe:transition-all motion-safe:duration-300 motion-reduce:transition-none",
2986
- reduceMotion: () => "motion-reduce:transition-none motion-reduce:animate-none",
2987
- // Safe animations that work with reduced motion
2988
- safe: {
2989
- fade: () => "motion-safe:transition-opacity motion-safe:duration-300 motion-reduce:transition-none",
2990
- scale: () => "motion-safe:transition-transform motion-safe:duration-200 motion-reduce:transition-none",
2991
- slide: () => "motion-safe:transition-transform motion-safe:duration-300 motion-reduce:transition-none"
2992
- },
2993
- // Loading animations that respect motion preferences
2994
- loading: {
2995
- spin: () => "motion-safe:animate-spin motion-reduce:animate-none",
2996
- pulse: () => "motion-safe:animate-pulse motion-reduce:animate-none",
2997
- bounce: () => "motion-safe:animate-bounce motion-reduce:animate-none"
2998
- }
2999
- },
3000
- // Semantic HTML and roles
3001
- semantic: {
3002
- // Interactive roles
3003
- interactive: {
3004
- button: () => 'role="button" tabindex="0"',
3005
- link: () => 'role="link"',
3006
- menuitem: () => 'role="menuitem"',
3007
- tab: () => 'role="tab"',
3008
- tabpanel: () => 'role="tabpanel"',
3009
- dialog: () => 'role="dialog"'
3010
- },
3011
- // State roles
3012
- states: {
3013
- selected: (i) => `aria-selected="${i}"`,
3014
- checked: (i) => `aria-checked="${i}"`,
3015
- pressed: (i) => `aria-pressed="${i}"`,
3016
- expanded: (i) => `aria-expanded="${i}"`,
3017
- disabled: (i) => i ? 'aria-disabled="true" tabindex="-1"' : ""
3018
- },
3019
- // Web3 specific semantic patterns
3020
- web3: {
3021
- wallet: () => 'role="button" aria-label="Connect Wallet"',
3022
- transaction: () => 'role="status" aria-live="polite"',
3023
- balance: () => 'role="text" aria-label="Account Balance"',
3024
- address: () => 'role="text" aria-label="Wallet Address"'
3025
- }
3026
- },
3027
- // Form accessibility
3028
- form: {
3029
- // Required field indicators
3030
- required: {
3031
- indicator: () => "text-red-500 dark:text-red-400",
3032
- text: () => 'aria-required="true" required',
3033
- visual: () => 'after:content-["*"] after:ml-1 after:text-red-500 dark:after:text-red-400'
3034
- },
3035
- // Validation states
3036
- validation: {
3037
- valid: () => "border-green-500 dark:border-green-400 focus:ring-green-500",
3038
- invalid: () => 'border-red-500 dark:border-red-400 focus:ring-red-500 aria-invalid="true"',
3039
- pending: () => "border-yellow-500 dark:border-yellow-400 focus:ring-yellow-500"
3040
- }
3041
- },
3042
- // Interactive patterns
3043
- interactive: {
3044
- // Button patterns
3045
- button: {
3046
- primary: () => "inline-flex items-center justify-center px-4 py-2 border border-transparent text-sm font-medium rounded-md text-white bg-blue-600 hover:bg-blue-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-500 disabled:opacity-50 disabled:cursor-not-allowed",
3047
- secondary: () => "inline-flex items-center justify-center px-4 py-2 border border-gray-300 text-sm font-medium rounded-md text-gray-700 bg-white hover:bg-gray-50 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-500 disabled:opacity-50 disabled:cursor-not-allowed",
3048
- // Icon buttons with proper labels
3049
- icon: () => "inline-flex items-center justify-center p-2 rounded-md text-gray-400 hover:text-gray-500 hover:bg-gray-100 focus:outline-none focus:ring-2 focus:ring-inset focus:ring-blue-500"
3050
- },
3051
- // Link patterns
3052
- link: {
3053
- default: () => "text-blue-600 dark:text-blue-400 hover:text-blue-800 dark:hover:text-blue-200 underline focus:outline-none focus:ring-2 focus:ring-blue-500 focus:ring-offset-2",
3054
- external: () => 'text-blue-600 dark:text-blue-400 hover:text-blue-800 dark:hover:text-blue-200 underline focus:outline-none focus:ring-2 focus:ring-blue-500 focus:ring-offset-2 after:content-["↗"] after:ml-1 after:text-xs'
3055
- }
3056
- },
3057
- // Text and content accessibility
3058
- content: {
3059
- // Text sizing and scaling
3060
- text: {
3061
- minimum: () => "text-sm min-h-[44px] min-w-[44px]",
3062
- // WCAG minimum touch target
3063
- touch: () => "min-h-[44px] min-w-[44px] touch-manipulation"
3064
- }
3065
- },
3066
- // Error handling and feedback
3067
- feedback: {
3068
- // Error messages
3069
- error: {
3070
- container: () => "border border-red-300 dark:border-red-700 bg-red-50 dark:bg-red-900/20 rounded-md p-4",
3071
- title: () => "text-sm font-medium text-red-800 dark:text-red-200",
3072
- message: () => "text-sm text-red-700 dark:text-red-300 mt-2"
3073
- },
3074
- // Success messages
3075
- success: {
3076
- container: () => "border border-green-300 dark:border-green-700 bg-green-50 dark:bg-green-900/20 rounded-md p-4",
3077
- title: () => "text-sm font-medium text-green-800 dark:text-green-200",
3078
- message: () => "text-sm text-green-700 dark:text-green-300 mt-2"
3079
- },
3080
- // Live regions for dynamic content
3081
- liveRegion: {
3082
- polite: () => 'sr-only aria-live="polite"',
3083
- assertive: () => 'sr-only aria-live="assertive"',
3084
- status: () => 'sr-only role="status" aria-live="polite"',
3085
- alert: () => 'sr-only role="alert" aria-live="assertive"'
3086
- }
3087
- }
3088
- },
3089
- // Performance & Optimization variants
3090
- performance: {
3091
- // Bundle optimization patterns
3092
- bundle: {
3093
- // Lazy loading utilities
3094
- lazy: {
3095
- component: () => "opacity-0 transition-opacity duration-300",
3096
- componentLoaded: () => "opacity-100",
3097
- image: () => "blur-sm transition-all duration-300",
3098
- imageLoaded: () => "blur-none",
3099
- skeleton: () => "animate-pulse bg-gray-200 dark:bg-gray-700 rounded"
3100
- },
3101
- // Code splitting indicators
3102
- splitting: {
3103
- loading: () => "flex items-center justify-center py-8",
3104
- error: () => "text-red-600 dark:text-red-400 text-center py-8",
3105
- fallback: () => "bg-gray-100 dark:bg-gray-800 animate-pulse rounded"
3106
- }
3107
- },
3108
- // Rendering optimization
3109
- rendering: {
3110
- // GPU acceleration utilities
3111
- gpu: {
3112
- transform: () => "transform-gpu",
3113
- layer: () => "will-change-transform transform translate3d-0",
3114
- composite: () => "backface-hidden"
3115
- },
3116
- // Layout optimization
3117
- layout: {
3118
- // Prevent layout shifts
3119
- stable: () => "aspect-square",
3120
- containLayout: () => "contain-layout",
3121
- containStyle: () => "contain-style",
3122
- // Efficient positioning
3123
- sticky: () => "sticky top-0 z-40",
3124
- fixed: () => "fixed inset-0 z-50"
3125
- },
3126
- // Memory optimization
3127
- memory: {
3128
- // Efficient list rendering
3129
- virtualList: () => "overflow-hidden",
3130
- virtualItem: () => "absolute left-0 right-0",
3131
- // Image optimization
3132
- responsiveImage: () => "max-w-full h-auto object-cover",
3133
- lazyImage: () => "object-cover transition-opacity duration-300 opacity-0",
3134
- loadedImage: () => "opacity-100"
3135
- }
3136
- },
3137
- // Network optimization
3138
- network: {
3139
- // Caching patterns
3140
- cache: {
3141
- // Service worker states
3142
- cached: () => "border-l-4 border-green-500 bg-green-50 dark:bg-green-900/20",
3143
- updating: () => "border-l-4 border-blue-500 bg-blue-50 dark:bg-blue-900/20",
3144
- offline: () => "border-l-4 border-gray-500 bg-gray-50 dark:bg-gray-900/20",
3145
- error: () => "border-l-4 border-red-500 bg-red-50 dark:bg-red-900/20",
3146
- // Cache status indicators
3147
- fresh: () => "text-green-600 dark:text-green-400",
3148
- stale: () => "text-yellow-600 dark:text-yellow-400",
3149
- expired: () => "text-red-600 dark:text-red-400"
3150
- },
3151
- // Connection quality
3152
- connection: {
3153
- fast: () => "border-green-500 bg-green-50 dark:bg-green-900/20",
3154
- slow: () => "border-yellow-500 bg-yellow-50 dark:bg-yellow-900/20",
3155
- offline: () => "border-red-500 bg-red-50 dark:bg-red-900/20"
3156
- }
3157
- },
3158
- // Core Web Vitals optimization
3159
- webVitals: {
3160
- // Largest Contentful Paint (LCP)
3161
- lcp: {
3162
- optimize: () => "will-change-contents",
3163
- hero: () => "contain-layout will-change-contents",
3164
- image: () => "object-cover will-change-auto"
3165
- },
3166
- // First Input Delay (FID) / Interaction to Next Paint (INP)
3167
- interactivity: {
3168
- optimize: () => "touch-manipulation select-none",
3169
- debounced: () => "transition-none",
3170
- throttled: () => "pointer-events-none transition-opacity duration-100",
3171
- ready: () => "pointer-events-auto opacity-100"
3172
- },
3173
- // Cumulative Layout Shift (CLS)
3174
- layoutStability: {
3175
- // Prevent layout shifts
3176
- stable: () => "aspect-square contain-layout",
3177
- placeholder: () => "min-h-[200px] bg-gray-100 dark:bg-gray-800",
3178
- skeleton: () => "animate-pulse bg-gray-200 dark:bg-gray-700",
3179
- // Image container stability
3180
- imageContainer: () => "overflow-hidden relative",
3181
- imageStable: () => "absolute inset-0 object-cover"
3182
- }
3183
- },
3184
- // Web3 Performance optimization
3185
- web3: {
3186
- // Wallet connection optimization
3187
- wallet: {
3188
- cached: () => "opacity-100 transition-opacity duration-200",
3189
- connecting: () => "opacity-75 cursor-wait",
3190
- staleData: () => "opacity-75",
3191
- freshData: () => "opacity-100"
3192
- },
3193
- // Transaction optimization
3194
- transaction: {
3195
- // Batching indicators
3196
- batched: () => "border-l-4 border-blue-500 bg-blue-50 dark:bg-blue-900/20",
3197
- individual: () => "border-l-4 border-gray-500 bg-gray-50 dark:bg-gray-900/20",
3198
- // Gas optimization
3199
- gasOptimal: () => "text-green-600 dark:text-green-400",
3200
- gasHigh: () => "text-yellow-600 dark:text-yellow-400",
3201
- gasVeryHigh: () => "text-red-600 dark:text-red-400"
3202
- },
3203
- // Blockchain data optimization
3204
- blockchain: {
3205
- // Data freshness
3206
- realtime: () => "border-green-500 bg-green-50 dark:bg-green-900/20",
3207
- cached: () => "border-blue-500 bg-blue-50 dark:bg-blue-900/20",
3208
- stale: () => "border-yellow-500 bg-yellow-50 dark:bg-yellow-900/20",
3209
- // Query optimization
3210
- optimistic: () => "opacity-75 transition-opacity duration-200",
3211
- confirmed: () => "opacity-100",
3212
- refetching: () => "animate-pulse"
3213
- }
3214
- },
3215
- // Monitoring and debugging
3216
- monitoring: {
3217
- // Performance metrics
3218
- metrics: {
3219
- good: () => "text-green-600 dark:text-green-400 bg-green-100 dark:bg-green-900/20",
3220
- needsImprovement: () => "text-yellow-600 dark:text-yellow-400 bg-yellow-100 dark:bg-yellow-900/20",
3221
- poor: () => "text-red-600 dark:text-red-400 bg-red-100 dark:bg-red-900/20"
3222
- },
3223
- // Error boundaries
3224
- errorBoundary: {
3225
- container: () => "border border-red-300 dark:border-red-700 bg-red-50 dark:bg-red-900/20 rounded-lg p-4",
3226
- title: () => "text-lg font-semibold text-red-800 dark:text-red-200",
3227
- message: () => "text-red-700 dark:text-red-300 mt-2",
3228
- retry: () => "mt-4 px-4 py-2 bg-red-600 text-white rounded hover:bg-red-700 focus:outline-none focus:ring-2 focus:ring-red-500",
3229
- fallback: () => "text-center text-gray-500 dark:text-gray-400 py-8"
3230
- }
3231
- },
3232
- // Resource optimization
3233
- resource: {
3234
- // Image optimization
3235
- image: {
3236
- // Responsive images
3237
- responsive: () => "w-full h-auto object-cover",
3238
- hero: () => "w-full h-[50vh] object-cover",
3239
- thumbnail: () => "w-16 h-16 object-cover rounded",
3240
- avatar: () => "w-10 h-10 object-cover rounded-full",
3241
- // Loading states
3242
- placeholder: () => "bg-gray-200 dark:bg-gray-700 animate-pulse",
3243
- blurred: () => "filter blur-sm",
3244
- sharp: () => "filter blur-none transition-all duration-300"
3245
- },
3246
- // Critical resources
3247
- critical: {
3248
- // Above the fold
3249
- aboveFold: () => "will-change-contents",
3250
- belowFold: () => "will-change-auto"
3251
- }
3252
- },
3253
- // Database and API optimization
3254
- data: {
3255
- // Query optimization
3256
- query: {
3257
- cached: () => "opacity-100",
3258
- loading: () => "opacity-75 animate-pulse",
3259
- error: () => "opacity-50 text-red-600 dark:text-red-400",
3260
- // REST optimization
3261
- fresh: () => "border-l-2 border-green-500",
3262
- stale: () => "border-l-2 border-yellow-500",
3263
- invalid: () => "border-l-2 border-red-500",
3264
- // Optimistic updates
3265
- optimistic: () => "opacity-75",
3266
- confirmed: () => "opacity-100",
3267
- reverted: () => "opacity-50 line-through"
3268
- },
3269
- // Real-time optimization
3270
- realtime: {
3271
- // WebSocket states
3272
- connected: () => "border-green-500 bg-green-50 dark:bg-green-900/20",
3273
- connecting: () => "border-yellow-500 bg-yellow-50 dark:bg-yellow-900/20",
3274
- disconnected: () => "border-red-500 bg-red-50 dark:bg-red-900/20",
3275
- // Update indicators
3276
- live: () => "animate-pulse text-green-600 dark:text-green-400",
3277
- delayed: () => "text-yellow-600 dark:text-yellow-400",
3278
- offline: () => "text-gray-500 dark:text-gray-400"
3279
- }
3280
- }
3281
- }
3282
- };
3283
- class s {
3284
- constructor(t) {
3285
- this.fallbacks = /* @__PURE__ */ new Map(), this.variants = t, this.setupDefaultFallbacks();
3286
- }
3287
- setupDefaultFallbacks() {
3288
- this.fallbacks.set("button.primary", "bg-blue-600 text-white px-4 py-2 rounded"), this.fallbacks.set("button.secondary", "bg-gray-200 text-gray-900 px-4 py-2 rounded"), this.fallbacks.set("button.outline", "border border-gray-300 text-gray-700 px-4 py-2 rounded"), this.fallbacks.set("alert.default", "bg-blue-50 border border-blue-200 text-blue-800 p-4 rounded"), this.fallbacks.set("alert.destructive", "bg-red-50 border border-red-200 text-red-800 p-4 rounded"), this.fallbacks.set("input.default", "border border-gray-300 px-3 py-2 rounded focus:ring-2 focus:ring-blue-500"), this.fallbacks.set("badge.default", "bg-gray-100 text-gray-800 px-2 py-1 rounded text-sm");
3289
- }
3290
- /**
3291
- * Get variant classes - the main API
3292
- * Usage: variants.get('button', 'primary') or variants.get('button.primary')
3293
- */
3294
- get(t, a) {
3295
- if (!a && t.includes(".")) {
3296
- const [o, d] = t.split(".", 2);
3297
- return this.get(o, d);
3298
- }
3299
- a || (a = "default");
3300
- try {
3301
- const o = this.variants[t];
3302
- if (!o)
3303
- return this.getFallback(t, a);
3304
- const d = o[a];
3305
- if (typeof d == "function")
3306
- return d();
3307
- if (typeof d == "string")
3308
- return d;
3309
- if (d && typeof d == "object") {
3310
- if (typeof d.default == "function")
3311
- return d.default();
3312
- if (typeof d.default == "string")
3313
- return d.default;
3314
- }
3315
- return this.getFallback(t, a);
3316
- } catch (o) {
3317
- return console.warn(`Failed to get variant ${t}.${a}:`, o), this.getFallback(t, a);
3318
- }
3319
- }
3320
- /**
3321
- * Get sized variant
3322
- * Usage: variants.sized('button', 'primary', 'sm')
3323
- */
3324
- sized(t, a, o) {
3325
- try {
3326
- const n = this.variants[t]?.[a];
3327
- if (n && typeof n == "object" && n[o]) {
3328
- const l = n[o];
3329
- if (typeof l == "function")
3330
- return l();
3331
- if (typeof l == "string")
3332
- return l;
3333
- }
3334
- return this.get(t, a);
3335
- } catch (d) {
3336
- return console.warn(`Failed to get sized variant ${t}.${a}.${o}:`, d), this.get(t, a);
3337
- }
3338
- }
3339
- /**
3340
- * Get nested variant (for complex paths)
3341
- * Usage: variants.nested('button.gradient.primary')
3342
- */
3343
- nested(t) {
3344
- try {
3345
- const a = t.split(".");
3346
- let o = this.variants;
3347
- for (const d of a)
3348
- if (o = o?.[d], !o) break;
3349
- return typeof o == "function" ? o() : typeof o == "string" ? o : o && typeof o.default == "function" ? o.default() : o && typeof o.default == "string" ? o.default : this.getFallback(a[0], a.slice(1).join("."));
3350
- } catch (a) {
3351
- return console.warn(`Failed to get nested variant ${t}:`, a), this.getFallback(t.split(".")[0], t.split(".").slice(1).join("."));
3352
- }
3353
- }
3354
- /**
3355
- * Conditional variant selection
3356
- * Usage: variants.when(isError, 'alert', 'destructive', 'alert', 'default')
3357
- */
3358
- when(t, a, o, d, n) {
3359
- return t ? this.get(a, o) : d && n ? this.get(d, n) : "";
3360
- }
3361
- /**
3362
- * Combine multiple variants
3363
- * Usage: variants.combine('button.primary', 'animations.hover', 'custom-class')
3364
- */
3365
- combine(...t) {
3366
- return t.map((a) => a.includes(".") ? this.nested(a) : a).filter(Boolean).join(" ");
3367
- }
3368
- getFallback(t, a) {
3369
- const o = `${t}.${a}`;
3370
- return this.fallbacks.get(o) || this.fallbacks.get(`${t}.default`) || "";
3371
- }
3372
- /**
3373
- * Add custom fallback
3374
- */
3375
- addFallback(t, a) {
3376
- this.fallbacks.set(t, a);
3377
- }
3378
- /**
3379
- * Check if variant exists
3380
- */
3381
- has(t, a) {
3382
- try {
3383
- const o = this.variants[t];
3384
- return !!(o && o[a]);
3385
- } catch {
3386
- return !1;
3387
- }
3388
- }
3389
- }
3390
- function v(i) {
3391
- return new s(i);
3392
- }
3393
- function $(i) {
3394
- const t = new s(i);
3395
- return {
3396
- // Direct access functions
3397
- button: (a, o) => o ? t.sized("button", a, o) : t.get("button", a),
3398
- alert: (a) => t.get("alert", a),
3399
- input: (a) => t.get("input", a),
3400
- badge: (a) => t.get("badge", a),
3401
- // Generic access
3402
- get: (a, o) => t.get(a, o),
3403
- nested: (a) => t.nested(a),
3404
- when: (a, o, d, n, l) => t.when(a, o, d, n, l),
3405
- combine: (...a) => t.combine(...a)
3406
- };
3407
- }
3408
- const j = {
3409
- // Layout utilities
3410
- layout: {
3411
- container: "mx-auto max-w-7xl px-4 sm:px-6 lg:px-8",
3412
- containerSmall: "mx-auto max-w-3xl px-4 sm:px-6 lg:px-8",
3413
- containerLarge: "mx-auto max-w-full px-4 sm:px-6 lg:px-8",
3414
- section: "py-8 sm:py-12 lg:py-16",
3415
- sectionSmall: "py-6 sm:py-8 lg:py-10",
3416
- flex: "flex items-center justify-between",
3417
- flexCenter: "flex items-center justify-center",
3418
- flexCol: "flex flex-col",
3419
- grid: "grid grid-cols-1 gap-6",
3420
- gridMd: "grid grid-cols-1 md:grid-cols-2 gap-6",
3421
- gridLg: "grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6"
3422
- },
3423
- // Background utilities
3424
- background: {
3425
- surface: "bg-white dark:bg-gray-800",
3426
- subtle: "bg-gray-50 dark:bg-gray-900",
3427
- muted: "bg-gray-100 dark:bg-gray-700",
3428
- overlay: "bg-black/50 dark:bg-black/70"
3429
- },
3430
- // Border utilities
3431
- border: {
3432
- default: "border-gray-200 dark:border-gray-700",
3433
- subtle: "border-gray-100 dark:border-gray-800",
3434
- radius: "rounded-lg",
3435
- radiusSm: "rounded-md",
3436
- radiusLg: "rounded-xl",
3437
- radiusFull: "rounded-full"
3438
- },
3439
- // Shadow utilities
3440
- shadow: {
3441
- sm: "shadow-sm",
3442
- md: "shadow-md",
3443
- lg: "shadow-lg",
3444
- xl: "shadow-xl"
3445
- },
3446
- // Spacing utilities
3447
- spacing: {
3448
- card: {
3449
- sm: "p-4",
3450
- md: "p-6",
3451
- lg: "p-8"
3452
- },
3453
- section: {
3454
- sm: "py-6 px-4",
3455
- md: "py-8 px-6",
3456
- lg: "py-12 px-8"
3457
- }
3458
- },
3459
- // Typography utilities - Enhanced with design system
3460
- text: {
3461
- // Headings
3462
- h1: "text-3xl sm:text-4xl lg:text-5xl font-bold text-gray-900 dark:text-white leading-tight tracking-tight",
3463
- h2: "text-2xl sm:text-3xl lg:text-4xl font-bold text-gray-900 dark:text-white leading-tight tracking-tight",
3464
- h3: "text-xl sm:text-2xl font-semibold text-gray-900 dark:text-white leading-tight tracking-tight",
3465
- h4: "text-lg sm:text-xl font-semibold text-gray-900 dark:text-white leading-tight tracking-tight",
3466
- h5: "text-base sm:text-lg font-semibold text-gray-900 dark:text-white leading-tight tracking-tight",
3467
- h6: "text-base font-semibold text-gray-900 dark:text-white leading-tight tracking-tight",
3468
- // Display headings
3469
- display: "text-4xl sm:text-5xl md:text-6xl lg:text-7xl xl:text-8xl font-extrabold text-gray-900 dark:text-white leading-none tracking-tight",
3470
- hero: "text-6xl sm:text-7xl md:text-8xl lg:text-9xl font-black text-gray-900 dark:text-white leading-none tracking-tight",
3471
- // Body text
3472
- body: "text-base font-normal text-gray-700 dark:text-gray-300 leading-relaxed",
3473
- bodyLarge: "text-lg font-normal text-gray-700 dark:text-gray-300 leading-relaxed",
3474
- bodySmall: "text-sm font-normal text-gray-600 dark:text-gray-400 leading-relaxed",
3475
- // Lead text (introductory paragraphs)
3476
- lead: "text-xl font-normal text-gray-700 dark:text-gray-300 leading-relaxed",
3477
- leadLarge: "text-2xl font-normal text-gray-700 dark:text-gray-300 leading-relaxed",
3478
- // Specialized text
3479
- caption: "text-sm font-normal text-gray-500 dark:text-gray-500 leading-normal",
3480
- label: "text-sm font-medium text-gray-700 dark:text-gray-300",
3481
- helper: "text-sm font-normal text-gray-500 dark:text-gray-500",
3482
- // Links
3483
- link: "text-blue-600 dark:text-blue-400 hover:text-blue-700 dark:hover:text-blue-300 underline underline-offset-2 decoration-blue-600 dark:decoration-blue-400 transition-colors duration-150",
3484
- linkSubtle: "text-blue-600 dark:text-blue-400 hover:text-blue-700 dark:hover:text-blue-300 no-underline hover:underline hover:underline-offset-2 transition-all duration-150",
3485
- linkMuted: "text-gray-600 dark:text-gray-400 hover:text-gray-900 dark:hover:text-gray-100 underline underline-offset-2 decoration-gray-400 hover:decoration-gray-600 transition-colors duration-150",
3486
- // Code text
3487
- code: "font-mono text-sm font-medium text-gray-900 dark:text-gray-100 bg-gray-100 dark:bg-gray-800 px-1.5 py-0.5 rounded",
3488
- codeBlock: "font-mono text-sm font-normal text-gray-900 dark:text-gray-100 bg-gray-100 dark:bg-gray-800 p-4 rounded-lg overflow-x-auto leading-relaxed",
3489
- // Status text
3490
- success: "text-green-700 dark:text-green-300 font-medium",
3491
- warning: "text-amber-700 dark:text-amber-300 font-medium",
3492
- error: "text-red-700 dark:text-red-300 font-medium",
3493
- info: "text-blue-700 dark:text-blue-300 font-medium",
3494
- // Emphasis variants
3495
- emphasis: "font-medium text-gray-900 dark:text-gray-100",
3496
- strong: "font-semibold text-gray-900 dark:text-gray-100",
3497
- muted: "text-gray-500 dark:text-gray-500",
3498
- // Uppercase labels
3499
- uppercase: "text-xs font-semibold text-gray-500 dark:text-gray-500 uppercase tracking-wider"
3500
- },
3501
- // Transition utilities
3502
- transition: {
3503
- default: "transition-colors duration-200",
3504
- all: "transition-all duration-200",
3505
- fast: "transition-all duration-150",
3506
- slow: "transition-all duration-300",
3507
- transform: "transition-transform duration-200"
3508
- },
3509
- // Interactive states
3510
- states: {
3511
- hover: "hover:opacity-80 transition-opacity duration-200",
3512
- focus: "focus:outline-none focus:ring-2 focus:ring-blue-500 focus:ring-offset-2",
3513
- disabled: "disabled:opacity-50 disabled:cursor-not-allowed disabled:pointer-events-none",
3514
- loading: "animate-pulse"
3515
- },
3516
- // Web3 specific utilities
3517
- web3: {
3518
- walletButton: "bg-white dark:bg-gray-800 border border-gray-300 dark:border-gray-600 hover:bg-gray-50 dark:hover:bg-gray-700 text-gray-900 dark:text-gray-100 inline-flex items-center gap-2 px-4 py-2 rounded-lg font-medium",
3519
- chainBadge: (i) => i === "ethereum" ? "bg-blue-100 text-blue-800 dark:bg-blue-900/30 dark:text-blue-300 inline-flex items-center px-2.5 py-0.5 rounded-full text-xs font-medium" : "bg-purple-100 text-purple-800 dark:bg-purple-900/30 dark:text-purple-300 inline-flex items-center px-2.5 py-0.5 rounded-full text-xs font-medium",
3520
- addressText: "font-mono text-sm text-gray-600 dark:text-gray-400"
3521
- }
3522
- };
3523
- export {
3524
- p as Colors,
3525
- s as SimpleVariants,
3526
- e as Tokens,
3527
- f as Typography,
3528
- w as Variants,
3529
- c as buildColorClass,
3530
- p as colors,
3531
- h as combineTextStyles,
3532
- g as componentColors,
3533
- $ as createQuickVariants,
3534
- k as createResponsiveText,
3535
- m as createTextStyle,
3536
- v as createVariants,
3537
- e as designTokens,
3538
- x as getColorClasses,
3539
- u as semanticColors,
3540
- f as textVariants,
3541
- j as ui,
3542
- w as variants
3543
- };