@unterberg/nivel 0.0.1 → 0.0.3
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/README.md +115 -0
- package/bin/nivel.mjs +3 -0
- package/dist/{chunk-73NPVCDQ.js → chunk-D7IAGT53.js} +56 -26
- package/dist/chunk-D7IAGT53.js.map +1 -0
- package/dist/chunk-DNCQR5NH.js +231 -0
- package/dist/chunk-DNCQR5NH.js.map +1 -0
- package/dist/{chunk-3JJ6TYWL.js → chunk-FARXFRHG.js} +120 -83
- package/dist/chunk-FARXFRHG.js.map +1 -0
- package/dist/chunk-K5ZYRA3G.js +198 -0
- package/dist/chunk-K5ZYRA3G.js.map +1 -0
- package/dist/{chunk-4WTEOEV2.js → chunk-L6ZVB6XH.js} +3 -3
- package/dist/chunk-L6ZVB6XH.js.map +1 -0
- package/dist/{chunk-FLO5CJZH.js → chunk-PYYPYIBD.js} +10 -3
- package/dist/chunk-PYYPYIBD.js.map +1 -0
- package/dist/{chunk-45CLUNJW.js → chunk-Q7JU4J6A.js} +69 -33
- package/dist/chunk-Q7JU4J6A.js.map +1 -0
- package/dist/chunk-UDOIFPCZ.js +1538 -0
- package/dist/chunk-UDOIFPCZ.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.js +78 -0
- package/dist/cli.js.map +1 -0
- package/dist/client.d.ts +4 -8
- package/dist/client.js +4 -4
- package/dist/index.d.ts +8 -12
- package/dist/index.js +4 -8
- package/dist/{code-blocks.d.ts → mdx/code-blocks.d.ts} +3 -1
- package/dist/{code-blocks.js → mdx/code-blocks.js} +5 -3
- package/dist/mdx.js +4 -4
- package/dist/mdx.js.map +1 -1
- package/dist/runtime/client.d.ts +1 -1
- package/dist/runtime/client.js +4 -4
- package/dist/runtime/node.d.ts +23 -0
- package/dist/runtime/node.js +24 -0
- package/dist/{types-mvLNHHrf.d.ts → types-j0kEkMA4.d.ts} +47 -24
- package/dist/{config.js → vike.js} +9 -8
- package/dist/vike.js.map +1 -0
- package/package.json +25 -16
- package/tailwind-sources.css +1 -0
- package/assets/nivel/decorators/pattern-light.png +0 -0
- package/assets/nivel/decorators/pattern.png +0 -0
- package/dist/chunk-3JJ6TYWL.js.map +0 -1
- package/dist/chunk-45CLUNJW.js.map +0 -1
- package/dist/chunk-4WTEOEV2.js.map +0 -1
- package/dist/chunk-62MBEYU7.js +0 -1091
- package/dist/chunk-62MBEYU7.js.map +0 -1
- package/dist/chunk-73NPVCDQ.js.map +0 -1
- package/dist/chunk-FLO5CJZH.js.map +0 -1
- package/dist/chunk-PHHK2BAF.js +0 -350
- package/dist/chunk-PHHK2BAF.js.map +0 -1
- package/dist/config.js.map +0 -1
- package/dist/runtime/index.d.ts +0 -15
- package/dist/runtime/index.js +0 -18
- /package/dist/{code-blocks.js.map → mdx/code-blocks.js.map} +0 -0
- /package/dist/runtime/{index.js.map → node.js.map} +0 -0
- /package/dist/{config.d.ts → vike.d.ts} +0 -0
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/runtime/AppLayout.tsx","../src/runtime/components/Navbar.tsx","../src/runtime/components/Brand.tsx","../src/runtime/components/LayoutComponent.tsx","../src/runtime/components/ThemeSwitch.tsx","../src/runtime/store/settings-store.ts","../src/runtime/store/settings-storage.ts","../src/runtime/theme.ts","../src/runtime/components/UserSettingsSync.tsx","../src/runtime/components/MetaHead/FaviconLinks.tsx","../src/runtime/components/MetaHead/FontLinks.tsx","../src/runtime/components/MetaHead/ThemeBootstrap.tsx","../src/runtime/components/MetaHead/index.tsx","../src/runtime/components/ProseContainer.tsx","../src/runtime/DocsPage.tsx","../src/runtime/components/DocsPagination.tsx","../src/runtime/components/Footer.tsx","../src/runtime/components/Sidebar.tsx","../src/runtime/components/TableOfContents.tsx","../src/runtime/getMdxRuntimeValue.tsx"],"sourcesContent":["import type { ReactNode } from 'react'\nimport { usePageContext } from 'vike-react/usePageContext'\nimport type { DocsConfig } from '../types.js'\nimport { Navbar } from './components/Navbar.js'\nimport { UserSettingsSync } from './components/UserSettingsSync.js'\nimport { getActiveSectionByPathname, resolveDocsConfig } from './resolveDocsConfig.js'\n\ninterface AppLayoutProps {\n children: ReactNode\n docsConfig: DocsConfig\n}\n\nexport const AppLayout = ({ children, docsConfig }: AppLayoutProps) => {\n const pageContext = usePageContext()\n const resolvedConfig = resolveDocsConfig(docsConfig)\n const activeSection = getActiveSectionByPathname(resolvedConfig, pageContext.urlPathname)\n\n return (\n <>\n <UserSettingsSync theme={resolvedConfig.theme} />\n <div className=\"min-h-screen bg-base-100 text-base-content\">\n <Navbar\n brand={resolvedConfig.brand}\n activeSectionId={activeSection?.id ?? null}\n navbarItems={resolvedConfig.navbarItems}\n theme={resolvedConfig.theme}\n />\n <div className=\"pt-16\">{children}</div>\n </div>\n </>\n )\n}\n","import { cmMerge } from '@classmatejs/react'\nimport { useEffect, useState } from 'react'\nimport { usePageContext } from 'vike-react/usePageContext'\nimport { renderInlineMarkdown } from '../../components/renderInlineMarkdown.js'\nimport { baseAssets, withSiteBaseUrl } from '../../nivelAssets.js'\nimport type { DocsThemeConfig, ResolvedDocsBrandConfig, ResolvedNavbarItem } from '../../types.js'\nimport { Brand } from './Brand.js'\nimport { LayoutComponent } from './LayoutComponent.js'\nimport { ThemeSwitch } from './ThemeSwitch.js'\n\ninterface NavbarProps {\n brand: ResolvedDocsBrandConfig\n activeSectionId: string | null\n navbarItems: ResolvedNavbarItem[]\n theme: Required<DocsThemeConfig>\n}\n\nexport const Navbar = ({ brand, activeSectionId, navbarItems, theme }: NavbarProps) => {\n const { urlPathname } = usePageContext()\n const isLandingPage = urlPathname === '/'\n const [isLandingPageScrolled, setIsLandingPageScrolled] = useState(false)\n\n useEffect(() => {\n if (!isLandingPage) {\n setIsLandingPageScrolled(false)\n return\n }\n\n const handleScroll = () => {\n setIsLandingPageScrolled(window.scrollY > 20)\n }\n\n handleScroll()\n window.addEventListener('scroll', handleScroll, { passive: true })\n\n return () => {\n window.removeEventListener('scroll', handleScroll)\n }\n }, [isLandingPage])\n\n const showChrome = !isLandingPage || isLandingPageScrolled\n\n return (\n <header\n className={cmMerge(\n 'fixed top-0 left-0 z-20 h-16 w-full border-b border-transparent',\n showChrome &&\n 'bg-linear-to-t from-base-100/30 via-base-100/60 to-base-100 backdrop-grayscale border-base-muted-light dark:shadow',\n )}\n >\n <div\n className=\"absolute inset-0 hidden dark:block\"\n // biome-ignore lint/nursery/noInlineStyles: decorator\n style={{ backgroundImage: `url(${baseAssets}decorators/pattern.png)` }}\n />\n <div\n className=\"absolute inset-0 dark:hidden\"\n // biome-ignore lint/nursery/noInlineStyles: decorator\n style={{ backgroundImage: `url(${baseAssets}decorators/pattern-light.png)` }}\n />\n <LayoutComponent className=\"h-full\">\n {isLandingPage ? (\n <div className=\"relative z-3 flex h-full items-center justify-between py-4\">\n <div className=\"flex flex-1 items-center gap-4\">\n <Brand brand={brand} />\n </div>\n <nav\n aria-label=\"Primary\"\n className=\"top-0 left-0 flex min-w-0 flex-1 items-center justify-center gap-4 overflow-x-auto\"\n >\n <ul className=\"flex items-center gap-2 font-semibold\">\n {navbarItems.map((item) => (\n <li key={item.id}>\n <a\n href={withSiteBaseUrl(item.href)}\n className={cmMerge(\n 'btn px-2 whitespace-nowrap',\n item.id === activeSectionId ? 'btn-primary btn-soft' : 'btn-ghost',\n )}\n >\n {renderInlineMarkdown(item.title)}\n </a>\n </li>\n ))}\n </ul>\n </nav>\n <div className=\"flex flex-1 items-center justify-end gap-2\">\n <ThemeSwitch theme={theme} />\n </div>\n </div>\n ) : (\n <div className=\"relative z-3 flex h-full items-center justify-between py-4\">\n <div className=\"flex w-80 flex-1 items-center justify-between gap-2 lg:flex-none\">\n <Brand brand={brand} />\n </div>\n <nav\n aria-label=\"Primary\"\n className=\"top-0 left-0 flex min-w-0 flex-1 items-center justify-center gap-4 overflow-x-auto lg:justify-start lg:pl-6 xl:pl-10\"\n >\n <ul className=\"flex items-center gap-2 font-semibold\">\n {navbarItems.map((item) => (\n <li key={item.id}>\n <a\n href={withSiteBaseUrl(item.href)}\n className={cmMerge(\n 'btn px-2 whitespace-nowrap',\n item.id === activeSectionId ? 'btn-primary btn-soft' : 'btn-ghost',\n )}\n >\n {renderInlineMarkdown(item.title)}\n </a>\n </li>\n ))}\n </ul>\n </nav>\n <div className=\"flex flex-1 items-center justify-end gap-2 lg:flex-none\">\n <ThemeSwitch theme={theme} />\n </div>\n </div>\n )}\n </LayoutComponent>\n </header>\n )\n}\n","import { cmMerge } from '@classmatejs/react'\nimport type { ResolvedDocsBrandConfig } from '../../types.js'\n\ninterface BrandProps {\n brand: ResolvedDocsBrandConfig\n noText?: boolean\n}\n\nexport const Brand = ({ brand, noText = false }: BrandProps) => {\n const defaultLogo = brand.logoLight ?? brand.logoDark\n\n return (\n <a href={brand.href} className=\"flex items-center gap-3 text-base-content no-underline\">\n {defaultLogo && (\n <span className=\"relative block h-7 w-7 shrink-0\">\n {brand.logoLight && (\n <img\n src={brand.logoLight}\n alt={brand.logoAlt}\n className={cmMerge('h-7 w-7 object-contain', brand.logoDark ? 'block dark:hidden' : 'block')}\n />\n )}\n {brand.logoDark && (\n <img\n src={brand.logoDark}\n alt={brand.logoAlt}\n className={cmMerge('h-7 w-7 object-contain', brand.logoLight ? 'hidden dark:block' : 'block')}\n />\n )}\n </span>\n )}\n {!noText && <span className=\"text-xl font-semibold tracking-tight\">{brand.text}</span>}\n </a>\n )\n}\n","import cm from '@classmatejs/react'\n\nconst LayoutSize = {\n xxs: 'xxs',\n xs: 'xs',\n sm: 'sm',\n md: 'md',\n lg: 'lg',\n xl: 'xl',\n full: 'full',\n} as const\ntype LayoutSize = (typeof LayoutSize)[keyof typeof LayoutSize]\n\nconst layoutComponentSizeMapping: { [key in LayoutSize]: string } = {\n xxs: 'max-w-[480px]',\n xs: 'max-w-[768px]',\n sm: 'max-w-5xl',\n md: 'max-w-6xl',\n lg: 'max-w-7xl',\n xl: 'max-w-[1440px]',\n full: 'max-w-full',\n} as const\n\ninterface LayoutComponentProps {\n $size?: LayoutSize\n $noGrow?: boolean\n}\n\nexport const LayoutComponent = cm.div.variants<LayoutComponentProps>({\n base: ({ $noGrow }) => `px-4 ${$noGrow ? '' : 'mx-auto w-full'} relative`,\n variants: {\n $size: layoutComponentSizeMapping,\n },\n defaultVariants: {\n $size: LayoutSize.xl,\n },\n})\n","import { Moon, Sun } from 'lucide-react'\nimport type { DocsThemeConfig } from '../../types.js'\nimport { useDocsUserSettingsStore } from '../store/settings-store.js'\nimport { resolveThemePreference } from '../theme.js'\n\nexport const ThemeSwitch = ({ theme }: { theme: Required<DocsThemeConfig> }) => {\n const themePreference = useDocsUserSettingsStore((state) => state.themePreference)\n const setThemePreference = useDocsUserSettingsStore((state) => state.setThemePreference)\n const effectiveThemePreference = resolveThemePreference(themePreference, theme)\n\n return (\n <button\n type=\"button\"\n aria-label=\"Toggle theme\"\n onClick={() => setThemePreference(effectiveThemePreference === 'light' ? 'dark' : 'light')}\n className=\"relative flex h-8 w-8 cursor-pointer items-center justify-center rounded-full border border-base-muted-light bg-base-200\"\n >\n <Sun className=\"h-4 w-4 dark:hidden\" />\n <Moon className=\"hidden h-4 w-4 dark:block\" />\n </button>\n )\n}\n","import { create } from 'zustand'\nimport { createJSONStorage, persist } from 'zustand/middleware'\nimport type { UniversalMdxCodeBlockChoiceStore } from '../../components/types.js'\nimport type { ThemePreference } from '../../types.js'\nimport { readLegacyCodeBlockChoice, USER_SETTINGS_STORAGE_KEY } from './settings-storage.js'\n\ntype DocsUserSettingsState = {\n codeBlockChoices: Record<string, string>\n themePreference: ThemePreference | null\n setCodeBlockChoice: (choiceGroupName: string, choice: string) => void\n setThemePreference: (themePreference: ThemePreference) => void\n}\n\nexport const useDocsUserSettingsStore = create<DocsUserSettingsState>()(\n persist(\n (set) => ({\n codeBlockChoices: {},\n themePreference: null,\n setCodeBlockChoice: (choiceGroupName, choice) =>\n set((state) => ({\n codeBlockChoices: {\n ...state.codeBlockChoices,\n [choiceGroupName]: choice,\n },\n })),\n setThemePreference: (themePreference) => set({ themePreference }),\n }),\n {\n name: USER_SETTINGS_STORAGE_KEY,\n storage: createJSONStorage(() => localStorage),\n partialize: ({ codeBlockChoices, themePreference }) => ({\n codeBlockChoices,\n themePreference,\n }),\n },\n ),\n)\n\nexport const docsCodeBlockChoiceStore: UniversalMdxCodeBlockChoiceStore = {\n subscribe: (listener) => useDocsUserSettingsStore.subscribe(listener),\n getChoice: (choiceGroupName) => useDocsUserSettingsStore.getState().codeBlockChoices[choiceGroupName] ?? null,\n setChoice: (choiceGroupName, choice) =>\n useDocsUserSettingsStore.getState().setCodeBlockChoice(choiceGroupName, choice),\n getLegacyChoice: readLegacyCodeBlockChoice,\n}\n","export const USER_SETTINGS_STORAGE_KEY = 'nivel-user-settings'\nconst LEGACY_CODE_BLOCK_CHOICE_STORAGE_KEY_PREFIX = 'vike-docpress:choice:'\n\nconst isRecord = (value: unknown): value is Record<string, unknown> => {\n return typeof value === 'object' && value !== null\n}\n\nconst readPersistedSettingsState = () => {\n if (typeof window === 'undefined') {\n return null\n }\n\n try {\n const rawValue = window.localStorage.getItem(USER_SETTINGS_STORAGE_KEY)\n if (!rawValue) {\n return null\n }\n\n const parsedValue = JSON.parse(rawValue) as unknown\n if (!isRecord(parsedValue)) {\n return null\n }\n\n const state = parsedValue.state\n return isRecord(state) ? state : null\n } catch {\n return null\n }\n}\n\nexport const readLegacyCodeBlockChoice = (choiceGroupName: string) => {\n if (typeof window === 'undefined') {\n return null\n }\n\n try {\n const value = window.localStorage.getItem(`${LEGACY_CODE_BLOCK_CHOICE_STORAGE_KEY_PREFIX}${choiceGroupName}`)\n return value || null\n } catch {\n return null\n }\n}\n","import type { DocsThemeConfig, ThemePreference } from '../types.js'\n\nexport const DEFAULT_THEME_PREFERENCE: ThemePreference = 'light'\nexport const DARK_THEME_MEDIA_QUERY = '(prefers-color-scheme: dark)'\n\nconst getDataTheme = (themePreference: ThemePreference, themeConfig: Required<DocsThemeConfig>) => {\n return themePreference === 'dark' ? themeConfig.dark : themeConfig.light\n}\n\nconst isThemePreference = (value: unknown): value is ThemePreference => {\n return value === 'light' || value === 'dark'\n}\n\nconst getSystemThemePreference = (fallbackThemePreference: ThemePreference): ThemePreference => {\n if (typeof window === 'undefined' || typeof window.matchMedia !== 'function') {\n return fallbackThemePreference\n }\n\n return window.matchMedia(DARK_THEME_MEDIA_QUERY).matches ? 'dark' : 'light'\n}\n\nexport const resolveThemePreference = (\n themePreference: ThemePreference | null | undefined,\n themeConfig: Required<DocsThemeConfig>,\n) => {\n if (isThemePreference(themePreference)) {\n return themePreference\n }\n\n return getSystemThemePreference(themeConfig.defaultPreference)\n}\n\nexport const applyThemePreference = (\n themePreference: ThemePreference | null | undefined,\n themeConfig: Required<DocsThemeConfig>,\n) => {\n if (typeof document === 'undefined') {\n return\n }\n\n document.documentElement.setAttribute(\n 'data-theme',\n getDataTheme(resolveThemePreference(themePreference, themeConfig), themeConfig),\n )\n}\n","import { useEffect } from 'react'\nimport type { DocsConfig } from '../../types.js'\nimport { useDocsUserSettingsStore } from '../store/settings-store.js'\nimport { applyThemePreference, resolveThemePreference } from '../theme.js'\n\nexport const UserSettingsSync = ({ theme }: { theme?: DocsConfig['theme'] }) => {\n const themePreference = useDocsUserSettingsStore((state) => state.themePreference)\n const lightTheme = theme?.light ?? 'consumer-light'\n const darkTheme = theme?.dark ?? 'consumer-dark'\n const defaultThemePreference = theme?.defaultPreference ?? 'light'\n const resolvedTheme = { light: lightTheme, dark: darkTheme, defaultPreference: defaultThemePreference }\n const effectiveThemePreference = resolveThemePreference(themePreference, resolvedTheme)\n\n useEffect(() => {\n applyThemePreference(effectiveThemePreference, resolvedTheme)\n }, [darkTheme, defaultThemePreference, effectiveThemePreference, lightTheme])\n\n return null\n}\n","import type { ResolvedDocsHeadConfig } from '../../../types.js'\n\nexport const FaviconLinks = ({ head }: { head: ResolvedDocsHeadConfig }) => {\n const { appleTouchIcon, faviconIco, faviconSvg } = head\n\n return (\n <>\n {appleTouchIcon && <link rel=\"apple-touch-icon\" href={appleTouchIcon} />}\n {faviconSvg && <link rel=\"icon\" type=\"image/svg+xml\" href={faviconSvg} />}\n {faviconIco && (\n <>\n <link rel=\"shortcut icon\" type=\"image/x-icon\" href={faviconIco} />\n <link rel=\"icon\" type=\"image/x-icon\" href={faviconIco} />\n </>\n )}\n </>\n )\n}\n","import type { ResolvedDocsHeadConfig } from '../../../types.js'\n\nexport const FontLinks = ({ head }: { head: ResolvedDocsHeadConfig }) => {\n const { fontStylesheetHref, fontPreloadHrefs } = head\n const effectivePreloadHrefs = fontPreloadHrefs ?? []\n\n return (\n <>\n {effectivePreloadHrefs.map((href) => (\n <link key={href} rel=\"preload\" href={href} as=\"font\" type=\"font/woff2\" crossOrigin=\"anonymous\" />\n ))}\n {fontStylesheetHref && <link rel=\"stylesheet\" href={fontStylesheetHref} />}\n </>\n )\n}\n","import type { DocsThemeConfig } from '../../../types.js'\nimport { USER_SETTINGS_STORAGE_KEY } from '../../store/settings-storage.js'\nimport { DARK_THEME_MEDIA_QUERY } from '../../theme.js'\n\nconst getThemeBootstrapScript = (theme: Required<DocsThemeConfig>) => {\n return `(() => {\n const storageKey = ${JSON.stringify(USER_SETTINGS_STORAGE_KEY)};\n const darkThemeMediaQuery = ${JSON.stringify(DARK_THEME_MEDIA_QUERY)};\n const defaultThemePreference = ${JSON.stringify(theme.defaultPreference)};\n const themes = {\n light: ${JSON.stringify(theme.light)},\n dark: ${JSON.stringify(theme.dark)}\n };\n\n try {\n const persistedValue = window.localStorage.getItem(storageKey);\n const parsedValue = persistedValue ? JSON.parse(persistedValue) : null;\n const storedThemePreference = parsedValue?.state?.themePreference;\n const themePreference =\n storedThemePreference === 'light' || storedThemePreference === 'dark'\n ? storedThemePreference\n : typeof window.matchMedia === 'function'\n ? window.matchMedia(darkThemeMediaQuery).matches\n ? 'dark'\n : 'light'\n : defaultThemePreference;\n\n document.documentElement.setAttribute('data-theme', themes[themePreference]);\n } catch {\n const themePreference =\n typeof window.matchMedia === 'function'\n ? window.matchMedia(darkThemeMediaQuery).matches\n ? 'dark'\n : 'light'\n : defaultThemePreference;\n\n document.documentElement.setAttribute('data-theme', themes[themePreference]);\n }\n})();`\n}\n\nexport const ThemeBootstrap = ({ theme }: { theme: Required<DocsThemeConfig> }) => {\n return (\n <script\n dangerouslySetInnerHTML={{\n __html: getThemeBootstrapScript(theme),\n }}\n />\n )\n}\n","import type { DocsConfig } from '../../../types.js'\nimport { resolveDocsConfig } from '../../resolveDocsConfig.js'\nimport { FaviconLinks } from './FaviconLinks.js'\nimport { FontLinks } from './FontLinks.js'\nimport { ThemeBootstrap } from './ThemeBootstrap.js'\n\nexport const MetaHead = ({ docsConfig }: { docsConfig: DocsConfig }) => {\n const resolvedConfig = resolveDocsConfig(docsConfig)\n\n return (\n <>\n <ThemeBootstrap theme={resolvedConfig.theme} />\n <FaviconLinks head={resolvedConfig.head} />\n <FontLinks head={resolvedConfig.head} />\n </>\n )\n}\n","import cm from '@classmatejs/react'\n\nexport const ProseContainer = cm.section`\n prose \n prose-neutral\n max-w-none\n dark:prose-invert\n prose-a:text-primary\n\n prose-pre:bg-base-200!\n\n prose-code:py-0!\n prose-code:px-1!\n\n prose-code:rounded!\n prose-code:dark:inset-shadow-2xs\n\n prose-code:bg-primary/5!\n prose-code:border-primary/15!\n\n prose-code:dark:bg-primary/10!\n prose-code:dark:border-primary/20!\n\n prose-p:leading-[200%]\n prose-li:leading-[200%]\n prose-table:my-8\n prose-table:w-full\n prose-table:text-sm\n prose-th:align-top\n prose-th:font-semibold\n prose-td:align-top\n [&_table_code]:whitespace-nowrap\n [&_thead]:bg-base-200/70\n\n prose-p:after:content-none\n prose-p:before:content-none\n prose-blockquote:not-italic\n prose-blockquote:bg-base-200\n prose-blockquote:py-2\n prose-li:my-1\n prose-figure:mb-0\n [&_figure_*]:mb-0\n [&_blockquote_p]:mt-0\n [&_blockquote_p]:mb-2\n [&_blockquote_ul]:pl-4\n [&_blockquote_ul]:mt-2\n [&_blockquote_li]:mt-2\n [&_blockquote_blockquote]:mt-2\n [&_blockquote_blockquote]:mb-0\n [&_blockquote_blockquote]:bg-base-300/40\n [&_blockquote_blockquote]:pt-2\n [&_blockquote_blockquote]:pb-1\n`\n","import type { ComponentType } from 'react'\nimport { useData } from 'vike-react/useData'\nimport { usePageContext } from 'vike-react/usePageContext'\nimport { renderInlineMarkdown } from '../components/renderInlineMarkdown.js'\nimport { UniversalMdxProvider } from '../components/UniversalMdxProvider.js'\nimport type { DocPageData, DocsConfig } from '../types.js'\nimport { LayoutComponent, ProseContainer } from './client.js'\nimport { DocsPagination } from './components/DocsPagination.js'\nimport { DocsFooter } from './components/Footer.js'\nimport { Sidebar } from './components/Sidebar.js'\nimport { TableOfContents } from './components/TableOfContents.js'\nimport { getMdxRuntimeValue } from './getMdxRuntimeValue.js'\nimport { resolveDocsConfig } from './resolveDocsConfig.js'\n\ninterface DocsPageProps {\n Content: ComponentType\n docsConfig: DocsConfig\n}\n\nexport const DocsPage = ({ Content, docsConfig }: DocsPageProps) => {\n const pageContext = usePageContext()\n const { activeSectionId, page, sidebarSections, headings, footer, previousPage, nextPage } = useData() as DocPageData\n const resolvedConfig = resolveDocsConfig(docsConfig)\n\n return (\n <UniversalMdxProvider\n value={getMdxRuntimeValue({\n docsConfig: docsConfig,\n currentPathname: pageContext.urlPathname,\n })}\n >\n <div className=\"absolute top-0 left-0 w-full h-[60svh] bg-radial-[at_65%_-85%] from-primary-muted-light to-65%\" />\n\n <LayoutComponent>\n <div className=\"lg:flex lg:gap-10 xl:gap-14\">\n <Sidebar sections={sidebarSections} activeSectionId={activeSectionId} currentHref={page.href} />\n\n <main className=\"mt-10 min-w-0 flex-1 basis-auto shrink\">\n <ProseContainer data-doc-content=\"\">\n <h1 className=\"scroll-mt-24\">{renderInlineMarkdown(page.title)}</h1>\n <Content />\n </ProseContainer>\n {footer.pagination ? <DocsPagination previousPage={previousPage} nextPage={nextPage} /> : null}\n <DocsFooter brand={resolvedConfig.brand} />\n </main>\n <TableOfContents headings={headings} partners={resolvedConfig.partners} />\n </div>\n </LayoutComponent>\n </UniversalMdxProvider>\n )\n}\n","import { cmMerge } from '@classmatejs/react'\nimport { ChevronLeft, ChevronRight } from 'lucide-react'\nimport { withSiteBaseUrl } from '../../nivelAssets.js'\nimport { renderInlineMarkdown } from '../../components/renderInlineMarkdown.js'\nimport type { DocPageData } from '../../types.js'\n\ninterface PaginationCardProps {\n item: NonNullable<DocPageData['previousPage']>\n direction: 'previous' | 'next'\n isOffset?: boolean\n}\n\nconst PaginationCard = ({ item, direction, isOffset }: PaginationCardProps) => {\n const isPrevious = direction === 'previous'\n\n return (\n <a\n href={withSiteBaseUrl(item.href)}\n className={cmMerge(\n 'group rounded-box border border-base-muted-light bg-base-100 p-5 no-underline hover:border-primary-muted-medium hover:bg-base-200',\n isPrevious ? 'text-left' : 'text-right',\n isOffset && 'sm:col-start-2',\n )}\n aria-label={`${isPrevious ? 'Previous' : 'Next'}: ${item.title}`}\n >\n <div className=\"flex flex-col justify-between gap-2\">\n <p className=\"text-lg font-semibold text-base-content\">{renderInlineMarkdown(item.title)}</p>\n <div\n className={cmMerge(\n 'flex items-center gap-1 text-base-muted group-hover:text-base-content',\n isPrevious ? 'justify-start' : 'justify-end',\n )}\n >\n {isPrevious && <ChevronLeft className=\"h-4 w-4\" />}\n <span>{isPrevious ? 'Previous' : 'Next'}</span>\n {!isPrevious && <ChevronRight className=\"h-4 w-4\" />}\n </div>\n </div>\n </a>\n )\n}\n\ninterface DocsPaginationProps {\n previousPage: DocPageData['previousPage']\n nextPage: DocPageData['nextPage']\n}\n\nexport const DocsPagination = ({ previousPage, nextPage }: DocsPaginationProps) => {\n if (!previousPage && !nextPage) {\n return null\n }\n\n return (\n <nav className=\"mb-10 mt-16\" aria-label=\"Previous Next\">\n <div className=\"grid gap-4 sm:grid-cols-2\">\n {previousPage && <PaginationCard item={previousPage} direction=\"previous\" />}\n {nextPage && <PaginationCard isOffset={!previousPage} item={nextPage} direction=\"next\" />}\n </div>\n </nav>\n )\n}\n","import { Bug, Pencil } from 'lucide-react'\nimport type { ResolvedDocsBrandConfig } from '../../types'\nimport { Brand } from './Brand'\n\ninterface DocsFooterProps {\n brand?: ResolvedDocsBrandConfig\n}\n\nexport const DocsFooter = ({ brand }: DocsFooterProps) => {\n return (\n <footer className=\"mb-8 mt-12 text-sm border-t border-base-muted-light pt-10\">\n <div className=\"mb-16 flex items-center gap-2\">\n <a href=\"edit\" className=\"btn btn-sm btn-primary btn-soft\">\n <Pencil className=\"w-3 h-3\" /> Edit this page\n </a>\n <a href=\"edit\" className=\"btn btn-sm btn-primary btn-soft\">\n <Bug className=\"w-3 h-3\" /> Report Issue\n </a>\n </div>\n <div className=\"flex justify-between items-center\">\n {/* Social Icons Here */}\n <div className=\"flex gap-2 items-center\">{brand && <Brand brand={brand} noText />}</div>\n </div>\n </footer>\n )\n}\n","import { cmMerge } from '@classmatejs/react'\nimport { useEffect } from 'react'\nimport { create } from 'zustand'\nimport { withSiteBaseUrl } from '../../nivelAssets.js'\nimport { renderInlineMarkdown } from '../../components/renderInlineMarkdown.js'\nimport type {\n ResolvedDocsSection,\n ResolvedSidebarGroup,\n ResolvedSidebarNode,\n ResolvedSidebarPage,\n} from '../../types.js'\n\ntype SidebarDisclosureState = {\n openNodes: Record<string, boolean>\n setNodeOpen: (nodeId: string, isOpen: boolean) => void\n}\n\nconst useSidebarDisclosureStore = create<SidebarDisclosureState>()((set) => ({\n openNodes: {},\n setNodeOpen: (nodeId, isOpen) =>\n set((state) => {\n if (state.openNodes[nodeId] === isOpen) {\n return state\n }\n\n return {\n openNodes: {\n ...state.openNodes,\n [nodeId]: isOpen,\n },\n }\n }),\n}))\n\nconst containsActiveHref = (items: ResolvedSidebarNode[], currentHref: string): boolean => {\n return items.some((item) => {\n if (item.kind === 'page') {\n return item.href === currentHref\n }\n\n if (item.kind === 'group') {\n return containsActiveHref(item.items, currentHref)\n }\n\n return false\n })\n}\n\nconst hasActiveItem = (items: ResolvedSidebarNode[], activeHref: string) => {\n return items.some((item) => {\n if (item.kind === 'group') {\n return containsActiveHref(item.items, activeHref)\n }\n\n return item.kind === 'page' && item.href === activeHref\n })\n}\n\nconst getGroupLandingPage = (group: ResolvedSidebarGroup) => {\n return (\n group.items.find((item): item is ResolvedSidebarPage => {\n if (item.kind !== 'page') {\n return false\n }\n\n return item.navTitle === group.title || item.title === group.title\n }) ?? null\n )\n}\n\nconst getVisibleGroupItems = (group: ResolvedSidebarGroup, landingPage: ResolvedSidebarPage | null) => {\n if (!landingPage) {\n return group.items\n }\n\n return group.items.filter((item) => item.id !== landingPage.id)\n}\n\nconst useAutoOpenDetails = (nodeId: string, isOpenByDefault: boolean, hasActiveDescendant: boolean) => {\n const storedOpen = useSidebarDisclosureStore((state) => state.openNodes[nodeId])\n const setNodeOpen = useSidebarDisclosureStore((state) => state.setNodeOpen)\n const isOpen = storedOpen === undefined ? isOpenByDefault || hasActiveDescendant : storedOpen || hasActiveDescendant\n\n useEffect(() => {\n if (hasActiveDescendant) {\n setNodeOpen(nodeId, true)\n return\n }\n\n if (storedOpen === undefined && isOpenByDefault) {\n setNodeOpen(nodeId, true)\n }\n }, [hasActiveDescendant, isOpenByDefault, nodeId, setNodeOpen, storedOpen])\n\n return {\n isOpen,\n setIsOpen: (nextOpen: boolean) => setNodeOpen(nodeId, nextOpen),\n }\n}\n\ninterface SidebarPageLinkProps {\n title: string\n href: string\n currentHref: string\n}\n\nconst SidebarPageLink = ({ title, href, currentHref }: SidebarPageLinkProps) => {\n return (\n <li>\n <a\n href={withSiteBaseUrl(href)}\n className={cmMerge(\n 'text-base-muted hover:text-base-content justify-start hover:bg-base-200',\n href === currentHref && 'text-primary! font-semibold bg-base-200',\n )}\n >\n {renderInlineMarkdown(title, { codeClassName: 'text-sm!' })}\n </a>\n </li>\n )\n}\n\nconst SidebarDivider = ({ title }: { title: string }) => {\n return (\n <li className=\"ml-3 mt-2 mb-2 border-b border-base-muted-light text-xs text-base-muted-medium pointer-events-none font-semibold\">\n <span className=\"-ml-3\">{renderInlineMarkdown(title, { codeClassName: 'text-sm!' })}</span>\n </li>\n )\n}\n\ninterface SidebarGroupTitleProps {\n title: string\n href?: string\n isActive: boolean\n allowNavigation?: boolean\n}\n\nconst SidebarGroupTitle = ({ title, href, isActive, allowNavigation = false }: SidebarGroupTitleProps) => {\n const content = (\n <span\n className={cmMerge(\n allowNavigation ? 'font-medium' : 'font-semibold',\n isActive && allowNavigation && 'text-primary!',\n )}\n >\n {renderInlineMarkdown(title, { codeClassName: 'text-sm!' })}\n </span>\n )\n\n if (allowNavigation && href) {\n return (\n <a\n href={withSiteBaseUrl(href)}\n onClick={(event) => {\n event.stopPropagation()\n }}\n className={cmMerge(\n 'flex items-center gap-2 text-base-muted hover:text-base-content no-underline',\n isActive && 'text-primary! font-semibold',\n )}\n >\n {content}\n </a>\n )\n }\n\n return <span className=\"flex items-center gap-2 text-base-content\">{content}</span>\n}\n\ninterface SidebarItemListProps {\n items: ResolvedSidebarNode[]\n currentHref: string\n}\n\nconst SidebarItemList = ({ items, currentHref }: SidebarItemListProps) => {\n return (\n <ul>\n {items.map((item) => {\n if (item.kind === 'divider') {\n return <SidebarDivider key={item.id} title={item.title} />\n }\n\n if (item.kind === 'page') {\n return <SidebarPageLink key={item.id} title={item.navTitle} href={item.href} currentHref={currentHref} />\n }\n\n return <SidebarNestedGroup key={item.id} group={item} currentHref={currentHref} />\n })}\n </ul>\n )\n}\n\ninterface SidebarNestedGroupProps {\n group: ResolvedSidebarGroup\n currentHref: string\n}\n\nconst SidebarNestedGroup = ({ group, currentHref }: SidebarNestedGroupProps) => {\n const landingPage = getGroupLandingPage(group)\n const visibleItems = getVisibleGroupItems(group, landingPage)\n const isCollapsible = group.collapsible !== undefined\n const isOpenByDefault = group.collapsible?.isDefaultOpen ?? true\n const nestedHasActiveItem = landingPage?.href === currentHref || hasActiveItem(visibleItems, currentHref)\n const { isOpen, setIsOpen } = useAutoOpenDetails(`group:${group.id}`, isOpenByDefault, nestedHasActiveItem)\n\n if (!isCollapsible) {\n return (\n <li>\n <div className=\"px-4 py-2\">\n <SidebarGroupTitle\n title={group.title}\n href={landingPage?.href}\n isActive={nestedHasActiveItem}\n allowNavigation={Boolean(landingPage)}\n />\n </div>\n {visibleItems.length > 0 ? <SidebarItemList items={visibleItems} currentHref={currentHref} /> : null}\n </li>\n )\n }\n\n return (\n <li>\n <details\n open={isOpen}\n onToggle={(event) => {\n setIsOpen(event.currentTarget.open)\n }}\n >\n <summary>\n <SidebarGroupTitle\n title={group.title}\n href={landingPage?.href}\n isActive={nestedHasActiveItem}\n allowNavigation={Boolean(landingPage)}\n />\n </summary>\n {visibleItems.length > 0 ? <SidebarItemList items={visibleItems} currentHref={currentHref} /> : null}\n </details>\n </li>\n )\n}\n\ninterface SidebarSectionGroupProps {\n section: ResolvedDocsSection\n currentHref: string\n activeSectionId: string\n}\n\nconst SidebarSectionGroup = ({ section, currentHref, activeSectionId }: SidebarSectionGroupProps) => {\n const sectionHasActiveItem = section.id === activeSectionId || containsActiveHref(section.items, currentHref)\n const { isOpen, setIsOpen } = useAutoOpenDetails(\n `section:${section.id}`,\n section.id === activeSectionId,\n sectionHasActiveItem,\n )\n\n return (\n <li className=\"pb-4\">\n <details\n open={isOpen}\n onToggle={(event) => {\n setIsOpen(event.currentTarget.open)\n }}\n >\n <summary>\n <SidebarGroupTitle title={section.title} isActive={sectionHasActiveItem} />\n </summary>\n <SidebarItemList items={section.items} currentHref={currentHref} />\n </details>\n </li>\n )\n}\n\ninterface SidebarProps {\n sections: ResolvedDocsSection[]\n activeSectionId: string\n currentHref: string\n}\n\nexport const Sidebar = ({ sections, activeSectionId, currentHref }: SidebarProps) => {\n return (\n <aside className=\"hidden basis-76 shrink-0 lg:block\">\n <div className=\"-ml-3 sticky top-16\">\n <div className=\"absolute h-full w-px right-0 top-0 bg-linear-to-t to-base-muted-light via-base-muted-light pointer-events-none z-1\" />\n <div className=\"pr-4 h-[calc(100svh-16*var(--spacing))] overflow-y-scroll overflow-x-hidden relative z-10\">\n <ul className=\"menu w-full px-0 py-5 li:last-child:border-0\">\n {sections.map((section) => (\n <SidebarSectionGroup\n key={section.id}\n section={section}\n currentHref={currentHref}\n activeSectionId={activeSectionId}\n />\n ))}\n </ul>\n </div>\n </div>\n </aside>\n )\n}\n","import cm, { cmMerge } from '@classmatejs/react'\nimport { TableOfContentsIcon } from 'lucide-react'\nimport type { Dispatch, SetStateAction } from 'react'\nimport { useEffect, useState } from 'react'\nimport { useData } from 'vike-react/useData'\nimport type { DocHeading, DocPageData, ResolvedDocsPartnersConfig } from '../../types.js'\nimport { createHeadingSlugger, normalizeHeadingTitle } from '../docHeadings.js'\n\nconst getCurrentHash = () => {\n try {\n return decodeURIComponent(window.location.hash)\n } catch {\n return window.location.hash\n }\n}\n\nconst getHeadingElements = () => {\n const root = document.querySelector('[data-doc-content]')\n if (!(root instanceof HTMLElement)) {\n return []\n }\n\n return Array.from(root.querySelectorAll('h2, h3, h4')).filter(\n (element): element is HTMLHeadingElement => element instanceof HTMLHeadingElement,\n )\n}\n\nconst areHeadingsEqual = (left: DocHeading[], right: DocHeading[]) => {\n if (left.length !== right.length) {\n return false\n }\n\n return left.every((heading, index) => {\n const other = right[index]\n return (\n other !== undefined && heading.depth === other.depth && heading.id === other.id && heading.title === other.title\n )\n })\n}\n\nconst syncHeadingsFromDom = (setDomHeadings: Dispatch<SetStateAction<DocHeading[]>>) => {\n const root = document.querySelector('[data-doc-content]')\n if (!(root instanceof HTMLElement)) {\n return\n }\n\n const slugify = createHeadingSlugger()\n const nextHeadings = Array.from(root.querySelectorAll('h2, h3, h4'))\n .map((element) => {\n const title = normalizeHeadingTitle(element.textContent ?? '')\n if (!title) {\n return null\n }\n\n element.classList.add('scroll-mt-24')\n\n const id = element.id || slugify(title)\n if (!element.id) {\n element.id = id\n }\n\n return {\n depth: Number(element.tagName.slice(1)),\n id,\n title,\n } satisfies DocHeading\n })\n .filter((heading): heading is DocHeading => heading !== null)\n\n setDomHeadings((currentHeadings) => {\n if (areHeadingsEqual(currentHeadings, nextHeadings)) {\n return currentHeadings\n }\n\n return nextHeadings\n })\n}\n\nconst updateActiveHeadingFromScroll = (setActiveHeadingId: (value: string) => void) => {\n const headingElements = getHeadingElements()\n if (headingElements.length === 0) {\n return\n }\n\n const activationOffset = 144\n let nextActiveHeadingId = headingElements[0]?.id ?? ''\n\n for (const heading of headingElements) {\n if (!heading.id) {\n continue\n }\n\n if (heading.getBoundingClientRect().top <= activationOffset) {\n nextActiveHeadingId = heading.id\n continue\n }\n\n break\n }\n\n const lastHeading = headingElements.at(-1)\n if (lastHeading?.id && window.innerHeight + window.scrollY >= document.documentElement.scrollHeight - 8) {\n nextActiveHeadingId = lastHeading.id\n }\n\n setActiveHeadingId(nextActiveHeadingId)\n}\n\ninterface TableOfContentsProps {\n headings: DocHeading[]\n partners: ResolvedDocsPartnersConfig\n}\n\nexport const TableOfContents = ({ headings, partners }: TableOfContentsProps) => {\n const [activeHeadingId, setActiveHeadingId] = useState('')\n const [domHeadings, setDomHeadings] = useState<DocHeading[]>(headings)\n const effectiveHeadings = domHeadings.length > 0 ? domHeadings : headings\n const { page } = useData() as DocPageData\n\n useEffect(() => {\n let scrollFrame = 0\n\n const syncActiveHeading = () => {\n if (scrollFrame) {\n return\n }\n\n scrollFrame = window.requestAnimationFrame(() => {\n scrollFrame = 0\n updateActiveHeadingFromScroll(setActiveHeadingId)\n })\n }\n\n const updateHash = () => {\n const currentHash = getCurrentHash().replace(/^#/, '')\n if (currentHash !== '') {\n setActiveHeadingId(currentHash)\n return\n }\n\n syncActiveHeading()\n }\n\n updateHash()\n queueMicrotask(() => {\n syncHeadingsFromDom(setDomHeadings)\n syncActiveHeading()\n })\n\n window.addEventListener('hashchange', updateHash)\n window.addEventListener('scroll', syncActiveHeading, { passive: true })\n window.addEventListener('resize', syncActiveHeading)\n\n return () => {\n if (scrollFrame) {\n window.cancelAnimationFrame(scrollFrame)\n }\n\n window.removeEventListener('hashchange', updateHash)\n window.removeEventListener('scroll', syncActiveHeading)\n window.removeEventListener('resize', syncActiveHeading)\n }\n }, [])\n\n useEffect(() => {\n if (typeof window === 'undefined') {\n return\n }\n\n setDomHeadings((currentHeadings) => {\n if (areHeadingsEqual(currentHeadings, headings)) {\n return currentHeadings\n }\n\n return headings\n })\n setActiveHeadingId('')\n\n queueMicrotask(() => {\n syncHeadingsFromDom(setDomHeadings)\n updateActiveHeadingFromScroll(setActiveHeadingId)\n })\n }, [headings])\n\n return (\n <aside className={cmMerge(page.tableOfContents ? 'w-64' : 'w-32', 'hidden shrink-0 xl:block')}>\n <div className=\"sticky top-16\">\n <div className=\"relative h-[calc(100svh-16*var(--spacing))] overflow-y-auto overflow-x-hidden pt-10 pb-8\">\n {page.tableOfContents\n ? effectiveHeadings.length > 0 && (\n <>\n <p className=\"mb-4 flex items-center gap-2 text-xs font-semibold uppercase tracking-widest text-base-muted\">\n <TableOfContentsIcon className=\"h-3 w-3\" />\n On this page\n </p>\n <nav aria-label=\"On this page\" className=\"mb-16\">\n <ul>\n {effectiveHeadings.map((heading, index) => (\n <li key={heading.id}>\n <a\n href={`#${heading.id}`}\n aria-current={activeHeadingId === heading.id ? 'location' : undefined}\n onClick={() => setActiveHeadingId(heading.id)}\n className={cmMerge(\n 'block border-l border-base-muted-light py-1.5 text-sm text-base-muted hover:border-primary-muted hover:text-base-content',\n heading.depth > 2 ? 'pl-6' : 'pl-4',\n activeHeadingId\n ? activeHeadingId === heading.id\n ? 'border-l-2 border-primary font-semibold text-base-content'\n : ''\n : index === 0\n ? 'border-l-2 border-primary font-semibold text-base-content'\n : '',\n )}\n >\n {heading.title}\n </a>\n </li>\n ))}\n </ul>\n </nav>\n </>\n )\n : null}\n <Adbar partners={partners} />\n </div>\n </div>\n </aside>\n )\n}\n\nconst Adbar = ({ partners }: { partners: ResolvedDocsPartnersConfig }) => {\n if (partners.primary.length === 0 && partners.gold.length === 0) {\n return null\n }\n\n return (\n <ul className=\"grid grid-cols-[repeat(auto-fit,minmax(5.5rem,1fr))] gap-3 opacity-90\">\n {partners.primary.map((partner) => (\n <AdbarItem key={partner.name} className=\"col-span-full\">\n <AdbarLink href={partner.href} title={partner.name}>\n <PartnerLogo partner={partner} />\n </AdbarLink>\n </AdbarItem>\n ))}\n {partners.gold.map((partner) => (\n <AdbarItem key={partner.name}>\n <AdbarLink href={partner.href} title={partner.name}>\n <PartnerLogo partner={partner} />\n </AdbarLink>\n </AdbarItem>\n ))}\n </ul>\n )\n}\n\nconst PartnerLogo = ({\n partner,\n}: {\n partner: ResolvedDocsPartnersConfig['primary'][number] | ResolvedDocsPartnersConfig['gold'][number]\n}) => {\n return (\n <>\n <Image\n src={partner.logoLight}\n width={200}\n height={100}\n alt={partner.logoAlt}\n className={cmMerge('block', partner.logoDark ? 'dark:hidden' : 'dark:invert')}\n />\n {partner.logoDark ? (\n <Image src={partner.logoDark} width={200} height={100} alt={partner.logoAlt} className=\"hidden dark:block\" />\n ) : null}\n </>\n )\n}\n\nconst AdbarItem = cm.div`\n px-5\n py-5\n bg-base-200\n text-center\n flex\n items-center\n justify-center\n rounded-box\n`\n\nconst AdbarLink = cm.a`\n block\n w-full\n transition-opacity\n hover:opacity-100\n focus-visible:opacity-100\n`\n\nconst Image = cm.img`\n mx-auto\n w-24\n`\n","import type { DocsConfig } from '../types.js'\nimport type {\n UniversalMdxRuntimeValue,\n UniversalResolvedDocLink,\n UniversalResolvedOverviewItem,\n} from '../components/types.js'\nimport { withSiteBaseUrl } from '../nivelAssets.js'\nimport {\n getActiveSectionByPathname,\n getResolvedPageByPathname,\n getResolvedSectionById,\n isSamePagePathname,\n resolveDocsConfig,\n} from './resolveDocsConfig.js'\nimport { docsCodeBlockChoiceStore } from './store/settings-store.js'\n\nconst isExternalHref = (href: string) => {\n return /^(?:[a-z]+:)?\\/\\//i.test(href) || href.startsWith('mailto:') || href.startsWith('tel:')\n}\n\nconst splitHref = (href: string) => {\n const [pathname, hash = ''] = href.split('#')\n return {\n pathname,\n hash: hash ? `#${hash}` : '',\n }\n}\n\nconst toDocsPathname = (basePath: '/docs', href: string) => {\n if (!href.startsWith('/')) {\n return null\n }\n\n if (href === basePath || href.startsWith(`${basePath}/`)) {\n return href\n }\n\n const normalizedPath = href.replace(/^\\/+/, '')\n if (!normalizedPath) {\n return null\n }\n\n return `${basePath}/${normalizedPath}`\n}\n\nconst resolveDocLink = (options: {\n resolvedConfig: ReturnType<typeof resolveDocsConfig>\n currentPathname: string\n href: string\n}): UniversalResolvedDocLink | null => {\n const { currentPathname, href } = options\n if (href.startsWith('#') || isExternalHref(href)) {\n return null\n }\n\n const { pathname, hash } = splitHref(href)\n const docsPathname = toDocsPathname(options.resolvedConfig.basePath, pathname)\n\n if (!docsPathname) {\n return null\n }\n\n const page = getResolvedPageByPathname(options.resolvedConfig, docsPathname)\n if (!page) {\n return null\n }\n\n const section = getResolvedSectionById(options.resolvedConfig, page.sectionId)\n\n return {\n href: withSiteBaseUrl(`${page.href}${hash}`),\n title: page.title,\n breadcrumb: section ? [section.navTitle] : [],\n isCurrentPage: isSamePagePathname(page, currentPathname),\n }\n}\n\nconst resolveOverviewItem = (options: {\n resolvedConfig: ReturnType<typeof resolveDocsConfig>\n id: string\n}): UniversalResolvedOverviewItem | null => {\n const page = options.resolvedConfig.pages.find((candidate) => candidate.id === options.id)\n\n if (!page) {\n return null\n }\n\n return {\n title: page.title,\n href: withSiteBaseUrl(page.href),\n excerpt: page.description ?? null,\n }\n}\n\nexport const getMdxRuntimeValue = (options: {\n docsConfig: DocsConfig\n currentPathname: string\n}): UniversalMdxRuntimeValue => {\n const { currentPathname, docsConfig } = options\n const resolvedConfig = resolveDocsConfig(docsConfig)\n const activeSection = getActiveSectionByPathname(resolvedConfig, currentPathname)\n const currentPage = getResolvedPageByPathname(resolvedConfig, currentPathname)\n\n return {\n locale: 'en',\n codeBlockChoices: docsCodeBlockChoiceStore,\n localizeHref: (href) => {\n if (href.startsWith('#') || isExternalHref(href)) {\n return href\n }\n\n const { pathname, hash } = splitHref(href)\n const docsPathname = toDocsPathname(resolvedConfig.basePath, pathname)\n const page = docsPathname ? getResolvedPageByPathname(resolvedConfig, docsPathname) : null\n\n if (!page) {\n return withSiteBaseUrl(href)\n }\n\n return withSiteBaseUrl(`${page.href}${hash}`)\n },\n resolveDocLink: ({ href }) =>\n resolveDocLink({\n resolvedConfig,\n currentPathname,\n href,\n }),\n resolveOverviewItem: (id) =>\n resolveOverviewItem({\n resolvedConfig,\n id,\n }),\n t: (group, key) => {\n if (group === 'docs' && key === 'onThisPage') {\n return 'On this page'\n }\n\n if (group === 'docs' && key === 'previous') {\n return 'Previous'\n }\n\n if (group === 'docs' && key === 'next') {\n return 'Next'\n }\n\n if (group === 'docs' && key === 'currentSection') {\n return activeSection?.navTitle ?? currentPage?.title ?? 'Docs'\n }\n\n return key\n },\n }\n}\n"],"mappings":"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","names":["usePageContext","cmMerge","jsx","jsxs","jsx","jsxs","cmMerge","useEffect","useEffect","jsx","jsxs","usePageContext","Fragment","jsx","jsxs","Fragment","jsx","jsxs","jsx","Fragment","jsx","jsxs","cm","useData","usePageContext","cmMerge","jsx","jsxs","cmMerge","jsx","jsxs","cmMerge","useEffect","create","jsx","jsxs","create","useEffect","cmMerge","cm","cmMerge","useEffect","useState","Fragment","jsx","jsxs","useState","useEffect","cmMerge","cm","jsx","jsxs","usePageContext","useData"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/runtime/resolveDocsConfig.ts","../src/runtime/docHeadings.ts"],"sourcesContent":["import { nivelAssetUrl, resolvePublicAssetUrl, withSiteBaseUrl } from '../nivelAssets.js'\nimport type {\n DocsBrandConfig,\n DocsConfig,\n DocsDividerNode,\n DocsFooterConfig,\n DocsHeadConfig,\n DocsPartnerConfig,\n DocsPageNode,\n DocsSectionNode,\n DocsSidebarNode,\n ResolvedDocsBrandConfig,\n ResolvedDocsConfig,\n ResolvedDocsPartnerConfig,\n ResolvedDocsPage,\n ResolvedDocsPartnersConfig,\n ResolvedDocsSection,\n ResolvedNavbarItem,\n ResolvedSidebarNode,\n ThemePreference,\n} from '../types.js'\n\nconst normalizeBasePath = (value: string) => {\n const normalized = value.trim().replace(/^\\/+|\\/+$/g, '')\n return `/${normalized}` as '/docs'\n}\n\nconst normalizeSlug = (value: string) => value.replace(/^\\/+|\\/+$/g, '')\n\nconst joinHref = (basePath: '/docs', slug: string) => `${basePath}/${normalizeSlug(slug)}/`\n\nconst normalizePathname = (value: string) => {\n const pathname = value.split('?')[0]?.split('#')[0] ?? value\n const normalized = pathname.trim().replace(/\\/+$/g, '')\n return normalized === '' ? '/' : `${normalized}/`.replace(/\\/+/g, '/')\n}\n\nconst normalizeSourcePath = (value: string) => {\n const segments = value.replaceAll('\\\\', '/').split('/')\n const normalizedSegments: string[] = []\n\n for (const segment of segments) {\n if (segment === '' || segment === '.') {\n continue\n }\n\n if (segment === '..') {\n normalizedSegments.pop()\n continue\n }\n\n normalizedSegments.push(segment)\n }\n\n return normalizedSegments.join('/')\n}\n\nconst getSectionHref = (items: ResolvedSidebarNode[]): string | null => {\n for (const item of items) {\n if (item.kind === 'page') {\n return item.href\n }\n\n if (item.kind === 'group') {\n const href = getSectionHref(item.items)\n if (href) {\n return href\n }\n }\n }\n\n return null\n}\n\nconst resolveThemeConfig = (theme: DocsConfig['theme']) => {\n return {\n light: theme?.light ?? 'consumer-light',\n dark: theme?.dark ?? 'consumer-dark',\n defaultPreference: (theme?.defaultPreference ?? 'light') as ThemePreference,\n }\n}\n\nconst resolveFooterConfig = (footer: DocsFooterConfig | undefined) => {\n return {\n pagination: footer?.pagination ?? false,\n }\n}\n\nconst resolveBrandConfig = (brand: DocsBrandConfig | undefined, siteTitle: string): ResolvedDocsBrandConfig => {\n const text = brand?.text ?? siteTitle\n\n return {\n text,\n href: withSiteBaseUrl(brand?.href ?? '/'),\n logoLight: resolvePublicAssetUrl(brand?.logoLight),\n logoDark: resolvePublicAssetUrl(brand?.logoDark),\n logoAlt: brand?.logoAlt ?? `${text} logo`,\n }\n}\n\nconst resolveHeadConfig = (head: DocsHeadConfig | undefined) => {\n const fontPreset = head?.fontPreset ?? 'inter'\n const defaultFontStylesheetHref = fontPreset === 'inter' ? nivelAssetUrl('fonts/fonts-inter.css') : undefined\n const defaultFontPreloadHrefs =\n fontPreset === 'inter'\n ? [\n nivelAssetUrl('fonts/inter-v20-latin-regular.woff2'),\n nivelAssetUrl('fonts/inter-v20-latin-600.woff2'),\n nivelAssetUrl('fonts/inter-v20-latin-800.woff2'),\n ]\n : []\n\n return {\n faviconSvg: resolvePublicAssetUrl(head?.faviconSvg),\n faviconIco: resolvePublicAssetUrl(head?.faviconIco),\n appleTouchIcon: resolvePublicAssetUrl(head?.appleTouchIcon),\n fontPreset,\n fontStylesheetHref: head?.fontStylesheetHref ?? defaultFontStylesheetHref,\n fontPreloadHrefs: head?.fontPreloadHrefs ?? defaultFontPreloadHrefs,\n }\n}\n\nconst resolvePartnerAssetUrl = (value: string | undefined) => {\n if (!value) {\n return undefined\n }\n\n return resolvePublicAssetUrl(value)\n}\n\nconst resolvePartner = (partner: DocsPartnerConfig): ResolvedDocsPartnerConfig => {\n return {\n name: partner.name,\n href: withSiteBaseUrl(partner.href),\n logoLight: resolvePartnerAssetUrl(partner.logoLight) ?? partner.logoLight,\n logoDark: resolvePartnerAssetUrl(partner.logoDark),\n logoAlt: partner.logoAlt ?? `${partner.name} logo`,\n }\n}\n\nconst resolvePartnersConfig = (partners: DocsConfig['partners']): ResolvedDocsPartnersConfig => {\n return {\n primary: (partners?.primary ?? []).map(resolvePartner),\n gold: (partners?.gold ?? []).map(resolvePartner),\n }\n}\n\nconst normalizeAliases = (aliases: string[] | undefined, slug: string) => {\n const normalizedAliases = new Set<string>()\n\n for (const alias of aliases ?? []) {\n const normalizedAlias = normalizeSlug(alias)\n if (!normalizedAlias || normalizedAlias === slug) {\n continue\n }\n\n normalizedAliases.add(normalizedAlias)\n }\n\n return [...normalizedAliases]\n}\n\nexport const resolveDocsConfig = (config: DocsConfig): ResolvedDocsConfig => {\n if (normalizeBasePath(config.basePath) !== '/docs') {\n throw new Error(`nivel currently requires basePath to be \"/docs\". Received ${JSON.stringify(config.basePath)}.`)\n }\n\n const pageIds = new Set<string>()\n const pageSlugs = new Set<string>()\n const pageAliases = new Set<string>()\n const groupIds = new Set<string>()\n const sectionIds = new Set<string>()\n const dividerIds = new Set<string>()\n const pages: ResolvedDocsPage[] = []\n const navbarItems: ResolvedNavbarItem[] = []\n\n const resolveSidebarNodes = (nodes: DocsSidebarNode[], sectionId: string): ResolvedSidebarNode[] => {\n return nodes.map((node) => {\n if (node.kind === 'group') {\n if (groupIds.has(node.id)) {\n throw new Error(`Duplicate docs group id \"${node.id}\".`)\n }\n\n groupIds.add(node.id)\n\n return {\n kind: 'group',\n id: node.id,\n title: node.title,\n collapsible: node.collapsible,\n items: resolveSidebarNodes(node.items, sectionId),\n }\n }\n\n if (node.kind === 'divider') {\n const divider = node as DocsDividerNode\n if (dividerIds.has(divider.id)) {\n throw new Error(`Duplicate docs divider id \"${divider.id}\".`)\n }\n\n dividerIds.add(divider.id)\n\n return {\n kind: 'divider',\n id: divider.id,\n title: divider.title,\n }\n }\n\n if (node.kind !== 'page') {\n throw new Error(`Invalid docs sidebar node: ${JSON.stringify(node)}`)\n }\n\n const pageNode = node as DocsPageNode\n const slug = normalizeSlug(pageNode.slug)\n const aliases = normalizeAliases(pageNode.aliases, slug)\n\n if (!slug) {\n throw new Error(`Docs page \"${pageNode.id}\" must define a non-empty slug.`)\n }\n\n if (pageIds.has(pageNode.id)) {\n throw new Error(`Duplicate docs page id \"${pageNode.id}\".`)\n }\n\n if (pageSlugs.has(slug)) {\n throw new Error(`Duplicate docs page slug \"${slug}\".`)\n }\n\n for (const alias of aliases) {\n if (pageSlugs.has(alias) || pageAliases.has(alias)) {\n throw new Error(`Duplicate docs page alias \"${alias}\".`)\n }\n }\n\n pageIds.add(pageNode.id)\n pageSlugs.add(slug)\n for (const alias of aliases) {\n pageAliases.add(alias)\n }\n\n const href = joinHref('/docs', slug)\n const page: ResolvedDocsPage = {\n ...pageNode,\n slug,\n aliases,\n href,\n aliasHrefs: aliases.map((alias) => joinHref('/docs', alias)),\n tableOfContents: pageNode.tableOfContents ?? true,\n sectionId,\n documentTitle: `${pageNode.title} | ${config.siteTitle}`,\n source: normalizeSourcePath(pageNode.source),\n }\n pages.push(page)\n\n return {\n kind: 'page',\n id: pageNode.id,\n title: pageNode.title,\n navTitle: pageNode.navTitle ?? pageNode.title,\n href,\n }\n })\n }\n\n const sections: ResolvedDocsSection[] = config.graph.items.map((section: DocsSectionNode) => {\n if (section.kind !== 'section') {\n throw new Error(`Top-level docs graph items must be sections. Received ${JSON.stringify(section)}`)\n }\n\n if (sectionIds.has(section.id)) {\n throw new Error(`Duplicate docs section id \"${section.id}\".`)\n }\n\n sectionIds.add(section.id)\n\n const items = resolveSidebarNodes(section.items, section.id)\n const href = getSectionHref(items)\n\n if (!href) {\n throw new Error(`Docs section \"${section.id}\" must contain at least one page.`)\n }\n\n const resolvedSection: ResolvedDocsSection = {\n id: section.id,\n title: section.title,\n navTitle: section.navTitle ?? section.title,\n href,\n items,\n }\n\n navbarItems.push({\n id: section.id,\n title: resolvedSection.navTitle,\n href: resolvedSection.href,\n })\n\n return resolvedSection\n })\n\n if (pages.length === 0) {\n throw new Error('Docs graph must contain at least one page.')\n }\n\n return {\n siteTitle: config.siteTitle,\n siteDescription: config.siteDescription ?? null,\n basePath: '/docs',\n theme: resolveThemeConfig(config.theme),\n footer: resolveFooterConfig(config.footer),\n brand: resolveBrandConfig(config.brand, config.siteTitle),\n head: resolveHeadConfig(config.head),\n partners: resolvePartnersConfig(config.partners),\n pages,\n sections,\n navbarItems,\n }\n}\n\nexport const getResolvedPageById = (config: ResolvedDocsConfig, pageId: string) => {\n const page = config.pages.find((candidate) => candidate.id === pageId)\n if (!page) {\n throw new Error(`Unknown docs page id \"${pageId}\".`)\n }\n return page\n}\n\nexport const getResolvedSectionById = (config: ResolvedDocsConfig, sectionId: string) => {\n return config.sections.find((section) => section.id === sectionId) ?? null\n}\n\nexport const getResolvedPageByPathname = (config: ResolvedDocsConfig, pathname: string) => {\n const normalizedPathname = normalizePathname(pathname)\n\n return (\n config.pages.find((page) => {\n if (normalizePathname(page.href) === normalizedPathname) {\n return true\n }\n\n return page.aliasHrefs.some((aliasHref) => normalizePathname(aliasHref) === normalizedPathname)\n }) ?? null\n )\n}\n\nexport const getActiveSectionByPathname = (config: ResolvedDocsConfig, pathname: string) => {\n const activePage = getResolvedPageByPathname(config, pathname)\n\n if (!activePage) {\n return null\n }\n\n return getResolvedSectionById(config, activePage.sectionId)\n}\n\nexport const isSamePagePathname = (page: Pick<ResolvedDocsPage, 'href' | 'aliasHrefs'>, pathname: string) => {\n const normalizedPathname = normalizePathname(pathname)\n\n if (normalizePathname(page.href) === normalizedPathname) {\n return true\n }\n\n return page.aliasHrefs.some((aliasHref) => normalizePathname(aliasHref) === normalizedPathname)\n}\n","import type { DocHeading } from '../types.js'\n\nconst normalizeWhitespace = (value: string) => value.replace(/\\s+/g, ' ').trim()\n\nconst slugifyHeading = (value: string) => {\n const normalized = normalizeWhitespace(value)\n .normalize('NFKD')\n .toLowerCase()\n .replace(/['\"]/g, '')\n .replace(/[^\\p{Letter}\\p{Number}\\s-]/gu, ' ')\n .replace(/\\s+/g, '-')\n .replace(/-+/g, '-')\n .replace(/^-+|-+$/g, '')\n\n return normalized || 'section'\n}\n\nexport const createHeadingSlugger = () => {\n const slugCounts = new Map<string, number>()\n\n return (value: string) => {\n const baseSlug = slugifyHeading(value)\n const count = slugCounts.get(baseSlug) ?? 0\n slugCounts.set(baseSlug, count + 1)\n\n return count === 0 ? baseSlug : `${baseSlug}-${count}`\n }\n}\n\nconst stripInlineMarkdown = (value: string) => {\n return normalizeWhitespace(\n value\n .replace(/!\\[([^\\]]*)\\]\\([^)]+\\)/g, '$1')\n .replace(/\\[([^\\]]+)\\]\\([^)]+\\)/g, '$1')\n .replace(/`([^`]+)`/g, '$1')\n .replace(/<[^>]+>/g, ' ')\n .replace(/\\\\([\\\\`*_[\\]{}()#+\\-.!])/g, '$1')\n .replace(/[*_~]/g, '')\n .replace(/\\{[^}]+\\}/g, ' '),\n )\n}\n\nconst getFenceMarker = (line: string) => {\n const match = line.match(/^\\s{0,3}(`{3,}|~{3,})/)\n return match?.[1]?.[0] ?? null\n}\n\nexport const extractDocHeadings = (source: string, minDepth = 2, maxDepth = 3): DocHeading[] => {\n const slugify = createHeadingSlugger()\n const headings: DocHeading[] = []\n let activeFenceMarker: string | null = null\n\n for (const line of source.split('\\n')) {\n const fenceMarker = getFenceMarker(line)\n\n if (activeFenceMarker) {\n if (fenceMarker === activeFenceMarker) {\n activeFenceMarker = null\n }\n continue\n }\n\n if (fenceMarker) {\n activeFenceMarker = fenceMarker\n continue\n }\n\n const match = line.match(/^\\s{0,3}(#{1,6})\\s+(.*?)(?:\\s+#+\\s*)?$/)\n if (!match) {\n continue\n }\n\n const depth = match[1].length\n const title = stripInlineMarkdown(match[2] ?? '')\n if (!title || depth < minDepth || depth > maxDepth) {\n continue\n }\n\n headings.push({\n depth,\n id: slugify(title),\n title,\n })\n }\n\n return headings\n}\n\nexport const normalizeHeadingTitle = (value: string) => normalizeWhitespace(value)\n"],"mappings":"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","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/nivelAssets.ts"],"sourcesContent":["const normalizeSiteBasePath = (value: string | undefined) => {\n const normalized = value?.trim().replace(/^\\/+|\\/+$/g, '') ?? ''\n return normalized ? `/${normalized}/` : '/'\n}\n\nconst importMetaEnv = (import.meta as ImportMeta & { env?: { BASE_URL?: string } }).env\n\nconst siteBasePath = normalizeSiteBasePath(importMetaEnv?.BASE_URL ?? process.env.PAGES_BASE_PATH)\n\nconst isExternalUrl = (value: string) => value.startsWith('//') || /^[a-z][a-z\\d+.-]*:/i.test(value)\n\nexport const withSiteBaseUrl = (value: string) => {\n if (value === '' || value.startsWith('#') || isExternalUrl(value)) {\n return value\n }\n\n if (!value.startsWith('/')) {\n return value\n }\n\n if (siteBasePath !== '/' && (value === siteBasePath.slice(0, -1) || value.startsWith(siteBasePath))) {\n return value\n }\n\n return siteBasePath === '/' ? value : `${siteBasePath.slice(0, -1)}${value}`\n}\n\nexport const resolvePublicAssetUrl = (value: string | undefined) => {\n if (!value) {\n return undefined\n }\n\n if (value.startsWith('#') || isExternalUrl(value)) {\n return value\n }\n\n const pathname = value.startsWith('/') ? value : `/${value.replace(/^\\/+/, '')}`\n return withSiteBaseUrl(pathname)\n}\n\nexport const nivelPublicRoute = '/nivel'\n\nexport const baseAssets = `${withSiteBaseUrl(nivelPublicRoute).replace(/\\/?$/, '/')}`\n\nexport const nivelAssetUrl = (assetPath: string) => `${baseAssets}${assetPath.replace(/^\\/+/, '')}`\n"],"mappings":";AAAA,IAAM,wBAAwB,CAAC,UAA8B;AAC3D,QAAM,aAAa,OAAO,KAAK,EAAE,QAAQ,cAAc,EAAE,KAAK;AAC9D,SAAO,aAAa,IAAI,UAAU,MAAM;AAC1C;AAEA,IAAM,gBAAiB,YAA6D;AAEpF,IAAM,eAAe,sBAAsB,eAAe,YAAY,QAAQ,IAAI,eAAe;AAEjG,IAAM,gBAAgB,CAAC,UAAkB,MAAM,WAAW,IAAI,KAAK,sBAAsB,KAAK,KAAK;AAE5F,IAAM,kBAAkB,CAAC,UAAkB;AAChD,MAAI,UAAU,MAAM,MAAM,WAAW,GAAG,KAAK,cAAc,KAAK,GAAG;AACjE,WAAO;AAAA,EACT;AAEA,MAAI,CAAC,MAAM,WAAW,GAAG,GAAG;AAC1B,WAAO;AAAA,EACT;AAEA,MAAI,iBAAiB,QAAQ,UAAU,aAAa,MAAM,GAAG,EAAE,KAAK,MAAM,WAAW,YAAY,IAAI;AACnG,WAAO;AAAA,EACT;AAEA,SAAO,iBAAiB,MAAM,QAAQ,GAAG,aAAa,MAAM,GAAG,EAAE,CAAC,GAAG,KAAK;AAC5E;AAEO,IAAM,wBAAwB,CAAC,UAA8B;AAClE,MAAI,CAAC,OAAO;AACV,WAAO;AAAA,EACT;AAEA,MAAI,MAAM,WAAW,GAAG,KAAK,cAAc,KAAK,GAAG;AACjD,WAAO;AAAA,EACT;AAEA,QAAM,WAAW,MAAM,WAAW,GAAG,IAAI,QAAQ,IAAI,MAAM,QAAQ,QAAQ,EAAE,CAAC;AAC9E,SAAO,gBAAgB,QAAQ;AACjC;AAEO,IAAM,mBAAmB;AAEzB,IAAM,aAAa,GAAG,gBAAgB,gBAAgB,EAAE,QAAQ,QAAQ,GAAG,CAAC;AAE5E,IAAM,gBAAgB,CAAC,cAAsB,GAAG,UAAU,GAAG,UAAU,QAAQ,QAAQ,EAAE,CAAC;","names":[]}
|
package/dist/chunk-PHHK2BAF.js
DELETED
|
@@ -1,350 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
extractDocHeadings,
|
|
3
|
-
getResolvedPageById,
|
|
4
|
-
getResolvedSectionById,
|
|
5
|
-
resolveDocsConfig
|
|
6
|
-
} from "./chunk-73NPVCDQ.js";
|
|
7
|
-
import {
|
|
8
|
-
nivelPublicRoute
|
|
9
|
-
} from "./chunk-FLO5CJZH.js";
|
|
10
|
-
|
|
11
|
-
// src/runtime/codegen.ts
|
|
12
|
-
import fs from "fs";
|
|
13
|
-
import path from "path";
|
|
14
|
-
var GENERATED_DIRNAME = "(nivel-generated)";
|
|
15
|
-
var writeFileIfChanged = (filePath, source) => {
|
|
16
|
-
const current = fs.existsSync(filePath) ? fs.readFileSync(filePath, "utf8") : null;
|
|
17
|
-
if (current === source) {
|
|
18
|
-
return;
|
|
19
|
-
}
|
|
20
|
-
fs.mkdirSync(path.dirname(filePath), { recursive: true });
|
|
21
|
-
fs.writeFileSync(filePath, source);
|
|
22
|
-
};
|
|
23
|
-
var toPosix = (value) => value.split(path.sep).join(path.posix.sep);
|
|
24
|
-
var getRelativeImportPath = (fromDirectory, toFile) => {
|
|
25
|
-
const relativePath = toPosix(path.relative(fromDirectory, toFile));
|
|
26
|
-
if (relativePath.startsWith(".")) {
|
|
27
|
-
return relativePath;
|
|
28
|
-
}
|
|
29
|
-
return `./${relativePath}`;
|
|
30
|
-
};
|
|
31
|
-
var getRelativeScriptImportPath = (fromDirectory, toFile) => {
|
|
32
|
-
return getRelativeImportPath(fromDirectory, toFile).replace(/\.(cts|mts|ts|tsx)$/, "");
|
|
33
|
-
};
|
|
34
|
-
var serializeData = (data) => JSON.stringify(data, null, 2);
|
|
35
|
-
var collectFiles = (directoryPath) => {
|
|
36
|
-
if (!fs.existsSync(directoryPath)) {
|
|
37
|
-
return [];
|
|
38
|
-
}
|
|
39
|
-
const entries = fs.readdirSync(directoryPath, { withFileTypes: true });
|
|
40
|
-
return entries.flatMap((entry) => {
|
|
41
|
-
const entryPath = path.join(directoryPath, entry.name);
|
|
42
|
-
return entry.isDirectory() ? collectFiles(entryPath) : [entryPath];
|
|
43
|
-
});
|
|
44
|
-
};
|
|
45
|
-
var removeEmptyDirectories = (directoryPath, rootPath) => {
|
|
46
|
-
if (!fs.existsSync(directoryPath)) {
|
|
47
|
-
return;
|
|
48
|
-
}
|
|
49
|
-
for (const entry of fs.readdirSync(directoryPath, { withFileTypes: true })) {
|
|
50
|
-
if (!entry.isDirectory()) {
|
|
51
|
-
continue;
|
|
52
|
-
}
|
|
53
|
-
removeEmptyDirectories(path.join(directoryPath, entry.name), rootPath);
|
|
54
|
-
}
|
|
55
|
-
if (directoryPath === rootPath) {
|
|
56
|
-
return;
|
|
57
|
-
}
|
|
58
|
-
if (fs.readdirSync(directoryPath).length === 0) {
|
|
59
|
-
fs.rmdirSync(directoryPath);
|
|
60
|
-
}
|
|
61
|
-
};
|
|
62
|
-
var getGeneratedPageSource = (contentImportPath, docsConfigImportPath) => {
|
|
63
|
-
return [
|
|
64
|
-
"import { DocsPage } from '@unterberg/nivel/client'",
|
|
65
|
-
`import docsConfig from ${JSON.stringify(docsConfigImportPath)}`,
|
|
66
|
-
`import Content from ${JSON.stringify(contentImportPath)}`,
|
|
67
|
-
"",
|
|
68
|
-
"const Page = () => {",
|
|
69
|
-
" return <DocsPage Content={Content} docsConfig={docsConfig} />",
|
|
70
|
-
"}",
|
|
71
|
-
"",
|
|
72
|
-
"export default Page",
|
|
73
|
-
""
|
|
74
|
-
].join("\n");
|
|
75
|
-
};
|
|
76
|
-
var getGeneratedDataSource = (data) => {
|
|
77
|
-
return [
|
|
78
|
-
"import type { DocPageData } from '@unterberg/nivel'",
|
|
79
|
-
"",
|
|
80
|
-
`const data: DocPageData = ${serializeData(data)}`,
|
|
81
|
-
"",
|
|
82
|
-
"const pageData = () => {",
|
|
83
|
-
" return data",
|
|
84
|
-
"}",
|
|
85
|
-
"",
|
|
86
|
-
"export default pageData",
|
|
87
|
-
""
|
|
88
|
-
].join("\n");
|
|
89
|
-
};
|
|
90
|
-
var getRouteString = (href) => {
|
|
91
|
-
if (href === "/") {
|
|
92
|
-
return href;
|
|
93
|
-
}
|
|
94
|
-
return href.replace(/\/+$/g, "");
|
|
95
|
-
};
|
|
96
|
-
var getGeneratedRouteSource = (href) => {
|
|
97
|
-
return [`export default ${JSON.stringify(getRouteString(href))}`, ""].join("\n");
|
|
98
|
-
};
|
|
99
|
-
var getGeneratedTextExport = (value) => {
|
|
100
|
-
return [`export default ${JSON.stringify(value)}`, ""].join("\n");
|
|
101
|
-
};
|
|
102
|
-
var toDocPageLinkData = (page) => {
|
|
103
|
-
if (!page) {
|
|
104
|
-
return null;
|
|
105
|
-
}
|
|
106
|
-
return {
|
|
107
|
-
id: page.id,
|
|
108
|
-
title: page.title,
|
|
109
|
-
href: page.href,
|
|
110
|
-
documentTitle: page.documentTitle
|
|
111
|
-
};
|
|
112
|
-
};
|
|
113
|
-
var getGeneratedPagesRoot = (rootDir) => path.join(rootDir, "pages", GENERATED_DIRNAME);
|
|
114
|
-
var syncGeneratedDocsPages = (options) => {
|
|
115
|
-
const { rootDir, docsConfig } = options;
|
|
116
|
-
const resolved = resolveDocsConfig(docsConfig);
|
|
117
|
-
const generatedPagesRoot = getGeneratedPagesRoot(rootDir);
|
|
118
|
-
const docsRoot = path.join(rootDir, "docs");
|
|
119
|
-
const docsConfigPath = path.join(rootDir, "pages", "+docs.ts");
|
|
120
|
-
const expectedFiles = /* @__PURE__ */ new Set();
|
|
121
|
-
fs.mkdirSync(generatedPagesRoot, { recursive: true });
|
|
122
|
-
for (const [pageIndex, page] of resolved.pages.entries()) {
|
|
123
|
-
const contentFilePath = path.join(docsRoot, page.source);
|
|
124
|
-
if (!fs.existsSync(contentFilePath)) {
|
|
125
|
-
throw new Error(`Docs page "${page.id}" points to missing source file: ${contentFilePath}`);
|
|
126
|
-
}
|
|
127
|
-
const section = getResolvedSectionById(resolved, page.sectionId);
|
|
128
|
-
const pageSource = fs.readFileSync(contentFilePath, "utf8");
|
|
129
|
-
const data = {
|
|
130
|
-
siteTitle: resolved.siteTitle,
|
|
131
|
-
basePath: resolved.basePath,
|
|
132
|
-
theme: resolved.theme,
|
|
133
|
-
footer: resolved.footer,
|
|
134
|
-
page: getResolvedPageById(resolved, page.id),
|
|
135
|
-
activeSectionId: page.sectionId,
|
|
136
|
-
activeSectionTitle: section?.title ?? page.sectionId,
|
|
137
|
-
headings: extractDocHeadings(pageSource),
|
|
138
|
-
previousPage: toDocPageLinkData(resolved.pages[pageIndex - 1]),
|
|
139
|
-
nextPage: toDocPageLinkData(resolved.pages[pageIndex + 1]),
|
|
140
|
-
navbarItems: resolved.navbarItems,
|
|
141
|
-
sidebarItems: section?.items ?? [],
|
|
142
|
-
sidebarSections: resolved.sections
|
|
143
|
-
};
|
|
144
|
-
for (const routeHref of [page.href, ...page.aliasHrefs]) {
|
|
145
|
-
const routeSlug = routeHref.replace(/^\/docs\//, "").replace(/\/+$/g, "");
|
|
146
|
-
const pageDir = path.join(generatedPagesRoot, ...routeSlug.split("/"));
|
|
147
|
-
const contentImportPath = getRelativeImportPath(pageDir, contentFilePath);
|
|
148
|
-
const docsConfigImportPath = getRelativeScriptImportPath(pageDir, docsConfigPath);
|
|
149
|
-
const pageFilePath = path.join(pageDir, "+Page.tsx");
|
|
150
|
-
const dataFilePath = path.join(pageDir, "+data.ts");
|
|
151
|
-
const routeFilePath = path.join(pageDir, "+route.ts");
|
|
152
|
-
const titleFilePath = path.join(pageDir, "+title.ts");
|
|
153
|
-
writeFileIfChanged(pageFilePath, getGeneratedPageSource(contentImportPath, docsConfigImportPath));
|
|
154
|
-
writeFileIfChanged(dataFilePath, getGeneratedDataSource(data));
|
|
155
|
-
writeFileIfChanged(routeFilePath, getGeneratedRouteSource(routeHref));
|
|
156
|
-
writeFileIfChanged(titleFilePath, getGeneratedTextExport(page.documentTitle));
|
|
157
|
-
expectedFiles.add(pageFilePath);
|
|
158
|
-
expectedFiles.add(dataFilePath);
|
|
159
|
-
expectedFiles.add(routeFilePath);
|
|
160
|
-
expectedFiles.add(titleFilePath);
|
|
161
|
-
if (page.description) {
|
|
162
|
-
const descriptionFilePath = path.join(pageDir, "+description.ts");
|
|
163
|
-
writeFileIfChanged(descriptionFilePath, getGeneratedTextExport(page.description));
|
|
164
|
-
expectedFiles.add(descriptionFilePath);
|
|
165
|
-
}
|
|
166
|
-
}
|
|
167
|
-
}
|
|
168
|
-
for (const filePath of collectFiles(generatedPagesRoot)) {
|
|
169
|
-
if (expectedFiles.has(filePath)) {
|
|
170
|
-
continue;
|
|
171
|
-
}
|
|
172
|
-
fs.rmSync(filePath, { force: true });
|
|
173
|
-
}
|
|
174
|
-
removeEmptyDirectories(generatedPagesRoot, generatedPagesRoot);
|
|
175
|
-
};
|
|
176
|
-
var isDocsSourcePath = (filePath, rootDir) => {
|
|
177
|
-
const normalized = toPosix(filePath);
|
|
178
|
-
const docsRoot = toPosix(path.join(rootDir, "docs"));
|
|
179
|
-
const docsConfigPath = toPosix(path.join(rootDir, "pages", "+docs.ts"));
|
|
180
|
-
const generatedRoot = toPosix(getGeneratedPagesRoot(rootDir));
|
|
181
|
-
if (normalized.startsWith(generatedRoot)) {
|
|
182
|
-
return false;
|
|
183
|
-
}
|
|
184
|
-
return normalized === docsConfigPath || normalized.startsWith(`${docsRoot}/`);
|
|
185
|
-
};
|
|
186
|
-
|
|
187
|
-
// src/runtime/plugin.ts
|
|
188
|
-
import fs3 from "fs";
|
|
189
|
-
import path3 from "path";
|
|
190
|
-
|
|
191
|
-
// src/runtime/publicAssets.ts
|
|
192
|
-
import fs2 from "fs";
|
|
193
|
-
import path2 from "path";
|
|
194
|
-
import { fileURLToPath, pathToFileURL } from "url";
|
|
195
|
-
var toPosix2 = (value) => value.split(path2.sep).join(path2.posix.sep);
|
|
196
|
-
var getRequestPathname = (requestUrl) => {
|
|
197
|
-
return requestUrl?.split("?")[0]?.split("#")[0] ?? "";
|
|
198
|
-
};
|
|
199
|
-
var normalizeNivelAssetPathname = (pathname) => {
|
|
200
|
-
if (pathname === nivelPublicRoute) {
|
|
201
|
-
return pathname;
|
|
202
|
-
}
|
|
203
|
-
if (!pathname.startsWith(`${nivelPublicRoute}/`)) {
|
|
204
|
-
return null;
|
|
205
|
-
}
|
|
206
|
-
const trimmedPathname = pathname.replace(/\/+$/g, "");
|
|
207
|
-
if (trimmedPathname !== pathname && path2.extname(trimmedPathname)) {
|
|
208
|
-
return trimmedPathname;
|
|
209
|
-
}
|
|
210
|
-
return pathname;
|
|
211
|
-
};
|
|
212
|
-
var getPublicAssetsRootCandidates = (runtimeDir) => {
|
|
213
|
-
let packageRoot = null;
|
|
214
|
-
try {
|
|
215
|
-
const nivelConfigUrl = import.meta.resolve("@unterberg/nivel/config");
|
|
216
|
-
const nivelConfigPath = fileURLToPath(nivelConfigUrl);
|
|
217
|
-
packageRoot = path2.resolve(path2.dirname(nivelConfigPath), "..");
|
|
218
|
-
} catch {
|
|
219
|
-
packageRoot = null;
|
|
220
|
-
}
|
|
221
|
-
return [
|
|
222
|
-
...packageRoot ? [path2.join(packageRoot, "assets")] : [],
|
|
223
|
-
path2.resolve(runtimeDir, "../assets"),
|
|
224
|
-
path2.resolve(runtimeDir, "../../assets")
|
|
225
|
-
];
|
|
226
|
-
};
|
|
227
|
-
var getNivelPublicAssetsRoot = () => {
|
|
228
|
-
const runtimeUrl = import.meta.url.startsWith("/") ? pathToFileURL(import.meta.url).href : import.meta.url;
|
|
229
|
-
const runtimeDir = path2.dirname(fileURLToPath(runtimeUrl));
|
|
230
|
-
for (const candidate of getPublicAssetsRootCandidates(runtimeDir)) {
|
|
231
|
-
if (fs2.existsSync(candidate) && fs2.statSync(candidate).isDirectory()) {
|
|
232
|
-
return candidate;
|
|
233
|
-
}
|
|
234
|
-
}
|
|
235
|
-
throw new Error(`Unable to locate nivel public assets from ${runtimeDir}.`);
|
|
236
|
-
};
|
|
237
|
-
var getNivelPublicAssetFilePath = (requestUrl) => {
|
|
238
|
-
const pathname = normalizeNivelAssetPathname(getRequestPathname(requestUrl));
|
|
239
|
-
if (!pathname) {
|
|
240
|
-
return null;
|
|
241
|
-
}
|
|
242
|
-
const assetsRoot = getNivelPublicAssetsRoot();
|
|
243
|
-
const relativePath = pathname.replace(/^\/+/, "");
|
|
244
|
-
const filePath = path2.resolve(assetsRoot, relativePath);
|
|
245
|
-
const relativeToRoot = path2.relative(assetsRoot, filePath);
|
|
246
|
-
if (relativeToRoot.startsWith("..") || path2.isAbsolute(relativeToRoot) || !fs2.existsSync(filePath) || !fs2.statSync(filePath).isFile()) {
|
|
247
|
-
return null;
|
|
248
|
-
}
|
|
249
|
-
return filePath;
|
|
250
|
-
};
|
|
251
|
-
var getNivelPublicAssetContentType = (filePath) => {
|
|
252
|
-
switch (path2.extname(filePath)) {
|
|
253
|
-
case ".css":
|
|
254
|
-
return "text/css; charset=utf-8";
|
|
255
|
-
case ".svg":
|
|
256
|
-
return "image/svg+xml";
|
|
257
|
-
case ".png":
|
|
258
|
-
return "image/png";
|
|
259
|
-
case ".ico":
|
|
260
|
-
return "image/x-icon";
|
|
261
|
-
case ".woff2":
|
|
262
|
-
return "font/woff2";
|
|
263
|
-
default:
|
|
264
|
-
return "application/octet-stream";
|
|
265
|
-
}
|
|
266
|
-
};
|
|
267
|
-
var isNivelAssetRequestUrl = (requestUrl) => {
|
|
268
|
-
return normalizeNivelAssetPathname(getRequestPathname(requestUrl)) !== null;
|
|
269
|
-
};
|
|
270
|
-
var isNivelAssetPath = (filePath) => {
|
|
271
|
-
const normalizedFilePath = toPosix2(path2.resolve(filePath));
|
|
272
|
-
const assetsRoot = toPosix2(getNivelPublicAssetsRoot());
|
|
273
|
-
return normalizedFilePath.startsWith(`${assetsRoot}/`);
|
|
274
|
-
};
|
|
275
|
-
|
|
276
|
-
// src/runtime/plugin.ts
|
|
277
|
-
var loadDocsConfig = async (server, rootDir) => {
|
|
278
|
-
const modulePath = path3.join(rootDir, "pages", "+docs.ts");
|
|
279
|
-
const loaded = await server.ssrLoadModule(modulePath);
|
|
280
|
-
const docsConfig = loaded.default;
|
|
281
|
-
if (!docsConfig) {
|
|
282
|
-
throw new Error(`Expected default export from ${modulePath}`);
|
|
283
|
-
}
|
|
284
|
-
return docsConfig;
|
|
285
|
-
};
|
|
286
|
-
var syncAndRestart = async (server, rootDir) => {
|
|
287
|
-
const docsConfig = await loadDocsConfig(server, rootDir);
|
|
288
|
-
syncGeneratedDocsPages({ rootDir, docsConfig });
|
|
289
|
-
await server.restart();
|
|
290
|
-
};
|
|
291
|
-
var nivelPagesPlugin = () => {
|
|
292
|
-
return {
|
|
293
|
-
name: "nivel-pages-plugin",
|
|
294
|
-
enforce: "pre",
|
|
295
|
-
configureServer(server) {
|
|
296
|
-
const rootDir = server.config.root;
|
|
297
|
-
const assetsRoot = getNivelPublicAssetsRoot();
|
|
298
|
-
server.watcher.add(assetsRoot);
|
|
299
|
-
const onChange = async (filePath) => {
|
|
300
|
-
if (!isDocsSourcePath(filePath, rootDir)) {
|
|
301
|
-
return;
|
|
302
|
-
}
|
|
303
|
-
await syncAndRestart(server, rootDir);
|
|
304
|
-
};
|
|
305
|
-
server.watcher.on("add", onChange);
|
|
306
|
-
server.watcher.on("change", onChange);
|
|
307
|
-
server.watcher.on("unlink", onChange);
|
|
308
|
-
server.watcher.on("change", (filePath) => {
|
|
309
|
-
if (!isNivelAssetPath(filePath)) {
|
|
310
|
-
return;
|
|
311
|
-
}
|
|
312
|
-
server.ws.send({ type: "full-reload" });
|
|
313
|
-
});
|
|
314
|
-
server.middlewares.use((req, res, next) => {
|
|
315
|
-
const filePath = getNivelPublicAssetFilePath(req.url);
|
|
316
|
-
if (filePath) {
|
|
317
|
-
res.setHeader("Content-Type", getNivelPublicAssetContentType(filePath));
|
|
318
|
-
res.setHeader("Cache-Control", "no-store");
|
|
319
|
-
res.end(fs3.readFileSync(filePath));
|
|
320
|
-
return;
|
|
321
|
-
}
|
|
322
|
-
if (isNivelAssetRequestUrl(req.url)) {
|
|
323
|
-
res.statusCode = 404;
|
|
324
|
-
res.setHeader("Cache-Control", "no-store");
|
|
325
|
-
res.end();
|
|
326
|
-
return;
|
|
327
|
-
}
|
|
328
|
-
next();
|
|
329
|
-
});
|
|
330
|
-
},
|
|
331
|
-
handleHotUpdate(ctx) {
|
|
332
|
-
if (isNivelAssetPath(ctx.file)) {
|
|
333
|
-
ctx.server.ws.send({ type: "full-reload" });
|
|
334
|
-
return [];
|
|
335
|
-
}
|
|
336
|
-
if (!isDocsSourcePath(ctx.file, ctx.server.config.root)) {
|
|
337
|
-
return;
|
|
338
|
-
}
|
|
339
|
-
ctx.server.ws.send({ type: "full-reload" });
|
|
340
|
-
return [];
|
|
341
|
-
}
|
|
342
|
-
};
|
|
343
|
-
};
|
|
344
|
-
|
|
345
|
-
export {
|
|
346
|
-
getGeneratedPagesRoot,
|
|
347
|
-
syncGeneratedDocsPages,
|
|
348
|
-
nivelPagesPlugin
|
|
349
|
-
};
|
|
350
|
-
//# sourceMappingURL=chunk-PHHK2BAF.js.map
|