roadmap-kit 1.0.1 → 1.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -2,20 +2,192 @@
2
2
  @tailwind components;
3
3
  @tailwind utilities;
4
4
 
5
+ /* ============================================
6
+ THEME: GLASS (Default)
7
+ Modern, clean interface inspired by CBC-WEB
8
+ ============================================ */
5
9
  @layer base {
6
- :root {
7
- --matrix: #00ff88;
8
- --signal: #ff9500;
9
- --cyber: #00d4ff;
10
- --alert: #ff3366;
10
+ :root,
11
+ [data-theme="glass"] {
12
+ /* Colors */
13
+ --bg-primary: #f8fafc;
14
+ --bg-secondary: #f1f5f9;
15
+ --bg-card: rgba(255, 255, 255, 0.7);
16
+ --bg-card-hover: rgba(255, 255, 255, 0.9);
17
+ --bg-input: #ffffff;
18
+ --bg-sidebar: rgba(255, 255, 255, 0.5);
19
+
20
+ --text-primary: #1e293b;
21
+ --text-secondary: #475569;
22
+ --text-muted: #94a3b8;
23
+ --text-inverse: #ffffff;
24
+
25
+ --accent-primary: #10b981;
26
+ --accent-secondary: #f59e0b;
27
+ --accent-tertiary: #3b82f6;
28
+ --accent-danger: #ef4444;
29
+
30
+ --border-color: rgba(0, 0, 0, 0.08);
31
+ --border-color-strong: rgba(0, 0, 0, 0.15);
32
+
33
+ /* Effects */
34
+ --radius-sm: 0.5rem;
35
+ --radius-md: 0.75rem;
36
+ --radius-lg: 1rem;
37
+ --radius-xl: 1.5rem;
38
+
39
+ --shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.05);
40
+ --shadow-md: 0 4px 6px -1px rgba(0, 0, 0, 0.1);
41
+ --shadow-lg: 0 10px 15px -3px rgba(0, 0, 0, 0.1);
42
+ --shadow-glow: none;
43
+
44
+ --backdrop-blur: blur(12px);
45
+ --transition: all 0.2s ease;
46
+
47
+ /* Typography */
48
+ --font-heading: 'Inter', system-ui, -apple-system, sans-serif;
49
+ --font-body: 'Inter', system-ui, -apple-system, sans-serif;
50
+ --font-mono: 'Fira Code', 'Consolas', monospace;
51
+
52
+ /* Status colors */
53
+ --status-completed: #10b981;
54
+ --status-in-progress: #f59e0b;
55
+ --status-pending: #94a3b8;
56
+
57
+ /* Special */
58
+ --scanlines: none;
59
+ --grid-bg: none;
60
+ --nav-indicator: var(--accent-primary);
61
+ --card-border-glow: none;
62
+ }
63
+
64
+ /* Glass theme dark mode */
65
+ [data-theme="glass"].dark,
66
+ .dark[data-theme="glass"] {
67
+ --bg-primary: #0f172a;
68
+ --bg-secondary: #1e293b;
69
+ --bg-card: rgba(30, 41, 59, 0.7);
70
+ --bg-card-hover: rgba(30, 41, 59, 0.9);
71
+ --bg-input: #1e293b;
72
+ --bg-sidebar: rgba(15, 23, 42, 0.8);
73
+
74
+ --text-primary: #f1f5f9;
75
+ --text-secondary: #cbd5e1;
76
+ --text-muted: #64748b;
77
+
78
+ --border-color: rgba(255, 255, 255, 0.08);
79
+ --border-color-strong: rgba(255, 255, 255, 0.15);
80
+ }
81
+ }
82
+
83
+ /* ============================================
84
+ THEME: MATRIX
85
+ Cyberpunk terminal aesthetic
86
+ ============================================ */
87
+ @layer base {
88
+ [data-theme="matrix"] {
89
+ /* Colors */
90
+ --bg-primary: #000000;
91
+ --bg-secondary: #0a0a0a;
92
+ --bg-card: #0d0d0d;
93
+ --bg-card-hover: #111111;
94
+ --bg-input: #0a0a0a;
95
+ --bg-sidebar: #050505;
96
+
97
+ --text-primary: #e0e0e0;
98
+ --text-secondary: #999999;
99
+ --text-muted: #555555;
100
+ --text-inverse: #000000;
101
+
102
+ --accent-primary: #00ff88;
103
+ --accent-secondary: #ff9500;
104
+ --accent-tertiary: #00d4ff;
105
+ --accent-danger: #ff3366;
106
+
107
+ --border-color: rgba(0, 255, 136, 0.15);
108
+ --border-color-strong: rgba(0, 255, 136, 0.3);
109
+
110
+ /* Effects */
111
+ --radius-sm: 0;
112
+ --radius-md: 0;
113
+ --radius-lg: 0;
114
+ --radius-xl: 0;
115
+
116
+ --shadow-sm: none;
117
+ --shadow-md: none;
118
+ --shadow-lg: 0 0 30px rgba(0, 255, 136, 0.2);
119
+ --shadow-glow: 0 0 20px rgba(0, 255, 136, 0.3);
120
+
121
+ --backdrop-blur: none;
122
+ --transition: all 0.2s ease;
123
+
124
+ /* Typography */
125
+ --font-heading: 'Orbitron', 'IBM Plex Mono', monospace;
126
+ --font-body: 'IBM Plex Mono', monospace;
127
+ --font-mono: 'IBM Plex Mono', monospace;
128
+
129
+ /* Status colors */
130
+ --status-completed: #00ff88;
131
+ --status-in-progress: #ff9500;
132
+ --status-pending: #555555;
133
+
134
+ /* Special Matrix effects */
135
+ --scanlines: repeating-linear-gradient(
136
+ 0deg,
137
+ transparent,
138
+ transparent 2px,
139
+ rgba(0, 0, 0, 0.1) 2px,
140
+ rgba(0, 0, 0, 0.1) 4px
141
+ );
142
+ --grid-bg:
143
+ linear-gradient(rgba(0, 255, 136, 0.03) 1px, transparent 1px),
144
+ linear-gradient(90deg, rgba(0, 255, 136, 0.03) 1px, transparent 1px);
145
+ --nav-indicator: var(--accent-primary);
146
+ --card-border-glow: 0 0 10px rgba(0, 255, 136, 0.3);
147
+ }
148
+
149
+ /* Matrix theme light mode - cyberpunk with lighter background */
150
+ [data-theme="matrix"].light,
151
+ .light[data-theme="matrix"] {
152
+ --bg-primary: #1a1a2e;
153
+ --bg-secondary: #16213e;
154
+ --bg-card: rgba(26, 26, 46, 0.9);
155
+ --bg-card-hover: rgba(30, 30, 60, 0.95);
156
+ --bg-input: #16213e;
157
+ --bg-sidebar: #0f0f1a;
158
+
159
+ --text-primary: #eaeaea;
160
+ --text-secondary: #b8b8b8;
161
+ --text-muted: #666666;
162
+
163
+ --border-color: rgba(0, 255, 136, 0.2);
164
+ --border-color-strong: rgba(0, 255, 136, 0.4);
165
+ }
166
+ }
167
+
168
+ /* ============================================
169
+ BASE STYLES (Theme-agnostic)
170
+ ============================================ */
171
+ @layer base {
172
+ * {
173
+ box-sizing: border-box;
11
174
  }
12
175
 
13
176
  ::selection {
14
- background-color: rgba(0, 255, 136, 0.3);
15
- color: white;
177
+ background-color: rgba(var(--accent-primary), 0.3);
178
+ background-color: color-mix(in srgb, var(--accent-primary) 30%, transparent);
179
+ color: var(--text-primary);
180
+ }
181
+
182
+ body {
183
+ background: var(--bg-primary);
184
+ color: var(--text-primary);
185
+ font-family: var(--font-body);
186
+ transition: var(--transition);
187
+ min-height: 100vh;
16
188
  }
17
189
 
18
- /* Custom scrollbar */
190
+ /* Scrollbar */
19
191
  ::-webkit-scrollbar {
20
192
  width: 6px;
21
193
  height: 6px;
@@ -26,32 +198,12 @@
26
198
  }
27
199
 
28
200
  ::-webkit-scrollbar-thumb {
29
- background: rgba(0, 255, 136, 0.2);
30
- border-radius: 3px;
201
+ background: var(--border-color-strong);
202
+ border-radius: var(--radius-sm);
31
203
  }
32
204
 
33
205
  ::-webkit-scrollbar-thumb:hover {
34
- background: rgba(0, 255, 136, 0.4);
35
- }
36
-
37
- /* Select styling */
38
- select {
39
- background-color: #0a0a0a;
40
- color: #00ff88;
41
- border: 1px solid rgba(0, 255, 136, 0.2);
42
- }
43
-
44
- select option {
45
- background-color: #0a0a0a;
46
- color: #e0e0e0;
47
- padding: 12px;
48
- }
49
-
50
- select option:hover,
51
- select option:focus,
52
- select option:checked {
53
- background-color: rgba(0, 255, 136, 0.1);
54
- color: #00ff88;
206
+ background: var(--accent-primary);
55
207
  }
56
208
 
57
209
  /* Focus styles */
@@ -59,382 +211,481 @@
59
211
  textarea:focus,
60
212
  select:focus {
61
213
  outline: none;
62
- border-color: var(--matrix);
63
- box-shadow: 0 0 0 1px var(--matrix), 0 0 20px rgba(0, 255, 136, 0.2);
214
+ border-color: var(--accent-primary);
215
+ box-shadow: 0 0 0 2px color-mix(in srgb, var(--accent-primary) 20%, transparent);
64
216
  }
65
217
  }
66
218
 
219
+ /* ============================================
220
+ COMPONENT STYLES
221
+ ============================================ */
67
222
  @layer components {
68
- /* Terminal card */
69
- .terminal-card {
70
- background: linear-gradient(180deg, #0d0d0d 0%, #0a0a0a 100%);
71
- border: 1px solid rgba(0, 255, 136, 0.15);
72
- position: relative;
73
- overflow: hidden;
223
+ /* Card */
224
+ .theme-card {
225
+ background: var(--bg-card);
226
+ border: 1px solid var(--border-color);
227
+ border-radius: var(--radius-lg);
228
+ backdrop-filter: var(--backdrop-blur);
229
+ box-shadow: var(--shadow-md);
230
+ transition: var(--transition);
74
231
  }
75
232
 
76
- .terminal-card::before {
77
- content: '';
78
- position: absolute;
79
- top: 0;
80
- left: 0;
81
- right: 0;
82
- height: 1px;
83
- background: linear-gradient(90deg, transparent, var(--matrix), transparent);
84
- opacity: 0.5;
85
- }
86
-
87
- /* Sidebar style */
88
- .sidebar-terminal {
89
- background: linear-gradient(180deg, #050505 0%, #0a0a0a 50%, #050505 100%);
90
- border-right: 1px solid rgba(0, 255, 136, 0.1);
91
- position: relative;
233
+ .theme-card:hover {
234
+ background: var(--bg-card-hover);
235
+ border-color: var(--border-color-strong);
236
+ box-shadow: var(--shadow-lg), var(--card-border-glow);
92
237
  }
93
238
 
94
- .sidebar-terminal::after {
95
- content: '';
96
- position: absolute;
97
- top: 0;
98
- right: 0;
99
- bottom: 0;
100
- width: 1px;
101
- background: linear-gradient(180deg, transparent, var(--matrix), transparent);
102
- opacity: 0.3;
239
+ /* Sidebar */
240
+ .theme-sidebar {
241
+ background: var(--bg-sidebar);
242
+ border-right: 1px solid var(--border-color);
243
+ backdrop-filter: var(--backdrop-blur);
103
244
  }
104
245
 
105
- /* Glowing border */
106
- .glow-border {
107
- position: relative;
246
+ /* Nav item */
247
+ .theme-nav-item {
248
+ font-family: var(--font-body);
249
+ color: var(--text-muted);
250
+ border-radius: var(--radius-md);
251
+ transition: var(--transition);
108
252
  }
109
253
 
110
- .glow-border::before {
111
- content: '';
112
- position: absolute;
113
- inset: -1px;
114
- border-radius: inherit;
115
- padding: 1px;
116
- background: linear-gradient(135deg, var(--matrix), var(--cyber));
117
- -webkit-mask: linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0);
118
- mask: linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0);
119
- -webkit-mask-composite: xor;
120
- mask-composite: exclude;
121
- opacity: 0.5;
254
+ .theme-nav-item:hover {
255
+ color: var(--text-primary);
256
+ background: color-mix(in srgb, var(--accent-primary) 10%, transparent);
122
257
  }
123
258
 
124
- /* LED indicator */
125
- .led {
126
- width: 8px;
127
- height: 8px;
128
- border-radius: 50%;
129
- position: relative;
259
+ .theme-nav-item.active {
260
+ color: var(--accent-primary);
261
+ background: color-mix(in srgb, var(--accent-primary) 15%, transparent);
130
262
  }
131
263
 
132
- .led::after {
133
- content: '';
134
- position: absolute;
135
- inset: -3px;
136
- border-radius: 50%;
137
- background: inherit;
138
- filter: blur(4px);
139
- opacity: 0.6;
264
+ /* Button primary */
265
+ .theme-btn-primary {
266
+ background: var(--accent-primary);
267
+ color: var(--text-inverse);
268
+ font-family: var(--font-body);
269
+ font-weight: 500;
270
+ border-radius: var(--radius-md);
271
+ padding: 0.625rem 1.25rem;
272
+ transition: var(--transition);
273
+ border: none;
140
274
  }
141
275
 
142
- .led-green {
143
- background: var(--matrix);
276
+ .theme-btn-primary:hover {
277
+ filter: brightness(1.1);
278
+ box-shadow: var(--shadow-glow);
144
279
  }
145
280
 
146
- .led-amber {
147
- background: var(--signal);
281
+ /* Button secondary */
282
+ .theme-btn-secondary {
283
+ background: transparent;
284
+ color: var(--text-primary);
285
+ font-family: var(--font-body);
286
+ border: 1px solid var(--border-color-strong);
287
+ border-radius: var(--radius-md);
288
+ padding: 0.625rem 1.25rem;
289
+ transition: var(--transition);
148
290
  }
149
291
 
150
- .led-red {
151
- background: var(--alert);
292
+ .theme-btn-secondary:hover {
293
+ background: var(--bg-card);
294
+ border-color: var(--accent-primary);
152
295
  }
153
296
 
154
- .led-gray {
155
- background: #444;
297
+ /* Input */
298
+ .theme-input {
299
+ background: var(--bg-input);
300
+ border: 1px solid var(--border-color);
301
+ border-radius: var(--radius-md);
302
+ color: var(--text-primary);
303
+ font-family: var(--font-body);
304
+ padding: 0.625rem 0.875rem;
305
+ transition: var(--transition);
156
306
  }
157
307
 
158
- .led-gray::after {
159
- opacity: 0;
308
+ .theme-input::placeholder {
309
+ color: var(--text-muted);
160
310
  }
161
311
 
162
- /* Progress bar brutalist */
163
- .progress-brutal {
312
+ /* Progress bar */
313
+ .theme-progress {
164
314
  height: 6px;
165
- background: #1a1a1a;
166
- border: 1px solid #333;
167
- position: relative;
315
+ background: var(--bg-secondary);
316
+ border-radius: var(--radius-sm);
317
+ overflow: hidden;
168
318
  }
169
319
 
170
- .progress-brutal-fill {
320
+ .theme-progress-fill {
171
321
  height: 100%;
172
- background: linear-gradient(90deg, var(--matrix), var(--cyber));
173
- box-shadow: 0 0 10px var(--matrix);
322
+ background: var(--accent-primary);
323
+ border-radius: var(--radius-sm);
174
324
  transition: width 0.5s ease-out;
175
325
  }
176
326
 
177
- /* Nav item terminal style */
178
- .nav-terminal {
179
- position: relative;
180
- font-family: 'IBM Plex Mono', monospace;
327
+ /* Badge / Status */
328
+ .theme-badge {
329
+ font-family: var(--font-mono);
330
+ font-size: 0.625rem;
181
331
  letter-spacing: 0.05em;
182
- transition: all 0.2s ease;
183
- }
184
-
185
- .nav-terminal::before {
186
- content: '>';
187
- position: absolute;
188
- left: 12px;
189
- opacity: 0;
190
- color: var(--matrix);
191
- transition: all 0.2s ease;
192
- transform: translateX(-5px);
332
+ text-transform: uppercase;
333
+ padding: 0.25rem 0.5rem;
334
+ border-radius: var(--radius-sm);
193
335
  }
194
336
 
195
- .nav-terminal:hover::before,
196
- .nav-terminal.active::before {
197
- opacity: 1;
198
- transform: translateX(0);
337
+ .theme-badge-success {
338
+ background: color-mix(in srgb, var(--status-completed) 20%, transparent);
339
+ color: var(--status-completed);
199
340
  }
200
341
 
201
- .nav-terminal.active {
202
- background: rgba(0, 255, 136, 0.05);
203
- color: var(--matrix);
204
- border-left: 2px solid var(--matrix);
342
+ .theme-badge-warning {
343
+ background: color-mix(in srgb, var(--status-in-progress) 20%, transparent);
344
+ color: var(--status-in-progress);
205
345
  }
206
346
 
207
- /* ASCII box decorations */
208
- .ascii-box {
209
- position: relative;
347
+ .theme-badge-muted {
348
+ background: color-mix(in srgb, var(--status-pending) 20%, transparent);
349
+ color: var(--status-pending);
210
350
  }
211
351
 
212
- .ascii-box::before {
213
- content: '┌──';
214
- position: absolute;
215
- top: -8px;
216
- left: 0;
217
- font-family: 'IBM Plex Mono', monospace;
218
- font-size: 10px;
219
- color: rgba(0, 255, 136, 0.3);
352
+ /* Grid background (Matrix only) */
353
+ .theme-grid-bg {
354
+ background-image: var(--grid-bg);
355
+ background-size: 40px 40px;
220
356
  }
221
357
 
222
- .ascii-box::after {
223
- content: '──┘';
224
- position: absolute;
225
- bottom: -8px;
226
- right: 0;
227
- font-family: 'IBM Plex Mono', monospace;
228
- font-size: 10px;
229
- color: rgba(0, 255, 136, 0.3);
358
+ /* Headings */
359
+ .theme-heading {
360
+ font-family: var(--font-heading);
361
+ color: var(--text-primary);
362
+ letter-spacing: -0.01em;
230
363
  }
231
364
 
232
- /* Scanline overlay */
233
- .scanlines {
234
- pointer-events: none;
235
- position: fixed;
236
- inset: 0;
237
- background: repeating-linear-gradient(
238
- 0deg,
239
- transparent,
240
- transparent 2px,
241
- rgba(0, 0, 0, 0.05) 2px,
242
- rgba(0, 0, 0, 0.05) 4px
243
- );
244
- z-index: 9999;
245
- }
365
+ /* Text styles */
366
+ .theme-text-primary { color: var(--text-primary); }
367
+ .theme-text-secondary { color: var(--text-secondary); }
368
+ .theme-text-muted { color: var(--text-muted); }
369
+ .theme-text-accent { color: var(--accent-primary); }
246
370
 
247
- /* CRT glow effect */
248
- .crt-glow {
249
- text-shadow: 0 0 5px currentColor, 0 0 10px currentColor;
371
+ /* Accent colors */
372
+ .theme-accent-bg {
373
+ background: color-mix(in srgb, var(--accent-primary) 15%, transparent);
250
374
  }
375
+ }
251
376
 
252
- /* Button terminal */
253
- .btn-terminal {
254
- font-family: 'IBM Plex Mono', monospace;
255
- font-size: 12px;
256
- letter-spacing: 0.1em;
257
- text-transform: uppercase;
258
- background: transparent;
259
- border: 1px solid var(--matrix);
260
- color: var(--matrix);
261
- padding: 10px 20px;
377
+ /* ============================================
378
+ MATRIX-SPECIFIC COMPONENTS
379
+ (Only apply when data-theme="matrix")
380
+ ============================================ */
381
+ [data-theme="matrix"] {
382
+ /* Terminal card style */
383
+ .theme-card {
262
384
  position: relative;
263
- overflow: hidden;
264
- transition: all 0.3s ease;
265
385
  }
266
386
 
267
- .btn-terminal::before {
387
+ .theme-card::before {
268
388
  content: '';
269
389
  position: absolute;
270
- inset: 0;
271
- background: var(--matrix);
272
- transform: translateX(-100%);
273
- transition: transform 0.3s ease;
274
- z-index: -1;
275
- }
276
-
277
- .btn-terminal:hover {
278
- color: black;
279
- box-shadow: 0 0 20px rgba(0, 255, 136, 0.4);
280
- }
281
-
282
- .btn-terminal:hover::before {
283
- transform: translateX(0);
284
- }
285
-
286
- /* Status badge */
287
- .status-badge {
288
- font-family: 'IBM Plex Mono', monospace;
289
- font-size: 10px;
290
- letter-spacing: 0.1em;
291
- text-transform: uppercase;
292
- padding: 4px 8px;
293
- border: 1px solid currentColor;
294
- }
295
-
296
- /* Grid background */
297
- .grid-bg {
298
- background-image:
299
- linear-gradient(rgba(0, 255, 136, 0.02) 1px, transparent 1px),
300
- linear-gradient(90deg, rgba(0, 255, 136, 0.02) 1px, transparent 1px);
301
- background-size: 40px 40px;
302
- }
303
-
304
- /* Typing cursor */
305
- .typing-cursor::after {
306
- content: '█';
307
- animation: blink 1s step-end infinite;
308
- color: var(--matrix);
309
- }
310
-
311
- /* Metric display */
312
- .metric-display {
313
- font-family: 'Orbitron', monospace;
314
- font-variant-numeric: tabular-nums;
390
+ top: 0;
391
+ left: 0;
392
+ right: 0;
393
+ height: 1px;
394
+ background: linear-gradient(90deg, transparent, var(--accent-primary), transparent);
395
+ opacity: 0.5;
315
396
  }
316
397
 
317
- /* Feature card */
318
- .feature-card {
319
- background: #0d0d0d;
320
- border: 1px solid #00ff88;
321
- transition: all 0.3s ease;
398
+ /* LED indicator */
399
+ .theme-led {
400
+ width: 8px;
401
+ height: 8px;
402
+ border-radius: 50%;
403
+ position: relative;
322
404
  }
323
405
 
324
- .feature-card:hover {
325
- border-color: #00ff88;
326
- box-shadow: 0 0 30px rgba(0, 255, 136, 0.2);
406
+ .theme-led::after {
407
+ content: '';
408
+ position: absolute;
409
+ inset: -3px;
410
+ border-radius: 50%;
411
+ background: inherit;
412
+ filter: blur(4px);
413
+ opacity: 0.6;
327
414
  }
328
415
 
329
- /* Task row */
330
- .task-row {
331
- background: #0d0d0d;
332
- border: 1px solid #1a1a1a;
333
- transition: all 0.2s ease;
334
- }
416
+ .theme-led-success { background: var(--status-completed); }
417
+ .theme-led-warning { background: var(--status-in-progress); }
418
+ .theme-led-danger { background: var(--accent-danger); }
335
419
 
336
- .task-row:hover {
337
- background: #111;
338
- border-color: #333;
420
+ /* Nav item terminal style */
421
+ .theme-nav-item {
422
+ font-family: var(--font-mono);
423
+ letter-spacing: 0.05em;
424
+ position: relative;
339
425
  }
340
426
 
341
- /* Input terminal style */
342
- .input-terminal {
343
- background: #0a0a0a;
344
- border: 1px solid #333;
345
- color: #e0e0e0;
346
- font-family: 'IBM Plex Mono', monospace;
427
+ .theme-nav-item::before {
428
+ content: '>';
429
+ position: absolute;
430
+ left: 8px;
431
+ opacity: 0;
432
+ color: var(--accent-primary);
347
433
  transition: all 0.2s ease;
434
+ transform: translateX(-5px);
348
435
  }
349
436
 
350
- .input-terminal::placeholder {
351
- color: #555;
437
+ .theme-nav-item:hover::before,
438
+ .theme-nav-item.active::before {
439
+ opacity: 1;
440
+ transform: translateX(0);
352
441
  }
353
442
 
354
- .input-terminal:focus {
355
- border-color: var(--matrix);
356
- box-shadow: 0 0 0 1px var(--matrix), 0 0 20px rgba(0, 255, 136, 0.1);
443
+ .theme-nav-item.active {
444
+ border-left: 2px solid var(--accent-primary);
445
+ border-radius: 0;
357
446
  }
358
447
 
359
- /* Modal overlay */
360
- .modal-overlay {
361
- background: rgba(0, 0, 0, 0.9);
362
- backdrop-filter: blur(4px);
448
+ /* Glow text effect */
449
+ .theme-text-glow {
450
+ text-shadow: 0 0 5px currentColor, 0 0 10px currentColor;
363
451
  }
364
452
 
365
- /* Animated gradient text */
366
- .text-matrix {
367
- color: var(--matrix);
453
+ /* Button terminal style */
454
+ .theme-btn-primary {
455
+ font-family: var(--font-mono);
456
+ letter-spacing: 0.1em;
457
+ text-transform: uppercase;
458
+ position: relative;
459
+ overflow: hidden;
368
460
  }
369
461
 
370
- .text-signal {
371
- color: var(--signal);
462
+ .theme-btn-primary::before {
463
+ content: '';
464
+ position: absolute;
465
+ inset: 0;
466
+ background: var(--accent-primary);
467
+ transform: translateX(-100%);
468
+ transition: transform 0.3s ease;
469
+ z-index: -1;
372
470
  }
373
471
 
374
- .text-cyber {
375
- color: var(--cyber);
472
+ .theme-btn-primary:hover::before {
473
+ transform: translateX(0);
376
474
  }
377
475
 
378
- .text-alert {
379
- color: var(--alert);
476
+ /* Scanlines overlay */
477
+ .theme-scanlines::after {
478
+ content: '';
479
+ pointer-events: none;
480
+ position: fixed;
481
+ inset: 0;
482
+ background: var(--scanlines);
483
+ z-index: 9999;
380
484
  }
381
485
  }
382
486
 
383
- @layer utilities {
384
- /* Stagger animations - elements always visible, animation is just enhancement */
385
- .stagger > * {
386
- opacity: 1 !important;
387
- animation: slide-up 0.4s ease-out forwards;
487
+ /* ============================================
488
+ GLASS-SPECIFIC COMPONENTS
489
+ (Only apply when data-theme="glass")
490
+ ============================================ */
491
+ [data-theme="glass"] {
492
+ /* Softer card shadows */
493
+ .theme-card {
494
+ box-shadow:
495
+ 0 1px 3px rgba(0, 0, 0, 0.08),
496
+ 0 1px 2px rgba(0, 0, 0, 0.04);
388
497
  }
389
- .stagger > *:nth-child(1) { animation-delay: 0ms; }
390
- .stagger > *:nth-child(2) { animation-delay: 50ms; }
391
- .stagger > *:nth-child(3) { animation-delay: 100ms; }
392
- .stagger > *:nth-child(4) { animation-delay: 150ms; }
393
- .stagger > *:nth-child(5) { animation-delay: 200ms; }
394
- .stagger > *:nth-child(6) { animation-delay: 250ms; }
395
- .stagger > *:nth-child(7) { animation-delay: 300ms; }
396
- .stagger > *:nth-child(8) { animation-delay: 350ms; }
397
498
 
398
- /* Glow utilities */
399
- .glow-matrix {
400
- box-shadow: 0 0 20px rgba(0, 255, 136, 0.3);
499
+ .theme-card:hover {
500
+ box-shadow:
501
+ 0 4px 12px rgba(0, 0, 0, 0.1),
502
+ 0 2px 4px rgba(0, 0, 0, 0.05);
401
503
  }
402
504
 
403
- .glow-signal {
404
- box-shadow: 0 0 20px rgba(255, 149, 0, 0.3);
505
+ /* Rounded nav items */
506
+ .theme-nav-item.active {
507
+ background: var(--accent-primary);
508
+ color: white;
509
+ box-shadow: 0 2px 8px color-mix(in srgb, var(--accent-primary) 40%, transparent);
405
510
  }
406
511
 
407
- .glow-cyber {
408
- box-shadow: 0 0 20px rgba(0, 212, 255, 0.3);
512
+ /* Progress with rounded ends */
513
+ .theme-progress,
514
+ .theme-progress-fill {
515
+ border-radius: 9999px;
409
516
  }
517
+ }
410
518
 
411
- .glow-alert {
412
- box-shadow: 0 0 20px rgba(255, 51, 102, 0.3);
413
- }
519
+ /* ============================================
520
+ UTILITIES
521
+ ============================================ */
522
+ @layer utilities {
523
+ .font-heading { font-family: var(--font-heading); }
524
+ .font-body { font-family: var(--font-body); }
525
+ .font-mono { font-family: var(--font-mono); }
526
+
527
+ .bg-primary { background: var(--bg-primary); }
528
+ .bg-secondary { background: var(--bg-secondary); }
529
+ .bg-card { background: var(--bg-card); }
530
+
531
+ .text-theme-primary { color: var(--text-primary); }
532
+ .text-theme-secondary { color: var(--text-secondary); }
533
+ .text-theme-muted { color: var(--text-muted); }
534
+ .text-theme-accent { color: var(--accent-primary); }
535
+
536
+ .border-theme { border-color: var(--border-color); }
537
+ .border-theme-strong { border-color: var(--border-color-strong); }
538
+
539
+ .rounded-theme-sm { border-radius: var(--radius-sm); }
540
+ .rounded-theme-md { border-radius: var(--radius-md); }
541
+ .rounded-theme-lg { border-radius: var(--radius-lg); }
542
+ .rounded-theme-xl { border-radius: var(--radius-xl); }
414
543
  }
415
544
 
416
- /* Keyframes */
417
- @keyframes blink {
418
- 0%, 100% { opacity: 1; }
419
- 50% { opacity: 0; }
545
+ /* ============================================
546
+ ANIMATIONS
547
+ ============================================ */
548
+ @keyframes fade-in {
549
+ from { opacity: 0; }
550
+ to { opacity: 1; }
420
551
  }
421
552
 
422
553
  @keyframes slide-up {
423
- 0% {
554
+ from {
424
555
  opacity: 0;
425
- transform: translateY(20px);
556
+ transform: translateY(10px);
426
557
  }
427
- 100% {
558
+ to {
428
559
  opacity: 1;
429
560
  transform: translateY(0);
430
561
  }
431
562
  }
432
563
 
433
- @keyframes fade-in {
434
- from { opacity: 0; }
435
- to { opacity: 1; }
564
+ @keyframes pulse-glow {
565
+ 0%, 100% { box-shadow: var(--shadow-glow); }
566
+ 50% { box-shadow: 0 0 30px color-mix(in srgb, var(--accent-primary) 50%, transparent); }
567
+ }
568
+
569
+ .animate-fade-in { animation: fade-in 0.3s ease-out; }
570
+ .animate-slide-up { animation: slide-up 0.4s ease-out; }
571
+ .animate-pulse-glow { animation: pulse-glow 2s ease-in-out infinite; }
572
+
573
+ /* ============================================
574
+ COMPATIBILITY LAYER
575
+ Maps old Matrix-specific classes to theme vars
576
+ ============================================ */
577
+
578
+ /* Text colors - map to theme variables */
579
+ .text-matrix { color: var(--accent-primary) !important; }
580
+ .text-cyber { color: var(--accent-tertiary) !important; }
581
+ .text-signal { color: var(--accent-secondary) !important; }
582
+ .text-alert { color: var(--accent-danger) !important; }
583
+ .text-white { color: var(--text-primary) !important; }
584
+
585
+ /* Background colors */
586
+ .bg-black { background: var(--bg-primary) !important; }
587
+ .bg-black\/80 { background: color-mix(in srgb, var(--bg-primary) 90%, transparent) !important; }
588
+ .bg-black\/95 { background: color-mix(in srgb, var(--bg-primary) 98%, transparent) !important; }
589
+ .bg-black\/50 { background: color-mix(in srgb, var(--bg-primary) 70%, transparent) !important; }
590
+ .bg-black\/30 { background: color-mix(in srgb, var(--bg-primary) 50%, transparent) !important; }
591
+ .bg-void { background: var(--bg-primary) !important; }
592
+ .bg-void-50 { background: var(--bg-secondary) !important; }
593
+ .bg-void-100 { background: var(--bg-card) !important; }
594
+ .bg-void-200 { background: var(--bg-card) !important; }
595
+
596
+ /* Border colors */
597
+ .border-matrix { border-color: var(--accent-primary) !important; }
598
+ .border-cyber { border-color: var(--accent-tertiary) !important; }
599
+ .border-signal { border-color: var(--accent-secondary) !important; }
600
+ .border-alert { border-color: var(--accent-danger) !important; }
601
+
602
+ /* Opacity variants using color-mix */
603
+ .text-matrix\/50 { color: color-mix(in srgb, var(--accent-primary) 50%, transparent) !important; }
604
+ .text-matrix\/30 { color: color-mix(in srgb, var(--accent-primary) 30%, transparent) !important; }
605
+ .bg-matrix\/10 { background: color-mix(in srgb, var(--accent-primary) 10%, transparent) !important; }
606
+ .bg-matrix\/20 { background: color-mix(in srgb, var(--accent-primary) 20%, transparent) !important; }
607
+ .bg-matrix\/5 { background: color-mix(in srgb, var(--accent-primary) 5%, transparent) !important; }
608
+ .border-matrix\/50 { border-color: color-mix(in srgb, var(--accent-primary) 50%, transparent) !important; }
609
+ .border-matrix\/30 { border-color: color-mix(in srgb, var(--accent-primary) 30%, transparent) !important; }
610
+ .border-matrix\/20 { border-color: color-mix(in srgb, var(--accent-primary) 20%, transparent) !important; }
611
+ .border-matrix\/15 { border-color: color-mix(in srgb, var(--accent-primary) 15%, transparent) !important; }
612
+ .border-matrix\/10 { border-color: color-mix(in srgb, var(--accent-primary) 10%, transparent) !important; }
613
+
614
+ .bg-cyber\/10 { background: color-mix(in srgb, var(--accent-tertiary) 10%, transparent) !important; }
615
+ .bg-cyber\/20 { background: color-mix(in srgb, var(--accent-tertiary) 20%, transparent) !important; }
616
+ .border-cyber\/50 { border-color: color-mix(in srgb, var(--accent-tertiary) 50%, transparent) !important; }
617
+ .border-cyber\/30 { border-color: color-mix(in srgb, var(--accent-tertiary) 30%, transparent) !important; }
618
+
619
+ .bg-signal\/10 { background: color-mix(in srgb, var(--accent-secondary) 10%, transparent) !important; }
620
+ .bg-signal\/20 { background: color-mix(in srgb, var(--accent-secondary) 20%, transparent) !important; }
621
+ .border-signal\/50 { border-color: color-mix(in srgb, var(--accent-secondary) 50%, transparent) !important; }
622
+
623
+ .bg-alert\/10 { background: color-mix(in srgb, var(--accent-danger) 10%, transparent) !important; }
624
+ .bg-alert\/20 { background: color-mix(in srgb, var(--accent-danger) 20%, transparent) !important; }
625
+ .border-alert\/50 { border-color: color-mix(in srgb, var(--accent-danger) 50%, transparent) !important; }
626
+
627
+ /* White opacity variants */
628
+ .border-white\/10 { border-color: color-mix(in srgb, var(--text-primary) 10%, transparent) !important; }
629
+ .border-white\/5 { border-color: color-mix(in srgb, var(--text-primary) 5%, transparent) !important; }
630
+ .border-white\/20 { border-color: color-mix(in srgb, var(--text-primary) 20%, transparent) !important; }
631
+ .bg-white\/5 { background: color-mix(in srgb, var(--text-primary) 5%, transparent) !important; }
632
+ .bg-white\/10 { background: color-mix(in srgb, var(--text-primary) 10%, transparent) !important; }
633
+ .hover\:bg-white\/5:hover { background: color-mix(in srgb, var(--text-primary) 5%, transparent) !important; }
634
+ .hover\:bg-white\/\[0\.02\]:hover { background: color-mix(in srgb, var(--text-primary) 2%, transparent) !important; }
635
+ .hover\:bg-white\/\[0\.01\]:hover { background: color-mix(in srgb, var(--text-primary) 1%, transparent) !important; }
636
+
637
+ /* Gray text compatibility */
638
+ .text-gray-100 { color: var(--text-primary) !important; }
639
+ .text-gray-200 { color: var(--text-primary) !important; }
640
+ .text-gray-300 { color: var(--text-secondary) !important; }
641
+ .text-gray-400 { color: var(--text-secondary) !important; }
642
+ .text-gray-500 { color: var(--text-muted) !important; }
643
+ .text-gray-600 { color: var(--text-muted) !important; }
644
+ .text-gray-700 { color: color-mix(in srgb, var(--text-muted) 70%, transparent) !important; }
645
+ .text-slate-100 { color: var(--text-primary) !important; }
646
+
647
+ /* Hover states */
648
+ .hover\:text-matrix:hover { color: var(--accent-primary) !important; }
649
+ .hover\:text-white:hover { color: var(--text-primary) !important; }
650
+ .hover\:text-gray-300:hover { color: var(--text-secondary) !important; }
651
+ .hover\:border-matrix:hover { border-color: var(--accent-primary) !important; }
652
+
653
+ /* Focus states */
654
+ .focus\:border-matrix:focus { border-color: var(--accent-primary) !important; }
655
+ .focus\:ring-matrix:focus { --tw-ring-color: var(--accent-primary) !important; }
656
+
657
+ /* LED compatibility */
658
+ .led {
659
+ width: 8px;
660
+ height: 8px;
661
+ border-radius: 50%;
662
+ position: relative;
663
+ }
664
+
665
+ .led::after {
666
+ content: '';
667
+ position: absolute;
668
+ inset: -3px;
669
+ border-radius: 50%;
670
+ background: inherit;
671
+ filter: blur(4px);
672
+ opacity: 0.6;
673
+ }
674
+
675
+ .led-gray {
676
+ background: var(--text-muted);
436
677
  }
437
678
 
438
- .animate-fade-in {
439
- animation: fade-in 0.3s ease-out forwards;
679
+ .led-gray::after {
680
+ opacity: 0;
440
681
  }
682
+
683
+ /* Glow utilities */
684
+ .glow-matrix { box-shadow: 0 0 20px color-mix(in srgb, var(--accent-primary) 30%, transparent); }
685
+ .glow-signal { box-shadow: 0 0 20px color-mix(in srgb, var(--accent-secondary) 30%, transparent); }
686
+ .glow-cyber { box-shadow: 0 0 20px color-mix(in srgb, var(--accent-tertiary) 30%, transparent); }
687
+ .glow-alert { box-shadow: 0 0 20px color-mix(in srgb, var(--accent-danger) 30%, transparent); }
688
+
689
+ /* Font compatibility */
690
+ .font-mono { font-family: var(--font-mono) !important; }
691
+ .font-display { font-family: var(--font-heading) !important; }