@tollerud/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.
package/globals.css ADDED
@@ -0,0 +1,920 @@
1
+ /* ═══════════════════════════════════════════════
2
+ Tollerud Design System — Global CSS (for Next.js globals.css)
3
+ ══════════════════════════════════════════════
4
+ Usage in app/globals.css:
5
+ @import './path/to/globals.css';
6
+
7
+ Or copy the @layer base block into your own globals.css.
8
+ ═══════════════════════════════════════════════ */
9
+
10
+ @tailwind base;
11
+ @tailwind components;
12
+ @tailwind utilities;
13
+
14
+ @layer base {
15
+ :root,
16
+ .dark {
17
+ /* ═══ Brand Tokens ═══ */
18
+ --tollerud-yellow: #E8D500;
19
+ --tollerud-yellow-bright: #FFFF00;
20
+ --tollerud-acid: #FFFF00; /* Tollerud high-voltage yellow */
21
+ --tollerud-yellow-dim: #B8A800;
22
+ --tollerud-amber: #FFB800;
23
+ --tollerud-amber-glow: #FF8C00;
24
+
25
+ /* ═══ Noir Scale ═══ */
26
+ --tollerud-black: #0A0A0A;
27
+ --tollerud-noir-900: #121212;
28
+ --tollerud-noir-800: #1A1A1A;
29
+ --tollerud-noir-700: #252525;
30
+ --tollerud-noir-600: #333333;
31
+ --tollerud-noir-500: #4A4A4A;
32
+ --tollerud-noir-400: #666666;
33
+ --tollerud-noir-300: #888888;
34
+ --tollerud-noir-200: #AAAAAA;
35
+ --tollerud-noir-100: #CCCCCC;
36
+ --tollerud-noir-50: #E5E5E5;
37
+ --tollerud-white: #F5F5F5;
38
+
39
+ /* ═══ Semantic Tokens (shadcn/ui compatible) ═══ */
40
+ --background: #0A0A0A;
41
+ --foreground: #F5F5F5;
42
+
43
+ --card: #121212;
44
+ --card-foreground: #F5F5F5;
45
+
46
+ --popover: #1A1A1A;
47
+ --popover-foreground: #F5F5F5;
48
+
49
+ --primary: #E8D500;
50
+ --primary-foreground: #0A0A0A;
51
+
52
+ --secondary: #252525;
53
+ --secondary-foreground: #AAAAAA;
54
+
55
+ --muted: #252525;
56
+ --muted-foreground: #888888;
57
+
58
+ --accent: #FFB800;
59
+ --accent-foreground: #0A0A0A;
60
+
61
+ --destructive: #EF4444;
62
+ --destructive-foreground: #F5F5F5;
63
+
64
+ --success: #22C55E;
65
+ --success-foreground: #0A0A0A;
66
+
67
+ --warning: #E8D500;
68
+ --warning-foreground: #0A0A0A;
69
+
70
+ --info: #3B82F6;
71
+ --info-foreground: #FFFFFF;
72
+
73
+ --border: #333333;
74
+ --input: #333333;
75
+ --ring: #E8D500;
76
+ --radius: 0.25rem;
77
+
78
+ /* ═══ Chart Tokens ═══ */
79
+ --chart-1: #E8D500;
80
+ --chart-2: #FFB800;
81
+ --chart-3: #22C55E;
82
+ --chart-4: #3B82F6;
83
+ --chart-5: #EF4444;
84
+ --chart-grid: rgba(245,245,245,0.08);
85
+ --chart-axis: rgba(245,245,245,0.35);
86
+
87
+ /* ═══ Motion Tokens ═══ */
88
+ --motion-duration-fast: 150ms;
89
+ --motion-duration-normal: 250ms;
90
+ --motion-duration-slow: 350ms;
91
+ --motion-ease-out: cubic-bezier(0.16, 1, 0.3, 1);
92
+ --motion-ease-in: cubic-bezier(0.7, 0, 0.84, 0);
93
+ --motion-ease-in-out: cubic-bezier(0.4, 0, 0.2, 1);
94
+
95
+ /* ═══ Elevation / z-index ═══ */
96
+ --z-base: 0;
97
+ --z-dropdown: 10;
98
+ --z-sticky: 20;
99
+ --z-fixed: 30;
100
+ --z-overlay: 40;
101
+ --z-modal: 50;
102
+ --z-toast: 60;
103
+ --z-tooltip: 70;
104
+
105
+ /* ═══ Shadow scale (noir: deep + low-spread, never milky) ═══ */
106
+ --shadow-sm: 0 1px 2px rgba(0,0,0,0.40);
107
+ --shadow-md: 0 4px 12px rgba(0,0,0,0.45);
108
+ --shadow-lg: 0 12px 32px rgba(0,0,0,0.55);
109
+ --shadow-xl: 0 24px 60px rgba(0,0,0,0.65);
110
+ --shadow-glow: 0 0 15px rgba(232,213,0,0.30);
111
+
112
+ /* ═══ Surface Tokens ═══ */
113
+ --surface: #0A0A0A;
114
+ --surface-raised: #121212;
115
+ --surface-overlay: #1A1A1A;
116
+ --surface-hover: #252525;
117
+
118
+ /* ═══ Text ═══ */
119
+ --text-primary: #F5F5F5;
120
+ --text-secondary: #AAAAAA;
121
+ --text-muted: #666666;
122
+ --text-inverse: #0A0A0A;
123
+
124
+ /* ═══ Typography ═══ */
125
+ --font-sans: 'Inter', 'SF Pro', system-ui, sans-serif;
126
+ --font-mono: 'JetBrains Mono', 'Fira Code', monospace;
127
+ --font-display: 'Inter', 'SF Pro Display', system-ui, sans-serif;
128
+
129
+ /* ═══ Glass ═══ */
130
+ --glass-bg: rgba(10, 10, 10, 0.88);
131
+ --glass-border: rgba(232, 213, 0, 0.08);
132
+ --glass-blur: blur(20px);
133
+
134
+ /* ═══ Grid Background ═══ */
135
+ --grid-color: rgba(232, 213, 0, 0.03);
136
+ --grid-size: 40px;
137
+
138
+ /* ═══ Gradient Accents ═══ */
139
+ --gradient-yellow: linear-gradient(
140
+ 90deg,
141
+ transparent,
142
+ #E8D500 35%,
143
+ #FFB800 50%,
144
+ #E8D500 65%,
145
+ transparent
146
+ );
147
+ --gradient-btn: linear-gradient(
148
+ 135deg,
149
+ #E8D500,
150
+ #B8A800
151
+ );
152
+ --gradient-soft: linear-gradient(
153
+ 135deg,
154
+ rgba(232, 213, 0, 0.8),
155
+ rgba(255, 184, 0, 0.4)
156
+ );
157
+
158
+ /* ═══ Transition ═══ */
159
+ --transition-fast: 150ms cubic-bezier(0.4, 0, 0.2, 1);
160
+ --transition-normal: 250ms cubic-bezier(0.4, 0, 0.2, 1);
161
+ --transition-slow: 350ms cubic-bezier(0.4, 0, 0.2, 1);
162
+ }
163
+
164
+ /* ═══ Base Reset ═══ */
165
+ * {
166
+ border-color: var(--border);
167
+ }
168
+
169
+ body {
170
+ font-family: var(--font-sans);
171
+ font-size: 1rem;
172
+ color: var(--foreground);
173
+ background-color: var(--background);
174
+ line-height: 1.5;
175
+ -webkit-font-smoothing: antialiased;
176
+ -moz-osx-font-smoothing: grayscale;
177
+ }
178
+
179
+ ::selection {
180
+ background-color: rgba(232, 213, 0, 0.55);
181
+ color: #0A0A0A;
182
+ }
183
+
184
+ ::-webkit-scrollbar {
185
+ width: 8px;
186
+ height: 8px;
187
+ }
188
+ ::-webkit-scrollbar-track {
189
+ background: var(--background);
190
+ }
191
+ ::-webkit-scrollbar-thumb {
192
+ background: var(--tollerud-noir-600);
193
+ border-radius: 4px;
194
+ }
195
+ ::-webkit-scrollbar-thumb:hover {
196
+ background: var(--tollerud-noir-500);
197
+ }
198
+
199
+ /* ═══ Respect reduced motion ═══ */
200
+ @media (prefers-reduced-motion: reduce) {
201
+ *,
202
+ *::before,
203
+ *::after {
204
+ animation-duration: 0.01ms !important;
205
+ animation-iteration-count: 1 !important;
206
+ transition-duration: 0.01ms !important;
207
+ scroll-behavior: auto !important;
208
+ }
209
+ }
210
+ }
211
+
212
+ @layer components {
213
+ /* ═══ Card ═══ */
214
+ .tollerud-card {
215
+ background: var(--card);
216
+ border: 1px solid var(--border);
217
+ border-radius: var(--radius);
218
+ padding: 1.5rem;
219
+ transition: border-color var(--transition-fast);
220
+ }
221
+ .tollerud-card:hover {
222
+ border-color: var(--tollerud-noir-500);
223
+ }
224
+
225
+ /* ═══ Button Base ═══ */
226
+ .tollerud-btn {
227
+ display: inline-flex;
228
+ align-items: center;
229
+ justify-content: center;
230
+ gap: 0.5rem;
231
+ font-family: var(--font-sans);
232
+ font-weight: 600;
233
+ border-radius: var(--radius);
234
+ transition: all var(--transition-fast);
235
+ cursor: pointer;
236
+ border: 1px solid transparent;
237
+ }
238
+ .tollerud-btn:focus-visible {
239
+ outline: 2px solid var(--ring);
240
+ outline-offset: 2px;
241
+ }
242
+ .tollerud-btn--primary {
243
+ background: var(--primary);
244
+ color: var(--primary-foreground);
245
+ border-color: var(--primary);
246
+ }
247
+ .tollerud-btn--primary:hover {
248
+ background: var(--tollerud-yellow-bright);
249
+ box-shadow: var(--shadow-glow, 0 0 15px rgba(232,213,0,0.3));
250
+ }
251
+ .tollerud-btn--secondary {
252
+ background: transparent;
253
+ color: var(--foreground);
254
+ border-color: var(--border);
255
+ }
256
+ .tollerud-btn--secondary:hover {
257
+ border-color: var(--tollerud-noir-200);
258
+ background: var(--surface-hover);
259
+ }
260
+ .tollerud-btn--ghost {
261
+ background: transparent;
262
+ color: var(--text-secondary);
263
+ }
264
+ .tollerud-btn--ghost:hover {
265
+ color: var(--foreground);
266
+ background: var(--surface-hover);
267
+ }
268
+ .tollerud-btn--destructive {
269
+ background: var(--destructive);
270
+ color: var(--destructive-foreground);
271
+ border-color: var(--destructive);
272
+ }
273
+ .tollerud-btn--destructive:hover {
274
+ box-shadow: 0 0 12px rgba(239, 68, 68, 0.3);
275
+ }
276
+ .tollerud-btn--sm { padding: 0.25rem 0.75rem; font-size: 0.875rem; }
277
+ .tollerud-btn--md { padding: 0.5rem 1rem; font-size: 1rem; }
278
+ .tollerud-btn--lg { padding: 0.75rem 1.5rem; font-size: 1.125rem; }
279
+ .tollerud-btn:disabled { opacity: 0.45; cursor: not-allowed; pointer-events: none; }
280
+
281
+ /* ═══ Terminal CTA ═══ */
282
+ .tollerud-btn--terminal {
283
+ background: transparent;
284
+ color: var(--tollerud-yellow);
285
+ border: 1px solid rgba(232, 213, 0, 0.25);
286
+ font-weight: 500;
287
+ letter-spacing: normal;
288
+ font-family: var(--font-mono);
289
+ }
290
+ .tollerud-btn--terminal::before {
291
+ content: '❯ ';
292
+ opacity: 0.7;
293
+ }
294
+ .tollerud-btn--terminal:hover {
295
+ border-color: var(--tollerud-yellow);
296
+ box-shadow: 0 0 15px rgba(232,213,0,0.3), 0 0 30px rgba(232,213,0,0.1);
297
+ background: rgba(232, 213, 0, 0.05);
298
+ }
299
+
300
+ /* ═══ Input ═══ */
301
+ .tollerud-input {
302
+ font-family: var(--font-sans);
303
+ font-size: 1rem;
304
+ padding: 0.5rem 0.75rem;
305
+ background: var(--card);
306
+ border: 1px solid var(--input);
307
+ border-radius: var(--radius);
308
+ color: var(--foreground);
309
+ transition: border-color var(--transition-fast);
310
+ width: 100%;
311
+ }
312
+ .tollerud-input::placeholder {
313
+ color: var(--text-muted);
314
+ }
315
+ .tollerud-input:focus {
316
+ outline: none;
317
+ border-color: var(--ring);
318
+ box-shadow: 0 0 0 1px var(--ring);
319
+ }
320
+
321
+ /* ═══ Badge ═══ */
322
+ .tollerud-badge {
323
+ display: inline-flex;
324
+ align-items: center;
325
+ padding: 0.125rem 0.5rem;
326
+ font-size: 0.75rem;
327
+ font-weight: 500;
328
+ border-radius: var(--radius);
329
+ letter-spacing: 0.02em;
330
+ }
331
+ .tollerud-badge--default {
332
+ background: var(--muted);
333
+ color: var(--text-secondary);
334
+ }
335
+ .tollerud-badge--accent {
336
+ background: rgba(232, 213, 0, 0.15);
337
+ color: var(--tollerud-yellow);
338
+ }
339
+ .tollerud-badge--success {
340
+ background: rgba(34, 197, 94, 0.15);
341
+ color: var(--success);
342
+ }
343
+ .tollerud-badge--error {
344
+ background: rgba(239, 68, 68, 0.15);
345
+ color: var(--destructive);
346
+ }
347
+ .tollerud-badge--info {
348
+ background: rgba(59, 130, 246, 0.15);
349
+ color: var(--info);
350
+ }
351
+ .tollerud-badge--warning {
352
+ background: rgba(232, 213, 0, 0.15);
353
+ color: var(--warning);
354
+ }
355
+
356
+ /* ═══ Pill Tags ═══ */
357
+ .tollerud-pill {
358
+ display: inline-flex;
359
+ align-items: center;
360
+ padding: 0.375rem 1rem;
361
+ font-size: 0.6875rem;
362
+ font-weight: 500;
363
+ border-radius: 3px;
364
+ border: 1px solid;
365
+ letter-spacing: 0.01em;
366
+ }
367
+ .tollerud-pill--outline {
368
+ background: rgba(232, 213, 0, 0.06);
369
+ color: var(--tollerud-yellow);
370
+ border-color: rgba(232, 213, 0, 0.35);
371
+ }
372
+ .tollerud-pill--muted {
373
+ background: rgba(232, 213, 0, 0.03);
374
+ color: rgba(232, 213, 0, 0.55);
375
+ border-color: rgba(232, 213, 0, 0.15);
376
+ }
377
+ .tollerud-pill--success {
378
+ background: rgba(34, 197, 94, 0.06);
379
+ color: var(--success);
380
+ border-color: rgba(34, 197, 94, 0.35);
381
+ }
382
+ .tollerud-pill--error {
383
+ background: rgba(239, 68, 68, 0.06);
384
+ color: var(--destructive);
385
+ border-color: rgba(239, 68, 68, 0.35);
386
+ }
387
+
388
+ /* ═══ Divider ═══ */
389
+ .tollerud-divider {
390
+ border: none;
391
+ border-top: 1px solid var(--border);
392
+ margin: 1.5rem 0;
393
+ }
394
+ .tollerud-divider--accent {
395
+ border-color: var(--tollerud-yellow);
396
+ width: 4rem;
397
+ }
398
+
399
+ /* ═══ Accent Bar (Graphify style) ═══ */
400
+ .tollerud-accent-bar {
401
+ height: 1px;
402
+ border: none;
403
+ background: var(--gradient-yellow);
404
+ margin: 3rem 0;
405
+ }
406
+
407
+ /* ═══ Gradient Text ═══ */
408
+ .tollerud-gradient-text {
409
+ background: var(--gradient-soft);
410
+ -webkit-background-clip: text;
411
+ -webkit-text-fill-color: transparent;
412
+ background-clip: text;
413
+ }
414
+
415
+ /* ═══ Noir Glow Background (Tollerud.no signature) ═══ */
416
+ .tollerud-noir-glow-root {
417
+ background: #000;
418
+ isolation: isolate;
419
+ }
420
+
421
+ .tollerud-noir-glow-bg {
422
+ position: absolute;
423
+ inset: 0;
424
+ background:
425
+ radial-gradient(70% 75% at 100% 0%, hsl(56, 100%, 80%) 0%, transparent 70%),
426
+ radial-gradient(80% 85% at 0% 100%, hsl(56, 100%, 50%) 0%, transparent 72%),
427
+ radial-gradient(60% 65% at 0% 0%, hsl(54, 85%, 66%) 0%, transparent 68%),
428
+ #000;
429
+ opacity: 0.45;
430
+ filter: saturate(1.05) contrast(1.02);
431
+ transform: translateZ(0);
432
+ animation: tollerud-noir-glow-drift 32s var(--motion-ease-in-out) infinite alternate;
433
+ }
434
+
435
+ .tollerud-noir-glow-vignette {
436
+ position: absolute;
437
+ inset: 0;
438
+ background:
439
+ radial-gradient(ellipse at center, rgba(0,0,0,0.3) 0%, rgba(0,0,0,0.08) 26%, rgba(0,0,0,0.2) 58%, rgba(0,0,0,0.64) 100%),
440
+ linear-gradient(180deg, rgba(0,0,0,0.12), rgba(0,0,0,0.5));
441
+ }
442
+
443
+ .tollerud-noir-noise {
444
+ position: absolute;
445
+ inset: -20%;
446
+ opacity: 0.16;
447
+ mix-blend-mode: screen;
448
+ background-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 256 256' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='noiseFilter'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.72' numOctaves='4' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23noiseFilter)' opacity='0.85'/%3E%3C/svg%3E");
449
+ animation: tollerud-noir-noise-shift 1.6s steps(2, end) infinite;
450
+ }
451
+
452
+ @keyframes tollerud-noir-glow-drift {
453
+ 0% {
454
+ transform: scale(1.02) translate3d(-1.5%, -1%, 0) rotate(0deg);
455
+ filter: saturate(1.05) contrast(1.04);
456
+ }
457
+ 50% {
458
+ transform: scale(1.07) translate3d(1.2%, 0.8%, 0) rotate(0.8deg);
459
+ filter: saturate(1.2) contrast(1.12);
460
+ }
461
+ 100% {
462
+ transform: scale(1.04) translate3d(1.8%, -1.4%, 0) rotate(-0.6deg);
463
+ filter: saturate(1.1) contrast(1.08);
464
+ }
465
+ }
466
+
467
+ @keyframes tollerud-noir-noise-shift {
468
+ 0% { transform: translate3d(0, 0, 0); }
469
+ 25% { transform: translate3d(-2%, 1%, 0); }
470
+ 50% { transform: translate3d(1%, -2%, 0); }
471
+ 75% { transform: translate3d(2%, 2%, 0); }
472
+ 100% { transform: translate3d(-1%, 0, 0); }
473
+ }
474
+
475
+ @media (prefers-reduced-motion: reduce) {
476
+ .tollerud-noir-glow-bg,
477
+ .tollerud-noir-noise {
478
+ animation: none !important;
479
+ }
480
+ }
481
+
482
+ /* ═══ Grid Background ═══ */
483
+ .tollerud-grid-bg {
484
+ pointer-events: none;
485
+ background-image:
486
+ linear-gradient(var(--grid-color) 1px, transparent 1px),
487
+ linear-gradient(90deg, var(--grid-color) 1px, transparent 1px);
488
+ background-size: var(--grid-size) var(--grid-size);
489
+ }
490
+
491
+ /* ═══ Glass / Frosted ═══ */
492
+ .tollerud-glass {
493
+ background: var(--glass-bg);
494
+ backdrop-filter: var(--glass-blur);
495
+ -webkit-backdrop-filter: var(--glass-blur);
496
+ border-bottom: 1px solid var(--glass-border);
497
+ }
498
+
499
+ /* ═══ Focus Ring ═══ */
500
+ .tollerud-focus-ring:focus-visible {
501
+ outline: 2px solid var(--ring);
502
+ outline-offset: 2px;
503
+ }
504
+
505
+ /* ═══ Glow ═══ */
506
+ .tollerud-glow {
507
+ box-shadow: 0 0 15px rgba(232,213,0,0.3), 0 0 30px rgba(232,213,0,0.1);
508
+ }
509
+
510
+ /* ═══ Skeleton ═══ */
511
+ .tollerud-skeleton {
512
+ background: linear-gradient(
513
+ 90deg,
514
+ var(--muted) 25%,
515
+ var(--tollerud-noir-600) 50%,
516
+ var(--muted) 75%
517
+ );
518
+ background-size: 200% 100%;
519
+ animation: tollerud-skeleton-shimmer 1.5s ease-in-out infinite;
520
+ border-radius: var(--radius);
521
+ }
522
+ @keyframes tollerud-skeleton-shimmer {
523
+ 0% { background-position: 200% 0; }
524
+ 100% { background-position: -200% 0; }
525
+ }
526
+
527
+ /* ═══ Display Heading ═══ */
528
+ .tollerud-display {
529
+ font-weight: 600;
530
+ letter-spacing: -0.045em;
531
+ line-height: 0.95;
532
+ color: var(--foreground);
533
+ }
534
+ .tollerud-display--secondary {
535
+ letter-spacing: -0.035em;
536
+ line-height: 1;
537
+ }
538
+ .tollerud-display--tertiary {
539
+ letter-spacing: -0.025em;
540
+ line-height: 1.1;
541
+ }
542
+
543
+ /* ═══ Status Indicator ═══ */
544
+ .tollerud-status {
545
+ display: inline-flex;
546
+ align-items: center;
547
+ gap: 0.375rem;
548
+ font-size: 0.75rem;
549
+ font-weight: 500;
550
+ }
551
+ .tollerud-status::before {
552
+ content: '';
553
+ width: 8px;
554
+ height: 8px;
555
+ border-radius: 50%;
556
+ display: inline-block;
557
+ }
558
+ .tollerud-status--online::before { background: var(--success); box-shadow: 0 0 6px rgba(34,197,94,0.5); }
559
+ .tollerud-status--offline::before { background: var(--destructive); }
560
+ .tollerud-status--warning::before { background: var(--warning); box-shadow: 0 0 6px rgba(232,213,0,0.5); }
561
+ .tollerud-status--idle::before { background: var(--tollerud-noir-400); }
562
+
563
+ /* ═══ Code Block ═══ */
564
+ .tollerud-code-block {
565
+ background: var(--tollerud-noir-900);
566
+ border: 1px solid var(--border);
567
+ border-radius: var(--radius);
568
+ padding: 1rem;
569
+ font-family: var(--font-mono);
570
+ font-size: 0.875rem;
571
+ line-height: 1.7;
572
+ overflow-x: auto;
573
+ color: var(--tollerud-noir-200);
574
+ }
575
+ .tollerud-code-block .prompt { color: var(--tollerud-yellow); }
576
+ .tollerud-code-block .comment { color: var(--tollerud-noir-400); font-style: italic; }
577
+
578
+ /* ═══ Stat Card (for dashboards) ═══ */
579
+ .tollerud-stat {
580
+ background: var(--card);
581
+ border: 1px solid var(--border);
582
+ border-radius: var(--radius);
583
+ padding: 1rem 1.25rem;
584
+ }
585
+ .tollerud-stat__label {
586
+ font-size: 0.75rem;
587
+ font-weight: 500;
588
+ text-transform: uppercase;
589
+ letter-spacing: 0.06em;
590
+ color: var(--text-muted);
591
+ }
592
+ .tollerud-stat__value {
593
+ font-size: 1.5rem;
594
+ font-weight: 600;
595
+ color: var(--foreground);
596
+ margin-top: 0.125rem;
597
+ }
598
+ .tollerud-stat__change {
599
+ font-size: 0.75rem;
600
+ font-weight: 500;
601
+ margin-top: 0.125rem;
602
+ }
603
+ .tollerud-stat__change--up { color: var(--success); }
604
+ .tollerud-stat__change--down { color: var(--destructive); }
605
+
606
+ /* ═══ Timeline ═══ */
607
+ .tollerud-timeline {
608
+ display: flex;
609
+ flex-direction: column;
610
+ }
611
+ .tollerud-timeline__item {
612
+ display: flex;
613
+ gap: 0.75rem;
614
+ }
615
+ .tollerud-timeline__marker {
616
+ display: flex;
617
+ flex-direction: column;
618
+ align-items: center;
619
+ width: 20px;
620
+ flex-shrink: 0;
621
+ }
622
+ .tollerud-timeline__dot-group {
623
+ display: flex;
624
+ flex-direction: column;
625
+ align-items: center;
626
+ height: 100%;
627
+ }
628
+ .tollerud-timeline__dot {
629
+ width: 10px;
630
+ height: 10px;
631
+ border-radius: 50%;
632
+ background: var(--tollerud-noir-500);
633
+ flex-shrink: 0;
634
+ z-index: 1;
635
+ }
636
+ .tollerud-timeline__dot--active {
637
+ animation: tollerud-timeline-pulse 2s infinite;
638
+ }
639
+ @keyframes tollerud-timeline-pulse {
640
+ 0%, 100% { box-shadow: 0 0 0 0 rgba(232,213,0,0.4); }
641
+ 50% { box-shadow: 0 0 0 6px rgba(232,213,0,0); }
642
+ }
643
+ .tollerud-timeline__line {
644
+ width: 1px;
645
+ flex: 1;
646
+ min-height: 12px;
647
+ background: linear-gradient(
648
+ 180deg,
649
+ var(--tollerud-noir-600) 0%,
650
+ var(--tollerud-noir-600) 80%,
651
+ transparent 100%
652
+ );
653
+ }
654
+ .tollerud-timeline:not(.tollerud-timeline--active) .tollerud-timeline__dot--active {
655
+ animation: none;
656
+ box-shadow: 0 0 6px rgba(232,213,0,0.4);
657
+ }
658
+ .tollerud-timeline__icon {
659
+ width: 20px;
660
+ height: 20px;
661
+ display: flex;
662
+ align-items: center;
663
+ justify-content: center;
664
+ color: var(--tollerud-yellow);
665
+ }
666
+ .tollerud-timeline__content {
667
+ flex: 1;
668
+ min-width: 0;
669
+ padding-bottom: 1.25rem;
670
+ }
671
+ .tollerud-timeline__title {
672
+ font-size: 0.875rem;
673
+ font-weight: 600;
674
+ color: var(--foreground);
675
+ }
676
+ .tollerud-timeline__time {
677
+ font-size: 0.75rem;
678
+ color: var(--text-muted);
679
+ white-space: nowrap;
680
+ flex-shrink: 0;
681
+ }
682
+ .tollerud-timeline__description {
683
+ font-size: 0.8125rem;
684
+ color: var(--text-secondary);
685
+ margin-top: 0.125rem;
686
+ line-height: 1.4;
687
+ }
688
+ .tollerud-timeline__meta {
689
+ font-size: 0.6875rem;
690
+ color: var(--text-muted);
691
+ background: var(--tollerud-noir-800);
692
+ padding: 0.125rem 0.375rem;
693
+ border-radius: 3px;
694
+ border: 1px solid var(--tollerud-noir-600);
695
+ }
696
+
697
+ /* ═══ Kbd (Keyboard Shortcut Chip) ═══ */
698
+ .tollerud-kbd {
699
+ display: inline-flex;
700
+ align-items: center;
701
+ gap: 2px;
702
+ }
703
+ .tollerud-kbd__key {
704
+ display: inline-flex;
705
+ align-items: center;
706
+ justify-content: center;
707
+ min-width: 22px;
708
+ height: 22px;
709
+ padding: 0 5px;
710
+ font-family: var(--font-mono);
711
+ font-size: 11px;
712
+ font-weight: 500;
713
+ line-height: 1;
714
+ color: var(--tollerud-noir-200);
715
+ background: var(--tollerud-noir-800);
716
+ border: 1px solid var(--tollerud-noir-600);
717
+ border-radius: 4px;
718
+ box-shadow: 0 1px 0 var(--tollerud-noir-600);
719
+ }
720
+ .tollerud-kbd--sm .tollerud-kbd__key {
721
+ min-width: 18px;
722
+ height: 18px;
723
+ padding: 0 4px;
724
+ font-size: 10px;
725
+ }
726
+
727
+ /* ═══ Action Row ═══ */
728
+ .tollerud-action-row {
729
+ display: flex;
730
+ align-items: center;
731
+ gap: 0.75rem;
732
+ width: 100%;
733
+ padding: 0.5rem 0.75rem;
734
+ background: transparent;
735
+ border: none;
736
+ border-radius: 6px;
737
+ cursor: pointer;
738
+ text-align: left;
739
+ font-family: var(--font-sans);
740
+ transition: background var(--motion-duration-fast) var(--motion-ease-in-out);
741
+ }
742
+ .tollerud-action-row:hover,
743
+ .tollerud-action-row--highlighted {
744
+ background: var(--tollerud-noir-700);
745
+ }
746
+ .tollerud-action-row--disabled {
747
+ opacity: 0.4;
748
+ cursor: not-allowed;
749
+ }
750
+ .tollerud-action-row__icon {
751
+ flex-shrink: 0;
752
+ width: 20px;
753
+ height: 20px;
754
+ display: flex;
755
+ align-items: center;
756
+ justify-content: center;
757
+ color: var(--tollerud-yellow);
758
+ }
759
+ .tollerud-action-row__icon svg {
760
+ width: 18px;
761
+ height: 18px;
762
+ }
763
+ .tollerud-action-row__content {
764
+ flex: 1;
765
+ min-width: 0;
766
+ display: flex;
767
+ flex-direction: column;
768
+ gap: 1px;
769
+ }
770
+ .tollerud-action-row__label {
771
+ font-size: 14px;
772
+ font-weight: 500;
773
+ color: var(--foreground);
774
+ white-space: nowrap;
775
+ overflow: hidden;
776
+ text-overflow: ellipsis;
777
+ }
778
+ .tollerud-action-row__description {
779
+ font-size: 12px;
780
+ color: var(--text-muted);
781
+ white-space: nowrap;
782
+ overflow: hidden;
783
+ text-overflow: ellipsis;
784
+ }
785
+ .tollerud-action-row__shortcut {
786
+ flex-shrink: 0;
787
+ margin-left: auto;
788
+ }
789
+
790
+ /* ═══ Command Menu ═══ */
791
+ .tollerud-cmd-overlay {
792
+ position: fixed;
793
+ inset: 0;
794
+ z-index: var(--z-overlay);
795
+ background: rgba(0, 0, 0, 0.6);
796
+ backdrop-filter: blur(4px);
797
+ -webkit-backdrop-filter: blur(4px);
798
+ animation: tollerud-cmd-overlay-in 150ms var(--motion-ease-out);
799
+ }
800
+ @keyframes tollerud-cmd-overlay-in {
801
+ from { opacity: 0; }
802
+ to { opacity: 1; }
803
+ }
804
+
805
+ .tollerud-cmd {
806
+ position: fixed;
807
+ top: 15vh;
808
+ left: 50%;
809
+ transform: translateX(-50%);
810
+ z-index: var(--z-modal);
811
+ width: min(90vw, 640px);
812
+ max-height: 70vh;
813
+ display: flex;
814
+ flex-direction: column;
815
+ background: var(--surface-raised);
816
+ border: 1px solid var(--tollerud-noir-600);
817
+ border-radius: 12px;
818
+ box-shadow: 0 16px 48px rgba(0, 0, 0, 0.6);
819
+ animation: tollerud-cmd-in 200ms var(--motion-ease-out);
820
+ overflow: hidden;
821
+ }
822
+ @keyframes tollerud-cmd-in {
823
+ from {
824
+ opacity: 0;
825
+ transform: translateX(-50%) scale(0.96) translateY(-8px);
826
+ }
827
+ to {
828
+ opacity: 1;
829
+ transform: translateX(-50%) scale(1) translateY(0);
830
+ }
831
+ }
832
+
833
+ .tollerud-cmd__header {
834
+ display: flex;
835
+ align-items: center;
836
+ gap: 0.75rem;
837
+ padding: 0.75rem 1rem;
838
+ border-bottom: 1px solid var(--border);
839
+ flex-shrink: 0;
840
+ }
841
+ .tollerud-cmd__search-icon {
842
+ flex-shrink: 0;
843
+ color: var(--text-muted);
844
+ display: flex;
845
+ align-items: center;
846
+ }
847
+ .tollerud-cmd__input {
848
+ flex: 1;
849
+ background: transparent;
850
+ border: none;
851
+ outline: none;
852
+ color: var(--foreground);
853
+ font-family: var(--font-sans);
854
+ font-size: 16px;
855
+ line-height: 1.5;
856
+ }
857
+ .tollerud-cmd__input::placeholder {
858
+ color: var(--text-muted);
859
+ }
860
+
861
+ .tollerud-cmd__list {
862
+ flex: 1;
863
+ overflow-y: auto;
864
+ padding: 0.5rem;
865
+ display: flex;
866
+ flex-direction: column;
867
+ gap: 0.25rem;
868
+ }
869
+ .tollerud-cmd__empty {
870
+ padding: 2rem 1rem;
871
+ text-align: center;
872
+ font-size: 14px;
873
+ color: var(--text-muted);
874
+ }
875
+ .tollerud-cmd__group {
876
+ display: flex;
877
+ flex-direction: column;
878
+ gap: 1px;
879
+ }
880
+ .tollerud-cmd__group-label {
881
+ padding: 0.5rem 0.75rem 0.25rem;
882
+ font-size: 11px;
883
+ font-weight: 600;
884
+ text-transform: uppercase;
885
+ letter-spacing: 0.06em;
886
+ color: var(--text-muted);
887
+ }
888
+
889
+ .tollerud-cmd__footer {
890
+ display: flex;
891
+ align-items: center;
892
+ gap: 0.75rem;
893
+ padding: 0.5rem 1rem;
894
+ border-top: 1px solid var(--border);
895
+ flex-shrink: 0;
896
+ }
897
+ .tollerud-cmd__hint {
898
+ display: inline-flex;
899
+ align-items: center;
900
+ gap: 4px;
901
+ }
902
+ .tollerud-cmd__hint-text {
903
+ font-size: 11px;
904
+ color: var(--text-muted);
905
+ }
906
+ }
907
+
908
+ @layer utilities {
909
+ /* ═══ Text utilities ═══ */
910
+ .text-balance { text-wrap: balance; }
911
+
912
+ /* ═══ Section container ═══ */
913
+ .tollerud-section {
914
+ max-width: 1100px;
915
+ margin-left: auto;
916
+ margin-right: auto;
917
+ padding-left: 1.5rem;
918
+ padding-right: 1.5rem;
919
+ }
920
+ }