@brillout/docpress 0.1.18 → 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.
- package/bin.js +1 -1
- package/{src/css/Inter-Var.ttf → dist/Inter-Var-IOAEQULN.ttf} +0 -0
- package/{src/components/Sponsors/companyLogos/ccoli.svg → dist/ccoli-CHW3TQKS.svg} +0 -0
- package/{src/icons/changelog.svg → dist/changelog-IPI5F42D.svg} +0 -0
- package/{src/navigation/navigation-fullscreen/chevron.svg → dist/chevron-K3WPYLOP.svg} +0 -0
- package/{src/components/features/chevron.svg → dist/chevron-R2IYJD62.svg} +0 -0
- package/dist/chunk-7HKDCMSZ.js +154 -0
- package/dist/chunk-7HKDCMSZ.js.map +1 -0
- package/dist/chunk-G2A5MZJA.js +48 -0
- package/dist/chunk-G2A5MZJA.js.map +1 -0
- package/dist/chunk-JS5BGVDK.js +178 -0
- package/dist/chunk-JS5BGVDK.js.map +1 -0
- package/dist/chunk-OEVBWUR6.js +92 -0
- package/dist/chunk-OEVBWUR6.js.map +1 -0
- package/dist/chunk-TTLAZ2T2.js +8 -0
- package/dist/chunk-TTLAZ2T2.js.map +1 -0
- package/dist/{chunk-X5WESXQE.js → chunk-XUTBTIEE.js} +13 -38
- package/dist/chunk-XUTBTIEE.js.map +1 -0
- package/dist/cli/index.d.ts +1 -0
- package/dist/cli/index.js +35 -0
- package/dist/cli/index.js.map +1 -0
- package/{src/navigation/navigation-fullscreen/close.svg → dist/close-IQXTDOHV.svg} +0 -0
- package/{src/utils/Emoji/compass.svg → dist/compass-2RWQU3E4.svg} +0 -0
- package/{src → dist}/components/features/FeatureList.css +2 -7
- package/dist/components/features/FeatureList.css.map +1 -0
- package/dist/components/features/FeatureList.d.ts +13 -0
- package/dist/components/features/FeatureList.js +8 -0
- package/dist/components/features/FeatureList.js.map +1 -0
- package/dist/components/features/initFeatureList.d.ts +3 -0
- package/dist/components/features/initFeatureList.js +60 -0
- package/dist/components/features/initFeatureList.js.map +1 -0
- package/{src/components/Sponsors/companyLogos/contra.svg → dist/contra-WLZBOPBV.svg} +0 -0
- package/dist/{devServer-4R22MOR5.js → devServer-534L4U45.js} +5 -2
- package/dist/{devServer-4R22MOR5.js.map → devServer-534L4U45.js.map} +1 -1
- package/{src/icons/discord.svg → dist/discord-JD33TUSF.svg} +0 -0
- package/{src/utils/Emoji/engine.png → dist/engine-6Q6VSCVA.png} +0 -0
- package/{src/icons/github.svg → dist/github-P5ZSKN2N.svg} +0 -0
- package/{src/icons/heart.svg → dist/heart-OINVKOXO.svg} +0 -0
- package/dist/index.css +121 -0
- package/dist/index.css.map +1 -0
- package/dist/index.d.ts +136 -0
- package/dist/index.js +484 -27
- package/dist/index.js.map +1 -1
- package/{src/components/Sponsors/label.svg → dist/label-MP75CTIA.svg} +0 -0
- package/{src/utils/Emoji/mechanical-arm.svg → dist/mechanical-arm-TR7IQQMG.svg} +0 -0
- package/{src/components/Sponsors/medalBronze.svg → dist/medalBronze-CO4CTUR4.svg} +0 -0
- package/{src/components/Sponsors/medalGold.svg → dist/medalGold-UP6A73FL.svg} +0 -0
- package/{src/components/Sponsors/medalSilver.svg → dist/medalSilver-FAPGGOBN.svg} +0 -0
- package/{src/components/Sponsors/companyLogos/mfqs.svg → dist/mfqs-2EAEE7N6.svg} +0 -0
- package/dist/renderer/_default.page.client.css +263 -0
- package/dist/renderer/_default.page.client.css.map +1 -0
- package/dist/renderer/_default.page.client.d.ts +1 -0
- package/dist/renderer/_default.page.client.js +180 -0
- package/dist/renderer/_default.page.client.js.map +1 -0
- package/dist/renderer/_default.page.server.css +312 -0
- package/dist/renderer/_default.page.server.css.map +1 -0
- package/dist/renderer/_default.page.server.d.ts +22 -0
- package/dist/renderer/_default.page.server.js +602 -0
- package/dist/renderer/_default.page.server.js.map +1 -0
- package/{src/utils/Emoji/road-fork.svg → dist/road-fork-3WZLW3HB.svg} +0 -0
- package/{src/utils/Emoji/shield.svg → dist/shield-CU45RG5C.svg} +0 -0
- package/{src/icons/twitter.svg → dist/twitter-I7DXDN3J.svg} +0 -0
- package/{src/utils/Emoji/typescript.svg → dist/typescript-ALIPKLRM.svg} +0 -0
- package/package.json +11 -8
- package/dist/chunk-X5WESXQE.js.map +0 -1
- package/src/MobileHeader.tsx +0 -68
- package/src/PageLayout.css +0 -41
- package/src/PageLayout.tsx +0 -37
- package/src/algolia/DocSearch.css +0 -29
- package/src/algolia/DocSearch.ts +0 -37
- package/src/autoScrollNav.ts +0 -22
- package/src/cli/devServer.ts +0 -31
- package/src/cli/index.ts +0 -29
- package/src/components/CodeBlock.tsx +0 -22
- package/src/components/DocLink.tsx +0 -108
- package/src/components/EditPageNote.tsx +0 -18
- package/src/components/HorizontalLine.tsx +0 -20
- package/src/components/ImportMeta.tsx +0 -11
- package/src/components/Info.tsx +0 -12
- package/src/components/Link.tsx +0 -18
- package/src/components/Note.tsx +0 -31
- package/src/components/P.css +0 -8
- package/src/components/P.tsx +0 -8
- package/src/components/ReadingRecommendation.tsx +0 -53
- package/src/components/RepoLink.tsx +0 -24
- package/src/components/Sponsors/companyLogos/ccoli-logo.svg +0 -1
- package/src/components/Sponsors/companyLogos/ccoli-text.svg +0 -1
- package/src/components/Sponsors/label.draft.svg +0 -108
- package/src/components/Sponsors.tsx +0 -242
- package/src/components/features/FeatureList.tsx +0 -114
- package/src/components/features/initFeatureList.ts +0 -66
- package/src/components/index.ts +0 -13
- package/src/config/Config.ts +0 -30
- package/src/config/getConfig.ts +0 -18
- package/src/config/resolveConfig/resolveHeading.ts +0 -0
- package/src/config/resolvePageContext.ts +0 -157
- package/src/css/button.css +0 -7
- package/src/css/code/block.css +0 -36
- package/src/css/code/inline.css +0 -27
- package/src/css/code.css +0 -20
- package/src/css/colorize-on-hover.css +0 -29
- package/src/css/font.css +0 -19
- package/src/css/heading.css +0 -25
- package/src/css/index.css +0 -11
- package/src/css/link.css +0 -17
- package/src/css/note.css +0 -26
- package/src/css/reset.css +0 -12
- package/src/css/table.css +0 -14
- package/src/css/tooltip.css +0 -11
- package/src/headings.ts +0 -200
- package/src/index.ts +0 -3
- package/src/installSectionUrlHashs.ts +0 -50
- package/src/markdownHeadingsVitePlugin.ts +0 -128
- package/src/navigation/Navigation-highlight.css +0 -41
- package/src/navigation/Navigation-items.css +0 -122
- package/src/navigation/Navigation-layout.css +0 -118
- package/src/navigation/Navigation.client.old.ts +0 -303
- package/src/navigation/Navigation.client.ts +0 -19
- package/src/navigation/Navigation.css +0 -12
- package/src/navigation/Navigation.tsx +0 -228
- package/src/navigation/NavigationHeader.tsx +0 -97
- package/src/navigation/navigation-fullscreen/NavigationFullscreenButton.css +0 -32
- package/src/navigation/navigation-fullscreen/NavigationFullscreenButton.tsx +0 -44
- package/src/navigation/navigation-fullscreen/initNavigationFullscreen.ts +0 -115
- package/src/parseEmojis.ts +0 -33
- package/src/renderer/_default.page.client.ts +0 -4
- package/src/renderer/_default.page.server.tsx +0 -69
- package/src/renderer/usePageContext.tsx +0 -25
- package/src/types.ts +0 -2
- package/src/utils/Emoji/Emoji.ts +0 -216
- package/src/utils/Emoji/assets.ts +0 -9
- package/src/utils/Emoji/index.ts +0 -1
- package/src/utils/Emoji/mountain.svg +0 -1
- package/src/utils/assert.ts +0 -39
- package/src/utils/client.ts +0 -2
- package/src/utils/crawlAllFiles.ts +0 -17
- package/src/utils/determineSectionUrlHash.ts +0 -35
- package/src/utils/filesystemPathHandling.ts +0 -42
- package/src/utils/filter.ts +0 -12
- package/src/utils/isBrowser.ts +0 -5
- package/src/utils/jsxToTextContent.ts +0 -11
- package/src/utils/objectAssign.ts +0 -9
- package/src/utils/server.ts +0 -8
- package/src/vite.config.ts +0 -42
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/renderer/_default.page.server.tsx","../../src/PageLayout.tsx","../../src/navigation/Navigation.tsx","../../src/navigation/NavigationHeader.tsx","../../src/navigation/navigation-fullscreen/NavigationFullscreenButton.tsx","../../src/MobileHeader.tsx","../../src/components/EditPageNote.tsx","../../src/config/getConfig.ts","../../src/config/resolvePageContext.ts","../../src/algolia/DocSearch.ts","../../src/parseEmojis.ts"],"sourcesContent":["import ReactDOMServer from 'react-dom/server'\nimport React from 'react'\nimport { escapeInject, dangerouslySkipEscape } from 'vite-plugin-ssr'\nimport { PageLayout } from '../PageLayout'\nimport { resolvePageContext, PageContextOriginal } from '../config/resolvePageContext'\nimport { getDocSearchJS, getDocSearchCSS } from '../algolia/DocSearch'\nimport { parseEmojis } from '../parseEmojis'\nimport { assert } from '../utils/server'\n\nexport { render }\n\nasync function render(pageContextOriginal: PageContextOriginal) {\n const { Page } = pageContextOriginal\n const pageContextResolved = resolvePageContext(pageContextOriginal)\n\n const page = (\n <PageLayout pageContext={pageContextResolved}>\n <Page />\n </PageLayout>\n )\n\n const descriptionTag = pageContextResolved.isLandingPage\n ? dangerouslySkipEscape(`<meta name=\"description\" content=\"${pageContextResolved.meta.tagline}\" />`)\n : ''\n\n const docSearchJS = getDocSearchJS(pageContextResolved)\n const docSearchCSS = getDocSearchCSS(pageContextResolved)\n\n let pageHtml = ReactDOMServer.renderToString(page)\n pageHtml = parseEmojis(pageHtml)\n\n return escapeInject`<!DOCTYPE html>\n <html>\n <head>\n <meta charset=\"UTF-8\" />\n <link rel=\"icon\" href=\"${pageContextResolved.meta.faviconUrl}\" />\n <title>${pageContextResolved.meta.title}</title>\n ${descriptionTag}\n <meta name=\"viewport\" content=\"width=device-width,initial-scale=1,user-scalable=no\" />\n ${docSearchCSS}\n ${getOpenGraphTags(pageContextOriginal.urlPathname, pageContextResolved.meta)}\n </head>\n <body>\n <div id=\"page-view\">${dangerouslySkipEscape(pageHtml)}</div>\n ${docSearchJS}\n </body>\n </html>`\n}\n\nfunction getOpenGraphTags(\n url: string,\n meta: { title: string; tagline: string; websiteUrl: string; twitterHandle: string; bannerUrl?: string }\n) {\n const { title, tagline, websiteUrl, twitterHandle, bannerUrl } = meta\n\n assert(url.startsWith('/'))\n if (url !== '/' || !bannerUrl) return ''\n\n // See view-source:https://vitejs.dev/\n return escapeInject`\n <meta property=\"og:type\" content=\"website\">\n <meta property=\"og:title\" content=\"${title}\">\n <meta property=\"og:image\" content=\"${bannerUrl}\">\n <meta property=\"og:url\" content=\"${websiteUrl}\">\n <meta property=\"og:description\" content=\"${tagline}\">\n <meta name=\"twitter:card\" content=\"summary_large_image\">\n <meta name=\"twitter:site\" content=\"${twitterHandle}\">\n `\n}\n","import React from 'react'\nimport { Navigation, NavigationMask } from './navigation/Navigation'\nimport type { PageContextResolved } from './config/resolvePageContext'\nimport { MobileHeader } from './MobileHeader'\nimport { EditPageNote } from './components/EditPageNote'\nimport { PageContextProvider } from './renderer/usePageContext'\nimport './PageLayout.css'\nimport { NavigationFullscreenButton } from './navigation/navigation-fullscreen/NavigationFullscreenButton'\n\nexport { PageLayout }\n\nfunction PageLayout({ pageContext, children }: { pageContext: PageContextResolved; children: JSX.Element }) {\n const { isLandingPage, pageTitle } = pageContext\n return (\n <React.StrictMode>\n <PageContextProvider pageContext={pageContext}>\n <div id=\"page-layout\" className={isLandingPage ? 'landing-page' : 'doc-page'}>\n <div id=\"navigation-wrapper\">\n <Navigation pageContext={pageContext} />\n </div>\n <NavigationFullscreenButton />\n <div id=\"page-wrapper\">\n <div id=\"page-container\">\n <MobileHeader />\n <div id=\"page-content\">\n {pageTitle && <h1>{pageTitle}</h1>}\n {children}\n {!isLandingPage && <EditPageNote pageContext={pageContext} />}\n </div>\n </div>\n <NavigationMask />\n </div>\n </div>\n </PageContextProvider>\n </React.StrictMode>\n )\n}\n","export { Navigation }\nexport { NavigationMask }\n\nimport React from 'react'\nimport { NavigationHeader } from './NavigationHeader'\nimport { Heading } from '../headings'\nimport { assert, Emoji } from '../utils/server'\nimport './Navigation.css'\nimport { NavigationFullscreenClose } from './navigation-fullscreen/NavigationFullscreenButton'\n\nfunction Navigation({\n pageContext\n}: {\n pageContext: {\n headingsWithSubHeadings: Heading[]\n urlPathname: string\n isDetachedPage: boolean\n }\n}) {\n const { isDetachedPage } = pageContext\n return (\n <>\n <div id=\"navigation-container\">\n <NavigationHeader />\n {isDetachedPage && <DetachedPageNote />}\n <NavigationContent pageContext={pageContext} />\n {/* <ScrollOverlay /> */}\n <NavigationFullscreenClose />\n </div>\n </>\n )\n}\n\nfunction NavigationMask() {\n return <div id=\"navigation-mask\" />\n}\n\nfunction NavigationContent({\n pageContext\n}: {\n pageContext: {\n headingsWithSubHeadings: Heading[]\n urlPathname: string\n isDetachedPage: boolean\n }\n}) {\n const headings = getHeadingsWithComputedProps(pageContext)\n const headingsGrouped = groupHeadings(headings)\n return (\n <div id=\"navigation-content\">\n <div className=\"nav-column\" style={{ position: 'relative' }}>\n {headingsGrouped.map((headingsH1, i) => (\n <div className=\"nav-h1-group\" key={i}>\n <Heading heading={headingsH1} />\n {headingsH1.headings.map((heading, j) => (\n <Heading heading={heading} key={j} />\n ))}\n </div>\n ))}\n </div>\n </div>\n )\n}\n\nfunction Heading({\n heading\n}: {\n heading: {\n level: number\n url?: string\n titleInNav: string | JSX.Element\n computed: {\n isActive: boolean\n isActiveFirst: boolean\n isActiveLast: boolean\n isChildOfListHeading: boolean\n isFirstOfItsKind: boolean\n isLastOfItsKind: boolean\n }\n }\n}) {\n assert([1, 2, 3, 4].includes(heading.level), heading)\n return (\n <a\n className={[\n 'nav-item',\n 'nav-item-h' + heading.level,\n heading.computed.isActive && ' is-active',\n heading.computed.isActiveFirst && ' is-active-first',\n heading.computed.isActiveLast && ' is-active-last',\n heading.computed.isChildOfListHeading && 'nav-item-parent-is-list-heading',\n heading.computed.isFirstOfItsKind && 'nav-item-first-of-its-kind',\n heading.computed.isLastOfItsKind && 'nav-item-last-of-its-kind'\n ]\n .filter(Boolean)\n .join(' ')}\n href={heading.url || undefined}\n >\n {/* <span className=\"nav-item-text\">{heading.titleInNav}</span> */}\n {heading.titleInNav}\n </a>\n )\n}\n\nfunction groupHeadings<T extends { level: number }>(headings: T[]) {\n const headingsGrouped: (T & { headings: T[] })[] = []\n headings.forEach((heading) => {\n if (heading.level === 1) {\n headingsGrouped.push({ ...heading, headings: [] })\n } else {\n headingsGrouped[headingsGrouped.length - 1].headings.push(heading)\n }\n })\n return headingsGrouped\n}\n\nfunction getHeadingsWithComputedProps(pageContext: {\n headingsWithSubHeadings: Heading[]\n urlPathname: string\n isDetachedPage: boolean\n}) {\n const { headingsWithSubHeadings, urlPathname } = pageContext\n return headingsWithSubHeadings.map((heading, i) => {\n assert([1, 2, 3, 4].includes(heading.level), heading)\n\n const headingPrevious = headingsWithSubHeadings[i - 1]\n const headingNext = headingsWithSubHeadings[i + 1]\n\n let isActiveFirst = false\n let isActiveLast = false\n let isActive = false\n if (heading.url === urlPathname) {\n assert(heading.level === 2, { urlPathname })\n isActive = true\n isActiveFirst = true\n if (headingNext?.level !== 3) {\n isActiveLast = true\n }\n }\n if (heading.level === 3) {\n isActive = true\n if (headingNext?.level !== 3) {\n isActiveLast = true\n }\n }\n\n const isFirstOfItsKind = heading.level !== headingPrevious?.level\n const isLastOfItsKind = heading.level !== headingNext?.level\n const isChildOfListHeading = !!heading.parentHeadings[0]?.isListTitle\n\n return {\n ...heading,\n computed: {\n isActive,\n isActiveFirst,\n isActiveLast,\n isFirstOfItsKind,\n isLastOfItsKind,\n isChildOfListHeading\n }\n }\n })\n}\n\nfunction ScrollOverlay() {\n // const width = '1px'\n // const color = '#aaa'\n return (\n <div\n id=\"scroll-overlay\"\n style={{\n pointerEvents: 'none',\n position: 'absolute',\n left: '0',\n width: '100%',\n /*\n background: `linear-gradient(to right, ${color} ${width}, transparent ${width}) 0 0,\n linear-gradient(to right, ${color} ${width}, transparent ${width}) 0 100%,\n linear-gradient(to left, ${color} ${width}, transparent ${width}) 100% 0,\n linear-gradient(to left, ${color} ${width}, transparent ${width}) 100% 100%,\n linear-gradient(to bottom, ${color} ${width}, transparent ${width}) 0 0,\n linear-gradient(to bottom, ${color} ${width}, transparent ${width}) 100% 0,\n linear-gradient(to top, ${color} ${width}, transparent ${width}) 0 100%,\n linear-gradient(to top, ${color} ${width}, transparent ${width}) 100% 100%`,\n //*/\n //borderRight: `5px solid ${color}`,\n borderRight: `3px solid #666`,\n //border: `1px solid ${color}`,\n boxSizing: 'border-box',\n // backgroundColor: 'rgba(0,0,0,0.03)',\n backgroundRepeat: 'no-repeat',\n\n backgroundSize: '10px 10px'\n }}\n />\n )\n}\n\nfunction DetachedPageNote() {\n return (\n <div\n id=\"detached-note\"\n style={{\n backgroundColor: 'var(--background-color)',\n textAlign: 'left',\n marginLeft: 10,\n marginRight: 10,\n marginTop: 30,\n marginBottom: -8,\n borderRadius: 5,\n padding: 10\n }}\n >\n <Emoji name=\"info\" />{' '}\n <b>\n <em>Detached</em>\n </b>\n <span\n style={{\n opacity: 0.8\n }}\n >\n {' '}\n — this page isn't listed in the navigation menu below.\n </span>\n </div>\n )\n}\n","import React from 'react'\nimport iconGithub from '../icons/github.svg'\nimport iconTwitter from '../icons/twitter.svg'\nimport iconDiscord from '../icons/discord.svg'\nimport iconChangelog from '../icons/changelog.svg'\nimport { usePageContext } from '../renderer/usePageContext'\n\nexport { NavigationHeader }\n\nfunction NavigationHeader() {\n const pageContext = usePageContext()\n return (\n <div\n id=\"navigation-header\"\n style={{\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n marginBottom: -5\n }}\n >\n <a\n id=\"navigation-header-logo\"\n style={{\n display: 'flex',\n alignItems: 'center',\n color: 'inherit',\n justifyContent: 'left',\n textDecoration: 'none',\n paddingTop: 12,\n paddingBottom: 7\n }}\n href=\"/\"\n >\n {pageContext.config.navHeader}\n </a>\n <Links />\n </div>\n )\n}\n\nfunction Links() {\n const pageContext = usePageContext()\n const { projectInfo } = pageContext.config\n return (\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n paddingTop: 0,\n justifyContent: 'left'\n }}\n >\n <SocialLink className=\"decolorize-4\" icon={iconGithub} href={projectInfo.githubRepository} />\n <SocialLink className=\"decolorize-6\" icon={iconDiscord} href={projectInfo.discordInvite} />\n <SocialLink className=\"decolorize-7\" icon={iconTwitter} href={projectInfo.twitterProfile} />\n <div id=\"docsearch-desktop\" />\n <ChangelogButton />\n </div>\n )\n}\n\nfunction ChangelogButton() {\n const pageContext = usePageContext()\n const { projectInfo } = pageContext.config\n return (\n <a\n href={`${projectInfo.githubRepository}/blob/main/CHANGELOG.md`}\n className=\"button colorize-on-hover\"\n style={{\n display: 'flex',\n alignItems: 'center',\n padding: '1px 7px',\n marginLeft: 2,\n fontSize: '0.97em',\n color: 'inherit'\n }}\n >\n <span className=\"decolorize-7\">v{projectInfo.projectVersion}</span>\n <img className=\"decolorize-6\" src={iconChangelog} height={16} style={{ marginLeft: 5 }} />\n </a>\n )\n}\n\nfunction SocialLink({ className, icon, href }: { className: string; icon: string; href: string }) {\n return (\n <>\n <a\n className={'colorize-on-hover ' + className}\n href={href}\n style={{ padding: 3, display: 'inline-block', lineHeight: 0 }}\n >\n <img src={icon} height=\"20\" style={{}} />\n </a>\n </>\n )\n}\n","export { NavigationFullscreenButton }\nexport { NavigationFullscreenClose }\n\nimport React from 'react'\nimport './NavigationFullscreenButton.css'\nimport closeIcon from './close.svg'\n\nfunction NavigationFullscreenButton() {\n return (\n <>\n <a id=\"navigation-fullscreen-button\">\n <div\n style={{\n position: 'fixed',\n cursor: 'pointer',\n height: '100vh',\n width: 20,\n overflow: 'hidden'\n }}\n >\n <div></div>\n </div>\n <div\n style={{ position: 'fixed', height: '100vh', width: 20 }}\n aria-label=\"Press <Esc>\"\n data-balloon-pos=\"right\"\n ></div>\n </a>\n </>\n )\n}\n\nfunction NavigationFullscreenClose() {\n return (\n <a\n id=\"navigation-fullscreen-close\"\n style={{ position: 'fixed', top: 11, right: 15, zIndex: 10 }}\n aria-label=\"Press <Esc>\"\n data-balloon-pos=\"left\"\n >\n <img src={closeIcon} height={50} width={50} style={{ display: 'block' }} />\n </a>\n )\n}\n","import React from 'react'\nimport { usePageContext } from './renderer/usePageContext'\n\nexport { MobileHeader }\n\nfunction MobileHeader() {\n const pageContext = usePageContext()\n return (\n <div\n id=\"mobile-header\"\n style={{\n height: 'var(--mobile-header-height)',\n width: '100vw',\n position: 'relative'\n }}\n >\n <div\n style={{\n position: 'fixed',\n display: 'flex',\n alignItems: 'center',\n background: 'white',\n zIndex: 99,\n top: 0,\n left: 0,\n height: 'var(--mobile-header-height)',\n width: '100%',\n borderBottom: '1px solid #ddd'\n }}\n >\n <MenuToggle />\n <a\n href=\"/\"\n style={{\n color: 'inherit',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'left',\n textDecoration: 'none'\n }}\n >\n {pageContext.config.navHeaderMobile}\n </a>\n <div id=\"docsearch-mobile\" />\n </div>\n </div>\n )\n}\n\nfunction MenuToggle() {\n return (\n <div style={{ padding: 20, lineHeight: 0 }} id=\"menu-toggle\">\n <svg\n style={{ width: 20 }}\n className=\"icon\"\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden=\"true\"\n role=\"img\"\n viewBox=\"0 0 448 512\"\n >\n <path\n fill=\"currentColor\"\n d=\"M436 124H12c-6.627 0-12-5.373-12-12V80c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12zm0 160H12c-6.627 0-12-5.373-12-12v-32c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12zm0 160H12c-6.627 0-12-5.373-12-12v-32c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12z\"\n ></path>\n </svg>\n </div>\n )\n}\n","import React from 'react'\nimport { RepoLink } from './RepoLink'\nimport { Emoji } from '../utils/server'\n\nexport { EditPageNote }\n\nfunction EditPageNote({ pageContext }: { pageContext: { urlPathname: string } }) {\n const text = (\n <>\n <Emoji name=\"writing-hang\" /> Edit this page\n </>\n )\n return (\n <div style={{ marginTop: 50 }}>\n <RepoLink path={'/docs/pages' + pageContext.urlPathname + '.page.server.mdx'} text={text} editMode={true} />\n </div>\n )\n}\n","export { getConfig }\nimport { assert, assertUsage } from '../utils/server'\nimport { Config } from './Config'\n\nfunction getConfig(): Config {\n // We use `@ts-ignore` because the DocPress user most likely didn't add `vite/client` in his `tsconfig.json`.\n // @ts-ignore\n const globResult = import.meta.glob('/**/docpress.config.*([a-zA-Z0-9])', { eager: true })\n const files = Object.keys(globResult)\n assertUsage(files.length >= 1, 'No DocPress config file found `docpress.config.(js|ts|tsx|...)`')\n assertUsage(\n files.length === 1,\n `Found multiple \\`docpress.config.js\\` files: ${files.map((f) => `\\`${f}\\``).join(', ')}. Define only one instead.`\n )\n const config = (Object.values(globResult)[0] as any).default as Config\n assert(config)\n return config\n}\n","import { assert, jsxToTextContent, objectAssign } from '../utils/server'\nimport { getHeadings, HeadingWithoutLink, parseTitle } from '../headings'\nimport type { Heading } from '../headings'\nimport type { PageContextBuiltIn } from 'vite-plugin-ssr'\nimport type { MarkdownHeading } from '../markdownHeadingsVitePlugin'\nimport type { Config } from './Config'\nimport { getConfig } from './getConfig'\n\nexport { resolvePageContext }\nexport type { PageContextOriginal }\nexport type { PageContextResolved }\nexport type { Heading }\n\ntype ReactComponent = () => JSX.Element\ntype Exports = {\n headings?: MarkdownHeading[]\n}\ntype PageContextOriginal = PageContextBuiltIn & {\n Page: ReactComponent\n exports: Exports\n}\ntype PageContextResolved = ReturnType<typeof resolvePageContext>\n\nfunction resolvePageContext(pageContext: PageContextOriginal) {\n const config = getConfig()\n const { headings, headingsWithoutLink } = getHeadings(config)\n const activeHeading = findActiveHeading(headings, headingsWithoutLink, pageContext)\n const headingsWithSubHeadings = getHeadingsWithSubHeadings(headings, pageContext, activeHeading)\n const { title, isLandingPage, pageTitle, isDetachedPage } = getMetaData(\n headingsWithoutLink,\n activeHeading,\n pageContext,\n config\n )\n const { faviconUrl, algolia, tagline, twitterHandle, bannerUrl, websiteUrl } = config\n const pageContextResolved = {}\n objectAssign(pageContextResolved, {\n ...pageContext,\n meta: {\n title,\n faviconUrl,\n twitterHandle,\n bannerUrl,\n websiteUrl,\n tagline,\n algolia\n },\n headings,\n headingsWithSubHeadings,\n isLandingPage,\n isDetachedPage,\n pageTitle,\n config\n })\n return pageContextResolved\n}\n\nfunction getMetaData(\n headingsWithoutLink: HeadingWithoutLink[],\n activeHeading: Heading | null,\n pageContext: { urlOriginal: string; exports: Exports },\n config: Config\n) {\n const url = pageContext.urlOriginal\n\n let title: string\n let pageTitle: string | JSX.Element | null\n let isDetachedPage: boolean\n if (activeHeading) {\n title = activeHeading.titleDocument || jsxToTextContent(activeHeading.title)\n pageTitle = activeHeading.title\n isDetachedPage = false\n } else {\n pageTitle = headingsWithoutLink.find((h) => h.url === url)!.title\n title = jsxToTextContent(pageTitle)\n isDetachedPage = true\n }\n\n const isLandingPage = url === '/'\n if (!isLandingPage) {\n title += ' | ' + config.projectInfo.projectName\n }\n\n if (isLandingPage) {\n pageTitle = null\n }\n\n return { title, isLandingPage, pageTitle, isDetachedPage }\n}\n\nfunction findActiveHeading(\n headings: Heading[],\n headingsWithoutLink: HeadingWithoutLink[],\n pageContext: { urlOriginal: string; exports: Exports }\n): Heading | null {\n let activeHeading: Heading | null = null\n assert(pageContext.urlOriginal)\n const pageUrl = pageContext.urlOriginal\n headings.forEach((heading) => {\n if (heading.url === pageUrl) {\n activeHeading = heading\n assert(heading.level === 2, { pageUrl, heading })\n }\n })\n const debugInfo = {\n msg: 'Heading not found for url: ' + pageUrl,\n urls: headings.map((h) => h.url),\n url: pageUrl\n }\n assert(activeHeading || headingsWithoutLink.find(({ url }) => pageUrl === url), debugInfo)\n return activeHeading\n}\n\nfunction getHeadingsWithSubHeadings(\n headings: Heading[],\n pageContext: { exports: Exports; urlOriginal: string },\n activeHeading: Heading | null\n): Heading[] {\n const headingsWithSubHeadings = headings.slice()\n if (activeHeading === null) return headingsWithSubHeadings\n const activeHeadingIdx = headingsWithSubHeadings.indexOf(activeHeading)\n assert(activeHeadingIdx >= 0)\n const pageHeadings = pageContext.exports.headings || []\n pageHeadings.forEach((pageHeading, i) => {\n const title = parseTitle(pageHeading.title)\n const url = '#' + pageHeading.id\n assert(\n pageHeading.headingLevel !== 3,\n 'Wrong page heading level `' +\n pageHeading.headingLevel +\n '` (it should be `<h2>`) for sub-heading `' +\n pageHeading.title +\n '` of page `' +\n pageContext.urlOriginal +\n '`.'\n )\n if (pageHeading.headingLevel === 2) {\n const heading: Heading = {\n url,\n title,\n parentHeadings: [activeHeading, ...activeHeading.parentHeadings],\n titleInNav: title,\n level: 3\n }\n headingsWithSubHeadings.splice(activeHeadingIdx + 1 + i, 0, heading)\n }\n })\n\n if (activeHeading?.sectionTitles) {\n activeHeading.sectionTitles.forEach((sectionTitle) => {\n const pageHeadingTitles = pageHeadings.map((h) => h.title)\n assert(pageHeadingTitles.includes(sectionTitle), { pageHeadingTitles, sectionTitle })\n })\n }\n\n return headingsWithSubHeadings\n}\n","import { escapeInject } from 'vite-plugin-ssr'\nimport { PageContextResolved } from '../config/resolvePageContext'\n\nexport { getDocSearchCSS }\nexport { getDocSearchJS }\n\nfunction getDocSearchCSS(pageContext: PageContextResolved) {\n const docSearchCSS = !pageContext.meta.algolia\n ? ''\n : escapeInject`\n <link rel=\"stylesheet\" href=\"https://cdn.jsdelivr.net/npm/@docsearch/css@alpha\" />\n `\n return docSearchCSS\n}\n\nfunction getDocSearchJS(pageContext: PageContextResolved) {\n const docSearchJS = !pageContext.meta.algolia\n ? ''\n : escapeInject`\n <script type=\"text/javascript\" src=\"https://cdn.jsdelivr.net/npm/@docsearch/js@alpha\"></script>\n <script type=\"text/javascript\">\n docsearch({\n appId: '${pageContext.meta.algolia.appId}',\n apiKey: '${pageContext.meta.algolia.apiKey}',\n indexName: '${pageContext.meta.algolia.indexName}',\n container: '#docsearch-desktop',\n })\n docsearch({\n appId: '${pageContext.meta.algolia.appId}',\n apiKey: '${pageContext.meta.algolia.apiKey}',\n indexName: '${pageContext.meta.algolia.indexName}',\n container: '#docsearch-mobile',\n })\n </script>\n `\n return docSearchJS\n}\n","export { parseEmojis }\n\nimport twemoji from 'twemoji'\n\nconst emojiList = {\n // https://emojipedia.org/no-entry/\n ':no_entry:': 0x26d4,\n // https://emojipedia.org/warning/\n ':warning:': 0x26a0,\n // https://emojipedia.org/trophy/\n ':trophy:': 0x1f3c6\n /*\n // https://emojipedia.org/red-heart/\n ':heart:': 0x2764,\n */\n}\n\nfunction parseEmojis(html: string) {\n Object.entries(emojiList).forEach(([shortcode, codepoint]) => {\n if (!html.includes(shortcode)) {\n return\n }\n const emojiStr = twemoji.convert.fromCodePoint(codepoint as any)\n let emojiImg: any = twemoji.parse(emojiStr, {\n folder: 'svg',\n ext: '.svg'\n })\n const style = 'height: 1.275em; width: 1.275em; vertical-align: -20%'\n emojiImg = emojiImg.replace('<img class=\"emoji\" ', `<img style=\"${style}\" `)\n html = html.split(shortcode).join(emojiImg)\n })\n return html\n}\n"],"mappings":"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","names":["React","escapeInject","React","React","React","React","React","_a","React","React","React","React","React","React","React","escapeInject"]}
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
package/package.json
CHANGED
|
@@ -1,26 +1,30 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@brillout/docpress",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.2.0",
|
|
4
4
|
"exports": {
|
|
5
|
-
".": "./
|
|
6
|
-
"./
|
|
5
|
+
"./renderer/_default.page.server.js": "./dist/renderer/_default.page.server.js",
|
|
6
|
+
"./renderer/_default.page.client.js": "./dist/renderer/_default.page.client.js",
|
|
7
|
+
"./renderer/_default.page.server.css": "./dist/renderer/_default.page.server.css",
|
|
8
|
+
"./renderer/_default.page.client.css": "./dist/renderer/_default.page.client.css",
|
|
9
|
+
".": "./dist/index.js",
|
|
10
|
+
"./features/FeatureList": "./dist/components/features/FeatureList.js",
|
|
7
11
|
"./features/FeatureList.css": {
|
|
8
|
-
"browser": "./
|
|
12
|
+
"browser": "./dist/components/features/FeatureList.css"
|
|
9
13
|
},
|
|
10
14
|
"./features/initFeatureList": {
|
|
11
|
-
"browser": "./
|
|
15
|
+
"browser": "./dist/components/features/initFeatureList.js"
|
|
12
16
|
}
|
|
13
17
|
},
|
|
14
18
|
"typesVersions": {
|
|
15
19
|
"*": {
|
|
16
20
|
"*": [
|
|
17
|
-
"
|
|
21
|
+
"dist/*"
|
|
18
22
|
],
|
|
19
23
|
"mdx": [
|
|
20
24
|
"mdx.d.ts"
|
|
21
25
|
],
|
|
22
26
|
"features/*": [
|
|
23
|
-
"
|
|
27
|
+
"dist/components/features/*"
|
|
24
28
|
]
|
|
25
29
|
}
|
|
26
30
|
},
|
|
@@ -72,7 +76,6 @@
|
|
|
72
76
|
"files": [
|
|
73
77
|
"mdx.d.ts",
|
|
74
78
|
"bin.js",
|
|
75
|
-
"src/",
|
|
76
79
|
"dist/"
|
|
77
80
|
],
|
|
78
81
|
"type": "module",
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/vite.config.ts","../src/utils/assert.ts","../src/utils/determineSectionUrlHash.ts","../src/utils/Emoji/Emoji.ts","../src/markdownHeadingsVitePlugin.ts"],"sourcesContent":["import mdx from '@mdx-js/rollup'\nimport react from '@vitejs/plugin-react-swc'\nimport ssr from 'vite-plugin-ssr/plugin'\nimport { UserConfig } from 'vite'\nimport { markdownHeadingsVitePlugin } from './markdownHeadingsVitePlugin'\nimport rehypePrettyCode from 'rehype-pretty-code'\nimport remarkGfm from 'remark-gfm'\n\nconst root = process.cwd()\nconst prettyCode = [rehypePrettyCode, { theme: 'github-light' }]\nconst rehypePlugins: any = [prettyCode]\nconst remarkPlugins = [remarkGfm]\n\nconst config: UserConfig = {\n root,\n plugins: [\n react(),\n markdownHeadingsVitePlugin(),\n mdx({ rehypePlugins, remarkPlugins }),\n ssr({\n prerender: {\n noExtraDir: true\n },\n // @ts-ignore until new version is released TODO\n extensions: [{\n npmPackageName: '@brillout/docpress',\n pageFilesSrc: '/src/renderer/*',\n }],\n includeAssetsImportedByServer: true,\n disableAutoFullBuild: true\n })\n ],\n // TODO: remove `react`?\n optimizeDeps: { include: ['@mdx-js/react', 'react', 'react-dom'] },\n // @ts-ignore\n ssr: {\n noExternal: ['@brillout/docpress']\n },\n clearScreen: false\n}\n\nexport default config\n","export { assert }\nexport { assertUsage }\n\nfunction assert(condition: unknown, debugInfo?: unknown): asserts condition {\n if (condition) {\n return\n }\n const hasDebugInfo = debugInfo !== undefined\n if (hasDebugInfo) {\n console.log(debugInfo)\n if (typeof debugInfo === 'object') {\n debugInfo = JSON.stringify(debugInfo)\n }\n }\n let errMsg = '[DocPress] Bug. Contact DocPress maintainer.'\n if (hasDebugInfo) {\n errMsg += ' Debug info: ' + String(debugInfo)\n }\n const err = new Error(errMsg)\n if (isBrowserAndDev()) {\n alert(err.stack)\n }\n throw err\n}\n\nfunction assertUsage(condition: unknown, msg: string): asserts condition {\n if (condition) {\n return\n }\n const err = new Error('[DocPress][Wrong Usage] ' + msg)\n if (isBrowserAndDev()) {\n alert(err.stack)\n }\n throw err\n}\n\nfunction isBrowserAndDev() {\n return typeof window !== 'undefined' && window?.location?.port !== ''\n}\n","import { assert } from './assert'\n\nexport { determineSectionUrlHash }\nexport { determineSectionTitle }\n\nfunction determineSectionUrlHash(title: string): string {\n const urlHash = title\n .toLowerCase()\n .split(/[^a-z0-9]+/)\n .filter(Boolean)\n .join('-')\n return urlHash\n}\n\nfunction determineSectionTitle(urlWithHash: string, titleNormalCase: boolean): string {\n assert(urlWithHash.includes('#'), { urlWithHash })\n const urlHash = urlWithHash.split('#')[1]\n const title = urlHash\n .split('-')\n .map((word, i) => {\n if (i === 0) {\n return capitalizeFirstLetter(word)\n }\n if (!titleNormalCase && word.length >= 4) {\n return capitalizeFirstLetter(word)\n }\n return word\n })\n .join(' ')\n return title\n}\n\nfunction capitalizeFirstLetter(word: string): string {\n return word[0].toUpperCase() + word.slice(1)\n}\n","import React from 'react'\nimport { assert } from '../assert'\n\nimport { iconMechanicalArm, iconCompass, iconRoadFork, iconShield, iconTypescript, iconEngine } from './assets'\n\nexport { Emoji }\nexport type { EmojiName }\n\ntype EmojiName =\n | 'warning'\n | 'typescript'\n | 'shield'\n | 'mechanical-arm'\n | 'mountain'\n | 'rocket'\n | 'wrench'\n | 'compass'\n | 'seedling'\n | 'books'\n | 'plug'\n | 'earth'\n | 'gear'\n | 'red-heart'\n | 'high-voltage'\n | 'gem-stone'\n | 'dizzy'\n | 'sparkles'\n | 'writing-hang'\n | 'road-fork'\n | 'engine'\n | 'red-circle'\n | 'sparkling-heart'\n | 'gift'\n | 'package'\n | 'info'\n | 'lab'\n | 'trophy'\n\nfunction Emoji({ name, style }: { name: EmojiName; style?: React.CSSProperties }): JSX.Element {\n const emoji =\n // ***\n // U+26A0\n // https://emojipedia.org/warning/\n // https://www.unicompat.com/26A0 => 94.1%\n // https://www.unicompat.com/26A0-FE0F => 92.4%\n // https://www.unicompat.com/2697 => 94.1%\n (name === 'warning' && Unicode(0x26a0, { fontFamily: 'emoji' })) ||\n // ***\n // U+2697\n // https://emojipedia.org/alembic/\n // https://www.unicompat.com/2697 => 94.1%\n (name === 'lab' && Unicode(0x2697)) ||\n // ***\n // U+2139\n // https://emojipedia.org/information/\n // https://www.unicompat.com/2139 => 94.8%\n // https://www.unicompat.com/2139-FE0F => 92.4%\n (name === 'info' && Unicode(0x2139, { fontFamily: 'emoji' })) ||\n // ***\n // U+1F4E6\n // https://emojipedia.org/package/\n // https://www.unicompat.com/1F4E6 => 94.1%\n (name === 'package' && Unicode(0x1f4e6)) ||\n // ***\n // U+1F381\n // https://emojipedia.org/wrapped-gift/\n // https://www.unicompat.com/1F381 => 94.1%\n (name === 'gift' && Unicode(0x1f381)) ||\n // ***\n // U+1F496\n // https://emojipedia.org/sparkling-heart/\n // https://www.unicompat.com/1F496 => 94.1%\n (name === 'sparkling-heart' && Unicode(0x1f496)) ||\n // ***\n // U+2B55\n // https://emojipedia.org/hollow-red-circle/\n // https://www.unicompat.com/2B55 => 94.1%\n (name === 'red-circle' && Unicode(0x2b55)) ||\n // ***\n (name === 'engine' && Img(iconEngine)) ||\n // ***\n // https://www.typescriptlang.org/branding/\n (name === 'typescript' && Img(iconTypescript)) ||\n // ***\n // U+FE0F\n // https://emojipedia.org/shield/\n // https://www.unicompat.com/FE0F => 46.5%\n // https://icon-sets.iconify.design/noto/shield/\n (name === 'shield' && Img(iconShield)) ||\n // ***\n // Custom\n (name === 'road-fork' && Img(iconRoadFork, '1.4em')) ||\n // ***\n // U+270D\n // https://emojipedia.org/writing-hand/\n // https://www.unicompat.com/270D => 93.8%\n (name === 'writing-hang' && Unicode(0x270d)) ||\n // ***\n // U+1F4AB\n // https://emojipedia.org/dizzy/\n // https://www.unicompat.com/1F4AB => 94.1%\n (name === 'dizzy' && Unicode(0x1f4ab)) ||\n // ***\n // U+1F9BE\n // https://iconify.design/icon-sets/noto/mechanical-arm.html\n // https://emojipedia.org/mechanical-arm/\n // https://www.unicompat.com/1f9be => 65.5%\n (name === 'mechanical-arm' && Img(iconMechanicalArm)) ||\n // ***\n // U+1F680\n // https://www.unicompat.com/1F680 => 94.1\n (name === 'rocket' && Unicode(0x1f680)) ||\n // ***\n // U+1F527\n // https://emojipedia.org/wrench/\n // https://www.unicompat.com/1F527 => 94.1%\n (name === 'wrench' && Unicode(0x1f527)) ||\n // ***\n // U+1F9ED\n // https://iconify.design/icon-sets/noto/compass.html\n // https://www.unicompat.com/1F9ED => 67.1%\n (name === 'compass' && Img(iconCompass, '1.4em')) ||\n // ***\n // U+1F331\n // https://www.unicompat.com/1F331 => 94.1%\n (name === 'seedling' && Unicode(0x1f331)) ||\n // ***\n // U+1F4DA\n // https://www.unicompat.com/1F4DA => 94.1%\n (name === 'books' && Unicode(0x1f4da)) ||\n // ***\n // U+1F50C\n // https://www.unicompat.com/1F50C => 94.1%\n (name === 'plug' && Unicode(0x1f50c)) ||\n // ***\n // U+1F30D\n // https://www.unicompat.com/1F30D => 88.8%\n (name === 'earth' && Unicode(0x1f30d)) ||\n // ***\n // U+2699\n // https://www.unicompat.com/2699 => 94.1%\n (name === 'gear' && Unicode(0x2699)) ||\n // ***\n // U+2764\n // https://emojipedia.org/red-heart/\n // https://www.unicompat.com/2764 => 94.4%\n // https://www.unicompat.com/2764-FE0F => 92.4%\n (name === 'red-heart' && Unicode(0x2764, { fontFamily: 'emoji' })) ||\n // U+26A1\n // https://www.unicompat.com/26A1 => 94.1%\n (name === 'high-voltage' && Unicode(0x26a1)) ||\n // U+2728\n // https://emojipedia.org/sparkles/\n // https://www.unicompat.com/2728 => 94.1%\n (name === 'sparkles' && Unicode(0x2728)) ||\n // ***\n // U+1F48E\n // https://emojipedia.org/gem-stone/\n // https://www.unicompat.com/1F48E => 94.1%\n (name === 'gem-stone' && Unicode(0x1f48e)) ||\n // ***\n // 0x1F3C6\n // https://emojipedia.org/trophy/\n // https://www.unicompat.com/1F3C6 => 94.1%\n (name === 'trophy' && Unicode(0x1f3c6)) ||\n false\n /* ======= Unused ========\n // ***\n // U+1FAA8\n // https://emojipedia.org/rock/\n // https://www.unicompat.com/1faa8 => 20.7%\n //\n // ***\n // U+26F0\n // https://emojipedia.org/mountain/\n // https://iconify.design/icon-sets/noto/mountain.html\n // https://www.unicompat.com/26F0 => 89.3%\n (name === 'mountain' && Img(iconMountain)) ||\n //\n // ***\n // U+2194\n // https://emojipedia.org/left-right-arrow/\n // https://www.unicompat.com/2194 => 95.0%\n // Couldn't manage to show colored version\n (name === 'left-right-arrow' && Unicode(0x2194)) ||\n (name === 'left-right-arrow' && Unicode(0x2194, { fontFamily: 'reset' })) ||\n (name === 'left-right-arrow' && Unicode(0xFE0F)) ||\n (name === 'left-right-arrow' && Unicode(0xFE0F, { fontFamily: 'reset' })) ||\n ======================== */\n\n assert(emoji, { name })\n\n return emoji\n\n function Unicode(codePoint: number, styleAddendum?: React.CSSProperties) {\n const text = String.fromCodePoint(codePoint)\n if (style || styleAddendum) {\n return React.createElement('span', { style: { ...style, ...styleAddendum } }, text)\n } else {\n return React.createElement(React.Fragment, null, text)\n }\n }\n\n function Img(imgSrc: string, width: string = '1.15em') {\n const props = {\n src: imgSrc,\n style: {\n verticalAlign: 'text-top',\n fontSize: '1em',\n width,\n ...style\n }\n }\n return React.createElement('img', props)\n }\n}\n","import { assert, determineSectionUrlHash } from '../src/utils/server'\n\nexport { markdownHeadingsVitePlugin }\nexport type { MarkdownHeading }\n\ntype MarkdownHeading = {\n title: string\n id: string\n headingLevel: number\n titleAddendum?: string\n}\n\nfunction markdownHeadingsVitePlugin() {\n return {\n name: 'mdx-headings',\n enforce: 'pre',\n transform: async (code: string, id: string) => {\n if (!id.includes('.page.') || !id.endsWith('.mdx')) {\n return\n }\n const codeNew = transform(code)\n return codeNew\n }\n }\n}\n\nfunction transform(code: string) {\n const headings: MarkdownHeading[] = []\n let isCodeBlock = false\n let codeNew = code\n .split('\\n')\n .map((line) => {\n // Skip code blocks, e.g.\n // ~~~md\n // # Markdown Example\n // Bla\n // ~~~\n if (line.startsWith('~~~') || line.startsWith('```')) {\n isCodeBlock = !isCodeBlock\n return line\n }\n if (isCodeBlock) {\n return line\n }\n\n if (line.startsWith('#')) {\n const { id, headingLevel, title, headingHtml } = parseMarkdownHeading(line)\n headings.push({ id, headingLevel, title })\n return headingHtml\n }\n if (line.startsWith('<h')) {\n assert(false, { line })\n }\n\n return line\n })\n .join('\\n')\n const headingsExportCode = `export const headings = [${headings\n .map((heading) => JSON.stringify(heading))\n .join(', ')}];`\n codeNew += `\\n\\n${headingsExportCode}\\n`\n return codeNew\n}\n\nfunction parseMarkdownHeading(line: string): MarkdownHeading & { headingHtml: string } {\n const [lineBegin, ...lineWords] = line.split(' ')\n assert(lineBegin.split('#').join('') === '', { line, lineWords })\n const headingLevel = lineBegin.length\n\n const titleMdx = lineWords.join(' ')\n assert(!titleMdx.startsWith(' '), { line, lineWords })\n assert(titleMdx, { line, lineWords })\n\n const id = determineSectionUrlHash(titleMdx)\n const title = titleMdx\n\n const headingHtml = `<h${headingLevel} id=\"${id}\">${parseTitle(title)}</h${headingLevel}>`\n\n const heading = { headingLevel, title, id, headingHtml }\n return heading\n}\n\nfunction parseTitle(titleMarkdown: string): string {\n type Part = { nodeType: 'text' | 'code'; content: string }\n const parts: Part[] = []\n let current: Part | undefined\n titleMarkdown.split('').forEach((letter) => {\n if (letter === '`') {\n if (current?.nodeType === 'code') {\n // </code>\n parts.push(current)\n current = undefined\n } else {\n // <code>\n if (current) {\n parts.push(current)\n }\n current = { nodeType: 'code', content: '' }\n }\n } else {\n if (!current) {\n current = { nodeType: 'text', content: '' }\n }\n current.content += letter\n }\n })\n if (current) {\n parts.push(current)\n }\n\n const titleHtml = parts\n .map((part) => {\n if (part.nodeType === 'code') {\n return `<code>${serializeText(part.content)}</code>`\n } else {\n assert(part.nodeType === 'text', { parts })\n return serializeText(part.content)\n }\n })\n .join('')\n\n return titleHtml\n\n function serializeText(text: string) {\n const textEscaped = text.split(\"'\").join(\"\\\\'\")\n return `{'${textEscaped}'}`\n }\n}\n"],"mappings":"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","names":[]}
|
package/src/MobileHeader.tsx
DELETED
|
@@ -1,68 +0,0 @@
|
|
|
1
|
-
import React from 'react'
|
|
2
|
-
import { usePageContext } from './renderer/usePageContext'
|
|
3
|
-
|
|
4
|
-
export { MobileHeader }
|
|
5
|
-
|
|
6
|
-
function MobileHeader() {
|
|
7
|
-
const pageContext = usePageContext()
|
|
8
|
-
return (
|
|
9
|
-
<div
|
|
10
|
-
id="mobile-header"
|
|
11
|
-
style={{
|
|
12
|
-
height: 'var(--mobile-header-height)',
|
|
13
|
-
width: '100vw',
|
|
14
|
-
position: 'relative'
|
|
15
|
-
}}
|
|
16
|
-
>
|
|
17
|
-
<div
|
|
18
|
-
style={{
|
|
19
|
-
position: 'fixed',
|
|
20
|
-
display: 'flex',
|
|
21
|
-
alignItems: 'center',
|
|
22
|
-
background: 'white',
|
|
23
|
-
zIndex: 99,
|
|
24
|
-
top: 0,
|
|
25
|
-
left: 0,
|
|
26
|
-
height: 'var(--mobile-header-height)',
|
|
27
|
-
width: '100%',
|
|
28
|
-
borderBottom: '1px solid #ddd'
|
|
29
|
-
}}
|
|
30
|
-
>
|
|
31
|
-
<MenuToggle />
|
|
32
|
-
<a
|
|
33
|
-
href="/"
|
|
34
|
-
style={{
|
|
35
|
-
color: 'inherit',
|
|
36
|
-
display: 'flex',
|
|
37
|
-
alignItems: 'center',
|
|
38
|
-
justifyContent: 'left',
|
|
39
|
-
textDecoration: 'none'
|
|
40
|
-
}}
|
|
41
|
-
>
|
|
42
|
-
{pageContext.config.navHeaderMobile}
|
|
43
|
-
</a>
|
|
44
|
-
<div id="docsearch-mobile" />
|
|
45
|
-
</div>
|
|
46
|
-
</div>
|
|
47
|
-
)
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
function MenuToggle() {
|
|
51
|
-
return (
|
|
52
|
-
<div style={{ padding: 20, lineHeight: 0 }} id="menu-toggle">
|
|
53
|
-
<svg
|
|
54
|
-
style={{ width: 20 }}
|
|
55
|
-
className="icon"
|
|
56
|
-
xmlns="http://www.w3.org/2000/svg"
|
|
57
|
-
aria-hidden="true"
|
|
58
|
-
role="img"
|
|
59
|
-
viewBox="0 0 448 512"
|
|
60
|
-
>
|
|
61
|
-
<path
|
|
62
|
-
fill="currentColor"
|
|
63
|
-
d="M436 124H12c-6.627 0-12-5.373-12-12V80c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12zm0 160H12c-6.627 0-12-5.373-12-12v-32c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12zm0 160H12c-6.627 0-12-5.373-12-12v-32c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12z"
|
|
64
|
-
></path>
|
|
65
|
-
</svg>
|
|
66
|
-
</div>
|
|
67
|
-
)
|
|
68
|
-
}
|
package/src/PageLayout.css
DELETED
|
@@ -1,41 +0,0 @@
|
|
|
1
|
-
.doc-page #page-container {
|
|
2
|
-
padding-bottom: 100px;
|
|
3
|
-
}
|
|
4
|
-
|
|
5
|
-
#page-layout {
|
|
6
|
-
display: flex;
|
|
7
|
-
justify-content: center;
|
|
8
|
-
}
|
|
9
|
-
#page-layout > #navigation-wrapper,
|
|
10
|
-
#page-layout > #page-wrapper {
|
|
11
|
-
flex-grow: 1;
|
|
12
|
-
}
|
|
13
|
-
/* Avoid overflow, see https://stackoverflow.com/questions/36230944/prevent-flex-items-from-overflowing-a-container/66689926#66689926 */
|
|
14
|
-
#page-layout > #page-wrapper {
|
|
15
|
-
min-width: 0;
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
.doc-page #page-wrapper {
|
|
19
|
-
--main-view-max-width: 800px;
|
|
20
|
-
}
|
|
21
|
-
.landing-page #page-wrapper {
|
|
22
|
-
--main-view-max-width: 1010px;
|
|
23
|
-
}
|
|
24
|
-
#page-wrapper {
|
|
25
|
-
max-width: calc(var(--main-view-max-width) + 80px);
|
|
26
|
-
}
|
|
27
|
-
#page-content {
|
|
28
|
-
box-sizing: content-box;
|
|
29
|
-
max-width: var(--main-view-max-width);
|
|
30
|
-
padding: 20px var(--main-view-padding);
|
|
31
|
-
margin: auto;
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
#page-content {
|
|
35
|
-
--main-view-padding: 20px;
|
|
36
|
-
}
|
|
37
|
-
@media screen and (max-width: 1139px) {
|
|
38
|
-
#page-content {
|
|
39
|
-
--main-view-padding: 10px;
|
|
40
|
-
}
|
|
41
|
-
}
|
package/src/PageLayout.tsx
DELETED
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
import React from 'react'
|
|
2
|
-
import { Navigation, NavigationMask } from './navigation/Navigation'
|
|
3
|
-
import type { PageContextResolved } from './config/resolvePageContext'
|
|
4
|
-
import { MobileHeader } from './MobileHeader'
|
|
5
|
-
import { EditPageNote } from './components/EditPageNote'
|
|
6
|
-
import { PageContextProvider } from './renderer/usePageContext'
|
|
7
|
-
import './PageLayout.css'
|
|
8
|
-
import { NavigationFullscreenButton } from './navigation/navigation-fullscreen/NavigationFullscreenButton'
|
|
9
|
-
|
|
10
|
-
export { PageLayout }
|
|
11
|
-
|
|
12
|
-
function PageLayout({ pageContext, children }: { pageContext: PageContextResolved; children: JSX.Element }) {
|
|
13
|
-
const { isLandingPage, pageTitle } = pageContext
|
|
14
|
-
return (
|
|
15
|
-
<React.StrictMode>
|
|
16
|
-
<PageContextProvider pageContext={pageContext}>
|
|
17
|
-
<div id="page-layout" className={isLandingPage ? 'landing-page' : 'doc-page'}>
|
|
18
|
-
<div id="navigation-wrapper">
|
|
19
|
-
<Navigation pageContext={pageContext} />
|
|
20
|
-
</div>
|
|
21
|
-
<NavigationFullscreenButton />
|
|
22
|
-
<div id="page-wrapper">
|
|
23
|
-
<div id="page-container">
|
|
24
|
-
<MobileHeader />
|
|
25
|
-
<div id="page-content">
|
|
26
|
-
{pageTitle && <h1>{pageTitle}</h1>}
|
|
27
|
-
{children}
|
|
28
|
-
{!isLandingPage && <EditPageNote pageContext={pageContext} />}
|
|
29
|
-
</div>
|
|
30
|
-
</div>
|
|
31
|
-
<NavigationMask />
|
|
32
|
-
</div>
|
|
33
|
-
</div>
|
|
34
|
-
</PageContextProvider>
|
|
35
|
-
</React.StrictMode>
|
|
36
|
-
)
|
|
37
|
-
}
|
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
#docsearch-desktop {
|
|
2
|
-
max-width: 110px !important;
|
|
3
|
-
}
|
|
4
|
-
#docsearch-desktop .DocSearch-Button-Placeholder {
|
|
5
|
-
display: none;
|
|
6
|
-
padding: 0 !important;
|
|
7
|
-
}
|
|
8
|
-
#docsearch-desktop .DocSearch-Search-Icon {
|
|
9
|
-
margin-right: 6px !important;
|
|
10
|
-
}
|
|
11
|
-
#docsearch-desktop .DocSearch-Button {
|
|
12
|
-
margin-right: 3px !important;
|
|
13
|
-
margin-left: 1px !important;
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
#docsearch-mobile {
|
|
17
|
-
margin-left: auto !important;
|
|
18
|
-
padding-right: 20px !important;
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
#docsearch-mobile .DocSearch-Button {
|
|
22
|
-
margin-left: 0px !important;
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
@media screen and (max-width: 339px) {
|
|
26
|
-
#docsearch-mobile {
|
|
27
|
-
padding-right: 6px !important;
|
|
28
|
-
}
|
|
29
|
-
}
|
package/src/algolia/DocSearch.ts
DELETED
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
import { escapeInject } from 'vite-plugin-ssr'
|
|
2
|
-
import { PageContextResolved } from '../config/resolvePageContext'
|
|
3
|
-
|
|
4
|
-
export { getDocSearchCSS }
|
|
5
|
-
export { getDocSearchJS }
|
|
6
|
-
|
|
7
|
-
function getDocSearchCSS(pageContext: PageContextResolved) {
|
|
8
|
-
const docSearchCSS = !pageContext.meta.algolia
|
|
9
|
-
? ''
|
|
10
|
-
: escapeInject`
|
|
11
|
-
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@docsearch/css@alpha" />
|
|
12
|
-
`
|
|
13
|
-
return docSearchCSS
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
function getDocSearchJS(pageContext: PageContextResolved) {
|
|
17
|
-
const docSearchJS = !pageContext.meta.algolia
|
|
18
|
-
? ''
|
|
19
|
-
: escapeInject`
|
|
20
|
-
<script type="text/javascript" src="https://cdn.jsdelivr.net/npm/@docsearch/js@alpha"></script>
|
|
21
|
-
<script type="text/javascript">
|
|
22
|
-
docsearch({
|
|
23
|
-
appId: '${pageContext.meta.algolia.appId}',
|
|
24
|
-
apiKey: '${pageContext.meta.algolia.apiKey}',
|
|
25
|
-
indexName: '${pageContext.meta.algolia.indexName}',
|
|
26
|
-
container: '#docsearch-desktop',
|
|
27
|
-
})
|
|
28
|
-
docsearch({
|
|
29
|
-
appId: '${pageContext.meta.algolia.appId}',
|
|
30
|
-
apiKey: '${pageContext.meta.algolia.apiKey}',
|
|
31
|
-
indexName: '${pageContext.meta.algolia.indexName}',
|
|
32
|
-
container: '#docsearch-mobile',
|
|
33
|
-
})
|
|
34
|
-
</script>
|
|
35
|
-
`
|
|
36
|
-
return docSearchJS
|
|
37
|
-
}
|
package/src/autoScrollNav.ts
DELETED
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
import { assert } from './utils/client'
|
|
2
|
-
|
|
3
|
-
autoScrollNav()
|
|
4
|
-
|
|
5
|
-
function autoScrollNav() {
|
|
6
|
-
const navigationEl = document.getElementById('navigation-content')
|
|
7
|
-
assert(navigationEl)
|
|
8
|
-
const href = window.location.pathname
|
|
9
|
-
const navLinks: HTMLElement[] = Array.from(navigationEl.querySelectorAll(`a[href="${href}"]`))
|
|
10
|
-
assert(navLinks.length <= 1, { navLinks, href })
|
|
11
|
-
const navLink = navLinks[0]
|
|
12
|
-
if (!navLink) return
|
|
13
|
-
navLink.scrollIntoView({
|
|
14
|
-
/*
|
|
15
|
-
behavior: 'smooth',
|
|
16
|
-
/*/
|
|
17
|
-
behavior: 'auto',
|
|
18
|
-
//*/
|
|
19
|
-
block: 'center',
|
|
20
|
-
inline: 'center'
|
|
21
|
-
})
|
|
22
|
-
}
|
package/src/cli/devServer.ts
DELETED
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
import express from 'express'
|
|
2
|
-
import * as vite from 'vite'
|
|
3
|
-
import { renderPage } from 'vite-plugin-ssr'
|
|
4
|
-
import config from '../vite.config'
|
|
5
|
-
const viteVersion = (vite as { version?: string }).version || '2.?.?'
|
|
6
|
-
|
|
7
|
-
startServer()
|
|
8
|
-
|
|
9
|
-
async function startServer() {
|
|
10
|
-
const app = express()
|
|
11
|
-
|
|
12
|
-
const viteDevServer = await vite.createServer({
|
|
13
|
-
...config,
|
|
14
|
-
server: { middlewareMode: viteVersion.startsWith('2') ? 'ssr' : true }
|
|
15
|
-
})
|
|
16
|
-
app.use(viteDevServer.middlewares)
|
|
17
|
-
|
|
18
|
-
app.get('*', async (req, res, next) => {
|
|
19
|
-
const pageContextInit = {
|
|
20
|
-
urlOriginal: req.originalUrl
|
|
21
|
-
}
|
|
22
|
-
const pageContext = await renderPage(pageContextInit)
|
|
23
|
-
if (!pageContext.httpResponse) return next()
|
|
24
|
-
const { body, statusCode, contentType } = pageContext.httpResponse
|
|
25
|
-
res.status(statusCode).type(contentType).send(body)
|
|
26
|
-
})
|
|
27
|
-
|
|
28
|
-
const port = 3000
|
|
29
|
-
app.listen(port)
|
|
30
|
-
console.log(`Server running at http://localhost:${port}`)
|
|
31
|
-
}
|
package/src/cli/index.ts
DELETED
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
import { build, preview } from 'vite'
|
|
2
|
-
import config from '../vite.config'
|
|
3
|
-
import { prerender } from 'vite-plugin-ssr/prerender'
|
|
4
|
-
const args = process.argv.filter(Boolean).slice(2)
|
|
5
|
-
const isDev = args.includes('dev')
|
|
6
|
-
const isPreview = args.includes('preview')
|
|
7
|
-
const isBuild = args.includes('build')
|
|
8
|
-
Error.stackTraceLimit = Infinity
|
|
9
|
-
|
|
10
|
-
cli()
|
|
11
|
-
|
|
12
|
-
async function cli() {
|
|
13
|
-
if (isDev) {
|
|
14
|
-
await import('./devServer')
|
|
15
|
-
} else if (isBuild) {
|
|
16
|
-
await build(config)
|
|
17
|
-
await build({ ...config, build: { ssr: true } })
|
|
18
|
-
await prerender({ viteConfig: config })
|
|
19
|
-
} else if (isPreview) {
|
|
20
|
-
const server = await preview({ ...config, preview: { host: true } })
|
|
21
|
-
server.printUrls()
|
|
22
|
-
} else {
|
|
23
|
-
throw new Error(
|
|
24
|
-
`DocPress: unknown command \`$ docpress ${args.join(
|
|
25
|
-
' '
|
|
26
|
-
)}\`. Known commands: \`$ docpress dev\` and \`$ docpress preview\`.`
|
|
27
|
-
)
|
|
28
|
-
}
|
|
29
|
-
}
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
export { CodeBlock }
|
|
2
|
-
|
|
3
|
-
import React from 'react'
|
|
4
|
-
import { assert, objectAssign } from '../utils/server'
|
|
5
|
-
|
|
6
|
-
function CodeBlock({ children, lineBreak }: { children: any; lineBreak?: true }) {
|
|
7
|
-
assert(lineBreak, '`lineBreak: true` is currently the only use case for <CodeBlock>')
|
|
8
|
-
const style = {}
|
|
9
|
-
if (lineBreak) {
|
|
10
|
-
objectAssign(style, {
|
|
11
|
-
wordWrap: 'break-word',
|
|
12
|
-
wordBreak: 'break-all',
|
|
13
|
-
whiteSpace: 'initial',
|
|
14
|
-
paddingRight: '16px !important'
|
|
15
|
-
})
|
|
16
|
-
}
|
|
17
|
-
return (
|
|
18
|
-
<pre>
|
|
19
|
-
<code style={style}>{children}</code>
|
|
20
|
-
</pre>
|
|
21
|
-
)
|
|
22
|
-
}
|
|
@@ -1,108 +0,0 @@
|
|
|
1
|
-
import React from 'react'
|
|
2
|
-
import { getHeadings, parseTitle, Heading, HeadingWithoutLink } from '../headings'
|
|
3
|
-
import { PageContextResolved } from '../config/resolvePageContext'
|
|
4
|
-
import { usePageContext } from '../renderer/usePageContext'
|
|
5
|
-
import { assert, assertUsage, determineSectionTitle, determineSectionUrlHash } from '../utils/server'
|
|
6
|
-
|
|
7
|
-
export { DocLink }
|
|
8
|
-
|
|
9
|
-
function DocLink({
|
|
10
|
-
href,
|
|
11
|
-
text,
|
|
12
|
-
noBreadcrumb,
|
|
13
|
-
doNotInferSectionTitle
|
|
14
|
-
}: {
|
|
15
|
-
href: string
|
|
16
|
-
text?: string | JSX.Element
|
|
17
|
-
noBreadcrumb?: true
|
|
18
|
-
doNotInferSectionTitle?: true
|
|
19
|
-
}) {
|
|
20
|
-
const pageContext = usePageContext()
|
|
21
|
-
return <a href={href}>{text || getTitle({ href, noBreadcrumb, pageContext, doNotInferSectionTitle })}</a>
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
function getTitle({
|
|
25
|
-
href,
|
|
26
|
-
noBreadcrumb,
|
|
27
|
-
pageContext,
|
|
28
|
-
doNotInferSectionTitle
|
|
29
|
-
}: {
|
|
30
|
-
href: string
|
|
31
|
-
noBreadcrumb: true | undefined
|
|
32
|
-
pageContext: PageContextResolved
|
|
33
|
-
doNotInferSectionTitle: true | undefined
|
|
34
|
-
}): string | JSX.Element {
|
|
35
|
-
let urlHash: string | null = null
|
|
36
|
-
let hrefWithoutHash: string = href
|
|
37
|
-
if (href.includes('#')) {
|
|
38
|
-
;[hrefWithoutHash, urlHash] = href.split('#')
|
|
39
|
-
}
|
|
40
|
-
const heading = findHeading(hrefWithoutHash, pageContext)
|
|
41
|
-
|
|
42
|
-
const breadcrumbs: (string | JSX.Element)[] = []
|
|
43
|
-
|
|
44
|
-
if ('parentHeadings' in heading) {
|
|
45
|
-
breadcrumbs.push(
|
|
46
|
-
...heading.parentHeadings
|
|
47
|
-
.slice()
|
|
48
|
-
.reverse()
|
|
49
|
-
.map(({ title }) => title)
|
|
50
|
-
)
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
breadcrumbs.push(heading.title)
|
|
54
|
-
|
|
55
|
-
if (urlHash) {
|
|
56
|
-
let sectionTitle: string | JSX.Element | undefined = undefined
|
|
57
|
-
if ('sectionTitles' in heading && heading.sectionTitles) {
|
|
58
|
-
heading.sectionTitles.forEach((title) => {
|
|
59
|
-
if (determineSectionUrlHash(title) === urlHash) {
|
|
60
|
-
sectionTitle = parseTitle(title)
|
|
61
|
-
}
|
|
62
|
-
})
|
|
63
|
-
}
|
|
64
|
-
if (!sectionTitle) {
|
|
65
|
-
assertUsage(
|
|
66
|
-
!doNotInferSectionTitle,
|
|
67
|
-
`Page section title not found for <Link href="\`${href}\`" doNotInferSectionTitle={true} />.`
|
|
68
|
-
)
|
|
69
|
-
sectionTitle = determineSectionTitle(href, pageContext.config.titleNormalCase)
|
|
70
|
-
}
|
|
71
|
-
breadcrumbs.push(sectionTitle)
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
{
|
|
75
|
-
const linkIsOnSamePage = heading.url === pageContext.urlPathname
|
|
76
|
-
if (noBreadcrumb || linkIsOnSamePage) {
|
|
77
|
-
return breadcrumbs[breadcrumbs.length - 1]
|
|
78
|
-
}
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
return (
|
|
82
|
-
<>
|
|
83
|
-
{breadcrumbs.map((title, i) => {
|
|
84
|
-
const seperator = i === 0 ? <></> : ' > '
|
|
85
|
-
return (
|
|
86
|
-
<React.Fragment key={i}>
|
|
87
|
-
{seperator}
|
|
88
|
-
{title}
|
|
89
|
-
</React.Fragment>
|
|
90
|
-
)
|
|
91
|
-
})}
|
|
92
|
-
</>
|
|
93
|
-
)
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
function findHeading(href: string, pageContext: PageContextResolved): Heading | HeadingWithoutLink {
|
|
97
|
-
assert(href.startsWith('/'), `\`href==='${href}'\` but should start with \`/\`.`)
|
|
98
|
-
const { headings, headingsWithoutLink } = getHeadings(pageContext.config)
|
|
99
|
-
{
|
|
100
|
-
const heading = headingsWithoutLink.find(({ url }) => href === url)
|
|
101
|
-
if (heading) {
|
|
102
|
-
return heading
|
|
103
|
-
}
|
|
104
|
-
}
|
|
105
|
-
const heading = headings.find(({ url }) => href === url)
|
|
106
|
-
assert(heading, `Could not find page \`${href}\`. Does it exist?`)
|
|
107
|
-
return heading
|
|
108
|
-
}
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
import React from 'react'
|
|
2
|
-
import { RepoLink } from './RepoLink'
|
|
3
|
-
import { Emoji } from '../utils/server'
|
|
4
|
-
|
|
5
|
-
export { EditPageNote }
|
|
6
|
-
|
|
7
|
-
function EditPageNote({ pageContext }: { pageContext: { urlPathname: string } }) {
|
|
8
|
-
const text = (
|
|
9
|
-
<>
|
|
10
|
-
<Emoji name="writing-hang" /> Edit this page
|
|
11
|
-
</>
|
|
12
|
-
)
|
|
13
|
-
return (
|
|
14
|
-
<div style={{ marginTop: 50 }}>
|
|
15
|
-
<RepoLink path={'/docs/pages' + pageContext.urlPathname + '.page.server.mdx'} text={text} editMode={true} />
|
|
16
|
-
</div>
|
|
17
|
-
)
|
|
18
|
-
}
|