ardo 1.2.0 → 1.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -777,10 +777,19 @@ import { jsx as jsx11, jsxs as jsxs11 } from "react/jsx-runtime";
777
777
  function HomePage() {
778
778
  const pageData = usePageData();
779
779
  const config = useConfig();
780
+ const themeConfig = useThemeConfig();
780
781
  const hero = pageData?.frontmatter.hero;
781
782
  const features = pageData?.frontmatter.features;
782
783
  return /* @__PURE__ */ jsxs11("div", { className: "press-home", children: [
783
- /* @__PURE__ */ jsx11(Header, {}),
784
+ /* @__PURE__ */ jsx11(
785
+ Header,
786
+ {
787
+ logo: themeConfig.logo,
788
+ title: themeConfig.siteTitle !== false ? config.title : void 0,
789
+ nav: themeConfig.nav && themeConfig.nav.length > 0 ? /* @__PURE__ */ jsx11(Nav, { children: themeConfig.nav.map((item, index) => /* @__PURE__ */ jsx11(NavLink, { to: item.link, children: item.text }, index)) }) : void 0,
790
+ actions: themeConfig.socialLinks?.map((link, index) => /* @__PURE__ */ jsx11(SocialLink, { href: link.link, icon: link.icon, ariaLabel: link.ariaLabel }, index))
791
+ }
792
+ ),
784
793
  /* @__PURE__ */ jsxs11("main", { className: "press-home-main", children: [
785
794
  hero && /* @__PURE__ */ jsx11("section", { className: "press-hero", children: /* @__PURE__ */ jsxs11("div", { className: "press-hero-container", children: [
786
795
  hero.image && /* @__PURE__ */ jsx11("div", { className: "press-hero-image", children: /* @__PURE__ */ jsx11(
@@ -1132,4 +1141,4 @@ export {
1132
1141
  TabPanel,
1133
1142
  TabPanels
1134
1143
  };
1135
- //# sourceMappingURL=chunk-BPJODFL7.js.map
1144
+ //# sourceMappingURL=chunk-2JBVPO6S.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/theme/Layout.tsx","../src/theme/Header.tsx","../src/theme/components/ThemeToggle.tsx","../src/theme/components/Search.tsx","../src/theme/Sidebar.tsx","../src/theme/Footer.tsx","../src/theme/Nav.tsx","../src/theme/TOC.tsx","../src/theme/Content.tsx","../src/theme/DocPage.tsx","../src/theme/HomePage.tsx","../src/theme/components/CodeBlock.tsx","../src/theme/components/CopyButton.tsx","../src/theme/components/Container.tsx","../src/theme/components/Tabs.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 ?? \"press-layout\"}>\n {header}\n <div className=\"press-layout-container\">\n {sidebar}\n <main className=\"press-main\">{children}</main>\n </div>\n {footer}\n </div>\n )\n}\n","import { useState, type ReactNode } from \"react\"\nimport { Link } from \"@tanstack/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 ?? \"press-header\"}>\n <div className=\"press-header-container\">\n {/* Left: Mobile menu button + Logo/Title */}\n <div className=\"press-header-left\">\n <button\n className=\"press-mobile-menu-button\"\n onClick={() => setMobileMenuOpen(!mobileMenuOpen)}\n aria-label=\"Toggle menu\"\n aria-expanded={mobileMenuOpen}\n >\n <span className=\"press-hamburger\">\n <span></span>\n <span></span>\n <span></span>\n </span>\n </button>\n\n <Link to=\"/\" className=\"press-logo-link\">\n {logo && (\n <img\n src={typeof logo === \"string\" ? logo : logo.light}\n alt={title ?? \"Logo\"}\n className=\"press-logo\"\n />\n )}\n {title && <span className=\"press-site-title\">{title}</span>}\n </Link>\n </div>\n\n {/* Center: Navigation */}\n {nav && <div className=\"press-nav\">{nav}</div>}\n\n {/* Right: Search, Theme Toggle, Actions */}\n <div className=\"press-header-right\">\n {search && <Search />}\n {themeToggle && <ThemeToggle />}\n {actions}\n </div>\n </div>\n\n {/* Mobile menu */}\n {mobileMenuOpen && (\n <div className=\"press-mobile-menu\">\n <nav className=\"press-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 ?? \"press-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(\"press-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(\"press-theme\", nextTheme)\n applyTheme(nextTheme)\n }\n\n if (!mounted) {\n return (\n <button className=\"press-theme-toggle\" aria-label=\"Toggle theme\">\n <span className=\"press-theme-icon\">\n <SunIcon />\n </span>\n </button>\n )\n }\n\n return (\n <button\n className=\"press-theme-toggle\"\n onClick={toggleTheme}\n aria-label={`Switch to ${theme === \"light\" ? \"dark\" : theme === \"dark\" ? \"system\" : \"light\"} theme`}\n >\n <span className=\"press-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, useCallback } from \"react\"\nimport { Link } from \"@tanstack/react-router\"\nimport { useThemeConfig } from \"../../runtime/hooks\"\nimport MiniSearch, { type SearchResult } from \"minisearch\"\n\ninterface SearchDoc {\n id: string\n title: string\n content: string\n path: string\n section?: string\n}\n\nlet searchIndex: MiniSearch<SearchDoc> | null = null\n\nexport function Search() {\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 inputRef = useRef<HTMLInputElement>(null)\n const themeConfig = useThemeConfig()\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 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 setQuery(\"\")\n setResults([])\n setSelectedIndex(0)\n }\n }, [isOpen])\n\n const loadSearchIndex = useCallback(async () => {\n if (searchIndex) return searchIndex\n\n try {\n const response = await fetch(\"/_press/search-index.json\")\n if (!response.ok) return null\n\n const docs: SearchDoc[] = await response.json()\n\n searchIndex = 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\n searchIndex.addAll(docs)\n return searchIndex\n } catch {\n return null\n }\n }, [])\n\n const handleSearch = useCallback(\n async (searchQuery: string) => {\n setQuery(searchQuery)\n\n if (!searchQuery.trim()) {\n setResults([])\n return\n }\n\n const index = await loadSearchIndex()\n if (!index) {\n setResults([])\n return\n }\n\n const searchResults = index.search(searchQuery).slice(0, 10)\n setResults(searchResults)\n setSelectedIndex(0)\n },\n [loadSearchIndex]\n )\n\n const handleKeyDown = (e: React.KeyboardEvent) => {\n if (e.key === \"ArrowDown\") {\n e.preventDefault()\n setSelectedIndex((prev) => Math.min(prev + 1, results.length - 1))\n } else if (e.key === \"ArrowUp\") {\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 window.location.href = result.path as string\n setIsOpen(false)\n }\n }\n\n return (\n <>\n <button className=\"press-search-button\" onClick={() => setIsOpen(true)} aria-label=\"Search\">\n <SearchIcon />\n <span className=\"press-search-button-text\">{placeholder}</span>\n <span className=\"press-search-kbd\">\n <kbd>⌘</kbd>\n <kbd>K</kbd>\n </span>\n </button>\n\n {isOpen && (\n <div className=\"press-search-modal\" onClick={() => setIsOpen(false)}>\n <div className=\"press-search-dialog\" onClick={(e) => e.stopPropagation()}>\n <div className=\"press-search-input-wrapper\">\n <SearchIcon />\n <input\n ref={inputRef}\n type=\"text\"\n className=\"press-search-input\"\n placeholder={placeholder}\n value={query}\n onChange={(e) => handleSearch(e.target.value)}\n onKeyDown={handleKeyDown}\n />\n {query && (\n <button\n className=\"press-search-clear\"\n onClick={() => handleSearch(\"\")}\n aria-label=\"Clear search\"\n >\n ×\n </button>\n )}\n </div>\n\n {results.length > 0 && (\n <ul className=\"press-search-results\">\n {results.map((result, index) => (\n <li key={result.id}>\n <Link\n to={result.path as string}\n className={[\"press-search-result\", index === selectedIndex && \"selected\"]\n .filter(Boolean)\n .join(\" \")}\n onClick={() => setIsOpen(false)}\n >\n <span className=\"press-search-result-title\">{result.title as string}</span>\n {result.section && (\n <span className=\"press-search-result-section\">\n {result.section as string}\n </span>\n )}\n </Link>\n </li>\n ))}\n </ul>\n )}\n\n {query && results.length === 0 && (\n <div className=\"press-search-no-results\">No results found for \"{query}\"</div>\n )}\n\n <div className=\"press-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 </div>\n )}\n </>\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 Children,\n isValidElement,\n createContext,\n useContext,\n} from \"react\"\nimport { Link, useRouterState } from \"@tanstack/react-router\"\nimport type { SidebarItem as SidebarItemType } from \"../config/types\"\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 = useRouterState({ select: (s) => s.location.pathname })\n\n return (\n <SidebarContext.Provider value={{ currentPath: pathname }}>\n <aside className={className ?? \"press-sidebar\"}>\n <nav className=\"press-sidebar-nav\">\n {items ? (\n <SidebarItems items={items} depth={0} />\n ) : (\n <ul className=\"press-sidebar-list press-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 = [\"press-sidebar-text\", isChildActive && \"child-active\"]\n .filter(Boolean)\n .join(\" \")\n\n const linkClassName = [\"press-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 ?? \"press-sidebar-item\"}>\n <div className=\"press-sidebar-item-header\">\n {to ? (\n <Link to={to} className={linkClassName} activeProps={{ className: \"active\" }}>\n {title}\n </Link>\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={[\"press-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=\"press-sidebar-list press-sidebar-list-1\">{children}</ul>\n )}\n </li>\n )\n}\n\n// =============================================================================\n// SidebarLink Component\n// =============================================================================\n\nexport interface SidebarLinkProps {\n /** Internal route path */\n to: string\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 return (\n <li className=\"press-sidebar-item\">\n <Link\n to={to}\n className={className ?? \"press-sidebar-link\"}\n activeProps={{ className: \"active\" }}\n >\n {children}\n </Link>\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={`press-sidebar-list press-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 = [\"press-sidebar-link\", isChildActive && \"child-active\"]\n .filter(Boolean)\n .join(\" \")\n\n const textClassName = [\"press-sidebar-text\", isChildActive && \"child-active\"]\n .filter(Boolean)\n .join(\" \")\n\n return (\n <li className=\"press-sidebar-item\">\n <div className=\"press-sidebar-item-header\">\n {item.link ? (\n <Link to={item.link} className={linkClassName} activeProps={{ className: \"active\" }}>\n {item.text}\n </Link>\n ) : (\n <span className={textClassName} onClick={() => hasChildren && setCollapsed(!collapsed)}>\n {item.text}\n </span>\n )}\n\n {hasChildren && (\n <button\n className={[\"press-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 ?? \"press-footer\"}>\n <div className=\"press-footer-container\">\n {children ?? (\n <>\n {message && (\n <p className=\"press-footer-message\" dangerouslySetInnerHTML={{ __html: message }} />\n )}\n {copyright && (\n <p\n className=\"press-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, useState, createContext, useContext } from \"react\"\nimport { Link } from \"@tanstack/react-router\"\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 ?? \"press-nav\"}>{children}</nav>\n}\n\n// =============================================================================\n// NavLink Component\n// =============================================================================\n\nexport interface NavLinkProps {\n /** Internal route path (uses TanStack Router Link) */\n to?: string\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({ to, href, children, className, activeMatch }: NavLinkProps) {\n const navContext = useNavContext()\n const baseClassName = className ?? \"press-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 <Link\n to={to}\n className={baseClassName}\n activeProps={{ className: \"active\" }}\n activeOptions={activeMatch ? { exact: false } : { exact: false }}\n onClick={handleClick}\n >\n {children}\n </Link>\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 ?? \"press-nav-dropdown\"}\n onMouseEnter={() => setOpen(true)}\n onMouseLeave={() => setOpen(false)}\n >\n <button className=\"press-nav-dropdown-button\">\n {text}\n <span className=\"press-nav-dropdown-icon\">▼</span>\n </button>\n {open && <div className=\"press-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=\"press-toc\">\n <div className=\"press-toc-container\">\n <h3 className=\"press-toc-title\">{label}</h3>\n <nav className=\"press-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=\"press-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=\"press-toc-item\">\n <a\n href={`#${item.id}`}\n className={[\n `press-toc-link press-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, useThemeConfig, useSidebar } from \"../runtime/hooks\"\nimport { getPrevNextLinks } from \"../runtime/sidebar-utils\"\nimport { Link, useLocation } from \"@tanstack/react-router\"\n\ninterface ContentProps {\n children: ReactNode\n}\n\nexport function Content({ children }: ContentProps) {\n const pageData = usePageData()\n const themeConfig = useThemeConfig()\n const sidebar = useSidebar()\n const location = useLocation()\n\n const { prev, next } = getPrevNextLinks(sidebar, location.pathname)\n\n const showEditLink = pageData?.frontmatter.editLink !== false && themeConfig.editLink?.pattern\n\n const showLastUpdated =\n pageData?.frontmatter.lastUpdated !== false &&\n themeConfig.lastUpdated?.enabled &&\n pageData?.lastUpdated\n\n const editLink = showEditLink\n ? themeConfig.editLink!.pattern.replace(\":path\", pageData?.relativePath || \"\")\n : null\n\n const lastUpdatedText = showLastUpdated\n ? new Date(pageData!.lastUpdated!).toLocaleDateString(\n undefined,\n themeConfig.lastUpdated?.formatOptions ?? {\n year: \"numeric\",\n month: \"long\",\n day: \"numeric\",\n }\n )\n : null\n\n return (\n <article className=\"press-content-container\">\n {pageData?.frontmatter.title && (\n <header className=\"press-content-header\">\n <h1 className=\"press-content-title\">{pageData.frontmatter.title}</h1>\n {pageData.frontmatter.description && (\n <p className=\"press-content-description\">{pageData.frontmatter.description}</p>\n )}\n </header>\n )}\n\n <div className=\"press-content-body\">{children}</div>\n\n <footer className=\"press-content-footer\">\n {(showEditLink || showLastUpdated) && (\n <div className=\"press-content-meta\">\n {showEditLink && (\n <a\n href={editLink!}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"press-edit-link\"\n >\n {themeConfig.editLink?.text ?? \"Edit this page\"}\n </a>\n )}\n {showLastUpdated && (\n <span className=\"press-last-updated\">\n {themeConfig.lastUpdated?.text ?? \"Last updated\"}: {lastUpdatedText}\n </span>\n )}\n </div>\n )}\n\n {(prev || next) && (\n <nav className=\"press-prev-next\">\n {prev ? (\n <Link to={prev.link!} className=\"press-prev-link\">\n <span className=\"press-prev-next-label\">Previous</span>\n <span className=\"press-prev-next-title\">{prev.text}</span>\n </Link>\n ) : (\n <div />\n )}\n {next ? (\n <Link to={next.link!} className=\"press-next-link\">\n <span className=\"press-prev-next-label\">Next</span>\n <span className=\"press-prev-next-title\">{next.text}</span>\n </Link>\n ) : (\n <div />\n )}\n </nav>\n )}\n </footer>\n </article>\n )\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=\"press-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=\"press-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 \"@tanstack/react-router\"\nimport { usePageData, useConfig } from \"../runtime/hooks\"\nimport { Header } from \"./Header\"\nimport { Footer } from \"./Footer\"\n\nexport function HomePage() {\n const pageData = usePageData()\n const config = useConfig()\n\n const hero = pageData?.frontmatter.hero\n const features = pageData?.frontmatter.features\n\n return (\n <div className=\"press-home\">\n <Header />\n\n <main className=\"press-home-main\">\n {hero && (\n <section className=\"press-hero\">\n <div className=\"press-hero-container\">\n {hero.image && (\n <div className=\"press-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=\"press-hero-content\">\n {hero.name && <h1 className=\"press-hero-name\">{hero.name}</h1>}\n {hero.text && <p className=\"press-hero-text\">{hero.text}</p>}\n {hero.tagline && <p className=\"press-hero-tagline\">{hero.tagline}</p>}\n\n {hero.actions && hero.actions.length > 0 && (\n <div className=\"press-hero-actions\">\n {hero.actions.map((action, index) => (\n <Link\n key={index}\n to={action.link}\n className={`press-hero-action press-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=\"press-features\">\n <div className=\"press-features-container\">\n {features.map((feature, index) => (\n <div key={index} className=\"press-feature\">\n {feature.icon && <div className=\"press-feature-icon\">{feature.icon}</div>}\n <h3 className=\"press-feature-title\">{feature.title}</h3>\n <p className=\"press-feature-details\">{feature.details}</p>\n {feature.link && (\n <Link to={feature.link} className=\"press-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 { useState } from \"react\"\nimport { CopyButton } from \"./CopyButton\"\n\ninterface CodeBlockProps {\n code: string\n language?: string\n title?: string\n lineNumbers?: boolean\n highlightLines?: number[]\n children?: React.ReactNode\n}\n\nexport function CodeBlock({\n code,\n language = \"text\",\n title,\n lineNumbers = false,\n highlightLines = [],\n children,\n}: CodeBlockProps) {\n const lines = code.split(\"\\n\")\n\n return (\n <div className=\"press-code-block\" data-lang={language}>\n {title && <div className=\"press-code-title\">{title}</div>}\n <div className=\"press-code-wrapper\">\n {children || (\n <pre className={`language-${language}`}>\n <code>\n {lines.map((line, index) => {\n const lineNum = index + 1\n const isHighlighted = highlightLines.includes(lineNum)\n const classes = [\"press-code-line\"]\n if (isHighlighted) classes.push(\"highlighted\")\n\n return (\n <span key={index} className={classes.join(\" \")}>\n {lineNumbers && <span className=\"press-line-number\">{lineNum}</span>}\n <span className=\"press-line-content\">{line}</span>\n {index < lines.length - 1 && \"\\n\"}\n </span>\n )\n })}\n </code>\n </pre>\n )}\n <CopyButton code={code} />\n </div>\n </div>\n )\n}\n\ninterface CodeGroupProps {\n children: React.ReactNode\n}\n\nexport function CodeGroup({ children }: CodeGroupProps) {\n const [activeTab, setActiveTab] = useState(0)\n\n const childArray = Array.isArray(children) ? children : [children]\n const tabs = childArray.map((child, index) => {\n const props = (child as React.ReactElement)?.props as { title?: string; language?: string }\n return props?.title || props?.language || `Tab ${index + 1}`\n })\n\n return (\n <div className=\"press-code-group\">\n <div className=\"press-code-group-tabs\">\n {tabs.map((tab, index) => (\n <button\n key={index}\n className={[\"press-code-group-tab\", index === activeTab && \"active\"]\n .filter(Boolean)\n .join(\" \")}\n onClick={() => setActiveTab(index)}\n >\n {tab}\n </button>\n ))}\n </div>\n <div className=\"press-code-group-panels\">\n {childArray.map((child, index) => (\n <div\n key={index}\n className={[\"press-code-group-panel\", index === activeTab && \"active\"]\n .filter(Boolean)\n .join(\" \")}\n style={{ display: index === activeTab ? \"block\" : \"none\" }}\n >\n {child}\n </div>\n ))}\n </div>\n </div>\n )\n}\n","import { useState } from \"react\"\n\ninterface CopyButtonProps {\n code: string\n}\n\nexport function CopyButton({ code }: CopyButtonProps) {\n const [copied, setCopied] = useState(false)\n\n const handleCopy = async () => {\n try {\n await navigator.clipboard.writeText(code)\n setCopied(true)\n setTimeout(() => setCopied(false), 2000)\n } catch (err) {\n console.error(\"Failed to copy:\", err)\n }\n }\n\n return (\n <button\n className=\"press-copy-button\"\n onClick={handleCopy}\n aria-label={copied ? \"Copied!\" : \"Copy code\"}\n >\n {copied ? <CheckIcon /> : <CopyIcon />}\n <span className=\"press-copy-text\">{copied ? \"Copied!\" : \"Copy\"}</span>\n </button>\n )\n}\n\nfunction CopyIcon() {\n return (\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 <rect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\" />\n <path d=\"M5 15H4a2 2 0 01-2-2V4a2 2 0 012-2h9a2 2 0 012 2v1\" />\n </svg>\n )\n}\n\nfunction CheckIcon() {\n return (\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 <polyline points=\"20,6 9,17 4,12\" />\n </svg>\n )\n}\n","import { type ReactNode } from \"react\"\n\ntype ContainerType = \"tip\" | \"warning\" | \"danger\" | \"info\" | \"note\"\n\ninterface ContainerProps {\n type: ContainerType\n title?: string\n children: ReactNode\n}\n\nconst defaultTitles: Record<ContainerType, string> = {\n tip: \"TIP\",\n warning: \"WARNING\",\n danger: \"DANGER\",\n info: \"INFO\",\n note: \"NOTE\",\n}\n\nconst icons: Record<ContainerType, ReactNode> = {\n tip: (\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=\"M9 18h6M12 2v1M12 21v-6M4.22 4.22l.71.71M19.07 4.93l-.71.71M1 12h2M21 12h2M4.22 19.78l.71-.71M19.07 19.07l-.71-.71\" />\n <circle cx=\"12\" cy=\"12\" r=\"4\" />\n </svg>\n ),\n warning: (\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=\"M10.29 3.86L1.82 18a2 2 0 001.71 3h16.94a2 2 0 001.71-3L13.71 3.86a2 2 0 00-3.42 0z\" />\n <line x1=\"12\" y1=\"9\" x2=\"12\" y2=\"13\" />\n <line x1=\"12\" y1=\"17\" x2=\"12.01\" y2=\"17\" />\n </svg>\n ),\n danger: (\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=\"10\" />\n <line x1=\"15\" y1=\"9\" x2=\"9\" y2=\"15\" />\n <line x1=\"9\" y1=\"9\" x2=\"15\" y2=\"15\" />\n </svg>\n ),\n info: (\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=\"10\" />\n <line x1=\"12\" y1=\"16\" x2=\"12\" y2=\"12\" />\n <line x1=\"12\" y1=\"8\" x2=\"12.01\" y2=\"8\" />\n </svg>\n ),\n note: (\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=\"M14.5 2H6a2 2 0 00-2 2v16a2 2 0 002 2h12a2 2 0 002-2V7.5L14.5 2z\" />\n <polyline points=\"14,2 14,8 20,8\" />\n <line x1=\"16\" y1=\"13\" x2=\"8\" y2=\"13\" />\n <line x1=\"16\" y1=\"17\" x2=\"8\" y2=\"17\" />\n <line x1=\"10\" y1=\"9\" x2=\"8\" y2=\"9\" />\n </svg>\n ),\n}\n\nexport function Container({ type, title, children }: ContainerProps) {\n const displayTitle = title || defaultTitles[type]\n\n return (\n <div className={`press-container press-container-${type}`}>\n <p className=\"press-container-title\">\n <span className=\"press-container-icon\">{icons[type]}</span>\n {displayTitle}\n </p>\n <div className=\"press-container-content\">{children}</div>\n </div>\n )\n}\n\nexport function Tip({ title, children }: Omit<ContainerProps, \"type\">) {\n return (\n <Container type=\"tip\" title={title}>\n {children}\n </Container>\n )\n}\n\nexport function Warning({ title, children }: Omit<ContainerProps, \"type\">) {\n return (\n <Container type=\"warning\" title={title}>\n {children}\n </Container>\n )\n}\n\nexport function Danger({ title, children }: Omit<ContainerProps, \"type\">) {\n return (\n <Container type=\"danger\" title={title}>\n {children}\n </Container>\n )\n}\n\nexport function Info({ title, children }: Omit<ContainerProps, \"type\">) {\n return (\n <Container type=\"info\" title={title}>\n {children}\n </Container>\n )\n}\n\nexport function Note({ title, children }: Omit<ContainerProps, \"type\">) {\n return (\n <Container type=\"note\" title={title}>\n {children}\n </Container>\n )\n}\n","import { useState, createContext, useContext, type ReactNode } from \"react\"\n\ninterface TabsContextValue {\n activeTab: string\n setActiveTab: (tab: string) => void\n}\n\nconst TabsContext = createContext<TabsContextValue | null>(null)\n\nfunction useTabsContext() {\n const context = useContext(TabsContext)\n if (!context) {\n throw new Error(\"Tab components must be used within a Tabs component\")\n }\n return context\n}\n\ninterface TabsProps {\n defaultValue?: string\n children: ReactNode\n}\n\nexport function Tabs({ defaultValue, children }: TabsProps) {\n const [activeTab, setActiveTab] = useState(defaultValue || \"\")\n\n return (\n <TabsContext.Provider value={{ activeTab, setActiveTab }}>\n <div className=\"press-tabs\">{children}</div>\n </TabsContext.Provider>\n )\n}\n\ninterface TabListProps {\n children: ReactNode\n}\n\nexport function TabList({ children }: TabListProps) {\n return (\n <div className=\"press-tab-list\" role=\"tablist\">\n {children}\n </div>\n )\n}\n\ninterface TabProps {\n value: string\n children: ReactNode\n}\n\nexport function Tab({ value, children }: TabProps) {\n const { activeTab, setActiveTab } = useTabsContext()\n const isActive = activeTab === value\n\n return (\n <button\n role=\"tab\"\n aria-selected={isActive}\n className={[\"press-tab\", isActive && \"active\"].filter(Boolean).join(\" \")}\n onClick={() => setActiveTab(value)}\n >\n {children}\n </button>\n )\n}\n\ninterface TabPanelProps {\n value: string\n children: ReactNode\n}\n\nexport function TabPanel({ value, children }: TabPanelProps) {\n const { activeTab } = useTabsContext()\n const isActive = activeTab === value\n\n if (!isActive) {\n return null\n }\n\n return (\n <div role=\"tabpanel\" className=\"press-tab-panel\">\n {children}\n </div>\n )\n}\n\ninterface TabPanelsProps {\n children: ReactNode\n}\n\nexport function TabPanels({ children }: TabPanelsProps) {\n return <div className=\"press-tab-panels\">{children}</div>\n}\n"],"mappings":";;;;;;;;;;AAqCM,SAEE,KAFF;AAJC,SAAS,OAAO,EAAE,QAAQ,SAAS,QAAQ,UAAU,UAAU,GAAgB;AACpF,SACE,qBAAC,SAAI,WAAW,aAAa,gBAC1B;AAAA;AAAA,IACD,qBAAC,SAAI,WAAU,0BACZ;AAAA;AAAA,MACD,oBAAC,UAAK,WAAU,cAAc,UAAS;AAAA,OACzC;AAAA,IACC;AAAA,KACH;AAEJ;;;AC5CA,SAAS,YAAAA,iBAAgC;AACzC,SAAS,QAAAC,aAAY;;;ACDrB,SAAS,UAAU,iBAAiB;AA+B1B,gBAAAC,MAYJ,QAAAC,aAZI;AA3BH,SAAS,cAAc;AAC5B,QAAM,CAAC,OAAO,QAAQ,IAAI,SAAgB,QAAQ;AAClD,QAAM,CAAC,SAAS,UAAU,IAAI,SAAS,KAAK;AAE5C,YAAU,MAAM;AACd,eAAW,IAAI;AAEf,UAAM,SAAS,aAAa,QAAQ,aAAa;AACjD,QAAI,QAAQ;AACV,eAAS,MAAM;AACf,iBAAW,MAAM;AAAA,IACnB,OAAO;AACL,iBAAW,QAAQ;AAAA,IACrB;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,QAAM,cAAc,MAAM;AACxB,UAAM,YAAmB,UAAU,UAAU,SAAS,UAAU,SAAS,WAAW;AACpF,aAAS,SAAS;AAClB,iBAAa,QAAQ,eAAe,SAAS;AAC7C,eAAW,SAAS;AAAA,EACtB;AAEA,MAAI,CAAC,SAAS;AACZ,WACE,gBAAAD,KAAC,YAAO,WAAU,sBAAqB,cAAW,gBAChD,0BAAAA,KAAC,UAAK,WAAU,oBACd,0BAAAA,KAAC,WAAQ,GACX,GACF;AAAA,EAEJ;AAEA,SACE,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACC,WAAU;AAAA,MACV,SAAS;AAAA,MACT,cAAY,aAAa,UAAU,UAAU,SAAS,UAAU,SAAS,WAAW,OAAO;AAAA,MAE3F,0BAAAC,MAAC,UAAK,WAAU,oBACb;AAAA,kBAAU,WAAW,gBAAAD,KAAC,WAAQ;AAAA,QAC9B,UAAU,UAAU,gBAAAA,KAAC,YAAS;AAAA,QAC9B,UAAU,YAAY,gBAAAA,KAAC,cAAW;AAAA,SACrC;AAAA;AAAA,EACF;AAEJ;AAEA,SAAS,WAAW,OAAc;AAChC,QAAM,OAAO,SAAS;AAEtB,MAAI,UAAU,UAAU;AACtB,UAAM,SAAS,OAAO,WAAW,8BAA8B,EAAE;AACjE,SAAK,UAAU,OAAO,QAAQ,MAAM;AACpC,SAAK,UAAU,OAAO,SAAS,CAAC,MAAM;AAAA,EACxC,OAAO;AACL,SAAK,UAAU,OAAO,QAAQ,UAAU,MAAM;AAC9C,SAAK,UAAU,OAAO,SAAS,UAAU,OAAO;AAAA,EAClD;AACF;AAEA,SAAS,UAAU;AACjB,SACE,gBAAAC;AAAA,IAAC;AAAA;AAAA,MACC,SAAQ;AAAA,MACR,OAAM;AAAA,MACN,QAAO;AAAA,MACP,MAAK;AAAA,MACL,QAAO;AAAA,MACP,aAAY;AAAA,MAEZ;AAAA,wBAAAD,KAAC,YAAO,IAAG,MAAK,IAAG,MAAK,GAAE,KAAI;AAAA,QAC9B,gBAAAA,KAAC,UAAK,IAAG,MAAK,IAAG,KAAI,IAAG,MAAK,IAAG,KAAI;AAAA,QACpC,gBAAAA,KAAC,UAAK,IAAG,MAAK,IAAG,MAAK,IAAG,MAAK,IAAG,MAAK;AAAA,QACtC,gBAAAA,KAAC,UAAK,IAAG,QAAO,IAAG,QAAO,IAAG,QAAO,IAAG,QAAO;AAAA,QAC9C,gBAAAA,KAAC,UAAK,IAAG,SAAQ,IAAG,SAAQ,IAAG,SAAQ,IAAG,SAAQ;AAAA,QAClD,gBAAAA,KAAC,UAAK,IAAG,KAAI,IAAG,MAAK,IAAG,KAAI,IAAG,MAAK;AAAA,QACpC,gBAAAA,KAAC,UAAK,IAAG,MAAK,IAAG,MAAK,IAAG,MAAK,IAAG,MAAK;AAAA,QACtC,gBAAAA,KAAC,UAAK,IAAG,QAAO,IAAG,SAAQ,IAAG,QAAO,IAAG,SAAQ;AAAA,QAChD,gBAAAA,KAAC,UAAK,IAAG,SAAQ,IAAG,QAAO,IAAG,SAAQ,IAAG,QAAO;AAAA;AAAA;AAAA,EAClD;AAEJ;AAEA,SAAS,WAAW;AAClB,SACE,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACC,SAAQ;AAAA,MACR,OAAM;AAAA,MACN,QAAO;AAAA,MACP,MAAK;AAAA,MACL,QAAO;AAAA,MACP,aAAY;AAAA,MAEZ,0BAAAA,KAAC,UAAK,GAAE,mDAAkD;AAAA;AAAA,EAC5D;AAEJ;AAEA,SAAS,aAAa;AACpB,SACE,gBAAAC;AAAA,IAAC;AAAA;AAAA,MACC,SAAQ;AAAA,MACR,OAAM;AAAA,MACN,QAAO;AAAA,MACP,MAAK;AAAA,MACL,QAAO;AAAA,MACP,aAAY;AAAA,MAEZ;AAAA,wBAAAD,KAAC,UAAK,GAAE,KAAI,GAAE,KAAI,OAAM,MAAK,QAAO,MAAK,IAAG,KAAI,IAAG,KAAI;AAAA,QACvD,gBAAAA,KAAC,UAAK,IAAG,KAAI,IAAG,MAAK,IAAG,MAAK,IAAG,MAAK;AAAA,QACrC,gBAAAA,KAAC,UAAK,IAAG,MAAK,IAAG,MAAK,IAAG,MAAK,IAAG,MAAK;AAAA;AAAA;AAAA,EACxC;AAEJ;;;ACtHA,SAAS,YAAAE,WAAU,aAAAC,YAAW,QAAQ,mBAAmB;AACzD,SAAS,YAAY;AAErB,OAAO,gBAAuC;AAoH1C,mBAEI,OAAAC,MAEA,QAAAC,aAJJ;AA1GJ,IAAI,cAA4C;AAEzC,SAAS,SAAS;AACvB,QAAM,CAAC,QAAQ,SAAS,IAAIC,UAAS,KAAK;AAC1C,QAAM,CAAC,OAAO,QAAQ,IAAIA,UAAS,EAAE;AACrC,QAAM,CAAC,SAAS,UAAU,IAAIA,UAAyB,CAAC,CAAC;AACzD,QAAM,CAAC,eAAe,gBAAgB,IAAIA,UAAS,CAAC;AACpD,QAAM,WAAW,OAAyB,IAAI;AAC9C,QAAM,cAAc,eAAe;AAEnC,QAAM,cAAc,YAAY,QAAQ,eAAe;AAEvD,EAAAC,WAAU,MAAM;AACd,UAAMC,iBAAgB,CAAC,MAAqB;AAC1C,WAAK,EAAE,WAAW,EAAE,YAAY,EAAE,QAAQ,KAAK;AAC7C,UAAE,eAAe;AACjB,kBAAU,IAAI;AAAA,MAChB;AAEA,UAAI,EAAE,QAAQ,UAAU;AACtB,kBAAU,KAAK;AAAA,MACjB;AAAA,IACF;AAEA,aAAS,iBAAiB,WAAWA,cAAa;AAClD,WAAO,MAAM,SAAS,oBAAoB,WAAWA,cAAa;AAAA,EACpE,GAAG,CAAC,CAAC;AAEL,EAAAD,WAAU,MAAM;AACd,QAAI,UAAU,SAAS,SAAS;AAC9B,eAAS,QAAQ,MAAM;AAAA,IACzB;AAAA,EACF,GAAG,CAAC,MAAM,CAAC;AAEX,EAAAA,WAAU,MAAM;AACd,QAAI,CAAC,QAAQ;AACX,eAAS,EAAE;AACX,iBAAW,CAAC,CAAC;AACb,uBAAiB,CAAC;AAAA,IACpB;AAAA,EACF,GAAG,CAAC,MAAM,CAAC;AAEX,QAAM,kBAAkB,YAAY,YAAY;AAC9C,QAAI,YAAa,QAAO;AAExB,QAAI;AACF,YAAM,WAAW,MAAM,MAAM,2BAA2B;AACxD,UAAI,CAAC,SAAS,GAAI,QAAO;AAEzB,YAAM,OAAoB,MAAM,SAAS,KAAK;AAE9C,oBAAc,IAAI,WAAsB;AAAA,QACtC,QAAQ,CAAC,SAAS,WAAW,SAAS;AAAA,QACtC,aAAa,CAAC,SAAS,QAAQ,SAAS;AAAA,QACxC,eAAe;AAAA,UACb,OAAO,EAAE,OAAO,EAAE;AAAA,UAClB,OAAO;AAAA,UACP,QAAQ;AAAA,QACV;AAAA,MACF,CAAC;AAED,kBAAY,OAAO,IAAI;AACvB,aAAO;AAAA,IACT,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,QAAM,eAAe;AAAA,IACnB,OAAO,gBAAwB;AAC7B,eAAS,WAAW;AAEpB,UAAI,CAAC,YAAY,KAAK,GAAG;AACvB,mBAAW,CAAC,CAAC;AACb;AAAA,MACF;AAEA,YAAM,QAAQ,MAAM,gBAAgB;AACpC,UAAI,CAAC,OAAO;AACV,mBAAW,CAAC,CAAC;AACb;AAAA,MACF;AAEA,YAAM,gBAAgB,MAAM,OAAO,WAAW,EAAE,MAAM,GAAG,EAAE;AAC3D,iBAAW,aAAa;AACxB,uBAAiB,CAAC;AAAA,IACpB;AAAA,IACA,CAAC,eAAe;AAAA,EAClB;AAEA,QAAM,gBAAgB,CAAC,MAA2B;AAChD,QAAI,EAAE,QAAQ,aAAa;AACzB,QAAE,eAAe;AACjB,uBAAiB,CAAC,SAAS,KAAK,IAAI,OAAO,GAAG,QAAQ,SAAS,CAAC,CAAC;AAAA,IACnE,WAAW,EAAE,QAAQ,WAAW;AAC9B,QAAE,eAAe;AACjB,uBAAiB,CAAC,SAAS,KAAK,IAAI,OAAO,GAAG,CAAC,CAAC;AAAA,IAClD,WAAW,EAAE,QAAQ,WAAW,QAAQ,aAAa,GAAG;AACtD,QAAE,eAAe;AACjB,YAAM,SAAS,QAAQ,aAAa;AACpC,aAAO,SAAS,OAAO,OAAO;AAC9B,gBAAU,KAAK;AAAA,IACjB;AAAA,EACF;AAEA,SACE,gBAAAF,MAAA,YACE;AAAA,oBAAAA,MAAC,YAAO,WAAU,uBAAsB,SAAS,MAAM,UAAU,IAAI,GAAG,cAAW,UACjF;AAAA,sBAAAD,KAAC,cAAW;AAAA,MACZ,gBAAAA,KAAC,UAAK,WAAU,4BAA4B,uBAAY;AAAA,MACxD,gBAAAC,MAAC,UAAK,WAAU,oBACd;AAAA,wBAAAD,KAAC,SAAI,oBAAC;AAAA,QACN,gBAAAA,KAAC,SAAI,eAAC;AAAA,SACR;AAAA,OACF;AAAA,IAEC,UACC,gBAAAA,KAAC,SAAI,WAAU,sBAAqB,SAAS,MAAM,UAAU,KAAK,GAChE,0BAAAC,MAAC,SAAI,WAAU,uBAAsB,SAAS,CAAC,MAAM,EAAE,gBAAgB,GACrE;AAAA,sBAAAA,MAAC,SAAI,WAAU,8BACb;AAAA,wBAAAD,KAAC,cAAW;AAAA,QACZ,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,KAAK;AAAA,YACL,MAAK;AAAA,YACL,WAAU;AAAA,YACV;AAAA,YACA,OAAO;AAAA,YACP,UAAU,CAAC,MAAM,aAAa,EAAE,OAAO,KAAK;AAAA,YAC5C,WAAW;AAAA;AAAA,QACb;AAAA,QACC,SACC,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,WAAU;AAAA,YACV,SAAS,MAAM,aAAa,EAAE;AAAA,YAC9B,cAAW;AAAA,YACZ;AAAA;AAAA,QAED;AAAA,SAEJ;AAAA,MAEC,QAAQ,SAAS,KAChB,gBAAAA,KAAC,QAAG,WAAU,wBACX,kBAAQ,IAAI,CAAC,QAAQ,UACpB,gBAAAA,KAAC,QACC,0BAAAC;AAAA,QAAC;AAAA;AAAA,UACC,IAAI,OAAO;AAAA,UACX,WAAW,CAAC,uBAAuB,UAAU,iBAAiB,UAAU,EACrE,OAAO,OAAO,EACd,KAAK,GAAG;AAAA,UACX,SAAS,MAAM,UAAU,KAAK;AAAA,UAE9B;AAAA,4BAAAD,KAAC,UAAK,WAAU,6BAA6B,iBAAO,OAAgB;AAAA,YACnE,OAAO,WACN,gBAAAA,KAAC,UAAK,WAAU,+BACb,iBAAO,SACV;AAAA;AAAA;AAAA,MAEJ,KAdO,OAAO,EAehB,CACD,GACH;AAAA,MAGD,SAAS,QAAQ,WAAW,KAC3B,gBAAAC,MAAC,SAAI,WAAU,2BAA0B;AAAA;AAAA,QAAuB;AAAA,QAAM;AAAA,SAAC;AAAA,MAGzE,gBAAAA,MAAC,SAAI,WAAU,uBACb;AAAA,wBAAAA,MAAC,UACC;AAAA,0BAAAD,KAAC,SAAI,oBAAC;AAAA,UAAM;AAAA,UAAC,gBAAAA,KAAC,SAAI,oBAAC;AAAA,UAAM;AAAA,WAC3B;AAAA,QACA,gBAAAC,MAAC,UACC;AAAA,0BAAAD,KAAC,SAAI,oBAAC;AAAA,UAAM;AAAA,WACd;AAAA,QACA,gBAAAC,MAAC,UACC;AAAA,0BAAAD,KAAC,SAAI,iBAAG;AAAA,UAAM;AAAA,WAChB;AAAA,SACF;AAAA,OACF,GACF;AAAA,KAEJ;AAEJ;AAEA,SAAS,aAAa;AACpB,SACE,gBAAAC;AAAA,IAAC;AAAA;AAAA,MACC,SAAQ;AAAA,MACR,OAAM;AAAA,MACN,QAAO;AAAA,MACP,MAAK;AAAA,MACL,QAAO;AAAA,MACP,aAAY;AAAA,MAEZ;AAAA,wBAAAD,KAAC,YAAO,IAAG,MAAK,IAAG,MAAK,GAAE,KAAI;AAAA,QAC9B,gBAAAA,KAAC,UAAK,IAAG,MAAK,IAAG,MAAK,IAAG,SAAQ,IAAG,SAAQ;AAAA;AAAA;AAAA,EAC9C;AAEJ;;;AFjJY,SACE,OAAAK,MADF,QAAAC,aAAA;AAtBL,SAAS,OAAO;AAAA,EACrB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,SAAS;AAAA,EACT,cAAc;AAAA,EACd;AACF,GAAgB;AACd,QAAM,CAAC,gBAAgB,iBAAiB,IAAIC,UAAS,KAAK;AAE1D,SACE,gBAAAD,MAAC,YAAO,WAAW,aAAa,gBAC9B;AAAA,oBAAAA,MAAC,SAAI,WAAU,0BAEb;AAAA,sBAAAA,MAAC,SAAI,WAAU,qBACb;AAAA,wBAAAD;AAAA,UAAC;AAAA;AAAA,YACC,WAAU;AAAA,YACV,SAAS,MAAM,kBAAkB,CAAC,cAAc;AAAA,YAChD,cAAW;AAAA,YACX,iBAAe;AAAA,YAEf,0BAAAC,MAAC,UAAK,WAAU,mBACd;AAAA,8BAAAD,KAAC,UAAK;AAAA,cACN,gBAAAA,KAAC,UAAK;AAAA,cACN,gBAAAA,KAAC,UAAK;AAAA,eACR;AAAA;AAAA,QACF;AAAA,QAEA,gBAAAC,MAACE,OAAA,EAAK,IAAG,KAAI,WAAU,mBACpB;AAAA,kBACC,gBAAAH;AAAA,YAAC;AAAA;AAAA,cACC,KAAK,OAAO,SAAS,WAAW,OAAO,KAAK;AAAA,cAC5C,KAAK,SAAS;AAAA,cACd,WAAU;AAAA;AAAA,UACZ;AAAA,UAED,SAAS,gBAAAA,KAAC,UAAK,WAAU,oBAAoB,iBAAM;AAAA,WACtD;AAAA,SACF;AAAA,MAGC,OAAO,gBAAAA,KAAC,SAAI,WAAU,aAAa,eAAI;AAAA,MAGxC,gBAAAC,MAAC,SAAI,WAAU,sBACZ;AAAA,kBAAU,gBAAAD,KAAC,UAAO;AAAA,QAClB,eAAe,gBAAAA,KAAC,eAAY;AAAA,QAC5B;AAAA,SACH;AAAA,OACF;AAAA,IAGC,kBACC,gBAAAA,KAAC,SAAI,WAAU,qBACb,0BAAAA,KAAC,SAAI,WAAU,oBAAmB,SAAS,MAAM,kBAAkB,KAAK,GACrE,eACH,GACF;AAAA,KAEJ;AAEJ;AAyBO,SAAS,WAAW,EAAE,MAAM,MAAM,WAAW,UAAU,GAAoB;AAChF,SACE,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,QAAO;AAAA,MACP,KAAI;AAAA,MACJ,WAAW,aAAa;AAAA,MACxB,cAAY,aAAa;AAAA,MAEzB,0BAAAA,KAAC,cAAW,MAAY;AAAA;AAAA,EAC1B;AAEJ;AAMA,SAAS,WAAW,EAAE,KAAK,GAAqB;AAC9C,QAAMI,SAAgC;AAAA,IACpC,QACE;AAAA,IACF,SACE;AAAA,IACF,SACE;AAAA,IACF,UACE;AAAA,IACF,SACE;AAAA,IACF,KAAK;AAAA,EACP;AAEA,QAAM,OAAOA,OAAM,IAAI,KAAKA,OAAM;AAElC,SACE,gBAAAJ,KAAC,SAAI,SAAQ,aAAY,OAAM,MAAK,QAAO,MAAK,MAAK,gBACnD,0BAAAA,KAAC,UAAK,GAAG,MAAM,GACjB;AAEJ;;;AG7KA;AAAA,EACE,YAAAK;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,QAAAC,OAAM,sBAAsB;AAiEzB,gBAAAC,MAyEN,QAAAC,aAzEM;AAtDZ,IAAM,iBAAiB,cAAmC,EAAE,aAAa,GAAG,CAAC;AAE7E,SAAS,oBAAoB;AAC3B,SAAO,WAAW,cAAc;AAClC;AA0CO,SAAS,QAAQ,EAAE,OAAO,UAAU,UAAU,GAAiB;AACpE,QAAM,WAAW,eAAe,EAAE,QAAQ,CAAC,MAAM,EAAE,SAAS,SAAS,CAAC;AAEtE,SACE,gBAAAD,KAAC,eAAe,UAAf,EAAwB,OAAO,EAAE,aAAa,SAAS,GACtD,0BAAAA,KAAC,WAAM,WAAW,aAAa,iBAC7B,0BAAAA,KAAC,SAAI,WAAU,qBACZ,kBACC,gBAAAA,KAAC,gBAAa,OAAc,OAAO,GAAG,IAEtC,gBAAAA,KAAC,QAAG,WAAU,2CAA2C,UAAS,GAEtE,GACF,GACF;AAEJ;AAuCO,SAAS,aAAa;AAAA,EAC3B;AAAA,EACA;AAAA,EACA,WAAW,mBAAmB;AAAA,EAC9B,cAAc;AAAA,EACd;AAAA,EACA;AACF,GAAsB;AACpB,QAAM,CAAC,WAAW,YAAY,IAAIF,UAAS,gBAAgB;AAC3D,QAAM,EAAE,YAAY,IAAI,kBAAkB;AAG1C,QAAM,gBAAgB,oBAAoB,UAAU,WAAW;AAE/D,QAAM,gBAAgB,CAAC,sBAAsB,iBAAiB,cAAc,EACzE,OAAO,OAAO,EACd,KAAK,GAAG;AAEX,QAAM,gBAAgB,CAAC,sBAAsB,iBAAiB,cAAc,EACzE,OAAO,OAAO,EACd,KAAK,GAAG;AAEX,QAAM,cAAc,SAAS,MAAM,QAAQ,IAAI;AAE/C,SACE,gBAAAG,MAAC,QAAG,WAAW,aAAa,sBAC1B;AAAA,oBAAAA,MAAC,SAAI,WAAU,6BACZ;AAAA,WACC,gBAAAD,KAACD,OAAA,EAAK,IAAQ,WAAW,eAAe,aAAa,EAAE,WAAW,SAAS,GACxE,iBACH,IAEA,gBAAAC;AAAA,QAAC;AAAA;AAAA,UACC,WAAW;AAAA,UACX,SAAS,MAAM,eAAe,eAAe,aAAa,CAAC,SAAS;AAAA,UACpE,OAAO,eAAe,cAAc,EAAE,QAAQ,UAAU,IAAI;AAAA,UAE3D;AAAA;AAAA,MACH;AAAA,MAGD,eAAe,eACd,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,WAAW,CAAC,0BAA0B,aAAa,WAAW,EAC3D,OAAO,OAAO,EACd,KAAK,GAAG;AAAA,UACX,SAAS,MAAM,aAAa,CAAC,SAAS;AAAA,UACtC,cAAY,YAAY,WAAW;AAAA,UAEnC,0BAAAA;AAAA,YAAC;AAAA;AAAA,cACC,SAAQ;AAAA,cACR,OAAM;AAAA,cACN,QAAO;AAAA,cACP,MAAK;AAAA,cACL,QAAO;AAAA,cACP,aAAY;AAAA,cAEZ,0BAAAA,KAAC,UAAK,GAAE,gBAAe;AAAA;AAAA,UACzB;AAAA;AAAA,MACF;AAAA,OAEJ;AAAA,IAEC,eAAe,CAAC,aACf,gBAAAA,KAAC,QAAG,WAAU,2CAA2C,UAAS;AAAA,KAEtE;AAEJ;AAuBO,SAAS,YAAY,EAAE,IAAI,UAAU,UAAU,GAAqB;AACzE,SACE,gBAAAA,KAAC,QAAG,WAAU,sBACZ,0BAAAA;AAAA,IAACD;AAAA,IAAA;AAAA,MACC;AAAA,MACA,WAAW,aAAa;AAAA,MACxB,aAAa,EAAE,WAAW,SAAS;AAAA,MAElC;AAAA;AAAA,EACH,GACF;AAEJ;AAWA,SAAS,aAAa,EAAE,OAAO,MAAM,GAAsB;AACzD,SACE,gBAAAC,KAAC,QAAG,WAAW,yCAAyC,KAAK,IAC1D,gBAAM,IAAI,CAAC,MAAM,UAChB,gBAAAA,KAAC,wBAAiC,MAAY,SAAnB,KAAiC,CAC7D,GACH;AAEJ;AAOA,SAAS,qBAAqB,EAAE,MAAM,MAAM,GAA8B;AACxE,QAAM,EAAE,YAAY,IAAI,kBAAkB;AAC1C,QAAM,CAAC,WAAW,YAAY,IAAIF,UAAS,KAAK,aAAa,KAAK;AAElE,QAAM,cAAc,KAAK,SAAS,KAAK,MAAM,SAAS;AAEtD,QAAM,gBACJ,eACA,KAAK,MAAO;AAAA,IACV,CAAC,UACC,MAAM,SAAS,eACd,MAAM,SAAS,MAAM,MAAM,KAAK,CAAC,eAAe,WAAW,SAAS,WAAW;AAAA,EACpF;AAEF,QAAM,gBAAgB,CAAC,sBAAsB,iBAAiB,cAAc,EACzE,OAAO,OAAO,EACd,KAAK,GAAG;AAEX,QAAM,gBAAgB,CAAC,sBAAsB,iBAAiB,cAAc,EACzE,OAAO,OAAO,EACd,KAAK,GAAG;AAEX,SACE,gBAAAG,MAAC,QAAG,WAAU,sBACZ;AAAA,oBAAAA,MAAC,SAAI,WAAU,6BACZ;AAAA,WAAK,OACJ,gBAAAD,KAACD,OAAA,EAAK,IAAI,KAAK,MAAM,WAAW,eAAe,aAAa,EAAE,WAAW,SAAS,GAC/E,eAAK,MACR,IAEA,gBAAAC,KAAC,UAAK,WAAW,eAAe,SAAS,MAAM,eAAe,aAAa,CAAC,SAAS,GAClF,eAAK,MACR;AAAA,MAGD,eACC,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,WAAW,CAAC,0BAA0B,aAAa,WAAW,EAC3D,OAAO,OAAO,EACd,KAAK,GAAG;AAAA,UACX,SAAS,MAAM,aAAa,CAAC,SAAS;AAAA,UACtC,cAAY,YAAY,WAAW;AAAA,UAEnC,0BAAAA;AAAA,YAAC;AAAA;AAAA,cACC,SAAQ;AAAA,cACR,OAAM;AAAA,cACN,QAAO;AAAA,cACP,MAAK;AAAA,cACL,QAAO;AAAA,cACP,aAAY;AAAA,cAEZ,0BAAAA,KAAC,UAAK,GAAE,gBAAe;AAAA;AAAA,UACzB;AAAA;AAAA,MACF;AAAA,OAEJ;AAAA,IAEC,eAAe,CAAC,aAAa,gBAAAA,KAAC,gBAAa,OAAO,KAAK,OAAQ,OAAO,QAAQ,GAAG;AAAA,KACpF;AAEJ;AAMA,SAAS,oBAAoB,UAAqB,aAA8B;AAC9E,MAAI,WAAW;AAEf,WAAS,QAAQ,UAAU,CAAC,UAAU;AACpC,QAAI,SAAU;AAEd,QAAI,eAAe,KAAK,GAAG;AAEzB,UAAI,MAAM,SAAS,eAAgB,MAAM,MAA2B,OAAO,aAAa;AACtF,mBAAW;AACX;AAAA,MACF;AAGA,UAAI,MAAM,SAAS,cAAc;AAC/B,cAAM,aAAa,MAAM;AACzB,YAAI,WAAW,OAAO,aAAa;AACjC,qBAAW;AACX;AAAA,QACF;AACA,YAAI,WAAW,YAAY,oBAAoB,WAAW,UAAU,WAAW,GAAG;AAChF,qBAAW;AACX;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF,CAAC;AAED,SAAO;AACT;;;ACrSU,qBAAAE,WAEI,OAAAC,MAFJ,QAAAC,aAAA;AAXH,SAAS,OAAO,EAAE,SAAS,WAAW,UAAU,UAAU,GAAgB;AAC/E,QAAM,aAAa,WAAW,aAAa;AAE3C,MAAI,CAAC,YAAY;AACf,WAAO;AAAA,EACT;AAEA,SACE,gBAAAD,KAAC,YAAO,WAAW,aAAa,gBAC9B,0BAAAA,KAAC,SAAI,WAAU,0BACZ,sBACC,gBAAAC,MAAAF,WAAA,EACG;AAAA,eACC,gBAAAC,KAAC,OAAE,WAAU,wBAAuB,yBAAyB,EAAE,QAAQ,QAAQ,GAAG;AAAA,IAEnF,aACC,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,WAAU;AAAA,QACV,yBAAyB,EAAE,QAAQ,UAAU;AAAA;AAAA,IAC/C;AAAA,KAEJ,GAEJ,GACF;AAEJ;;;AClEA,SAAyB,YAAAE,WAAU,iBAAAC,gBAAe,cAAAC,mBAAkB;AACpE,SAAS,QAAAC,aAAY;AAoCZ,gBAAAC,MA4GH,QAAAC,aA5GG;AA5BT,IAAM,aAAaJ,eAAsC,IAAI;AAE7D,SAAS,gBAAgB;AACvB,SAAOC,YAAW,UAAU;AAC9B;AAuBO,SAAS,IAAI,EAAE,UAAU,UAAU,GAAa;AACrD,SAAO,gBAAAE,KAAC,SAAI,WAAW,aAAa,aAAc,UAAS;AAC7D;AA+BO,SAAS,QAAQ,EAAE,IAAI,MAAM,UAAU,WAAW,YAAY,GAAiB;AACpF,QAAM,aAAa,cAAc;AACjC,QAAM,gBAAgB,aAAa;AAGnC,QAAM,cAAc,MAAM;AACxB,gBAAY,kBAAkB,KAAK;AAAA,EACrC;AAGA,MAAI,MAAM;AACR,WACE,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,WAAW;AAAA,QACX,QAAO;AAAA,QACP,KAAI;AAAA,QACJ,SAAS;AAAA,QAER;AAAA;AAAA,IACH;AAAA,EAEJ;AAGA,MAAI,IAAI;AACN,WACE,gBAAAA;AAAA,MAACD;AAAA,MAAA;AAAA,QACC;AAAA,QACA,WAAW;AAAA,QACX,aAAa,EAAE,WAAW,SAAS;AAAA,QACnC,eAAe,cAAc,EAAE,OAAO,MAAM,IAAI,EAAE,OAAO,MAAM;AAAA,QAC/D,SAAS;AAAA,QAER;AAAA;AAAA,IACH;AAAA,EAEJ;AAGA,SAAO,gBAAAC,KAAC,UAAK,WAAW,eAAgB,UAAS;AACnD;AA0BO,SAAS,YAAY,EAAE,MAAM,UAAU,UAAU,GAAqB;AAC3E,QAAM,CAAC,MAAM,OAAO,IAAIJ,UAAS,KAAK;AAEtC,SACE,gBAAAK;AAAA,IAAC;AAAA;AAAA,MACC,WAAW,aAAa;AAAA,MACxB,cAAc,MAAM,QAAQ,IAAI;AAAA,MAChC,cAAc,MAAM,QAAQ,KAAK;AAAA,MAEjC;AAAA,wBAAAA,MAAC,YAAO,WAAU,6BACf;AAAA;AAAA,UACD,gBAAAD,KAAC,UAAK,WAAU,2BAA0B,oBAAC;AAAA,WAC7C;AAAA,QACC,QAAQ,gBAAAA,KAAC,SAAI,WAAU,2BAA2B,UAAS;AAAA;AAAA;AAAA,EAC9D;AAEJ;;;ACxJA,SAAS,YAAAE,WAAU,aAAAC,kBAAiB;AA8C9B,SACE,OAAAC,MADF,QAAAC,aAAA;AA1CC,SAAS,MAAM;AACpB,QAAM,MAAM,OAAO;AACnB,QAAM,cAAc,eAAe;AACnC,QAAM,CAAC,UAAU,WAAW,IAAIC,UAAiB,EAAE;AAEnD,QAAM,QAAQ,YAAY,SAAS,SAAS;AAE5C,EAAAC,WAAU,MAAM;AACd,QAAI,IAAI,WAAW,EAAG;AAEtB,UAAM,kBAAkB,IAAI,IAAI,CAAC,SAAS,SAAS,eAAe,KAAK,EAAE,CAAC,EAAE,OAAO,OAAO;AAE1F,QAAI,gBAAgB,WAAW,EAAG;AAElC,UAAM,WAAW,IAAI;AAAA,MACnB,CAAC,YAAY;AACX,mBAAW,SAAS,SAAS;AAC3B,cAAI,MAAM,gBAAgB;AACxB,wBAAY,MAAM,OAAO,EAAE;AAC3B;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,MACA;AAAA,QACE,YAAY;AAAA,QACZ,WAAW;AAAA,MACb;AAAA,IACF;AAEA,oBAAgB,QAAQ,CAAC,OAAO,MAAM,SAAS,QAAQ,EAAE,CAAC;AAE1D,WAAO,MAAM;AACX,sBAAgB,QAAQ,CAAC,OAAO,MAAM,SAAS,UAAU,EAAE,CAAC;AAAA,IAC9D;AAAA,EACF,GAAG,CAAC,GAAG,CAAC;AAER,MAAI,IAAI,WAAW,GAAG;AACpB,WAAO;AAAA,EACT;AAEA,SACE,gBAAAH,KAAC,WAAM,WAAU,aACf,0BAAAC,MAAC,SAAI,WAAU,uBACb;AAAA,oBAAAD,KAAC,QAAG,WAAU,mBAAmB,iBAAM;AAAA,IACvC,gBAAAA,KAAC,SAAI,WAAU,iBACb,0BAAAA,KAAC,YAAS,OAAO,KAAK,UAAoB,GAC5C;AAAA,KACF,GACF;AAEJ;AAOA,SAAS,SAAS,EAAE,OAAO,SAAS,GAAkB;AACpD,SACE,gBAAAA,KAAC,QAAG,WAAU,kBACX,gBAAM,IAAI,CAAC,SACV,gBAAAA,KAAC,oBAA+B,MAAY,YAArB,KAAK,EAAoC,CACjE,GACH;AAEJ;AAOA,SAAS,iBAAiB,EAAE,MAAM,SAAS,GAA0B;AACnE,QAAM,WAAW,KAAK,OAAO;AAC7B,QAAM,iBAAiB,oBAAoB,MAAM,QAAQ;AAEzD,SACE,gBAAAC,MAAC,QAAG,WAAU,kBACZ;AAAA,oBAAAD;AAAA,MAAC;AAAA;AAAA,QACC,MAAM,IAAI,KAAK,EAAE;AAAA,QACjB,WAAW;AAAA,UACT,iCAAiC,KAAK,KAAK;AAAA,UAC3C,YAAY;AAAA,UACZ,kBAAkB;AAAA,QACpB,EACG,OAAO,OAAO,EACd,KAAK,GAAG;AAAA,QACX,SAAS,CAAC,MAAM;AACd,YAAE,eAAe;AACjB,gBAAM,UAAU,SAAS,eAAe,KAAK,EAAE;AAC/C,cAAI,SAAS;AACX,oBAAQ,eAAe,EAAE,UAAU,SAAS,CAAC;AAC7C,mBAAO,QAAQ,UAAU,MAAM,IAAI,IAAI,KAAK,EAAE,EAAE;AAAA,UAClD;AAAA,QACF;AAAA,QAEC,eAAK;AAAA;AAAA,IACR;AAAA,IACC,KAAK,YAAY,KAAK,SAAS,SAAS,KACvC,gBAAAA,KAAC,YAAS,OAAO,KAAK,UAAU,UAAoB;AAAA,KAExD;AAEJ;AAEA,SAAS,oBAAoB,MAAe,UAA2B;AACrE,MAAI,CAAC,KAAK,SAAU,QAAO;AAE3B,aAAW,SAAS,KAAK,UAAU;AACjC,QAAI,MAAM,OAAO,SAAU,QAAO;AAClC,QAAI,oBAAoB,OAAO,QAAQ,EAAG,QAAO;AAAA,EACnD;AAEA,SAAO;AACT;;;ACnHA,SAAS,QAAAI,OAAM,mBAAmB;AAuC1B,SACE,OAAAC,MADF,QAAAC,aAAA;AAjCD,SAAS,QAAQ,EAAE,SAAS,GAAiB;AAClD,QAAM,WAAW,YAAY;AAC7B,QAAM,cAAc,eAAe;AACnC,QAAM,UAAU,WAAW;AAC3B,QAAM,WAAW,YAAY;AAE7B,QAAM,EAAE,MAAM,KAAK,IAAI,iBAAiB,SAAS,SAAS,QAAQ;AAElE,QAAM,eAAe,UAAU,YAAY,aAAa,SAAS,YAAY,UAAU;AAEvF,QAAM,kBACJ,UAAU,YAAY,gBAAgB,SACtC,YAAY,aAAa,WACzB,UAAU;AAEZ,QAAM,WAAW,eACb,YAAY,SAAU,QAAQ,QAAQ,SAAS,UAAU,gBAAgB,EAAE,IAC3E;AAEJ,QAAM,kBAAkB,kBACpB,IAAI,KAAK,SAAU,WAAY,EAAE;AAAA,IAC/B;AAAA,IACA,YAAY,aAAa,iBAAiB;AAAA,MACxC,MAAM;AAAA,MACN,OAAO;AAAA,MACP,KAAK;AAAA,IACP;AAAA,EACF,IACA;AAEJ,SACE,gBAAAA,MAAC,aAAQ,WAAU,2BAChB;AAAA,cAAU,YAAY,SACrB,gBAAAA,MAAC,YAAO,WAAU,wBAChB;AAAA,sBAAAD,KAAC,QAAG,WAAU,uBAAuB,mBAAS,YAAY,OAAM;AAAA,MAC/D,SAAS,YAAY,eACpB,gBAAAA,KAAC,OAAE,WAAU,6BAA6B,mBAAS,YAAY,aAAY;AAAA,OAE/E;AAAA,IAGF,gBAAAA,KAAC,SAAI,WAAU,sBAAsB,UAAS;AAAA,IAE9C,gBAAAC,MAAC,YAAO,WAAU,wBACd;AAAA,uBAAgB,oBAChB,gBAAAA,MAAC,SAAI,WAAU,sBACZ;AAAA,wBACC,gBAAAD;AAAA,UAAC;AAAA;AAAA,YACC,MAAM;AAAA,YACN,QAAO;AAAA,YACP,KAAI;AAAA,YACJ,WAAU;AAAA,YAET,sBAAY,UAAU,QAAQ;AAAA;AAAA,QACjC;AAAA,QAED,mBACC,gBAAAC,MAAC,UAAK,WAAU,sBACb;AAAA,sBAAY,aAAa,QAAQ;AAAA,UAAe;AAAA,UAAG;AAAA,WACtD;AAAA,SAEJ;AAAA,OAGA,QAAQ,SACR,gBAAAA,MAAC,SAAI,WAAU,mBACZ;AAAA,eACC,gBAAAA,MAACF,OAAA,EAAK,IAAI,KAAK,MAAO,WAAU,mBAC9B;AAAA,0BAAAC,KAAC,UAAK,WAAU,yBAAwB,sBAAQ;AAAA,UAChD,gBAAAA,KAAC,UAAK,WAAU,yBAAyB,eAAK,MAAK;AAAA,WACrD,IAEA,gBAAAA,KAAC,SAAI;AAAA,QAEN,OACC,gBAAAC,MAACF,OAAA,EAAK,IAAI,KAAK,MAAO,WAAU,mBAC9B;AAAA,0BAAAC,KAAC,UAAK,WAAU,yBAAwB,kBAAI;AAAA,UAC5C,gBAAAA,KAAC,UAAK,WAAU,yBAAyB,eAAK,MAAK;AAAA,WACrD,IAEA,gBAAAA,KAAC,SAAI;AAAA,SAET;AAAA,OAEJ;AAAA,KACF;AAEJ;;;AChEM,SACE,OAAAE,OADF,QAAAC,cAAA;AAPC,SAAS,QAAQ,EAAE,SAAS,GAAiB;AAClD,QAAM,WAAW,YAAY;AAC7B,QAAM,UACJ,UAAU,YAAY,YAAY,SAAS,UAAU,OAAO,SAAS,IAAI,SAAS;AAEpF,SACE,gBAAAD,MAAC,UACC,0BAAAC,OAAC,SAAI,WAAU,kBACb;AAAA,oBAAAD,MAAC,WAAS,UAAS;AAAA,IAClB,WAAW,gBAAAA,MAAC,OAAI;AAAA,KACnB,GACF;AAEJ;AA8BO,SAAS,WAAW,EAAE,SAAS,GAAoB;AACxD,QAAM,WAAW,YAAY;AAC7B,QAAM,UACJ,UAAU,YAAY,YAAY,SAAS,UAAU,OAAO,SAAS,IAAI,SAAS;AAEpF,SACE,gBAAAC,OAAC,SAAI,WAAU,kBACb;AAAA,oBAAAD,MAAC,WAAS,UAAS;AAAA,IAClB,WAAW,gBAAAA,MAAC,OAAI;AAAA,KACnB;AAEJ;AAaO,SAAS,UAAU,EAAE,QAAQ,GAAmB;AACrD,SAAO,gBAAAA,MAAC,WAAS,mBAAQ;AAC3B;;;AC9FA,SAAS,QAAAE,aAAY;AAcf,gBAAAC,OAeQ,QAAAC,cAfR;AATC,SAAS,WAAW;AACzB,QAAM,WAAW,YAAY;AAC7B,QAAM,SAAS,UAAU;AAEzB,QAAM,OAAO,UAAU,YAAY;AACnC,QAAM,WAAW,UAAU,YAAY;AAEvC,SACE,gBAAAA,OAAC,SAAI,WAAU,cACb;AAAA,oBAAAD,MAAC,UAAO;AAAA,IAER,gBAAAC,OAAC,UAAK,WAAU,mBACb;AAAA,cACC,gBAAAD,MAAC,aAAQ,WAAU,cACjB,0BAAAC,OAAC,SAAI,WAAU,wBACZ;AAAA,aAAK,SACJ,gBAAAD,MAAC,SAAI,WAAU,oBACb,0BAAAA;AAAA,UAAC;AAAA;AAAA,YACC,KAAK,OAAO,KAAK,UAAU,WAAW,KAAK,QAAQ,KAAK,MAAM;AAAA,YAC9D,KAAK,KAAK,QAAQ,OAAO;AAAA;AAAA,QAC3B,GACF;AAAA,QAGF,gBAAAC,OAAC,SAAI,WAAU,sBACZ;AAAA,eAAK,QAAQ,gBAAAD,MAAC,QAAG,WAAU,mBAAmB,eAAK,MAAK;AAAA,UACxD,KAAK,QAAQ,gBAAAA,MAAC,OAAE,WAAU,mBAAmB,eAAK,MAAK;AAAA,UACvD,KAAK,WAAW,gBAAAA,MAAC,OAAE,WAAU,sBAAsB,eAAK,SAAQ;AAAA,UAEhE,KAAK,WAAW,KAAK,QAAQ,SAAS,KACrC,gBAAAA,MAAC,SAAI,WAAU,sBACZ,eAAK,QAAQ,IAAI,CAAC,QAAQ,UACzB,gBAAAA;AAAA,YAACE;AAAA,YAAA;AAAA,cAEC,IAAI,OAAO;AAAA,cACX,WAAW,uCAAuC,OAAO,SAAS,OAAO;AAAA,cAExE,iBAAO;AAAA;AAAA,YAJH;AAAA,UAKP,CACD,GACH;AAAA,WAEJ;AAAA,SACF,GACF;AAAA,MAGD,YAAY,SAAS,SAAS,KAC7B,gBAAAF,MAAC,aAAQ,WAAU,kBACjB,0BAAAA,MAAC,SAAI,WAAU,4BACZ,mBAAS,IAAI,CAAC,SAAS,UACtB,gBAAAC,OAAC,SAAgB,WAAU,iBACxB;AAAA,gBAAQ,QAAQ,gBAAAD,MAAC,SAAI,WAAU,sBAAsB,kBAAQ,MAAK;AAAA,QACnE,gBAAAA,MAAC,QAAG,WAAU,uBAAuB,kBAAQ,OAAM;AAAA,QACnD,gBAAAA,MAAC,OAAE,WAAU,yBAAyB,kBAAQ,SAAQ;AAAA,QACrD,QAAQ,QACP,gBAAAA,MAACE,OAAA,EAAK,IAAI,QAAQ,MAAM,WAAU,sBAC/B,kBAAQ,YAAY,cACvB;AAAA,WAPM,KASV,CACD,GACH,GACF;AAAA,OAEJ;AAAA,IAEA,gBAAAF,MAAC,UAAO;AAAA,KACV;AAEJ;;;AC3EA,SAAS,YAAAG,iBAAgB;;;ACAzB,SAAS,YAAAC,iBAAgB;AAoBrB,SAKY,OAAAC,OALZ,QAAAC,cAAA;AAdG,SAAS,WAAW,EAAE,KAAK,GAAoB;AACpD,QAAM,CAAC,QAAQ,SAAS,IAAIF,UAAS,KAAK;AAE1C,QAAM,aAAa,YAAY;AAC7B,QAAI;AACF,YAAM,UAAU,UAAU,UAAU,IAAI;AACxC,gBAAU,IAAI;AACd,iBAAW,MAAM,UAAU,KAAK,GAAG,GAAI;AAAA,IACzC,SAAS,KAAK;AACZ,cAAQ,MAAM,mBAAmB,GAAG;AAAA,IACtC;AAAA,EACF;AAEA,SACE,gBAAAE;AAAA,IAAC;AAAA;AAAA,MACC,WAAU;AAAA,MACV,SAAS;AAAA,MACT,cAAY,SAAS,YAAY;AAAA,MAEhC;AAAA,iBAAS,gBAAAD,MAAC,aAAU,IAAK,gBAAAA,MAAC,YAAS;AAAA,QACpC,gBAAAA,MAAC,UAAK,WAAU,mBAAmB,mBAAS,YAAY,QAAO;AAAA;AAAA;AAAA,EACjE;AAEJ;AAEA,SAAS,WAAW;AAClB,SACE,gBAAAC;AAAA,IAAC;AAAA;AAAA,MACC,SAAQ;AAAA,MACR,OAAM;AAAA,MACN,QAAO;AAAA,MACP,MAAK;AAAA,MACL,QAAO;AAAA,MACP,aAAY;AAAA,MAEZ;AAAA,wBAAAD,MAAC,UAAK,GAAE,KAAI,GAAE,KAAI,OAAM,MAAK,QAAO,MAAK,IAAG,KAAI,IAAG,KAAI;AAAA,QACvD,gBAAAA,MAAC,UAAK,GAAE,sDAAqD;AAAA;AAAA;AAAA,EAC/D;AAEJ;AAEA,SAAS,YAAY;AACnB,SACE,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACC,SAAQ;AAAA,MACR,OAAM;AAAA,MACN,QAAO;AAAA,MACP,MAAK;AAAA,MACL,QAAO;AAAA,MACP,aAAY;AAAA,MAEZ,0BAAAA,MAAC,cAAS,QAAO,kBAAiB;AAAA;AAAA,EACpC;AAEJ;;;ADpCgB,gBAAAE,OAYE,QAAAC,cAZF;AAZT,SAAS,UAAU;AAAA,EACxB;AAAA,EACA,WAAW;AAAA,EACX;AAAA,EACA,cAAc;AAAA,EACd,iBAAiB,CAAC;AAAA,EAClB;AACF,GAAmB;AACjB,QAAM,QAAQ,KAAK,MAAM,IAAI;AAE7B,SACE,gBAAAA,OAAC,SAAI,WAAU,oBAAmB,aAAW,UAC1C;AAAA,aAAS,gBAAAD,MAAC,SAAI,WAAU,oBAAoB,iBAAM;AAAA,IACnD,gBAAAC,OAAC,SAAI,WAAU,sBACZ;AAAA,kBACC,gBAAAD,MAAC,SAAI,WAAW,YAAY,QAAQ,IAClC,0BAAAA,MAAC,UACE,gBAAM,IAAI,CAAC,MAAM,UAAU;AAC1B,cAAM,UAAU,QAAQ;AACxB,cAAM,gBAAgB,eAAe,SAAS,OAAO;AACrD,cAAM,UAAU,CAAC,iBAAiB;AAClC,YAAI,cAAe,SAAQ,KAAK,aAAa;AAE7C,eACE,gBAAAC,OAAC,UAAiB,WAAW,QAAQ,KAAK,GAAG,GAC1C;AAAA,yBAAe,gBAAAD,MAAC,UAAK,WAAU,qBAAqB,mBAAQ;AAAA,UAC7D,gBAAAA,MAAC,UAAK,WAAU,sBAAsB,gBAAK;AAAA,UAC1C,QAAQ,MAAM,SAAS,KAAK;AAAA,aAHpB,KAIX;AAAA,MAEJ,CAAC,GACH,GACF;AAAA,MAEF,gBAAAA,MAAC,cAAW,MAAY;AAAA,OAC1B;AAAA,KACF;AAEJ;AAMO,SAAS,UAAU,EAAE,SAAS,GAAmB;AACtD,QAAM,CAAC,WAAW,YAAY,IAAIE,UAAS,CAAC;AAE5C,QAAM,aAAa,MAAM,QAAQ,QAAQ,IAAI,WAAW,CAAC,QAAQ;AACjE,QAAM,OAAO,WAAW,IAAI,CAAC,OAAO,UAAU;AAC5C,UAAM,QAAS,OAA8B;AAC7C,WAAO,OAAO,SAAS,OAAO,YAAY,OAAO,QAAQ,CAAC;AAAA,EAC5D,CAAC;AAED,SACE,gBAAAD,OAAC,SAAI,WAAU,oBACb;AAAA,oBAAAD,MAAC,SAAI,WAAU,yBACZ,eAAK,IAAI,CAAC,KAAK,UACd,gBAAAA;AAAA,MAAC;AAAA;AAAA,QAEC,WAAW,CAAC,wBAAwB,UAAU,aAAa,QAAQ,EAChE,OAAO,OAAO,EACd,KAAK,GAAG;AAAA,QACX,SAAS,MAAM,aAAa,KAAK;AAAA,QAEhC;AAAA;AAAA,MANI;AAAA,IAOP,CACD,GACH;AAAA,IACA,gBAAAA,MAAC,SAAI,WAAU,2BACZ,qBAAW,IAAI,CAAC,OAAO,UACtB,gBAAAA;AAAA,MAAC;AAAA;AAAA,QAEC,WAAW,CAAC,0BAA0B,UAAU,aAAa,QAAQ,EAClE,OAAO,OAAO,EACd,KAAK,GAAG;AAAA,QACX,OAAO,EAAE,SAAS,UAAU,YAAY,UAAU,OAAO;AAAA,QAExD;AAAA;AAAA,MANI;AAAA,IAOP,CACD,GACH;AAAA,KACF;AAEJ;;;AE3EI,SAQE,OAAAG,OARF,QAAAC,cAAA;AAVJ,IAAM,gBAA+C;AAAA,EACnD,KAAK;AAAA,EACL,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,MAAM;AACR;AAEA,IAAM,QAA0C;AAAA,EAC9C,KACE,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACC,SAAQ;AAAA,MACR,OAAM;AAAA,MACN,QAAO;AAAA,MACP,MAAK;AAAA,MACL,QAAO;AAAA,MACP,aAAY;AAAA,MAEZ;AAAA,wBAAAD,MAAC,UAAK,GAAE,sHAAqH;AAAA,QAC7H,gBAAAA,MAAC,YAAO,IAAG,MAAK,IAAG,MAAK,GAAE,KAAI;AAAA;AAAA;AAAA,EAChC;AAAA,EAEF,SACE,gBAAAC;AAAA,IAAC;AAAA;AAAA,MACC,SAAQ;AAAA,MACR,OAAM;AAAA,MACN,QAAO;AAAA,MACP,MAAK;AAAA,MACL,QAAO;AAAA,MACP,aAAY;AAAA,MAEZ;AAAA,wBAAAD,MAAC,UAAK,GAAE,uFAAsF;AAAA,QAC9F,gBAAAA,MAAC,UAAK,IAAG,MAAK,IAAG,KAAI,IAAG,MAAK,IAAG,MAAK;AAAA,QACrC,gBAAAA,MAAC,UAAK,IAAG,MAAK,IAAG,MAAK,IAAG,SAAQ,IAAG,MAAK;AAAA;AAAA;AAAA,EAC3C;AAAA,EAEF,QACE,gBAAAC;AAAA,IAAC;AAAA;AAAA,MACC,SAAQ;AAAA,MACR,OAAM;AAAA,MACN,QAAO;AAAA,MACP,MAAK;AAAA,MACL,QAAO;AAAA,MACP,aAAY;AAAA,MAEZ;AAAA,wBAAAD,MAAC,YAAO,IAAG,MAAK,IAAG,MAAK,GAAE,MAAK;AAAA,QAC/B,gBAAAA,MAAC,UAAK,IAAG,MAAK,IAAG,KAAI,IAAG,KAAI,IAAG,MAAK;AAAA,QACpC,gBAAAA,MAAC,UAAK,IAAG,KAAI,IAAG,KAAI,IAAG,MAAK,IAAG,MAAK;AAAA;AAAA;AAAA,EACtC;AAAA,EAEF,MACE,gBAAAC;AAAA,IAAC;AAAA;AAAA,MACC,SAAQ;AAAA,MACR,OAAM;AAAA,MACN,QAAO;AAAA,MACP,MAAK;AAAA,MACL,QAAO;AAAA,MACP,aAAY;AAAA,MAEZ;AAAA,wBAAAD,MAAC,YAAO,IAAG,MAAK,IAAG,MAAK,GAAE,MAAK;AAAA,QAC/B,gBAAAA,MAAC,UAAK,IAAG,MAAK,IAAG,MAAK,IAAG,MAAK,IAAG,MAAK;AAAA,QACtC,gBAAAA,MAAC,UAAK,IAAG,MAAK,IAAG,KAAI,IAAG,SAAQ,IAAG,KAAI;AAAA;AAAA;AAAA,EACzC;AAAA,EAEF,MACE,gBAAAC;AAAA,IAAC;AAAA;AAAA,MACC,SAAQ;AAAA,MACR,OAAM;AAAA,MACN,QAAO;AAAA,MACP,MAAK;AAAA,MACL,QAAO;AAAA,MACP,aAAY;AAAA,MAEZ;AAAA,wBAAAD,MAAC,UAAK,GAAE,oEAAmE;AAAA,QAC3E,gBAAAA,MAAC,cAAS,QAAO,kBAAiB;AAAA,QAClC,gBAAAA,MAAC,UAAK,IAAG,MAAK,IAAG,MAAK,IAAG,KAAI,IAAG,MAAK;AAAA,QACrC,gBAAAA,MAAC,UAAK,IAAG,MAAK,IAAG,MAAK,IAAG,KAAI,IAAG,MAAK;AAAA,QACrC,gBAAAA,MAAC,UAAK,IAAG,MAAK,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI;AAAA;AAAA;AAAA,EACrC;AAEJ;AAEO,SAAS,UAAU,EAAE,MAAM,OAAO,SAAS,GAAmB;AACnE,QAAM,eAAe,SAAS,cAAc,IAAI;AAEhD,SACE,gBAAAC,OAAC,SAAI,WAAW,mCAAmC,IAAI,IACrD;AAAA,oBAAAA,OAAC,OAAE,WAAU,yBACX;AAAA,sBAAAD,MAAC,UAAK,WAAU,wBAAwB,gBAAM,IAAI,GAAE;AAAA,MACnD;AAAA,OACH;AAAA,IACA,gBAAAA,MAAC,SAAI,WAAU,2BAA2B,UAAS;AAAA,KACrD;AAEJ;AAEO,SAAS,IAAI,EAAE,OAAO,SAAS,GAAiC;AACrE,SACE,gBAAAA,MAAC,aAAU,MAAK,OAAM,OACnB,UACH;AAEJ;AAEO,SAAS,QAAQ,EAAE,OAAO,SAAS,GAAiC;AACzE,SACE,gBAAAA,MAAC,aAAU,MAAK,WAAU,OACvB,UACH;AAEJ;AAEO,SAAS,OAAO,EAAE,OAAO,SAAS,GAAiC;AACxE,SACE,gBAAAA,MAAC,aAAU,MAAK,UAAS,OACtB,UACH;AAEJ;AAEO,SAAS,KAAK,EAAE,OAAO,SAAS,GAAiC;AACtE,SACE,gBAAAA,MAAC,aAAU,MAAK,QAAO,OACpB,UACH;AAEJ;AAEO,SAAS,KAAK,EAAE,OAAO,SAAS,GAAiC;AACtE,SACE,gBAAAA,MAAC,aAAU,MAAK,QAAO,OACpB,UACH;AAEJ;;;AChJA,SAAS,YAAAE,WAAU,iBAAAC,gBAAe,cAAAC,mBAAkC;AA2B9D,gBAAAC,aAAA;AApBN,IAAM,cAAcF,eAAuC,IAAI;AAE/D,SAAS,iBAAiB;AACxB,QAAM,UAAUC,YAAW,WAAW;AACtC,MAAI,CAAC,SAAS;AACZ,UAAM,IAAI,MAAM,qDAAqD;AAAA,EACvE;AACA,SAAO;AACT;AAOO,SAAS,KAAK,EAAE,cAAc,SAAS,GAAc;AAC1D,QAAM,CAAC,WAAW,YAAY,IAAIF,UAAS,gBAAgB,EAAE;AAE7D,SACE,gBAAAG,MAAC,YAAY,UAAZ,EAAqB,OAAO,EAAE,WAAW,aAAa,GACrD,0BAAAA,MAAC,SAAI,WAAU,cAAc,UAAS,GACxC;AAEJ;AAMO,SAAS,QAAQ,EAAE,SAAS,GAAiB;AAClD,SACE,gBAAAA,MAAC,SAAI,WAAU,kBAAiB,MAAK,WAClC,UACH;AAEJ;AAOO,SAAS,IAAI,EAAE,OAAO,SAAS,GAAa;AACjD,QAAM,EAAE,WAAW,aAAa,IAAI,eAAe;AACnD,QAAM,WAAW,cAAc;AAE/B,SACE,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACC,MAAK;AAAA,MACL,iBAAe;AAAA,MACf,WAAW,CAAC,aAAa,YAAY,QAAQ,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAAA,MACvE,SAAS,MAAM,aAAa,KAAK;AAAA,MAEhC;AAAA;AAAA,EACH;AAEJ;AAOO,SAAS,SAAS,EAAE,OAAO,SAAS,GAAkB;AAC3D,QAAM,EAAE,UAAU,IAAI,eAAe;AACrC,QAAM,WAAW,cAAc;AAE/B,MAAI,CAAC,UAAU;AACb,WAAO;AAAA,EACT;AAEA,SACE,gBAAAA,MAAC,SAAI,MAAK,YAAW,WAAU,mBAC5B,UACH;AAEJ;AAMO,SAAS,UAAU,EAAE,SAAS,GAAmB;AACtD,SAAO,gBAAAA,MAAC,SAAI,WAAU,oBAAoB,UAAS;AACrD;","names":["useState","Link","jsx","jsxs","useState","useEffect","jsx","jsxs","useState","useEffect","handleKeyDown","jsx","jsxs","useState","Link","icons","useState","Link","jsx","jsxs","Fragment","jsx","jsxs","useState","createContext","useContext","Link","jsx","jsxs","useState","useEffect","jsx","jsxs","useState","useEffect","Link","jsx","jsxs","jsx","jsxs","Link","jsx","jsxs","Link","useState","useState","jsx","jsxs","jsx","jsxs","useState","jsx","jsxs","useState","createContext","useContext","jsx"]}
1
+ {"version":3,"sources":["../src/theme/Layout.tsx","../src/theme/Header.tsx","../src/theme/components/ThemeToggle.tsx","../src/theme/components/Search.tsx","../src/theme/Sidebar.tsx","../src/theme/Footer.tsx","../src/theme/Nav.tsx","../src/theme/TOC.tsx","../src/theme/Content.tsx","../src/theme/DocPage.tsx","../src/theme/HomePage.tsx","../src/theme/components/CodeBlock.tsx","../src/theme/components/CopyButton.tsx","../src/theme/components/Container.tsx","../src/theme/components/Tabs.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 ?? \"press-layout\"}>\n {header}\n <div className=\"press-layout-container\">\n {sidebar}\n <main className=\"press-main\">{children}</main>\n </div>\n {footer}\n </div>\n )\n}\n","import { useState, type ReactNode } from \"react\"\nimport { Link } from \"@tanstack/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 ?? \"press-header\"}>\n <div className=\"press-header-container\">\n {/* Left: Mobile menu button + Logo/Title */}\n <div className=\"press-header-left\">\n <button\n className=\"press-mobile-menu-button\"\n onClick={() => setMobileMenuOpen(!mobileMenuOpen)}\n aria-label=\"Toggle menu\"\n aria-expanded={mobileMenuOpen}\n >\n <span className=\"press-hamburger\">\n <span></span>\n <span></span>\n <span></span>\n </span>\n </button>\n\n <Link to=\"/\" className=\"press-logo-link\">\n {logo && (\n <img\n src={typeof logo === \"string\" ? logo : logo.light}\n alt={title ?? \"Logo\"}\n className=\"press-logo\"\n />\n )}\n {title && <span className=\"press-site-title\">{title}</span>}\n </Link>\n </div>\n\n {/* Center: Navigation */}\n {nav && <div className=\"press-nav\">{nav}</div>}\n\n {/* Right: Search, Theme Toggle, Actions */}\n <div className=\"press-header-right\">\n {search && <Search />}\n {themeToggle && <ThemeToggle />}\n {actions}\n </div>\n </div>\n\n {/* Mobile menu */}\n {mobileMenuOpen && (\n <div className=\"press-mobile-menu\">\n <nav className=\"press-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 ?? \"press-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(\"press-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(\"press-theme\", nextTheme)\n applyTheme(nextTheme)\n }\n\n if (!mounted) {\n return (\n <button className=\"press-theme-toggle\" aria-label=\"Toggle theme\">\n <span className=\"press-theme-icon\">\n <SunIcon />\n </span>\n </button>\n )\n }\n\n return (\n <button\n className=\"press-theme-toggle\"\n onClick={toggleTheme}\n aria-label={`Switch to ${theme === \"light\" ? \"dark\" : theme === \"dark\" ? \"system\" : \"light\"} theme`}\n >\n <span className=\"press-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, useCallback } from \"react\"\nimport { Link } from \"@tanstack/react-router\"\nimport { useThemeConfig } from \"../../runtime/hooks\"\nimport MiniSearch, { type SearchResult } from \"minisearch\"\n\ninterface SearchDoc {\n id: string\n title: string\n content: string\n path: string\n section?: string\n}\n\nlet searchIndex: MiniSearch<SearchDoc> | null = null\n\nexport function Search() {\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 inputRef = useRef<HTMLInputElement>(null)\n const themeConfig = useThemeConfig()\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 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 setQuery(\"\")\n setResults([])\n setSelectedIndex(0)\n }\n }, [isOpen])\n\n const loadSearchIndex = useCallback(async () => {\n if (searchIndex) return searchIndex\n\n try {\n const response = await fetch(\"/_press/search-index.json\")\n if (!response.ok) return null\n\n const docs: SearchDoc[] = await response.json()\n\n searchIndex = 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\n searchIndex.addAll(docs)\n return searchIndex\n } catch {\n return null\n }\n }, [])\n\n const handleSearch = useCallback(\n async (searchQuery: string) => {\n setQuery(searchQuery)\n\n if (!searchQuery.trim()) {\n setResults([])\n return\n }\n\n const index = await loadSearchIndex()\n if (!index) {\n setResults([])\n return\n }\n\n const searchResults = index.search(searchQuery).slice(0, 10)\n setResults(searchResults)\n setSelectedIndex(0)\n },\n [loadSearchIndex]\n )\n\n const handleKeyDown = (e: React.KeyboardEvent) => {\n if (e.key === \"ArrowDown\") {\n e.preventDefault()\n setSelectedIndex((prev) => Math.min(prev + 1, results.length - 1))\n } else if (e.key === \"ArrowUp\") {\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 window.location.href = result.path as string\n setIsOpen(false)\n }\n }\n\n return (\n <>\n <button className=\"press-search-button\" onClick={() => setIsOpen(true)} aria-label=\"Search\">\n <SearchIcon />\n <span className=\"press-search-button-text\">{placeholder}</span>\n <span className=\"press-search-kbd\">\n <kbd>⌘</kbd>\n <kbd>K</kbd>\n </span>\n </button>\n\n {isOpen && (\n <div className=\"press-search-modal\" onClick={() => setIsOpen(false)}>\n <div className=\"press-search-dialog\" onClick={(e) => e.stopPropagation()}>\n <div className=\"press-search-input-wrapper\">\n <SearchIcon />\n <input\n ref={inputRef}\n type=\"text\"\n className=\"press-search-input\"\n placeholder={placeholder}\n value={query}\n onChange={(e) => handleSearch(e.target.value)}\n onKeyDown={handleKeyDown}\n />\n {query && (\n <button\n className=\"press-search-clear\"\n onClick={() => handleSearch(\"\")}\n aria-label=\"Clear search\"\n >\n ×\n </button>\n )}\n </div>\n\n {results.length > 0 && (\n <ul className=\"press-search-results\">\n {results.map((result, index) => (\n <li key={result.id}>\n <Link\n to={result.path as string}\n className={[\"press-search-result\", index === selectedIndex && \"selected\"]\n .filter(Boolean)\n .join(\" \")}\n onClick={() => setIsOpen(false)}\n >\n <span className=\"press-search-result-title\">{result.title as string}</span>\n {result.section && (\n <span className=\"press-search-result-section\">\n {result.section as string}\n </span>\n )}\n </Link>\n </li>\n ))}\n </ul>\n )}\n\n {query && results.length === 0 && (\n <div className=\"press-search-no-results\">No results found for \"{query}\"</div>\n )}\n\n <div className=\"press-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 </div>\n )}\n </>\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 Children,\n isValidElement,\n createContext,\n useContext,\n} from \"react\"\nimport { Link, useRouterState } from \"@tanstack/react-router\"\nimport type { SidebarItem as SidebarItemType } from \"../config/types\"\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 = useRouterState({ select: (s) => s.location.pathname })\n\n return (\n <SidebarContext.Provider value={{ currentPath: pathname }}>\n <aside className={className ?? \"press-sidebar\"}>\n <nav className=\"press-sidebar-nav\">\n {items ? (\n <SidebarItems items={items} depth={0} />\n ) : (\n <ul className=\"press-sidebar-list press-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 = [\"press-sidebar-text\", isChildActive && \"child-active\"]\n .filter(Boolean)\n .join(\" \")\n\n const linkClassName = [\"press-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 ?? \"press-sidebar-item\"}>\n <div className=\"press-sidebar-item-header\">\n {to ? (\n <Link to={to} className={linkClassName} activeProps={{ className: \"active\" }}>\n {title}\n </Link>\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={[\"press-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=\"press-sidebar-list press-sidebar-list-1\">{children}</ul>\n )}\n </li>\n )\n}\n\n// =============================================================================\n// SidebarLink Component\n// =============================================================================\n\nexport interface SidebarLinkProps {\n /** Internal route path */\n to: string\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 return (\n <li className=\"press-sidebar-item\">\n <Link\n to={to}\n className={className ?? \"press-sidebar-link\"}\n activeProps={{ className: \"active\" }}\n >\n {children}\n </Link>\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={`press-sidebar-list press-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 = [\"press-sidebar-link\", isChildActive && \"child-active\"]\n .filter(Boolean)\n .join(\" \")\n\n const textClassName = [\"press-sidebar-text\", isChildActive && \"child-active\"]\n .filter(Boolean)\n .join(\" \")\n\n return (\n <li className=\"press-sidebar-item\">\n <div className=\"press-sidebar-item-header\">\n {item.link ? (\n <Link to={item.link} className={linkClassName} activeProps={{ className: \"active\" }}>\n {item.text}\n </Link>\n ) : (\n <span className={textClassName} onClick={() => hasChildren && setCollapsed(!collapsed)}>\n {item.text}\n </span>\n )}\n\n {hasChildren && (\n <button\n className={[\"press-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 ?? \"press-footer\"}>\n <div className=\"press-footer-container\">\n {children ?? (\n <>\n {message && (\n <p className=\"press-footer-message\" dangerouslySetInnerHTML={{ __html: message }} />\n )}\n {copyright && (\n <p\n className=\"press-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, useState, createContext, useContext } from \"react\"\nimport { Link } from \"@tanstack/react-router\"\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 ?? \"press-nav\"}>{children}</nav>\n}\n\n// =============================================================================\n// NavLink Component\n// =============================================================================\n\nexport interface NavLinkProps {\n /** Internal route path (uses TanStack Router Link) */\n to?: string\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({ to, href, children, className, activeMatch }: NavLinkProps) {\n const navContext = useNavContext()\n const baseClassName = className ?? \"press-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 <Link\n to={to}\n className={baseClassName}\n activeProps={{ className: \"active\" }}\n activeOptions={activeMatch ? { exact: false } : { exact: false }}\n onClick={handleClick}\n >\n {children}\n </Link>\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 ?? \"press-nav-dropdown\"}\n onMouseEnter={() => setOpen(true)}\n onMouseLeave={() => setOpen(false)}\n >\n <button className=\"press-nav-dropdown-button\">\n {text}\n <span className=\"press-nav-dropdown-icon\">▼</span>\n </button>\n {open && <div className=\"press-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=\"press-toc\">\n <div className=\"press-toc-container\">\n <h3 className=\"press-toc-title\">{label}</h3>\n <nav className=\"press-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=\"press-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=\"press-toc-item\">\n <a\n href={`#${item.id}`}\n className={[\n `press-toc-link press-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, useThemeConfig, useSidebar } from \"../runtime/hooks\"\nimport { getPrevNextLinks } from \"../runtime/sidebar-utils\"\nimport { Link, useLocation } from \"@tanstack/react-router\"\n\ninterface ContentProps {\n children: ReactNode\n}\n\nexport function Content({ children }: ContentProps) {\n const pageData = usePageData()\n const themeConfig = useThemeConfig()\n const sidebar = useSidebar()\n const location = useLocation()\n\n const { prev, next } = getPrevNextLinks(sidebar, location.pathname)\n\n const showEditLink = pageData?.frontmatter.editLink !== false && themeConfig.editLink?.pattern\n\n const showLastUpdated =\n pageData?.frontmatter.lastUpdated !== false &&\n themeConfig.lastUpdated?.enabled &&\n pageData?.lastUpdated\n\n const editLink = showEditLink\n ? themeConfig.editLink!.pattern.replace(\":path\", pageData?.relativePath || \"\")\n : null\n\n const lastUpdatedText = showLastUpdated\n ? new Date(pageData!.lastUpdated!).toLocaleDateString(\n undefined,\n themeConfig.lastUpdated?.formatOptions ?? {\n year: \"numeric\",\n month: \"long\",\n day: \"numeric\",\n }\n )\n : null\n\n return (\n <article className=\"press-content-container\">\n {pageData?.frontmatter.title && (\n <header className=\"press-content-header\">\n <h1 className=\"press-content-title\">{pageData.frontmatter.title}</h1>\n {pageData.frontmatter.description && (\n <p className=\"press-content-description\">{pageData.frontmatter.description}</p>\n )}\n </header>\n )}\n\n <div className=\"press-content-body\">{children}</div>\n\n <footer className=\"press-content-footer\">\n {(showEditLink || showLastUpdated) && (\n <div className=\"press-content-meta\">\n {showEditLink && (\n <a\n href={editLink!}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"press-edit-link\"\n >\n {themeConfig.editLink?.text ?? \"Edit this page\"}\n </a>\n )}\n {showLastUpdated && (\n <span className=\"press-last-updated\">\n {themeConfig.lastUpdated?.text ?? \"Last updated\"}: {lastUpdatedText}\n </span>\n )}\n </div>\n )}\n\n {(prev || next) && (\n <nav className=\"press-prev-next\">\n {prev ? (\n <Link to={prev.link!} className=\"press-prev-link\">\n <span className=\"press-prev-next-label\">Previous</span>\n <span className=\"press-prev-next-title\">{prev.text}</span>\n </Link>\n ) : (\n <div />\n )}\n {next ? (\n <Link to={next.link!} className=\"press-next-link\">\n <span className=\"press-prev-next-label\">Next</span>\n <span className=\"press-prev-next-title\">{next.text}</span>\n </Link>\n ) : (\n <div />\n )}\n </nav>\n )}\n </footer>\n </article>\n )\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=\"press-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=\"press-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 \"@tanstack/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=\"press-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=\"press-home-main\">\n {hero && (\n <section className=\"press-hero\">\n <div className=\"press-hero-container\">\n {hero.image && (\n <div className=\"press-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=\"press-hero-content\">\n {hero.name && <h1 className=\"press-hero-name\">{hero.name}</h1>}\n {hero.text && <p className=\"press-hero-text\">{hero.text}</p>}\n {hero.tagline && <p className=\"press-hero-tagline\">{hero.tagline}</p>}\n\n {hero.actions && hero.actions.length > 0 && (\n <div className=\"press-hero-actions\">\n {hero.actions.map((action, index) => (\n <Link\n key={index}\n to={action.link}\n className={`press-hero-action press-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=\"press-features\">\n <div className=\"press-features-container\">\n {features.map((feature, index) => (\n <div key={index} className=\"press-feature\">\n {feature.icon && <div className=\"press-feature-icon\">{feature.icon}</div>}\n <h3 className=\"press-feature-title\">{feature.title}</h3>\n <p className=\"press-feature-details\">{feature.details}</p>\n {feature.link && (\n <Link to={feature.link} className=\"press-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 { useState } from \"react\"\nimport { CopyButton } from \"./CopyButton\"\n\ninterface CodeBlockProps {\n code: string\n language?: string\n title?: string\n lineNumbers?: boolean\n highlightLines?: number[]\n children?: React.ReactNode\n}\n\nexport function CodeBlock({\n code,\n language = \"text\",\n title,\n lineNumbers = false,\n highlightLines = [],\n children,\n}: CodeBlockProps) {\n const lines = code.split(\"\\n\")\n\n return (\n <div className=\"press-code-block\" data-lang={language}>\n {title && <div className=\"press-code-title\">{title}</div>}\n <div className=\"press-code-wrapper\">\n {children || (\n <pre className={`language-${language}`}>\n <code>\n {lines.map((line, index) => {\n const lineNum = index + 1\n const isHighlighted = highlightLines.includes(lineNum)\n const classes = [\"press-code-line\"]\n if (isHighlighted) classes.push(\"highlighted\")\n\n return (\n <span key={index} className={classes.join(\" \")}>\n {lineNumbers && <span className=\"press-line-number\">{lineNum}</span>}\n <span className=\"press-line-content\">{line}</span>\n {index < lines.length - 1 && \"\\n\"}\n </span>\n )\n })}\n </code>\n </pre>\n )}\n <CopyButton code={code} />\n </div>\n </div>\n )\n}\n\ninterface CodeGroupProps {\n children: React.ReactNode\n}\n\nexport function CodeGroup({ children }: CodeGroupProps) {\n const [activeTab, setActiveTab] = useState(0)\n\n const childArray = Array.isArray(children) ? children : [children]\n const tabs = childArray.map((child, index) => {\n const props = (child as React.ReactElement)?.props as { title?: string; language?: string }\n return props?.title || props?.language || `Tab ${index + 1}`\n })\n\n return (\n <div className=\"press-code-group\">\n <div className=\"press-code-group-tabs\">\n {tabs.map((tab, index) => (\n <button\n key={index}\n className={[\"press-code-group-tab\", index === activeTab && \"active\"]\n .filter(Boolean)\n .join(\" \")}\n onClick={() => setActiveTab(index)}\n >\n {tab}\n </button>\n ))}\n </div>\n <div className=\"press-code-group-panels\">\n {childArray.map((child, index) => (\n <div\n key={index}\n className={[\"press-code-group-panel\", index === activeTab && \"active\"]\n .filter(Boolean)\n .join(\" \")}\n style={{ display: index === activeTab ? \"block\" : \"none\" }}\n >\n {child}\n </div>\n ))}\n </div>\n </div>\n )\n}\n","import { useState } from \"react\"\n\ninterface CopyButtonProps {\n code: string\n}\n\nexport function CopyButton({ code }: CopyButtonProps) {\n const [copied, setCopied] = useState(false)\n\n const handleCopy = async () => {\n try {\n await navigator.clipboard.writeText(code)\n setCopied(true)\n setTimeout(() => setCopied(false), 2000)\n } catch (err) {\n console.error(\"Failed to copy:\", err)\n }\n }\n\n return (\n <button\n className=\"press-copy-button\"\n onClick={handleCopy}\n aria-label={copied ? \"Copied!\" : \"Copy code\"}\n >\n {copied ? <CheckIcon /> : <CopyIcon />}\n <span className=\"press-copy-text\">{copied ? \"Copied!\" : \"Copy\"}</span>\n </button>\n )\n}\n\nfunction CopyIcon() {\n return (\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 <rect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\" />\n <path d=\"M5 15H4a2 2 0 01-2-2V4a2 2 0 012-2h9a2 2 0 012 2v1\" />\n </svg>\n )\n}\n\nfunction CheckIcon() {\n return (\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 <polyline points=\"20,6 9,17 4,12\" />\n </svg>\n )\n}\n","import { type ReactNode } from \"react\"\n\ntype ContainerType = \"tip\" | \"warning\" | \"danger\" | \"info\" | \"note\"\n\ninterface ContainerProps {\n type: ContainerType\n title?: string\n children: ReactNode\n}\n\nconst defaultTitles: Record<ContainerType, string> = {\n tip: \"TIP\",\n warning: \"WARNING\",\n danger: \"DANGER\",\n info: \"INFO\",\n note: \"NOTE\",\n}\n\nconst icons: Record<ContainerType, ReactNode> = {\n tip: (\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=\"M9 18h6M12 2v1M12 21v-6M4.22 4.22l.71.71M19.07 4.93l-.71.71M1 12h2M21 12h2M4.22 19.78l.71-.71M19.07 19.07l-.71-.71\" />\n <circle cx=\"12\" cy=\"12\" r=\"4\" />\n </svg>\n ),\n warning: (\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=\"M10.29 3.86L1.82 18a2 2 0 001.71 3h16.94a2 2 0 001.71-3L13.71 3.86a2 2 0 00-3.42 0z\" />\n <line x1=\"12\" y1=\"9\" x2=\"12\" y2=\"13\" />\n <line x1=\"12\" y1=\"17\" x2=\"12.01\" y2=\"17\" />\n </svg>\n ),\n danger: (\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=\"10\" />\n <line x1=\"15\" y1=\"9\" x2=\"9\" y2=\"15\" />\n <line x1=\"9\" y1=\"9\" x2=\"15\" y2=\"15\" />\n </svg>\n ),\n info: (\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=\"10\" />\n <line x1=\"12\" y1=\"16\" x2=\"12\" y2=\"12\" />\n <line x1=\"12\" y1=\"8\" x2=\"12.01\" y2=\"8\" />\n </svg>\n ),\n note: (\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=\"M14.5 2H6a2 2 0 00-2 2v16a2 2 0 002 2h12a2 2 0 002-2V7.5L14.5 2z\" />\n <polyline points=\"14,2 14,8 20,8\" />\n <line x1=\"16\" y1=\"13\" x2=\"8\" y2=\"13\" />\n <line x1=\"16\" y1=\"17\" x2=\"8\" y2=\"17\" />\n <line x1=\"10\" y1=\"9\" x2=\"8\" y2=\"9\" />\n </svg>\n ),\n}\n\nexport function Container({ type, title, children }: ContainerProps) {\n const displayTitle = title || defaultTitles[type]\n\n return (\n <div className={`press-container press-container-${type}`}>\n <p className=\"press-container-title\">\n <span className=\"press-container-icon\">{icons[type]}</span>\n {displayTitle}\n </p>\n <div className=\"press-container-content\">{children}</div>\n </div>\n )\n}\n\nexport function Tip({ title, children }: Omit<ContainerProps, \"type\">) {\n return (\n <Container type=\"tip\" title={title}>\n {children}\n </Container>\n )\n}\n\nexport function Warning({ title, children }: Omit<ContainerProps, \"type\">) {\n return (\n <Container type=\"warning\" title={title}>\n {children}\n </Container>\n )\n}\n\nexport function Danger({ title, children }: Omit<ContainerProps, \"type\">) {\n return (\n <Container type=\"danger\" title={title}>\n {children}\n </Container>\n )\n}\n\nexport function Info({ title, children }: Omit<ContainerProps, \"type\">) {\n return (\n <Container type=\"info\" title={title}>\n {children}\n </Container>\n )\n}\n\nexport function Note({ title, children }: Omit<ContainerProps, \"type\">) {\n return (\n <Container type=\"note\" title={title}>\n {children}\n </Container>\n )\n}\n","import { useState, createContext, useContext, type ReactNode } from \"react\"\n\ninterface TabsContextValue {\n activeTab: string\n setActiveTab: (tab: string) => void\n}\n\nconst TabsContext = createContext<TabsContextValue | null>(null)\n\nfunction useTabsContext() {\n const context = useContext(TabsContext)\n if (!context) {\n throw new Error(\"Tab components must be used within a Tabs component\")\n }\n return context\n}\n\ninterface TabsProps {\n defaultValue?: string\n children: ReactNode\n}\n\nexport function Tabs({ defaultValue, children }: TabsProps) {\n const [activeTab, setActiveTab] = useState(defaultValue || \"\")\n\n return (\n <TabsContext.Provider value={{ activeTab, setActiveTab }}>\n <div className=\"press-tabs\">{children}</div>\n </TabsContext.Provider>\n )\n}\n\ninterface TabListProps {\n children: ReactNode\n}\n\nexport function TabList({ children }: TabListProps) {\n return (\n <div className=\"press-tab-list\" role=\"tablist\">\n {children}\n </div>\n )\n}\n\ninterface TabProps {\n value: string\n children: ReactNode\n}\n\nexport function Tab({ value, children }: TabProps) {\n const { activeTab, setActiveTab } = useTabsContext()\n const isActive = activeTab === value\n\n return (\n <button\n role=\"tab\"\n aria-selected={isActive}\n className={[\"press-tab\", isActive && \"active\"].filter(Boolean).join(\" \")}\n onClick={() => setActiveTab(value)}\n >\n {children}\n </button>\n )\n}\n\ninterface TabPanelProps {\n value: string\n children: ReactNode\n}\n\nexport function TabPanel({ value, children }: TabPanelProps) {\n const { activeTab } = useTabsContext()\n const isActive = activeTab === value\n\n if (!isActive) {\n return null\n }\n\n return (\n <div role=\"tabpanel\" className=\"press-tab-panel\">\n {children}\n </div>\n )\n}\n\ninterface TabPanelsProps {\n children: ReactNode\n}\n\nexport function TabPanels({ children }: TabPanelsProps) {\n return <div className=\"press-tab-panels\">{children}</div>\n}\n"],"mappings":"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","names":["useState","Link","jsx","jsxs","useState","useEffect","jsx","jsxs","useState","useEffect","handleKeyDown","jsx","jsxs","useState","Link","icons","useState","Link","jsx","jsxs","Fragment","jsx","jsxs","useState","createContext","useContext","Link","jsx","jsxs","useState","useEffect","jsx","jsxs","useState","useEffect","Link","jsx","jsxs","jsx","jsxs","Link","jsx","jsxs","Link","useState","useState","jsx","jsxs","jsx","jsxs","useState","jsx","jsxs","useState","createContext","useContext","jsx"]}
@@ -677,8 +677,22 @@ function ${componentName}() {
677
677
  import { tanstackStart } from "@tanstack/react-start/plugin/vite";
678
678
  import react from "@vitejs/plugin-react";
679
679
  import fs2 from "fs/promises";
680
+ import fsSync2 from "fs";
680
681
  import path2 from "path";
681
682
  import { execSync } from "child_process";
683
+ function findPackageRoot(cwd) {
684
+ let dir = path2.resolve(cwd);
685
+ const root = path2.parse(dir).root;
686
+ while (dir !== root) {
687
+ const parentDir = path2.dirname(dir);
688
+ const packageJsonPath = path2.join(parentDir, "package.json");
689
+ if (fsSync2.existsSync(packageJsonPath)) {
690
+ return path2.relative(cwd, parentDir) || ".";
691
+ }
692
+ dir = parentDir;
693
+ }
694
+ return void 0;
695
+ }
682
696
  function detectGitHubRepoName(cwd) {
683
697
  try {
684
698
  const remoteUrl = execSync("git remote get-url origin", {
@@ -811,9 +825,11 @@ export default function MarkdownContent() {
811
825
  );
812
826
  }
813
827
  if (typedoc) {
828
+ const packageRoot = findPackageRoot(process.cwd());
829
+ const defaultEntryPoint = packageRoot ? `${packageRoot}/src/index.ts` : "./src/index.ts";
814
830
  const defaultTypedocConfig = {
815
831
  enabled: true,
816
- entryPoints: ["./src/index.ts"],
832
+ entryPoints: [defaultEntryPoint],
817
833
  out: "api-reference",
818
834
  excludePrivate: true,
819
835
  excludeInternal: true
@@ -833,8 +849,14 @@ export default function MarkdownContent() {
833
849
  console.log(`[ardo] Generated ${docs.length} API documentation pages in ${duration}ms`);
834
850
  hasGenerated = true;
835
851
  } catch (error) {
836
- console.error("[ardo] TypeDoc generation failed:", error);
837
- throw error;
852
+ console.warn(
853
+ "[ardo] TypeDoc generation failed. API documentation will not be available."
854
+ );
855
+ console.warn("[ardo] Check your typedoc.entryPoints configuration.");
856
+ if (error instanceof Error) {
857
+ console.warn(`[ardo] Error: ${error.message}`);
858
+ }
859
+ hasGenerated = true;
838
860
  }
839
861
  }
840
862
  }
@@ -1121,4 +1143,4 @@ export {
1121
1143
  getPageDataForRoute,
1122
1144
  generateSidebar2 as generateSidebar
1123
1145
  };
1124
- //# sourceMappingURL=chunk-5ZESKKTO.js.map
1146
+ //# sourceMappingURL=chunk-VMA2OXSY.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/markdown/pipeline.ts","../src/markdown/containers.ts","../src/markdown/toc.ts","../src/markdown/shiki.ts","../src/markdown/links.ts","../src/vite/routes-plugin.ts","../src/vite/plugin.ts","../src/runtime/loader.ts","../src/runtime/sidebar.ts"],"sourcesContent":["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 } 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: [\"press-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=\"press-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=\"press-code-group-tabs\">${tabsHtml}</div>`,\n } as unknown as (typeof node.children)[number],\n {\n type: \"html\",\n value: '<div class=\"press-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=\"press-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: [\"press-details\"],\n }\n\n node.children.unshift({\n type: \"html\",\n value: `<summary class=\"press-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: [\"press-container\", `press-container-${type}`],\n }\n\n node.children.unshift({\n type: \"html\",\n value: `<p class=\"press-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","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\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 id = slugify(text)\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 { createHighlighter, type Highlighter, type BundledTheme } 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: [\"press-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=\"press-code-title\">${escapeHtml(title)}</div>`\n }\n\n html += `<div class=\"press-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 = [\"press-code-line\"]\n if (isHighlighted) classes.push(\"highlighted\")\n\n let prefix = \"\"\n if (lineNumbers) {\n prefix = `<span class=\"press-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=\"press-copy-button\" data-code=\"${encodeURIComponent(extractCodeFromHtml(shikiHtml))}\">\n <span class=\"press-copy-icon\">Copy</span>\n <span class=\"press-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","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 type { Plugin } from \"vite\"\nimport type { ResolvedConfig } from \"../config/types\"\nimport fs from \"fs/promises\"\nimport fsSync from \"fs\"\nimport path from \"path\"\n\nexport interface PressRoutesPluginOptions {\n /** Directory where routes should be generated */\n routesDir?: string\n /** Source directory for content (default: 'content') */\n srcDir?: string\n /**\n * Layout mode for generated routes.\n * - 'docPage': Routes use DocPage which includes Layout (backward compatible)\n * - 'layoutRoute': Routes use DocContent without Layout (for use with _layout.tsx)\n * Default: 'layoutRoute'\n */\n layoutMode?: \"docPage\" | \"layoutRoute\"\n}\n\ninterface RouteInfo {\n /** Path relative to content dir without extension (e.g., 'guide/getting-started') */\n slug: string\n /** Full path to the markdown file */\n mdPath: string\n /** Path relative to content dir with extension (e.g., 'guide/getting-started.md') */\n relativePath: string\n}\n\n/**\n * Vite plugin that generates individual route files for each markdown file\n * in the content directory. Routes include SEO head() configuration\n * using frontmatter data.\n */\nexport function pressRoutesPlugin(\n getConfig: () => ResolvedConfig,\n options: PressRoutesPluginOptions = {}\n): Plugin {\n const { layoutMode = \"layoutRoute\" } = options\n\n let routesDir: string\n let contentDir: string\n let isDevMode = false\n let hasCleanedRoutes = false\n\n function scanContentDirSync(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 const children = scanContentDirSync(fullPath, rootDir)\n routes.push(...children)\n } else if (entry.name.endsWith(\".md\") && entry.name !== \"index.md\") {\n const relativePath = path.relative(rootDir, fullPath)\n const slug = relativePath.replace(/\\.md$/, \"\").replace(/\\\\/g, \"/\")\n\n routes.push({\n slug,\n mdPath: fullPath,\n relativePath: relativePath.replace(/\\\\/g, \"/\"),\n })\n } else if (entry.name === \"index.md\") {\n const parentDir = path.dirname(fullPath)\n const relativePath = path.relative(rootDir, fullPath)\n\n // Skip root index.md (handled by manual index.tsx)\n if (parentDir !== rootDir) {\n const slug = path.relative(rootDir, parentDir).replace(/\\\\/g, \"/\")\n\n routes.push({\n slug,\n mdPath: fullPath,\n relativePath: relativePath.replace(/\\\\/g, \"/\"),\n })\n }\n }\n }\n } catch {\n // Content dir may not exist\n }\n\n return routes\n }\n\n function generateRouteCode(route: RouteInfo): string {\n const { slug, relativePath } = route\n\n // Calculate relative path from route file to content file\n // Route at routes/${slug}.tsx needs to reach content/${relativePath}\n const depthToProjectRoot = slug.split(\"/\").length + 1\n const toProjectRoot = \"../\".repeat(depthToProjectRoot)\n const contentImportPath = `${toProjectRoot}content/${relativePath}`\n\n // Generate component name from slug\n const componentName =\n slug\n .split(\"/\")\n .map((part) => part.replace(/[-_]/g, \" \").replace(/\\b\\w/g, (c) => c.toUpperCase()))\n .join(\"\")\n .replace(/\\s/g, \"\") + \"Page\"\n\n // Generate route path for TanStack Router (no route group, direct path)\n const routePath = `/${slug}`\n\n // Generate default title from slug\n const defaultTitle = slug\n .split(\"/\")\n .pop()!\n .replace(/[-_]/g, \" \")\n .replace(/\\b\\w/g, (c) => c.toUpperCase())\n\n // Choose component based on layout mode\n const contentComponent = layoutMode === \"docPage\" ? \"DocPage\" : \"DocContent\"\n\n return `// This file is auto-generated by ardo. Do not edit manually.\nimport { createFileRoute } from '@tanstack/react-router'\nimport { ${contentComponent} } from 'ardo/theme'\nimport { PressProvider } from 'ardo/runtime'\nimport config from 'virtual:ardo/config'\nimport sidebar from 'virtual:ardo/sidebar'\nimport Content, { frontmatter, toc } from '${contentImportPath}'\n\nexport const Route = createFileRoute('${routePath}')({\n head: () => ({\n meta: [\n { title: (frontmatter.title as string) ? \\`\\${frontmatter.title} | \\${config.title}\\` : config.title },\n ...(frontmatter.description ? [{ name: 'description', content: frontmatter.description as string }] : []),\n // OpenGraph\n { property: 'og:title', content: (frontmatter.title as string) || '${defaultTitle}' },\n ...(frontmatter.description ? [{ property: 'og:description', content: frontmatter.description as string }] : []),\n { property: 'og:type', content: 'article' },\n // Twitter\n { name: 'twitter:card', content: 'summary' },\n { name: 'twitter:title', content: (frontmatter.title as string) || '${defaultTitle}' },\n ...(frontmatter.description ? [{ name: 'twitter:description', content: frontmatter.description as string }] : []),\n ],\n }),\n component: ${componentName},\n})\n\nfunction ${componentName}() {\n const pageData = {\n title: (frontmatter.title as string) || '${defaultTitle}',\n description: frontmatter.description as string | undefined,\n frontmatter,\n content: '',\n toc,\n filePath: '${relativePath}',\n relativePath: '${relativePath}',\n }\n\n return (\n <PressProvider config={config} sidebar={sidebar} currentPage={pageData}>\n <${contentComponent}>\n <Content />\n </${contentComponent}>\n </PressProvider>\n )\n}\n`\n }\n\n function writeRouteFileSync(route: RouteInfo): boolean {\n const routeFilePath = path.join(routesDir, `${route.slug}.tsx`)\n const code = generateRouteCode(route)\n\n // Only write if content changed\n try {\n const existingContent = fsSync.readFileSync(routeFilePath, \"utf-8\")\n if (existingContent === code) {\n return false\n }\n } catch {\n // File doesn't exist, will be created\n }\n\n fsSync.mkdirSync(path.dirname(routeFilePath), { recursive: true })\n fsSync.writeFileSync(routeFilePath, code, \"utf-8\")\n return true\n }\n\n function generateAllRoutesSync(): void {\n const routes = scanContentDirSync(contentDir, contentDir)\n\n let writtenCount = 0\n for (const route of routes) {\n if (writeRouteFileSync(route)) {\n writtenCount++\n }\n }\n\n if (writtenCount > 0) {\n console.log(`[ardo] Generated ${writtenCount} content route files`)\n }\n }\n\n async function ensureDirectoryExists(dir: string): Promise<void> {\n try {\n await fs.mkdir(dir, { recursive: true })\n } catch {\n // Directory may already exist\n }\n }\n\n async function writeRouteFile(route: RouteInfo): Promise<boolean> {\n const routeFilePath = path.join(routesDir, `${route.slug}.tsx`)\n const routeFileDir = path.dirname(routeFilePath)\n\n await ensureDirectoryExists(routeFileDir)\n\n const code = generateRouteCode(route)\n\n // Only write if content changed to avoid triggering unnecessary rebuilds\n try {\n const existingContent = await fs.readFile(routeFilePath, \"utf-8\")\n if (existingContent === code) {\n return false // No change\n }\n } catch {\n // File doesn't exist, will be created\n }\n\n await fs.writeFile(routeFilePath, code, \"utf-8\")\n return true // File was written\n }\n\n async function cleanGeneratedRoutes(): Promise<void> {\n const pressRoutesDir = routesDir\n\n try {\n const entries = await fs.readdir(pressRoutesDir, { withFileTypes: true, recursive: true })\n\n for (const entry of entries) {\n if (entry.isFile() && entry.name.endsWith(\".tsx\") && entry.name !== \"_layout.tsx\") {\n const fullPath = path.join(entry.parentPath ?? pressRoutesDir, entry.name)\n\n // Read the file to check if it's auto-generated\n try {\n const content = await fs.readFile(fullPath, \"utf-8\")\n if (content.startsWith(\"// This file is auto-generated by ardo\")) {\n await fs.unlink(fullPath)\n }\n } catch {\n // File might have been deleted already\n }\n }\n }\n } catch {\n // Directory doesn't exist yet, nothing to clean\n }\n }\n\n async function scanContentDir(dir: string, rootDir: string): Promise<RouteInfo[]> {\n const routes: RouteInfo[] = []\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 const children = await scanContentDir(fullPath, rootDir)\n routes.push(...children)\n } else if (entry.name.endsWith(\".md\") && entry.name !== \"index.md\") {\n const relativePath = path.relative(rootDir, fullPath)\n const slug = relativePath.replace(/\\.md$/, \"\").replace(/\\\\/g, \"/\")\n\n routes.push({\n slug,\n mdPath: fullPath,\n relativePath: relativePath.replace(/\\\\/g, \"/\"),\n })\n } else if (entry.name === \"index.md\") {\n const parentDir = path.dirname(fullPath)\n const relativePath = path.relative(rootDir, fullPath)\n\n // Skip root index.md (handled by manual index.tsx)\n if (parentDir !== rootDir) {\n const slug = path.relative(rootDir, parentDir).replace(/\\\\/g, \"/\")\n\n routes.push({\n slug,\n mdPath: fullPath,\n relativePath: relativePath.replace(/\\\\/g, \"/\"),\n })\n }\n }\n }\n\n return routes\n }\n\n async function generateAllRoutes(): Promise<void> {\n // Clean old generated routes first (only in dev mode, and only once)\n if (isDevMode && !hasCleanedRoutes) {\n await cleanGeneratedRoutes()\n hasCleanedRoutes = true\n }\n\n const routes = await scanContentDir(contentDir, contentDir)\n\n let writtenCount = 0\n for (const route of routes) {\n if (await writeRouteFile(route)) {\n writtenCount++\n }\n }\n\n if (writtenCount > 0) {\n console.log(`[ardo] Generated ${writtenCount} content route files`)\n }\n }\n\n return {\n name: \"ardo:routes\",\n enforce: \"pre\",\n\n config(userConfig, env) {\n // Generate routes early, before TanStack Router scans the files\n const root = userConfig.root || process.cwd()\n const srcDir = path.join(root, \"src\")\n routesDir = options.routesDir || path.join(srcDir, \"routes\")\n isDevMode = env.command === \"serve\"\n\n // Use srcDir from options to resolve contentDir early\n contentDir = path.resolve(root, options.srcDir || \"content\")\n\n // Generate content routes SYNCHRONOUSLY\n // TanStack Router scans routes during config phase, so routes must exist by then\n try {\n generateAllRoutesSync()\n } catch (err) {\n console.warn(\"[ardo] Could not generate routes in config phase:\", err)\n }\n },\n\n configResolved(viteConfig) {\n // Update paths if they weren't set in config hook\n if (!routesDir) {\n routesDir = options.routesDir || path.join(viteConfig.root, \"src\", \"routes\")\n isDevMode = viteConfig.command === \"serve\"\n }\n },\n\n async buildStart() {\n // Re-generate content routes in buildStart for full async support\n const config = getConfig()\n contentDir = config.contentDir\n await generateAllRoutes()\n },\n\n configureServer(server) {\n // Watch for changes in content directory\n server.watcher.add(contentDir)\n\n server.watcher.on(\"change\", async (changedPath) => {\n if (changedPath.startsWith(contentDir) && changedPath.endsWith(\".md\")) {\n await generateAllRoutes()\n }\n })\n\n server.watcher.on(\"add\", async (addedPath) => {\n if (addedPath.startsWith(contentDir) && addedPath.endsWith(\".md\")) {\n await generateAllRoutes()\n }\n })\n\n server.watcher.on(\"unlink\", async (removedPath) => {\n if (removedPath.startsWith(contentDir) && removedPath.endsWith(\".md\")) {\n // Re-generate routes (will clean up orphaned route files)\n hasCleanedRoutes = false // Allow cleaning again\n await generateAllRoutes()\n }\n })\n },\n }\n}\n","import type { Plugin, UserConfig } from \"vite\"\nimport type { PressConfig, ResolvedConfig } from \"../config/types\"\nimport type { TypeDocConfig } from \"../typedoc/types\"\nimport { resolveConfig } from \"../config/index\"\nimport { transformMarkdown } from \"../markdown/pipeline\"\nimport { createShikiHighlighter, type ShikiHighlighter } from \"../markdown/shiki\"\nimport { pressRoutesPlugin, type PressRoutesPluginOptions } from \"./routes-plugin\"\nimport { generateApiDocs } from \"../typedoc/generator\"\nimport { tanstackStart } from \"@tanstack/react-start/plugin/vite\"\nimport react from \"@vitejs/plugin-react\"\nimport fs from \"fs/promises\"\nimport fsSync from \"fs\"\nimport path from \"path\"\nimport { execSync } from \"child_process\"\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\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\nexport interface ArdoPluginOptions extends Partial<PressConfig> {\n /** Options for the routes generator plugin */\n routes?: PressRoutesPluginOptions | false\n /** Options for TanStack Start prerendering */\n prerender?: {\n enabled?: boolean\n crawlLinks?: boolean\n }\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\n// Use globalThis to cache the Shiki highlighter as a true singleton across all plugin instances\nconst SHIKI_CACHE_KEY = \"__ardo_shiki_highlighter__\"\nlet shikiHighlighterPromise: Promise<ShikiHighlighter> | null = null\n\nfunction getShikiHighlighter(config: ResolvedConfig): Promise<ShikiHighlighter> {\n // Check if already cached on globalThis\n if ((globalThis as Record<string, unknown>)[SHIKI_CACHE_KEY]) {\n return Promise.resolve(\n (globalThis as Record<string, unknown>)[SHIKI_CACHE_KEY] as ShikiHighlighter\n )\n }\n // Use promise caching to prevent multiple concurrent creations\n if (!shikiHighlighterPromise) {\n shikiHighlighterPromise = createShikiHighlighter(config.markdown).then((highlighter) => {\n ;(globalThis as Record<string, unknown>)[SHIKI_CACHE_KEY] = highlighter\n return highlighter\n })\n }\n return shikiHighlighterPromise\n}\n\nexport function ardoPlugin(options: ArdoPluginOptions = {}): Plugin[] {\n let resolvedConfig: ResolvedConfig\n\n // Extract ardo-specific options from the rest (which is PressConfig)\n const { routes, prerender, typedoc, githubPages = true, ...pressConfig } = options\n\n const mainPlugin: Plugin = {\n name: \"ardo\",\n enforce: \"pre\",\n\n config(userConfig, env): UserConfig {\n const result: UserConfig = {\n optimizeDeps: {\n exclude: [\"ardo/theme/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(userConfig.root || process.cwd())\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 const defaultConfig: PressConfig = {\n title: pressConfig.title ?? \"Ardo\",\n description: pressConfig.description ?? \"Documentation powered by Ardo\",\n }\n resolvedConfig = resolveConfig({ ...defaultConfig, ...pressConfig }, 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 },\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 }\n return `export default ${JSON.stringify(clientConfig)}`\n }\n\n if (id === RESOLVED_VIRTUAL_SIDEBAR_ID) {\n const sidebar = await generateSidebar(resolvedConfig)\n return `export default ${JSON.stringify(sidebar)}`\n }\n },\n }\n\n const markdownPlugin: Plugin = {\n name: \"ardo:markdown\",\n enforce: \"pre\",\n\n async transform(code, id) {\n if (!id.endsWith(\".md\")) {\n return\n }\n\n const highlighter = await getShikiHighlighter(resolvedConfig)\n\n const result = await transformMarkdown(code, resolvedConfig.markdown, {\n basePath: resolvedConfig.base,\n highlighter,\n })\n\n const componentCode = `\nimport { createElement } from 'react'\n\nexport const frontmatter = ${JSON.stringify(result.frontmatter)}\nexport const toc = ${JSON.stringify(result.toc)}\n\nexport default function MarkdownContent() {\n return createElement('div', {\n className: 'press-content',\n dangerouslySetInnerHTML: { __html: ${JSON.stringify(result.html)} }\n })\n}\n`\n\n return {\n code: componentCode,\n map: null,\n }\n },\n }\n\n const plugins: Plugin[] = [mainPlugin, markdownPlugin]\n\n // Add routes plugin unless explicitly disabled\n // Note: Routes plugin must come AFTER typedoc in the array so that\n // typedoc runs first in buildStart and generates markdown files\n if (routes !== false) {\n plugins.unshift(\n pressRoutesPlugin(() => resolvedConfig, {\n srcDir: pressConfig.srcDir,\n ...routes,\n })\n )\n }\n\n // Add TypeDoc plugin if enabled\n // Note: unshift adds to front, so typedoc will be before routes in the array\n // This ensures typedoc buildStart runs before routes buildStart\n if (typedoc) {\n // Find package root to use as default entry point base\n const packageRoot = findPackageRoot(process.cwd())\n const defaultEntryPoint = packageRoot ? `${packageRoot}/src/index.ts` : \"./src/index.ts\"\n\n const defaultTypedocConfig: TypeDocConfig = {\n enabled: true,\n entryPoints: [defaultEntryPoint],\n out: \"api-reference\",\n excludePrivate: true,\n excludeInternal: true,\n }\n\n const typedocConfig: TypeDocConfig =\n typedoc === true ? defaultTypedocConfig : { ...defaultTypedocConfig, ...typedoc }\n\n let hasGenerated = false\n\n const typedocPlugin: Plugin = {\n name: \"ardo:typedoc\",\n\n async buildStart() {\n if (!hasGenerated && typedocConfig.enabled) {\n console.log(\"[ardo] Generating API documentation with TypeDoc...\")\n const startTime = Date.now()\n try {\n const contentDir = pressConfig.srcDir ?? \"./content\"\n const docs = await generateApiDocs(typedocConfig, contentDir)\n const duration = Date.now() - startTime\n console.log(`[ardo] Generated ${docs.length} API documentation pages in ${duration}ms`)\n hasGenerated = true\n } catch (error) {\n // Don't crash the dev server if TypeDoc fails - just warn and continue\n // This allows users to run the dev server even if their TypeDoc config is incorrect\n console.warn(\n \"[ardo] TypeDoc generation failed. API documentation will not be available.\"\n )\n console.warn(\"[ardo] Check your typedoc.entryPoints configuration.\")\n if (error instanceof Error) {\n console.warn(`[ardo] Error: ${error.message}`)\n }\n hasGenerated = true // Prevent retry\n }\n }\n },\n }\n\n plugins.unshift(typedocPlugin)\n }\n\n // Add TanStack Start plugin\n const tanstackPlugin = tanstackStart({\n prerender: {\n enabled: prerender?.enabled ?? true,\n crawlLinks: prerender?.crawlLinks ?? false,\n },\n })\n const tanstackPlugins = (\n Array.isArray(tanstackPlugin) ? tanstackPlugin : [tanstackPlugin]\n ).filter((p): p is Plugin => p != null)\n plugins.push(...tanstackPlugins)\n\n // Add React plugin\n const reactPlugin = react()\n const reactPlugins = (Array.isArray(reactPlugin) ? reactPlugin : [reactPlugin]).filter(\n (p): p is Plugin => p != null\n )\n plugins.push(...reactPlugins)\n\n return plugins\n}\n\nasync function generateSidebar(config: ResolvedConfig) {\n const { contentDir, 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(contentDir, contentDir, config.base)\n return sidebar\n } catch {\n return []\n }\n}\n\nasync function scanDirectory(\n dir: string,\n rootDir: string,\n _basePath: 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, _basePath)\n if (children.length > 0) {\n const indexPath = path.join(fullPath, \"index.md\")\n let link: string | undefined\n\n try {\n await fs.access(indexPath)\n // Don't include basePath - TanStack Router handles it automatically\n link = \"/\" + relativePath.replace(/\\\\/g, \"/\")\n } catch {\n // No index.md\n }\n\n items.push({\n text: formatTitle(entry.name),\n link,\n items: children,\n })\n }\n } else if (entry.name.endsWith(\".md\") && entry.name !== \"index.md\") {\n const fileContent = await fs.readFile(fullPath, \"utf-8\")\n const frontmatterMatch = fileContent.match(/^---\\n([\\s\\S]*?)\\n---/)\n\n let title = formatTitle(entry.name.replace(/\\.md$/, \"\"))\n let order: number | undefined\n\n if (frontmatterMatch) {\n const frontmatterText = frontmatterMatch[1]\n const titleMatch = frontmatterText.match(/title:\\s*[\"']?([^\"'\\n]+)[\"']?/)\n const orderMatch = frontmatterText.match(/order:\\s*(\\d+)/)\n\n if (titleMatch) {\n title = titleMatch[1].trim()\n }\n if (orderMatch) {\n order = parseInt(orderMatch[1], 10)\n }\n }\n\n // Don't include basePath - TanStack Router handles it automatically\n const link = \"/\" + relativePath.replace(/\\.md$/, \"\").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\nexport default ardoPlugin\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 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 - TanStack 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 - TanStack 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","visit","escapeHtml","visit","fs","fsSync","path","fs","path","path","fs","formatTitle","fs","path","matter","generateSidebar","formatTitle"]}
package/dist/index.js CHANGED
@@ -7,7 +7,7 @@ import {
7
7
  loadDoc,
8
8
  transformMarkdown,
9
9
  transformMarkdownToReact
10
- } from "./chunk-5ZESKKTO.js";
10
+ } from "./chunk-VMA2OXSY.js";
11
11
  import {
12
12
  defineConfig,
13
13
  loadConfig,
@@ -40,7 +40,7 @@ import {
40
40
  ThemeToggle,
41
41
  Tip,
42
42
  Warning
43
- } from "./chunk-BPJODFL7.js";
43
+ } from "./chunk-2JBVPO6S.js";
44
44
  import {
45
45
  PressProvider,
46
46
  findCurrentSidebarItem,
@@ -31,7 +31,7 @@ import {
31
31
  ThemeToggle,
32
32
  Tip,
33
33
  Warning
34
- } from "../chunk-BPJODFL7.js";
34
+ } from "../chunk-2JBVPO6S.js";
35
35
  import "../chunk-EOV2OUTW.js";
36
36
  export {
37
37
  CodeBlock,
@@ -9,7 +9,7 @@ import {
9
9
  pressRoutesPlugin,
10
10
  transformMarkdown,
11
11
  transformMarkdownToReact
12
- } from "../chunk-5ZESKKTO.js";
12
+ } from "../chunk-VMA2OXSY.js";
13
13
  import "../chunk-3U63LMDZ.js";
14
14
  import "../chunk-YN6PP526.js";
15
15
  export {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ardo",
3
- "version": "1.2.0",
3
+ "version": "1.2.2",
4
4
  "description": "React-first Static Documentation Framework",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -71,7 +71,7 @@
71
71
  "@types/react-dom": "^19.2.3",
72
72
  "tsup": "^8.5.1",
73
73
  "typescript": "^5.9.3",
74
- "vite": "^8.0.0-beta.9"
74
+ "vite": "^8.0.0-beta.11"
75
75
  },
76
76
  "keywords": [
77
77
  "documentation",
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/markdown/pipeline.ts","../src/markdown/containers.ts","../src/markdown/toc.ts","../src/markdown/shiki.ts","../src/markdown/links.ts","../src/vite/routes-plugin.ts","../src/vite/plugin.ts","../src/runtime/loader.ts","../src/runtime/sidebar.ts"],"sourcesContent":["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 } 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: [\"press-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=\"press-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=\"press-code-group-tabs\">${tabsHtml}</div>`,\n } as unknown as (typeof node.children)[number],\n {\n type: \"html\",\n value: '<div class=\"press-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=\"press-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: [\"press-details\"],\n }\n\n node.children.unshift({\n type: \"html\",\n value: `<summary class=\"press-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: [\"press-container\", `press-container-${type}`],\n }\n\n node.children.unshift({\n type: \"html\",\n value: `<p class=\"press-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","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\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 id = slugify(text)\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 { createHighlighter, type Highlighter, type BundledTheme } 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: [\"press-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=\"press-code-title\">${escapeHtml(title)}</div>`\n }\n\n html += `<div class=\"press-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 = [\"press-code-line\"]\n if (isHighlighted) classes.push(\"highlighted\")\n\n let prefix = \"\"\n if (lineNumbers) {\n prefix = `<span class=\"press-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=\"press-copy-button\" data-code=\"${encodeURIComponent(extractCodeFromHtml(shikiHtml))}\">\n <span class=\"press-copy-icon\">Copy</span>\n <span class=\"press-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","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 type { Plugin } from \"vite\"\nimport type { ResolvedConfig } from \"../config/types\"\nimport fs from \"fs/promises\"\nimport fsSync from \"fs\"\nimport path from \"path\"\n\nexport interface PressRoutesPluginOptions {\n /** Directory where routes should be generated */\n routesDir?: string\n /** Source directory for content (default: 'content') */\n srcDir?: string\n /**\n * Layout mode for generated routes.\n * - 'docPage': Routes use DocPage which includes Layout (backward compatible)\n * - 'layoutRoute': Routes use DocContent without Layout (for use with _layout.tsx)\n * Default: 'layoutRoute'\n */\n layoutMode?: \"docPage\" | \"layoutRoute\"\n}\n\ninterface RouteInfo {\n /** Path relative to content dir without extension (e.g., 'guide/getting-started') */\n slug: string\n /** Full path to the markdown file */\n mdPath: string\n /** Path relative to content dir with extension (e.g., 'guide/getting-started.md') */\n relativePath: string\n}\n\n/**\n * Vite plugin that generates individual route files for each markdown file\n * in the content directory. Routes include SEO head() configuration\n * using frontmatter data.\n */\nexport function pressRoutesPlugin(\n getConfig: () => ResolvedConfig,\n options: PressRoutesPluginOptions = {}\n): Plugin {\n const { layoutMode = \"layoutRoute\" } = options\n\n let routesDir: string\n let contentDir: string\n let isDevMode = false\n let hasCleanedRoutes = false\n\n function scanContentDirSync(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 const children = scanContentDirSync(fullPath, rootDir)\n routes.push(...children)\n } else if (entry.name.endsWith(\".md\") && entry.name !== \"index.md\") {\n const relativePath = path.relative(rootDir, fullPath)\n const slug = relativePath.replace(/\\.md$/, \"\").replace(/\\\\/g, \"/\")\n\n routes.push({\n slug,\n mdPath: fullPath,\n relativePath: relativePath.replace(/\\\\/g, \"/\"),\n })\n } else if (entry.name === \"index.md\") {\n const parentDir = path.dirname(fullPath)\n const relativePath = path.relative(rootDir, fullPath)\n\n // Skip root index.md (handled by manual index.tsx)\n if (parentDir !== rootDir) {\n const slug = path.relative(rootDir, parentDir).replace(/\\\\/g, \"/\")\n\n routes.push({\n slug,\n mdPath: fullPath,\n relativePath: relativePath.replace(/\\\\/g, \"/\"),\n })\n }\n }\n }\n } catch {\n // Content dir may not exist\n }\n\n return routes\n }\n\n function generateRouteCode(route: RouteInfo): string {\n const { slug, relativePath } = route\n\n // Calculate relative path from route file to content file\n // Route at routes/${slug}.tsx needs to reach content/${relativePath}\n const depthToProjectRoot = slug.split(\"/\").length + 1\n const toProjectRoot = \"../\".repeat(depthToProjectRoot)\n const contentImportPath = `${toProjectRoot}content/${relativePath}`\n\n // Generate component name from slug\n const componentName =\n slug\n .split(\"/\")\n .map((part) => part.replace(/[-_]/g, \" \").replace(/\\b\\w/g, (c) => c.toUpperCase()))\n .join(\"\")\n .replace(/\\s/g, \"\") + \"Page\"\n\n // Generate route path for TanStack Router (no route group, direct path)\n const routePath = `/${slug}`\n\n // Generate default title from slug\n const defaultTitle = slug\n .split(\"/\")\n .pop()!\n .replace(/[-_]/g, \" \")\n .replace(/\\b\\w/g, (c) => c.toUpperCase())\n\n // Choose component based on layout mode\n const contentComponent = layoutMode === \"docPage\" ? \"DocPage\" : \"DocContent\"\n\n return `// This file is auto-generated by ardo. Do not edit manually.\nimport { createFileRoute } from '@tanstack/react-router'\nimport { ${contentComponent} } from 'ardo/theme'\nimport { PressProvider } from 'ardo/runtime'\nimport config from 'virtual:ardo/config'\nimport sidebar from 'virtual:ardo/sidebar'\nimport Content, { frontmatter, toc } from '${contentImportPath}'\n\nexport const Route = createFileRoute('${routePath}')({\n head: () => ({\n meta: [\n { title: (frontmatter.title as string) ? \\`\\${frontmatter.title} | \\${config.title}\\` : config.title },\n ...(frontmatter.description ? [{ name: 'description', content: frontmatter.description as string }] : []),\n // OpenGraph\n { property: 'og:title', content: (frontmatter.title as string) || '${defaultTitle}' },\n ...(frontmatter.description ? [{ property: 'og:description', content: frontmatter.description as string }] : []),\n { property: 'og:type', content: 'article' },\n // Twitter\n { name: 'twitter:card', content: 'summary' },\n { name: 'twitter:title', content: (frontmatter.title as string) || '${defaultTitle}' },\n ...(frontmatter.description ? [{ name: 'twitter:description', content: frontmatter.description as string }] : []),\n ],\n }),\n component: ${componentName},\n})\n\nfunction ${componentName}() {\n const pageData = {\n title: (frontmatter.title as string) || '${defaultTitle}',\n description: frontmatter.description as string | undefined,\n frontmatter,\n content: '',\n toc,\n filePath: '${relativePath}',\n relativePath: '${relativePath}',\n }\n\n return (\n <PressProvider config={config} sidebar={sidebar} currentPage={pageData}>\n <${contentComponent}>\n <Content />\n </${contentComponent}>\n </PressProvider>\n )\n}\n`\n }\n\n function writeRouteFileSync(route: RouteInfo): boolean {\n const routeFilePath = path.join(routesDir, `${route.slug}.tsx`)\n const code = generateRouteCode(route)\n\n // Only write if content changed\n try {\n const existingContent = fsSync.readFileSync(routeFilePath, \"utf-8\")\n if (existingContent === code) {\n return false\n }\n } catch {\n // File doesn't exist, will be created\n }\n\n fsSync.mkdirSync(path.dirname(routeFilePath), { recursive: true })\n fsSync.writeFileSync(routeFilePath, code, \"utf-8\")\n return true\n }\n\n function generateAllRoutesSync(): void {\n const routes = scanContentDirSync(contentDir, contentDir)\n\n let writtenCount = 0\n for (const route of routes) {\n if (writeRouteFileSync(route)) {\n writtenCount++\n }\n }\n\n if (writtenCount > 0) {\n console.log(`[ardo] Generated ${writtenCount} content route files`)\n }\n }\n\n async function ensureDirectoryExists(dir: string): Promise<void> {\n try {\n await fs.mkdir(dir, { recursive: true })\n } catch {\n // Directory may already exist\n }\n }\n\n async function writeRouteFile(route: RouteInfo): Promise<boolean> {\n const routeFilePath = path.join(routesDir, `${route.slug}.tsx`)\n const routeFileDir = path.dirname(routeFilePath)\n\n await ensureDirectoryExists(routeFileDir)\n\n const code = generateRouteCode(route)\n\n // Only write if content changed to avoid triggering unnecessary rebuilds\n try {\n const existingContent = await fs.readFile(routeFilePath, \"utf-8\")\n if (existingContent === code) {\n return false // No change\n }\n } catch {\n // File doesn't exist, will be created\n }\n\n await fs.writeFile(routeFilePath, code, \"utf-8\")\n return true // File was written\n }\n\n async function cleanGeneratedRoutes(): Promise<void> {\n const pressRoutesDir = routesDir\n\n try {\n const entries = await fs.readdir(pressRoutesDir, { withFileTypes: true, recursive: true })\n\n for (const entry of entries) {\n if (entry.isFile() && entry.name.endsWith(\".tsx\") && entry.name !== \"_layout.tsx\") {\n const fullPath = path.join(entry.parentPath ?? pressRoutesDir, entry.name)\n\n // Read the file to check if it's auto-generated\n try {\n const content = await fs.readFile(fullPath, \"utf-8\")\n if (content.startsWith(\"// This file is auto-generated by ardo\")) {\n await fs.unlink(fullPath)\n }\n } catch {\n // File might have been deleted already\n }\n }\n }\n } catch {\n // Directory doesn't exist yet, nothing to clean\n }\n }\n\n async function scanContentDir(dir: string, rootDir: string): Promise<RouteInfo[]> {\n const routes: RouteInfo[] = []\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 const children = await scanContentDir(fullPath, rootDir)\n routes.push(...children)\n } else if (entry.name.endsWith(\".md\") && entry.name !== \"index.md\") {\n const relativePath = path.relative(rootDir, fullPath)\n const slug = relativePath.replace(/\\.md$/, \"\").replace(/\\\\/g, \"/\")\n\n routes.push({\n slug,\n mdPath: fullPath,\n relativePath: relativePath.replace(/\\\\/g, \"/\"),\n })\n } else if (entry.name === \"index.md\") {\n const parentDir = path.dirname(fullPath)\n const relativePath = path.relative(rootDir, fullPath)\n\n // Skip root index.md (handled by manual index.tsx)\n if (parentDir !== rootDir) {\n const slug = path.relative(rootDir, parentDir).replace(/\\\\/g, \"/\")\n\n routes.push({\n slug,\n mdPath: fullPath,\n relativePath: relativePath.replace(/\\\\/g, \"/\"),\n })\n }\n }\n }\n\n return routes\n }\n\n async function generateAllRoutes(): Promise<void> {\n // Clean old generated routes first (only in dev mode, and only once)\n if (isDevMode && !hasCleanedRoutes) {\n await cleanGeneratedRoutes()\n hasCleanedRoutes = true\n }\n\n const routes = await scanContentDir(contentDir, contentDir)\n\n let writtenCount = 0\n for (const route of routes) {\n if (await writeRouteFile(route)) {\n writtenCount++\n }\n }\n\n if (writtenCount > 0) {\n console.log(`[ardo] Generated ${writtenCount} content route files`)\n }\n }\n\n return {\n name: \"ardo:routes\",\n enforce: \"pre\",\n\n config(userConfig, env) {\n // Generate routes early, before TanStack Router scans the files\n const root = userConfig.root || process.cwd()\n const srcDir = path.join(root, \"src\")\n routesDir = options.routesDir || path.join(srcDir, \"routes\")\n isDevMode = env.command === \"serve\"\n\n // Use srcDir from options to resolve contentDir early\n contentDir = path.resolve(root, options.srcDir || \"content\")\n\n // Generate content routes SYNCHRONOUSLY\n // TanStack Router scans routes during config phase, so routes must exist by then\n try {\n generateAllRoutesSync()\n } catch (err) {\n console.warn(\"[ardo] Could not generate routes in config phase:\", err)\n }\n },\n\n configResolved(viteConfig) {\n // Update paths if they weren't set in config hook\n if (!routesDir) {\n routesDir = options.routesDir || path.join(viteConfig.root, \"src\", \"routes\")\n isDevMode = viteConfig.command === \"serve\"\n }\n },\n\n async buildStart() {\n // Re-generate content routes in buildStart for full async support\n const config = getConfig()\n contentDir = config.contentDir\n await generateAllRoutes()\n },\n\n configureServer(server) {\n // Watch for changes in content directory\n server.watcher.add(contentDir)\n\n server.watcher.on(\"change\", async (changedPath) => {\n if (changedPath.startsWith(contentDir) && changedPath.endsWith(\".md\")) {\n await generateAllRoutes()\n }\n })\n\n server.watcher.on(\"add\", async (addedPath) => {\n if (addedPath.startsWith(contentDir) && addedPath.endsWith(\".md\")) {\n await generateAllRoutes()\n }\n })\n\n server.watcher.on(\"unlink\", async (removedPath) => {\n if (removedPath.startsWith(contentDir) && removedPath.endsWith(\".md\")) {\n // Re-generate routes (will clean up orphaned route files)\n hasCleanedRoutes = false // Allow cleaning again\n await generateAllRoutes()\n }\n })\n },\n }\n}\n","import type { Plugin, UserConfig } from \"vite\"\nimport type { PressConfig, ResolvedConfig } from \"../config/types\"\nimport type { TypeDocConfig } from \"../typedoc/types\"\nimport { resolveConfig } from \"../config/index\"\nimport { transformMarkdown } from \"../markdown/pipeline\"\nimport { createShikiHighlighter, type ShikiHighlighter } from \"../markdown/shiki\"\nimport { pressRoutesPlugin, type PressRoutesPluginOptions } from \"./routes-plugin\"\nimport { generateApiDocs } from \"../typedoc/generator\"\nimport { tanstackStart } from \"@tanstack/react-start/plugin/vite\"\nimport react from \"@vitejs/plugin-react\"\nimport fs from \"fs/promises\"\nimport path from \"path\"\nimport { execSync } from \"child_process\"\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\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\nexport interface ArdoPluginOptions extends Partial<PressConfig> {\n /** Options for the routes generator plugin */\n routes?: PressRoutesPluginOptions | false\n /** Options for TanStack Start prerendering */\n prerender?: {\n enabled?: boolean\n crawlLinks?: boolean\n }\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\n// Use globalThis to cache the Shiki highlighter as a true singleton across all plugin instances\nconst SHIKI_CACHE_KEY = \"__ardo_shiki_highlighter__\"\nlet shikiHighlighterPromise: Promise<ShikiHighlighter> | null = null\n\nfunction getShikiHighlighter(config: ResolvedConfig): Promise<ShikiHighlighter> {\n // Check if already cached on globalThis\n if ((globalThis as Record<string, unknown>)[SHIKI_CACHE_KEY]) {\n return Promise.resolve(\n (globalThis as Record<string, unknown>)[SHIKI_CACHE_KEY] as ShikiHighlighter\n )\n }\n // Use promise caching to prevent multiple concurrent creations\n if (!shikiHighlighterPromise) {\n shikiHighlighterPromise = createShikiHighlighter(config.markdown).then((highlighter) => {\n ;(globalThis as Record<string, unknown>)[SHIKI_CACHE_KEY] = highlighter\n return highlighter\n })\n }\n return shikiHighlighterPromise\n}\n\nexport function ardoPlugin(options: ArdoPluginOptions = {}): Plugin[] {\n let resolvedConfig: ResolvedConfig\n\n // Extract ardo-specific options from the rest (which is PressConfig)\n const { routes, prerender, typedoc, githubPages = true, ...pressConfig } = options\n\n const mainPlugin: Plugin = {\n name: \"ardo\",\n enforce: \"pre\",\n\n config(userConfig, env): UserConfig {\n const result: UserConfig = {\n optimizeDeps: {\n exclude: [\"ardo/theme/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(userConfig.root || process.cwd())\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 const defaultConfig: PressConfig = {\n title: pressConfig.title ?? \"Ardo\",\n description: pressConfig.description ?? \"Documentation powered by Ardo\",\n }\n resolvedConfig = resolveConfig({ ...defaultConfig, ...pressConfig }, 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 },\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 }\n return `export default ${JSON.stringify(clientConfig)}`\n }\n\n if (id === RESOLVED_VIRTUAL_SIDEBAR_ID) {\n const sidebar = await generateSidebar(resolvedConfig)\n return `export default ${JSON.stringify(sidebar)}`\n }\n },\n }\n\n const markdownPlugin: Plugin = {\n name: \"ardo:markdown\",\n enforce: \"pre\",\n\n async transform(code, id) {\n if (!id.endsWith(\".md\")) {\n return\n }\n\n const highlighter = await getShikiHighlighter(resolvedConfig)\n\n const result = await transformMarkdown(code, resolvedConfig.markdown, {\n basePath: resolvedConfig.base,\n highlighter,\n })\n\n const componentCode = `\nimport { createElement } from 'react'\n\nexport const frontmatter = ${JSON.stringify(result.frontmatter)}\nexport const toc = ${JSON.stringify(result.toc)}\n\nexport default function MarkdownContent() {\n return createElement('div', {\n className: 'press-content',\n dangerouslySetInnerHTML: { __html: ${JSON.stringify(result.html)} }\n })\n}\n`\n\n return {\n code: componentCode,\n map: null,\n }\n },\n }\n\n const plugins: Plugin[] = [mainPlugin, markdownPlugin]\n\n // Add routes plugin unless explicitly disabled\n // Note: Routes plugin must come AFTER typedoc in the array so that\n // typedoc runs first in buildStart and generates markdown files\n if (routes !== false) {\n plugins.unshift(\n pressRoutesPlugin(() => resolvedConfig, {\n srcDir: pressConfig.srcDir,\n ...routes,\n })\n )\n }\n\n // Add TypeDoc plugin if enabled\n // Note: unshift adds to front, so typedoc will be before routes in the array\n // This ensures typedoc buildStart runs before routes buildStart\n if (typedoc) {\n const defaultTypedocConfig: TypeDocConfig = {\n enabled: true,\n entryPoints: [\"./src/index.ts\"],\n out: \"api-reference\",\n excludePrivate: true,\n excludeInternal: true,\n }\n\n const typedocConfig: TypeDocConfig =\n typedoc === true ? defaultTypedocConfig : { ...defaultTypedocConfig, ...typedoc }\n\n let hasGenerated = false\n\n const typedocPlugin: Plugin = {\n name: \"ardo:typedoc\",\n\n async buildStart() {\n if (!hasGenerated && typedocConfig.enabled) {\n console.log(\"[ardo] Generating API documentation with TypeDoc...\")\n const startTime = Date.now()\n try {\n const contentDir = pressConfig.srcDir ?? \"./content\"\n const docs = await generateApiDocs(typedocConfig, contentDir)\n const duration = Date.now() - startTime\n console.log(`[ardo] Generated ${docs.length} API documentation pages in ${duration}ms`)\n hasGenerated = true\n } catch (error) {\n console.error(\"[ardo] TypeDoc generation failed:\", error)\n throw error\n }\n }\n },\n }\n\n plugins.unshift(typedocPlugin)\n }\n\n // Add TanStack Start plugin\n const tanstackPlugin = tanstackStart({\n prerender: {\n enabled: prerender?.enabled ?? true,\n crawlLinks: prerender?.crawlLinks ?? false,\n },\n })\n const tanstackPlugins = (\n Array.isArray(tanstackPlugin) ? tanstackPlugin : [tanstackPlugin]\n ).filter((p): p is Plugin => p != null)\n plugins.push(...tanstackPlugins)\n\n // Add React plugin\n const reactPlugin = react()\n const reactPlugins = (Array.isArray(reactPlugin) ? reactPlugin : [reactPlugin]).filter(\n (p): p is Plugin => p != null\n )\n plugins.push(...reactPlugins)\n\n return plugins\n}\n\nasync function generateSidebar(config: ResolvedConfig) {\n const { contentDir, 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(contentDir, contentDir, config.base)\n return sidebar\n } catch {\n return []\n }\n}\n\nasync function scanDirectory(\n dir: string,\n rootDir: string,\n _basePath: 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, _basePath)\n if (children.length > 0) {\n const indexPath = path.join(fullPath, \"index.md\")\n let link: string | undefined\n\n try {\n await fs.access(indexPath)\n // Don't include basePath - TanStack Router handles it automatically\n link = \"/\" + relativePath.replace(/\\\\/g, \"/\")\n } catch {\n // No index.md\n }\n\n items.push({\n text: formatTitle(entry.name),\n link,\n items: children,\n })\n }\n } else if (entry.name.endsWith(\".md\") && entry.name !== \"index.md\") {\n const fileContent = await fs.readFile(fullPath, \"utf-8\")\n const frontmatterMatch = fileContent.match(/^---\\n([\\s\\S]*?)\\n---/)\n\n let title = formatTitle(entry.name.replace(/\\.md$/, \"\"))\n let order: number | undefined\n\n if (frontmatterMatch) {\n const frontmatterText = frontmatterMatch[1]\n const titleMatch = frontmatterText.match(/title:\\s*[\"']?([^\"'\\n]+)[\"']?/)\n const orderMatch = frontmatterText.match(/order:\\s*(\\d+)/)\n\n if (titleMatch) {\n title = titleMatch[1].trim()\n }\n if (orderMatch) {\n order = parseInt(orderMatch[1], 10)\n }\n }\n\n // Don't include basePath - TanStack Router handles it automatically\n const link = \"/\" + relativePath.replace(/\\.md$/, \"\").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\nexport default ardoPlugin\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 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 - TanStack 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 - TanStack 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":";;;;;;;;AAAA,SAAS,eAAe;AACxB,OAAO,iBAAiB;AACxB,OAAO,eAAe;AACtB,OAAO,uBAAuB;AAC9B,OAAO,qBAAqB;AAC5B,OAAO,kBAAkB;AACzB,OAAO,qBAAqB;AAC5B,OAAO,YAAY;;;ACLnB,SAAS,aAAa;AAEtB,IAAM,iBAAiB;AAAA,EACrB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAGA,IAAM,gBAA+C;AAAA,EACnD,KAAK;AAAA,EACL,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,MAAM;AAAA,EACN,SAAS;AAAA,EACT,cAAc;AAChB;AAEO,SAAS,mBAAmB;AACjC,SAAO,SAAU,MAAY;AAC3B,UAAM,MAAM,sBAAsB,CAAC,SAA6B;AAC9D,YAAM,OAAO,KAAK;AAElB,UAAI,CAAC,eAAe,SAAS,IAAI,GAAG;AAClC;AAAA,MACF;AAEA,YAAM,OAAO,KAAK,SAAS,KAAK,OAAO,CAAC;AAExC,YAAM,YAAY,KAAK,SAAS,CAAC;AACjC,UAAI;AAEJ,UACE,aACA,UAAU,SAAS,eACnB,UAAU,SAAS,CAAC,GAAG,SAAS,UAChC,UAAU,MAAM,gBAChB;AACA,sBAAe,UAAU,SAAS,CAAC,EAAwB;AAC3D,aAAK,SAAS,MAAM;AAAA,MACtB;AAEA,YAAM,QAAQ,eAAe,cAAc,IAAI;AAE/C,UAAI,SAAS,cAAc;AACzB,aAAK,QAAQ;AACb,aAAK,cAAc;AAAA,UACjB,WAAW,CAAC,kBAAkB;AAAA,QAChC;AAEA,cAAM,OAAmD,CAAC;AAE1D,mBAAW,SAAS,KAAK,UAAU;AACjC,cAAI,MAAM,SAAS,QAAQ;AACzB,kBAAM,WAAW;AACjB,kBAAM,OAAO,SAAS,QAAQ;AAC9B,kBAAM,aAAa,KAAK,MAAM,cAAc;AAC5C,kBAAM,QAAQ,aAAa,WAAW,CAAC,IAAI,SAAS,QAAQ;AAC5D,iBAAK,KAAK,EAAE,OAAO,SAAS,MAAM,CAAC;AAAA,UACrC;AAAA,QACF;AAEA,cAAM,WAAW,KACd;AAAA,UACC,CAAC,KAAK,MACJ,sCAAsC,MAAM,IAAI,YAAY,EAAE,iBAAiB,CAAC,KAAK,WAAW,IAAI,KAAK,CAAC;AAAA,QAC9G,EACC,KAAK,EAAE;AAEV,aAAK,WAAW;AAAA,UACd;AAAA,YACE,MAAM;AAAA,YACN,OAAO,sCAAsC,QAAQ;AAAA,UACvD;AAAA,UACA;AAAA,YACE,MAAM;AAAA,YACN,OAAO;AAAA,UACT;AAAA,UACA,GAAG,KAAK;AAAA,YACN,CAAC,KAAK,OACH;AAAA,cACC,MAAM;AAAA,cACN,OAAO,qCAAqC,MAAM,IAAI,YAAY,EAAE,iBAAiB,CAAC;AAAA,YACxF;AAAA,UACJ;AAAA,UACA,GAAG,KAAK,SAAS,QAAQ,CAAC,OAAuC,OAAe;AAAA,YAC9E;AAAA,YACA;AAAA,cACE,MAAM;AAAA,cACN,OAAO;AAAA,YACT;AAAA,UACF,CAAC;AAAA,UACD;AAAA,YACE,MAAM;AAAA,YACN,OAAO;AAAA,UACT;AAAA,QACF;AAEA;AAAA,MACF;AAEA,UAAI,SAAS,WAAW;AACtB,aAAK,QAAQ;AACb,aAAK,cAAc;AAAA,UACjB,WAAW,CAAC,eAAe;AAAA,QAC7B;AAEA,aAAK,SAAS,QAAQ;AAAA,UACpB,MAAM;AAAA,UACN,OAAO,0CAA0C,WAAW,KAAK,CAAC;AAAA,QACpE,CAA8C;AAE9C;AAAA,MACF;AAEA,WAAK,QAAQ;AACb,WAAK,cAAc;AAAA,QACjB,WAAW,CAAC,mBAAmB,mBAAmB,IAAI,EAAE;AAAA,MAC1D;AAEA,WAAK,SAAS,QAAQ;AAAA,QACpB,MAAM;AAAA,QACN,OAAO,oCAAoC,WAAW,KAAK,CAAC;AAAA,MAC9D,CAA8C;AAAA,IAChD,CAAC;AAAA,EACH;AACF;AAEA,SAAS,WAAW,MAAsB;AACxC,SAAO,KACJ,QAAQ,MAAM,OAAO,EACrB,QAAQ,MAAM,MAAM,EACpB,QAAQ,MAAM,MAAM,EACpB,QAAQ,MAAM,QAAQ,EACtB,QAAQ,MAAM,OAAO;AAC1B;;;AC7IA,SAAS,SAAAA,cAAa;AAYf,SAAS,iBAAiB,SAAqB;AACpD,QAAM,EAAE,eAAe,OAAO,IAAI;AAClC,QAAM,CAAC,UAAU,QAAQ,IAAI;AAE7B,SAAO,SAAU,MAAY;AAC3B,UAAM,WAA+D,CAAC;AAEtE,IAAAA,OAAM,MAAM,WAAW,CAAC,SAAkB;AACxC,UAAI,KAAK,QAAQ,YAAY,KAAK,QAAQ,UAAU;AAClD;AAAA,MACF;AAEA,YAAM,OAAO,eAAe,IAAI;AAChC,YAAM,KAAK,QAAQ,IAAI;AAEvB,eAAS,KAAK;AAAA,QACZ;AAAA,QACA,OAAO,KAAK;AAAA,QACZ;AAAA,MACF,CAAC;AAGD,YAAM,OAAO,KAAK,SAAS,KAAK,OAAO,CAAC;AACxC,YAAM,cAAe,KAAK,gBAAgB,KAAK,cAAc,CAAC;AAC9D,kBAAY,KAAK;AAAA,IACnB,CAAC;AAED,kBAAc,MAAM,aAAa,UAAU,QAAQ;AAAA,EACrD;AACF;AAEA,SAAS,eAAe,MAAuB;AAC7C,QAAM,YAAsB,CAAC;AAE7B,WAAS,YAAY,OAAgB;AACnC,QAAI,CAAC,SAAS,OAAO,UAAU,SAAU;AAEzC,UAAM,aAAa;AAEnB,QAAI,WAAW,SAAS,QAAQ;AAC9B,gBAAU,KAAK,WAAW,SAAS,EAAE;AAAA,IACvC,WAAW,WAAW,SAAS,cAAc;AAC3C,gBAAU,KAAK,WAAW,SAAS,EAAE;AAAA,IACvC,WAAW,MAAM,QAAQ,WAAW,QAAQ,GAAG;AAC7C,iBAAW,SAAS,QAAQ,WAAW;AAAA,IACzC;AAAA,EACF;AAEA,OAAK,SAAS,QAAQ,WAAW;AACjC,SAAO,UAAU,KAAK,EAAE;AAC1B;AAEA,SAAS,QAAQ,MAAsB;AACrC,SAAO,KACJ,YAAY,EACZ,KAAK,EACL,QAAQ,aAAa,EAAE,EACvB,QAAQ,YAAY,GAAG,EACvB,QAAQ,YAAY,EAAE;AAC3B;AAEA,SAAS,aACP,UACA,WACW;AACX,QAAM,SAAoB,CAAC;AAC3B,QAAM,QAAiD,CAAC;AAExD,aAAW,WAAW,UAAU;AAC9B,UAAM,OAAgB;AAAA,MACpB,IAAI,QAAQ;AAAA,MACZ,MAAM,QAAQ;AAAA,MACd,OAAO,QAAQ;AAAA,IACjB;AAEA,WAAO,MAAM,SAAS,KAAK,MAAM,MAAM,SAAS,CAAC,EAAE,SAAS,QAAQ,OAAO;AACzE,YAAM,IAAI;AAAA,IACZ;AAEA,QAAI,MAAM,WAAW,GAAG;AACtB,aAAO,KAAK,IAAI;AAAA,IAClB,OAAO;AACL,YAAM,SAAS,MAAM,MAAM,SAAS,CAAC,EAAE;AACvC,UAAI,CAAC,OAAO,UAAU;AACpB,eAAO,WAAW,CAAC;AAAA,MACrB;AACA,aAAO,SAAS,KAAK,IAAI;AAAA,IAC3B;AAEA,UAAM,KAAK,EAAE,MAAM,OAAO,QAAQ,MAAM,CAAC;AAAA,EAC3C;AAEA,SAAO;AACT;;;AC1GA,SAAS,yBAA8D;AAEvE,SAAS,SAAAC,cAAa;AAKtB,eAAsB,uBAAuB,QAAmD;AAC9F,QAAM,cAAc,OAAO,SAAS;AAAA,IAClC,OAAO;AAAA,IACP,MAAM;AAAA,EACR;AAEA,QAAM,SACJ,OAAO,gBAAgB,WAAW,CAAC,WAAW,IAAI,CAAC,YAAY,OAAO,YAAY,IAAI;AAExF,QAAM,cAAc,MAAM,kBAAkB;AAAA,IAC1C;AAAA,IACA,OAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF,CAAC;AAED,SAAO;AACT;AAOO,SAAS,2BAA2B,SAA6B;AACtE,QAAM,EAAE,aAAa,OAAO,IAAI;AAEhC,QAAM,cAAc,OAAO,SAAS;AAAA,IAClC,OAAO;AAAA,IACP,MAAM;AAAA,EACR;AAEA,SAAO,SAAU,MAAY;AAC3B,IAAAA,OAAM,MAAM,WAAW,CAAC,MAAe,OAAO,WAAW;AACvD,UACE,KAAK,YAAY,SACjB,CAAC,KAAK,SAAS,CAAC,KACf,KAAK,SAAS,CAAC,EAAc,YAAY,QAC1C;AACA;AAAA,MACF;AAEA,YAAM,WAAW,KAAK,SAAS,CAAC;AAChC,YAAM,YAAa,SAAS,YAAY,aAA0B,CAAC;AACnE,YAAM,YAAY,UAAU,KAAK,CAAC,MAAM,EAAE,WAAW,WAAW,CAAC;AACjE,YAAM,OAAO,YAAY,UAAU,QAAQ,aAAa,EAAE,IAAI;AAE9D,YAAM,cAAc,eAAe,QAAQ;AAE3C,UAAI,CAAC,YAAY,KAAK,GAAG;AACvB;AAAA,MACF;AAEA,UAAI;AACF,YAAI;AAEJ,YAAI,OAAO,gBAAgB,UAAU;AACnC,iBAAO,YAAY,WAAW,aAAa;AAAA,YACzC;AAAA,YACA,OAAO;AAAA,UACT,CAAC;AAAA,QACH,OAAO;AACL,iBAAO,YAAY,WAAW,aAAa;AAAA,YACzC;AAAA,YACA,QAAQ;AAAA,cACN,OAAO,YAAY;AAAA,cACnB,MAAM,YAAY;AAAA,YACpB;AAAA,YACA,cAAc;AAAA,UAChB,CAAC;AAAA,QACH;AAEA,cAAM,aAAc,SAAS,YAAY,cAAyB;AAClE,cAAM,cAAc,OAAO,eAAe,WAAW,SAAS,iBAAiB;AAC/E,cAAM,iBAAiB,oBAAoB,UAAU;AACrD,cAAM,QAAQ,WAAW,UAAU;AAEnC,cAAM,cAAc,mBAAmB,MAAM;AAAA,UAC3C;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF,CAAC;AAED,YAAI,UAAU,OAAO,UAAU,UAAU;AACvC,gBAAM,UAAmB;AAAA,YACvB,MAAM;AAAA,YACN,SAAS;AAAA,YACT,YAAY;AAAA,cACV,WAAW,CAAC,kBAAkB;AAAA,cAC9B,aAAa;AAAA,YACf;AAAA,YACA,UAAU;AAAA,cACR;AAAA,gBACE,MAAM;AAAA,gBACN,OAAO;AAAA,cACT;AAAA,YACF;AAAA,UACF;AACA,iBAAO,SAAS,KAAK,IAAI;AAAA,QAC3B;AAAA,MACF,QAAQ;AAAA,MAER;AAAA,IACF,CAAC;AAAA,EACH;AACF;AAEA,SAAS,eAAe,MAA8B;AACpD,MAAI,KAAK,SAAS,QAAQ;AACxB,WAAO,KAAK;AAAA,EACd;AACA,MAAI,cAAc,MAAM;AACtB,WAAO,KAAK,SAAS,IAAI,CAAC,UAAU,eAAe,KAAuB,CAAC,EAAE,KAAK,EAAE;AAAA,EACtF;AACA,SAAO;AACT;AAEA,SAAS,oBAAoB,MAAwB;AACnD,QAAM,QAAQ,KAAK,MAAM,eAAe;AACxC,MAAI,CAAC,MAAO,QAAO,CAAC;AAEpB,QAAM,SAAS,MAAM,CAAC,EAAE,MAAM,GAAG;AACjC,QAAM,QAAkB,CAAC;AAEzB,aAAW,SAAS,QAAQ;AAC1B,QAAI,MAAM,SAAS,GAAG,GAAG;AACvB,YAAM,CAAC,OAAO,GAAG,IAAI,MAAM,MAAM,GAAG,EAAE,IAAI,MAAM;AAChD,eAAS,IAAI,OAAO,KAAK,KAAK,KAAK;AACjC,cAAM,KAAK,CAAC;AAAA,MACd;AAAA,IACF,OAAO;AACL,YAAM,KAAK,OAAO,KAAK,CAAC;AAAA,IAC1B;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,WAAW,MAAkC;AACpD,QAAM,QAAQ,KAAK,MAAM,iBAAiB;AAC1C,SAAO,QAAQ,MAAM,CAAC,IAAI;AAC5B;AASA,SAAS,mBAAmB,WAAmB,SAAmC;AAChF,QAAM,EAAE,MAAM,aAAa,gBAAgB,MAAM,IAAI;AAErD,MAAI,OAAO;AAEX,MAAI,OAAO;AACT,YAAQ,iCAAiCC,YAAW,KAAK,CAAC;AAAA,EAC5D;AAEA,UAAQ,8CAA8C,IAAI;AAE1D,MAAI,eAAe,eAAe,SAAS,GAAG;AAC5C,UAAM,QAAQ,UAAU,MAAM,IAAI;AAClC,UAAM,gBAAgB,MACnB,IAAI,CAAC,MAAM,MAAM;AAChB,YAAM,UAAU,IAAI;AACpB,YAAM,gBAAgB,eAAe,SAAS,OAAO;AACrD,YAAM,UAAU,CAAC,iBAAiB;AAClC,UAAI,cAAe,SAAQ,KAAK,aAAa;AAE7C,UAAI,SAAS;AACb,UAAI,aAAa;AACf,iBAAS,mCAAmC,OAAO;AAAA,MACrD;AAEA,aAAO,gBAAgB,QAAQ,KAAK,GAAG,CAAC,KAAK,MAAM,GAAG,IAAI;AAAA,IAC5D,CAAC,EACA,KAAK,IAAI;AAEZ,YAAQ;AAAA,EACV,OAAO;AACL,YAAQ;AAAA,EACV;AAEA,UAAQ,gDAAgD,mBAAmB,oBAAoB,SAAS,CAAC,CAAC;AAAA;AAAA;AAAA;AAK1G,UAAQ;AAER,SAAO;AACT;AAEA,SAAS,oBAAoB,MAAsB;AACjD,SAAO,KACJ,QAAQ,YAAY,EAAE,EACtB,QAAQ,SAAS,GAAG,EACpB,QAAQ,SAAS,GAAG,EACpB,QAAQ,UAAU,GAAG,EACrB,QAAQ,WAAW,GAAG,EACtB,QAAQ,UAAU,GAAG;AAC1B;AAEA,SAASA,YAAW,MAAsB;AACxC,SAAO,KACJ,QAAQ,MAAM,OAAO,EACrB,QAAQ,MAAM,MAAM,EACpB,QAAQ,MAAM,MAAM,EACpB,QAAQ,MAAM,QAAQ,EACtB,QAAQ,MAAM,OAAO;AAC1B;;;AC1OA,SAAS,SAAAC,cAAa;AAWf,SAAS,YAAY,SAA4B;AACtD,QAAM,EAAE,SAAS,IAAI;AAGrB,QAAM,iBAAiB,aAAa,MAAM,KAAK,SAAS,QAAQ,OAAO,EAAE;AAEzE,SAAO,CAAC,SAAe;AACrB,QAAI,CAAC,gBAAgB;AAEnB;AAAA,IACF;AAEA,IAAAA,OAAM,MAAM,WAAW,CAAC,SAAkB;AACxC,UAAI,KAAK,YAAY,KAAK;AACxB,cAAM,OAAO,KAAK,YAAY;AAE9B,YAAI,OAAO,SAAS,UAAU;AAG5B,cAAI,KAAK,WAAW,GAAG,KAAK,CAAC,KAAK,WAAW,IAAI,KAAK,CAAC,KAAK,WAAW,cAAc,GAAG;AACtF,iBAAK,aAAa,KAAK,cAAc,CAAC;AACtC,iBAAK,WAAW,OAAO,iBAAiB;AAAA,UAC1C;AAAA,QACF;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH;AACF;;;AJbA,eAAsB,kBACpB,SACA,QACA,UAA4B,CAAC,GACH;AAC1B,QAAM,EAAE,MAAM,aAAa,SAAS,gBAAgB,IAAI,OAAO,OAAO;AACtE,QAAM,EAAE,WAAW,KAAK,aAAa,oBAAoB,IAAI;AAE7D,QAAM,gBAA+B,EAAE,KAAK,CAAC,EAAE;AAC/C,QAAM,cAAc,uBAAwB,MAAM,uBAAuB,MAAM;AAE/E,QAAM,YAAY,QAAQ,EACvB,IAAI,WAAW,EACf,IAAI,mBAAmB,CAAC,MAAM,CAAC,EAC/B,IAAI,SAAS,EACb,IAAI,eAAe,EACnB,IAAI,gBAAgB,EACpB,IAAI,kBAAkB,EAAE,eAAe,QAAQ,OAAO,KAAK,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,EAC5E,IAAI,cAAc,EAAE,oBAAoB,KAAK,CAAC,EAC9C,IAAI,4BAA4B,EAAE,aAAa,OAAO,CAAC,EACvD,IAAI,aAAa,EAAE,SAAS,CAAC,EAC7B,IAAI,iBAAiB,EAAE,oBAAoB,KAAK,CAAC;AAEpD,MAAI,OAAO,eAAe;AACxB,eAAW,UAAU,OAAO,eAAe;AACzC,gBAAU,IAAI,MAA6C;AAAA,IAC7D;AAAA,EACF;AAEA,MAAI,OAAO,eAAe;AACxB,eAAW,UAAU,OAAO,eAAe;AACzC,gBAAU,IAAI,MAA6C;AAAA,IAC7D;AAAA,EACF;AAEA,QAAM,SAAS,MAAM,UAAU,QAAQ,eAAe;AAEtD,SAAO;AAAA,IACL,MAAM,OAAO,MAAM;AAAA,IACnB;AAAA,IACA,KAAK,cAAc;AAAA,EACrB;AACF;AAEA,eAAsB,yBACpB,SACA,QAC0B;AAC1B,SAAO,kBAAkB,SAAS,MAAM;AAC1C;;;AKxEA,OAAO,QAAQ;AACf,OAAO,YAAY;AACnB,OAAO,UAAU;AA8BV,SAAS,kBACd,WACA,UAAoC,CAAC,GAC7B;AACR,QAAM,EAAE,aAAa,cAAc,IAAI;AAEvC,MAAI;AACJ,MAAI;AACJ,MAAI,YAAY;AAChB,MAAI,mBAAmB;AAEvB,WAAS,mBAAmB,KAAa,SAA8B;AACrE,UAAM,SAAsB,CAAC;AAE7B,QAAI;AACF,YAAM,UAAU,OAAO,YAAY,KAAK,EAAE,eAAe,KAAK,CAAC;AAE/D,iBAAW,SAAS,SAAS;AAC3B,cAAM,WAAW,KAAK,KAAK,KAAK,MAAM,IAAI;AAE1C,YAAI,MAAM,YAAY,GAAG;AACvB,gBAAM,WAAW,mBAAmB,UAAU,OAAO;AACrD,iBAAO,KAAK,GAAG,QAAQ;AAAA,QACzB,WAAW,MAAM,KAAK,SAAS,KAAK,KAAK,MAAM,SAAS,YAAY;AAClE,gBAAM,eAAe,KAAK,SAAS,SAAS,QAAQ;AACpD,gBAAM,OAAO,aAAa,QAAQ,SAAS,EAAE,EAAE,QAAQ,OAAO,GAAG;AAEjE,iBAAO,KAAK;AAAA,YACV;AAAA,YACA,QAAQ;AAAA,YACR,cAAc,aAAa,QAAQ,OAAO,GAAG;AAAA,UAC/C,CAAC;AAAA,QACH,WAAW,MAAM,SAAS,YAAY;AACpC,gBAAM,YAAY,KAAK,QAAQ,QAAQ;AACvC,gBAAM,eAAe,KAAK,SAAS,SAAS,QAAQ;AAGpD,cAAI,cAAc,SAAS;AACzB,kBAAM,OAAO,KAAK,SAAS,SAAS,SAAS,EAAE,QAAQ,OAAO,GAAG;AAEjE,mBAAO,KAAK;AAAA,cACV;AAAA,cACA,QAAQ;AAAA,cACR,cAAc,aAAa,QAAQ,OAAO,GAAG;AAAA,YAC/C,CAAC;AAAA,UACH;AAAA,QACF;AAAA,MACF;AAAA,IACF,QAAQ;AAAA,IAER;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,kBAAkB,OAA0B;AACnD,UAAM,EAAE,MAAM,aAAa,IAAI;AAI/B,UAAM,qBAAqB,KAAK,MAAM,GAAG,EAAE,SAAS;AACpD,UAAM,gBAAgB,MAAM,OAAO,kBAAkB;AACrD,UAAM,oBAAoB,GAAG,aAAa,WAAW,YAAY;AAGjE,UAAM,gBACJ,KACG,MAAM,GAAG,EACT,IAAI,CAAC,SAAS,KAAK,QAAQ,SAAS,GAAG,EAAE,QAAQ,SAAS,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC,EACjF,KAAK,EAAE,EACP,QAAQ,OAAO,EAAE,IAAI;AAG1B,UAAM,YAAY,IAAI,IAAI;AAG1B,UAAM,eAAe,KAClB,MAAM,GAAG,EACT,IAAI,EACJ,QAAQ,SAAS,GAAG,EACpB,QAAQ,SAAS,CAAC,MAAM,EAAE,YAAY,CAAC;AAG1C,UAAM,mBAAmB,eAAe,YAAY,YAAY;AAEhE,WAAO;AAAA;AAAA,WAEA,gBAAgB;AAAA;AAAA;AAAA;AAAA,6CAIkB,iBAAiB;AAAA;AAAA,wCAEtB,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,2EAM0B,YAAY;AAAA;AAAA;AAAA;AAAA;AAAA,4EAKX,YAAY;AAAA;AAAA;AAAA;AAAA,eAIzE,aAAa;AAAA;AAAA;AAAA,WAGjB,aAAa;AAAA;AAAA,+CAEuB,YAAY;AAAA;AAAA;AAAA;AAAA;AAAA,iBAK1C,YAAY;AAAA,qBACR,YAAY;AAAA;AAAA;AAAA;AAAA;AAAA,SAKxB,gBAAgB;AAAA;AAAA,UAEf,gBAAgB;AAAA;AAAA;AAAA;AAAA;AAAA,EAKxB;AAEA,WAAS,mBAAmB,OAA2B;AACrD,UAAM,gBAAgB,KAAK,KAAK,WAAW,GAAG,MAAM,IAAI,MAAM;AAC9D,UAAM,OAAO,kBAAkB,KAAK;AAGpC,QAAI;AACF,YAAM,kBAAkB,OAAO,aAAa,eAAe,OAAO;AAClE,UAAI,oBAAoB,MAAM;AAC5B,eAAO;AAAA,MACT;AAAA,IACF,QAAQ;AAAA,IAER;AAEA,WAAO,UAAU,KAAK,QAAQ,aAAa,GAAG,EAAE,WAAW,KAAK,CAAC;AACjE,WAAO,cAAc,eAAe,MAAM,OAAO;AACjD,WAAO;AAAA,EACT;AAEA,WAAS,wBAA8B;AACrC,UAAM,SAAS,mBAAmB,YAAY,UAAU;AAExD,QAAI,eAAe;AACnB,eAAW,SAAS,QAAQ;AAC1B,UAAI,mBAAmB,KAAK,GAAG;AAC7B;AAAA,MACF;AAAA,IACF;AAEA,QAAI,eAAe,GAAG;AACpB,cAAQ,IAAI,oBAAoB,YAAY,sBAAsB;AAAA,IACpE;AAAA,EACF;AAEA,iBAAe,sBAAsB,KAA4B;AAC/D,QAAI;AACF,YAAM,GAAG,MAAM,KAAK,EAAE,WAAW,KAAK,CAAC;AAAA,IACzC,QAAQ;AAAA,IAER;AAAA,EACF;AAEA,iBAAe,eAAe,OAAoC;AAChE,UAAM,gBAAgB,KAAK,KAAK,WAAW,GAAG,MAAM,IAAI,MAAM;AAC9D,UAAM,eAAe,KAAK,QAAQ,aAAa;AAE/C,UAAM,sBAAsB,YAAY;AAExC,UAAM,OAAO,kBAAkB,KAAK;AAGpC,QAAI;AACF,YAAM,kBAAkB,MAAM,GAAG,SAAS,eAAe,OAAO;AAChE,UAAI,oBAAoB,MAAM;AAC5B,eAAO;AAAA,MACT;AAAA,IACF,QAAQ;AAAA,IAER;AAEA,UAAM,GAAG,UAAU,eAAe,MAAM,OAAO;AAC/C,WAAO;AAAA,EACT;AAEA,iBAAe,uBAAsC;AACnD,UAAM,iBAAiB;AAEvB,QAAI;AACF,YAAM,UAAU,MAAM,GAAG,QAAQ,gBAAgB,EAAE,eAAe,MAAM,WAAW,KAAK,CAAC;AAEzF,iBAAW,SAAS,SAAS;AAC3B,YAAI,MAAM,OAAO,KAAK,MAAM,KAAK,SAAS,MAAM,KAAK,MAAM,SAAS,eAAe;AACjF,gBAAM,WAAW,KAAK,KAAK,MAAM,cAAc,gBAAgB,MAAM,IAAI;AAGzE,cAAI;AACF,kBAAM,UAAU,MAAM,GAAG,SAAS,UAAU,OAAO;AACnD,gBAAI,QAAQ,WAAW,wCAAwC,GAAG;AAChE,oBAAM,GAAG,OAAO,QAAQ;AAAA,YAC1B;AAAA,UACF,QAAQ;AAAA,UAER;AAAA,QACF;AAAA,MACF;AAAA,IACF,QAAQ;AAAA,IAER;AAAA,EACF;AAEA,iBAAe,eAAe,KAAa,SAAuC;AAChF,UAAM,SAAsB,CAAC;AAC7B,UAAM,UAAU,MAAM,GAAG,QAAQ,KAAK,EAAE,eAAe,KAAK,CAAC;AAE7D,eAAW,SAAS,SAAS;AAC3B,YAAM,WAAW,KAAK,KAAK,KAAK,MAAM,IAAI;AAE1C,UAAI,MAAM,YAAY,GAAG;AACvB,cAAM,WAAW,MAAM,eAAe,UAAU,OAAO;AACvD,eAAO,KAAK,GAAG,QAAQ;AAAA,MACzB,WAAW,MAAM,KAAK,SAAS,KAAK,KAAK,MAAM,SAAS,YAAY;AAClE,cAAM,eAAe,KAAK,SAAS,SAAS,QAAQ;AACpD,cAAM,OAAO,aAAa,QAAQ,SAAS,EAAE,EAAE,QAAQ,OAAO,GAAG;AAEjE,eAAO,KAAK;AAAA,UACV;AAAA,UACA,QAAQ;AAAA,UACR,cAAc,aAAa,QAAQ,OAAO,GAAG;AAAA,QAC/C,CAAC;AAAA,MACH,WAAW,MAAM,SAAS,YAAY;AACpC,cAAM,YAAY,KAAK,QAAQ,QAAQ;AACvC,cAAM,eAAe,KAAK,SAAS,SAAS,QAAQ;AAGpD,YAAI,cAAc,SAAS;AACzB,gBAAM,OAAO,KAAK,SAAS,SAAS,SAAS,EAAE,QAAQ,OAAO,GAAG;AAEjE,iBAAO,KAAK;AAAA,YACV;AAAA,YACA,QAAQ;AAAA,YACR,cAAc,aAAa,QAAQ,OAAO,GAAG;AAAA,UAC/C,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAEA,iBAAe,oBAAmC;AAEhD,QAAI,aAAa,CAAC,kBAAkB;AAClC,YAAM,qBAAqB;AAC3B,yBAAmB;AAAA,IACrB;AAEA,UAAM,SAAS,MAAM,eAAe,YAAY,UAAU;AAE1D,QAAI,eAAe;AACnB,eAAW,SAAS,QAAQ;AAC1B,UAAI,MAAM,eAAe,KAAK,GAAG;AAC/B;AAAA,MACF;AAAA,IACF;AAEA,QAAI,eAAe,GAAG;AACpB,cAAQ,IAAI,oBAAoB,YAAY,sBAAsB;AAAA,IACpE;AAAA,EACF;AAEA,SAAO;AAAA,IACL,MAAM;AAAA,IACN,SAAS;AAAA,IAET,OAAO,YAAY,KAAK;AAEtB,YAAM,OAAO,WAAW,QAAQ,QAAQ,IAAI;AAC5C,YAAM,SAAS,KAAK,KAAK,MAAM,KAAK;AACpC,kBAAY,QAAQ,aAAa,KAAK,KAAK,QAAQ,QAAQ;AAC3D,kBAAY,IAAI,YAAY;AAG5B,mBAAa,KAAK,QAAQ,MAAM,QAAQ,UAAU,SAAS;AAI3D,UAAI;AACF,8BAAsB;AAAA,MACxB,SAAS,KAAK;AACZ,gBAAQ,KAAK,qDAAqD,GAAG;AAAA,MACvE;AAAA,IACF;AAAA,IAEA,eAAe,YAAY;AAEzB,UAAI,CAAC,WAAW;AACd,oBAAY,QAAQ,aAAa,KAAK,KAAK,WAAW,MAAM,OAAO,QAAQ;AAC3E,oBAAY,WAAW,YAAY;AAAA,MACrC;AAAA,IACF;AAAA,IAEA,MAAM,aAAa;AAEjB,YAAM,SAAS,UAAU;AACzB,mBAAa,OAAO;AACpB,YAAM,kBAAkB;AAAA,IAC1B;AAAA,IAEA,gBAAgB,QAAQ;AAEtB,aAAO,QAAQ,IAAI,UAAU;AAE7B,aAAO,QAAQ,GAAG,UAAU,OAAO,gBAAgB;AACjD,YAAI,YAAY,WAAW,UAAU,KAAK,YAAY,SAAS,KAAK,GAAG;AACrE,gBAAM,kBAAkB;AAAA,QAC1B;AAAA,MACF,CAAC;AAED,aAAO,QAAQ,GAAG,OAAO,OAAO,cAAc;AAC5C,YAAI,UAAU,WAAW,UAAU,KAAK,UAAU,SAAS,KAAK,GAAG;AACjE,gBAAM,kBAAkB;AAAA,QAC1B;AAAA,MACF,CAAC;AAED,aAAO,QAAQ,GAAG,UAAU,OAAO,gBAAgB;AACjD,YAAI,YAAY,WAAW,UAAU,KAAK,YAAY,SAAS,KAAK,GAAG;AAErE,6BAAmB;AACnB,gBAAM,kBAAkB;AAAA,QAC1B;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AACF;;;ACpXA,SAAS,qBAAqB;AAC9B,OAAO,WAAW;AAClB,OAAOC,SAAQ;AACf,OAAOC,WAAU;AACjB,SAAS,gBAAgB;AAOzB,SAAS,qBAAqB,KAAiC;AAC7D,MAAI;AACF,UAAM,YAAY,SAAS,6BAA6B;AAAA,MACtD;AAAA,MACA,UAAU;AAAA,MACV,OAAO,CAAC,QAAQ,QAAQ,MAAM;AAAA,IAChC,CAAC,EAAE,KAAK;AAKR,UAAM,QAAQ,UAAU,MAAM,8CAA8C;AAC5E,WAAO,QAAQ,CAAC;AAAA,EAClB,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,IAAM,oBAAoB;AAC1B,IAAM,6BAA6B,OAAO;AAE1C,IAAM,qBAAqB;AAC3B,IAAM,8BAA8B,OAAO;AAmB3C,IAAM,kBAAkB;AACxB,IAAI,0BAA4D;AAEhE,SAAS,oBAAoB,QAAmD;AAE9E,MAAK,WAAuC,eAAe,GAAG;AAC5D,WAAO,QAAQ;AAAA,MACZ,WAAuC,eAAe;AAAA,IACzD;AAAA,EACF;AAEA,MAAI,CAAC,yBAAyB;AAC5B,8BAA0B,uBAAuB,OAAO,QAAQ,EAAE,KAAK,CAAC,gBAAgB;AACtF;AAAC,MAAC,WAAuC,eAAe,IAAI;AAC5D,aAAO;AAAA,IACT,CAAC;AAAA,EACH;AACA,SAAO;AACT;AAEO,SAAS,WAAW,UAA6B,CAAC,GAAa;AACpE,MAAI;AAGJ,QAAM,EAAE,QAAQ,WAAW,SAAS,cAAc,MAAM,GAAG,YAAY,IAAI;AAE3E,QAAM,aAAqB;AAAA,IACzB,MAAM;AAAA,IACN,SAAS;AAAA,IAET,OAAO,YAAY,KAAiB;AAClC,YAAM,SAAqB;AAAA,QACzB,cAAc;AAAA,UACZ,SAAS,CAAC,uBAAuB;AAAA,QACnC;AAAA,QACA,KAAK;AAAA,UACH,YAAY,CAAC,MAAM;AAAA,QACrB;AAAA,MACF;AAGA,UAAI,eAAe,IAAI,YAAY,WAAW,CAAC,WAAW,MAAM;AAC9D,cAAM,WAAW,qBAAqB,WAAW,QAAQ,QAAQ,IAAI,CAAC;AACtE,YAAI,UAAU;AACZ,iBAAO,OAAO,IAAI,QAAQ;AAC1B,kBAAQ,IAAI,6CAA6C,OAAO,IAAI,EAAE;AAAA,QACxE;AAAA,MACF;AAEA,aAAO;AAAA,IACT;AAAA,IAEA,MAAM,eAAe,QAAQ;AAC3B,YAAM,OAAO,OAAO;AACpB,YAAM,gBAA6B;AAAA,QACjC,OAAO,YAAY,SAAS;AAAA,QAC5B,aAAa,YAAY,eAAe;AAAA,MAC1C;AACA,uBAAiB,cAAc,EAAE,GAAG,eAAe,GAAG,YAAY,GAAG,IAAI;AAAA,IAC3E;AAAA,IAEA,UAAU,IAAI;AACZ,UAAI,OAAO,mBAAmB;AAC5B,eAAO;AAAA,MACT;AACA,UAAI,OAAO,oBAAoB;AAC7B,eAAO;AAAA,MACT;AAAA,IACF;AAAA,IAEA,MAAM,KAAK,IAAI;AACb,UAAI,OAAO,4BAA4B;AACrC,cAAM,eAAe;AAAA,UACnB,OAAO,eAAe;AAAA,UACtB,aAAa,eAAe;AAAA,UAC5B,MAAM,eAAe;AAAA,UACrB,MAAM,eAAe;AAAA,UACrB,aAAa,eAAe;AAAA,QAC9B;AACA,eAAO,kBAAkB,KAAK,UAAU,YAAY,CAAC;AAAA,MACvD;AAEA,UAAI,OAAO,6BAA6B;AACtC,cAAM,UAAU,MAAM,gBAAgB,cAAc;AACpD,eAAO,kBAAkB,KAAK,UAAU,OAAO,CAAC;AAAA,MAClD;AAAA,IACF;AAAA,EACF;AAEA,QAAM,iBAAyB;AAAA,IAC7B,MAAM;AAAA,IACN,SAAS;AAAA,IAET,MAAM,UAAU,MAAM,IAAI;AACxB,UAAI,CAAC,GAAG,SAAS,KAAK,GAAG;AACvB;AAAA,MACF;AAEA,YAAM,cAAc,MAAM,oBAAoB,cAAc;AAE5D,YAAM,SAAS,MAAM,kBAAkB,MAAM,eAAe,UAAU;AAAA,QACpE,UAAU,eAAe;AAAA,QACzB;AAAA,MACF,CAAC;AAED,YAAM,gBAAgB;AAAA;AAAA;AAAA,6BAGC,KAAK,UAAU,OAAO,WAAW,CAAC;AAAA,qBAC1C,KAAK,UAAU,OAAO,GAAG,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA,yCAKN,KAAK,UAAU,OAAO,IAAI,CAAC;AAAA;AAAA;AAAA;AAK9D,aAAO;AAAA,QACL,MAAM;AAAA,QACN,KAAK;AAAA,MACP;AAAA,IACF;AAAA,EACF;AAEA,QAAM,UAAoB,CAAC,YAAY,cAAc;AAKrD,MAAI,WAAW,OAAO;AACpB,YAAQ;AAAA,MACN,kBAAkB,MAAM,gBAAgB;AAAA,QACtC,QAAQ,YAAY;AAAA,QACpB,GAAG;AAAA,MACL,CAAC;AAAA,IACH;AAAA,EACF;AAKA,MAAI,SAAS;AACX,UAAM,uBAAsC;AAAA,MAC1C,SAAS;AAAA,MACT,aAAa,CAAC,gBAAgB;AAAA,MAC9B,KAAK;AAAA,MACL,gBAAgB;AAAA,MAChB,iBAAiB;AAAA,IACnB;AAEA,UAAM,gBACJ,YAAY,OAAO,uBAAuB,EAAE,GAAG,sBAAsB,GAAG,QAAQ;AAElF,QAAI,eAAe;AAEnB,UAAM,gBAAwB;AAAA,MAC5B,MAAM;AAAA,MAEN,MAAM,aAAa;AACjB,YAAI,CAAC,gBAAgB,cAAc,SAAS;AAC1C,kBAAQ,IAAI,qDAAqD;AACjE,gBAAM,YAAY,KAAK,IAAI;AAC3B,cAAI;AACF,kBAAM,aAAa,YAAY,UAAU;AACzC,kBAAM,OAAO,MAAM,gBAAgB,eAAe,UAAU;AAC5D,kBAAM,WAAW,KAAK,IAAI,IAAI;AAC9B,oBAAQ,IAAI,oBAAoB,KAAK,MAAM,+BAA+B,QAAQ,IAAI;AACtF,2BAAe;AAAA,UACjB,SAAS,OAAO;AACd,oBAAQ,MAAM,qCAAqC,KAAK;AACxD,kBAAM;AAAA,UACR;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,YAAQ,QAAQ,aAAa;AAAA,EAC/B;AAGA,QAAM,iBAAiB,cAAc;AAAA,IACnC,WAAW;AAAA,MACT,SAAS,WAAW,WAAW;AAAA,MAC/B,YAAY,WAAW,cAAc;AAAA,IACvC;AAAA,EACF,CAAC;AACD,QAAM,mBACJ,MAAM,QAAQ,cAAc,IAAI,iBAAiB,CAAC,cAAc,GAChE,OAAO,CAAC,MAAmB,KAAK,IAAI;AACtC,UAAQ,KAAK,GAAG,eAAe;AAG/B,QAAM,cAAc,MAAM;AAC1B,QAAM,gBAAgB,MAAM,QAAQ,WAAW,IAAI,cAAc,CAAC,WAAW,GAAG;AAAA,IAC9E,CAAC,MAAmB,KAAK;AAAA,EAC3B;AACA,UAAQ,KAAK,GAAG,YAAY;AAE5B,SAAO;AACT;AAEA,eAAe,gBAAgB,QAAwB;AACrD,QAAM,EAAE,YAAY,YAAY,IAAI;AAEpC,MAAI,YAAY,WAAW,CAAC,MAAM,QAAQ,YAAY,OAAO,GAAG;AAC9D,WAAO,YAAY;AAAA,EACrB;AAEA,MAAI,YAAY,WAAW,MAAM,QAAQ,YAAY,OAAO,KAAK,YAAY,QAAQ,SAAS,GAAG;AAC/F,WAAO,YAAY;AAAA,EACrB;AAEA,MAAI;AACF,UAAM,UAAU,MAAM,cAAc,YAAY,YAAY,OAAO,IAAI;AACvE,WAAO;AAAA,EACT,QAAQ;AACN,WAAO,CAAC;AAAA,EACV;AACF;AAEA,eAAe,cACb,KACA,SACA,WACoE;AACpE,QAAM,UAAU,MAAMD,IAAG,QAAQ,KAAK,EAAE,eAAe,KAAK,CAAC;AAC7D,QAAM,QAAmF,CAAC;AAE1F,aAAW,SAAS,SAAS;AAC3B,UAAM,WAAWC,MAAK,KAAK,KAAK,MAAM,IAAI;AAC1C,UAAM,eAAeA,MAAK,SAAS,SAAS,QAAQ;AAEpD,QAAI,MAAM,YAAY,GAAG;AACvB,YAAM,WAAW,MAAM,cAAc,UAAU,SAAS,SAAS;AACjE,UAAI,SAAS,SAAS,GAAG;AACvB,cAAM,YAAYA,MAAK,KAAK,UAAU,UAAU;AAChD,YAAI;AAEJ,YAAI;AACF,gBAAMD,IAAG,OAAO,SAAS;AAEzB,iBAAO,MAAM,aAAa,QAAQ,OAAO,GAAG;AAAA,QAC9C,QAAQ;AAAA,QAER;AAEA,cAAM,KAAK;AAAA,UACT,MAAM,YAAY,MAAM,IAAI;AAAA,UAC5B;AAAA,UACA,OAAO;AAAA,QACT,CAAC;AAAA,MACH;AAAA,IACF,WAAW,MAAM,KAAK,SAAS,KAAK,KAAK,MAAM,SAAS,YAAY;AAClE,YAAM,cAAc,MAAMA,IAAG,SAAS,UAAU,OAAO;AACvD,YAAM,mBAAmB,YAAY,MAAM,uBAAuB;AAElE,UAAI,QAAQ,YAAY,MAAM,KAAK,QAAQ,SAAS,EAAE,CAAC;AACvD,UAAI;AAEJ,UAAI,kBAAkB;AACpB,cAAM,kBAAkB,iBAAiB,CAAC;AAC1C,cAAM,aAAa,gBAAgB,MAAM,+BAA+B;AACxE,cAAM,aAAa,gBAAgB,MAAM,gBAAgB;AAEzD,YAAI,YAAY;AACd,kBAAQ,WAAW,CAAC,EAAE,KAAK;AAAA,QAC7B;AACA,YAAI,YAAY;AACd,kBAAQ,SAAS,WAAW,CAAC,GAAG,EAAE;AAAA,QACpC;AAAA,MACF;AAGA,YAAM,OAAO,MAAM,aAAa,QAAQ,SAAS,EAAE,EAAE,QAAQ,OAAO,GAAG;AAEvE,YAAM,KAAK;AAAA,QACT,MAAM;AAAA,QACN;AAAA,QACA;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAEA,QAAM,KAAK,CAAC,GAAG,MAAM;AACnB,QAAI,EAAE,UAAU,UAAa,EAAE,UAAU,QAAW;AAClD,aAAO,EAAE,QAAQ,EAAE;AAAA,IACrB;AACA,QAAI,EAAE,UAAU,OAAW,QAAO;AAClC,QAAI,EAAE,UAAU,OAAW,QAAO;AAClC,WAAO,EAAE,KAAK,cAAc,EAAE,IAAI;AAAA,EACpC,CAAC;AAED,SAAO,MAAM,IAAI,CAAC,EAAE,OAAO,QAAQ,GAAG,KAAK,MAAM,IAAI;AACvD;AAEA,SAAS,YAAY,MAAsB;AACzC,SAAO,KAAK,QAAQ,SAAS,GAAG,EAAE,QAAQ,SAAS,CAAC,MAAM,EAAE,YAAY,CAAC;AAC3E;;;ACvWA,OAAOE,SAAQ;AACf,OAAOC,WAAU;AAmBjB,eAAsB,QAAQ,SAAwD;AACpF,QAAM,EAAE,MAAM,YAAY,OAAO,IAAI;AAErC,QAAM,gBAAgB;AAAA,IACpBC,MAAK,KAAK,YAAY,GAAG,IAAI,KAAK;AAAA,IAClCA,MAAK,KAAK,YAAY,MAAM,UAAU;AAAA,EACxC;AAEA,MAAI,WAA0B;AAC9B,MAAI,cAA6B;AAEjC,aAAW,WAAW,eAAe;AACnC,QAAI;AACF,oBAAc,MAAMC,IAAG,SAAS,SAAS,OAAO;AAChD,iBAAW;AACX;AAAA,IACF,QAAQ;AACN;AAAA,IACF;AAAA,EACF;AAEA,MAAI,CAAC,YAAY,CAAC,aAAa;AAC7B,WAAO;AAAA,EACT;AAEA,QAAM,SAAS,MAAM,kBAAkB,aAAa,OAAO,QAAQ;AACnE,QAAM,eAAeD,MAAK,SAAS,YAAY,QAAQ;AAEvD,MAAI;AACJ,MAAI;AACF,UAAM,OAAO,MAAMC,IAAG,KAAK,QAAQ;AACnC,kBAAc,KAAK;AAAA,EACrB,QAAQ;AAAA,EAER;AAEA,SAAO;AAAA,IACL,SAAS,OAAO;AAAA,IAChB,aAAa,OAAO;AAAA,IACpB,KAAK,OAAO;AAAA,IACZ;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAEA,eAAsB,YAAY,YAAoB,QAA6C;AACjG,QAAM,OAAmB,CAAC;AAE1B,iBAAe,QAAQ,KAAa;AAClC,UAAM,UAAU,MAAMA,IAAG,QAAQ,KAAK,EAAE,eAAe,KAAK,CAAC;AAE7D,eAAW,SAAS,SAAS;AAC3B,YAAM,WAAWD,MAAK,KAAK,KAAK,MAAM,IAAI;AAE1C,UAAI,MAAM,YAAY,GAAG;AACvB,cAAM,QAAQ,QAAQ;AAAA,MACxB,WAAW,MAAM,KAAK,SAAS,KAAK,GAAG;AACrC,cAAM,cAAc,MAAMC,IAAG,SAAS,UAAU,OAAO;AACvD,cAAM,SAAS,MAAM,kBAAkB,aAAa,OAAO,QAAQ;AACnE,cAAM,eAAeD,MAAK,SAAS,YAAY,QAAQ;AAEvD,YAAI;AACJ,YAAI;AACF,gBAAM,OAAO,MAAMC,IAAG,KAAK,QAAQ;AACnC,wBAAc,KAAK;AAAA,QACrB,QAAQ;AAAA,QAER;AAEA,aAAK,KAAK;AAAA,UACR,OAAO,OAAO,YAAY,SAASC,aAAY,MAAM,KAAK,QAAQ,SAAS,EAAE,CAAC;AAAA,UAC9E,aAAa,OAAO,YAAY;AAAA,UAChC,aAAa,OAAO;AAAA,UACpB,SAAS,OAAO;AAAA,UAChB,KAAK,OAAO;AAAA,UACZ,UAAU;AAAA,UACV;AAAA,UACA;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAEA,QAAM,QAAQ,UAAU;AACxB,SAAO;AACT;AAEA,SAASA,aAAY,MAAsB;AACzC,SAAO,KAAK,QAAQ,SAAS,GAAG,EAAE,QAAQ,SAAS,CAAC,MAAM,EAAE,YAAY,CAAC;AAC3E;AAEO,SAAS,gBAAgB,cAA8B;AAC5D,SAAO,aACJ,QAAQ,SAAS,EAAE,EACnB,QAAQ,YAAY,EAAE,EACtB,QAAQ,OAAO,GAAG;AACvB;AAEO,SAAS,oBAAoB,MAAkB,MAAoC;AACxF,SAAO,KAAK,KAAK,CAAC,QAAQ;AACxB,UAAM,UAAU,gBAAgB,IAAI,YAAY;AAChD,WAAO,YAAY,QAAQ,YAAY,GAAG,IAAI;AAAA,EAChD,CAAC;AACH;;;AC5HA,OAAOC,SAAQ;AAEf,OAAOC,WAAU;AACjB,OAAOC,aAAY;AASnB,eAAsBC,iBAAgB,SAA2D;AAC/F,QAAM,EAAE,YAAY,UAAU,OAAO,IAAI;AAEzC,QAAM,gBAAgB,OAAO,YAAY;AAEzC,MAAI,eAAe;AACjB,QAAI,MAAM,QAAQ,aAAa,KAAK,cAAc,SAAS,GAAG;AAC5D,aAAO;AAAA,IACT;AACA,QAAI,CAAC,MAAM,QAAQ,aAAa,GAAG;AACjC,aAAO,CAAC;AAAA,IACV;AAAA,EACF;AAEA,SAAO,MAAM,wBAAwB,YAAY,YAAY,QAAQ;AACvE;AAEA,eAAe,wBACb,KACA,SACA,WACwB;AACxB,MAAI;AAEJ,MAAI;AACF,cAAW,MAAMH,IAAG,QAAQ,KAAK,EAAE,eAAe,KAAK,CAAC;AAAA,EAC1D,QAAQ;AACN,WAAO,CAAC;AAAA,EACV;AAMA,QAAM,QAAgC,CAAC;AAEvC,aAAW,SAAS,SAAS;AAC3B,UAAM,WAAWC,MAAK,KAAK,KAAK,MAAM,IAAI;AAC1C,UAAM,eAAeA,MAAK,SAAS,SAAS,QAAQ;AAEpD,QAAI,MAAM,KAAK,WAAW,GAAG,KAAK,MAAM,KAAK,WAAW,GAAG,GAAG;AAC5D;AAAA,IACF;AAEA,QAAI,MAAM,YAAY,GAAG;AACvB,YAAM,WAAW,MAAM,wBAAwB,UAAU,SAAS,SAAS;AAE3E,UAAI,SAAS,SAAS,GAAG;AACvB,cAAM,YAAYA,MAAK,KAAK,UAAU,UAAU;AAChD,YAAI;AACJ,YAAI,QAAQG,aAAY,MAAM,IAAI;AAClC,YAAI;AAEJ,YAAI;AACF,gBAAM,eAAe,MAAMJ,IAAG,SAAS,WAAW,OAAO;AACzD,gBAAM,EAAE,MAAM,YAAY,IAAIE,QAAO,YAAY;AAEjD,cAAI,YAAY,OAAO;AACrB,oBAAQ,YAAY;AAAA,UACtB;AACA,cAAI,OAAO,YAAY,UAAU,UAAU;AACzC,oBAAQ,YAAY;AAAA,UACtB;AAGA,iBAAO,cAAc,YAAY;AAAA,QACnC,QAAQ;AAAA,QAER;AAEA,cAAM,KAAK;AAAA,UACT,MAAM;AAAA,UACN;AAAA,UACA,WAAW;AAAA,UACX,OAAO;AAAA,UACP;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF,WAAW,MAAM,KAAK,SAAS,KAAK,KAAK,MAAM,SAAS,YAAY;AAClE,YAAM,cAAc,MAAMF,IAAG,SAAS,UAAU,OAAO;AACvD,YAAM,EAAE,MAAM,YAAY,IAAIE,QAAO,WAAW;AAEhD,UAAI,YAAY,YAAY,OAAO;AACjC;AAAA,MACF;AAEA,YAAM,QAAQ,YAAY,SAASE,aAAY,MAAM,KAAK,QAAQ,SAAS,EAAE,CAAC;AAC9E,YAAM,QAAQ,OAAO,YAAY,UAAU,WAAW,YAAY,QAAQ;AAG1E,YAAM,OAAO,cAAc,aAAa,QAAQ,SAAS,EAAE,CAAC;AAE5D,YAAM,KAAK;AAAA,QACT,MAAM;AAAA,QACN;AAAA,QACA;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAEA,QAAM,KAAK,CAAC,GAAG,MAAM;AACnB,QAAI,EAAE,UAAU,UAAa,EAAE,UAAU,QAAW;AAClD,aAAO,EAAE,QAAQ,EAAE;AAAA,IACrB;AACA,QAAI,EAAE,UAAU,OAAW,QAAO;AAClC,QAAI,EAAE,UAAU,OAAW,QAAO;AAClC,WAAO,EAAE,KAAK,cAAc,EAAE,IAAI;AAAA,EACpC,CAAC;AAED,SAAO,MAAM,IAAI,CAAC,EAAE,OAAO,QAAQ,GAAG,KAAK,MAAM,IAAI;AACvD;AAEA,SAASA,aAAY,MAAsB;AACzC,SAAO,KACJ,QAAQ,SAAS,EAAE,EACnB,QAAQ,SAAS,GAAG,EACpB,QAAQ,SAAS,CAAC,MAAM,EAAE,YAAY,CAAC;AAC5C;AAEA,SAAS,cAAc,GAAmB;AACxC,SAAO,MAAM,EAAE,QAAQ,OAAO,GAAG,EAAE,QAAQ,QAAQ,EAAE;AACvD;","names":["visit","visit","escapeHtml","visit","fs","path","fs","path","path","fs","formatTitle","fs","path","matter","generateSidebar","formatTitle"]}