@luna_ui/astra 0.17.0 → 0.20.0

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.
@@ -0,0 +1,2896 @@
1
+ /* Luna SSG Default Theme - West Coast / Linear Style */
2
+ :root {
3
+ /* Primary: Electric Violet/Blue Gradient Source */
4
+ --primary-color: #6366f1; /* Indigo 500 */
5
+ /* Secondary: Cyan/Teal */
6
+ --secondary-color: #06b6d4; /* Cyan 500 */
7
+ /* Accent: Amber/Orange */
8
+ --accent-color: #f59e0b;
9
+
10
+ --text-color: #1a1a1a;
11
+ --text-muted: #666666;
12
+ --bg-color: #ffffff;
13
+ --sidebar-bg: #f7f7f8;
14
+ --border-color: #e5e5e5; /* Lighter border for clean look */
15
+ --code-bg: #f5f5f7;
16
+ --link-color: var(--primary-color);
17
+ --nav-link-color: #666666;
18
+ --sidebar-link-color: #525252;
19
+
20
+ /* Gradients */
21
+ --hero-gradient-start: #4f46e5;
22
+ --hero-gradient-end: #06b6d4;
23
+
24
+ /* Glassmorphism */
25
+ --glass-bg: rgba(255, 255, 255, 0.7);
26
+ --glass-border: rgba(0, 0, 0, 0.05);
27
+ --glass-blur: 12px;
28
+ }
29
+
30
+ /* Dark mode - Linear/Vercel inspired */
31
+ html.dark {
32
+ --primary-color: #818cf8; /* Indigo 400 */
33
+ --secondary-color: #22d3ee; /* Cyan 400 */
34
+ --accent-color: #fbbf24;
35
+
36
+ --text-color: #ededed;
37
+ --text-muted: #a1a1aa;
38
+ --bg-color: #050505; /* Deep, almost black */
39
+ --sidebar-bg: #0a0a0a;
40
+ --border-color: #262626; /* Subtle dark border */
41
+ --code-bg: #111111;
42
+ --nav-link-color: #a1a1aa;
43
+ --sidebar-link-color: #d4d4d4;
44
+
45
+ /* Glassmorphism Dark */
46
+ --glass-bg: rgba(10, 10, 10, 0.7);
47
+ --glass-border: rgba(255, 255, 255, 0.08);
48
+ }
49
+
50
+ /* Theme toggle button */
51
+ .theme-toggle {
52
+ display: flex;
53
+ align-items: center;
54
+ justify-content: center;
55
+ width: 32px;
56
+ height: 32px;
57
+ padding: 0;
58
+ border: 1px solid transparent;
59
+ border-radius: 6px;
60
+ background: transparent;
61
+ color: var(--text-muted);
62
+ cursor: pointer;
63
+ transition: all 0.2s ease;
64
+ }
65
+ .theme-toggle:hover {
66
+ background: var(--sidebar-bg);
67
+ color: var(--text-color);
68
+ }
69
+
70
+ /* Theme icons - moon in light mode, sun in dark mode */
71
+ .theme-icon-dark { display: block; }
72
+ .theme-icon-light { display: none; }
73
+ html.dark .theme-icon-dark { display: none; }
74
+ html.dark .theme-icon-light { display: block; }
75
+
76
+ /* View Transition API (MPA) */
77
+ @view-transition {
78
+ navigation: auto;
79
+ }
80
+
81
+ /* Disable root transition, only transition main content */
82
+ ::view-transition-old(root),
83
+ ::view-transition-new(root) {
84
+ animation: none;
85
+ mix-blend-mode: normal;
86
+ }
87
+
88
+ /* Main content transition */
89
+ .doc-content {
90
+ view-transition-name: main-content;
91
+ }
92
+
93
+ ::view-transition-old(main-content),
94
+ ::view-transition-new(main-content) {
95
+ animation-duration: 0.2s;
96
+ animation-timing-function: ease-out;
97
+ }
98
+
99
+ /* Direction-based animations */
100
+ @keyframes slide-out-to-left {
101
+ from { transform: translateX(0); opacity: 1; }
102
+ to { transform: translateX(-5%); opacity: 0; }
103
+ }
104
+ @keyframes slide-in-from-right {
105
+ from { transform: translateX(5%); opacity: 0; }
106
+ to { transform: translateX(0); opacity: 1; }
107
+ }
108
+ @keyframes slide-out-to-right {
109
+ from { transform: translateX(0); opacity: 1; }
110
+ to { transform: translateX(5%); opacity: 0; }
111
+ }
112
+ @keyframes slide-in-from-left {
113
+ from { transform: translateX(-5%); opacity: 0; }
114
+ to { transform: translateX(0); opacity: 1; }
115
+ }
116
+
117
+ html:active-view-transition-type(forwards) {
118
+ &::view-transition-old(main-content) { animation-name: slide-out-to-right; }
119
+ &::view-transition-new(main-content) { animation-name: slide-in-from-left; }
120
+ }
121
+ html:active-view-transition-type(backwards) {
122
+ &::view-transition-old(main-content) { animation-name: slide-out-to-left; }
123
+ &::view-transition-new(main-content) { animation-name: slide-in-from-right; }
124
+ }
125
+
126
+ * { box-sizing: border-box; margin: 0; padding: 0; }
127
+
128
+ html {
129
+ overflow-x: clip;
130
+ scroll-behavior: smooth;
131
+ }
132
+
133
+ body {
134
+ font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif;
135
+ color: var(--text-color);
136
+ background: var(--bg-color);
137
+ line-height: 1.6;
138
+ min-width: 320px;
139
+ max-width: 100vw;
140
+ -webkit-font-smoothing: antialiased;
141
+ -moz-osx-font-smoothing: grayscale;
142
+ }
143
+
144
+ #app {
145
+ max-width: 100%;
146
+ }
147
+
148
+ /* Navigation */
149
+ .nav-bar {
150
+ position: sticky;
151
+ top: 0;
152
+ z-index: 100;
153
+ background: var(--glass-bg);
154
+ backdrop-filter: blur(var(--glass-blur));
155
+ -webkit-backdrop-filter: blur(var(--glass-blur));
156
+ border-bottom: 1px solid var(--border-color);
157
+ padding: 0.75rem 1.5rem;
158
+ transition: background-color 0.2s, border-color 0.2s;
159
+ }
160
+
161
+ .nav-container {
162
+ max-width: 1200px;
163
+ margin: 0 auto;
164
+ display: flex;
165
+ justify-content: space-between;
166
+ align-items: center;
167
+ }
168
+
169
+ .nav-left { display: flex; align-items: center; gap: 2rem; flex-shrink: 0; }
170
+ .nav-right { display: flex; align-items: center; gap: 1.5rem; flex-shrink: 0; }
171
+ .nav-home {
172
+ text-decoration: none;
173
+ font-weight: 600;
174
+ color: var(--text-color);
175
+ flex-shrink: 0;
176
+ font-size: 1.1rem;
177
+ letter-spacing: -0.01em;
178
+ }
179
+ .nav-logo { height: 32px; }
180
+ .nav-links { display: flex; gap: 2rem; align-items: center; flex-shrink: 0; }
181
+ .nav-link {
182
+ color: var(--nav-link-color);
183
+ text-decoration: none;
184
+ white-space: nowrap;
185
+ font-size: 0.9rem;
186
+ font-weight: 500;
187
+ transition: color 0.2s;
188
+ }
189
+ .nav-link:hover { color: var(--text-color); }
190
+
191
+ /* Nav Icons */
192
+ .nav-icon {
193
+ display: inline-block;
194
+ vertical-align: middle;
195
+ margin-right: 0.4rem;
196
+ opacity: 0.85;
197
+ transition: opacity 0.2s, transform 0.2s;
198
+ }
199
+ .nav-link:hover .nav-icon {
200
+ opacity: 1;
201
+ transform: scale(1.1);
202
+ }
203
+
204
+ /* Language Switcher */
205
+ .lang-switcher {
206
+ position: relative;
207
+ }
208
+ .lang-trigger {
209
+ cursor: pointer;
210
+ padding: 0.25rem 0.5rem;
211
+ border: 1px solid transparent;
212
+ border-radius: 6px;
213
+ font-size: 0.875rem;
214
+ color: var(--text-muted);
215
+ list-style: none;
216
+ display: flex;
217
+ align-items: center;
218
+ gap: 0.25rem;
219
+ transition: all 0.2s;
220
+ }
221
+ .lang-trigger:hover {
222
+ background: var(--sidebar-bg);
223
+ color: var(--text-color);
224
+ }
225
+ .lang-trigger::-webkit-details-marker { display: none; }
226
+ .lang-trigger::after {
227
+ content: '';
228
+ border-left: 4px solid transparent;
229
+ border-right: 4px solid transparent;
230
+ border-top: 5px solid currentColor;
231
+ opacity: 0.5;
232
+ }
233
+ .lang-switcher[open] .lang-trigger::after {
234
+ border-top: none;
235
+ border-bottom: 5px solid currentColor;
236
+ }
237
+ .lang-menu {
238
+ position: absolute;
239
+ top: 100%;
240
+ right: 0;
241
+ margin-top: 0.5rem;
242
+ background: var(--bg-color);
243
+ border: 1px solid var(--border-color);
244
+ border-radius: 8px;
245
+ box-shadow: 0 4px 20px rgba(0,0,0,0.1);
246
+ min-width: 140px;
247
+ z-index: 200;
248
+ padding: 0.25rem;
249
+ overflow: hidden;
250
+ }
251
+ .lang-item {
252
+ display: block;
253
+ padding: 0.5rem 0.75rem;
254
+ color: var(--text-muted);
255
+ text-decoration: none;
256
+ font-size: 0.875rem;
257
+ border-radius: 4px;
258
+ transition: all 0.15s;
259
+ }
260
+ .lang-item:hover {
261
+ background: var(--sidebar-bg);
262
+ color: var(--text-color);
263
+ }
264
+ .lang-item-active {
265
+ color: var(--primary-color);
266
+ font-weight: 500;
267
+ background: rgba(var(--primary-color), 0.1);
268
+ }
269
+
270
+ /* Social Links */
271
+ .social-links {
272
+ display: flex;
273
+ align-items: center;
274
+ gap: 0.75rem;
275
+ }
276
+ .social-link {
277
+ display: flex;
278
+ align-items: center;
279
+ justify-content: center;
280
+ color: var(--text-muted);
281
+ padding: 0.25rem;
282
+ transition: color 0.2s;
283
+ }
284
+ .social-link:hover {
285
+ color: var(--text-color);
286
+ }
287
+ .social-link svg {
288
+ display: block;
289
+ width: 20px;
290
+ height: 20px;
291
+ }
292
+
293
+ /* Layout */
294
+ .layout-doc { display: flex; flex-direction: column; min-height: 100vh; }
295
+ .doc-container { display: flex; flex: 1; width: 100%; }
296
+
297
+ /* Home Layout */
298
+ .layout-home { min-height: 100vh; display: flex; flex-direction: column; }
299
+ .home-content {
300
+ flex: 1;
301
+ max-width: 1200px;
302
+ margin: 0 auto;
303
+ padding: 0 2rem;
304
+ width: 100%;
305
+ }
306
+ .home-content h1:first-child {
307
+ font-size: 2.5rem;
308
+ text-align: center;
309
+ margin-bottom: 1.5rem;
310
+ border: none;
311
+ }
312
+ .home-content > p:first-of-type {
313
+ font-size: 1.25rem;
314
+ text-align: center;
315
+ color: var(--text-muted);
316
+ margin-bottom: 2rem;
317
+ }
318
+
319
+ /* ===========================================
320
+ Hero Section (Landing Page)
321
+ =========================================== */
322
+
323
+ .hero {
324
+ padding: 8rem 0 6rem;
325
+ text-align: center;
326
+ display: flex;
327
+ flex-direction: column;
328
+ align-items: center;
329
+ position: relative;
330
+ }
331
+
332
+ /* Optional: Background Glow Effect */
333
+ .hero::before {
334
+ content: '';
335
+ position: absolute;
336
+ top: -100px;
337
+ left: 50%;
338
+ transform: translateX(-50%);
339
+ width: 600px;
340
+ height: 600px;
341
+ background: radial-gradient(circle, rgba(99, 102, 241, 0.15) 0%, rgba(6, 182, 212, 0.05) 40%, transparent 70%);
342
+ filter: blur(60px);
343
+ z-index: -1;
344
+ pointer-events: none;
345
+ }
346
+
347
+ .hero-badge {
348
+ display: inline-flex;
349
+ align-items: center;
350
+ gap: 0.5rem;
351
+ padding: 0.5rem 1rem;
352
+ background: rgba(99, 102, 241, 0.1);
353
+ border: 1px solid rgba(99, 102, 241, 0.2);
354
+ border-radius: 9999px;
355
+ font-size: 0.75rem;
356
+ font-weight: 600;
357
+ text-transform: uppercase;
358
+ letter-spacing: 0.05em;
359
+ color: var(--primary-color);
360
+ margin-bottom: 2.5rem;
361
+ backdrop-filter: blur(4px);
362
+ transition: transform 0.2s ease, box-shadow 0.2s ease;
363
+ }
364
+
365
+ .hero-badge:hover {
366
+ transform: translateY(-1px);
367
+ box-shadow: 0 4px 12px rgba(99, 102, 241, 0.15);
368
+ border-color: var(--primary-color);
369
+ }
370
+
371
+ .hero-badge-dot {
372
+ width: 6px;
373
+ height: 6px;
374
+ background: var(--primary-color);
375
+ border-radius: 50%;
376
+ box-shadow: 0 0 8px var(--primary-color);
377
+ }
378
+
379
+ .hero-title {
380
+ font-size: clamp(3.5rem, 8vw, 5rem);
381
+ font-weight: 800;
382
+ line-height: 1.05;
383
+ margin: 0 0 1.5rem;
384
+ color: var(--text-color);
385
+ letter-spacing: -0.04em;
386
+ max-width: 900px;
387
+ }
388
+
389
+ .hero-title-gradient {
390
+ background: linear-gradient(135deg, var(--hero-gradient-start) 0%, var(--hero-gradient-end) 100%);
391
+ -webkit-background-clip: text;
392
+ background-clip: text;
393
+ -webkit-text-fill-color: transparent;
394
+ padding-bottom: 0.1em; /* Prevent descender clipping */
395
+ }
396
+
397
+ .hero-subtitle {
398
+ font-size: clamp(1.25rem, 2vw, 1.5rem);
399
+ color: var(--text-muted);
400
+ max-width: 640px;
401
+ line-height: 1.6;
402
+ margin: 0 auto 3rem;
403
+ font-weight: 400;
404
+ }
405
+
406
+ .hero-actions {
407
+ display: flex;
408
+ flex-wrap: wrap;
409
+ justify-content: center;
410
+ gap: 1.5rem;
411
+ margin-bottom: 4rem;
412
+ }
413
+
414
+ .hero-btn {
415
+ display: inline-flex;
416
+ align-items: center;
417
+ gap: 0.75rem;
418
+ padding: 1rem 2rem;
419
+ font-size: 1.0625rem;
420
+ font-weight: 600;
421
+ text-decoration: none;
422
+ border-radius: 9999px; /* Pill shape */
423
+ transition: all 0.2s cubic-bezier(0.25, 0.46, 0.45, 0.94);
424
+ }
425
+
426
+ .hero-btn-primary {
427
+ background: var(--text-color);
428
+ color: var(--bg-color);
429
+ border: 1px solid transparent;
430
+ }
431
+
432
+ html.dark .hero-btn-primary {
433
+ background: #ffffff;
434
+ color: #000000;
435
+ }
436
+
437
+ .hero-btn-primary:hover {
438
+ transform: translateY(-2px);
439
+ box-shadow: 0 8px 20px rgba(0, 0, 0, 0.2);
440
+ }
441
+
442
+ html.dark .hero-btn-primary:hover {
443
+ box-shadow: 0 8px 20px rgba(255, 255, 255, 0.15);
444
+ }
445
+
446
+ .hero-btn-secondary {
447
+ background: transparent;
448
+ color: var(--text-color);
449
+ border: 1px solid var(--border-color);
450
+ }
451
+
452
+ .hero-btn-secondary:hover {
453
+ border-color: var(--text-muted);
454
+ background: var(--sidebar-bg);
455
+ }
456
+
457
+ .hero-btn-secondary code {
458
+ font-family: ui-monospace, SFMono-Regular, 'SF Mono', Menlo, Monaco, Consolas, monospace;
459
+ font-size: 0.9em;
460
+ opacity: 0.8;
461
+ }
462
+
463
+ .hero-features {
464
+ display: flex;
465
+ flex-wrap: wrap;
466
+ justify-content: center;
467
+ gap: 3rem;
468
+ color: var(--text-muted);
469
+ font-size: 1rem;
470
+ margin-top: 1rem;
471
+ }
472
+
473
+ .hero-feature {
474
+ display: flex;
475
+ align-items: center;
476
+ gap: 0.75rem;
477
+ font-weight: 500;
478
+ }
479
+
480
+ .hero-feature-icon {
481
+ width: 24px;
482
+ height: 24px;
483
+ color: var(--primary-color);
484
+ opacity: 0.9;
485
+ }
486
+
487
+ /* ===========================================
488
+ Features Section
489
+ =========================================== */
490
+
491
+ .features-section {
492
+ padding: 6rem 0;
493
+ position: relative;
494
+ }
495
+
496
+ .features-grid {
497
+ display: grid;
498
+ grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
499
+ gap: 2rem;
500
+ }
501
+
502
+ .feature-card {
503
+ padding: 2rem;
504
+ background: var(--sidebar-bg);
505
+ border: 1px solid var(--border-color);
506
+ border-radius: 1rem;
507
+ transition: all 0.3s cubic-bezier(0.25, 0.46, 0.45, 0.94);
508
+ height: 100%;
509
+ display: flex;
510
+ flex-direction: column;
511
+ }
512
+
513
+ /* Subtle transparent bg for modern feel */
514
+ html.dark .feature-card {
515
+ background: rgba(255, 255, 255, 0.03);
516
+ border-color: rgba(255, 255, 255, 0.05);
517
+ }
518
+
519
+ .feature-card:hover {
520
+ transform: translateY(-4px);
521
+ border-color: var(--primary-color);
522
+ box-shadow: 0 20px 40px -10px rgba(0, 0, 0, 0.1);
523
+ }
524
+
525
+ html.dark .feature-card:hover {
526
+ box-shadow: 0 20px 40px -10px rgba(0, 0, 0, 0.3);
527
+ background: rgba(255, 255, 255, 0.05);
528
+ }
529
+
530
+ .feature-icon {
531
+ width: 48px;
532
+ height: 48px;
533
+ margin-bottom: 1.5rem;
534
+ color: var(--primary-color);
535
+ padding: 10px;
536
+ background: rgba(99, 102, 241, 0.1);
537
+ border-radius: 12px;
538
+ }
539
+
540
+ .feature-title {
541
+ font-size: 1.25rem;
542
+ font-weight: 600;
543
+ margin: 0 0 0.75rem;
544
+ color: var(--text-color);
545
+ letter-spacing: -0.01em;
546
+ }
547
+
548
+ .feature-description {
549
+ font-size: 1rem;
550
+ color: var(--text-muted);
551
+ margin: 0;
552
+ line-height: 1.6;
553
+ }
554
+
555
+ /* ===========================================
556
+ Stats Section
557
+ =========================================== */
558
+
559
+ .stats-section {
560
+ padding: 6rem 0;
561
+ background: linear-gradient(180deg, transparent 0%, var(--sidebar-bg) 50%, transparent 100%);
562
+ }
563
+
564
+ .stats-grid {
565
+ display: grid;
566
+ grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
567
+ gap: 3rem;
568
+ text-align: center;
569
+ max-width: 1000px;
570
+ margin: 0 auto;
571
+ }
572
+
573
+ .stat-item {
574
+ display: flex;
575
+ flex-direction: column;
576
+ align-items: center;
577
+ position: relative;
578
+ }
579
+
580
+ /* Separator line between stats on desktop */
581
+ @media (min-width: 768px) {
582
+ .stat-item:not(:last-child)::after {
583
+ content: '';
584
+ position: absolute;
585
+ right: -1.5rem;
586
+ top: 20%;
587
+ height: 60%;
588
+ width: 1px;
589
+ background: var(--border-color);
590
+ opacity: 0.5;
591
+ }
592
+ }
593
+
594
+ .stat-value {
595
+ font-size: 3.5rem;
596
+ font-weight: 800;
597
+ line-height: 1;
598
+ margin-bottom: 0.5rem;
599
+ background: linear-gradient(135deg, var(--text-color) 0%, var(--text-muted) 100%);
600
+ -webkit-background-clip: text;
601
+ background-clip: text;
602
+ -webkit-text-fill-color: transparent;
603
+ letter-spacing: -0.02em;
604
+ }
605
+
606
+ html.dark .stat-value {
607
+ background: linear-gradient(135deg, #fff 0%, #a1a1aa 100%);
608
+ -webkit-background-clip: text;
609
+ background-clip: text;
610
+ -webkit-text-fill-color: transparent;
611
+ }
612
+
613
+ .stat-label {
614
+ font-size: 0.875rem;
615
+ font-weight: 600;
616
+ text-transform: uppercase;
617
+ letter-spacing: 0.1em;
618
+ color: var(--primary-color);
619
+ }
620
+
621
+ /* ===========================================
622
+ Code Example Section
623
+ =========================================== */
624
+
625
+ .code-section {
626
+ padding: 6rem 0;
627
+ }
628
+
629
+ .code-section-header {
630
+ text-align: center;
631
+ margin-bottom: 3rem;
632
+ max-width: 600px;
633
+ margin-left: auto;
634
+ margin-right: auto;
635
+ }
636
+
637
+ .code-section-title {
638
+ font-size: 2.25rem;
639
+ font-weight: 700;
640
+ margin: 0 0 1rem;
641
+ letter-spacing: -0.02em;
642
+ }
643
+
644
+ .code-section-subtitle {
645
+ font-size: 1.125rem;
646
+ color: var(--text-muted);
647
+ margin: 0;
648
+ line-height: 1.6;
649
+ }
650
+
651
+ .code-tabs {
652
+ display: flex;
653
+ justify-content: center;
654
+ gap: 0.5rem;
655
+ margin-bottom: 1.5rem;
656
+ }
657
+
658
+ .code-tab {
659
+ padding: 0.5rem 1rem;
660
+ background: transparent;
661
+ border: 1px solid transparent;
662
+ border-radius: 6px;
663
+ color: var(--text-muted);
664
+ cursor: pointer;
665
+ font-size: 0.875rem;
666
+ font-weight: 500;
667
+ transition: all 0.2s;
668
+ }
669
+
670
+ .code-tab:hover {
671
+ color: var(--text-color);
672
+ background: var(--sidebar-bg);
673
+ }
674
+
675
+ .code-tab.active {
676
+ background: var(--sidebar-bg);
677
+ color: var(--primary-color);
678
+ box-shadow: 0 1px 2px rgba(0,0,0,0.05);
679
+ border: 1px solid var(--border-color);
680
+ }
681
+
682
+ .code-tab.active {
683
+ background: var(--primary-color);
684
+ border-color: var(--primary-color);
685
+ color: var(--bg-color);
686
+ }
687
+
688
+ /* ===========================================
689
+ CTA Section
690
+ =========================================== */
691
+
692
+ .cta-section {
693
+ padding: 4rem 0;
694
+ text-align: center;
695
+ }
696
+
697
+ .cta-title {
698
+ font-size: 2rem;
699
+ font-weight: 700;
700
+ margin: 0 0 1rem;
701
+ }
702
+
703
+ .cta-subtitle {
704
+ font-size: 1.125rem;
705
+ color: var(--text-muted);
706
+ margin: 0 0 2rem;
707
+ max-width: 500px;
708
+ margin-left: auto;
709
+ margin-right: auto;
710
+ }
711
+
712
+ /* ===========================================
713
+ Hydration Strategies & Ecosystem
714
+ =========================================== */
715
+
716
+ .strategy-grid {
717
+ display: grid;
718
+ grid-template-columns: repeat(auto-fit, minmax(240px, 1fr));
719
+ gap: 1.5rem;
720
+ margin-top: 3rem;
721
+ }
722
+
723
+ .strategy-card {
724
+ padding: 1.5rem;
725
+ background: var(--sidebar-bg);
726
+ border: 1px solid var(--border-color);
727
+ border-radius: 1rem;
728
+ text-align: left;
729
+ }
730
+
731
+ .strategy-badge {
732
+ display: inline-block;
733
+ padding: 0.25rem 0.625rem;
734
+ border-radius: 4px;
735
+ font-size: 0.75rem;
736
+ font-weight: 700;
737
+ font-family: ui-monospace, monospace;
738
+ margin-bottom: 1rem;
739
+ background: #4338ca; /* Indigo 700 - contrast ratio ~7:1 with white */
740
+ color: white;
741
+ }
742
+
743
+ .ecosystem-section {
744
+ padding: 6rem 0;
745
+ border-top: 1px solid var(--border-color);
746
+ }
747
+
748
+ .ecosystem-grid {
749
+ display: grid;
750
+ grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
751
+ gap: 2rem;
752
+ }
753
+
754
+ .ecosystem-card {
755
+ padding: 2.5rem;
756
+ background: linear-gradient(135deg, var(--sidebar-bg) 0%, transparent 100%);
757
+ border: 1px solid var(--border-color);
758
+ border-radius: 1.5rem;
759
+ transition: all 0.3s ease;
760
+ }
761
+
762
+ .ecosystem-card:hover {
763
+ border-color: var(--primary-color);
764
+ transform: scale(1.02);
765
+ }
766
+
767
+ .ecosystem-tag {
768
+ color: var(--primary-color);
769
+ font-weight: 700;
770
+ font-size: 0.875rem;
771
+ text-transform: uppercase;
772
+ letter-spacing: 0.1em;
773
+ margin-bottom: 0.5rem;
774
+ display: block;
775
+ }
776
+
777
+ /* Home Page Responsive Updates */
778
+ @media (max-width: 768px) {
779
+ .hero {
780
+ padding: 6rem 0 4rem;
781
+ }
782
+ .hero-title {
783
+ font-size: 3rem;
784
+ }
785
+ .strategy-grid, .ecosystem-grid {
786
+ grid-template-columns: 1fr;
787
+ }
788
+ }
789
+
790
+ /* Sidebar */
791
+ .sidebar {
792
+ position: fixed;
793
+ left: 0;
794
+ top: 60px;
795
+ width: 260px;
796
+ height: calc(100vh - 60px);
797
+ background: var(--sidebar-bg);
798
+ border-right: 1px solid var(--border-color);
799
+ display: flex;
800
+ flex-direction: column;
801
+ transition: width 0.2s ease;
802
+ z-index: 10;
803
+ }
804
+ .sidebar-collapsed .sidebar {
805
+ width: 32px;
806
+ }
807
+ .sidebar-content {
808
+ flex: 1;
809
+ padding: 1rem 1.5rem;
810
+ overflow-y: auto;
811
+ }
812
+ .sidebar-collapse-btn {
813
+ display: flex;
814
+ align-items: center;
815
+ justify-content: center;
816
+ padding: 0.75rem;
817
+ border: none;
818
+ border-top: 1px solid var(--border-color);
819
+ background: transparent;
820
+ cursor: pointer;
821
+ color: var(--text-color);
822
+ opacity: 0.6;
823
+ transition: opacity 0.2s;
824
+ margin-top: auto;
825
+ }
826
+ .sidebar-collapse-btn:hover { opacity: 1; }
827
+ .collapse-icon::before {
828
+ content: '«';
829
+ font-size: 1.25rem;
830
+ font-weight: bold;
831
+ }
832
+ .sidebar-collapsed .sidebar-content { display: none; }
833
+ .sidebar-collapsed .sidebar .collapse-icon::before { content: '»'; }
834
+
835
+ .sidebar-group { margin-bottom: 1rem; }
836
+ .sidebar-group-title {
837
+ font-weight: 600;
838
+ margin-bottom: 0.5rem;
839
+ color: var(--text-color);
840
+ font-size: 0.875rem;
841
+ text-transform: uppercase;
842
+ letter-spacing: 0.05em;
843
+ }
844
+ .sidebar-items { list-style: none; margin: 0; padding: 0; }
845
+ .sidebar-items-inner { list-style: none; margin: 0; padding: 0; }
846
+ .sidebar-nested-group { list-style: none; }
847
+ .sidebar-link {
848
+ display: block;
849
+ padding: 0.5rem 0.75rem;
850
+ color: var(--sidebar-link-color);
851
+ text-decoration: none;
852
+ font-size: 0.9375rem;
853
+ border-radius: 0.375rem;
854
+ border-left: 2px solid transparent;
855
+ transition: all 0.15s ease;
856
+ }
857
+ .sidebar-link:hover {
858
+ background-color: rgba(56, 189, 248, 0.08);
859
+ color: var(--primary-color);
860
+ border-left-color: var(--primary-color);
861
+ }
862
+ .sidebar-link.active {
863
+ color: var(--primary-color);
864
+ background-color: rgba(56, 189, 248, 0.1);
865
+ border-left-color: var(--primary-color);
866
+ /* Subtle shadow to bottom-right */
867
+ box-shadow: 1px 1px 3px rgba(56, 189, 248, 0.2);
868
+ }
869
+
870
+ /* Collapsible sidebar groups - Docusaurus style */
871
+ .sidebar-collapse {
872
+ border: none;
873
+ margin-bottom: 0.25rem;
874
+ }
875
+ .sidebar-collapse summary {
876
+ cursor: pointer;
877
+ list-style: none;
878
+ display: flex;
879
+ align-items: center;
880
+ justify-content: space-between;
881
+ padding: 0.5rem 0.75rem;
882
+ border-radius: 0.375rem;
883
+ transition: background-color 0.15s;
884
+ }
885
+ .sidebar-collapse summary:hover {
886
+ background-color: rgba(56, 189, 248, 0.08);
887
+ }
888
+ .sidebar-collapse summary:hover .sidebar-group-link {
889
+ color: var(--primary-color);
890
+ }
891
+ .sidebar-collapse summary:hover .sidebar-chevron {
892
+ color: var(--primary-color);
893
+ }
894
+ .sidebar-collapse summary::-webkit-details-marker { display: none; }
895
+ .sidebar-group-link {
896
+ color: var(--sidebar-link-color);
897
+ text-decoration: none;
898
+ font-weight: 500;
899
+ font-size: 0.9375rem;
900
+ flex: 1;
901
+ transition: color 0.15s ease;
902
+ }
903
+ .sidebar-group-link.active {
904
+ color: var(--primary-color);
905
+ }
906
+ .sidebar-chevron {
907
+ width: 24px;
908
+ height: 24px;
909
+ display: flex;
910
+ align-items: center;
911
+ justify-content: center;
912
+ color: var(--nav-link-color);
913
+ transition: transform 0.2s;
914
+ flex-shrink: 0;
915
+ }
916
+ .sidebar-chevron::before {
917
+ content: '';
918
+ width: 0;
919
+ height: 0;
920
+ border-top: 5px solid transparent;
921
+ border-bottom: 5px solid transparent;
922
+ border-left: 6px solid currentColor;
923
+ }
924
+ .sidebar-collapse .sidebar-chevron {
925
+ transition: transform 0.2s ease;
926
+ }
927
+ .sidebar-collapse[open] > summary > .sidebar-chevron {
928
+ transform: rotate(90deg);
929
+ }
930
+ .sidebar-collapse.closing > summary > .sidebar-chevron {
931
+ transform: rotate(0deg);
932
+ }
933
+ .sidebar-collapse .sidebar-items {
934
+ display: grid;
935
+ grid-template-rows: 0fr;
936
+ transition: grid-template-rows 0.2s ease;
937
+ }
938
+ .sidebar-collapse[open] > .sidebar-items {
939
+ grid-template-rows: 1fr;
940
+ }
941
+ .sidebar-collapse.closing > .sidebar-items {
942
+ grid-template-rows: 0fr;
943
+ }
944
+ .sidebar-collapse .sidebar-items-inner {
945
+ overflow: hidden;
946
+ padding-left: 1rem;
947
+ }
948
+
949
+ /* Breadcrumb */
950
+ .breadcrumb {
951
+ display: flex;
952
+ align-items: center;
953
+ flex-wrap: wrap;
954
+ gap: 0.25rem;
955
+ font-size: 0.875rem;
956
+ color: var(--text-muted);
957
+ margin-bottom: 1rem;
958
+ }
959
+ .breadcrumb-link {
960
+ color: var(--text-muted);
961
+ text-decoration: none;
962
+ transition: color 0.15s;
963
+ }
964
+ .breadcrumb-link:hover { color: var(--primary-color); }
965
+ .breadcrumb-separator {
966
+ color: var(--text-muted);
967
+ opacity: 0.5;
968
+ margin: 0 0.25rem;
969
+ }
970
+ .breadcrumb-current { color: var(--text-color); }
971
+
972
+ /* Main Content */
973
+ .doc-main { flex: 1; padding: 2rem; max-width: 800px; margin-left: 260px; margin-right: 220px; overflow-x: hidden; }
974
+ .sidebar-collapsed .doc-main { margin-left: 32px; }
975
+ .toc-collapsed .doc-main { margin-right: 32px; }
976
+ .sidebar-collapsed.toc-collapsed .doc-main { margin-left: auto; margin-right: auto; padding-left: 48px; padding-right: 48px; }
977
+ .doc-content { line-height: 1.7; overflow-x: hidden; }
978
+
979
+ /* Typography */
980
+ .heading { margin: 1.5rem 0 1rem; font-weight: 600; }
981
+ .heading-1 { font-size: 2rem; border-bottom: 1px solid var(--border-color); padding-bottom: 0.5rem; }
982
+ .heading-2 { font-size: 1.5rem; }
983
+ .heading-3 { font-size: 1.25rem; }
984
+
985
+ p { margin: 1rem 0; }
986
+
987
+ /* ===========================================
988
+ Links & Buttons (Global)
989
+ =========================================== */
990
+
991
+ a {
992
+ color: var(--primary-color);
993
+ text-decoration: none;
994
+ transition: color 0.15s ease;
995
+ }
996
+
997
+ a:hover {
998
+ color: var(--secondary-color);
999
+ }
1000
+
1001
+ /* Markdown body links - more prominent */
1002
+ .markdown-body a {
1003
+ color: var(--primary-color);
1004
+ text-decoration: underline;
1005
+ text-decoration-color: rgba(56, 189, 248, 0.3);
1006
+ text-underline-offset: 2px;
1007
+ transition: color 0.15s ease, text-decoration-color 0.15s ease;
1008
+ }
1009
+
1010
+ .markdown-body a:hover {
1011
+ color: var(--secondary-color);
1012
+ text-decoration-color: var(--secondary-color);
1013
+ }
1014
+
1015
+ /* External link indicator */
1016
+ .markdown-body a[href^="http"]:not([href*="luna"])::after {
1017
+ content: "↗";
1018
+ font-size: 0.75em;
1019
+ margin-left: 0.25em;
1020
+ opacity: 0.6;
1021
+ }
1022
+
1023
+ /* Button base styles */
1024
+ .btn {
1025
+ display: inline-flex;
1026
+ align-items: center;
1027
+ justify-content: center;
1028
+ gap: 0.5rem;
1029
+ padding: 0.625rem 1.25rem;
1030
+ font-size: 0.9375rem;
1031
+ font-weight: 500;
1032
+ text-decoration: none;
1033
+ border-radius: 0.5rem;
1034
+ border: 1px solid transparent;
1035
+ cursor: pointer;
1036
+ transition: all 0.2s ease;
1037
+ }
1038
+
1039
+ .btn:hover {
1040
+ transform: translateY(-1px);
1041
+ }
1042
+
1043
+ .btn-primary {
1044
+ background: var(--primary-color);
1045
+ color: #0a0a0a;
1046
+ border-color: var(--primary-color);
1047
+ }
1048
+
1049
+ .btn-primary:hover {
1050
+ background: #22d3ee;
1051
+ border-color: #22d3ee;
1052
+ box-shadow: 0 4px 12px rgba(56, 189, 248, 0.3);
1053
+ }
1054
+
1055
+ .btn-secondary {
1056
+ background: transparent;
1057
+ color: var(--text-color);
1058
+ border-color: var(--border-color);
1059
+ }
1060
+
1061
+ .btn-secondary:hover {
1062
+ border-color: var(--primary-color);
1063
+ color: var(--primary-color);
1064
+ background: rgba(56, 189, 248, 0.05);
1065
+ }
1066
+
1067
+ .btn-accent {
1068
+ background: var(--accent-color);
1069
+ color: #0a0a0a;
1070
+ border-color: var(--accent-color);
1071
+ }
1072
+
1073
+ .btn-accent:hover {
1074
+ background: #f59e0b;
1075
+ border-color: #f59e0b;
1076
+ box-shadow: 0 4px 12px rgba(251, 191, 36, 0.3);
1077
+ }
1078
+
1079
+ .btn-sm {
1080
+ padding: 0.375rem 0.75rem;
1081
+ font-size: 0.8125rem;
1082
+ }
1083
+
1084
+ .btn-lg {
1085
+ padding: 0.875rem 1.75rem;
1086
+ font-size: 1rem;
1087
+ }
1088
+
1089
+ /* ===========================================
1090
+ Markdown Headings - Decorated
1091
+ =========================================== */
1092
+
1093
+ .markdown-body h1 {
1094
+ font-size: 2rem;
1095
+ font-weight: 700;
1096
+ margin: 2rem 0 1rem;
1097
+ padding-bottom: 0.5rem;
1098
+ border-bottom: 2px solid var(--border-color);
1099
+ position: relative;
1100
+ }
1101
+
1102
+ /* Gradient accent line under h1 */
1103
+ .markdown-body h1::after {
1104
+ content: '';
1105
+ position: absolute;
1106
+ bottom: -2px;
1107
+ left: 0;
1108
+ width: 80px;
1109
+ height: 2px;
1110
+ background: linear-gradient(90deg, var(--primary-color), var(--secondary-color));
1111
+ }
1112
+
1113
+ .markdown-body h2 {
1114
+ font-size: 1.5rem;
1115
+ font-weight: 600;
1116
+ margin: 2.5rem 0 1rem;
1117
+ padding-left: 0.75rem;
1118
+ border-left: 3px solid var(--primary-color);
1119
+ background: linear-gradient(90deg, rgba(56, 189, 248, 0.08) 0%, transparent 100%);
1120
+ padding-top: 0.25rem;
1121
+ padding-bottom: 0.25rem;
1122
+ }
1123
+
1124
+ .markdown-body h3 {
1125
+ font-size: 1.25rem;
1126
+ font-weight: 600;
1127
+ margin: 2rem 0 0.75rem;
1128
+ color: var(--text-color);
1129
+ position: relative;
1130
+ padding-left: 1rem;
1131
+ }
1132
+
1133
+ /* Dot accent before h3 */
1134
+ .markdown-body h3::before {
1135
+ content: '';
1136
+ position: absolute;
1137
+ left: 0;
1138
+ top: 50%;
1139
+ transform: translateY(-50%);
1140
+ width: 6px;
1141
+ height: 6px;
1142
+ background: var(--accent-color);
1143
+ border-radius: 50%;
1144
+ }
1145
+
1146
+ .markdown-body h4 {
1147
+ font-size: 1.125rem;
1148
+ font-weight: 600;
1149
+ margin: 1.5rem 0 0.5rem;
1150
+ color: var(--text-muted);
1151
+ }
1152
+
1153
+ /* ===========================================
1154
+ Markdown Lists - Minimal
1155
+ =========================================== */
1156
+
1157
+ .markdown-body ul,
1158
+ .markdown-body ol {
1159
+ padding-left: 1.5rem;
1160
+ margin: 1rem 0;
1161
+ }
1162
+
1163
+ .markdown-body li {
1164
+ margin: 0.375rem 0;
1165
+ }
1166
+
1167
+ /* Colored bullets */
1168
+ .markdown-body ul {
1169
+ list-style: none;
1170
+ }
1171
+
1172
+ .markdown-body ul > li {
1173
+ position: relative;
1174
+ padding-left: 1rem;
1175
+ }
1176
+
1177
+ .markdown-body ul > li::before {
1178
+ content: '';
1179
+ position: absolute;
1180
+ left: 0;
1181
+ top: 0.6em;
1182
+ width: 5px;
1183
+ height: 5px;
1184
+ background: var(--primary-color);
1185
+ border-radius: 50%;
1186
+ }
1187
+
1188
+ /* Nested list - hollow bullet */
1189
+ .markdown-body ul ul > li::before {
1190
+ background: transparent;
1191
+ border: 1.5px solid var(--primary-color);
1192
+ }
1193
+
1194
+ /* Numbered list - just color the numbers */
1195
+ .markdown-body ol {
1196
+ list-style: decimal;
1197
+ }
1198
+
1199
+ .markdown-body ol li::marker {
1200
+ color: var(--primary-color);
1201
+ font-weight: 500;
1202
+ }
1203
+
1204
+ /* Strong text in list items */
1205
+ .markdown-body li strong {
1206
+ color: var(--primary-color);
1207
+ }
1208
+
1209
+ /* Tables in markdown content */
1210
+ .markdown-body table {
1211
+ width: 100%;
1212
+ border-collapse: collapse;
1213
+ margin: 1.5rem 0;
1214
+ font-size: 0.9375rem;
1215
+ }
1216
+
1217
+ .markdown-body table th,
1218
+ .markdown-body table td {
1219
+ padding: 0.75rem 1rem;
1220
+ text-align: left;
1221
+ border: 1px solid var(--border-color);
1222
+ }
1223
+
1224
+ .markdown-body table th {
1225
+ background: var(--sidebar-bg);
1226
+ font-weight: 600;
1227
+ color: var(--text-color);
1228
+ }
1229
+
1230
+ .markdown-body table td {
1231
+ background: var(--bg-color);
1232
+ }
1233
+
1234
+ /* Alternating row colors */
1235
+ .markdown-body table tbody tr:nth-child(even) td {
1236
+ background: var(--sidebar-bg);
1237
+ }
1238
+
1239
+ /* Blockquotes */
1240
+ .markdown-body blockquote {
1241
+ margin: 1.5rem 0;
1242
+ padding: 1rem 1.5rem;
1243
+ border-left: 4px solid var(--primary-color);
1244
+ background: var(--sidebar-bg);
1245
+ color: var(--text-muted);
1246
+ border-radius: 0 0.5rem 0.5rem 0;
1247
+ }
1248
+
1249
+ .markdown-body blockquote p {
1250
+ margin: 0;
1251
+ }
1252
+
1253
+ .markdown-body blockquote p + p {
1254
+ margin-top: 0.75rem;
1255
+ }
1256
+
1257
+ /* Horizontal rule */
1258
+ .markdown-body hr {
1259
+ border: none;
1260
+ height: 1px;
1261
+ background: var(--border-color);
1262
+ margin: 2rem 0;
1263
+ }
1264
+
1265
+ /* Images */
1266
+ .markdown-body img {
1267
+ max-width: 100%;
1268
+ height: auto;
1269
+ border-radius: 0.5rem;
1270
+ margin: 1rem 0;
1271
+ }
1272
+
1273
+ /* Markdown body container */
1274
+ .markdown-body {
1275
+ box-sizing: border-box;
1276
+ min-width: 200px;
1277
+ max-width: 980px;
1278
+ margin: 0 auto;
1279
+ overflow-wrap: break-word;
1280
+ word-wrap: break-word;
1281
+ }
1282
+
1283
+ /* ===========================================
1284
+ Code Blocks & Inline Code
1285
+ =========================================== */
1286
+
1287
+ /* Inline code */
1288
+ code {
1289
+ font-family: ui-monospace, SFMono-Regular, 'SF Mono', Menlo, Monaco, Consolas, monospace;
1290
+ font-size: 0.875em;
1291
+ background: var(--code-bg);
1292
+ padding: 0.2em 0.4em;
1293
+ border-radius: 6px;
1294
+ color: var(--primary-color);
1295
+ font-weight: 500;
1296
+ border: 1px solid rgba(0,0,0,0.05);
1297
+ }
1298
+
1299
+ html.dark code {
1300
+ border-color: rgba(255,255,255,0.1);
1301
+ color: #a5b4fc;
1302
+ }
1303
+
1304
+ /* Code inside links */
1305
+ a code {
1306
+ color: inherit;
1307
+ border-color: transparent;
1308
+ }
1309
+
1310
+ /* Code blocks */
1311
+ pre {
1312
+ font-family: ui-monospace, SFMono-Regular, 'SF Mono', Menlo, Monaco, Consolas, monospace;
1313
+ font-size: 0.9rem;
1314
+ line-height: 1.7;
1315
+ background: var(--code-bg);
1316
+ border: 1px solid var(--border-color);
1317
+ border-radius: 0.75rem;
1318
+ padding: 1.25rem;
1319
+ overflow-x: auto;
1320
+ margin: 1.5rem 0;
1321
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.05);
1322
+ }
1323
+
1324
+ pre code {
1325
+ background: none;
1326
+ padding: 0;
1327
+ font-size: inherit;
1328
+ border-radius: 0;
1329
+ color: inherit;
1330
+ border: none;
1331
+ font-weight: 400;
1332
+ }
1333
+
1334
+ /* Syntax highlighting enhancements */
1335
+ pre .comment { color: #6b7280; font-style: italic; }
1336
+ pre .keyword { color: #c084fc; } /* Purple */
1337
+ pre .string { color: #4ade80; } /* Green */
1338
+ pre .number { color: #fbbf24; } /* Amber */
1339
+ pre .function { color: #60a5fa; } /* Blue */
1340
+ pre .class-name { color: #f472b6; } /* Pink */
1341
+ pre .operator { color: #94a3b8; }
1342
+ pre .punctuation { color: #94a3b8; }
1343
+
1344
+ /* Dark mode syntax colors (adjustments if needed) */
1345
+ html.dark pre .comment { color: #6b7280; }
1346
+ html.dark pre .keyword { color: #c084fc; }
1347
+ html.dark pre .string { color: #4ade80; }
1348
+ html.dark pre .number { color: #fbbf24; }
1349
+ html.dark pre .function { color: #60a5fa; }
1350
+
1351
+ /* Code block with header (language label) */
1352
+ .code-block {
1353
+ position: relative;
1354
+ margin: 1.5rem 0;
1355
+ border: 1px solid var(--border-color);
1356
+ border-radius: 0.75rem;
1357
+ background: var(--code-bg);
1358
+ overflow: hidden;
1359
+ }
1360
+
1361
+ .code-block-header {
1362
+ display: flex;
1363
+ justify-content: space-between;
1364
+ align-items: center;
1365
+ padding: 0.5rem 1rem;
1366
+ background: rgba(0,0,0,0.03);
1367
+ border-bottom: 1px solid var(--border-color);
1368
+ font-size: 0.75rem;
1369
+ font-weight: 600;
1370
+ color: var(--text-muted);
1371
+ text-transform: uppercase;
1372
+ letter-spacing: 0.05em;
1373
+ }
1374
+
1375
+ html.dark .code-block-header {
1376
+ background: rgba(255,255,255,0.03);
1377
+ }
1378
+
1379
+ .code-block pre {
1380
+ margin: 0;
1381
+ border: none;
1382
+ border-radius: 0;
1383
+ background: transparent;
1384
+ box-shadow: none;
1385
+ }
1386
+
1387
+ /* Copy button for code blocks */
1388
+ .code-copy-btn {
1389
+ padding: 0.375rem 0.75rem;
1390
+ background: transparent;
1391
+ border: 1px solid transparent;
1392
+ border-radius: 6px;
1393
+ font-size: 0.75rem;
1394
+ color: var(--text-muted);
1395
+ cursor: pointer;
1396
+ transition: all 0.2s ease;
1397
+ }
1398
+
1399
+ .code-copy-btn:hover {
1400
+ background: rgba(255,255,255,0.1);
1401
+ color: var(--text-color);
1402
+ }
1403
+
1404
+ .code-copy-btn.copied {
1405
+ color: #4ade80;
1406
+ }
1407
+
1408
+ /* Markdown body code specifics */
1409
+ .markdown-body pre {
1410
+ overflow-x: auto;
1411
+ max-width: 100%;
1412
+ }
1413
+
1414
+ .markdown-body code {
1415
+ background: var(--code-bg);
1416
+ padding: 0.2em 0.4em;
1417
+ border-radius: 4px;
1418
+ }
1419
+
1420
+ .markdown-body pre code {
1421
+ background: none;
1422
+ padding: 0;
1423
+ }
1424
+
1425
+ /* TOC */
1426
+ .toc {
1427
+ position: fixed;
1428
+ right: 0;
1429
+ top: 60px;
1430
+ width: 240px;
1431
+ height: calc(100vh - 60px);
1432
+ display: flex;
1433
+ flex-direction: column;
1434
+ border-left: 1px solid var(--border-color);
1435
+ background: var(--bg-color);
1436
+ transition: width 0.2s ease;
1437
+ z-index: 90;
1438
+ }
1439
+ .toc-collapsed .toc {
1440
+ width: 32px;
1441
+ }
1442
+ .toc-content {
1443
+ flex: 1;
1444
+ padding: 1.5rem;
1445
+ overflow-y: auto;
1446
+ }
1447
+ .toc-collapse-btn {
1448
+ display: flex;
1449
+ align-items: center;
1450
+ justify-content: center;
1451
+ padding: 0.75rem;
1452
+ border: none;
1453
+ border-top: 1px solid var(--border-color);
1454
+ background: transparent;
1455
+ cursor: pointer;
1456
+ color: var(--text-color);
1457
+ opacity: 0.6;
1458
+ transition: opacity 0.2s;
1459
+ margin-top: auto;
1460
+ }
1461
+ .toc-collapse-btn:hover { opacity: 1; }
1462
+ .toc-collapse-icon::before { content: '»'; font-size: 1.25rem; font-weight: bold; }
1463
+ .toc-collapsed .toc-content { display: none; }
1464
+ .toc-collapsed .toc-collapse-icon::before { content: '«'; }
1465
+ .toc-title { font-weight: 600; margin-bottom: 1rem; font-size: 0.75rem; text-transform: uppercase; letter-spacing: 0.05em; color: var(--text-muted); }
1466
+ .toc-list { list-style: none; font-size: 0.85rem; }
1467
+ .toc-item { padding: 0.375rem 0; position: relative; }
1468
+ .toc-item a { color: var(--text-muted); text-decoration: none; transition: color 0.15s; display: block; }
1469
+ .toc-item a:hover { color: var(--text-color); }
1470
+ .toc-item a.active { color: var(--primary-color); font-weight: 500; }
1471
+ .toc-level-3 { padding-left: 1rem; }
1472
+ .toc-level-4 { padding-left: 2rem; }
1473
+
1474
+ /* Prev/Next */
1475
+ .prev-next {
1476
+ display: flex;
1477
+ justify-content: space-between;
1478
+ margin-top: 4rem;
1479
+ padding-top: 2rem;
1480
+ border-top: 1px solid var(--border-color);
1481
+ }
1482
+
1483
+ .prev-link, .next-link {
1484
+ display: flex;
1485
+ flex-direction: column;
1486
+ text-decoration: none;
1487
+ max-width: 45%;
1488
+ }
1489
+
1490
+ .prev-link .label, .next-link .label { font-size: 0.75rem; color: var(--text-muted); text-transform: uppercase; letter-spacing: 0.05em; margin-bottom: 0.5rem; }
1491
+ .prev-link .title, .next-link .title { color: var(--primary-color); font-weight: 600; font-size: 1.1rem; transition: color 0.15s ease; }
1492
+ .prev-link:hover .title, .next-link:hover .title { color: var(--secondary-color); text-decoration: underline; text-decoration-thickness: 1px; text-underline-offset: 4px; }
1493
+ .next-link { text-align: right; margin-left: auto; }
1494
+
1495
+ /* ===========================================
1496
+ Enhanced Hover Effects (Global)
1497
+ =========================================== */
1498
+
1499
+ /* Card hover glow effect */
1500
+ .feature-card,
1501
+ .blog-card,
1502
+ .stat-item {
1503
+ transition: transform 0.3s cubic-bezier(0.25, 0.8, 0.25, 1), border-color 0.3s ease, box-shadow 0.3s ease;
1504
+ }
1505
+
1506
+ .feature-card:hover,
1507
+ .blog-card:hover {
1508
+ box-shadow: 0 12px 30px rgba(0, 0, 0, 0.07);
1509
+ }
1510
+
1511
+ html.dark .feature-card:hover,
1512
+ html.dark .blog-card:hover {
1513
+ box-shadow: 0 12px 30px rgba(0, 0, 0, 0.2);
1514
+ }
1515
+
1516
+ /* Navigation link underline animation */
1517
+ .nav-link {
1518
+ position: relative;
1519
+ }
1520
+
1521
+ .nav-link::after {
1522
+ content: '';
1523
+ position: absolute;
1524
+ bottom: -4px;
1525
+ left: 0;
1526
+ width: 0;
1527
+ height: 2px;
1528
+ background: var(--primary-color);
1529
+ transition: width 0.2s ease;
1530
+ }
1531
+
1532
+ .nav-link:hover::after {
1533
+ width: 100%;
1534
+ }
1535
+
1536
+ /* TOC active indicator */
1537
+ .toc-item a::before {
1538
+ content: '';
1539
+ position: absolute;
1540
+ left: -1rem;
1541
+ top: 50%;
1542
+ transform: translateY(-50%);
1543
+ width: 2px;
1544
+ height: 0;
1545
+ background: var(--primary-color);
1546
+ transition: height 0.15s ease;
1547
+ }
1548
+
1549
+ .toc-item a:hover::before,
1550
+ .toc-item a.active::before {
1551
+ height: 1.2em;
1552
+ }
1553
+
1554
+ /* Table row hover */
1555
+ .markdown-body table tr {
1556
+ transition: background 0.15s ease;
1557
+ }
1558
+
1559
+ .markdown-body table tr:hover {
1560
+ background: var(--sidebar-bg);
1561
+ }
1562
+
1563
+ /* Heading anchor hover effect */
1564
+ .heading {
1565
+ position: relative;
1566
+ }
1567
+
1568
+ .heading:hover::before {
1569
+ content: '#';
1570
+ position: absolute;
1571
+ left: -1.2em;
1572
+ color: var(--primary-color);
1573
+ opacity: 0.3;
1574
+ font-weight: 400;
1575
+ }
1576
+
1577
+ /* Focus visible styles for accessibility */
1578
+ a:focus-visible,
1579
+ button:focus-visible,
1580
+ .btn:focus-visible {
1581
+ outline: 2px solid var(--primary-color);
1582
+ outline-offset: 2px;
1583
+ }
1584
+
1585
+ /* Smooth scroll indicator for scrollable elements */
1586
+ .sidebar-content,
1587
+ .toc-content {
1588
+ scrollbar-width: thin;
1589
+ scrollbar-color: var(--border-color) transparent;
1590
+ }
1591
+
1592
+ .sidebar-content::-webkit-scrollbar,
1593
+ .toc-content::-webkit-scrollbar {
1594
+ width: 4px;
1595
+ }
1596
+
1597
+ .sidebar-content::-webkit-scrollbar-track,
1598
+ .toc-content::-webkit-scrollbar-track {
1599
+ background: transparent;
1600
+ }
1601
+
1602
+ .sidebar-content::-webkit-scrollbar-thumb,
1603
+ .toc-content::-webkit-scrollbar-thumb {
1604
+ background: var(--border-color);
1605
+ border-radius: 2px;
1606
+ }
1607
+
1608
+ .sidebar-content::-webkit-scrollbar-thumb:hover,
1609
+ .toc-content::-webkit-scrollbar-thumb:hover {
1610
+ background: var(--text-muted);
1611
+ }
1612
+
1613
+ /* Subtle animation for hero elements */
1614
+ @keyframes float {
1615
+ 0%, 100% { transform: translateY(0); }
1616
+ 50% { transform: translateY(-6px); }
1617
+ }
1618
+
1619
+ .hero-badge {
1620
+ animation: float 4s ease-in-out infinite;
1621
+ }
1622
+
1623
+ /* Selection colors */
1624
+ ::selection {
1625
+ background: rgba(99, 102, 241, 0.2);
1626
+ color: var(--text-color);
1627
+ }
1628
+
1629
+ html.dark ::selection {
1630
+ background: rgba(99, 102, 241, 0.3);
1631
+ }
1632
+
1633
+ /* Footer */
1634
+ .site-footer {
1635
+ padding: 4rem 2rem 3rem;
1636
+ border-top: 1px solid var(--border-color);
1637
+ color: var(--text-muted);
1638
+ font-size: 0.875rem;
1639
+ background: var(--bg-color); /* Match main bg for cleaner look */
1640
+ }
1641
+ .footer-columns {
1642
+ display: grid;
1643
+ grid-template-columns: repeat(auto-fit, minmax(160px, 1fr));
1644
+ gap: 3rem;
1645
+ max-width: 1200px;
1646
+ margin: 0 auto 3rem;
1647
+ }
1648
+ .footer-column-title {
1649
+ font-size: 0.75rem;
1650
+ font-weight: 600;
1651
+ color: var(--text-color);
1652
+ margin: 0 0 1rem;
1653
+ text-transform: uppercase;
1654
+ letter-spacing: 0.05em;
1655
+ }
1656
+ .footer-links {
1657
+ list-style: none;
1658
+ padding: 0;
1659
+ margin: 0;
1660
+ }
1661
+ .footer-links li { margin: 0.75rem 0; }
1662
+ .footer-link {
1663
+ color: var(--text-muted);
1664
+ text-decoration: none;
1665
+ transition: color 0.2s;
1666
+ }
1667
+ .footer-link:hover { color: var(--primary-color); }
1668
+ .footer-bottom {
1669
+ text-align: center;
1670
+ padding-top: 2rem;
1671
+ border-top: 1px solid var(--border-color);
1672
+ max-width: 1200px;
1673
+ margin: 0 auto;
1674
+ }
1675
+ .footer-message, .footer-copyright { margin: 0.5rem 0; opacity: 0.7; }
1676
+
1677
+ /* Ensure dark mode styles work with system preference */
1678
+ @media (prefers-color-scheme: dark) {
1679
+ :root:not(.light) {
1680
+ --primary-color: #818cf8;
1681
+ --secondary-color: #22d3ee;
1682
+ --accent-color: #fbbf24;
1683
+ --text-color: #ededed;
1684
+ --text-muted: #a1a1aa;
1685
+ --bg-color: #050505;
1686
+ --sidebar-bg: #0a0a0a;
1687
+ --border-color: #262626;
1688
+ --code-bg: #111111;
1689
+ --nav-link-color: #a1a1aa;
1690
+ --sidebar-link-color: #d4d4d4;
1691
+ }
1692
+ }
1693
+
1694
+ /* Mobile Sidebar Dropdown */
1695
+ .mobile-sidebar {
1696
+ display: none;
1697
+ margin-bottom: 1rem;
1698
+ border: 1px solid var(--border-color);
1699
+ border-radius: 8px;
1700
+ background: var(--sidebar-bg);
1701
+ }
1702
+ .mobile-sidebar-trigger {
1703
+ display: flex;
1704
+ justify-content: space-between;
1705
+ align-items: center;
1706
+ padding: 0.75rem 1rem;
1707
+ cursor: pointer;
1708
+ list-style: none;
1709
+ font-weight: 500;
1710
+ }
1711
+ .mobile-sidebar-trigger::-webkit-details-marker { display: none; }
1712
+ .mobile-sidebar-arrow {
1713
+ border-left: 5px solid transparent;
1714
+ border-right: 5px solid transparent;
1715
+ border-top: 6px solid currentColor;
1716
+ transition: transform 0.2s;
1717
+ }
1718
+ .mobile-sidebar[open] .mobile-sidebar-arrow {
1719
+ transform: rotate(180deg);
1720
+ }
1721
+ .mobile-sidebar-content {
1722
+ border-top: 1px solid var(--border-color);
1723
+ padding: 0.5rem 0;
1724
+ max-height: 60vh;
1725
+ overflow-y: auto;
1726
+ }
1727
+ .mobile-sidebar-content .sidebar-collapse { border: none; }
1728
+ .mobile-sidebar-content .sidebar-collapse summary { padding: 0.5rem 1rem; }
1729
+ .mobile-sidebar-content .sidebar-items { padding-left: 1.5rem; }
1730
+
1731
+ /* Responsive */
1732
+ @media (max-width: 960px) {
1733
+ .sidebar-desktop { display: none; }
1734
+ .mobile-sidebar { display: block; }
1735
+ .toc { display: none; }
1736
+ .doc-main { margin-left: 0; margin-right: 0; max-width: none; }
1737
+ }
1738
+
1739
+ @media (max-width: 768px) {
1740
+ .nav-bar { padding: 0.5rem 1rem; }
1741
+ .nav-links { gap: 0.75rem; }
1742
+ .nav-link { display: none; }
1743
+ .lang-switcher { margin-left: 0; }
1744
+ .doc-main { padding: 1rem; max-width: 100%; overflow-x: hidden; }
1745
+ .home-content { padding: 2rem 1rem; max-width: 100%; }
1746
+ .markdown-body { min-width: 0; }
1747
+ }
1748
+
1749
+ @media (max-width: 480px) {
1750
+ .nav-title { font-size: 1rem; }
1751
+ .social-links { gap: 0.25rem; }
1752
+ .theme-toggle { width: 32px; height: 32px; }
1753
+ }
1754
+
1755
+ /* Skeleton loading for Web Components before definition */
1756
+ @keyframes skeleton-shimmer {
1757
+ 0% { background-position: -200% 0; }
1758
+ 100% { background-position: 200% 0; }
1759
+ }
1760
+
1761
+ luna-counter:not(:defined) {
1762
+ display: inline-flex;
1763
+ align-items: center;
1764
+ justify-content: center;
1765
+ gap: 8px;
1766
+ padding: 8px;
1767
+ border: 1px solid var(--border-color);
1768
+ border-radius: 4px;
1769
+ min-width: 120px;
1770
+ min-height: 40px;
1771
+ background: linear-gradient(
1772
+ 90deg,
1773
+ var(--sidebar-bg) 25%,
1774
+ var(--border-color) 50%,
1775
+ var(--sidebar-bg) 75%
1776
+ );
1777
+ background-size: 200% 100%;
1778
+ animation: skeleton-shimmer 1.5s ease-in-out infinite;
1779
+ }
1780
+
1781
+ /* Generic skeleton for any undefined luna-* components (only when empty, not for SSR) */
1782
+ [luna\:wc-url]:not(:defined):empty {
1783
+ display: inline-block;
1784
+ min-height: 2em;
1785
+ background: linear-gradient(
1786
+ 90deg,
1787
+ var(--sidebar-bg) 25%,
1788
+ var(--border-color) 50%,
1789
+ var(--sidebar-bg) 75%
1790
+ );
1791
+ background-size: 200% 100%;
1792
+ animation: skeleton-shimmer 1.5s ease-in-out infinite;
1793
+ border-radius: 4px;
1794
+ }
1795
+
1796
+ /* ===========================================
1797
+ Community Love Section (X Marquee)
1798
+ =========================================== */
1799
+
1800
+ .community-section {
1801
+ padding: 6rem 0;
1802
+ overflow: hidden;
1803
+ background: linear-gradient(180deg, var(--bg-color) 0%, var(--sidebar-bg) 100%);
1804
+ position: relative;
1805
+ }
1806
+
1807
+ .community-header {
1808
+ text-align: center;
1809
+ margin-bottom: 4rem;
1810
+ padding: 0 1rem;
1811
+ }
1812
+
1813
+ .community-title {
1814
+ font-size: 2.25rem;
1815
+ font-weight: 700;
1816
+ margin-bottom: 1rem;
1817
+ letter-spacing: -0.02em;
1818
+ }
1819
+
1820
+ .community-subtitle {
1821
+ font-size: 1.125rem;
1822
+ color: var(--text-muted);
1823
+ max-width: 600px;
1824
+ margin: 0 auto;
1825
+ }
1826
+
1827
+ /* Marquee Container */
1828
+ .marquee-container {
1829
+ display: flex;
1830
+ width: 100%;
1831
+ overflow: hidden;
1832
+ mask-image: linear-gradient(90deg, transparent, #000 10%, #000 90%, transparent);
1833
+ -webkit-mask-image: linear-gradient(90deg, transparent, #000 10%, #000 90%, transparent);
1834
+ }
1835
+
1836
+ .marquee-content {
1837
+ display: flex;
1838
+ gap: 1.5rem;
1839
+ animation: marquee 40s linear infinite;
1840
+ padding: 1rem 0;
1841
+ }
1842
+
1843
+ /* Pause on hover */
1844
+ .marquee-container:hover .marquee-content {
1845
+ animation-play-state: paused;
1846
+ }
1847
+
1848
+ @keyframes marquee {
1849
+ 0% { transform: translateX(0); }
1850
+ 100% { transform: translateX(-50%); }
1851
+ }
1852
+
1853
+ /* Tweet Card */
1854
+ .tweet-card {
1855
+ width: 320px;
1856
+ background: var(--bg-color);
1857
+ border: 1px solid var(--border-color);
1858
+ border-radius: 1rem;
1859
+ padding: 1.5rem;
1860
+ flex-shrink: 0;
1861
+ transition: transform 0.2s, box-shadow 0.2s;
1862
+ cursor: default;
1863
+ }
1864
+
1865
+ html.dark .tweet-card {
1866
+ background: rgba(255, 255, 255, 0.03);
1867
+ backdrop-filter: blur(12px);
1868
+ }
1869
+
1870
+ .tweet-card:hover {
1871
+ transform: translateY(-4px);
1872
+ box-shadow: 0 12px 30px rgba(0, 0, 0, 0.08);
1873
+ border-color: var(--primary-color);
1874
+ }
1875
+
1876
+ .tweet-header {
1877
+ display: flex;
1878
+ align-items: center;
1879
+ gap: 0.75rem;
1880
+ margin-bottom: 1rem;
1881
+ }
1882
+
1883
+ .tweet-avatar {
1884
+ width: 40px;
1885
+ height: 40px;
1886
+ border-radius: 50%;
1887
+ object-fit: cover;
1888
+ background: var(--sidebar-bg);
1889
+ }
1890
+
1891
+ .tweet-user-info {
1892
+ display: flex;
1893
+ flex-direction: column;
1894
+ line-height: 1.2;
1895
+ }
1896
+
1897
+ .tweet-name {
1898
+ font-weight: 600;
1899
+ font-size: 0.9375rem;
1900
+ color: var(--text-color);
1901
+ display: flex;
1902
+ align-items: center;
1903
+ gap: 0.25rem;
1904
+ }
1905
+
1906
+ .tweet-verified {
1907
+ color: var(--primary-color);
1908
+ width: 14px;
1909
+ height: 14px;
1910
+ }
1911
+
1912
+ .tweet-handle {
1913
+ font-size: 0.875rem;
1914
+ color: var(--text-muted);
1915
+ }
1916
+
1917
+ .tweet-text {
1918
+ font-size: 0.9375rem;
1919
+ color: var(--text-color);
1920
+ line-height: 1.5;
1921
+ margin-bottom: 0.75rem;
1922
+ }
1923
+
1924
+ .tweet-text a {
1925
+ color: var(--primary-color);
1926
+ text-decoration: none;
1927
+ }
1928
+
1929
+ .tweet-text a:hover {
1930
+ text-decoration: underline;
1931
+ }
1932
+
1933
+ .tweet-footer {
1934
+ display: flex;
1935
+ justify-content: space-between;
1936
+ align-items: center;
1937
+ margin-top: 1rem;
1938
+ font-size: 0.8125rem;
1939
+ color: var(--text-muted);
1940
+ }
1941
+
1942
+ .tweet-date {
1943
+ opacity: 0.8;
1944
+ }
1945
+
1946
+ .tweet-icon {
1947
+ width: 16px;
1948
+ height: 16px;
1949
+ opacity: 0.6;
1950
+ }
1951
+
1952
+ /* ===================================
1953
+ Radix-style Component States
1954
+ CSS-only state management for hydration
1955
+ =================================== */
1956
+
1957
+ /* Accordion - state controls max-height */
1958
+ [data-accordion-content] {
1959
+ transition: max-height 0.3s ease, opacity 0.2s ease;
1960
+ overflow: hidden;
1961
+ }
1962
+
1963
+ [data-state="open"] > [data-accordion-content] {
1964
+ max-height: 500px;
1965
+ opacity: 1;
1966
+ }
1967
+
1968
+ [data-state="closed"] > [data-accordion-content] {
1969
+ max-height: 0;
1970
+ opacity: 0;
1971
+ }
1972
+
1973
+ /* Accordion chevron rotation */
1974
+ [data-chevron] {
1975
+ display: inline-block;
1976
+ transition: transform 0.2s ease;
1977
+ }
1978
+
1979
+ [data-state="open"] [data-chevron] {
1980
+ transform: rotate(180deg);
1981
+ }
1982
+
1983
+ [data-state="closed"] [data-chevron] {
1984
+ transform: rotate(0deg);
1985
+ }
1986
+
1987
+ /* Checkbox - aria-checked controls visibility */
1988
+ [data-checkbox][aria-checked="true"]::before {
1989
+ opacity: 1;
1990
+ }
1991
+
1992
+ [data-checkbox][aria-checked="false"]::before {
1993
+ opacity: 0;
1994
+ }
1995
+
1996
+ /* Switch - aria-checked controls background and thumb position */
1997
+ [data-switch-toggle] {
1998
+ transition: background 0.2s ease;
1999
+ }
2000
+
2001
+ [data-switch-toggle][aria-checked="true"] {
2002
+ background: var(--primary-color, #6366f1);
2003
+ }
2004
+
2005
+ [data-switch-toggle][aria-checked="false"] {
2006
+ background: #4b5563;
2007
+ }
2008
+
2009
+ [data-switch-thumb] {
2010
+ transition: left 0.2s ease;
2011
+ }
2012
+
2013
+ [data-switch-toggle][aria-checked="true"] [data-switch-thumb] {
2014
+ left: 22px;
2015
+ }
2016
+
2017
+ [data-switch-toggle][aria-checked="false"] [data-switch-thumb] {
2018
+ left: 2px;
2019
+ }
2020
+
2021
+ /* Slider - uses --slider-percent CSS custom property */
2022
+ [data-slider-range] {
2023
+ width: calc(var(--slider-percent, 50) * 1%);
2024
+ transition: width 0.1s ease;
2025
+ }
2026
+
2027
+ [data-slider-thumb] {
2028
+ left: calc(var(--slider-percent, 50) * 1%);
2029
+ transition: left 0.1s ease;
2030
+ }
2031
+
2032
+ /* ===================================
2033
+ Luna Styled Components
2034
+ APG-compliant components with BEM naming
2035
+ =================================== */
2036
+
2037
+ /* Luna CSS Variables (aliases to theme variables) */
2038
+ :root {
2039
+ --background: var(--bg-color);
2040
+ --foreground: var(--text-color);
2041
+ --muted: var(--sidebar-bg);
2042
+ --muted-foreground: var(--text-muted);
2043
+ --border: var(--border-color);
2044
+ --accent: var(--primary-color);
2045
+ --accent-foreground: #ffffff;
2046
+ --destructive: #ef4444;
2047
+ --warning: var(--accent-color);
2048
+ --success: #10b981;
2049
+ --link-hover: var(--secondary-color);
2050
+ }
2051
+
2052
+ html.dark {
2053
+ --destructive: #f87171;
2054
+ --success: #34d399;
2055
+ }
2056
+
2057
+ /* Alert Component */
2058
+ .alert {
2059
+ position: relative;
2060
+ padding: 0.75rem 1rem;
2061
+ padding-left: 1.25rem;
2062
+ border-radius: 0.375rem;
2063
+ background: var(--muted);
2064
+ color: var(--foreground);
2065
+ margin-bottom: 0.75rem;
2066
+ }
2067
+
2068
+ .alert:last-child {
2069
+ margin-bottom: 0;
2070
+ }
2071
+
2072
+ .alert::before {
2073
+ content: "";
2074
+ position: absolute;
2075
+ left: 0;
2076
+ top: 0;
2077
+ bottom: 0;
2078
+ width: 4px;
2079
+ border-radius: 0.375rem 0 0 0.375rem;
2080
+ background: var(--accent);
2081
+ }
2082
+
2083
+ .alert__title {
2084
+ font-weight: 600;
2085
+ font-size: 1rem;
2086
+ margin-bottom: 0.25rem;
2087
+ }
2088
+
2089
+ .alert__description {
2090
+ font-size: 0.875rem;
2091
+ color: var(--muted-foreground);
2092
+ }
2093
+
2094
+ .alert--error::before { background: var(--destructive); }
2095
+ .alert--error .alert__title { color: var(--destructive); }
2096
+
2097
+ .alert--warning::before { background: var(--warning); }
2098
+ .alert--warning .alert__title { color: var(--warning); }
2099
+
2100
+ .alert--success::before { background: var(--success); }
2101
+ .alert--success .alert__title { color: var(--success); }
2102
+
2103
+ .alert--status::before { background: var(--accent); }
2104
+ .alert--status .alert__title { color: var(--accent); }
2105
+
2106
+ /* Switch Component */
2107
+ .switch {
2108
+ display: inline-flex;
2109
+ align-items: center;
2110
+ gap: 0.75rem;
2111
+ padding: 0;
2112
+ border: none;
2113
+ background: transparent;
2114
+ cursor: pointer;
2115
+ font-weight: 500;
2116
+ font-size: 0.875rem;
2117
+ color: var(--foreground);
2118
+ }
2119
+
2120
+ .switch:focus-visible {
2121
+ outline: 2px solid var(--accent);
2122
+ outline-offset: 2px;
2123
+ border-radius: 4px;
2124
+ }
2125
+
2126
+ .switch[data-disabled] {
2127
+ opacity: 0.5;
2128
+ cursor: not-allowed;
2129
+ }
2130
+
2131
+ .switch__track {
2132
+ position: relative;
2133
+ display: inline-flex;
2134
+ align-items: center;
2135
+ width: 3rem;
2136
+ height: 1.5rem;
2137
+ border-radius: 9999px;
2138
+ background: var(--muted-foreground);
2139
+ border: 2px solid var(--muted-foreground);
2140
+ transition: background-color 0.2s, border-color 0.2s;
2141
+ }
2142
+
2143
+ .switch[data-state="on"] .switch__track {
2144
+ background: var(--accent);
2145
+ border-color: var(--accent);
2146
+ }
2147
+
2148
+ .switch__thumb {
2149
+ position: absolute;
2150
+ left: 2px;
2151
+ width: 1.125rem;
2152
+ height: 1.125rem;
2153
+ border-radius: 50%;
2154
+ background: var(--background);
2155
+ box-shadow: 0 1px 3px rgba(0, 0, 0, 0.2);
2156
+ transition: transform 0.2s;
2157
+ }
2158
+
2159
+ .switch[data-state="on"] .switch__thumb {
2160
+ transform: translateX(1.5rem);
2161
+ }
2162
+
2163
+ .switch__label {
2164
+ user-select: none;
2165
+ }
2166
+
2167
+ .switch-group {
2168
+ display: flex;
2169
+ flex-direction: column;
2170
+ gap: 0.75rem;
2171
+ }
2172
+
2173
+ /* Checkbox Component */
2174
+ .checkbox {
2175
+ position: relative;
2176
+ display: inline-flex;
2177
+ align-items: center;
2178
+ vertical-align: middle;
2179
+ gap: 0.5rem;
2180
+ cursor: pointer;
2181
+ }
2182
+
2183
+ .checkbox__input {
2184
+ position: absolute;
2185
+ width: 1px;
2186
+ height: 1px;
2187
+ padding: 0;
2188
+ margin: -1px;
2189
+ overflow: hidden;
2190
+ clip: rect(0, 0, 0, 0);
2191
+ white-space: nowrap;
2192
+ border: 0;
2193
+ }
2194
+
2195
+ .checkbox__control {
2196
+ position: relative;
2197
+ display: inline-flex;
2198
+ align-items: center;
2199
+ justify-content: center;
2200
+ width: 1.25rem;
2201
+ height: 1.25rem;
2202
+ border-radius: 0.25rem;
2203
+ background: var(--background);
2204
+ border: 2px solid var(--border);
2205
+ transition: background-color 0.15s, border-color 0.15s;
2206
+ flex-shrink: 0;
2207
+ }
2208
+
2209
+ .checkbox__input:focus-visible + .checkbox__control {
2210
+ outline: 2px solid var(--accent);
2211
+ outline-offset: 2px;
2212
+ }
2213
+
2214
+ .checkbox:hover .checkbox__control {
2215
+ border-color: var(--foreground);
2216
+ }
2217
+
2218
+ .checkbox[data-checked="true"] .checkbox__control {
2219
+ background: var(--accent);
2220
+ border-color: var(--accent);
2221
+ }
2222
+
2223
+ .checkbox[data-disabled] {
2224
+ opacity: 0.5;
2225
+ pointer-events: none;
2226
+ }
2227
+
2228
+ .checkbox__icon {
2229
+ position: absolute;
2230
+ top: 50%;
2231
+ left: 50%;
2232
+ transform: translate(-50%, -50%);
2233
+ display: flex;
2234
+ align-items: center;
2235
+ justify-content: center;
2236
+ width: 0.75rem;
2237
+ height: 0.75rem;
2238
+ color: white;
2239
+ opacity: 0;
2240
+ transition: opacity 0.15s;
2241
+ }
2242
+
2243
+ .checkbox__icon svg {
2244
+ width: 100%;
2245
+ height: 100%;
2246
+ }
2247
+
2248
+ .checkbox[data-checked="true"] .checkbox__icon--check {
2249
+ opacity: 1;
2250
+ }
2251
+
2252
+ .checkbox[data-indeterminate="true"] .checkbox__control {
2253
+ background: var(--accent);
2254
+ border-color: var(--accent);
2255
+ }
2256
+
2257
+ .checkbox[data-indeterminate="true"] .checkbox__icon--indeterminate {
2258
+ opacity: 1;
2259
+ }
2260
+
2261
+ .checkbox[data-indeterminate="true"] .checkbox__icon--check {
2262
+ opacity: 0;
2263
+ }
2264
+
2265
+ .checkbox__label {
2266
+ font-size: 0.875rem;
2267
+ line-height: 1.25rem;
2268
+ color: var(--foreground);
2269
+ user-select: none;
2270
+ }
2271
+
2272
+ .checkbox-group {
2273
+ display: flex;
2274
+ flex-direction: column;
2275
+ gap: 0.5rem;
2276
+ }
2277
+
2278
+ /* Table Component */
2279
+ .table {
2280
+ width: 100%;
2281
+ overflow-x: auto;
2282
+ }
2283
+
2284
+ .table__table {
2285
+ width: 100%;
2286
+ border-collapse: collapse;
2287
+ border: 1px solid var(--border);
2288
+ border-radius: 0.375rem;
2289
+ overflow: hidden;
2290
+ font-size: 0.875rem;
2291
+ }
2292
+
2293
+ .table__header {
2294
+ background: var(--muted);
2295
+ }
2296
+
2297
+ .table__th {
2298
+ padding: 0.75rem 1rem;
2299
+ text-align: left;
2300
+ font-weight: 600;
2301
+ color: var(--foreground);
2302
+ border-bottom: 1px solid var(--border);
2303
+ white-space: nowrap;
2304
+ }
2305
+
2306
+ .table__th--sortable {
2307
+ cursor: pointer;
2308
+ user-select: none;
2309
+ transition: background-color 0.15s;
2310
+ }
2311
+
2312
+ .table__th--sortable:hover {
2313
+ background: var(--border);
2314
+ }
2315
+
2316
+ .table__th--sortable:focus-visible {
2317
+ outline: 2px solid var(--accent);
2318
+ outline-offset: -2px;
2319
+ }
2320
+
2321
+ .table__sort-icon {
2322
+ display: inline-block;
2323
+ margin-left: 0.25rem;
2324
+ color: var(--accent);
2325
+ font-size: 0.75rem;
2326
+ }
2327
+
2328
+ .table__row {
2329
+ border-bottom: 1px solid var(--border);
2330
+ transition: background-color 0.15s;
2331
+ }
2332
+
2333
+ .table__row:last-child {
2334
+ border-bottom: none;
2335
+ }
2336
+
2337
+ .table__row:hover {
2338
+ background: var(--muted);
2339
+ }
2340
+
2341
+ .table__row[data-selected="true"] {
2342
+ background: var(--accent);
2343
+ color: var(--accent-foreground);
2344
+ }
2345
+
2346
+ .table__row[data-selected="true"]:hover {
2347
+ background: var(--accent);
2348
+ opacity: 0.9;
2349
+ }
2350
+
2351
+ .table__cell {
2352
+ padding: 0.75rem 1rem;
2353
+ color: var(--foreground);
2354
+ }
2355
+
2356
+ .table__row[data-selected="true"] .table__cell {
2357
+ color: var(--accent-foreground);
2358
+ }
2359
+
2360
+ /* Reduced motion */
2361
+ @media (prefers-reduced-motion: reduce) {
2362
+ .switch__track,
2363
+ .switch__thumb,
2364
+ .checkbox__control,
2365
+ .checkbox__icon,
2366
+ .table__th--sortable,
2367
+ .table__row {
2368
+ transition: none;
2369
+ }
2370
+ }
2371
+
2372
+ /* Accordion Component */
2373
+ .accordion {
2374
+ border: 1px solid var(--border);
2375
+ border-radius: 0.5rem;
2376
+ overflow: hidden;
2377
+ background: var(--background);
2378
+ }
2379
+
2380
+ .accordion h3 {
2381
+ margin: 0;
2382
+ padding: 0;
2383
+ list-style: none;
2384
+ }
2385
+
2386
+ .accordion h3::before {
2387
+ display: none;
2388
+ }
2389
+
2390
+ .accordion__item {
2391
+ border-bottom: 1px solid var(--border);
2392
+ }
2393
+
2394
+ .accordion__item:last-child {
2395
+ border-bottom: none;
2396
+ }
2397
+
2398
+ .accordion__header {
2399
+ display: flex;
2400
+ justify-content: space-between;
2401
+ align-items: center;
2402
+ width: 100%;
2403
+ padding: 1rem;
2404
+ border: none;
2405
+ background: transparent;
2406
+ color: var(--foreground);
2407
+ cursor: pointer;
2408
+ font-size: 0.875rem;
2409
+ font-weight: 500;
2410
+ text-align: left;
2411
+ transition: background-color 0.15s;
2412
+ }
2413
+
2414
+ .accordion__header:hover {
2415
+ background: var(--muted);
2416
+ }
2417
+
2418
+ .accordion__header:focus-visible {
2419
+ outline: 2px solid var(--accent);
2420
+ outline-offset: -2px;
2421
+ }
2422
+
2423
+ .accordion__icon {
2424
+ font-size: 0.75rem;
2425
+ transition: transform 0.15s;
2426
+ color: var(--muted-foreground);
2427
+ }
2428
+
2429
+ .accordion__item[data-state="open"] .accordion__icon {
2430
+ transform: rotate(180deg);
2431
+ }
2432
+
2433
+ .accordion__panel {
2434
+ display: grid;
2435
+ grid-template-rows: 0fr;
2436
+ overflow: hidden;
2437
+ transition: grid-template-rows 0.2s ease-out;
2438
+ }
2439
+
2440
+ .accordion__panel[data-state="open"] {
2441
+ grid-template-rows: 1fr;
2442
+ }
2443
+
2444
+ .accordion__panel-content {
2445
+ min-height: 0;
2446
+ padding: 0 1rem;
2447
+ background: var(--background);
2448
+ color: var(--foreground);
2449
+ overflow: hidden;
2450
+ }
2451
+
2452
+ .accordion__panel[data-state="open"] .accordion__panel-content {
2453
+ padding: 1rem;
2454
+ border-top: 1px solid var(--border);
2455
+ }
2456
+
2457
+ /* Tabs Component */
2458
+ .tabs {
2459
+ display: flex;
2460
+ flex-direction: column;
2461
+ }
2462
+
2463
+ .tabs__list {
2464
+ display: flex;
2465
+ gap: 0.25rem;
2466
+ border-bottom: 1px solid var(--border);
2467
+ position: relative;
2468
+ }
2469
+
2470
+ .tabs__tab {
2471
+ position: relative;
2472
+ padding: 0.5rem 1rem;
2473
+ border: 1px solid transparent;
2474
+ border-bottom: none;
2475
+ border-radius: 0.375rem 0.375rem 0 0;
2476
+ background: transparent;
2477
+ cursor: pointer;
2478
+ font-size: 0.875rem;
2479
+ font-weight: 500;
2480
+ color: var(--muted-foreground);
2481
+ margin: 0;
2482
+ margin-bottom: -1px;
2483
+ transition: color 0.15s, background-color 0.15s, border-color 0.15s;
2484
+ }
2485
+
2486
+ .tabs__tab:hover {
2487
+ color: var(--foreground);
2488
+ background: var(--background);
2489
+ }
2490
+
2491
+ .tabs__tab[data-state="active"] {
2492
+ color: var(--foreground);
2493
+ background: var(--background);
2494
+ border-color: var(--border);
2495
+ }
2496
+
2497
+ .tabs__tab:focus-visible {
2498
+ outline: 2px solid var(--accent);
2499
+ outline-offset: -2px;
2500
+ }
2501
+
2502
+ .tabs__panel {
2503
+ padding: 1rem;
2504
+ color: var(--foreground);
2505
+ border: 1px solid var(--border);
2506
+ border-top: none;
2507
+ border-radius: 0 0 0.375rem 0.375rem;
2508
+ }
2509
+
2510
+ /* Radio Group Component */
2511
+ .radio-group {
2512
+ display: flex;
2513
+ flex-direction: column;
2514
+ gap: 0.5rem;
2515
+ }
2516
+
2517
+ .radio-group[data-orientation="horizontal"] {
2518
+ flex-direction: row;
2519
+ flex-wrap: wrap;
2520
+ gap: 1rem;
2521
+ }
2522
+
2523
+ .radio {
2524
+ position: relative;
2525
+ display: inline-flex;
2526
+ align-items: center;
2527
+ gap: 0.5rem;
2528
+ cursor: pointer;
2529
+ user-select: none;
2530
+ outline: none;
2531
+ }
2532
+
2533
+ .radio__control {
2534
+ position: relative;
2535
+ display: inline-flex;
2536
+ align-items: center;
2537
+ justify-content: center;
2538
+ width: 1.25rem;
2539
+ height: 1.25rem;
2540
+ border-radius: 50%;
2541
+ background: var(--background);
2542
+ border: 2px solid var(--border);
2543
+ transition: background-color 0.15s, border-color 0.15s;
2544
+ flex-shrink: 0;
2545
+ }
2546
+
2547
+ .radio__indicator {
2548
+ width: 0.5rem;
2549
+ height: 0.5rem;
2550
+ border-radius: 50%;
2551
+ background: white;
2552
+ transform: scale(0);
2553
+ transition: transform 0.15s;
2554
+ }
2555
+
2556
+ .radio:focus-visible .radio__control {
2557
+ outline: 2px solid var(--accent);
2558
+ outline-offset: 2px;
2559
+ }
2560
+
2561
+ .radio:not([data-disabled]):hover .radio__control {
2562
+ border-color: var(--foreground);
2563
+ }
2564
+
2565
+ .radio[data-selected]:not([data-selected="false"]) .radio__control {
2566
+ background: var(--accent);
2567
+ border-color: var(--accent);
2568
+ }
2569
+
2570
+ .radio[data-selected]:not([data-selected="false"]) .radio__indicator {
2571
+ transform: scale(1);
2572
+ }
2573
+
2574
+ .radio[data-disabled] {
2575
+ opacity: 0.5;
2576
+ cursor: not-allowed;
2577
+ }
2578
+
2579
+ .radio__label {
2580
+ font-size: 0.875rem;
2581
+ line-height: 1.25rem;
2582
+ color: var(--foreground);
2583
+ }
2584
+
2585
+ /* Meter Component */
2586
+ .meter {
2587
+ display: flex;
2588
+ align-items: center;
2589
+ gap: 1rem;
2590
+ padding: 0.75rem 0;
2591
+ }
2592
+
2593
+ .meter__label {
2594
+ flex-shrink: 0;
2595
+ min-width: 7rem;
2596
+ font-size: 0.875rem;
2597
+ font-weight: 500;
2598
+ color: var(--foreground);
2599
+ }
2600
+
2601
+ .meter__element {
2602
+ flex: 1;
2603
+ height: 0.5rem;
2604
+ appearance: none;
2605
+ -webkit-appearance: none;
2606
+ border: none;
2607
+ border-radius: 9999px;
2608
+ background: var(--muted);
2609
+ overflow: hidden;
2610
+ }
2611
+
2612
+ .meter__element::-webkit-meter-bar {
2613
+ background: var(--muted);
2614
+ border-radius: 9999px;
2615
+ border: none;
2616
+ }
2617
+
2618
+ .meter__element::-webkit-meter-optimum-value {
2619
+ background: var(--foreground);
2620
+ border-radius: 9999px;
2621
+ }
2622
+
2623
+ .meter__element::-webkit-meter-suboptimum-value {
2624
+ background: var(--warning);
2625
+ border-radius: 9999px;
2626
+ }
2627
+
2628
+ .meter__element::-webkit-meter-even-less-good-value {
2629
+ background: var(--destructive);
2630
+ border-radius: 9999px;
2631
+ }
2632
+
2633
+ .meter__element::-moz-meter-bar {
2634
+ background: var(--foreground);
2635
+ border-radius: 9999px;
2636
+ }
2637
+
2638
+ .meter__value {
2639
+ flex-shrink: 0;
2640
+ min-width: 4rem;
2641
+ text-align: right;
2642
+ font-size: 0.875rem;
2643
+ color: var(--muted-foreground);
2644
+ }
2645
+
2646
+ /* Disclosure Component */
2647
+ .disclosure {
2648
+ border: 1px solid var(--border);
2649
+ border-radius: 0.5rem;
2650
+ background: var(--background);
2651
+ overflow: hidden;
2652
+ }
2653
+
2654
+ .disclosure__trigger {
2655
+ display: flex;
2656
+ align-items: center;
2657
+ gap: 0.5rem;
2658
+ width: 100%;
2659
+ padding: 1rem;
2660
+ border: none;
2661
+ background: transparent;
2662
+ color: var(--foreground);
2663
+ font-size: 0.875rem;
2664
+ font-weight: 500;
2665
+ text-align: left;
2666
+ cursor: pointer;
2667
+ transition: background-color 0.15s;
2668
+ }
2669
+
2670
+ .disclosure__trigger:hover {
2671
+ background: var(--muted);
2672
+ }
2673
+
2674
+ .disclosure__trigger:focus-visible {
2675
+ outline: 2px solid var(--accent);
2676
+ outline-offset: -2px;
2677
+ }
2678
+
2679
+ .disclosure__icon {
2680
+ flex-shrink: 0;
2681
+ font-size: 0.625rem;
2682
+ color: var(--muted-foreground);
2683
+ transition: transform 0.2s ease-out;
2684
+ }
2685
+
2686
+ .disclosure__trigger[data-state="open"] .disclosure__icon {
2687
+ transform: rotate(180deg);
2688
+ }
2689
+
2690
+ .disclosure__panel {
2691
+ display: grid;
2692
+ grid-template-rows: 0fr;
2693
+ overflow: hidden;
2694
+ transition: grid-template-rows 0.2s ease-out;
2695
+ }
2696
+
2697
+ .disclosure__panel[data-state="open"] {
2698
+ grid-template-rows: 1fr;
2699
+ }
2700
+
2701
+ .disclosure__content {
2702
+ min-height: 0;
2703
+ overflow: hidden;
2704
+ padding: 0 1rem 0 2rem;
2705
+ }
2706
+
2707
+ .disclosure__panel[data-state="open"] .disclosure__content {
2708
+ padding: 0 1rem 1rem 2rem;
2709
+ }
2710
+
2711
+ /* Spinbutton Component */
2712
+ .spinbutton {
2713
+ display: flex;
2714
+ align-items: center;
2715
+ gap: 0.75rem;
2716
+ }
2717
+
2718
+ .spinbutton__label {
2719
+ font-size: 0.875rem;
2720
+ font-weight: 500;
2721
+ color: var(--foreground);
2722
+ }
2723
+
2724
+ .spinbutton__controls {
2725
+ display: flex;
2726
+ align-items: center;
2727
+ border: 1px solid var(--border);
2728
+ border-radius: 0.375rem;
2729
+ overflow: hidden;
2730
+ }
2731
+
2732
+ .spinbutton__button {
2733
+ display: flex;
2734
+ align-items: center;
2735
+ justify-content: center;
2736
+ width: 2rem;
2737
+ height: 2rem;
2738
+ border: none;
2739
+ background: var(--muted);
2740
+ color: var(--foreground);
2741
+ cursor: pointer;
2742
+ font-size: 1rem;
2743
+ transition: background-color 0.15s;
2744
+ }
2745
+
2746
+ .spinbutton__button:hover {
2747
+ background: var(--border);
2748
+ }
2749
+
2750
+ .spinbutton__button:focus-visible {
2751
+ outline: 2px solid var(--accent);
2752
+ outline-offset: -2px;
2753
+ }
2754
+
2755
+ .spinbutton__input {
2756
+ display: flex;
2757
+ align-items: center;
2758
+ justify-content: center;
2759
+ min-width: 3rem;
2760
+ height: 2rem;
2761
+ padding: 0 0.5rem;
2762
+ background: var(--background);
2763
+ color: var(--foreground);
2764
+ font-size: 0.875rem;
2765
+ text-align: center;
2766
+ }
2767
+
2768
+ .spinbutton[data-disabled] {
2769
+ opacity: 0.5;
2770
+ pointer-events: none;
2771
+ }
2772
+
2773
+ /* Toolbar Component */
2774
+ .toolbar {
2775
+ padding: 0.25rem;
2776
+ }
2777
+
2778
+ .toolbar__inner {
2779
+ display: flex;
2780
+ align-items: center;
2781
+ gap: 0.25rem;
2782
+ padding: 0.25rem;
2783
+ border: 1px solid var(--border);
2784
+ border-radius: 0.5rem;
2785
+ background: var(--muted);
2786
+ }
2787
+
2788
+ .toolbar__group {
2789
+ display: flex;
2790
+ gap: 0.125rem;
2791
+ }
2792
+
2793
+ .toolbar__item {
2794
+ display: flex;
2795
+ align-items: center;
2796
+ justify-content: center;
2797
+ min-width: 2rem;
2798
+ height: 2rem;
2799
+ padding: 0 0.5rem;
2800
+ border: none;
2801
+ border-radius: 0.25rem;
2802
+ background: transparent;
2803
+ color: var(--foreground);
2804
+ cursor: pointer;
2805
+ font-size: 0.875rem;
2806
+ font-weight: 500;
2807
+ transition: background-color 0.15s;
2808
+ }
2809
+
2810
+ .toolbar__item:hover {
2811
+ background: var(--background);
2812
+ }
2813
+
2814
+ .toolbar__item:focus-visible {
2815
+ outline: 2px solid var(--accent);
2816
+ outline-offset: -2px;
2817
+ }
2818
+
2819
+ .toolbar__item[data-pressed],
2820
+ .toolbar__item[aria-pressed="true"] {
2821
+ background: var(--accent);
2822
+ color: var(--accent-foreground);
2823
+ }
2824
+
2825
+ .toolbar__item[data-disabled] {
2826
+ opacity: 0.5;
2827
+ cursor: not-allowed;
2828
+ }
2829
+
2830
+ .toolbar__separator {
2831
+ width: 1px;
2832
+ height: 1.5rem;
2833
+ margin: 0 0.25rem;
2834
+ background: var(--border);
2835
+ }
2836
+
2837
+ /* Tree View Component */
2838
+ .treeview {
2839
+ list-style: none;
2840
+ padding: 0;
2841
+ margin: 0;
2842
+ }
2843
+
2844
+ .treeview__item {
2845
+ list-style: none;
2846
+ }
2847
+
2848
+ .treeview__row {
2849
+ display: flex;
2850
+ align-items: center;
2851
+ gap: 0.25rem;
2852
+ padding: 0.375rem 0.5rem;
2853
+ border-radius: 0.25rem;
2854
+ cursor: pointer;
2855
+ transition: background-color 0.15s;
2856
+ }
2857
+
2858
+ .treeview__row:hover {
2859
+ background: var(--muted);
2860
+ }
2861
+
2862
+ .treeview__row:focus-visible {
2863
+ outline: 2px solid var(--accent);
2864
+ outline-offset: -2px;
2865
+ }
2866
+
2867
+ .treeview__row[data-selected="true"] {
2868
+ background: var(--accent);
2869
+ color: var(--accent-foreground);
2870
+ }
2871
+
2872
+ .treeview__icon {
2873
+ width: 1rem;
2874
+ height: 1rem;
2875
+ display: flex;
2876
+ align-items: center;
2877
+ justify-content: center;
2878
+ font-size: 0.625rem;
2879
+ color: var(--muted-foreground);
2880
+ flex-shrink: 0;
2881
+ }
2882
+
2883
+ .treeview__label {
2884
+ font-size: 0.875rem;
2885
+ }
2886
+
2887
+ .treeview__group {
2888
+ list-style: none;
2889
+ padding-left: 1.25rem;
2890
+ margin: 0;
2891
+ }
2892
+
2893
+ .treeview__item[data-expanded="false"] > .treeview__group {
2894
+ display: none;
2895
+ }
2896
+