ardo 3.1.0 → 3.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +9 -19
- package/dist/DocPage-CIBiCAxZ.js +1010 -0
- package/dist/DocPage-CIBiCAxZ.js.map +1 -0
- package/dist/assets/src/ui/Breadcrumb.css.ts.vanilla-Dpgq-C_p.css +20 -0
- package/dist/assets/src/ui/DocPage.css.ts.vanilla-CXKuz4U-.css +34 -0
- package/dist/assets/src/ui/Footer.css.ts.vanilla-BSzPIPt4.css +100 -0
- package/dist/assets/src/ui/Header.css.ts.vanilla-8QL0Jzgk.css +156 -0
- package/dist/assets/src/ui/Layout.css.ts.vanilla-Bpx_-gJt.css +67 -0
- package/dist/assets/src/ui/Nav.css.ts.vanilla-CsAQjogy.css +51 -0
- package/dist/assets/src/ui/Sidebar.css.ts.vanilla-D70qXTEr.css +115 -0
- package/dist/assets/src/ui/Toc.css.ts.vanilla-CYqcWgvD.css +52 -0
- package/dist/assets/src/ui/components/ApiItem.css.ts.vanilla-B_DW-1iJ.css +218 -0
- package/dist/assets/src/ui/components/CodeBlock.css.ts.vanilla-lNKqskjQ.css +182 -0
- package/dist/assets/src/ui/components/Container.css.ts.vanilla-CUhRUA9t.css +80 -0
- package/dist/assets/src/ui/components/CopyButton.css.ts.vanilla-DZZ5jgTM.css +24 -0
- package/dist/assets/src/ui/components/Features.css.ts.vanilla-D-pNXM9Q.css +129 -0
- package/dist/assets/src/ui/components/Hero.css.ts.vanilla-DHJVZ6GX.css +134 -0
- package/dist/assets/src/ui/components/Search.css.ts.vanilla-BYpWHzky.css +135 -0
- package/dist/assets/src/ui/components/Steps.css.ts.vanilla-CisaxeNj.css +59 -0
- package/dist/assets/src/ui/components/Tabs.css.ts.vanilla-C4-vJSnf.css +30 -0
- package/dist/assets/src/ui/components/ThemeToggle.css.ts.vanilla---sSUELC.css +22 -0
- package/dist/assets/src/ui/content.css.ts.vanilla-O_RaSPXm.css +106 -0
- package/dist/assets/src/ui/theme/animations.css.ts.vanilla-D6ImVUKy.css +10 -0
- package/dist/assets/src/ui/theme/dark.css.ts.vanilla-2iJgcpbU.css +87 -0
- package/dist/assets/src/ui/theme/light.css.ts.vanilla-CwinfWSf.css +87 -0
- package/dist/assets/src/ui/theme/reset.css.ts.vanilla-0Q3pLjfC.css +34 -0
- package/dist/brand-icons-DLJKqTun.js +59 -0
- package/dist/brand-icons-DLJKqTun.js.map +1 -0
- package/dist/config/index.d.ts +5 -5
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +54 -11
- package/dist/config/index.js.map +1 -1
- package/dist/contract.css-DYvFVCFE.d.ts +105 -0
- package/dist/contract.css-DYvFVCFE.d.ts.map +1 -0
- package/dist/generator-DPtRXxM_.js +1194 -0
- package/dist/generator-DPtRXxM_.js.map +1 -0
- package/dist/icons/index.d.ts +22 -1
- package/dist/icons/index.d.ts.map +1 -0
- package/dist/icons/index.js +2 -2
- package/dist/index-BTeHvysI.d.ts +807 -0
- package/dist/index-BTeHvysI.d.ts.map +1 -0
- package/dist/index-DySzkJlC.d.ts +78 -0
- package/dist/index-DySzkJlC.d.ts.map +1 -0
- package/dist/index.d.ts +5 -8
- package/dist/index.js +6 -100
- package/dist/mdx/provider.d.ts +61 -4
- package/dist/mdx/provider.d.ts.map +1 -0
- package/dist/mdx/provider.js +89 -117
- package/dist/mdx/provider.js.map +1 -1
- package/dist/runtime/index.d.ts +2 -41
- package/dist/runtime/index.js +2 -28
- package/dist/sidebar-utils-1Skqle1Q.js +109 -0
- package/dist/sidebar-utils-1Skqle1Q.js.map +1 -0
- package/dist/theme/index.d.ts +201 -182
- package/dist/theme/index.d.ts.map +1 -0
- package/dist/theme/index.js +288 -128
- package/dist/theme/index.js.map +1 -1
- package/dist/typedoc/components/index.d.ts +55 -0
- package/dist/typedoc/components/index.d.ts.map +1 -0
- package/dist/typedoc/components/index.js +339 -0
- package/dist/typedoc/components/index.js.map +1 -0
- package/dist/typedoc/index.d.ts +36 -305
- package/dist/typedoc/index.d.ts.map +1 -0
- package/dist/typedoc/index.js +97 -268
- package/dist/typedoc/index.js.map +1 -1
- package/dist/types-BCuJBsJu.d.ts +182 -0
- package/dist/types-BCuJBsJu.d.ts.map +1 -0
- package/dist/types-CTd_mkrv.d.ts +175 -0
- package/dist/types-CTd_mkrv.d.ts.map +1 -0
- package/dist/ui/index.d.ts +2 -178
- package/dist/ui/index.js +3 -95
- package/dist/ui/styles.css +1401 -1335
- package/dist/ui/styles.d.ts +1 -2
- package/dist/ui/styles.js +23 -4
- package/dist/ui-3grzJSsq.js +1314 -0
- package/dist/ui-3grzJSsq.js.map +1 -0
- package/dist/vite/index.d.ts +78 -86
- package/dist/vite/index.d.ts.map +1 -0
- package/dist/vite/index.js +2931 -1282
- package/dist/vite/index.js.map +1 -1
- package/package.json +30 -19
- package/dist/Features-D_Pt7zpA.d.ts +0 -615
- package/dist/Search-DOJMNI2T.css +0 -193
- package/dist/Search-DOJMNI2T.css.map +0 -1
- package/dist/Search-VYYG3D43.js +0 -10
- package/dist/Search-VYYG3D43.js.map +0 -1
- package/dist/chunk-4YQE3TNM.js +0 -1
- package/dist/chunk-4YQE3TNM.js.map +0 -1
- package/dist/chunk-AXLJDGQL.js +0 -1
- package/dist/chunk-AXLJDGQL.js.map +0 -1
- package/dist/chunk-CZM5NX27.js +0 -909
- package/dist/chunk-CZM5NX27.js.map +0 -1
- package/dist/chunk-FZP2AVJL.js +0 -43
- package/dist/chunk-FZP2AVJL.js.map +0 -1
- package/dist/chunk-IEPSORG5.js +0 -444
- package/dist/chunk-IEPSORG5.js.map +0 -1
- package/dist/chunk-KUWEUO37.js +0 -1
- package/dist/chunk-KUWEUO37.js.map +0 -1
- package/dist/chunk-NBRHGTR2.js +0 -79
- package/dist/chunk-NBRHGTR2.js.map +0 -1
- package/dist/chunk-PGHUPTGL.js +0 -1035
- package/dist/chunk-PGHUPTGL.js.map +0 -1
- package/dist/chunk-PMS3P4MA.js +0 -43
- package/dist/chunk-PMS3P4MA.js.map +0 -1
- package/dist/chunk-QELSOHIY.js +0 -46
- package/dist/chunk-QELSOHIY.js.map +0 -1
- package/dist/chunk-R2QKY6G3.js +0 -1
- package/dist/chunk-R2QKY6G3.js.map +0 -1
- package/dist/chunk-ZPYQQZ7J.js +0 -210
- package/dist/chunk-ZPYQQZ7J.js.map +0 -1
- package/dist/icons/index.js.map +0 -1
- package/dist/index.css +0 -1290
- package/dist/index.css.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/mdx/provider.css +0 -403
- package/dist/mdx/provider.css.map +0 -1
- package/dist/runtime/index.js.map +0 -1
- package/dist/types-CLkHwCch.d.ts +0 -248
- package/dist/ui/index.css +0 -1290
- package/dist/ui/index.css.map +0 -1
- package/dist/ui/index.js.map +0 -1
- package/dist/ui/styles.css.map +0 -1
- package/dist/ui/styles.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/ui/Layout.tsx","../src/ui/Layout.css.ts","../src/ui/ArdoRoot.tsx","../src/ui/Header.tsx","../src/ui/Header.css.ts","../src/ui/Nav.css.ts","../src/ui/components/ThemeToggle.tsx","../src/ui/components/ThemeToggle.css.ts","../src/ui/Sidebar.tsx","../src/ui/Sidebar.css.ts","../src/ui/Footer.tsx","../src/ui/Nav.tsx","../src/ui/TOC.tsx","../src/ui/TOC.css.ts","../src/ui/DocPage.tsx","../src/ui/HomePage.tsx","../src/ui/components/Hero.css.ts","../src/ui/components/Features.css.ts","../src/ui/components/Hero.tsx","../src/ui/components/Features.tsx"],"sourcesContent":["import { type ReactNode, useContext } from \"react\"\nimport { Links, Meta, Scripts, ScrollRestoration } from \"react-router\"\nimport { ArdoContext } from \"../runtime/hooks\"\nimport * as styles from \"./Layout.css\"\n\n// =============================================================================\n// RootLayout Component (html/head/body shell)\n// =============================================================================\n\nconst ARDO_FAVICON =\n \"data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20style%3D%22stroke-linecap%3Around%3Bstroke-linejoin%3Around%22%20viewBox%3D%220%200%20600%20600%22%3E%3Cdefs%3E%3Csymbol%20id%3D%22a%22%20overflow%3D%22visible%22%3E%3Cpath%20d%3D%22M300%20300%20151%20128l2%20178-41%2094h93c-35%2032-55%2068-63%20107m63-106%2095%2081m-32-96%2028%2088%22%2F%3E%3Cellipse%20cx%3D%22222%22%20cy%3D%22327%22%20fill%3D%22%2300655a%22%20rx%3D%2220%22%20ry%3D%2233%22%2F%3E%3Ccircle%20cx%3D%22227%22%20cy%3D%22324%22%20r%3D%2271%22%2F%3E%3C%2Fsymbol%3E%3C%2Fdefs%3E%3Cg%20fill%3D%22none%22%20stroke%3D%22%2300655a%22%20stroke-width%3D%2216%22%3E%3Cpath%20d%3D%22M155%20318c2-70%2066-126%20145-126s143%2056%20145%20126%22%2F%3E%3Ccircle%20cx%3D%22300%22%20cy%3D%22290%22%20r%3D%22270%22%2F%3E%3Cuse%20href%3D%22%23a%22%2F%3E%3Cuse%20href%3D%22%23a%22%20transform%3D%22matrix%28-1%200%200%201%20600%200%29%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E\"\n\nexport interface RootLayoutProps {\n children: ReactNode\n /** Favicon URL (renders <link rel=\"icon\">) */\n favicon?: string\n /** Language attribute for <html> (default: from config or \"en\") */\n lang?: string\n}\n\n/**\n * Default HTML shell for Ardo sites. Replaces the boilerplate `Layout` export\n * that every root.tsx must define for React Router.\n *\n * @example Basic usage\n * ```tsx\n * // app/root.tsx\n * export { RootLayout as Layout } from \"ardo/ui\"\n * ```\n *\n * @example With favicon\n * ```tsx\n * import logo from \"./assets/logo.svg\"\n * export const Layout = (props) => <RootLayout favicon={logo} {...props} />\n * ```\n */\nexport function RootLayout({ children, favicon, lang }: RootLayoutProps) {\n // Use optional context (RootLayout renders before ArdoProvider is available)\n const context = useContext(ArdoContext)\n const resolvedLang = lang ?? context?.config.lang ?? \"en\"\n\n return (\n <html lang={resolvedLang} suppressHydrationWarning>\n <head>\n <meta charSet=\"utf-8\" />\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n <link rel=\"icon\" type=\"image/svg+xml\" href={favicon ?? ARDO_FAVICON} />\n <Meta />\n <Links />\n </head>\n <body suppressHydrationWarning>\n {children}\n <ScrollRestoration />\n <Scripts />\n </body>\n </html>\n )\n}\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 ?? styles.layout}>\n <a href=\"#main-content\" className={styles.skipLink}>\n Skip to content\n </a>\n {header}\n <div className={styles.layoutContainer}>\n {sidebar}\n <main id=\"main-content\" className={styles.main}>\n {children}\n </main>\n </div>\n {footer}\n </div>\n )\n}\n","import 'src/ui/Layout.css.ts.vanilla.css?source=LkxheW91dF9sYXlvdXRfXzhhdXRqbTAgewogIG1pbi1oZWlnaHQ6IDEwMHZoOwogIGRpc3BsYXk6IGZsZXg7CiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKfQouTGF5b3V0X2xheW91dENvbnRhaW5lcl9fOGF1dGptMSB7CiAgZGlzcGxheTogZmxleDsKICBmbGV4OiAxOwogIHBhZGRpbmctdG9wOiB2YXIoLS1hcmRvLWxheW91dC1oZWFkZXJIZWlnaHQpOwp9Ci5MYXlvdXRfbWFpbl9fOGF1dGptMiB7CiAgZmxleDogMTsKICBtaW4td2lkdGg6IDA7CiAgcGFkZGluZzogNDBweCAzMnB4OwogIG1hcmdpbi1sZWZ0OiB2YXIoLS1hcmRvLWxheW91dC1zaWRlYmFyV2lkdGgpOwp9Ci5MYXlvdXRfaG9tZV9fOGF1dGptMyB7CiAgbWluLWhlaWdodDogMTAwdmg7Cn0KLkxheW91dF9ob21lTWFpbl9fOGF1dGptNCB7CiAgcGFkZGluZy10b3A6IHZhcigtLWFyZG8tbGF5b3V0LWhlYWRlckhlaWdodCk7Cn0KLkxheW91dF9ob21lX184YXV0am0zIC5MYXlvdXRfbWFpbl9fOGF1dGptMiB7CiAgbWFyZ2luLWxlZnQ6IDA7CiAgcGFkZGluZzogMDsKfQouTGF5b3V0X3NraXBMaW5rX184YXV0am01IHsKICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgdG9wOiAtMTAwJTsKICBsZWZ0OiAxNnB4OwogIHotaW5kZXg6IDIwMDsKICBwYWRkaW5nOiAxMnB4IDI0cHg7CiAgYmFja2dyb3VuZDogdmFyKC0tYXJkby1jb2xvci1icmFuZCk7CiAgY29sb3I6IHdoaXRlOwogIGZvbnQtd2VpZ2h0OiA2MDA7CiAgZm9udC1zaXplOiAxNHB4OwogIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKICBib3JkZXItcmFkaXVzOiB2YXIoLS1hcmRvLXJhZGl1cy1iYXNlKTsKICBib3gtc2hhZG93OiB2YXIoLS1hcmRvLWNvbG9yLXNoYWRvd01kKTsKfQouTGF5b3V0X3NraXBMaW5rX184YXV0am01OmZvY3VzIHsKICB0b3A6IDE2cHg7Cn0KQG1lZGlhIChtYXgtd2lkdGg6IDEwMjRweCkgewogIC5MYXlvdXRfbWFpbl9fOGF1dGptMiB7CiAgICBtYXJnaW4tbGVmdDogMDsKICB9Cn0';\nexport var home = 'Layout_home__8autjm3';\nexport var homeMain = 'Layout_homeMain__8autjm4';\nexport var layout = 'Layout_layout__8autjm0';\nexport var layoutContainer = 'Layout_layoutContainer__8autjm1';\nexport var main = 'Layout_main__8autjm2';\nexport var skipLink = 'Layout_skipLink__8autjm5';","import { cloneElement, isValidElement, type ReactNode } from \"react\"\nimport { Outlet, useLocation } from \"react-router\"\nimport { ArdoProvider } from \"../runtime/hooks\"\nimport type { ArdoConfig, SidebarItem } from \"../config/types\"\nimport { Layout } from \"./Layout\"\nimport { Header, type HeaderProps } from \"./Header\"\nimport { Sidebar, type SidebarProps } from \"./Sidebar\"\nimport { Footer, type FooterProps } from \"./Footer\"\nimport * as layoutStyles from \"./Layout.css\"\n\n// =============================================================================\n// ArdoRoot Component\n// =============================================================================\n\nexport interface ArdoRootProps {\n /** Ardo config (from virtual:ardo/config) */\n config: ArdoConfig\n /** Sidebar data (from virtual:ardo/sidebar) */\n sidebar: SidebarItem[]\n /** Custom header element (overrides auto-generated header) */\n header?: ReactNode\n /** Custom sidebar element (overrides auto-generated sidebar) */\n sidebarContent?: ReactNode\n /** Custom footer element (overrides auto-generated footer) */\n footer?: ReactNode\n /** Props passed to auto-generated Header (ignored when header is provided) */\n headerProps?: HeaderProps\n /** Props passed to auto-generated Sidebar (ignored when sidebarContent is provided) */\n sidebarProps?: SidebarProps\n /** Props passed to auto-generated Footer (ignored when footer is provided) */\n footerProps?: FooterProps\n /** Additional CSS classes for the layout */\n className?: string\n /** Content to render (defaults to <Outlet />) */\n children?: ReactNode\n}\n\n/**\n * All-in-one root component that combines ArdoProvider, Layout, Header,\n * Sidebar, Footer, and homepage detection into a single component.\n *\n * @example Minimal usage\n * ```tsx\n * import config from \"virtual:ardo/config\"\n * import sidebar from \"virtual:ardo/sidebar\"\n *\n * export default function Root() {\n * return <ArdoRoot config={config} sidebar={sidebar} />\n * }\n * ```\n *\n * @example With custom nav and footer overrides\n * ```tsx\n * export default function Root() {\n * return (\n * <ArdoRoot\n * config={config}\n * sidebar={sidebar}\n * headerProps={{\n * nav: (\n * <Nav>\n * <NavLink to=\"/guide\">Guide</NavLink>\n * <NavLink to=\"/api\">API</NavLink>\n * </Nav>\n * ),\n * }}\n * footerProps={{\n * message: \"Released under the MIT License.\",\n * }}\n * />\n * )\n * }\n * ```\n */\nexport function ArdoRoot({\n config,\n sidebar,\n header,\n sidebarContent,\n footer,\n headerProps,\n sidebarProps,\n footerProps,\n className,\n children,\n}: ArdoRootProps) {\n const location = useLocation()\n const isHomePage = location.pathname === \"/\" || location.pathname === \"\"\n\n const resolvedSidebar = isHomePage ? undefined : (sidebarContent ?? <Sidebar {...sidebarProps} />)\n const inferredMobileMenuContent = isHomePage ? undefined : resolvedSidebar\n const resolvedHeader = header ? (\n enhanceHeaderWithMobileMenuContent(header, inferredMobileMenuContent)\n ) : (\n <Header\n {...headerProps}\n mobileMenuContent={headerProps?.mobileMenuContent ?? inferredMobileMenuContent}\n />\n )\n const resolvedFooter = footer ?? <Footer {...footerProps} />\n const resolvedClassName =\n className ?? (isHomePage ? `${layoutStyles.layout} ${layoutStyles.home}` : layoutStyles.layout)\n\n return (\n <ArdoProvider config={config} sidebar={sidebar}>\n <Layout\n className={resolvedClassName}\n header={resolvedHeader}\n sidebar={resolvedSidebar}\n footer={resolvedFooter}\n >\n {children ?? <Outlet />}\n </Layout>\n </ArdoProvider>\n )\n}\n\nfunction enhanceHeaderWithMobileMenuContent(\n header: ReactNode,\n mobileMenuContent: ReactNode\n): ReactNode {\n if (!isValidElement<HeaderProps>(header) || header.type !== Header) {\n return header\n }\n\n const existingMobileMenuContent = header.props.mobileMenuContent\n if (existingMobileMenuContent !== undefined) {\n return header\n }\n\n return cloneElement(header, { mobileMenuContent })\n}\n","import { useEffect, useState, lazy, Suspense, type MouseEvent, type ReactNode } from \"react\"\nimport { Link, NavLink as RouterNavLink, useLocation } from \"react-router\"\nimport * as styles from \"./Header.css\"\nimport * as navStyles from \"./Nav.css\"\nimport {\n GithubIcon,\n TwitterIcon,\n MessageCircleIcon,\n LinkedinIcon,\n YoutubeIcon,\n PackageIcon,\n} from \"./icons\"\nimport { ThemeToggle } from \"./components/ThemeToggle\"\nimport { useConfig, useThemeConfig } from \"../runtime/hooks\"\nimport type { NavItem } from \"../config/types\"\n\nconst LazySearch = lazy(() => import(\"./components/Search\").then((m) => ({ default: m.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 content rendered in the mobile menu (e.g. sidebar) */\n mobileMenuContent?: ReactNode\n /** Additional CSS classes */\n className?: string\n}\n\n/**\n * Header component with explicit slot props.\n *\n * Automatically pulls `title` from config and `logo`/`siteTitle` from themeConfig.\n * Props serve as overrides.\n *\n * @example Zero-config\n * ```tsx\n * <Header />\n * ```\n *\n * @example With overrides\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 * />\n * ```\n */\nexport function Header({\n logo,\n title,\n nav,\n actions,\n search = true,\n themeToggle = true,\n mobileMenuContent,\n className,\n}: HeaderProps) {\n const location = useLocation()\n const config = useConfig()\n const themeConfig = useThemeConfig()\n const [mobileMenuOpen, setMobileMenuOpen] = useState(false)\n\n const resolvedLogo = logo ?? themeConfig.logo\n const resolvedTitle =\n title ?? (themeConfig.siteTitle !== false ? (themeConfig.siteTitle ?? config.title) : undefined)\n\n // Auto-render nav from themeConfig.nav when no nav prop given\n const resolvedNav =\n nav ?? (themeConfig.nav?.length ? <AutoNav items={themeConfig.nav} /> : undefined)\n\n // Auto-render social links from themeConfig.socialLinks when no actions prop given\n const resolvedActions =\n actions ??\n (themeConfig.socialLinks?.length\n ? themeConfig.socialLinks.map((link, i) => (\n <SocialLink key={i} href={link.link} icon={link.icon} ariaLabel={link.ariaLabel} />\n ))\n : undefined)\n const hasMobileMenu = Boolean(mobileMenuContent)\n\n useEffect(() => {\n setMobileMenuOpen(false)\n }, [location.pathname])\n\n const handleMobileMenuClick = (event: MouseEvent<HTMLElement>) => {\n const target = event.target as HTMLElement\n if (target.closest(\"a\")) {\n setMobileMenuOpen(false)\n }\n }\n\n return (\n <header className={className ?? styles.header}>\n <div className={styles.headerContainer}>\n {/* Left: Mobile menu button + Logo/Title */}\n <div className={styles.headerLeft}>\n {hasMobileMenu && (\n <button\n type=\"button\"\n className={styles.mobileMenuButton}\n onClick={() => setMobileMenuOpen(!mobileMenuOpen)}\n aria-label=\"Toggle menu\"\n aria-expanded={mobileMenuOpen}\n >\n <span className={styles.hamburger}>\n <span></span>\n <span></span>\n <span></span>\n </span>\n </button>\n )}\n\n <Link to=\"/\" className={styles.logoLink}>\n {resolvedLogo && (\n <img\n src={typeof resolvedLogo === \"string\" ? resolvedLogo : resolvedLogo.light}\n alt={resolvedTitle ?? \"Logo\"}\n className={styles.logo}\n />\n )}\n {resolvedTitle && <span className={styles.siteTitle}>{resolvedTitle}</span>}\n </Link>\n </div>\n\n {/* Center: Navigation */}\n {resolvedNav && <div className={styles.desktopNav}>{resolvedNav}</div>}\n\n {/* Right: Search, Theme Toggle, Actions */}\n <div className={styles.headerRight}>\n {search && (\n <Suspense fallback={<span />}>\n <LazySearch />\n </Suspense>\n )}\n {themeToggle && <ThemeToggle />}\n {resolvedActions}\n </div>\n </div>\n\n {resolvedNav && (\n <div className=\"ardo-mobile-top-nav\">\n <div className=\"ardo-mobile-top-nav-inner\">{resolvedNav}</div>\n </div>\n )}\n\n {/* Mobile menu */}\n {mobileMenuOpen && hasMobileMenu && (\n <div className={styles.mobileMenu}>\n {mobileMenuContent && (\n <div\n className=\"ardo-mobile-menu-content ardo-mobile-menu-section\"\n onClick={handleMobileMenuClick}\n >\n {mobileMenuContent}\n </div>\n )}\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 ?? navStyles.socialLink}\n aria-label={ariaLabel ?? icon}\n >\n <SocialIcon icon={icon} />\n </a>\n )\n}\n\n// =============================================================================\n// Auto Nav Component (internal, renders from NavItem[])\n// =============================================================================\n\nfunction AutoNav({ items }: { items: NavItem[] }) {\n return (\n <nav className={navStyles.nav}>\n {items.map((item, i) => (\n <AutoNavItem key={i} item={item} />\n ))}\n </nav>\n )\n}\n\nfunction AutoNavItem({ item }: { item: NavItem }) {\n if (item.link?.startsWith(\"http\")) {\n return (\n <a href={item.link} className={navStyles.navLink} target=\"_blank\" rel=\"noopener noreferrer\">\n {item.text}\n </a>\n )\n }\n\n if (item.link) {\n return (\n <RouterNavLink\n to={item.link}\n className={({ isActive }: { isActive: boolean }) =>\n [navStyles.navLink, isActive && \"active\"].filter(Boolean).join(\" \")\n }\n >\n {item.text}\n </RouterNavLink>\n )\n }\n\n return <span className={navStyles.navLink}>{item.text}</span>\n}\n\n// =============================================================================\n// Social Icon Component (internal)\n// =============================================================================\n\nconst socialIcons = {\n github: GithubIcon,\n twitter: TwitterIcon,\n discord: MessageCircleIcon,\n linkedin: LinkedinIcon,\n youtube: YoutubeIcon,\n npm: PackageIcon,\n} as const\n\nfunction SocialIcon({ icon }: { icon: string }) {\n const IconComponent = socialIcons[icon as keyof typeof socialIcons] ?? GithubIcon\n return <IconComponent size={20} />\n}\n","import 'src/ui/Header.css.ts.vanilla.css?source=#H4sIAAAAAAAAA61VTXPbNhC961fspTPipFBJ2bJl5tJpLjkkObS9Z0BiSSKCABZYSnQ6-u8d8MukRKtWJhcRAhYPD_veYlcfkQu0X4v28_Wfb-nabkL4dwFQGidJGh1DJmsU7xcAZMoYQj9SmFE3tDIv-nGB7Z-Uq3R54HbJGLfCMMWfTUWsPeZjExTAO0B9WDqeIeMWOZPaITEyZRB4rJILIXXOmkNfi_SBCU93uTWVFjGYnUqLZQQhhPAbhKvtZggR1pQsk4rQxpCoyi6jdVkH4DhVlhMuo1UbzI6Y7CSxmzYlpmau4MIcYwghKmu4K-uOTjjQCe-DX7vl9dzyusH6zqQWWMcQheH7xWmxEtzuYHVFq8sUhKto0yBC9DhNxZuIRpurRKOg4TVh9MFo4lK_UIsaakK6UvHnGDKFtSfAlcw1k4R7F0OKmtD66W-VI5k9s9RoQk0xuJKnyBKkI6IemysKw19GBvHXuPMkQ1iHZX1J7BNm1HNa38Qp52UM6_s50D89lx717nZUb6MxqjK5-ST1roe8_wHI5vYAhDUxgamxvK1fbTT6hdQoY2MY1WUzw_yGxhtkue6L3pQ8lfQ8jn5ZZhl3FFzlHxfmgLa5RQcVexOe7-njN01kL_HdwzQ7ThL-LUlhH_7QhGdGE3PyO8ad9N3UsYN5DLvHiggt84Zq_MJ8XeB-fMDeJFLhZ9TVHxWR0f05j1MZ-kyO622YM1b4V2LIdmWdT3dpZC_T4NhtS7bdwiwXsnITYdop5vbBm1iOkj2mdqF0kv9lsqlwBd8nlc1fynY77zz_ZUJaTFt_pEZVez2Yb3NWJJeoruR6Cp0ok-48wlEKKl407F2w7rJ07UaDd89yGXW1MHI0V-qtbhbodmTKL_zQ83-6oR7nBOtx-NXe-jP65iutefCef3kgeuh-_jfBST5Ob8PSdwVnlBQz0U3YXKO5961kO9f0ttOm9_R0mcGREAlofrjVohOZHFmktBise_a-z5zYita5tG0_p8XvexSSw3LPazYs-WYRNNFvao6TJtbb_zQP_viwPce-_mrNVdpptPs1k8-8d6fF6T-ae4pTKwoAAA';\nexport var desktopNav = 'Header_desktopNav__qjc2r59';\nexport var hamburger = 'Header_hamburger__qjc2r58';\nexport var header = 'Header_header__qjc2r50';\nexport var headerContainer = 'Header_headerContainer__qjc2r51';\nexport var headerLeft = 'Header_headerLeft__qjc2r52';\nexport var headerRight = 'Header_headerRight__qjc2r53';\nexport var logo = 'Header_logo__qjc2r55';\nexport var logoLink = 'Header_logoLink__qjc2r54';\nexport var mobileMenu = 'Header_mobileMenu__qjc2r5a';\nexport var mobileMenuButton = 'Header_mobileMenuButton__qjc2r57';\nexport var mobileNav = 'Header_mobileNav__qjc2r5b';\nexport var siteTitle = 'Header_siteTitle__qjc2r56';","import 'src/ui/Nav.css.ts.vanilla.css?source=#H4sIAAAAAAAAA7VTTW8iMQy98yuiSkhwCBpQkVD4C9VeeukNmcQzkxLiUWKm0131v1eT-YBKQLsr7S1x7Ofn95zFL6h3HurdbrMu_QEz8WcihLGxcvCuRO6w2U6EAGcLLy3jMSqh0TOGNlxApcSmaraTj8miR3qy_jCgLRNaRdGyJa9EQAdsa2xrNTkKStQQZlJCMCRTRDI2_GSLkudtVnuTBjUF6CA8-VSek2cZ7W9UYvlYNWPoDdtaJdZZ1sYqMMb6IrEcE_cUDAYZwNhT_EKhC8l47JoH8AN1cO4y8fwkc4gt1xsKKAU5Y0hCaPKMnpV4eNh-0QX2kdyJsSPHTEclEn2HeZplOtLJKRxVd3TA-DKT62ya2L5Zw2VfV_YqrPqBQR-KQCdvrgi-D-DN_Iouy674UoXU44YOe4h4R4eS6lGG287Pv6dbPFN-R_AF6HbF7nYaRr4PcWldL64Gp2fLLJsKKVabqjljRNIW3CXM6q--0uspss3f5bgj56e-92PW-TF4O9x_9pG-3fnevn_b-ivT_wfDPwF8WfSjrQQAAA';\nexport var nav = 'Nav_nav__85hnke0';\nexport var navLink = 'Nav_navLink__85hnke1';\nexport var socialLink = 'Nav_socialLink__85hnke2';","import { useState, useEffect } from \"react\"\nimport { SunIcon, MoonIcon, MonitorIcon } from \"../icons\"\nimport * as styles from \"./ThemeToggle.css\"\n\ntype Theme = \"light\" | \"dark\" | \"system\"\n\nexport function ThemeToggle() {\n const [theme, setTheme] = useState<Theme>(\"system\")\n const [mounted, setMounted] = useState(false)\n\n useEffect(() => {\n setMounted(true)\n\n const stored = localStorage.getItem(\"ardo-theme\") as Theme | null\n if (stored) {\n setTheme(stored)\n applyTheme(stored)\n } else {\n applyTheme(\"system\")\n }\n }, [])\n\n const toggleTheme = () => {\n const nextTheme: Theme = theme === \"light\" ? \"dark\" : theme === \"dark\" ? \"system\" : \"light\"\n setTheme(nextTheme)\n localStorage.setItem(\"ardo-theme\", nextTheme)\n applyTheme(nextTheme)\n }\n\n if (!mounted) {\n return (\n <button className={styles.themeToggle} aria-label=\"Toggle theme\">\n <span className=\"ardo-theme-icon\">\n <SunIcon size={20} />\n </span>\n </button>\n )\n }\n\n return (\n <button\n className={styles.themeToggle}\n onClick={toggleTheme}\n aria-label={`Switch to ${theme === \"light\" ? \"dark\" : theme === \"dark\" ? \"system\" : \"light\"} theme`}\n >\n <span className=\"ardo-theme-icon\">\n {theme === \"light\" && <SunIcon size={20} />}\n {theme === \"dark\" && <MoonIcon size={20} />}\n {theme === \"system\" && <MonitorIcon size={20} />}\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","import 'src/ui/components/ThemeToggle.css.ts.vanilla.css?source=LlRoZW1lVG9nZ2xlX3RoZW1lVG9nZ2xlX18xOGc1aXl6MCB7CiAgZGlzcGxheTogZmxleDsKICBhbGlnbi1pdGVtczogY2VudGVyOwogIGp1c3RpZnktY29udGVudDogY2VudGVyOwogIHdpZHRoOiA0MHB4OwogIGhlaWdodDogNDBweDsKICBiYWNrZ3JvdW5kOiBub25lOwogIGJvcmRlcjogbm9uZTsKICBjdXJzb3I6IHBvaW50ZXI7CiAgY29sb3I6IHZhcigtLWFyZG8tY29sb3ItdGV4dExpZ2h0KTsKICBib3JkZXItcmFkaXVzOiB2YXIoLS1hcmRvLXJhZGl1cy1iYXNlKTsKICB0cmFuc2l0aW9uOiBhbGwgdmFyKC0tYXJkby10cmFuc2l0aW9uLWZhc3QpOwp9Ci5UaGVtZVRvZ2dsZV90aGVtZVRvZ2dsZV9fMThnNWl5ejA6aG92ZXIgewogIGJhY2tncm91bmQ6IHZhcigtLWFyZG8tY29sb3ItYmdTb2Z0KTsKICBjb2xvcjogdmFyKC0tYXJkby1jb2xvci10ZXh0KTsKfQ';\nexport var themeToggle = 'ThemeToggle_themeToggle__18g5iyz0';","import {\n useState,\n type ReactNode,\n type ComponentProps,\n Children,\n isValidElement,\n createContext,\n useContext,\n} from \"react\"\nimport { NavLink, useLocation } from \"react-router\"\nimport { ChevronDownIcon } from \"./icons\"\nimport type { SidebarItem as SidebarItemType } from \"../config/types\"\nimport { useSidebar } from \"../runtime/hooks\"\nimport * as styles from \"./Sidebar.css\"\n\n/** Route path type - uses React Router's NavLink 'to' prop type for type-safe routes */\ntype RoutePath = ComponentProps<typeof NavLink>[\"to\"]\n\n// =============================================================================\n// Sidebar Context\n// =============================================================================\n\ninterface SidebarContextValue {\n currentPath: string\n}\n\nconst SidebarContext = createContext<SidebarContextValue>({ currentPath: \"\" })\n\nfunction useSidebarContext() {\n return useContext(SidebarContext)\n}\n\n// =============================================================================\n// Sidebar Component Types\n// =============================================================================\n\nexport interface SidebarProps {\n /** Sidebar items (for data-driven approach) */\n items?: SidebarItemType[]\n /** Children for JSX composition (SidebarGroup, SidebarLink) */\n children?: ReactNode\n /** Additional CSS classes */\n className?: string\n}\n\n// =============================================================================\n// Sidebar Main Component\n// =============================================================================\n\n/**\n * Sidebar component supporting data-driven, JSX composition, and zero-config patterns.\n *\n * When neither `items` nor `children` are provided, automatically renders from\n * the Ardo sidebar context (`virtual:ardo/sidebar`).\n *\n * @example Zero-config (from context)\n * ```tsx\n * <Sidebar />\n * ```\n *\n * @example Data-driven (items prop)\n * ```tsx\n * <Sidebar items={[\n * { text: 'Introduction', link: '/intro' },\n * { text: 'Guide', items: [\n * { text: 'Getting Started', link: '/guide/getting-started' }\n * ]}\n * ]} />\n * ```\n *\n * @example JSX composition\n * ```tsx\n * <Sidebar>\n * <SidebarLink to=\"/intro\">Introduction</SidebarLink>\n * <SidebarGroup title=\"Guide\">\n * <SidebarLink to=\"/guide/getting-started\">Getting Started</SidebarLink>\n * </SidebarGroup>\n * </Sidebar>\n * ```\n */\nexport function Sidebar({ items, children, className }: SidebarProps) {\n const { pathname } = useLocation()\n const contextSidebar = useSidebar()\n const resolvedItems = items ?? (children ? undefined : contextSidebar)\n\n return (\n <SidebarContext.Provider value={{ currentPath: pathname }}>\n <aside className={className ?? styles.sidebar}>\n <nav aria-label=\"Main navigation\">\n {children ? (\n <ul className={`${styles.sidebarList} ${styles.sidebarList0}`}>{children}</ul>\n ) : resolvedItems?.length ? (\n <SidebarItems items={resolvedItems} depth={0} />\n ) : null}\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 = [styles.sidebarText, isChildActive && \"child-active\"]\n .filter(Boolean)\n .join(\" \")\n\n const hasChildren = Children.count(children) > 0\n\n return (\n <li className={className ?? styles.sidebarItem}>\n <div className={styles.sidebarItemHeader}>\n {to ? (\n <NavLink\n to={to}\n end\n className={({ isActive }) =>\n [textClassName, isActive && \"active\"].filter(Boolean).join(\" \")\n }\n >\n {title}\n </NavLink>\n ) : (\n <span\n className={textClassName}\n onClick={() => collapsible && hasChildren && setCollapsed(!collapsed)}\n style={collapsible && hasChildren ? { cursor: \"pointer\" } : undefined}\n >\n {title}\n </span>\n )}\n\n {collapsible && hasChildren && (\n <button\n className={[styles.sidebarCollapse, collapsed && \"collapsed\"].filter(Boolean).join(\" \")}\n onClick={() => setCollapsed(!collapsed)}\n aria-label={collapsed ? \"Expand\" : \"Collapse\"}\n >\n <ChevronDownIcon size={16} />\n </button>\n )}\n </div>\n\n {hasChildren && !collapsed && (\n <ul className={`${styles.sidebarList} ${styles.sidebarList1}`}>{children}</ul>\n )}\n </li>\n )\n}\n\n// =============================================================================\n// SidebarLink Component\n// =============================================================================\n\nexport interface SidebarLinkProps {\n /** Internal route path (type-safe with React Router's registered routes) */\n to: RoutePath\n /** Link text */\n children: ReactNode\n /** Additional CSS classes */\n className?: string\n}\n\n/**\n * Sidebar navigation link.\n *\n * @example\n * ```tsx\n * <SidebarLink to=\"/guide/getting-started\">Getting Started</SidebarLink>\n * ```\n */\nexport function SidebarLink({ to, children, className }: SidebarLinkProps) {\n const baseClassName = className ?? styles.sidebarLink\n return (\n <li className={styles.sidebarItem}>\n <NavLink\n to={to}\n className={({ isActive }) =>\n [baseClassName, isActive && \"active\"].filter(Boolean).join(\" \")\n }\n >\n {children}\n </NavLink>\n </li>\n )\n}\n\n// =============================================================================\n// Internal: Data-driven sidebar rendering\n// =============================================================================\n\ninterface SidebarItemsProps {\n items: SidebarItemType[]\n depth: number\n}\n\nfunction SidebarItems({ items, depth }: SidebarItemsProps) {\n return (\n <ul\n className={`${styles.sidebarList} ${depth === 0 ? styles.sidebarList0 : styles.sidebarList1}`}\n >\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 = [styles.sidebarLink, isChildActive && \"child-active\"]\n .filter(Boolean)\n .join(\" \")\n\n const textClassName = [styles.sidebarText, isChildActive && \"child-active\"]\n .filter(Boolean)\n .join(\" \")\n\n return (\n <li className={styles.sidebarItem}>\n <div className={styles.sidebarItemHeader}>\n {item.link ? (\n <NavLink\n to={item.link}\n className={({ isActive }) =>\n [linkClassName, isActive && \"active\"].filter(Boolean).join(\" \")\n }\n >\n {item.text}\n </NavLink>\n ) : (\n <span className={textClassName} onClick={() => hasChildren && setCollapsed(!collapsed)}>\n {item.text}\n </span>\n )}\n\n {hasChildren && (\n <button\n className={[styles.sidebarCollapse, collapsed && \"collapsed\"].filter(Boolean).join(\" \")}\n onClick={() => setCollapsed(!collapsed)}\n aria-label={collapsed ? \"Expand\" : \"Collapse\"}\n >\n <ChevronDownIcon size={16} />\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 'src/ui/Sidebar.css.ts.vanilla.css?source=#H4sIAAAAAAAAA71Wu27bMBTd_RVEgQLOQJeyY6dllqJdUiCdUqBjQIlXEmuKFEjKllvk3wtSj0iRazsdAg-yrnhf555DcvEgOMTMPNr2-RiR9c2BK4L-zBAqtRVOaEVRKmrgtzOEnC4p2jEzx5gZrrFkB105nAPjYO5AZLm78uskpI4i4v_uBXf5Mac26U__PTjlwZ-ihMlkHhGyyxE-lyw4loxzoTKKltdljZakrL1V78CkUu_xgSJWOe1tsa6xzRnXe4qiskYErcoa6a1M8jlB_vcBkQVZhbAxS7aZ0ZXio_ITLbXpqv-SXd3OnmYLzswWLU7jeVnyqAn4ItS9sK4PF4VwUliHrTtIoEhpBf9yi3q_VfArmMmEws2IomUDVmsM8900phbVFwtjbTiYzljWyGop-BSfZt19y4hpZd8cFHdhkn1561AeF7aU7EBRKiFkZFJkCgsHhaUoAeXAePOvyjqRHnCilQPlKLIlSwDH4PYA6jgYatsn24yTxVIn2xGXNmWNIjJEh6Kln5o3hB6PsMJB7e57Ffg3zCHRhjU6asaEUKqV5_9voCi6HuFqGBeVHUVuTNgWTUzDVCdLJuVw4fMnnDJ7HPYxBjT3IglInOrovBri7Hvl4IKMC5Y4sYOTKWPDFL8gp1_2UMVOwlUP6r7dQ9aETNi6OsHWPuWY9Td-ONOefkD9rMabV9E2YxOFjbl2llpgLiBXh8OmwWFIuFbIwT9QJtWmoKgqSzAJs9Ds386BwV5SoUCyIGso3pCnY4QpjSHVpqNNK_h37wbny7rpqjtD1kdVtSbvL6NVaEH77t3Bd78OIErwG7gRahvOtrNVX6yuc5Feo5pprK9aSlZa6ON9bI6jAQoddxq8nt-TylifrdSiI_CQtK_h6xsRZ9rsYAyX7WH_Ma5p1kXSmnjIPBCa0Y45mONPhENze_hcABcMzQtW45bOEfF3mavge-ZaMdh7urE9zZ7-AmuRysfcCQAA';\nexport var sidebar = 'Sidebar_sidebar__1057ydn0';\nexport var sidebarCollapse = 'Sidebar_sidebarCollapse__1057ydn8';\nexport var sidebarItem = 'Sidebar_sidebarItem__1057ydn4';\nexport var sidebarItemHeader = 'Sidebar_sidebarItemHeader__1057ydn5';\nexport var sidebarLink = 'Sidebar_sidebarLink__1057ydn6';\nexport var sidebarList = 'Sidebar_sidebarList__1057ydn1';\nexport var sidebarList0 = 'Sidebar_sidebarList0__1057ydn2';\nexport var sidebarList1 = 'Sidebar_sidebarList1__1057ydn3';\nexport var sidebarText = 'Sidebar_sidebarText__1057ydn7';","import { type ReactNode } from \"react\"\nimport type { ProjectMeta, SponsorConfig } from \"../config/types\"\nimport { useConfig, useThemeConfig } from \"../runtime/hooks\"\nimport * as styles from \"./Footer.css\"\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 all automatic rendering) */\n children?: ReactNode\n /** Additional CSS classes */\n className?: string\n /** Project metadata — renders linked \"name vX.Y.Z\" */\n project?: ProjectMeta\n /** Sponsor link — renders \"Sponsored by X\" */\n sponsor?: SponsorConfig\n /** Build timestamp (ISO string) — renders formatted date */\n buildTime?: string\n /** Git commit hash — rendered next to the build date */\n buildHash?: string\n /** Show \"Built with Ardo\" link (default: true) */\n ardoLink?: boolean\n}\n\nfunction formatBuildTime(iso: string): string {\n try {\n const date = new Date(iso)\n return date.toLocaleDateString(\"en-US\", {\n month: \"long\",\n day: \"numeric\",\n year: \"numeric\",\n })\n } catch {\n return iso\n }\n}\n\n/**\n * Footer component with structured layout for project info, sponsor, and build metadata.\n *\n * Automatically pulls data from Ardo context (`config.project`, `config.buildTime`,\n * `config.buildHash`, `themeConfig.footer.*`). Props serve as overrides.\n *\n * When `children` is provided, all automatic rendering is skipped.\n *\n * @example Automatic (zero-config)\n * ```tsx\n * <Footer />\n * ```\n *\n * @example With overrides\n * ```tsx\n * <Footer\n * sponsor={{ text: \"Sebastian Software\", link: \"https://sebastian-software.com/oss\" }}\n * message=\"Released under the MIT License.\"\n * copyright=\"Copyright 2026 Sebastian Software GmbH\"\n * />\n * ```\n *\n * @example Custom content\n * ```tsx\n * <Footer>\n * <CustomFooterContent />\n * </Footer>\n * ```\n */\nexport function Footer({\n message,\n copyright,\n children,\n className,\n project,\n sponsor,\n buildTime,\n buildHash,\n ardoLink = true,\n}: FooterProps) {\n const config = useConfig()\n const themeConfig = useThemeConfig()\n\n const resolvedProject = project ?? config.project\n const resolvedBuildTime = buildTime ?? config.buildTime\n const resolvedBuildHash = buildHash ?? config.buildHash\n const resolvedMessage = message ?? themeConfig.footer?.message\n const resolvedCopyright = copyright ?? themeConfig.footer?.copyright\n const resolvedSponsor = sponsor ?? themeConfig.footer?.sponsor\n\n const hasContent =\n resolvedMessage ||\n resolvedCopyright ||\n children ||\n resolvedProject ||\n resolvedSponsor ||\n resolvedBuildTime ||\n ardoLink\n\n if (!hasContent) {\n return null\n }\n\n return (\n <footer className={className ?? styles.footer}>\n <div className=\"ardo-footer-container\" /* container has no special styles */>\n {children ?? (\n <>\n {/* Primary line: project · ardo · sponsor */}\n {(resolvedProject || ardoLink || resolvedSponsor) && (\n <p className={styles.footerPrimary}>\n {resolvedProject?.name && (\n <>\n {resolvedProject.homepage ? (\n <a href={resolvedProject.homepage} className={styles.footerLink}>\n {resolvedProject.name}\n {resolvedProject.version ? ` v${resolvedProject.version}` : \"\"}\n </a>\n ) : (\n <span>\n {resolvedProject.name}\n {resolvedProject.version ? ` v${resolvedProject.version}` : \"\"}\n </span>\n )}\n </>\n )}\n {resolvedProject?.name && ardoLink && (\n <span className={styles.footerSeparator} aria-hidden=\"true\" />\n )}\n {ardoLink && (\n <a href=\"https://ardo-docs.dev\" className={styles.footerLink}>\n Built with Ardo\n </a>\n )}\n {(resolvedProject?.name || ardoLink) && resolvedSponsor && (\n <span className={styles.footerSeparator} aria-hidden=\"true\" />\n )}\n {resolvedSponsor && (\n <a href={resolvedSponsor.link} className={styles.footerLink}>\n Sponsored by {resolvedSponsor.text}\n </a>\n )}\n </p>\n )}\n {/* Secondary line: message / copyright */}\n {resolvedMessage && (\n <p\n className={styles.footerMessage}\n dangerouslySetInnerHTML={{ __html: resolvedMessage }}\n />\n )}\n {resolvedCopyright && (\n <p\n className={styles.footerCopyright}\n dangerouslySetInnerHTML={{ __html: resolvedCopyright }}\n />\n )}\n {/* Tertiary line: build timestamp */}\n {resolvedBuildTime && (\n <p className={styles.footerBuildTime}>\n Built on {formatBuildTime(resolvedBuildTime)}\n {resolvedBuildHash && <> ({resolvedBuildHash})</>}\n </p>\n )}\n </>\n )}\n </div>\n </footer>\n )\n}\n\n// Type exports for compound pattern (kept for backwards compatibility)\nexport interface FooterMessageProps {\n children: ReactNode\n className?: string\n}\n\nexport interface FooterCopyrightProps {\n children: ReactNode\n className?: string\n}\n","import { type ReactNode, type ComponentProps, useState, createContext, useContext } from \"react\"\nimport { NavLink as RouterNavLink } from \"react-router\"\nimport * as styles from \"./Nav.css\"\n\n/** Route path type - uses React Router's NavLink 'to' prop type for type-safe routes */\ntype RoutePath = ComponentProps<typeof RouterNavLink>[\"to\"]\n\n// Nav context for shared state\ninterface NavContextValue {\n mobileMenuOpen: boolean\n setMobileMenuOpen: (open: boolean) => void\n}\n\nconst NavContext = createContext<NavContextValue | null>(null)\n\nfunction useNavContext() {\n return useContext(NavContext)\n}\n\n// =============================================================================\n// Nav Component\n// =============================================================================\n\nexport interface NavProps {\n children?: ReactNode\n className?: string\n}\n\n/**\n * Navigation container component for composing navigation links.\n *\n * @example\n * ```tsx\n * <Nav>\n * <NavLink to=\"/guide\">Guide</NavLink>\n * <NavLink to=\"/api\">API</NavLink>\n * <NavLink href=\"https://github.com/...\">GitHub</NavLink>\n * </Nav>\n * ```\n */\nexport function Nav({ children, className }: NavProps) {\n return <nav className={className ?? styles.nav}>{children}</nav>\n}\n\n// =============================================================================\n// NavLink Component\n// =============================================================================\n\nexport interface NavLinkProps {\n /** Internal route path (type-safe with React Router's registered routes) */\n to?: RoutePath\n /** External URL (uses anchor tag) */\n href?: string\n /** Link text or children */\n children: ReactNode\n /** Additional CSS classes */\n className?: string\n /** Active state match pattern */\n activeMatch?: string\n}\n\n/**\n * Navigation link component supporting both internal routes and external URLs.\n *\n * @example\n * ```tsx\n * // Internal link\n * <NavLink to=\"/guide\">Guide</NavLink>\n *\n * // External link\n * <NavLink href=\"https://github.com/...\">GitHub</NavLink>\n * ```\n */\nexport function NavLink({\n to,\n href,\n children,\n className,\n activeMatch: _activeMatch,\n}: NavLinkProps) {\n const navContext = useNavContext()\n const baseClassName = className ?? styles.navLink\n\n // Handle click for mobile menu\n const handleClick = () => {\n navContext?.setMobileMenuOpen(false)\n }\n\n // External link\n if (href) {\n return (\n <a\n href={href}\n className={baseClassName}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n onClick={handleClick}\n >\n {children}\n </a>\n )\n }\n\n // Internal link\n if (to) {\n return (\n <RouterNavLink\n to={to}\n className={({ isActive }: { isActive: boolean }) =>\n [baseClassName, isActive && \"active\"].filter(Boolean).join(\" \")\n }\n onClick={handleClick}\n >\n {children}\n </RouterNavLink>\n )\n }\n\n // Text-only (no link)\n return <span className={baseClassName}>{children}</span>\n}\n\n// =============================================================================\n// 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\"\nimport * as styles from \"./TOC.css\"\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={styles.toc}>\n <div>\n <h3 className={styles.tocTitle}>{label}</h3>\n <nav aria-label=\"Table of contents\">\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={styles.tocList}>\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>\n <a\n href={`#${item.id}`}\n className={[\n styles.tocLink,\n item.level === 3 && styles.tocLink3,\n item.level === 4 && styles.tocLink4,\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 'src/ui/TOC.css.ts.vanilla.css?source=#H4sIAAAAAAAAA41UwW7iMBC98xU-wsEoCbRi3ctKvfRQaS-V9ohMPCEWjseyBwi74t9XtlNKdinbWzTznt-b53Hmbz-e14T1el2S3-G3omC_J4w5DJo0WsEa3YN6mjBG6AQ7SD_lXHqF3MgT7om3IBX4F9DblmYR5-OXYEX8PmpF7S0WYf0z9hKjhUyppamnZVEcWsb_p5SITiql7Vawaul6VhWuj1U8gG8MHvlJMLknfJqcJ_NhzDdNBi6zlmnWBi3xoH-BYGWZj0il42DrsUizEPTEyUsbGvSdYHvnwNcyQGwaIALPg5N1MlTMixV0sVOjQT-KIFV4PO41CoBPs3TSb7XlGyTCTrDyMTr5MP6qA118V8m30YF4oJMBwSxaGMPt7gJfJLjSwRl5EmxjsN6N4ntwfb6vocINNCRYucxpfHWElJCCGr3Mu5NdjRNe5DM36BX4QahyPQtotGIpXyc9WLoKJaP4u58EGtZTGnNt7KPFGxniQn6WiWjjnqRk7s03-8ss_wycMXcE57ImfYC7ihsvrfq65IAeKy4uksv8lEd3Wv2zV3a3vDAebjAWq8z43oHSkk072fPhXZfVqnD9LJHmt38kV3v3vg3nyfkPdv0voXYEAAA';\nexport var toc = 'TOC_toc__1trko900';\nexport var tocLink = 'TOC_tocLink__1trko903';\nexport var tocLink3 = 'TOC_tocLink3__1trko904';\nexport var tocLink4 = 'TOC_tocLink4__1trko905';\nexport var tocList = 'TOC_tocList__1trko902';\nexport var tocTitle = 'TOC_tocTitle__1trko901';","import { type ReactNode } from \"react\"\nimport { usePageData } from \"../runtime/hooks\"\nimport { Layout } from \"./Layout\"\nimport { Content } from \"./Content\"\nimport { TOC } from \"./TOC\"\nimport * as styles from \"./DocPage.css\"\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={styles.docPage}>\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={styles.docPage}>\n <Content>{children}</Content>\n {showToc && <TOC />}\n </div>\n )\n}\n\n// =============================================================================\n// DocLayout Component (legacy alias)\n// =============================================================================\n\ninterface DocLayoutProps {\n content: ReactNode\n}\n\n/**\n * @deprecated Use DocPage or DocContent instead\n */\nexport function DocLayout({ content }: DocLayoutProps) {\n return <DocPage>{content}</DocPage>\n}\n","import { Link } from \"react-router\"\nimport { usePageData, useConfig, useThemeConfig } from \"../runtime/hooks\"\nimport { Header, SocialLink } from \"./Header\"\nimport { Footer } from \"./Footer\"\nimport { Nav, NavLink } from \"./Nav\"\nimport * as layoutStyles from \"./Layout.css\"\nimport * as heroStyles from \"./components/Hero.css\"\nimport * as featureStyles from \"./components/Features.css\"\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={layoutStyles.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={layoutStyles.homeMain}>\n {hero && (\n <section className={heroStyles.hero}>\n <div className={heroStyles.heroContainer}>\n {hero.image && (\n <div>\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>\n {hero.name && <h1 className={heroStyles.heroName}>{hero.name}</h1>}\n {hero.text && <p className={heroStyles.heroText}>{hero.text}</p>}\n {hero.tagline && <p className={heroStyles.heroTagline}>{hero.tagline}</p>}\n\n {hero.actions && hero.actions.length > 0 && (\n <div className={heroStyles.heroActions}>\n {hero.actions.map((action, index) => (\n <Link\n key={index}\n to={action.link}\n className={`${heroStyles.heroAction} ${action.theme === \"alt\" ? heroStyles.heroActionAlt : heroStyles.heroActionBrand}`}\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={featureStyles.features}>\n <div className={featureStyles.featuresContainer}>\n {features.map((feature, index) => (\n <div key={index} className={featureStyles.feature}>\n {feature.icon && <div className={featureStyles.featureIcon}>{feature.icon}</div>}\n <h3 className={featureStyles.featureTitle}>{feature.title}</h3>\n <p className={featureStyles.featureDetails}>{feature.details}</p>\n {feature.link && (\n <Link to={feature.link} className={featureStyles.featureLink}>\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 'src/ui/theme/animations.css.ts.vanilla.css?source=QGtleWZyYW1lcyBhbmltYXRpb25zX2ZhZGVJblVwX18xZmo2OHI5MCB7CiAgZnJvbSB7CiAgICBvcGFjaXR5OiAwOwogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDIwcHgpOwogIH0KICB0byB7CiAgICBvcGFjaXR5OiAxOwogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDApOwogIH0KfQ';\nimport 'src/ui/components/Hero.css.ts.vanilla.css?source=#H4sIAAAAAAAAA71WTW_jNhC951cQCxiwgNClHFuWlUvTFmgLFL1sW2BPAS2OZMYUKVB0rN0i_70gJdr68jrYFr3YEkXOPD7Oe8PFL6DV897-PL9sYrINCfr7DqGSMsZlnqCQkLJGy1VZo5iU9eMdQgZqg6nguUxQCtKAtqOlqrjhSiZIg6CGv4IdVa-gM6FOCdpzxkA-3r3dLcY5k2QHmdLgcqdKGpAmQR8-9APTXaXE0bjARpUJIvZJQGbaR83zvX_eKWNU4V9oesi1OkqWIE0ZpwLn9h-kmYMQvKwARWSG1mSGqEEPZIbI7B6pg0j3c7JYxYgswjVaEoK-Q2RBosB9N5rKqqQapLHLg_urweNL8A2ZIRxOhQ83TfhwOQ6_ceEFl0D1JXwYEwb5PXqleo4x1UzhVAml8S5vQkx8-KgyE9hznQUNvdweIYZXkKZKkFQS3Ckxqg_o1ln9S2Kjtd1udCY2_E959dE9r_8frd0i_1FJQ7kE7RkMHXMFrfGJM7NPUExaZRVU51wmiCB6NOq6qr5gLhnUCQr7qZ4kL6gBn2jpElE32AjIP1bPGWXwq_yzfH4Os5co1luCyCKqENAKrHb2V5SKeJEP8YdxDz_20lu1wxkXBnSCmFYlrvaUqdOcIGspS2suV2WwDgZU_gW64kp6MA8OCONVKejnBHFpzxHvhEoPj10Ps5nCVYtFSYMr_gUSFD50hk7QeEdEnGG4U00mzllTyYKhpUxP-3jcGQHNZKWZZSAsa1QpwdnXNn1ZgG1BHqsEbbfbSYbDqBkWYKyGq5KmbsdkQZZQ9Mn7nRbnylg55jpcRKsJLmIyMs_pnf7cCsdBxyfYHbjBl2U4FbxMXN_oTnB9JONC4JbtjjD7eQcBhrvFZEEe7HaRUzLet_jDxUAff0BtPAXrIQWreIKCTUNBS7trOvE05dhzPgaxHqCguZ3hgURDIGGb4VoNWhp-s8GDIbTlylfJWZvrqK_Nplt6e2kH277pRwf4owH-p7SxkBb_pq_CTIDL93KsDM8-43M3v1wVclpeSreL_2wYAmp80naa_Z1K77PHkx7gQbhbCuYGimoEoGX5ctNxhhSPbWJ93SZcCTNIlW4dtumeI_12zrAZwjtaNdbgit5fcIToTr188tPHPPxg9efJ2I568lcMrC2v056bFnLdmrNtQN4zrxrVwzvgJHt7_3snqJ-oPgRjINGtNrGaBPIkzkqn7wCQB7cUd8XHx6HclJuYutQ0tXK75dya8Xb3fQGMUzTvGMAmiss6cImm2rkd74ggIi3dNt9bb824f_Ttc3LR2HF7i7zcBoumDLKvycivu-zZEZog9zfc743ibFWYKV20XUhQA5_meFnWwTBPqSEDXWEN7JgCw4XyFzT7Pso8dSXrXcq8Zbx9M-JLhLd_ACOwkWHQDQAA';\nexport var hero = 'Hero_hero__j780910';\nexport var heroAction = 'Hero_heroAction__j780918';\nexport var heroActionAlt = 'Hero_heroActionAlt__j78091a';\nexport var heroActionBrand = 'Hero_heroActionBrand__j780919';\nexport var heroActions = 'Hero_heroActions__j780917';\nexport var heroAnimate = 'Hero_heroAnimate__j780912';\nexport var heroContainer = 'Hero_heroContainer__j780911';\nexport var heroName = 'Hero_heroName__j780914';\nexport var heroTagline = 'Hero_heroTagline__j780916';\nexport var heroText = 'Hero_heroText__j780915';\nexport var heroVersion = 'Hero_heroVersion__j780913';","import 'src/ui/theme/animations.css.ts.vanilla.css?source=QGtleWZyYW1lcyBhbmltYXRpb25zX2ZhZGVJblVwX18xZmo2OHI5MCB7CiAgZnJvbSB7CiAgICBvcGFjaXR5OiAwOwogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDIwcHgpOwogIH0KICB0byB7CiAgICBvcGFjaXR5OiAxOwogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDApOwogIH0KfQ';\nimport 'src/ui/components/Features.css.ts.vanilla.css?source=#H4sIAAAAAAAAA7VWTY_bNhC9768gAhSwgaVLybKs1V4KtCgSIDltcihQwKDFkcSsRKoknVVa7H8PSMlayaZiL9CFDvqa4XszHM681Z9AzUGB3uXHh12w-Qfu9g1B_90g1FDGuChSlJCmRWHUtPc3CO1p9lgoeRAsRd-oWmBMFZM4k5VUeF88yNwsnZ1UDBQ2sklR0LRIy4ozj4czW97fPN-szgi9B8pADbQCR8tAazCteCFSlIEwoCxcTVXBBd5LY2SdoiixbH1rfuamgmHJ0C2ZS2Gw5v9CitZxF6b79AS8KE2KtoTYbxUYAwrrhmYuL5isSAi1Bz4I5-AfDnszYbA-ZRAkHQOXH0-ObfwfLa9lB9ziJ85MmaJNTDrPjkyKCKIHI_08fpfCUC5G2Y0cEcZ1U9HvKSoUZ3Yxe8cG6qaiBiyFQy10ihQ0QM3CAuCcm1tUc1HTdhFaErcoyNXS8Stok6JwIDaQDQJyPduB42ZamGFyVU2O61FRxg96YtZ9wtXY7rqatdYt1iVl8smD3P14qJ2lUVRobrgUKaJVNbZ--YX3VIMzp4LXtLc-PupdThl8EF-a3S7Iv8aJuiOIrDYaAdWA9tKUF9KXlvIbKJfEPh99lcnHKisXZBUliKyCDQq2BP2KyCq6NspPbHmLiLts5ubWC2ZOuq8cfxaHMCXOSl6xRbB04QxJwgxc_ZJa_99Q4QxU8gZY6xmsIH4DsGgGLIzeAGwzA7YO3wAsngGLyBzYh0yKYal42hPzCly_cdMHcwO1Hs-grwdteP4dZ1IYEGb8q-96Ud-wyn6wHN9Px0d8TV9TVDA7TiqYaVyzhzD0dcQN-eVnY8fBvb6TXdOOrtmDy6lYjtg_ldzA_VmXc_QaqkAYL7OpNtieTeatRxvEnTY43cF-uPkkQ2Algwf9DzCUVy8qLDnDj16jDCouAB8LLVjFr5EpH7l4HHjczfGY5GHT5eGK8rH6jUEmVT_fhBRur4ZjxoXjfuG0OWXRMxmXZEGbmZLMqTb-kpzGO5qSDmROS554pTQ3vdvQAd79HQZ34Tvr_lsNjFO0GImgbZw0bdehzpveiRofyR7bNYYe8ex19qncyR4epZPffUalTqtgIPASm0tcitxtJi6vGOl3MJeq7k-pVZt_LfC6aZenII2CHJTGCtghA4Zr2W18934RtgccCaxjAXpzcZnvi_vzD2POg09UDQAA';\nexport var feature = 'Features_feature__15qe9bp5';\nexport var featureDetails = 'Features_featureDetails__15qe9bp8';\nexport var featureIcon = 'Features_featureIcon__15qe9bp6';\nexport var featureLink = 'Features_featureLink__15qe9bp9';\nexport var featureTitle = 'Features_featureTitle__15qe9bp7';\nexport var features = 'Features_features__15qe9bp0';\nexport var featuresContainer = 'Features_featuresContainer__15qe9bp4';\nexport var featuresHeader = 'Features_featuresHeader__15qe9bp1';\nexport var featuresSubtitle = 'Features_featuresSubtitle__15qe9bp3';\nexport var featuresTitle = 'Features_featuresTitle__15qe9bp2';","import { type ComponentProps, type ReactNode } from \"react\"\nimport { Link } from \"react-router\"\nimport * as styles from \"./Hero.css\"\n\n/** Internal route path from React Router */\ntype RoutePath = ComponentProps<typeof Link>[\"to\"]\n\n/** External URL starting with http:// or https:// */\ntype ExternalUrl = `http://${string}` | `https://${string}`\n\nexport interface HeroAction {\n /** Button text */\n text: string\n /** Link destination - internal route path or external URL */\n link: RoutePath | ExternalUrl\n /** Visual theme: \"brand\" for primary, \"alt\" for secondary */\n theme?: \"brand\" | \"alt\"\n /** Optional icon as ReactNode (e.g. Lucide icon component) */\n icon?: ReactNode\n}\n\nexport interface HeroImage {\n /** Image for light mode */\n light: string\n /** Image for dark mode */\n dark?: string\n /** Alt text for the image */\n alt?: string\n}\n\nexport interface HeroProps {\n /** Large title displayed prominently */\n name?: string\n /** Secondary text below the name */\n text?: string\n /** Descriptive tagline */\n tagline?: string\n /** Hero image - can be a string URL or an object with light/dark variants */\n image?: string | HeroImage\n /** Call-to-action buttons */\n actions?: HeroAction[]\n /** Additional CSS class */\n className?: string\n /** Version string displayed as a pill badge above the name */\n version?: string\n}\n\n/**\n * Hero section component for landing pages.\n *\n * @example\n * ```tsx\n * import { ArrowRight, Github } from \"lucide-react\"\n *\n * <Hero\n * name=\"Ardo\"\n * text=\"React-first Documentation\"\n * tagline=\"Build beautiful documentation sites with React.\"\n * image=\"/logo.svg\"\n * actions={[\n * { text: \"Get Started\", link: \"/guide/getting-started\", theme: \"brand\", icon: <ArrowRight size={16} /> },\n * { text: \"GitHub\", link: \"https://github.com/...\", theme: \"alt\", icon: <Github size={16} /> }\n * ]}\n * />\n * ```\n */\nexport function Hero({ name, text, tagline, image, actions, className, version }: HeroProps) {\n const imageUrl = typeof image === \"string\" ? image : image?.light\n const imageAlt = typeof image === \"string\" ? name : (image?.alt ?? name)\n\n return (\n <section className={className ?? styles.hero}>\n <div className={`${styles.heroContainer} ${styles.heroAnimate}`}>\n {image && (\n <div>\n <img src={imageUrl} alt={imageAlt} />\n </div>\n )}\n\n <div>\n {version && <span className={styles.heroVersion}>v{version}</span>}\n {name && <h1 className={styles.heroName}>{name}</h1>}\n {text && <p className={styles.heroText}>{text}</p>}\n {tagline && <p className={styles.heroTagline}>{tagline}</p>}\n\n {actions && actions.length > 0 && (\n <div className={styles.heroActions}>\n {actions.map((action, index) => {\n const link = action.link\n const isExternal =\n typeof link === \"string\" &&\n (link.startsWith(\"http://\") || link.startsWith(\"https://\"))\n const actionClass = `${styles.heroAction} ${action.theme === \"alt\" ? styles.heroActionAlt : styles.heroActionBrand}`\n\n const content = (\n <>\n {action.icon}\n {action.text}\n </>\n )\n\n if (isExternal) {\n return (\n <a\n key={index}\n href={link}\n className={actionClass}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n {content}\n </a>\n )\n }\n\n return (\n <Link key={index} to={link} className={actionClass}>\n {content}\n </Link>\n )\n })}\n </div>\n )}\n </div>\n </div>\n </section>\n )\n}\n","import { Link } from \"react-router\"\nimport type { CSSProperties, ReactNode } from \"react\"\nimport * as styles from \"./Features.css\"\n\nexport interface FeatureItem {\n /** Feature title */\n title: string\n /** Icon as ReactNode (emoji, Lucide icon component, or any JSX) */\n icon?: ReactNode\n /** Feature description */\n details: string\n /** Optional link */\n link?: string\n /** Link text (defaults to \"Learn more\") */\n linkText?: string\n}\n\nexport interface FeaturesProps {\n /** Array of feature items to display */\n items: FeatureItem[]\n /** Section title */\n title?: string\n /** Section subtitle */\n subtitle?: string\n /** Additional CSS class */\n className?: string\n}\n\nexport interface FeatureCardProps extends FeatureItem {\n /** Additional CSS class */\n className?: string\n}\n\n/**\n * Individual feature card component.\n *\n * @example\n * ```tsx\n * import { Zap } from \"lucide-react\"\n *\n * // Using emoji\n * <FeatureCard title=\"Fast\" icon=\"⚡\" details=\"Lightning fast.\" />\n *\n * // Using Lucide icon (tree-shakeable)\n * <FeatureCard title=\"Fast\" icon={<Zap size={28} />} details=\"Lightning fast.\" />\n * ```\n */\nexport function FeatureCard({\n title,\n icon,\n details,\n link,\n linkText,\n className,\n style,\n}: FeatureCardProps & { style?: CSSProperties }) {\n return (\n <div className={className ?? styles.feature} style={style}>\n {icon && <div className={styles.featureIcon}>{icon}</div>}\n <h3 className={styles.featureTitle}>{title}</h3>\n <p className={styles.featureDetails}>{details}</p>\n {link && (\n <Link to={link} className={styles.featureLink}>\n {linkText || \"Learn more\"}\n </Link>\n )}\n </div>\n )\n}\n\n/**\n * Features grid component for displaying multiple feature cards.\n *\n * @example\n * ```tsx\n * <Features\n * title=\"Key Features\"\n * subtitle=\"Everything you need to build great docs\"\n * items={[\n * { title: \"React-First\", icon: \"⚛️\", details: \"Built on React.\" },\n * { title: \"Fast\", icon: \"⚡\", details: \"Powered by Vite.\" },\n * { title: \"Type-Safe\", icon: \"📝\", details: \"Full TypeScript support.\" },\n * ]}\n * />\n * ```\n */\nexport function Features({ items, title, subtitle, className }: FeaturesProps) {\n if (!items || items.length === 0) {\n return null\n }\n\n return (\n <section className={className ?? styles.features}>\n {(title || subtitle) && (\n <div className={styles.featuresHeader}>\n {title && <h2 className={styles.featuresTitle}>{title}</h2>}\n {subtitle && <p className={styles.featuresSubtitle}>{subtitle}</p>}\n </div>\n )}\n <div className={styles.featuresContainer}>\n {items.map((feature, index) => (\n <FeatureCard key={index} {...feature} style={{ animationDelay: `${index * 80}ms` }} />\n ))}\n </div>\n </section>\n )\n}\n"],"mappings":"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","names":["header","sidebar","footer","isValidElement","useLocation","useEffect","useState","jsx","jsxs","jsx","jsxs","logo","nav","themeToggle","useState","useEffect","useState","useContext","useLocation","jsx","jsxs","useContext","useLocation","useState","jsx","jsxs","jsx","sidebar","header","footer","useLocation","isValidElement","useState","createContext","useContext","RouterNavLink","jsx","createContext","useContext","NavLink","RouterNavLink","useState","useEffect","jsx","jsxs","toc","useState","useEffect","jsx","jsxs","Link","jsx","jsxs","hero","features","NavLink","Link","feature","Link","Fragment","jsx","jsxs","Link","Link","jsx","jsxs","Link","feature"]}
|
package/dist/chunk-FZP2AVJL.js
DELETED
|
@@ -1,43 +0,0 @@
|
|
|
1
|
-
// src/runtime/sidebar-utils.ts
|
|
2
|
-
function findCurrentSidebarItem(sidebar, currentPath) {
|
|
3
|
-
for (const item of sidebar) {
|
|
4
|
-
if (item.link === currentPath) {
|
|
5
|
-
return item;
|
|
6
|
-
}
|
|
7
|
-
if (item.items) {
|
|
8
|
-
const found = findCurrentSidebarItem(item.items, currentPath);
|
|
9
|
-
if (found) {
|
|
10
|
-
return found;
|
|
11
|
-
}
|
|
12
|
-
}
|
|
13
|
-
}
|
|
14
|
-
return void 0;
|
|
15
|
-
}
|
|
16
|
-
function getPrevNextLinks(sidebar, currentPath) {
|
|
17
|
-
const flatItems = flattenSidebar(sidebar);
|
|
18
|
-
const currentIndex = flatItems.findIndex((item) => item.link === currentPath);
|
|
19
|
-
if (currentIndex === -1) {
|
|
20
|
-
return {};
|
|
21
|
-
}
|
|
22
|
-
const prev = currentIndex > 0 ? flatItems[currentIndex - 1] : void 0;
|
|
23
|
-
const next = currentIndex < flatItems.length - 1 ? flatItems[currentIndex + 1] : void 0;
|
|
24
|
-
return { prev, next };
|
|
25
|
-
}
|
|
26
|
-
function flattenSidebar(sidebar) {
|
|
27
|
-
const result = [];
|
|
28
|
-
for (const item of sidebar) {
|
|
29
|
-
if (item.link) {
|
|
30
|
-
result.push(item);
|
|
31
|
-
}
|
|
32
|
-
if (item.items) {
|
|
33
|
-
result.push(...flattenSidebar(item.items));
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
return result;
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
export {
|
|
40
|
-
findCurrentSidebarItem,
|
|
41
|
-
getPrevNextLinks
|
|
42
|
-
};
|
|
43
|
-
//# sourceMappingURL=chunk-FZP2AVJL.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/runtime/sidebar-utils.ts"],"sourcesContent":["import type { SidebarItem } from \"../config/types\"\n\n/**\n * Find the current sidebar item based on the current path.\n * This is client-safe and does not use any Node.js modules.\n */\nexport function findCurrentSidebarItem(\n sidebar: SidebarItem[],\n currentPath: string\n): SidebarItem | undefined {\n for (const item of sidebar) {\n if (item.link === currentPath) {\n return item\n }\n\n if (item.items) {\n const found = findCurrentSidebarItem(item.items, currentPath)\n if (found) {\n return found\n }\n }\n }\n\n return undefined\n}\n\n/**\n * Get the previous and next sidebar items for navigation.\n * This is client-safe and does not use any Node.js modules.\n */\nexport function getPrevNextLinks(\n sidebar: SidebarItem[],\n currentPath: string\n): { prev?: SidebarItem; next?: SidebarItem } {\n const flatItems = flattenSidebar(sidebar)\n const currentIndex = flatItems.findIndex((item) => item.link === currentPath)\n\n if (currentIndex === -1) {\n return {}\n }\n\n const prev = currentIndex > 0 ? flatItems[currentIndex - 1] : undefined\n const next = currentIndex < flatItems.length - 1 ? flatItems[currentIndex + 1] : undefined\n\n return { prev, next }\n}\n\nfunction flattenSidebar(sidebar: SidebarItem[]): SidebarItem[] {\n const result: SidebarItem[] = []\n\n for (const item of sidebar) {\n if (item.link) {\n result.push(item)\n }\n\n if (item.items) {\n result.push(...flattenSidebar(item.items))\n }\n }\n\n return result\n}\n"],"mappings":";AAMO,SAAS,uBACd,SACA,aACyB;AACzB,aAAW,QAAQ,SAAS;AAC1B,QAAI,KAAK,SAAS,aAAa;AAC7B,aAAO;AAAA,IACT;AAEA,QAAI,KAAK,OAAO;AACd,YAAM,QAAQ,uBAAuB,KAAK,OAAO,WAAW;AAC5D,UAAI,OAAO;AACT,eAAO;AAAA,MACT;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAMO,SAAS,iBACd,SACA,aAC4C;AAC5C,QAAM,YAAY,eAAe,OAAO;AACxC,QAAM,eAAe,UAAU,UAAU,CAAC,SAAS,KAAK,SAAS,WAAW;AAE5E,MAAI,iBAAiB,IAAI;AACvB,WAAO,CAAC;AAAA,EACV;AAEA,QAAM,OAAO,eAAe,IAAI,UAAU,eAAe,CAAC,IAAI;AAC9D,QAAM,OAAO,eAAe,UAAU,SAAS,IAAI,UAAU,eAAe,CAAC,IAAI;AAEjF,SAAO,EAAE,MAAM,KAAK;AACtB;AAEA,SAAS,eAAe,SAAuC;AAC7D,QAAM,SAAwB,CAAC;AAE/B,aAAW,QAAQ,SAAS;AAC1B,QAAI,KAAK,MAAM;AACb,aAAO,KAAK,IAAI;AAAA,IAClB;AAEA,QAAI,KAAK,OAAO;AACd,aAAO,KAAK,GAAG,eAAe,KAAK,KAAK,CAAC;AAAA,IAC3C;AAAA,EACF;AAEA,SAAO;AACT;","names":[]}
|