@lonik/prestige 0.2.0 → 0.2.2

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.
@@ -38,7 +38,16 @@ type SidebarItemType = InternalSidebarLinkType | SidebarGroupType | ExternalSide
38
38
  interface SidebarType {
39
39
  items: SidebarItemType[];
40
40
  defaultLink: string;
41
+ navigation: Record<string, NavigationLinks>;
42
+ }
43
+ interface SiblingNavigationType {
44
+ label: string;
45
+ link: string;
46
+ }
47
+ interface NavigationLinks {
48
+ prev: SiblingNavigationType | null | undefined;
49
+ next: SiblingNavigationType | null | undefined;
41
50
  }
42
51
  //#endregion
43
52
  export { SidebarType as n, CollectionItem as t };
44
- //# sourceMappingURL=content.types-BbDmygmP.d.ts.map
53
+ //# sourceMappingURL=content.types-C35WR0tv.d.ts.map
package/dist/ui.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { n as SidebarType } from "./content.types-BbDmygmP.js";
1
+ import { n as SidebarType } from "./content.types-C35WR0tv.js";
2
2
  import { TocItem } from "remark-flexible-toc";
3
3
  import React, { ReactNode } from "react";
4
4
  import * as react_jsx_runtime0 from "react/jsx-runtime";
@@ -91,24 +91,14 @@ declare function Header({
91
91
  customHeaderTitle
92
92
  }: HeaderProps): react_jsx_runtime0.JSX.Element;
93
93
  //#endregion
94
- //#region src/ui/routes/content/content-navigations.d.ts
95
- interface NavigationLink {
96
- label: string;
97
- slug: string;
98
- }
99
- //#endregion
100
94
  //#region src/ui/core/prestige-page.d.ts
101
95
  interface PrestigePageProps {
102
96
  children: React.ReactNode;
103
97
  toc?: TocItem[];
104
- prev?: NavigationLink | null;
105
- next?: NavigationLink | null;
106
98
  }
107
99
  declare function PrestigePage({
108
100
  children,
109
- toc,
110
- prev,
111
- next
101
+ toc
112
102
  }: PrestigePageProps): react_jsx_runtime0.JSX.Element;
113
103
  //#endregion
114
104
  //#region src/ui/routes/collection/collection.route.d.ts
package/dist/ui.js CHANGED
@@ -284,38 +284,6 @@ function Header({ customHeaderTitle }) {
284
284
  });
285
285
  }
286
286
 
287
- //#endregion
288
- //#region src/ui/routes/content/content-navigations.tsx
289
- function ContentNavigation({ isNext, navigation }) {
290
- const label = isNext ? "Next" : "Previous";
291
- return /* @__PURE__ */ jsx(Link, {
292
- to: "/" + navigation.slug,
293
- className: clsx(" flex-1 h-20 mb-4 border border-default-200 hover:bg-default-50 rounded-md cursor-pointer flex items-center px-4", isNext ? "justify-end" : "justify-start"),
294
- children: /* @__PURE__ */ jsxs("div", {
295
- className: clsx("flex items-center gap-4", isNext && "flex-row-reverse"),
296
- children: [isNext ? /* @__PURE__ */ jsx(ArrowRight, { className: "text-default-400" }) : /* @__PURE__ */ jsx(ArrowLeft, { className: "text-default-400" }), /* @__PURE__ */ jsxs("div", {
297
- className: clsx("flex flex-col", isNext && "items-end"),
298
- children: [/* @__PURE__ */ jsx("span", {
299
- className: "text-xs tracking-widest font-mono",
300
- children: label.toLocaleUpperCase()
301
- }), /* @__PURE__ */ jsx("span", {
302
- className: "text-2xl font-li text-default-700",
303
- children: navigation.label
304
- })]
305
- })]
306
- })
307
- });
308
- }
309
- function ContentNavigations({ prev, next }) {
310
- return /* @__PURE__ */ jsxs("div", {
311
- className: "lg:flex flex-row items-center gap-2 mt-2 lg:mt-20 px-6",
312
- children: [prev && /* @__PURE__ */ jsx(ContentNavigation, { navigation: prev }), next && /* @__PURE__ */ jsx(ContentNavigation, {
313
- navigation: next,
314
- isNext: true
315
- })]
316
- });
317
- }
318
-
319
287
  //#endregion
320
288
  //#region src/ui/routes/content/table-of-contents/use-table-of-contents.ts
321
289
  function useTableOfContents(toc) {
@@ -422,9 +390,8 @@ function MobileTableOfContent({ toc }) {
422
390
  //#region src/ui/routes/content/table-of-contents/web-table-of-contents.tsx
423
391
  function WebTableOfContent({ toc }) {
424
392
  const { activeId, handleLinkClick } = useTableOfContents(toc);
425
- if (toc.length === 0) return null;
426
393
  return /* @__PURE__ */ jsxs("nav", {
427
- className: "sticky top-header h-main pt-4 overflow-y-auto w-64 shrink-0 hidden lg:block",
394
+ className: "sticky top-header pt-4 overflow-y-auto w-web-table-of-content hidden lg:block",
428
395
  children: [/* @__PURE__ */ jsx("span", {
429
396
  className: "text-xs font-mono tracking-widest",
430
397
  children: "ON THIS PAGE"
@@ -442,26 +409,55 @@ function WebTableOfContent({ toc }) {
442
409
 
443
410
  //#endregion
444
411
  //#region src/ui/core/prestige-page.tsx
445
- function PrestigePage({ children, toc = [], prev = null, next = null }) {
412
+ function PrestigePage({ children, toc = [] }) {
446
413
  return /* @__PURE__ */ jsxs("div", {
447
414
  className: "flex lg:gap-6 items-start max-w-[100vw]",
448
415
  children: [/* @__PURE__ */ jsxs("div", {
449
416
  className: "flex-1 min-w-0",
450
- children: [
451
- /* @__PURE__ */ jsx(MobileTableOfContent, { toc }),
452
- /* @__PURE__ */ jsx("article", {
453
- className: "prose max-w-none wrap-break-word py-15 px-6",
454
- children
455
- }),
456
- /* @__PURE__ */ jsx(ContentNavigations, {
457
- prev,
458
- next
459
- })
460
- ]
417
+ children: [/* @__PURE__ */ jsx(MobileTableOfContent, { toc }), /* @__PURE__ */ jsx("article", {
418
+ className: "prose max-w-none wrap-break-word py-15 px-6",
419
+ children
420
+ })]
461
421
  }), /* @__PURE__ */ jsx(WebTableOfContent, { toc })]
462
422
  });
463
423
  }
464
424
 
425
+ //#endregion
426
+ //#region src/ui/routes/content/content-navigations.tsx
427
+ function ContentNavigation({ isNext, navigation }) {
428
+ const label = isNext ? "Next" : "Previous";
429
+ return /* @__PURE__ */ jsx(Link, {
430
+ to: navigation.link,
431
+ className: clsx(" flex-1 h-20 mb-4 border border-default-200 hover:bg-default-50 rounded-md cursor-pointer flex items-center px-4", isNext ? "justify-end" : "justify-start"),
432
+ children: /* @__PURE__ */ jsxs("div", {
433
+ className: clsx("flex items-center gap-4", isNext && "flex-row-reverse"),
434
+ children: [isNext ? /* @__PURE__ */ jsx(ArrowRight, { className: "text-default-400" }) : /* @__PURE__ */ jsx(ArrowLeft, { className: "text-default-400" }), /* @__PURE__ */ jsxs("div", {
435
+ className: clsx("flex flex-col", isNext && "items-end"),
436
+ children: [/* @__PURE__ */ jsx("span", {
437
+ className: "text-xs tracking-widest font-mono",
438
+ children: label.toLocaleUpperCase()
439
+ }), /* @__PURE__ */ jsx("span", {
440
+ className: "text-2xl font-li text-default-700",
441
+ children: navigation.label
442
+ })]
443
+ })]
444
+ })
445
+ });
446
+ }
447
+ function ContentNavigations({ prev, next }) {
448
+ if (!prev && !next) return null;
449
+ return /* @__PURE__ */ jsxs("div", {
450
+ className: "flex gap-6",
451
+ children: [/* @__PURE__ */ jsxs("div", {
452
+ className: "lg:flex flex-row items-center gap-2 mt-2 lg:mt-8 flex-1",
453
+ children: [prev && /* @__PURE__ */ jsx(ContentNavigation, { navigation: prev }), next && /* @__PURE__ */ jsx(ContentNavigation, {
454
+ navigation: next,
455
+ isNext: true
456
+ })]
457
+ }), /* @__PURE__ */ jsx("div", { className: "lg:w-web-table-of-content h-1" })]
458
+ });
459
+ }
460
+
465
461
  //#endregion
466
462
  //#region src/ui/utils.ts
467
463
  function isExternalURL(str) {
@@ -572,17 +568,28 @@ function MobileSidebar({ sidebar }) {
572
568
  //#region src/ui/routes/collection/collection.route.tsx
573
569
  function CollectionRoute(sidebar, id) {
574
570
  return { component: () => {
571
+ const location = useLocation();
572
+ const { prev, next } = sidebar?.navigation?.[location.pathname] || {
573
+ prev: null,
574
+ next: null
575
+ };
575
576
  return /* @__PURE__ */ jsxs("div", {
576
- className: "container mx-auto flex max-w-360 lg:gap-6",
577
+ className: "mx-auto flex container lg:gap-6",
577
578
  children: [
578
579
  /* @__PURE__ */ jsx(MobileSidebar, { sidebar }),
579
580
  /* @__PURE__ */ jsx("div", {
580
581
  className: "hidden lg:block",
581
582
  children: sidebar && /* @__PURE__ */ jsx(Sidebar, { sidebar })
582
583
  }),
583
- /* @__PURE__ */ jsx("div", {
584
+ /* @__PURE__ */ jsxs("div", {
584
585
  className: "flex-1 pb-20",
585
- children: /* @__PURE__ */ jsx(Outlet, {})
586
+ children: [/* @__PURE__ */ jsx(Outlet, {}), /* @__PURE__ */ jsx("div", {
587
+ className: "mt-8 px-6 lg:px-0",
588
+ children: /* @__PURE__ */ jsx(ContentNavigations, {
589
+ prev,
590
+ next
591
+ })
592
+ })]
586
593
  })
587
594
  ]
588
595
  });
@@ -592,7 +599,7 @@ function CollectionRoute(sidebar, id) {
592
599
  //#endregion
593
600
  //#region src/ui/routes/content/content.route.tsx
594
601
  function ContentRoute(inlineData) {
595
- const { frontmatter, prev, next, toc, default: Component } = inlineData;
602
+ const { frontmatter, toc, default: Component } = inlineData;
596
603
  return {
597
604
  head: () => {
598
605
  const metas = [];
@@ -610,17 +617,10 @@ function ContentRoute(inlineData) {
610
617
  className: "flex lg:gap-6 items-start max-w-[100vw]",
611
618
  children: [/* @__PURE__ */ jsxs("div", {
612
619
  className: "flex-1 min-w-0",
613
- children: [
614
- /* @__PURE__ */ jsx(MobileTableOfContent, { toc }),
615
- /* @__PURE__ */ jsx("article", {
616
- className: "prose max-w-none wrap-break-word py-15 px-6",
617
- children: /* @__PURE__ */ jsx(Component, {})
618
- }),
619
- /* @__PURE__ */ jsx(ContentNavigations, {
620
- prev,
621
- next
622
- })
623
- ]
620
+ children: [/* @__PURE__ */ jsx(MobileTableOfContent, { toc }), /* @__PURE__ */ jsx("article", {
621
+ className: "prose max-w-none wrap-break-word py-15 px-6",
622
+ children: /* @__PURE__ */ jsx(Component, {})
623
+ })]
624
624
  }), /* @__PURE__ */ jsx(WebTableOfContent, { toc })]
625
625
  });
626
626
  }
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/content-navigations.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/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 { ReactNode } from \"react\";\n\nexport interface CodeProps {\n code: string;\n language?: string;\n theme?: string;\n children?: ReactNode;\n}\n\nexport function Code({ code, children }: CodeProps) {\n return (\n <pre>\n <code>{code ?? children}</code>\n </pre>\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, TabsList, TabsTrigger, TabsContent } 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 language=\"bash\">{command}</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 { Link } from \"@tanstack/react-router\";\nimport clsx from \"clsx\";\nimport { ArrowLeft, ArrowRight } from \"lucide-react\";\n\nexport interface NavigationLink {\n label: string;\n slug: string;\n}\n\nfunction ContentNavigation({\n isNext,\n navigation,\n}: {\n isNext?: boolean;\n navigation: NavigationLink;\n}) {\n const label = isNext ? \"Next\" : \"Previous\";\n return (\n <Link\n to={\"/\" + navigation.slug}\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 className={clsx(\"flex items-center gap-4\", isNext && \"flex-row-reverse\")}>\n {isNext ? <ArrowRight className=\"text-default-400\"/> : <ArrowLeft className=\"text-default-400\" />}\n <div className={clsx(\"flex flex-col\", isNext && \"items-end\")}>\n <span className=\"text-xs tracking-widest font-mono\">{label.toLocaleUpperCase()}</span>\n <span className=\"text-2xl font-li text-default-700\">{navigation.label}</span>\n </div>\n </div>\n </Link>\n );\n}\n\nexport default function ContentNavigations({\n prev,\n next,\n}: {\n prev: NavigationLink | null;\n next: NavigationLink | null;\n}) {\n return (\n <div className=\"lg:flex flex-row items-center gap-2 mt-2 lg:mt-20 px-6\">\n {prev && <ContentNavigation navigation={prev} />}\n {next && <ContentNavigation navigation={next} isNext />}\n </div>\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 if (toc.length === 0) {\n return null;\n }\n\n return (\n <nav className=\"sticky top-header h-main pt-4 overflow-y-auto w-64 shrink-0 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 ContentNavigations, {\n NavigationLink,\n} from \"../routes/content/content-navigations\";\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 prev?: NavigationLink | null;\n next?: NavigationLink | null;\n}\n\nexport function PrestigePage({\n children,\n toc = [],\n prev = null,\n next = null,\n}: 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 max-w-none wrap-break-word py-15 px-6\">\n {children}\n </article>\n <ContentNavigations prev={prev} next={next} />\n </div>\n <WebTableOfContent toc={toc} />\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 } from \"@tanstack/react-router\";\nimport { SidebarType } from \"../../../vite/core/content/content.types\";\nimport MobileSidebar from \"./mobile-sidebar\";\nimport Sidebar from \"./sidebar\";\n\nexport function CollectionRoute(sidebar: SidebarType, id: string) {\n return {\n component: () => {\n return (\n <div className=\"container mx-auto flex max-w-360 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>\n </div>\n );\n },\n };\n}\n","import { FunctionComponent } from \"react\";\nimport { TocItem } from \"remark-flexible-toc\";\nimport { ContentFrontmatterType } from \"../../../vite/core/content/content.types\";\nimport ContentNavigations, { NavigationLink } from \"./content-navigations\";\nimport { MobileTableOfContent } from \"./table-of-contents/mobile-table-of-contents\";\nimport { WebTableOfContent } from \"./table-of-contents/web-table-of-contents\";\nimport config from \"virtual:prestige/config\";\nexport function ContentRoute(inlineData: any): any {\n const {\n frontmatter,\n prev,\n next,\n toc,\n default: Component,\n } = inlineData as {\n prev: NavigationLink | null;\n next: NavigationLink | 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 <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 max-w-none wrap-break-word py-15 px-6\">\n <Component />\n </article>\n <ContentNavigations prev={prev} next={next} />\n </div>\n <WebTableOfContent toc={toc} />\n </div>\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 { ReactNode } from \"react\";\n\nexport interface CodeProps {\n code: string;\n language?: string;\n theme?: string;\n children?: ReactNode;\n}\n\nexport function Code({ code, children }: CodeProps) {\n return (\n <pre>\n <code>{code ?? children}</code>\n </pre>\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, TabsList, TabsTrigger, TabsContent } 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 language=\"bash\">{command}</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({\n children,\n toc = [],\n}: 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 max-w-none wrap-break-word py-15 px-6\">\n {children}\n </article>\n </div>\n <WebTableOfContent toc={toc} />\n </div>\n );\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 flex-1\">\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 { MobileTableOfContent } from \"./table-of-contents/mobile-table-of-contents\";\nimport { WebTableOfContent } from \"./table-of-contents/web-table-of-contents\";\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 <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 max-w-none wrap-break-word py-15 px-6\">\n <Component />\n </article>\n </div>\n <WebTableOfContent toc={toc} />\n </div>\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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"}
package/dist/vite.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { t as CollectionItem } from "./content.types-BbDmygmP.js";
1
+ import { t as CollectionItem } from "./content.types-C35WR0tv.js";
2
2
  import { z } from "zod";
3
3
  import { RehypeShikiOptions } from "@shikijs/rehype";
4
4
  import { FlexibleTocOptions } from "remark-flexible-toc";
package/dist/vite.js CHANGED
@@ -305,7 +305,7 @@ function warmupCompiler(options) {
305
305
 
306
306
  //#endregion
307
307
  //#region src/vite/content/content-links.ts
308
- function resolveContentInternalLinks(sidebars) {
308
+ function resolveContentLinks(sidebars) {
309
309
  const links = /* @__PURE__ */ new Map();
310
310
  for (const [key, sidebar] of sidebars) {
311
311
  const sidebarLinks = [];
@@ -315,7 +315,7 @@ function resolveContentInternalLinks(sidebars) {
315
315
  return links;
316
316
  }
317
317
  function processItem$1(item, links = []) {
318
- if ("slug" in item) links.push(item);
318
+ if ("slug" in item || "link" in item) links.push(item);
319
319
  else if ("items" in item) for (const childItem of item.items) processItem$1(childItem, links);
320
320
  return links;
321
321
  }
@@ -328,17 +328,33 @@ var logger_default = logger;
328
328
  //#endregion
329
329
  //#region src/vite/content/content.store.ts
330
330
  const CONTENT_VIRTUAL_ID = "virtual:prestige/content/";
331
+ function getSiblingLink(link) {
332
+ if (!link) return;
333
+ return {
334
+ label: link.label,
335
+ link: "slug" in link ? link.slug : link.link
336
+ };
337
+ }
331
338
  function resolveSiblings(base, slug, linksMap) {
332
339
  const links = linksMap.get(base);
333
340
  if (!links?.length) return {
334
341
  prev: void 0,
335
342
  next: void 0
336
343
  };
337
- const linkIndex = links.filter((l) => "slug" in l).findIndex((link) => link.slug === slug);
344
+ const validLinks = links.filter((l) => {
345
+ if ("slug" in l) return true;
346
+ if ("link" in l) return !l.link.startsWith("http://") && !l.link.startsWith("https://");
347
+ return false;
348
+ });
349
+ const linkIndex = validLinks.findIndex((link) => {
350
+ return "slug" in link && link.slug === slug || "link" in link && link.link === slug;
351
+ });
338
352
  let prev;
339
353
  let next;
340
- if (linkIndex > 0) prev = links[linkIndex - 1];
341
- if (linkIndex < links.length - 1) next = links[linkIndex + 1];
354
+ if (linkIndex !== -1) {
355
+ if (linkIndex > 0) prev = getSiblingLink(validLinks[linkIndex - 1]);
356
+ if (linkIndex < validLinks.length - 1) next = getSiblingLink(validLinks[linkIndex + 1]);
357
+ }
342
358
  return {
343
359
  prev,
344
360
  next
@@ -385,6 +401,35 @@ function getSlugByPath(path, contentDir) {
385
401
  //#endregion
386
402
  //#region src/vite/content/content-sidebar.store.ts
387
403
  const SIDEBAR_VIRTUAL_ID = "virtual:prestige/sidebar/";
404
+ function flattenSidebar(items) {
405
+ return items.flatMap((item) => {
406
+ if ("slug" in item) return [{
407
+ label: item.label,
408
+ link: `/${item.slug}`
409
+ }];
410
+ if ("link" in item) {
411
+ if (item.link.startsWith("http://") || item.link.startsWith("https://")) return [];
412
+ return [{
413
+ label: item.label,
414
+ link: item.link
415
+ }];
416
+ }
417
+ if ("items" in item) return flattenSidebar(item.items);
418
+ return [];
419
+ });
420
+ }
421
+ function computeNavigation(items) {
422
+ const flattenedLinks = flattenSidebar(items);
423
+ const navigation = {};
424
+ for (let i = 0; i < flattenedLinks.length; i++) {
425
+ const link = flattenedLinks[i];
426
+ if (link) navigation[link.link] = {
427
+ prev: i > 0 ? flattenedLinks[i - 1] : null,
428
+ next: i < flattenedLinks.length - 1 ? flattenedLinks[i + 1] : null
429
+ };
430
+ }
431
+ return navigation;
432
+ }
388
433
  function resolveDefaultLink(items, defaultLink) {
389
434
  if (defaultLink) return defaultLink;
390
435
  for (const item of items) if ("slug" in item) return item.slug;
@@ -410,7 +455,8 @@ async function processCollection(collection, contentDir) {
410
455
  if (!defaultLink) throw new PrestigeError(`No default link found in collection, it means there are no links in the collection. Please define one in ${collection.id}`);
411
456
  return {
412
457
  items,
413
- defaultLink
458
+ defaultLink,
459
+ navigation: computeNavigation(items)
414
460
  };
415
461
  }
416
462
  /** @visibleForTesting */
@@ -582,9 +628,9 @@ function resolveCollectionNavigations(inlineCollections, linksMap) {
582
628
  }));
583
629
  if (collections.length === 0) throw new PrestigeError(`No collections found, add one in prestige plugin config`);
584
630
  for (const coll of collections) {
585
- const firstLink = linksMap.get(coll.id)?.[0];
586
- if (coll.defaultLink || !firstLink) continue;
587
- coll.defaultLink = firstLink.slug;
631
+ const firstInternalLink = linksMap.get(coll.id)?.find((l) => "slug" in l);
632
+ if (coll.defaultLink || !firstInternalLink) continue;
633
+ coll.defaultLink = firstInternalLink.slug;
588
634
  }
589
635
  for (const coll of collections) if (!coll.defaultLink) console.warn(`No default link found for collection ${coll.id}, it won't be displayed in the header navigation`);
590
636
  return genExportDefault(genArrayFromRaw(collections.filter((c) => c.defaultLink).map((c) => genObjectFromValues(c))));
@@ -598,7 +644,7 @@ function prestige(inlineConfig) {
598
644
  let contentDir;
599
645
  let isDocsMatcher;
600
646
  let collections = [];
601
- let internalLinksMap;
647
+ let linksMap;
602
648
  let collectionNavigations;
603
649
  let sidebarsMap;
604
650
  return {
@@ -614,12 +660,12 @@ function prestige(inlineConfig) {
614
660
  logger_default.info("Resolving sidebars...", { timestamp: true });
615
661
  sidebarsMap = await resolveSidebars(collections, contentDir);
616
662
  logger_default.info("Resolving content links...", { timestamp: true });
617
- internalLinksMap = resolveContentInternalLinks(sidebarsMap);
663
+ linksMap = resolveContentLinks(sidebarsMap);
618
664
  logger_default.info("Resolving collection navigations....", { timestamp: true });
619
- collectionNavigations = resolveCollectionNavigations(collections, internalLinksMap);
665
+ collectionNavigations = resolveCollectionNavigations(collections, linksMap);
620
666
  const routesDir = join(resolvedConfig.root, "src", "routes");
621
667
  logger_default.info("Compiling routes...", { timestamp: true });
622
- await compileRoutes(internalLinksMap, routesDir);
668
+ await compileRoutes(linksMap, routesDir);
623
669
  logger_default.info("Warming up shiki compiler...", { timestamp: true });
624
670
  warmupCompiler(config.markdown);
625
671
  },
@@ -649,7 +695,7 @@ function prestige(inlineConfig) {
649
695
  }
650
696
  if (id.includes(CONTENT_VIRTUAL_ID)) {
651
697
  logger_default.info(`Loading content virtual module: ${id}`, { timestamp: true });
652
- return await resolveContent(id, internalLinksMap, contentDir);
698
+ return await resolveContent(id, linksMap, contentDir);
653
699
  }
654
700
  if (id.includes(COLLECTION_VIRTUAL_ID)) {
655
701
  logger_default.info(`Loading collection virtual module: ${id}`, { timestamp: true });
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>","data","typeMap: Record<\"note\" | \"tip\" | \"caution\" | \"danger\", string>","titleChildren: any[]","toc: TocItem[]","shikiOptions: RehypeShikiOptions","sidebarLinks: InternalSidebarLinkType[]","processItem","prev: InternalSidebarLinkType | undefined","next: InternalSidebarLinkType | undefined","join","items: SidebarItemType[]","group: CollectionGroup","join","collections: CollectionNavigation[]","config: PrestigeConfig","contentDir: string","isDocsMatcher: Matcher","collections: Collections","internalLinksMap: Map<string, InternalSidebarLinkType[]>","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-compiler.ts","../src/vite/content/content-links.ts","../src/vite/utils/logger.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}\n","import { RehypeShikiOptions } from \"@shikijs/rehype\";\nimport { 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 shikiOptions: z\n .custom<RehypeShikiOptions>()\n .optional()\n .describe(\"Options for Shiki syntax highlighting\"),\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 { compile } from \"@mdx-js/mdx\";\nimport rehypeShiki, { RehypeShikiOptions } from \"@shikijs/rehype\";\nimport rehypeSlug from \"rehype-slug\";\nimport remarkFlexibleToc, { TocItem } from \"remark-flexible-toc\";\nimport remarkFrontmatter from \"remark-frontmatter\";\nimport remarkGfm from \"remark-gfm\";\nimport remarkDirective from \"remark-directive\";\nimport { PluggableList } from \"unified\";\nimport { Compatible, VFile } from \"vfile\";\nimport { matter } from \"vfile-matter\";\nimport { PrestigeConfig } from \"../config/config.types\";\n\nimport { visit } from \"unist-util-visit\";\nimport { h } from \"hastscript\";\nimport type { Node } from \"unist\";\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 shikiOptions: RehypeShikiOptions = {\n themes: {\n light: \"github-light\",\n dark: \"github-dark\",\n },\n ...options?.shikiOptions,\n };\n\n const rehypePlugins: PluggableList = [\n ...(options?.rehypePlugins ?? []),\n [rehypeShiki, shikiOptions],\n rehypeSlug,\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 { InternalSidebarLinkType, SidebarItemType, SidebarType } from \"../core/content/content.types\";\n\nexport function resolveContentInternalLinks(sidebars: Map<string, SidebarType>) {\n const links = new Map<string, InternalSidebarLinkType[]>();\n for (const [key, sidebar] of sidebars) {\n const sidebarLinks: InternalSidebarLinkType[] = [];\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: InternalSidebarLinkType[] = []) {\n if (\"slug\" 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 { 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 InternalSidebarLinkType,\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\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 const linkIndex = links\n .filter((l) => \"slug\" in l)\n .findIndex((link) => link.slug === slug);\n\n let prev: InternalSidebarLinkType | undefined;\n let next: InternalSidebarLinkType | undefined;\n if (linkIndex > 0) {\n prev = links[linkIndex - 1] as InternalSidebarLinkType;\n }\n if (linkIndex < links.length - 1) {\n next = links[linkIndex + 1] as InternalSidebarLinkType;\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 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 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 };\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 InternalSidebarLinkType,\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, InternalSidebarLinkType[]>,\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 firstLink = links?.[0];\n if (coll.defaultLink || !firstLink) {\n continue;\n }\n coll.defaultLink = firstLink.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 { warmupCompiler } from \"./content/content-compiler\";\nimport { resolveContentInternalLinks } 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 InternalSidebarLinkType,\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 internalLinksMap: Map<string, InternalSidebarLinkType[]>;\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 internalLinksMap = resolveContentInternalLinks(sidebarsMap);\n\n logger.info(\"Resolving collection navigations....\", { timestamp: true });\n collectionNavigations = resolveCollectionNavigations(\n collections,\n internalLinksMap,\n );\n\n const routesDir = join(resolvedConfig.root, \"src\", \"routes\");\n\n logger.info(\"Compiling routes...\", { timestamp: true });\n await compileRoutes(internalLinksMap, routesDir);\n\n logger.info(\"Warming up shiki compiler...\", { timestamp: true });\n // Warm up the MDX compiler to pre-initialize the syntax highlighter (e.g. Shiki)\n // We do this non-blocking so it doesn't slow down the Vite startup.\n warmupCompiler(config.markdown);\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, internalLinksMap, 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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"}
1
+ {"version":3,"file":"vite.js","names":["CollectionGroupSchema: z.ZodType<CollectionGroup, CollectionGroup>","CollectionItemSchema: z.ZodType<CollectionItem, CollectionItem>","data","typeMap: Record<\"note\" | \"tip\" | \"caution\" | \"danger\", string>","titleChildren: any[]","toc: TocItem[]","shikiOptions: RehypeShikiOptions","sidebarLinks: SidebarLinkType[]","processItem","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-compiler.ts","../src/vite/content/content-links.ts","../src/vite/utils/logger.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 { RehypeShikiOptions } from \"@shikijs/rehype\";\nimport { 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 shikiOptions: z\n .custom<RehypeShikiOptions>()\n .optional()\n .describe(\"Options for Shiki syntax highlighting\"),\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 { compile } from \"@mdx-js/mdx\";\nimport rehypeShiki, { RehypeShikiOptions } from \"@shikijs/rehype\";\nimport rehypeSlug from \"rehype-slug\";\nimport remarkFlexibleToc, { TocItem } from \"remark-flexible-toc\";\nimport remarkFrontmatter from \"remark-frontmatter\";\nimport remarkGfm from \"remark-gfm\";\nimport remarkDirective from \"remark-directive\";\nimport { PluggableList } from \"unified\";\nimport { Compatible, VFile } from \"vfile\";\nimport { matter } from \"vfile-matter\";\nimport { PrestigeConfig } from \"../config/config.types\";\n\nimport { visit } from \"unist-util-visit\";\nimport { h } from \"hastscript\";\nimport type { Node } from \"unist\";\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 shikiOptions: RehypeShikiOptions = {\n themes: {\n light: \"github-light\",\n dark: \"github-dark\",\n },\n ...options?.shikiOptions,\n };\n\n const rehypePlugins: PluggableList = [\n ...(options?.rehypePlugins ?? []),\n [rehypeShiki, shikiOptions],\n rehypeSlug,\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 { 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 { 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 { warmupCompiler } from \"./content/content-compiler\";\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 logger.info(\"Warming up shiki compiler...\", { timestamp: true });\n // Warm up the MDX compiler to pre-initialize the syntax highlighter (e.g. Shiki)\n // We do this non-blocking so it doesn't slow down the Vite startup.\n warmupCompiler(config.markdown);\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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lonik/prestige",
3
- "version": "0.2.0",
3
+ "version": "0.2.2",
4
4
  "description": "Static Site Generator for Tanstack Start",
5
5
  "homepage": "https://github.com/lukonik/prestige#readme",
6
6
  "bugs": {
@@ -51,4 +51,5 @@
51
51
  --width-sidebar: 300px;
52
52
  --color-white: var(--color-white);
53
53
  --color-background: var(--color-background);
54
+ --width-web-table-of-content: 300px;
54
55
  }