for-humanity 0.4.4 → 0.5.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.
Files changed (81) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/README.md +5 -5
  3. package/dist/browser.js +39 -0
  4. package/dist/cli.css +350 -262
  5. package/dist/cli.js +1123 -363
  6. package/package.json +8 -11
  7. package/src/component/widget/{shell → cursor-face}/_constant/cursor-face.ts +5 -0
  8. package/src/component/widget/cursor-face/wg-cursor-face.css +15 -0
  9. package/src/component/widget/cursor-face/wg-cursor-face.tsx +153 -0
  10. package/src/component/widget/navigation/_constant/navigation-data-schema.ts +35 -0
  11. package/src/component/widget/navigation/_constant/navigation.ts +9 -0
  12. package/src/component/widget/navigation/_function/restore-navigation-scroll.ts +59 -0
  13. package/src/{content → component/widget/navigation/_function}/to-doc-groups/_to-doc-branches.ts +2 -2
  14. package/src/{content → component/widget/navigation/_function}/to-doc-groups/_to-doc-group-branches.ts +3 -3
  15. package/src/{content → component/widget/navigation/_function}/to-doc-groups/to-doc-groups.ts +1 -1
  16. package/src/component/widget/navigation/_function/to-navigation-branch-id.ts +6 -0
  17. package/src/component/widget/navigation/_function/to-navigation-data/_to-navigation-document.ts +14 -0
  18. package/src/component/widget/navigation/_function/to-navigation-data/_to-navigation-group.ts +14 -0
  19. package/src/component/widget/navigation/_function/to-navigation-data/to-navigation-data.ts +25 -0
  20. package/src/component/widget/navigation/_function/to-navigation-json.ts +8 -0
  21. package/src/component/widget/{shell → navigation}/_function/to-toc-groups.ts +2 -2
  22. package/src/{type → component/widget/navigation/_type}/doc-group.ts +1 -1
  23. package/src/component/widget/navigation/_type/navigation-data.ts +83 -0
  24. package/src/component/widget/navigation/_type/navigation-focus-snapshot.ts +21 -0
  25. package/src/component/widget/navigation/_wg-navigation-branch-toggle.css +28 -0
  26. package/src/component/widget/navigation/_wg-navigation-branch-toggle.tsx +48 -0
  27. package/src/component/widget/{shell/_wg-shell-nav-list.css → navigation/_wg-navigation-nav-list.css} +24 -16
  28. package/src/component/widget/navigation/_wg-navigation-nav-list.tsx +106 -0
  29. package/src/component/widget/{shell/_wg-shell-nav.css → navigation/_wg-navigation-nav.css} +9 -3
  30. package/src/component/widget/navigation/_wg-navigation-nav.tsx +43 -0
  31. package/src/component/widget/navigation/_wg-navigation-scroll.tsx +117 -0
  32. package/src/component/widget/{shell/_wg-shell-toc.css → navigation/_wg-navigation-toc.css} +39 -24
  33. package/src/component/widget/navigation/_wg-navigation-toc.tsx +155 -0
  34. package/src/component/widget/navigation/wg-navigation.css +282 -0
  35. package/src/component/widget/navigation/wg-navigation.tsx +479 -0
  36. package/src/component/widget/prose/_function/rehype-sections/rehype-sections.ts +1 -1
  37. package/src/component/widget/shell/wg-shell.css +13 -269
  38. package/src/component/widget/shell/wg-shell.tsx +16 -97
  39. package/src/component/widget/shell-controls/wg-shell-controls.css +4 -0
  40. package/src/component/widget/shell-controls/wg-shell-controls.tsx +170 -0
  41. package/src/constant/asset.ts +0 -5
  42. package/src/entry/browser/browser.tsx +22 -0
  43. package/src/{app.tsx → entry/cli/_function/create-app.tsx} +6 -6
  44. package/src/{content → entry/cli/_function/create-processor}/create-processor.ts +3 -3
  45. package/src/{content → entry/cli/_function}/read-docs.ts +1 -1
  46. package/src/{content → entry/cli/_function}/read-home.ts +1 -1
  47. package/src/{content/read-docs.test.ts → entry/cli/cli.test.ts} +105 -30
  48. package/src/{cli.ts → entry/cli/cli.ts} +10 -11
  49. package/src/store/navigation/_constant/tree.ts +6 -0
  50. package/src/store/navigation/create-navigation-stores.test.ts +92 -0
  51. package/src/store/navigation/create-navigation-stores.ts +73 -0
  52. package/src/store/navigation/navigation-state.ts +46 -0
  53. package/src/store/navigation/navigation-storage.ts +14 -0
  54. package/src/store/navigation/to-navigation-scroll-state.ts +42 -0
  55. package/src/store/navigation/to-navigation-tree-state.ts +19 -0
  56. package/src/store/navigation/use-navigation-tree-store.ts +12 -0
  57. package/src/style/token.css +3 -2
  58. package/src/type/doc-content.ts +1 -1
  59. package/src/type/doc-file-data.ts +1 -1
  60. package/src/{component/widget/shell/_type → type}/doc-outline.ts +1 -1
  61. package/src/type/site-assets.ts +2 -2
  62. package/dist/client.js +0 -7
  63. package/src/client.ts +0 -335
  64. package/src/component/widget/shell/_constant/navigation.ts +0 -9
  65. package/src/component/widget/shell/_function/bind-mobile-navigation.ts +0 -147
  66. package/src/component/widget/shell/_function/bind-navigation-overflow.ts +0 -47
  67. package/src/component/widget/shell/_function/bind-navigation-scroll.ts +0 -84
  68. package/src/component/widget/shell/_function/restore-navigation-scroll.ts +0 -47
  69. package/src/component/widget/shell/_wg-shell-nav-list.tsx +0 -87
  70. package/src/component/widget/shell/_wg-shell-nav.tsx +0 -49
  71. package/src/component/widget/shell/_wg-shell-toc.tsx +0 -57
  72. /package/src/{constant → component/widget/navigation/_constant}/locale.ts +0 -0
  73. /package/src/component/widget/{shell → navigation}/_constant/reading-line.ts +0 -0
  74. /package/src/{type → component/widget/navigation/_type}/doc-branch.ts +0 -0
  75. /package/src/component/widget/{shell → navigation}/_type/toc-group.ts +0 -0
  76. /package/src/{constant → entry/cli/_constant}/cli.ts +0 -0
  77. /package/src/{dev.ts → entry/cli/_function/create-dev-app.ts} +0 -0
  78. /package/src/{content/rehype-assets.ts → entry/cli/_function/create-processor/_rehype-assets.ts} +0 -0
  79. /package/src/{content/rehype-heading-ids.ts → entry/cli/_function/create-processor/_rehype-heading-ids.ts} +0 -0
  80. /package/src/{content/remark-report.ts → entry/cli/_function/create-processor/_remark-report.ts} +0 -0
  81. /package/src/{component/widget/prose/_type → type}/doc-section.ts +0 -0
package/dist/cli.css CHANGED
@@ -295,13 +295,55 @@
295
295
  }
296
296
  }
297
297
 
298
- /* src/component/widget/shell/_wg-shell-nav-list.css */
299
- .wg_shellNavList__root {
298
+ /* src/component/widget/cursor-face/wg-cursor-face.css */
299
+ .wg_cursorFace__root {
300
+ position: fixed;
301
+ top: 0;
302
+ left: 0;
303
+ z-index: var(--app-z-index-popper);
304
+ visibility: hidden;
305
+ pointer-events: none;
306
+ user-select: none;
307
+ image-rendering: pixelated;
308
+ }
309
+ .wg_cursorFace__root--visible {
310
+ visibility: visible;
311
+ }
312
+
313
+ /* src/component/widget/navigation/_wg-navigation-branch-toggle.css */
314
+ .wg_navigationBranchToggle__root {
315
+ position: absolute;
316
+ top: 0;
317
+ right: 0;
318
+ width: var(--app-size-tree-toggle);
319
+ height: calc(var(--app-font-size-dense) * var(--app-line-height-tight) + var(--app-space-tree-row) * 2);
320
+ padding: 0;
321
+ border: 0;
322
+ background: transparent;
323
+ color: var(--app-color-border-soft);
324
+ font-family: var(--app-font-mono);
325
+ font-size: var(--app-font-size-body);
326
+ line-height: 1;
327
+ cursor: pointer;
328
+ &:hover {
329
+ background: var(--app-color-accent-soft);
330
+ color: var(--app-color-text-strong);
331
+ }
332
+ &:focus-visible {
333
+ background: var(--app-color-accent-soft);
334
+ color: var(--app-color-text-strong);
335
+ outline: var(--app-outline-focus);
336
+ outline-offset: calc(0px - var(--app-outline-focus-offset));
337
+ }
338
+ }
339
+
340
+ /* src/component/widget/navigation/_wg-navigation-nav-list.css */
341
+ .wg_navigationNavList__root {
300
342
  margin: 0 0 0 var(--app-space-tree-inset);
301
343
  padding: 0;
302
344
  list-style: none;
303
345
  }
304
- .wg_shellNavList__branch {
346
+ .wg_navigationNavList__branch {
305
347
  position: relative;
306
348
  display: block;
307
349
  padding: var(--app-space-tree-row) 0 var(--app-space-tree-row) calc(var(--app-space-tree-indent) + var(--app-space-inline));
@@ -319,7 +361,7 @@
319
361
  pointer-events: none;
320
362
  }
321
363
  }
322
- .wg_shellNavList__link {
364
+ .wg_navigationNavList__link {
323
365
  position: relative;
324
366
  display: block;
325
367
  padding: var(--app-space-tree-row) 0 var(--app-space-tree-row) calc(var(--app-space-tree-indent) + var(--app-space-inline));
@@ -351,16 +393,22 @@
351
393
  border-top-color: currentcolor;
352
394
  }
353
395
  }
354
- .wg_shellNavList__link--active {
396
+ .wg_navigationNavList__link--active {
355
397
  color: var(--app-color-link);
356
398
  font-weight: var(--app-font-weight-active);
357
399
  &::before {
358
400
  border-top-color: currentcolor;
359
401
  }
360
402
  }
361
- .wg_shellNavList__item {
403
+ .wg_navigationNavList__item {
362
404
  display: flow-root;
363
405
  position: relative;
406
+ &:has(> .wg_navigationBranchToggle__root) > .wg_navigationNavList__link {
407
+ padding-inline-end: calc(var(--app-size-tree-toggle) + var(--app-space-inline));
408
+ }
409
+ &:has(> .wg_navigationBranchToggle__root) > .wg_navigationNavList__branch {
410
+ padding-inline-end: calc(var(--app-size-tree-toggle) + var(--app-space-inline));
411
+ }
364
412
  &::before {
365
413
  position: absolute;
366
414
  top: 0;
@@ -389,87 +437,99 @@
389
437
  &:where(:has(:focus-visible))::after {
390
438
  border-left-color: var(--app-color-link);
391
439
  }
392
- &:where(:has(~ .wg_shellNavList__item:hover))::before {
440
+ &:where(:has(~ .wg_navigationNavList__item:hover))::before {
393
441
  border-left-color: var(--app-color-link);
394
442
  }
395
- &:where(:has(~ .wg_shellNavList__item :focus-visible))::before {
443
+ &:where(:has(~ .wg_navigationNavList__item :focus-visible))::before {
396
444
  border-left-color: var(--app-color-link);
397
445
  }
398
- & > .wg_shellNavList__root {
446
+ & > .wg_navigationNavList__root {
399
447
  margin-left: var(--app-space-tree-indent);
400
448
  }
401
- &:where(:hover) > .wg_shellNavList__branch::before {
449
+ &:where(:hover) > .wg_navigationNavList__branch::before {
402
450
  border-top-color: var(--app-color-link);
403
451
  }
404
- &:where(:has(:focus-visible)) > .wg_shellNavList__branch::before {
452
+ &:where(:has(:focus-visible)) > .wg_navigationNavList__branch::before {
405
453
  border-top-color: var(--app-color-link);
406
454
  }
407
- &:where(:hover) > .wg_shellNavList__link::before {
455
+ &:where(:hover) > .wg_navigationNavList__link::before {
408
456
  border-top-color: var(--app-color-link);
409
457
  }
410
- &:where(:has(:focus-visible)) > .wg_shellNavList__link::before {
458
+ &:where(:has(:focus-visible)) > .wg_navigationNavList__link::before {
411
459
  border-top-color: var(--app-color-link);
412
460
  }
413
461
  }
414
- .wg_shellNavList__item--trail {
462
+ .wg_navigationNavList__item--trail {
415
463
  &::before {
416
464
  border-left-color: var(--app-color-link);
417
465
  }
418
466
  }
419
- .wg_shellNavList__item--current {
467
+ .wg_navigationNavList__item--current {
420
468
  &::after {
421
469
  border-left-color: var(--app-color-link);
422
470
  }
423
- & > .wg_shellNavList__branch::before {
471
+ & > .wg_navigationNavList__branch::before {
424
472
  border-top-color: var(--app-color-link);
425
473
  }
426
- & > .wg_shellNavList__link::before {
474
+ & > .wg_navigationNavList__link::before {
427
475
  border-top-color: var(--app-color-link);
428
476
  }
429
477
  }
430
478
 
431
- /* src/component/widget/shell/_wg-shell-nav.css */
432
- .wg_shellNav__root {
479
+ /* src/component/widget/navigation/_wg-navigation-nav.css */
480
+ .wg_navigationNav__root {
433
481
  font-size: var(--app-font-size-dense);
434
482
  line-height: var(--app-line-height-tight);
435
483
  }
436
- .wg_shellNav__docs {
484
+ .wg_navigationNav__docs {
437
485
  display: flex;
438
486
  flex-direction: column;
439
487
  gap: var(--app-space-stack);
440
488
  }
441
- .wg_shellNav__group {
489
+ .wg_navigationNav__group {
490
+ padding-inline-end: calc(var(--app-size-tree-toggle) + var(--app-space-inline));
442
491
  margin: 0 0 4px;
443
492
  color: var(--app-color-text-muted);
444
493
  font-size: var(--app-font-size-group);
445
494
  line-height: calc(var(--app-font-size-dense) * var(--app-line-height-tight));
446
495
  text-box: trim-start cap alphabetic;
447
496
  }
497
+ .wg_navigationNav__docGroup {
498
+ position: relative;
499
+ }
448
500
 
449
- /* src/component/widget/shell/_wg-shell-toc.css */
450
- .wg_shellToc__root {
501
+ /* src/component/widget/navigation/_wg-navigation-toc.css */
502
+ .wg_navigationToc__root {
451
503
  font-size: var(--app-font-size-dense);
452
504
  line-height: var(--app-line-height-tight);
453
505
  }
454
- .wg_shellToc__label {
506
+ .wg_navigationToc__label {
455
507
  margin-bottom: var(--app-space-inline);
456
508
  color: var(--app-color-text-muted);
457
509
  font-size: var(--app-font-size-label);
458
510
  font-weight: var(--app-font-weight-strong);
459
511
  letter-spacing: var(--app-letter-spacing-label);
460
512
  }
461
- .wg_shellToc__group {
462
- margin: var(--app-space-stack) 0 4px;
513
+ .wg_navigationToc__group {
514
+ margin: 0 0 4px;
515
+ padding-inline-end: calc(var(--app-size-tree-toggle) + var(--app-space-inline));
463
516
  color: var(--app-color-text-muted);
464
517
  font-size: var(--app-font-size-group);
465
518
  line-height: calc(var(--app-font-size-dense) * var(--app-line-height-tight));
466
519
  }
467
- .wg_shellToc__list {
520
+ .wg_navigationToc__groupSection {
521
+ position: relative;
522
+ display: flow-root;
523
+ }
524
+ .wg_navigationToc__groupSection--named {
525
+ margin-top: var(--app-space-stack);
526
+ }
527
+ .wg_navigationToc__list {
468
528
  margin: 0 0 0 var(--app-space-tree-inset);
469
529
  padding: 0;
470
530
  list-style: none;
471
531
  }
472
- .wg_shellToc__link {
532
+ .wg_navigationToc__link {
473
533
  position: relative;
474
534
  display: block;
475
535
  padding: var(--app-space-tree-row) 0 var(--app-space-tree-row) calc(var(--app-space-tree-indent) + var(--app-space-inline));
@@ -502,16 +562,19 @@
502
562
  border-top-color: currentcolor;
503
563
  }
504
564
  }
505
- .wg_shellToc__link--active {
565
+ .wg_navigationToc__link--active {
506
566
  color: var(--app-color-text-strong);
507
567
  font-weight: var(--app-font-weight-active);
508
568
  &::before {
509
569
  border-top-color: currentcolor;
510
570
  }
511
571
  }
512
- .wg_shellToc__item {
572
+ .wg_navigationToc__item {
513
573
  display: flow-root;
514
574
  position: relative;
575
+ &:has(> .wg_navigationBranchToggle__root) > .wg_navigationToc__link {
576
+ padding-inline-end: calc(var(--app-size-tree-toggle) + var(--app-space-inline));
577
+ }
515
578
  &::before {
516
579
  position: absolute;
517
580
  top: 0;
@@ -540,38 +603,38 @@
540
603
  &:where(:has(:focus-visible))::after {
541
604
  border-left-color: var(--app-color-text-strong);
542
605
  }
543
- &:where(:has(~ .wg_shellToc__item:hover))::before {
606
+ &:where(:has(~ .wg_navigationToc__item:hover))::before {
544
607
  border-left-color: var(--app-color-text-strong);
545
608
  }
546
- &:where(:has(~ .wg_shellToc__item :focus-visible))::before {
609
+ &:where(:has(~ .wg_navigationToc__item :focus-visible))::before {
547
610
  border-left-color: var(--app-color-text-strong);
548
611
  }
549
- &:where(:hover) > .wg_shellToc__link::before {
612
+ &:where(:hover) > .wg_navigationToc__link::before {
550
613
  border-top-color: var(--app-color-text-strong);
551
614
  }
552
- &:where(:has(:focus-visible)) > .wg_shellToc__link::before {
615
+ &:where(:has(:focus-visible)) > .wg_navigationToc__link::before {
553
616
  border-top-color: var(--app-color-text-strong);
554
617
  }
555
618
  }
556
- .wg_shellToc__item--trail {
619
+ .wg_navigationToc__item--trail {
557
620
  &::before {
558
621
  border-left-color: var(--app-color-text-strong);
559
622
  }
560
623
  }
561
- .wg_shellToc__item--current {
624
+ .wg_navigationToc__item--current {
562
625
  &::after {
563
626
  border-left-color: var(--app-color-text-strong);
564
627
  }
565
- & > .wg_shellToc__link::before {
628
+ & > .wg_navigationToc__link::before {
566
629
  border-top-color: var(--app-color-text-strong);
567
630
  }
568
631
  }
569
- .wg_shellToc__sub {
632
+ .wg_navigationToc__sub {
570
633
  margin: var(--app-space-tree-row) 0 4px var(--app-space-tree-indent);
571
634
  padding: 0;
572
635
  list-style: none;
573
636
  }
574
- .wg_shellToc__subItem {
637
+ .wg_navigationToc__subItem {
575
638
  position: relative;
576
639
  &::before {
577
640
  position: absolute;
@@ -601,24 +664,24 @@
601
664
  &:where(:has(:focus-visible))::after {
602
665
  border-left-color: var(--app-color-text-strong);
603
666
  }
604
- &:where(:has(~ .wg_shellToc__subItem:hover))::before {
667
+ &:where(:has(~ .wg_navigationToc__subItem:hover))::before {
605
668
  border-left-color: var(--app-color-text-strong);
606
669
  }
607
- &:where(:has(~ .wg_shellToc__subItem :focus-visible))::before {
670
+ &:where(:has(~ .wg_navigationToc__subItem :focus-visible))::before {
608
671
  border-left-color: var(--app-color-text-strong);
609
672
  }
610
673
  }
611
- .wg_shellToc__subItem--trail {
674
+ .wg_navigationToc__subItem--trail {
612
675
  &::before {
613
676
  border-left-color: var(--app-color-text-strong);
614
677
  }
615
678
  }
616
- .wg_shellToc__subItem--current {
679
+ .wg_navigationToc__subItem--current {
617
680
  &::after {
618
681
  border-left-color: var(--app-color-text-strong);
619
682
  }
620
683
  }
621
- .wg_shellToc__subLink {
684
+ .wg_navigationToc__subLink {
622
685
  position: relative;
623
686
  display: block;
624
687
  padding: var(--app-space-tree-row) 0 var(--app-space-tree-row) calc(var(--app-space-tree-indent) + var(--app-space-inline));
@@ -651,7 +714,7 @@
651
714
  border-top-color: currentcolor;
652
715
  }
653
716
  }
654
- .wg_shellToc__subLink--active {
717
+ .wg_navigationToc__subLink--active {
655
718
  color: var(--app-color-text-strong);
656
719
  font-weight: var(--app-font-weight-active);
657
720
  &::before {
@@ -659,160 +722,8 @@
659
722
  }
660
723
  }
661
724
 
662
- /* src/style/base.css */
663
- * {
664
- box-sizing: border-box;
665
- }
666
- :root {
667
- background: var(--app-color-ground);
668
- scrollbar-gutter: stable;
669
- scroll-behavior: smooth;
670
- }
671
- @media (prefers-reduced-motion: reduce) {
672
- *,
673
- *::before,
674
- *::after {
675
- animation-duration: 0.01ms !important;
676
- animation-delay: 0s !important;
677
- animation-iteration-count: 1 !important;
678
- transition-duration: 0.01ms !important;
679
- transition-delay: 0s !important;
680
- scroll-behavior: auto !important;
681
- }
682
- }
683
-
684
- /* src/style/token.css */
685
- :root {
686
- color-scheme: light dark;
687
- --app-color-ground: light-dark(#fff, #181818);
688
- --app-color-surface: light-dark(#fff, #181818);
689
- --app-color-code: light-dark(#f1f1eb, #22221f);
690
- --app-color-backdrop: light-dark(rgb(0 0 0 / 30%), rgb(0 0 0 / 55%));
691
- --app-color-text: light-dark(#333, #d5d5d5);
692
- --app-color-text-strong: light-dark(#222, #eee);
693
- --app-color-text-muted: light-dark(#666, #aaa);
694
- --app-color-anchor-highlight: light-dark(#f4f58a, #666322);
695
- --app-motion-duration-highlight-fade: 600ms;
696
- --app-motion-easing-out: ease-out;
697
- --app-color-border: light-dark(#aaa, #555);
698
- --app-color-border-soft: light-dark(#ddd, #333);
699
- --app-color-border-layout: light-dark(#eee, #2b2b2b);
700
- --app-color-accent: light-dark(#555, #b5b5b5);
701
- --app-color-accent-soft: light-dark(#f5f5f2, #222);
702
- --app-color-link: light-dark(#11a, #9db8ff);
703
- --app-color-link-visited: light-dark(#51a, #c5a5ed);
704
- --app-color-link-hover: light-dark(#44d, #c1d1ff);
705
- --app-color-verified: light-dark(#176b36, #82cf95);
706
- --app-color-verified-soft: light-dark(#edf5ed, #1d2c20);
707
- --app-color-unverified: light-dark(#855700, #dfb26c);
708
- --app-color-unverified-soft: light-dark(#faf2df, #30291c);
709
- --app-font-sans:
710
- "Pretendard Variable",
711
- system-ui,
712
- "Apple SD Gothic Neo",
713
- sans-serif;
714
- --app-font-mono: "JetBrains Mono Variable", var(--app-font-sans);
715
- --app-font-brand: "Architects Daughter", var(--app-font-sans);
716
- --app-font-size-group: 11px;
717
- --app-font-size-label: 12px;
718
- --app-font-size-detail: 12px;
719
- --app-font-size-dense: 12px;
720
- --app-font-size-body: 12px;
721
- --app-font-size-lead: 12px;
722
- --app-font-size-part: 13px;
723
- --app-font-size-section: 14px;
724
- --app-font-size-title: 16px;
725
- --app-font-weight-mark: 400;
726
- --app-font-weight-active: 600;
727
- --app-font-weight-strong: 600;
728
- --app-font-weight-title: 600;
729
- --app-line-height-title: 1.5;
730
- --app-line-height-heading: 1.5;
731
- --app-line-height-tight: 1.5;
732
- --app-line-height-code: 1.65;
733
- --app-line-height-body: 1.7;
734
- --app-letter-spacing-label: 0;
735
- --app-letter-spacing-brand: 0;
736
- --app-letter-spacing-heading: -0.01em;
737
- --app-letter-spacing-title: -0.015em;
738
- --app-space-inline: 6px;
739
- --app-space-stack: 10px;
740
- --app-space-block: 14px;
741
- --app-space-group: 20px;
742
- --app-space-section: 32px;
743
- --app-space-tree-row: 2px;
744
- --app-space-tree-inset: 4px;
745
- --app-space-tree-indent: 12px;
746
- --app-space-page-top: 28px;
747
- --app-space-gutter: 28px;
748
- --app-space-column: 32px;
749
- --app-space-sidebar-gap: 32px;
750
- --app-size-sidebar: 200px;
751
- --app-size-main: 900px;
752
- --app-size-page: calc(var(--app-size-main) + (var(--app-size-sidebar) + var(--app-space-sidebar-gap) + var(--app-space-gutter)) * 2);
753
- --app-size-brand: calc(var(--app-font-size-title) * var(--app-line-height-title) + var(--app-space-page-top) + var(--app-space-group));
754
- --app-size-mobile-header: 56px;
755
- --app-size-menu-button: 44px;
756
- --app-size-drawer: 320px;
757
- --app-size-navigation-fade: 28px;
758
- --app-space-anchor: 80px;
759
- --app-radius-pill: 0;
760
- --app-radius-card: 0;
761
- --app-radius-box: 0;
762
- --app-radius-inline: 0;
763
- --app-radius-mark: 0;
764
- --app-outline-focus: 2px solid var(--app-color-link);
765
- --app-outline-focus-offset: 2px;
766
- --app-z-index-sticky: 100;
767
- --app-z-index-popper: 300;
768
- --app-code-foreground: var(--app-color-text);
769
- --app-code-background: var(--app-color-code);
770
- --app-code-token-keyword: var(--app-color-text-strong);
771
- --app-code-token-function: var(--app-color-accent);
772
- --app-code-token-string: var(--app-color-verified);
773
- --app-code-token-string-expression: var(--app-color-verified);
774
- --app-code-token-constant: var(--app-color-unverified);
775
- --app-code-token-parameter: var(--app-color-text);
776
- --app-code-token-comment: var(--app-color-text-muted);
777
- --app-code-token-punctuation: var(--app-color-text-muted);
778
- --app-code-token-link: var(--app-color-link);
779
- }
780
- @media (width < 1024px) {
781
- :root {
782
- --app-space-page-top: 24px;
783
- --app-space-gutter: 20px;
784
- --app-space-tree-row: 7px;
785
- --app-space-anchor: calc(var(--app-size-mobile-header) + var(--app-space-block));
786
- }
787
- }
788
- @media (width < 640px) {
789
- :root {
790
- --app-space-page-top: 20px;
791
- --app-space-gutter: 16px;
792
- }
793
- }
794
-
795
- /* src/component/widget/shell/wg-shell.css */
796
- .wg_shell__root {
797
- display: grid;
798
- max-width: var(--app-size-page);
799
- margin: 0 auto;
800
- padding: 0 var(--app-space-gutter);
801
- grid-template: "nav main ." 1fr / calc(var(--app-size-sidebar) + var(--app-space-sidebar-gap)) minmax(0, var(--app-size-main)) minmax(0, 1fr);
802
- background: var(--app-color-ground);
803
- color: var(--app-color-text);
804
- font-family: var(--app-font-sans);
805
- font-size: var(--app-font-size-body);
806
- line-height: var(--app-line-height-body);
807
- word-break: keep-all;
808
- overflow-wrap: break-word;
809
- text-wrap: pretty;
810
- -webkit-font-smoothing: antialiased;
811
- }
812
- .wg_shell__root--drawerOpen {
813
- overflow: hidden;
814
- }
815
- .wg_shell__brandRow {
725
+ /* src/component/widget/navigation/wg-navigation.css */
726
+ .wg_navigation__brandRow {
816
727
  display: flex;
817
728
  position: sticky;
818
729
  top: 0;
@@ -825,7 +736,7 @@
825
736
  gap: var(--app-space-inline);
826
737
  align-items: start;
827
738
  }
828
- .wg_shell__brand {
739
+ .wg_navigation__brand {
829
740
  display: block;
830
741
  flex: 1;
831
742
  min-width: 0;
@@ -847,7 +758,7 @@
847
758
  text-decoration: underline;
848
759
  }
849
760
  }
850
- .wg_shell__menuIcon {
761
+ .wg_navigation__menuIcon {
851
762
  width: 20px;
852
763
  height: 20px;
853
764
  fill: none;
@@ -855,7 +766,7 @@
855
766
  stroke-linecap: round;
856
767
  stroke-width: 1.5;
857
768
  }
858
- .wg_shell__menuToggle {
769
+ .wg_navigation__menuToggle {
859
770
  display: none;
860
771
  align-items: center;
861
772
  justify-content: center;
@@ -876,10 +787,10 @@
876
787
  outline-offset: var(--app-outline-focus-offset);
877
788
  }
878
789
  }
879
- .wg_shell__menuToggle--visible {
790
+ .wg_navigation__menuToggle--visible {
880
791
  display: flex;
881
792
  }
882
- .wg_shell__sidebar {
793
+ .wg_navigation__sidebar {
883
794
  grid-area: nav;
884
795
  position: sticky;
885
796
  top: 0;
@@ -888,54 +799,69 @@
888
799
  height: 100dvh;
889
800
  margin-inline-end: var(--app-space-sidebar-gap);
890
801
  }
891
- .wg_shell__navigation {
802
+ .wg_navigation__documents {
803
+ flex: 1;
804
+ min-height: 0;
805
+ }
806
+ .wg_navigation__outline {
892
807
  display: flex;
893
808
  flex-direction: column;
894
- height: calc(100dvh - var(--app-size-brand));
895
- min-width: 0;
809
+ flex: 1;
896
810
  min-height: 0;
811
+ &:where(:has(.wg_navigation__headings:empty)) {
812
+ display: none;
813
+ }
897
814
  }
898
- .wg_shell__documents {
899
- flex: none;
900
- max-height: 60%;
815
+ .wg_navigation__headings {
816
+ flex: 1;
817
+ min-height: 0;
901
818
  }
902
- .wg_shell__outline {
819
+ .wg_navigation__navigation {
903
820
  display: flex;
904
821
  flex-direction: column;
822
+ height: calc(100dvh - var(--app-size-brand));
823
+ min-width: 0;
905
824
  min-height: 0;
906
- margin-top: var(--app-space-group);
907
- padding-top: var(--app-space-group);
908
- border-top: 1px solid var(--app-color-border-soft);
909
- &:has(.wg_shell__headings:empty) {
825
+ }
826
+ .wg_navigation__tocRail {
827
+ grid-area: outline;
828
+ position: sticky;
829
+ top: 0;
830
+ align-self: start;
831
+ min-width: 0;
832
+ height: 100dvh;
833
+ margin-inline-start: var(--app-space-sidebar-gap);
834
+ padding-top: var(--app-size-brand);
835
+ & > .wg_navigation__outline {
836
+ height: 100%;
837
+ }
838
+ &:where(:has(.wg_navigation__headings:empty)) {
910
839
  display: none;
911
840
  }
912
841
  }
913
- .wg_shell__headings {
914
- min-height: 0;
915
- }
916
- .wg_shell__scroll {
842
+ .wg_navigation__scroll {
917
843
  overflow-y: auto;
918
844
  overscroll-behavior-y: contain;
919
845
  scroll-padding-block: var(--app-size-navigation-fade);
920
846
  }
921
- .wg_shell__scroll--ready {
847
+ .wg_navigation__scroll--ready {
922
848
  scrollbar-width: none;
923
849
  }
924
- .wg_shell__scroll--above {
850
+ .wg_navigation__scroll--above {
925
851
  mask-image:
926
852
  linear-gradient(
927
853
  to bottom,
928
854
  transparent,
929
855
  #000 var(--app-size-navigation-fade));
930
856
  }
931
- .wg_shell__scroll--below {
857
+ .wg_navigation__scroll--below {
932
858
  mask-image:
933
859
  linear-gradient(
934
860
  to bottom,
935
861
  #000 calc(100% - var(--app-size-navigation-fade)),
936
862
  transparent);
937
863
  }
938
- .wg_shell__scroll--above.wg_shell__scroll--below {
864
+ .wg_navigation__scroll--above.wg_navigation__scroll--below {
939
865
  mask-image:
940
866
  linear-gradient(
941
867
  to bottom,
@@ -944,15 +870,7 @@
944
870
  #000 calc(100% - var(--app-size-navigation-fade)),
945
871
  transparent);
946
872
  }
947
- .wg_shell__main {
948
- grid-area: main;
949
- min-width: 0;
950
- max-width: var(--app-size-main);
951
- border-inline: 1px solid var(--app-color-border-layout);
952
- padding-block: var(--app-size-brand) calc(100vh - var(--app-space-anchor));
953
- padding-inline: var(--app-space-column);
954
- }
955
- .wg_shell__drawer {
873
+ .wg_navigation__drawer {
956
874
  position: fixed;
957
875
  inset: 0 auto 0 0;
958
876
  width: min(var(--app-size-drawer), calc(100% - var(--app-space-gutter) * 2));
@@ -970,7 +888,7 @@
970
888
  background: var(--app-color-backdrop);
971
889
  }
972
890
  }
973
- .wg_shell__drawerHeader {
891
+ .wg_navigation__drawerHeader {
974
892
  display: flex;
975
893
  align-items: center;
976
894
  justify-content: space-between;
@@ -979,12 +897,12 @@
979
897
  margin-bottom: var(--app-space-block);
980
898
  background: var(--app-color-ground);
981
899
  }
982
- .wg_shell__drawerTitle {
900
+ .wg_navigation__drawerTitle {
983
901
  margin: 0;
984
902
  font-size: var(--app-font-size-part);
985
903
  font-weight: var(--app-font-weight-strong);
986
904
  }
987
- .wg_shell__drawerClose {
905
+ .wg_navigation__drawerClose {
988
906
  display: flex;
989
907
  align-items: center;
990
908
  justify-content: center;
@@ -1005,63 +923,233 @@
1005
923
  outline-offset: var(--app-outline-focus-offset);
1006
924
  }
1007
925
  }
1008
- .wg_shell__drawerContent {
926
+ .wg_navigation__drawerContent {
1009
927
  min-width: 0;
1010
928
  height: calc(100% - var(--app-size-mobile-header) - var(--app-space-block));
1011
- & > .wg_shell__navigation {
929
+ & > .wg_navigation__navigation {
1012
930
  height: 100%;
1013
931
  }
1014
932
  }
1015
- .wg_shell__cursorFace {
1016
- position: fixed;
1017
- top: 0;
1018
- left: 0;
1019
- z-index: var(--app-z-index-popper);
1020
- visibility: hidden;
1021
- pointer-events: none;
1022
- user-select: none;
1023
- image-rendering: pixelated;
1024
- }
1025
- .wg_shell__cursorFace--visible {
1026
- visibility: visible;
1027
- }
1028
933
  @media (forced-colors: active) {
1029
- .wg_shell__scroll {
934
+ .wg_navigation__scroll {
1030
935
  mask-image: none;
1031
936
  scrollbar-width: thin;
1032
937
  scrollbar-color: auto;
1033
938
  }
1034
939
  }
1035
- @media (width < 1024px) {
1036
- .wg_shell__root {
1037
- max-width: calc(var(--app-size-main) + var(--app-space-gutter) * 2);
1038
- grid-template: "nav" auto "main" 1fr / minmax(0, 1fr);
940
+ @media (width < 1536px) {
941
+ .wg_navigation__tocRail {
942
+ display: none;
1039
943
  }
1040
- .wg_shell__sidebar {
944
+ }
945
+ @media (width < 1024px) {
946
+ .wg_navigation__sidebar {
1041
947
  position: static;
1042
948
  height: auto;
1043
949
  margin-block-end: var(--app-space-block);
1044
950
  margin-inline-end: 0;
1045
951
  border-bottom: 1px solid var(--app-color-border-layout);
1046
952
  }
1047
- .wg_shell__sidebar > .wg_shell__navigation {
953
+ .wg_navigation__sidebar > .wg_navigation__navigation {
1048
954
  height: auto;
1049
- & > .wg_shell__documents {
1050
- max-height: none;
1051
- }
1052
955
  }
1053
- .wg_shell__sidebar--navigationReady {
956
+ .wg_navigation__sidebar > .wg_navigation__navigation > .wg_navigation__documents {
957
+ max-height: none;
958
+ }
959
+ .wg_navigation__sidebar--navigationReady {
1054
960
  position: sticky;
1055
961
  top: 0;
1056
962
  z-index: var(--app-z-index-sticky);
1057
963
  background: var(--app-color-ground);
1058
964
  }
1059
- .wg_shell__brandRow {
965
+ .wg_navigation__brandRow {
1060
966
  position: static;
1061
967
  height: var(--app-size-mobile-header);
1062
968
  padding-block: 0;
1063
969
  align-items: center;
1064
970
  }
971
+ }
972
+
973
+ /* src/component/widget/shell-controls/wg-shell-controls.css */
974
+ .wg_shellControls__navigation {
975
+ display: contents;
976
+ }
977
+
978
+ /* src/style/base.css */
979
+ * {
980
+ box-sizing: border-box;
981
+ }
982
+ :root {
983
+ background: var(--app-color-ground);
984
+ scrollbar-gutter: stable;
985
+ scroll-behavior: smooth;
986
+ }
987
+ @media (prefers-reduced-motion: reduce) {
988
+ *,
989
+ *::before,
990
+ *::after {
991
+ animation-duration: 0.01ms !important;
992
+ animation-delay: 0s !important;
993
+ animation-iteration-count: 1 !important;
994
+ transition-duration: 0.01ms !important;
995
+ transition-delay: 0s !important;
996
+ scroll-behavior: auto !important;
997
+ }
998
+ }
999
+
1000
+ /* src/style/token.css */
1001
+ :root {
1002
+ color-scheme: light dark;
1003
+ --app-color-ground: light-dark(#fff, #181818);
1004
+ --app-color-surface: light-dark(#fff, #181818);
1005
+ --app-color-code: light-dark(#f1f1eb, #22221f);
1006
+ --app-color-backdrop: light-dark(rgb(0 0 0 / 30%), rgb(0 0 0 / 55%));
1007
+ --app-color-text: light-dark(#333, #d5d5d5);
1008
+ --app-color-text-strong: light-dark(#222, #eee);
1009
+ --app-color-text-muted: light-dark(#666, #aaa);
1010
+ --app-color-anchor-highlight: light-dark(#f4f58a, #666322);
1011
+ --app-motion-duration-highlight-fade: 600ms;
1012
+ --app-motion-easing-out: ease-out;
1013
+ --app-color-border: light-dark(#aaa, #555);
1014
+ --app-color-border-soft: light-dark(#ddd, #333);
1015
+ --app-color-border-layout: light-dark(#eee, #2b2b2b);
1016
+ --app-color-accent: light-dark(#555, #b5b5b5);
1017
+ --app-color-accent-soft: light-dark(#f5f5f2, #222);
1018
+ --app-color-link: light-dark(#11a, #9db8ff);
1019
+ --app-color-link-visited: light-dark(#51a, #c5a5ed);
1020
+ --app-color-link-hover: light-dark(#44d, #c1d1ff);
1021
+ --app-color-verified: light-dark(#176b36, #82cf95);
1022
+ --app-color-verified-soft: light-dark(#edf5ed, #1d2c20);
1023
+ --app-color-unverified: light-dark(#855700, #dfb26c);
1024
+ --app-color-unverified-soft: light-dark(#faf2df, #30291c);
1025
+ --app-font-sans:
1026
+ "Pretendard Variable",
1027
+ system-ui,
1028
+ "Apple SD Gothic Neo",
1029
+ sans-serif;
1030
+ --app-font-mono: "JetBrains Mono Variable", var(--app-font-sans);
1031
+ --app-font-brand: "Architects Daughter", var(--app-font-sans);
1032
+ --app-font-size-group: 11px;
1033
+ --app-font-size-label: 12px;
1034
+ --app-font-size-detail: 12px;
1035
+ --app-font-size-dense: 12px;
1036
+ --app-font-size-body: 12px;
1037
+ --app-font-size-lead: 12px;
1038
+ --app-font-size-part: 13px;
1039
+ --app-font-size-section: 14px;
1040
+ --app-font-size-title: 16px;
1041
+ --app-font-weight-mark: 400;
1042
+ --app-font-weight-active: 600;
1043
+ --app-font-weight-strong: 600;
1044
+ --app-font-weight-title: 600;
1045
+ --app-line-height-title: 1.5;
1046
+ --app-line-height-heading: 1.5;
1047
+ --app-line-height-tight: 1.5;
1048
+ --app-line-height-code: 1.65;
1049
+ --app-line-height-body: 1.7;
1050
+ --app-letter-spacing-label: 0;
1051
+ --app-letter-spacing-brand: 0;
1052
+ --app-letter-spacing-heading: -0.01em;
1053
+ --app-letter-spacing-title: -0.015em;
1054
+ --app-space-inline: 6px;
1055
+ --app-space-stack: 10px;
1056
+ --app-space-block: 14px;
1057
+ --app-space-group: 20px;
1058
+ --app-space-section: 32px;
1059
+ --app-space-tree-row: 2px;
1060
+ --app-space-tree-inset: 4px;
1061
+ --app-space-tree-indent: 12px;
1062
+ --app-space-page-top: 28px;
1063
+ --app-space-gutter: 28px;
1064
+ --app-space-column: 32px;
1065
+ --app-space-sidebar-gap: 32px;
1066
+ --app-size-sidebar: 240px;
1067
+ --app-size-main: 900px;
1068
+ --app-size-page: calc(var(--app-size-main) + (var(--app-size-sidebar) + var(--app-space-sidebar-gap) + var(--app-space-gutter)) * 2);
1069
+ --app-size-brand: calc(var(--app-font-size-title) * var(--app-line-height-title) + var(--app-space-page-top) + var(--app-space-group));
1070
+ --app-size-mobile-header: 56px;
1071
+ --app-size-menu-button: 44px;
1072
+ --app-size-drawer: 320px;
1073
+ --app-size-navigation-fade: 28px;
1074
+ --app-size-tree-toggle: 24px;
1075
+ --app-space-anchor: 80px;
1076
+ --app-radius-pill: 0;
1077
+ --app-radius-card: 0;
1078
+ --app-radius-box: 0;
1079
+ --app-radius-inline: 0;
1080
+ --app-radius-mark: 0;
1081
+ --app-outline-focus: 2px solid var(--app-color-link);
1082
+ --app-outline-focus-offset: 2px;
1083
+ --app-z-index-sticky: 100;
1084
+ --app-z-index-popper: 300;
1085
+ --app-code-foreground: var(--app-color-text);
1086
+ --app-code-background: var(--app-color-code);
1087
+ --app-code-token-keyword: var(--app-color-text-strong);
1088
+ --app-code-token-function: var(--app-color-accent);
1089
+ --app-code-token-string: var(--app-color-verified);
1090
+ --app-code-token-string-expression: var(--app-color-verified);
1091
+ --app-code-token-constant: var(--app-color-unverified);
1092
+ --app-code-token-parameter: var(--app-color-text);
1093
+ --app-code-token-comment: var(--app-color-text-muted);
1094
+ --app-code-token-punctuation: var(--app-color-text-muted);
1095
+ --app-code-token-link: var(--app-color-link);
1096
+ }
1097
+ @media (width < 1024px) {
1098
+ :root {
1099
+ --app-space-page-top: 24px;
1100
+ --app-space-gutter: 20px;
1101
+ --app-space-tree-row: 7px;
1102
+ --app-space-anchor: calc(var(--app-size-mobile-header) + var(--app-space-block));
1103
+ }
1104
+ }
1105
+ @media (width < 640px) {
1106
+ :root {
1107
+ --app-space-page-top: 20px;
1108
+ --app-space-gutter: 16px;
1109
+ }
1110
+ }
1111
+
1112
+ /* src/component/widget/shell/wg-shell.css */
1113
+ .wg_shell__root {
1114
+ display: grid;
1115
+ max-width: var(--app-size-page);
1116
+ margin: 0 auto;
1117
+ padding: 0 var(--app-space-gutter);
1118
+ grid-template: "nav main outline" 1fr / calc(var(--app-size-sidebar) + var(--app-space-sidebar-gap)) minmax(0, var(--app-size-main)) calc(var(--app-size-sidebar) + var(--app-space-sidebar-gap));
1119
+ background: var(--app-color-ground);
1120
+ color: var(--app-color-text);
1121
+ font-family: var(--app-font-sans);
1122
+ font-size: var(--app-font-size-body);
1123
+ line-height: var(--app-line-height-body);
1124
+ word-break: keep-all;
1125
+ overflow-wrap: break-word;
1126
+ text-wrap: pretty;
1127
+ -webkit-font-smoothing: antialiased;
1128
+ }
1129
+ .wg_shell__root--drawerOpen {
1130
+ overflow: hidden;
1131
+ }
1132
+ .wg_shell__browserRoot {
1133
+ display: contents;
1134
+ }
1135
+ .wg_shell__main {
1136
+ grid-area: main;
1137
+ min-width: 0;
1138
+ max-width: var(--app-size-main);
1139
+ border-inline: 1px solid var(--app-color-border-layout);
1140
+ padding-block: var(--app-size-brand) calc(100vh - var(--app-space-anchor));
1141
+ padding-inline: var(--app-space-column);
1142
+ }
1143
+ @media (width < 1536px) {
1144
+ .wg_shell__root {
1145
+ grid-template: "nav main ." 1fr / calc(var(--app-size-sidebar) + var(--app-space-sidebar-gap)) minmax(0, var(--app-size-main)) minmax(0, 1fr);
1146
+ }
1147
+ }
1148
+ @media (width < 1024px) {
1149
+ .wg_shell__root {
1150
+ max-width: calc(var(--app-size-main) + var(--app-space-gutter) * 2);
1151
+ grid-template: "nav" auto "main" 1fr / minmax(0, 1fr);
1152
+ }
1065
1153
  .wg_shell__main {
1066
1154
  padding-block-start: var(--app-space-page-top);
1067
1155
  padding-inline: 0;