@justin_evo/evo-ui 1.0.1

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.
Files changed (110) hide show
  1. package/dist/Alert/Alert.d.ts +11 -0
  2. package/dist/AutoComplete/AutoComplete.d.ts +95 -0
  3. package/dist/Badge/Badge.d.ts +23 -0
  4. package/dist/Breadcrumb/Breadcrumb.d.ts +16 -0
  5. package/dist/Button/Button.d.ts +54 -0
  6. package/dist/Card/Card.d.ts +60 -0
  7. package/dist/Checkbox/Checkbox.d.ts +16 -0
  8. package/dist/CommandPalette/CommandPalette.d.ts +17 -0
  9. package/dist/Container/Container.d.ts +10 -0
  10. package/dist/Divider/Divider.d.ts +7 -0
  11. package/dist/Form/Form.d.ts +61 -0
  12. package/dist/Grid/Grid.d.ts +23 -0
  13. package/dist/ImageCropper/ImageCropper.d.ts +111 -0
  14. package/dist/Input/Input.d.ts +12 -0
  15. package/dist/Modal/Modal.d.ts +26 -0
  16. package/dist/Nav/Nav.d.ts +63 -0
  17. package/dist/Notification/Notification.d.ts +186 -0
  18. package/dist/Pagination/Pagination.d.ts +10 -0
  19. package/dist/Radio/Radio.d.ts +20 -0
  20. package/dist/RichTextArea/RichTextArea.d.ts +70 -0
  21. package/dist/Select/Select.d.ts +44 -0
  22. package/dist/Skeleton/Skeleton.d.ts +23 -0
  23. package/dist/Stack/Stack.d.ts +16 -0
  24. package/dist/Table/Table.d.ts +77 -0
  25. package/dist/Tabs/Tabs.d.ts +28 -0
  26. package/dist/Theme/ThemeProvider.d.ts +96 -0
  27. package/dist/Theme/ThemeToggle.d.ts +22 -0
  28. package/dist/Toggle/Toggle.d.ts +11 -0
  29. package/dist/Tooltip/Tooltip.d.ts +10 -0
  30. package/dist/TopNav/TopNav.d.ts +76 -0
  31. package/dist/TreeSelect/TreeSelect.d.ts +50 -0
  32. package/dist/declarations.d.ts +6 -0
  33. package/dist/evo-ui.css +1 -0
  34. package/dist/index.cjs.js +1 -0
  35. package/dist/index.d.ts +31 -0
  36. package/dist/index.es.js +5688 -0
  37. package/package.json +52 -0
  38. package/src/Alert/Alert.tsx +49 -0
  39. package/src/AutoComplete/AutoComplete.tsx +810 -0
  40. package/src/Badge/Badge.tsx +53 -0
  41. package/src/Breadcrumb/Breadcrumb.tsx +53 -0
  42. package/src/Button/Button.tsx +125 -0
  43. package/src/Card/Card.tsx +257 -0
  44. package/src/Checkbox/Checkbox.tsx +59 -0
  45. package/src/CommandPalette/CommandPalette.tsx +185 -0
  46. package/src/Container/Container.tsx +31 -0
  47. package/src/Divider/Divider.tsx +31 -0
  48. package/src/Form/Form.tsx +185 -0
  49. package/src/Grid/Grid.tsx +66 -0
  50. package/src/ImageCropper/ImageCropper.tsx +911 -0
  51. package/src/Input/Input.tsx +74 -0
  52. package/src/Modal/Modal.tsx +77 -0
  53. package/src/Nav/Nav.tsx +626 -0
  54. package/src/Notification/Notification.tsx +1503 -0
  55. package/src/Pagination/Pagination.tsx +76 -0
  56. package/src/Radio/Radio.tsx +69 -0
  57. package/src/RichTextArea/RichTextArea.tsx +869 -0
  58. package/src/Select/Select.tsx +515 -0
  59. package/src/Skeleton/Skeleton.tsx +70 -0
  60. package/src/Stack/Stack.tsx +52 -0
  61. package/src/Table/Table.tsx +335 -0
  62. package/src/Tabs/Tabs.tsx +90 -0
  63. package/src/Theme/ThemeProvider.tsx +253 -0
  64. package/src/Theme/ThemeToggle.tsx +79 -0
  65. package/src/Toggle/Toggle.tsx +48 -0
  66. package/src/Tooltip/Tooltip.tsx +38 -0
  67. package/src/TopNav/TopNav.tsx +994 -0
  68. package/src/TreeSelect/TreeSelect.tsx +825 -0
  69. package/src/css/alert.module.scss +93 -0
  70. package/src/css/autocomplete.module.scss +416 -0
  71. package/src/css/badge.module.scss +82 -0
  72. package/src/css/base/_color.scss +159 -0
  73. package/src/css/base/_theme.scss +237 -0
  74. package/src/css/base/_variables.scss +161 -0
  75. package/src/css/breadcrumb.module.scss +50 -0
  76. package/src/css/button.module.scss +385 -0
  77. package/src/css/card.module.scss +217 -0
  78. package/src/css/checkbox.module.scss +120 -0
  79. package/src/css/commandpalette.module.scss +211 -0
  80. package/src/css/container.module.scss +18 -0
  81. package/src/css/divider.module.scss +41 -0
  82. package/src/css/form.module.scss +245 -0
  83. package/src/css/imagecropper.module.scss +397 -0
  84. package/src/css/input.module.scss +89 -0
  85. package/src/css/modal.module.scss +105 -0
  86. package/src/css/nav.module.scss +339 -0
  87. package/src/css/notification.module.scss +691 -0
  88. package/src/css/pagination.module.scss +63 -0
  89. package/src/css/radio.module.scss +89 -0
  90. package/src/css/richtextarea.module.scss +307 -0
  91. package/src/css/select.module.scss +525 -0
  92. package/src/css/skeleton.module.scss +30 -0
  93. package/src/css/table.module.scss +386 -0
  94. package/src/css/tabs.module.scss +63 -0
  95. package/src/css/theme-toggle.module.scss +83 -0
  96. package/src/css/toggle.module.scss +54 -0
  97. package/src/css/tooltip.module.scss +97 -0
  98. package/src/css/topnav.module.scss +396 -0
  99. package/src/css/treeselect.module.scss +558 -0
  100. package/src/css/utilities/_borders.scss +111 -0
  101. package/src/css/utilities/_colors.scss +66 -0
  102. package/src/css/utilities/_effects.scss +216 -0
  103. package/src/css/utilities/_layout.scss +181 -0
  104. package/src/css/utilities/_position.scss +75 -0
  105. package/src/css/utilities/_sizing.scss +138 -0
  106. package/src/css/utilities/_spacing.scss +99 -0
  107. package/src/css/utilities/_typography.scss +121 -0
  108. package/src/css/utilities/index.scss +24 -0
  109. package/src/declarations.d.ts +6 -0
  110. package/src/index.ts +60 -0
@@ -0,0 +1,159 @@
1
+ // ===========================================
2
+ // REFINED COLOR PALETTE - Gaming Card System
3
+ // ===========================================
4
+
5
+ // Blue (primary) — bright vibrant blue
6
+ $evo-blue-100: #dbeafe;
7
+ $evo-blue-200: #bfdbfe;
8
+ $evo-blue-300: #93c5fd;
9
+ $evo-blue-400: #60a5fa;
10
+ $evo-blue-500: #3b82f6;
11
+ $evo-blue-600: #2563eb;
12
+ $evo-blue-700: #1d4ed8;
13
+ $evo-blue-800: #1e40af;
14
+ $evo-blue-900: #1e3a8a;
15
+
16
+ // Gray (secondary) — refined neutral gray
17
+ $evo-gray-100: #f3f4f6;
18
+ $evo-gray-200: #e5e7eb;
19
+ $evo-gray-300: #d1d5db;
20
+ $evo-gray-400: #9ca3af;
21
+ $evo-gray-500: #6b7280;
22
+ $evo-gray-600: #4b5563;
23
+ $evo-gray-700: #374151;
24
+ $evo-gray-800: #1f2937;
25
+ $evo-gray-900: #111827;
26
+
27
+ // Red (danger) — vivid red for alerts
28
+ $evo-red-100: #fee2e2;
29
+ $evo-red-200: #fecaca;
30
+ $evo-red-300: #fca5a5;
31
+ $evo-red-400: #f87171;
32
+ $evo-red-500: #ef4444;
33
+ $evo-red-600: #dc2626;
34
+ $evo-red-700: #b91c1c;
35
+ $evo-red-800: #991b1b;
36
+ $evo-red-900: #7f1d1d;
37
+
38
+ // Yellow (warning) — warm golden yellow
39
+ $evo-yellow-100: #fef9c3;
40
+ $evo-yellow-200: #fef08a;
41
+ $evo-yellow-300: #fde047;
42
+ $evo-yellow-400: #facc15;
43
+ $evo-yellow-500: #eab308;
44
+ $evo-yellow-600: #ca8a04;
45
+ $evo-yellow-700: #a16207;
46
+ $evo-yellow-800: #854d0e;
47
+ $evo-yellow-900: #713f12;
48
+
49
+ // Green (success) — fresh vibrant green
50
+ $evo-green-100: #dcfce7;
51
+ $evo-green-200: #bbf7d0;
52
+ $evo-green-300: #86efac;
53
+ $evo-green-400: #4ade80;
54
+ $evo-green-500: #22c55e;
55
+ $evo-green-600: #16a34a;
56
+ $evo-green-700: #15803d;
57
+ $evo-green-800: #166534;
58
+ $evo-green-900: #14532d;
59
+
60
+ // Purple (info/accent) — rich purple for special elements
61
+ $evo-purple-100: #f3e8ff;
62
+ $evo-purple-200: #e9d5ff;
63
+ $evo-purple-300: #d8b4fe;
64
+ $evo-purple-400: #c084fc;
65
+ $evo-purple-500: #a855f7;
66
+ $evo-purple-600: #9333ea;
67
+ $evo-purple-700: #7e22ce;
68
+ $evo-purple-800: #6b21a8;
69
+ $evo-purple-900: #581c87;
70
+
71
+ // Mono White (Smoke) — refined neutral foundations
72
+ $evo-white-100: #ffffff; // Pure White
73
+ $evo-white-200: #fafafa; // Off White
74
+ $evo-white-300: #f5f5f5; // Snow
75
+ $evo-white-400: #ebebeb; // Pearl
76
+ $evo-white-500: #e0e0e0; // Silver Mist
77
+ $evo-white-600: #c7c7c7; // Platinum
78
+ $evo-white-700: #a1a1a1; // Cool Gray
79
+ $evo-white-800: #7a7a7a; // Stone
80
+ $evo-white-900: #5c5c5c; // Graphite
81
+
82
+ // Mono Black (Midnight) — deep contrast blacks
83
+ $evo-black-100: #52525b; // Zinc
84
+ $evo-black-200: #3f3f46; // Charcoal
85
+ $evo-black-300: #27272a; // Onyx
86
+ $evo-black-400: #1c1c1e; // Jet
87
+ $evo-black-500: #18181b; // Rich Black
88
+ $evo-black-600: #121214; // Dark Matter
89
+ $evo-black-700: #0c0c0e; // Void
90
+ $evo-black-800: #060608; // Abyss
91
+ $evo-black-900: #000000; // True Black
92
+
93
+ // Cyan (Primary) — Electric, futuristic blue-cyan
94
+ $evo-cyan-100: #ecfeff;
95
+ $evo-cyan-200: #cffafe;
96
+ $evo-cyan-300: #a5f3fc;
97
+ $evo-cyan-400: #22d3ee;
98
+ $evo-cyan-500: #06b6d4;
99
+ $evo-cyan-600: #0891b2;
100
+ $evo-cyan-700: #0e7490;
101
+ $evo-cyan-800: #155e75;
102
+ $evo-cyan-900: #164e63;
103
+
104
+ // Rose (Legendary) — Warm, powerful pink-red
105
+ $evo-rose-100: #fff1f2;
106
+ $evo-rose-200: #fecdd3;
107
+ $evo-rose-300: #fda4af;
108
+ $evo-rose-400: #fb7185;
109
+ $evo-rose-500: #f43f5e;
110
+ $evo-rose-600: #e11d48;
111
+ $evo-rose-700: #be123c;
112
+ $evo-rose-800: #9f1239;
113
+ $evo-rose-900: #881337;
114
+
115
+ // Emerald (Rare) — Rich, deep green
116
+ $evo-emerald-100: #d1fae5;
117
+ $evo-emerald-200: #a7f3d0;
118
+ $evo-emerald-300: #6ee7b7;
119
+ $evo-emerald-400: #34d399;
120
+ $evo-emerald-500: #10b981;
121
+ $evo-emerald-600: #059669;
122
+ $evo-emerald-700: #047857;
123
+ $evo-emerald-800: #065f46;
124
+ $evo-emerald-900: #064e3b;
125
+
126
+ // Amber (Epic) — Warm gold-orange
127
+ $evo-amber-100: #fef3c7;
128
+ $evo-amber-200: #fde68a;
129
+ $evo-amber-300: #fcd34d;
130
+ $evo-amber-400: #fbbf24;
131
+ $evo-amber-500: #f59e0b;
132
+ $evo-amber-600: #d97706;
133
+ $evo-amber-700: #b45309;
134
+ $evo-amber-800: #92400e;
135
+ $evo-amber-900: #78350f;
136
+
137
+ // Violet (Mythic) — Deep, mystical purple
138
+ $evo-violet-100: #ede9fe;
139
+ $evo-violet-200: #ddd6fe;
140
+ $evo-violet-300: #c4b5fd;
141
+ $evo-violet-400: #a78bfa;
142
+ $evo-violet-500: #8b5cf6;
143
+ $evo-violet-600: #7c3aed;
144
+ $evo-violet-700: #6d28d9;
145
+ $evo-violet-800: #5b21b6;
146
+ $evo-violet-900: #4c1d95;
147
+
148
+ // Slate (Neutral) — Modern cool grays
149
+ $evo-slate-50: #f8fafc;
150
+ $evo-slate-100: #f1f5f9;
151
+ $evo-slate-200: #e2e8f0;
152
+ $evo-slate-300: #cbd5e1;
153
+ $evo-slate-400: #94a3b8;
154
+ $evo-slate-500: #64748b;
155
+ $evo-slate-600: #475569;
156
+ $evo-slate-700: #334155;
157
+ $evo-slate-800: #1e293b;
158
+ $evo-slate-900: #0f172a;
159
+ $evo-slate-950: #020617;
@@ -0,0 +1,237 @@
1
+ // ==========================================================
2
+ // EVO-UI THEME TOKENS
3
+ // ----------------------------------------------------------
4
+ // Semantic CSS custom properties for light & dark themes.
5
+ //
6
+ // Theme is controlled by a `data-theme` attribute on <html>:
7
+ // <html data-theme="light"> → light tokens
8
+ // <html data-theme="dark"> → dark tokens
9
+ // (no attribute) → follows OS via prefers-color-scheme
10
+ //
11
+ // Developers can override any token at any scope:
12
+ // :root { --evo-color-primary: #ff6b6b; }
13
+ //
14
+ // All themed component styles read these tokens, never raw
15
+ // palette colors, so a single attribute flip re-themes the
16
+ // entire UI without re-rendering React or reloading CSS.
17
+ // ==========================================================
18
+
19
+ @use './color' as *;
20
+
21
+ // ---------- Light theme tokens ----------
22
+ @mixin evo-theme-light {
23
+ // Surfaces
24
+ --evo-color-bg: #{$evo-white-100};
25
+ --evo-color-bg-rgb: 255, 255, 255;
26
+ --evo-color-surface: #{$evo-slate-50};
27
+ --evo-color-surface-elevated: #{$evo-white-100};
28
+ --evo-color-surface-sunken: #{$evo-slate-100};
29
+ --evo-color-surface-hover: #{$evo-slate-100};
30
+ --evo-color-surface-active: #{$evo-slate-200};
31
+
32
+ // Borders
33
+ --evo-color-border: #{$evo-slate-200};
34
+ --evo-color-border-strong: #{$evo-slate-300};
35
+ --evo-color-border-subtle: #{$evo-slate-100};
36
+
37
+ // Text
38
+ --evo-color-text: #{$evo-slate-900};
39
+ --evo-color-text-secondary: #{$evo-slate-600};
40
+ --evo-color-text-muted: #{$evo-slate-500};
41
+ --evo-color-text-inverted: #{$evo-white-100};
42
+
43
+ // Brand (primary)
44
+ --evo-color-primary: #{$evo-cyan-600};
45
+ --evo-color-primary-rgb: 8, 145, 178;
46
+ --evo-color-primary-hover: #{$evo-cyan-700};
47
+ --evo-color-primary-active: #{$evo-cyan-800};
48
+ --evo-color-primary-focus: #{$evo-cyan-400};
49
+ --evo-color-primary-fg: #{$evo-white-100};
50
+ --evo-color-primary-soft: #{$evo-cyan-100};
51
+ --evo-color-primary-soft-hover: #{$evo-cyan-200};
52
+
53
+ // Secondary (neutral chrome)
54
+ --evo-color-secondary: #{$evo-slate-100};
55
+ --evo-color-secondary-hover: #{$evo-slate-200};
56
+ --evo-color-secondary-active: #{$evo-slate-300};
57
+ --evo-color-secondary-fg: #{$evo-slate-800};
58
+ --evo-color-secondary-border: #{$evo-slate-300};
59
+
60
+ // Status — Danger
61
+ --evo-color-danger: #{$evo-rose-600};
62
+ --evo-color-danger-rgb: 225, 29, 72;
63
+ --evo-color-danger-hover: #{$evo-rose-700};
64
+ --evo-color-danger-active: #{$evo-rose-800};
65
+ --evo-color-danger-focus: #{$evo-rose-400};
66
+ --evo-color-danger-fg: #{$evo-white-100};
67
+ --evo-color-danger-soft: #{$evo-rose-100};
68
+
69
+ // Status — Warning
70
+ --evo-color-warning: #{$evo-amber-500};
71
+ --evo-color-warning-rgb: 245, 158, 11;
72
+ --evo-color-warning-hover: #{$evo-amber-600};
73
+ --evo-color-warning-active: #{$evo-amber-700};
74
+ --evo-color-warning-focus: #{$evo-amber-300};
75
+ --evo-color-warning-fg: #{$evo-amber-900};
76
+ --evo-color-warning-soft: #{$evo-amber-100};
77
+
78
+ // Status — Success
79
+ --evo-color-success: #{$evo-emerald-600};
80
+ --evo-color-success-rgb: 5, 150, 105;
81
+ --evo-color-success-hover: #{$evo-emerald-700};
82
+ --evo-color-success-active: #{$evo-emerald-800};
83
+ --evo-color-success-focus: #{$evo-emerald-400};
84
+ --evo-color-success-fg: #{$evo-white-100};
85
+ --evo-color-success-soft: #{$evo-emerald-100};
86
+
87
+ // Status — Info
88
+ --evo-color-info: #{$evo-violet-600};
89
+ --evo-color-info-rgb: 124, 58, 237;
90
+ --evo-color-info-hover: #{$evo-violet-700};
91
+ --evo-color-info-active: #{$evo-violet-800};
92
+ --evo-color-info-focus: #{$evo-violet-400};
93
+ --evo-color-info-fg: #{$evo-white-100};
94
+ --evo-color-info-soft: #{$evo-violet-100};
95
+
96
+ // Overlays & effects
97
+ --evo-color-overlay: rgba(15, 23, 42, 0.45);
98
+ --evo-color-backdrop: rgba(15, 23, 42, 0.6);
99
+ --evo-shadow-color: 0 0 0;
100
+ --evo-shadow-strength: 0.08;
101
+
102
+ // Skeleton / shimmer
103
+ --evo-color-skeleton-base: #{$evo-slate-200};
104
+ --evo-color-skeleton-highlight: #{$evo-slate-100};
105
+
106
+ // Color scheme hint for native UI (scrollbars, form controls)
107
+ color-scheme: light;
108
+ }
109
+
110
+ // ---------- Dark theme tokens ----------
111
+ @mixin evo-theme-dark {
112
+ // Surfaces — soft dark grays (not pure black) per 2026 best practice
113
+ --evo-color-bg: #{$evo-slate-950};
114
+ --evo-color-bg-rgb: 2, 6, 23;
115
+ --evo-color-surface: #{$evo-slate-900};
116
+ --evo-color-surface-elevated: #{$evo-slate-800};
117
+ --evo-color-surface-sunken: #{$evo-slate-950};
118
+ --evo-color-surface-hover: #{$evo-slate-800};
119
+ --evo-color-surface-active: #{$evo-slate-700};
120
+
121
+ // Borders
122
+ --evo-color-border: #{$evo-slate-700};
123
+ --evo-color-border-strong: #{$evo-slate-600};
124
+ --evo-color-border-subtle: #{$evo-slate-800};
125
+
126
+ // Text — off-white for less eye strain
127
+ --evo-color-text: #{$evo-slate-50};
128
+ --evo-color-text-secondary: #{$evo-slate-300};
129
+ --evo-color-text-muted: #{$evo-slate-400};
130
+ --evo-color-text-inverted: #{$evo-slate-900};
131
+
132
+ // Brand (primary) — lighter, more luminous in dark mode
133
+ --evo-color-primary: #{$evo-cyan-400};
134
+ --evo-color-primary-rgb: 34, 211, 238;
135
+ --evo-color-primary-hover: #{$evo-cyan-300};
136
+ --evo-color-primary-active: #{$evo-cyan-500};
137
+ --evo-color-primary-focus: #{$evo-cyan-300};
138
+ --evo-color-primary-fg: #{$evo-slate-950};
139
+ --evo-color-primary-soft: rgba(34, 211, 238, 0.12);
140
+ --evo-color-primary-soft-hover: rgba(34, 211, 238, 0.18);
141
+
142
+ // Secondary
143
+ --evo-color-secondary: rgba(255, 255, 255, 0.06);
144
+ --evo-color-secondary-hover: rgba(255, 255, 255, 0.10);
145
+ --evo-color-secondary-active: rgba(255, 255, 255, 0.15);
146
+ --evo-color-secondary-fg: #{$evo-slate-200};
147
+ --evo-color-secondary-border: #{$evo-slate-600};
148
+
149
+ // Status — Danger
150
+ --evo-color-danger: #{$evo-rose-500};
151
+ --evo-color-danger-rgb: 244, 63, 94;
152
+ --evo-color-danger-hover: #{$evo-rose-400};
153
+ --evo-color-danger-active: #{$evo-rose-600};
154
+ --evo-color-danger-focus: #{$evo-rose-300};
155
+ --evo-color-danger-fg: #{$evo-white-100};
156
+ --evo-color-danger-soft: rgba(244, 63, 94, 0.12);
157
+
158
+ // Status — Warning
159
+ --evo-color-warning: #{$evo-amber-400};
160
+ --evo-color-warning-rgb: 251, 191, 36;
161
+ --evo-color-warning-hover: #{$evo-amber-300};
162
+ --evo-color-warning-active: #{$evo-amber-500};
163
+ --evo-color-warning-focus: #{$evo-amber-300};
164
+ --evo-color-warning-fg: #{$evo-slate-950};
165
+ --evo-color-warning-soft: rgba(251, 191, 36, 0.12);
166
+
167
+ // Status — Success
168
+ --evo-color-success: #{$evo-emerald-500};
169
+ --evo-color-success-rgb: 16, 185, 129;
170
+ --evo-color-success-hover: #{$evo-emerald-400};
171
+ --evo-color-success-active: #{$evo-emerald-600};
172
+ --evo-color-success-focus: #{$evo-emerald-300};
173
+ --evo-color-success-fg: #{$evo-white-100};
174
+ --evo-color-success-soft: rgba(16, 185, 129, 0.12);
175
+
176
+ // Status — Info
177
+ --evo-color-info: #{$evo-violet-500};
178
+ --evo-color-info-rgb: 139, 92, 246;
179
+ --evo-color-info-hover: #{$evo-violet-400};
180
+ --evo-color-info-active: #{$evo-violet-600};
181
+ --evo-color-info-focus: #{$evo-violet-300};
182
+ --evo-color-info-fg: #{$evo-white-100};
183
+ --evo-color-info-soft: rgba(139, 92, 246, 0.12);
184
+
185
+ // Overlays & effects
186
+ --evo-color-overlay: rgba(0, 0, 0, 0.65);
187
+ --evo-color-backdrop: rgba(0, 0, 0, 0.75);
188
+ --evo-shadow-color: 0 0 0;
189
+ --evo-shadow-strength: 0.35;
190
+
191
+ // Skeleton / shimmer
192
+ --evo-color-skeleton-base: #{$evo-slate-800};
193
+ --evo-color-skeleton-highlight: #{$evo-slate-700};
194
+
195
+ color-scheme: dark;
196
+ }
197
+
198
+ // ---------- Apply themes ----------
199
+ // 1. Explicit data-theme attribute wins (developer/user choice)
200
+ :root,
201
+ [data-theme='light'] {
202
+ @include evo-theme-light;
203
+ }
204
+
205
+ [data-theme='dark'] {
206
+ @include evo-theme-dark;
207
+ }
208
+
209
+ // 2. No data-theme attribute → follow OS preference automatically.
210
+ // Only applies when the user/site hasn't set data-theme at all.
211
+ @media (prefers-color-scheme: dark) {
212
+ :root:not([data-theme]) {
213
+ @include evo-theme-dark;
214
+ }
215
+ }
216
+
217
+ // ---------- Smooth theme transitions ----------
218
+ // Animate color changes on theme flip — but skip during the
219
+ // initial paint and respect users who request reduced motion.
220
+ :root[data-theme-transition='true'] *,
221
+ :root[data-theme-transition='true'] *::before,
222
+ :root[data-theme-transition='true'] *::after {
223
+ transition: background-color 200ms ease,
224
+ border-color 200ms ease,
225
+ color 200ms ease,
226
+ fill 200ms ease,
227
+ stroke 200ms ease,
228
+ box-shadow 200ms ease !important;
229
+ }
230
+
231
+ @media (prefers-reduced-motion: reduce) {
232
+ :root[data-theme-transition='true'] *,
233
+ :root[data-theme-transition='true'] *::before,
234
+ :root[data-theme-transition='true'] *::after {
235
+ transition: none !important;
236
+ }
237
+ }
@@ -0,0 +1,161 @@
1
+ @use './color' as *;
2
+
3
+ // ==========================================================
4
+ // EVO-UI SCSS VARIABLES
5
+ // ----------------------------------------------------------
6
+ // Two kinds of variables live in this file:
7
+ //
8
+ // 1. SEMANTIC (theme-aware) — emit `var(--evo-*)` so the
9
+ // same component code resolves to light or dark values
10
+ // based on the current `data-theme`.
11
+ //
12
+ // 2. STATIC (sizes, radii, transitions, typography) — plain
13
+ // SCSS literals. These don't change between themes.
14
+ //
15
+ // To override a theme color, set the CSS variable in your
16
+ // app — never reassign these SCSS variables directly.
17
+ // ==========================================================
18
+
19
+ // ---------- Semantic colors (theme-aware) ----------
20
+
21
+ // Primary
22
+ $evo-primary-color: var(--evo-color-primary);
23
+ $evo-primary-hover: var(--evo-color-primary-hover);
24
+ $evo-primary-active: var(--evo-color-primary-active);
25
+ $evo-primary-focus: var(--evo-color-primary-focus);
26
+ $evo-primary-fg: var(--evo-color-primary-fg);
27
+ $evo-primary-soft: var(--evo-color-primary-soft);
28
+ $evo-primary-rgb: var(--evo-color-primary-rgb);
29
+
30
+ // Secondary
31
+ $evo-secondary-bg: var(--evo-color-secondary);
32
+ $evo-secondary-color: var(--evo-color-secondary);
33
+ $evo-secondary-border: var(--evo-color-secondary-border);
34
+ $evo-secondary-hover: var(--evo-color-secondary-hover);
35
+ $evo-secondary-active: var(--evo-color-secondary-active);
36
+ $evo-secondary-text: var(--evo-color-secondary-fg);
37
+ $evo-secondary-focus: var(--evo-color-secondary-border);
38
+
39
+ // Danger
40
+ $evo-danger-color: var(--evo-color-danger);
41
+ $evo-danger-hover: var(--evo-color-danger-hover);
42
+ $evo-danger-active: var(--evo-color-danger-active);
43
+ $evo-danger-focus: var(--evo-color-danger-focus);
44
+ $evo-danger-fg: var(--evo-color-danger-fg);
45
+ $evo-danger-soft: var(--evo-color-danger-soft);
46
+ $evo-danger-rgb: var(--evo-color-danger-rgb);
47
+
48
+ // Warning
49
+ $evo-warning-color: var(--evo-color-warning);
50
+ $evo-warning-hover: var(--evo-color-warning-hover);
51
+ $evo-warning-active: var(--evo-color-warning-active);
52
+ $evo-warning-focus: var(--evo-color-warning-focus);
53
+ $evo-warning-text: var(--evo-color-warning-fg);
54
+ $evo-warning-soft: var(--evo-color-warning-soft);
55
+
56
+ // Success
57
+ $evo-success-color: var(--evo-color-success);
58
+ $evo-success-hover: var(--evo-color-success-hover);
59
+ $evo-success-active: var(--evo-color-success-active);
60
+ $evo-success-focus: var(--evo-color-success-focus);
61
+ $evo-success-fg: var(--evo-color-success-fg);
62
+ $evo-success-soft: var(--evo-color-success-soft);
63
+
64
+ // Info
65
+ $evo-info-color: var(--evo-color-info);
66
+ $evo-info-hover: var(--evo-color-info-hover);
67
+ $evo-info-active: var(--evo-color-info-active);
68
+ $evo-info-focus: var(--evo-color-info-focus);
69
+ $evo-info-fg: var(--evo-color-info-fg);
70
+ $evo-info-soft: var(--evo-color-info-soft);
71
+
72
+ // Surfaces, borders, text — the semantic foundation
73
+ $color-background: var(--evo-color-bg);
74
+ $color-surface: var(--evo-color-surface);
75
+ $color-surface-elevated: var(--evo-color-surface-elevated);
76
+ $color-surface-sunken: var(--evo-color-surface-sunken);
77
+ $color-surface-hover: var(--evo-color-surface-hover);
78
+ $color-surface-active: var(--evo-color-surface-active);
79
+ $color-border: var(--evo-color-border);
80
+ $color-border-strong: var(--evo-color-border-strong);
81
+ $color-border-subtle: var(--evo-color-border-subtle);
82
+ $color-text-primary: var(--evo-color-text);
83
+ $color-text-secondary: var(--evo-color-text-secondary);
84
+ $color-text-muted: var(--evo-color-text-muted);
85
+ $color-text-inverted: var(--evo-color-text-inverted);
86
+ $color-overlay: var(--evo-color-overlay);
87
+ $color-backdrop: var(--evo-color-backdrop);
88
+
89
+ // Skeleton
90
+ $color-skeleton-base: var(--evo-color-skeleton-base);
91
+ $color-skeleton-highlight: var(--evo-color-skeleton-highlight);
92
+
93
+ // ---------- Card defaults (theme-aware) ----------
94
+ $evo-card-bg: $color-surface-elevated;
95
+ $evo-card-border: $color-border;
96
+ $evo-card-padding: 1rem 0.5rem;
97
+
98
+ // ---------- Static design tokens (theme-independent) ----------
99
+
100
+ // Button sizing
101
+ $evo-btn-padding-y: 0.25rem;
102
+ $evo-btn-padding-x: 0.63rem;
103
+ $evo-btn-padding-y-sm: 0.13rem;
104
+ $evo-btn-padding-x-sm: 0.38rem;
105
+ $evo-btn-padding-y-lg: 0.37rem;
106
+ $evo-btn-padding-x-lg: 0.88rem;
107
+
108
+ $evo-btn-font-size: 0.875rem;
109
+ $evo-btn-font-size-sm: 0.75rem;
110
+ $evo-btn-font-size-lg: 1rem;
111
+ $evo-btn-font-weight: 600;
112
+ $evo-btn-line-height: 1.5;
113
+
114
+ // Card sizing
115
+ $card-width: 280px;
116
+ $card-height: 380px;
117
+ $card-padding: 1.25rem;
118
+
119
+ // Border radius
120
+ $radius-sm: 6px;
121
+ $radius-md: 12px;
122
+ $radius-lg: 16px;
123
+ $radius-xl: 20px;
124
+ $radius-full: 9999px;
125
+
126
+ // Shadows — read `--evo-shadow-color` and `--evo-shadow-strength`
127
+ // so they automatically deepen in dark mode.
128
+ $shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.05);
129
+ $shadow-md: 0 4px 6px -1px rgba(0, 0, 0, 0.10), 0 2px 4px -2px rgba(0, 0, 0, 0.10);
130
+ $shadow-lg: 0 10px 15px -3px rgba(0, 0, 0, 0.10), 0 4px 6px -4px rgba(0, 0, 0, 0.10);
131
+ $shadow-xl: 0 20px 25px -5px rgba(0, 0, 0, 0.10), 0 8px 10px -6px rgba(0, 0, 0, 0.10);
132
+ $shadow-2xl: 0 25px 50px -12px rgba(0, 0, 0, 0.25);
133
+
134
+ // Transitions
135
+ $transition-fast: 150ms ease;
136
+ $transition-normal: 250ms ease;
137
+ $transition-slow: 400ms ease;
138
+ $transition-spring: 600ms cubic-bezier(0.34, 1.56, 0.64, 1);
139
+
140
+ // Typography
141
+ $font-sans: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
142
+ $font-display: 'Cal Sans', 'Inter', sans-serif;
143
+
144
+ $text-xs: 0.75rem;
145
+ $text-sm: 0.875rem;
146
+ $text-base: 1rem;
147
+ $text-lg: 1.125rem;
148
+ $text-xl: 1.25rem;
149
+ $text-2xl: 1.5rem;
150
+ $text-3xl: 1.875rem;
151
+
152
+ // Shape & motion
153
+ $evo-border-radius: 8px;
154
+ $evo-border-radius-sm: 4px;
155
+ $evo-border-radius-lg: 12px;
156
+ $evo-border-radius-pill: 9999px;
157
+
158
+ $evo-btn-transition: 150ms ease;
159
+ $evo-btn-disabled-opacity: 0.5;
160
+ $evo-btn-outline-offset: 2px;
161
+ $evo-btn-outline-width: 2px;
@@ -0,0 +1,50 @@
1
+ @use 'base/variables' as *;
2
+ @use 'base/color' as *;
3
+
4
+ .breadcrumb {
5
+ display: flex;
6
+ align-items: center;
7
+ flex-wrap: wrap;
8
+ list-style: none;
9
+ margin: 0;
10
+ padding: 0;
11
+ gap: 0;
12
+ font-family: $font-sans;
13
+ }
14
+
15
+ .item {
16
+ display: flex;
17
+ align-items: center;
18
+ list-style: none;
19
+ }
20
+
21
+ .separator {
22
+ display: flex;
23
+ align-items: center;
24
+ color: $color-text-muted;
25
+ font-size: $text-sm;
26
+ padding: 0 0.375rem;
27
+ list-style: none;
28
+ user-select: none;
29
+ }
30
+
31
+ .link {
32
+ font-size: $text-sm;
33
+ color: $evo-primary-color;
34
+ text-decoration: none;
35
+ transition: color $transition-fast;
36
+ border-radius: $radius-sm;
37
+
38
+ &:hover { color: $evo-primary-hover; text-decoration: underline; }
39
+ &:focus-visible { outline: 2px solid $evo-primary-focus; outline-offset: 2px; }
40
+ }
41
+
42
+ .text {
43
+ font-size: $text-sm;
44
+ color: $color-text-secondary;
45
+ }
46
+
47
+ .current {
48
+ color: $color-text-primary;
49
+ font-weight: 500;
50
+ }