@brillout/docpress 0.1.17 → 0.2.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 (144) hide show
  1. package/bin.js +3 -0
  2. package/{src/css/Inter-Var.ttf → dist/Inter-Var-IOAEQULN.ttf} +0 -0
  3. package/{src/components/Sponsors/companyLogos/ccoli.svg → dist/ccoli-CHW3TQKS.svg} +0 -0
  4. package/{src/icons/changelog.svg → dist/changelog-IPI5F42D.svg} +0 -0
  5. package/{src/navigation/navigation-fullscreen/chevron.svg → dist/chevron-K3WPYLOP.svg} +0 -0
  6. package/{src/components/features/chevron.svg → dist/chevron-R2IYJD62.svg} +0 -0
  7. package/dist/chunk-7HKDCMSZ.js +154 -0
  8. package/dist/chunk-7HKDCMSZ.js.map +1 -0
  9. package/dist/chunk-G2A5MZJA.js +48 -0
  10. package/dist/chunk-G2A5MZJA.js.map +1 -0
  11. package/dist/chunk-JS5BGVDK.js +178 -0
  12. package/dist/chunk-JS5BGVDK.js.map +1 -0
  13. package/dist/chunk-OEVBWUR6.js +92 -0
  14. package/dist/chunk-OEVBWUR6.js.map +1 -0
  15. package/dist/chunk-TTLAZ2T2.js +8 -0
  16. package/dist/chunk-TTLAZ2T2.js.map +1 -0
  17. package/dist/{chunk-ZYYJWJMY.js → chunk-XUTBTIEE.js} +15 -42
  18. package/dist/chunk-XUTBTIEE.js.map +1 -0
  19. package/dist/cli/index.d.ts +1 -0
  20. package/dist/cli/index.js +35 -0
  21. package/dist/cli/index.js.map +1 -0
  22. package/{src/navigation/navigation-fullscreen/close.svg → dist/close-IQXTDOHV.svg} +0 -0
  23. package/{src/utils/Emoji/compass.svg → dist/compass-2RWQU3E4.svg} +0 -0
  24. package/{src → dist}/components/features/FeatureList.css +2 -7
  25. package/dist/components/features/FeatureList.css.map +1 -0
  26. package/dist/components/features/FeatureList.d.ts +13 -0
  27. package/dist/components/features/FeatureList.js +8 -0
  28. package/dist/components/features/FeatureList.js.map +1 -0
  29. package/dist/components/features/initFeatureList.d.ts +3 -0
  30. package/dist/components/features/initFeatureList.js +60 -0
  31. package/dist/components/features/initFeatureList.js.map +1 -0
  32. package/{src/components/Sponsors/companyLogos/contra.svg → dist/contra-WLZBOPBV.svg} +0 -0
  33. package/dist/{devServer-J2XJQJGT.js → devServer-534L4U45.js} +5 -2
  34. package/dist/{devServer-J2XJQJGT.js.map → devServer-534L4U45.js.map} +1 -1
  35. package/{src/icons/discord.svg → dist/discord-JD33TUSF.svg} +0 -0
  36. package/{src/utils/Emoji/engine.png → dist/engine-6Q6VSCVA.png} +0 -0
  37. package/{src/icons/github.svg → dist/github-P5ZSKN2N.svg} +0 -0
  38. package/{src/icons/heart.svg → dist/heart-OINVKOXO.svg} +0 -0
  39. package/dist/index.css +121 -0
  40. package/dist/index.css.map +1 -0
  41. package/dist/index.d.ts +136 -0
  42. package/dist/index.js +484 -27
  43. package/dist/index.js.map +1 -1
  44. package/{src/components/Sponsors/label.svg → dist/label-MP75CTIA.svg} +0 -0
  45. package/{src/utils/Emoji/mechanical-arm.svg → dist/mechanical-arm-TR7IQQMG.svg} +0 -0
  46. package/{src/components/Sponsors/medalBronze.svg → dist/medalBronze-CO4CTUR4.svg} +0 -0
  47. package/{src/components/Sponsors/medalGold.svg → dist/medalGold-UP6A73FL.svg} +0 -0
  48. package/{src/components/Sponsors/medalSilver.svg → dist/medalSilver-FAPGGOBN.svg} +0 -0
  49. package/{src/components/Sponsors/companyLogos/mfqs.svg → dist/mfqs-2EAEE7N6.svg} +0 -0
  50. package/dist/renderer/_default.page.client.css +263 -0
  51. package/dist/renderer/_default.page.client.css.map +1 -0
  52. package/dist/renderer/_default.page.client.d.ts +1 -0
  53. package/dist/renderer/_default.page.client.js +180 -0
  54. package/dist/renderer/_default.page.client.js.map +1 -0
  55. package/dist/renderer/_default.page.server.css +312 -0
  56. package/dist/renderer/_default.page.server.css.map +1 -0
  57. package/dist/renderer/_default.page.server.d.ts +22 -0
  58. package/dist/renderer/_default.page.server.js +602 -0
  59. package/dist/renderer/_default.page.server.js.map +1 -0
  60. package/{src/utils/Emoji/road-fork.svg → dist/road-fork-3WZLW3HB.svg} +0 -0
  61. package/{src/utils/Emoji/shield.svg → dist/shield-CU45RG5C.svg} +0 -0
  62. package/{src/icons/twitter.svg → dist/twitter-I7DXDN3J.svg} +0 -0
  63. package/{src/utils/Emoji/typescript.svg → dist/typescript-ALIPKLRM.svg} +0 -0
  64. package/package.json +22 -13
  65. package/dist/chunk-ZYYJWJMY.js.map +0 -1
  66. package/src/MobileHeader.tsx +0 -68
  67. package/src/PageLayout.css +0 -41
  68. package/src/PageLayout.tsx +0 -37
  69. package/src/algolia/DocSearch.css +0 -29
  70. package/src/algolia/DocSearch.ts +0 -37
  71. package/src/autoScrollNav.ts +0 -22
  72. package/src/cli/devServer.ts +0 -31
  73. package/src/cli/index.ts +0 -29
  74. package/src/components/CodeBlock.tsx +0 -22
  75. package/src/components/DocLink.tsx +0 -108
  76. package/src/components/EditPageNote.tsx +0 -18
  77. package/src/components/HorizontalLine.tsx +0 -20
  78. package/src/components/ImportMeta.tsx +0 -11
  79. package/src/components/Info.tsx +0 -12
  80. package/src/components/Link.tsx +0 -18
  81. package/src/components/Note.tsx +0 -31
  82. package/src/components/P.css +0 -8
  83. package/src/components/P.tsx +0 -8
  84. package/src/components/ReadingRecommendation.tsx +0 -53
  85. package/src/components/RepoLink.tsx +0 -24
  86. package/src/components/Sponsors/companyLogos/ccoli-logo.svg +0 -1
  87. package/src/components/Sponsors/companyLogos/ccoli-text.svg +0 -1
  88. package/src/components/Sponsors/label.draft.svg +0 -108
  89. package/src/components/Sponsors.tsx +0 -242
  90. package/src/components/features/FeatureList.tsx +0 -114
  91. package/src/components/features/initFeatureList.ts +0 -66
  92. package/src/components/index.ts +0 -13
  93. package/src/config/Config.ts +0 -30
  94. package/src/config/getConfig.ts +0 -18
  95. package/src/config/resolveConfig/resolveHeading.ts +0 -0
  96. package/src/config/resolvePageContext.ts +0 -157
  97. package/src/css/button.css +0 -7
  98. package/src/css/code/block.css +0 -36
  99. package/src/css/code/inline.css +0 -27
  100. package/src/css/code.css +0 -20
  101. package/src/css/colorize-on-hover.css +0 -29
  102. package/src/css/font.css +0 -19
  103. package/src/css/heading.css +0 -25
  104. package/src/css/index.css +0 -11
  105. package/src/css/link.css +0 -17
  106. package/src/css/note.css +0 -26
  107. package/src/css/reset.css +0 -12
  108. package/src/css/table.css +0 -14
  109. package/src/css/tooltip.css +0 -11
  110. package/src/headings.ts +0 -200
  111. package/src/index.ts +0 -3
  112. package/src/installSectionUrlHashs.ts +0 -50
  113. package/src/markdownHeadingsVitePlugin.ts +0 -128
  114. package/src/navigation/Navigation-highlight.css +0 -41
  115. package/src/navigation/Navigation-items.css +0 -122
  116. package/src/navigation/Navigation-layout.css +0 -118
  117. package/src/navigation/Navigation.client.old.ts +0 -303
  118. package/src/navigation/Navigation.client.ts +0 -19
  119. package/src/navigation/Navigation.css +0 -12
  120. package/src/navigation/Navigation.tsx +0 -228
  121. package/src/navigation/NavigationHeader.tsx +0 -97
  122. package/src/navigation/navigation-fullscreen/NavigationFullscreenButton.css +0 -32
  123. package/src/navigation/navigation-fullscreen/NavigationFullscreenButton.tsx +0 -44
  124. package/src/navigation/navigation-fullscreen/initNavigationFullscreen.ts +0 -115
  125. package/src/parseEmojis.ts +0 -33
  126. package/src/renderer/_default.page.client.ts +0 -4
  127. package/src/renderer/_default.page.server.tsx +0 -69
  128. package/src/renderer/usePageContext.tsx +0 -25
  129. package/src/types.ts +0 -2
  130. package/src/utils/Emoji/Emoji.ts +0 -216
  131. package/src/utils/Emoji/assets.ts +0 -9
  132. package/src/utils/Emoji/index.ts +0 -1
  133. package/src/utils/Emoji/mountain.svg +0 -1
  134. package/src/utils/assert.ts +0 -39
  135. package/src/utils/client.ts +0 -2
  136. package/src/utils/crawlAllFiles.ts +0 -17
  137. package/src/utils/determineSectionUrlHash.ts +0 -35
  138. package/src/utils/filesystemPathHandling.ts +0 -42
  139. package/src/utils/filter.ts +0 -12
  140. package/src/utils/isBrowser.ts +0 -5
  141. package/src/utils/jsxToTextContent.ts +0 -11
  142. package/src/utils/objectAssign.ts +0 -9
  143. package/src/utils/server.ts +0 -8
  144. package/src/vite.config.ts +0 -44
@@ -1,122 +0,0 @@
1
- .nav-item {
2
- display: block;
3
- white-space: nowrap;
4
- overflow-x: hidden;
5
- --padding-left-global: 9px;
6
- --padding-left-additional: 0px;
7
- }
8
- .nav-item code {
9
- font-size: 0.9em;
10
- }
11
- .nav-item-h1 + .nav-item-h4 {
12
- margin-top: -2px;
13
- }
14
- .nav-item-h4 {
15
- margin-top: 14px;
16
- margin-bottom: -1px;
17
- color: #999;
18
- font-size: 12px;
19
- font-weight: 400;
20
- letter-spacing: 0.15ch;
21
- padding-left: var(--padding-left-global);
22
- padding-right: 4px;
23
- text-decoration: none;
24
- }
25
- .nav-column:first-of-type > .nav-h1-group:first-of-type > .nav-item-h1:first-of-type {
26
- margin-top: 20px;
27
- }
28
- .nav-item-h1 {
29
- margin-top: 30px;
30
- font-size: 15.4px;
31
- text-transform: uppercase;
32
- font-weight: 600;
33
- letter-spacing: 0.15ch;
34
- color: var(--color-text);
35
- padding: 12px 0;
36
- padding-left: calc(var(--padding-left-global) - 2px);
37
- padding-right: 4px;
38
- text-decoration: none;
39
- }
40
- .nav-item-h2 {
41
- text-decoration: none;
42
- font-size: 14.4px;
43
- font-weight: 400;
44
- letter-spacing: 0.15ch;
45
- color: var(--color-text);
46
- padding-left: var(--padding-left-global);
47
- padding-right: 0;
48
- --padding: 4px;
49
- padding-top: var(--padding);
50
- padding-bottom: var(--padding);
51
- }
52
- .nav-item-h3 {
53
- font-size: 12px;
54
- font-weight: 400;
55
- letter-spacing: 0.15ch;
56
- color: var(--color-text);
57
- text-decoration: none;
58
- --padding: 5px;
59
-
60
- background-color: #f9f9f9;
61
- padding: var(--padding) 0;
62
- padding-left: calc(var(--padding-left-global) + var(--padding-left-additional));
63
- }
64
- html.navigation-fullscreen .nav-item-h3 {
65
- border-right: 4px solid #eee;
66
- }
67
- .nav-item-h3.nav-item-first-of-its-kind {
68
- padding-top: calc(var(--padding) * 1.6);
69
- }
70
- .nav-item-h3.nav-item-last-of-its-kind {
71
- padding-bottom: calc(var(--padding) * 2);
72
- }
73
- .nav-item-h2,
74
- .nav-item-h3 {
75
- position: relative;
76
- }
77
- /*
78
- .nav-item-h2.is-active .nav-item-text{
79
- background-color: var(--background-color);
80
- }
81
- */
82
- .nav-item-h2.is-active {
83
- background-color: var(--background-color);
84
- }
85
- .nav-item-h3.is-active:before {
86
- display: block;
87
- content: '';
88
- position: absolute;
89
- width: 4px;
90
- left: 0;
91
- top: 0;
92
- height: 100%;
93
- background-color: var(--background-color);
94
- z-index: 10;
95
- }
96
- .nav-item-h3.is-active-last:after {
97
- display: block;
98
- content: '';
99
- position: absolute;
100
- height: 4px;
101
- left: 0;
102
- bottom: 0;
103
- width: 100%;
104
- background-color: var(--background-color);
105
- z-index: 10;
106
- border-bottom-left-radius: 5px;
107
- }
108
- html.navigation-fullscreen .nav-item {
109
- --expend-border-radius: 5px;
110
- }
111
- .nav-item.is-active-first {
112
- border-top-left-radius: 5px;
113
- border-top-right-radius: var(--expend-border-radius);
114
- }
115
- .nav-item.is-active-last,
116
- .nav-item.is-active-last:before {
117
- border-bottom-left-radius: 5px;
118
- border-bottom-right-radius: var(--expend-border-radius);
119
- }
120
- .nav-item-h3.nav-item-parent-is-list-heading {
121
- --padding-left-additional: 21px;
122
- }
@@ -1,118 +0,0 @@
1
- :root {
2
- --mobile-header-height: 60px;
3
- --navigation-min-height: 300px;
4
- --navigation-max-height: 350px;
5
- }
6
- #navigation-wrapper {
7
- min-width: var(--navigation-min-height);
8
- }
9
- .doc-page #navigation-wrapper {
10
- max-width: var(--navigation-max-height);
11
- }
12
- .landing-page #navigation-wrapper {
13
- /* prettier-ignore */
14
- max-width: min(var(--navigation-max-height), max(var(--navigation-min-height), calc(var(--navigation-min-height) + 100vw - 1240px)));
15
- }
16
- #navigation-container {
17
- /* `position: fixed` doesn't inherit the parent's width */
18
- position: sticky;
19
- overflow-y: auto;
20
- overscroll-behavior: contain;
21
- border-right: 1px solid #eee;
22
- }
23
- #navigation-mask {
24
- position: fixed;
25
- width: 100vw;
26
- height: 100vh;
27
- top: 0;
28
- left: 0;
29
- z-index: 2;
30
- }
31
- /* `1140px` is the breaking point that preserves the width of code blocks. */
32
- /* BEFORE EDITING THIS: also change the `1139px` value below */
33
- @media screen and (min-width: 1140px) {
34
- #mobile-header {
35
- display: none !important;
36
- }
37
- #navigation-container {
38
- height: 100vh;
39
- top: 0;
40
- }
41
- #navigation-mask {
42
- display: none;
43
- }
44
- }
45
- #navigation-container {
46
- transition: transform 0.25s ease;
47
- background: white;
48
- z-index: 3;
49
- }
50
- #page-wrapper {
51
- margin-left: calc(-1 * var(--navigation-fullscreen-button-width));
52
- }
53
- @media screen and (max-width: 1139px) {
54
- #navigation-header-logo,
55
- #docsearch {
56
- display: none !important;
57
- }
58
- #navigation-wrapper {
59
- min-width: 0px !important;
60
- max-width: 0px !important;
61
- }
62
- #navigation-fullscreen-button {
63
- display: none;
64
- }
65
- #page-wrapper {
66
- margin-left: 0 !important;
67
- }
68
- #navigation-container {
69
- --width: min(100vw, 350px);
70
- width: var(--width);
71
- left: 0;
72
- height: calc(100vh - var(--mobile-header-height));
73
- top: var(--mobile-header-height);
74
- padding-top: 20px;
75
- /* `position: sticky` doesn't seem to work on mobile */
76
- position: fixed;
77
- }
78
- body:not(.show-menu) #navigation-container {
79
- transform: translateX(calc(-1 * var(--width)));
80
- }
81
- body:not(.show-menu) #navigation-mask {
82
- display: none;
83
- }
84
- #mobile-header {
85
- display: inherit;
86
- }
87
- .doc-page h2 {
88
- --padding-top: calc(var(--mobile-header-height) + 12px) !important;
89
- }
90
- }
91
-
92
- html.navigation-fullscreen #navigation-container {
93
- width: 100vw;
94
- height: 100vh;
95
- overflow-y: scroll;
96
- position: fixed;
97
- top: 0;
98
- left: 0;
99
- background-color: white;
100
- }
101
- html.navigation-fullscreen #navigation-header {
102
- display: none !important;
103
- }
104
- html.navigation-fullscreen #navigation-content {
105
- display: flex;
106
- margin: auto; /* A `max-width` is set by src/navigation/navigation-fullscreen/initNavigationFullscreen.ts */
107
- }
108
- html.navigation-fullscreen #navigation-content > .nav-column {
109
- flex-grow: 1;
110
- max-width: 350px;
111
- }
112
- html.navigation-fullscreen .nav-column > .nav-h1-group:first-child > .nav-item-h1:first-child {
113
- margin-top: 0px;
114
- }
115
- html.navigation-fullscreen {
116
- /* disable scroll of main view */
117
- overflow: hidden !important;
118
- }
@@ -1,303 +0,0 @@
1
- // @ts-nocheck
2
-
3
- import { headings as headingsCrawled } from './Docs.mdx'
4
- import { assert, isBrowser } from './utils/client'
5
- import { Heading } from './types'
6
- const headings: Heading[] = [
7
- {
8
- level: 2,
9
- title: 'Overview',
10
- isDocumentBegin: true
11
- },
12
- ...headingsCrawled
13
- ]
14
- assert_headings()
15
-
16
- export { updateSidePanelScroll }
17
-
18
- if (isBrowser()) {
19
- setTimeout(updateSidePanelScroll, 0)
20
- window.addEventListener('scroll', updateSidePanelScroll, { passive: true })
21
- window.addEventListener('resize', updateSidePanelScroll, { passive: true })
22
- }
23
-
24
- function updateSidePanelScroll() {
25
- const headingSectionsVisibility = getHeadingSectionsVisbility(headings)
26
- setActiveHeadings(headingSectionsVisibility)
27
- renderNavScrollBar(headingSectionsVisibility)
28
- }
29
-
30
- function setActiveHeadings(headingSectionsVisibility: HeadingSectionVisibility[]) {
31
- /*
32
- const viewportPercentageHighest = Math.max(
33
- ...headingSectionsVisibility.map(({ viewportPercentage }) => viewportPercentage)
34
- )
35
- */
36
- const visibleHeadings = getVisibleHeadings(headingSectionsVisibility)
37
- // console.log('v', visibleHeadings);
38
- headingSectionsVisibility.forEach((heading) => {
39
- const navItem = findNavLink(heading)
40
- const isVisibile = visibleHeadings.find((visibleHeading) => {
41
- if ('isDocumentBegin' in heading || 'isDocumentBegin' in visibleHeading) {
42
- return 'isDocumentBegin' in heading && 'isDocumentBegin' in visibleHeading
43
- } else {
44
- return heading.id === visibleHeading.id
45
- }
46
- })
47
- navItem.style.display = isVisibile ? 'inherit' : 'none'
48
- /*
49
- if (viewportPercentageHighest === heading.viewportPercentage) {
50
- const navItem = findNavLink(heading)
51
- updateNavTreeExpendedState(navItem)
52
- }
53
- */
54
- })
55
- headingSectionsVisibility.forEach((heading) => {
56
- const navItem = findNavLink(heading)
57
- setNavItemBackgroundColor(navItem, heading.viewportPercentage)
58
- })
59
- }
60
-
61
- function updateNavTreeExpendedState(navItem: HTMLElement) {
62
- const navItemHref = navItem.getAttribute('href')
63
- assert(typeof navItemHref === 'string')
64
- const selector = `a[href="${navItemHref}"]`
65
- //console.log(11, selector, 2)
66
- assert(document.querySelector(selector))
67
- document.querySelectorAll('.nav-tree').forEach((navTree) => {
68
- const isExpended = !!navTree.querySelector(selector)
69
- //console.log(navTree.href, isExpended)
70
- navTree.classList[isExpended ? 'add' : 'remove']('expanded')
71
- })
72
- }
73
-
74
- function setNavItemBackgroundColor(navItem: HTMLElement, viewportPercentage: number) {
75
- if (viewportPercentage) {
76
- assert(viewportPercentage >= 0 && viewportPercentage <= 1)
77
- const backgroundColor = `rgba(0, 0, 0, ${viewportPercentage / 20})`
78
- navItem.style.backgroundColor = backgroundColor
79
- } else {
80
- navItem.style.backgroundColor = 'transparent'
81
- }
82
- }
83
-
84
- function findNavLink(heading: Heading): HTMLElement {
85
- const href = getHref(heading)
86
- const navigationEl = getNavigationEl()
87
- const navLinks: HTMLElement[] = Array.from(navigationEl.querySelectorAll(`a[href="${href}"]`))
88
- assert(navLinks.length === 1)
89
- return navLinks[0]
90
- }
91
-
92
- let _navigationEl: HTMLElement
93
- function getNavigationEl(): HTMLElement {
94
- _navigationEl = _navigationEl || document.getElementById('navigation-content')
95
- assert(_navigationEl)
96
- return _navigationEl
97
- }
98
-
99
- function renderNavScrollBar(headingSectionsVisibility: HeadingSectionVisibility[]) {
100
- const { headingVisibleFirst, headingVisibleLast } = getBoundaryHeading(headingSectionsVisibility)
101
- assertBoundaryPosition(headingVisibleFirst.boundaryPosition)
102
- assertBoundaryPosition(headingVisibleLast.boundaryPosition)
103
-
104
- const navigationEl = getNavigationEl()
105
- const getLinkNavPosition = (el: HTMLElement): number => {
106
- let offsetY = el.offsetTop
107
- const parentEl = el.offsetParent as HTMLElement
108
- if (parentEl !== navigationEl) {
109
- offsetY += getLinkNavPosition(parentEl)
110
- }
111
- return offsetY
112
- }
113
- const getOverlayPosition = ({
114
- heading,
115
- boundaryPosition
116
- }: {
117
- heading: Heading
118
- boundaryPosition: number
119
- }): number => {
120
- const navLink = findNavLink(heading)
121
- const navLinkPos = getLinkNavPosition(navLink)
122
- const scrollOverlayBoundaryPos = navLinkPos + navLink.clientHeight * boundaryPosition
123
- return scrollOverlayBoundaryPos
124
- }
125
- const overlayBegin = getOverlayPosition(headingVisibleFirst)
126
- const overlayEnd = getOverlayPosition(headingVisibleLast)
127
- const overlayHeight = Math.max(1, overlayEnd - overlayBegin)
128
- const scrollOverlayEl = document.getElementById('scroll-overlay')!
129
- scrollOverlayEl.style.top = overlayBegin + 'px'
130
- scrollOverlayEl.style.height = overlayHeight + 'px'
131
- }
132
-
133
- function getHeadingPosition(heading: Heading): number {
134
- if ('isDocumentBegin' in heading) return 0
135
- const { id } = heading
136
- assert(id)
137
- const el = document.getElementById(id)
138
- assert(el)
139
-
140
- // `el.getBoundingClientRect()` returns position relative to viewport begin
141
- // - https://stackoverflow.com/questions/5598743/finding-elements-position-relative-to-the-document
142
- const headingPositionRelative = el.getBoundingClientRect().top
143
-
144
- const scrollPosition = getScrollPosition()
145
-
146
- // We add the viewport begin position
147
- const headingPosition = headingPositionRelative + scrollPosition
148
-
149
- return headingPosition
150
- }
151
- function getDocumentHeight(): number {
152
- return document.body.clientHeight
153
- }
154
- function getViewportHeight(): number {
155
- return window.innerHeight
156
- }
157
- function getScrollPosition(): number {
158
- return window.scrollY
159
- }
160
-
161
- type HeadingVisible = { heading: Heading; boundaryPosition: number; viewportPercentage: number }
162
- function getVisibleHeadings(headingSectionsVisibility: HeadingSectionVisibility[]): HeadingSectionVisibility[] {
163
- const headings_withVisibileNavItem: Heading[] = filterHeadingsWithVisibileNavItem(headingSectionsVisibility)
164
- const headingSectionsWithVisibleNavItemVisibility = getHeadingSectionsVisbility(headings_withVisibileNavItem)
165
- return headingSectionsWithVisibleNavItemVisibility
166
- }
167
- function getBoundaryHeading(headingSectionsVisibility: HeadingSectionVisibility[]): {
168
- headingVisibleFirst: HeadingVisible
169
- headingVisibleLast: HeadingVisible
170
- } {
171
- const headingSectionsWithVisibleNavItemVisibility = getVisibleHeadings(headingSectionsVisibility)
172
- const h: HeadingSectionVisibility[] = headingSectionsWithVisibleNavItemVisibility
173
- const hFirst = h.find(({ screenBeginPosition }) => screenBeginPosition !== null)
174
- const hLast = h.find(({ screenEndPosition }) => screenEndPosition !== null)
175
- assert(hFirst)
176
- assert(hLast)
177
- assert(hFirst.screenBeginPosition !== null)
178
- assert(hLast.screenEndPosition !== null)
179
- const headingVisibleFirst = {
180
- heading: hFirst,
181
- boundaryPosition: hFirst.screenBeginPosition,
182
- viewportPercentage: hFirst.viewportPercentage
183
- }
184
- const headingVisibleLast = {
185
- heading: hLast,
186
- boundaryPosition: hLast.screenEndPosition,
187
- viewportPercentage: hLast.viewportPercentage
188
- }
189
- return { headingVisibleFirst, headingVisibleLast }
190
- }
191
-
192
- function filterHeadingsWithVisibileNavItem(headingSectionsVisibility: HeadingSectionVisibility[]): Heading[] {
193
- const hs = headingSectionsVisibility
194
- const viewportPercentageHighest = Math.max(...hs.map(({ viewportPercentage }) => viewportPercentage))
195
- const mainHeading = hs.find((heading) => {
196
- return heading.viewportPercentage === viewportPercentageHighest
197
- })
198
- assert(mainHeading)
199
- const ancestors = getAncestors(mainHeading, hs)
200
- const headings_withVisibileNavItem = hs.filter((heading) => {
201
- const p = getParent(heading, hs)
202
- return p === null || ancestors.includes(p)
203
- })
204
- return headings_withVisibileNavItem
205
- }
206
-
207
- function getParent(heading: Heading, headings: Heading[]): Heading | null {
208
- return getAncestors(heading, headings)[0] || null
209
- }
210
-
211
- function getAncestors(heading: Heading, headings: Heading[]): Heading[] {
212
- const headingIndex = headings.indexOf(heading)
213
- assert(headingIndex >= 0)
214
- const ancestors: Heading[] = []
215
- let currentLevel = heading.level - 1
216
- for (let i = headingIndex - 1; i >= 0; i--) {
217
- const h = headings[i]
218
- if (h.level === currentLevel) {
219
- ancestors.push(h)
220
- currentLevel--
221
- }
222
- }
223
- assert(currentLevel === 1)
224
- return ancestors
225
- }
226
-
227
- type HeadingSectionVisibility = Heading & {
228
- viewportPercentage: number
229
- screenBeginPosition: null | number
230
- screenEndPosition: null | number
231
- }
232
- function getHeadingSectionsVisbility(headings: Heading[]): HeadingSectionVisibility[] {
233
- const screenBeginPositionAbsolute = getScrollPosition()
234
- const screenEndPositionAbsolute = screenBeginPositionAbsolute + getViewportHeight()
235
-
236
- const headingSections: (HeadingSectionVisibility & { beginPosition: number; endPosition: number })[] = []
237
- headings.forEach((heading, i) => {
238
- const beginPosition = getHeadingPosition(heading)
239
-
240
- const headingNext = headings[i + 1]
241
- const endPosition = !headingNext ? getDocumentHeight() : getHeadingPosition(headingNext)
242
-
243
- const sectionHeight = endPosition - beginPosition
244
- assert(sectionHeight > 0)
245
-
246
- let screenBeginPosition = null
247
- if (beginPosition <= screenBeginPositionAbsolute && screenBeginPositionAbsolute <= endPosition) {
248
- screenBeginPosition = (screenBeginPositionAbsolute - beginPosition) / sectionHeight
249
- assert(0 <= screenBeginPosition && screenBeginPosition <= 1)
250
- }
251
-
252
- let screenEndPosition = null
253
- if (beginPosition <= screenEndPositionAbsolute && screenEndPositionAbsolute <= endPosition) {
254
- screenEndPosition = (screenEndPositionAbsolute - beginPosition) / sectionHeight
255
- assert(0 <= screenEndPosition && screenEndPosition <= 1)
256
- }
257
-
258
- assert(beginPosition <= endPosition)
259
- const getViewportPosition = (position: number) => {
260
- const viewportPosition = Math.min(Math.max(position, screenBeginPositionAbsolute), screenEndPositionAbsolute)
261
- assert(screenBeginPositionAbsolute <= viewportPosition && viewportPosition <= screenEndPositionAbsolute)
262
- return viewportPosition
263
- }
264
- const viewportPositionBegin = getViewportPosition(beginPosition)
265
- const viewportPositionEnd = getViewportPosition(endPosition)
266
- const viewportPercentage = (viewportPositionEnd - viewportPositionBegin) / getViewportHeight()
267
-
268
- headingSections.push({
269
- ...heading,
270
- viewportPercentage,
271
- screenBeginPosition,
272
- screenEndPosition,
273
- beginPosition,
274
- endPosition
275
- })
276
- })
277
-
278
- const viewportPercentageTotal = sum(headingSections.map(({ viewportPercentage }) => viewportPercentage))
279
- const debugInfo = JSON.stringify({ headingSections, screenBeginPositionAbsolute, screenEndPositionAbsolute }, null, 2)
280
- assert(viewportPercentageTotal <= 1 + 0.00001, debugInfo)
281
- // assert(1 - 0.00001 <= viewportPercentageTotal && viewportPercentageTotal <= 1 + 0.00001, debugInfo)
282
- assert(headingSections.filter(({ screenBeginPosition }) => screenBeginPosition !== null).length === 1, debugInfo)
283
- assert(headingSections.filter(({ screenEndPosition }) => screenEndPosition !== null).length === 1, debugInfo)
284
-
285
- return headingSections
286
- }
287
-
288
- function assertBoundaryPosition(boundaryPosition: number) {
289
- assert(0 <= boundaryPosition && boundaryPosition <= 1)
290
- }
291
-
292
- function sum(numbers: number[]): number {
293
- return numbers.reduce((a, b) => a + b, 0)
294
- }
295
-
296
- function assert_headings() {
297
- const hrefs: string[] = []
298
- headings.forEach((heading) => {
299
- const href = getHref(heading)
300
- assert(!hrefs.includes(href), href)
301
- hrefs.push(href)
302
- })
303
- }
@@ -1,19 +0,0 @@
1
- import { initNavigationFullscreen } from './navigation-fullscreen/initNavigationFullscreen'
2
-
3
- activateNavigationMask()
4
- activateMenuToggle()
5
- initNavigationFullscreen()
6
-
7
- function activateMenuToggle() {
8
- const menuToggle = document.getElementById('menu-toggle')!
9
- menuToggle.onclick = toggleNavigation
10
- }
11
-
12
- function activateNavigationMask() {
13
- const navigationMask = document.getElementById('navigation-mask')!
14
- navigationMask.onclick = toggleNavigation
15
- }
16
-
17
- function toggleNavigation() {
18
- document.body.classList.toggle('show-menu')
19
- }
@@ -1,12 +0,0 @@
1
- @import './Navigation-layout.css';
2
- @import './Navigation-items.css';
3
- @import './Navigation-highlight.css';
4
-
5
- #navigation-container {
6
- --background-color: #f0f0f0;
7
- padding-bottom: 70px;
8
- }
9
-
10
- html.navigation-fullscreen #detached-note {
11
- display: none;
12
- }