ardo 2.5.0 → 2.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (37) hide show
  1. package/README.md +2 -2
  2. package/dist/{Features-rHF_bj67.d.ts → FileTree-BGMcsIGZ.d.ts} +45 -3
  3. package/dist/Search-MXGJE6PQ.js +9 -0
  4. package/dist/{chunk-NJWWPDO2.js → chunk-6MXVILOZ.js} +2 -2
  5. package/dist/{chunk-5K5L7ZYS.js → chunk-ASEDNN4I.js} +42 -3
  6. package/dist/chunk-ASEDNN4I.js.map +1 -0
  7. package/dist/{chunk-GAYGMYIS.js → chunk-BHHI2BO4.js} +2 -2
  8. package/dist/{chunk-BH7JD5XJ.js → chunk-NBRHGTR2.js} +2 -1
  9. package/dist/chunk-NBRHGTR2.js.map +1 -0
  10. package/dist/chunk-QELSOHIY.js +46 -0
  11. package/dist/chunk-QELSOHIY.js.map +1 -0
  12. package/dist/{chunk-X7MG5VTZ.js → chunk-ZPYFCNRO.js} +69 -9
  13. package/dist/chunk-ZPYFCNRO.js.map +1 -0
  14. package/dist/config/index.d.ts +5 -5
  15. package/dist/config/index.js +1 -1
  16. package/dist/index.d.ts +3 -3
  17. package/dist/index.js +14 -10
  18. package/dist/mdx/provider.js +2 -2
  19. package/dist/runtime/index.d.ts +10 -10
  20. package/dist/runtime/index.js +7 -7
  21. package/dist/{types-DSD5zwMd.d.ts → types-DArVCX06.d.ts} +5 -3
  22. package/dist/ui/icons/folder.svg +1 -0
  23. package/dist/ui/index.d.ts +2 -2
  24. package/dist/ui/index.js +8 -4
  25. package/dist/ui/styles.css +176 -0
  26. package/dist/vite/index.d.ts +2 -2
  27. package/dist/vite/index.js +2 -2
  28. package/package.json +2 -2
  29. package/dist/Search-RJRSEY42.js +0 -9
  30. package/dist/chunk-3O2PF4HA.js +0 -46
  31. package/dist/chunk-3O2PF4HA.js.map +0 -1
  32. package/dist/chunk-5K5L7ZYS.js.map +0 -1
  33. package/dist/chunk-BH7JD5XJ.js.map +0 -1
  34. package/dist/chunk-X7MG5VTZ.js.map +0 -1
  35. /package/dist/{Search-RJRSEY42.js.map → Search-MXGJE6PQ.js.map} +0 -0
  36. /package/dist/{chunk-NJWWPDO2.js.map → chunk-6MXVILOZ.js.map} +0 -0
  37. /package/dist/{chunk-GAYGMYIS.js.map → chunk-BHHI2BO4.js.map} +0 -0
package/README.md CHANGED
@@ -96,9 +96,9 @@ function App() {
96
96
 
97
97
  ## Documentation
98
98
 
99
- Full documentation available at [sebastian-software.github.io/ardo](https://sebastian-software.github.io/ardo/)
99
+ Full documentation available at [ardo-docs.dev](https://ardo-docs.dev)
100
100
 
101
- LLM-optimized documentation: [llms-full.txt](https://sebastian-software.github.io/ardo/llms-full.txt)
101
+ LLM-optimized documentation: [llms-full.txt](https://ardo-docs.dev/llms-full.txt)
102
102
 
103
103
  ## License
104
104
 
@@ -1,7 +1,7 @@
1
1
  import * as react_jsx_runtime from 'react/jsx-runtime';
2
2
  import { ReactNode, ComponentProps, CSSProperties } from 'react';
3
3
  import { NavLink, Link } from 'react-router';
4
- import { S as SidebarItem, c as ProjectMeta, g as SponsorConfig } from './types-DSD5zwMd.js';
4
+ import { S as SidebarItem, b as ProjectMeta, f as SponsorConfig } from './types-DArVCX06.js';
5
5
 
6
6
  interface LayoutProps {
7
7
  /** Header content */
@@ -191,6 +191,8 @@ interface FooterProps {
191
191
  sponsor?: SponsorConfig;
192
192
  /** Build timestamp (ISO string) — renders formatted date */
193
193
  buildTime?: string;
194
+ /** Git commit hash — rendered next to the build date */
195
+ buildHash?: string;
194
196
  /** Show "Built with Ardo" link (default: true) */
195
197
  ardoLink?: boolean;
196
198
  }
@@ -222,7 +224,7 @@ interface FooterProps {
222
224
  * </Footer>
223
225
  * ```
224
226
  */
225
- declare function Footer({ message, copyright, children, className, project, sponsor, buildTime, ardoLink, }: FooterProps): react_jsx_runtime.JSX.Element | null;
227
+ declare function Footer({ message, copyright, children, className, project, sponsor, buildTime, buildHash, ardoLink, }: FooterProps): react_jsx_runtime.JSX.Element | null;
226
228
  interface FooterMessageProps {
227
229
  children: ReactNode;
228
230
  className?: string;
@@ -559,4 +561,44 @@ declare function FeatureCard({ title, icon, details, link, linkText, className,
559
561
  */
560
562
  declare function Features({ items, title, subtitle, className }: FeaturesProps): react_jsx_runtime.JSX.Element | null;
561
563
 
562
- export { type LayoutProps as $, type TabListProps as A, TabPanel as B, CodeBlock as C, Danger as D, type TabPanelProps as E, FeatureCard as F, TabPanels as G, Header as H, Info as I, type TabPanelsProps as J, type TabProps as K, Layout as L, Tabs as M, Note as N, type TabsProps as O, ThemeToggle as P, Tip as Q, type TipProps as R, Search as S, TOC as T, type WarningProps as U, DocContent as V, Warning as W, type FooterCopyrightProps as X, type FooterMessageProps as Y, type FooterProps as Z, type HeaderProps as _, type CodeBlockProps as a, SidebarGroup as a0, type SidebarGroupProps as a1, SidebarLink as a2, type SidebarLinkProps as a3, type SidebarProps as a4, SocialLink as a5, type SocialLinkProps as a6, CodeGroup as b, type CodeGroupProps as c, Container as d, type ContainerProps as e, type ContainerType as f, Content as g, CopyButton as h, type DangerProps as i, DocLayout as j, DocPage as k, type FeatureCardProps as l, type FeatureItem as m, Features as n, type FeaturesProps as o, Footer as p, Hero as q, type HeroAction as r, type HeroImage as s, type HeroProps as t, HomePage as u, type InfoProps as v, type NoteProps as w, Sidebar as x, Tab as y, TabList as z };
564
+ interface StepsProps {
565
+ /** Content to display — expects an ordered list (`<ol>`) from MDX */
566
+ children: ReactNode;
567
+ }
568
+ /**
569
+ * A wrapper for ordered lists that renders numbered step indicators.
570
+ *
571
+ * @example
572
+ * ```mdx
573
+ * <Steps>
574
+ * 1. Install the package
575
+ * 2. Configure your site
576
+ * 3. Start writing
577
+ * </Steps>
578
+ * ```
579
+ */
580
+ declare function Steps({ children }: StepsProps): react_jsx_runtime.JSX.Element;
581
+
582
+ interface FileTreeProps {
583
+ /** Content to display — expects an unordered list (`<ul>`) from MDX */
584
+ children: ReactNode;
585
+ }
586
+ /**
587
+ * A wrapper for unordered lists that renders a file/folder tree with icons.
588
+ *
589
+ * @example
590
+ * ```mdx
591
+ * <FileTree>
592
+ * - src/
593
+ * - components/
594
+ * - Header.tsx
595
+ * - Footer.tsx
596
+ * - index.ts
597
+ * - package.json
598
+ * - README.md
599
+ * </FileTree>
600
+ * ```
601
+ */
602
+ declare function FileTree({ children }: FileTreeProps): react_jsx_runtime.JSX.Element;
603
+
604
+ export { type FooterCopyrightProps as $, Steps as A, type StepsProps as B, CodeBlock as C, Danger as D, Tab as E, FeatureCard as F, TabList as G, Header as H, Info as I, type TabListProps as J, TabPanel as K, Layout as L, type TabPanelProps as M, Note as N, TabPanels as O, type TabPanelsProps as P, type TabProps as Q, Tabs as R, Search as S, TOC as T, type TabsProps as U, ThemeToggle as V, Tip as W, type TipProps as X, Warning as Y, type WarningProps as Z, DocContent as _, type CodeBlockProps as a, type FooterMessageProps as a0, type FooterProps as a1, type HeaderProps as a2, type LayoutProps as a3, SidebarGroup as a4, type SidebarGroupProps as a5, SidebarLink as a6, type SidebarLinkProps as a7, type SidebarProps as a8, SocialLink as a9, type SocialLinkProps as aa, CodeGroup as b, type CodeGroupProps as c, Container as d, type ContainerProps as e, type ContainerType as f, Content as g, CopyButton as h, type DangerProps as i, DocLayout as j, DocPage as k, type FeatureCardProps as l, type FeatureItem as m, Features as n, type FeaturesProps as o, FileTree as p, type FileTreeProps as q, Footer as r, Hero as s, type HeroAction as t, type HeroImage as u, type HeroProps as v, HomePage as w, type InfoProps as x, type NoteProps as y, Sidebar as z };
@@ -0,0 +1,9 @@
1
+ import {
2
+ Search
3
+ } from "./chunk-BHHI2BO4.js";
4
+ import "./chunk-MJQGGJQZ.js";
5
+ import "./chunk-QELSOHIY.js";
6
+ export {
7
+ Search
8
+ };
9
+ //# sourceMappingURL=Search-MXGJE6PQ.js.map
@@ -14,7 +14,7 @@ import {
14
14
  usePageData,
15
15
  useSidebar,
16
16
  useThemeConfig
17
- } from "./chunk-3O2PF4HA.js";
17
+ } from "./chunk-QELSOHIY.js";
18
18
 
19
19
  // src/ui/Content.tsx
20
20
  import { Link, useLocation } from "react-router";
@@ -289,4 +289,4 @@ export {
289
289
  TabPanel,
290
290
  TabPanels
291
291
  };
292
- //# sourceMappingURL=chunk-NJWWPDO2.js.map
292
+ //# sourceMappingURL=chunk-6MXVILOZ.js.map
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  defaultMarkdownConfig,
3
3
  resolveConfig
4
- } from "./chunk-BH7JD5XJ.js";
4
+ } from "./chunk-NBRHGTR2.js";
5
5
  import {
6
6
  generateApiDocs
7
7
  } from "./chunk-7L64KVOU.js";
@@ -573,6 +573,17 @@ function detectGitHubRepoName(cwd) {
573
573
  return void 0;
574
574
  }
575
575
  }
576
+ function detectGitHash(cwd) {
577
+ try {
578
+ return execSync("git rev-parse --short HEAD", {
579
+ cwd,
580
+ encoding: "utf-8",
581
+ stdio: ["pipe", "pipe", "pipe"]
582
+ }).trim();
583
+ } catch {
584
+ return void 0;
585
+ }
586
+ }
576
587
  function readProjectMeta(root) {
577
588
  const pkgPath = path2.join(root, "package.json");
578
589
  try {
@@ -703,7 +714,8 @@ function ardoPlugin(options = {}) {
703
714
  lang: resolvedConfig.lang,
704
715
  themeConfig: resolvedConfig.themeConfig,
705
716
  project: resolvedConfig.project,
706
- buildTime: (/* @__PURE__ */ new Date()).toISOString()
717
+ buildTime: (/* @__PURE__ */ new Date()).toISOString(),
718
+ buildHash: detectGitHash(resolvedConfig.root)
707
719
  };
708
720
  return `export default ${JSON.stringify(clientConfig)}`;
709
721
  }
@@ -715,6 +727,33 @@ function ardoPlugin(options = {}) {
715
727
  const searchIndex = await generateSearchIndex(routesDir);
716
728
  return `export default ${JSON.stringify(searchIndex)}`;
717
729
  }
730
+ },
731
+ transform(code, id) {
732
+ if (!/\.(mdx|md)$/.test(id)) return;
733
+ if (!id.startsWith(routesDir)) return;
734
+ if (/export\s+(const|function)\s+meta\b/.test(code)) return;
735
+ const titleMatch = code.match(
736
+ /export\s+const\s+frontmatter\s*=\s*\{[^}]*title\s*:\s*"([^"]*)"/
737
+ );
738
+ const descMatch = code.match(
739
+ /export\s+const\s+frontmatter\s*=\s*\{[^}]*description\s*:\s*"([^"]*)"/
740
+ );
741
+ const pageTitle = titleMatch?.[1];
742
+ if (!pageTitle) return;
743
+ const siteTitle = resolvedConfig.title;
744
+ const separator = resolvedConfig.titleSeparator;
745
+ const fullTitle = `${pageTitle}${separator}${siteTitle}`;
746
+ const description = descMatch?.[1];
747
+ const metaEntries = [`{ title: ${JSON.stringify(fullTitle)} }`];
748
+ if (description) {
749
+ metaEntries.push(`{ name: "description", content: ${JSON.stringify(description)} }`);
750
+ }
751
+ return {
752
+ code: `${code}
753
+ export const meta = () => [${metaEntries.join(", ")}];
754
+ `,
755
+ map: null
756
+ };
718
757
  }
719
758
  };
720
759
  const plugins = [mainPlugin];
@@ -1258,4 +1297,4 @@ export {
1258
1297
  getPageDataForRoute,
1259
1298
  generateSidebar2 as generateSidebar
1260
1299
  };
1261
- //# sourceMappingURL=chunk-5K5L7ZYS.js.map
1300
+ //# sourceMappingURL=chunk-ASEDNN4I.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/vite/plugin.ts","../src/markdown/shiki.ts","../src/markdown/containers.ts","../src/vite/routes-plugin.ts","../src/runtime/loader.ts","../src/markdown/pipeline.ts","../src/markdown/toc.ts","../src/markdown/links.ts","../src/runtime/sidebar.ts"],"sourcesContent":["import type { Plugin, UserConfig } from \"vite\"\nimport type { ArdoConfig, ProjectMeta, ResolvedConfig } from \"../config/types\"\nimport type { TypeDocConfig } from \"../typedoc/types\"\nimport { resolveConfig, defaultMarkdownConfig } from \"../config/index\"\nimport { generateApiDocs } from \"../typedoc/generator\"\nimport { reactRouter } from \"@react-router/dev/vite\"\nimport mdx from \"@mdx-js/rollup\"\nimport remarkFrontmatter from \"remark-frontmatter\"\nimport remarkMdxFrontmatter from \"remark-mdx-frontmatter\"\nimport remarkGfm from \"remark-gfm\"\nimport remarkDirective from \"remark-directive\"\nimport rehypeShiki from \"@shikijs/rehype\"\nimport { ardoLineTransformer, remarkCodeMeta } from \"../markdown/shiki\"\nimport { remarkContainersMdx } from \"../markdown/containers\"\nimport fs from \"fs/promises\"\nimport fsSync from \"fs\"\nimport path from \"path\"\nimport { execSync } from \"child_process\"\nimport matter from \"gray-matter\"\nimport { ardoRoutesPlugin, type ArdoRoutesPluginOptions } from \"./routes-plugin\"\n\n/**\n * Finds the package root by looking for package.json in parent directories.\n * Returns the path relative to cwd, or undefined if not found.\n */\nfunction findPackageRoot(cwd: string): string | undefined {\n let dir = path.resolve(cwd)\n const root = path.parse(dir).root\n\n while (dir !== root) {\n const parentDir = path.dirname(dir)\n const packageJsonPath = path.join(parentDir, \"package.json\")\n\n if (fsSync.existsSync(packageJsonPath)) {\n // Return relative path from cwd to parent\n return path.relative(cwd, parentDir) || \".\"\n }\n\n dir = parentDir\n }\n\n return undefined\n}\n\n/**\n * Detects the GitHub repository name from git remote URL.\n * Returns the repo name (e.g., 'ardo' from 'github.com/sebastian-software/ardo')\n * or undefined if not a GitHub repo.\n */\nfunction detectGitHubRepoName(cwd: string): string | undefined {\n try {\n const remoteUrl = execSync(\"git remote get-url origin\", {\n cwd,\n encoding: \"utf-8\",\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n }).trim()\n\n // Parse GitHub URL (supports both HTTPS and SSH)\n // https://github.com/user/repo.git\n // git@github.com:user/repo.git\n const match = remoteUrl.match(/github\\.com[/:][\\w-]+\\/([\\w.-]+?)(?:\\.git)?$/)\n return match?.[1]\n } catch {\n return undefined\n }\n}\n\n/**\n * Detects the current short git commit hash.\n */\nfunction detectGitHash(cwd: string): string | undefined {\n try {\n return execSync(\"git rev-parse --short HEAD\", {\n cwd,\n encoding: \"utf-8\",\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n }).trim()\n } catch {\n return undefined\n }\n}\n\n/**\n * Reads project metadata from the nearest package.json.\n */\nfunction readProjectMeta(root: string): ProjectMeta {\n const pkgPath = path.join(root, \"package.json\")\n try {\n const raw = fsSync.readFileSync(pkgPath, \"utf-8\")\n const pkg = JSON.parse(raw)\n\n let repository: string | undefined\n if (typeof pkg.repository === \"string\") {\n repository = pkg.repository\n } else if (pkg.repository?.url) {\n // Normalize git+https://... or git://... URLs\n repository = pkg.repository.url\n .replace(/^git\\+/, \"\")\n .replace(/^git:\\/\\//, \"https://\")\n .replace(/\\.git$/, \"\")\n }\n\n let author: string | undefined\n if (typeof pkg.author === \"string\") {\n author = pkg.author\n } else if (pkg.author?.name) {\n author = pkg.author.name\n }\n\n return {\n name: pkg.name,\n homepage: pkg.homepage,\n repository,\n version: pkg.version,\n author,\n license: pkg.license,\n }\n } catch {\n return {}\n }\n}\n\n/**\n * Recursively copies files from src to dest, overwriting existing files.\n */\nfunction copyRecursive(src: string, dest: string) {\n const stat = fsSync.statSync(src)\n\n if (stat.isDirectory()) {\n if (!fsSync.existsSync(dest)) {\n fsSync.mkdirSync(dest, { recursive: true })\n }\n for (const item of fsSync.readdirSync(src)) {\n copyRecursive(path.join(src, item), path.join(dest, item))\n }\n } else {\n fsSync.copyFileSync(src, dest)\n }\n}\n\n/**\n * Detects the GitHub Pages basename from the git remote URL.\n * Returns `\"/repo-name/\"` if a GitHub repo is detected, otherwise `undefined`.\n *\n * Use this in `react-router.config.ts` to synchronize client-side routing\n * with the Vite `base` path that Ardo auto-detects:\n *\n * ```ts\n * import { detectGitHubBasename } from \"ardo/vite\"\n *\n * export default {\n * ssr: false,\n * prerender: true,\n * basename: detectGitHubBasename(),\n * } satisfies Config\n * ```\n */\nexport function detectGitHubBasename(cwd?: string): string {\n if (process.env.NODE_ENV !== \"production\") {\n return \"/\"\n }\n const repoName = detectGitHubRepoName(cwd || process.cwd())\n return repoName ? `/${repoName}/` : \"/\"\n}\n\nconst VIRTUAL_MODULE_ID = \"virtual:ardo/config\"\nconst RESOLVED_VIRTUAL_MODULE_ID = \"\\0\" + VIRTUAL_MODULE_ID\n\nconst VIRTUAL_SIDEBAR_ID = \"virtual:ardo/sidebar\"\nconst RESOLVED_VIRTUAL_SIDEBAR_ID = \"\\0\" + VIRTUAL_SIDEBAR_ID\n\nconst VIRTUAL_SEARCH_ID = \"virtual:ardo/search-index\"\nconst RESOLVED_VIRTUAL_SEARCH_ID = \"\\0\" + VIRTUAL_SEARCH_ID\n\n// Module-level flags to prevent duplicate operations across plugin instances\n// This is necessary because React Router creates multiple Vite instances\nlet typedocGenerated = false\nlet flattenExecuted = false\n\nexport interface ArdoPluginOptions extends Partial<ArdoConfig> {\n /** Options for the routes generator plugin */\n routes?: ArdoRoutesPluginOptions | false\n /**\n * Auto-detect GitHub repository and set base path for GitHub Pages.\n * When true, automatically sets `base: '/repo-name/'` if deploying to GitHub Pages.\n * @default true\n */\n githubPages?: boolean\n /**\n * Directory where routes are located.\n * @default \"./app/routes\"\n */\n routesDir?: string\n}\n\nexport function ardoPlugin(options: ArdoPluginOptions = {}): Plugin[] {\n let resolvedConfig: ResolvedConfig\n let routesDir: string\n\n // Extract ardo-specific options from the rest (which is ArdoConfig)\n const {\n routes,\n typedoc,\n githubPages = true,\n routesDir: routesDirOption,\n ...pressConfig\n } = options\n\n const mainPlugin: Plugin = {\n name: \"ardo\",\n enforce: \"pre\",\n\n config(userConfig, env): UserConfig {\n const root = userConfig.root || process.cwd()\n routesDir = routesDirOption || path.join(root, \"app\", \"routes\")\n\n const result: UserConfig = {\n define: {\n __BUILD_TIME__: JSON.stringify(new Date().toISOString()),\n },\n optimizeDeps: {\n exclude: [\"ardo/ui/styles.css\"],\n },\n ssr: {\n noExternal: [\"ardo\"],\n },\n }\n\n // Auto-detect GitHub Pages base path for production builds\n if (githubPages && env.command === \"build\" && !userConfig.base) {\n const repoName = detectGitHubRepoName(root)\n if (repoName) {\n result.base = `/${repoName}/`\n console.log(`[ardo] GitHub Pages detected, using base: ${result.base}`)\n }\n }\n\n return result\n },\n\n async configResolved(config) {\n const root = config.root\n routesDir = routesDirOption || path.join(root, \"app\", \"routes\")\n\n // Auto-detect project metadata from package.json\n const detectedProject = readProjectMeta(root)\n const project: ProjectMeta = { ...detectedProject, ...pressConfig.project }\n\n const defaultConfig: ArdoConfig = {\n title: pressConfig.title ?? \"Ardo\",\n description: pressConfig.description ?? \"Documentation powered by Ardo\",\n }\n\n // For React Router, contentDir is the routes directory\n const configWithRoutes = {\n ...defaultConfig,\n ...pressConfig,\n project,\n srcDir: routesDir,\n }\n\n resolvedConfig = resolveConfig(configWithRoutes, root)\n },\n\n resolveId(id) {\n if (id === VIRTUAL_MODULE_ID) {\n return RESOLVED_VIRTUAL_MODULE_ID\n }\n if (id === VIRTUAL_SIDEBAR_ID) {\n return RESOLVED_VIRTUAL_SIDEBAR_ID\n }\n if (id === VIRTUAL_SEARCH_ID) {\n return RESOLVED_VIRTUAL_SEARCH_ID\n }\n },\n\n async load(id) {\n if (id === RESOLVED_VIRTUAL_MODULE_ID) {\n const clientConfig = {\n title: resolvedConfig.title,\n description: resolvedConfig.description,\n base: resolvedConfig.base,\n lang: resolvedConfig.lang,\n themeConfig: resolvedConfig.themeConfig,\n project: resolvedConfig.project,\n buildTime: new Date().toISOString(),\n buildHash: detectGitHash(resolvedConfig.root),\n }\n return `export default ${JSON.stringify(clientConfig)}`\n }\n\n if (id === RESOLVED_VIRTUAL_SIDEBAR_ID) {\n const sidebar = await generateSidebar(resolvedConfig, routesDir)\n return `export default ${JSON.stringify(sidebar)}`\n }\n\n if (id === RESOLVED_VIRTUAL_SEARCH_ID) {\n const searchIndex = await generateSearchIndex(routesDir)\n return `export default ${JSON.stringify(searchIndex)}`\n }\n },\n\n transform(code, id) {\n // Only process .mdx/.md files inside the routes directory\n if (!/\\.(mdx|md)$/.test(id)) return\n if (!id.startsWith(routesDir)) return\n\n // Skip if the file already exports a meta function\n if (/export\\s+(const|function)\\s+meta\\b/.test(code)) return\n\n // Extract frontmatter values from the compiled MDX export\n const titleMatch = code.match(\n /export\\s+const\\s+frontmatter\\s*=\\s*\\{[^}]*title\\s*:\\s*\"([^\"]*)\"/\n )\n const descMatch = code.match(\n /export\\s+const\\s+frontmatter\\s*=\\s*\\{[^}]*description\\s*:\\s*\"([^\"]*)\"/\n )\n\n const pageTitle = titleMatch?.[1]\n if (!pageTitle) return\n\n const siteTitle = resolvedConfig.title\n const separator = resolvedConfig.titleSeparator\n const fullTitle = `${pageTitle}${separator}${siteTitle}`\n const description = descMatch?.[1]\n\n const metaEntries = [`{ title: ${JSON.stringify(fullTitle)} }`]\n if (description) {\n metaEntries.push(`{ name: \"description\", content: ${JSON.stringify(description)} }`)\n }\n\n return {\n code: `${code}\\nexport const meta = () => [${metaEntries.join(\", \")}];\\n`,\n map: null,\n }\n },\n }\n\n const plugins: Plugin[] = [mainPlugin]\n\n // Add routes plugin unless explicitly disabled\n if (routes !== false) {\n plugins.push(\n ardoRoutesPlugin({\n routesDir: routesDirOption,\n ...routes,\n })\n )\n }\n\n // Add TypeDoc plugin if enabled\n if (typedoc) {\n // Find package root to use as default entry point and tsconfig base\n const packageRoot = findPackageRoot(process.cwd())\n const defaultEntryPoint = packageRoot ? `${packageRoot}/src/index.ts` : \"./src/index.ts\"\n const defaultTsconfig = packageRoot ? `${packageRoot}/tsconfig.json` : \"./tsconfig.json\"\n\n const defaultTypedocConfig: TypeDocConfig = {\n enabled: true,\n entryPoints: [defaultEntryPoint],\n tsconfig: defaultTsconfig,\n out: \"api-reference\",\n excludePrivate: true,\n excludeInternal: true,\n }\n\n const typedocConfig: TypeDocConfig =\n typedoc === true ? defaultTypedocConfig : { ...defaultTypedocConfig, ...typedoc }\n\n const typedocPlugin: Plugin = {\n name: \"ardo:typedoc\",\n\n async buildStart() {\n // Use module-level flag to prevent duplicate generation across plugin instances\n if (typedocGenerated || !typedocConfig.enabled) {\n return\n }\n\n console.log(\"[ardo] Generating API documentation with TypeDoc...\")\n const startTime = Date.now()\n try {\n const outputDir = routesDirOption || \"./app/routes\"\n const docs = await generateApiDocs(typedocConfig, outputDir)\n const duration = Date.now() - startTime\n console.log(`[ardo] Generated ${docs.length} API documentation pages in ${duration}ms`)\n } catch (error) {\n console.warn(\"[ardo] TypeDoc generation failed. API documentation will not be available.\")\n console.warn(\"[ardo] Check your typedoc.entryPoints configuration.\")\n if (error instanceof Error) {\n console.warn(`[ardo] Error: ${error.message}`)\n }\n }\n typedocGenerated = true\n },\n }\n\n plugins.unshift(typedocPlugin)\n }\n\n // Add MDX plugin with Ardo's markdown pipeline\n // Apply default theme if user didn't configure one\n const themeConfig = pressConfig.markdown?.theme ?? defaultMarkdownConfig.theme\n const hasThemeObject = themeConfig && typeof themeConfig === \"object\" && \"light\" in themeConfig\n const lineNumbers = pressConfig.markdown?.lineNumbers || false\n\n // Build shiki options with Ardo's custom line transformer\n // Theme defaults are guaranteed by resolveConfig (defaultMarkdownConfig)\n const shikiOptions = hasThemeObject\n ? {\n themes: {\n light: themeConfig.light,\n dark: themeConfig.dark,\n },\n defaultColor: false as const,\n transformers: [ardoLineTransformer({ globalLineNumbers: lineNumbers })],\n }\n : {\n theme: themeConfig as string,\n transformers: [ardoLineTransformer({ globalLineNumbers: lineNumbers })],\n }\n\n const mdxPlugin = mdx({\n include: /\\.(md|mdx)$/,\n remarkPlugins: [\n remarkFrontmatter,\n [remarkMdxFrontmatter, { name: \"frontmatter\" }],\n remarkGfm,\n remarkDirective,\n remarkContainersMdx,\n remarkCodeMeta,\n ],\n rehypePlugins: [[rehypeShiki, shikiOptions]],\n providerImportSource: \"ardo/mdx-provider\",\n })\n plugins.push(mdxPlugin as Plugin)\n\n // Add React Router Framework plugin (includes React plugin internally)\n const reactRouterPlugin = reactRouter()\n const reactRouterPlugins = (\n Array.isArray(reactRouterPlugin) ? reactRouterPlugin : [reactRouterPlugin]\n ).filter((p): p is Plugin => p != null)\n plugins.push(...reactRouterPlugins)\n\n // Add flatten plugin for GitHub Pages (must run after React Router build)\n if (githubPages) {\n let detectedBase: string | undefined\n\n const flattenPlugin: Plugin = {\n name: \"ardo:flatten-github-pages\",\n enforce: \"post\",\n\n configResolved(config) {\n if (config.base && config.base !== \"/\") {\n detectedBase = config.base\n }\n },\n\n closeBundle() {\n if (flattenExecuted || !detectedBase) {\n return\n }\n\n // Strip leading/trailing slashes to get the directory name\n const baseName = detectedBase.replace(/^\\/|\\/$/g, \"\")\n if (!baseName) return\n\n const buildDir = path.join(process.cwd(), \"build\", \"client\")\n const nestedDir = path.join(buildDir, baseName)\n\n if (!fsSync.existsSync(nestedDir)) {\n return\n }\n\n console.log(`[ardo] Flattening build/client/${baseName}/ to build/client/ for GitHub Pages`)\n copyRecursive(nestedDir, buildDir)\n fsSync.rmSync(nestedDir, { recursive: true, force: true })\n console.log(\"[ardo] Build output flattened successfully.\")\n\n flattenExecuted = true\n },\n }\n\n plugins.push(flattenPlugin)\n }\n\n return plugins\n}\n\nasync function generateSidebar(config: ResolvedConfig, routesDir: string) {\n const { themeConfig } = config\n\n if (themeConfig.sidebar && !Array.isArray(themeConfig.sidebar)) {\n return themeConfig.sidebar\n }\n\n if (themeConfig.sidebar && Array.isArray(themeConfig.sidebar) && themeConfig.sidebar.length > 0) {\n return themeConfig.sidebar\n }\n\n try {\n const sidebar = await scanDirectory(routesDir, routesDir)\n return sidebar\n } catch {\n return []\n }\n}\n\nasync function scanDirectory(\n dir: string,\n rootDir: string\n): Promise<Array<{ text: string; link?: string; items?: unknown[] }>> {\n const entries = await fs.readdir(dir, { withFileTypes: true })\n const items: Array<{ text: string; link?: string; items?: unknown[]; order?: number }> = []\n\n for (const entry of entries) {\n const fullPath = path.join(dir, entry.name)\n const relativePath = path.relative(rootDir, fullPath)\n\n if (entry.isDirectory()) {\n const children = await scanDirectory(fullPath, rootDir)\n if (children.length > 0) {\n // Check for index.mdx in the directory\n const indexPath = path.join(fullPath, \"index.mdx\")\n let link: string | undefined\n\n try {\n await fs.access(indexPath)\n link = \"/\" + relativePath.replace(/\\\\/g, \"/\")\n } catch {\n // No index.mdx\n }\n\n items.push({\n text: formatTitle(entry.name),\n link,\n items: children,\n })\n }\n } else if (\n (entry.name.endsWith(\".mdx\") || entry.name.endsWith(\".md\")) &&\n entry.name !== \"index.mdx\" &&\n entry.name !== \"index.md\"\n ) {\n const fileContent = await fs.readFile(fullPath, \"utf-8\")\n const { data: frontmatter } = matter(fileContent)\n\n const ext = entry.name.endsWith(\".mdx\") ? \".mdx\" : \".md\"\n const title = frontmatter.title || formatTitle(entry.name.replace(ext, \"\"))\n const order: number | undefined =\n typeof frontmatter.order === \"number\" ? frontmatter.order : undefined\n\n const link = \"/\" + relativePath.replace(ext, \"\").replace(/\\\\/g, \"/\")\n\n items.push({\n text: title,\n link,\n order,\n })\n }\n }\n\n items.sort((a, b) => {\n if (a.order !== undefined && b.order !== undefined) {\n return a.order - b.order\n }\n if (a.order !== undefined) return -1\n if (b.order !== undefined) return 1\n return a.text.localeCompare(b.text)\n })\n\n return items.map(({ order: _order, ...item }) => item)\n}\n\nfunction formatTitle(name: string): string {\n return name.replace(/[-_]/g, \" \").replace(/\\b\\w/g, (c) => c.toUpperCase())\n}\n\ninterface SearchDoc {\n id: string\n title: string\n content: string\n path: string\n section?: string\n}\n\nasync function generateSearchIndex(routesDir: string): Promise<SearchDoc[]> {\n const docs: SearchDoc[] = []\n\n async function scanForSearch(dir: string, section?: string): Promise<void> {\n try {\n const entries = await fs.readdir(dir, { withFileTypes: true })\n\n for (const entry of entries) {\n const fullPath = path.join(dir, entry.name)\n\n if (entry.isDirectory()) {\n // Use directory name as section for nested content\n const newSection = section\n ? `${section} > ${formatTitle(entry.name)}`\n : formatTitle(entry.name)\n await scanForSearch(fullPath, newSection)\n } else if (entry.name.endsWith(\".mdx\") || entry.name.endsWith(\".md\")) {\n const relativePath = path.relative(routesDir, fullPath)\n const fileContent = await fs.readFile(fullPath, \"utf-8\")\n\n // Extract frontmatter\n const { data: frontmatter, content: rawContent } = matter(fileContent)\n const ext = entry.name.endsWith(\".mdx\") ? \".mdx\" : \".md\"\n const title = frontmatter.title || formatTitle(entry.name.replace(ext, \"\"))\n let content = rawContent\n\n // Clean up content: remove markdown/MDX syntax, keep text\n content = content\n .replace(/```[\\s\\S]*?```/g, \"\") // Remove code blocks\n .replace(/`[^`]+`/g, \"\") // Remove inline code\n .replace(/import\\s+.*?from\\s+['\"].*?['\"]/g, \"\") // Remove imports\n .replace(/<[^>]+>/g, \"\") // Remove JSX tags\n .replace(/\\[([^\\]]+)\\]\\([^)]+\\)/g, \"$1\") // Links to text\n .replace(/[#*_~>]/g, \"\") // Remove markdown symbols\n .replace(/\\n+/g, \" \") // Newlines to spaces\n .replace(/\\s+/g, \" \") // Multiple spaces to single\n .trim()\n .slice(0, 2000) // Limit content size\n\n // Generate path for the route\n const routePath =\n entry.name === \"index.mdx\" || entry.name === \"index.md\"\n ? \"/\" + path.dirname(relativePath).replace(/\\\\/g, \"/\")\n : \"/\" + relativePath.replace(ext, \"\").replace(/\\\\/g, \"/\")\n\n // Skip root index (use \"/\" as path)\n const finalPath = routePath === \"/.\" ? \"/\" : routePath\n\n docs.push({\n id: relativePath,\n title,\n content,\n path: finalPath,\n section,\n })\n }\n }\n } catch (error) {\n console.warn(\n \"[ardo] Failed to scan for search index:\",\n error instanceof Error ? error.message : error\n )\n }\n }\n\n await scanForSearch(routesDir)\n return docs\n}\n\nexport default ardoPlugin\n","import {\n createHighlighter,\n type Highlighter,\n type BundledTheme,\n type ShikiTransformer,\n} from \"shiki\"\nimport type { Root, Element, Text } from \"hast\"\nimport { visit } from \"unist-util-visit\"\nimport type { MarkdownConfig } from \"../config/types\"\n\nexport type ShikiHighlighter = Highlighter\n\nexport async function createShikiHighlighter(config: MarkdownConfig): Promise<ShikiHighlighter> {\n const themeConfig = config.theme!\n\n const themes: BundledTheme[] =\n typeof themeConfig === \"string\" ? [themeConfig] : [themeConfig.light, themeConfig.dark]\n\n const highlighter = await createHighlighter({\n themes,\n langs: [\n \"javascript\",\n \"typescript\",\n \"jsx\",\n \"tsx\",\n \"json\",\n \"html\",\n \"css\",\n \"markdown\",\n \"bash\",\n \"shell\",\n \"yaml\",\n \"python\",\n \"rust\",\n \"go\",\n \"sql\",\n \"diff\",\n ],\n })\n\n return highlighter\n}\n\ninterface RehypeShikiOptions {\n highlighter: ShikiHighlighter\n config: MarkdownConfig\n}\n\nexport function rehypeShikiFromHighlighter(options: RehypeShikiOptions) {\n const { highlighter, config } = options\n\n const themeConfig = config.theme!\n\n return function (tree: Root) {\n visit(tree, \"element\", (node: Element, index, parent) => {\n if (\n node.tagName !== \"pre\" ||\n !node.children[0] ||\n (node.children[0] as Element).tagName !== \"code\"\n ) {\n return\n }\n\n const codeNode = node.children[0] as Element\n const className = (codeNode.properties?.className as string[]) || []\n const langClass = className.find((c) => c.startsWith(\"language-\"))\n const lang = langClass ? langClass.replace(\"language-\", \"\") : \"text\"\n\n const codeContent = getTextContent(codeNode)\n\n if (!codeContent.trim()) {\n return\n }\n\n try {\n let html: string\n\n if (typeof themeConfig === \"string\") {\n html = highlighter.codeToHtml(codeContent, {\n lang,\n theme: themeConfig,\n })\n } else {\n html = highlighter.codeToHtml(codeContent, {\n lang,\n themes: {\n light: themeConfig.light,\n dark: themeConfig.dark,\n },\n defaultColor: false,\n })\n }\n\n const metaString = (codeNode.properties?.metastring as string) || \"\"\n const lineNumbers = config.lineNumbers || metaString.includes(\"showLineNumbers\")\n const highlightLines = parseHighlightLines(metaString)\n const title = parseTitle(metaString)\n\n const wrapperHtml = buildCodeBlockHtml(html, {\n lang,\n lineNumbers,\n highlightLines,\n title,\n })\n\n if (parent && typeof index === \"number\") {\n const newNode: Element = {\n type: \"element\",\n tagName: \"div\",\n properties: {\n className: [\"ardo-code-block\"],\n \"data-lang\": lang,\n },\n children: [\n {\n type: \"raw\",\n value: wrapperHtml,\n } as unknown as Element,\n ],\n }\n parent.children[index] = newNode\n }\n } catch {\n // If highlighting fails, leave the node unchanged\n }\n })\n }\n}\n\nfunction getTextContent(node: Element | Text): string {\n if (node.type === \"text\") {\n return node.value\n }\n if (\"children\" in node) {\n return node.children.map((child) => getTextContent(child as Element | Text)).join(\"\")\n }\n return \"\"\n}\n\nfunction parseHighlightLines(meta: string): number[] {\n const match = meta.match(/\\{([\\d,-]+)\\}/)\n if (!match) return []\n\n const ranges = match[1].split(\",\")\n const lines: number[] = []\n\n for (const range of ranges) {\n if (range.includes(\"-\")) {\n const [start, end] = range.split(\"-\").map(Number)\n for (let i = start; i <= end; i++) {\n lines.push(i)\n }\n } else {\n lines.push(Number(range))\n }\n }\n\n return lines\n}\n\nfunction parseTitle(meta: string): string | undefined {\n const match = meta.match(/title=\"([^\"]+)\"/)\n return match ? match[1] : undefined\n}\n\ninterface CodeBlockOptions {\n lang: string\n lineNumbers: boolean\n highlightLines: number[]\n title?: string\n}\n\nfunction buildCodeBlockHtml(shikiHtml: string, options: CodeBlockOptions): string {\n const { lang, lineNumbers, highlightLines, title } = options\n\n let html = \"\"\n\n if (title) {\n html += `<div class=\"ardo-code-title\">${escapeHtml(title)}</div>`\n }\n\n html += `<div class=\"ardo-code-wrapper\" data-lang=\"${lang}\">`\n\n if (lineNumbers || highlightLines.length > 0) {\n const lines = shikiHtml.split(\"\\n\")\n const processedHtml = lines\n .map((line, i) => {\n const lineNum = i + 1\n const isHighlighted = highlightLines.includes(lineNum)\n const classes = [\"ardo-code-line\"]\n if (isHighlighted) classes.push(\"highlighted\")\n\n let prefix = \"\"\n if (lineNumbers) {\n prefix = `<span class=\"ardo-line-number\">${lineNum}</span>`\n }\n\n return `<span class=\"${classes.join(\" \")}\">${prefix}${line}</span>`\n })\n .join(\"\\n\")\n\n html += processedHtml\n } else {\n html += shikiHtml\n }\n\n html += `<button class=\"ardo-copy-button\" data-code=\"${encodeURIComponent(extractCodeFromHtml(shikiHtml))}\">\n <span class=\"ardo-copy-icon\">Copy</span>\n <span class=\"ardo-copied-icon\" style=\"display:none\">Copied!</span>\n </button>`\n\n html += \"</div>\"\n\n return html\n}\n\nfunction extractCodeFromHtml(html: string): string {\n return html\n .replace(/<[^>]+>/g, \"\")\n .replace(/&lt;/g, \"<\")\n .replace(/&gt;/g, \">\")\n .replace(/&amp;/g, \"&\")\n .replace(/&quot;/g, '\"')\n .replace(/&#39;/g, \"'\")\n}\n\nfunction escapeHtml(text: string): string {\n return text\n .replace(/&/g, \"&amp;\")\n .replace(/</g, \"&lt;\")\n .replace(/>/g, \"&gt;\")\n .replace(/\"/g, \"&quot;\")\n .replace(/'/g, \"&#39;\")\n}\n\n/**\n * Remark plugin that extracts code fence meta info and stores it as HAST\n * data attributes before MDX compilation can corrupt it.\n *\n * MDX treats `{...}` in code fence meta as JSX expressions, which corrupts\n * both the meta and the code content. This plugin strips the meta and\n * stores parsed info as `data-ardo-*` attributes that survive MDX.\n */\nexport function remarkCodeMeta() {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return function (tree: any) {\n visit(tree, \"code\", (node: { meta?: string | null; data?: Record<string, unknown> }) => {\n if (!node.meta) return\n\n const meta = node.meta\n const data = node.data || (node.data = {})\n const hProperties = (data.hProperties as Record<string, unknown>) || {}\n\n // Preserve meta as metastring property on the <code> HAST element.\n // @shikijs/rehype reads head.properties.metastring and passes it\n // to Shiki as meta.__raw, which ardoLineTransformer reads.\n hProperties.metastring = meta\n data.hProperties = hProperties\n\n // Strip meta from the MDAST node to prevent MDX from\n // misinterpreting {expressions} like {2,4-5} as JSX\n node.meta = null\n })\n }\n}\n\n/**\n * Shiki transformer that adds Ardo-specific line classes, highlighting,\n * line numbers, and title attributes to code blocks.\n *\n * Used with @shikijs/rehype in the MDX pipeline where proper HAST nodes\n * are required (raw HTML nodes cause \"Cannot handle unknown node `raw`\" errors).\n */\ninterface ArdoLineTransformerOptions {\n globalLineNumbers?: boolean\n}\n\nexport function ardoLineTransformer(options: ArdoLineTransformerOptions = {}): ShikiTransformer {\n let highlightLines: number[] = []\n let showLineNumbers = false\n let metaRaw = \"\"\n\n return {\n name: \"ardo:lines\",\n // preprocess runs BEFORE line() hooks, so state is ready for line()\n preprocess(_code, shikiOptions) {\n metaRaw = (shikiOptions.meta?.__raw as string) || \"\"\n highlightLines = parseHighlightLines(metaRaw)\n showLineNumbers = options.globalLineNumbers || metaRaw.includes(\"showLineNumbers\")\n },\n // pre runs AFTER line() — used only for node property modifications\n pre(node) {\n node.properties = node.properties || {}\n const title = parseTitle(metaRaw)\n if (title) {\n node.properties[\"data-title\"] = title\n }\n const labelMatch = metaRaw.match(/\\[([^\\]]+)\\]/)\n if (labelMatch) {\n node.properties[\"data-label\"] = labelMatch[1]\n }\n },\n line(node, line) {\n const currentClass = (node.properties?.class as string) || \"\"\n const classes = currentClass ? currentClass.split(\" \") : []\n classes.push(\"ardo-code-line\")\n\n if (highlightLines.includes(line)) {\n classes.push(\"highlighted\")\n }\n\n node.properties = node.properties || {}\n node.properties.class = classes.join(\" \")\n\n if (showLineNumbers) {\n node.children.unshift({\n type: \"element\",\n tagName: \"span\",\n properties: { class: \"ardo-line-number\" },\n children: [{ type: \"text\", value: String(line) }],\n } as Element)\n }\n },\n }\n}\n","import type { Root } from \"mdast\"\nimport type { ContainerDirective } from \"mdast-util-directive\"\nimport { visit } from \"unist-util-visit\"\n\nconst containerTypes = [\n \"tip\",\n \"warning\",\n \"danger\",\n \"info\",\n \"note\",\n \"details\",\n \"code-group\",\n] as const\ntype ContainerType = (typeof containerTypes)[number]\n\nconst defaultTitles: Record<ContainerType, string> = {\n tip: \"TIP\",\n warning: \"WARNING\",\n danger: \"DANGER\",\n info: \"INFO\",\n note: \"NOTE\",\n details: \"Details\",\n \"code-group\": \"\",\n}\n\nexport function remarkContainers() {\n return function (tree: Root) {\n visit(tree, \"containerDirective\", (node: ContainerDirective) => {\n const type = node.name as ContainerType\n\n if (!containerTypes.includes(type)) {\n return\n }\n\n const data = node.data || (node.data = {})\n\n const titleNode = node.children[0]\n let customTitle: string | undefined\n\n if (\n titleNode &&\n titleNode.type === \"paragraph\" &&\n titleNode.children[0]?.type === \"text\" &&\n titleNode.data?.directiveLabel\n ) {\n customTitle = (titleNode.children[0] as { value: string }).value\n node.children.shift()\n }\n\n const title = customTitle || defaultTitles[type]\n\n if (type === \"code-group\") {\n data.hName = \"div\"\n data.hProperties = {\n className: [\"ardo-code-group\"],\n }\n\n const tabs: Array<{ label: string; content: unknown }> = []\n\n for (const child of node.children) {\n if (child.type === \"code\") {\n const codeNode = child as { lang?: string; meta?: string; value: string }\n const meta = codeNode.meta || \"\"\n const labelMatch = meta.match(/\\[([^\\]]+)\\]/)\n const label = labelMatch ? labelMatch[1] : codeNode.lang || \"Code\"\n tabs.push({ label, content: child })\n }\n }\n\n const tabsHtml = tabs\n .map(\n (tab, i) =>\n `<button class=\"ardo-code-group-tab${i === 0 ? \" active\" : \"\"}\" data-index=\"${i}\">${escapeHtml(tab.label)}</button>`\n )\n .join(\"\")\n\n node.children = [\n {\n type: \"html\",\n value: `<div class=\"ardo-code-group-tabs\">${tabsHtml}</div>`,\n } as unknown as (typeof node.children)[number],\n {\n type: \"html\",\n value: '<div class=\"ardo-code-group-panels\">',\n } as unknown as (typeof node.children)[number],\n ...tabs.map(\n (tab, i) =>\n ({\n type: \"html\",\n value: `<div class=\"ardo-code-group-panel${i === 0 ? \" active\" : \"\"}\" data-index=\"${i}\">`,\n }) as unknown as (typeof node.children)[number]\n ),\n ...node.children.flatMap((child: (typeof node.children)[number], _i: number) => [\n child,\n {\n type: \"html\",\n value: \"</div>\",\n } as unknown as (typeof node.children)[number],\n ]),\n {\n type: \"html\",\n value: \"</div>\",\n } as unknown as (typeof node.children)[number],\n ]\n\n return\n }\n\n if (type === \"details\") {\n data.hName = \"details\"\n data.hProperties = {\n className: [\"ardo-details\"],\n }\n\n node.children.unshift({\n type: \"html\",\n value: `<summary class=\"ardo-details-summary\">${escapeHtml(title)}</summary>`,\n } as unknown as (typeof node.children)[number])\n\n return\n }\n\n data.hName = \"div\"\n data.hProperties = {\n className: [\"ardo-container\", `ardo-container-${type}`],\n }\n\n node.children.unshift({\n type: \"html\",\n value: `<p class=\"ardo-container-title\">${escapeHtml(title)}</p>`,\n } as unknown as (typeof node.children)[number])\n })\n }\n}\n\nfunction escapeHtml(text: string): string {\n return text\n .replace(/&/g, \"&amp;\")\n .replace(/</g, \"&lt;\")\n .replace(/>/g, \"&gt;\")\n .replace(/\"/g, \"&quot;\")\n .replace(/'/g, \"&#39;\")\n}\n\n/**\n * MDX-compatible remark plugin that converts container directives\n * (:::tip, :::warning, etc.) to MDX JSX elements (<Tip>, <Warning>, etc.)\n * that map to the React components in ardo/ui.\n *\n * Unlike remarkContainers (which uses raw HTML nodes for the title),\n * this produces proper MDX JSX flow elements that work with @mdx-js/rollup.\n */\nconst containerToComponent: Record<string, string> = {\n tip: \"Tip\",\n warning: \"Warning\",\n danger: \"Danger\",\n info: \"Info\",\n note: \"Note\",\n}\n\nexport function remarkContainersMdx() {\n return function (tree: Root) {\n visit(tree, \"containerDirective\", (node: ContainerDirective, index, parent) => {\n if (!parent || typeof index !== \"number\") return\n\n // Handle code-group directives\n if (node.name === \"code-group\") {\n // Extract tab labels from code block meta strings at remark level\n const labels = node.children\n .filter((child) => child.type === \"code\")\n .map((child) => {\n const meta = (child as { meta?: string }).meta || \"\"\n const match = meta.match(/\\[([^\\]]+)\\]/)\n return match ? match[1] : (child as { lang?: string }).lang || \"Code\"\n })\n\n const jsxNode = {\n type: \"mdxJsxFlowElement\" as const,\n name: \"CodeGroup\",\n attributes: [\n {\n type: \"mdxJsxAttribute\" as const,\n name: \"labels\",\n value: labels.join(\",\"),\n },\n ],\n children: node.children,\n }\n parent.children[index] = jsxNode as unknown as (typeof parent.children)[number]\n return\n }\n\n const componentName = containerToComponent[node.name]\n if (!componentName) return\n\n // Extract custom title from directive label\n const titleNode = node.children[0]\n let customTitle: string | undefined\n\n if (\n titleNode &&\n titleNode.type === \"paragraph\" &&\n titleNode.children[0]?.type === \"text\" &&\n titleNode.data?.directiveLabel\n ) {\n customTitle = (titleNode.children[0] as { value: string }).value\n node.children.shift()\n }\n\n // Build MDX JSX attributes\n const attributes: Array<{\n type: \"mdxJsxAttribute\"\n name: string\n value: string\n }> = []\n\n if (customTitle) {\n attributes.push({\n type: \"mdxJsxAttribute\",\n name: \"title\",\n value: customTitle,\n })\n }\n\n // Replace the directive node with an MDX JSX flow element\n const jsxNode = {\n type: \"mdxJsxFlowElement\" as const,\n name: componentName,\n attributes,\n children: node.children,\n }\n\n parent.children[index] = jsxNode as unknown as (typeof parent.children)[number]\n })\n }\n}\n","import type { Plugin } from \"vite\"\nimport fs from \"fs/promises\"\nimport fsSync from \"fs\"\nimport path from \"path\"\n\nexport interface ArdoRoutesPluginOptions {\n /** Directory where routes are located (default: \"./app/routes\") */\n routesDir?: string\n}\n\ninterface RouteInfo {\n /** URL path (e.g., \"/guide/getting-started\") */\n path: string\n /** File path relative to app directory (e.g., \"routes/guide/getting-started.mdx\") */\n file: string\n /** True if this is an index route */\n isIndex?: boolean\n}\n\n/**\n * Vite plugin that generates routes.ts for React Router Framework Mode.\n * Scans app/routes for .mdx and .tsx files and generates the route configuration.\n */\nexport function ardoRoutesPlugin(options: ArdoRoutesPluginOptions = {}): Plugin {\n let routesDir: string\n let appDir: string\n let routesFilePath: string\n\n function scanRoutesSync(dir: string, rootDir: string): RouteInfo[] {\n const routes: RouteInfo[] = []\n\n try {\n const entries = fsSync.readdirSync(dir, { withFileTypes: true })\n\n for (const entry of entries) {\n const fullPath = path.join(dir, entry.name)\n\n if (entry.isDirectory()) {\n // Recursively scan subdirectories\n const children = scanRoutesSync(fullPath, rootDir)\n routes.push(...children)\n } else if (\n entry.name.endsWith(\".mdx\") ||\n entry.name.endsWith(\".md\") ||\n entry.name.endsWith(\".tsx\")\n ) {\n // Skip special files\n if (entry.name === \"root.tsx\" || entry.name.startsWith(\"_\")) {\n continue\n }\n\n const relativePath = path.relative(rootDir, fullPath)\n const ext = entry.name.endsWith(\".mdx\")\n ? \".mdx\"\n : entry.name.endsWith(\".md\")\n ? \".md\"\n : \".tsx\"\n const baseName = entry.name.replace(ext, \"\")\n\n // Calculate URL path\n let urlPath: string\n if (baseName === \"index\" || baseName === \"home\") {\n // Index route - use parent directory path\n const parentDir = path.dirname(relativePath)\n urlPath = parentDir === \".\" ? \"/\" : \"/\" + parentDir.replace(/\\\\/g, \"/\")\n } else {\n // Regular route\n urlPath = \"/\" + relativePath.replace(ext, \"\").replace(/\\\\/g, \"/\")\n }\n\n // Handle dynamic segments ($param -> :param)\n urlPath = urlPath.replace(/\\$(\\w+)/g, \":$1\")\n\n routes.push({\n path: urlPath,\n file: \"routes/\" + relativePath.replace(/\\\\/g, \"/\"),\n isIndex: baseName === \"index\" || baseName === \"home\",\n })\n }\n }\n } catch {\n // Directory may not exist yet\n }\n\n return routes\n }\n\n function generateRoutesFile(routes: RouteInfo[]): string {\n // Sort routes: index routes first, then alphabetically\n const sortedRoutes = [...routes].sort((a, b) => {\n if (a.path === \"/\" && b.path !== \"/\") return -1\n if (b.path === \"/\" && a.path !== \"/\") return 1\n if (a.isIndex && !b.isIndex) return -1\n if (b.isIndex && !a.isIndex) return 1\n return a.path.localeCompare(b.path)\n })\n\n const entries = sortedRoutes.map((r) => {\n if (r.path === \"/\") {\n return ` index(\"${r.file}\"),`\n }\n // Remove leading slash for route path\n const routePath = r.path.substring(1)\n return ` route(\"${routePath}\", \"${r.file}\"),`\n })\n\n return `// AUTO-GENERATED by Ardo - Do not edit manually\n\nimport { type RouteConfig, route, index } from \"@react-router/dev/routes\"\n\nexport default [\n${entries.join(\"\\n\")}\n] satisfies RouteConfig\n`\n }\n\n function writeRoutesFileSync(): void {\n const routes = scanRoutesSync(routesDir, routesDir)\n\n // Skip if no routes found (directory might not exist yet)\n if (routes.length === 0) {\n return\n }\n\n const content = generateRoutesFile(routes)\n\n // Only write if content changed\n try {\n const existing = fsSync.readFileSync(routesFilePath, \"utf-8\")\n if (existing === content) {\n return\n }\n } catch {\n // File doesn't exist yet\n }\n\n // Ensure app directory exists\n fsSync.mkdirSync(appDir, { recursive: true })\n fsSync.writeFileSync(routesFilePath, content, \"utf-8\")\n console.log(`[ardo] Generated routes.ts with ${routes.length} routes`)\n }\n\n async function writeRoutesFile(): Promise<void> {\n const routes = scanRoutesSync(routesDir, routesDir)\n\n // Skip if no routes found (directory might not exist yet)\n if (routes.length === 0) {\n return\n }\n\n const content = generateRoutesFile(routes)\n\n // Only write if content changed\n try {\n const existing = await fs.readFile(routesFilePath, \"utf-8\")\n if (existing === content) {\n return\n }\n } catch {\n // File doesn't exist yet\n }\n\n // Ensure app directory exists\n await fs.mkdir(appDir, { recursive: true })\n await fs.writeFile(routesFilePath, content, \"utf-8\")\n }\n\n return {\n name: \"ardo:routes\",\n enforce: \"pre\",\n\n config(userConfig) {\n const root = userConfig.root || process.cwd()\n appDir = path.join(root, \"app\")\n routesDir = options.routesDir || path.join(appDir, \"routes\")\n routesFilePath = path.join(appDir, \"routes.ts\")\n\n // Generate routes synchronously during config phase\n // React Router needs routes.ts to exist before it starts\n try {\n writeRoutesFileSync()\n } catch (err) {\n console.warn(\"[ardo] Could not generate routes.ts in config phase:\", err)\n }\n },\n\n configResolved(config) {\n // Update paths if not set in config\n if (!appDir) {\n appDir = path.join(config.root, \"app\")\n routesDir = options.routesDir || path.join(appDir, \"routes\")\n routesFilePath = path.join(appDir, \"routes.ts\")\n }\n },\n\n async buildStart() {\n // Re-generate routes in buildStart for async support\n await writeRoutesFile()\n },\n\n configureServer(server) {\n // Watch for changes in routes directory\n server.watcher.add(routesDir)\n\n const handleChange = async (changedPath: string) => {\n if (\n changedPath.startsWith(routesDir) &&\n (changedPath.endsWith(\".mdx\") ||\n changedPath.endsWith(\".md\") ||\n changedPath.endsWith(\".tsx\"))\n ) {\n await writeRoutesFile()\n }\n }\n\n server.watcher.on(\"add\", handleChange)\n server.watcher.on(\"unlink\", handleChange)\n },\n }\n}\n","import fs from \"fs/promises\"\nimport path from \"path\"\nimport type { PageData, PageFrontmatter, TOCItem, ResolvedConfig } from \"../config/types\"\nimport { transformMarkdown } from \"../markdown/pipeline\"\n\nexport interface LoadDocOptions {\n slug: string\n contentDir: string\n config: ResolvedConfig\n}\n\nexport interface LoadDocResult {\n content: string\n frontmatter: PageFrontmatter\n toc: TOCItem[]\n filePath: string\n relativePath: string\n lastUpdated?: number\n}\n\nexport async function loadDoc(options: LoadDocOptions): Promise<LoadDocResult | null> {\n const { slug, contentDir, config } = options\n\n const possiblePaths = [\n path.join(contentDir, `${slug}.md`),\n path.join(contentDir, slug, \"index.md\"),\n ]\n\n let filePath: string | null = null\n let fileContent: string | null = null\n\n for (const tryPath of possiblePaths) {\n try {\n fileContent = await fs.readFile(tryPath, \"utf-8\")\n filePath = tryPath\n break\n } catch {\n continue\n }\n }\n\n if (!filePath || !fileContent) {\n return null\n }\n\n const result = await transformMarkdown(fileContent, config.markdown)\n const relativePath = path.relative(contentDir, filePath)\n\n let lastUpdated: number | undefined\n try {\n const stat = await fs.stat(filePath)\n lastUpdated = stat.mtimeMs\n } catch {\n // Ignore stat errors\n }\n\n return {\n content: result.html,\n frontmatter: result.frontmatter,\n toc: result.toc,\n filePath,\n relativePath,\n lastUpdated,\n }\n}\n\nexport async function loadAllDocs(contentDir: string, config: ResolvedConfig): Promise<PageData[]> {\n const docs: PageData[] = []\n\n async function scanDir(dir: string) {\n const entries = await fs.readdir(dir, { withFileTypes: true })\n\n for (const entry of entries) {\n const fullPath = path.join(dir, entry.name)\n\n if (entry.isDirectory()) {\n await scanDir(fullPath)\n } else if (entry.name.endsWith(\".md\")) {\n const fileContent = await fs.readFile(fullPath, \"utf-8\")\n const result = await transformMarkdown(fileContent, config.markdown)\n const relativePath = path.relative(contentDir, fullPath)\n\n let lastUpdated: number | undefined\n try {\n const stat = await fs.stat(fullPath)\n lastUpdated = stat.mtimeMs\n } catch {\n // Ignore stat errors\n }\n\n docs.push({\n title: result.frontmatter.title || formatTitle(entry.name.replace(/\\.md$/, \"\")),\n description: result.frontmatter.description,\n frontmatter: result.frontmatter,\n content: result.html,\n toc: result.toc,\n filePath: fullPath,\n relativePath,\n lastUpdated,\n })\n }\n }\n }\n\n await scanDir(contentDir)\n return docs\n}\n\nfunction formatTitle(name: string): string {\n return name.replace(/[-_]/g, \" \").replace(/\\b\\w/g, (c) => c.toUpperCase())\n}\n\nexport function getSlugFromPath(relativePath: string): string {\n return relativePath\n .replace(/\\.md$/, \"\")\n .replace(/\\/index$/, \"\")\n .replace(/\\\\/g, \"/\")\n}\n\nexport function getPageDataForRoute(docs: PageData[], slug: string): PageData | undefined {\n return docs.find((doc) => {\n const docSlug = getSlugFromPath(doc.relativePath)\n return docSlug === slug || docSlug === `${slug}/index`\n })\n}\n","import { unified } from \"unified\"\nimport remarkParse from \"remark-parse\"\nimport remarkGfm from \"remark-gfm\"\nimport remarkFrontmatter from \"remark-frontmatter\"\nimport remarkDirective from \"remark-directive\"\nimport remarkRehype from \"remark-rehype\"\nimport rehypeStringify from \"rehype-stringify\"\nimport matter from \"gray-matter\"\nimport type { MarkdownConfig, TOCItem, PageFrontmatter } from \"../config/types\"\nimport { remarkContainers } from \"./containers\"\nimport { remarkExtractToc, type TocExtraction } from \"./toc\"\nimport { createShikiHighlighter, rehypeShikiFromHighlighter, type ShikiHighlighter } from \"./shiki\"\nimport { rehypeLinks } from \"./links\"\n\nexport interface TransformResult {\n html: string\n frontmatter: PageFrontmatter\n toc: TOCItem[]\n}\n\nexport interface TransformOptions {\n basePath?: string\n highlighter?: ShikiHighlighter\n}\n\nexport async function transformMarkdown(\n content: string,\n config: MarkdownConfig,\n options: TransformOptions = {}\n): Promise<TransformResult> {\n const { data: frontmatter, content: markdownContent } = matter(content)\n const { basePath = \"/\", highlighter: providedHighlighter } = options\n\n const tocExtraction: TocExtraction = { toc: [] }\n const highlighter = providedHighlighter ?? (await createShikiHighlighter(config))\n\n const processor = unified()\n .use(remarkParse)\n .use(remarkFrontmatter, [\"yaml\"])\n .use(remarkGfm)\n .use(remarkDirective)\n .use(remarkContainers)\n .use(remarkExtractToc, { tocExtraction, levels: config.toc?.level ?? [2, 3] })\n .use(remarkRehype, { allowDangerousHtml: true })\n .use(rehypeShikiFromHighlighter, { highlighter, config })\n .use(rehypeLinks, { basePath })\n .use(rehypeStringify, { allowDangerousHtml: true })\n\n if (config.remarkPlugins) {\n for (const plugin of config.remarkPlugins) {\n processor.use(plugin as Parameters<typeof processor.use>[0])\n }\n }\n\n if (config.rehypePlugins) {\n for (const plugin of config.rehypePlugins) {\n processor.use(plugin as Parameters<typeof processor.use>[0])\n }\n }\n\n const result = await processor.process(markdownContent)\n\n return {\n html: String(result),\n frontmatter: frontmatter as PageFrontmatter,\n toc: tocExtraction.toc,\n }\n}\n\nexport async function transformMarkdownToReact(\n content: string,\n config: MarkdownConfig\n): Promise<TransformResult> {\n return transformMarkdown(content, config)\n}\n","import type { Root, Heading } from \"mdast\"\nimport { visit } from \"unist-util-visit\"\nimport type { TOCItem } from \"../config/types\"\n\nexport interface TocExtraction {\n toc: TOCItem[]\n}\n\ninterface TocOptions {\n tocExtraction: TocExtraction\n levels: [number, number]\n}\n\nexport function remarkExtractToc(options: TocOptions) {\n const { tocExtraction, levels } = options\n const [minLevel, maxLevel] = levels\n\n return function (tree: Root) {\n const headings: Array<{ text: string; level: number; id: string }> = []\n let headingIndex = 0\n\n visit(tree, \"heading\", (node: Heading) => {\n if (node.depth < minLevel || node.depth > maxLevel) {\n return\n }\n\n const text = getHeadingText(node)\n const slug = slugify(text)\n const id = slug || `heading-${headingIndex}`\n headingIndex++\n\n headings.push({\n text,\n level: node.depth,\n id,\n })\n\n // Add id to the heading node for anchor links\n const data = node.data || (node.data = {})\n const hProperties = (data.hProperties || (data.hProperties = {})) as Record<string, string>\n hProperties.id = id\n })\n\n tocExtraction.toc = buildTocTree(headings, minLevel)\n }\n}\n\nfunction getHeadingText(node: Heading): string {\n const textParts: string[] = []\n\n function extractText(child: unknown) {\n if (!child || typeof child !== \"object\") return\n\n const typedChild = child as { type?: string; value?: string; children?: unknown[] }\n\n if (typedChild.type === \"text\") {\n textParts.push(typedChild.value || \"\")\n } else if (typedChild.type === \"inlineCode\") {\n textParts.push(typedChild.value || \"\")\n } else if (Array.isArray(typedChild.children)) {\n typedChild.children.forEach(extractText)\n }\n }\n\n node.children.forEach(extractText)\n return textParts.join(\"\")\n}\n\nfunction slugify(text: string): string {\n return text\n .toLowerCase()\n .trim()\n .replace(/[^\\w\\s-]/g, \"\")\n .replace(/[\\s_-]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\")\n}\n\nfunction buildTocTree(\n headings: Array<{ text: string; level: number; id: string }>,\n _minLevel: number\n): TOCItem[] {\n const result: TOCItem[] = []\n const stack: Array<{ item: TOCItem; level: number }> = []\n\n for (const heading of headings) {\n const item: TOCItem = {\n id: heading.id,\n text: heading.text,\n level: heading.level,\n }\n\n while (stack.length > 0 && stack[stack.length - 1].level >= heading.level) {\n stack.pop()\n }\n\n if (stack.length === 0) {\n result.push(item)\n } else {\n const parent = stack[stack.length - 1].item\n if (!parent.children) {\n parent.children = []\n }\n parent.children.push(item)\n }\n\n stack.push({ item, level: heading.level })\n }\n\n return result\n}\n\nexport function flattenToc(toc: TOCItem[]): TOCItem[] {\n const result: TOCItem[] = []\n\n function flatten(items: TOCItem[]) {\n for (const item of items) {\n result.push(item)\n if (item.children) {\n flatten(item.children)\n }\n }\n }\n\n flatten(toc)\n return result\n}\n","import { visit } from \"unist-util-visit\"\nimport type { Root, Element } from \"hast\"\n\nexport interface RehypeLinkOptions {\n basePath: string\n}\n\n/**\n * Rehype plugin that rewrites internal links to include the basePath.\n * This is needed for static sites deployed to subpaths (e.g., GitHub Pages).\n */\nexport function rehypeLinks(options: RehypeLinkOptions) {\n const { basePath } = options\n\n // Normalize basePath: ensure it starts with / and doesn't end with /\n const normalizedBase = basePath === \"/\" ? \"\" : basePath.replace(/\\/$/, \"\")\n\n return (tree: Root) => {\n if (!normalizedBase) {\n // No basePath to add\n return\n }\n\n visit(tree, \"element\", (node: Element) => {\n if (node.tagName === \"a\") {\n const href = node.properties?.href\n\n if (typeof href === \"string\") {\n // Only rewrite internal links that start with /\n // Don't rewrite: external URLs, anchors, relative paths, or already prefixed paths\n if (href.startsWith(\"/\") && !href.startsWith(\"//\") && !href.startsWith(normalizedBase)) {\n node.properties = node.properties || {}\n node.properties.href = normalizedBase + href\n }\n }\n }\n })\n }\n}\n","import fs from \"fs/promises\"\nimport type { Dirent } from \"fs\"\nimport path from \"path\"\nimport matter from \"gray-matter\"\nimport type { SidebarItem, ResolvedConfig } from \"../config/types\"\n\nexport interface SidebarGenerationOptions {\n contentDir: string\n basePath: string\n config: ResolvedConfig\n}\n\nexport async function generateSidebar(options: SidebarGenerationOptions): Promise<SidebarItem[]> {\n const { contentDir, basePath, config } = options\n\n const configSidebar = config.themeConfig.sidebar\n\n if (configSidebar) {\n if (Array.isArray(configSidebar) && configSidebar.length > 0) {\n return configSidebar\n }\n if (!Array.isArray(configSidebar)) {\n return []\n }\n }\n\n return await scanDirectoryForSidebar(contentDir, contentDir, basePath)\n}\n\nasync function scanDirectoryForSidebar(\n dir: string,\n rootDir: string,\n _basePath: string\n): Promise<SidebarItem[]> {\n let entries: Dirent[]\n\n try {\n entries = (await fs.readdir(dir, { withFileTypes: true })) as Dirent[]\n } catch {\n return []\n }\n\n interface SidebarItemWithOrder extends SidebarItem {\n order?: number\n }\n\n const items: SidebarItemWithOrder[] = []\n\n for (const entry of entries) {\n const fullPath = path.join(dir, entry.name)\n const relativePath = path.relative(rootDir, fullPath)\n\n if (entry.name.startsWith(\".\") || entry.name.startsWith(\"_\")) {\n continue\n }\n\n if (entry.isDirectory()) {\n const children = await scanDirectoryForSidebar(fullPath, rootDir, _basePath)\n\n if (children.length > 0) {\n const indexPath = path.join(fullPath, \"index.md\")\n let link: string | undefined\n let title = formatTitle(entry.name)\n let order: number | undefined\n\n try {\n const indexContent = await fs.readFile(indexPath, \"utf-8\")\n const { data: frontmatter } = matter(indexContent)\n\n if (frontmatter.title) {\n title = frontmatter.title\n }\n if (typeof frontmatter.order === \"number\") {\n order = frontmatter.order\n }\n\n // Don't include basePath - React Router handles it automatically\n link = normalizePath(relativePath)\n } catch {\n // No index.md file\n }\n\n items.push({\n text: title,\n link,\n collapsed: false,\n items: children,\n order,\n })\n }\n } else if (entry.name.endsWith(\".md\") && entry.name !== \"index.md\") {\n const fileContent = await fs.readFile(fullPath, \"utf-8\")\n const { data: frontmatter } = matter(fileContent)\n\n if (frontmatter.sidebar === false) {\n continue\n }\n\n const title = frontmatter.title || formatTitle(entry.name.replace(/\\.md$/, \"\"))\n const order = typeof frontmatter.order === \"number\" ? frontmatter.order : undefined\n\n // Don't include basePath - React Router handles it automatically\n const link = normalizePath(relativePath.replace(/\\.md$/, \"\"))\n\n items.push({\n text: title,\n link,\n order,\n })\n }\n }\n\n items.sort((a, b) => {\n if (a.order !== undefined && b.order !== undefined) {\n return a.order - b.order\n }\n if (a.order !== undefined) return -1\n if (b.order !== undefined) return 1\n return a.text.localeCompare(b.text)\n })\n\n return items.map(({ order: _order, ...item }) => item)\n}\n\nfunction formatTitle(name: string): string {\n return name\n .replace(/^\\d+-/, \"\")\n .replace(/[-_]/g, \" \")\n .replace(/\\b\\w/g, (c) => c.toUpperCase())\n}\n\nfunction normalizePath(p: string): string {\n return \"/\" + p.replace(/\\\\/g, \"/\").replace(/^\\/+/, \"\")\n}\n"],"mappings":"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","names":["visit","escapeHtml","jsxNode","fs","fsSync","path","path","fsSync","fs","fs","path","remarkGfm","remarkFrontmatter","remarkDirective","matter","visit","visit","matter","remarkFrontmatter","remarkGfm","remarkDirective","path","fs","formatTitle","fs","path","matter","generateSidebar","formatTitle"]}
@@ -3,7 +3,7 @@ import {
3
3
  } from "./chunk-MJQGGJQZ.js";
4
4
  import {
5
5
  useThemeConfig
6
- } from "./chunk-3O2PF4HA.js";
6
+ } from "./chunk-QELSOHIY.js";
7
7
 
8
8
  // src/ui/components/Search.tsx
9
9
  import { useState, useEffect, useRef, useMemo } from "react";
@@ -191,4 +191,4 @@ function Search() {
191
191
  export {
192
192
  Search
193
193
  };
194
- //# sourceMappingURL=chunk-GAYGMYIS.js.map
194
+ //# sourceMappingURL=chunk-BHHI2BO4.js.map
@@ -33,6 +33,7 @@ function resolveConfig(config, root) {
33
33
  return {
34
34
  title: config.title,
35
35
  description: config.description ?? "",
36
+ titleSeparator: config.titleSeparator ?? " | ",
36
37
  base: config.base ?? "/",
37
38
  srcDir,
38
39
  outDir: config.outDir ?? "dist",
@@ -75,4 +76,4 @@ export {
75
76
  resolveConfig,
76
77
  loadConfig
77
78
  };
78
- //# sourceMappingURL=chunk-BH7JD5XJ.js.map
79
+ //# sourceMappingURL=chunk-NBRHGTR2.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/config/index.ts"],"sourcesContent":["import type {\n ArdoConfig,\n ProjectMeta,\n ResolvedConfig,\n ThemeConfig,\n MarkdownConfig,\n TypeDocConfig,\n SidebarItem,\n NavItem,\n SocialLink,\n SponsorConfig,\n PageFrontmatter,\n TOCItem,\n PageData,\n HeadConfig,\n} from \"./types\"\nimport path from \"path\"\n\nexport type {\n ArdoConfig,\n ProjectMeta,\n ResolvedConfig,\n ThemeConfig,\n MarkdownConfig,\n TypeDocConfig,\n SidebarItem,\n NavItem,\n SocialLink,\n SponsorConfig,\n PageFrontmatter,\n TOCItem,\n PageData,\n HeadConfig,\n}\n\nexport function defineConfig(config: ArdoConfig): ArdoConfig {\n return config\n}\n\nconst defaultThemeConfig: ThemeConfig = {\n nav: [],\n sidebar: [],\n socialLinks: [],\n search: {\n enabled: true,\n placeholder: \"Search...\",\n },\n outline: {\n level: 2,\n label: \"On this page\",\n },\n}\n\nexport const defaultMarkdownConfig: MarkdownConfig = {\n theme: {\n light: \"github-light-default\",\n dark: \"github-dark-default\",\n },\n lineNumbers: false,\n anchor: true,\n toc: {\n level: [2, 3],\n },\n}\n\nexport function resolveConfig(config: ArdoConfig, root: string): ResolvedConfig {\n const srcDir = config.srcDir ?? \"content\"\n const contentDir = path.resolve(root, srcDir)\n\n return {\n title: config.title,\n description: config.description ?? \"\",\n titleSeparator: config.titleSeparator ?? \" | \",\n base: config.base ?? \"/\",\n srcDir,\n outDir: config.outDir ?? \"dist\",\n lang: config.lang ?? \"en\",\n head: config.head ?? [],\n themeConfig: {\n ...defaultThemeConfig,\n ...config.themeConfig,\n },\n markdown: {\n ...defaultMarkdownConfig,\n ...config.markdown,\n },\n vite: config.vite,\n project: config.project ?? {},\n root,\n contentDir,\n }\n}\n\nexport async function loadConfig(root: string): Promise<ResolvedConfig> {\n const configPath = path.resolve(root, \"press.config.ts\")\n\n try {\n const configModule = await import(configPath)\n const config = configModule.default as ArdoConfig\n return resolveConfig(config, root)\n } catch {\n return resolveConfig(\n {\n title: \"Ardo\",\n description: \"Documentation powered by Ardo\",\n },\n root\n )\n }\n}\n"],"mappings":";AAgBA,OAAO,UAAU;AAmBV,SAAS,aAAa,QAAgC;AAC3D,SAAO;AACT;AAEA,IAAM,qBAAkC;AAAA,EACtC,KAAK,CAAC;AAAA,EACN,SAAS,CAAC;AAAA,EACV,aAAa,CAAC;AAAA,EACd,QAAQ;AAAA,IACN,SAAS;AAAA,IACT,aAAa;AAAA,EACf;AAAA,EACA,SAAS;AAAA,IACP,OAAO;AAAA,IACP,OAAO;AAAA,EACT;AACF;AAEO,IAAM,wBAAwC;AAAA,EACnD,OAAO;AAAA,IACL,OAAO;AAAA,IACP,MAAM;AAAA,EACR;AAAA,EACA,aAAa;AAAA,EACb,QAAQ;AAAA,EACR,KAAK;AAAA,IACH,OAAO,CAAC,GAAG,CAAC;AAAA,EACd;AACF;AAEO,SAAS,cAAc,QAAoB,MAA8B;AAC9E,QAAM,SAAS,OAAO,UAAU;AAChC,QAAM,aAAa,KAAK,QAAQ,MAAM,MAAM;AAE5C,SAAO;AAAA,IACL,OAAO,OAAO;AAAA,IACd,aAAa,OAAO,eAAe;AAAA,IACnC,gBAAgB,OAAO,kBAAkB;AAAA,IACzC,MAAM,OAAO,QAAQ;AAAA,IACrB;AAAA,IACA,QAAQ,OAAO,UAAU;AAAA,IACzB,MAAM,OAAO,QAAQ;AAAA,IACrB,MAAM,OAAO,QAAQ,CAAC;AAAA,IACtB,aAAa;AAAA,MACX,GAAG;AAAA,MACH,GAAG,OAAO;AAAA,IACZ;AAAA,IACA,UAAU;AAAA,MACR,GAAG;AAAA,MACH,GAAG,OAAO;AAAA,IACZ;AAAA,IACA,MAAM,OAAO;AAAA,IACb,SAAS,OAAO,WAAW,CAAC;AAAA,IAC5B;AAAA,IACA;AAAA,EACF;AACF;AAEA,eAAsB,WAAW,MAAuC;AACtE,QAAM,aAAa,KAAK,QAAQ,MAAM,iBAAiB;AAEvD,MAAI;AACF,UAAM,eAAe,MAAM,OAAO;AAClC,UAAM,SAAS,aAAa;AAC5B,WAAO,cAAc,QAAQ,IAAI;AAAA,EACnC,QAAQ;AACN,WAAO;AAAA,MACL;AAAA,QACE,OAAO;AAAA,QACP,aAAa;AAAA,MACf;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACF;","names":[]}
@@ -0,0 +1,46 @@
1
+ // src/runtime/hooks.tsx
2
+ import { createContext, useContext } from "react";
3
+ import { jsx } from "react/jsx-runtime";
4
+ var ArdoContext = createContext(null);
5
+ function useArdoContext() {
6
+ const context = useContext(ArdoContext);
7
+ if (!context) {
8
+ throw new Error("useArdoContext must be used within an ArdoProvider");
9
+ }
10
+ return context;
11
+ }
12
+ function useConfig() {
13
+ const { config } = useArdoContext();
14
+ return config;
15
+ }
16
+ function useThemeConfig() {
17
+ const { config } = useArdoContext();
18
+ return config.themeConfig ?? {};
19
+ }
20
+ function useSidebar() {
21
+ const { sidebar } = useArdoContext();
22
+ return sidebar;
23
+ }
24
+ function usePageData() {
25
+ const { currentPage } = useArdoContext();
26
+ return currentPage;
27
+ }
28
+ function useTOC() {
29
+ const { currentPage } = useArdoContext();
30
+ return currentPage?.toc ?? [];
31
+ }
32
+ function ArdoProvider({ config, sidebar, currentPage, children }) {
33
+ return /* @__PURE__ */ jsx(ArdoContext.Provider, { value: { config, sidebar, currentPage }, children });
34
+ }
35
+
36
+ export {
37
+ ArdoContext,
38
+ useArdoContext,
39
+ useConfig,
40
+ useThemeConfig,
41
+ useSidebar,
42
+ usePageData,
43
+ useTOC,
44
+ ArdoProvider
45
+ };
46
+ //# sourceMappingURL=chunk-QELSOHIY.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/runtime/hooks.tsx"],"sourcesContent":["import { createContext, useContext, type ReactNode } from \"react\"\nimport type { ArdoConfig, ThemeConfig, SidebarItem, TOCItem, PageData } from \"../config/types\"\n\ninterface ArdoContextValue {\n config: ArdoConfig\n sidebar: SidebarItem[]\n currentPage?: PageData\n}\n\nconst ArdoContext = createContext<ArdoContextValue | null>(null)\n\nexport function useArdoContext(): ArdoContextValue {\n const context = useContext(ArdoContext)\n if (!context) {\n throw new Error(\"useArdoContext must be used within an ArdoProvider\")\n }\n return context\n}\n\nexport function useConfig(): ArdoConfig {\n const { config } = useArdoContext()\n return config\n}\n\nexport function useThemeConfig(): ThemeConfig {\n const { config } = useArdoContext()\n return config.themeConfig ?? {}\n}\n\nexport function useSidebar(): SidebarItem[] {\n const { sidebar } = useArdoContext()\n return sidebar\n}\n\nexport function usePageData(): PageData | undefined {\n const { currentPage } = useArdoContext()\n return currentPage\n}\n\nexport function useTOC(): TOCItem[] {\n const { currentPage } = useArdoContext()\n return currentPage?.toc ?? []\n}\n\ninterface ArdoProviderProps {\n config: ArdoConfig\n sidebar: SidebarItem[]\n currentPage?: PageData\n children: ReactNode\n}\n\nexport function ArdoProvider({ config, sidebar, currentPage, children }: ArdoProviderProps) {\n return (\n <ArdoContext.Provider value={{ config, sidebar, currentPage }}>{children}</ArdoContext.Provider>\n )\n}\n\nexport { ArdoContext }\n"],"mappings":";AAAA,SAAS,eAAe,kBAAkC;AAqDtD;AA5CJ,IAAM,cAAc,cAAuC,IAAI;AAExD,SAAS,iBAAmC;AACjD,QAAM,UAAU,WAAW,WAAW;AACtC,MAAI,CAAC,SAAS;AACZ,UAAM,IAAI,MAAM,oDAAoD;AAAA,EACtE;AACA,SAAO;AACT;AAEO,SAAS,YAAwB;AACtC,QAAM,EAAE,OAAO,IAAI,eAAe;AAClC,SAAO;AACT;AAEO,SAAS,iBAA8B;AAC5C,QAAM,EAAE,OAAO,IAAI,eAAe;AAClC,SAAO,OAAO,eAAe,CAAC;AAChC;AAEO,SAAS,aAA4B;AAC1C,QAAM,EAAE,QAAQ,IAAI,eAAe;AACnC,SAAO;AACT;AAEO,SAAS,cAAoC;AAClD,QAAM,EAAE,YAAY,IAAI,eAAe;AACvC,SAAO;AACT;AAEO,SAAS,SAAoB;AAClC,QAAM,EAAE,YAAY,IAAI,eAAe;AACvC,SAAO,aAAa,OAAO,CAAC;AAC9B;AASO,SAAS,aAAa,EAAE,QAAQ,SAAS,aAAa,SAAS,GAAsB;AAC1F,SACE,oBAAC,YAAY,UAAZ,EAAqB,OAAO,EAAE,QAAQ,SAAS,YAAY,GAAI,UAAS;AAE7E;","names":[]}