methanol 0.0.0 → 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (45) hide show
  1. package/.editorconfig +19 -0
  2. package/.prettierrc +10 -0
  3. package/LICENSE +203 -0
  4. package/banner.txt +6 -0
  5. package/bin/methanol.js +24 -0
  6. package/index.js +22 -0
  7. package/package.json +42 -9
  8. package/src/assets.js +30 -0
  9. package/src/build-system.js +200 -0
  10. package/src/components.js +145 -0
  11. package/src/config.js +355 -0
  12. package/src/dev-server.js +559 -0
  13. package/src/main.js +87 -0
  14. package/src/mdx.js +254 -0
  15. package/src/node-loader.js +88 -0
  16. package/src/pagefind.js +99 -0
  17. package/src/pages.js +638 -0
  18. package/src/preview-server.js +58 -0
  19. package/src/public-assets.js +73 -0
  20. package/src/register-loader.js +29 -0
  21. package/src/rehype-plugins/link-resolve.js +89 -0
  22. package/src/rehype-plugins/methanol-ctx.js +89 -0
  23. package/src/renderer.js +25 -0
  24. package/src/rewind.js +117 -0
  25. package/src/stage-logger.js +59 -0
  26. package/src/state.js +159 -0
  27. package/src/virtual-module/inject.js +30 -0
  28. package/src/virtual-module/loader.js +116 -0
  29. package/src/virtual-module/pagefind.js +108 -0
  30. package/src/vite-plugins.js +173 -0
  31. package/themes/default/components/ThemeColorSwitch.client.jsx +95 -0
  32. package/themes/default/components/ThemeColorSwitch.static.jsx +23 -0
  33. package/themes/default/components/ThemeSearchBox.client.jsx +287 -0
  34. package/themes/default/components/ThemeSearchBox.static.jsx +41 -0
  35. package/themes/default/components/ThemeToCContainer.client.jsx +154 -0
  36. package/themes/default/components/ThemeToCContainer.static.jsx +61 -0
  37. package/themes/default/components/pre.client.jsx +84 -0
  38. package/themes/default/components/pre.jsx +27 -0
  39. package/themes/default/heading.jsx +35 -0
  40. package/themes/default/index.js +50 -0
  41. package/themes/default/page.jsx +249 -0
  42. package/themes/default/pages/404.mdx +8 -0
  43. package/themes/default/pages/index.mdx +9 -0
  44. package/themes/default/public/logo.png +0 -0
  45. package/themes/default/resources/style.css +1089 -0
@@ -0,0 +1,1089 @@
1
+ @import '@wooorm/starry-night/style/both';
2
+
3
+ :root {
4
+ interpolate-size: allow-keywords;
5
+ color-scheme: dark;
6
+ --bg: #09090b;
7
+ --surface: #0c0c0e;
8
+ --surface-muted: #17171a;
9
+ --surface-elevated: #1c1c21;
10
+ --text: #fafafa;
11
+ --muted: #a1a1aa;
12
+ --border: #27272a;
13
+ --accent: #f43f5e;
14
+ --accent-foreground: #ffffff;
15
+ --accent-soft: rgba(244, 63, 94, 0.1);
16
+ --radius: 8px;
17
+ --sidebar-width: 260px;
18
+ --toc-width: 240px;
19
+ --header-height: 0px;
20
+ --hover-bg: rgba(255, 255, 255, 0.05);
21
+
22
+ @media (prefers-color-scheme: light) {
23
+ & {
24
+ color-scheme: light;
25
+ --bg: #ffffff;
26
+ --surface: #fafafa;
27
+ --surface-muted: #f4f4f5;
28
+ --surface-elevated: #ffffff;
29
+ --text: #09090b;
30
+ --muted: #71717a;
31
+ --border: #e4e4e7;
32
+ --accent: #e11d48;
33
+ --accent-foreground: #ffffff;
34
+ --accent-soft: rgba(225, 29, 72, 0.08);
35
+ --hover-bg: rgba(0, 0, 0, 0.04);
36
+ }
37
+ }
38
+
39
+ &.light {
40
+ color-scheme: light;
41
+ --bg: #ffffff;
42
+ --surface: #fafafa;
43
+ --surface-muted: #f4f4f5;
44
+ --surface-elevated: #ffffff;
45
+ --text: #09090b;
46
+ --muted: #71717a;
47
+ --border: #e4e4e7;
48
+ --accent: #e11d48;
49
+ --accent-foreground: #ffffff;
50
+ --accent-soft: rgba(225, 29, 72, 0.08);
51
+ --hover-bg: rgba(0, 0, 0, 0.04);
52
+ }
53
+
54
+ &.dark {
55
+ color-scheme: dark;
56
+ --bg: #09090b;
57
+ --surface: #0c0c0e;
58
+ --surface-muted: #17171a;
59
+ --surface-elevated: #1c1c21;
60
+ --text: #fafafa;
61
+ --muted: #a1a1aa;
62
+ --border: #27272a;
63
+ --accent: #f43f5e;
64
+ --accent-foreground: #ffffff;
65
+ --accent-soft: rgba(244, 63, 94, 0.1);
66
+ --radius: 8px;
67
+ --hover-bg: rgba(255, 255, 255, 0.05);
68
+ }
69
+ }
70
+
71
+ *,
72
+ *::before,
73
+ *::after {
74
+ box-sizing: border-box;
75
+ }
76
+
77
+ html {
78
+ scroll-behavior: smooth;
79
+ }
80
+
81
+ body {
82
+ margin: 0;
83
+ font-family:
84
+ 'Inter', ui-sans-serif, system-ui, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol',
85
+ 'Noto Color Emoji';
86
+ line-height: 1.6;
87
+ color: var(--text);
88
+ background-color: var(--bg);
89
+ background-image:
90
+ radial-gradient(at 0% 0%, rgba(244, 63, 94, 0.05) 0px, transparent 50%),
91
+ radial-gradient(at 100% 0%, rgba(244, 63, 94, 0.02) 0px, transparent 50%);
92
+ background-attachment: fixed;
93
+ -webkit-font-smoothing: antialiased;
94
+
95
+ @media (prefers-color-scheme: light) {
96
+ background-image:
97
+ radial-gradient(at 0% 0%, rgba(225, 29, 72, 0.03) 0px, transparent 50%),
98
+ radial-gradient(at 100% 0%, rgba(225, 29, 72, 0.01) 0px, transparent 50%);
99
+ }
100
+ }
101
+
102
+ a {
103
+ color: inherit;
104
+ text-decoration: none;
105
+ transition: color 0.15s ease;
106
+
107
+ &:hover {
108
+ color: var(--text);
109
+ }
110
+ }
111
+
112
+ .text-accent {
113
+ color: var(--accent);
114
+ }
115
+
116
+ /* --- Layout --- */
117
+
118
+ .layout-container {
119
+ display: grid;
120
+ grid-template-columns: var(--sidebar-width) minmax(0, 1fr) var(--toc-width);
121
+ gap: 3rem;
122
+ max-width: 1400px;
123
+ margin: 0 auto;
124
+ padding: 0 1.5rem;
125
+
126
+ &.no-toc {
127
+ grid-template-columns: var(--sidebar-width) minmax(0, 1fr);
128
+ padding-right: 3rem;
129
+ }
130
+ }
131
+
132
+ /* --- Sidebar --- */
133
+
134
+ .sidebar {
135
+ position: sticky;
136
+ top: 0;
137
+ height: 100vh;
138
+ overflow-y: auto;
139
+ padding: 2rem 0;
140
+ display: flex;
141
+ flex-direction: column;
142
+ gap: 1.5rem;
143
+ border-right: 1px solid transparent; /* Align visually */
144
+
145
+ .sidebar-header {
146
+ display: flex;
147
+ flex-direction: column;
148
+ gap: 1rem;
149
+
150
+ .logo {
151
+ display: flex;
152
+ flex-direction: column;
153
+ align-items: center;
154
+ gap: 0.5rem;
155
+ padding: 0.5rem 0;
156
+ text-align: center;
157
+ position: relative;
158
+
159
+ img {
160
+ max-height: 256px;
161
+ max-width: 100%;
162
+ height: auto;
163
+ width: auto;
164
+ object-fit: contain;
165
+ }
166
+
167
+ span {
168
+ font-weight: 800;
169
+ font-size: 1.4rem;
170
+ letter-spacing: -0.03em;
171
+ color: var(--text);
172
+ line-height: 1.2;
173
+ }
174
+ }
175
+
176
+ .search-box {
177
+ display: flex;
178
+ align-items: center;
179
+ gap: 0.5rem;
180
+ width: 100%;
181
+ background: var(--surface-muted);
182
+ border: 1px solid var(--border);
183
+ border-radius: var(--radius);
184
+ padding: 0.5rem 0.75rem;
185
+ color: var(--muted);
186
+ font-size: 0.875rem;
187
+ cursor: pointer;
188
+ transition: all 0.15s ease;
189
+
190
+ kbd {
191
+ margin-left: auto;
192
+ font-family: inherit;
193
+ font-size: 0.75rem;
194
+ border: 1px solid var(--border);
195
+ border-radius: 4px;
196
+ padding: 0.1rem 0.3rem;
197
+ background: var(--surface);
198
+ }
199
+
200
+ &:hover {
201
+ border-color: var(--muted);
202
+ color: var(--text);
203
+ }
204
+ }
205
+ }
206
+
207
+ nav ul {
208
+ list-style: none;
209
+ margin: 0;
210
+ padding: 0;
211
+ display: flex;
212
+ flex-direction: column;
213
+
214
+ ul {
215
+ margin-left: 10px;
216
+ position: relative;
217
+ &::before {
218
+ content: '';
219
+ position: absolute;
220
+ left: 5px;
221
+ top: 6px;
222
+ width: 1px;
223
+ height: calc(100% - 12px);
224
+ background-color: var(--border);
225
+ border-radius: 0.5px;
226
+ }
227
+
228
+ .sb-dir-header {
229
+ margin-top: 0.25rem;
230
+ }
231
+
232
+ .nav-dir-label,
233
+ .nav-dir-link {
234
+ text-transform: uppercase;
235
+ font-size: 0.75rem;
236
+ font-weight: 700;
237
+ letter-spacing: 0.05em;
238
+ }
239
+ }
240
+ }
241
+
242
+ li {
243
+ margin: 0;
244
+ }
245
+
246
+ /* Common Link Styling */
247
+ a {
248
+ display: block;
249
+ padding: 0.35rem 0.75rem;
250
+ border-radius: var(--radius);
251
+ color: var(--muted);
252
+ font-size: 0.9rem;
253
+ font-weight: 500;
254
+ transition: all 0.1s ease;
255
+ position: relative;
256
+ isolation: isolate;
257
+
258
+ &::before {
259
+ content: '';
260
+ position: absolute;
261
+ inset: 0;
262
+ border-radius: var(--radius);
263
+ z-index: -1;
264
+ transition: background-color 0.1s ease;
265
+ }
266
+
267
+ &:hover {
268
+ color: var(--text);
269
+ &::before {
270
+ background: var(--hover-bg);
271
+ }
272
+ }
273
+
274
+ &.active {
275
+ color: var(--accent);
276
+ &::before {
277
+ background: var(--accent-soft);
278
+ }
279
+ &::after {
280
+ content: '';
281
+ position: absolute;
282
+ border-radius: 1.5px;
283
+ height: calc(100% - 12px);
284
+ left: 4px;
285
+ top: 6px;
286
+ width: 3px;
287
+ background-color: var(--accent);
288
+ }
289
+ }
290
+ }
291
+
292
+ /* Directory Styling */
293
+ .sidebar-collapsible {
294
+ width: 100%;
295
+
296
+ &::details-content {
297
+ opacity: 0;
298
+ height: 0;
299
+ overflow: hidden;
300
+ transition:
301
+ height 0.25s ease-out,
302
+ opacity 0.2s ease-out;
303
+ transition-behavior: allow-discrete;
304
+ }
305
+
306
+ &[open]::details-content {
307
+ opacity: 1;
308
+ height: auto;
309
+ }
310
+
311
+ /* Chevron indicator button on the right */
312
+ &:has(ul) > .sb-dir-header::after {
313
+ content: '';
314
+ width: 1rem;
315
+ height: 1rem;
316
+ margin-right: 0.75rem;
317
+ background-color: currentColor;
318
+ -webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='3' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='m9 18 6-6-6-6'%3E%3C/path%3E%3C/svg%3E");
319
+ mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='3' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='m9 18 6-6-6-6'%3E%3C/path%3E%3C/svg%3E");
320
+ -webkit-mask-size: contain;
321
+ mask-size: contain;
322
+ -webkit-mask-repeat: no-repeat;
323
+ mask-repeat: no-repeat;
324
+ transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);
325
+ opacity: 0.3;
326
+ flex-shrink: 0;
327
+ }
328
+
329
+ &[open] > .sb-dir-header::after {
330
+ transform: rotate(90deg);
331
+ opacity: 0.5;
332
+ }
333
+ }
334
+
335
+ .sb-dir-header {
336
+ list-style: none;
337
+ display: flex;
338
+ align-items: center;
339
+ outline: none;
340
+ cursor: pointer;
341
+ margin-top: 1.25rem;
342
+ border-radius: var(--radius);
343
+ transition: all 0.1s ease;
344
+ position: relative;
345
+ isolation: isolate;
346
+
347
+ &::-webkit-details-marker {
348
+ display: none;
349
+ }
350
+
351
+ &::before {
352
+ content: '';
353
+ position: absolute;
354
+ inset: 0;
355
+ border-radius: var(--radius);
356
+ z-index: -1;
357
+ transition: background-color 0.1s ease;
358
+ }
359
+
360
+ &:hover {
361
+ .nav-dir-link {
362
+ color: var(--accent);
363
+ }
364
+ &::before {
365
+ background: var(--hover-bg);
366
+ }
367
+ &::after {
368
+ opacity: 0.8;
369
+ background-color: var(--accent);
370
+ }
371
+ }
372
+ }
373
+
374
+ .nav-dir-label,
375
+ .nav-dir-link {
376
+ flex: 1;
377
+ display: block;
378
+ margin: 0;
379
+ padding: 0.35rem 0.75rem;
380
+ font-size: 0.75rem;
381
+ font-weight: 700;
382
+ text-transform: uppercase;
383
+ letter-spacing: 0.05em;
384
+ color: var(--text);
385
+ transition: all 0.1s ease;
386
+ }
387
+
388
+ .nav-dir-link {
389
+ cursor: pointer;
390
+ background: none !important;
391
+ position: static;
392
+
393
+ &::before {
394
+ display: none !important;
395
+ content: none !important;
396
+ view-transition-name: none !important;
397
+ }
398
+ }
399
+
400
+ .lang-switch select {
401
+ width: 100%;
402
+ padding: 0.5rem 0.75rem;
403
+ background: var(--surface-muted);
404
+ border: 1px solid var(--border);
405
+ border-radius: var(--radius);
406
+ color: var(--text);
407
+ font-size: 0.875rem;
408
+ font-weight: 500;
409
+ cursor: pointer;
410
+ appearance: none;
411
+ }
412
+
413
+ .sidebar-footer {
414
+ margin-top: auto;
415
+ padding-top: 1rem;
416
+ border-top: 1px solid var(--border);
417
+ display: flex;
418
+ align-items: center;
419
+ gap: 0.5rem;
420
+ justify-content: end;
421
+ flex-wrap: wrap;
422
+ }
423
+
424
+ .lang-switch-wrapper {
425
+ flex: 1;
426
+ position: relative;
427
+ height: 2.25rem;
428
+ background: var(--surface-muted);
429
+ border: 1px solid var(--border);
430
+ border-radius: var(--radius);
431
+ transition: all 0.2s ease;
432
+ flex-grow: 1;
433
+
434
+ &:hover {
435
+ background: var(--hover-bg);
436
+ border-color: var(--muted);
437
+ }
438
+
439
+ .lang-switch-icon {
440
+ position: absolute;
441
+ left: 0.75rem;
442
+ top: 50%;
443
+ transform: translateY(-50%);
444
+ display: flex;
445
+ align-items: center;
446
+ pointer-events: none;
447
+ color: var(--text);
448
+ opacity: 0.7;
449
+ }
450
+
451
+ select {
452
+ width: 100%;
453
+ height: 100%;
454
+ padding: 0 0.75rem 0 2.25rem;
455
+ cursor: pointer;
456
+ appearance: none;
457
+ background: transparent;
458
+ border: none;
459
+ color: var(--text);
460
+ font-size: 0.875rem;
461
+ font-weight: 500;
462
+ outline: none;
463
+ }
464
+ }
465
+
466
+ .theme-switch-container {
467
+ width: 2.25rem;
468
+ height: 2.25rem;
469
+ flex-grow: 0;
470
+ }
471
+
472
+ .theme-switch-btn {
473
+ display: flex;
474
+ align-items: center;
475
+ justify-content: center;
476
+ width: 100%;
477
+ height: 100%;
478
+ background: var(--surface-muted);
479
+ border: 1px solid var(--border);
480
+ border-radius: var(--radius);
481
+ color: var(--text);
482
+ cursor: pointer;
483
+ transition: all 0.2s ease;
484
+
485
+ &:hover {
486
+ background: var(--hover-bg);
487
+ border-color: var(--muted);
488
+ }
489
+
490
+ svg {
491
+ opacity: 0.8;
492
+ }
493
+
494
+ span {
495
+ display: none;
496
+ }
497
+ }
498
+ }
499
+
500
+ .search-modal {
501
+ position: fixed;
502
+ inset: 0;
503
+ display: none;
504
+ align-items: center;
505
+ justify-content: center;
506
+ z-index: 80;
507
+
508
+ &.open {
509
+ display: flex;
510
+ }
511
+ }
512
+
513
+ .search-modal__scrim {
514
+ position: absolute;
515
+ inset: 0;
516
+ background: rgba(10, 12, 18, 0.6);
517
+ }
518
+
519
+ .search-modal__panel {
520
+ position: relative;
521
+ width: min(720px, 92vw);
522
+ max-height: 80vh;
523
+ overflow: auto;
524
+ background: var(--surface);
525
+ border: 1px solid var(--border);
526
+ border-radius: calc(var(--radius) + 2px);
527
+ padding: 1rem;
528
+ box-shadow: 0 28px 80px rgba(10, 12, 18, 0.25);
529
+ }
530
+
531
+ /* Active State for Directories (Applied from parent .is-active) */
532
+ .is-active > .sidebar-collapsible > .sb-dir-header {
533
+ .nav-dir-link {
534
+ color: var(--accent);
535
+ }
536
+ &::before {
537
+ background: var(--accent-soft);
538
+ }
539
+ }
540
+
541
+ /* --- Search UI --- */
542
+
543
+ .search-modal__panel {
544
+ display: flex;
545
+ flex-direction: column;
546
+ padding: 0;
547
+ height: 60vh;
548
+ max-height: 600px;
549
+ overflow: hidden;
550
+ }
551
+
552
+ .search-input-wrapper {
553
+ display: flex;
554
+ align-items: center;
555
+ gap: 0.75rem;
556
+ padding: 1rem;
557
+ border-bottom: 1px solid var(--border);
558
+ flex-shrink: 0;
559
+
560
+ svg {
561
+ color: var(--muted);
562
+ }
563
+ }
564
+
565
+ .search-input {
566
+ flex: 1;
567
+ background: transparent;
568
+ border: none;
569
+ font-size: 1.1rem;
570
+ color: var(--text);
571
+ outline: none;
572
+ min-width: 0;
573
+
574
+ &::placeholder {
575
+ color: var(--muted);
576
+ opacity: 0.7;
577
+ }
578
+ }
579
+
580
+ .search-results {
581
+ flex: 1;
582
+ overflow-y: auto;
583
+ padding: 0.5rem;
584
+ display: flex;
585
+ flex-direction: column;
586
+ gap: 0.25rem;
587
+
588
+ &::-webkit-scrollbar {
589
+ width: 14px;
590
+ }
591
+
592
+ &::-webkit-scrollbar-track {
593
+ background: transparent;
594
+ }
595
+
596
+ &::-webkit-scrollbar-thumb {
597
+ background-color: var(--border);
598
+ border: 4px solid transparent;
599
+ background-clip: content-box;
600
+ border-radius: 99px;
601
+
602
+ &:hover {
603
+ background-color: var(--muted);
604
+ }
605
+ }
606
+ }
607
+
608
+ .search-result-item {
609
+ display: block;
610
+ padding: 0.75rem 1rem;
611
+ border-radius: var(--radius);
612
+ cursor: pointer;
613
+ border: 1px solid transparent;
614
+ transition: all 0.1s ease;
615
+
616
+ &:hover, &:focus-visible {
617
+ background: var(--surface-muted);
618
+ border-color: var(--border);
619
+ outline: none;
620
+ }
621
+ }
622
+
623
+ .search-result-title {
624
+ display: flex;
625
+ align-items: center;
626
+ gap: 0.5rem;
627
+ font-weight: 600;
628
+ color: var(--accent);
629
+ margin-bottom: 0.25rem;
630
+ font-size: 0.95rem;
631
+
632
+ svg {
633
+ color: var(--muted);
634
+ flex-shrink: 0;
635
+ }
636
+ }
637
+
638
+ .search-result-excerpt {
639
+ font-size: 0.85rem;
640
+ color: var(--muted);
641
+ line-height: 1.5;
642
+ display: -webkit-box;
643
+ -webkit-line-clamp: 2;
644
+ -webkit-box-orient: vertical;
645
+ overflow: hidden;
646
+
647
+ mark {
648
+ background: transparent;
649
+ color: var(--text);
650
+ font-weight: 600;
651
+ text-decoration: underline;
652
+ text-decoration-color: var(--accent);
653
+ text-underline-offset: 2px;
654
+ }
655
+ }
656
+
657
+ .search-status {
658
+ padding: 2rem;
659
+ text-align: center;
660
+ color: var(--muted);
661
+ font-size: 0.9rem;
662
+ }
663
+
664
+ /* --- TOC --- */
665
+
666
+ .toc-panel {
667
+ position: sticky;
668
+ top: 0;
669
+ height: 100vh;
670
+ padding: 3rem 0;
671
+ overflow-y: auto;
672
+ }
673
+
674
+ .toc-indicator {
675
+ position: absolute;
676
+ left: 6px;
677
+ width: calc(100% - 1rem);
678
+ background-color: var(--hover-bg);
679
+ transition:
680
+ top 0.2s cubic-bezier(0.4, 0, 0.2, 1),
681
+ height 0.2s cubic-bezier(0.4, 0, 0.2, 1),
682
+ opacity 0.2s ease;
683
+ border-radius: var(--radius);
684
+ pointer-events: none;
685
+
686
+ &::before {
687
+ content: '';
688
+ position: absolute;
689
+ left: 8px;
690
+ top: 6px;
691
+ bottom: 6px;
692
+ width: 3px;
693
+ background-color: var(--accent);
694
+ border-radius: 1.5px;
695
+ }
696
+ }
697
+
698
+ .toc {
699
+ h4 {
700
+ margin: 0 0 1rem 0.5rem;
701
+ font-size: 0.8rem;
702
+ font-weight: 600;
703
+ color: var(--text);
704
+ display: flex;
705
+ align-items: center;
706
+ gap: 0.5rem;
707
+
708
+ &::before {
709
+ content: '';
710
+ display: block;
711
+ width: 1rem;
712
+ height: 1rem;
713
+ background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='%23ededed' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cline x1='21' y1='10' x2='3' y2='10'%3E%3C/line%3E%3Cline x1='21' y1='6' x2='3' y2='6'%3E%3C/line%3E%3Cline x1='21' y1='14' x2='3' y2='14'%3E%3C/line%3E%3Cline x1='21' y1='18' x2='3' y2='18'%3E%3C/line%3E%3C/svg%3E");
714
+ background-size: contain;
715
+ background-repeat: no-repeat;
716
+ opacity: 0.5;
717
+
718
+ @media (prefers-color-scheme: light) {
719
+ background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='%2309090b' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cline x1='21' y1='10' x2='3' y2='10'%3E%3C/line%3E%3Cline x1='21' y1='6' x2='3' y2='6'%3E%3C/line%3E%3Cline x1='21' y1='14' x2='3' y2='14'%3E%3C/line%3E%3Cline x1='21' y1='18' x2='3' y2='18'%3E%3C/line%3E%3C/svg%3E");
720
+ }
721
+ }
722
+ }
723
+
724
+ ul {
725
+ list-style: none;
726
+ margin: 0;
727
+ padding: 0;
728
+ display: flex;
729
+ flex-direction: column;
730
+ border-left: 1px solid var(--border);
731
+ margin-left: 15px;
732
+ }
733
+
734
+ a {
735
+ display: block;
736
+ padding: 0.35rem 1rem 0.35rem 1rem;
737
+ color: var(--muted);
738
+ font-size: 0.85rem;
739
+ border-left: 1px solid transparent;
740
+ margin-left: -1px;
741
+ transition: all 0.2s ease;
742
+ word-break: break-word;
743
+
744
+ &:hover {
745
+ color: var(--text);
746
+ }
747
+
748
+ &.active {
749
+ color: var(--accent);
750
+ }
751
+ }
752
+ }
753
+
754
+ /* --- Main Content --- */
755
+
756
+ .main-content {
757
+ padding: 3rem 0;
758
+ min-width: 0;
759
+
760
+ h1 {
761
+ font-size: 2.5rem;
762
+ font-weight: 700;
763
+ letter-spacing: -0.02em;
764
+ margin-bottom: 2rem;
765
+ color: var(--text);
766
+ }
767
+
768
+ h2 {
769
+ font-size: 1.75rem;
770
+ font-weight: 600;
771
+ letter-spacing: -0.01em;
772
+ margin-top: 3rem;
773
+ margin-bottom: 1.25rem;
774
+ padding-bottom: 0.5rem;
775
+ border-bottom: 1px solid var(--border);
776
+ }
777
+
778
+ h3 {
779
+ font-size: 1.25rem;
780
+ font-weight: 600;
781
+ margin-top: 2rem;
782
+ margin-bottom: 1rem;
783
+ }
784
+
785
+ p {
786
+ color: var(--muted);
787
+ margin-bottom: 1.25rem;
788
+ font-size: 1.05rem;
789
+ }
790
+
791
+ ul,
792
+ ol {
793
+ color: var(--muted);
794
+ padding-left: 1.5rem;
795
+ margin-bottom: 1.5rem;
796
+ }
797
+
798
+ li {
799
+ margin-bottom: 0.5rem;
800
+ }
801
+
802
+ pre {
803
+ background: var(--surface);
804
+ border: 1px solid var(--border);
805
+ border-radius: var(--radius);
806
+ padding: 1.25rem;
807
+ overflow-x: auto;
808
+ margin: 0;
809
+ white-space: pre;
810
+
811
+ code {
812
+ white-space: pre;
813
+ word-break: normal;
814
+ word-wrap: normal;
815
+ }
816
+ }
817
+
818
+ .code-block-container {
819
+ position: relative;
820
+ margin: 1.5rem 0;
821
+
822
+ &:hover .copy-btn {
823
+ opacity: 1;
824
+ }
825
+ }
826
+
827
+ .copy-btn {
828
+ position: absolute;
829
+ top: 0.75rem;
830
+ right: 0.75rem;
831
+ z-index: 10;
832
+ display: flex;
833
+ align-items: center;
834
+ justify-content: center;
835
+ width: 2.125rem;
836
+ height: 2.125rem;
837
+ padding: 0;
838
+ color: var(--muted);
839
+ background: var(--surface-elevated);
840
+ border: 1px solid var(--border);
841
+ border-radius: 6px;
842
+ cursor: pointer;
843
+ opacity: 0;
844
+ transition: all 0.2s ease;
845
+
846
+ &:hover {
847
+ color: var(--text);
848
+ background: var(--hover-bg);
849
+ border-color: var(--muted);
850
+ }
851
+
852
+ &:active {
853
+ transform: scale(0.95);
854
+ }
855
+
856
+ svg {
857
+ display: block;
858
+ }
859
+ }
860
+
861
+ :not(pre) > code {
862
+ background: var(--surface-muted);
863
+ border: 1px solid var(--border);
864
+ border-radius: 4px;
865
+ padding: 0.15em 0.3em;
866
+ font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;
867
+ font-size: 0.85em;
868
+ color: var(--text);
869
+ }
870
+
871
+ blockquote {
872
+ margin: 2rem 0;
873
+ padding: 1.25rem 1.5rem;
874
+ padding-left: 2rem;
875
+ background: var(--surface-muted);
876
+ border: 1px solid var(--border);
877
+ border-radius: var(--radius);
878
+ color: var(--text);
879
+ position: relative;
880
+
881
+ &::before {
882
+ content: '';
883
+ position: absolute;
884
+ left: 0.75rem;
885
+ top: 1.25rem;
886
+ bottom: 1.25rem;
887
+ width: 3px;
888
+ background-color: var(--accent);
889
+ border-radius: 1.5px;
890
+ }
891
+
892
+ & p {
893
+ margin: 0;
894
+ text-autospace: normal;
895
+ }
896
+ }
897
+
898
+ a {
899
+ color: var(--text);
900
+ text-decoration: underline;
901
+ text-decoration-color: var(--border);
902
+ text-underline-offset: 4px;
903
+
904
+ &:hover {
905
+ text-decoration-color: var(--accent);
906
+ }
907
+ }
908
+
909
+ h1,
910
+ h2,
911
+ h3,
912
+ h4,
913
+ h5,
914
+ h6 {
915
+ position: relative;
916
+
917
+ &:hover .heading-anchor {
918
+ opacity: 0.5;
919
+ }
920
+
921
+ .heading-anchor {
922
+ opacity: 0;
923
+ color: var(--muted);
924
+ text-decoration: none !important;
925
+ left: -0.8em;
926
+ transition: all 0.2s;
927
+ font-weight: 800;
928
+ border: none;
929
+ user-select: none;
930
+ transform: scale(0.8);
931
+ position: absolute;
932
+ display: block;
933
+
934
+ &::before {
935
+ content: '#';
936
+ }
937
+
938
+ &:hover {
939
+ opacity: 1;
940
+ color: var(--accent);
941
+ }
942
+
943
+ @media (max-width: 1024px) {
944
+ display: none;
945
+ }
946
+ }
947
+ }
948
+ }
949
+
950
+ .page-meta {
951
+ margin-top: 4rem;
952
+ padding-top: 1.5rem;
953
+ border-top: 1px solid var(--border);
954
+ color: var(--muted);
955
+ font-size: 0.875rem;
956
+ }
957
+
958
+ /* --- Mobile / Toggles --- */
959
+
960
+ .nav-toggle,
961
+ .toc-toggle,
962
+ .nav-scrim {
963
+ display: none;
964
+ }
965
+
966
+ .nav-toggle-label,
967
+ .toc-toggle-label {
968
+ display: none;
969
+ position: fixed;
970
+ top: 1rem;
971
+ z-index: 50;
972
+ padding: 0.5rem;
973
+ background: var(--surface);
974
+ border: 1px solid var(--border);
975
+ border-radius: var(--radius);
976
+ color: var(--muted);
977
+ cursor: pointer;
978
+ }
979
+
980
+ .nav-toggle-label {
981
+ left: 1rem;
982
+ }
983
+ .toc-toggle-label {
984
+ right: 1rem;
985
+ }
986
+
987
+ @media (max-width: 1024px) {
988
+ .layout-container {
989
+ &,
990
+ &.no-toc {
991
+ grid-template-columns: 1fr;
992
+ padding: 4rem 1rem 0;
993
+ }
994
+ }
995
+
996
+ .sidebar,
997
+ .toc-panel {
998
+ position: fixed;
999
+ top: 0;
1000
+ bottom: 0;
1001
+ width: 280px;
1002
+ background: var(--surface);
1003
+ border: 1px solid var(--border);
1004
+ z-index: 100;
1005
+ padding: 2rem 1.5rem;
1006
+ transition: transform 0.3s cubic-bezier(0.16, 1, 0.3, 1);
1007
+ }
1008
+
1009
+ .sidebar {
1010
+ left: 0;
1011
+ transform: translateX(-100%);
1012
+ border-left: none;
1013
+ }
1014
+
1015
+ .toc-panel {
1016
+ right: 0;
1017
+ transform: translateX(100%);
1018
+ border-right: none;
1019
+ }
1020
+
1021
+ .nav-toggle-label,
1022
+ .toc-toggle-label {
1023
+ display: flex;
1024
+ }
1025
+
1026
+ .nav-scrim {
1027
+ position: fixed;
1028
+ inset: 0;
1029
+ background: rgba(0, 0, 0, 0.6);
1030
+ backdrop-filter: blur(2px);
1031
+ z-index: 90;
1032
+ opacity: 0;
1033
+ pointer-events: none;
1034
+ transition: opacity 0.3s ease;
1035
+ }
1036
+
1037
+ .nav-toggle:checked {
1038
+ ~ .nav-scrim-nav {
1039
+ display: block;
1040
+ opacity: 1;
1041
+ pointer-events: auto;
1042
+ }
1043
+ ~ .layout-container .sidebar {
1044
+ transform: translateX(0);
1045
+ }
1046
+ }
1047
+
1048
+ .toc-toggle:checked {
1049
+ ~ .nav-scrim-toc {
1050
+ display: block;
1051
+ opacity: 1;
1052
+ pointer-events: auto;
1053
+ }
1054
+ ~ .layout-container .toc-panel {
1055
+ transform: translateX(0);
1056
+ }
1057
+ }
1058
+
1059
+ .main-content {
1060
+ padding: 2rem 0;
1061
+ }
1062
+ }
1063
+
1064
+ @media (max-width: 640px) {
1065
+ .layout-container {
1066
+ padding: 4rem 0.75rem 0;
1067
+ }
1068
+
1069
+ .main-content {
1070
+ padding: 2rem 0;
1071
+
1072
+ h1 {
1073
+ font-size: 2rem;
1074
+ }
1075
+ }
1076
+ }
1077
+
1078
+ /* --- View Transitions --- */
1079
+
1080
+ @view-transition {
1081
+ navigation: auto;
1082
+ }
1083
+
1084
+ /* Assign the view-transition-name to the active background only */
1085
+ .sidebar a.active::before,
1086
+ .is-active > .sidebar-collapsible > .sb-dir-header::before {
1087
+ view-transition-name: active-sidebar-bg;
1088
+ contain: layout paint;
1089
+ }