ardo 3.1.0 → 3.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +9 -19
- package/dist/DocPage-BVibJR9O.js +997 -0
- package/dist/DocPage-BVibJR9O.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-435FKDcl.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/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-QS0y3-CM.d.ts +105 -0
- package/dist/contract.css-QS0y3-CM.d.ts.map +1 -0
- package/dist/generator-DcUomVnD.js +1193 -0
- package/dist/generator-DcUomVnD.js.map +1 -0
- package/dist/icons/index.d.ts +1 -1
- package/dist/icons/index.js +1 -2
- package/dist/index-DNKCjxv5.d.ts +78 -0
- package/dist/index-DNKCjxv5.d.ts.map +1 -0
- package/dist/index-DSeJoaxz.d.ts +938 -0
- package/dist/index-DSeJoaxz.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 +328 -0
- package/dist/typedoc/components/index.js.map +1 -0
- package/dist/typedoc/index.d.ts +34 -303
- 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-DAZHcySL.d.ts +182 -0
- package/dist/types-DAZHcySL.d.ts.map +1 -0
- package/dist/types-DVodb4lK.d.ts +198 -0
- package/dist/types-DVodb4lK.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-NhRDIFUN.js +1301 -0
- package/dist/ui-NhRDIFUN.js.map +1 -0
- package/dist/vite/index.d.ts +72 -78
- package/dist/vite/index.d.ts.map +1 -0
- package/dist/vite/index.js +2918 -1282
- package/dist/vite/index.js.map +1 -1
- package/package.json +25 -17
- 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
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ui-NhRDIFUN.js","names":["styles.searchPopover","styles.searchResults","styles.searchResult","styles.searchResultTitle","styles.searchNoResults","styles.searchFooter","styles.searchField","styles.searchInput","styles.searchKbd","styles.searchPopover","styles.search","styles.footerLink","styles.footerPrimary","styles.footerContainer","styles.themeToggle","styles.themeIcon","logo","styles.headerContainer","styles.headerLeft","styles.logoLink","styles.headerRight","styles.mobileBackdrop","styles.mobilePanel","styles.mobilePanelHeader","styles.mobilePanelClose","styles.mobilePanelSidebar","styles.sidebarNav","styles.sidebarList","styles.sidebarList0","styles.sidebarText","styles.sidebarTextButton","styles.sidebarItemHeader","styles.sidebarItem","styles.sidebarList1","styles.sidebarLink","layoutStyles.layout","layoutStyles.home","styles.featureTitle","styles.featureDetails","styles.featuresContainer","styles.heroAction","styles.heroActionAlt","styles.heroActionBrand","styles.heroContainer","styles.heroAnimate","hero","heroActions","heroName","heroStyles.hero","heroStyles.heroContainer","layoutStyles.home","layoutStyles.homeMain","RouterNavLink"],"sources":["../src/ui/components/Search.css.ts","../src/ui/components/SearchPopover.tsx","../src/ui/components/Search.tsx","../src/ui/Footer.tsx","../src/ui/components/ThemeToggle.css.ts","../src/ui/components/ThemeToggle.tsx","../src/ui/Header.css.ts","../src/ui/Nav.css.ts","../src/ui/Header.tsx","../src/ui/Sidebar.css.ts","../src/ui/Sidebar.tsx","../src/ui/ArdoRoot.tsx","../src/ui/components/Features.css.ts","../src/ui/components/Features.tsx","../src/ui/components/Hero.css.ts","../src/ui/components/Hero.tsx","../src/ui/HomePage.tsx","../src/ui/Nav.tsx"],"sourcesContent":["import { globalStyle, style } from \"@vanilla-extract/css\"\n\nimport { vars } from \"../theme/contract.css\"\n\nexport const search = style({\n position: \"relative\",\n width: \"100%\",\n maxWidth: \"100%\",\n})\n\nexport const searchField = style({\n display: \"flex\",\n alignItems: \"center\",\n gap: vars.space.sm,\n minHeight: \"2.5rem\",\n padding: `${vars.space.sm} 0.75rem`,\n background: vars.color.bgSoft,\n border: `1px solid ${vars.color.border}`,\n borderRadius: vars.radius.base,\n color: vars.color.textLighter,\n cursor: \"text\",\n transition: `border-color ${vars.transition.fast}, box-shadow ${vars.transition.fast}, color ${vars.transition.fast}`,\n outline: \"none\",\n})\n\nglobalStyle(`${search}:focus-within ${searchField}`, {\n borderColor: vars.color.brand,\n color: vars.color.textLight,\n})\n\nglobalStyle(`${searchField}:focus-within`, {\n outline: \"none\",\n})\n\nexport const searchInput = style({\n flex: 1,\n minWidth: 0,\n border: \"none\",\n outline: \"none\",\n fontSize: vars.fontSize.sm,\n background: \"none\",\n color: vars.color.text,\n \"::placeholder\": {\n color: vars.color.textLighter,\n },\n selectors: {\n \"&:focus-visible\": {\n outline: \"none\",\n },\n },\n})\n\nexport const searchPopover = style({\n position: \"fixed\",\n width: \"min(28rem, calc(100vw - 2rem))\",\n background: vars.color.bg,\n borderRadius: vars.radius.lg,\n border: `1px solid ${vars.color.border}`,\n boxShadow: vars.color.shadowLg,\n overflow: \"hidden\",\n zIndex: 210,\n})\n\nexport const searchResults = style({\n listStyle: \"none\",\n maxHeight: \"25rem\",\n overflowY: \"auto\",\n})\n\nexport const searchResult = style({\n display: \"block\",\n padding: `0.75rem ${vars.space.md}`,\n textDecoration: \"none\",\n color: vars.color.text,\n borderBottom: `1px solid ${vars.color.borderLight}`,\n transition: `background ${vars.transition.fast}`,\n selectors: {\n \"&:last-child\": {\n borderBottom: \"none\",\n },\n \"&:hover, &.selected\": {\n background: vars.color.brandSubtle,\n },\n },\n})\n\nexport const searchResultTitle = style({\n display: \"block\",\n fontWeight: 500,\n marginBottom: \"2px\",\n})\n\nexport const searchResultSection = style({\n display: \"block\",\n fontSize: vars.fontSize.xs,\n color: vars.color.textLighter,\n})\n\nexport const searchNoResults = style({\n padding: `${vars.space.xl} ${vars.space.md}`,\n textAlign: \"center\",\n color: vars.color.textLighter,\n})\n\nexport const searchFooter = style({\n display: \"flex\",\n justifyContent: \"center\",\n gap: vars.space.lg,\n padding: `0.75rem ${vars.space.md}`,\n background: vars.color.bgSoft,\n borderTop: `1px solid ${vars.color.border}`,\n fontSize: vars.fontSize.xs,\n color: vars.color.textLighter,\n})\n\nglobalStyle(`${searchFooter} kbd`, {\n padding: \"2px 6px\",\n background: vars.color.bg,\n border: `1px solid ${vars.color.border}`,\n borderRadius: vars.radius.sm,\n marginRight: \"4px\",\n})\n\nexport const searchClear = style({\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n width: \"1.5rem\",\n height: \"1.5rem\",\n flexShrink: 0,\n background: \"none\",\n border: \"none\",\n cursor: \"pointer\",\n fontSize: vars.fontSize.lg,\n color: vars.color.textLighter,\n padding: vars.space.xs,\n borderRadius: vars.radius.sm,\n transition: `all ${vars.transition.fast}`,\n selectors: {\n \"&:hover\": {\n background: vars.color.bgSoft,\n color: vars.color.text,\n },\n },\n})\n\nexport const searchKbd = style({\n display: \"flex\",\n gap: \"3px\",\n marginLeft: vars.space.xs,\n})\n\nglobalStyle(`${searchKbd} kbd`, {\n padding: \"2px 6px\",\n background: vars.color.bg,\n border: `1px solid ${vars.color.border}`,\n borderRadius: vars.radius.sm,\n fontSize: vars.fontSize.xs,\n fontFamily: vars.font.family,\n})\n","import { useLayoutEffect, useState } from \"react\"\nimport { createPortal } from \"react-dom\"\n\nimport * as styles from \"./Search.css\"\n\n/**\n * Renders the search popover as a portal attached to document.body.\n * Uses getBoundingClientRect to position it below the anchor element.\n */\nexport function SearchPopover({\n anchorRef,\n children,\n}: {\n anchorRef: React.RefObject<HTMLElement | null>\n children: React.ReactNode\n}) {\n const [pos, setPos] = useState({ top: 0, left: 0, width: 0 })\n\n useLayoutEffect(() => {\n const el = anchorRef.current\n if (!el) return\n const rect = el.getBoundingClientRect()\n setPos({\n top: rect.bottom + 8,\n left: rect.left,\n width: Math.max(rect.width, 400),\n })\n }, [anchorRef])\n\n if (typeof document === \"undefined\") return null\n\n return createPortal(\n <div\n className={styles.searchPopover}\n style={{\n top: pos.top,\n left: pos.left,\n width: Math.min(pos.width, globalThis.innerWidth - 32),\n }}\n >\n {children}\n </div>,\n document.body\n )\n}\n","import MiniSearch from \"minisearch\"\nimport { useEffect, useMemo, useRef, useState } from \"react\"\nimport { Link, useNavigate } from \"react-router\"\nimport searchDocs from \"virtual:ardo/search-index\"\n\nimport { SearchIcon } from \"../icons\"\nimport * as styles from \"./Search.css\"\nimport { SearchPopover } from \"./SearchPopover\"\n\ninterface SearchDoc {\n id: string\n title: string\n content: string\n path: string\n section?: string\n}\n\ninterface SearchMatch {\n id: string\n title: string\n path: string\n section?: string\n}\n\nexport interface ArdoSearchProps {\n /** Placeholder text for the search input (default: \"Search...\") */\n placeholder?: string\n}\n\nfunction useGlobalSearchShortcut(\n inputRef: React.RefObject<HTMLInputElement | null>,\n setIsOpen: (open: boolean) => void\n) {\n useEffect(() => {\n const handleGlobalKeyDown = (e: KeyboardEvent) => {\n if ((e.metaKey || e.ctrlKey) && e.key === \"k\") {\n e.preventDefault()\n inputRef.current?.focus()\n setIsOpen(true)\n }\n if (e.key === \"Escape\") {\n setIsOpen(false)\n }\n }\n document.addEventListener(\"keydown\", handleGlobalKeyDown)\n return () => {\n document.removeEventListener(\"keydown\", handleGlobalKeyDown)\n }\n }, [inputRef, setIsOpen])\n}\n\ninterface OutsideClickOptions {\n containerRef: React.RefObject<HTMLDivElement | null>\n popoverClass: string\n isOpen: boolean\n setIsOpen: (open: boolean) => void\n}\n\nfunction useOutsideClick({ containerRef, popoverClass, isOpen, setIsOpen }: OutsideClickOptions) {\n useEffect(() => {\n if (!isOpen) return\n const handleOutsideClick = (e: MouseEvent | TouchEvent) => {\n const target = e.target as Element\n const inContainer = containerRef.current?.contains(target) === true\n const inPopover = target.closest(`.${popoverClass}`) != null\n if (!inContainer && !inPopover) {\n setIsOpen(false)\n }\n }\n document.addEventListener(\"mousedown\", handleOutsideClick)\n document.addEventListener(\"touchstart\", handleOutsideClick)\n return () => {\n document.removeEventListener(\"mousedown\", handleOutsideClick)\n document.removeEventListener(\"touchstart\", handleOutsideClick)\n }\n }, [containerRef, popoverClass, isOpen, setIsOpen])\n}\n\nfunction useSearchIndex() {\n return useMemo(() => {\n const index = new MiniSearch<SearchDoc>({\n fields: [\"title\", \"content\", \"section\"],\n storeFields: [\"title\", \"path\", \"section\"],\n searchOptions: { boost: { title: 2 }, fuzzy: 0.2, prefix: true },\n })\n index.addAll(searchDocs as SearchDoc[])\n return index\n }, [])\n}\n\nfunction normalizeResults(rawResults: Array<Record<string, unknown>>): SearchMatch[] {\n return rawResults.flatMap((result): SearchMatch[] => {\n const resultPath = typeof result.path === \"string\" ? result.path : undefined\n const title = typeof result.title === \"string\" ? result.title : undefined\n if (resultPath === undefined || title === undefined) return []\n return [\n {\n id: String(result.id),\n title,\n path: resultPath,\n section: typeof result.section === \"string\" ? result.section : undefined,\n },\n ]\n })\n}\n\nfunction SearchResults({\n results,\n selectedIndex,\n query,\n onClose,\n}: {\n results: SearchMatch[]\n selectedIndex: number\n query: string\n onClose: () => void\n}) {\n return (\n <>\n {results.length > 0 ? (\n <ul className={styles.searchResults}>\n {results.map((result, index) => (\n <li key={result.id}>\n <Link\n to={result.path}\n className={[styles.searchResult, index === selectedIndex && \"selected\"]\n .filter(Boolean)\n .join(\" \")}\n onClick={onClose}\n >\n <span className={styles.searchResultTitle}>{result.title}</span>\n {result.section !== undefined && (\n <span className={styles.searchResultSection}>{result.section}</span>\n )}\n </Link>\n </li>\n ))}\n </ul>\n ) : (\n <div className={styles.searchNoResults}>No results found for "{query}"</div>\n )}\n <div className={styles.searchFooter}>\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 </>\n )\n}\n\nfunction useSearch(searchIndex: ReturnType<typeof useSearchIndex>) {\n const [isOpen, setIsOpen] = useState(false)\n const [query, setQuery] = useState(\"\")\n const [results, setResults] = useState<SearchMatch[]>([])\n const [selectedIndex, setSelectedIndex] = useState(0)\n\n const search = (searchQuery: string) => {\n setQuery(searchQuery)\n if (!searchQuery.trim()) {\n setResults([])\n setIsOpen(false)\n setSelectedIndex(0)\n return\n }\n const rawResults = searchIndex.search(searchQuery).slice(0, 10)\n setResults(normalizeResults(rawResults as Array<Record<string, unknown>>))\n setSelectedIndex(0)\n setIsOpen(true)\n }\n\n return { isOpen, setIsOpen, query, results, selectedIndex, setSelectedIndex, search }\n}\n\nfunction SearchInput({\n inputRef,\n placeholder,\n query,\n hasQuery,\n onSearch,\n onKeyDown,\n onFocus,\n}: {\n inputRef: React.RefObject<HTMLInputElement | null>\n placeholder: string\n query: string\n hasQuery: boolean\n onSearch: (q: string) => void\n onKeyDown: (e: React.KeyboardEvent) => void\n onFocus: () => void\n}) {\n return (\n <div className={styles.searchField}>\n <SearchIcon size={18} />\n <input\n ref={inputRef}\n type=\"text\"\n className={styles.searchInput}\n placeholder={placeholder}\n value={query}\n onChange={(e) => {\n onSearch(e.target.value)\n }}\n onKeyDown={onKeyDown}\n onFocus={onFocus}\n aria-label=\"Search\"\n />\n {hasQuery && (\n <button\n type=\"button\"\n className={styles.searchClear}\n onClick={(e) => {\n e.stopPropagation()\n onSearch(\"\")\n inputRef.current?.focus()\n }}\n aria-label=\"Clear search\"\n >\n ×\n </button>\n )}\n <span className={styles.searchKbd}>\n <kbd>⌘</kbd>\n <kbd>K</kbd>\n </span>\n </div>\n )\n}\n\nexport function ArdoSearch({ placeholder = \"Search...\" }: ArdoSearchProps) {\n const navigate = useNavigate()\n const containerRef = useRef<HTMLDivElement>(null)\n const inputRef = useRef<HTMLInputElement>(null)\n const searchIndex = useSearchIndex()\n const state = useSearch(searchIndex)\n const hasQuery = state.query.trim().length > 0\n\n useGlobalSearchShortcut(inputRef, state.setIsOpen)\n useOutsideClick({\n containerRef,\n popoverClass: styles.searchPopover,\n isOpen: state.isOpen,\n setIsOpen: state.setIsOpen,\n })\n\n const handleKeyDown = (e: React.KeyboardEvent) => {\n switch (e.key) {\n case \"ArrowDown\":\n if (state.results.length > 0) {\n e.preventDefault()\n state.setSelectedIndex((p) => Math.min(p + 1, state.results.length - 1))\n }\n break\n case \"ArrowUp\":\n if (state.results.length > 0) {\n e.preventDefault()\n state.setSelectedIndex((p) => Math.max(p - 1, 0))\n }\n break\n case \"Enter\": {\n const p = state.results[state.selectedIndex]?.path\n if (typeof p === \"string\") {\n e.preventDefault()\n void navigate(p)\n state.setIsOpen(false)\n }\n break\n }\n case \"Escape\":\n state.setIsOpen(false)\n inputRef.current?.blur()\n break\n }\n }\n\n return (\n <div\n className={styles.search}\n ref={containerRef}\n data-expanded={state.isOpen || hasQuery ? \"true\" : \"false\"}\n onMouseDown={() => inputRef.current?.focus()}\n >\n <SearchInput\n inputRef={inputRef}\n placeholder={placeholder}\n query={state.query}\n hasQuery={hasQuery}\n onSearch={state.search}\n onKeyDown={handleKeyDown}\n onFocus={() => {\n if (hasQuery) state.setIsOpen(true)\n }}\n />\n {state.isOpen && hasQuery && (\n <SearchPopover anchorRef={containerRef}>\n <SearchResults\n results={state.results}\n selectedIndex={state.selectedIndex}\n query={state.query}\n onClose={() => {\n state.setIsOpen(false)\n }}\n />\n </SearchPopover>\n )}\n </div>\n )\n}\n","import React, { type ReactNode } from \"react\"\n\nimport type { ProjectMeta, SponsorConfig } from \"../config/types\"\n\nimport { useArdoConfig } from \"../runtime/hooks\"\nimport * as styles from \"./Footer.css\"\n\n// =============================================================================\n// Footer Component\n// =============================================================================\n\nexport interface ArdoFooterProps {\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`). 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 */\nfunction FooterProjectLink({\n project,\n config,\n}: {\n project: ArdoFooterProps[\"project\"]\n config: ReturnType<typeof useArdoConfig>\n}) {\n const resolved = project ?? config.project\n const name = resolved?.name ?? \"\"\n const version = resolved?.version ?? \"\"\n const homepage = resolved?.homepage ?? \"\"\n if (name === \"\") return null\n const label = version !== \"\" ? `${name} v${version}` : name\n return homepage !== \"\" ? (\n <a href={homepage} className={styles.footerLink}>\n {label}\n </a>\n ) : (\n <span>{label}</span>\n )\n}\n\nfunction FooterSponsorLink({ sponsor }: { sponsor: ArdoFooterProps[\"sponsor\"] }) {\n const text = sponsor?.text ?? \"\"\n const link = sponsor?.link ?? \"\"\n if (text === \"\" || link === \"\") return null\n return (\n <a href={link} className={styles.footerLink}>\n Sponsored by {text}\n </a>\n )\n}\n\nfunction FooterPrimaryLine({\n project,\n sponsor,\n ardoLink,\n config,\n}: {\n project: ArdoFooterProps[\"project\"]\n sponsor: ArdoFooterProps[\"sponsor\"]\n ardoLink: boolean\n config: ReturnType<typeof useArdoConfig>\n}) {\n const items: React.ReactNode[] = []\n const projectNode = <FooterProjectLink project={project} config={config} />\n const sponsorNode = <FooterSponsorLink sponsor={sponsor} />\n const hasProject =\n (project ?? config.project)?.name !== undefined && (project ?? config.project)?.name !== \"\"\n const hasSponsor = (sponsor?.text ?? \"\") !== \"\" && (sponsor?.link ?? \"\") !== \"\"\n\n if (hasProject) items.push(projectNode)\n if (ardoLink)\n items.push(\n <a href=\"https://ardo-docs.dev\" className={styles.footerLink}>\n Built with Ardo\n </a>\n )\n if (hasSponsor) items.push(sponsorNode)\n if (items.length === 0) return null\n\n return (\n <p className={styles.footerPrimary}>\n {items.map((item, i) => (\n // eslint-disable-next-line react/no-array-index-key\n <React.Fragment key={i}>\n {i > 0 && <span className={styles.footerSeparator} aria-hidden=\"true\" />}\n {item}\n </React.Fragment>\n ))}\n </p>\n )\n}\n\nexport function ArdoFooter({\n children,\n className,\n ardoLink = true,\n message,\n copyright,\n project,\n sponsor,\n buildTime,\n buildHash,\n}: ArdoFooterProps) {\n const config = useArdoConfig()\n const resolvedBuildTime = buildTime ?? config.buildTime\n const resolvedBuildHash = buildHash ?? config.buildHash\n\n if (children != null) {\n return (\n <footer className={className ?? styles.footer}>\n <div className={styles.footerContainer}>{children}</div>\n </footer>\n )\n }\n\n return (\n <footer className={className ?? styles.footer}>\n <div className={styles.footerContainer}>\n <FooterPrimaryLine\n project={project}\n sponsor={sponsor}\n ardoLink={ardoLink}\n config={config}\n />\n {(message ?? \"\") !== \"\" && (\n <p className={styles.footerMessage} dangerouslySetInnerHTML={{ __html: message ?? \"\" }} />\n )}\n {(copyright ?? \"\") !== \"\" && (\n <p\n className={styles.footerCopyright}\n dangerouslySetInnerHTML={{ __html: copyright ?? \"\" }}\n />\n )}\n {(resolvedBuildTime ?? \"\") !== \"\" && (\n <p className={styles.footerBuildTime}>\n Built on {formatBuildTime(resolvedBuildTime ?? \"\")}\n {(resolvedBuildHash ?? \"\") !== \"\" && <> ({resolvedBuildHash})</>}\n </p>\n )}\n </div>\n </footer>\n )\n}\n\n// Type exports for compound pattern (kept for backwards compatibility)\nexport interface ArdoFooterMessageProps {\n children: ReactNode\n className?: string\n}\n\nexport interface ArdoFooterCopyrightProps {\n children: ReactNode\n className?: string\n}\n","import { style } from \"@vanilla-extract/css\"\n\nimport { vars } from \"../theme/contract.css\"\n\nexport const themeIcon = style({\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n})\n\nexport const themeToggle = style({\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n width: \"40px\",\n height: \"40px\",\n background: \"none\",\n border: \"none\",\n cursor: \"pointer\",\n color: vars.color.textLight,\n borderRadius: vars.radius.base,\n transition: `all ${vars.transition.fast}`,\n selectors: {\n \"&:hover\": {\n background: vars.color.bgSoft,\n color: vars.color.text,\n },\n },\n})\n","import { useEffect, useState } from \"react\"\n\nimport { MonitorIcon, MoonIcon, SunIcon } from \"../icons\"\nimport * as styles from \"./ThemeToggle.css\"\n\ntype Theme = \"dark\" | \"light\" | \"system\"\n\nconst isBrowser = typeof document !== \"undefined\"\n\nfunction getInitialTheme(): Theme {\n if (!isBrowser) return \"system\"\n const stored = localStorage.getItem(\"ardo-theme\") as null | Theme\n return stored ?? \"system\"\n}\n\nexport function ArdoThemeToggle() {\n const [theme, setTheme] = useState<Theme>(getInitialTheme)\n const [mounted] = useState(isBrowser)\n\n useEffect(() => {\n applyTheme(theme)\n }, [theme])\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 type=\"button\" className={styles.themeToggle} aria-label=\"Toggle theme\">\n <span className={styles.themeIcon}>\n <SunIcon size={20} />\n </span>\n </button>\n )\n }\n\n return (\n <button\n type=\"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={styles.themeIcon}>\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 = globalThis.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 { globalStyle, style } from \"@vanilla-extract/css\"\n\nimport { vars } from \"./theme/contract.css\"\n\nexport const header = style({\n position: \"fixed\",\n top: 0,\n left: 0,\n right: 0,\n height: `calc(${vars.layout.headerHeight} + env(safe-area-inset-top))`,\n paddingTop: \"env(safe-area-inset-top)\",\n background: vars.color.sidebarBg,\n zIndex: 100,\n})\n\nexport const headerContainer = style({\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n height: \"100%\",\n padding: `0 ${vars.space.lg}`,\n})\n\nexport const headerLeft = style({\n display: \"flex\",\n alignItems: \"center\",\n gap: vars.space.lg,\n})\n\nexport const headerRight = style({\n display: \"flex\",\n alignItems: \"center\",\n gap: \"0.75rem\",\n})\n\nexport const logoLink = style({\n display: \"flex\",\n alignItems: \"center\",\n gap: vars.space.sm,\n textDecoration: \"none\",\n color: vars.color.text,\n transition: `opacity ${vars.transition.fast}`,\n selectors: {\n \"&:hover\": {\n opacity: 0.8,\n },\n },\n})\n\nexport const logo = style({\n height: \"2.25rem\",\n})\n\nexport const siteTitle = style({\n fontSize: vars.fontSize.lg,\n fontWeight: 700,\n letterSpacing: \"-0.025em\",\n})\n\nexport const mobileMenuButton = style({\n display: \"none\",\n background: \"none\",\n border: \"none\",\n cursor: \"pointer\",\n padding: vars.space.sm,\n borderRadius: vars.radius.sm,\n color: vars.color.text,\n selectors: {\n \"&:hover\": {\n background: vars.color.bgSoft,\n },\n },\n \"@media\": {\n \"(max-width: 1024px)\": {\n display: \"flex\",\n alignItems: \"center\",\n },\n },\n})\n\nexport const hamburger = style({\n display: \"flex\",\n flexDirection: \"column\",\n gap: vars.space.xs,\n})\n\nglobalStyle(`${hamburger} span`, {\n display: \"block\",\n width: \"1.25rem\",\n height: \"2px\",\n background: vars.color.text,\n borderRadius: \"1px\",\n transition: `all ${vars.transition.fast}`,\n})\n\nexport const desktopNav = style({\n display: \"flex\",\n alignItems: \"center\",\n \"@media\": {\n \"(max-width: 1024px)\": {\n display: \"none\",\n },\n },\n})\n\n// =============================================================================\n// Mobile slide-in panel\n// =============================================================================\n\nexport const mobileBackdrop = style({\n position: \"fixed\",\n inset: 0,\n zIndex: 150,\n background: \"oklch(0 0 0 / 0.3)\",\n transition: `opacity ${vars.transition.base}`,\n selectors: {\n '&[data-open=\"false\"]': {\n opacity: 0,\n pointerEvents: \"none\",\n },\n },\n})\n\nexport const mobilePanel = style({\n position: \"fixed\",\n top: 0,\n left: 0,\n bottom: 0,\n width: \"min(20rem, 85vw)\",\n zIndex: 151,\n background: vars.color.bg,\n overflowY: \"auto\",\n padding: `${vars.space.lg} ${vars.space.lg} ${vars.space.xl}`,\n transform: \"translateX(0)\",\n transition: `transform ${vars.transition.slow}`,\n selectors: {\n '&[data-open=\"false\"]': {\n transform: \"translateX(-100%)\",\n },\n },\n})\n\nexport const mobilePanelHeader = style({\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n marginBottom: vars.space.lg,\n})\n\nexport const mobilePanelClose = style({\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n background: \"none\",\n border: \"none\",\n cursor: \"pointer\",\n padding: vars.space.sm,\n borderRadius: vars.radius.base,\n color: vars.color.textLight,\n transition: `all ${vars.transition.fast}`,\n selectors: {\n \"&:hover\": {\n color: vars.color.text,\n background: vars.color.bgMute,\n },\n },\n})\n\nexport const mobilePanelNav = style({\n marginBottom: vars.space.lg,\n paddingBottom: vars.space.md,\n borderBottom: `1px solid ${vars.color.border}`,\n})\n\nglobalStyle(`${mobilePanelNav} a`, {\n display: \"block\",\n padding: `${vars.space.sm} 0`,\n color: vars.color.textLight,\n textDecoration: \"none\",\n fontSize: vars.fontSize.sm,\n})\n\n// Force sidebar visible inside the mobile panel (overrides sidebar's display:none at 1024px)\nexport const mobilePanelSidebar = style({})\n\nglobalStyle(`${mobilePanelSidebar} > aside`, {\n display: \"block\",\n width: \"100%\",\n padding: 0,\n})\n\n// Legacy - keep for backwards compat but unused\nexport const mobileMenu = style({ display: \"none\" })\nexport const mobileTopNav = style({ display: \"none\" })\nexport const mobileMenuContent = style({})\nexport const mobileMenuSection = style({})\nexport const mobileNav = style({})\n","import { style } from \"@vanilla-extract/css\"\n\nimport { vars } from \"./theme/contract.css\"\n\nexport const nav = style({\n display: \"flex\",\n alignItems: \"center\",\n gap: \"8px\",\n})\n\nexport const navLink = style({\n position: \"relative\",\n color: vars.color.textLight,\n textDecoration: \"none\",\n fontSize: \"14px\",\n fontWeight: 500,\n padding: \"8px 14px\",\n borderRadius: vars.radius.sm,\n transition: `all ${vars.transition.fast}`,\n selectors: {\n \"&::after\": {\n content: '\"\"',\n position: \"absolute\",\n bottom: 0,\n left: \"50%\",\n transform: \"translateX(-50%)\",\n width: 0,\n height: \"2px\",\n background: vars.color.brand,\n borderRadius: \"1px\",\n transition: `width ${vars.transition.base}`,\n },\n \"&:hover\": {\n color: vars.color.text,\n background: vars.color.bgSoft,\n },\n \"&.active\": {\n color: vars.color.brand,\n },\n \"&.active::after\": {\n width: \"calc(100% - 28px)\",\n },\n },\n})\n\nexport const socialLink = style({\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n width: \"40px\",\n height: \"40px\",\n color: vars.color.textLight,\n borderRadius: vars.radius.base,\n transition: `all ${vars.transition.fast}`,\n selectors: {\n \"&:hover\": {\n color: vars.color.text,\n background: vars.color.bgSoft,\n },\n },\n})\n","import { type ReactNode, useEffect, useState } from \"react\"\nimport { Link, useLocation } from \"react-router\"\n\nimport { useArdoConfig } from \"../runtime/hooks\"\nimport { ArdoSearch } from \"./components/Search\"\nimport { ArdoThemeToggle } from \"./components/ThemeToggle\"\nimport * as styles from \"./Header.css\"\nimport {\n GithubIcon,\n LinkedinIcon,\n MessageCircleIcon,\n PackageIcon,\n TwitterIcon,\n XIcon,\n YoutubeIcon,\n} from \"./icons\"\nimport * as navStyles from \"./Nav.css\"\n\n// =============================================================================\n// Header Component\n// =============================================================================\n\nexport interface ArdoHeaderProps {\n /** Logo image URL or light/dark variants */\n logo?: { light: string; dark: string } | 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 /** Placeholder text for the search input */\n searchPlaceholder?: string\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\nexport function ArdoHeader({\n logo,\n title,\n nav,\n actions,\n search = false,\n searchPlaceholder,\n themeToggle = true,\n mobileMenuContent,\n className,\n}: ArdoHeaderProps) {\n const location = useLocation()\n const config = useArdoConfig()\n const [mobileMenuOpen, setMobileMenuOpen] = useState(false)\n\n const resolvedLogo = logo\n const resolvedTitle = title ?? config.title\n const hasLogo = resolvedLogo !== undefined\n const hasTitle = resolvedTitle !== \"\"\n const hasMobileMenu = mobileMenuContent != null\n\n useEffect(() => {\n setMobileMenuOpen(false)\n }, [location.pathname])\n\n // Prevent body scroll when mobile menu is open\n useEffect(() => {\n if (mobileMenuOpen) {\n document.body.style.overflow = \"hidden\"\n } else {\n document.body.style.overflow = \"\"\n }\n return () => {\n document.body.style.overflow = \"\"\n }\n }, [mobileMenuOpen])\n\n return (\n <>\n <header className={className ?? styles.header}>\n <div className={styles.headerContainer}>\n <div className={styles.headerLeft}>\n {hasMobileMenu && (\n <button\n type=\"button\"\n className={styles.mobileMenuButton}\n onClick={() => {\n setMobileMenuOpen(!mobileMenuOpen)\n }}\n aria-label=\"Toggle menu\"\n aria-expanded={mobileMenuOpen}\n >\n <span className={styles.hamburger}>\n <span />\n <span />\n <span />\n </span>\n </button>\n )}\n <Link to=\"/\" className={styles.logoLink}>\n {hasLogo && (\n <img\n src={typeof resolvedLogo === \"string\" ? resolvedLogo : resolvedLogo.light}\n alt={resolvedTitle}\n className={styles.logo}\n />\n )}\n {hasTitle && <span className={styles.siteTitle}>{resolvedTitle}</span>}\n </Link>\n </div>\n\n {nav != null && <div className={styles.desktopNav}>{nav}</div>}\n\n <div className={styles.headerRight}>\n {search && <ArdoSearch placeholder={searchPlaceholder} />}\n {themeToggle && <ArdoThemeToggle />}\n {actions}\n </div>\n </div>\n </header>\n\n {hasMobileMenu && (\n <MobileSlidePanel\n isOpen={mobileMenuOpen}\n logo={resolvedLogo}\n title={resolvedTitle}\n nav={nav}\n themeToggle={themeToggle}\n onClose={() => {\n setMobileMenuOpen(false)\n }}\n >\n {mobileMenuContent}\n </MobileSlidePanel>\n )}\n </>\n )\n}\n\n// =============================================================================\n// Mobile Slide-in Panel\n// =============================================================================\n\nfunction MobileSlidePanel({\n isOpen,\n logo,\n title,\n nav,\n themeToggle,\n children,\n onClose,\n}: {\n isOpen: boolean\n logo?: { light: string; dark: string } | string\n title: string\n nav?: ReactNode\n themeToggle?: boolean\n children: ReactNode\n onClose: () => void\n}) {\n return (\n <>\n {/* eslint-disable-next-line jsx-a11y/click-events-have-key-events, jsx-a11y/no-static-element-interactions */}\n <div className={styles.mobileBackdrop} data-open={isOpen} onClick={onClose} />\n\n {/* Panel */}\n <div className={styles.mobilePanel} data-open={isOpen} aria-hidden={!isOpen}>\n <div className={styles.mobilePanelHeader}>\n <Link to=\"/\" className={styles.logoLink} onClick={onClose}>\n {logo != null && (\n <img\n src={typeof logo === \"string\" ? logo : logo.light}\n alt={title}\n className={styles.logo}\n />\n )}\n </Link>\n <div style={{ display: \"flex\", alignItems: \"center\", gap: \"0.5rem\" }}>\n {themeToggle && <ArdoThemeToggle />}\n <button\n type=\"button\"\n className={styles.mobilePanelClose}\n onClick={onClose}\n aria-label=\"Close menu\"\n >\n <XIcon size={20} />\n </button>\n </div>\n </div>\n\n {/* Nav links */}\n {nav != null && (\n <div className={styles.mobilePanelNav} onClickCapture={handleLinkClick(onClose)}>\n {nav}\n </div>\n )}\n\n {/* Sidebar content - wrapper overrides display:none from sidebar CSS */}\n <div className={styles.mobilePanelSidebar} onClickCapture={handleLinkClick(onClose)}>\n {children}\n </div>\n </div>\n </>\n )\n}\n\nfunction handleLinkClick(onClose: () => void) {\n return (event: React.MouseEvent<HTMLElement>) => {\n if (event.target instanceof HTMLElement && event.target.closest(\"a\") !== null) {\n onClose()\n }\n }\n}\n\n// =============================================================================\n// SocialLink Component\n// =============================================================================\n\nexport interface ArdoSocialLinkProps {\n /** URL to link to */\n href: string\n /** Social icon type */\n icon: \"discord\" | \"github\" | \"linkedin\" | \"npm\" | \"twitter\" | \"youtube\"\n /** Accessible label */\n ariaLabel?: string\n /** Additional CSS classes */\n className?: string\n}\n\nexport function ArdoSocialLink({ href, icon, ariaLabel, className }: ArdoSocialLinkProps) {\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\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: keyof typeof socialIcons }) {\n const IconComponent = socialIcons[icon]\n return <IconComponent size={20} />\n}\n","import { style } from \"@vanilla-extract/css\"\n\nimport { vars } from \"./theme/contract.css\"\n\nexport const sidebar = style({\n width: vars.layout.sidebarWidth,\n flexShrink: 0,\n display: \"flex\",\n flexDirection: \"column\",\n padding: `${vars.space.md} ${vars.space.md} ${vars.space.md} 1.25rem`,\n background: \"transparent\",\n \"@media\": {\n \"(max-width: 1024px)\": {\n display: \"none\",\n },\n },\n})\n\nexport const sidebarHeader = style({\n flexShrink: 0,\n marginBottom: vars.space.md,\n position: \"relative\",\n})\n\nexport const sidebarNav = style({\n flex: 1,\n overflowY: \"auto\",\n minHeight: 0,\n})\n\nexport const sidebarList = style({\n listStyle: \"none\",\n})\n\nexport const sidebarList0 = style({})\n\nexport const sidebarList1 = style({\n marginLeft: \"0.75rem\",\n marginTop: \"2px\",\n})\n\nexport const sidebarItem = style({})\n\nexport const sidebarItemHeader = style({\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n})\n\nexport const sidebarLink = style({\n display: \"block\",\n padding: `0.25rem 0.75rem`,\n color: vars.color.textLight,\n textDecoration: \"none\",\n fontSize: vars.fontSize.sm,\n fontWeight: 400,\n borderRadius: vars.radius.base,\n transition: `all ${vars.transition.fast}`,\n selectors: {\n \"&:hover\": {\n color: vars.color.text,\n },\n \"&.active\": {\n color: vars.color.brand,\n background: vars.color.brandSubtle,\n fontWeight: 500,\n },\n },\n})\n\n// Section title (top-level group heading like \"Get started\", \"Organize\")\nexport const sidebarText = style({\n display: \"flex\",\n alignItems: \"center\",\n gap: vars.space.sm,\n padding: `0.375rem 0`,\n marginTop: vars.space.lg,\n color: vars.color.text,\n textDecoration: \"none\",\n fontWeight: 600,\n fontSize: vars.fontSize.sm,\n transition: `all ${vars.transition.fast}`,\n selectors: {\n \"&:hover\": {\n color: vars.color.text,\n },\n \"&.active\": {\n color: vars.color.brand,\n },\n \"li:first-child > div > &\": {\n marginTop: 0,\n },\n },\n})\n\nexport const sidebarTextButton = style({\n width: \"100%\",\n background: \"none\",\n border: \"none\",\n appearance: \"none\",\n WebkitAppearance: \"none\",\n fontFamily: \"inherit\",\n lineHeight: \"inherit\",\n textAlign: \"left\",\n cursor: \"pointer\",\n})\n\nexport const sidebarCollapse = style({\n display: \"flex\",\n alignItems: \"center\",\n alignSelf: \"center\",\n background: \"none\",\n border: \"none\",\n cursor: \"pointer\",\n padding: vars.space.xs,\n color: vars.color.textLighter,\n borderRadius: \"50%\",\n transition: `all ${vars.transition.base}`,\n selectors: {\n \"&:hover\": {\n color: vars.color.text,\n },\n \"&.collapsed\": {\n transform: \"rotate(-90deg)\",\n },\n },\n})\n\nexport const sidebarCollapseWrapper = style({\n display: \"grid\",\n gridTemplateRows: \"1fr\",\n transition: `grid-template-rows ${vars.transition.slow}`,\n selectors: {\n '&[data-collapsed=\"true\"]': {\n gridTemplateRows: \"0fr\",\n },\n },\n})\n\nexport const sidebarCollapseInner = style({\n overflow: \"hidden\",\n minHeight: 0,\n})\n","import {\n Children,\n type ComponentProps,\n createContext,\n isValidElement,\n type ReactNode,\n use,\n useMemo,\n useState,\n} from \"react\"\nimport { NavLink, useLocation } from \"react-router\"\n\nimport type { SidebarItem as SidebarItemType } from \"../config/types\"\n\nimport { useArdoSidebar } from \"../runtime/hooks\"\nimport { ChevronDownIcon } from \"./icons\"\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 use(SidebarContext)\n}\n\n// =============================================================================\n// Sidebar Component Types\n// =============================================================================\n\nexport interface ArdoSidebarProps {\n /** Sidebar items (for data-driven approach) */\n items?: SidebarItemType[]\n /** Children for JSX composition (SidebarGroup, SidebarLink) */\n children?: ReactNode\n /** Content rendered above navigation (e.g. search) */\n header?: 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 ArdoSidebar({ items, children, header, className }: ArdoSidebarProps) {\n const { pathname } = useLocation()\n const contextSidebar = useArdoSidebar()\n const hasCustomChildren = children != null\n const resolvedItems = items ?? (hasCustomChildren ? undefined : contextSidebar)\n const hasResolvedItems = (resolvedItems?.length ?? 0) > 0\n const contextValue = useMemo(() => ({ currentPath: pathname }), [pathname])\n\n return (\n <SidebarContext value={contextValue}>\n <aside className={className ?? styles.sidebar}>\n {header != null && <div className={styles.sidebarHeader}>{header}</div>}\n <nav aria-label=\"Main navigation\" className={styles.sidebarNav}>\n {hasCustomChildren ? (\n <ul className={`${styles.sidebarList} ${styles.sidebarList0}`}>{children}</ul>\n ) : hasResolvedItems ? (\n <SidebarItems items={resolvedItems ?? []} depth={0} />\n ) : null}\n </nav>\n </aside>\n </SidebarContext>\n )\n}\n\n// =============================================================================\n// SidebarGroup Component\n// =============================================================================\n\nexport interface ArdoSidebarGroupProps {\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 ArdoSidebarGroup({\n title,\n to,\n collapsed: initialCollapsed = false,\n collapsible = true,\n children,\n className,\n}: ArdoSidebarGroupProps) {\n const [collapsed, setCollapsed] = useState(initialCollapsed)\n const { currentPath } = useSidebarContext()\n\n // Check if any child is active\n const hasActiveChild = checkChildrenActive(children, currentPath)\n\n const textClassName = [styles.sidebarText, hasActiveChild && \"child-active\"]\n .filter(Boolean)\n .join(\" \")\n const textButtonClassName = [textClassName, styles.sidebarTextButton].join(\" \")\n\n const hasChildren = Children.count(children) > 0\n const hasTo = (to ?? \"\") !== \"\"\n const canToggle = collapsible && hasChildren\n\n return (\n <li className={className ?? styles.sidebarItem}>\n <div className={styles.sidebarItemHeader}>\n {hasTo ? (\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 <button\n type=\"button\"\n className={textButtonClassName}\n onClick={() => {\n if (canToggle) {\n setCollapsed(!collapsed)\n }\n }}\n >\n {title}\n </button>\n )}\n\n {canToggle && (\n <button\n type=\"button\"\n className={[styles.sidebarCollapse, collapsed && \"collapsed\"].filter(Boolean).join(\" \")}\n onClick={() => {\n setCollapsed(!collapsed)\n }}\n aria-label={collapsed ? \"Expand\" : \"Collapse\"}\n >\n <ChevronDownIcon size={16} />\n </button>\n )}\n </div>\n\n {hasChildren && (\n <div className={styles.sidebarCollapseWrapper} data-collapsed={collapsed}>\n <div className={styles.sidebarCollapseInner}>\n <ul className={`${styles.sidebarList} ${styles.sidebarList1}`}>{children}</ul>\n </div>\n </div>\n )}\n </li>\n )\n}\n\n// =============================================================================\n// SidebarLink Component\n// =============================================================================\n\nexport interface ArdoSidebarLinkProps {\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 ArdoSidebarLink({ to, children, className }: ArdoSidebarLinkProps) {\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) => (\n <SidebarItemComponent\n key={item.link ?? `${item.text}-${String(depth)}`}\n item={item}\n depth={depth}\n />\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 const childItems = item.items ?? []\n\n const hasChildren = childItems.length > 0\n\n const hasActiveChild =\n hasChildren &&\n childItems.some(\n (child) =>\n child.link === currentPath ||\n child.items?.some((grandchild) => grandchild.link === currentPath)\n )\n const hasItemLink = (item.link ?? \"\") !== \"\"\n\n const linkClassName = [styles.sidebarLink, hasActiveChild && \"child-active\"]\n .filter(Boolean)\n .join(\" \")\n\n const textClassName = [styles.sidebarText, hasActiveChild && \"child-active\"]\n .filter(Boolean)\n .join(\" \")\n const textButtonClassName = [textClassName, styles.sidebarTextButton].join(\" \")\n\n return (\n <li className={styles.sidebarItem}>\n <div className={styles.sidebarItemHeader}>\n {hasItemLink ? (\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 <button\n type=\"button\"\n className={textButtonClassName}\n onClick={() => {\n if (hasChildren) {\n setCollapsed(!collapsed)\n }\n }}\n >\n {item.text}\n </button>\n )}\n\n {hasChildren && (\n <button\n type=\"button\"\n className={[styles.sidebarCollapse, collapsed && \"collapsed\"].filter(Boolean).join(\" \")}\n onClick={() => {\n setCollapsed(!collapsed)\n }}\n aria-label={collapsed ? \"Expand\" : \"Collapse\"}\n >\n <ChevronDownIcon size={16} />\n </button>\n )}\n </div>\n\n {hasChildren && (\n <div className={styles.sidebarCollapseWrapper} data-collapsed={collapsed}>\n <div className={styles.sidebarCollapseInner}>\n <SidebarItems items={childItems} depth={depth + 1} />\n </div>\n </div>\n )}\n </li>\n )\n}\n\n// =============================================================================\n// Utility Functions\n// =============================================================================\n\nfunction isSidebarChildActive(child: React.ReactElement, currentPath: string): boolean {\n if (child.type === ArdoSidebarLink) {\n return (child.props as ArdoSidebarLinkProps).to === currentPath\n }\n if (child.type === ArdoSidebarGroup) {\n const groupProps = child.props as ArdoSidebarGroupProps\n return (\n groupProps.to === currentPath ||\n (groupProps.children != null && checkChildrenActive(groupProps.children, currentPath))\n )\n }\n return false\n}\n\nfunction checkChildrenActive(children: ReactNode, currentPath: string): boolean {\n return Children.toArray(children).some(\n (child) => isValidElement(child) && isSidebarChildActive(child, currentPath)\n )\n}\n","import { cloneElement, isValidElement, type ReactNode, useMemo } from \"react\"\nimport { Outlet, useLocation } from \"react-router\"\n\nimport type { ArdoConfig, SidebarItem } from \"../config/types\"\n\nimport { ArdoProvider, type ArdoSiteConfig, ArdoSiteConfigProvider } from \"../runtime/hooks\"\nimport { ArdoSearch } from \"./components/Search\"\nimport { ArdoFooter, type ArdoFooterProps } from \"./Footer\"\nimport { ArdoHeader, type ArdoHeaderProps } from \"./Header\"\nimport { ArdoLayout } from \"./Layout\"\nimport * as layoutStyles from \"./Layout.css\"\nimport { ArdoSidebar, type ArdoSidebarProps } from \"./Sidebar\"\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 ArdoHeader (ignored when header is provided) */\n headerProps?: ArdoHeaderProps\n /** Props passed to auto-generated ArdoSidebar (ignored when sidebarContent is provided) */\n sidebarProps?: ArdoSidebarProps\n /** Props passed to auto-generated ArdoFooter (ignored when footer is provided) */\n footerProps?: ArdoFooterProps\n /** Edit link configuration (applied site-wide via ArdoSiteConfig) */\n editLink?: { pattern: string; text?: string }\n /** Last updated configuration (applied site-wide via ArdoSiteConfig) */\n lastUpdated?: { enabled?: boolean; text?: string; formatOptions?: Intl.DateTimeFormatOptions }\n /** TOC label (applied site-wide via ArdoSiteConfig) */\n tocLabel?: string\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 * editLink={{\n * pattern: \"https://github.com/user/repo/edit/main/docs/:path\",\n * text: \"Edit this page on GitHub\",\n * }}\n * lastUpdated={{ enabled: true }}\n * />\n * )\n * }\n * ```\n */\nfunction resolveRootHeader(\n header: ReactNode,\n headerProps: ArdoHeaderProps | undefined,\n mobileMenuContent: ReactNode\n): ReactNode {\n if (header != null) {\n return enhanceHeaderWithMobileMenuContent(header, mobileMenuContent)\n }\n return (\n <ArdoHeader\n {...headerProps}\n mobileMenuContent={headerProps?.mobileMenuContent ?? mobileMenuContent}\n />\n )\n}\n\nfunction resolveLayoutClassName(className: string | undefined, isHomePage: boolean): string {\n if (className != null) return className\n return isHomePage ? `${layoutStyles.layout} ${layoutStyles.home}` : layoutStyles.layout\n}\n\nexport function ArdoRoot({\n config,\n sidebar,\n header,\n sidebarContent,\n footer,\n headerProps,\n sidebarProps,\n footerProps,\n editLink,\n lastUpdated,\n tocLabel,\n className,\n children,\n}: ArdoRootProps) {\n const location = useLocation()\n const isHomePage = location.pathname === \"/\" || location.pathname === \"\"\n const searchPlaceholder = headerProps?.searchPlaceholder\n const showSearch = headerProps?.search !== false\n const sidebarSearch =\n !isHomePage && showSearch ? <ArdoSearch placeholder={searchPlaceholder} /> : undefined\n const resolvedSidebar = isHomePage\n ? undefined\n : wrapSidebarWithSearch(sidebarContent, sidebarProps, sidebarSearch)\n const resolvedHeader = resolveRootHeader(\n header,\n { ...headerProps, search: false },\n isHomePage ? undefined : resolvedSidebar\n )\n\n const siteConfig = useMemo<ArdoSiteConfig>(\n () => ({ editLink, lastUpdated, tocLabel }),\n [editLink, lastUpdated, tocLabel]\n )\n\n const content = (\n <ArdoProvider config={config} sidebar={sidebar}>\n <ArdoLayout\n className={resolveLayoutClassName(className, isHomePage)}\n header={resolvedHeader}\n sidebar={resolvedSidebar}\n footer={footer ?? <ArdoFooter {...footerProps} />}\n >\n {children ?? <Outlet />}\n </ArdoLayout>\n </ArdoProvider>\n )\n\n const hasSiteConfig =\n editLink !== undefined || lastUpdated !== undefined || (tocLabel ?? \"\") !== \"\"\n return hasSiteConfig ? (\n <ArdoSiteConfigProvider value={siteConfig}>{content}</ArdoSiteConfigProvider>\n ) : (\n content\n )\n}\n\n/**\n * Wraps sidebar content with a search field header.\n * If the user provides custom sidebarContent (which is typically an <ArdoSidebar>),\n * we clone it and inject the search as its `header` prop.\n * Otherwise we create a default <ArdoSidebar> with search.\n */\nfunction wrapSidebarWithSearch(\n sidebarContent: ReactNode | undefined,\n sidebarProps: ArdoSidebarProps | undefined,\n search: ReactNode | undefined\n): ReactNode {\n if (sidebarContent == null) {\n return <ArdoSidebar {...sidebarProps} header={search} />\n }\n\n // If sidebarContent is an ArdoSidebar element, clone it with the search header\n if (isValidElement<ArdoSidebarProps>(sidebarContent) && sidebarContent.type === ArdoSidebar) {\n return cloneElement(sidebarContent, {\n header: sidebarContent.props.header ?? search,\n })\n }\n\n // Fallback: wrap custom content in an ArdoSidebar with search\n return <ArdoSidebar header={search}>{sidebarContent}</ArdoSidebar>\n}\n\nfunction enhanceHeaderWithMobileMenuContent(\n header: ReactNode,\n mobileMenuContent: ReactNode\n): ReactNode {\n if (!isValidElement<ArdoHeaderProps>(header) || header.type !== ArdoHeader) {\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 { globalStyle, style } from \"@vanilla-extract/css\"\n\nimport { fadeInUp } from \"../theme/animations.css\"\nimport { vars } from \"../theme/contract.css\"\n\nexport const features = style({\n padding: \"80px 24px\",\n background: vars.color.bgSoft,\n borderTop: `1px solid ${vars.color.border}`,\n \"@media\": {\n \"(max-width: 768px)\": {\n padding: \"48px 16px\",\n },\n },\n})\n\nexport const featuresHeader = style({\n textAlign: \"center\",\n marginBottom: \"48px\",\n})\n\nexport const featuresTitle = style({\n fontSize: \"36px\",\n fontWeight: 700,\n letterSpacing: \"-0.02em\",\n marginBottom: \"12px\",\n \"@media\": {\n \"(max-width: 768px)\": {\n fontSize: \"28px\",\n },\n },\n})\n\nexport const featuresSubtitle = style({\n fontSize: \"18px\",\n color: vars.color.textLight,\n maxWidth: \"560px\",\n margin: \"0 auto\",\n \"@media\": {\n \"(max-width: 768px)\": {\n fontSize: \"16px\",\n },\n },\n})\n\nexport const featuresContainer = style({\n display: \"grid\",\n gridTemplateColumns: \"repeat(auto-fit, minmax(260px, 1fr))\",\n gap: \"20px\",\n maxWidth: \"1100px\",\n margin: \"0 auto\",\n})\n\nexport const feature = style({\n padding: \"28px\",\n background: vars.color.bg,\n borderRadius: vars.radius.lg,\n border: `1px solid ${vars.color.border}`,\n boxShadow: vars.color.shadowSm,\n transition: `all ${vars.transition.base}`,\n animation: `${fadeInUp} 0.5s ease both`,\n selectors: {\n \"&:hover\": {\n borderColor: \"oklch(0.48 0.15 170 / 0.4)\",\n boxShadow: `${vars.color.shadowMd}, 0 0 0 1px oklch(0.48 0.15 170 / 0.1)`,\n },\n },\n \"@media\": {\n \"(hover: hover)\": {\n selectors: {\n \"&:hover\": {\n transform: \"translateY(-3px)\",\n },\n },\n },\n \"(prefers-reduced-motion: reduce)\": {\n animation: \"none\",\n selectors: {\n \"&:hover\": {\n transform: \"none\",\n },\n },\n },\n },\n})\n\n// Stagger animation delays\nfor (let i = 1; i <= 6; i++) {\n globalStyle(`${featuresContainer} ${feature}:nth-child(${i})`, {\n animationDelay: `${(i - 1) * 80}ms`,\n })\n}\n\nexport const featureIcon = style({\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n width: \"48px\",\n height: \"48px\",\n marginBottom: \"16px\",\n background: vars.color.brandSubtle,\n border: \"1px solid oklch(0.48 0.15 170 / 0.12)\",\n borderRadius: \"50%\",\n color: vars.color.brand,\n transition: `all ${vars.transition.base}`,\n})\n\nglobalStyle(`${feature}:hover ${featureIcon}`, {\n background: vars.color.brand,\n color: \"white\",\n borderColor: \"transparent\",\n})\n\nexport const featureTitle = style({\n fontSize: \"17px\",\n fontWeight: 600,\n marginBottom: \"10px\",\n letterSpacing: \"-0.01em\",\n})\n\nexport const featureDetails = style({\n fontSize: \"14px\",\n color: vars.color.textLight,\n lineHeight: 1.6,\n marginBottom: \"12px\",\n})\n\nexport const featureLink = style({\n fontSize: \"14px\",\n fontWeight: 500,\n color: vars.color.brand,\n textDecoration: \"none\",\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: \"4px\",\n transition: `gap ${vars.transition.fast}`,\n selectors: {\n \"&:hover\": {\n gap: \"8px\",\n },\n \"&::after\": {\n content: '\"\\\\2192\"',\n },\n },\n})\n","import type { ReactNode } from \"react\"\n\nimport { Link } from \"react-router\"\n\nimport * as styles from \"./Features.css\"\n\nexport interface ArdoFeaturesProps {\n /** Feature cards as children */\n children: ReactNode\n /** Section title */\n title?: string\n /** Section subtitle */\n subtitle?: string\n /** Additional CSS class */\n className?: string\n}\n\nexport interface ArdoFeatureCardProps {\n /** Feature title */\n title: string\n /** Icon as ReactNode (emoji, Lucide icon component, or any JSX) */\n icon?: ReactNode\n /** Feature description as children */\n children: ReactNode\n /** Optional link */\n link?: string\n /** Link text (defaults to \"Learn more\") */\n linkText?: string\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 * <ArdoFeatureCard title=\"Fast\" icon={<Zap size={28} />}>\n * Lightning fast builds with Vite\n * </ArdoFeatureCard>\n * ```\n */\nexport function ArdoFeatureCard({\n title,\n icon,\n children,\n link,\n linkText,\n className,\n}: ArdoFeatureCardProps) {\n const hasIcon = icon != null\n const hasLink = (link ?? \"\") !== \"\"\n const resolvedLinkText = linkText ?? \"Learn more\"\n\n return (\n <div className={className ?? styles.feature}>\n {hasIcon && <div className={styles.featureIcon}>{icon}</div>}\n <h3 className={styles.featureTitle}>{title}</h3>\n <p className={styles.featureDetails}>{children}</p>\n {hasLink && (\n <Link to={link ?? \"\"} className={styles.featureLink}>\n {resolvedLinkText}\n </Link>\n )}\n </div>\n )\n}\n\n/**\n * Features grid component for displaying multiple feature cards.\n *\n * @example\n * ```tsx\n * <ArdoFeatures title=\"Key Features\" subtitle=\"Everything you need\">\n * <ArdoFeatureCard title=\"React-First\" icon=\"⚛️\">Built on React.</ArdoFeatureCard>\n * <ArdoFeatureCard title=\"Fast\" icon=\"⚡\">Powered by Vite.</ArdoFeatureCard>\n * </ArdoFeatures>\n * ```\n */\nexport function ArdoFeatures({ children, title, subtitle, className }: ArdoFeaturesProps) {\n const hasTitle = (title ?? \"\") !== \"\"\n const hasSubtitle = (subtitle ?? \"\") !== \"\"\n const hasHeader = hasTitle || hasSubtitle\n\n return (\n <section className={className ?? styles.features}>\n {hasHeader && (\n <div className={styles.featuresHeader}>\n {hasTitle && <h2 className={styles.featuresTitle}>{title}</h2>}\n {hasSubtitle && <p className={styles.featuresSubtitle}>{subtitle}</p>}\n </div>\n )}\n <div className={styles.featuresContainer}>{children}</div>\n </section>\n )\n}\n","import { globalStyle, style } from \"@vanilla-extract/css\"\n\nimport { fadeInUp } from \"../theme/animations.css\"\nimport { vars } from \"../theme/contract.css\"\n\nexport const hero = style({\n padding: \"100px 24px 80px\",\n textAlign: \"center\",\n position: \"relative\",\n overflow: \"hidden\",\n selectors: {\n \"&::before\": {\n content: '\"\"',\n position: \"absolute\",\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n background: `radial-gradient(ellipse 60% 50% at 30% 0%, oklch(0.48 0.15 200 / 0.06) 0%, transparent 60%), radial-gradient(ellipse 80% 50% at 70% -10%, oklch(0.48 0.15 170 / 0.12) 0%, transparent 70%), linear-gradient(180deg, ${vars.color.bg} 0%, ${vars.color.bgSoft} 100%)`,\n pointerEvents: \"none\",\n },\n \".dark &::before\": {\n background: `radial-gradient(ellipse 60% 50% at 30% 0%, oklch(0.65 0.16 200 / 0.1) 0%, transparent 60%), radial-gradient(ellipse 80% 50% at 70% -10%, oklch(0.65 0.16 170 / 0.2) 0%, transparent 70%), linear-gradient(180deg, ${vars.color.bg} 0%, ${vars.color.bgSoft} 100%)`,\n },\n },\n \"@media\": {\n \"(max-width: 768px)\": {\n padding: \"60px 20px\",\n },\n },\n})\n\nexport const heroContainer = style({\n maxWidth: \"800px\",\n margin: \"0 auto\",\n position: \"relative\",\n zIndex: 1,\n})\n\nexport const heroAnimate = style({\n animation: `${fadeInUp} 0.6s ease both`,\n \"@media\": {\n \"(prefers-reduced-motion: reduce)\": {\n animation: \"none\",\n },\n },\n})\n\nglobalStyle(`${hero} img`, {\n maxWidth: \"180px\",\n marginBottom: \"40px\",\n filter: \"drop-shadow(0 4px 20px oklch(0.48 0.15 170 / 0.15))\",\n})\n\nexport const heroVersion = style({\n display: \"inline-block\",\n padding: \"4px 14px\",\n fontSize: \"13px\",\n fontWeight: 600,\n color: vars.color.brand,\n background: vars.color.brandSubtle,\n border: \"1px solid oklch(0.48 0.15 170 / 0.15)\",\n borderRadius: \"999px\",\n marginBottom: \"16px\",\n letterSpacing: \"0.02em\",\n})\n\nexport const heroName = style({\n fontSize: \"64px\",\n fontWeight: 800,\n background: vars.color.brandGradient,\n WebkitBackgroundClip: \"text\",\n WebkitTextFillColor: \"transparent\",\n backgroundClip: \"text\",\n letterSpacing: \"-0.03em\",\n lineHeight: 1.1,\n \"@media\": {\n \"(max-width: 768px)\": {\n fontSize: \"40px\",\n },\n },\n})\n\nexport const heroText = style({\n fontSize: \"48px\",\n fontWeight: 700,\n marginTop: \"8px\",\n letterSpacing: \"-0.02em\",\n lineHeight: 1.15,\n \"@media\": {\n \"(max-width: 768px)\": {\n fontSize: \"28px\",\n },\n },\n})\n\nexport const heroTagline = style({\n fontSize: \"18px\",\n color: vars.color.textLight,\n marginTop: \"24px\",\n maxWidth: \"560px\",\n marginLeft: \"auto\",\n marginRight: \"auto\",\n lineHeight: 1.65,\n \"@media\": {\n \"(max-width: 768px)\": {\n fontSize: \"16px\",\n },\n },\n})\n\nexport const heroActions = style({\n display: \"flex\",\n justifyContent: \"center\",\n gap: \"16px\",\n marginTop: \"40px\",\n flexWrap: \"wrap\",\n})\n\nexport const heroAction = style({\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: \"8px\",\n padding: \"14px 28px\",\n fontSize: \"15px\",\n fontWeight: 600,\n textDecoration: \"none\",\n borderRadius: vars.radius.base,\n transition: `all ${vars.transition.base}`,\n})\n\nexport const heroActionBrand = style({\n background: vars.color.brand,\n color: \"white\",\n boxShadow: \"0 4px 14px oklch(0.48 0.15 170 / 0.3)\",\n selectors: {\n \"&:hover\": {\n background: vars.color.brandDark,\n boxShadow: \"0 6px 20px oklch(0.48 0.15 170 / 0.4)\",\n },\n },\n \"@media\": {\n \"(hover: hover)\": {\n selectors: {\n \"&:hover\": {\n transform: \"translateY(-2px)\",\n },\n },\n },\n \"(prefers-reduced-motion: reduce)\": {\n selectors: {\n \"&:hover\": {\n transform: \"none\",\n },\n },\n },\n },\n})\n\nexport const heroActionAlt = style({\n background: vars.color.bg,\n color: vars.color.text,\n border: `1px solid ${vars.color.border}`,\n selectors: {\n \"&:hover\": {\n borderColor: vars.color.brand,\n color: vars.color.brand,\n },\n },\n})\n","import type { ComponentProps, ReactNode } from \"react\"\n\nimport { Link } from \"react-router\"\n\nimport * as styles from \"./Hero.css\"\n\n/** Internal route path from React Router */\ntype RoutePath = ComponentProps<typeof Link>[\"to\"]\n\nexport interface ArdoHeroAction {\n /** Button text */\n text: string\n /** Link destination - internal route path or external URL */\n link: RoutePath\n /** Visual theme: \"brand\" for primary, \"alt\" for secondary */\n theme?: \"alt\" | \"brand\"\n /** Optional icon as ReactNode (e.g. Lucide icon component) */\n icon?: ReactNode\n}\n\nexport interface ArdoHeroImage {\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 ArdoHeroProps {\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?: ArdoHeroImage | string\n /** Call-to-action buttons */\n actions?: ArdoHeroAction[]\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 */\nfunction HeroActionButton({ action }: { action: ArdoHeroAction }) {\n const link = action.link\n const isExternal =\n typeof link === \"string\" && (link.startsWith(\"http://\") || link.startsWith(\"https://\"))\n const cls = `${styles.heroAction} ${action.theme === \"alt\" ? styles.heroActionAlt : styles.heroActionBrand}`\n const content = (\n <>\n {action.icon}\n {action.text}\n </>\n )\n\n if (isExternal) {\n return (\n <a href={link} className={cls} target=\"_blank\" rel=\"noopener noreferrer\">\n {content}\n </a>\n )\n }\n return (\n <Link to={link} className={cls}>\n {content}\n </Link>\n )\n}\n\nfunction resolveHeroImage(image: ArdoHeroProps[\"image\"], name: string | undefined) {\n const url = typeof image === \"string\" ? image : (image?.light ?? \"\")\n const alt = typeof image === \"string\" ? (name ?? \"\") : (image?.alt ?? name ?? \"\")\n return { url, alt }\n}\n\nexport function ArdoHero({\n name,\n text,\n tagline,\n image,\n actions,\n className,\n version,\n}: ArdoHeroProps) {\n const img = resolveHeroImage(image, name)\n\n return (\n <section className={className ?? styles.hero}>\n <div className={`${styles.heroContainer} ${styles.heroAnimate}`}>\n {img.url !== \"\" && (\n <div>\n <img src={img.url} alt={img.alt} />\n </div>\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 {(actions?.length ?? 0) > 0 && (\n <div className={styles.heroActions}>\n {actions?.map((action) => {\n const key =\n typeof action.link === \"string\" ? `${action.link}-${action.text}` : action.text\n return <HeroActionButton key={key} action={action} />\n })}\n </div>\n )}\n </div>\n </div>\n </section>\n )\n}\n","import type { ReactNode } from \"react\"\n\nimport { Link } from \"react-router\"\n\nimport { useArdoConfig, useArdoPageData } from \"../runtime/hooks\"\nimport { ArdoFeatureCard, ArdoFeatures } from \"./components/Features\"\nimport * as heroStyles from \"./components/Hero.css\"\nimport { ArdoFooter, type ArdoFooterProps } from \"./Footer\"\nimport { ArdoHeader, type ArdoHeaderProps } from \"./Header\"\nimport * as layoutStyles from \"./Layout.css\"\n\nexport interface ArdoHomePageProps {\n /** Props passed to the Header component */\n headerProps?: ArdoHeaderProps\n /** Props passed to the Footer component */\n footerProps?: ArdoFooterProps\n /** Custom header element (overrides auto-generated header) */\n header?: ReactNode\n /** Custom footer element (overrides auto-generated footer) */\n footer?: ReactNode\n}\n\nfunction HomeHeroSection({\n hero,\n fallbackTitle,\n}: {\n hero: NonNullable<ReturnType<typeof useArdoPageData>>[\"frontmatter\"][\"hero\"]\n fallbackTitle: string\n}) {\n if (hero === undefined) return null\n const heroImage = hero.image\n const heroActions = hero.actions ?? []\n const heroName = hero.name ?? \"\"\n return (\n <section className={heroStyles.hero}>\n <div className={heroStyles.heroContainer}>\n {heroImage !== undefined && (\n <div>\n <img\n src={typeof heroImage === \"string\" ? heroImage : heroImage.light}\n alt={heroName !== \"\" ? heroName : fallbackTitle}\n />\n </div>\n )}\n <div>\n {heroName !== \"\" && <h1 className={heroStyles.heroName}>{heroName}</h1>}\n {(hero.text ?? \"\") !== \"\" && <p className={heroStyles.heroText}>{hero.text}</p>}\n {(hero.tagline ?? \"\") !== \"\" && <p className={heroStyles.heroTagline}>{hero.tagline}</p>}\n {heroActions.length > 0 && (\n <div className={heroStyles.heroActions}>\n {heroActions.map((action) => (\n <Link\n key={`${action.link}-${action.text}`}\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\nfunction HomeFeaturesSection({\n features,\n}: {\n features: NonNullable<ReturnType<typeof useArdoPageData>>[\"frontmatter\"][\"features\"]\n}) {\n const safeFeatures = features ?? []\n if (safeFeatures.length === 0) return null\n return (\n <ArdoFeatures>\n {safeFeatures.map((feature) => (\n <ArdoFeatureCard\n key={feature.link ?? feature.title}\n title={feature.title}\n icon={feature.icon}\n link={feature.link}\n linkText={feature.linkText}\n >\n {feature.details}\n </ArdoFeatureCard>\n ))}\n </ArdoFeatures>\n )\n}\n\nexport function ArdoHomePage({ headerProps, footerProps, header, footer }: ArdoHomePageProps = {}) {\n const pageData = useArdoPageData()\n const config = useArdoConfig()\n\n return (\n <div className={layoutStyles.home}>\n {header ?? <ArdoHeader title={config.title} {...headerProps} />}\n <main className={layoutStyles.homeMain}>\n <HomeHeroSection hero={pageData?.frontmatter.hero} fallbackTitle={config.title} />\n <HomeFeaturesSection features={pageData?.frontmatter.features} />\n </main>\n {footer ?? <ArdoFooter {...footerProps} />}\n </div>\n )\n}\n","import { type ComponentProps, createContext, type ReactNode, use, useMemo, useState } from \"react\"\nimport { NavLink as RouterNavLink } from \"react-router\"\n\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 use(NavContext)\n}\n\n// =============================================================================\n// Nav Component\n// =============================================================================\n\nexport interface ArdoNavProps {\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 ArdoNav({ children, className }: ArdoNavProps) {\n return <nav className={className ?? styles.nav}>{children}</nav>\n}\n\n// =============================================================================\n// NavLink Component\n// =============================================================================\n\nexport interface ArdoNavLinkProps {\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 ArdoNavLink({\n to,\n href,\n children,\n className,\n activeMatch: _activeMatch,\n}: ArdoNavLinkProps) {\n const navContext = useNavContext()\n const baseClassName = className ?? styles.navLink\n const hasHref = (href ?? \"\") !== \"\"\n const hasTo = to !== undefined\n\n // Handle click for mobile menu\n const handleClick = () => {\n navContext?.setMobileMenuOpen(false)\n }\n\n // External link\n if (hasHref) {\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 (hasTo) {\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 const contextValue = useMemo(() => ({ mobileMenuOpen, setMobileMenuOpen }), [mobileMenuOpen])\n\n return <NavContext value={contextValue}>{children}</NavContext>\n}\n\n// Export context hook for external use\nexport { useNavContext }\n"],"mappings":"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"}
|
package/dist/vite/index.d.ts
CHANGED
|
@@ -1,97 +1,91 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
|
|
5
|
-
interface ArdoRoutesPluginOptions {
|
|
6
|
-
/** Directory where routes are located (default: "./app/routes") */
|
|
7
|
-
routesDir?: string;
|
|
8
|
-
}
|
|
9
|
-
/**
|
|
10
|
-
* Vite plugin that generates routes.ts for React Router Framework Mode.
|
|
11
|
-
* Scans app/routes for .mdx and .tsx files and generates the route configuration.
|
|
12
|
-
*/
|
|
13
|
-
declare function ardoRoutesPlugin(options?: ArdoRoutesPluginOptions): Plugin;
|
|
1
|
+
import { a as PageData, c as ResolvedConfig, f as TOCItem, l as SidebarItem, o as PageFrontmatter, r as MarkdownConfig, t as ArdoConfig } from "../types-DVodb4lK.js";
|
|
2
|
+
import { Highlighter } from "shiki";
|
|
3
|
+
import { Plugin } from "vite";
|
|
14
4
|
|
|
5
|
+
//#region src/markdown/shiki.d.ts
|
|
6
|
+
type ShikiHighlighter = Highlighter;
|
|
15
7
|
/**
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
*
|
|
19
|
-
* Use this in `react-router.config.ts` to synchronize client-side routing
|
|
20
|
-
* with the Vite `base` path that Ardo auto-detects:
|
|
21
|
-
*
|
|
22
|
-
* ```ts
|
|
23
|
-
* import { detectGitHubBasename } from "ardo/vite"
|
|
24
|
-
*
|
|
25
|
-
* export default {
|
|
26
|
-
* ssr: false,
|
|
27
|
-
* prerender: true,
|
|
28
|
-
* basename: detectGitHubBasename(),
|
|
29
|
-
* } satisfies Config
|
|
30
|
-
* ```
|
|
8
|
+
* Highlights code using Shiki with Ardo's default themes.
|
|
9
|
+
* Creates and caches a highlighter instance for reuse.
|
|
31
10
|
*/
|
|
32
|
-
declare function
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
/**
|
|
43
|
-
* Directory where routes are located.
|
|
44
|
-
* @default "./app/routes"
|
|
45
|
-
*/
|
|
46
|
-
routesDir?: string;
|
|
11
|
+
declare function highlightCode(code: string, language: string, options?: {
|
|
12
|
+
theme?: MarkdownConfig["theme"];
|
|
13
|
+
}): Promise<string>;
|
|
14
|
+
declare function createShikiHighlighter(config: MarkdownConfig): Promise<ShikiHighlighter>;
|
|
15
|
+
//#endregion
|
|
16
|
+
//#region src/markdown/pipeline.d.ts
|
|
17
|
+
interface TransformResult {
|
|
18
|
+
html: string;
|
|
19
|
+
frontmatter: PageFrontmatter;
|
|
20
|
+
toc: TOCItem[];
|
|
47
21
|
}
|
|
48
|
-
|
|
49
|
-
|
|
22
|
+
interface TransformOptions {
|
|
23
|
+
basePath?: string;
|
|
24
|
+
highlighter?: ShikiHighlighter;
|
|
25
|
+
}
|
|
26
|
+
declare function transformMarkdown(content: string, config: MarkdownConfig, options?: TransformOptions): Promise<TransformResult>;
|
|
27
|
+
declare function transformMarkdownToReact(content: string, config: MarkdownConfig): Promise<TransformResult>;
|
|
28
|
+
//#endregion
|
|
29
|
+
//#region src/runtime/loader.d.ts
|
|
50
30
|
interface LoadDocOptions {
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
31
|
+
slug: string;
|
|
32
|
+
contentDir: string;
|
|
33
|
+
config: ResolvedConfig;
|
|
54
34
|
}
|
|
55
35
|
interface LoadDocResult {
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
36
|
+
content: string;
|
|
37
|
+
frontmatter: PageFrontmatter;
|
|
38
|
+
toc: TOCItem[];
|
|
39
|
+
filePath: string;
|
|
40
|
+
relativePath: string;
|
|
41
|
+
lastUpdated?: number;
|
|
62
42
|
}
|
|
63
43
|
declare function loadDoc(options: LoadDocOptions): Promise<LoadDocResult | null>;
|
|
64
44
|
declare function loadAllDocs(contentDir: string, config: ResolvedConfig): Promise<PageData[]>;
|
|
65
45
|
declare function getSlugFromPath(relativePath: string): string;
|
|
66
46
|
declare function getPageDataForRoute(docs: PageData[], slug: string): PageData | undefined;
|
|
67
|
-
|
|
47
|
+
//#endregion
|
|
48
|
+
//#region src/runtime/sidebar.d.ts
|
|
68
49
|
interface SidebarGenerationOptions {
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
50
|
+
basePath: string;
|
|
51
|
+
config: ResolvedConfig;
|
|
52
|
+
contentDir: string;
|
|
72
53
|
}
|
|
73
54
|
declare function generateSidebar(options: SidebarGenerationOptions): Promise<SidebarItem[]>;
|
|
74
|
-
|
|
75
|
-
|
|
55
|
+
//#endregion
|
|
56
|
+
//#region src/vite/git-utils.d.ts
|
|
76
57
|
/**
|
|
77
|
-
*
|
|
78
|
-
*
|
|
58
|
+
* Detects the GitHub Pages basename from the git remote URL.
|
|
59
|
+
* Returns "/" in dev mode or when no GitHub repo is detected.
|
|
79
60
|
*/
|
|
80
|
-
declare function
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
html: string;
|
|
87
|
-
frontmatter: PageFrontmatter;
|
|
88
|
-
toc: TOCItem[];
|
|
61
|
+
declare function detectGitHubBasename(cwd?: string): string;
|
|
62
|
+
//#endregion
|
|
63
|
+
//#region src/vite/routes-plugin.d.ts
|
|
64
|
+
interface ArdoRoutesPluginOptions {
|
|
65
|
+
/** Directory where routes are located (default: "./app/routes") */
|
|
66
|
+
routesDir?: string;
|
|
89
67
|
}
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
68
|
+
/**
|
|
69
|
+
* Vite plugin that generates routes.ts for React Router Framework Mode.
|
|
70
|
+
*/
|
|
71
|
+
declare function ardoRoutesPlugin(options?: ArdoRoutesPluginOptions): Plugin;
|
|
72
|
+
//#endregion
|
|
73
|
+
//#region src/vite/plugin.d.ts
|
|
74
|
+
interface ArdoPluginOptions extends Partial<ArdoConfig> {
|
|
75
|
+
/** Options for the routes generator plugin */
|
|
76
|
+
routes?: ArdoRoutesPluginOptions | false;
|
|
77
|
+
/**
|
|
78
|
+
* Auto-detect GitHub repository and set base path for GitHub Pages.
|
|
79
|
+
* @default true
|
|
80
|
+
*/
|
|
81
|
+
githubPages?: boolean;
|
|
82
|
+
/**
|
|
83
|
+
* Directory where routes are located.
|
|
84
|
+
* @default "./app/routes"
|
|
85
|
+
*/
|
|
86
|
+
routesDir?: string;
|
|
93
87
|
}
|
|
94
|
-
declare function
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
88
|
+
declare function ardoPlugin(options?: ArdoPluginOptions): Plugin[];
|
|
89
|
+
//#endregion
|
|
90
|
+
export { type ArdoPluginOptions, type ArdoRoutesPluginOptions, type LoadDocOptions, type LoadDocResult, type ShikiHighlighter, type SidebarGenerationOptions, type TransformResult, ardoPlugin as ardo, ardoPlugin, ardoPlugin as default, ardoRoutesPlugin, createShikiHighlighter, detectGitHubBasename, generateSidebar, getPageDataForRoute, getSlugFromPath, highlightCode, loadAllDocs, loadDoc, transformMarkdown, transformMarkdownToReact };
|
|
91
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","names":[],"sources":["../../src/markdown/shiki.ts","../../src/markdown/pipeline.ts","../../src/runtime/loader.ts","../../src/runtime/sidebar.ts","../../src/vite/git-utils.ts","../../src/vite/routes-plugin.ts","../../src/vite/plugin.ts"],"mappings":";;;;;KASY,gBAAA,GAAmB,WAAA;AAA/B;;;;AAAA,iBAQsB,aAAA,CACpB,IAAA,UACA,QAAA,UACA,OAAA;EAAY,KAAA,GAAQ,cAAA;AAAA,IACnB,OAAA;AAAA,iBAyBmB,sBAAA,CAAuB,MAAA,EAAQ,cAAA,GAAiB,OAAA,CAAQ,gBAAA;;;UChC7D,eAAA;EACf,IAAA;EACA,WAAA,EAAa,eAAA;EACb,GAAA,EAAK,OAAA;AAAA;AAAA,UAGU,gBAAA;EACf,QAAA;EACA,WAAA,GAAc,gBAAA;AAAA;AAAA,iBAGM,iBAAA,CACpB,OAAA,UACA,MAAA,EAAQ,cAAA,EACR,OAAA,GAAS,gBAAA,GACR,OAAA,CAAQ,eAAA;AAAA,iBAsCW,wBAAA,CACpB,OAAA,UACA,MAAA,EAAQ,cAAA,GACP,OAAA,CAAQ,eAAA;;;UC/DM,cAAA;EACf,IAAA;EACA,UAAA;EACA,MAAA,EAAQ,cAAA;AAAA;AAAA,UAGO,aAAA;EACf,OAAA;EACA,WAAA,EAAa,eAAA;EACb,GAAA,EAAK,OAAA;EACL,QAAA;EACA,YAAA;EACA,WAAA;AAAA;AAAA,iBAgCoB,OAAA,CAAQ,OAAA,EAAS,cAAA,GAAiB,OAAA,CAAQ,aAAA;AAAA,iBAgB1C,WAAA,CAAY,UAAA,UAAoB,MAAA,EAAQ,cAAA,GAAiB,OAAA,CAAQ,QAAA;AAAA,iBA8CvE,eAAA,CAAgB,YAAA;AAAA,iBAOhB,mBAAA,CAAoB,IAAA,EAAM,QAAA,IAAY,IAAA,WAAe,QAAA;;;UChHpD,wBAAA;EACf,QAAA;EACA,MAAA,EAAQ,cAAA;EACR,UAAA;AAAA;AAAA,iBAaoB,eAAA,CAAgB,OAAA,EAAS,wBAAA,GAA2B,OAAA,CAAQ,WAAA;;;;;;;iBC2BlE,oBAAA,CAAqB,GAAA;;;UC7CpB,uBAAA;;EAEf,SAAA;AAAA;ALCF;;;AAAA,iBKWgB,gBAAA,CAAiB,OAAA,GAAS,uBAAA,GAA+B,MAAA;;;UC+BxD,iBAAA,SAA0B,OAAA,CAAQ,UAAA;EN1CvC;EM4CV,MAAA,GAAS,uBAAA;;;;ANpCX;EMyCE,WAAA;;;;;EAKA,SAAA;AAAA;AAAA,iBAKc,UAAA,CAAW,OAAA,GAAS,iBAAA,GAAyB,MAAA"}
|