@brillout/docpress 0.1.20 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (144) hide show
  1. package/bin.js +1 -1
  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-C3OIVLKV.js +75 -0
  10. package/dist/chunk-C3OIVLKV.js.map +1 -0
  11. package/dist/chunk-G2A5MZJA.js +48 -0
  12. package/dist/chunk-G2A5MZJA.js.map +1 -0
  13. package/dist/chunk-H5CO4N2X.js +174 -0
  14. package/dist/chunk-H5CO4N2X.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 +459 -26
  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 +264 -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 +591 -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 +12 -9
  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,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
- }
@@ -1,228 +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, Emoji } from '../utils/server'
8
- import './Navigation.css'
9
- import { NavigationFullscreenClose } from './navigation-fullscreen/NavigationFullscreenButton'
10
-
11
- function Navigation({
12
- pageContext
13
- }: {
14
- pageContext: {
15
- headingsWithSubHeadings: Heading[]
16
- urlPathname: string
17
- isDetachedPage: boolean
18
- }
19
- }) {
20
- const { isDetachedPage } = pageContext
21
- return (
22
- <>
23
- <div id="navigation-container">
24
- <NavigationHeader />
25
- {isDetachedPage && <DetachedPageNote />}
26
- <NavigationContent pageContext={pageContext} />
27
- {/* <ScrollOverlay /> */}
28
- <NavigationFullscreenClose />
29
- </div>
30
- </>
31
- )
32
- }
33
-
34
- function NavigationMask() {
35
- return <div id="navigation-mask" />
36
- }
37
-
38
- function NavigationContent({
39
- pageContext
40
- }: {
41
- pageContext: {
42
- headingsWithSubHeadings: Heading[]
43
- urlPathname: string
44
- isDetachedPage: boolean
45
- }
46
- }) {
47
- const headings = getHeadingsWithComputedProps(pageContext)
48
- const headingsGrouped = groupHeadings(headings)
49
- return (
50
- <div id="navigation-content">
51
- <div className="nav-column" style={{ position: 'relative' }}>
52
- {headingsGrouped.map((headingsH1, i) => (
53
- <div className="nav-h1-group" key={i}>
54
- <Heading heading={headingsH1} />
55
- {headingsH1.headings.map((heading, j) => (
56
- <Heading heading={heading} key={j} />
57
- ))}
58
- </div>
59
- ))}
60
- </div>
61
- </div>
62
- )
63
- }
64
-
65
- function Heading({
66
- heading
67
- }: {
68
- heading: {
69
- level: number
70
- url?: string
71
- titleInNav: string | JSX.Element
72
- computed: {
73
- isActive: boolean
74
- isActiveFirst: boolean
75
- isActiveLast: boolean
76
- isChildOfListHeading: boolean
77
- isFirstOfItsKind: boolean
78
- isLastOfItsKind: boolean
79
- }
80
- }
81
- }) {
82
- assert([1, 2, 3, 4].includes(heading.level), heading)
83
- return (
84
- <a
85
- className={[
86
- 'nav-item',
87
- 'nav-item-h' + heading.level,
88
- heading.computed.isActive && ' is-active',
89
- heading.computed.isActiveFirst && ' is-active-first',
90
- heading.computed.isActiveLast && ' is-active-last',
91
- heading.computed.isChildOfListHeading && 'nav-item-parent-is-list-heading',
92
- heading.computed.isFirstOfItsKind && 'nav-item-first-of-its-kind',
93
- heading.computed.isLastOfItsKind && 'nav-item-last-of-its-kind'
94
- ]
95
- .filter(Boolean)
96
- .join(' ')}
97
- href={heading.url || undefined}
98
- >
99
- {/* <span className="nav-item-text">{heading.titleInNav}</span> */}
100
- {heading.titleInNav}
101
- </a>
102
- )
103
- }
104
-
105
- function groupHeadings<T extends { level: number }>(headings: T[]) {
106
- const headingsGrouped: (T & { headings: T[] })[] = []
107
- headings.forEach((heading) => {
108
- if (heading.level === 1) {
109
- headingsGrouped.push({ ...heading, headings: [] })
110
- } else {
111
- headingsGrouped[headingsGrouped.length - 1].headings.push(heading)
112
- }
113
- })
114
- return headingsGrouped
115
- }
116
-
117
- function getHeadingsWithComputedProps(pageContext: {
118
- headingsWithSubHeadings: Heading[]
119
- urlPathname: string
120
- isDetachedPage: boolean
121
- }) {
122
- const { headingsWithSubHeadings, urlPathname } = pageContext
123
- return headingsWithSubHeadings.map((heading, i) => {
124
- assert([1, 2, 3, 4].includes(heading.level), heading)
125
-
126
- const headingPrevious = headingsWithSubHeadings[i - 1]
127
- const headingNext = headingsWithSubHeadings[i + 1]
128
-
129
- let isActiveFirst = false
130
- let isActiveLast = false
131
- let isActive = false
132
- if (heading.url === urlPathname) {
133
- assert(heading.level === 2, { urlPathname })
134
- isActive = true
135
- isActiveFirst = true
136
- if (headingNext?.level !== 3) {
137
- isActiveLast = true
138
- }
139
- }
140
- if (heading.level === 3) {
141
- isActive = true
142
- if (headingNext?.level !== 3) {
143
- isActiveLast = true
144
- }
145
- }
146
-
147
- const isFirstOfItsKind = heading.level !== headingPrevious?.level
148
- const isLastOfItsKind = heading.level !== headingNext?.level
149
- const isChildOfListHeading = !!heading.parentHeadings[0]?.isListTitle
150
-
151
- return {
152
- ...heading,
153
- computed: {
154
- isActive,
155
- isActiveFirst,
156
- isActiveLast,
157
- isFirstOfItsKind,
158
- isLastOfItsKind,
159
- isChildOfListHeading
160
- }
161
- }
162
- })
163
- }
164
-
165
- function ScrollOverlay() {
166
- // const width = '1px'
167
- // const color = '#aaa'
168
- return (
169
- <div
170
- id="scroll-overlay"
171
- style={{
172
- pointerEvents: 'none',
173
- position: 'absolute',
174
- left: '0',
175
- width: '100%',
176
- /*
177
- background: `linear-gradient(to right, ${color} ${width}, transparent ${width}) 0 0,
178
- linear-gradient(to right, ${color} ${width}, transparent ${width}) 0 100%,
179
- linear-gradient(to left, ${color} ${width}, transparent ${width}) 100% 0,
180
- linear-gradient(to left, ${color} ${width}, transparent ${width}) 100% 100%,
181
- linear-gradient(to bottom, ${color} ${width}, transparent ${width}) 0 0,
182
- linear-gradient(to bottom, ${color} ${width}, transparent ${width}) 100% 0,
183
- linear-gradient(to top, ${color} ${width}, transparent ${width}) 0 100%,
184
- linear-gradient(to top, ${color} ${width}, transparent ${width}) 100% 100%`,
185
- //*/
186
- //borderRight: `5px solid ${color}`,
187
- borderRight: `3px solid #666`,
188
- //border: `1px solid ${color}`,
189
- boxSizing: 'border-box',
190
- // backgroundColor: 'rgba(0,0,0,0.03)',
191
- backgroundRepeat: 'no-repeat',
192
-
193
- backgroundSize: '10px 10px'
194
- }}
195
- />
196
- )
197
- }
198
-
199
- function DetachedPageNote() {
200
- return (
201
- <div
202
- id="detached-note"
203
- style={{
204
- backgroundColor: 'var(--background-color)',
205
- textAlign: 'left',
206
- marginLeft: 10,
207
- marginRight: 10,
208
- marginTop: 30,
209
- marginBottom: -8,
210
- borderRadius: 5,
211
- padding: 10
212
- }}
213
- >
214
- <Emoji name="info" />{' '}
215
- <b>
216
- <em>Detached</em>
217
- </b>
218
- <span
219
- style={{
220
- opacity: 0.8
221
- }}
222
- >
223
- {' '}
224
- &mdash; this page isn't listed in the navigation menu below.
225
- </span>
226
- </div>
227
- )
228
- }
@@ -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
- }