@lonik/prestige 0.3.2 → 0.3.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/dist/ui.js +6 -5
- package/dist/ui.js.map +1 -1
- package/dist/vite.js +13 -1
- package/dist/vite.js.map +1 -1
- package/package.json +1 -1
- package/src/themes/core.css +388 -56
package/dist/ui.js
CHANGED
|
@@ -95,15 +95,16 @@ function Aside({ type = "note", title, children, className, ...props }) {
|
|
|
95
95
|
|
|
96
96
|
//#endregion
|
|
97
97
|
//#region src/ui/components/code/code.tsx
|
|
98
|
-
function Code({ code, language = "
|
|
98
|
+
function Code({ code, language = "tsx" }) {
|
|
99
99
|
return /* @__PURE__ */ jsx(Highlight, {
|
|
100
100
|
code,
|
|
101
|
-
language
|
|
102
|
-
children: ({
|
|
101
|
+
language,
|
|
102
|
+
children: ({ style, tokens, getLineProps, getTokenProps }) => /* @__PURE__ */ jsx("pre", {
|
|
103
|
+
className: "not-prose",
|
|
103
104
|
style,
|
|
104
|
-
children: tokens.map((line, i) => /* @__PURE__ */
|
|
105
|
+
children: tokens.map((line, i) => /* @__PURE__ */ jsx("div", {
|
|
105
106
|
...getLineProps({ line }),
|
|
106
|
-
children:
|
|
107
|
+
children: line.map((token, key) => /* @__PURE__ */ jsx("span", { ...getTokenProps({ token }) }, key))
|
|
107
108
|
}, i))
|
|
108
109
|
})
|
|
109
110
|
});
|
package/dist/ui.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ui.js","names":["typeMap: Record<AsideType, string>","defaultTitles: Record<AsideType, string>","TabsPrimitive","MANAGERS: PackageManager[]","parts: string[]","currentTheme: ThemeValue","metas: Array<\n { name: string; content: string } | { title: string }\n >"],"sources":["../src/ui/components/aside/aside.tsx","../src/ui/components/code/code.tsx","../src/ui/components/tabs/tabs.tsx","../src/ui/components/package-managers/package-managers.tsx","../src/ui/core/github/github.tsx","../src/ui/core/search/search.tsx","../src/ui/core/theme/theme.tsx","../src/ui/core/header/header.tsx","../src/ui/routes/content/table-of-contents/use-table-of-contents.ts","../src/ui/routes/content/table-of-contents/mobile-table-of-contents.tsx","../src/ui/routes/content/table-of-contents/web-table-of-contents.tsx","../src/ui/core/prestige-page.tsx","../src/ui/routes/content/content-navigations.tsx","../src/ui/utils.ts","../src/ui/routes/collection/sidebar.tsx","../src/ui/routes/collection/mobile-sidebar.tsx","../src/ui/routes/collection/collection.route.tsx","../src/ui/routes/content/content.route.tsx","../src/ui/routes/not-found.tsx","../src/ui/core/footer/footer.tsx","../src/ui/routes/prestige-shell.tsx"],"sourcesContent":["import React from \"react\";\n\nexport type AsideType = \"note\" | \"tip\" | \"caution\" | \"danger\";\n\nexport interface AsideProps extends Omit<React.HTMLAttributes<HTMLElement>, \"title\"> {\n type?: AsideType;\n title?: React.ReactNode;\n children: React.ReactNode;\n}\n\nconst typeMap: Record<AsideType, string> = {\n note: \"bg-blue-50/50 dark:bg-blue-900/20 border-blue-500 text-blue-900 dark:text-blue-200\",\n tip: \"bg-purple-50/50 dark:bg-purple-900/20 border-purple-500 text-purple-900 dark:text-purple-200\",\n caution:\n \"bg-yellow-50/50 dark:bg-yellow-900/20 border-yellow-500 text-yellow-900 dark:text-yellow-200\",\n danger:\n \"bg-red-50/50 dark:bg-red-900/20 border-red-500 text-red-900 dark:text-red-200\",\n};\n\nconst defaultTitles: Record<AsideType, string> = {\n note: \"Note\",\n tip: \"Tip\",\n caution: \"Caution\",\n danger: \"Danger\",\n};\n\nexport function Aside({\n type = \"note\",\n title,\n children,\n className,\n ...props\n}: AsideProps) {\n const iconProps = {\n className: \"w-5 h-5 flex-shrink-0\",\n xmlns: \"http://www.w3.org/2000/svg\",\n width: \"24\",\n height: \"24\",\n viewBox: \"0 0 24 24\",\n fill: \"none\",\n stroke: \"currentColor\",\n strokeWidth: \"2\",\n strokeLinecap: \"round\" as const,\n strokeLinejoin: \"round\" as const,\n };\n\n const Icon = () => {\n switch (type) {\n case \"note\":\n return (\n <svg {...iconProps}>\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <path d=\"M12 16v-4\" />\n <path d=\"M12 8h.01\" />\n </svg>\n );\n case \"tip\":\n return (\n <svg {...iconProps}>\n <path d=\"M4.5 16.5c-1.5 1.26-2 5-2 5s3.74-.5 5-2c.71-.84.7-2.13-.09-2.91a2.18 2.18 0 0 0-2.91-.09z\" />\n <path d=\"m12 15-3-3a22 22 0 0 1 2-3.95A12.88 12.88 0 0 1 22 2c0 2.72-.78 7.5-6 11a22.35 22.35 0 0 1-4 2z\" />\n <path d=\"M9 12H4s.55-3.03 2-4c1.62-1.08 5 0 5 0\" />\n <path d=\"M12 15v5s3.03-.55 4-2c1.08-1.62 0-5 0-5\" />\n </svg>\n );\n case \"caution\":\n return (\n <svg {...iconProps}>\n <path d=\"m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3Z\" />\n <path d=\"M12 9v4\" />\n <path d=\"M12 17h.01\" />\n </svg>\n );\n case \"danger\":\n return (\n <svg {...iconProps}>\n <polygon points=\"7.86 2 16.14 2 22 7.86 22 16.14 16.14 22 7.86 22 2 16.14 2 7.86 7.86 2\" />\n <path d=\"M12 8v4\" />\n <path d=\"M12 16h.01\" />\n </svg>\n );\n default:\n return null;\n }\n };\n\n return (\n <aside\n aria-label={defaultTitles[type]}\n className={`relative my-6 px-4 py-3 border-l-4 rounded-lg ${typeMap[type]} ${className || \"\"}`}\n {...props}\n >\n <p className=\"flex items-center gap-2 mb-2 mt-0 font-bold text-lg\">\n <span>\n <Icon />\n </span>\n {title || defaultTitles[type]}\n </p>\n <section className=\"[&>p]:mt-0 [&>p]:mb-2 [&>p:last-child]:mb-0 text-sm\">\n {children}\n </section>\n </aside>\n );\n}\n","import { Highlight } from \"prism-react-renderer\";\n\nexport interface CodeProps {\n code: string;\n language?: string;\n}\n\nexport function Code({ code, language = \"html\" }: CodeProps) {\n // Use a fragment or div, but ensure `render` actually exists before injecting\n return (\n <Highlight code={code} language=\"tsx\">\n {({ className, style, tokens, getLineProps, getTokenProps }) => (\n <pre style={style}>\n {tokens.map((line, i) => (\n <div key={i} {...getLineProps({ line })}>\n <span>{i + 1}</span>\n {line.map((token, key) => (\n <span key={key} {...getTokenProps({ token })} />\n ))}\n </div>\n ))}\n </pre>\n )}\n </Highlight>\n );\n}\n","import { Tabs as TabsPrimitive } from \"@base-ui/react/tabs\";\n\nfunction Tabs({\n orientation = \"horizontal\",\n className,\n ...props\n}: TabsPrimitive.Root.Props) {\n return (\n <TabsPrimitive.Root\n data-slot=\"tabs\"\n data-orientation={orientation}\n className={`w-full ${className || \"\"}`}\n {...props}\n />\n );\n}\n\nfunction TabsList({ className, ...props }: TabsPrimitive.List.Props) {\n return (\n <TabsPrimitive.List\n data-slot=\"tabs-list\"\n className={`flex w-full overflow-x-auto border-b border-default-200 no-scrollbar ${\n className || \"\"\n }`}\n {...props}\n />\n );\n}\n\nfunction TabsTrigger({ className, ...props }: TabsPrimitive.Tab.Props) {\n return (\n <TabsPrimitive.Tab\n data-slot=\"tabs-trigger\"\n className={`\n -mb-px flex items-center justify-center whitespace-nowrap border-b-2 border-transparent \n px-4 py-2.5 text-sm font-medium transition-colors cursor-pointer\n text-default-600 hover:text-default-900 hover:border-default-300\n aria-selected:border-primary-500 aria-selected:text-primary-500 \n focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary-500 focus-visible:ring-offset-2\n disabled:pointer-events-none disabled:opacity-50\n ${className || \"\"}\n `}\n {...props}\n />\n );\n}\n\nfunction TabsContent({ className, ...props }: TabsPrimitive.Panel.Props) {\n return (\n <TabsPrimitive.Panel\n data-slot=\"tabs-content\"\n className={`mt-4 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary-500 focus-visible:ring-offset-2 ${\n className || \"\"\n }`}\n {...props}\n />\n );\n}\n\nexport { Tabs, TabsList, TabsTrigger, TabsContent };\n","import { Code } from \"../code/code\";\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from \"../tabs/tabs\"; // Adjust import path\n\ntype PackageManager = \"npm\" | \"pnpm\" | \"yarn\" | \"bun\";\ntype CommandType = \"add\" | \"create\" | \"exec\" | \"run\";\n\nexport interface PackageManagersProps {\n /** The name of the package (e.g., \"@lonik/themer\") */\n pkg?: string;\n /** The type of command to generate. Defaults to \"add\" */\n type?: CommandType;\n /** Whether this is a development dependency (-D) */\n dev?: boolean;\n /** Additional arguments to append to the command */\n args?: string;\n className?: string;\n}\n\nconst MANAGERS: PackageManager[] = [\"npm\", \"pnpm\", \"yarn\", \"bun\"];\n\nfunction generateCommand(\n pm: PackageManager,\n type: CommandType,\n pkg?: string,\n dev?: boolean,\n args?: string,\n) {\n const parts: string[] = [];\n\n switch (type) {\n case \"add\":\n parts.push(pm === \"npm\" ? \"npm install\" : `${pm} add`);\n if (dev) parts.push(\"-D\");\n if (pkg) parts.push(pkg);\n break;\n case \"create\":\n parts.push(`${pm} create`);\n if (pkg) parts.push(pkg);\n break;\n case \"exec\":\n if (pm === \"npm\") parts.push(\"npx\");\n else if (pm === \"bun\") parts.push(\"bun x\");\n else parts.push(`${pm} dlx`);\n if (pkg) parts.push(pkg);\n break;\n case \"run\":\n parts.push(pm === \"yarn\" ? \"yarn\" : `${pm} run`);\n if (pkg) parts.push(pkg);\n break;\n }\n\n if (args) {\n // If it's npm and we are passing args to an exec/run script, we often need '--'\n if (pm === \"npm\" && (type === \"exec\" || type === \"run\")) {\n parts.push(\"--\");\n }\n parts.push(args);\n }\n\n return parts.join(\" \");\n}\n\nexport function PackageManagers({\n pkg,\n type = \"add\",\n dev = false,\n args,\n className,\n}: PackageManagersProps) {\n return (\n <Tabs defaultValue=\"npm\" className={`my-6 ${className || \"\"}`}>\n <TabsList>\n {MANAGERS.map((pm) => (\n <TabsTrigger key={pm} value={pm}>\n {pm.toLowerCase()}\n </TabsTrigger>\n ))}\n </TabsList>\n\n {MANAGERS.map((pm) => {\n const command = generateCommand(pm, type, pkg, dev, args);\n\n return (\n <TabsContent keepMounted={true} key={pm} value={pm}>\n <Code code={command} language=\"bash\"></Code>\n </TabsContent>\n );\n })}\n </Tabs>\n );\n}\n","import { Github } from \"lucide-react\";\n\nexport function GitHub({ github }: { github: string | undefined }) {\n if (!github) {\n return null;\n }\n\n return (\n <a\n href={github}\n target=\"_blank\"\n rel=\"noreferrer\"\n aria-label=\"GitHub repository\"\n title=\"GitHub repository\"\n className=\"inline-flex h-8 w-8 items-center justify-center rounded border border-default-200 bg-default-50 text-default-500 hover:bg-default-100\"\n >\n <Github size={16} />\n </a>\n );\n}\n","import \"@docsearch/css\";\nimport { DocSearch } from \"@docsearch/react\";\nimport config from \"virtual:prestige/config\";\n\nexport function Search({\n algolia,\n}: {\n // 2. Add 'typeof' to extract the type from the value\n algolia: (typeof config)[\"algolia\"] | undefined;\n}) {\n if (!algolia) {\n return null;\n }\n\n return (\n <div className=\"prestige-search\">\n <DocSearch\n appId={algolia.appId}\n apiKey={algolia.apiKey}\n indices={algolia.indices}\n />\n </div>\n );\n}\n","import { useTheme } from \"@lonik/themer\";\nimport { useHydrated } from \"@tanstack/react-router\";\nimport { Moon, Sun, SunMoon } from \"lucide-react\";\n\nconst themeOrder = [\"system\", \"light\", \"dark\"] as const;\ntype ThemeValue = (typeof themeOrder)[number];\n\nexport function Theme() {\n const { theme, setTheme } = useTheme();\n const currentTheme: ThemeValue = (theme as ThemeValue) ?? \"system\";\n const hydrated = useHydrated();\n\n const nextTheme = (value: ThemeValue): ThemeValue => {\n const index = themeOrder.indexOf(value);\n return themeOrder[(index + 1) % themeOrder.length]!;\n };\n\n const icon =\n currentTheme === \"light\" ? (\n <Sun size={16} />\n ) : currentTheme === \"dark\" ? (\n <Moon size={16} />\n ) : (\n <SunMoon size={16} />\n );\n\n return (\n <button\n suppressHydrationWarning\n type=\"button\"\n aria-label={`Theme: ${currentTheme}. Click to switch theme`}\n title={`Theme: ${currentTheme}`}\n className=\"inline-flex h-8 w-8 items-center justify-center rounded-md border border-default-200 bg-default-50 text-default-500 hover:bg-default-100 cursor-pointer\"\n onClick={() => setTheme(nextTheme(currentTheme))}\n >\n {hydrated && icon}\n </button>\n );\n}\n","import { Link, useLocation } from \"@tanstack/react-router\";\nimport collections from \"virtual:prestige/collection-all\";\nimport config from \"virtual:prestige/config\";\nimport { PrestigeShellProps } from \"../../routes/prestige-shell\";\nimport { GitHub } from \"../github/github\";\nimport { Search } from \"../search/search\";\nimport { Theme } from \"../theme/theme\";\n\nexport type HeaderProps = Pick<PrestigeShellProps, \"customHeaderTitle\">;\n\nexport default function Header({ customHeaderTitle }: HeaderProps) {\n const location = useLocation();\n\n return (\n <header className=\"sticky top-0 z-40 flex h-header border-b border-default-200 bg-default-50/80 px-4 backdrop-blur-md\">\n <div className=\"container mx-auto flex max-w-360 items-center justify-between\">\n <div className=\"flex gap-4 items-baseline\">\n <Link\n className=\"text-sm rounded hover:bg-default-100 text-default-500\"\n to={\"/\"}\n >\n {customHeaderTitle ? (\n customHeaderTitle()\n ) : (\n <span>{config.title}</span>\n )}\n </Link>\n {collections.map((collection) => {\n const isActive =\n location.pathname === `/${collection.id}` ||\n location.pathname.startsWith(`/${collection.id}/`);\n\n return (\n <Link\n key={collection.id}\n to={`/${collection.defaultLink}` as any}\n className={`border-b-2 text-sm rounded hover:bg-default-100 active:bg-default-200 capitalize ${\n isActive\n ? \"border-default-800 text-default-800 font-medium\"\n : \"border-b-transparent text-default-500\"\n }`}\n >\n {collection.label}\n </Link>\n );\n })}\n </div>\n <div className=\"flex items-center gap-2\">\n <Search algolia={config.algolia} />\n <GitHub github={config.github} />\n <Theme />\n </div>\n </div>\n </header>\n );\n}\n","import { useEffect, useState } from \"react\";\nimport { TocItem } from \"remark-flexible-toc\";\n\nexport function useTableOfContents(toc: TocItem[]) {\n const [activeId, setActiveId] = useState<string>(\"\");\n\n useEffect(() => {\n if (toc.length === 0) return;\n\n const handleScroll = () => {\n const headingElements = toc\n .map((item) => {\n const id = item.href.startsWith(\"#\") ? item.href.slice(1) : item.href;\n return document.getElementById(id);\n })\n .filter((el): el is HTMLElement => el !== null);\n\n // Add a slight offset to account for sticky headers or top padding\n const scrollPosition = window.scrollY + 100;\n\n let currentActiveId = \"\";\n for (let i = headingElements.length - 1; i >= 0; i--) {\n const element = headingElements[i];\n if (element && element.offsetTop <= scrollPosition) {\n currentActiveId = element.id;\n break;\n }\n }\n\n // If we haven't scrolled past the first heading, highlight the first one\n if (!currentActiveId && headingElements.length > 0 && headingElements[0]) {\n currentActiveId = headingElements[0].id;\n }\n\n setActiveId(currentActiveId ? `#${currentActiveId}` : \"\");\n };\n\n window.addEventListener(\"scroll\", handleScroll, { passive: true });\n // setTimeout to ensure DOM is fully rendered when checking initial offsets\n setTimeout(handleScroll, 100);\n\n return () => window.removeEventListener(\"scroll\", handleScroll);\n }, [toc]);\n\n const handleLinkClick = (e: React.MouseEvent<HTMLAnchorElement>, href: string) => {\n e.preventDefault();\n const id = href.startsWith(\"#\") ? href.slice(1) : href;\n const element = document.getElementById(id);\n if (element) {\n element.scrollIntoView({ behavior: \"smooth\" });\n // Update URL hash without jumping\n window.history.pushState(null, \"\", href.startsWith(\"#\") ? href : `#${href}`);\n }\n };\n\n return { activeId, handleLinkClick };\n}\n","import clsx from \"clsx\";\nimport { ChevronRight } from \"lucide-react\";\nimport { useEffect, useRef, useState } from \"react\";\nimport { TocItem } from \"remark-flexible-toc\";\nimport { useTableOfContents } from \"./use-table-of-contents\";\n\nexport function MobileTableOfContent({ toc }: { toc: TocItem[] }) {\n const [isOpen, setIsOpen] = useState(false);\n const { activeId, handleLinkClick } = useTableOfContents(toc);\n const containerRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n function handleClickOutside(event: MouseEvent) {\n if (\n containerRef.current &&\n !containerRef.current.contains(event.target as Node)\n ) {\n setIsOpen(false);\n }\n }\n document.addEventListener(\"mousedown\", handleClickOutside);\n return () => {\n document.removeEventListener(\"mousedown\", handleClickOutside);\n };\n }, []);\n\n if (toc.length === 0) {\n return null;\n }\n\n const activeItem = toc.find((item) => {\n const itemHref = item.href.startsWith(\"#\") ? item.href : `#${item.href}`;\n return itemHref === activeId;\n });\n\n /* pl-12 is needed for mobile sidebar, because sidebar button is fixed position */\n return (\n <div\n ref={containerRef}\n className=\"sticky top-header z-30 -mx-6 -mt-10 mb-8 bg-default-50/95 backdrop-blur border-b border-default-200 dark:border-default-800 lg:hidden px-6 pl-12\"\n >\n <div className=\"relative\">\n <button\n onClick={() => setIsOpen((prev) => !prev)}\n className=\"flex w-full items-center justify-between gap-4 px-6 py-3 text-sm text-default-500 font-medium cursor-pointer\"\n >\n <div className=\"flex items-center gap-2\">\n <span>On this page</span>\n <ChevronRight\n className={clsx(\n \"w-4 h-4 transition-transform duration-200\",\n isOpen && \"rotate-90\",\n )}\n />\n </div>\n {activeItem && (\n <span className=\"truncate font-normal max-w-[50%] text-right\">\n {activeItem.value}\n </span>\n )}\n </button>\n\n {isOpen && (\n <div className=\"absolute left-6 right-6 top-full mt-2 max-h-[60vh] overflow-y-auto rounded-lg border border-default-200 bg-background shadow-xl\">\n <ul className=\"p-4 space-y-2.5 text-sm\">\n {toc.map((item) => {\n const itemHref = item.href.startsWith(\"#\")\n ? item.href\n : `#${item.href}`;\n const isActive = activeId === itemHref;\n return (\n <li\n key={itemHref}\n style={{ paddingLeft: `${(item.depth - 1) * 0.75}rem` }}\n >\n <a\n href={itemHref}\n className={clsx(\n \"block transition-colors duration-200 line-clamp-2\",\n isActive\n ? \"text-primary-600 font-medium\"\n : \"text-default-600\",\n )}\n onClick={(e) => {\n handleLinkClick(e, item.href);\n setIsOpen(false);\n }}\n >\n {item.value}\n </a>\n </li>\n );\n })}\n </ul>\n </div>\n )}\n </div>\n </div>\n );\n}\n","import clsx from \"clsx\";\nimport { TocItem } from \"remark-flexible-toc\";\nimport { useTableOfContents } from \"./use-table-of-contents\";\n\nexport function WebTableOfContent({ toc }: { toc: TocItem[] }) {\n const { activeId, handleLinkClick } = useTableOfContents(toc);\n\n return (\n <nav className=\"sticky top-header pt-4 overflow-y-auto w-web-table-of-content hidden lg:block\">\n <span className=\"text-xs font-mono tracking-widest\">ON THIS PAGE</span>\n <ul className=\"text-sm my-4\">\n {toc.map((item) => (\n <li\n key={item.href}\n // style={{ paddingLeft: `${(item.depth - 1) * 0.75}rem` }}\n >\n <a\n href={`${item.href}`}\n className={clsx(\n \"border-l py-1 px-4 block hover:text-default-700 dark:hover:text-slate-100 transition-colors duration-200 line-clamp-2\",\n activeId === item.href\n ? \"text-default-700 border-default-600 font-medium\"\n : \"text-default-500 border-default-200 \",\n )}\n onClick={(e) => handleLinkClick(e, item.href)}\n >\n {item.value}\n </a>\n </li>\n ))}\n </ul>\n </nav>\n );\n}\n","import React from \"react\";\nimport { TocItem } from \"remark-flexible-toc\";\nimport { MobileTableOfContent } from \"../routes/content/table-of-contents/mobile-table-of-contents\";\nimport { WebTableOfContent } from \"../routes/content/table-of-contents/web-table-of-contents\";\n\nexport interface PrestigePageProps {\n children: React.ReactNode;\n toc?: TocItem[];\n}\n\nexport function PrestigePage({ children, toc = [] }: PrestigePageProps) {\n return (\n <div className=\"flex lg:gap-6 items-start max-w-[100vw]\">\n <div className=\"flex-1 min-w-0\">\n <MobileTableOfContent toc={toc} />\n <article className=\"prose wrap-break-word py-15 px-6 max-w-none lg:w-web-content\">\n {children}\n </article>\n </div>\n <WebTableOfContent toc={toc} />\n </div>\n );\n}\n","import { Link } from \"@tanstack/react-router\";\nimport clsx from \"clsx\";\nimport { ArrowLeft, ArrowRight } from \"lucide-react\";\nimport { SiblingNavigationType } from \"../../../vite/core/content/content.types\";\n\nfunction ContentNavigation({\n isNext,\n navigation,\n}: {\n isNext?: boolean;\n navigation: SiblingNavigationType;\n}) {\n const label = isNext ? \"Next\" : \"Previous\";\n return (\n <Link\n to={navigation.link}\n className={clsx(\n \" flex-1 h-20 mb-4 border border-default-200 hover:bg-default-50 rounded-md cursor-pointer flex items-center px-4\",\n isNext ? \"justify-end\" : \"justify-start\",\n )}\n >\n <div\n className={clsx(\n \"flex items-center gap-4\",\n isNext && \"flex-row-reverse\",\n )}\n >\n {isNext ? (\n <ArrowRight className=\"text-default-400\" />\n ) : (\n <ArrowLeft className=\"text-default-400\" />\n )}\n <div className={clsx(\"flex flex-col\", isNext && \"items-end\")}>\n <span className=\"text-xs tracking-widest font-mono\">\n {label.toLocaleUpperCase()}\n </span>\n <span className=\"text-2xl font-li text-default-700\">\n {navigation.label}\n </span>\n </div>\n </div>\n </Link>\n );\n}\n\nexport default function ContentNavigations({\n prev,\n next,\n}: {\n prev: SiblingNavigationType | null | undefined;\n next: SiblingNavigationType | null | undefined;\n}) {\n if (!prev && !next) return null;\n // width of content navigation must match with content route content width, so we manually\n // add empty div with table-of-content width and add proper gap to match the size\n return (\n <div className=\"flex gap-6\">\n <div className=\"lg:flex flex-row items-center gap-2 mt-2 lg:mt-8 lg:w-web-content w-full\">\n {prev && <ContentNavigation navigation={prev} />}\n {next && <ContentNavigation navigation={next} isNext />}\n </div>\n <div className=\"lg:w-web-table-of-content h-1\"></div>\n </div>\n );\n}\n","export function isExternalURL(str: string) {\n try {\n const url = new URL(str);\n // This ensures it starts with http or https, filtering out\n // things like 'javascript:alert(1)' or 'mailto:test@test.com'\n return url.protocol === \"http:\" || url.protocol === \"https:\";\n } catch {\n return false;\n }\n}\n","import { Link } from \"@tanstack/react-router\";\nimport clsx from \"clsx\";\nimport { BookOpen, ChevronRight, ExternalLink } from \"lucide-react\";\nimport { useState } from \"react\";\nimport {\n ExternalSidebarLinkType,\n InternalSidebarLinkType,\n SidebarGroupType,\n SidebarType,\n} from \"../../../vite/core/content/content.types\";\nimport { isExternalURL } from \"../../utils\";\n\nexport interface SidebarProps {\n sidebar: SidebarType;\n onLinkClick?: (() => void) | undefined;\n}\n\nfunction SidebarGroup({\n group,\n onLinkClick,\n}: {\n group: SidebarGroupType;\n onLinkClick?: (() => void) | undefined;\n}) {\n const [open, setIsOpen] = useState(true);\n return (\n <div className=\"mt-4 flex flex-col gap-1\">\n <button\n className=\"flex items-center w-full gap-2\"\n onClick={() => setIsOpen((prev) => !prev)}\n >\n <ChevronRight\n size={18}\n className={clsx(\n \"transform transition cursor-pointer ml-1\",\n open && \"rotate-90\",\n )}\n />\n <span className=\"font-mono text-xs tracking-widest\">\n {group.label.toUpperCase()}\n </span>\n </button>\n {open && (\n <div className=\"mb-2\">\n {group.items.map((item) => {\n if (\"slug\" in item || \"link\" in item) {\n const key = \"slug\" in item ? item.slug : item.link;\n return (\n <SidebarLink showIcon={false} key={key} link={item} onLinkClick={onLinkClick} />\n );\n }\n return <SidebarGroup key={item.label} group={item} />;\n })}\n </div>\n )}\n </div>\n );\n}\n\nfunction SidebarLink({\n link,\n onLinkClick,\n showIcon,\n}: {\n link: InternalSidebarLinkType | ExternalSidebarLinkType;\n onLinkClick?: (() => void) | undefined;\n showIcon: boolean;\n}) {\n if (\"slug\" in link || !isExternalURL(link.link)) {\n const slug = \"slug\" in link ? `/${link.slug}` : link.link;\n return (\n <div className=\"flex items-center \">\n <Link\n onClick={onLinkClick}\n activeProps={{ className: \"text-default-700 font-medium\" }}\n className=\"w-full inline-flex gap-2 py-1 px-2 rounded hover:bg-default-100 text-sm mr-2 items-center text-default-500\"\n to={slug}\n >\n {showIcon && <BookOpen className=\"w-4\" />}\n {link.label}\n </Link>\n </div>\n );\n } else {\n return (\n <div className=\"flex items-center \">\n <a\n onClick={onLinkClick}\n className=\"w-full inline-flex gap-2 py-1 px-2 rounded hover:bg-default-100 text-sm mr-2 items-center text-default-500\"\n href={link.link}\n target=\"_blank\"\n rel=\"noreferrer\"\n >\n {showIcon && <ExternalLink className=\"w-4\" />}\n {link.label}\n </a>\n </div>\n );\n }\n}\n\nexport default function Sidebar({ sidebar, onLinkClick }: SidebarProps) {\n return (\n <div className=\"w-full lg:w-sidebar border-r border-default-200 h-full overflow-auto lg:h-main lg:sticky top-header pt-4\">\n {sidebar.items.map((item) => {\n if (\"slug\" in item || \"link\" in item) {\n const key = \"slug\" in item ? item.slug : item.link;\n return (\n <SidebarLink showIcon={true} onLinkClick={onLinkClick} key={key} link={item} />\n );\n }\n return <SidebarGroup key={item.label} group={item} />;\n })}\n </div>\n );\n}\n","import { Menu, X } from \"lucide-react\";\nimport { useState } from \"react\";\nimport { SidebarType } from \"../../../vite/core/content/content.types\";\nimport Sidebar from \"./sidebar\";\n\nfunction SidebarOverlay({ sidebar }: { sidebar: SidebarType }) {\n const [isOpen, setIsOpen] = useState(false);\n return (\n <div className=\"lg:hidden\">\n {/* Mobile sidebar button is placed on the start of mobile of content tab, we have to position is via fixed because table of content lives inside content.route */}\n <button\n className=\"bg-transparent p-3 -mt-[2px] text-default-700 top-header left-0 fixed z-50\"\n onClick={() => setIsOpen((prev) => !prev)}\n >\n {isOpen ? <X /> : <Menu />}\n </button>\n {isOpen && (\n <div className=\"fixed top-[calc(var(--spacing-header)+44 )] shadow-xl left-0 overflow-auto z-10 bg-default-50 w-full h-screen\">\n <Sidebar onLinkClick={() => setIsOpen(false)} sidebar={sidebar} />\n </div>\n )}\n </div>\n );\n}\n\nexport default function MobileSidebar({ sidebar }: { sidebar: SidebarType }) {\n return <SidebarOverlay sidebar={sidebar} />;\n}\n","import { Outlet, useLocation } from \"@tanstack/react-router\";\nimport { SidebarType } from \"../../../vite/core/content/content.types\";\nimport ContentNavigations from \"../content/content-navigations\";\nimport MobileSidebar from \"./mobile-sidebar\";\nimport Sidebar from \"./sidebar\";\n\nexport function CollectionRoute(sidebar: SidebarType, id: string) {\n return {\n component: () => {\n const location = useLocation();\n const navigation = sidebar?.navigation?.[location.pathname] || {\n prev: null,\n next: null,\n };\n const { prev, next } = navigation;\n\n return (\n <div className=\"mx-auto flex container lg:gap-6\">\n <MobileSidebar sidebar={sidebar} />\n <div className=\"hidden lg:block\">\n {sidebar && <Sidebar sidebar={sidebar} />}\n </div>\n <div className=\"flex-1 pb-20\">\n <Outlet />\n <div className=\"mt-8 px-6 lg:px-0\">\n <ContentNavigations prev={prev} next={next} />\n </div>\n </div>\n </div>\n );\n },\n };\n}\n","import { FunctionComponent } from \"react\";\nimport { TocItem } from \"remark-flexible-toc\";\nimport config from \"virtual:prestige/config\";\nimport {\n ContentFrontmatterType,\n SiblingNavigationType,\n} from \"../../../vite/core/content/content.types\";\nimport { PrestigePage } from \"../../core/prestige-page\";\nexport function ContentRoute(inlineData: any): any {\n const {\n frontmatter,\n toc,\n default: Component,\n } = inlineData as {\n prev: SiblingNavigationType | null;\n next: SiblingNavigationType | null;\n toc: TocItem[];\n default: FunctionComponent;\n frontmatter: ContentFrontmatterType;\n };\n return {\n head: () => {\n const metas: Array<\n { name: string; content: string } | { title: string }\n > = [];\n const description = frontmatter.description;\n const title = frontmatter.title;\n\n if (title) {\n metas.push({\n title: title + \" | \" + config.title,\n });\n }\n\n if (description) {\n metas.push({\n name: \"description\",\n content: description,\n });\n }\n\n return {\n meta: metas,\n };\n },\n component: () => {\n return (\n <PrestigePage toc={toc}>\n <Component />\n </PrestigePage>\n );\n },\n };\n}\n","export default function NotFound() {\n return <h1>This page could not be found.</h1>;\n}\n","import config from \"virtual:prestige/config\";\nimport { PrestigeShellProps } from \"../../routes/prestige-shell\";\n\nfunction License() {\n if (!config.license) {\n return null;\n }\n return (\n <a target=\"_blank\" href={config.license.url}>\n Released under: {config.license.label}\n </a>\n );\n}\n\nfunction Copyright({ copyright }: Pick<PrestigeShellProps, \"copyright\">) {\n if (!copyright) {\n return null;\n }\n return copyright();\n}\n\nexport default function Footer({\n copyright,\n}: Pick<PrestigeShellProps, \"copyright\">) {\n return (\n <footer className=\"mt-10 flex items-center justify-center flex-col gap-2 px-4 border-t border-t-default-100 pt-10 bg-default-50 text-sm py-10 text-default-700\">\n <License />\n <Copyright copyright={copyright} />\n </footer>\n );\n}\n","import { ThemeProvider } from \"@lonik/themer\";\nimport { ReactNode } from \"react\";\nimport Footer from \"../core/footer/footer\";\nimport Header from \"../core/header/header\";\n\ntype RenderNode = () => ReactNode;\n\nexport interface PrestigeShellProps {\n customHeaderTitle?: RenderNode | undefined;\n copyright?: RenderNode | undefined;\n}\nexport function PrestigeShell({\n children,\n options,\n}: {\n children: ReactNode;\n options?: PrestigeShellProps;\n}) {\n return (\n <ThemeProvider attribute=\"data-theme\" defaultTheme=\"system\">\n <Header customHeaderTitle={options?.customHeaderTitle} {...options} />\n <main className=\"min-h-[calc(100vh-var(--spacing-header))]\">\n {children}\n </main>\n <Footer copyright={options?.copyright} />\n </ThemeProvider>\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ui.js","names":["typeMap: Record<AsideType, string>","defaultTitles: Record<AsideType, string>","TabsPrimitive","MANAGERS: PackageManager[]","parts: string[]","currentTheme: ThemeValue","metas: Array<\n { name: string; content: string } | { title: string }\n >"],"sources":["../src/ui/components/aside/aside.tsx","../src/ui/components/code/code.tsx","../src/ui/components/tabs/tabs.tsx","../src/ui/components/package-managers/package-managers.tsx","../src/ui/core/github/github.tsx","../src/ui/core/search/search.tsx","../src/ui/core/theme/theme.tsx","../src/ui/core/header/header.tsx","../src/ui/routes/content/table-of-contents/use-table-of-contents.ts","../src/ui/routes/content/table-of-contents/mobile-table-of-contents.tsx","../src/ui/routes/content/table-of-contents/web-table-of-contents.tsx","../src/ui/core/prestige-page.tsx","../src/ui/routes/content/content-navigations.tsx","../src/ui/utils.ts","../src/ui/routes/collection/sidebar.tsx","../src/ui/routes/collection/mobile-sidebar.tsx","../src/ui/routes/collection/collection.route.tsx","../src/ui/routes/content/content.route.tsx","../src/ui/routes/not-found.tsx","../src/ui/core/footer/footer.tsx","../src/ui/routes/prestige-shell.tsx"],"sourcesContent":["import React from \"react\";\n\nexport type AsideType = \"note\" | \"tip\" | \"caution\" | \"danger\";\n\nexport interface AsideProps extends Omit<React.HTMLAttributes<HTMLElement>, \"title\"> {\n type?: AsideType;\n title?: React.ReactNode;\n children: React.ReactNode;\n}\n\nconst typeMap: Record<AsideType, string> = {\n note: \"bg-blue-50/50 dark:bg-blue-900/20 border-blue-500 text-blue-900 dark:text-blue-200\",\n tip: \"bg-purple-50/50 dark:bg-purple-900/20 border-purple-500 text-purple-900 dark:text-purple-200\",\n caution:\n \"bg-yellow-50/50 dark:bg-yellow-900/20 border-yellow-500 text-yellow-900 dark:text-yellow-200\",\n danger:\n \"bg-red-50/50 dark:bg-red-900/20 border-red-500 text-red-900 dark:text-red-200\",\n};\n\nconst defaultTitles: Record<AsideType, string> = {\n note: \"Note\",\n tip: \"Tip\",\n caution: \"Caution\",\n danger: \"Danger\",\n};\n\nexport function Aside({\n type = \"note\",\n title,\n children,\n className,\n ...props\n}: AsideProps) {\n const iconProps = {\n className: \"w-5 h-5 flex-shrink-0\",\n xmlns: \"http://www.w3.org/2000/svg\",\n width: \"24\",\n height: \"24\",\n viewBox: \"0 0 24 24\",\n fill: \"none\",\n stroke: \"currentColor\",\n strokeWidth: \"2\",\n strokeLinecap: \"round\" as const,\n strokeLinejoin: \"round\" as const,\n };\n\n const Icon = () => {\n switch (type) {\n case \"note\":\n return (\n <svg {...iconProps}>\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <path d=\"M12 16v-4\" />\n <path d=\"M12 8h.01\" />\n </svg>\n );\n case \"tip\":\n return (\n <svg {...iconProps}>\n <path d=\"M4.5 16.5c-1.5 1.26-2 5-2 5s3.74-.5 5-2c.71-.84.7-2.13-.09-2.91a2.18 2.18 0 0 0-2.91-.09z\" />\n <path d=\"m12 15-3-3a22 22 0 0 1 2-3.95A12.88 12.88 0 0 1 22 2c0 2.72-.78 7.5-6 11a22.35 22.35 0 0 1-4 2z\" />\n <path d=\"M9 12H4s.55-3.03 2-4c1.62-1.08 5 0 5 0\" />\n <path d=\"M12 15v5s3.03-.55 4-2c1.08-1.62 0-5 0-5\" />\n </svg>\n );\n case \"caution\":\n return (\n <svg {...iconProps}>\n <path d=\"m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3Z\" />\n <path d=\"M12 9v4\" />\n <path d=\"M12 17h.01\" />\n </svg>\n );\n case \"danger\":\n return (\n <svg {...iconProps}>\n <polygon points=\"7.86 2 16.14 2 22 7.86 22 16.14 16.14 22 7.86 22 2 16.14 2 7.86 7.86 2\" />\n <path d=\"M12 8v4\" />\n <path d=\"M12 16h.01\" />\n </svg>\n );\n default:\n return null;\n }\n };\n\n return (\n <aside\n aria-label={defaultTitles[type]}\n className={`relative my-6 px-4 py-3 border-l-4 rounded-lg ${typeMap[type]} ${className || \"\"}`}\n {...props}\n >\n <p className=\"flex items-center gap-2 mb-2 mt-0 font-bold text-lg\">\n <span>\n <Icon />\n </span>\n {title || defaultTitles[type]}\n </p>\n <section className=\"[&>p]:mt-0 [&>p]:mb-2 [&>p:last-child]:mb-0 text-sm\">\n {children}\n </section>\n </aside>\n );\n}\n","import { Highlight } from \"prism-react-renderer\";\n\nexport interface CodeProps {\n code: string;\n language?: string;\n}\n\nexport function Code({ code, language = \"tsx\" }: CodeProps) {\n // Use a fragment or div, but ensure `render` actually exists before injecting\n return (\n <Highlight code={code} language={language}>\n {({ style, tokens, getLineProps, getTokenProps }) => (\n <pre className=\"not-prose\" style={style}>\n {tokens.map((line, i) => (\n <div key={i} {...getLineProps({ line })}>\n {line.map((token, key) => (\n <span key={key} {...getTokenProps({ token })} />\n ))}\n </div>\n ))}\n </pre>\n )}\n </Highlight>\n );\n}\n","import { Tabs as TabsPrimitive } from \"@base-ui/react/tabs\";\n\nfunction Tabs({\n orientation = \"horizontal\",\n className,\n ...props\n}: TabsPrimitive.Root.Props) {\n return (\n <TabsPrimitive.Root\n data-slot=\"tabs\"\n data-orientation={orientation}\n className={`w-full ${className || \"\"}`}\n {...props}\n />\n );\n}\n\nfunction TabsList({ className, ...props }: TabsPrimitive.List.Props) {\n return (\n <TabsPrimitive.List\n data-slot=\"tabs-list\"\n className={`flex w-full overflow-x-auto border-b border-default-200 no-scrollbar ${\n className || \"\"\n }`}\n {...props}\n />\n );\n}\n\nfunction TabsTrigger({ className, ...props }: TabsPrimitive.Tab.Props) {\n return (\n <TabsPrimitive.Tab\n data-slot=\"tabs-trigger\"\n className={`\n -mb-px flex items-center justify-center whitespace-nowrap border-b-2 border-transparent \n px-4 py-2.5 text-sm font-medium transition-colors cursor-pointer\n text-default-600 hover:text-default-900 hover:border-default-300\n aria-selected:border-primary-500 aria-selected:text-primary-500 \n focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary-500 focus-visible:ring-offset-2\n disabled:pointer-events-none disabled:opacity-50\n ${className || \"\"}\n `}\n {...props}\n />\n );\n}\n\nfunction TabsContent({ className, ...props }: TabsPrimitive.Panel.Props) {\n return (\n <TabsPrimitive.Panel\n data-slot=\"tabs-content\"\n className={`mt-4 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary-500 focus-visible:ring-offset-2 ${\n className || \"\"\n }`}\n {...props}\n />\n );\n}\n\nexport { Tabs, TabsList, TabsTrigger, TabsContent };\n","import { Code } from \"../code/code\";\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from \"../tabs/tabs\"; // Adjust import path\n\ntype PackageManager = \"npm\" | \"pnpm\" | \"yarn\" | \"bun\";\ntype CommandType = \"add\" | \"create\" | \"exec\" | \"run\";\n\nexport interface PackageManagersProps {\n /** The name of the package (e.g., \"@lonik/themer\") */\n pkg?: string;\n /** The type of command to generate. Defaults to \"add\" */\n type?: CommandType;\n /** Whether this is a development dependency (-D) */\n dev?: boolean;\n /** Additional arguments to append to the command */\n args?: string;\n className?: string;\n}\n\nconst MANAGERS: PackageManager[] = [\"npm\", \"pnpm\", \"yarn\", \"bun\"];\n\nfunction generateCommand(\n pm: PackageManager,\n type: CommandType,\n pkg?: string,\n dev?: boolean,\n args?: string,\n) {\n const parts: string[] = [];\n\n switch (type) {\n case \"add\":\n parts.push(pm === \"npm\" ? \"npm install\" : `${pm} add`);\n if (dev) parts.push(\"-D\");\n if (pkg) parts.push(pkg);\n break;\n case \"create\":\n parts.push(`${pm} create`);\n if (pkg) parts.push(pkg);\n break;\n case \"exec\":\n if (pm === \"npm\") parts.push(\"npx\");\n else if (pm === \"bun\") parts.push(\"bun x\");\n else parts.push(`${pm} dlx`);\n if (pkg) parts.push(pkg);\n break;\n case \"run\":\n parts.push(pm === \"yarn\" ? \"yarn\" : `${pm} run`);\n if (pkg) parts.push(pkg);\n break;\n }\n\n if (args) {\n // If it's npm and we are passing args to an exec/run script, we often need '--'\n if (pm === \"npm\" && (type === \"exec\" || type === \"run\")) {\n parts.push(\"--\");\n }\n parts.push(args);\n }\n\n return parts.join(\" \");\n}\n\nexport function PackageManagers({\n pkg,\n type = \"add\",\n dev = false,\n args,\n className,\n}: PackageManagersProps) {\n return (\n <Tabs defaultValue=\"npm\" className={`my-6 ${className || \"\"}`}>\n <TabsList>\n {MANAGERS.map((pm) => (\n <TabsTrigger key={pm} value={pm}>\n {pm.toLowerCase()}\n </TabsTrigger>\n ))}\n </TabsList>\n\n {MANAGERS.map((pm) => {\n const command = generateCommand(pm, type, pkg, dev, args);\n\n return (\n <TabsContent keepMounted={true} key={pm} value={pm}>\n <Code code={command} language=\"bash\"></Code>\n </TabsContent>\n );\n })}\n </Tabs>\n );\n}\n","import { Github } from \"lucide-react\";\n\nexport function GitHub({ github }: { github: string | undefined }) {\n if (!github) {\n return null;\n }\n\n return (\n <a\n href={github}\n target=\"_blank\"\n rel=\"noreferrer\"\n aria-label=\"GitHub repository\"\n title=\"GitHub repository\"\n className=\"inline-flex h-8 w-8 items-center justify-center rounded border border-default-200 bg-default-50 text-default-500 hover:bg-default-100\"\n >\n <Github size={16} />\n </a>\n );\n}\n","import \"@docsearch/css\";\nimport { DocSearch } from \"@docsearch/react\";\nimport config from \"virtual:prestige/config\";\n\nexport function Search({\n algolia,\n}: {\n // 2. Add 'typeof' to extract the type from the value\n algolia: (typeof config)[\"algolia\"] | undefined;\n}) {\n if (!algolia) {\n return null;\n }\n\n return (\n <div className=\"prestige-search\">\n <DocSearch\n appId={algolia.appId}\n apiKey={algolia.apiKey}\n indices={algolia.indices}\n />\n </div>\n );\n}\n","import { useTheme } from \"@lonik/themer\";\nimport { useHydrated } from \"@tanstack/react-router\";\nimport { Moon, Sun, SunMoon } from \"lucide-react\";\n\nconst themeOrder = [\"system\", \"light\", \"dark\"] as const;\ntype ThemeValue = (typeof themeOrder)[number];\n\nexport function Theme() {\n const { theme, setTheme } = useTheme();\n const currentTheme: ThemeValue = (theme as ThemeValue) ?? \"system\";\n const hydrated = useHydrated();\n\n const nextTheme = (value: ThemeValue): ThemeValue => {\n const index = themeOrder.indexOf(value);\n return themeOrder[(index + 1) % themeOrder.length]!;\n };\n\n const icon =\n currentTheme === \"light\" ? (\n <Sun size={16} />\n ) : currentTheme === \"dark\" ? (\n <Moon size={16} />\n ) : (\n <SunMoon size={16} />\n );\n\n return (\n <button\n suppressHydrationWarning\n type=\"button\"\n aria-label={`Theme: ${currentTheme}. Click to switch theme`}\n title={`Theme: ${currentTheme}`}\n className=\"inline-flex h-8 w-8 items-center justify-center rounded-md border border-default-200 bg-default-50 text-default-500 hover:bg-default-100 cursor-pointer\"\n onClick={() => setTheme(nextTheme(currentTheme))}\n >\n {hydrated && icon}\n </button>\n );\n}\n","import { Link, useLocation } from \"@tanstack/react-router\";\nimport collections from \"virtual:prestige/collection-all\";\nimport config from \"virtual:prestige/config\";\nimport { PrestigeShellProps } from \"../../routes/prestige-shell\";\nimport { GitHub } from \"../github/github\";\nimport { Search } from \"../search/search\";\nimport { Theme } from \"../theme/theme\";\n\nexport type HeaderProps = Pick<PrestigeShellProps, \"customHeaderTitle\">;\n\nexport default function Header({ customHeaderTitle }: HeaderProps) {\n const location = useLocation();\n\n return (\n <header className=\"sticky top-0 z-40 flex h-header border-b border-default-200 bg-default-50/80 px-4 backdrop-blur-md\">\n <div className=\"container mx-auto flex max-w-360 items-center justify-between\">\n <div className=\"flex gap-4 items-baseline\">\n <Link\n className=\"text-sm rounded hover:bg-default-100 text-default-500\"\n to={\"/\"}\n >\n {customHeaderTitle ? (\n customHeaderTitle()\n ) : (\n <span>{config.title}</span>\n )}\n </Link>\n {collections.map((collection) => {\n const isActive =\n location.pathname === `/${collection.id}` ||\n location.pathname.startsWith(`/${collection.id}/`);\n\n return (\n <Link\n key={collection.id}\n to={`/${collection.defaultLink}` as any}\n className={`border-b-2 text-sm rounded hover:bg-default-100 active:bg-default-200 capitalize ${\n isActive\n ? \"border-default-800 text-default-800 font-medium\"\n : \"border-b-transparent text-default-500\"\n }`}\n >\n {collection.label}\n </Link>\n );\n })}\n </div>\n <div className=\"flex items-center gap-2\">\n <Search algolia={config.algolia} />\n <GitHub github={config.github} />\n <Theme />\n </div>\n </div>\n </header>\n );\n}\n","import { useEffect, useState } from \"react\";\nimport { TocItem } from \"remark-flexible-toc\";\n\nexport function useTableOfContents(toc: TocItem[]) {\n const [activeId, setActiveId] = useState<string>(\"\");\n\n useEffect(() => {\n if (toc.length === 0) return;\n\n const handleScroll = () => {\n const headingElements = toc\n .map((item) => {\n const id = item.href.startsWith(\"#\") ? item.href.slice(1) : item.href;\n return document.getElementById(id);\n })\n .filter((el): el is HTMLElement => el !== null);\n\n // Add a slight offset to account for sticky headers or top padding\n const scrollPosition = window.scrollY + 100;\n\n let currentActiveId = \"\";\n for (let i = headingElements.length - 1; i >= 0; i--) {\n const element = headingElements[i];\n if (element && element.offsetTop <= scrollPosition) {\n currentActiveId = element.id;\n break;\n }\n }\n\n // If we haven't scrolled past the first heading, highlight the first one\n if (!currentActiveId && headingElements.length > 0 && headingElements[0]) {\n currentActiveId = headingElements[0].id;\n }\n\n setActiveId(currentActiveId ? `#${currentActiveId}` : \"\");\n };\n\n window.addEventListener(\"scroll\", handleScroll, { passive: true });\n // setTimeout to ensure DOM is fully rendered when checking initial offsets\n setTimeout(handleScroll, 100);\n\n return () => window.removeEventListener(\"scroll\", handleScroll);\n }, [toc]);\n\n const handleLinkClick = (e: React.MouseEvent<HTMLAnchorElement>, href: string) => {\n e.preventDefault();\n const id = href.startsWith(\"#\") ? href.slice(1) : href;\n const element = document.getElementById(id);\n if (element) {\n element.scrollIntoView({ behavior: \"smooth\" });\n // Update URL hash without jumping\n window.history.pushState(null, \"\", href.startsWith(\"#\") ? href : `#${href}`);\n }\n };\n\n return { activeId, handleLinkClick };\n}\n","import clsx from \"clsx\";\nimport { ChevronRight } from \"lucide-react\";\nimport { useEffect, useRef, useState } from \"react\";\nimport { TocItem } from \"remark-flexible-toc\";\nimport { useTableOfContents } from \"./use-table-of-contents\";\n\nexport function MobileTableOfContent({ toc }: { toc: TocItem[] }) {\n const [isOpen, setIsOpen] = useState(false);\n const { activeId, handleLinkClick } = useTableOfContents(toc);\n const containerRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n function handleClickOutside(event: MouseEvent) {\n if (\n containerRef.current &&\n !containerRef.current.contains(event.target as Node)\n ) {\n setIsOpen(false);\n }\n }\n document.addEventListener(\"mousedown\", handleClickOutside);\n return () => {\n document.removeEventListener(\"mousedown\", handleClickOutside);\n };\n }, []);\n\n if (toc.length === 0) {\n return null;\n }\n\n const activeItem = toc.find((item) => {\n const itemHref = item.href.startsWith(\"#\") ? item.href : `#${item.href}`;\n return itemHref === activeId;\n });\n\n /* pl-12 is needed for mobile sidebar, because sidebar button is fixed position */\n return (\n <div\n ref={containerRef}\n className=\"sticky top-header z-30 -mx-6 -mt-10 mb-8 bg-default-50/95 backdrop-blur border-b border-default-200 dark:border-default-800 lg:hidden px-6 pl-12\"\n >\n <div className=\"relative\">\n <button\n onClick={() => setIsOpen((prev) => !prev)}\n className=\"flex w-full items-center justify-between gap-4 px-6 py-3 text-sm text-default-500 font-medium cursor-pointer\"\n >\n <div className=\"flex items-center gap-2\">\n <span>On this page</span>\n <ChevronRight\n className={clsx(\n \"w-4 h-4 transition-transform duration-200\",\n isOpen && \"rotate-90\",\n )}\n />\n </div>\n {activeItem && (\n <span className=\"truncate font-normal max-w-[50%] text-right\">\n {activeItem.value}\n </span>\n )}\n </button>\n\n {isOpen && (\n <div className=\"absolute left-6 right-6 top-full mt-2 max-h-[60vh] overflow-y-auto rounded-lg border border-default-200 bg-background shadow-xl\">\n <ul className=\"p-4 space-y-2.5 text-sm\">\n {toc.map((item) => {\n const itemHref = item.href.startsWith(\"#\")\n ? item.href\n : `#${item.href}`;\n const isActive = activeId === itemHref;\n return (\n <li\n key={itemHref}\n style={{ paddingLeft: `${(item.depth - 1) * 0.75}rem` }}\n >\n <a\n href={itemHref}\n className={clsx(\n \"block transition-colors duration-200 line-clamp-2\",\n isActive\n ? \"text-primary-600 font-medium\"\n : \"text-default-600\",\n )}\n onClick={(e) => {\n handleLinkClick(e, item.href);\n setIsOpen(false);\n }}\n >\n {item.value}\n </a>\n </li>\n );\n })}\n </ul>\n </div>\n )}\n </div>\n </div>\n );\n}\n","import clsx from \"clsx\";\nimport { TocItem } from \"remark-flexible-toc\";\nimport { useTableOfContents } from \"./use-table-of-contents\";\n\nexport function WebTableOfContent({ toc }: { toc: TocItem[] }) {\n const { activeId, handleLinkClick } = useTableOfContents(toc);\n\n return (\n <nav className=\"sticky top-header pt-4 overflow-y-auto w-web-table-of-content hidden lg:block\">\n <span className=\"text-xs font-mono tracking-widest\">ON THIS PAGE</span>\n <ul className=\"text-sm my-4\">\n {toc.map((item) => (\n <li\n key={item.href}\n // style={{ paddingLeft: `${(item.depth - 1) * 0.75}rem` }}\n >\n <a\n href={`${item.href}`}\n className={clsx(\n \"border-l py-1 px-4 block hover:text-default-700 dark:hover:text-slate-100 transition-colors duration-200 line-clamp-2\",\n activeId === item.href\n ? \"text-default-700 border-default-600 font-medium\"\n : \"text-default-500 border-default-200 \",\n )}\n onClick={(e) => handleLinkClick(e, item.href)}\n >\n {item.value}\n </a>\n </li>\n ))}\n </ul>\n </nav>\n );\n}\n","import React from \"react\";\nimport { TocItem } from \"remark-flexible-toc\";\nimport { MobileTableOfContent } from \"../routes/content/table-of-contents/mobile-table-of-contents\";\nimport { WebTableOfContent } from \"../routes/content/table-of-contents/web-table-of-contents\";\n\nexport interface PrestigePageProps {\n children: React.ReactNode;\n toc?: TocItem[];\n}\n\nexport function PrestigePage({ children, toc = [] }: PrestigePageProps) {\n return (\n <div className=\"flex lg:gap-6 items-start max-w-[100vw]\">\n <div className=\"flex-1 min-w-0\">\n <MobileTableOfContent toc={toc} />\n <article className=\"prose wrap-break-word py-15 px-6 max-w-none lg:w-web-content\">\n {children}\n </article>\n </div>\n <WebTableOfContent toc={toc} />\n </div>\n );\n}\n","import { Link } from \"@tanstack/react-router\";\nimport clsx from \"clsx\";\nimport { ArrowLeft, ArrowRight } from \"lucide-react\";\nimport { SiblingNavigationType } from \"../../../vite/core/content/content.types\";\n\nfunction ContentNavigation({\n isNext,\n navigation,\n}: {\n isNext?: boolean;\n navigation: SiblingNavigationType;\n}) {\n const label = isNext ? \"Next\" : \"Previous\";\n return (\n <Link\n to={navigation.link}\n className={clsx(\n \" flex-1 h-20 mb-4 border border-default-200 hover:bg-default-50 rounded-md cursor-pointer flex items-center px-4\",\n isNext ? \"justify-end\" : \"justify-start\",\n )}\n >\n <div\n className={clsx(\n \"flex items-center gap-4\",\n isNext && \"flex-row-reverse\",\n )}\n >\n {isNext ? (\n <ArrowRight className=\"text-default-400\" />\n ) : (\n <ArrowLeft className=\"text-default-400\" />\n )}\n <div className={clsx(\"flex flex-col\", isNext && \"items-end\")}>\n <span className=\"text-xs tracking-widest font-mono\">\n {label.toLocaleUpperCase()}\n </span>\n <span className=\"text-2xl font-li text-default-700\">\n {navigation.label}\n </span>\n </div>\n </div>\n </Link>\n );\n}\n\nexport default function ContentNavigations({\n prev,\n next,\n}: {\n prev: SiblingNavigationType | null | undefined;\n next: SiblingNavigationType | null | undefined;\n}) {\n if (!prev && !next) return null;\n // width of content navigation must match with content route content width, so we manually\n // add empty div with table-of-content width and add proper gap to match the size\n return (\n <div className=\"flex gap-6\">\n <div className=\"lg:flex flex-row items-center gap-2 mt-2 lg:mt-8 lg:w-web-content w-full\">\n {prev && <ContentNavigation navigation={prev} />}\n {next && <ContentNavigation navigation={next} isNext />}\n </div>\n <div className=\"lg:w-web-table-of-content h-1\"></div>\n </div>\n );\n}\n","export function isExternalURL(str: string) {\n try {\n const url = new URL(str);\n // This ensures it starts with http or https, filtering out\n // things like 'javascript:alert(1)' or 'mailto:test@test.com'\n return url.protocol === \"http:\" || url.protocol === \"https:\";\n } catch {\n return false;\n }\n}\n","import { Link } from \"@tanstack/react-router\";\nimport clsx from \"clsx\";\nimport { BookOpen, ChevronRight, ExternalLink } from \"lucide-react\";\nimport { useState } from \"react\";\nimport {\n ExternalSidebarLinkType,\n InternalSidebarLinkType,\n SidebarGroupType,\n SidebarType,\n} from \"../../../vite/core/content/content.types\";\nimport { isExternalURL } from \"../../utils\";\n\nexport interface SidebarProps {\n sidebar: SidebarType;\n onLinkClick?: (() => void) | undefined;\n}\n\nfunction SidebarGroup({\n group,\n onLinkClick,\n}: {\n group: SidebarGroupType;\n onLinkClick?: (() => void) | undefined;\n}) {\n const [open, setIsOpen] = useState(true);\n return (\n <div className=\"mt-4 flex flex-col gap-1\">\n <button\n className=\"flex items-center w-full gap-2\"\n onClick={() => setIsOpen((prev) => !prev)}\n >\n <ChevronRight\n size={18}\n className={clsx(\n \"transform transition cursor-pointer ml-1\",\n open && \"rotate-90\",\n )}\n />\n <span className=\"font-mono text-xs tracking-widest\">\n {group.label.toUpperCase()}\n </span>\n </button>\n {open && (\n <div className=\"mb-2\">\n {group.items.map((item) => {\n if (\"slug\" in item || \"link\" in item) {\n const key = \"slug\" in item ? item.slug : item.link;\n return (\n <SidebarLink showIcon={false} key={key} link={item} onLinkClick={onLinkClick} />\n );\n }\n return <SidebarGroup key={item.label} group={item} />;\n })}\n </div>\n )}\n </div>\n );\n}\n\nfunction SidebarLink({\n link,\n onLinkClick,\n showIcon,\n}: {\n link: InternalSidebarLinkType | ExternalSidebarLinkType;\n onLinkClick?: (() => void) | undefined;\n showIcon: boolean;\n}) {\n if (\"slug\" in link || !isExternalURL(link.link)) {\n const slug = \"slug\" in link ? `/${link.slug}` : link.link;\n return (\n <div className=\"flex items-center \">\n <Link\n onClick={onLinkClick}\n activeProps={{ className: \"text-default-700 font-medium\" }}\n className=\"w-full inline-flex gap-2 py-1 px-2 rounded hover:bg-default-100 text-sm mr-2 items-center text-default-500\"\n to={slug}\n >\n {showIcon && <BookOpen className=\"w-4\" />}\n {link.label}\n </Link>\n </div>\n );\n } else {\n return (\n <div className=\"flex items-center \">\n <a\n onClick={onLinkClick}\n className=\"w-full inline-flex gap-2 py-1 px-2 rounded hover:bg-default-100 text-sm mr-2 items-center text-default-500\"\n href={link.link}\n target=\"_blank\"\n rel=\"noreferrer\"\n >\n {showIcon && <ExternalLink className=\"w-4\" />}\n {link.label}\n </a>\n </div>\n );\n }\n}\n\nexport default function Sidebar({ sidebar, onLinkClick }: SidebarProps) {\n return (\n <div className=\"w-full lg:w-sidebar border-r border-default-200 h-full overflow-auto lg:h-main lg:sticky top-header pt-4\">\n {sidebar.items.map((item) => {\n if (\"slug\" in item || \"link\" in item) {\n const key = \"slug\" in item ? item.slug : item.link;\n return (\n <SidebarLink showIcon={true} onLinkClick={onLinkClick} key={key} link={item} />\n );\n }\n return <SidebarGroup key={item.label} group={item} />;\n })}\n </div>\n );\n}\n","import { Menu, X } from \"lucide-react\";\nimport { useState } from \"react\";\nimport { SidebarType } from \"../../../vite/core/content/content.types\";\nimport Sidebar from \"./sidebar\";\n\nfunction SidebarOverlay({ sidebar }: { sidebar: SidebarType }) {\n const [isOpen, setIsOpen] = useState(false);\n return (\n <div className=\"lg:hidden\">\n {/* Mobile sidebar button is placed on the start of mobile of content tab, we have to position is via fixed because table of content lives inside content.route */}\n <button\n className=\"bg-transparent p-3 -mt-[2px] text-default-700 top-header left-0 fixed z-50\"\n onClick={() => setIsOpen((prev) => !prev)}\n >\n {isOpen ? <X /> : <Menu />}\n </button>\n {isOpen && (\n <div className=\"fixed top-[calc(var(--spacing-header)+44 )] shadow-xl left-0 overflow-auto z-10 bg-default-50 w-full h-screen\">\n <Sidebar onLinkClick={() => setIsOpen(false)} sidebar={sidebar} />\n </div>\n )}\n </div>\n );\n}\n\nexport default function MobileSidebar({ sidebar }: { sidebar: SidebarType }) {\n return <SidebarOverlay sidebar={sidebar} />;\n}\n","import { Outlet, useLocation } from \"@tanstack/react-router\";\nimport { SidebarType } from \"../../../vite/core/content/content.types\";\nimport ContentNavigations from \"../content/content-navigations\";\nimport MobileSidebar from \"./mobile-sidebar\";\nimport Sidebar from \"./sidebar\";\n\nexport function CollectionRoute(sidebar: SidebarType, id: string) {\n return {\n component: () => {\n const location = useLocation();\n const navigation = sidebar?.navigation?.[location.pathname] || {\n prev: null,\n next: null,\n };\n const { prev, next } = navigation;\n\n return (\n <div className=\"mx-auto flex container lg:gap-6\">\n <MobileSidebar sidebar={sidebar} />\n <div className=\"hidden lg:block\">\n {sidebar && <Sidebar sidebar={sidebar} />}\n </div>\n <div className=\"flex-1 pb-20\">\n <Outlet />\n <div className=\"mt-8 px-6 lg:px-0\">\n <ContentNavigations prev={prev} next={next} />\n </div>\n </div>\n </div>\n );\n },\n };\n}\n","import { FunctionComponent } from \"react\";\nimport { TocItem } from \"remark-flexible-toc\";\nimport config from \"virtual:prestige/config\";\nimport {\n ContentFrontmatterType,\n SiblingNavigationType,\n} from \"../../../vite/core/content/content.types\";\nimport { PrestigePage } from \"../../core/prestige-page\";\nexport function ContentRoute(inlineData: any): any {\n const {\n frontmatter,\n toc,\n default: Component,\n } = inlineData as {\n prev: SiblingNavigationType | null;\n next: SiblingNavigationType | null;\n toc: TocItem[];\n default: FunctionComponent;\n frontmatter: ContentFrontmatterType;\n };\n return {\n head: () => {\n const metas: Array<\n { name: string; content: string } | { title: string }\n > = [];\n const description = frontmatter.description;\n const title = frontmatter.title;\n\n if (title) {\n metas.push({\n title: title + \" | \" + config.title,\n });\n }\n\n if (description) {\n metas.push({\n name: \"description\",\n content: description,\n });\n }\n\n return {\n meta: metas,\n };\n },\n component: () => {\n return (\n <PrestigePage toc={toc}>\n <Component />\n </PrestigePage>\n );\n },\n };\n}\n","export default function NotFound() {\n return <h1>This page could not be found.</h1>;\n}\n","import config from \"virtual:prestige/config\";\nimport { PrestigeShellProps } from \"../../routes/prestige-shell\";\n\nfunction License() {\n if (!config.license) {\n return null;\n }\n return (\n <a target=\"_blank\" href={config.license.url}>\n Released under: {config.license.label}\n </a>\n );\n}\n\nfunction Copyright({ copyright }: Pick<PrestigeShellProps, \"copyright\">) {\n if (!copyright) {\n return null;\n }\n return copyright();\n}\n\nexport default function Footer({\n copyright,\n}: Pick<PrestigeShellProps, \"copyright\">) {\n return (\n <footer className=\"mt-10 flex items-center justify-center flex-col gap-2 px-4 border-t border-t-default-100 pt-10 bg-default-50 text-sm py-10 text-default-700\">\n <License />\n <Copyright copyright={copyright} />\n </footer>\n );\n}\n","import { ThemeProvider } from \"@lonik/themer\";\nimport { ReactNode } from \"react\";\nimport Footer from \"../core/footer/footer\";\nimport Header from \"../core/header/header\";\n\ntype RenderNode = () => ReactNode;\n\nexport interface PrestigeShellProps {\n customHeaderTitle?: RenderNode | undefined;\n copyright?: RenderNode | undefined;\n}\nexport function PrestigeShell({\n children,\n options,\n}: {\n children: ReactNode;\n options?: PrestigeShellProps;\n}) {\n return (\n <ThemeProvider attribute=\"data-theme\" defaultTheme=\"system\">\n <Header customHeaderTitle={options?.customHeaderTitle} {...options} />\n <main className=\"min-h-[calc(100vh-var(--spacing-header))]\">\n {children}\n </main>\n <Footer copyright={options?.copyright} />\n </ThemeProvider>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;AAUA,MAAMA,UAAqC;CACzC,MAAM;CACN,KAAK;CACL,SACE;CACF,QACE;CACH;AAED,MAAMC,gBAA2C;CAC/C,MAAM;CACN,KAAK;CACL,SAAS;CACT,QAAQ;CACT;AAED,SAAgB,MAAM,EACpB,OAAO,QACP,OACA,UACA,WACA,GAAG,SACU;CACb,MAAM,YAAY;EAChB,WAAW;EACX,OAAO;EACP,OAAO;EACP,QAAQ;EACR,SAAS;EACT,MAAM;EACN,QAAQ;EACR,aAAa;EACb,eAAe;EACf,gBAAgB;EACjB;CAED,MAAM,aAAa;AACjB,UAAQ,MAAR;GACE,KAAK,OACH,QACE,qBAAC;IAAI,GAAI;;KACP,oBAAC;MAAO,IAAG;MAAK,IAAG;MAAK,GAAE;OAAO;KACjC,oBAAC,UAAK,GAAE,cAAc;KACtB,oBAAC,UAAK,GAAE,cAAc;;KAClB;GAEV,KAAK,MACH,QACE,qBAAC;IAAI,GAAI;;KACP,oBAAC,UAAK,GAAE,8FAA8F;KACtG,oBAAC,UAAK,GAAE,oGAAoG;KAC5G,oBAAC,UAAK,GAAE,2CAA2C;KACnD,oBAAC,UAAK,GAAE,4CAA4C;;KAChD;GAEV,KAAK,UACH,QACE,qBAAC;IAAI,GAAI;;KACP,oBAAC,UAAK,GAAE,8EAA8E;KACtF,oBAAC,UAAK,GAAE,YAAY;KACpB,oBAAC,UAAK,GAAE,eAAe;;KACnB;GAEV,KAAK,SACH,QACE,qBAAC;IAAI,GAAI;;KACP,oBAAC,aAAQ,QAAO,2EAA2E;KAC3F,oBAAC,UAAK,GAAE,YAAY;KACpB,oBAAC,UAAK,GAAE,eAAe;;KACnB;GAEV,QACE,QAAO;;;AAIb,QACE,qBAAC;EACC,cAAY,cAAc;EAC1B,WAAW,iDAAiD,QAAQ,MAAM,GAAG,aAAa;EAC1F,GAAI;aAEJ,qBAAC;GAAE,WAAU;cACX,oBAAC,oBACC,oBAAC,SAAO,GACH,EACN,SAAS,cAAc;IACtB,EACJ,oBAAC;GAAQ,WAAU;GAChB;IACO;GACJ;;;;;AC9FZ,SAAgB,KAAK,EAAE,MAAM,WAAW,SAAoB;AAE1D,QACE,oBAAC;EAAgB;EAAgB;aAC7B,EAAE,OAAO,QAAQ,cAAc,oBAC/B,oBAAC;GAAI,WAAU;GAAmB;aAC/B,OAAO,KAAK,MAAM,MACjB,oBAAC;IAAY,GAAI,aAAa,EAAE,MAAM,CAAC;cACpC,KAAK,KAAK,OAAO,QAChB,oBAAC,UAAe,GAAI,cAAc,EAAE,OAAO,CAAC,IAAjC,IAAqC,CAChD;MAHM,EAIJ,CACN;IACE;GAEE;;;;;ACpBhB,SAAS,KAAK,EACZ,cAAc,cACd,WACA,GAAG,SACwB;AAC3B,QACE,oBAACC,OAAc;EACb,aAAU;EACV,oBAAkB;EAClB,WAAW,UAAU,aAAa;EAClC,GAAI;GACJ;;AAIN,SAAS,SAAS,EAAE,WAAW,GAAG,SAAmC;AACnE,QACE,oBAACA,OAAc;EACb,aAAU;EACV,WAAW,wEACT,aAAa;EAEf,GAAI;GACJ;;AAIN,SAAS,YAAY,EAAE,WAAW,GAAG,SAAkC;AACrE,QACE,oBAACA,OAAc;EACb,aAAU;EACV,WAAW;;;;;;;UAOP,aAAa,GAAG;;EAEpB,GAAI;GACJ;;AAIN,SAAS,YAAY,EAAE,WAAW,GAAG,SAAoC;AACvE,QACE,oBAACA,OAAc;EACb,aAAU;EACV,WAAW,mHACT,aAAa;EAEf,GAAI;GACJ;;;;;ACrCN,MAAMC,WAA6B;CAAC;CAAO;CAAQ;CAAQ;CAAM;AAEjE,SAAS,gBACP,IACA,MACA,KACA,KACA,MACA;CACA,MAAMC,QAAkB,EAAE;AAE1B,SAAQ,MAAR;EACE,KAAK;AACH,SAAM,KAAK,OAAO,QAAQ,gBAAgB,GAAG,GAAG,MAAM;AACtD,OAAI,IAAK,OAAM,KAAK,KAAK;AACzB,OAAI,IAAK,OAAM,KAAK,IAAI;AACxB;EACF,KAAK;AACH,SAAM,KAAK,GAAG,GAAG,SAAS;AAC1B,OAAI,IAAK,OAAM,KAAK,IAAI;AACxB;EACF,KAAK;AACH,OAAI,OAAO,MAAO,OAAM,KAAK,MAAM;YAC1B,OAAO,MAAO,OAAM,KAAK,QAAQ;OACrC,OAAM,KAAK,GAAG,GAAG,MAAM;AAC5B,OAAI,IAAK,OAAM,KAAK,IAAI;AACxB;EACF,KAAK;AACH,SAAM,KAAK,OAAO,SAAS,SAAS,GAAG,GAAG,MAAM;AAChD,OAAI,IAAK,OAAM,KAAK,IAAI;AACxB;;AAGJ,KAAI,MAAM;AAER,MAAI,OAAO,UAAU,SAAS,UAAU,SAAS,OAC/C,OAAM,KAAK,KAAK;AAElB,QAAM,KAAK,KAAK;;AAGlB,QAAO,MAAM,KAAK,IAAI;;AAGxB,SAAgB,gBAAgB,EAC9B,KACA,OAAO,OACP,MAAM,OACN,MACA,aACuB;AACvB,QACE,qBAAC;EAAK,cAAa;EAAM,WAAW,QAAQ,aAAa;aACvD,oBAAC,sBACE,SAAS,KAAK,OACb,oBAAC;GAAqB,OAAO;aAC1B,GAAG,aAAa;KADD,GAEJ,CACd,GACO,EAEV,SAAS,KAAK,OAAO;AAGpB,UACE,oBAAC;IAAY,aAAa;IAAe,OAAO;cAC9C,oBAAC;KAAK,MAJM,gBAAgB,IAAI,MAAM,KAAK,KAAK,KAAK;KAIhC,UAAS;MAAc;MADT,GAEvB;IAEhB;GACG;;;;;ACtFX,SAAgB,OAAO,EAAE,UAA0C;AACjE,KAAI,CAAC,OACH,QAAO;AAGT,QACE,oBAAC;EACC,MAAM;EACN,QAAO;EACP,KAAI;EACJ,cAAW;EACX,OAAM;EACN,WAAU;YAEV,oBAAC,UAAO,MAAM,KAAM;GAClB;;;;;ACbR,SAAgB,OAAO,EACrB,WAIC;AACD,KAAI,CAAC,QACH,QAAO;AAGT,QACE,oBAAC;EAAI,WAAU;YACb,oBAAC;GACC,OAAO,QAAQ;GACf,QAAQ,QAAQ;GAChB,SAAS,QAAQ;IACjB;GACE;;;;;ACjBV,MAAM,aAAa;CAAC;CAAU;CAAS;CAAO;AAG9C,SAAgB,QAAQ;CACtB,MAAM,EAAE,OAAO,aAAa,UAAU;CACtC,MAAMC,eAA4B,SAAwB;CAC1D,MAAM,WAAW,aAAa;CAE9B,MAAM,aAAa,UAAkC;AAEnD,SAAO,YADO,WAAW,QAAQ,MAAM,GACZ,KAAK,WAAW;;CAG7C,MAAM,OACJ,iBAAiB,UACf,oBAAC,OAAI,MAAM,KAAM,GACf,iBAAiB,SACnB,oBAAC,QAAK,MAAM,KAAM,GAElB,oBAAC,WAAQ,MAAM,KAAM;AAGzB,QACE,oBAAC;EACC;EACA,MAAK;EACL,cAAY,UAAU,aAAa;EACnC,OAAO,UAAU;EACjB,WAAU;EACV,eAAe,SAAS,UAAU,aAAa,CAAC;YAE/C,YAAY;GACN;;;;;AC1Bb,SAAwB,OAAO,EAAE,qBAAkC;CACjE,MAAM,WAAW,aAAa;AAE9B,QACE,oBAAC;EAAO,WAAU;YAChB,qBAAC;GAAI,WAAU;cACb,qBAAC;IAAI,WAAU;eACb,oBAAC;KACC,WAAU;KACV,IAAI;eAEH,oBACC,mBAAmB,GAEnB,oBAAC,oBAAM,OAAO,QAAa;MAExB,EACN,YAAY,KAAK,eAAe;KAC/B,MAAM,WACJ,SAAS,aAAa,IAAI,WAAW,QACrC,SAAS,SAAS,WAAW,IAAI,WAAW,GAAG,GAAG;AAEpD,YACE,oBAAC;MAEC,IAAI,IAAI,WAAW;MACnB,WAAW,oFACT,WACI,oDACA;gBAGL,WAAW;QARP,WAAW,GASX;MAET;KACE,EACN,qBAAC;IAAI,WAAU;;KACb,oBAAC,UAAO,SAAS,OAAO,UAAW;KACnC,oBAAC,UAAO,QAAQ,OAAO,SAAU;KACjC,oBAAC,UAAQ;;KACL;IACF;GACC;;;;;AClDb,SAAgB,mBAAmB,KAAgB;CACjD,MAAM,CAAC,UAAU,eAAe,SAAiB,GAAG;AAEpD,iBAAgB;AACd,MAAI,IAAI,WAAW,EAAG;EAEtB,MAAM,qBAAqB;GACzB,MAAM,kBAAkB,IACrB,KAAK,SAAS;IACb,MAAM,KAAK,KAAK,KAAK,WAAW,IAAI,GAAG,KAAK,KAAK,MAAM,EAAE,GAAG,KAAK;AACjE,WAAO,SAAS,eAAe,GAAG;KAClC,CACD,QAAQ,OAA0B,OAAO,KAAK;GAGjD,MAAM,iBAAiB,OAAO,UAAU;GAExC,IAAI,kBAAkB;AACtB,QAAK,IAAI,IAAI,gBAAgB,SAAS,GAAG,KAAK,GAAG,KAAK;IACpD,MAAM,UAAU,gBAAgB;AAChC,QAAI,WAAW,QAAQ,aAAa,gBAAgB;AAClD,uBAAkB,QAAQ;AAC1B;;;AAKJ,OAAI,CAAC,mBAAmB,gBAAgB,SAAS,KAAK,gBAAgB,GACpE,mBAAkB,gBAAgB,GAAG;AAGvC,eAAY,kBAAkB,IAAI,oBAAoB,GAAG;;AAG3D,SAAO,iBAAiB,UAAU,cAAc,EAAE,SAAS,MAAM,CAAC;AAElE,aAAW,cAAc,IAAI;AAE7B,eAAa,OAAO,oBAAoB,UAAU,aAAa;IAC9D,CAAC,IAAI,CAAC;CAET,MAAM,mBAAmB,GAAwC,SAAiB;AAChF,IAAE,gBAAgB;EAClB,MAAM,KAAK,KAAK,WAAW,IAAI,GAAG,KAAK,MAAM,EAAE,GAAG;EAClD,MAAM,UAAU,SAAS,eAAe,GAAG;AAC3C,MAAI,SAAS;AACX,WAAQ,eAAe,EAAE,UAAU,UAAU,CAAC;AAE9C,UAAO,QAAQ,UAAU,MAAM,IAAI,KAAK,WAAW,IAAI,GAAG,OAAO,IAAI,OAAO;;;AAIhF,QAAO;EAAE;EAAU;EAAiB;;;;;ACjDtC,SAAgB,qBAAqB,EAAE,OAA2B;CAChE,MAAM,CAAC,QAAQ,aAAa,SAAS,MAAM;CAC3C,MAAM,EAAE,UAAU,oBAAoB,mBAAmB,IAAI;CAC7D,MAAM,eAAe,OAAuB,KAAK;AAEjD,iBAAgB;EACd,SAAS,mBAAmB,OAAmB;AAC7C,OACE,aAAa,WACb,CAAC,aAAa,QAAQ,SAAS,MAAM,OAAe,CAEpD,WAAU,MAAM;;AAGpB,WAAS,iBAAiB,aAAa,mBAAmB;AAC1D,eAAa;AACX,YAAS,oBAAoB,aAAa,mBAAmB;;IAE9D,EAAE,CAAC;AAEN,KAAI,IAAI,WAAW,EACjB,QAAO;CAGT,MAAM,aAAa,IAAI,MAAM,SAAS;AAEpC,UADiB,KAAK,KAAK,WAAW,IAAI,GAAG,KAAK,OAAO,IAAI,KAAK,YAC9C;GACpB;AAGF,QACE,oBAAC;EACC,KAAK;EACL,WAAU;YAEV,qBAAC;GAAI,WAAU;cACb,qBAAC;IACC,eAAe,WAAW,SAAS,CAAC,KAAK;IACzC,WAAU;eAEV,qBAAC;KAAI,WAAU;gBACb,oBAAC,oBAAK,iBAAmB,EACzB,oBAAC,gBACC,WAAW,KACT,6CACA,UAAU,YACX,GACD;MACE,EACL,cACC,oBAAC;KAAK,WAAU;eACb,WAAW;MACP;KAEF,EAER,UACC,oBAAC;IAAI,WAAU;cACb,oBAAC;KAAG,WAAU;eACX,IAAI,KAAK,SAAS;MACjB,MAAM,WAAW,KAAK,KAAK,WAAW,IAAI,GACtC,KAAK,OACL,IAAI,KAAK;MACb,MAAM,WAAW,aAAa;AAC9B,aACE,oBAAC;OAEC,OAAO,EAAE,aAAa,IAAI,KAAK,QAAQ,KAAK,IAAK,MAAM;iBAEvD,oBAAC;QACC,MAAM;QACN,WAAW,KACT,qDACA,WACI,iCACA,mBACL;QACD,UAAU,MAAM;AACd,yBAAgB,GAAG,KAAK,KAAK;AAC7B,mBAAU,MAAM;;kBAGjB,KAAK;SACJ;SAjBC,SAkBF;OAEP;MACC;KACD;IAEJ;GACF;;;;;AC7FV,SAAgB,kBAAkB,EAAE,OAA2B;CAC7D,MAAM,EAAE,UAAU,oBAAoB,mBAAmB,IAAI;AAE7D,QACE,qBAAC;EAAI,WAAU;aACb,oBAAC;GAAK,WAAU;aAAoC;IAAmB,EACvE,oBAAC;GAAG,WAAU;aACX,IAAI,KAAK,SACR,oBAAC,kBAIC,oBAAC;IACC,MAAM,GAAG,KAAK;IACd,WAAW,KACT,yHACA,aAAa,KAAK,OACd,oDACA,wCACL;IACD,UAAU,MAAM,gBAAgB,GAAG,KAAK,KAAK;cAE5C,KAAK;KACJ,IAdC,KAAK,KAeP,CACL;IACC;GACD;;;;;ACrBV,SAAgB,aAAa,EAAE,UAAU,MAAM,EAAE,IAAuB;AACtE,QACE,qBAAC;EAAI,WAAU;aACb,qBAAC;GAAI,WAAU;cACb,oBAAC,wBAA0B,MAAO,EAClC,oBAAC;IAAQ,WAAU;IAChB;KACO;IACN,EACN,oBAAC,qBAAuB,MAAO;GAC3B;;;;;ACfV,SAAS,kBAAkB,EACzB,QACA,cAIC;CACD,MAAM,QAAQ,SAAS,SAAS;AAChC,QACE,oBAAC;EACC,IAAI,WAAW;EACf,WAAW,KACT,oHACA,SAAS,gBAAgB,gBAC1B;YAED,qBAAC;GACC,WAAW,KACT,2BACA,UAAU,mBACX;cAEA,SACC,oBAAC,cAAW,WAAU,qBAAqB,GAE3C,oBAAC,aAAU,WAAU,qBAAqB,EAE5C,qBAAC;IAAI,WAAW,KAAK,iBAAiB,UAAU,YAAY;eAC1D,oBAAC;KAAK,WAAU;eACb,MAAM,mBAAmB;MACrB,EACP,oBAAC;KAAK,WAAU;eACb,WAAW;MACP;KACH;IACF;GACD;;AAIX,SAAwB,mBAAmB,EACzC,MACA,QAIC;AACD,KAAI,CAAC,QAAQ,CAAC,KAAM,QAAO;AAG3B,QACE,qBAAC;EAAI,WAAU;aACb,qBAAC;GAAI,WAAU;cACZ,QAAQ,oBAAC,qBAAkB,YAAY,OAAQ,EAC/C,QAAQ,oBAAC;IAAkB,YAAY;IAAM;KAAS;IACnD,EACN,oBAAC,SAAI,WAAU,kCAAsC;GACjD;;;;;AC9DV,SAAgB,cAAc,KAAa;AACzC,KAAI;EACF,MAAM,MAAM,IAAI,IAAI,IAAI;AAGxB,SAAO,IAAI,aAAa,WAAW,IAAI,aAAa;SAC9C;AACN,SAAO;;;;;;ACUX,SAAS,aAAa,EACpB,OACA,eAIC;CACD,MAAM,CAAC,MAAM,aAAa,SAAS,KAAK;AACxC,QACE,qBAAC;EAAI,WAAU;aACb,qBAAC;GACC,WAAU;GACV,eAAe,WAAW,SAAS,CAAC,KAAK;cAEzC,oBAAC;IACC,MAAM;IACN,WAAW,KACT,4CACA,QAAQ,YACT;KACD,EACF,oBAAC;IAAK,WAAU;cACb,MAAM,MAAM,aAAa;KACrB;IACA,EACR,QACC,oBAAC;GAAI,WAAU;aACZ,MAAM,MAAM,KAAK,SAAS;AACzB,QAAI,UAAU,QAAQ,UAAU,MAAM;KACpC,MAAM,MAAM,UAAU,OAAO,KAAK,OAAO,KAAK;AAC9C,YACE,oBAAC;MAAY,UAAU;MAAiB,MAAM;MAAmB;QAA9B,IAA6C;;AAGpF,WAAO,oBAAC,gBAA8B,OAAO,QAAnB,KAAK,MAAsB;KACrD;IACE;GAEJ;;AAIV,SAAS,YAAY,EACnB,MACA,aACA,YAKC;AACD,KAAI,UAAU,QAAQ,CAAC,cAAc,KAAK,KAAK,CAE7C,QACE,oBAAC;EAAI,WAAU;YACb,qBAAC;GACC,SAAS;GACT,aAAa,EAAE,WAAW,gCAAgC;GAC1D,WAAU;GACV,IAPO,UAAU,OAAO,IAAI,KAAK,SAAS,KAAK;cAS9C,YAAY,oBAAC,YAAS,WAAU,QAAQ,EACxC,KAAK;IACD;GACH;KAGR,QACE,oBAAC;EAAI,WAAU;YACb,qBAAC;GACC,SAAS;GACT,WAAU;GACV,MAAM,KAAK;GACX,QAAO;GACP,KAAI;cAEH,YAAY,oBAAC,gBAAa,WAAU,QAAQ,EAC5C,KAAK;IACJ;GACA;;AAKZ,SAAwB,QAAQ,EAAE,SAAS,eAA6B;AACtE,QACE,oBAAC;EAAI,WAAU;YACZ,QAAQ,MAAM,KAAK,SAAS;AAC3B,OAAI,UAAU,QAAQ,UAAU,MAAM;IACpC,MAAM,MAAM,UAAU,OAAO,KAAK,OAAO,KAAK;AAC9C,WACE,oBAAC;KAAY,UAAU;KAAmB;KAAuB,MAAM;OAAX,IAAmB;;AAGnF,UAAO,oBAAC,gBAA8B,OAAO,QAAnB,KAAK,MAAsB;IACrD;GACE;;;;;AC5GV,SAAS,eAAe,EAAE,WAAqC;CAC7D,MAAM,CAAC,QAAQ,aAAa,SAAS,MAAM;AAC3C,QACE,qBAAC;EAAI,WAAU;aAEb,oBAAC;GACC,WAAU;GACV,eAAe,WAAW,SAAS,CAAC,KAAK;aAExC,SAAS,oBAAC,MAAI,GAAG,oBAAC,SAAO;IACnB,EACR,UACC,oBAAC;GAAI,WAAU;aACb,oBAAC;IAAQ,mBAAmB,UAAU,MAAM;IAAW;KAAW;IAC9D;GAEJ;;AAIV,SAAwB,cAAc,EAAE,WAAqC;AAC3E,QAAO,oBAAC,kBAAwB,UAAW;;;;;ACpB7C,SAAgB,gBAAgB,SAAsB,IAAY;AAChE,QAAO,EACL,iBAAiB;EACf,MAAM,WAAW,aAAa;EAK9B,MAAM,EAAE,MAAM,SAJK,SAAS,aAAa,SAAS,aAAa;GAC7D,MAAM;GACN,MAAM;GACP;AAGD,SACE,qBAAC;GAAI,WAAU;;IACb,oBAAC,iBAAuB,UAAW;IACnC,oBAAC;KAAI,WAAU;eACZ,WAAW,oBAAC,WAAiB,UAAW;MACrC;IACN,qBAAC;KAAI,WAAU;gBACb,oBAAC,WAAS,EACV,oBAAC;MAAI,WAAU;gBACb,oBAAC;OAAyB;OAAY;QAAQ;OAC1C;MACF;;IACF;IAGX;;;;;ACvBH,SAAgB,aAAa,YAAsB;CACjD,MAAM,EACJ,aACA,KACA,SAAS,cACP;AAOJ,QAAO;EACL,YAAY;GACV,MAAMC,QAEF,EAAE;GACN,MAAM,cAAc,YAAY;GAChC,MAAM,QAAQ,YAAY;AAE1B,OAAI,MACF,OAAM,KAAK,EACT,OAAO,QAAQ,QAAQ,OAAO,OAC/B,CAAC;AAGJ,OAAI,YACF,OAAM,KAAK;IACT,MAAM;IACN,SAAS;IACV,CAAC;AAGJ,UAAO,EACL,MAAM,OACP;;EAEH,iBAAiB;AACf,UACE,oBAAC;IAAkB;cACjB,oBAAC,cAAY;KACA;;EAGpB;;;;;ACpDH,SAAwB,WAAW;AACjC,QAAO,oBAAC,kBAAG,kCAAkC;;;;;ACE/C,SAAS,UAAU;AACjB,KAAI,CAAC,OAAO,QACV,QAAO;AAET,QACE,qBAAC;EAAE,QAAO;EAAS,MAAM,OAAO,QAAQ;aAAK,oBAC1B,OAAO,QAAQ;GAC9B;;AAIR,SAAS,UAAU,EAAE,aAAoD;AACvE,KAAI,CAAC,UACH,QAAO;AAET,QAAO,WAAW;;AAGpB,SAAwB,OAAO,EAC7B,aACwC;AACxC,QACE,qBAAC;EAAO,WAAU;aAChB,oBAAC,YAAU,EACX,oBAAC,aAAqB,YAAa;GAC5B;;;;;ACjBb,SAAgB,cAAc,EAC5B,UACA,WAIC;AACD,QACE,qBAAC;EAAc,WAAU;EAAa,cAAa;;GACjD,oBAAC;IAAO,mBAAmB,SAAS;IAAmB,GAAI;KAAW;GACtE,oBAAC;IAAK,WAAU;IACb;KACI;GACP,oBAAC,UAAO,WAAW,SAAS,YAAa;;GAC3B"}
|
package/dist/vite.js
CHANGED
|
@@ -285,6 +285,17 @@ function remarkAdmonitions() {
|
|
|
285
285
|
});
|
|
286
286
|
};
|
|
287
287
|
}
|
|
288
|
+
function rehypeAddNotProseToPre() {
|
|
289
|
+
return (tree) => {
|
|
290
|
+
visit(tree, (node) => {
|
|
291
|
+
if (node.type === "element" && node.tagName === "pre") {
|
|
292
|
+
node.properties = node.properties || {};
|
|
293
|
+
const currentClass = node.properties.className || [];
|
|
294
|
+
node.properties.className = Array.isArray(currentClass) ? [...currentClass, "not-prose"] : [currentClass, "not-prose"];
|
|
295
|
+
}
|
|
296
|
+
});
|
|
297
|
+
};
|
|
298
|
+
}
|
|
288
299
|
async function compileMarkdown(content, baseUrl, options) {
|
|
289
300
|
const toc = [];
|
|
290
301
|
const code = await compile(content, {
|
|
@@ -292,7 +303,8 @@ async function compileMarkdown(content, baseUrl, options) {
|
|
|
292
303
|
rehypePlugins: [
|
|
293
304
|
...options?.rehypePlugins ?? [],
|
|
294
305
|
rehypeSlug,
|
|
295
|
-
rehypePrism
|
|
306
|
+
[rehypePrism, { options: { showLineNumbers: false } }],
|
|
307
|
+
rehypeAddNotProseToPre
|
|
296
308
|
],
|
|
297
309
|
remarkPlugins: [
|
|
298
310
|
...options?.remarkPlugins ?? [],
|
package/dist/vite.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"vite.js","names":["CollectionGroupSchema: z.ZodType<CollectionGroup, CollectionGroup>","CollectionItemSchema: z.ZodType<CollectionItem, CollectionItem>","sidebarLinks: SidebarLinkType[]","processItem","data","typeMap: Record<\"note\" | \"tip\" | \"caution\" | \"danger\", string>","titleChildren: any[]","toc: TocItem[]","prev: SiblingNavigationType | undefined","next: SiblingNavigationType | undefined","join","navigation: Record<string, NavigationLinks>","items: SidebarItemType[]","group: CollectionGroup","join","collections: CollectionNavigation[]","config: PrestigeConfig","contentDir: string","isDocsMatcher: Matcher","collections: Collections","linksMap: Map<string, SidebarLinkType[]>","collectionNavigations: string","sidebarsMap: Map<string, SidebarType>"],"sources":["../src/vite/utils/errors.ts","../src/vite/core/content/content.types.ts","../src/vite/config/config.types.ts","../src/vite/utils/file-utils.ts","../src/vite/config/config.ts","../src/vite/content/content-links.ts","../src/vite/utils/logger.ts","../src/vite/content/content-compiler.ts","../src/vite/content/content.store.ts","../src/vite/content/content-sidebar.store.ts","../src/vite/content/router-compiler.ts","../src/vite/utils/code-generation.ts","../src/vite/core/content/content-collection.store.ts","../src/vite/plugin.ts"],"sourcesContent":["import { type ZodType, input } from \"zod\";\n\nexport class PrestigeError extends Error {}\n\n/**\n * Parse data with zod schema and if fails throw PrestigeError that is friendly error\n * for prestige ecosystem\n */\nexport function parseWithFriendlyErrors<T extends ZodType>(s: T, input: input<T>, message: string) {\n try {\n return s.parse(input);\n } catch (e) {\n if (e instanceof Error) {\n throw new PrestigeError(`Prestige error cause: ${message}, with error: ${e.message} `);\n } else {\n throw new PrestigeError(`Prestige error cause: ${message} `);\n }\n }\n}\n","import { z } from \"zod\";\n\nexport const ContentFrontmatterSchema = z.object({\n title: z.string().describe(\"The title of the article\"),\n description: z.string().optional().describe(\"The description of the article\"),\n label: z.string().optional().describe(\"The label of the content\"),\n});\n\nexport type ContentFrontmatterType = z.infer<typeof ContentFrontmatterSchema>;\n\nexport const ContentSchema = z.object({\n matter: ContentFrontmatterSchema,\n html: z.string().describe(\"The html of the content\"),\n});\n\nexport type ContentType = z.infer<typeof ContentSchema>;\n\nconst InternalCollectionLinkSchema = z.union([\n z.object({\n label: z.string(),\n slug: z.string(),\n }),\n z.string(),\n]);\n\nconst ExternalCollectionLinkSchema = z.object({\n label: z.string(),\n link: z.string(),\n});\n\nexport type ExternalCollectionLink = z.infer<\n typeof ExternalCollectionLinkSchema\n>;\n\nexport type InternalCollectionLink = z.infer<\n typeof InternalCollectionLinkSchema\n>;\n\nexport type CollectionGroup = {\n label: string;\n items?: CollectionItem[] | undefined;\n collapsible?: boolean | undefined;\n autogenerate?: { directory: string } | undefined;\n};\n\nexport type CollectionItem =\n | InternalCollectionLink\n | CollectionGroup\n | ExternalCollectionLink;\n\nconst CollectionGroupSchema: z.ZodType<CollectionGroup, CollectionGroup> =\n z.object({\n label: z.string(),\n items: z.lazy(() => z.array(CollectionItemSchema)).optional(),\n collapsible: z.boolean().optional(),\n autogenerate: z\n .object({\n directory: z.string(),\n })\n .optional(),\n });\n\nconst CollectionItemSchema: z.ZodType<CollectionItem, CollectionItem> = z.union(\n [\n ExternalCollectionLinkSchema,\n InternalCollectionLinkSchema,\n z.lazy(() => CollectionGroupSchema),\n ],\n);\n\nexport const CollectionSchema = z.object({\n id: z\n .string()\n .min(1, { message: \"Folder name cannot be empty\" })\n .max(50, { message: \"Folder name too long\" })\n // Allows alphanumeric, hyphens, and underscores\n .regex(/^[a-zA-Z0-9-_]+$/, {\n message: \"Only alphanumeric, hyphens, and underscores allowed\",\n })\n .describe(\"The id of the collection, must match the folder name\"),\n items: z.array(CollectionItemSchema),\n label: z.string().optional().describe(\"The label of the collection\"),\n defaultLink: z\n .string()\n .optional()\n .describe(\"The default link of the collection\"),\n});\n\nexport type Collection = z.infer<typeof CollectionSchema>;\n\nexport type CollectionNavigation = {\n id: string;\n label: string;\n defaultLink?: string;\n};\n\nexport type CollectionInput = z.input<typeof CollectionSchema>;\n\nexport const CollectionsSchema = z.array(CollectionSchema);\n\nexport type Collections = z.infer<typeof CollectionsSchema>;\n\nexport interface InternalSidebarLinkType {\n slug: string;\n label: string;\n}\n\nexport interface ExternalSidebarLinkType {\n label: string;\n link: string;\n}\n\nexport type SidebarLinkType = InternalSidebarLinkType | ExternalSidebarLinkType;\n\nexport interface SidebarGroupType {\n label: string;\n items: SidebarItemType[];\n collapsible?: boolean | undefined;\n}\n\nexport type SidebarItemType =\n | InternalSidebarLinkType\n | SidebarGroupType\n | ExternalSidebarLinkType;\n\nexport interface SidebarType {\n items: SidebarItemType[];\n defaultLink: string;\n navigation: Record<string, NavigationLinks>;\n}\n\nexport interface SiblingNavigationType {\n label: string;\n link: string;\n}\n\nexport interface NavigationLinks {\n prev: SiblingNavigationType | null | undefined;\n next: SiblingNavigationType | null | undefined;\n}\n","import { FlexibleTocOptions } from \"remark-flexible-toc\";\nimport type { Options as RemarkGfmOptions } from \"remark-gfm\";\nimport { PluggableList } from \"unified\";\nimport { z } from \"zod\";\nimport { CollectionsSchema } from \"../core/content/content.types\";\n\nexport const PrestigeConfigSchema = z.object({\n title: z.string().describe(\"Title of the website\"),\n github: z.string().optional().describe(\"Github repo\"),\n algolia: z\n .object({\n appId: z.string().describe(\"Algolia app id\"),\n apiKey: z.string().describe(\"Algolia api key\"),\n indices: z.array(z.string()).describe(\"Algolia indices\"),\n })\n .optional()\n .describe(\"Algolia options\"),\n license: z\n .object({\n label: z.string().describe(\"License label\"),\n url: z.string().describe(\"License url\"),\n })\n .optional()\n .describe(\"License options\"),\n collections: CollectionsSchema,\n markdown: z\n .object({\n gfmOptions: z\n .custom<RemarkGfmOptions>()\n .optional()\n .describe(\"Options for remark-gfm\"),\n rehypePlugins: z\n .custom<PluggableList>()\n .optional()\n .describe(\"Additional rehype plugins\"),\n remarkPlugins: z\n .custom<PluggableList>()\n .optional()\n .describe(\"Additional remark plugins\"),\n remarkFlexibleToc: z\n .custom<FlexibleTocOptions>()\n .optional()\n .describe(\"Options for remark-flexible-toc\"),\n rehypeSlug: z\n .custom<{\n prefix?: string;\n }>()\n .optional()\n .describe(\"Options for rehype-slug\"),\n })\n .optional()\n .describe(\"Markdown options, configure how markdown is parsed\"),\n});\n\nexport type PrestigeConfigInput = z.input<typeof PrestigeConfigSchema>;\nexport type PrestigeConfig = z.infer<typeof PrestigeConfigSchema>;\n","import { mkdir, rm, stat, writeFile } from \"node:fs/promises\";\nimport { dirname } from \"pathe\";\n\nexport async function pathExists(path: string) {\n try {\n await stat(path);\n return true;\n } catch {\n return false;\n }\n}\n\nexport async function ensureDir(dirPath: string) {\n await mkdir(dirPath, { recursive: true });\n}\n\nexport async function outputFile(\n filePath: string,\n data: string | NodeJS.ArrayBufferView,\n) {\n const dir = dirname(filePath);\n\n // recursive: true won't throw if the dir already exists\n await mkdir(dir, { recursive: true });\n await writeFile(filePath, data);\n}\n\nexport async function rmSafe(path: string) {\n try {\n await rm(path, { recursive: true, force: true });\n return true;\n } catch {\n return false;\n }\n}\n\n// Helper function to extract the virtual ID from a messy path\nexport function extractVirtualId(fullId: string, virtualPrefix: string) {\n const startIndex = fullId.indexOf(virtualPrefix);\n if (startIndex !== -1) {\n // Slice from the start of the virtual prefix to the end of the string\n return \"\\0\" + fullId.slice(startIndex);\n }\n return null;\n}\n","import { parseWithFriendlyErrors, PrestigeError } from \"../utils/errors\";\nimport { PrestigeConfigInput, PrestigeConfigSchema } from \"./config.types\";\nimport { join } from \"pathe\";\nimport { pathExists } from \"../utils/file-utils\";\n\nexport function validateConfig(config: PrestigeConfigInput) {\n return parseWithFriendlyErrors(PrestigeConfigSchema, config, \"Invalid schema\");\n}\n\nexport async function resolvePrestigeConfig(\n configInput: PrestigeConfigInput | undefined,\n root: string,\n) {\n if (!configInput) {\n throw new PrestigeError(\"Prestige config is required\");\n }\n\n const validatedConfig = validateConfig(configInput);\n const docsDirPath = join(root, \"src/content\");\n\n if (!(await pathExists(docsDirPath))) {\n throw new PrestigeError(`Docs! directory not found: ${docsDirPath}`);\n }\n\n return { config: validatedConfig, fullDocsDir: docsDirPath };\n}\n","import { SidebarLinkType, SidebarItemType, SidebarType } from \"../core/content/content.types\";\n\nexport function resolveContentLinks(sidebars: Map<string, SidebarType>) {\n const links = new Map<string, SidebarLinkType[]>();\n for (const [key, sidebar] of sidebars) {\n const sidebarLinks: SidebarLinkType[] = [];\n for (const item of sidebar.items) {\n processItem(item, sidebarLinks);\n }\n links.set(key, sidebarLinks);\n }\n return links;\n}\n\nfunction processItem(item: SidebarItemType, links: SidebarLinkType[] = []) {\n if (\"slug\" in item || \"link\" in item) {\n links.push(item);\n } else if (\"items\" in item) {\n for (const childItem of item.items) {\n processItem(childItem, links);\n }\n }\n return links;\n}\n","import { createLogger } from \"vite\";\nconst logger = createLogger(undefined, { prefix: \"[Prestige]\" });\nexport default logger;\n","import { compile } from \"@mdx-js/mdx\";\nimport rehypePrism from \"rehype-prism-plus\";\nimport rehypeSlug from \"rehype-slug\";\nimport remarkDirective from \"remark-directive\";\nimport remarkFlexibleToc, { TocItem } from \"remark-flexible-toc\";\nimport remarkFrontmatter from \"remark-frontmatter\";\nimport remarkGfm from \"remark-gfm\";\nimport { PluggableList } from \"unified\";\nimport { Compatible, VFile } from \"vfile\";\nimport { matter } from \"vfile-matter\";\nimport { PrestigeConfig } from \"../config/config.types\";\n\nimport { h } from \"hastscript\";\nimport type { Node } from \"unist\";\nimport { visit } from \"unist-util-visit\";\n\nexport default function remarkAdmonitions() {\n return (tree: Node) => {\n visit(tree, (node: any) => {\n if (\n node.type === \"textDirective\" ||\n node.type === \"leafDirective\" ||\n node.type === \"containerDirective\"\n ) {\n if (node.type !== \"containerDirective\") {\n const data = node.data || (node.data = {});\n const hast = h(node.type === \"textDirective\" ? \"span\" : \"aside\", {\n className: [\"admonition\", `admonition-${node.name}`],\n ...node.attributes,\n });\n data.hName = hast.tagName;\n data.hProperties = hast.properties;\n return;\n }\n\n const type = [\"note\", \"tip\", \"caution\", \"danger\"].includes(node.name)\n ? node.name\n : \"note\";\n\n const typeMap: Record<\"note\" | \"tip\" | \"caution\" | \"danger\", string> = {\n note: \"bg-blue-50/50 dark:bg-blue-900/20 border-blue-500 text-blue-900 dark:text-blue-200\",\n tip: \"bg-purple-50/50 dark:bg-purple-900/20 border-purple-500 text-purple-900 dark:text-purple-200\",\n caution:\n \"bg-yellow-50/50 dark:bg-yellow-900/20 border-yellow-500 text-yellow-900 dark:text-yellow-200\",\n danger:\n \"bg-red-50/50 dark:bg-red-900/20 border-red-500 text-red-900 dark:text-red-200\",\n };\n\n const data = node.data || (node.data = {});\n data.hName = \"aside\";\n data.hProperties = {\n \"aria-label\": type.charAt(0).toUpperCase() + type.slice(1),\n className: [\n \"relative\",\n \"my-6\",\n \"px-4\",\n \"py-3\",\n \"border-l-4\",\n \"rounded-lg\",\n ...(typeMap[type as keyof typeof typeMap] || typeMap[\"note\"]).split(\n \" \",\n ),\n ],\n ...node.attributes,\n };\n\n let titleNodeIndex = node.children.findIndex(\n (c: any) => c.data?.directiveLabel,\n );\n let titleChildren: any[];\n\n if (titleNodeIndex !== -1) {\n titleChildren = node.children[titleNodeIndex].children;\n node.children.splice(titleNodeIndex, 1);\n } else {\n titleChildren = [\n {\n type: \"text\",\n value: type.charAt(0).toUpperCase() + type.slice(1),\n },\n ];\n }\n\n const getIconHast = (t: string) => {\n const props = {\n xmlns: \"http://www.w3.org/2000/svg\",\n width: \"24\",\n height: \"24\",\n viewBox: \"0 0 24 24\",\n fill: \"none\",\n stroke: \"currentColor\",\n strokeWidth: \"2\",\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\",\n className: [\"w-5\", \"h-5\", \"flex-shrink-0\"],\n };\n if (t === \"note\")\n return h(\"svg\", props, [\n h(\"circle\", { cx: \"12\", cy: \"12\", r: \"10\" }),\n h(\"path\", { d: \"M12 16v-4\" }),\n h(\"path\", { d: \"M12 8h.01\" }),\n ]);\n if (t === \"tip\")\n return h(\"svg\", props, [\n h(\"path\", {\n d: \"M4.5 16.5c-1.5 1.26-2 5-2 5s3.74-.5 5-2c.71-.84.7-2.13-.09-2.91a2.18 2.18 0 0 0-2.91-.09z\",\n }),\n h(\"path\", {\n d: \"m12 15-3-3a22 22 0 0 1 2-3.95A12.88 12.88 0 0 1 22 2c0 2.72-.78 7.5-6 11a22.35 22.35 0 0 1-4 2z\",\n }),\n h(\"path\", { d: \"M9 12H4s.55-3.03 2-4c1.62-1.08 5 0 5 0\" }),\n h(\"path\", { d: \"M12 15v5s3.03-.55 4-2c1.08-1.62 0-5 0-5\" }),\n ]);\n if (t === \"caution\")\n return h(\"svg\", props, [\n h(\"path\", {\n d: \"m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3Z\",\n }),\n h(\"path\", { d: \"M12 9v4\" }),\n h(\"path\", { d: \"M12 17h.01\" }),\n ]);\n if (t === \"danger\")\n return h(\"svg\", props, [\n h(\"polygon\", {\n points:\n \"7.86 2 16.14 2 22 7.86 22 16.14 16.14 22 7.86 22 2 16.14 2 7.86 7.86 2\",\n }),\n h(\"path\", { d: \"M12 8v4\" }),\n h(\"path\", { d: \"M12 16h.01\" }),\n ]);\n return null;\n };\n\n const titleBlock = {\n type: \"paragraph\",\n data: {\n hName: \"p\",\n hProperties: {\n className: [\n \"flex\",\n \"items-center\",\n \"gap-2\",\n \"mb-2\",\n \"mt-0\",\n \"font-bold\",\n \"text-lg\",\n ],\n },\n },\n children: [\n {\n type: \"text\",\n value: \"\",\n data: { hName: \"span\", hChildren: [getIconHast(type)] },\n },\n ...titleChildren,\n ],\n };\n\n const contentBlock = {\n type: \"paragraph\",\n data: {\n hName: \"section\",\n hProperties: {\n className: [\n \"[&>p]:mt-0\",\n \"[&>p]:mb-2\",\n \"[&>p:last-child]:mb-0\",\n \"text-sm\",\n ],\n },\n },\n children: node.children,\n };\n\n node.children = [titleBlock, contentBlock];\n }\n });\n };\n}\n\nexport async function compileMarkdown(\n content: Readonly<Compatible>,\n baseUrl: string,\n options?: PrestigeConfig[\"markdown\"],\n) {\n const toc: TocItem[] = [];\n\n const rehypePlugins: PluggableList = [\n ...(options?.rehypePlugins ?? []),\n rehypeSlug,\n rehypePrism,\n ];\n\n const remarkPlugins: PluggableList = [\n ...(options?.remarkPlugins ?? []),\n remarkFrontmatter,\n [remarkGfm, options?.gfmOptions || {}],\n remarkDirective,\n remarkAdmonitions,\n [remarkFlexibleToc, { tocRef: toc }],\n ];\n\n const code = await compile(content, {\n outputFormat: \"program\",\n rehypePlugins,\n remarkPlugins,\n baseUrl: baseUrl,\n });\n return { code: String(code), toc };\n}\n\nexport async function compileFrontmatter(vFile: VFile) {\n matter(vFile, { strip: true });\n return vFile.data[\"matter\"] || {};\n}\n\nexport function warmupCompiler(options?: PrestigeConfig[\"markdown\"]) {\n compileMarkdown(\"```js\\n```\", \"http://localhost\", options).catch(() => {});\n}\n","import { join } from \"node:path\";\nimport { pathToFileURL } from \"node:url\";\nimport { parse, relative } from \"pathe\";\nimport { glob } from \"tinyglobby\";\nimport { read } from \"to-vfile\";\nimport {\n SiblingNavigationType,\n SidebarLinkType,\n} from \"../core/content/content.types\";\nimport { compileMarkdown } from \"./content-compiler\";\n\nimport { PrestigeError } from \"../utils/errors\";\nimport { compileFrontmatter } from \"./content-compiler\";\n\nexport const CONTENT_VIRTUAL_ID = \"virtual:prestige/content/\";\n\nfunction getSiblingLink(\n link: SidebarLinkType | undefined,\n): SiblingNavigationType | undefined {\n if (!link) {\n return undefined;\n }\n return {\n label: link.label,\n link: \"slug\" in link ? link.slug : link.link,\n };\n}\n\nexport function resolveSiblings(\n base: string,\n slug: string,\n linksMap: Map<string, SidebarLinkType[]>,\n) {\n const links = linksMap.get(base);\n if (!links?.length) {\n return { prev: undefined, next: undefined };\n }\n\n const validLinks = links.filter((l) => {\n if (\"slug\" in l) return true;\n if (\"link\" in l) {\n return !l.link.startsWith(\"http://\") && !l.link.startsWith(\"https://\");\n }\n return false;\n });\n\n const linkIndex = validLinks.findIndex((link) => {\n return (\n (\"slug\" in link && link.slug === slug) ||\n (\"link\" in link && link.link === slug)\n );\n });\n\n let prev: SiblingNavigationType | undefined;\n let next: SiblingNavigationType | undefined;\n\n if (linkIndex !== -1) {\n if (linkIndex > 0) {\n prev = getSiblingLink(validLinks[linkIndex - 1]);\n }\n if (linkIndex < validLinks.length - 1) {\n next = getSiblingLink(validLinks[linkIndex + 1]);\n }\n }\n\n return { prev, next };\n}\n\nexport async function resolveMarkdown(slug: string, contentDir: string) {\n const filePath = await getPathBySlug(slug, contentDir);\n const baseUrl = pathToFileURL(filePath).href;\n const file = await read(filePath);\n const frontmatter = await compileFrontmatter(file);\n const { code, toc } = await compileMarkdown(file, baseUrl);\n return { code, toc, frontmatter };\n}\n\nexport async function resolveContent(\n id: string,\n linksMap: Map<string, SidebarLinkType[]>,\n contentDir: string,\n) {\n const slug = id.replace(CONTENT_VIRTUAL_ID, \"\").replace(\"\\0\", \"\");\n const base = slug.split(\"/\")[0] as string;\n\n const { prev, next } = resolveSiblings(base, slug, linksMap);\n const { toc, code, frontmatter } = await resolveMarkdown(slug, contentDir);\n let resolvedCode = code;\n\n resolvedCode += `\\n export const toc = ${JSON.stringify(toc)}\\n`;\n resolvedCode += `\\n export const prev = ${JSON.stringify(prev)}\\n`;\n resolvedCode += `\\n export const next = ${JSON.stringify(next)}\\n`;\n resolvedCode += `\\n export const frontmatter = ${JSON.stringify(\n frontmatter,\n )}\\n`;\n return resolvedCode;\n}\n\nexport async function getPathBySlug(slug: string, contentDir: string) {\n const pathMatch = join(contentDir, slug);\n const matches = await glob(`${pathMatch}.{md,mdx}`);\n if (matches.length === 0) {\n throw new PrestigeError(\n `[Prestige] Could not find markdown file for slug: \"${slug}\". Searched at: ${pathMatch}.{md,mdx}. If you want to link to a custom page, use 'link: \"${slug}\"' instead of 'slug: \"${slug}\"' in your collection config.`,\n );\n }\n return matches[0] as string;\n}\n\nexport async function getFileBySlug(slug: string, contentDir: string) {\n return await read(await getPathBySlug(slug, contentDir));\n}\n\nexport function getVirtualModuleIdsForFile(path: string, contentDir: string) {\n const slug = getSlugByPath(path, contentDir);\n return [\"\\0\" + CONTENT_VIRTUAL_ID + slug];\n}\n\nexport function getSlugByPath(path: string, contentDir: string) {\n // 1. Get the relative path: \"zz/zz/myFile.json\"\n const relativePath = relative(contentDir, path);\n\n // 2. Parse the path to separate the extension\n const pathInfo = parse(relativePath);\n\n const result = join(pathInfo.dir, pathInfo.name);\n\n return result;\n}\n","import { readdir } from \"node:fs/promises\";\nimport { basename } from \"node:path\";\nimport { join } from \"pathe\";\nimport {\n Collection,\n CollectionGroup,\n CollectionItem,\n Collections,\n ExternalSidebarLinkType,\n InternalCollectionLink,\n InternalSidebarLinkType,\n NavigationLinks,\n SiblingNavigationType,\n SidebarGroupType,\n SidebarItemType,\n SidebarType,\n} from \"../core/content/content.types\";\nimport { PrestigeError } from \"../utils/errors\";\nimport { pathExists } from \"../utils/file-utils\";\nimport logger from \"../utils/logger\";\nimport { compileFrontmatter } from \"./content-compiler\";\nimport { getFileBySlug } from \"./content.store\";\n\nexport const SIDEBAR_VIRTUAL_ID = \"virtual:prestige/sidebar/\";\n\nfunction flattenSidebar(items: SidebarItemType[]): SiblingNavigationType[] {\n return items.flatMap((item) => {\n if (\"slug\" in item) {\n return [{ label: item.label, link: `/${item.slug}` }];\n }\n if (\"link\" in item) {\n // Ignore external links\n if (item.link.startsWith(\"http://\") || item.link.startsWith(\"https://\")) {\n return [];\n }\n return [{ label: item.label, link: item.link }];\n }\n if (\"items\" in item) {\n return flattenSidebar(item.items);\n }\n return [];\n });\n}\n\nfunction computeNavigation(\n items: SidebarItemType[],\n): Record<string, NavigationLinks> {\n const flattenedLinks = flattenSidebar(items);\n const navigation: Record<string, NavigationLinks> = {};\n\n for (let i = 0; i < flattenedLinks.length; i++) {\n const link = flattenedLinks[i];\n if (link) {\n navigation[link.link] = {\n prev: i > 0 ? flattenedLinks[i - 1] : null,\n next: i < flattenedLinks.length - 1 ? flattenedLinks[i + 1] : null,\n };\n }\n }\n\n return navigation;\n}\n\nfunction resolveDefaultLink(\n items: SidebarItemType[],\n defaultLink?: string,\n): string | undefined {\n if (defaultLink) {\n return defaultLink;\n }\n for (const item of items) {\n if (\"slug\" in item) {\n return item.slug;\n } else if (\"link\" in item) {\n return item.link;\n } else if (\"items\" in item && item.items.length > 0) {\n const link = resolveDefaultLink(item.items);\n if (link) return link;\n }\n }\n return undefined;\n}\n\nexport async function resolveSidebars(\n collections: Collections,\n contentDir: string,\n) {\n const store = new Map<string, SidebarType>();\n\n for (const collection of collections) {\n const sidebar = await processCollection(collection, contentDir);\n store.set(collection.id, sidebar);\n }\n return store;\n}\n\n/** @visibleForTesting */\nasync function processCollection(\n collection: Collection,\n contentDir: string,\n): Promise<SidebarType> {\n const items: SidebarItemType[] = [];\n for (const item of collection.items) {\n items.push(await processItem(item, contentDir));\n }\n const defaultLink = resolveDefaultLink(items, collection.defaultLink);\n if (!defaultLink) {\n throw new PrestigeError(\n `No default link found in collection, it means there are no links in the collection. Please define one in ${collection.id}`,\n );\n }\n return {\n items,\n defaultLink: defaultLink,\n navigation: computeNavigation(items),\n };\n}\n\n/** @visibleForTesting */\nasync function processItem(\n item: CollectionItem,\n contentDir: string,\n): Promise<SidebarItemType> {\n if (typeof item === \"string\" || \"slug\" in item) {\n return resolveInternalSidebarLink(\n item as InternalCollectionLink,\n contentDir,\n );\n } else if (\"link\" in item) {\n return resolveSidebarLink(item, contentDir);\n } else {\n return resolveSidebarGroup(item as CollectionGroup, contentDir);\n }\n}\n\n/** @visibleForTesting */\nasync function resolveSidebarGroup(\n group: CollectionGroup,\n contentDir: string,\n): Promise<SidebarGroupType> {\n const label = await resolveLabel(group, contentDir);\n const items: SidebarItemType[] = [];\n\n if (group.items?.length && group.autogenerate) {\n logger.warn(\n `${group.label} has both items and autogenerate. Only items will be used.`,\n );\n }\n\n if (group.items) {\n for (const childItem of group.items) {\n items.push(await processItem(childItem, contentDir));\n }\n } else if (group.autogenerate?.directory) {\n const generatedItems = await autogenerateSidebar(\n group.autogenerate.directory,\n contentDir,\n );\n items.push(...generatedItems);\n }\n\n return {\n label,\n collapsible: group.collapsible,\n items,\n };\n}\n\n/** @visibleForTesting */\nasync function resolveInternalSidebarLink(\n item: InternalCollectionLink,\n contentDir: string,\n): Promise<InternalSidebarLinkType> {\n const label = await resolveLabel(item, contentDir);\n const slug = resolveSlug(item);\n\n if (slug.startsWith(\"/\") || slug.endsWith(\"/\")) {\n throw new PrestigeError(\n `The slug ${slug} cannot start or end with a slash. Remove it and try again.`,\n );\n }\n\n if (!slug) {\n throw new PrestigeError(\n `The slug cannot be empty. Remove it and try again. link label is ${label}`,\n );\n }\n\n return {\n label,\n slug,\n };\n}\n\n/** @visibleForTesting */\nasync function resolveSidebarLink(\n item: ExternalSidebarLinkType,\n contentDir: string,\n): Promise<ExternalSidebarLinkType> {\n const label = await resolveLabel(item, contentDir);\n const link = resolveLink(item);\n\n if (!link) {\n throw new PrestigeError(\n `The link cannot be empty. Remove it and try again. link label is ${label}`,\n );\n }\n\n return {\n label,\n link,\n };\n}\n\n/** @visibleForTesting */\nasync function autogenerateSidebar(\n directory: string,\n contentDir: string,\n): Promise<SidebarItemType[]> {\n const fileExtRegex = /\\.mdx?$/i;\n\n const items: SidebarItemType[] = [];\n const dirPath = join(contentDir, directory);\n if (!(await pathExists(dirPath))) {\n logger.warn(`Directory doesn't exist: ${directory}`);\n return [];\n }\n\n const dirents = await readdir(dirPath, { withFileTypes: true });\n dirents.sort((a, b) => a.name.localeCompare(b.name));\n for (const dirent of dirents) {\n if (dirent.isDirectory()) {\n const subDir = join(directory, dirent.name);\n const group: CollectionGroup = {\n label: dirent.name,\n autogenerate: { directory: subDir },\n };\n items.push(await resolveSidebarGroup(group, contentDir));\n } else if (dirent.isFile() && fileExtRegex.test(dirent.name)) {\n const fullPath = join(directory, dirent.name);\n const slug = fullPath.replace(fileExtRegex, \"\");\n items.push(await resolveInternalSidebarLink(slug, contentDir));\n }\n }\n return items;\n}\n\n/** @visibleForTesting */\nasync function resolveLabel(\n item: CollectionItem,\n contentDir: string,\n): Promise<string> {\n if (typeof item !== \"string\" && \"label\" in item && item.label) {\n return item.label;\n }\n\n if (typeof item === \"string\" || \"slug\" in item) {\n const slug = resolveSlug(item);\n\n const file = await getFileBySlug(slug, contentDir);\n if (!file) {\n throw new PrestigeError(\n `markdown file not found with slug: ${slug} add one in content folder or update config`,\n );\n }\n const data = (await compileFrontmatter(file)) as any;\n if (data?.label) {\n return data?.label;\n }\n\n return basename(slug);\n }\n\n // is a group\n if (typeof item !== \"string\" && (\"items\" in item || \"autogenerate\" in item)) {\n return item.label;\n }\n\n return \"\";\n}\n\n/** @visibleForTesting */\nexport function resolveSlug(item: CollectionItem) {\n if (typeof item === \"string\") {\n return item;\n } else {\n if (\"slug\" in item) {\n return item.slug;\n }\n return \"\";\n }\n}\n\n/** @visibleForTesting */\nexport function resolveLink(item: CollectionItem) {\n if (typeof item === \"object\" && \"link\" in item) {\n return item.link;\n }\n return \"\";\n}\n","import { mkdir, readdir, readFile, unlink, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { SidebarLinkType } from \"../core/content/content.types\";\nimport logger from \"../utils/logger\";\n\nexport async function compileRoutes(\n linksMap: Map<string, SidebarLinkType[]>,\n routesDir: string,\n) {\n const prestigePath = \"(prestige)\";\n const prestigeFullPath = join(routesDir, prestigePath);\n\n try {\n await mkdir(prestigeFullPath, { recursive: true });\n\n const generatedFiles = new Map<string, string>();\n\n for (const [key, links] of linksMap) {\n const onlyInternalLinks = links.filter((l) => \"slug\" in l);\n\n const sidebarPath = key;\n const sidebarFile = sidebarPath + \".lazy.tsx\";\n generatedFiles.set(sidebarFile, createLayoutRoute(key));\n\n for (const l of onlyInternalLinks) {\n const pathified = l.slug.replaceAll(\"/\", \".\") + \".lazy.tsx\";\n generatedFiles.set(pathified, createContentRoute(l.slug));\n }\n }\n\n // Write files only if they have changed or do not exist\n await Promise.all(\n [...generatedFiles.entries()].map(async ([fileName, contents]) => {\n const filePath = join(prestigeFullPath, fileName);\n try {\n const existingContent = await readFile(filePath, \"utf-8\");\n if (existingContent === contents) {\n return; // Skip writing if identical\n }\n } catch (e) {\n // File doesn't exist yet, proceed to write\n }\n logger.info(`Writing route file: ${fileName}`, { timestamp: true });\n return writeFile(filePath, contents);\n }),\n );\n\n const existingFiles = await readdir(prestigeFullPath);\n const staleFiles = existingFiles.filter(\n (fileName) =>\n fileName.endsWith(\".lazy.tsx\") && !generatedFiles.has(fileName),\n );\n\n await Promise.all(\n staleFiles.map((fileName) => {\n logger.info(`Removing stale route file: ${fileName}`, {\n timestamp: true,\n });\n return unlink(join(prestigeFullPath, fileName));\n }),\n );\n } catch (error) {\n logger.error(\n `[Prestige Router Compiler] Failed to compile routes: ${error}`,\n { timestamp: true },\n );\n console.error(\n \"[Prestige Router Compiler] Failed to compile routes:\",\n error,\n );\n }\n}\n\nfunction createLayoutRoute(id: string) {\n return (\n `\nimport { createLazyFileRoute } from '@tanstack/react-router';\nimport sidebar from \"virtual:prestige/sidebar/${id}\";\nimport { CollectionRoute } from \"@lonik/prestige/ui\";\n\nexport const Route = createLazyFileRoute('/(prestige)/${id}')(CollectionRoute(sidebar, \"${id}\"));\n`.trim() + \"\\n\"\n );\n}\n\nfunction createContentRoute(slug: string) {\n return (\n `\nimport { createLazyFileRoute } from \"@tanstack/react-router\";\nimport * as contentData from \"virtual:prestige/content/${slug}\";\nimport { ContentRoute } from \"@lonik/prestige/ui\";\n\nexport const Route = createLazyFileRoute('/(prestige)/${slug}')(ContentRoute(contentData));\n`.trim() + \"\\n\"\n );\n}\n","import { genDynamicImport } from \"knitwork\";\n\nexport function genExportDefault(specifier: string) {\n return `export default ${specifier};`;\n}\n\n/** exports default undefined */\nexport function genExportUndefined() {\n return genExportDefault(\"undefined\");\n}\n\nexport function genDynamicImportWithDefault(specifier: string) {\n return `${genDynamicImport(specifier)}.then(m => m.default)`;\n}\n","import { genArrayFromRaw, genObjectFromValues } from \"knitwork\";\nimport { genExportDefault } from \"../../utils/code-generation\";\nimport { PrestigeError } from \"../../utils/errors\";\nimport {\n CollectionNavigation,\n Collections,\n SidebarLinkType,\n} from \"./content.types\";\n\nexport const COLLECTION_VIRTUAL_ID = \"virtual:prestige/collection-all\";\n\nexport function resolveCollectionNavigations(\n inlineCollections: Collections,\n linksMap: Map<string, SidebarLinkType[]>,\n) {\n const collections: CollectionNavigation[] = inlineCollections.map((c) => ({\n id: c.id,\n label: c.label ?? c.id,\n defaultLink: c.defaultLink ?? \"\",\n }));\n if (collections.length === 0) {\n throw new PrestigeError(\n `No collections found, add one in prestige plugin config`,\n );\n }\n\n for (const coll of collections) {\n const links = linksMap.get(coll.id);\n const firstInternalLink = links?.find(l => \"slug\" in l);\n if (coll.defaultLink || !firstInternalLink) {\n continue;\n }\n coll.defaultLink = firstInternalLink.slug;\n }\n\n for (const coll of collections) {\n if (!coll.defaultLink) {\n console.warn(\n `No default link found for collection ${coll.id}, it won't be displayed in the header navigation`,\n );\n }\n }\n\n const validCollections = collections.filter((c) => c.defaultLink);\n\n return genExportDefault(\n genArrayFromRaw(validCollections.map((c) => genObjectFromValues(c))),\n );\n}\n","import { join } from \"pathe\";\nimport picomatch, { type Matcher } from \"picomatch\";\nimport { EnvironmentModuleNode, type Plugin } from \"vite\";\nimport { resolvePrestigeConfig } from \"./config/config\";\nimport { PrestigeConfig, PrestigeConfigInput } from \"./config/config.types\";\n\nimport { genObjectFromValues } from \"knitwork\";\nimport { resolveContentLinks } from \"./content/content-links\";\nimport {\n resolveSidebars,\n SIDEBAR_VIRTUAL_ID,\n} from \"./content/content-sidebar.store\";\nimport {\n CONTENT_VIRTUAL_ID,\n getSlugByPath,\n resolveContent,\n} from \"./content/content.store\";\nimport { compileRoutes } from \"./content/router-compiler\";\nimport {\n COLLECTION_VIRTUAL_ID,\n resolveCollectionNavigations,\n} from \"./core/content/content-collection.store\";\nimport {\n Collections,\n SidebarLinkType,\n SidebarType,\n} from \"./core/content/content.types\";\nimport { genExportDefault, genExportUndefined } from \"./utils/code-generation\";\nimport { extractVirtualId } from \"./utils/file-utils\";\nimport logger from \"./utils/logger\";\n\nexport const CONFIG_VIRTUAL_ID = \"virtual:prestige/config\";\n\nexport default function prestige(inlineConfig?: PrestigeConfigInput): Plugin {\n let config: PrestigeConfig;\n let contentDir: string;\n let isDocsMatcher: Matcher;\n let collections: Collections = [];\n let linksMap: Map<string, SidebarLinkType[]>;\n let collectionNavigations: string;\n let sidebarsMap: Map<string, SidebarType>;\n return {\n name: \"vite-plugin-prestige\",\n enforce: \"pre\",\n async configResolved(resolvedConfig) {\n logger.info(\"Resolving Prestige configuration...\", { timestamp: true });\n const { config: loadedConfig } = await resolvePrestigeConfig(\n inlineConfig,\n resolvedConfig.root,\n );\n config = loadedConfig;\n contentDir = join(resolvedConfig.root, \"src/content\");\n isDocsMatcher = picomatch(join(contentDir, \"**/*.{md,mdx}\"));\n collections = config.collections ?? [];\n\n logger.info(\"Resolving sidebars...\", { timestamp: true });\n sidebarsMap = await resolveSidebars(collections, contentDir);\n\n logger.info(\"Resolving content links...\", { timestamp: true });\n linksMap = resolveContentLinks(sidebarsMap);\n\n logger.info(\"Resolving collection navigations....\", { timestamp: true });\n collectionNavigations = resolveCollectionNavigations(\n collections,\n linksMap,\n );\n\n const routesDir = join(resolvedConfig.root, \"src\", \"routes\");\n\n logger.info(\"Compiling routes...\", { timestamp: true });\n await compileRoutes(linksMap, routesDir);\n },\n resolveId(id) {\n // even though the import will be import * from \"virtual:prestige/docs/introduction\"\n // it is not guaranteed that some other plugin doesn't modify this import and attach full path\n // we call extractVirtualId to trim the import\n\n if (id.includes(CONFIG_VIRTUAL_ID)) {\n logger.info(`Resolving config virtual ID: ${id}`, { timestamp: true });\n return extractVirtualId(id, CONFIG_VIRTUAL_ID);\n }\n\n if (id.includes(CONTENT_VIRTUAL_ID)) {\n logger.info(`Resolving content virtual ID: ${id}`, { timestamp: true });\n return extractVirtualId(id, CONTENT_VIRTUAL_ID);\n }\n\n if (id.includes(COLLECTION_VIRTUAL_ID)) {\n logger.info(`Resolving collection virtual ID: ${id}`, {\n timestamp: true,\n });\n return extractVirtualId(id, COLLECTION_VIRTUAL_ID);\n }\n\n if (id.includes(SIDEBAR_VIRTUAL_ID)) {\n logger.info(`Resolving sidebar virtual ID: ${id}`, { timestamp: true });\n return extractVirtualId(id, SIDEBAR_VIRTUAL_ID);\n }\n\n return null;\n },\n async load(id) {\n if (id === `\\0${CONFIG_VIRTUAL_ID}`) {\n logger.info(`Loading config virtual module: ${id}`, {\n timestamp: true,\n });\n return genExportDefault(JSON.stringify(config));\n }\n if (id.includes(CONTENT_VIRTUAL_ID)) {\n logger.info(`Loading content virtual module: ${id}`, {\n timestamp: true,\n });\n return await resolveContent(id, linksMap, contentDir);\n }\n if (id.includes(COLLECTION_VIRTUAL_ID)) {\n logger.info(`Loading collection virtual module: ${id}`, {\n timestamp: true,\n });\n return collectionNavigations;\n }\n\n if (id.includes(SIDEBAR_VIRTUAL_ID)) {\n logger.info(`Loading sidebar virtual module: ${id}`, {\n timestamp: true,\n });\n const sidebarId = id.replace(SIDEBAR_VIRTUAL_ID, \"\").replace(\"\\0\", \"\");\n const sidebar = sidebarsMap.get(sidebarId);\n if (!sidebar) {\n return genExportUndefined();\n }\n return genExportDefault(genObjectFromValues(sidebar));\n }\n\n return null;\n },\n\n async hotUpdate({ file, timestamp }) {\n if (isDocsMatcher(file)) {\n logger.info(`Invalidating module ${file}...`, { timestamp: true });\n const invalidatedModules = new Set<EnvironmentModuleNode>();\n const slug = getSlugByPath(file, contentDir);\n const virtualModuleId = `\\0${CONTENT_VIRTUAL_ID}${slug}`;\n const module =\n this.environment.moduleGraph.getModuleById(virtualModuleId);\n if (module) {\n this.environment.moduleGraph.invalidateModule(\n module,\n invalidatedModules,\n timestamp,\n true,\n );\n logger.info(`Reloading application...`, { timestamp: true });\n this.environment.hot.send({ type: \"full-reload\" });\n }\n }\n },\n };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAEA,IAAa,gBAAb,cAAmC,MAAM;;;;;AAMzC,SAAgB,wBAA2C,GAAM,OAAiB,SAAiB;AACjG,KAAI;AACF,SAAO,EAAE,MAAM,MAAM;UACd,GAAG;AACV,MAAI,aAAa,MACf,OAAM,IAAI,cAAc,yBAAyB,QAAQ,gBAAgB,EAAE,QAAQ,GAAG;MAEtF,OAAM,IAAI,cAAc,yBAAyB,QAAQ,GAAG;;;;;;ACblE,MAAa,2BAA2B,EAAE,OAAO;CAC/C,OAAO,EAAE,QAAQ,CAAC,SAAS,2BAA2B;CACtD,aAAa,EAAE,QAAQ,CAAC,UAAU,CAAC,SAAS,iCAAiC;CAC7E,OAAO,EAAE,QAAQ,CAAC,UAAU,CAAC,SAAS,2BAA2B;CAClE,CAAC;AAIF,MAAa,gBAAgB,EAAE,OAAO;CACpC,QAAQ;CACR,MAAM,EAAE,QAAQ,CAAC,SAAS,0BAA0B;CACrD,CAAC;AAIF,MAAM,+BAA+B,EAAE,MAAM,CAC3C,EAAE,OAAO;CACP,OAAO,EAAE,QAAQ;CACjB,MAAM,EAAE,QAAQ;CACjB,CAAC,EACF,EAAE,QAAQ,CACX,CAAC;AAEF,MAAM,+BAA+B,EAAE,OAAO;CAC5C,OAAO,EAAE,QAAQ;CACjB,MAAM,EAAE,QAAQ;CACjB,CAAC;AAsBF,MAAMA,wBACJ,EAAE,OAAO;CACP,OAAO,EAAE,QAAQ;CACjB,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC,CAAC,UAAU;CAC7D,aAAa,EAAE,SAAS,CAAC,UAAU;CACnC,cAAc,EACX,OAAO,EACN,WAAW,EAAE,QAAQ,EACtB,CAAC,CACD,UAAU;CACd,CAAC;AAEJ,MAAMC,uBAAkE,EAAE,MACxE;CACE;CACA;CACA,EAAE,WAAW,sBAAsB;CACpC,CACF;AAED,MAAa,mBAAmB,EAAE,OAAO;CACvC,IAAI,EACD,QAAQ,CACR,IAAI,GAAG,EAAE,SAAS,+BAA+B,CAAC,CAClD,IAAI,IAAI,EAAE,SAAS,wBAAwB,CAAC,CAE5C,MAAM,oBAAoB,EACzB,SAAS,uDACV,CAAC,CACD,SAAS,uDAAuD;CACnE,OAAO,EAAE,MAAM,qBAAqB;CACpC,OAAO,EAAE,QAAQ,CAAC,UAAU,CAAC,SAAS,8BAA8B;CACpE,aAAa,EACV,QAAQ,CACR,UAAU,CACV,SAAS,qCAAqC;CAClD,CAAC;AAYF,MAAa,oBAAoB,EAAE,MAAM,iBAAiB;;;;AC5F1D,MAAa,uBAAuB,EAAE,OAAO;CAC3C,OAAO,EAAE,QAAQ,CAAC,SAAS,uBAAuB;CAClD,QAAQ,EAAE,QAAQ,CAAC,UAAU,CAAC,SAAS,cAAc;CACrD,SAAS,EACN,OAAO;EACN,OAAO,EAAE,QAAQ,CAAC,SAAS,iBAAiB;EAC5C,QAAQ,EAAE,QAAQ,CAAC,SAAS,kBAAkB;EAC9C,SAAS,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC,SAAS,kBAAkB;EACzD,CAAC,CACD,UAAU,CACV,SAAS,kBAAkB;CAC9B,SAAS,EACN,OAAO;EACN,OAAO,EAAE,QAAQ,CAAC,SAAS,gBAAgB;EAC3C,KAAK,EAAE,QAAQ,CAAC,SAAS,cAAc;EACxC,CAAC,CACD,UAAU,CACV,SAAS,kBAAkB;CAC9B,aAAa;CACb,UAAU,EACP,OAAO;EACN,YAAY,EACT,QAA0B,CAC1B,UAAU,CACV,SAAS,yBAAyB;EACrC,eAAe,EACZ,QAAuB,CACvB,UAAU,CACV,SAAS,4BAA4B;EACxC,eAAe,EACZ,QAAuB,CACvB,UAAU,CACV,SAAS,4BAA4B;EACxC,mBAAmB,EAChB,QAA4B,CAC5B,UAAU,CACV,SAAS,kCAAkC;EAC9C,YAAY,EACT,QAEG,CACH,UAAU,CACV,SAAS,0BAA0B;EACvC,CAAC,CACD,UAAU,CACV,SAAS,qDAAqD;CAClE,CAAC;;;;ACjDF,eAAsB,WAAW,MAAc;AAC7C,KAAI;AACF,QAAM,KAAK,KAAK;AAChB,SAAO;SACD;AACN,SAAO;;;AA6BX,SAAgB,iBAAiB,QAAgB,eAAuB;CACtE,MAAM,aAAa,OAAO,QAAQ,cAAc;AAChD,KAAI,eAAe,GAEjB,QAAO,OAAO,OAAO,MAAM,WAAW;AAExC,QAAO;;;;;ACtCT,SAAgB,eAAe,QAA6B;AAC1D,QAAO,wBAAwB,sBAAsB,QAAQ,iBAAiB;;AAGhF,eAAsB,sBACpB,aACA,MACA;AACA,KAAI,CAAC,YACH,OAAM,IAAI,cAAc,8BAA8B;CAGxD,MAAM,kBAAkB,eAAe,YAAY;CACnD,MAAM,cAAc,KAAK,MAAM,cAAc;AAE7C,KAAI,CAAE,MAAM,WAAW,YAAY,CACjC,OAAM,IAAI,cAAc,8BAA8B,cAAc;AAGtE,QAAO;EAAE,QAAQ;EAAiB,aAAa;EAAa;;;;;ACtB9D,SAAgB,oBAAoB,UAAoC;CACtE,MAAM,wBAAQ,IAAI,KAAgC;AAClD,MAAK,MAAM,CAAC,KAAK,YAAY,UAAU;EACrC,MAAMC,eAAkC,EAAE;AAC1C,OAAK,MAAM,QAAQ,QAAQ,MACzB,eAAY,MAAM,aAAa;AAEjC,QAAM,IAAI,KAAK,aAAa;;AAE9B,QAAO;;AAGT,SAASC,cAAY,MAAuB,QAA2B,EAAE,EAAE;AACzE,KAAI,UAAU,QAAQ,UAAU,KAC9B,OAAM,KAAK,KAAK;UACP,WAAW,KACpB,MAAK,MAAM,aAAa,KAAK,MAC3B,eAAY,WAAW,MAAM;AAGjC,QAAO;;;;;ACrBT,MAAM,SAAS,aAAa,QAAW,EAAE,QAAQ,cAAc,CAAC;AAChE,qBAAe;;;;ACcf,SAAwB,oBAAoB;AAC1C,SAAQ,SAAe;AACrB,QAAM,OAAO,SAAc;AACzB,OACE,KAAK,SAAS,mBACd,KAAK,SAAS,mBACd,KAAK,SAAS,sBACd;AACA,QAAI,KAAK,SAAS,sBAAsB;KACtC,MAAMC,SAAO,KAAK,SAAS,KAAK,OAAO,EAAE;KACzC,MAAM,OAAO,EAAE,KAAK,SAAS,kBAAkB,SAAS,SAAS;MAC/D,WAAW,CAAC,cAAc,cAAc,KAAK,OAAO;MACpD,GAAG,KAAK;MACT,CAAC;AACF,YAAK,QAAQ,KAAK;AAClB,YAAK,cAAc,KAAK;AACxB;;IAGF,MAAM,OAAO;KAAC;KAAQ;KAAO;KAAW;KAAS,CAAC,SAAS,KAAK,KAAK,GACjE,KAAK,OACL;IAEJ,MAAMC,UAAiE;KACrE,MAAM;KACN,KAAK;KACL,SACE;KACF,QACE;KACH;IAED,MAAM,OAAO,KAAK,SAAS,KAAK,OAAO,EAAE;AACzC,SAAK,QAAQ;AACb,SAAK,cAAc;KACjB,cAAc,KAAK,OAAO,EAAE,CAAC,aAAa,GAAG,KAAK,MAAM,EAAE;KAC1D,WAAW;MACT;MACA;MACA;MACA;MACA;MACA;MACA,IAAI,QAAQ,SAAiC,QAAQ,SAAS,MAC5D,IACD;MACF;KACD,GAAG,KAAK;KACT;IAED,IAAI,iBAAiB,KAAK,SAAS,WAChC,MAAW,EAAE,MAAM,eACrB;IACD,IAAIC;AAEJ,QAAI,mBAAmB,IAAI;AACzB,qBAAgB,KAAK,SAAS,gBAAgB;AAC9C,UAAK,SAAS,OAAO,gBAAgB,EAAE;UAEvC,iBAAgB,CACd;KACE,MAAM;KACN,OAAO,KAAK,OAAO,EAAE,CAAC,aAAa,GAAG,KAAK,MAAM,EAAE;KACpD,CACF;IAGH,MAAM,eAAe,MAAc;KACjC,MAAM,QAAQ;MACZ,OAAO;MACP,OAAO;MACP,QAAQ;MACR,SAAS;MACT,MAAM;MACN,QAAQ;MACR,aAAa;MACb,eAAe;MACf,gBAAgB;MAChB,WAAW;OAAC;OAAO;OAAO;OAAgB;MAC3C;AACD,SAAI,MAAM,OACR,QAAO,EAAE,OAAO,OAAO;MACrB,EAAE,UAAU;OAAE,IAAI;OAAM,IAAI;OAAM,GAAG;OAAM,CAAC;MAC5C,EAAE,QAAQ,EAAE,GAAG,aAAa,CAAC;MAC7B,EAAE,QAAQ,EAAE,GAAG,aAAa,CAAC;MAC9B,CAAC;AACJ,SAAI,MAAM,MACR,QAAO,EAAE,OAAO,OAAO;MACrB,EAAE,QAAQ,EACR,GAAG,6FACJ,CAAC;MACF,EAAE,QAAQ,EACR,GAAG,mGACJ,CAAC;MACF,EAAE,QAAQ,EAAE,GAAG,0CAA0C,CAAC;MAC1D,EAAE,QAAQ,EAAE,GAAG,2CAA2C,CAAC;MAC5D,CAAC;AACJ,SAAI,MAAM,UACR,QAAO,EAAE,OAAO,OAAO;MACrB,EAAE,QAAQ,EACR,GAAG,6EACJ,CAAC;MACF,EAAE,QAAQ,EAAE,GAAG,WAAW,CAAC;MAC3B,EAAE,QAAQ,EAAE,GAAG,cAAc,CAAC;MAC/B,CAAC;AACJ,SAAI,MAAM,SACR,QAAO,EAAE,OAAO,OAAO;MACrB,EAAE,WAAW,EACX,QACE,0EACH,CAAC;MACF,EAAE,QAAQ,EAAE,GAAG,WAAW,CAAC;MAC3B,EAAE,QAAQ,EAAE,GAAG,cAAc,CAAC;MAC/B,CAAC;AACJ,YAAO;;AA6CT,SAAK,WAAW,CA1CG;KACjB,MAAM;KACN,MAAM;MACJ,OAAO;MACP,aAAa,EACX,WAAW;OACT;OACA;OACA;OACA;OACA;OACA;OACA;OACD,EACF;MACF;KACD,UAAU,CACR;MACE,MAAM;MACN,OAAO;MACP,MAAM;OAAE,OAAO;OAAQ,WAAW,CAAC,YAAY,KAAK,CAAC;OAAE;MACxD,EACD,GAAG,cACJ;KACF,EAEoB;KACnB,MAAM;KACN,MAAM;MACJ,OAAO;MACP,aAAa,EACX,WAAW;OACT;OACA;OACA;OACA;OACD,EACF;MACF;KACD,UAAU,KAAK;KAChB,CAEyC;;IAE5C;;;AAIN,eAAsB,gBACpB,SACA,SACA,SACA;CACA,MAAMC,MAAiB,EAAE;CAiBzB,MAAM,OAAO,MAAM,QAAQ,SAAS;EAClC,cAAc;EACd,eAjBmC;GACnC,GAAI,SAAS,iBAAiB,EAAE;GAChC;GACA;GACD;EAcC,eAZmC;GACnC,GAAI,SAAS,iBAAiB,EAAE;GAChC;GACA,CAAC,WAAW,SAAS,cAAc,EAAE,CAAC;GACtC;GACA;GACA,CAAC,mBAAmB,EAAE,QAAQ,KAAK,CAAC;GACrC;EAMU;EACV,CAAC;AACF,QAAO;EAAE,MAAM,OAAO,KAAK;EAAE;EAAK;;AAGpC,eAAsB,mBAAmB,OAAc;AACrD,QAAO,OAAO,EAAE,OAAO,MAAM,CAAC;AAC9B,QAAO,MAAM,KAAK,aAAa,EAAE;;;;;ACxMnC,MAAa,qBAAqB;AAElC,SAAS,eACP,MACmC;AACnC,KAAI,CAAC,KACH;AAEF,QAAO;EACL,OAAO,KAAK;EACZ,MAAM,UAAU,OAAO,KAAK,OAAO,KAAK;EACzC;;AAGH,SAAgB,gBACd,MACA,MACA,UACA;CACA,MAAM,QAAQ,SAAS,IAAI,KAAK;AAChC,KAAI,CAAC,OAAO,OACV,QAAO;EAAE,MAAM;EAAW,MAAM;EAAW;CAG7C,MAAM,aAAa,MAAM,QAAQ,MAAM;AACrC,MAAI,UAAU,EAAG,QAAO;AACxB,MAAI,UAAU,EACZ,QAAO,CAAC,EAAE,KAAK,WAAW,UAAU,IAAI,CAAC,EAAE,KAAK,WAAW,WAAW;AAExE,SAAO;GACP;CAEF,MAAM,YAAY,WAAW,WAAW,SAAS;AAC/C,SACG,UAAU,QAAQ,KAAK,SAAS,QAChC,UAAU,QAAQ,KAAK,SAAS;GAEnC;CAEF,IAAIC;CACJ,IAAIC;AAEJ,KAAI,cAAc,IAAI;AACpB,MAAI,YAAY,EACd,QAAO,eAAe,WAAW,YAAY,GAAG;AAElD,MAAI,YAAY,WAAW,SAAS,EAClC,QAAO,eAAe,WAAW,YAAY,GAAG;;AAIpD,QAAO;EAAE;EAAM;EAAM;;AAGvB,eAAsB,gBAAgB,MAAc,YAAoB;CACtE,MAAM,WAAW,MAAM,cAAc,MAAM,WAAW;CACtD,MAAM,UAAU,cAAc,SAAS,CAAC;CACxC,MAAM,OAAO,MAAM,KAAK,SAAS;CACjC,MAAM,cAAc,MAAM,mBAAmB,KAAK;CAClD,MAAM,EAAE,MAAM,QAAQ,MAAM,gBAAgB,MAAM,QAAQ;AAC1D,QAAO;EAAE;EAAM;EAAK;EAAa;;AAGnC,eAAsB,eACpB,IACA,UACA,YACA;CACA,MAAM,OAAO,GAAG,QAAQ,oBAAoB,GAAG,CAAC,QAAQ,MAAM,GAAG;CACjE,MAAM,OAAO,KAAK,MAAM,IAAI,CAAC;CAE7B,MAAM,EAAE,MAAM,SAAS,gBAAgB,MAAM,MAAM,SAAS;CAC5D,MAAM,EAAE,KAAK,MAAM,gBAAgB,MAAM,gBAAgB,MAAM,WAAW;CAC1E,IAAI,eAAe;AAEnB,iBAAgB,yBAAyB,KAAK,UAAU,IAAI,CAAC;AAC7D,iBAAgB,0BAA0B,KAAK,UAAU,KAAK,CAAC;AAC/D,iBAAgB,0BAA0B,KAAK,UAAU,KAAK,CAAC;AAC/D,iBAAgB,iCAAiC,KAAK,UACpD,YACD,CAAC;AACF,QAAO;;AAGT,eAAsB,cAAc,MAAc,YAAoB;CACpE,MAAM,YAAYC,OAAK,YAAY,KAAK;CACxC,MAAM,UAAU,MAAM,KAAK,GAAG,UAAU,WAAW;AACnD,KAAI,QAAQ,WAAW,EACrB,OAAM,IAAI,cACR,sDAAsD,KAAK,kBAAkB,UAAU,+DAA+D,KAAK,wBAAwB,KAAK,+BACzL;AAEH,QAAO,QAAQ;;AAGjB,eAAsB,cAAc,MAAc,YAAoB;AACpE,QAAO,MAAM,KAAK,MAAM,cAAc,MAAM,WAAW,CAAC;;AAQ1D,SAAgB,cAAc,MAAc,YAAoB;CAK9D,MAAM,WAAW,MAHI,SAAS,YAAY,KAAK,CAGX;AAIpC,QAFeA,OAAK,SAAS,KAAK,SAAS,KAAK;;;;;ACtGlD,MAAa,qBAAqB;AAElC,SAAS,eAAe,OAAmD;AACzE,QAAO,MAAM,SAAS,SAAS;AAC7B,MAAI,UAAU,KACZ,QAAO,CAAC;GAAE,OAAO,KAAK;GAAO,MAAM,IAAI,KAAK;GAAQ,CAAC;AAEvD,MAAI,UAAU,MAAM;AAElB,OAAI,KAAK,KAAK,WAAW,UAAU,IAAI,KAAK,KAAK,WAAW,WAAW,CACrE,QAAO,EAAE;AAEX,UAAO,CAAC;IAAE,OAAO,KAAK;IAAO,MAAM,KAAK;IAAM,CAAC;;AAEjD,MAAI,WAAW,KACb,QAAO,eAAe,KAAK,MAAM;AAEnC,SAAO,EAAE;GACT;;AAGJ,SAAS,kBACP,OACiC;CACjC,MAAM,iBAAiB,eAAe,MAAM;CAC5C,MAAMC,aAA8C,EAAE;AAEtD,MAAK,IAAI,IAAI,GAAG,IAAI,eAAe,QAAQ,KAAK;EAC9C,MAAM,OAAO,eAAe;AAC5B,MAAI,KACF,YAAW,KAAK,QAAQ;GACtB,MAAM,IAAI,IAAI,eAAe,IAAI,KAAK;GACtC,MAAM,IAAI,eAAe,SAAS,IAAI,eAAe,IAAI,KAAK;GAC/D;;AAIL,QAAO;;AAGT,SAAS,mBACP,OACA,aACoB;AACpB,KAAI,YACF,QAAO;AAET,MAAK,MAAM,QAAQ,MACjB,KAAI,UAAU,KACZ,QAAO,KAAK;UACH,UAAU,KACnB,QAAO,KAAK;UACH,WAAW,QAAQ,KAAK,MAAM,SAAS,GAAG;EACnD,MAAM,OAAO,mBAAmB,KAAK,MAAM;AAC3C,MAAI,KAAM,QAAO;;;AAMvB,eAAsB,gBACpB,aACA,YACA;CACA,MAAM,wBAAQ,IAAI,KAA0B;AAE5C,MAAK,MAAM,cAAc,aAAa;EACpC,MAAM,UAAU,MAAM,kBAAkB,YAAY,WAAW;AAC/D,QAAM,IAAI,WAAW,IAAI,QAAQ;;AAEnC,QAAO;;;AAIT,eAAe,kBACb,YACA,YACsB;CACtB,MAAMC,QAA2B,EAAE;AACnC,MAAK,MAAM,QAAQ,WAAW,MAC5B,OAAM,KAAK,MAAM,YAAY,MAAM,WAAW,CAAC;CAEjD,MAAM,cAAc,mBAAmB,OAAO,WAAW,YAAY;AACrE,KAAI,CAAC,YACH,OAAM,IAAI,cACR,4GAA4G,WAAW,KACxH;AAEH,QAAO;EACL;EACa;EACb,YAAY,kBAAkB,MAAM;EACrC;;;AAIH,eAAe,YACb,MACA,YAC0B;AAC1B,KAAI,OAAO,SAAS,YAAY,UAAU,KACxC,QAAO,2BACL,MACA,WACD;UACQ,UAAU,KACnB,QAAO,mBAAmB,MAAM,WAAW;KAE3C,QAAO,oBAAoB,MAAyB,WAAW;;;AAKnE,eAAe,oBACb,OACA,YAC2B;CAC3B,MAAM,QAAQ,MAAM,aAAa,OAAO,WAAW;CACnD,MAAMA,QAA2B,EAAE;AAEnC,KAAI,MAAM,OAAO,UAAU,MAAM,aAC/B,gBAAO,KACL,GAAG,MAAM,MAAM,4DAChB;AAGH,KAAI,MAAM,MACR,MAAK,MAAM,aAAa,MAAM,MAC5B,OAAM,KAAK,MAAM,YAAY,WAAW,WAAW,CAAC;UAE7C,MAAM,cAAc,WAAW;EACxC,MAAM,iBAAiB,MAAM,oBAC3B,MAAM,aAAa,WACnB,WACD;AACD,QAAM,KAAK,GAAG,eAAe;;AAG/B,QAAO;EACL;EACA,aAAa,MAAM;EACnB;EACD;;;AAIH,eAAe,2BACb,MACA,YACkC;CAClC,MAAM,QAAQ,MAAM,aAAa,MAAM,WAAW;CAClD,MAAM,OAAO,YAAY,KAAK;AAE9B,KAAI,KAAK,WAAW,IAAI,IAAI,KAAK,SAAS,IAAI,CAC5C,OAAM,IAAI,cACR,YAAY,KAAK,6DAClB;AAGH,KAAI,CAAC,KACH,OAAM,IAAI,cACR,oEAAoE,QACrE;AAGH,QAAO;EACL;EACA;EACD;;;AAIH,eAAe,mBACb,MACA,YACkC;CAClC,MAAM,QAAQ,MAAM,aAAa,MAAM,WAAW;CAClD,MAAM,OAAO,YAAY,KAAK;AAE9B,KAAI,CAAC,KACH,OAAM,IAAI,cACR,oEAAoE,QACrE;AAGH,QAAO;EACL;EACA;EACD;;;AAIH,eAAe,oBACb,WACA,YAC4B;CAC5B,MAAM,eAAe;CAErB,MAAMA,QAA2B,EAAE;CACnC,MAAM,UAAU,KAAK,YAAY,UAAU;AAC3C,KAAI,CAAE,MAAM,WAAW,QAAQ,EAAG;AAChC,iBAAO,KAAK,4BAA4B,YAAY;AACpD,SAAO,EAAE;;CAGX,MAAM,UAAU,MAAM,QAAQ,SAAS,EAAE,eAAe,MAAM,CAAC;AAC/D,SAAQ,MAAM,GAAG,MAAM,EAAE,KAAK,cAAc,EAAE,KAAK,CAAC;AACpD,MAAK,MAAM,UAAU,QACnB,KAAI,OAAO,aAAa,EAAE;EACxB,MAAM,SAAS,KAAK,WAAW,OAAO,KAAK;EAC3C,MAAMC,QAAyB;GAC7B,OAAO,OAAO;GACd,cAAc,EAAE,WAAW,QAAQ;GACpC;AACD,QAAM,KAAK,MAAM,oBAAoB,OAAO,WAAW,CAAC;YAC/C,OAAO,QAAQ,IAAI,aAAa,KAAK,OAAO,KAAK,EAAE;EAE5D,MAAM,OADW,KAAK,WAAW,OAAO,KAAK,CACvB,QAAQ,cAAc,GAAG;AAC/C,QAAM,KAAK,MAAM,2BAA2B,MAAM,WAAW,CAAC;;AAGlE,QAAO;;;AAIT,eAAe,aACb,MACA,YACiB;AACjB,KAAI,OAAO,SAAS,YAAY,WAAW,QAAQ,KAAK,MACtD,QAAO,KAAK;AAGd,KAAI,OAAO,SAAS,YAAY,UAAU,MAAM;EAC9C,MAAM,OAAO,YAAY,KAAK;EAE9B,MAAM,OAAO,MAAM,cAAc,MAAM,WAAW;AAClD,MAAI,CAAC,KACH,OAAM,IAAI,cACR,sCAAsC,KAAK,6CAC5C;EAEH,MAAM,OAAQ,MAAM,mBAAmB,KAAK;AAC5C,MAAI,MAAM,MACR,QAAO,MAAM;AAGf,SAAO,SAAS,KAAK;;AAIvB,KAAI,OAAO,SAAS,aAAa,WAAW,QAAQ,kBAAkB,MACpE,QAAO,KAAK;AAGd,QAAO;;;AAIT,SAAgB,YAAY,MAAsB;AAChD,KAAI,OAAO,SAAS,SAClB,QAAO;MACF;AACL,MAAI,UAAU,KACZ,QAAO,KAAK;AAEd,SAAO;;;;AAKX,SAAgB,YAAY,MAAsB;AAChD,KAAI,OAAO,SAAS,YAAY,UAAU,KACxC,QAAO,KAAK;AAEd,QAAO;;;;;ACrST,eAAsB,cACpB,UACA,WACA;CAEA,MAAM,mBAAmBC,OAAK,WADT,aACiC;AAEtD,KAAI;AACF,QAAM,MAAM,kBAAkB,EAAE,WAAW,MAAM,CAAC;EAElD,MAAM,iCAAiB,IAAI,KAAqB;AAEhD,OAAK,MAAM,CAAC,KAAK,UAAU,UAAU;GACnC,MAAM,oBAAoB,MAAM,QAAQ,MAAM,UAAU,EAAE;GAG1D,MAAM,cADc,MACc;AAClC,kBAAe,IAAI,aAAa,kBAAkB,IAAI,CAAC;AAEvD,QAAK,MAAM,KAAK,mBAAmB;IACjC,MAAM,YAAY,EAAE,KAAK,WAAW,KAAK,IAAI,GAAG;AAChD,mBAAe,IAAI,WAAW,mBAAmB,EAAE,KAAK,CAAC;;;AAK7D,QAAM,QAAQ,IACZ,CAAC,GAAG,eAAe,SAAS,CAAC,CAAC,IAAI,OAAO,CAAC,UAAU,cAAc;GAChE,MAAM,WAAWA,OAAK,kBAAkB,SAAS;AACjD,OAAI;AAEF,QADwB,MAAM,SAAS,UAAU,QAAQ,KACjC,SACtB;YAEK,GAAG;AAGZ,kBAAO,KAAK,uBAAuB,YAAY,EAAE,WAAW,MAAM,CAAC;AACnE,UAAO,UAAU,UAAU,SAAS;IACpC,CACH;EAGD,MAAM,cADgB,MAAM,QAAQ,iBAAiB,EACpB,QAC9B,aACC,SAAS,SAAS,YAAY,IAAI,CAAC,eAAe,IAAI,SAAS,CAClE;AAED,QAAM,QAAQ,IACZ,WAAW,KAAK,aAAa;AAC3B,kBAAO,KAAK,8BAA8B,YAAY,EACpD,WAAW,MACZ,CAAC;AACF,UAAO,OAAOA,OAAK,kBAAkB,SAAS,CAAC;IAC/C,CACH;UACM,OAAO;AACd,iBAAO,MACL,wDAAwD,SACxD,EAAE,WAAW,MAAM,CACpB;AACD,UAAQ,MACN,wDACA,MACD;;;AAIL,SAAS,kBAAkB,IAAY;AACrC,QACE;;gDAE4C,GAAG;;;wDAGK,GAAG,+BAA+B,GAAG;EAC3F,MAAM,GAAG;;AAIX,SAAS,mBAAmB,MAAc;AACxC,QACE;;yDAEqD,KAAK;;;wDAGN,KAAK;EAC3D,MAAM,GAAG;;;;;AC3FX,SAAgB,iBAAiB,WAAmB;AAClD,QAAO,kBAAkB,UAAU;;;AAIrC,SAAgB,qBAAqB;AACnC,QAAO,iBAAiB,YAAY;;;;;ACCtC,MAAa,wBAAwB;AAErC,SAAgB,6BACd,mBACA,UACA;CACA,MAAMC,cAAsC,kBAAkB,KAAK,OAAO;EACxE,IAAI,EAAE;EACN,OAAO,EAAE,SAAS,EAAE;EACpB,aAAa,EAAE,eAAe;EAC/B,EAAE;AACH,KAAI,YAAY,WAAW,EACzB,OAAM,IAAI,cACR,0DACD;AAGH,MAAK,MAAM,QAAQ,aAAa;EAE9B,MAAM,oBADQ,SAAS,IAAI,KAAK,GAAG,EACF,MAAK,MAAK,UAAU,EAAE;AACvD,MAAI,KAAK,eAAe,CAAC,kBACvB;AAEF,OAAK,cAAc,kBAAkB;;AAGvC,MAAK,MAAM,QAAQ,YACjB,KAAI,CAAC,KAAK,YACR,SAAQ,KACN,wCAAwC,KAAK,GAAG,kDACjD;AAML,QAAO,iBACL,gBAHuB,YAAY,QAAQ,MAAM,EAAE,YAAY,CAG9B,KAAK,MAAM,oBAAoB,EAAE,CAAC,CAAC,CACrE;;;;;AChBH,MAAa,oBAAoB;AAEjC,SAAwB,SAAS,cAA4C;CAC3E,IAAIC;CACJ,IAAIC;CACJ,IAAIC;CACJ,IAAIC,cAA2B,EAAE;CACjC,IAAIC;CACJ,IAAIC;CACJ,IAAIC;AACJ,QAAO;EACL,MAAM;EACN,SAAS;EACT,MAAM,eAAe,gBAAgB;AACnC,kBAAO,KAAK,uCAAuC,EAAE,WAAW,MAAM,CAAC;GACvE,MAAM,EAAE,QAAQ,iBAAiB,MAAM,sBACrC,cACA,eAAe,KAChB;AACD,YAAS;AACT,gBAAa,KAAK,eAAe,MAAM,cAAc;AACrD,mBAAgB,UAAU,KAAK,YAAY,gBAAgB,CAAC;AAC5D,iBAAc,OAAO,eAAe,EAAE;AAEtC,kBAAO,KAAK,yBAAyB,EAAE,WAAW,MAAM,CAAC;AACzD,iBAAc,MAAM,gBAAgB,aAAa,WAAW;AAE5D,kBAAO,KAAK,8BAA8B,EAAE,WAAW,MAAM,CAAC;AAC9D,cAAW,oBAAoB,YAAY;AAE3C,kBAAO,KAAK,wCAAwC,EAAE,WAAW,MAAM,CAAC;AACxE,2BAAwB,6BACtB,aACA,SACD;GAED,MAAM,YAAY,KAAK,eAAe,MAAM,OAAO,SAAS;AAE5D,kBAAO,KAAK,uBAAuB,EAAE,WAAW,MAAM,CAAC;AACvD,SAAM,cAAc,UAAU,UAAU;;EAE1C,UAAU,IAAI;AAKZ,OAAI,GAAG,SAAS,kBAAkB,EAAE;AAClC,mBAAO,KAAK,gCAAgC,MAAM,EAAE,WAAW,MAAM,CAAC;AACtE,WAAO,iBAAiB,IAAI,kBAAkB;;AAGhD,OAAI,GAAG,SAAS,mBAAmB,EAAE;AACnC,mBAAO,KAAK,iCAAiC,MAAM,EAAE,WAAW,MAAM,CAAC;AACvE,WAAO,iBAAiB,IAAI,mBAAmB;;AAGjD,OAAI,GAAG,SAAS,sBAAsB,EAAE;AACtC,mBAAO,KAAK,oCAAoC,MAAM,EACpD,WAAW,MACZ,CAAC;AACF,WAAO,iBAAiB,IAAI,sBAAsB;;AAGpD,OAAI,GAAG,SAAS,mBAAmB,EAAE;AACnC,mBAAO,KAAK,iCAAiC,MAAM,EAAE,WAAW,MAAM,CAAC;AACvE,WAAO,iBAAiB,IAAI,mBAAmB;;AAGjD,UAAO;;EAET,MAAM,KAAK,IAAI;AACb,OAAI,OAAO,KAAK,qBAAqB;AACnC,mBAAO,KAAK,kCAAkC,MAAM,EAClD,WAAW,MACZ,CAAC;AACF,WAAO,iBAAiB,KAAK,UAAU,OAAO,CAAC;;AAEjD,OAAI,GAAG,SAAS,mBAAmB,EAAE;AACnC,mBAAO,KAAK,mCAAmC,MAAM,EACnD,WAAW,MACZ,CAAC;AACF,WAAO,MAAM,eAAe,IAAI,UAAU,WAAW;;AAEvD,OAAI,GAAG,SAAS,sBAAsB,EAAE;AACtC,mBAAO,KAAK,sCAAsC,MAAM,EACtD,WAAW,MACZ,CAAC;AACF,WAAO;;AAGT,OAAI,GAAG,SAAS,mBAAmB,EAAE;AACnC,mBAAO,KAAK,mCAAmC,MAAM,EACnD,WAAW,MACZ,CAAC;IACF,MAAM,YAAY,GAAG,QAAQ,oBAAoB,GAAG,CAAC,QAAQ,MAAM,GAAG;IACtE,MAAM,UAAU,YAAY,IAAI,UAAU;AAC1C,QAAI,CAAC,QACH,QAAO,oBAAoB;AAE7B,WAAO,iBAAiB,oBAAoB,QAAQ,CAAC;;AAGvD,UAAO;;EAGT,MAAM,UAAU,EAAE,MAAM,aAAa;AACnC,OAAI,cAAc,KAAK,EAAE;AACvB,mBAAO,KAAK,uBAAuB,KAAK,MAAM,EAAE,WAAW,MAAM,CAAC;IAClE,MAAM,qCAAqB,IAAI,KAA4B;IAE3D,MAAM,kBAAkB,KAAK,qBADhB,cAAc,MAAM,WAAW;IAE5C,MAAM,SACJ,KAAK,YAAY,YAAY,cAAc,gBAAgB;AAC7D,QAAI,QAAQ;AACV,UAAK,YAAY,YAAY,iBAC3B,QACA,oBACA,WACA,KACD;AACD,oBAAO,KAAK,4BAA4B,EAAE,WAAW,MAAM,CAAC;AAC5D,UAAK,YAAY,IAAI,KAAK,EAAE,MAAM,eAAe,CAAC;;;;EAIzD"}
|
|
1
|
+
{"version":3,"file":"vite.js","names":["CollectionGroupSchema: z.ZodType<CollectionGroup, CollectionGroup>","CollectionItemSchema: z.ZodType<CollectionItem, CollectionItem>","sidebarLinks: SidebarLinkType[]","processItem","data","typeMap: Record<\"note\" | \"tip\" | \"caution\" | \"danger\", string>","titleChildren: any[]","toc: TocItem[]","prev: SiblingNavigationType | undefined","next: SiblingNavigationType | undefined","join","navigation: Record<string, NavigationLinks>","items: SidebarItemType[]","group: CollectionGroup","join","collections: CollectionNavigation[]","config: PrestigeConfig","contentDir: string","isDocsMatcher: Matcher","collections: Collections","linksMap: Map<string, SidebarLinkType[]>","collectionNavigations: string","sidebarsMap: Map<string, SidebarType>"],"sources":["../src/vite/utils/errors.ts","../src/vite/core/content/content.types.ts","../src/vite/config/config.types.ts","../src/vite/utils/file-utils.ts","../src/vite/config/config.ts","../src/vite/content/content-links.ts","../src/vite/utils/logger.ts","../src/vite/content/content-compiler.ts","../src/vite/content/content.store.ts","../src/vite/content/content-sidebar.store.ts","../src/vite/content/router-compiler.ts","../src/vite/utils/code-generation.ts","../src/vite/core/content/content-collection.store.ts","../src/vite/plugin.ts"],"sourcesContent":["import { type ZodType, input } from \"zod\";\n\nexport class PrestigeError extends Error {}\n\n/**\n * Parse data with zod schema and if fails throw PrestigeError that is friendly error\n * for prestige ecosystem\n */\nexport function parseWithFriendlyErrors<T extends ZodType>(s: T, input: input<T>, message: string) {\n try {\n return s.parse(input);\n } catch (e) {\n if (e instanceof Error) {\n throw new PrestigeError(`Prestige error cause: ${message}, with error: ${e.message} `);\n } else {\n throw new PrestigeError(`Prestige error cause: ${message} `);\n }\n }\n}\n","import { z } from \"zod\";\n\nexport const ContentFrontmatterSchema = z.object({\n title: z.string().describe(\"The title of the article\"),\n description: z.string().optional().describe(\"The description of the article\"),\n label: z.string().optional().describe(\"The label of the content\"),\n});\n\nexport type ContentFrontmatterType = z.infer<typeof ContentFrontmatterSchema>;\n\nexport const ContentSchema = z.object({\n matter: ContentFrontmatterSchema,\n html: z.string().describe(\"The html of the content\"),\n});\n\nexport type ContentType = z.infer<typeof ContentSchema>;\n\nconst InternalCollectionLinkSchema = z.union([\n z.object({\n label: z.string(),\n slug: z.string(),\n }),\n z.string(),\n]);\n\nconst ExternalCollectionLinkSchema = z.object({\n label: z.string(),\n link: z.string(),\n});\n\nexport type ExternalCollectionLink = z.infer<\n typeof ExternalCollectionLinkSchema\n>;\n\nexport type InternalCollectionLink = z.infer<\n typeof InternalCollectionLinkSchema\n>;\n\nexport type CollectionGroup = {\n label: string;\n items?: CollectionItem[] | undefined;\n collapsible?: boolean | undefined;\n autogenerate?: { directory: string } | undefined;\n};\n\nexport type CollectionItem =\n | InternalCollectionLink\n | CollectionGroup\n | ExternalCollectionLink;\n\nconst CollectionGroupSchema: z.ZodType<CollectionGroup, CollectionGroup> =\n z.object({\n label: z.string(),\n items: z.lazy(() => z.array(CollectionItemSchema)).optional(),\n collapsible: z.boolean().optional(),\n autogenerate: z\n .object({\n directory: z.string(),\n })\n .optional(),\n });\n\nconst CollectionItemSchema: z.ZodType<CollectionItem, CollectionItem> = z.union(\n [\n ExternalCollectionLinkSchema,\n InternalCollectionLinkSchema,\n z.lazy(() => CollectionGroupSchema),\n ],\n);\n\nexport const CollectionSchema = z.object({\n id: z\n .string()\n .min(1, { message: \"Folder name cannot be empty\" })\n .max(50, { message: \"Folder name too long\" })\n // Allows alphanumeric, hyphens, and underscores\n .regex(/^[a-zA-Z0-9-_]+$/, {\n message: \"Only alphanumeric, hyphens, and underscores allowed\",\n })\n .describe(\"The id of the collection, must match the folder name\"),\n items: z.array(CollectionItemSchema),\n label: z.string().optional().describe(\"The label of the collection\"),\n defaultLink: z\n .string()\n .optional()\n .describe(\"The default link of the collection\"),\n});\n\nexport type Collection = z.infer<typeof CollectionSchema>;\n\nexport type CollectionNavigation = {\n id: string;\n label: string;\n defaultLink?: string;\n};\n\nexport type CollectionInput = z.input<typeof CollectionSchema>;\n\nexport const CollectionsSchema = z.array(CollectionSchema);\n\nexport type Collections = z.infer<typeof CollectionsSchema>;\n\nexport interface InternalSidebarLinkType {\n slug: string;\n label: string;\n}\n\nexport interface ExternalSidebarLinkType {\n label: string;\n link: string;\n}\n\nexport type SidebarLinkType = InternalSidebarLinkType | ExternalSidebarLinkType;\n\nexport interface SidebarGroupType {\n label: string;\n items: SidebarItemType[];\n collapsible?: boolean | undefined;\n}\n\nexport type SidebarItemType =\n | InternalSidebarLinkType\n | SidebarGroupType\n | ExternalSidebarLinkType;\n\nexport interface SidebarType {\n items: SidebarItemType[];\n defaultLink: string;\n navigation: Record<string, NavigationLinks>;\n}\n\nexport interface SiblingNavigationType {\n label: string;\n link: string;\n}\n\nexport interface NavigationLinks {\n prev: SiblingNavigationType | null | undefined;\n next: SiblingNavigationType | null | undefined;\n}\n","import { FlexibleTocOptions } from \"remark-flexible-toc\";\nimport type { Options as RemarkGfmOptions } from \"remark-gfm\";\nimport { PluggableList } from \"unified\";\nimport { z } from \"zod\";\nimport { CollectionsSchema } from \"../core/content/content.types\";\n\nexport const PrestigeConfigSchema = z.object({\n title: z.string().describe(\"Title of the website\"),\n github: z.string().optional().describe(\"Github repo\"),\n algolia: z\n .object({\n appId: z.string().describe(\"Algolia app id\"),\n apiKey: z.string().describe(\"Algolia api key\"),\n indices: z.array(z.string()).describe(\"Algolia indices\"),\n })\n .optional()\n .describe(\"Algolia options\"),\n license: z\n .object({\n label: z.string().describe(\"License label\"),\n url: z.string().describe(\"License url\"),\n })\n .optional()\n .describe(\"License options\"),\n collections: CollectionsSchema,\n markdown: z\n .object({\n gfmOptions: z\n .custom<RemarkGfmOptions>()\n .optional()\n .describe(\"Options for remark-gfm\"),\n rehypePlugins: z\n .custom<PluggableList>()\n .optional()\n .describe(\"Additional rehype plugins\"),\n remarkPlugins: z\n .custom<PluggableList>()\n .optional()\n .describe(\"Additional remark plugins\"),\n remarkFlexibleToc: z\n .custom<FlexibleTocOptions>()\n .optional()\n .describe(\"Options for remark-flexible-toc\"),\n rehypeSlug: z\n .custom<{\n prefix?: string;\n }>()\n .optional()\n .describe(\"Options for rehype-slug\"),\n })\n .optional()\n .describe(\"Markdown options, configure how markdown is parsed\"),\n});\n\nexport type PrestigeConfigInput = z.input<typeof PrestigeConfigSchema>;\nexport type PrestigeConfig = z.infer<typeof PrestigeConfigSchema>;\n","import { mkdir, rm, stat, writeFile } from \"node:fs/promises\";\nimport { dirname } from \"pathe\";\n\nexport async function pathExists(path: string) {\n try {\n await stat(path);\n return true;\n } catch {\n return false;\n }\n}\n\nexport async function ensureDir(dirPath: string) {\n await mkdir(dirPath, { recursive: true });\n}\n\nexport async function outputFile(\n filePath: string,\n data: string | NodeJS.ArrayBufferView,\n) {\n const dir = dirname(filePath);\n\n // recursive: true won't throw if the dir already exists\n await mkdir(dir, { recursive: true });\n await writeFile(filePath, data);\n}\n\nexport async function rmSafe(path: string) {\n try {\n await rm(path, { recursive: true, force: true });\n return true;\n } catch {\n return false;\n }\n}\n\n// Helper function to extract the virtual ID from a messy path\nexport function extractVirtualId(fullId: string, virtualPrefix: string) {\n const startIndex = fullId.indexOf(virtualPrefix);\n if (startIndex !== -1) {\n // Slice from the start of the virtual prefix to the end of the string\n return \"\\0\" + fullId.slice(startIndex);\n }\n return null;\n}\n","import { parseWithFriendlyErrors, PrestigeError } from \"../utils/errors\";\nimport { PrestigeConfigInput, PrestigeConfigSchema } from \"./config.types\";\nimport { join } from \"pathe\";\nimport { pathExists } from \"../utils/file-utils\";\n\nexport function validateConfig(config: PrestigeConfigInput) {\n return parseWithFriendlyErrors(PrestigeConfigSchema, config, \"Invalid schema\");\n}\n\nexport async function resolvePrestigeConfig(\n configInput: PrestigeConfigInput | undefined,\n root: string,\n) {\n if (!configInput) {\n throw new PrestigeError(\"Prestige config is required\");\n }\n\n const validatedConfig = validateConfig(configInput);\n const docsDirPath = join(root, \"src/content\");\n\n if (!(await pathExists(docsDirPath))) {\n throw new PrestigeError(`Docs! directory not found: ${docsDirPath}`);\n }\n\n return { config: validatedConfig, fullDocsDir: docsDirPath };\n}\n","import { SidebarLinkType, SidebarItemType, SidebarType } from \"../core/content/content.types\";\n\nexport function resolveContentLinks(sidebars: Map<string, SidebarType>) {\n const links = new Map<string, SidebarLinkType[]>();\n for (const [key, sidebar] of sidebars) {\n const sidebarLinks: SidebarLinkType[] = [];\n for (const item of sidebar.items) {\n processItem(item, sidebarLinks);\n }\n links.set(key, sidebarLinks);\n }\n return links;\n}\n\nfunction processItem(item: SidebarItemType, links: SidebarLinkType[] = []) {\n if (\"slug\" in item || \"link\" in item) {\n links.push(item);\n } else if (\"items\" in item) {\n for (const childItem of item.items) {\n processItem(childItem, links);\n }\n }\n return links;\n}\n","import { createLogger } from \"vite\";\nconst logger = createLogger(undefined, { prefix: \"[Prestige]\" });\nexport default logger;\n","import { compile } from \"@mdx-js/mdx\";\nimport rehypePrism from \"rehype-prism-plus\";\nimport rehypeSlug from \"rehype-slug\";\nimport remarkDirective from \"remark-directive\";\nimport remarkFlexibleToc, { TocItem } from \"remark-flexible-toc\";\nimport remarkFrontmatter from \"remark-frontmatter\";\nimport remarkGfm from \"remark-gfm\";\nimport { PluggableList } from \"unified\";\nimport { Compatible, VFile } from \"vfile\";\nimport { matter } from \"vfile-matter\";\nimport { PrestigeConfig } from \"../config/config.types\";\n\nimport { h } from \"hastscript\";\nimport type { Node } from \"unist\";\nimport { visit } from \"unist-util-visit\";\n\nexport default function remarkAdmonitions() {\n return (tree: Node) => {\n visit(tree, (node: any) => {\n if (\n node.type === \"textDirective\" ||\n node.type === \"leafDirective\" ||\n node.type === \"containerDirective\"\n ) {\n if (node.type !== \"containerDirective\") {\n const data = node.data || (node.data = {});\n const hast = h(node.type === \"textDirective\" ? \"span\" : \"aside\", {\n className: [\"admonition\", `admonition-${node.name}`],\n ...node.attributes,\n });\n data.hName = hast.tagName;\n data.hProperties = hast.properties;\n return;\n }\n\n const type = [\"note\", \"tip\", \"caution\", \"danger\"].includes(node.name)\n ? node.name\n : \"note\";\n\n const typeMap: Record<\"note\" | \"tip\" | \"caution\" | \"danger\", string> = {\n note: \"bg-blue-50/50 dark:bg-blue-900/20 border-blue-500 text-blue-900 dark:text-blue-200\",\n tip: \"bg-purple-50/50 dark:bg-purple-900/20 border-purple-500 text-purple-900 dark:text-purple-200\",\n caution:\n \"bg-yellow-50/50 dark:bg-yellow-900/20 border-yellow-500 text-yellow-900 dark:text-yellow-200\",\n danger:\n \"bg-red-50/50 dark:bg-red-900/20 border-red-500 text-red-900 dark:text-red-200\",\n };\n\n const data = node.data || (node.data = {});\n data.hName = \"aside\";\n data.hProperties = {\n \"aria-label\": type.charAt(0).toUpperCase() + type.slice(1),\n className: [\n \"relative\",\n \"my-6\",\n \"px-4\",\n \"py-3\",\n \"border-l-4\",\n \"rounded-lg\",\n ...(typeMap[type as keyof typeof typeMap] || typeMap[\"note\"]).split(\n \" \",\n ),\n ],\n ...node.attributes,\n };\n\n let titleNodeIndex = node.children.findIndex(\n (c: any) => c.data?.directiveLabel,\n );\n let titleChildren: any[];\n\n if (titleNodeIndex !== -1) {\n titleChildren = node.children[titleNodeIndex].children;\n node.children.splice(titleNodeIndex, 1);\n } else {\n titleChildren = [\n {\n type: \"text\",\n value: type.charAt(0).toUpperCase() + type.slice(1),\n },\n ];\n }\n\n const getIconHast = (t: string) => {\n const props = {\n xmlns: \"http://www.w3.org/2000/svg\",\n width: \"24\",\n height: \"24\",\n viewBox: \"0 0 24 24\",\n fill: \"none\",\n stroke: \"currentColor\",\n strokeWidth: \"2\",\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\",\n className: [\"w-5\", \"h-5\", \"flex-shrink-0\"],\n };\n if (t === \"note\")\n return h(\"svg\", props, [\n h(\"circle\", { cx: \"12\", cy: \"12\", r: \"10\" }),\n h(\"path\", { d: \"M12 16v-4\" }),\n h(\"path\", { d: \"M12 8h.01\" }),\n ]);\n if (t === \"tip\")\n return h(\"svg\", props, [\n h(\"path\", {\n d: \"M4.5 16.5c-1.5 1.26-2 5-2 5s3.74-.5 5-2c.71-.84.7-2.13-.09-2.91a2.18 2.18 0 0 0-2.91-.09z\",\n }),\n h(\"path\", {\n d: \"m12 15-3-3a22 22 0 0 1 2-3.95A12.88 12.88 0 0 1 22 2c0 2.72-.78 7.5-6 11a22.35 22.35 0 0 1-4 2z\",\n }),\n h(\"path\", { d: \"M9 12H4s.55-3.03 2-4c1.62-1.08 5 0 5 0\" }),\n h(\"path\", { d: \"M12 15v5s3.03-.55 4-2c1.08-1.62 0-5 0-5\" }),\n ]);\n if (t === \"caution\")\n return h(\"svg\", props, [\n h(\"path\", {\n d: \"m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3Z\",\n }),\n h(\"path\", { d: \"M12 9v4\" }),\n h(\"path\", { d: \"M12 17h.01\" }),\n ]);\n if (t === \"danger\")\n return h(\"svg\", props, [\n h(\"polygon\", {\n points:\n \"7.86 2 16.14 2 22 7.86 22 16.14 16.14 22 7.86 22 2 16.14 2 7.86 7.86 2\",\n }),\n h(\"path\", { d: \"M12 8v4\" }),\n h(\"path\", { d: \"M12 16h.01\" }),\n ]);\n return null;\n };\n\n const titleBlock = {\n type: \"paragraph\",\n data: {\n hName: \"p\",\n hProperties: {\n className: [\n \"flex\",\n \"items-center\",\n \"gap-2\",\n \"mb-2\",\n \"mt-0\",\n \"font-bold\",\n \"text-lg\",\n ],\n },\n },\n children: [\n {\n type: \"text\",\n value: \"\",\n data: { hName: \"span\", hChildren: [getIconHast(type)] },\n },\n ...titleChildren,\n ],\n };\n\n const contentBlock = {\n type: \"paragraph\",\n data: {\n hName: \"section\",\n hProperties: {\n className: [\n \"[&>p]:mt-0\",\n \"[&>p]:mb-2\",\n \"[&>p:last-child]:mb-0\",\n \"text-sm\",\n ],\n },\n },\n children: node.children,\n };\n\n node.children = [titleBlock, contentBlock];\n }\n });\n };\n}\n\nexport function rehypeAddNotProseToPre() {\n return (tree: Node) => {\n visit(tree, (node: any) => {\n // Look specifically for HTML elements that are <pre> tags\n if (node.type === \"element\" && node.tagName === \"pre\") {\n node.properties = node.properties || {};\n\n // HAST classNames are generally arrays of strings\n const currentClass = node.properties.className || [];\n node.properties.className = Array.isArray(currentClass)\n ? [...currentClass, \"not-prose\"]\n : [currentClass, \"not-prose\"];\n }\n });\n };\n}\n\nexport async function compileMarkdown(\n content: Readonly<Compatible>,\n baseUrl: string,\n options?: PrestigeConfig[\"markdown\"],\n) {\n const toc: TocItem[] = [];\n\n const rehypePlugins: PluggableList = [\n ...(options?.rehypePlugins ?? []),\n rehypeSlug,\n [rehypePrism, { options: { showLineNumbers: false } }],\n rehypeAddNotProseToPre,\n ];\n\n const remarkPlugins: PluggableList = [\n ...(options?.remarkPlugins ?? []),\n remarkFrontmatter,\n [remarkGfm, options?.gfmOptions || {}],\n remarkDirective,\n remarkAdmonitions,\n [remarkFlexibleToc, { tocRef: toc }],\n ];\n\n const code = await compile(content, {\n outputFormat: \"program\",\n rehypePlugins,\n remarkPlugins,\n baseUrl: baseUrl,\n });\n return { code: String(code), toc };\n}\n\nexport async function compileFrontmatter(vFile: VFile) {\n matter(vFile, { strip: true });\n return vFile.data[\"matter\"] || {};\n}\n\nexport function warmupCompiler(options?: PrestigeConfig[\"markdown\"]) {\n compileMarkdown(\"```js\\n```\", \"http://localhost\", options).catch(() => {});\n}\n","import { join } from \"node:path\";\nimport { pathToFileURL } from \"node:url\";\nimport { parse, relative } from \"pathe\";\nimport { glob } from \"tinyglobby\";\nimport { read } from \"to-vfile\";\nimport {\n SiblingNavigationType,\n SidebarLinkType,\n} from \"../core/content/content.types\";\nimport { compileMarkdown } from \"./content-compiler\";\n\nimport { PrestigeError } from \"../utils/errors\";\nimport { compileFrontmatter } from \"./content-compiler\";\n\nexport const CONTENT_VIRTUAL_ID = \"virtual:prestige/content/\";\n\nfunction getSiblingLink(\n link: SidebarLinkType | undefined,\n): SiblingNavigationType | undefined {\n if (!link) {\n return undefined;\n }\n return {\n label: link.label,\n link: \"slug\" in link ? link.slug : link.link,\n };\n}\n\nexport function resolveSiblings(\n base: string,\n slug: string,\n linksMap: Map<string, SidebarLinkType[]>,\n) {\n const links = linksMap.get(base);\n if (!links?.length) {\n return { prev: undefined, next: undefined };\n }\n\n const validLinks = links.filter((l) => {\n if (\"slug\" in l) return true;\n if (\"link\" in l) {\n return !l.link.startsWith(\"http://\") && !l.link.startsWith(\"https://\");\n }\n return false;\n });\n\n const linkIndex = validLinks.findIndex((link) => {\n return (\n (\"slug\" in link && link.slug === slug) ||\n (\"link\" in link && link.link === slug)\n );\n });\n\n let prev: SiblingNavigationType | undefined;\n let next: SiblingNavigationType | undefined;\n\n if (linkIndex !== -1) {\n if (linkIndex > 0) {\n prev = getSiblingLink(validLinks[linkIndex - 1]);\n }\n if (linkIndex < validLinks.length - 1) {\n next = getSiblingLink(validLinks[linkIndex + 1]);\n }\n }\n\n return { prev, next };\n}\n\nexport async function resolveMarkdown(slug: string, contentDir: string) {\n const filePath = await getPathBySlug(slug, contentDir);\n const baseUrl = pathToFileURL(filePath).href;\n const file = await read(filePath);\n const frontmatter = await compileFrontmatter(file);\n const { code, toc } = await compileMarkdown(file, baseUrl);\n return { code, toc, frontmatter };\n}\n\nexport async function resolveContent(\n id: string,\n linksMap: Map<string, SidebarLinkType[]>,\n contentDir: string,\n) {\n const slug = id.replace(CONTENT_VIRTUAL_ID, \"\").replace(\"\\0\", \"\");\n const base = slug.split(\"/\")[0] as string;\n\n const { prev, next } = resolveSiblings(base, slug, linksMap);\n const { toc, code, frontmatter } = await resolveMarkdown(slug, contentDir);\n let resolvedCode = code;\n\n resolvedCode += `\\n export const toc = ${JSON.stringify(toc)}\\n`;\n resolvedCode += `\\n export const prev = ${JSON.stringify(prev)}\\n`;\n resolvedCode += `\\n export const next = ${JSON.stringify(next)}\\n`;\n resolvedCode += `\\n export const frontmatter = ${JSON.stringify(\n frontmatter,\n )}\\n`;\n return resolvedCode;\n}\n\nexport async function getPathBySlug(slug: string, contentDir: string) {\n const pathMatch = join(contentDir, slug);\n const matches = await glob(`${pathMatch}.{md,mdx}`);\n if (matches.length === 0) {\n throw new PrestigeError(\n `[Prestige] Could not find markdown file for slug: \"${slug}\". Searched at: ${pathMatch}.{md,mdx}. If you want to link to a custom page, use 'link: \"${slug}\"' instead of 'slug: \"${slug}\"' in your collection config.`,\n );\n }\n return matches[0] as string;\n}\n\nexport async function getFileBySlug(slug: string, contentDir: string) {\n return await read(await getPathBySlug(slug, contentDir));\n}\n\nexport function getVirtualModuleIdsForFile(path: string, contentDir: string) {\n const slug = getSlugByPath(path, contentDir);\n return [\"\\0\" + CONTENT_VIRTUAL_ID + slug];\n}\n\nexport function getSlugByPath(path: string, contentDir: string) {\n // 1. Get the relative path: \"zz/zz/myFile.json\"\n const relativePath = relative(contentDir, path);\n\n // 2. Parse the path to separate the extension\n const pathInfo = parse(relativePath);\n\n const result = join(pathInfo.dir, pathInfo.name);\n\n return result;\n}\n","import { readdir } from \"node:fs/promises\";\nimport { basename } from \"node:path\";\nimport { join } from \"pathe\";\nimport {\n Collection,\n CollectionGroup,\n CollectionItem,\n Collections,\n ExternalSidebarLinkType,\n InternalCollectionLink,\n InternalSidebarLinkType,\n NavigationLinks,\n SiblingNavigationType,\n SidebarGroupType,\n SidebarItemType,\n SidebarType,\n} from \"../core/content/content.types\";\nimport { PrestigeError } from \"../utils/errors\";\nimport { pathExists } from \"../utils/file-utils\";\nimport logger from \"../utils/logger\";\nimport { compileFrontmatter } from \"./content-compiler\";\nimport { getFileBySlug } from \"./content.store\";\n\nexport const SIDEBAR_VIRTUAL_ID = \"virtual:prestige/sidebar/\";\n\nfunction flattenSidebar(items: SidebarItemType[]): SiblingNavigationType[] {\n return items.flatMap((item) => {\n if (\"slug\" in item) {\n return [{ label: item.label, link: `/${item.slug}` }];\n }\n if (\"link\" in item) {\n // Ignore external links\n if (item.link.startsWith(\"http://\") || item.link.startsWith(\"https://\")) {\n return [];\n }\n return [{ label: item.label, link: item.link }];\n }\n if (\"items\" in item) {\n return flattenSidebar(item.items);\n }\n return [];\n });\n}\n\nfunction computeNavigation(\n items: SidebarItemType[],\n): Record<string, NavigationLinks> {\n const flattenedLinks = flattenSidebar(items);\n const navigation: Record<string, NavigationLinks> = {};\n\n for (let i = 0; i < flattenedLinks.length; i++) {\n const link = flattenedLinks[i];\n if (link) {\n navigation[link.link] = {\n prev: i > 0 ? flattenedLinks[i - 1] : null,\n next: i < flattenedLinks.length - 1 ? flattenedLinks[i + 1] : null,\n };\n }\n }\n\n return navigation;\n}\n\nfunction resolveDefaultLink(\n items: SidebarItemType[],\n defaultLink?: string,\n): string | undefined {\n if (defaultLink) {\n return defaultLink;\n }\n for (const item of items) {\n if (\"slug\" in item) {\n return item.slug;\n } else if (\"link\" in item) {\n return item.link;\n } else if (\"items\" in item && item.items.length > 0) {\n const link = resolveDefaultLink(item.items);\n if (link) return link;\n }\n }\n return undefined;\n}\n\nexport async function resolveSidebars(\n collections: Collections,\n contentDir: string,\n) {\n const store = new Map<string, SidebarType>();\n\n for (const collection of collections) {\n const sidebar = await processCollection(collection, contentDir);\n store.set(collection.id, sidebar);\n }\n return store;\n}\n\n/** @visibleForTesting */\nasync function processCollection(\n collection: Collection,\n contentDir: string,\n): Promise<SidebarType> {\n const items: SidebarItemType[] = [];\n for (const item of collection.items) {\n items.push(await processItem(item, contentDir));\n }\n const defaultLink = resolveDefaultLink(items, collection.defaultLink);\n if (!defaultLink) {\n throw new PrestigeError(\n `No default link found in collection, it means there are no links in the collection. Please define one in ${collection.id}`,\n );\n }\n return {\n items,\n defaultLink: defaultLink,\n navigation: computeNavigation(items),\n };\n}\n\n/** @visibleForTesting */\nasync function processItem(\n item: CollectionItem,\n contentDir: string,\n): Promise<SidebarItemType> {\n if (typeof item === \"string\" || \"slug\" in item) {\n return resolveInternalSidebarLink(\n item as InternalCollectionLink,\n contentDir,\n );\n } else if (\"link\" in item) {\n return resolveSidebarLink(item, contentDir);\n } else {\n return resolveSidebarGroup(item as CollectionGroup, contentDir);\n }\n}\n\n/** @visibleForTesting */\nasync function resolveSidebarGroup(\n group: CollectionGroup,\n contentDir: string,\n): Promise<SidebarGroupType> {\n const label = await resolveLabel(group, contentDir);\n const items: SidebarItemType[] = [];\n\n if (group.items?.length && group.autogenerate) {\n logger.warn(\n `${group.label} has both items and autogenerate. Only items will be used.`,\n );\n }\n\n if (group.items) {\n for (const childItem of group.items) {\n items.push(await processItem(childItem, contentDir));\n }\n } else if (group.autogenerate?.directory) {\n const generatedItems = await autogenerateSidebar(\n group.autogenerate.directory,\n contentDir,\n );\n items.push(...generatedItems);\n }\n\n return {\n label,\n collapsible: group.collapsible,\n items,\n };\n}\n\n/** @visibleForTesting */\nasync function resolveInternalSidebarLink(\n item: InternalCollectionLink,\n contentDir: string,\n): Promise<InternalSidebarLinkType> {\n const label = await resolveLabel(item, contentDir);\n const slug = resolveSlug(item);\n\n if (slug.startsWith(\"/\") || slug.endsWith(\"/\")) {\n throw new PrestigeError(\n `The slug ${slug} cannot start or end with a slash. Remove it and try again.`,\n );\n }\n\n if (!slug) {\n throw new PrestigeError(\n `The slug cannot be empty. Remove it and try again. link label is ${label}`,\n );\n }\n\n return {\n label,\n slug,\n };\n}\n\n/** @visibleForTesting */\nasync function resolveSidebarLink(\n item: ExternalSidebarLinkType,\n contentDir: string,\n): Promise<ExternalSidebarLinkType> {\n const label = await resolveLabel(item, contentDir);\n const link = resolveLink(item);\n\n if (!link) {\n throw new PrestigeError(\n `The link cannot be empty. Remove it and try again. link label is ${label}`,\n );\n }\n\n return {\n label,\n link,\n };\n}\n\n/** @visibleForTesting */\nasync function autogenerateSidebar(\n directory: string,\n contentDir: string,\n): Promise<SidebarItemType[]> {\n const fileExtRegex = /\\.mdx?$/i;\n\n const items: SidebarItemType[] = [];\n const dirPath = join(contentDir, directory);\n if (!(await pathExists(dirPath))) {\n logger.warn(`Directory doesn't exist: ${directory}`);\n return [];\n }\n\n const dirents = await readdir(dirPath, { withFileTypes: true });\n dirents.sort((a, b) => a.name.localeCompare(b.name));\n for (const dirent of dirents) {\n if (dirent.isDirectory()) {\n const subDir = join(directory, dirent.name);\n const group: CollectionGroup = {\n label: dirent.name,\n autogenerate: { directory: subDir },\n };\n items.push(await resolveSidebarGroup(group, contentDir));\n } else if (dirent.isFile() && fileExtRegex.test(dirent.name)) {\n const fullPath = join(directory, dirent.name);\n const slug = fullPath.replace(fileExtRegex, \"\");\n items.push(await resolveInternalSidebarLink(slug, contentDir));\n }\n }\n return items;\n}\n\n/** @visibleForTesting */\nasync function resolveLabel(\n item: CollectionItem,\n contentDir: string,\n): Promise<string> {\n if (typeof item !== \"string\" && \"label\" in item && item.label) {\n return item.label;\n }\n\n if (typeof item === \"string\" || \"slug\" in item) {\n const slug = resolveSlug(item);\n\n const file = await getFileBySlug(slug, contentDir);\n if (!file) {\n throw new PrestigeError(\n `markdown file not found with slug: ${slug} add one in content folder or update config`,\n );\n }\n const data = (await compileFrontmatter(file)) as any;\n if (data?.label) {\n return data?.label;\n }\n\n return basename(slug);\n }\n\n // is a group\n if (typeof item !== \"string\" && (\"items\" in item || \"autogenerate\" in item)) {\n return item.label;\n }\n\n return \"\";\n}\n\n/** @visibleForTesting */\nexport function resolveSlug(item: CollectionItem) {\n if (typeof item === \"string\") {\n return item;\n } else {\n if (\"slug\" in item) {\n return item.slug;\n }\n return \"\";\n }\n}\n\n/** @visibleForTesting */\nexport function resolveLink(item: CollectionItem) {\n if (typeof item === \"object\" && \"link\" in item) {\n return item.link;\n }\n return \"\";\n}\n","import { mkdir, readdir, readFile, unlink, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { SidebarLinkType } from \"../core/content/content.types\";\nimport logger from \"../utils/logger\";\n\nexport async function compileRoutes(\n linksMap: Map<string, SidebarLinkType[]>,\n routesDir: string,\n) {\n const prestigePath = \"(prestige)\";\n const prestigeFullPath = join(routesDir, prestigePath);\n\n try {\n await mkdir(prestigeFullPath, { recursive: true });\n\n const generatedFiles = new Map<string, string>();\n\n for (const [key, links] of linksMap) {\n const onlyInternalLinks = links.filter((l) => \"slug\" in l);\n\n const sidebarPath = key;\n const sidebarFile = sidebarPath + \".lazy.tsx\";\n generatedFiles.set(sidebarFile, createLayoutRoute(key));\n\n for (const l of onlyInternalLinks) {\n const pathified = l.slug.replaceAll(\"/\", \".\") + \".lazy.tsx\";\n generatedFiles.set(pathified, createContentRoute(l.slug));\n }\n }\n\n // Write files only if they have changed or do not exist\n await Promise.all(\n [...generatedFiles.entries()].map(async ([fileName, contents]) => {\n const filePath = join(prestigeFullPath, fileName);\n try {\n const existingContent = await readFile(filePath, \"utf-8\");\n if (existingContent === contents) {\n return; // Skip writing if identical\n }\n } catch (e) {\n // File doesn't exist yet, proceed to write\n }\n logger.info(`Writing route file: ${fileName}`, { timestamp: true });\n return writeFile(filePath, contents);\n }),\n );\n\n const existingFiles = await readdir(prestigeFullPath);\n const staleFiles = existingFiles.filter(\n (fileName) =>\n fileName.endsWith(\".lazy.tsx\") && !generatedFiles.has(fileName),\n );\n\n await Promise.all(\n staleFiles.map((fileName) => {\n logger.info(`Removing stale route file: ${fileName}`, {\n timestamp: true,\n });\n return unlink(join(prestigeFullPath, fileName));\n }),\n );\n } catch (error) {\n logger.error(\n `[Prestige Router Compiler] Failed to compile routes: ${error}`,\n { timestamp: true },\n );\n console.error(\n \"[Prestige Router Compiler] Failed to compile routes:\",\n error,\n );\n }\n}\n\nfunction createLayoutRoute(id: string) {\n return (\n `\nimport { createLazyFileRoute } from '@tanstack/react-router';\nimport sidebar from \"virtual:prestige/sidebar/${id}\";\nimport { CollectionRoute } from \"@lonik/prestige/ui\";\n\nexport const Route = createLazyFileRoute('/(prestige)/${id}')(CollectionRoute(sidebar, \"${id}\"));\n`.trim() + \"\\n\"\n );\n}\n\nfunction createContentRoute(slug: string) {\n return (\n `\nimport { createLazyFileRoute } from \"@tanstack/react-router\";\nimport * as contentData from \"virtual:prestige/content/${slug}\";\nimport { ContentRoute } from \"@lonik/prestige/ui\";\n\nexport const Route = createLazyFileRoute('/(prestige)/${slug}')(ContentRoute(contentData));\n`.trim() + \"\\n\"\n );\n}\n","import { genDynamicImport } from \"knitwork\";\n\nexport function genExportDefault(specifier: string) {\n return `export default ${specifier};`;\n}\n\n/** exports default undefined */\nexport function genExportUndefined() {\n return genExportDefault(\"undefined\");\n}\n\nexport function genDynamicImportWithDefault(specifier: string) {\n return `${genDynamicImport(specifier)}.then(m => m.default)`;\n}\n","import { genArrayFromRaw, genObjectFromValues } from \"knitwork\";\nimport { genExportDefault } from \"../../utils/code-generation\";\nimport { PrestigeError } from \"../../utils/errors\";\nimport {\n CollectionNavigation,\n Collections,\n SidebarLinkType,\n} from \"./content.types\";\n\nexport const COLLECTION_VIRTUAL_ID = \"virtual:prestige/collection-all\";\n\nexport function resolveCollectionNavigations(\n inlineCollections: Collections,\n linksMap: Map<string, SidebarLinkType[]>,\n) {\n const collections: CollectionNavigation[] = inlineCollections.map((c) => ({\n id: c.id,\n label: c.label ?? c.id,\n defaultLink: c.defaultLink ?? \"\",\n }));\n if (collections.length === 0) {\n throw new PrestigeError(\n `No collections found, add one in prestige plugin config`,\n );\n }\n\n for (const coll of collections) {\n const links = linksMap.get(coll.id);\n const firstInternalLink = links?.find(l => \"slug\" in l);\n if (coll.defaultLink || !firstInternalLink) {\n continue;\n }\n coll.defaultLink = firstInternalLink.slug;\n }\n\n for (const coll of collections) {\n if (!coll.defaultLink) {\n console.warn(\n `No default link found for collection ${coll.id}, it won't be displayed in the header navigation`,\n );\n }\n }\n\n const validCollections = collections.filter((c) => c.defaultLink);\n\n return genExportDefault(\n genArrayFromRaw(validCollections.map((c) => genObjectFromValues(c))),\n );\n}\n","import { join } from \"pathe\";\nimport picomatch, { type Matcher } from \"picomatch\";\nimport { EnvironmentModuleNode, type Plugin } from \"vite\";\nimport { resolvePrestigeConfig } from \"./config/config\";\nimport { PrestigeConfig, PrestigeConfigInput } from \"./config/config.types\";\n\nimport { genObjectFromValues } from \"knitwork\";\nimport { resolveContentLinks } from \"./content/content-links\";\nimport {\n resolveSidebars,\n SIDEBAR_VIRTUAL_ID,\n} from \"./content/content-sidebar.store\";\nimport {\n CONTENT_VIRTUAL_ID,\n getSlugByPath,\n resolveContent,\n} from \"./content/content.store\";\nimport { compileRoutes } from \"./content/router-compiler\";\nimport {\n COLLECTION_VIRTUAL_ID,\n resolveCollectionNavigations,\n} from \"./core/content/content-collection.store\";\nimport {\n Collections,\n SidebarLinkType,\n SidebarType,\n} from \"./core/content/content.types\";\nimport { genExportDefault, genExportUndefined } from \"./utils/code-generation\";\nimport { extractVirtualId } from \"./utils/file-utils\";\nimport logger from \"./utils/logger\";\n\nexport const CONFIG_VIRTUAL_ID = \"virtual:prestige/config\";\n\nexport default function prestige(inlineConfig?: PrestigeConfigInput): Plugin {\n let config: PrestigeConfig;\n let contentDir: string;\n let isDocsMatcher: Matcher;\n let collections: Collections = [];\n let linksMap: Map<string, SidebarLinkType[]>;\n let collectionNavigations: string;\n let sidebarsMap: Map<string, SidebarType>;\n return {\n name: \"vite-plugin-prestige\",\n enforce: \"pre\",\n async configResolved(resolvedConfig) {\n logger.info(\"Resolving Prestige configuration...\", { timestamp: true });\n const { config: loadedConfig } = await resolvePrestigeConfig(\n inlineConfig,\n resolvedConfig.root,\n );\n config = loadedConfig;\n contentDir = join(resolvedConfig.root, \"src/content\");\n isDocsMatcher = picomatch(join(contentDir, \"**/*.{md,mdx}\"));\n collections = config.collections ?? [];\n\n logger.info(\"Resolving sidebars...\", { timestamp: true });\n sidebarsMap = await resolveSidebars(collections, contentDir);\n\n logger.info(\"Resolving content links...\", { timestamp: true });\n linksMap = resolveContentLinks(sidebarsMap);\n\n logger.info(\"Resolving collection navigations....\", { timestamp: true });\n collectionNavigations = resolveCollectionNavigations(\n collections,\n linksMap,\n );\n\n const routesDir = join(resolvedConfig.root, \"src\", \"routes\");\n\n logger.info(\"Compiling routes...\", { timestamp: true });\n await compileRoutes(linksMap, routesDir);\n },\n resolveId(id) {\n // even though the import will be import * from \"virtual:prestige/docs/introduction\"\n // it is not guaranteed that some other plugin doesn't modify this import and attach full path\n // we call extractVirtualId to trim the import\n\n if (id.includes(CONFIG_VIRTUAL_ID)) {\n logger.info(`Resolving config virtual ID: ${id}`, { timestamp: true });\n return extractVirtualId(id, CONFIG_VIRTUAL_ID);\n }\n\n if (id.includes(CONTENT_VIRTUAL_ID)) {\n logger.info(`Resolving content virtual ID: ${id}`, { timestamp: true });\n return extractVirtualId(id, CONTENT_VIRTUAL_ID);\n }\n\n if (id.includes(COLLECTION_VIRTUAL_ID)) {\n logger.info(`Resolving collection virtual ID: ${id}`, {\n timestamp: true,\n });\n return extractVirtualId(id, COLLECTION_VIRTUAL_ID);\n }\n\n if (id.includes(SIDEBAR_VIRTUAL_ID)) {\n logger.info(`Resolving sidebar virtual ID: ${id}`, { timestamp: true });\n return extractVirtualId(id, SIDEBAR_VIRTUAL_ID);\n }\n\n return null;\n },\n async load(id) {\n if (id === `\\0${CONFIG_VIRTUAL_ID}`) {\n logger.info(`Loading config virtual module: ${id}`, {\n timestamp: true,\n });\n return genExportDefault(JSON.stringify(config));\n }\n if (id.includes(CONTENT_VIRTUAL_ID)) {\n logger.info(`Loading content virtual module: ${id}`, {\n timestamp: true,\n });\n return await resolveContent(id, linksMap, contentDir);\n }\n if (id.includes(COLLECTION_VIRTUAL_ID)) {\n logger.info(`Loading collection virtual module: ${id}`, {\n timestamp: true,\n });\n return collectionNavigations;\n }\n\n if (id.includes(SIDEBAR_VIRTUAL_ID)) {\n logger.info(`Loading sidebar virtual module: ${id}`, {\n timestamp: true,\n });\n const sidebarId = id.replace(SIDEBAR_VIRTUAL_ID, \"\").replace(\"\\0\", \"\");\n const sidebar = sidebarsMap.get(sidebarId);\n if (!sidebar) {\n return genExportUndefined();\n }\n return genExportDefault(genObjectFromValues(sidebar));\n }\n\n return null;\n },\n\n async hotUpdate({ file, timestamp }) {\n if (isDocsMatcher(file)) {\n logger.info(`Invalidating module ${file}...`, { timestamp: true });\n const invalidatedModules = new Set<EnvironmentModuleNode>();\n const slug = getSlugByPath(file, contentDir);\n const virtualModuleId = `\\0${CONTENT_VIRTUAL_ID}${slug}`;\n const module =\n this.environment.moduleGraph.getModuleById(virtualModuleId);\n if (module) {\n this.environment.moduleGraph.invalidateModule(\n module,\n invalidatedModules,\n timestamp,\n true,\n );\n logger.info(`Reloading application...`, { timestamp: true });\n this.environment.hot.send({ type: \"full-reload\" });\n }\n }\n },\n };\n}\n"],"mappings":"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"}
|
package/package.json
CHANGED
package/src/themes/core.css
CHANGED
|
@@ -42,123 +42,455 @@
|
|
|
42
42
|
}
|
|
43
43
|
|
|
44
44
|
@layer base {
|
|
45
|
-
|
|
45
|
+
/**
|
|
46
|
+
* VS theme by Andrew Lock (https://andrewlock.net)
|
|
47
|
+
* Inspired by Visual Studio syntax coloring
|
|
48
|
+
*/
|
|
49
|
+
|
|
46
50
|
code[class*="language-"],
|
|
47
51
|
pre[class*="language-"] {
|
|
48
|
-
|
|
52
|
+
color: #393a34;
|
|
49
53
|
direction: ltr;
|
|
54
|
+
text-align: left;
|
|
55
|
+
white-space: pre;
|
|
50
56
|
word-spacing: normal;
|
|
57
|
+
word-break: normal;
|
|
58
|
+
font-size: 13px;
|
|
59
|
+
line-height: 1.2em;
|
|
60
|
+
|
|
51
61
|
-moz-tab-size: 4;
|
|
52
62
|
-o-tab-size: 4;
|
|
53
63
|
tab-size: 4;
|
|
64
|
+
|
|
54
65
|
-webkit-hyphens: none;
|
|
55
66
|
-moz-hyphens: none;
|
|
56
67
|
-ms-hyphens: none;
|
|
57
68
|
hyphens: none;
|
|
58
69
|
}
|
|
59
70
|
|
|
60
|
-
|
|
71
|
+
pre[class*="language-"]::-moz-selection,
|
|
72
|
+
pre[class*="language-"] ::-moz-selection,
|
|
73
|
+
code[class*="language-"]::-moz-selection,
|
|
74
|
+
code[class*="language-"] ::-moz-selection {
|
|
75
|
+
background: #c1def1;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
pre[class*="language-"]::selection,
|
|
79
|
+
pre[class*="language-"] ::selection,
|
|
80
|
+
code[class*="language-"]::selection,
|
|
81
|
+
code[class*="language-"] ::selection {
|
|
82
|
+
background: #c1def1;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
/* Code blocks */
|
|
61
86
|
pre[class*="language-"] {
|
|
62
|
-
|
|
87
|
+
padding: 1em;
|
|
88
|
+
margin: 0.5em 0;
|
|
89
|
+
overflow: auto;
|
|
90
|
+
border: 1px solid #dddddd;
|
|
91
|
+
background-color: white;
|
|
63
92
|
}
|
|
64
93
|
|
|
65
|
-
/* Inline code
|
|
94
|
+
/* Inline code */
|
|
66
95
|
:not(pre) > code[class*="language-"] {
|
|
67
|
-
|
|
96
|
+
padding: 0.2em;
|
|
97
|
+
padding-top: 1px;
|
|
98
|
+
padding-bottom: 1px;
|
|
99
|
+
background: #f8f8f8;
|
|
100
|
+
border: 1px solid #dddddd;
|
|
68
101
|
}
|
|
69
102
|
|
|
70
|
-
/* --- Tokens --- */
|
|
71
103
|
.token.comment,
|
|
72
104
|
.token.prolog,
|
|
73
105
|
.token.doctype,
|
|
74
106
|
.token.cdata {
|
|
75
|
-
|
|
107
|
+
color: #008000;
|
|
108
|
+
font-style: italic;
|
|
76
109
|
}
|
|
77
110
|
|
|
78
|
-
.token.
|
|
79
|
-
|
|
111
|
+
.token.namespace {
|
|
112
|
+
opacity: 0.7;
|
|
80
113
|
}
|
|
81
114
|
|
|
82
|
-
.
|
|
83
|
-
|
|
115
|
+
.token.string {
|
|
116
|
+
color: #a31515;
|
|
84
117
|
}
|
|
85
118
|
|
|
86
|
-
.token.
|
|
87
|
-
.token.
|
|
88
|
-
|
|
89
|
-
@apply text-blue-600 dark:text-[#96cbfe];
|
|
119
|
+
.token.punctuation,
|
|
120
|
+
.token.operator {
|
|
121
|
+
color: #393a34; /* no highlight */
|
|
90
122
|
}
|
|
91
123
|
|
|
92
|
-
.token.
|
|
93
|
-
|
|
124
|
+
.token.url,
|
|
125
|
+
.token.symbol,
|
|
126
|
+
.token.number,
|
|
127
|
+
.token.boolean,
|
|
128
|
+
.token.variable,
|
|
129
|
+
.token.constant,
|
|
130
|
+
.token.inserted {
|
|
131
|
+
color: #36acaa;
|
|
94
132
|
}
|
|
95
133
|
|
|
96
|
-
.token.
|
|
97
|
-
.token.
|
|
98
|
-
|
|
134
|
+
.token.atrule,
|
|
135
|
+
.token.keyword,
|
|
136
|
+
.token.attr-value,
|
|
137
|
+
.language-autohotkey .token.selector,
|
|
138
|
+
.language-json .token.boolean,
|
|
139
|
+
.language-json .token.number,
|
|
140
|
+
code[class*="language-css"] {
|
|
141
|
+
color: #0000ff;
|
|
99
142
|
}
|
|
100
143
|
|
|
101
|
-
.token.
|
|
102
|
-
|
|
103
|
-
@apply text-pink-600 dark:text-[#f92672];
|
|
144
|
+
.token.function {
|
|
145
|
+
color: #393a34;
|
|
104
146
|
}
|
|
105
147
|
|
|
106
|
-
.token.
|
|
107
|
-
|
|
148
|
+
.token.deleted,
|
|
149
|
+
.language-autohotkey .token.tag {
|
|
150
|
+
color: #9a050f;
|
|
108
151
|
}
|
|
109
152
|
|
|
110
153
|
.token.selector,
|
|
111
|
-
.token.
|
|
112
|
-
|
|
113
|
-
.token.char,
|
|
114
|
-
.token.builtin,
|
|
115
|
-
.token.inserted {
|
|
116
|
-
@apply text-green-600 dark:text-[#a8ff60];
|
|
154
|
+
.language-autohotkey .token.keyword {
|
|
155
|
+
color: #00009f;
|
|
117
156
|
}
|
|
118
157
|
|
|
119
|
-
.token.
|
|
120
|
-
|
|
158
|
+
.token.important {
|
|
159
|
+
color: #e90;
|
|
121
160
|
}
|
|
122
161
|
|
|
123
|
-
.token.
|
|
124
|
-
|
|
162
|
+
.token.important,
|
|
163
|
+
.token.bold {
|
|
164
|
+
font-weight: bold;
|
|
125
165
|
}
|
|
126
166
|
|
|
127
|
-
.token.
|
|
128
|
-
|
|
167
|
+
.token.italic {
|
|
168
|
+
font-style: italic;
|
|
129
169
|
}
|
|
130
170
|
|
|
131
|
-
.token.
|
|
132
|
-
|
|
171
|
+
.token.class-name,
|
|
172
|
+
.language-json .token.property {
|
|
173
|
+
color: #2b91af;
|
|
133
174
|
}
|
|
134
175
|
|
|
135
|
-
.
|
|
136
|
-
.
|
|
137
|
-
|
|
176
|
+
.token.tag,
|
|
177
|
+
.token.selector {
|
|
178
|
+
color: #800000;
|
|
138
179
|
}
|
|
139
180
|
|
|
140
|
-
.token.
|
|
141
|
-
.token.
|
|
142
|
-
|
|
181
|
+
.token.attr-name,
|
|
182
|
+
.token.property,
|
|
183
|
+
.token.regex,
|
|
184
|
+
.token.entity {
|
|
185
|
+
color: #ff0000;
|
|
143
186
|
}
|
|
144
187
|
|
|
145
|
-
.token.
|
|
146
|
-
|
|
188
|
+
.token.directive.tag .tag {
|
|
189
|
+
background: #ffff00;
|
|
190
|
+
color: #393a34;
|
|
147
191
|
}
|
|
148
192
|
|
|
149
|
-
|
|
150
|
-
|
|
193
|
+
/* overrides color-values for the Line Numbers plugin
|
|
194
|
+
* http://prismjs.com/plugins/line-numbers/
|
|
195
|
+
*/
|
|
196
|
+
.line-numbers.line-numbers .line-numbers-rows {
|
|
197
|
+
border-right-color: #a5a5a5;
|
|
151
198
|
}
|
|
152
199
|
|
|
153
|
-
.
|
|
154
|
-
|
|
200
|
+
.line-numbers .line-numbers-rows > span:before {
|
|
201
|
+
color: #2b91af;
|
|
155
202
|
}
|
|
156
203
|
|
|
157
|
-
|
|
158
|
-
|
|
204
|
+
/* overrides color-values for the Line Highlight plugin
|
|
205
|
+
* http://prismjs.com/plugins/line-highlight/
|
|
206
|
+
*/
|
|
207
|
+
.line-highlight.line-highlight {
|
|
208
|
+
background: rgba(193, 222, 241, 0.2);
|
|
209
|
+
background: -webkit-linear-gradient(
|
|
210
|
+
left,
|
|
211
|
+
rgba(193, 222, 241, 0.2) 70%,
|
|
212
|
+
rgba(221, 222, 241, 0)
|
|
213
|
+
);
|
|
214
|
+
background: linear-gradient(
|
|
215
|
+
to right,
|
|
216
|
+
rgba(193, 222, 241, 0.2) 70%,
|
|
217
|
+
rgba(221, 222, 241, 0)
|
|
218
|
+
);
|
|
159
219
|
}
|
|
160
220
|
|
|
161
|
-
|
|
162
|
-
|
|
221
|
+
@variant dark {
|
|
222
|
+
pre[class*="language-"],
|
|
223
|
+
code[class*="language-"] {
|
|
224
|
+
color: #d4d4d4;
|
|
225
|
+
font-size: 13px;
|
|
226
|
+
direction: ltr;
|
|
227
|
+
text-align: left;
|
|
228
|
+
white-space: pre;
|
|
229
|
+
word-spacing: normal;
|
|
230
|
+
word-break: normal;
|
|
231
|
+
line-height: 1.5;
|
|
232
|
+
-moz-tab-size: 4;
|
|
233
|
+
-o-tab-size: 4;
|
|
234
|
+
tab-size: 4;
|
|
235
|
+
-webkit-hyphens: none;
|
|
236
|
+
-moz-hyphens: none;
|
|
237
|
+
-ms-hyphens: none;
|
|
238
|
+
hyphens: none;
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
pre[class*="language-"]::selection,
|
|
242
|
+
code[class*="language-"]::selection,
|
|
243
|
+
pre[class*="language-"] *::selection,
|
|
244
|
+
code[class*="language-"] *::selection {
|
|
245
|
+
text-shadow: none;
|
|
246
|
+
background: #264f78;
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
@media print {
|
|
250
|
+
pre[class*="language-"],
|
|
251
|
+
code[class*="language-"] {
|
|
252
|
+
text-shadow: none;
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
pre[class*="language-"] {
|
|
257
|
+
padding: 1em;
|
|
258
|
+
margin: 0.5em 0;
|
|
259
|
+
overflow: auto;
|
|
260
|
+
background: #1e1e1e;
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
:not(pre) > code[class*="language-"] {
|
|
264
|
+
padding: 0.1em 0.3em;
|
|
265
|
+
border-radius: 0.3em;
|
|
266
|
+
color: #db4c69;
|
|
267
|
+
background: #1e1e1e;
|
|
268
|
+
}
|
|
269
|
+
/*********************************************************
|
|
270
|
+
* Tokens
|
|
271
|
+
*/
|
|
272
|
+
.namespace {
|
|
273
|
+
opacity: 0.7;
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
.token.doctype .token.doctype-tag {
|
|
277
|
+
color: #569cd6;
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
.token.doctype .token.name {
|
|
281
|
+
color: #9cdcfe;
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
.token.comment,
|
|
285
|
+
.token.prolog {
|
|
286
|
+
color: #6a9955;
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
.token.punctuation,
|
|
290
|
+
.language-html .language-css .token.punctuation,
|
|
291
|
+
.language-html .language-javascript .token.punctuation {
|
|
292
|
+
color: #d4d4d4;
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
.token.property,
|
|
296
|
+
.token.tag,
|
|
297
|
+
.token.boolean,
|
|
298
|
+
.token.number,
|
|
299
|
+
.token.constant,
|
|
300
|
+
.token.symbol,
|
|
301
|
+
.token.inserted,
|
|
302
|
+
.token.unit {
|
|
303
|
+
color: #b5cea8;
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
.token.selector,
|
|
307
|
+
.token.attr-name,
|
|
308
|
+
.token.string,
|
|
309
|
+
.token.char,
|
|
310
|
+
.token.builtin,
|
|
311
|
+
.token.deleted {
|
|
312
|
+
color: #ce9178;
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
.language-css .token.string.url {
|
|
316
|
+
text-decoration: underline;
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
.token.operator,
|
|
320
|
+
.token.entity {
|
|
321
|
+
color: #d4d4d4;
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
.token.operator.arrow {
|
|
325
|
+
color: #569cd6;
|
|
326
|
+
}
|
|
327
|
+
|
|
328
|
+
.token.atrule {
|
|
329
|
+
color: #ce9178;
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
.token.atrule .token.rule {
|
|
333
|
+
color: #c586c0;
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
.token.atrule .token.url {
|
|
337
|
+
color: #9cdcfe;
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
.token.atrule .token.url .token.function {
|
|
341
|
+
color: #dcdcaa;
|
|
342
|
+
}
|
|
343
|
+
|
|
344
|
+
.token.atrule .token.url .token.punctuation {
|
|
345
|
+
color: #d4d4d4;
|
|
346
|
+
}
|
|
347
|
+
|
|
348
|
+
.token.keyword {
|
|
349
|
+
color: #569cd6;
|
|
350
|
+
}
|
|
351
|
+
|
|
352
|
+
.token.keyword.module,
|
|
353
|
+
.token.keyword.control-flow {
|
|
354
|
+
color: #c586c0;
|
|
355
|
+
}
|
|
356
|
+
|
|
357
|
+
.token.function,
|
|
358
|
+
.token.function .token.maybe-class-name {
|
|
359
|
+
color: #dcdcaa;
|
|
360
|
+
}
|
|
361
|
+
|
|
362
|
+
.token.regex {
|
|
363
|
+
color: #d16969;
|
|
364
|
+
}
|
|
365
|
+
|
|
366
|
+
.token.important {
|
|
367
|
+
color: #569cd6;
|
|
368
|
+
}
|
|
369
|
+
|
|
370
|
+
.token.italic {
|
|
371
|
+
font-style: italic;
|
|
372
|
+
}
|
|
373
|
+
|
|
374
|
+
.token.constant {
|
|
375
|
+
color: #9cdcfe;
|
|
376
|
+
}
|
|
377
|
+
|
|
378
|
+
.token.class-name,
|
|
379
|
+
.token.maybe-class-name {
|
|
380
|
+
color: #4ec9b0;
|
|
381
|
+
}
|
|
382
|
+
|
|
383
|
+
.token.console {
|
|
384
|
+
color: #9cdcfe;
|
|
385
|
+
}
|
|
386
|
+
|
|
387
|
+
.token.parameter {
|
|
388
|
+
color: #9cdcfe;
|
|
389
|
+
}
|
|
390
|
+
|
|
391
|
+
.token.interpolation {
|
|
392
|
+
color: #9cdcfe;
|
|
393
|
+
}
|
|
394
|
+
|
|
395
|
+
.token.punctuation.interpolation-punctuation {
|
|
396
|
+
color: #569cd6;
|
|
397
|
+
}
|
|
398
|
+
|
|
399
|
+
.token.boolean {
|
|
400
|
+
color: #569cd6;
|
|
401
|
+
}
|
|
402
|
+
|
|
403
|
+
.token.property,
|
|
404
|
+
.token.variable,
|
|
405
|
+
.token.imports .token.maybe-class-name,
|
|
406
|
+
.token.exports .token.maybe-class-name {
|
|
407
|
+
color: #9cdcfe;
|
|
408
|
+
}
|
|
409
|
+
|
|
410
|
+
.token.selector {
|
|
411
|
+
color: #d7ba7d;
|
|
412
|
+
}
|
|
413
|
+
|
|
414
|
+
.token.escape {
|
|
415
|
+
color: #d7ba7d;
|
|
416
|
+
}
|
|
417
|
+
|
|
418
|
+
.token.tag {
|
|
419
|
+
color: #569cd6;
|
|
420
|
+
}
|
|
421
|
+
|
|
422
|
+
.token.tag .token.punctuation {
|
|
423
|
+
color: #808080;
|
|
424
|
+
}
|
|
425
|
+
|
|
426
|
+
.token.cdata {
|
|
427
|
+
color: #808080;
|
|
428
|
+
}
|
|
429
|
+
|
|
430
|
+
.token.attr-name {
|
|
431
|
+
color: #9cdcfe;
|
|
432
|
+
}
|
|
433
|
+
|
|
434
|
+
.token.attr-value,
|
|
435
|
+
.token.attr-value .token.punctuation {
|
|
436
|
+
color: #ce9178;
|
|
437
|
+
}
|
|
438
|
+
|
|
439
|
+
.token.attr-value .token.punctuation.attr-equals {
|
|
440
|
+
color: #d4d4d4;
|
|
441
|
+
}
|
|
442
|
+
|
|
443
|
+
.token.entity {
|
|
444
|
+
color: #569cd6;
|
|
445
|
+
}
|
|
446
|
+
|
|
447
|
+
.token.namespace {
|
|
448
|
+
color: #4ec9b0;
|
|
449
|
+
}
|
|
450
|
+
/*********************************************************
|
|
451
|
+
* Language Specific
|
|
452
|
+
*/
|
|
453
|
+
|
|
454
|
+
pre[class*="language-javascript"],
|
|
455
|
+
code[class*="language-javascript"],
|
|
456
|
+
pre[class*="language-jsx"],
|
|
457
|
+
code[class*="language-jsx"],
|
|
458
|
+
pre[class*="language-typescript"],
|
|
459
|
+
code[class*="language-typescript"],
|
|
460
|
+
pre[class*="language-tsx"],
|
|
461
|
+
code[class*="language-tsx"] {
|
|
462
|
+
color: #9cdcfe;
|
|
463
|
+
}
|
|
464
|
+
|
|
465
|
+
pre[class*="language-css"],
|
|
466
|
+
code[class*="language-css"] {
|
|
467
|
+
color: #ce9178;
|
|
468
|
+
}
|
|
469
|
+
|
|
470
|
+
pre[class*="language-html"],
|
|
471
|
+
code[class*="language-html"] {
|
|
472
|
+
color: #d4d4d4;
|
|
473
|
+
}
|
|
474
|
+
|
|
475
|
+
.language-regex .token.anchor {
|
|
476
|
+
color: #dcdcaa;
|
|
477
|
+
}
|
|
478
|
+
|
|
479
|
+
.language-html .token.punctuation {
|
|
480
|
+
color: #808080;
|
|
481
|
+
}
|
|
482
|
+
/*********************************************************
|
|
483
|
+
* Line highlighting
|
|
484
|
+
*/
|
|
485
|
+
pre[class*="language-"] > code[class*="language-"] {
|
|
486
|
+
position: relative;
|
|
487
|
+
z-index: 1;
|
|
488
|
+
}
|
|
489
|
+
|
|
490
|
+
.line-highlight.line-highlight {
|
|
491
|
+
background: #f7ebc6;
|
|
492
|
+
box-shadow: inset 5px 0 0 #f7d87c;
|
|
493
|
+
z-index: 0;
|
|
494
|
+
}
|
|
163
495
|
}
|
|
164
496
|
}
|