ardo 2.2.1 → 2.3.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.
@@ -437,6 +437,8 @@ interface HeroAction {
437
437
  link: RoutePath | ExternalUrl;
438
438
  /** Visual theme: "brand" for primary, "alt" for secondary */
439
439
  theme?: "brand" | "alt";
440
+ /** Optional icon as ReactNode (e.g. Lucide icon component) */
441
+ icon?: ReactNode;
440
442
  }
441
443
  interface HeroImage {
442
444
  /** Image for light mode */
@@ -465,14 +467,16 @@ interface HeroProps {
465
467
  *
466
468
  * @example
467
469
  * ```tsx
470
+ * import { ArrowRight, Github } from "lucide-react"
471
+ *
468
472
  * <Hero
469
473
  * name="Ardo"
470
474
  * text="React-first Documentation"
471
475
  * tagline="Build beautiful documentation sites with React."
472
476
  * image="/logo.svg"
473
477
  * actions={[
474
- * { text: "Get Started", link: "/guide/getting-started", theme: "brand" },
475
- * { text: "GitHub", link: "https://github.com/...", theme: "alt" }
478
+ * { text: "Get Started", link: "/guide/getting-started", theme: "brand", icon: <ArrowRight size={16} /> },
479
+ * { text: "GitHub", link: "https://github.com/...", theme: "alt", icon: <Github size={16} /> }
476
480
  * ]}
477
481
  * />
478
482
  * ```
@@ -808,7 +808,7 @@ function HomePage() {
808
808
 
809
809
  // src/ui/components/Hero.tsx
810
810
  import { Link as Link4 } from "react-router";
811
- import { jsx as jsx11, jsxs as jsxs11 } from "react/jsx-runtime";
811
+ import { Fragment as Fragment2, jsx as jsx11, jsxs as jsxs11 } from "react/jsx-runtime";
812
812
  function Hero({ name, text, tagline, image, actions, className }) {
813
813
  const imageUrl = typeof image === "string" ? image : image?.light;
814
814
  const imageAlt = typeof image === "string" ? name : image?.alt ?? name;
@@ -822,6 +822,10 @@ function Hero({ name, text, tagline, image, actions, className }) {
822
822
  const link = action.link;
823
823
  const isExternal = typeof link === "string" && (link.startsWith("http://") || link.startsWith("https://"));
824
824
  const className2 = `ardo-hero-action ardo-hero-action-${action.theme || "brand"}`;
825
+ const content = /* @__PURE__ */ jsxs11(Fragment2, { children: [
826
+ action.icon,
827
+ action.text
828
+ ] });
825
829
  if (isExternal) {
826
830
  return /* @__PURE__ */ jsx11(
827
831
  "a",
@@ -830,12 +834,12 @@ function Hero({ name, text, tagline, image, actions, className }) {
830
834
  className: className2,
831
835
  target: "_blank",
832
836
  rel: "noopener noreferrer",
833
- children: action.text
837
+ children: content
834
838
  },
835
839
  index
836
840
  );
837
841
  }
838
- return /* @__PURE__ */ jsx11(Link4, { to: link, className: className2, children: action.text }, index);
842
+ return /* @__PURE__ */ jsx11(Link4, { to: link, className: className2, children: content }, index);
839
843
  }) })
840
844
  ] })
841
845
  ] }) });
@@ -895,4 +899,4 @@ export {
895
899
  FeatureCard,
896
900
  Features
897
901
  };
898
- //# sourceMappingURL=chunk-6U5CYV74.js.map
902
+ //# sourceMappingURL=chunk-5CP4OM3G.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/ui/Layout.tsx","../src/ui/Header.tsx","../src/ui/components/ThemeToggle.tsx","../src/ui/components/Search.tsx","../src/ui/Sidebar.tsx","../src/ui/Footer.tsx","../src/ui/Nav.tsx","../src/ui/TOC.tsx","../src/ui/DocPage.tsx","../src/ui/HomePage.tsx","../src/ui/components/Hero.tsx","../src/ui/components/Features.tsx"],"sourcesContent":["import { type ReactNode } from \"react\"\n\n// =============================================================================\n// Layout Component\n// =============================================================================\n\nexport interface LayoutProps {\n /** Header content */\n header?: ReactNode\n /** Sidebar content */\n sidebar?: ReactNode\n /** Footer content */\n footer?: ReactNode\n /** Main content */\n children: ReactNode\n /** Additional CSS classes */\n className?: string\n}\n\n/**\n * Layout component with explicit slot props.\n *\n * @example\n * ```tsx\n * <Layout\n * header={<Header logo=\"/logo.svg\" title=\"Ardo\" nav={...} />}\n * sidebar={<Sidebar>...</Sidebar>}\n * footer={<Footer message=\"MIT License\" />}\n * >\n * <Outlet />\n * </Layout>\n * ```\n */\nexport function Layout({ header, sidebar, footer, children, className }: LayoutProps) {\n return (\n <div className={className ?? \"ardo-layout\"}>\n {header}\n <div className=\"ardo-layout-container\">\n {sidebar}\n <main className=\"ardo-main\">{children}</main>\n </div>\n {footer}\n </div>\n )\n}\n","import { useState, type ReactNode } from \"react\"\nimport { Link } from \"react-router\"\nimport { ThemeToggle } from \"./components/ThemeToggle\"\nimport { Search } from \"./components/Search\"\n\n// =============================================================================\n// Header Component\n// =============================================================================\n\nexport interface HeaderProps {\n /** Logo image URL or light/dark variants */\n logo?: string | { light: string; dark: string }\n /** Site title displayed next to logo */\n title?: string\n /** Navigation content (Nav component or custom) */\n nav?: ReactNode\n /** Actions/right side content (social links, custom buttons) */\n actions?: ReactNode\n /** Show search (default: true) */\n search?: boolean\n /** Show theme toggle (default: true) */\n themeToggle?: boolean\n /** Additional CSS classes */\n className?: string\n}\n\n/**\n * Header component with explicit slot props.\n *\n * @example\n * ```tsx\n * <Header\n * logo=\"/logo.svg\"\n * title=\"Ardo\"\n * nav={\n * <Nav>\n * <NavLink to=\"/guide\">Guide</NavLink>\n * <NavLink to=\"/api\">API</NavLink>\n * </Nav>\n * }\n * actions={\n * <SocialLink href=\"https://github.com/...\" icon=\"github\" />\n * }\n * />\n * ```\n */\nexport function Header({\n logo,\n title,\n nav,\n actions,\n search = true,\n themeToggle = true,\n className,\n}: HeaderProps) {\n const [mobileMenuOpen, setMobileMenuOpen] = useState(false)\n\n return (\n <header className={className ?? \"ardo-header\"}>\n <div className=\"ardo-header-container\">\n {/* Left: Mobile menu button + Logo/Title */}\n <div className=\"ardo-header-left\">\n <button\n className=\"ardo-mobile-menu-button\"\n onClick={() => setMobileMenuOpen(!mobileMenuOpen)}\n aria-label=\"Toggle menu\"\n aria-expanded={mobileMenuOpen}\n >\n <span className=\"ardo-hamburger\">\n <span></span>\n <span></span>\n <span></span>\n </span>\n </button>\n\n <Link to=\"/\" className=\"ardo-logo-link\">\n {logo && (\n <img\n src={typeof logo === \"string\" ? logo : logo.light}\n alt={title ?? \"Logo\"}\n className=\"ardo-logo\"\n />\n )}\n {title && <span className=\"ardo-site-title\">{title}</span>}\n </Link>\n </div>\n\n {/* Center: Navigation */}\n {nav && <div className=\"ardo-nav\">{nav}</div>}\n\n {/* Right: Search, Theme Toggle, Actions */}\n <div className=\"ardo-header-right\">\n {search && <Search />}\n {themeToggle && <ThemeToggle />}\n {actions}\n </div>\n </div>\n\n {/* Mobile menu */}\n {mobileMenuOpen && (\n <div className=\"ardo-mobile-menu\">\n <nav className=\"ardo-mobile-nav\" onClick={() => setMobileMenuOpen(false)}>\n {nav}\n </nav>\n </div>\n )}\n </header>\n )\n}\n\n// =============================================================================\n// SocialLink Component\n// =============================================================================\n\nexport interface SocialLinkProps {\n /** URL to link to */\n href: string\n /** Social icon type */\n icon: \"github\" | \"twitter\" | \"discord\" | \"linkedin\" | \"youtube\" | \"npm\"\n /** Accessible label */\n ariaLabel?: string\n /** Additional CSS classes */\n className?: string\n}\n\n/**\n * Social media link with icon.\n *\n * @example\n * ```tsx\n * <SocialLink href=\"https://github.com/...\" icon=\"github\" />\n * ```\n */\nexport function SocialLink({ href, icon, ariaLabel, className }: SocialLinkProps) {\n return (\n <a\n href={href}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className={className ?? \"ardo-social-link\"}\n aria-label={ariaLabel ?? icon}\n >\n <SocialIcon icon={icon} />\n </a>\n )\n}\n\n// =============================================================================\n// Social Icon Component (internal)\n// =============================================================================\n\nfunction SocialIcon({ icon }: { icon: string }) {\n const icons: Record<string, string> = {\n github:\n \"M12 2C6.477 2 2 6.477 2 12c0 4.42 2.865 8.166 6.839 9.489.5.092.682-.217.682-.482 0-.237-.008-.866-.013-1.7-2.782.604-3.369-1.34-3.369-1.34-.454-1.156-1.11-1.463-1.11-1.463-.908-.62.069-.608.069-.608 1.003.07 1.531 1.03 1.531 1.03.892 1.529 2.341 1.087 2.91.831.092-.646.35-1.086.636-1.336-2.22-.253-4.555-1.11-4.555-4.943 0-1.091.39-1.984 1.029-2.683-.103-.253-.446-1.27.098-2.647 0 0 .84-.269 2.75 1.025A9.564 9.564 0 0112 6.844c.85.004 1.705.115 2.504.337 1.909-1.294 2.747-1.025 2.747-1.025.546 1.377.203 2.394.1 2.647.64.699 1.028 1.592 1.028 2.683 0 3.842-2.339 4.687-4.566 4.935.359.309.678.919.678 1.852 0 1.336-.012 2.415-.012 2.743 0 .267.18.578.688.48C19.138 20.163 22 16.418 22 12c0-5.523-4.477-10-10-10z\",\n twitter:\n \"M23.953 4.57a10 10 0 01-2.825.775 4.958 4.958 0 002.163-2.723c-.951.555-2.005.959-3.127 1.184a4.92 4.92 0 00-8.384 4.482C7.69 8.095 4.067 6.13 1.64 3.162a4.822 4.822 0 00-.666 2.475c0 1.71.87 3.213 2.188 4.096a4.904 4.904 0 01-2.228-.616v.06a4.923 4.923 0 003.946 4.827 4.996 4.996 0 01-2.212.085 4.936 4.936 0 004.604 3.417 9.867 9.867 0 01-6.102 2.105c-.39 0-.779-.023-1.17-.067a13.995 13.995 0 007.557 2.209c9.053 0 13.998-7.496 13.998-13.985 0-.21 0-.42-.015-.63A9.935 9.935 0 0024 4.59z\",\n discord:\n \"M20.317 4.37a19.791 19.791 0 00-4.885-1.515.074.074 0 00-.079.037c-.21.375-.444.864-.608 1.25a18.27 18.27 0 00-5.487 0 12.64 12.64 0 00-.617-1.25.077.077 0 00-.079-.037A19.736 19.736 0 003.677 4.37a.07.07 0 00-.032.027C.533 9.046-.32 13.58.099 18.057a.082.082 0 00.031.057 19.9 19.9 0 005.993 3.03.078.078 0 00.084-.028 14.09 14.09 0 001.226-1.994.076.076 0 00-.041-.106 13.107 13.107 0 01-1.872-.892.077.077 0 01-.008-.128 10.2 10.2 0 00.372-.292.074.074 0 01.077-.01c3.928 1.793 8.18 1.793 12.062 0a.074.074 0 01.078.01c.12.098.246.198.373.292a.077.077 0 01-.006.127 12.299 12.299 0 01-1.873.892.077.077 0 00-.041.107c.36.698.772 1.362 1.225 1.993a.076.076 0 00.084.028 19.839 19.839 0 006.002-3.03.077.077 0 00.032-.054c.5-5.177-.838-9.674-3.549-13.66a.061.061 0 00-.031-.03zM8.02 15.33c-1.183 0-2.157-1.085-2.157-2.419 0-1.333.956-2.419 2.157-2.419 1.21 0 2.176 1.096 2.157 2.42 0 1.333-.956 2.418-2.157 2.418zm7.975 0c-1.183 0-2.157-1.085-2.157-2.419 0-1.333.955-2.419 2.157-2.419 1.21 0 2.176 1.096 2.157 2.42 0 1.333-.946 2.418-2.157 2.418z\",\n linkedin:\n \"M20.447 20.452h-3.554v-5.569c0-1.328-.027-3.037-1.852-3.037-1.853 0-2.136 1.445-2.136 2.939v5.667H9.351V9h3.414v1.561h.046c.477-.9 1.637-1.85 3.37-1.85 3.601 0 4.267 2.37 4.267 5.455v6.286zM5.337 7.433a2.062 2.062 0 01-2.063-2.065 2.064 2.064 0 112.063 2.065zm1.782 13.019H3.555V9h3.564v11.452zM22.225 0H1.771C.792 0 0 .774 0 1.729v20.542C0 23.227.792 24 1.771 24h20.451C23.2 24 24 23.227 24 22.271V1.729C24 .774 23.2 0 22.222 0h.003z\",\n youtube:\n \"M23.498 6.186a3.016 3.016 0 00-2.122-2.136C19.505 3.545 12 3.545 12 3.545s-7.505 0-9.377.505A3.017 3.017 0 00.502 6.186C0 8.07 0 12 0 12s0 3.93.502 5.814a3.016 3.016 0 002.122 2.136c1.871.505 9.376.505 9.376.505s7.505 0 9.377-.505a3.015 3.015 0 002.122-2.136C24 15.93 24 12 24 12s0-3.93-.502-5.814zM9.545 15.568V8.432L15.818 12l-6.273 3.568z\",\n npm: \"M1.763 0C.786 0 0 .786 0 1.763v20.474C0 23.214.786 24 1.763 24h20.474c.977 0 1.763-.786 1.763-1.763V1.763C24 .786 23.214 0 22.237 0zM5.13 5.323l13.837.019-.009 13.836h-3.464l.01-10.382h-3.456L12.04 19.17H5.113z\",\n }\n\n const path = icons[icon] || icons.github\n\n return (\n <svg viewBox=\"0 0 24 24\" width=\"20\" height=\"20\" fill=\"currentColor\">\n <path d={path} />\n </svg>\n )\n}\n","import { useState, useEffect } from \"react\"\n\ntype Theme = \"light\" | \"dark\" | \"system\"\n\nexport function ThemeToggle() {\n const [theme, setTheme] = useState<Theme>(\"system\")\n const [mounted, setMounted] = useState(false)\n\n useEffect(() => {\n setMounted(true)\n\n const stored = localStorage.getItem(\"ardo-theme\") as Theme | null\n if (stored) {\n setTheme(stored)\n applyTheme(stored)\n } else {\n applyTheme(\"system\")\n }\n }, [])\n\n const toggleTheme = () => {\n const nextTheme: Theme = theme === \"light\" ? \"dark\" : theme === \"dark\" ? \"system\" : \"light\"\n setTheme(nextTheme)\n localStorage.setItem(\"ardo-theme\", nextTheme)\n applyTheme(nextTheme)\n }\n\n if (!mounted) {\n return (\n <button className=\"ardo-theme-toggle\" aria-label=\"Toggle theme\">\n <span className=\"ardo-theme-icon\">\n <SunIcon />\n </span>\n </button>\n )\n }\n\n return (\n <button\n className=\"ardo-theme-toggle\"\n onClick={toggleTheme}\n aria-label={`Switch to ${theme === \"light\" ? \"dark\" : theme === \"dark\" ? \"system\" : \"light\"} theme`}\n >\n <span className=\"ardo-theme-icon\">\n {theme === \"light\" && <SunIcon />}\n {theme === \"dark\" && <MoonIcon />}\n {theme === \"system\" && <SystemIcon />}\n </span>\n </button>\n )\n}\n\nfunction applyTheme(theme: Theme) {\n const root = document.documentElement\n\n if (theme === \"system\") {\n const isDark = window.matchMedia(\"(prefers-color-scheme: dark)\").matches\n root.classList.toggle(\"dark\", isDark)\n root.classList.toggle(\"light\", !isDark)\n } else {\n root.classList.toggle(\"dark\", theme === \"dark\")\n root.classList.toggle(\"light\", theme === \"light\")\n }\n}\n\nfunction SunIcon() {\n return (\n <svg\n viewBox=\"0 0 24 24\"\n width=\"20\"\n height=\"20\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n >\n <circle cx=\"12\" cy=\"12\" r=\"5\" />\n <line x1=\"12\" y1=\"1\" x2=\"12\" y2=\"3\" />\n <line x1=\"12\" y1=\"21\" x2=\"12\" y2=\"23\" />\n <line x1=\"4.22\" y1=\"4.22\" x2=\"5.64\" y2=\"5.64\" />\n <line x1=\"18.36\" y1=\"18.36\" x2=\"19.78\" y2=\"19.78\" />\n <line x1=\"1\" y1=\"12\" x2=\"3\" y2=\"12\" />\n <line x1=\"21\" y1=\"12\" x2=\"23\" y2=\"12\" />\n <line x1=\"4.22\" y1=\"19.78\" x2=\"5.64\" y2=\"18.36\" />\n <line x1=\"18.36\" y1=\"5.64\" x2=\"19.78\" y2=\"4.22\" />\n </svg>\n )\n}\n\nfunction MoonIcon() {\n return (\n <svg\n viewBox=\"0 0 24 24\"\n width=\"20\"\n height=\"20\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n >\n <path d=\"M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79z\" />\n </svg>\n )\n}\n\nfunction SystemIcon() {\n return (\n <svg\n viewBox=\"0 0 24 24\"\n width=\"20\"\n height=\"20\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n >\n <rect x=\"2\" y=\"3\" width=\"20\" height=\"14\" rx=\"2\" ry=\"2\" />\n <line x1=\"8\" y1=\"21\" x2=\"16\" y2=\"21\" />\n <line x1=\"12\" y1=\"17\" x2=\"12\" y2=\"21\" />\n </svg>\n )\n}\n","import { useState, useEffect, useRef, useMemo } from \"react\"\nimport { Link, useNavigate } from \"react-router\"\nimport { useThemeConfig } from \"../../runtime/hooks\"\nimport MiniSearch, { type SearchResult } from \"minisearch\"\nimport searchDocs from \"virtual:ardo/search-index\"\n\ninterface SearchDoc {\n id: string\n title: string\n content: string\n path: string\n section?: string\n}\n\nexport function Search() {\n const navigate = useNavigate()\n const [isOpen, setIsOpen] = useState(false)\n const [query, setQuery] = useState(\"\")\n const [results, setResults] = useState<SearchResult[]>([])\n const [selectedIndex, setSelectedIndex] = useState(0)\n const containerRef = useRef<HTMLDivElement>(null)\n const inputRef = useRef<HTMLInputElement>(null)\n const themeConfig = useThemeConfig()\n const hasQuery = query.trim().length > 0\n\n const placeholder = themeConfig.search?.placeholder ?? \"Search...\"\n\n useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n if ((e.metaKey || e.ctrlKey) && e.key === \"k\") {\n e.preventDefault()\n inputRef.current?.focus()\n setIsOpen(true)\n }\n\n if (e.key === \"Escape\") {\n setIsOpen(false)\n }\n }\n\n document.addEventListener(\"keydown\", handleKeyDown)\n return () => document.removeEventListener(\"keydown\", handleKeyDown)\n }, [])\n\n useEffect(() => {\n if (isOpen && inputRef.current) {\n inputRef.current.focus()\n }\n }, [isOpen])\n\n useEffect(() => {\n if (!isOpen) {\n return\n }\n\n const handleOutsideClick = (e: MouseEvent | TouchEvent) => {\n if (containerRef.current && !containerRef.current.contains(e.target as Node)) {\n setIsOpen(false)\n }\n }\n\n document.addEventListener(\"mousedown\", handleOutsideClick)\n document.addEventListener(\"touchstart\", handleOutsideClick)\n return () => {\n document.removeEventListener(\"mousedown\", handleOutsideClick)\n document.removeEventListener(\"touchstart\", handleOutsideClick)\n }\n }, [isOpen])\n\n // Build search index from virtual module data\n const searchIndex = useMemo(() => {\n const index = new MiniSearch<SearchDoc>({\n fields: [\"title\", \"content\", \"section\"],\n storeFields: [\"title\", \"path\", \"section\"],\n searchOptions: {\n boost: { title: 2 },\n fuzzy: 0.2,\n prefix: true,\n },\n })\n index.addAll(searchDocs as SearchDoc[])\n return index\n }, [])\n\n const handleSearch = (searchQuery: string) => {\n setQuery(searchQuery)\n\n if (!searchQuery.trim()) {\n setResults([])\n setIsOpen(false)\n setSelectedIndex(0)\n return\n }\n\n const searchResults = searchIndex.search(searchQuery).slice(0, 10)\n setResults(searchResults)\n setSelectedIndex(0)\n setIsOpen(true)\n }\n\n const handleKeyDown = (e: React.KeyboardEvent) => {\n if (e.key === \"ArrowDown\" && results.length > 0) {\n e.preventDefault()\n setSelectedIndex((prev) => Math.min(prev + 1, results.length - 1))\n } else if (e.key === \"ArrowUp\" && results.length > 0) {\n e.preventDefault()\n setSelectedIndex((prev) => Math.max(prev - 1, 0))\n } else if (e.key === \"Enter\" && results[selectedIndex]) {\n e.preventDefault()\n const result = results[selectedIndex]\n navigate(result.path as string)\n setIsOpen(false)\n } else if (e.key === \"Escape\") {\n setIsOpen(false)\n inputRef.current?.blur()\n }\n }\n\n return (\n <div\n className=\"ardo-search\"\n ref={containerRef}\n data-expanded={isOpen || hasQuery ? \"true\" : \"false\"}\n onClick={() => inputRef.current?.focus()}\n >\n <div className=\"ardo-search-field\">\n <SearchIcon />\n <input\n ref={inputRef}\n type=\"text\"\n className=\"ardo-search-input\"\n placeholder={placeholder}\n value={query}\n onChange={(e) => handleSearch(e.target.value)}\n onKeyDown={handleKeyDown}\n onFocus={() => {\n if (hasQuery) {\n setIsOpen(true)\n }\n }}\n aria-expanded={isOpen}\n aria-label=\"Search\"\n />\n {query && (\n <button\n type=\"button\"\n className=\"ardo-search-clear\"\n onClick={(e) => {\n e.stopPropagation()\n handleSearch(\"\")\n inputRef.current?.focus()\n }}\n aria-label=\"Clear search\"\n >\n ×\n </button>\n )}\n <span className=\"ardo-search-kbd\">\n <kbd>⌘</kbd>\n <kbd>K</kbd>\n </span>\n </div>\n\n {isOpen && hasQuery && (\n <div className=\"ardo-search-popover\">\n {results.length > 0 && (\n <ul className=\"ardo-search-results\">\n {results.map((result, index) => (\n <li key={result.id}>\n <Link\n to={result.path as string}\n className={[\"ardo-search-result\", index === selectedIndex && \"selected\"]\n .filter(Boolean)\n .join(\" \")}\n onClick={() => setIsOpen(false)}\n >\n <span className=\"ardo-search-result-title\">{result.title as string}</span>\n {result.section && (\n <span className=\"ardo-search-result-section\">{result.section as string}</span>\n )}\n </Link>\n </li>\n ))}\n </ul>\n )}\n\n {query && results.length === 0 && (\n <div className=\"ardo-search-no-results\">No results found for \"{query}\"</div>\n )}\n\n <div className=\"ardo-search-footer\">\n <span>\n <kbd>↑</kbd> <kbd>↓</kbd> to navigate\n </span>\n <span>\n <kbd>↵</kbd> to select\n </span>\n <span>\n <kbd>esc</kbd> to close\n </span>\n </div>\n </div>\n )}\n </div>\n )\n}\n\nfunction SearchIcon() {\n return (\n <svg\n viewBox=\"0 0 24 24\"\n width=\"18\"\n height=\"18\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n >\n <circle cx=\"11\" cy=\"11\" r=\"8\" />\n <line x1=\"21\" y1=\"21\" x2=\"16.65\" y2=\"16.65\" />\n </svg>\n )\n}\n","import {\n useState,\n type ReactNode,\n type ComponentProps,\n Children,\n isValidElement,\n createContext,\n useContext,\n} from \"react\"\nimport { NavLink, useLocation } from \"react-router\"\nimport type { SidebarItem as SidebarItemType } from \"../config/types\"\n\n/** Route path type - uses React Router's NavLink 'to' prop type for type-safe routes */\ntype RoutePath = ComponentProps<typeof NavLink>[\"to\"]\n\n// =============================================================================\n// Sidebar Context\n// =============================================================================\n\ninterface SidebarContextValue {\n currentPath: string\n}\n\nconst SidebarContext = createContext<SidebarContextValue>({ currentPath: \"\" })\n\nfunction useSidebarContext() {\n return useContext(SidebarContext)\n}\n\n// =============================================================================\n// Sidebar Component Types\n// =============================================================================\n\nexport interface SidebarProps {\n /** Sidebar items (for data-driven approach) */\n items?: SidebarItemType[]\n /** Children for JSX composition (SidebarGroup, SidebarLink) */\n children?: ReactNode\n /** Additional CSS classes */\n className?: string\n}\n\n// =============================================================================\n// Sidebar Main Component\n// =============================================================================\n\n/**\n * Sidebar component supporting both data-driven and JSX composition patterns.\n *\n * @example Data-driven (items prop)\n * ```tsx\n * <Sidebar items={[\n * { text: 'Introduction', link: '/intro' },\n * { text: 'Guide', items: [\n * { text: 'Getting Started', link: '/guide/getting-started' }\n * ]}\n * ]} />\n * ```\n *\n * @example JSX composition\n * ```tsx\n * <Sidebar>\n * <SidebarLink to=\"/intro\">Introduction</SidebarLink>\n * <SidebarGroup title=\"Guide\">\n * <SidebarLink to=\"/guide/getting-started\">Getting Started</SidebarLink>\n * </SidebarGroup>\n * </Sidebar>\n * ```\n */\nexport function Sidebar({ items, children, className }: SidebarProps) {\n const { pathname } = useLocation()\n\n return (\n <SidebarContext.Provider value={{ currentPath: pathname }}>\n <aside className={className ?? \"ardo-sidebar\"}>\n <nav className=\"ardo-sidebar-nav\">\n {items ? (\n <SidebarItems items={items} depth={0} />\n ) : (\n <ul className=\"ardo-sidebar-list ardo-sidebar-list-0\">{children}</ul>\n )}\n </nav>\n </aside>\n </SidebarContext.Provider>\n )\n}\n\n// =============================================================================\n// SidebarGroup Component\n// =============================================================================\n\nexport interface SidebarGroupProps {\n /** Group title */\n title: string\n /** Optional link for the group title */\n to?: string\n /** Initial collapsed state (default: false) */\n collapsed?: boolean\n /** Whether group is collapsible (default: true if has children) */\n collapsible?: boolean\n /** Children (SidebarLink, nested SidebarGroup) */\n children?: ReactNode\n /** Additional CSS classes */\n className?: string\n}\n\n/**\n * Group component for organizing sidebar links.\n *\n * @example\n * ```tsx\n * <SidebarGroup title=\"Guide\">\n * <SidebarLink to=\"/guide/intro\">Introduction</SidebarLink>\n * <SidebarLink to=\"/guide/setup\">Setup</SidebarLink>\n * </SidebarGroup>\n * ```\n *\n * @example With collapsible state\n * ```tsx\n * <SidebarGroup title=\"Advanced\" collapsed>\n * <SidebarLink to=\"/advanced/config\">Configuration</SidebarLink>\n * </SidebarGroup>\n * ```\n */\nexport function SidebarGroup({\n title,\n to,\n collapsed: initialCollapsed = false,\n collapsible = true,\n children,\n className,\n}: SidebarGroupProps) {\n const [collapsed, setCollapsed] = useState(initialCollapsed)\n const { currentPath } = useSidebarContext()\n\n // Check if any child is active\n const isChildActive = checkChildrenActive(children, currentPath)\n\n const textClassName = [\"ardo-sidebar-text\", isChildActive && \"child-active\"]\n .filter(Boolean)\n .join(\" \")\n\n const linkClassName = [\"ardo-sidebar-link\", isChildActive && \"child-active\"]\n .filter(Boolean)\n .join(\" \")\n\n const hasChildren = Children.count(children) > 0\n\n return (\n <li className={className ?? \"ardo-sidebar-item\"}>\n <div className=\"ardo-sidebar-item-header\">\n {to ? (\n <NavLink\n to={to}\n className={({ isActive }) =>\n [linkClassName, isActive && \"active\"].filter(Boolean).join(\" \")\n }\n >\n {title}\n </NavLink>\n ) : (\n <span\n className={textClassName}\n onClick={() => collapsible && hasChildren && setCollapsed(!collapsed)}\n style={collapsible && hasChildren ? { cursor: \"pointer\" } : undefined}\n >\n {title}\n </span>\n )}\n\n {collapsible && hasChildren && (\n <button\n className={[\"ardo-sidebar-collapse\", collapsed && \"collapsed\"]\n .filter(Boolean)\n .join(\" \")}\n onClick={() => setCollapsed(!collapsed)}\n aria-label={collapsed ? \"Expand\" : \"Collapse\"}\n >\n <svg\n viewBox=\"0 0 24 24\"\n width=\"16\"\n height=\"16\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n >\n <path d=\"M6 9l6 6 6-6\" />\n </svg>\n </button>\n )}\n </div>\n\n {hasChildren && !collapsed && (\n <ul className=\"ardo-sidebar-list ardo-sidebar-list-1\">{children}</ul>\n )}\n </li>\n )\n}\n\n// =============================================================================\n// SidebarLink Component\n// =============================================================================\n\nexport interface SidebarLinkProps {\n /** Internal route path (type-safe with React Router's registered routes) */\n to: RoutePath\n /** Link text */\n children: ReactNode\n /** Additional CSS classes */\n className?: string\n}\n\n/**\n * Sidebar navigation link.\n *\n * @example\n * ```tsx\n * <SidebarLink to=\"/guide/getting-started\">Getting Started</SidebarLink>\n * ```\n */\nexport function SidebarLink({ to, children, className }: SidebarLinkProps) {\n const baseClassName = className ?? \"ardo-sidebar-link\"\n return (\n <li className=\"ardo-sidebar-item\">\n <NavLink\n to={to}\n className={({ isActive }) =>\n [baseClassName, isActive && \"active\"].filter(Boolean).join(\" \")\n }\n >\n {children}\n </NavLink>\n </li>\n )\n}\n\n// =============================================================================\n// Internal: Data-driven sidebar rendering\n// =============================================================================\n\ninterface SidebarItemsProps {\n items: SidebarItemType[]\n depth: number\n}\n\nfunction SidebarItems({ items, depth }: SidebarItemsProps) {\n return (\n <ul className={`ardo-sidebar-list ardo-sidebar-list-${depth}`}>\n {items.map((item, index) => (\n <SidebarItemComponent key={index} item={item} depth={depth} />\n ))}\n </ul>\n )\n}\n\ninterface SidebarItemComponentProps {\n item: SidebarItemType\n depth: number\n}\n\nfunction SidebarItemComponent({ item, depth }: SidebarItemComponentProps) {\n const { currentPath } = useSidebarContext()\n const [collapsed, setCollapsed] = useState(item.collapsed ?? false)\n\n const hasChildren = item.items && item.items.length > 0\n\n const isChildActive =\n hasChildren &&\n item.items!.some(\n (child) =>\n child.link === currentPath ||\n (child.items && child.items.some((grandchild) => grandchild.link === currentPath))\n )\n\n const linkClassName = [\"ardo-sidebar-link\", isChildActive && \"child-active\"]\n .filter(Boolean)\n .join(\" \")\n\n const textClassName = [\"ardo-sidebar-text\", isChildActive && \"child-active\"]\n .filter(Boolean)\n .join(\" \")\n\n return (\n <li className=\"ardo-sidebar-item\">\n <div className=\"ardo-sidebar-item-header\">\n {item.link ? (\n <NavLink\n to={item.link}\n className={({ isActive }) =>\n [linkClassName, isActive && \"active\"].filter(Boolean).join(\" \")\n }\n >\n {item.text}\n </NavLink>\n ) : (\n <span className={textClassName} onClick={() => hasChildren && setCollapsed(!collapsed)}>\n {item.text}\n </span>\n )}\n\n {hasChildren && (\n <button\n className={[\"ardo-sidebar-collapse\", collapsed && \"collapsed\"]\n .filter(Boolean)\n .join(\" \")}\n onClick={() => setCollapsed(!collapsed)}\n aria-label={collapsed ? \"Expand\" : \"Collapse\"}\n >\n <svg\n viewBox=\"0 0 24 24\"\n width=\"16\"\n height=\"16\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n >\n <path d=\"M6 9l6 6 6-6\" />\n </svg>\n </button>\n )}\n </div>\n\n {hasChildren && !collapsed && <SidebarItems items={item.items!} depth={depth + 1} />}\n </li>\n )\n}\n\n// =============================================================================\n// Utility Functions\n// =============================================================================\n\nfunction checkChildrenActive(children: ReactNode, currentPath: string): boolean {\n let isActive = false\n\n Children.forEach(children, (child) => {\n if (isActive) return\n\n if (isValidElement(child)) {\n // Check SidebarLink\n if (child.type === SidebarLink && (child.props as SidebarLinkProps).to === currentPath) {\n isActive = true\n return\n }\n\n // Check nested SidebarGroup\n if (child.type === SidebarGroup) {\n const groupProps = child.props as SidebarGroupProps\n if (groupProps.to === currentPath) {\n isActive = true\n return\n }\n if (groupProps.children && checkChildrenActive(groupProps.children, currentPath)) {\n isActive = true\n return\n }\n }\n }\n })\n\n return isActive\n}\n","import { type ReactNode } from \"react\"\n\n// =============================================================================\n// Footer Component\n// =============================================================================\n\nexport interface FooterProps {\n /** Footer message (supports HTML string) */\n message?: string\n /** Copyright text (supports HTML string) */\n copyright?: string\n /** Custom content (overrides message/copyright) */\n children?: ReactNode\n /** Additional CSS classes */\n className?: string\n}\n\n/**\n * Footer component with message and copyright props.\n *\n * @example Simple usage\n * ```tsx\n * <Footer message=\"MIT License\" copyright=\"2026 Sebastian Software\" />\n * ```\n *\n * @example With HTML\n * ```tsx\n * <Footer\n * message=\"Built with <a href='...'>Ardo</a>\"\n * copyright=\"Copyright &copy; 2026\"\n * />\n * ```\n *\n * @example Custom content\n * ```tsx\n * <Footer>\n * <CustomFooterContent />\n * </Footer>\n * ```\n */\nexport function Footer({ message, copyright, children, className }: FooterProps) {\n const hasContent = message || copyright || children\n\n if (!hasContent) {\n return null\n }\n\n return (\n <footer className={className ?? \"ardo-footer\"}>\n <div className=\"ardo-footer-container\">\n {children ?? (\n <>\n {message && (\n <p className=\"ardo-footer-message\" dangerouslySetInnerHTML={{ __html: message }} />\n )}\n {copyright && (\n <p\n className=\"ardo-footer-copyright\"\n dangerouslySetInnerHTML={{ __html: copyright }}\n />\n )}\n </>\n )}\n </div>\n </footer>\n )\n}\n\n// Type exports for compound pattern (kept for backwards compatibility)\nexport interface FooterMessageProps {\n children: ReactNode\n className?: string\n}\n\nexport interface FooterCopyrightProps {\n children: ReactNode\n className?: string\n}\n","import { type ReactNode, type ComponentProps, useState, createContext, useContext } from \"react\"\nimport { NavLink as RouterNavLink } from \"react-router\"\n\n/** Route path type - uses React Router's NavLink 'to' prop type for type-safe routes */\ntype RoutePath = ComponentProps<typeof RouterNavLink>[\"to\"]\n\n// Nav context for shared state\ninterface NavContextValue {\n mobileMenuOpen: boolean\n setMobileMenuOpen: (open: boolean) => void\n}\n\nconst NavContext = createContext<NavContextValue | null>(null)\n\nfunction useNavContext() {\n return useContext(NavContext)\n}\n\n// =============================================================================\n// Nav Component\n// =============================================================================\n\nexport interface NavProps {\n children?: ReactNode\n className?: string\n}\n\n/**\n * Navigation container component for composing navigation links.\n *\n * @example\n * ```tsx\n * <Nav>\n * <NavLink to=\"/guide\">Guide</NavLink>\n * <NavLink to=\"/api\">API</NavLink>\n * <NavLink href=\"https://github.com/...\">GitHub</NavLink>\n * </Nav>\n * ```\n */\nexport function Nav({ children, className }: NavProps) {\n return <nav className={className ?? \"ardo-nav\"}>{children}</nav>\n}\n\n// =============================================================================\n// NavLink Component\n// =============================================================================\n\nexport interface NavLinkProps {\n /** Internal route path (type-safe with React Router's registered routes) */\n to?: RoutePath\n /** External URL (uses anchor tag) */\n href?: string\n /** Link text or children */\n children: ReactNode\n /** Additional CSS classes */\n className?: string\n /** Active state match pattern */\n activeMatch?: string\n}\n\n/**\n * Navigation link component supporting both internal routes and external URLs.\n *\n * @example\n * ```tsx\n * // Internal link\n * <NavLink to=\"/guide\">Guide</NavLink>\n *\n * // External link\n * <NavLink href=\"https://github.com/...\">GitHub</NavLink>\n * ```\n */\nexport function NavLink({\n to,\n href,\n children,\n className,\n activeMatch: _activeMatch,\n}: NavLinkProps) {\n const navContext = useNavContext()\n const baseClassName = className ?? \"ardo-nav-link\"\n\n // Handle click for mobile menu\n const handleClick = () => {\n navContext?.setMobileMenuOpen(false)\n }\n\n // External link\n if (href) {\n return (\n <a\n href={href}\n className={baseClassName}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n onClick={handleClick}\n >\n {children}\n </a>\n )\n }\n\n // Internal link\n if (to) {\n return (\n <RouterNavLink\n to={to}\n className={({ isActive }: { isActive: boolean }) =>\n [baseClassName, isActive && \"active\"].filter(Boolean).join(\" \")\n }\n onClick={handleClick}\n >\n {children}\n </RouterNavLink>\n )\n }\n\n // Text-only (no link)\n return <span className={baseClassName}>{children}</span>\n}\n\n// =============================================================================\n// NavDropdown Component\n// =============================================================================\n\nexport interface NavDropdownProps {\n /** Dropdown trigger text */\n text: string\n /** Dropdown items */\n children: ReactNode\n /** Additional CSS classes */\n className?: string\n}\n\n/**\n * Dropdown navigation menu for grouping related links.\n *\n * @example\n * ```tsx\n * <NavDropdown text=\"Resources\">\n * <NavLink to=\"/docs\">Documentation</NavLink>\n * <NavLink to=\"/blog\">Blog</NavLink>\n * </NavDropdown>\n * ```\n */\nexport function NavDropdown({ text, children, className }: NavDropdownProps) {\n const [open, setOpen] = useState(false)\n\n return (\n <div\n className={className ?? \"ardo-nav-dropdown\"}\n onMouseEnter={() => setOpen(true)}\n onMouseLeave={() => setOpen(false)}\n >\n <button className=\"ardo-nav-dropdown-button\">\n {text}\n <span className=\"ardo-nav-dropdown-icon\">▼</span>\n </button>\n {open && <div className=\"ardo-nav-dropdown-menu\">{children}</div>}\n </div>\n )\n}\n\n// =============================================================================\n// NavProvider Component\n// =============================================================================\n\nexport interface NavProviderProps {\n children: ReactNode\n}\n\n/**\n * Provider for Nav context (mobile menu state).\n * Used internally by Header component.\n */\nexport function NavProvider({ children }: NavProviderProps) {\n const [mobileMenuOpen, setMobileMenuOpen] = useState(false)\n\n return (\n <NavContext.Provider value={{ mobileMenuOpen, setMobileMenuOpen }}>\n {children}\n </NavContext.Provider>\n )\n}\n\n// Export context hook for external use\nexport { useNavContext }\n","import { useState, useEffect } from \"react\"\nimport { useTOC, useThemeConfig } from \"../runtime/hooks\"\nimport type { TOCItem } from \"../config/types\"\n\nexport function TOC() {\n const toc = useTOC()\n const themeConfig = useThemeConfig()\n const [activeId, setActiveId] = useState<string>(\"\")\n\n const label = themeConfig.outline?.label ?? \"On this page\"\n\n useEffect(() => {\n if (toc.length === 0) return\n\n const headingElements = toc.map((item) => document.getElementById(item.id)).filter(Boolean)\n\n if (headingElements.length === 0) return\n\n const observer = new IntersectionObserver(\n (entries) => {\n for (const entry of entries) {\n if (entry.isIntersecting) {\n setActiveId(entry.target.id)\n break\n }\n }\n },\n {\n rootMargin: \"-80px 0px -80% 0px\",\n threshold: 0,\n }\n )\n\n headingElements.forEach((el) => el && observer.observe(el))\n\n return () => {\n headingElements.forEach((el) => el && observer.unobserve(el))\n }\n }, [toc])\n\n if (toc.length === 0) {\n return null\n }\n\n return (\n <aside className=\"ardo-toc\">\n <div className=\"ardo-toc-container\">\n <h3 className=\"ardo-toc-title\">{label}</h3>\n <nav className=\"ardo-toc-nav\">\n <TOCItems items={toc} activeId={activeId} />\n </nav>\n </div>\n </aside>\n )\n}\n\ninterface TOCItemsProps {\n items: TOCItem[]\n activeId: string\n}\n\nfunction TOCItems({ items, activeId }: TOCItemsProps) {\n return (\n <ul className=\"ardo-toc-list\">\n {items.map((item) => (\n <TOCItemComponent key={item.id} item={item} activeId={activeId} />\n ))}\n </ul>\n )\n}\n\ninterface TOCItemComponentProps {\n item: TOCItem\n activeId: string\n}\n\nfunction TOCItemComponent({ item, activeId }: TOCItemComponentProps) {\n const isActive = item.id === activeId\n const hasActiveChild = hasActiveDescendant(item, activeId)\n\n return (\n <li className=\"ardo-toc-item\">\n <a\n href={`#${item.id}`}\n className={[\n `ardo-toc-link ardo-toc-link-${item.level}`,\n isActive && \"active\",\n hasActiveChild && \"child-active\",\n ]\n .filter(Boolean)\n .join(\" \")}\n onClick={(e) => {\n e.preventDefault()\n const element = document.getElementById(item.id)\n if (element) {\n element.scrollIntoView({ behavior: \"smooth\" })\n window.history.pushState(null, \"\", `#${item.id}`)\n }\n }}\n >\n {item.text}\n </a>\n {item.children && item.children.length > 0 && (\n <TOCItems items={item.children} activeId={activeId} />\n )}\n </li>\n )\n}\n\nfunction hasActiveDescendant(item: TOCItem, activeId: string): boolean {\n if (!item.children) return false\n\n for (const child of item.children) {\n if (child.id === activeId) return true\n if (hasActiveDescendant(child, activeId)) return true\n }\n\n return false\n}\n","import { type ReactNode } from \"react\"\nimport { usePageData } from \"../runtime/hooks\"\nimport { Layout } from \"./Layout\"\nimport { Content } from \"./Content\"\nimport { TOC } from \"./TOC\"\n\n// =============================================================================\n// DocPage Component (includes Layout - for backwards compatibility)\n// =============================================================================\n\ninterface DocPageProps {\n children: ReactNode\n}\n\n/**\n * Full documentation page with Layout wrapper.\n * Use this when you don't have a _layout.tsx file.\n *\n * @example\n * ```tsx\n * <DocPage>\n * <Content />\n * </DocPage>\n * ```\n */\nexport function DocPage({ children }: DocPageProps) {\n const pageData = usePageData()\n const showToc =\n pageData?.frontmatter.outline !== false && pageData?.toc && pageData.toc.length > 0\n\n return (\n <Layout>\n <div className=\"ardo-doc-page\">\n <Content>{children}</Content>\n {showToc && <TOC />}\n </div>\n </Layout>\n )\n}\n\n// =============================================================================\n// DocContent Component (without Layout - for use with _layout.tsx)\n// =============================================================================\n\ninterface DocContentProps {\n children: ReactNode\n}\n\n/**\n * Documentation content without Layout wrapper.\n * Use this when you have a _layout.tsx that provides the Layout.\n *\n * @example\n * ```tsx\n * // In _layout.tsx:\n * <Layout>\n * <Header ... />\n * <Sidebar ... />\n * <Outlet />\n * <Footer ... />\n * </Layout>\n *\n * // In page routes:\n * <DocContent>\n * <MarkdownContent />\n * </DocContent>\n * ```\n */\nexport function DocContent({ children }: DocContentProps) {\n const pageData = usePageData()\n const showToc =\n pageData?.frontmatter.outline !== false && pageData?.toc && pageData.toc.length > 0\n\n return (\n <div className=\"ardo-doc-page\">\n <Content>{children}</Content>\n {showToc && <TOC />}\n </div>\n )\n}\n\n// =============================================================================\n// DocLayout Component (legacy alias)\n// =============================================================================\n\ninterface DocLayoutProps {\n content: ReactNode\n}\n\n/**\n * @deprecated Use DocPage or DocContent instead\n */\nexport function DocLayout({ content }: DocLayoutProps) {\n return <DocPage>{content}</DocPage>\n}\n","import { Link } from \"react-router\"\nimport { usePageData, useConfig, useThemeConfig } from \"../runtime/hooks\"\nimport { Header, SocialLink } from \"./Header\"\nimport { Footer } from \"./Footer\"\nimport { Nav, NavLink } from \"./Nav\"\n\nexport function HomePage() {\n const pageData = usePageData()\n const config = useConfig()\n const themeConfig = useThemeConfig()\n\n const hero = pageData?.frontmatter.hero\n const features = pageData?.frontmatter.features\n\n return (\n <div className=\"ardo-home\">\n <Header\n logo={themeConfig.logo}\n title={themeConfig.siteTitle !== false ? config.title : undefined}\n nav={\n themeConfig.nav && themeConfig.nav.length > 0 ? (\n <Nav>\n {themeConfig.nav.map((item, index) => (\n <NavLink key={index} to={item.link}>\n {item.text}\n </NavLink>\n ))}\n </Nav>\n ) : undefined\n }\n actions={themeConfig.socialLinks?.map((link, index) => (\n <SocialLink key={index} href={link.link} icon={link.icon} ariaLabel={link.ariaLabel} />\n ))}\n />\n\n <main className=\"ardo-home-main\">\n {hero && (\n <section className=\"ardo-hero\">\n <div className=\"ardo-hero-container\">\n {hero.image && (\n <div className=\"ardo-hero-image\">\n <img\n src={typeof hero.image === \"string\" ? hero.image : hero.image.light}\n alt={hero.name || config.title}\n />\n </div>\n )}\n\n <div className=\"ardo-hero-content\">\n {hero.name && <h1 className=\"ardo-hero-name\">{hero.name}</h1>}\n {hero.text && <p className=\"ardo-hero-text\">{hero.text}</p>}\n {hero.tagline && <p className=\"ardo-hero-tagline\">{hero.tagline}</p>}\n\n {hero.actions && hero.actions.length > 0 && (\n <div className=\"ardo-hero-actions\">\n {hero.actions.map((action, index) => (\n <Link\n key={index}\n to={action.link}\n className={`ardo-hero-action ardo-hero-action-${action.theme || \"brand\"}`}\n >\n {action.text}\n </Link>\n ))}\n </div>\n )}\n </div>\n </div>\n </section>\n )}\n\n {features && features.length > 0 && (\n <section className=\"ardo-features\">\n <div className=\"ardo-features-container\">\n {features.map((feature, index) => (\n <div key={index} className=\"ardo-feature\">\n {feature.icon && <div className=\"ardo-feature-icon\">{feature.icon}</div>}\n <h3 className=\"ardo-feature-title\">{feature.title}</h3>\n <p className=\"ardo-feature-details\">{feature.details}</p>\n {feature.link && (\n <Link to={feature.link} className=\"ardo-feature-link\">\n {feature.linkText || \"Learn more\"}\n </Link>\n )}\n </div>\n ))}\n </div>\n </section>\n )}\n </main>\n\n <Footer />\n </div>\n )\n}\n","import { type ComponentProps } from \"react\"\nimport { Link } from \"react-router\"\n\n/** Internal route path from React Router */\ntype RoutePath = ComponentProps<typeof Link>[\"to\"]\n\n/** External URL starting with http:// or https:// */\ntype ExternalUrl = `http://${string}` | `https://${string}`\n\nexport interface HeroAction {\n /** Button text */\n text: string\n /** Link destination - internal route path or external URL */\n link: RoutePath | ExternalUrl\n /** Visual theme: \"brand\" for primary, \"alt\" for secondary */\n theme?: \"brand\" | \"alt\"\n}\n\nexport interface HeroImage {\n /** Image for light mode */\n light: string\n /** Image for dark mode */\n dark?: string\n /** Alt text for the image */\n alt?: string\n}\n\nexport interface HeroProps {\n /** Large title displayed prominently */\n name?: string\n /** Secondary text below the name */\n text?: string\n /** Descriptive tagline */\n tagline?: string\n /** Hero image - can be a string URL or an object with light/dark variants */\n image?: string | HeroImage\n /** Call-to-action buttons */\n actions?: HeroAction[]\n /** Additional CSS class */\n className?: string\n}\n\n/**\n * Hero section component for landing pages.\n *\n * @example\n * ```tsx\n * <Hero\n * name=\"Ardo\"\n * text=\"React-first Documentation\"\n * tagline=\"Build beautiful documentation sites with React.\"\n * image=\"/logo.svg\"\n * actions={[\n * { text: \"Get Started\", link: \"/guide/getting-started\", theme: \"brand\" },\n * { text: \"GitHub\", link: \"https://github.com/...\", theme: \"alt\" }\n * ]}\n * />\n * ```\n */\nexport function Hero({ name, text, tagline, image, actions, className }: HeroProps) {\n const imageUrl = typeof image === \"string\" ? image : image?.light\n const imageAlt = typeof image === \"string\" ? name : (image?.alt ?? name)\n\n return (\n <section className={className ?? \"ardo-hero\"}>\n <div className=\"ardo-hero-container ardo-hero-animate\">\n {image && (\n <div className=\"ardo-hero-image\">\n <img src={imageUrl} alt={imageAlt} />\n </div>\n )}\n\n <div className=\"ardo-hero-content\">\n {name && <h1 className=\"ardo-hero-name\">{name}</h1>}\n {text && <p className=\"ardo-hero-text\">{text}</p>}\n {tagline && <p className=\"ardo-hero-tagline\">{tagline}</p>}\n\n {actions && actions.length > 0 && (\n <div className=\"ardo-hero-actions\">\n {actions.map((action, index) => {\n const link = action.link\n const isExternal =\n typeof link === \"string\" &&\n (link.startsWith(\"http://\") || link.startsWith(\"https://\"))\n const className = `ardo-hero-action ardo-hero-action-${action.theme || \"brand\"}`\n\n if (isExternal) {\n return (\n <a\n key={index}\n href={link}\n className={className}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n {action.text}\n </a>\n )\n }\n\n return (\n <Link key={index} to={link} className={className}>\n {action.text}\n </Link>\n )\n })}\n </div>\n )}\n </div>\n </div>\n </section>\n )\n}\n","import { Link } from \"react-router\"\nimport type { CSSProperties, ReactNode } from \"react\"\n\nexport interface FeatureItem {\n /** Feature title */\n title: string\n /** Icon as ReactNode (emoji, Lucide icon component, or any JSX) */\n icon?: ReactNode\n /** Feature description */\n details: string\n /** Optional link */\n link?: string\n /** Link text (defaults to \"Learn more\") */\n linkText?: string\n}\n\nexport interface FeaturesProps {\n /** Array of feature items to display */\n items: FeatureItem[]\n /** Section title */\n title?: string\n /** Section subtitle */\n subtitle?: string\n /** Additional CSS class */\n className?: string\n}\n\nexport interface FeatureCardProps extends FeatureItem {\n /** Additional CSS class */\n className?: string\n}\n\n/**\n * Individual feature card component.\n *\n * @example\n * ```tsx\n * import { Zap } from \"lucide-react\"\n *\n * // Using emoji\n * <FeatureCard title=\"Fast\" icon=\"⚡\" details=\"Lightning fast.\" />\n *\n * // Using Lucide icon (tree-shakeable)\n * <FeatureCard title=\"Fast\" icon={<Zap size={28} />} details=\"Lightning fast.\" />\n * ```\n */\nexport function FeatureCard({\n title,\n icon,\n details,\n link,\n linkText,\n className,\n style,\n}: FeatureCardProps & { style?: CSSProperties }) {\n return (\n <div className={className ?? \"ardo-feature\"} style={style}>\n {icon && <div className=\"ardo-feature-icon\">{icon}</div>}\n <h3 className=\"ardo-feature-title\">{title}</h3>\n <p className=\"ardo-feature-details\">{details}</p>\n {link && (\n <Link to={link} className=\"ardo-feature-link\">\n {linkText || \"Learn more\"}\n </Link>\n )}\n </div>\n )\n}\n\n/**\n * Features grid component for displaying multiple feature cards.\n *\n * @example\n * ```tsx\n * <Features\n * title=\"Key Features\"\n * subtitle=\"Everything you need to build great docs\"\n * items={[\n * { title: \"React-First\", icon: \"⚛️\", details: \"Built on React.\" },\n * { title: \"Fast\", icon: \"⚡\", details: \"Powered by Vite.\" },\n * { title: \"Type-Safe\", icon: \"📝\", details: \"Full TypeScript support.\" },\n * ]}\n * />\n * ```\n */\nexport function Features({ items, title, subtitle, className }: FeaturesProps) {\n if (!items || items.length === 0) {\n return null\n }\n\n return (\n <section className={className ?? \"ardo-features\"}>\n {(title || subtitle) && (\n <div className=\"ardo-features-header\">\n {title && <h2 className=\"ardo-features-title\">{title}</h2>}\n {subtitle && <p className=\"ardo-features-subtitle\">{subtitle}</p>}\n </div>\n )}\n <div className=\"ardo-features-container\">\n {items.map((feature, index) => (\n <FeatureCard key={index} {...feature} style={{ animationDelay: `${index * 80}ms` }} />\n ))}\n </div>\n </section>\n )\n}\n"],"mappings":"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","names":["useState","Link","jsx","jsxs","useState","useEffect","jsx","jsxs","useState","useEffect","handleKeyDown","jsx","jsxs","useState","Link","useState","jsx","jsxs","jsx","jsxs","useState","createContext","useContext","jsx","jsxs","NavLink","useState","useEffect","jsx","jsxs","useState","useEffect","jsx","jsxs","Link","jsx","jsxs","NavLink","Link","Link","jsx","jsxs","className","Link","jsx","jsxs"]}
1
+ {"version":3,"sources":["../src/ui/Layout.tsx","../src/ui/Header.tsx","../src/ui/components/ThemeToggle.tsx","../src/ui/components/Search.tsx","../src/ui/Sidebar.tsx","../src/ui/Footer.tsx","../src/ui/Nav.tsx","../src/ui/TOC.tsx","../src/ui/DocPage.tsx","../src/ui/HomePage.tsx","../src/ui/components/Hero.tsx","../src/ui/components/Features.tsx"],"sourcesContent":["import { type ReactNode } from \"react\"\n\n// =============================================================================\n// Layout Component\n// =============================================================================\n\nexport interface LayoutProps {\n /** Header content */\n header?: ReactNode\n /** Sidebar content */\n sidebar?: ReactNode\n /** Footer content */\n footer?: ReactNode\n /** Main content */\n children: ReactNode\n /** Additional CSS classes */\n className?: string\n}\n\n/**\n * Layout component with explicit slot props.\n *\n * @example\n * ```tsx\n * <Layout\n * header={<Header logo=\"/logo.svg\" title=\"Ardo\" nav={...} />}\n * sidebar={<Sidebar>...</Sidebar>}\n * footer={<Footer message=\"MIT License\" />}\n * >\n * <Outlet />\n * </Layout>\n * ```\n */\nexport function Layout({ header, sidebar, footer, children, className }: LayoutProps) {\n return (\n <div className={className ?? \"ardo-layout\"}>\n {header}\n <div className=\"ardo-layout-container\">\n {sidebar}\n <main className=\"ardo-main\">{children}</main>\n </div>\n {footer}\n </div>\n )\n}\n","import { useState, type ReactNode } from \"react\"\nimport { Link } from \"react-router\"\nimport { ThemeToggle } from \"./components/ThemeToggle\"\nimport { Search } from \"./components/Search\"\n\n// =============================================================================\n// Header Component\n// =============================================================================\n\nexport interface HeaderProps {\n /** Logo image URL or light/dark variants */\n logo?: string | { light: string; dark: string }\n /** Site title displayed next to logo */\n title?: string\n /** Navigation content (Nav component or custom) */\n nav?: ReactNode\n /** Actions/right side content (social links, custom buttons) */\n actions?: ReactNode\n /** Show search (default: true) */\n search?: boolean\n /** Show theme toggle (default: true) */\n themeToggle?: boolean\n /** Additional CSS classes */\n className?: string\n}\n\n/**\n * Header component with explicit slot props.\n *\n * @example\n * ```tsx\n * <Header\n * logo=\"/logo.svg\"\n * title=\"Ardo\"\n * nav={\n * <Nav>\n * <NavLink to=\"/guide\">Guide</NavLink>\n * <NavLink to=\"/api\">API</NavLink>\n * </Nav>\n * }\n * actions={\n * <SocialLink href=\"https://github.com/...\" icon=\"github\" />\n * }\n * />\n * ```\n */\nexport function Header({\n logo,\n title,\n nav,\n actions,\n search = true,\n themeToggle = true,\n className,\n}: HeaderProps) {\n const [mobileMenuOpen, setMobileMenuOpen] = useState(false)\n\n return (\n <header className={className ?? \"ardo-header\"}>\n <div className=\"ardo-header-container\">\n {/* Left: Mobile menu button + Logo/Title */}\n <div className=\"ardo-header-left\">\n <button\n className=\"ardo-mobile-menu-button\"\n onClick={() => setMobileMenuOpen(!mobileMenuOpen)}\n aria-label=\"Toggle menu\"\n aria-expanded={mobileMenuOpen}\n >\n <span className=\"ardo-hamburger\">\n <span></span>\n <span></span>\n <span></span>\n </span>\n </button>\n\n <Link to=\"/\" className=\"ardo-logo-link\">\n {logo && (\n <img\n src={typeof logo === \"string\" ? logo : logo.light}\n alt={title ?? \"Logo\"}\n className=\"ardo-logo\"\n />\n )}\n {title && <span className=\"ardo-site-title\">{title}</span>}\n </Link>\n </div>\n\n {/* Center: Navigation */}\n {nav && <div className=\"ardo-nav\">{nav}</div>}\n\n {/* Right: Search, Theme Toggle, Actions */}\n <div className=\"ardo-header-right\">\n {search && <Search />}\n {themeToggle && <ThemeToggle />}\n {actions}\n </div>\n </div>\n\n {/* Mobile menu */}\n {mobileMenuOpen && (\n <div className=\"ardo-mobile-menu\">\n <nav className=\"ardo-mobile-nav\" onClick={() => setMobileMenuOpen(false)}>\n {nav}\n </nav>\n </div>\n )}\n </header>\n )\n}\n\n// =============================================================================\n// SocialLink Component\n// =============================================================================\n\nexport interface SocialLinkProps {\n /** URL to link to */\n href: string\n /** Social icon type */\n icon: \"github\" | \"twitter\" | \"discord\" | \"linkedin\" | \"youtube\" | \"npm\"\n /** Accessible label */\n ariaLabel?: string\n /** Additional CSS classes */\n className?: string\n}\n\n/**\n * Social media link with icon.\n *\n * @example\n * ```tsx\n * <SocialLink href=\"https://github.com/...\" icon=\"github\" />\n * ```\n */\nexport function SocialLink({ href, icon, ariaLabel, className }: SocialLinkProps) {\n return (\n <a\n href={href}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className={className ?? \"ardo-social-link\"}\n aria-label={ariaLabel ?? icon}\n >\n <SocialIcon icon={icon} />\n </a>\n )\n}\n\n// =============================================================================\n// Social Icon Component (internal)\n// =============================================================================\n\nfunction SocialIcon({ icon }: { icon: string }) {\n const icons: Record<string, string> = {\n github:\n \"M12 2C6.477 2 2 6.477 2 12c0 4.42 2.865 8.166 6.839 9.489.5.092.682-.217.682-.482 0-.237-.008-.866-.013-1.7-2.782.604-3.369-1.34-3.369-1.34-.454-1.156-1.11-1.463-1.11-1.463-.908-.62.069-.608.069-.608 1.003.07 1.531 1.03 1.531 1.03.892 1.529 2.341 1.087 2.91.831.092-.646.35-1.086.636-1.336-2.22-.253-4.555-1.11-4.555-4.943 0-1.091.39-1.984 1.029-2.683-.103-.253-.446-1.27.098-2.647 0 0 .84-.269 2.75 1.025A9.564 9.564 0 0112 6.844c.85.004 1.705.115 2.504.337 1.909-1.294 2.747-1.025 2.747-1.025.546 1.377.203 2.394.1 2.647.64.699 1.028 1.592 1.028 2.683 0 3.842-2.339 4.687-4.566 4.935.359.309.678.919.678 1.852 0 1.336-.012 2.415-.012 2.743 0 .267.18.578.688.48C19.138 20.163 22 16.418 22 12c0-5.523-4.477-10-10-10z\",\n twitter:\n \"M23.953 4.57a10 10 0 01-2.825.775 4.958 4.958 0 002.163-2.723c-.951.555-2.005.959-3.127 1.184a4.92 4.92 0 00-8.384 4.482C7.69 8.095 4.067 6.13 1.64 3.162a4.822 4.822 0 00-.666 2.475c0 1.71.87 3.213 2.188 4.096a4.904 4.904 0 01-2.228-.616v.06a4.923 4.923 0 003.946 4.827 4.996 4.996 0 01-2.212.085 4.936 4.936 0 004.604 3.417 9.867 9.867 0 01-6.102 2.105c-.39 0-.779-.023-1.17-.067a13.995 13.995 0 007.557 2.209c9.053 0 13.998-7.496 13.998-13.985 0-.21 0-.42-.015-.63A9.935 9.935 0 0024 4.59z\",\n discord:\n \"M20.317 4.37a19.791 19.791 0 00-4.885-1.515.074.074 0 00-.079.037c-.21.375-.444.864-.608 1.25a18.27 18.27 0 00-5.487 0 12.64 12.64 0 00-.617-1.25.077.077 0 00-.079-.037A19.736 19.736 0 003.677 4.37a.07.07 0 00-.032.027C.533 9.046-.32 13.58.099 18.057a.082.082 0 00.031.057 19.9 19.9 0 005.993 3.03.078.078 0 00.084-.028 14.09 14.09 0 001.226-1.994.076.076 0 00-.041-.106 13.107 13.107 0 01-1.872-.892.077.077 0 01-.008-.128 10.2 10.2 0 00.372-.292.074.074 0 01.077-.01c3.928 1.793 8.18 1.793 12.062 0a.074.074 0 01.078.01c.12.098.246.198.373.292a.077.077 0 01-.006.127 12.299 12.299 0 01-1.873.892.077.077 0 00-.041.107c.36.698.772 1.362 1.225 1.993a.076.076 0 00.084.028 19.839 19.839 0 006.002-3.03.077.077 0 00.032-.054c.5-5.177-.838-9.674-3.549-13.66a.061.061 0 00-.031-.03zM8.02 15.33c-1.183 0-2.157-1.085-2.157-2.419 0-1.333.956-2.419 2.157-2.419 1.21 0 2.176 1.096 2.157 2.42 0 1.333-.956 2.418-2.157 2.418zm7.975 0c-1.183 0-2.157-1.085-2.157-2.419 0-1.333.955-2.419 2.157-2.419 1.21 0 2.176 1.096 2.157 2.42 0 1.333-.946 2.418-2.157 2.418z\",\n linkedin:\n \"M20.447 20.452h-3.554v-5.569c0-1.328-.027-3.037-1.852-3.037-1.853 0-2.136 1.445-2.136 2.939v5.667H9.351V9h3.414v1.561h.046c.477-.9 1.637-1.85 3.37-1.85 3.601 0 4.267 2.37 4.267 5.455v6.286zM5.337 7.433a2.062 2.062 0 01-2.063-2.065 2.064 2.064 0 112.063 2.065zm1.782 13.019H3.555V9h3.564v11.452zM22.225 0H1.771C.792 0 0 .774 0 1.729v20.542C0 23.227.792 24 1.771 24h20.451C23.2 24 24 23.227 24 22.271V1.729C24 .774 23.2 0 22.222 0h.003z\",\n youtube:\n \"M23.498 6.186a3.016 3.016 0 00-2.122-2.136C19.505 3.545 12 3.545 12 3.545s-7.505 0-9.377.505A3.017 3.017 0 00.502 6.186C0 8.07 0 12 0 12s0 3.93.502 5.814a3.016 3.016 0 002.122 2.136c1.871.505 9.376.505 9.376.505s7.505 0 9.377-.505a3.015 3.015 0 002.122-2.136C24 15.93 24 12 24 12s0-3.93-.502-5.814zM9.545 15.568V8.432L15.818 12l-6.273 3.568z\",\n npm: \"M1.763 0C.786 0 0 .786 0 1.763v20.474C0 23.214.786 24 1.763 24h20.474c.977 0 1.763-.786 1.763-1.763V1.763C24 .786 23.214 0 22.237 0zM5.13 5.323l13.837.019-.009 13.836h-3.464l.01-10.382h-3.456L12.04 19.17H5.113z\",\n }\n\n const path = icons[icon] || icons.github\n\n return (\n <svg viewBox=\"0 0 24 24\" width=\"20\" height=\"20\" fill=\"currentColor\">\n <path d={path} />\n </svg>\n )\n}\n","import { useState, useEffect } from \"react\"\n\ntype Theme = \"light\" | \"dark\" | \"system\"\n\nexport function ThemeToggle() {\n const [theme, setTheme] = useState<Theme>(\"system\")\n const [mounted, setMounted] = useState(false)\n\n useEffect(() => {\n setMounted(true)\n\n const stored = localStorage.getItem(\"ardo-theme\") as Theme | null\n if (stored) {\n setTheme(stored)\n applyTheme(stored)\n } else {\n applyTheme(\"system\")\n }\n }, [])\n\n const toggleTheme = () => {\n const nextTheme: Theme = theme === \"light\" ? \"dark\" : theme === \"dark\" ? \"system\" : \"light\"\n setTheme(nextTheme)\n localStorage.setItem(\"ardo-theme\", nextTheme)\n applyTheme(nextTheme)\n }\n\n if (!mounted) {\n return (\n <button className=\"ardo-theme-toggle\" aria-label=\"Toggle theme\">\n <span className=\"ardo-theme-icon\">\n <SunIcon />\n </span>\n </button>\n )\n }\n\n return (\n <button\n className=\"ardo-theme-toggle\"\n onClick={toggleTheme}\n aria-label={`Switch to ${theme === \"light\" ? \"dark\" : theme === \"dark\" ? \"system\" : \"light\"} theme`}\n >\n <span className=\"ardo-theme-icon\">\n {theme === \"light\" && <SunIcon />}\n {theme === \"dark\" && <MoonIcon />}\n {theme === \"system\" && <SystemIcon />}\n </span>\n </button>\n )\n}\n\nfunction applyTheme(theme: Theme) {\n const root = document.documentElement\n\n if (theme === \"system\") {\n const isDark = window.matchMedia(\"(prefers-color-scheme: dark)\").matches\n root.classList.toggle(\"dark\", isDark)\n root.classList.toggle(\"light\", !isDark)\n } else {\n root.classList.toggle(\"dark\", theme === \"dark\")\n root.classList.toggle(\"light\", theme === \"light\")\n }\n}\n\nfunction SunIcon() {\n return (\n <svg\n viewBox=\"0 0 24 24\"\n width=\"20\"\n height=\"20\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n >\n <circle cx=\"12\" cy=\"12\" r=\"5\" />\n <line x1=\"12\" y1=\"1\" x2=\"12\" y2=\"3\" />\n <line x1=\"12\" y1=\"21\" x2=\"12\" y2=\"23\" />\n <line x1=\"4.22\" y1=\"4.22\" x2=\"5.64\" y2=\"5.64\" />\n <line x1=\"18.36\" y1=\"18.36\" x2=\"19.78\" y2=\"19.78\" />\n <line x1=\"1\" y1=\"12\" x2=\"3\" y2=\"12\" />\n <line x1=\"21\" y1=\"12\" x2=\"23\" y2=\"12\" />\n <line x1=\"4.22\" y1=\"19.78\" x2=\"5.64\" y2=\"18.36\" />\n <line x1=\"18.36\" y1=\"5.64\" x2=\"19.78\" y2=\"4.22\" />\n </svg>\n )\n}\n\nfunction MoonIcon() {\n return (\n <svg\n viewBox=\"0 0 24 24\"\n width=\"20\"\n height=\"20\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n >\n <path d=\"M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79z\" />\n </svg>\n )\n}\n\nfunction SystemIcon() {\n return (\n <svg\n viewBox=\"0 0 24 24\"\n width=\"20\"\n height=\"20\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n >\n <rect x=\"2\" y=\"3\" width=\"20\" height=\"14\" rx=\"2\" ry=\"2\" />\n <line x1=\"8\" y1=\"21\" x2=\"16\" y2=\"21\" />\n <line x1=\"12\" y1=\"17\" x2=\"12\" y2=\"21\" />\n </svg>\n )\n}\n","import { useState, useEffect, useRef, useMemo } from \"react\"\nimport { Link, useNavigate } from \"react-router\"\nimport { useThemeConfig } from \"../../runtime/hooks\"\nimport MiniSearch, { type SearchResult } from \"minisearch\"\nimport searchDocs from \"virtual:ardo/search-index\"\n\ninterface SearchDoc {\n id: string\n title: string\n content: string\n path: string\n section?: string\n}\n\nexport function Search() {\n const navigate = useNavigate()\n const [isOpen, setIsOpen] = useState(false)\n const [query, setQuery] = useState(\"\")\n const [results, setResults] = useState<SearchResult[]>([])\n const [selectedIndex, setSelectedIndex] = useState(0)\n const containerRef = useRef<HTMLDivElement>(null)\n const inputRef = useRef<HTMLInputElement>(null)\n const themeConfig = useThemeConfig()\n const hasQuery = query.trim().length > 0\n\n const placeholder = themeConfig.search?.placeholder ?? \"Search...\"\n\n useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n if ((e.metaKey || e.ctrlKey) && e.key === \"k\") {\n e.preventDefault()\n inputRef.current?.focus()\n setIsOpen(true)\n }\n\n if (e.key === \"Escape\") {\n setIsOpen(false)\n }\n }\n\n document.addEventListener(\"keydown\", handleKeyDown)\n return () => document.removeEventListener(\"keydown\", handleKeyDown)\n }, [])\n\n useEffect(() => {\n if (isOpen && inputRef.current) {\n inputRef.current.focus()\n }\n }, [isOpen])\n\n useEffect(() => {\n if (!isOpen) {\n return\n }\n\n const handleOutsideClick = (e: MouseEvent | TouchEvent) => {\n if (containerRef.current && !containerRef.current.contains(e.target as Node)) {\n setIsOpen(false)\n }\n }\n\n document.addEventListener(\"mousedown\", handleOutsideClick)\n document.addEventListener(\"touchstart\", handleOutsideClick)\n return () => {\n document.removeEventListener(\"mousedown\", handleOutsideClick)\n document.removeEventListener(\"touchstart\", handleOutsideClick)\n }\n }, [isOpen])\n\n // Build search index from virtual module data\n const searchIndex = useMemo(() => {\n const index = new MiniSearch<SearchDoc>({\n fields: [\"title\", \"content\", \"section\"],\n storeFields: [\"title\", \"path\", \"section\"],\n searchOptions: {\n boost: { title: 2 },\n fuzzy: 0.2,\n prefix: true,\n },\n })\n index.addAll(searchDocs as SearchDoc[])\n return index\n }, [])\n\n const handleSearch = (searchQuery: string) => {\n setQuery(searchQuery)\n\n if (!searchQuery.trim()) {\n setResults([])\n setIsOpen(false)\n setSelectedIndex(0)\n return\n }\n\n const searchResults = searchIndex.search(searchQuery).slice(0, 10)\n setResults(searchResults)\n setSelectedIndex(0)\n setIsOpen(true)\n }\n\n const handleKeyDown = (e: React.KeyboardEvent) => {\n if (e.key === \"ArrowDown\" && results.length > 0) {\n e.preventDefault()\n setSelectedIndex((prev) => Math.min(prev + 1, results.length - 1))\n } else if (e.key === \"ArrowUp\" && results.length > 0) {\n e.preventDefault()\n setSelectedIndex((prev) => Math.max(prev - 1, 0))\n } else if (e.key === \"Enter\" && results[selectedIndex]) {\n e.preventDefault()\n const result = results[selectedIndex]\n navigate(result.path as string)\n setIsOpen(false)\n } else if (e.key === \"Escape\") {\n setIsOpen(false)\n inputRef.current?.blur()\n }\n }\n\n return (\n <div\n className=\"ardo-search\"\n ref={containerRef}\n data-expanded={isOpen || hasQuery ? \"true\" : \"false\"}\n onClick={() => inputRef.current?.focus()}\n >\n <div className=\"ardo-search-field\">\n <SearchIcon />\n <input\n ref={inputRef}\n type=\"text\"\n className=\"ardo-search-input\"\n placeholder={placeholder}\n value={query}\n onChange={(e) => handleSearch(e.target.value)}\n onKeyDown={handleKeyDown}\n onFocus={() => {\n if (hasQuery) {\n setIsOpen(true)\n }\n }}\n aria-expanded={isOpen}\n aria-label=\"Search\"\n />\n {query && (\n <button\n type=\"button\"\n className=\"ardo-search-clear\"\n onClick={(e) => {\n e.stopPropagation()\n handleSearch(\"\")\n inputRef.current?.focus()\n }}\n aria-label=\"Clear search\"\n >\n ×\n </button>\n )}\n <span className=\"ardo-search-kbd\">\n <kbd>⌘</kbd>\n <kbd>K</kbd>\n </span>\n </div>\n\n {isOpen && hasQuery && (\n <div className=\"ardo-search-popover\">\n {results.length > 0 && (\n <ul className=\"ardo-search-results\">\n {results.map((result, index) => (\n <li key={result.id}>\n <Link\n to={result.path as string}\n className={[\"ardo-search-result\", index === selectedIndex && \"selected\"]\n .filter(Boolean)\n .join(\" \")}\n onClick={() => setIsOpen(false)}\n >\n <span className=\"ardo-search-result-title\">{result.title as string}</span>\n {result.section && (\n <span className=\"ardo-search-result-section\">{result.section as string}</span>\n )}\n </Link>\n </li>\n ))}\n </ul>\n )}\n\n {query && results.length === 0 && (\n <div className=\"ardo-search-no-results\">No results found for \"{query}\"</div>\n )}\n\n <div className=\"ardo-search-footer\">\n <span>\n <kbd>↑</kbd> <kbd>↓</kbd> to navigate\n </span>\n <span>\n <kbd>↵</kbd> to select\n </span>\n <span>\n <kbd>esc</kbd> to close\n </span>\n </div>\n </div>\n )}\n </div>\n )\n}\n\nfunction SearchIcon() {\n return (\n <svg\n viewBox=\"0 0 24 24\"\n width=\"18\"\n height=\"18\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n >\n <circle cx=\"11\" cy=\"11\" r=\"8\" />\n <line x1=\"21\" y1=\"21\" x2=\"16.65\" y2=\"16.65\" />\n </svg>\n )\n}\n","import {\n useState,\n type ReactNode,\n type ComponentProps,\n Children,\n isValidElement,\n createContext,\n useContext,\n} from \"react\"\nimport { NavLink, useLocation } from \"react-router\"\nimport type { SidebarItem as SidebarItemType } from \"../config/types\"\n\n/** Route path type - uses React Router's NavLink 'to' prop type for type-safe routes */\ntype RoutePath = ComponentProps<typeof NavLink>[\"to\"]\n\n// =============================================================================\n// Sidebar Context\n// =============================================================================\n\ninterface SidebarContextValue {\n currentPath: string\n}\n\nconst SidebarContext = createContext<SidebarContextValue>({ currentPath: \"\" })\n\nfunction useSidebarContext() {\n return useContext(SidebarContext)\n}\n\n// =============================================================================\n// Sidebar Component Types\n// =============================================================================\n\nexport interface SidebarProps {\n /** Sidebar items (for data-driven approach) */\n items?: SidebarItemType[]\n /** Children for JSX composition (SidebarGroup, SidebarLink) */\n children?: ReactNode\n /** Additional CSS classes */\n className?: string\n}\n\n// =============================================================================\n// Sidebar Main Component\n// =============================================================================\n\n/**\n * Sidebar component supporting both data-driven and JSX composition patterns.\n *\n * @example Data-driven (items prop)\n * ```tsx\n * <Sidebar items={[\n * { text: 'Introduction', link: '/intro' },\n * { text: 'Guide', items: [\n * { text: 'Getting Started', link: '/guide/getting-started' }\n * ]}\n * ]} />\n * ```\n *\n * @example JSX composition\n * ```tsx\n * <Sidebar>\n * <SidebarLink to=\"/intro\">Introduction</SidebarLink>\n * <SidebarGroup title=\"Guide\">\n * <SidebarLink to=\"/guide/getting-started\">Getting Started</SidebarLink>\n * </SidebarGroup>\n * </Sidebar>\n * ```\n */\nexport function Sidebar({ items, children, className }: SidebarProps) {\n const { pathname } = useLocation()\n\n return (\n <SidebarContext.Provider value={{ currentPath: pathname }}>\n <aside className={className ?? \"ardo-sidebar\"}>\n <nav className=\"ardo-sidebar-nav\">\n {items ? (\n <SidebarItems items={items} depth={0} />\n ) : (\n <ul className=\"ardo-sidebar-list ardo-sidebar-list-0\">{children}</ul>\n )}\n </nav>\n </aside>\n </SidebarContext.Provider>\n )\n}\n\n// =============================================================================\n// SidebarGroup Component\n// =============================================================================\n\nexport interface SidebarGroupProps {\n /** Group title */\n title: string\n /** Optional link for the group title */\n to?: string\n /** Initial collapsed state (default: false) */\n collapsed?: boolean\n /** Whether group is collapsible (default: true if has children) */\n collapsible?: boolean\n /** Children (SidebarLink, nested SidebarGroup) */\n children?: ReactNode\n /** Additional CSS classes */\n className?: string\n}\n\n/**\n * Group component for organizing sidebar links.\n *\n * @example\n * ```tsx\n * <SidebarGroup title=\"Guide\">\n * <SidebarLink to=\"/guide/intro\">Introduction</SidebarLink>\n * <SidebarLink to=\"/guide/setup\">Setup</SidebarLink>\n * </SidebarGroup>\n * ```\n *\n * @example With collapsible state\n * ```tsx\n * <SidebarGroup title=\"Advanced\" collapsed>\n * <SidebarLink to=\"/advanced/config\">Configuration</SidebarLink>\n * </SidebarGroup>\n * ```\n */\nexport function SidebarGroup({\n title,\n to,\n collapsed: initialCollapsed = false,\n collapsible = true,\n children,\n className,\n}: SidebarGroupProps) {\n const [collapsed, setCollapsed] = useState(initialCollapsed)\n const { currentPath } = useSidebarContext()\n\n // Check if any child is active\n const isChildActive = checkChildrenActive(children, currentPath)\n\n const textClassName = [\"ardo-sidebar-text\", isChildActive && \"child-active\"]\n .filter(Boolean)\n .join(\" \")\n\n const linkClassName = [\"ardo-sidebar-link\", isChildActive && \"child-active\"]\n .filter(Boolean)\n .join(\" \")\n\n const hasChildren = Children.count(children) > 0\n\n return (\n <li className={className ?? \"ardo-sidebar-item\"}>\n <div className=\"ardo-sidebar-item-header\">\n {to ? (\n <NavLink\n to={to}\n className={({ isActive }) =>\n [linkClassName, isActive && \"active\"].filter(Boolean).join(\" \")\n }\n >\n {title}\n </NavLink>\n ) : (\n <span\n className={textClassName}\n onClick={() => collapsible && hasChildren && setCollapsed(!collapsed)}\n style={collapsible && hasChildren ? { cursor: \"pointer\" } : undefined}\n >\n {title}\n </span>\n )}\n\n {collapsible && hasChildren && (\n <button\n className={[\"ardo-sidebar-collapse\", collapsed && \"collapsed\"]\n .filter(Boolean)\n .join(\" \")}\n onClick={() => setCollapsed(!collapsed)}\n aria-label={collapsed ? \"Expand\" : \"Collapse\"}\n >\n <svg\n viewBox=\"0 0 24 24\"\n width=\"16\"\n height=\"16\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n >\n <path d=\"M6 9l6 6 6-6\" />\n </svg>\n </button>\n )}\n </div>\n\n {hasChildren && !collapsed && (\n <ul className=\"ardo-sidebar-list ardo-sidebar-list-1\">{children}</ul>\n )}\n </li>\n )\n}\n\n// =============================================================================\n// SidebarLink Component\n// =============================================================================\n\nexport interface SidebarLinkProps {\n /** Internal route path (type-safe with React Router's registered routes) */\n to: RoutePath\n /** Link text */\n children: ReactNode\n /** Additional CSS classes */\n className?: string\n}\n\n/**\n * Sidebar navigation link.\n *\n * @example\n * ```tsx\n * <SidebarLink to=\"/guide/getting-started\">Getting Started</SidebarLink>\n * ```\n */\nexport function SidebarLink({ to, children, className }: SidebarLinkProps) {\n const baseClassName = className ?? \"ardo-sidebar-link\"\n return (\n <li className=\"ardo-sidebar-item\">\n <NavLink\n to={to}\n className={({ isActive }) =>\n [baseClassName, isActive && \"active\"].filter(Boolean).join(\" \")\n }\n >\n {children}\n </NavLink>\n </li>\n )\n}\n\n// =============================================================================\n// Internal: Data-driven sidebar rendering\n// =============================================================================\n\ninterface SidebarItemsProps {\n items: SidebarItemType[]\n depth: number\n}\n\nfunction SidebarItems({ items, depth }: SidebarItemsProps) {\n return (\n <ul className={`ardo-sidebar-list ardo-sidebar-list-${depth}`}>\n {items.map((item, index) => (\n <SidebarItemComponent key={index} item={item} depth={depth} />\n ))}\n </ul>\n )\n}\n\ninterface SidebarItemComponentProps {\n item: SidebarItemType\n depth: number\n}\n\nfunction SidebarItemComponent({ item, depth }: SidebarItemComponentProps) {\n const { currentPath } = useSidebarContext()\n const [collapsed, setCollapsed] = useState(item.collapsed ?? false)\n\n const hasChildren = item.items && item.items.length > 0\n\n const isChildActive =\n hasChildren &&\n item.items!.some(\n (child) =>\n child.link === currentPath ||\n (child.items && child.items.some((grandchild) => grandchild.link === currentPath))\n )\n\n const linkClassName = [\"ardo-sidebar-link\", isChildActive && \"child-active\"]\n .filter(Boolean)\n .join(\" \")\n\n const textClassName = [\"ardo-sidebar-text\", isChildActive && \"child-active\"]\n .filter(Boolean)\n .join(\" \")\n\n return (\n <li className=\"ardo-sidebar-item\">\n <div className=\"ardo-sidebar-item-header\">\n {item.link ? (\n <NavLink\n to={item.link}\n className={({ isActive }) =>\n [linkClassName, isActive && \"active\"].filter(Boolean).join(\" \")\n }\n >\n {item.text}\n </NavLink>\n ) : (\n <span className={textClassName} onClick={() => hasChildren && setCollapsed(!collapsed)}>\n {item.text}\n </span>\n )}\n\n {hasChildren && (\n <button\n className={[\"ardo-sidebar-collapse\", collapsed && \"collapsed\"]\n .filter(Boolean)\n .join(\" \")}\n onClick={() => setCollapsed(!collapsed)}\n aria-label={collapsed ? \"Expand\" : \"Collapse\"}\n >\n <svg\n viewBox=\"0 0 24 24\"\n width=\"16\"\n height=\"16\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n >\n <path d=\"M6 9l6 6 6-6\" />\n </svg>\n </button>\n )}\n </div>\n\n {hasChildren && !collapsed && <SidebarItems items={item.items!} depth={depth + 1} />}\n </li>\n )\n}\n\n// =============================================================================\n// Utility Functions\n// =============================================================================\n\nfunction checkChildrenActive(children: ReactNode, currentPath: string): boolean {\n let isActive = false\n\n Children.forEach(children, (child) => {\n if (isActive) return\n\n if (isValidElement(child)) {\n // Check SidebarLink\n if (child.type === SidebarLink && (child.props as SidebarLinkProps).to === currentPath) {\n isActive = true\n return\n }\n\n // Check nested SidebarGroup\n if (child.type === SidebarGroup) {\n const groupProps = child.props as SidebarGroupProps\n if (groupProps.to === currentPath) {\n isActive = true\n return\n }\n if (groupProps.children && checkChildrenActive(groupProps.children, currentPath)) {\n isActive = true\n return\n }\n }\n }\n })\n\n return isActive\n}\n","import { type ReactNode } from \"react\"\n\n// =============================================================================\n// Footer Component\n// =============================================================================\n\nexport interface FooterProps {\n /** Footer message (supports HTML string) */\n message?: string\n /** Copyright text (supports HTML string) */\n copyright?: string\n /** Custom content (overrides message/copyright) */\n children?: ReactNode\n /** Additional CSS classes */\n className?: string\n}\n\n/**\n * Footer component with message and copyright props.\n *\n * @example Simple usage\n * ```tsx\n * <Footer message=\"MIT License\" copyright=\"2026 Sebastian Software\" />\n * ```\n *\n * @example With HTML\n * ```tsx\n * <Footer\n * message=\"Built with <a href='...'>Ardo</a>\"\n * copyright=\"Copyright &copy; 2026\"\n * />\n * ```\n *\n * @example Custom content\n * ```tsx\n * <Footer>\n * <CustomFooterContent />\n * </Footer>\n * ```\n */\nexport function Footer({ message, copyright, children, className }: FooterProps) {\n const hasContent = message || copyright || children\n\n if (!hasContent) {\n return null\n }\n\n return (\n <footer className={className ?? \"ardo-footer\"}>\n <div className=\"ardo-footer-container\">\n {children ?? (\n <>\n {message && (\n <p className=\"ardo-footer-message\" dangerouslySetInnerHTML={{ __html: message }} />\n )}\n {copyright && (\n <p\n className=\"ardo-footer-copyright\"\n dangerouslySetInnerHTML={{ __html: copyright }}\n />\n )}\n </>\n )}\n </div>\n </footer>\n )\n}\n\n// Type exports for compound pattern (kept for backwards compatibility)\nexport interface FooterMessageProps {\n children: ReactNode\n className?: string\n}\n\nexport interface FooterCopyrightProps {\n children: ReactNode\n className?: string\n}\n","import { type ReactNode, type ComponentProps, useState, createContext, useContext } from \"react\"\nimport { NavLink as RouterNavLink } from \"react-router\"\n\n/** Route path type - uses React Router's NavLink 'to' prop type for type-safe routes */\ntype RoutePath = ComponentProps<typeof RouterNavLink>[\"to\"]\n\n// Nav context for shared state\ninterface NavContextValue {\n mobileMenuOpen: boolean\n setMobileMenuOpen: (open: boolean) => void\n}\n\nconst NavContext = createContext<NavContextValue | null>(null)\n\nfunction useNavContext() {\n return useContext(NavContext)\n}\n\n// =============================================================================\n// Nav Component\n// =============================================================================\n\nexport interface NavProps {\n children?: ReactNode\n className?: string\n}\n\n/**\n * Navigation container component for composing navigation links.\n *\n * @example\n * ```tsx\n * <Nav>\n * <NavLink to=\"/guide\">Guide</NavLink>\n * <NavLink to=\"/api\">API</NavLink>\n * <NavLink href=\"https://github.com/...\">GitHub</NavLink>\n * </Nav>\n * ```\n */\nexport function Nav({ children, className }: NavProps) {\n return <nav className={className ?? \"ardo-nav\"}>{children}</nav>\n}\n\n// =============================================================================\n// NavLink Component\n// =============================================================================\n\nexport interface NavLinkProps {\n /** Internal route path (type-safe with React Router's registered routes) */\n to?: RoutePath\n /** External URL (uses anchor tag) */\n href?: string\n /** Link text or children */\n children: ReactNode\n /** Additional CSS classes */\n className?: string\n /** Active state match pattern */\n activeMatch?: string\n}\n\n/**\n * Navigation link component supporting both internal routes and external URLs.\n *\n * @example\n * ```tsx\n * // Internal link\n * <NavLink to=\"/guide\">Guide</NavLink>\n *\n * // External link\n * <NavLink href=\"https://github.com/...\">GitHub</NavLink>\n * ```\n */\nexport function NavLink({\n to,\n href,\n children,\n className,\n activeMatch: _activeMatch,\n}: NavLinkProps) {\n const navContext = useNavContext()\n const baseClassName = className ?? \"ardo-nav-link\"\n\n // Handle click for mobile menu\n const handleClick = () => {\n navContext?.setMobileMenuOpen(false)\n }\n\n // External link\n if (href) {\n return (\n <a\n href={href}\n className={baseClassName}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n onClick={handleClick}\n >\n {children}\n </a>\n )\n }\n\n // Internal link\n if (to) {\n return (\n <RouterNavLink\n to={to}\n className={({ isActive }: { isActive: boolean }) =>\n [baseClassName, isActive && \"active\"].filter(Boolean).join(\" \")\n }\n onClick={handleClick}\n >\n {children}\n </RouterNavLink>\n )\n }\n\n // Text-only (no link)\n return <span className={baseClassName}>{children}</span>\n}\n\n// =============================================================================\n// NavDropdown Component\n// =============================================================================\n\nexport interface NavDropdownProps {\n /** Dropdown trigger text */\n text: string\n /** Dropdown items */\n children: ReactNode\n /** Additional CSS classes */\n className?: string\n}\n\n/**\n * Dropdown navigation menu for grouping related links.\n *\n * @example\n * ```tsx\n * <NavDropdown text=\"Resources\">\n * <NavLink to=\"/docs\">Documentation</NavLink>\n * <NavLink to=\"/blog\">Blog</NavLink>\n * </NavDropdown>\n * ```\n */\nexport function NavDropdown({ text, children, className }: NavDropdownProps) {\n const [open, setOpen] = useState(false)\n\n return (\n <div\n className={className ?? \"ardo-nav-dropdown\"}\n onMouseEnter={() => setOpen(true)}\n onMouseLeave={() => setOpen(false)}\n >\n <button className=\"ardo-nav-dropdown-button\">\n {text}\n <span className=\"ardo-nav-dropdown-icon\">▼</span>\n </button>\n {open && <div className=\"ardo-nav-dropdown-menu\">{children}</div>}\n </div>\n )\n}\n\n// =============================================================================\n// NavProvider Component\n// =============================================================================\n\nexport interface NavProviderProps {\n children: ReactNode\n}\n\n/**\n * Provider for Nav context (mobile menu state).\n * Used internally by Header component.\n */\nexport function NavProvider({ children }: NavProviderProps) {\n const [mobileMenuOpen, setMobileMenuOpen] = useState(false)\n\n return (\n <NavContext.Provider value={{ mobileMenuOpen, setMobileMenuOpen }}>\n {children}\n </NavContext.Provider>\n )\n}\n\n// Export context hook for external use\nexport { useNavContext }\n","import { useState, useEffect } from \"react\"\nimport { useTOC, useThemeConfig } from \"../runtime/hooks\"\nimport type { TOCItem } from \"../config/types\"\n\nexport function TOC() {\n const toc = useTOC()\n const themeConfig = useThemeConfig()\n const [activeId, setActiveId] = useState<string>(\"\")\n\n const label = themeConfig.outline?.label ?? \"On this page\"\n\n useEffect(() => {\n if (toc.length === 0) return\n\n const headingElements = toc.map((item) => document.getElementById(item.id)).filter(Boolean)\n\n if (headingElements.length === 0) return\n\n const observer = new IntersectionObserver(\n (entries) => {\n for (const entry of entries) {\n if (entry.isIntersecting) {\n setActiveId(entry.target.id)\n break\n }\n }\n },\n {\n rootMargin: \"-80px 0px -80% 0px\",\n threshold: 0,\n }\n )\n\n headingElements.forEach((el) => el && observer.observe(el))\n\n return () => {\n headingElements.forEach((el) => el && observer.unobserve(el))\n }\n }, [toc])\n\n if (toc.length === 0) {\n return null\n }\n\n return (\n <aside className=\"ardo-toc\">\n <div className=\"ardo-toc-container\">\n <h3 className=\"ardo-toc-title\">{label}</h3>\n <nav className=\"ardo-toc-nav\">\n <TOCItems items={toc} activeId={activeId} />\n </nav>\n </div>\n </aside>\n )\n}\n\ninterface TOCItemsProps {\n items: TOCItem[]\n activeId: string\n}\n\nfunction TOCItems({ items, activeId }: TOCItemsProps) {\n return (\n <ul className=\"ardo-toc-list\">\n {items.map((item) => (\n <TOCItemComponent key={item.id} item={item} activeId={activeId} />\n ))}\n </ul>\n )\n}\n\ninterface TOCItemComponentProps {\n item: TOCItem\n activeId: string\n}\n\nfunction TOCItemComponent({ item, activeId }: TOCItemComponentProps) {\n const isActive = item.id === activeId\n const hasActiveChild = hasActiveDescendant(item, activeId)\n\n return (\n <li className=\"ardo-toc-item\">\n <a\n href={`#${item.id}`}\n className={[\n `ardo-toc-link ardo-toc-link-${item.level}`,\n isActive && \"active\",\n hasActiveChild && \"child-active\",\n ]\n .filter(Boolean)\n .join(\" \")}\n onClick={(e) => {\n e.preventDefault()\n const element = document.getElementById(item.id)\n if (element) {\n element.scrollIntoView({ behavior: \"smooth\" })\n window.history.pushState(null, \"\", `#${item.id}`)\n }\n }}\n >\n {item.text}\n </a>\n {item.children && item.children.length > 0 && (\n <TOCItems items={item.children} activeId={activeId} />\n )}\n </li>\n )\n}\n\nfunction hasActiveDescendant(item: TOCItem, activeId: string): boolean {\n if (!item.children) return false\n\n for (const child of item.children) {\n if (child.id === activeId) return true\n if (hasActiveDescendant(child, activeId)) return true\n }\n\n return false\n}\n","import { type ReactNode } from \"react\"\nimport { usePageData } from \"../runtime/hooks\"\nimport { Layout } from \"./Layout\"\nimport { Content } from \"./Content\"\nimport { TOC } from \"./TOC\"\n\n// =============================================================================\n// DocPage Component (includes Layout - for backwards compatibility)\n// =============================================================================\n\ninterface DocPageProps {\n children: ReactNode\n}\n\n/**\n * Full documentation page with Layout wrapper.\n * Use this when you don't have a _layout.tsx file.\n *\n * @example\n * ```tsx\n * <DocPage>\n * <Content />\n * </DocPage>\n * ```\n */\nexport function DocPage({ children }: DocPageProps) {\n const pageData = usePageData()\n const showToc =\n pageData?.frontmatter.outline !== false && pageData?.toc && pageData.toc.length > 0\n\n return (\n <Layout>\n <div className=\"ardo-doc-page\">\n <Content>{children}</Content>\n {showToc && <TOC />}\n </div>\n </Layout>\n )\n}\n\n// =============================================================================\n// DocContent Component (without Layout - for use with _layout.tsx)\n// =============================================================================\n\ninterface DocContentProps {\n children: ReactNode\n}\n\n/**\n * Documentation content without Layout wrapper.\n * Use this when you have a _layout.tsx that provides the Layout.\n *\n * @example\n * ```tsx\n * // In _layout.tsx:\n * <Layout>\n * <Header ... />\n * <Sidebar ... />\n * <Outlet />\n * <Footer ... />\n * </Layout>\n *\n * // In page routes:\n * <DocContent>\n * <MarkdownContent />\n * </DocContent>\n * ```\n */\nexport function DocContent({ children }: DocContentProps) {\n const pageData = usePageData()\n const showToc =\n pageData?.frontmatter.outline !== false && pageData?.toc && pageData.toc.length > 0\n\n return (\n <div className=\"ardo-doc-page\">\n <Content>{children}</Content>\n {showToc && <TOC />}\n </div>\n )\n}\n\n// =============================================================================\n// DocLayout Component (legacy alias)\n// =============================================================================\n\ninterface DocLayoutProps {\n content: ReactNode\n}\n\n/**\n * @deprecated Use DocPage or DocContent instead\n */\nexport function DocLayout({ content }: DocLayoutProps) {\n return <DocPage>{content}</DocPage>\n}\n","import { Link } from \"react-router\"\nimport { usePageData, useConfig, useThemeConfig } from \"../runtime/hooks\"\nimport { Header, SocialLink } from \"./Header\"\nimport { Footer } from \"./Footer\"\nimport { Nav, NavLink } from \"./Nav\"\n\nexport function HomePage() {\n const pageData = usePageData()\n const config = useConfig()\n const themeConfig = useThemeConfig()\n\n const hero = pageData?.frontmatter.hero\n const features = pageData?.frontmatter.features\n\n return (\n <div className=\"ardo-home\">\n <Header\n logo={themeConfig.logo}\n title={themeConfig.siteTitle !== false ? config.title : undefined}\n nav={\n themeConfig.nav && themeConfig.nav.length > 0 ? (\n <Nav>\n {themeConfig.nav.map((item, index) => (\n <NavLink key={index} to={item.link}>\n {item.text}\n </NavLink>\n ))}\n </Nav>\n ) : undefined\n }\n actions={themeConfig.socialLinks?.map((link, index) => (\n <SocialLink key={index} href={link.link} icon={link.icon} ariaLabel={link.ariaLabel} />\n ))}\n />\n\n <main className=\"ardo-home-main\">\n {hero && (\n <section className=\"ardo-hero\">\n <div className=\"ardo-hero-container\">\n {hero.image && (\n <div className=\"ardo-hero-image\">\n <img\n src={typeof hero.image === \"string\" ? hero.image : hero.image.light}\n alt={hero.name || config.title}\n />\n </div>\n )}\n\n <div className=\"ardo-hero-content\">\n {hero.name && <h1 className=\"ardo-hero-name\">{hero.name}</h1>}\n {hero.text && <p className=\"ardo-hero-text\">{hero.text}</p>}\n {hero.tagline && <p className=\"ardo-hero-tagline\">{hero.tagline}</p>}\n\n {hero.actions && hero.actions.length > 0 && (\n <div className=\"ardo-hero-actions\">\n {hero.actions.map((action, index) => (\n <Link\n key={index}\n to={action.link}\n className={`ardo-hero-action ardo-hero-action-${action.theme || \"brand\"}`}\n >\n {action.text}\n </Link>\n ))}\n </div>\n )}\n </div>\n </div>\n </section>\n )}\n\n {features && features.length > 0 && (\n <section className=\"ardo-features\">\n <div className=\"ardo-features-container\">\n {features.map((feature, index) => (\n <div key={index} className=\"ardo-feature\">\n {feature.icon && <div className=\"ardo-feature-icon\">{feature.icon}</div>}\n <h3 className=\"ardo-feature-title\">{feature.title}</h3>\n <p className=\"ardo-feature-details\">{feature.details}</p>\n {feature.link && (\n <Link to={feature.link} className=\"ardo-feature-link\">\n {feature.linkText || \"Learn more\"}\n </Link>\n )}\n </div>\n ))}\n </div>\n </section>\n )}\n </main>\n\n <Footer />\n </div>\n )\n}\n","import { type ComponentProps, type ReactNode } from \"react\"\nimport { Link } from \"react-router\"\n\n/** Internal route path from React Router */\ntype RoutePath = ComponentProps<typeof Link>[\"to\"]\n\n/** External URL starting with http:// or https:// */\ntype ExternalUrl = `http://${string}` | `https://${string}`\n\nexport interface HeroAction {\n /** Button text */\n text: string\n /** Link destination - internal route path or external URL */\n link: RoutePath | ExternalUrl\n /** Visual theme: \"brand\" for primary, \"alt\" for secondary */\n theme?: \"brand\" | \"alt\"\n /** Optional icon as ReactNode (e.g. Lucide icon component) */\n icon?: ReactNode\n}\n\nexport interface HeroImage {\n /** Image for light mode */\n light: string\n /** Image for dark mode */\n dark?: string\n /** Alt text for the image */\n alt?: string\n}\n\nexport interface HeroProps {\n /** Large title displayed prominently */\n name?: string\n /** Secondary text below the name */\n text?: string\n /** Descriptive tagline */\n tagline?: string\n /** Hero image - can be a string URL or an object with light/dark variants */\n image?: string | HeroImage\n /** Call-to-action buttons */\n actions?: HeroAction[]\n /** Additional CSS class */\n className?: string\n}\n\n/**\n * Hero section component for landing pages.\n *\n * @example\n * ```tsx\n * import { ArrowRight, Github } from \"lucide-react\"\n *\n * <Hero\n * name=\"Ardo\"\n * text=\"React-first Documentation\"\n * tagline=\"Build beautiful documentation sites with React.\"\n * image=\"/logo.svg\"\n * actions={[\n * { text: \"Get Started\", link: \"/guide/getting-started\", theme: \"brand\", icon: <ArrowRight size={16} /> },\n * { text: \"GitHub\", link: \"https://github.com/...\", theme: \"alt\", icon: <Github size={16} /> }\n * ]}\n * />\n * ```\n */\nexport function Hero({ name, text, tagline, image, actions, className }: HeroProps) {\n const imageUrl = typeof image === \"string\" ? image : image?.light\n const imageAlt = typeof image === \"string\" ? name : (image?.alt ?? name)\n\n return (\n <section className={className ?? \"ardo-hero\"}>\n <div className=\"ardo-hero-container ardo-hero-animate\">\n {image && (\n <div className=\"ardo-hero-image\">\n <img src={imageUrl} alt={imageAlt} />\n </div>\n )}\n\n <div className=\"ardo-hero-content\">\n {name && <h1 className=\"ardo-hero-name\">{name}</h1>}\n {text && <p className=\"ardo-hero-text\">{text}</p>}\n {tagline && <p className=\"ardo-hero-tagline\">{tagline}</p>}\n\n {actions && actions.length > 0 && (\n <div className=\"ardo-hero-actions\">\n {actions.map((action, index) => {\n const link = action.link\n const isExternal =\n typeof link === \"string\" &&\n (link.startsWith(\"http://\") || link.startsWith(\"https://\"))\n const className = `ardo-hero-action ardo-hero-action-${action.theme || \"brand\"}`\n\n const content = (\n <>\n {action.icon}\n {action.text}\n </>\n )\n\n if (isExternal) {\n return (\n <a\n key={index}\n href={link}\n className={className}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n {content}\n </a>\n )\n }\n\n return (\n <Link key={index} to={link} className={className}>\n {content}\n </Link>\n )\n })}\n </div>\n )}\n </div>\n </div>\n </section>\n )\n}\n","import { Link } from \"react-router\"\nimport type { CSSProperties, ReactNode } from \"react\"\n\nexport interface FeatureItem {\n /** Feature title */\n title: string\n /** Icon as ReactNode (emoji, Lucide icon component, or any JSX) */\n icon?: ReactNode\n /** Feature description */\n details: string\n /** Optional link */\n link?: string\n /** Link text (defaults to \"Learn more\") */\n linkText?: string\n}\n\nexport interface FeaturesProps {\n /** Array of feature items to display */\n items: FeatureItem[]\n /** Section title */\n title?: string\n /** Section subtitle */\n subtitle?: string\n /** Additional CSS class */\n className?: string\n}\n\nexport interface FeatureCardProps extends FeatureItem {\n /** Additional CSS class */\n className?: string\n}\n\n/**\n * Individual feature card component.\n *\n * @example\n * ```tsx\n * import { Zap } from \"lucide-react\"\n *\n * // Using emoji\n * <FeatureCard title=\"Fast\" icon=\"⚡\" details=\"Lightning fast.\" />\n *\n * // Using Lucide icon (tree-shakeable)\n * <FeatureCard title=\"Fast\" icon={<Zap size={28} />} details=\"Lightning fast.\" />\n * ```\n */\nexport function FeatureCard({\n title,\n icon,\n details,\n link,\n linkText,\n className,\n style,\n}: FeatureCardProps & { style?: CSSProperties }) {\n return (\n <div className={className ?? \"ardo-feature\"} style={style}>\n {icon && <div className=\"ardo-feature-icon\">{icon}</div>}\n <h3 className=\"ardo-feature-title\">{title}</h3>\n <p className=\"ardo-feature-details\">{details}</p>\n {link && (\n <Link to={link} className=\"ardo-feature-link\">\n {linkText || \"Learn more\"}\n </Link>\n )}\n </div>\n )\n}\n\n/**\n * Features grid component for displaying multiple feature cards.\n *\n * @example\n * ```tsx\n * <Features\n * title=\"Key Features\"\n * subtitle=\"Everything you need to build great docs\"\n * items={[\n * { title: \"React-First\", icon: \"⚛️\", details: \"Built on React.\" },\n * { title: \"Fast\", icon: \"⚡\", details: \"Powered by Vite.\" },\n * { title: \"Type-Safe\", icon: \"📝\", details: \"Full TypeScript support.\" },\n * ]}\n * />\n * ```\n */\nexport function Features({ items, title, subtitle, className }: FeaturesProps) {\n if (!items || items.length === 0) {\n return null\n }\n\n return (\n <section className={className ?? \"ardo-features\"}>\n {(title || subtitle) && (\n <div className=\"ardo-features-header\">\n {title && <h2 className=\"ardo-features-title\">{title}</h2>}\n {subtitle && <p className=\"ardo-features-subtitle\">{subtitle}</p>}\n </div>\n )}\n <div className=\"ardo-features-container\">\n {items.map((feature, index) => (\n <FeatureCard key={index} {...feature} style={{ animationDelay: `${index * 80}ms` }} />\n ))}\n </div>\n </section>\n )\n}\n"],"mappings":"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","names":["useState","Link","jsx","jsxs","useState","useEffect","jsx","jsxs","useState","useEffect","handleKeyDown","jsx","jsxs","useState","Link","useState","jsx","jsxs","jsx","jsxs","useState","createContext","useContext","jsx","jsxs","NavLink","useState","useEffect","jsx","jsxs","useState","useEffect","jsx","jsxs","Link","jsx","jsxs","NavLink","Link","Link","Fragment","jsx","jsxs","className","Link","jsx","jsxs"]}
@@ -622,10 +622,10 @@ function copyRecursive(src, dest) {
622
622
  }
623
623
  function detectGitHubBasename(cwd) {
624
624
  if (process.env.NODE_ENV !== "production") {
625
- return void 0;
625
+ return "/";
626
626
  }
627
627
  const repoName = detectGitHubRepoName(cwd || process.cwd());
628
- return repoName ? `/${repoName}/` : void 0;
628
+ return repoName ? `/${repoName}/` : "/";
629
629
  }
630
630
  var VIRTUAL_MODULE_ID = "virtual:ardo/config";
631
631
  var RESOLVED_VIRTUAL_MODULE_ID = "\0" + VIRTUAL_MODULE_ID;
@@ -1259,4 +1259,4 @@ export {
1259
1259
  getPageDataForRoute,
1260
1260
  generateSidebar2 as generateSidebar
1261
1261
  };
1262
- //# sourceMappingURL=chunk-R6CRXVQK.js.map
1262
+ //# sourceMappingURL=chunk-UHOGM3IL.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 { PressConfig, ProjectMeta, ResolvedConfig } from \"../config/types\"\nimport type { TypeDocConfig } from \"../typedoc/types\"\nimport { resolveConfig } 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 * 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<PressConfig> {\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 PressConfig)\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 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: PressConfig = {\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 }\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\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 const themeConfig = pressConfig.markdown?.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 const shikiOptions = hasThemeObject\n ? {\n themes: {\n light: themeConfig.light || \"github-light\",\n dark: themeConfig.dark || \"github-dark\",\n },\n defaultColor: false as const,\n transformers: [ardoLineTransformer({ globalLineNumbers: lineNumbers })],\n }\n : {\n theme: (themeConfig as string) || \"github-dark\",\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 light: \"github-light\",\n dark: \"github-dark\",\n }\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 light: \"github-light\",\n dark: \"github-dark\",\n }\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"]}
package/dist/index.d.ts CHANGED
@@ -2,7 +2,7 @@ export { defineConfig, loadConfig, resolveConfig } from './config/index.js';
2
2
  export { ArdoPluginOptions, ardo as ardoPlugin, generateSidebar, getPageDataForRoute, getSlugFromPath, loadAllDocs, loadDoc, transformMarkdown, transformMarkdownToReact } from './vite/index.js';
3
3
  export { H as HeadConfig, M as MarkdownConfig, N as NavItem, P as PageData, a as PageFrontmatter, b as PressConfig, c as ProjectMeta, R as ResolvedConfig, S as SidebarItem, d as SocialLink, T as TOCItem, e as ThemeConfig, f as TypeDocConfig } from './types-tjxB5eh7.js';
4
4
  export { PressProvider, findCurrentSidebarItem, getPrevNextLinks, useConfig, usePageData, usePressContext, useSidebar, useTOC, useThemeConfig } from './runtime/index.js';
5
- export { C as CodeBlock, a as CodeBlockProps, b as CodeGroup, c as CodeGroupProps, d as Container, e as ContainerProps, f as ContainerType, g as Content, h as CopyButton, D as Danger, i as DangerProps, j as DocLayout, k as DocPage, F as FeatureCard, l as FeatureCardProps, m as FeatureItem, n as Features, o as FeaturesProps, p as Footer, H as Header, q as Hero, r as HeroAction, s as HeroImage, t as HeroProps, u as HomePage, I as Info, v as InfoProps, L as Layout, N as Note, w as NoteProps, S as Search, x as Sidebar, T as TOC, y as Tab, z as TabList, A as TabListProps, B as TabPanel, E as TabPanelProps, G as TabPanels, J as TabPanelsProps, K as TabProps, M as Tabs, O as TabsProps, P as ThemeToggle, Q as Tip, R as TipProps, W as Warning, U as WarningProps } from './Features-DEndhnwl.js';
5
+ export { C as CodeBlock, a as CodeBlockProps, b as CodeGroup, c as CodeGroupProps, d as Container, e as ContainerProps, f as ContainerType, g as Content, h as CopyButton, D as Danger, i as DangerProps, j as DocLayout, k as DocPage, F as FeatureCard, l as FeatureCardProps, m as FeatureItem, n as Features, o as FeaturesProps, p as Footer, H as Header, q as Hero, r as HeroAction, s as HeroImage, t as HeroProps, u as HomePage, I as Info, v as InfoProps, L as Layout, N as Note, w as NoteProps, S as Search, x as Sidebar, T as TOC, y as Tab, z as TabList, A as TabListProps, B as TabPanel, E as TabPanelProps, G as TabPanels, J as TabPanelsProps, K as TabProps, M as Tabs, O as TabsProps, P as ThemeToggle, Q as Tip, R as TipProps, W as Warning, U as WarningProps } from './Features-BlVr5s_C.js';
6
6
  export { ApiDocHierarchy, ApiDocItem, ApiDocKind, ApiDocParameter, ApiDocReturn, ApiDocSource, ApiDocTag, ApiDocTypeParameter, ApiHierarchy, ApiItem, ApiKindBadge, ApiParametersTable, ApiReturns, ApiSignature, GeneratedApiDoc, TypeDocGenerator, TypeDocPluginOptions, createTypedocWatcher, generateApiDocs, typedocPlugin } from './typedoc/index.js';
7
7
  import 'vite';
8
8
  import 'shiki';
package/dist/index.js CHANGED
@@ -7,7 +7,7 @@ import {
7
7
  loadDoc,
8
8
  transformMarkdown,
9
9
  transformMarkdownToReact
10
- } from "./chunk-R6CRXVQK.js";
10
+ } from "./chunk-UHOGM3IL.js";
11
11
  import {
12
12
  defineConfig,
13
13
  loadConfig,
@@ -28,7 +28,7 @@ import {
28
28
  Sidebar,
29
29
  TOC,
30
30
  ThemeToggle
31
- } from "./chunk-6U5CYV74.js";
31
+ } from "./chunk-5CP4OM3G.js";
32
32
  import {
33
33
  ApiHierarchy,
34
34
  ApiItem,
@@ -1,4 +1,4 @@
1
- export { C as CodeBlock, a as CodeBlockProps, b as CodeGroup, c as CodeGroupProps, d as Container, e as ContainerProps, f as ContainerType, g as Content, h as CopyButton, D as Danger, i as DangerProps, V as DocContent, j as DocLayout, k as DocPage, F as FeatureCard, l as FeatureCardProps, m as FeatureItem, n as Features, o as FeaturesProps, p as Footer, X as FooterCopyrightProps, Y as FooterMessageProps, Z as FooterProps, H as Header, _ as HeaderProps, q as Hero, r as HeroAction, s as HeroImage, t as HeroProps, u as HomePage, I as Info, v as InfoProps, L as Layout, $ as LayoutProps, N as Note, w as NoteProps, S as Search, x as Sidebar, a0 as SidebarGroup, a1 as SidebarGroupProps, a2 as SidebarLink, a3 as SidebarLinkProps, a4 as SidebarProps, a5 as SocialLink, a6 as SocialLinkProps, T as TOC, y as Tab, z as TabList, A as TabListProps, B as TabPanel, E as TabPanelProps, G as TabPanels, J as TabPanelsProps, K as TabProps, M as Tabs, O as TabsProps, P as ThemeToggle, Q as Tip, R as TipProps, W as Warning, U as WarningProps } from '../Features-DEndhnwl.js';
1
+ export { C as CodeBlock, a as CodeBlockProps, b as CodeGroup, c as CodeGroupProps, d as Container, e as ContainerProps, f as ContainerType, g as Content, h as CopyButton, D as Danger, i as DangerProps, V as DocContent, j as DocLayout, k as DocPage, F as FeatureCard, l as FeatureCardProps, m as FeatureItem, n as Features, o as FeaturesProps, p as Footer, X as FooterCopyrightProps, Y as FooterMessageProps, Z as FooterProps, H as Header, _ as HeaderProps, q as Hero, r as HeroAction, s as HeroImage, t as HeroProps, u as HomePage, I as Info, v as InfoProps, L as Layout, $ as LayoutProps, N as Note, w as NoteProps, S as Search, x as Sidebar, a0 as SidebarGroup, a1 as SidebarGroupProps, a2 as SidebarLink, a3 as SidebarLinkProps, a4 as SidebarProps, a5 as SocialLink, a6 as SocialLinkProps, T as TOC, y as Tab, z as TabList, A as TabListProps, B as TabPanel, E as TabPanelProps, G as TabPanels, J as TabPanelsProps, K as TabProps, M as Tabs, O as TabsProps, P as ThemeToggle, Q as Tip, R as TipProps, W as Warning, U as WarningProps } from '../Features-BlVr5s_C.js';
2
2
  import * as react_jsx_runtime from 'react/jsx-runtime';
3
3
  import { ReactNode, ComponentProps } from 'react';
4
4
  import { NavLink as NavLink$1 } from 'react-router';
package/dist/ui/index.js CHANGED
@@ -19,7 +19,7 @@ import {
19
19
  SocialLink,
20
20
  TOC,
21
21
  ThemeToggle
22
- } from "../chunk-6U5CYV74.js";
22
+ } from "../chunk-5CP4OM3G.js";
23
23
  import {
24
24
  CodeBlock,
25
25
  CodeGroup,
@@ -29,7 +29,7 @@ declare function ardoRoutesPlugin(options?: ArdoRoutesPluginOptions): Plugin;
29
29
  * } satisfies Config
30
30
  * ```
31
31
  */
32
- declare function detectGitHubBasename(cwd?: string): string | undefined;
32
+ declare function detectGitHubBasename(cwd?: string): string;
33
33
  interface ArdoPluginOptions extends Partial<PressConfig> {
34
34
  /** Options for the routes generator plugin */
35
35
  routes?: ArdoRoutesPluginOptions | false;
@@ -10,7 +10,7 @@ import {
10
10
  loadDoc,
11
11
  transformMarkdown,
12
12
  transformMarkdownToReact
13
- } from "../chunk-R6CRXVQK.js";
13
+ } from "../chunk-UHOGM3IL.js";
14
14
  import "../chunk-CGFRUWNJ.js";
15
15
  import "../chunk-4IRLOOXV.js";
16
16
  export {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ardo",
3
- "version": "2.2.1",
3
+ "version": "2.3.0",
4
4
  "description": "React-first Static Documentation Framework",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -1 +0,0 @@
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 { PressConfig, ProjectMeta, ResolvedConfig } from \"../config/types\"\nimport type { TypeDocConfig } from \"../typedoc/types\"\nimport { resolveConfig } 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 * 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 | undefined {\n if (process.env.NODE_ENV !== \"production\") {\n return undefined\n }\n const repoName = detectGitHubRepoName(cwd || process.cwd())\n return repoName ? `/${repoName}/` : undefined\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<PressConfig> {\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 PressConfig)\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 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: PressConfig = {\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 }\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\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 const themeConfig = pressConfig.markdown?.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 const shikiOptions = hasThemeObject\n ? {\n themes: {\n light: themeConfig.light || \"github-light\",\n dark: themeConfig.dark || \"github-dark\",\n },\n defaultColor: false as const,\n transformers: [ardoLineTransformer({ globalLineNumbers: lineNumbers })],\n }\n : {\n theme: (themeConfig as string) || \"github-dark\",\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 light: \"github-light\",\n dark: \"github-dark\",\n }\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 light: \"github-light\",\n dark: \"github-dark\",\n }\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"]}