@brillout/docpress 0.1.8 → 0.1.10

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 (140) hide show
  1. package/{src/css/Inter-Var.ttf → dist/Inter-Var-IOAEQULN.ttf} +0 -0
  2. package/{src/components/Sponsors/companyLogos/ccoli.svg → dist/ccoli-CHW3TQKS.svg} +0 -0
  3. package/{src/icons/changelog.svg → dist/changelog-IPI5F42D.svg} +0 -0
  4. package/{src/navigation/navigation-fullscreen/chevron.svg → dist/chevron-K3WPYLOP.svg} +0 -0
  5. package/{src/components/features/chevron.svg → dist/chevron-R2IYJD62.svg} +0 -0
  6. package/dist/chunk-3NFN2KUH.js +1 -0
  7. package/dist/chunk-3NFN2KUH.js.map +1 -0
  8. package/dist/chunk-G2KXEHNF.js +56 -0
  9. package/dist/chunk-G2KXEHNF.js.map +1 -0
  10. package/dist/{cli/chunk-KZROB63P.js → chunk-G6OTZHVA.js} +2 -1
  11. package/dist/chunk-G6OTZHVA.js.map +1 -0
  12. package/dist/chunk-JKLALMFU.js +103 -0
  13. package/dist/chunk-JKLALMFU.js.map +1 -0
  14. package/dist/chunk-OEVBWUR6.js +92 -0
  15. package/dist/chunk-OEVBWUR6.js.map +1 -0
  16. package/dist/chunk-TTLAZ2T2.js +8 -0
  17. package/dist/chunk-TTLAZ2T2.js.map +1 -0
  18. package/dist/chunk-UCY72YQS.js +178 -0
  19. package/dist/chunk-UCY72YQS.js.map +1 -0
  20. package/dist/cli/index.d.ts +1 -0
  21. package/dist/cli/index.js +4 -2
  22. package/dist/cli/index.js.map +1 -0
  23. package/{src/navigation/navigation-fullscreen/close.svg → dist/close-IQXTDOHV.svg} +0 -0
  24. package/{src/utils/Emoji/compass.svg → dist/compass-2RWQU3E4.svg} +0 -0
  25. package/{src/components/Sponsors/companyLogos/contra.svg → dist/contra-WLZBOPBV.svg} +0 -0
  26. package/dist/{cli/devServer.js → devServer-UEJORYCC.js} +3 -1
  27. package/dist/devServer-UEJORYCC.js.map +1 -0
  28. package/{src/icons/discord.svg → dist/discord-JD33TUSF.svg} +0 -0
  29. package/{src/utils/Emoji/engine.png → dist/engine-6Q6VSCVA.png} +0 -0
  30. package/{src/icons/github.svg → dist/github-P5ZSKN2N.svg} +0 -0
  31. package/{src/icons/heart.svg → dist/heart-OINVKOXO.svg} +0 -0
  32. package/dist/index.css +121 -0
  33. package/dist/index.css.map +1 -0
  34. package/dist/index.d.ts +135 -0
  35. package/dist/index.js +488 -0
  36. package/dist/index.js.map +1 -0
  37. package/{src/components/Sponsors/label.svg → dist/label-MP75CTIA.svg} +0 -0
  38. package/{src/utils/Emoji/mechanical-arm.svg → dist/mechanical-arm-TR7IQQMG.svg} +0 -0
  39. package/{src/components/Sponsors/medalBronze.svg → dist/medalBronze-CO4CTUR4.svg} +0 -0
  40. package/{src/components/Sponsors/medalGold.svg → dist/medalGold-UP6A73FL.svg} +0 -0
  41. package/{src/components/Sponsors/medalSilver.svg → dist/medalSilver-FAPGGOBN.svg} +0 -0
  42. package/{src/components/Sponsors/companyLogos/mfqs.svg → dist/mfqs-2EAEE7N6.svg} +0 -0
  43. package/{src/utils/Emoji/road-fork.svg → dist/road-fork-3WZLW3HB.svg} +0 -0
  44. package/{src/utils/Emoji/shield.svg → dist/shield-CU45RG5C.svg} +0 -0
  45. package/{src → dist/src}/components/features/FeatureList.css +2 -7
  46. package/dist/src/components/features/FeatureList.css.map +1 -0
  47. package/dist/src/components/features/FeatureList.d.ts +13 -0
  48. package/dist/src/components/features/FeatureList.js +8 -0
  49. package/dist/src/components/features/FeatureList.js.map +1 -0
  50. package/dist/src/components/features/initFeatureList.d.ts +3 -0
  51. package/dist/src/components/features/initFeatureList.js +60 -0
  52. package/dist/src/components/features/initFeatureList.js.map +1 -0
  53. package/dist/src/renderer/_default.page.client.css +272 -0
  54. package/dist/src/renderer/_default.page.client.css.map +1 -0
  55. package/dist/src/renderer/_default.page.client.d.ts +1 -0
  56. package/dist/src/renderer/_default.page.client.js +182 -0
  57. package/dist/src/renderer/_default.page.client.js.map +1 -0
  58. package/dist/src/renderer/_default.page.server.css +312 -0
  59. package/dist/src/renderer/_default.page.server.css.map +1 -0
  60. package/dist/src/renderer/_default.page.server.d.ts +22 -0
  61. package/dist/src/renderer/_default.page.server.js +602 -0
  62. package/dist/src/renderer/_default.page.server.js.map +1 -0
  63. package/{src/icons/twitter.svg → dist/twitter-I7DXDN3J.svg} +0 -0
  64. package/{src/utils/Emoji/typescript.svg → dist/typescript-ALIPKLRM.svg} +0 -0
  65. package/package.json +25 -17
  66. package/vite.config.ts +10 -4
  67. package/cli.mjs +0 -2
  68. package/dist/cli/configFile.js +0 -6
  69. package/src/MobileHeader.tsx +0 -68
  70. package/src/PageLayout.css +0 -41
  71. package/src/PageLayout.tsx +0 -37
  72. package/src/algolia/DocSearch.css +0 -29
  73. package/src/algolia/DocSearch.ts +0 -37
  74. package/src/autoScrollNav.ts +0 -22
  75. package/src/components/CodeBlock.tsx +0 -22
  76. package/src/components/DocLink.tsx +0 -108
  77. package/src/components/EditPageNote.tsx +0 -18
  78. package/src/components/HorizontalLine.tsx +0 -20
  79. package/src/components/ImportMeta.tsx +0 -11
  80. package/src/components/Info.tsx +0 -12
  81. package/src/components/Link.tsx +0 -18
  82. package/src/components/Note.tsx +0 -31
  83. package/src/components/P.css +0 -8
  84. package/src/components/P.tsx +0 -8
  85. package/src/components/ReadingRecommendation.tsx +0 -53
  86. package/src/components/RepoLink.tsx +0 -24
  87. package/src/components/Sponsors/companyLogos/ccoli-logo.svg +0 -1
  88. package/src/components/Sponsors/companyLogos/ccoli-text.svg +0 -1
  89. package/src/components/Sponsors/label.draft.svg +0 -108
  90. package/src/components/Sponsors.tsx +0 -243
  91. package/src/components/features/FeatureList.tsx +0 -114
  92. package/src/components/features/initFeatureList.ts +0 -66
  93. package/src/components/index.ts +0 -13
  94. package/src/config/Config.ts +0 -30
  95. package/src/config/getConfig.ts +0 -18
  96. package/src/config/resolveConfig/resolveHeading.ts +0 -0
  97. package/src/config/resolvePageContext.ts +0 -157
  98. package/src/css/button.css +0 -7
  99. package/src/css/code/block.css +0 -36
  100. package/src/css/code/inline.css +0 -27
  101. package/src/css/code.css +0 -20
  102. package/src/css/colorize-on-hover.css +0 -29
  103. package/src/css/font.css +0 -19
  104. package/src/css/heading.css +0 -25
  105. package/src/css/index.css +0 -10
  106. package/src/css/link.css +0 -17
  107. package/src/css/note.css +0 -26
  108. package/src/css/reset.css +0 -12
  109. package/src/css/table.css +0 -14
  110. package/src/css/tooltip.css +0 -11
  111. package/src/headings.ts +0 -201
  112. package/src/index.ts +0 -3
  113. package/src/installSectionUrlHashs.ts +0 -50
  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 -229
  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 -7
  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/determineSectionUrlHash.ts +0 -35
  136. package/src/utils/filter.ts +0 -12
  137. package/src/utils/index.ts +0 -6
  138. package/src/utils/isBrowser.ts +0 -5
  139. package/src/utils/jsxToTextContent.ts +0 -11
  140. package/src/utils/objectAssign.ts +0 -9
@@ -1,303 +0,0 @@
1
- // @ts-nocheck
2
-
3
- import { headings as headingsCrawled } from './Docs.mdx'
4
- import { assert, isBrowser } from './utils'
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
- }
@@ -1,229 +0,0 @@
1
- export { Navigation }
2
- export { NavigationMask }
3
-
4
- import React from 'react'
5
- import { NavigationHeader } from './NavigationHeader'
6
- import { Heading } from '../headings'
7
- import { assert } from '../utils'
8
- import { Emoji } from '../utils/Emoji'
9
- import './Navigation.css'
10
- import { NavigationFullscreenClose } from './navigation-fullscreen/NavigationFullscreenButton'
11
-
12
- function Navigation({
13
- pageContext
14
- }: {
15
- pageContext: {
16
- headingsWithSubHeadings: Heading[]
17
- urlPathname: string
18
- isDetachedPage: boolean
19
- }
20
- }) {
21
- const { isDetachedPage } = pageContext
22
- return (
23
- <>
24
- <div id="navigation-container">
25
- <NavigationHeader />
26
- {isDetachedPage && <DetachedPageNote />}
27
- <NavigationContent pageContext={pageContext} />
28
- {/* <ScrollOverlay /> */}
29
- <NavigationFullscreenClose />
30
- </div>
31
- </>
32
- )
33
- }
34
-
35
- function NavigationMask() {
36
- return <div id="navigation-mask" />
37
- }
38
-
39
- function NavigationContent({
40
- pageContext
41
- }: {
42
- pageContext: {
43
- headingsWithSubHeadings: Heading[]
44
- urlPathname: string
45
- isDetachedPage: boolean
46
- }
47
- }) {
48
- const headings = getHeadingsWithComputedProps(pageContext)
49
- const headingsGrouped = groupHeadings(headings)
50
- return (
51
- <div id="navigation-content">
52
- <div className="nav-column" style={{ position: 'relative' }}>
53
- {headingsGrouped.map((headingsH1, i) => (
54
- <div className="nav-h1-group" key={i}>
55
- <Heading heading={headingsH1} />
56
- {headingsH1.headings.map((heading, j) => (
57
- <Heading heading={heading} key={j} />
58
- ))}
59
- </div>
60
- ))}
61
- </div>
62
- </div>
63
- )
64
- }
65
-
66
- function Heading({
67
- heading
68
- }: {
69
- heading: {
70
- level: number
71
- url?: string
72
- titleInNav: string | JSX.Element
73
- computed: {
74
- isActive: boolean
75
- isActiveFirst: boolean
76
- isActiveLast: boolean
77
- isChildOfListHeading: boolean
78
- isFirstOfItsKind: boolean
79
- isLastOfItsKind: boolean
80
- }
81
- }
82
- }) {
83
- assert([1, 2, 3, 4].includes(heading.level), heading)
84
- return (
85
- <a
86
- className={[
87
- 'nav-item',
88
- 'nav-item-h' + heading.level,
89
- heading.computed.isActive && ' is-active',
90
- heading.computed.isActiveFirst && ' is-active-first',
91
- heading.computed.isActiveLast && ' is-active-last',
92
- heading.computed.isChildOfListHeading && 'nav-item-parent-is-list-heading',
93
- heading.computed.isFirstOfItsKind && 'nav-item-first-of-its-kind',
94
- heading.computed.isLastOfItsKind && 'nav-item-last-of-its-kind'
95
- ]
96
- .filter(Boolean)
97
- .join(' ')}
98
- href={heading.url || undefined}
99
- >
100
- {/* <span className="nav-item-text">{heading.titleInNav}</span> */}
101
- {heading.titleInNav}
102
- </a>
103
- )
104
- }
105
-
106
- function groupHeadings<T extends { level: number }>(headings: T[]) {
107
- const headingsGrouped: (T & { headings: T[] })[] = []
108
- headings.forEach((heading) => {
109
- if (heading.level === 1) {
110
- headingsGrouped.push({ ...heading, headings: [] })
111
- } else {
112
- headingsGrouped[headingsGrouped.length - 1].headings.push(heading)
113
- }
114
- })
115
- return headingsGrouped
116
- }
117
-
118
- function getHeadingsWithComputedProps(pageContext: {
119
- headingsWithSubHeadings: Heading[]
120
- urlPathname: string
121
- isDetachedPage: boolean
122
- }) {
123
- const { headingsWithSubHeadings, urlPathname } = pageContext
124
- return headingsWithSubHeadings.map((heading, i) => {
125
- assert([1, 2, 3, 4].includes(heading.level), heading)
126
-
127
- const headingPrevious = headingsWithSubHeadings[i - 1]
128
- const headingNext = headingsWithSubHeadings[i + 1]
129
-
130
- let isActiveFirst = false
131
- let isActiveLast = false
132
- let isActive = false
133
- if (heading.url === urlPathname) {
134
- assert(heading.level === 2, { urlPathname })
135
- isActive = true
136
- isActiveFirst = true
137
- if (headingNext?.level !== 3) {
138
- isActiveLast = true
139
- }
140
- }
141
- if (heading.level === 3) {
142
- isActive = true
143
- if (headingNext?.level !== 3) {
144
- isActiveLast = true
145
- }
146
- }
147
-
148
- const isFirstOfItsKind = heading.level !== headingPrevious?.level
149
- const isLastOfItsKind = heading.level !== headingNext?.level
150
- const isChildOfListHeading = !!heading.parentHeadings[0]?.isListTitle
151
-
152
- return {
153
- ...heading,
154
- computed: {
155
- isActive,
156
- isActiveFirst,
157
- isActiveLast,
158
- isFirstOfItsKind,
159
- isLastOfItsKind,
160
- isChildOfListHeading
161
- }
162
- }
163
- })
164
- }
165
-
166
- function ScrollOverlay() {
167
- // const width = '1px'
168
- // const color = '#aaa'
169
- return (
170
- <div
171
- id="scroll-overlay"
172
- style={{
173
- pointerEvents: 'none',
174
- position: 'absolute',
175
- left: '0',
176
- width: '100%',
177
- /*
178
- background: `linear-gradient(to right, ${color} ${width}, transparent ${width}) 0 0,
179
- linear-gradient(to right, ${color} ${width}, transparent ${width}) 0 100%,
180
- linear-gradient(to left, ${color} ${width}, transparent ${width}) 100% 0,
181
- linear-gradient(to left, ${color} ${width}, transparent ${width}) 100% 100%,
182
- linear-gradient(to bottom, ${color} ${width}, transparent ${width}) 0 0,
183
- linear-gradient(to bottom, ${color} ${width}, transparent ${width}) 100% 0,
184
- linear-gradient(to top, ${color} ${width}, transparent ${width}) 0 100%,
185
- linear-gradient(to top, ${color} ${width}, transparent ${width}) 100% 100%`,
186
- //*/
187
- //borderRight: `5px solid ${color}`,
188
- borderRight: `3px solid #666`,
189
- //border: `1px solid ${color}`,
190
- boxSizing: 'border-box',
191
- // backgroundColor: 'rgba(0,0,0,0.03)',
192
- backgroundRepeat: 'no-repeat',
193
-
194
- backgroundSize: '10px 10px'
195
- }}
196
- />
197
- )
198
- }
199
-
200
- function DetachedPageNote() {
201
- return (
202
- <div
203
- id="detached-note"
204
- style={{
205
- backgroundColor: 'var(--background-color)',
206
- textAlign: 'left',
207
- marginLeft: 10,
208
- marginRight: 10,
209
- marginTop: 30,
210
- marginBottom: -8,
211
- borderRadius: 5,
212
- padding: 10
213
- }}
214
- >
215
- <Emoji name="info" />{' '}
216
- <b>
217
- <em>Detached</em>
218
- </b>
219
- <span
220
- style={{
221
- opacity: 0.8
222
- }}
223
- >
224
- {' '}
225
- &mdash; this page isn't listed in the navigation menu below.
226
- </span>
227
- </div>
228
- )
229
- }
@@ -1,97 +0,0 @@
1
- import React from 'react'
2
- import iconGithub from '../icons/github.svg'
3
- import iconTwitter from '../icons/twitter.svg'
4
- import iconDiscord from '../icons/discord.svg'
5
- import iconChangelog from '../icons/changelog.svg'
6
- import { usePageContext } from '../renderer/usePageContext'
7
-
8
- export { NavigationHeader }
9
-
10
- function NavigationHeader() {
11
- const pageContext = usePageContext()
12
- return (
13
- <div
14
- id="navigation-header"
15
- style={{
16
- display: 'flex',
17
- flexDirection: 'column',
18
- alignItems: 'center',
19
- marginBottom: -5
20
- }}
21
- >
22
- <a
23
- id="navigation-header-logo"
24
- style={{
25
- display: 'flex',
26
- alignItems: 'center',
27
- color: 'inherit',
28
- justifyContent: 'left',
29
- textDecoration: 'none',
30
- paddingTop: 12,
31
- paddingBottom: 7
32
- }}
33
- href="/"
34
- >
35
- {pageContext.config.navHeader}
36
- </a>
37
- <Links />
38
- </div>
39
- )
40
- }
41
-
42
- function Links() {
43
- const pageContext = usePageContext()
44
- const { projectInfo } = pageContext.config
45
- return (
46
- <div
47
- style={{
48
- display: 'flex',
49
- alignItems: 'center',
50
- paddingTop: 0,
51
- justifyContent: 'left'
52
- }}
53
- >
54
- <SocialLink className="decolorize-4" icon={iconGithub} href={projectInfo.githubRepository} />
55
- <SocialLink className="decolorize-6" icon={iconDiscord} href={projectInfo.discordInvite} />
56
- <SocialLink className="decolorize-7" icon={iconTwitter} href={projectInfo.twitterProfile} />
57
- <div id="docsearch-desktop" />
58
- <ChangelogButton />
59
- </div>
60
- )
61
- }
62
-
63
- function ChangelogButton() {
64
- const pageContext = usePageContext()
65
- const { projectInfo } = pageContext.config
66
- return (
67
- <a
68
- href={`${projectInfo.githubRepository}/blob/main/CHANGELOG.md`}
69
- className="button colorize-on-hover"
70
- style={{
71
- display: 'flex',
72
- alignItems: 'center',
73
- padding: '1px 7px',
74
- marginLeft: 2,
75
- fontSize: '0.97em',
76
- color: 'inherit'
77
- }}
78
- >
79
- <span className="decolorize-7">v{projectInfo.projectVersion}</span>
80
- <img className="decolorize-6" src={iconChangelog} height={16} style={{ marginLeft: 5 }} />
81
- </a>
82
- )
83
- }
84
-
85
- function SocialLink({ className, icon, href }: { className: string; icon: string; href: string }) {
86
- return (
87
- <>
88
- <a
89
- className={'colorize-on-hover ' + className}
90
- href={href}
91
- style={{ padding: 3, display: 'inline-block', lineHeight: 0 }}
92
- >
93
- <img src={icon} height="20" style={{}} />
94
- </a>
95
- </>
96
- )
97
- }
@@ -1,32 +0,0 @@
1
- :root {
2
- --navigation-fullscreen-button-width: 20px;
3
- }
4
- #navigation-fullscreen-button {
5
- width: var(--navigation-fullscreen-button-width);
6
- position: relative;
7
- z-index: 2;
8
- }
9
- #navigation-wrapper:hover + #navigation-fullscreen-button > div > div,
10
- #navigation-fullscreen-button:hover > div > div {
11
- left: 0px;
12
- }
13
- #navigation-fullscreen-button > div > div {
14
- transition: all 0.3s ease-in-out;
15
- left: -20px;
16
- position: absolute;
17
- height: 100%;
18
- width: 100%;
19
- background-color: #eee !important;
20
- background: url('./chevron.svg');
21
- background-repeat: no-repeat;
22
- background-position: center center;
23
- }
24
-
25
- html:not(.navigation-fullscreen) #navigation-fullscreen-close {
26
- display: none;
27
- }
28
-
29
- html.navigation-fullscreen #page-content {
30
- /* Make `Ctrl-F` browser search only crawl the navigation menu */
31
- visibility: hidden;
32
- }