kitfly 0.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (62) hide show
  1. package/CHANGELOG.md +60 -0
  2. package/LICENSE +21 -0
  3. package/README.md +136 -0
  4. package/VERSION +1 -0
  5. package/package.json +63 -0
  6. package/schemas/README.md +32 -0
  7. package/schemas/site.schema.json +5 -0
  8. package/schemas/theme.schema.json +5 -0
  9. package/schemas/v0/site.schema.json +172 -0
  10. package/schemas/v0/theme.schema.json +210 -0
  11. package/scripts/build-all.ts +121 -0
  12. package/scripts/build.ts +601 -0
  13. package/scripts/bundle.ts +781 -0
  14. package/scripts/dev.ts +777 -0
  15. package/scripts/generate-checksums.sh +78 -0
  16. package/scripts/release/export-release-key.sh +28 -0
  17. package/scripts/release/release-guard-tag-version.sh +79 -0
  18. package/scripts/release/sign-release-assets.sh +123 -0
  19. package/scripts/release/upload-release-assets.sh +76 -0
  20. package/scripts/release/upload-release-provenance.sh +52 -0
  21. package/scripts/release/verify-public-key.sh +48 -0
  22. package/scripts/release/verify-signatures.sh +117 -0
  23. package/scripts/version-sync.ts +82 -0
  24. package/src/__tests__/build.test.ts +240 -0
  25. package/src/__tests__/bundle.test.ts +786 -0
  26. package/src/__tests__/cli.test.ts +706 -0
  27. package/src/__tests__/crucible.test.ts +1043 -0
  28. package/src/__tests__/engine.test.ts +157 -0
  29. package/src/__tests__/init.test.ts +450 -0
  30. package/src/__tests__/pipeline.test.ts +1087 -0
  31. package/src/__tests__/productbook.test.ts +1206 -0
  32. package/src/__tests__/runbook.test.ts +974 -0
  33. package/src/__tests__/server-registry.test.ts +1251 -0
  34. package/src/__tests__/servicebook.test.ts +1248 -0
  35. package/src/__tests__/shared.test.ts +2005 -0
  36. package/src/__tests__/styles.test.ts +14 -0
  37. package/src/__tests__/theme-schema.test.ts +47 -0
  38. package/src/__tests__/theme.test.ts +554 -0
  39. package/src/cli.ts +582 -0
  40. package/src/commands/init.ts +92 -0
  41. package/src/commands/update.ts +444 -0
  42. package/src/engine.ts +20 -0
  43. package/src/logger.ts +15 -0
  44. package/src/migrations/0000_schema_versioning.ts +67 -0
  45. package/src/migrations/0001_server_port.ts +52 -0
  46. package/src/migrations/0002_brand_logo.ts +49 -0
  47. package/src/migrations/index.ts +26 -0
  48. package/src/migrations/schema.ts +24 -0
  49. package/src/server-registry.ts +405 -0
  50. package/src/shared.ts +1239 -0
  51. package/src/site/styles.css +931 -0
  52. package/src/site/template.html +193 -0
  53. package/src/templates/crucible.ts +1163 -0
  54. package/src/templates/driver.ts +876 -0
  55. package/src/templates/handbook.ts +339 -0
  56. package/src/templates/minimal.ts +139 -0
  57. package/src/templates/pipeline.ts +966 -0
  58. package/src/templates/productbook.ts +1032 -0
  59. package/src/templates/runbook.ts +829 -0
  60. package/src/templates/schema.ts +119 -0
  61. package/src/templates/servicebook.ts +1242 -0
  62. package/src/theme.ts +245 -0
@@ -0,0 +1,931 @@
1
+ /* Kitfly - Minimal, professional styling */
2
+
3
+ :root {
4
+ /* Light theme (default) */
5
+ --color-bg: #ffffff;
6
+ --color-bg-sidebar: #f8f9fa;
7
+ --color-text: #1a1a1a;
8
+ --color-text-muted: #6b7280;
9
+ --color-border: #e5e7eb;
10
+ --color-link: #2563eb;
11
+ --color-link-hover: #1d4ed8;
12
+ --color-accent: #0f172a;
13
+ --color-code-bg: #f3f4f6;
14
+ --color-logo: #0f172a;
15
+ /* Logo colors - light mode */
16
+ --logo-doc: #152F46;
17
+ --logo-fold: #0A6172;
18
+ --logo-feather: #007182;
19
+ --logo-accent: #D17059;
20
+
21
+ /* Typography */
22
+ --font-sans: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
23
+ --font-mono: ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, monospace;
24
+
25
+ /* Layout */
26
+ --sidebar-width: 280px;
27
+ --footer-height: 2.25rem;
28
+ }
29
+
30
+ /* Dark theme - automatic based on OS preference */
31
+ @media (prefers-color-scheme: dark) {
32
+ :root:not([data-theme="light"]) {
33
+ --color-bg: #0f172a;
34
+ --color-bg-sidebar: #1e293b;
35
+ --color-text: #e2e8f0;
36
+ --color-text-muted: #94a3b8;
37
+ --color-border: #334155;
38
+ --color-link: #60a5fa;
39
+ --color-link-hover: #93c5fd;
40
+ --color-accent: #f8fafc;
41
+ --color-code-bg: #1e293b;
42
+ --color-logo: #f8fafc;
43
+ /* Logo colors - dark mode (brighter for contrast) */
44
+ --logo-doc: #60A5FA;
45
+ --logo-fold: #22D3EE;
46
+ --logo-feather: #06B6D4;
47
+ --logo-accent: #FB923C;
48
+ }
49
+ }
50
+
51
+ /* Dark theme - manual override */
52
+ [data-theme="dark"] {
53
+ --color-bg: #0f172a;
54
+ --color-bg-sidebar: #1e293b;
55
+ --color-text: #e2e8f0;
56
+ --color-text-muted: #94a3b8;
57
+ --color-border: #334155;
58
+ --color-link: #60a5fa;
59
+ --color-link-hover: #93c5fd;
60
+ --color-accent: #f8fafc;
61
+ --color-code-bg: #1e293b;
62
+ --color-logo: #f8fafc;
63
+ /* Logo colors - dark mode (brighter for contrast) */
64
+ --logo-doc: #60A5FA;
65
+ --logo-fold: #22D3EE;
66
+ --logo-feather: #06B6D4;
67
+ --logo-accent: #FB923C;
68
+ }
69
+
70
+ /* Light theme - manual override */
71
+ [data-theme="light"] {
72
+ --color-bg: #ffffff;
73
+ --color-bg-sidebar: #f8f9fa;
74
+ --color-text: #1a1a1a;
75
+ --color-text-muted: #6b7280;
76
+ --color-border: #e5e7eb;
77
+ --color-link: #2563eb;
78
+ --color-link-hover: #1d4ed8;
79
+ --color-accent: #0f172a;
80
+ --color-code-bg: #f3f4f6;
81
+ --color-logo: #0f172a;
82
+ /* Logo colors - light mode */
83
+ --logo-doc: #152F46;
84
+ --logo-fold: #0A6172;
85
+ --logo-feather: #007182;
86
+ --logo-accent: #D17059;
87
+ }
88
+
89
+ * {
90
+ margin: 0;
91
+ padding: 0;
92
+ box-sizing: border-box;
93
+ }
94
+
95
+ html {
96
+ font-size: 16px;
97
+ }
98
+
99
+ body {
100
+ font-family: var(--font-sans);
101
+ color: var(--color-text);
102
+ background: var(--color-bg);
103
+ line-height: 1.6;
104
+ transition: background-color 0.2s ease, color 0.2s ease;
105
+ }
106
+
107
+ /* Layout */
108
+ .layout {
109
+ display: flex;
110
+ min-height: calc(100vh - var(--footer-height));
111
+ }
112
+
113
+ /* Sidebar */
114
+ .sidebar {
115
+ width: var(--sidebar-width);
116
+ background: var(--color-bg-sidebar);
117
+ border-right: 1px solid var(--color-border);
118
+ position: fixed;
119
+ top: 0;
120
+ left: 0;
121
+ bottom: var(--footer-height);
122
+ overflow-y: auto;
123
+ padding: 1.5rem;
124
+ transition: background-color 0.2s ease, border-color 0.2s ease;
125
+ }
126
+
127
+ .sidebar-header {
128
+ margin-bottom: 1rem;
129
+ display: flex;
130
+ align-items: flex-start;
131
+ justify-content: space-between;
132
+ gap: 0.75rem;
133
+ }
134
+
135
+ .logo {
136
+ display: flex;
137
+ align-items: flex-start;
138
+ gap: 0.75rem;
139
+ flex: 1;
140
+ min-width: 0;
141
+ }
142
+
143
+ .logo-icon {
144
+ display: inline-flex;
145
+ align-items: center;
146
+ height: 64px;
147
+ width: auto;
148
+ max-width: 180px;
149
+ flex-shrink: 0;
150
+ }
151
+
152
+ .logo-icon svg,
153
+ .logo-icon img,
154
+ .logo-img {
155
+ display: block;
156
+ width: auto;
157
+ height: 100%;
158
+ max-width: 100%;
159
+ object-fit: contain;
160
+ object-position: left center;
161
+ }
162
+
163
+ /* Logo dark mode - brighten for visibility */
164
+ [data-theme="dark"] .logo-img,
165
+ [data-theme="dark"] .logo-icon img {
166
+ filter: brightness(1.3) saturate(1.2);
167
+ }
168
+
169
+ @media (prefers-color-scheme: dark) {
170
+ :root:not([data-theme="light"]) .logo-img,
171
+ :root:not([data-theme="light"]) .logo-icon img {
172
+ filter: brightness(1.3) saturate(1.2);
173
+ }
174
+ }
175
+
176
+ .logo-text {
177
+ display: flex;
178
+ flex-direction: column;
179
+ flex: 1 1 8rem;
180
+ line-height: 1.2;
181
+ min-width: 6rem;
182
+ max-width: 100%;
183
+ }
184
+
185
+ .logo-text .brand {
186
+ display: block;
187
+ font-size: 0.9375rem;
188
+ font-weight: 700;
189
+ color: var(--color-accent);
190
+ text-decoration: none;
191
+ white-space: nowrap;
192
+ overflow: hidden;
193
+ text-overflow: ellipsis;
194
+ }
195
+
196
+ .logo-text .brand:hover {
197
+ text-decoration: underline;
198
+ }
199
+
200
+ .logo-text .product {
201
+ display: block;
202
+ font-size: 0.6875rem;
203
+ font-weight: 500;
204
+ color: var(--color-text-muted);
205
+ text-decoration: none;
206
+ white-space: nowrap;
207
+ overflow: hidden;
208
+ text-overflow: ellipsis;
209
+ }
210
+
211
+ .logo-text .product:hover {
212
+ color: var(--color-text);
213
+ }
214
+
215
+ /* Wide/wordmark logo support */
216
+ .logo.logo-wordmark {
217
+ flex-direction: column;
218
+ align-items: flex-start;
219
+ }
220
+
221
+ .logo.logo-wordmark .logo-icon {
222
+ width: auto;
223
+ height: 64px;
224
+ max-width: 180px;
225
+ max-height: 64px;
226
+ }
227
+
228
+ .logo.logo-wordmark .logo-img {
229
+ max-width: 180px;
230
+ max-height: 64px;
231
+ width: auto;
232
+ height: 100%;
233
+ }
234
+
235
+ .mobile-logo .logo-img.logo-wordmark {
236
+ max-width: 120px;
237
+ max-height: 32px;
238
+ width: auto;
239
+ height: auto;
240
+ }
241
+
242
+ /* Theme toggle */
243
+ .header-tools {
244
+ display: flex;
245
+ flex-direction: column;
246
+ align-items: flex-end;
247
+ gap: 0.5rem;
248
+ flex-shrink: 0;
249
+ }
250
+
251
+ .theme-toggle {
252
+ background: none;
253
+ border: 1px solid var(--color-border);
254
+ border-radius: 0.375rem;
255
+ padding: 0.375rem;
256
+ cursor: pointer;
257
+ color: var(--color-text-muted);
258
+ display: flex;
259
+ align-items: center;
260
+ justify-content: center;
261
+ transition: color 0.2s ease, border-color 0.2s ease;
262
+ }
263
+
264
+ .theme-toggle:hover {
265
+ color: var(--color-text);
266
+ border-color: var(--color-text-muted);
267
+ }
268
+
269
+ .theme-toggle svg {
270
+ width: 16px;
271
+ height: 16px;
272
+ }
273
+
274
+ .theme-toggle .icon-sun { display: none; }
275
+ .theme-toggle .icon-moon { display: block; }
276
+
277
+ [data-theme="dark"] .theme-toggle .icon-sun { display: block; }
278
+ [data-theme="dark"] .theme-toggle .icon-moon { display: none; }
279
+
280
+ @media (prefers-color-scheme: dark) {
281
+ :root:not([data-theme="light"]) .theme-toggle .icon-sun { display: block; }
282
+ :root:not([data-theme="light"]) .theme-toggle .icon-moon { display: none; }
283
+ }
284
+
285
+ /* Sidebar meta (version/branch) */
286
+ .sidebar-meta {
287
+ display: flex;
288
+ flex-direction: column;
289
+ align-items: flex-end;
290
+ gap: 0.25rem;
291
+ font-size: 0.6875rem;
292
+ font-family: var(--font-mono);
293
+ color: var(--color-text-muted);
294
+ margin-top: 0;
295
+ }
296
+
297
+ .meta-version {
298
+ background: var(--color-code-bg);
299
+ padding: 0.125rem 0.375rem;
300
+ border-radius: 3px;
301
+ }
302
+
303
+ .meta-branch {
304
+ opacity: 0.7;
305
+ max-width: 7rem;
306
+ overflow: hidden;
307
+ text-overflow: ellipsis;
308
+ white-space: nowrap;
309
+ }
310
+
311
+ .sidebar-nav {
312
+ margin-top: 1rem;
313
+ }
314
+
315
+ .sidebar-nav ul {
316
+ list-style: none;
317
+ }
318
+
319
+ .sidebar-nav > ul > li {
320
+ margin-bottom: 1.5rem;
321
+ }
322
+
323
+ .sidebar-nav .nav-section {
324
+ font-weight: 600;
325
+ font-size: 0.75rem;
326
+ text-transform: uppercase;
327
+ letter-spacing: 0.05em;
328
+ color: var(--color-text-muted);
329
+ margin-bottom: 0.5rem;
330
+ }
331
+
332
+ .sidebar-nav .nav-home {
333
+ font-weight: 600;
334
+ font-size: 0.75rem;
335
+ text-transform: uppercase;
336
+ letter-spacing: 0.05em;
337
+ color: var(--color-text-muted);
338
+ text-decoration: none;
339
+ display: block;
340
+ margin-bottom: 1rem;
341
+ }
342
+
343
+ .sidebar-nav .nav-home:hover {
344
+ color: var(--color-primary);
345
+ }
346
+
347
+ .sidebar-nav a {
348
+ color: var(--color-text);
349
+ text-decoration: none;
350
+ font-size: 0.875rem;
351
+ display: block;
352
+ padding: 0.25rem 0;
353
+ transition: color 0.15s ease;
354
+ }
355
+
356
+ .sidebar-nav a:hover {
357
+ color: var(--color-link);
358
+ }
359
+
360
+ .sidebar-nav a.active {
361
+ color: var(--color-link);
362
+ font-weight: 500;
363
+ }
364
+
365
+ .sidebar-nav ul ul {
366
+ margin-left: 1rem;
367
+ margin-top: 0.25rem;
368
+ }
369
+
370
+ /* Collapsible nav groups (details/summary) */
371
+ .sidebar-nav details {
372
+ margin: 0;
373
+ }
374
+
375
+ .sidebar-nav summary {
376
+ cursor: pointer;
377
+ font-size: 0.875rem;
378
+ padding: 0.2rem 0;
379
+ list-style: none;
380
+ }
381
+
382
+ .sidebar-nav summary::-webkit-details-marker {
383
+ display: none;
384
+ }
385
+
386
+ .sidebar-nav .nav-group::before {
387
+ content: "›";
388
+ display: inline-block;
389
+ width: 1em;
390
+ margin-right: 0.15em;
391
+ text-align: center;
392
+ font-size: 0.85em;
393
+ transform-origin: center;
394
+ transition: transform 150ms ease;
395
+ }
396
+
397
+ .sidebar-nav details[open] > .nav-group::before {
398
+ transform: rotate(90deg);
399
+ }
400
+
401
+ .sidebar-nav .nav-group a {
402
+ display: inline;
403
+ }
404
+
405
+ /* Content */
406
+ .content {
407
+ margin-left: var(--sidebar-width);
408
+ flex: 1;
409
+ padding: 3rem 4rem;
410
+ padding-right: 240px; /* Space for TOC */
411
+ padding-bottom: calc(var(--footer-height) + 1rem);
412
+ max-width: 1100px;
413
+ }
414
+
415
+ /* Breadcrumbs */
416
+ .breadcrumbs {
417
+ font-size: 0.875rem;
418
+ color: var(--color-text-muted);
419
+ margin-bottom: 0.5rem;
420
+ }
421
+
422
+ .breadcrumbs a {
423
+ color: var(--color-text-muted);
424
+ text-decoration: none;
425
+ }
426
+
427
+ .breadcrumbs a:hover {
428
+ color: var(--color-link);
429
+ }
430
+
431
+ .breadcrumbs .separator {
432
+ margin: 0 0.375rem;
433
+ opacity: 0.5;
434
+ }
435
+
436
+ /* Page meta (last updated) */
437
+ .page-meta {
438
+ font-size: 0.8125rem;
439
+ color: var(--color-text-muted);
440
+ margin-bottom: 1.5rem;
441
+ }
442
+
443
+ /* Prose styles */
444
+ .prose h1 {
445
+ font-size: 2rem;
446
+ font-weight: 700;
447
+ margin-bottom: 1.5rem;
448
+ line-height: 1.2;
449
+ }
450
+
451
+ .prose h2 {
452
+ font-size: 1.5rem;
453
+ font-weight: 600;
454
+ margin-top: 2.5rem;
455
+ margin-bottom: 1rem;
456
+ padding-bottom: 0.5rem;
457
+ border-bottom: 1px solid var(--color-border);
458
+ }
459
+
460
+ .prose h3 {
461
+ font-size: 1.25rem;
462
+ font-weight: 600;
463
+ margin-top: 2rem;
464
+ margin-bottom: 0.75rem;
465
+ }
466
+
467
+ .prose h4 {
468
+ font-size: 1rem;
469
+ font-weight: 600;
470
+ margin-top: 1.5rem;
471
+ margin-bottom: 0.5rem;
472
+ }
473
+
474
+ .prose p {
475
+ margin-bottom: 1rem;
476
+ }
477
+
478
+ .prose a {
479
+ color: var(--color-link);
480
+ text-decoration: none;
481
+ }
482
+
483
+ .prose a:hover {
484
+ text-decoration: underline;
485
+ }
486
+
487
+ .prose strong {
488
+ font-weight: 600;
489
+ }
490
+
491
+ .prose ul, .prose ol {
492
+ margin-bottom: 1rem;
493
+ padding-left: 1.5rem;
494
+ }
495
+
496
+ .prose li {
497
+ margin-bottom: 0.25rem;
498
+ }
499
+
500
+ .prose blockquote {
501
+ border-left: 4px solid var(--color-accent);
502
+ padding-left: 1rem;
503
+ margin: 1.5rem 0;
504
+ color: var(--color-text-muted);
505
+ font-style: italic;
506
+ }
507
+
508
+ .prose code {
509
+ font-family: var(--font-mono);
510
+ font-size: 0.875em;
511
+ background: var(--color-code-bg);
512
+ padding: 0.125rem 0.375rem;
513
+ border-radius: 0.25rem;
514
+ }
515
+
516
+ .prose pre {
517
+ background: var(--color-code-bg);
518
+ padding: 1rem;
519
+ border-radius: 0.5rem;
520
+ overflow-x: auto;
521
+ margin: 1.5rem 0;
522
+ }
523
+
524
+ .prose pre code {
525
+ background: none;
526
+ padding: 0;
527
+ font-size: 0.8125rem;
528
+ line-height: 1.7;
529
+ }
530
+
531
+ .prose table {
532
+ width: 100%;
533
+ border-collapse: collapse;
534
+ margin: 1.5rem 0;
535
+ font-size: 0.875rem;
536
+ }
537
+
538
+ .prose th, .prose td {
539
+ padding: 0.75rem 1rem;
540
+ text-align: left;
541
+ border-bottom: 1px solid var(--color-border);
542
+ }
543
+
544
+ .prose th {
545
+ font-weight: 600;
546
+ background: var(--color-bg-sidebar);
547
+ }
548
+
549
+ .prose hr {
550
+ border: none;
551
+ border-top: 1px solid var(--color-border);
552
+ margin: 2rem 0;
553
+ }
554
+
555
+ .prose img {
556
+ max-width: 100%;
557
+ height: auto;
558
+ }
559
+
560
+ /* Status badges */
561
+ .status-inviolable {
562
+ display: inline-block;
563
+ background: #dc2626;
564
+ color: white;
565
+ font-size: 0.75rem;
566
+ font-weight: 600;
567
+ padding: 0.25rem 0.5rem;
568
+ border-radius: 0.25rem;
569
+ text-transform: uppercase;
570
+ }
571
+
572
+ .status-approved {
573
+ display: inline-block;
574
+ background: #16a34a;
575
+ color: white;
576
+ font-size: 0.75rem;
577
+ font-weight: 600;
578
+ padding: 0.25rem 0.5rem;
579
+ border-radius: 0.25rem;
580
+ text-transform: uppercase;
581
+ }
582
+
583
+ /* Footer - full-width ribbon pinned to bottom */
584
+ .site-footer {
585
+ position: fixed;
586
+ bottom: 0;
587
+ left: 0;
588
+ right: 0;
589
+ min-height: var(--footer-height);
590
+ z-index: 300;
591
+ display: flex;
592
+ align-items: center;
593
+ padding: 0 1.5rem;
594
+ background: var(--color-bg);
595
+ border-top: 1px solid var(--color-border);
596
+ }
597
+
598
+ .footer-content {
599
+ display: flex;
600
+ align-items: center;
601
+ justify-content: space-between;
602
+ gap: 0.75rem;
603
+ flex-wrap: wrap;
604
+ width: 100%;
605
+ font-size: 0.75rem;
606
+ color: var(--color-text-muted);
607
+ }
608
+
609
+ .footer-left,
610
+ .footer-center,
611
+ .footer-right {
612
+ display: flex;
613
+ align-items: center;
614
+ gap: 0.5rem;
615
+ }
616
+
617
+ .footer-center {
618
+ flex: 1;
619
+ justify-content: center;
620
+ }
621
+
622
+ .footer-right {
623
+ justify-content: flex-end;
624
+ }
625
+
626
+ .footer-separator {
627
+ opacity: 0.5;
628
+ }
629
+
630
+ .footer-version {
631
+ font-family: var(--font-mono);
632
+ }
633
+
634
+ .footer-commit {
635
+ cursor: help;
636
+ }
637
+
638
+ .footer-link {
639
+ color: var(--color-text-muted);
640
+ text-decoration: none;
641
+ }
642
+
643
+ .footer-link:hover {
644
+ color: var(--color-link);
645
+ }
646
+
647
+ /* Mermaid diagrams */
648
+ .mermaid {
649
+ background: transparent;
650
+ overflow-x: auto;
651
+ margin: 1.5rem 0;
652
+ text-align: center;
653
+ }
654
+
655
+ .mermaid svg {
656
+ max-width: 100%;
657
+ height: auto;
658
+ }
659
+
660
+ /* External link indicator */
661
+ .prose a[href^="http"]:not([href*="3leaps.net"])::after {
662
+ content: " ↗";
663
+ font-size: 0.75em;
664
+ opacity: 0.6;
665
+ }
666
+
667
+ /* Copy code button */
668
+ .prose pre {
669
+ position: relative;
670
+ }
671
+
672
+ .copy-button {
673
+ position: absolute;
674
+ top: 0.5rem;
675
+ right: 0.5rem;
676
+ padding: 0.25rem 0.5rem;
677
+ font-size: 0.6875rem;
678
+ font-family: var(--font-sans);
679
+ background: var(--color-bg);
680
+ color: var(--color-text-muted);
681
+ border: 1px solid var(--color-border);
682
+ border-radius: 0.25rem;
683
+ cursor: pointer;
684
+ opacity: 0;
685
+ transition: opacity 0.15s ease;
686
+ }
687
+
688
+ .prose pre:hover .copy-button {
689
+ opacity: 1;
690
+ }
691
+
692
+ .copy-button:hover {
693
+ color: var(--color-text);
694
+ border-color: var(--color-text-muted);
695
+ }
696
+
697
+ /* Footer copyright - now inline in footer-right */
698
+ .footer-copyright {
699
+ font-size: 0.6875rem;
700
+ }
701
+
702
+ /* Mobile header */
703
+ .mobile-header {
704
+ display: none;
705
+ position: fixed;
706
+ top: 0;
707
+ left: 0;
708
+ right: 0;
709
+ height: 3.5rem;
710
+ z-index: 200;
711
+ background: var(--color-bg);
712
+ border-bottom: 1px solid var(--color-border);
713
+ align-items: center;
714
+ justify-content: space-between;
715
+ padding: 0 1rem;
716
+ }
717
+
718
+ .nav-toggle,
719
+ .mobile-theme-toggle {
720
+ background: none;
721
+ border: 1px solid var(--color-border);
722
+ border-radius: 0.375rem;
723
+ padding: 0.5rem;
724
+ cursor: pointer;
725
+ color: var(--color-text);
726
+ }
727
+
728
+ .mobile-theme-toggle {
729
+ color: var(--color-text-muted);
730
+ }
731
+
732
+ .nav-toggle svg,
733
+ .mobile-theme-toggle svg {
734
+ width: 20px;
735
+ height: 20px;
736
+ display: block;
737
+ }
738
+
739
+ .mobile-logo {
740
+ display: flex;
741
+ align-items: center;
742
+ }
743
+
744
+ .mobile-logo svg,
745
+ .mobile-logo img {
746
+ width: 24px;
747
+ height: 24px;
748
+ }
749
+
750
+ .mobile-theme-toggle .icon-sun { display: none; }
751
+ .mobile-theme-toggle .icon-moon { display: block; }
752
+
753
+ [data-theme="dark"] .mobile-theme-toggle .icon-sun { display: block; }
754
+ [data-theme="dark"] .mobile-theme-toggle .icon-moon { display: none; }
755
+
756
+ @media (prefers-color-scheme: dark) {
757
+ :root:not([data-theme="light"]) .mobile-theme-toggle .icon-sun { display: block; }
758
+ :root:not([data-theme="light"]) .mobile-theme-toggle .icon-moon { display: none; }
759
+ }
760
+
761
+ /* On-page TOC */
762
+ .toc {
763
+ position: fixed;
764
+ top: 6rem;
765
+ right: 2rem;
766
+ width: 200px;
767
+ max-height: calc(100vh - 8rem);
768
+ overflow-y: auto;
769
+ font-size: 0.8125rem;
770
+ }
771
+
772
+ .toc-title {
773
+ display: block;
774
+ font-weight: 600;
775
+ font-size: 0.6875rem;
776
+ text-transform: uppercase;
777
+ letter-spacing: 0.05em;
778
+ color: var(--color-text-muted);
779
+ margin-bottom: 0.75rem;
780
+ }
781
+
782
+ .toc ul {
783
+ list-style: none;
784
+ padding: 0;
785
+ margin: 0;
786
+ }
787
+
788
+ .toc li {
789
+ margin-bottom: 0.375rem;
790
+ }
791
+
792
+ .toc a {
793
+ color: var(--color-text-muted);
794
+ text-decoration: none;
795
+ display: block;
796
+ padding: 0.125rem 0;
797
+ transition: color 0.15s ease;
798
+ }
799
+
800
+ .toc a:hover {
801
+ color: var(--color-link);
802
+ }
803
+
804
+ .toc .toc-h3 {
805
+ padding-left: 0.75rem;
806
+ font-size: 0.75rem;
807
+ }
808
+
809
+ /* Responsive */
810
+ @media (max-width: 1200px) {
811
+ .toc {
812
+ display: none;
813
+ }
814
+
815
+ .content {
816
+ padding-right: 4rem;
817
+ max-width: 900px;
818
+ }
819
+ }
820
+
821
+ @media (max-width: 1024px) {
822
+ .sidebar {
823
+ width: 240px;
824
+ }
825
+
826
+ .logo-icon {
827
+ height: 56px;
828
+ max-width: 150px;
829
+ }
830
+
831
+ .logo.logo-wordmark .logo-icon,
832
+ .logo.logo-wordmark .logo-img {
833
+ max-width: 150px;
834
+ max-height: 56px;
835
+ }
836
+
837
+ .content {
838
+ margin-left: 240px;
839
+ padding: 2rem;
840
+ }
841
+ }
842
+
843
+ @media (max-width: 768px) {
844
+ .mobile-header {
845
+ display: flex;
846
+ }
847
+
848
+ .sidebar {
849
+ position: fixed;
850
+ top: 0;
851
+ left: -280px;
852
+ width: 280px;
853
+ height: 100vh;
854
+ z-index: 100;
855
+ transition: left 0.3s ease;
856
+ border-right: 1px solid var(--color-border);
857
+ }
858
+
859
+ .sidebar.open {
860
+ left: 0;
861
+ }
862
+
863
+ .logo-icon {
864
+ height: 48px;
865
+ max-width: 130px;
866
+ }
867
+
868
+ .logo.logo-wordmark .logo-icon,
869
+ .logo.logo-wordmark .logo-img {
870
+ max-width: 130px;
871
+ max-height: 48px;
872
+ }
873
+
874
+ .content {
875
+ margin-left: 0;
876
+ padding: 1.5rem;
877
+ padding-top: 4rem;
878
+ padding-bottom: calc(var(--footer-height) + 1rem);
879
+ }
880
+ }
881
+
882
+ /* Print styles */
883
+ @media print {
884
+ .sidebar,
885
+ .mobile-header,
886
+ .toc,
887
+ .theme-toggle,
888
+ .copy-button,
889
+ .site-footer {
890
+ display: none !important;
891
+ }
892
+
893
+ .layout {
894
+ display: block;
895
+ }
896
+
897
+ .content {
898
+ margin: 0;
899
+ padding: 0;
900
+ max-width: 100%;
901
+ }
902
+
903
+ .prose {
904
+ font-size: 11pt;
905
+ line-height: 1.5;
906
+ }
907
+
908
+ .prose a {
909
+ color: inherit;
910
+ text-decoration: underline;
911
+ }
912
+
913
+ .prose a[href^="http"]::after {
914
+ content: " (" attr(href) ")";
915
+ font-size: 0.8em;
916
+ word-break: break-all;
917
+ }
918
+
919
+ .prose pre {
920
+ white-space: pre-wrap;
921
+ border: 1px solid #ccc;
922
+ }
923
+
924
+ h1, h2, h3 {
925
+ page-break-after: avoid;
926
+ }
927
+
928
+ pre, table, .mermaid {
929
+ page-break-inside: avoid;
930
+ }
931
+ }