@domphy/press 0.19.1 → 0.20.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/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/config.ts","../src/build.ts","../src/highlight.ts","../src/layout.ts","../src/routes.ts","../src/pipeline.ts","../src/search.ts","../src/theme.ts","../src/serve.ts"],"sourcesContent":["import type { SiteConfig } from \"./types.js\"\n\nexport type { SiteConfig }\n\nexport type UserConfig = Omit<SiteConfig, \"base\" | \"srcDir\" | \"outDir\" | \"head\"> & {\n base?: string\n srcDir?: string\n outDir?: string\n head?: string[]\n}\n\nexport function defineConfig(config: UserConfig): SiteConfig {\n return {\n base: \"/\",\n srcDir: \".\",\n outDir: \"dist\",\n head: [],\n ...config,\n themeConfig: Object.assign({ nav: [], sidebar: {} }, config.themeConfig),\n }\n}\n","// DomphyPress static site generator.\n// Pipeline: discover pages → renderDoc → layout → renderToString → HTML.\n// Extras: islands bundle, search index, sitemap, git last-updated, locales.\n\nimport {\n cpSync, existsSync, mkdirSync, readFileSync, rmSync, writeFileSync,\n} from \"node:fs\"\nimport { dirname, join, relative, resolve } from \"node:path\"\nimport { fileURLToPath } from \"node:url\"\nimport { execSync } from \"node:child_process\"\nimport { createApp, defineRoutes } from \"@domphy/app\"\nimport { themeCSS } from \"@domphy/theme\"\nimport type * as EsbuildType from \"esbuild\"\nimport { createHighlighter } from \"./highlight.js\"\nimport { homeShell, type LayoutContext, pageShell } from \"./layout.js\"\nimport { renderDoc } from \"./pipeline.js\"\nimport { discoverPages } from \"./routes.js\"\nimport { buildSearchIndex } from \"./search.js\"\nimport { pressCSS } from \"./theme.js\"\nimport type { SiteConfig } from \"./types.js\"\n\nconst here = dirname(fileURLToPath(import.meta.url))\n\n// --- Utilities ---------------------------------------------------------------\n\nfunction flattenText(node: unknown, out: string[]): void {\n if (node == null) return\n if (typeof node === \"string\") {\n if (!node.trimStart().startsWith(\"<\")) out.push(node)\n return\n }\n if (typeof node === \"number\") { out.push(String(node)); return }\n if (Array.isArray(node)) { for (const child of node) flattenText(child, out); return }\n if (typeof node === \"object\") {\n for (const [key, value] of Object.entries(node as Record<string, unknown>)) {\n if (key.startsWith(\"_\") || key === \"$\" || key === \"style\") continue\n if (key === \"class\" || key.startsWith(\"data\") || key === \"href\" || key === \"id\") continue\n flattenText(value, out)\n }\n }\n}\n\nfunction parseStyleString(value: string): Record<string, string> {\n const style: Record<string, string> = {}\n for (const decl of value.split(\";\")) {\n const colon = decl.indexOf(\":\")\n if (colon === -1) continue\n const prop = decl.slice(0, colon).trim()\n const val = decl.slice(colon + 1).trim()\n if (!prop || !val) continue\n style[prop.replace(/-([a-z])/g, (_m, c: string) => c.toUpperCase())] = val\n }\n return style\n}\n\nfunction sanitizeStyles(node: unknown): void {\n if (Array.isArray(node)) { for (const child of node) sanitizeStyles(child); return }\n if (!node || typeof node !== \"object\") return\n const record = node as Record<string, unknown>\n if (typeof record.style === \"string\") record.style = parseStyleString(record.style)\n for (const value of Object.values(record)) {\n if (value && (typeof value === \"object\" || Array.isArray(value))) sanitizeStyles(value)\n }\n}\n\nfunction firstParagraphText(body: unknown[]): string {\n for (const node of body) {\n if (!node || typeof node !== \"object\" || Array.isArray(node)) continue\n const record = node as Record<string, unknown>\n if (\"p\" in record) {\n const parts: string[] = []\n flattenText(record.p, parts)\n const text = parts.join(\" \").replace(/\\s+/g, \" \").trim()\n if (text.length > 10) return text.slice(0, 160)\n }\n }\n return \"\"\n}\n\nfunction estimateReadingTime(textContent: string): number {\n return Math.max(1, Math.round(textContent.split(/\\s+/).length / 200))\n}\n\nfunction getLastUpdated(filePath: string): string | undefined {\n try {\n const result = execSync(`git log -1 --format=\"%aI\" -- \"${filePath}\"`, {\n encoding: \"utf8\", stdio: [\"pipe\", \"pipe\", \"ignore\"], timeout: 5000,\n }).trim()\n return result || undefined\n } catch {\n return undefined\n }\n}\n\n// --- Islands bundle ----------------------------------------------------------\n\nasync function buildIslandsBundle(outDir: string, searchEnabled: boolean): Promise<void> {\n if (!searchEnabled) return\n const islandsSource = join(here, \"islands.js\")\n const entrySource = `import{bootstrap}from${JSON.stringify(islandsSource)};bootstrap({search:{kind:\"search\",id:\"search\"}});`\n const tmpEntry = join(outDir, \"_press_islands_entry.js\")\n mkdirSync(outDir, { recursive: true })\n writeFileSync(tmpEntry, entrySource, \"utf8\")\n const { build: esbuildBuild } = await import(\"esbuild\") as typeof EsbuildType\n await esbuildBuild({\n entryPoints: { \"press-islands\": tmpEntry },\n bundle: true, splitting: false, format: \"esm\",\n outdir: join(outDir, \"assets\"), entryNames: \"[name]\",\n minify: true, sourcemap: false, target: \"es2020\",\n define: { \"process.env.NODE_ENV\": '\"production\"' }, logLevel: \"error\",\n })\n rmSync(tmpEntry)\n}\n\n// --- Sitemap -----------------------------------------------------------------\n\nfunction buildSitemap(routes: string[], hostname: string): string {\n const urls = routes.map(route => {\n const loc = route === \"/\" ? `${hostname}/` : `${hostname}${route}`.replace(/\\/+$/, \"\") + \"/\"\n return ` <url><loc>${loc}</loc></url>`\n })\n return `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\\n<urlset xmlns=\"http://www.sitemaps.org/schemas/sitemap/0.9\">\\n${urls.join(\"\\n\")}\\n</urlset>`\n}\n\n// --- HTML document -----------------------------------------------------------\n\nconst RUNTIME_SCRIPT = `(function(){\ntry{var t=localStorage.getItem('dp-theme');if(t)document.documentElement.setAttribute('data-theme',t);}catch(_){}\naddEventListener('click',function(e){\n var el=e.target.closest&&e.target.closest('[data-theme-toggle]');\n if(el){var d=document.documentElement;var n=d.getAttribute('data-theme')==='dark'?'':'dark';d.setAttribute('data-theme',n);try{localStorage.setItem('dp-theme',n);}catch(_){}return;}\n var m=e.target.closest&&e.target.closest('[data-menu-toggle]');\n if(m){var d2=document.documentElement;d2.setAttribute('data-sidebar',d2.getAttribute('data-sidebar')==='open'?'':'open');return;}\n var cp=e.target.closest&&e.target.closest('[data-copy]');\n if(cp){var ci=cp.closest('.code-block-inner');var ce=ci&&ci.querySelector('code');if(ce){navigator.clipboard&&navigator.clipboard.writeText(ce.textContent||'').then(function(){cp.textContent='✓';setTimeout(function(){cp.textContent='⎘';},2000);}).catch(function(){});}return;}\n var st=e.target.closest&&e.target.closest('[data-sidebar-toggle]');\n if(st){var gr=st.closest('.dp-sidebar-group');if(gr)gr.classList.toggle('collapsed');return;}\n var da=e.target.closest&&e.target.closest('[data-dismiss-announcement]');\n if(da){var bar=document.querySelector('.dp-announcement');if(bar){var id=bar.getAttribute('data-id');if(id)try{localStorage.setItem('dp-dismiss-'+id,'1');}catch(_){}bar.remove();}return;}\n});\naddEventListener('DOMContentLoaded',function(){\n try{document.querySelectorAll('.dp-announcement[data-id]').forEach(function(b){if(localStorage.getItem('dp-dismiss-'+b.getAttribute('data-id')))b.remove();});}catch(_){}\n});\n})();`\n\nfunction mermaidHeadScript(mermaid: boolean | { cdn?: string }): string {\n const cdn = typeof mermaid === \"object\" && mermaid.cdn\n ? mermaid.cdn\n : \"https://cdn.jsdelivr.net/npm/mermaid@11/dist/mermaid.esm.min.mjs\"\n return `<script type=\"module\">import mermaid from '${cdn}';mermaid.initialize({startOnLoad:false,theme:document.documentElement.getAttribute('data-theme')==='dark'?'dark':'default'});document.addEventListener('DOMContentLoaded',()=>mermaid.run({querySelector:'.dp-mermaid'}));</script>`\n}\n\nfunction htmlDocument(\n result: { html: string; css: string; head: string; status: number },\n config: SiteConfig,\n searchEnabled: boolean,\n generatedCss: string,\n pageHead: string[],\n lang: string,\n): string {\n const islandsScript = searchEnabled ? `\\n<script type=\"module\" src=\"${config.base}assets/press-islands.js\"></script>` : \"\"\n const mermaidScript = config.themeConfig.mermaid ? mermaidHeadScript(config.themeConfig.mermaid) : \"\"\n return `<!DOCTYPE html>\n<html lang=\"${lang}\">\n<head>\n<meta charset=\"utf-8\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n${result.head}\n${config.head.join(\"\\n\")}\n${pageHead.join(\"\\n\")}\n${mermaidScript}\n<style>${generatedCss}</style>\n<style id=\"domphy-style\">${result.css}</style>\n<script>${RUNTIME_SCRIPT}</script>\n</head>\n<body>\n<div id=\"domphy-app\">${result.html}</div>${islandsScript}\n</body>\n</html>`\n}\n\n// --- Main build --------------------------------------------------------------\n\nexport interface BuildOptions {\n config: SiteConfig\n srcDir: string\n outDir: string\n publicDir?: string\n}\n\nexport async function buildSite(options: BuildOptions): Promise<void> {\n const { config, srcDir, outDir, publicDir } = options\n const searchEnabled = config.themeConfig.search !== false\n const showLastUpdated = !!config.lastUpdated\n\n // Discover pages: root + locales\n const pages = discoverPages(srcDir)\n const localePages: Array<{ filePath: string; route: string; outFile: string; localeKey: string }> = pages.map(p => ({ ...p, localeKey: \"/\" }))\n if (config.locales) {\n for (const [localeKey, locale] of Object.entries(config.locales)) {\n if (localeKey === \"/\") continue\n const localeDir = resolve(srcDir, localeKey.replace(/^\\//, \"\").replace(/\\/$/, \"\"))\n if (!existsSync(localeDir)) continue\n for (const p of discoverPages(localeDir)) {\n const prefix = localeKey.replace(/\\/$/, \"\")\n localePages.push({ filePath: p.filePath, route: prefix + p.route, outFile: p.outFile === \"index.html\" ? localeKey.replace(/^\\//, \"\") + \"index.html\" : localeKey.replace(/^\\//, \"\") + p.outFile, localeKey })\n }\n }\n }\n console.log(`Discovered ${localePages.length} pages.`)\n\n const highlight = await createHighlighter()\n const generatedCss = themeCSS() + pressCSS()\n\n // 1. Render markdown → Domphy docs\n const built: Array<{\n route: string; outFile: string; title: string; localeKey: string\n doc: Awaited<ReturnType<typeof renderDoc>>\n lastUpdated: string | undefined\n readingTime: number\n filePath: string\n relPath: string\n }> = []\n const searchDocs = []\n\n for (const page of localePages) {\n const source = readFileSync(page.filePath, \"utf8\")\n const doc = await renderDoc(source, { filePath: page.filePath, docsDir: srcDir, repoRoot: srcDir, highlight })\n if (doc.frontmatter.draft === true) {\n console.log(` ↷ ${page.route} (draft, skipped)`)\n continue\n }\n sanitizeStyles(doc.body)\n const textParts: string[] = []\n flattenText(doc.body, textParts)\n const textContent = textParts.join(\" \").replace(/\\s+/g, \" \").trim()\n const readingTime = estimateReadingTime(textContent)\n const lastUpdated = showLastUpdated ? getLastUpdated(page.filePath) : undefined\n const relPath = relative(srcDir, page.filePath).replace(/\\\\/g, \"/\")\n\n built.push({ route: page.route, outFile: page.outFile, title: doc.title, localeKey: page.localeKey, doc, lastUpdated, readingTime, filePath: page.filePath, relPath })\n searchDocs.push({ route: page.route, title: doc.title, text: textContent.slice(0, 20000), toc: doc.toc })\n }\n\n // Per-page metadata maps (route → head strings / lang code)\n const pageHeadMap = new Map<string, string[]>()\n const pageLangMap = new Map<string, string>()\n\n // 2. Define @domphy/app routes\n const appRoutes = defineRoutes(\n built.map(page => {\n const localeConfig = config.locales?.[page.localeKey]\n const mergedTheme = localeConfig?.themeConfig\n ? { ...config.themeConfig, ...localeConfig.themeConfig }\n : config.themeConfig\n const mergedConfig: SiteConfig = { ...config, themeConfig: mergedTheme }\n const lang = localeConfig?.lang ?? \"en\"\n const ctx: LayoutContext = {\n route: page.route, title: page.title,\n body: page.doc.body, toc: page.doc.toc,\n frontmatter: page.doc.frontmatter, config: mergedConfig,\n lastUpdated: page.lastUpdated, readingTime: page.readingTime,\n filePath: page.relPath,\n }\n const isHome = page.route === \"/\" || (page.localeKey !== \"/\" && page.route === page.localeKey)\n const description = typeof page.doc.frontmatter.description === \"string\"\n ? page.doc.frontmatter.description\n : firstParagraphText(page.doc.body) || config.description\n const siteTitle = localeConfig?.title ?? config.title\n const pageTitle = page.title === siteTitle ? siteTitle : `${page.title} | ${siteTitle}`\n const canonical = page.route === \"/\" ? `${config.hostname}/` : `${config.hostname}${page.route}/`\n // Store per-page head and lang for use during HTML serialization\n const pageHead = Array.isArray(page.doc.frontmatter.head)\n ? (page.doc.frontmatter.head as string[]).filter(s => typeof s === \"string\")\n : []\n pageHeadMap.set(page.route, pageHead)\n pageLangMap.set(page.route, lang)\n return {\n path: page.route,\n metadata: {\n title: pageTitle, description, metadataBase: config.hostname,\n openGraph: { title: pageTitle, description, url: page.route === \"/\" ? \"/\" : `${page.route}/`, siteName: siteTitle, type: \"website\" as const },\n twitter: { card: \"summary\" as const, title: pageTitle, description },\n alternates: { canonical },\n },\n page: () => isHome ? homeShell(ctx) : pageShell(ctx),\n }\n }),\n )\n const app = createApp(appRoutes)\n\n // 3. Render each route to static HTML\n rmSync(outDir, { recursive: true, force: true })\n mkdirSync(outDir, { recursive: true })\n\n const failures: Array<{ route: string; error: string }> = []\n let totalBytes = 0\n for (const page of built) {\n try {\n const result = await app.renderToString(page.route)\n const pageHead = pageHeadMap.get(page.route) ?? []\n const lang = pageLangMap.get(page.route) ?? \"en\"\n const html = htmlDocument(result, config, searchEnabled, generatedCss, pageHead, lang)\n const outPath = join(outDir, page.outFile)\n mkdirSync(dirname(outPath), { recursive: true })\n writeFileSync(outPath, html, \"utf8\")\n totalBytes += html.length\n if (result.status !== 200) console.warn(` ! ${page.route} -> status ${result.status}`)\n } catch (error) {\n failures.push({ route: page.route, error: String((error as Error).message || error) })\n }\n }\n if (failures.length > 0) {\n console.warn(`\\n${failures.length} page(s) failed:`)\n for (const failure of failures) console.warn(` ✗ ${failure.route}: ${failure.error}`)\n }\n\n // 4. Islands bundle\n await buildIslandsBundle(outDir, searchEnabled)\n\n // 5. Search index\n writeFileSync(join(outDir, \"search-index.json\"), buildSearchIndex(searchDocs), \"utf8\")\n\n // 6. Public dir\n if (publicDir && existsSync(publicDir)) cpSync(publicDir, outDir, { recursive: true })\n\n // 7. Sitemap\n if (config.hostname) {\n writeFileSync(join(outDir, \"sitemap.xml\"), buildSitemap(built.map(p => p.route), config.hostname), \"utf8\")\n }\n\n console.log(`Built ${built.length} pages (${(totalBytes / 1024).toFixed(0)} KB) → ${outDir}`)\n}\n","import { type BundledLanguage, createHighlighter as createShiki } from \"shiki\"\n\nconst THEME = \"github-light\"\n\nconst LANGUAGES: BundledLanguage[] = [\n \"typescript\", \"javascript\", \"tsx\", \"jsx\",\n \"json\", \"bash\", \"shellscript\", \"html\", \"css\",\n \"vue\", \"svelte\", \"markdown\", \"diff\", \"yaml\", \"ruby\", \"python\", \"go\", \"rust\", \"sql\",\n]\n\nconst ALIASES: Record<string, string> = {\n ts: \"typescript\", js: \"javascript\", sh: \"bash\", shell: \"bash\",\n zsh: \"bash\", md: \"markdown\", yml: \"yaml\", htm: \"html\", rb: \"ruby\", py: \"python\",\n}\n\nlet pending: ReturnType<typeof createShiki> | null = null\n\nexport function escapeHtml(text: string): string {\n return text.replace(/&/g, \"&amp;\").replace(/</g, \"&lt;\").replace(/>/g, \"&gt;\").replace(/\"/g, \"&quot;\")\n}\n\nfunction unwrapCode(html: string): string {\n const match = html.match(/<code[^>]*>([\\s\\S]*)<\\/code>/)\n return match ? match[1] : html\n}\n\n// --- Fence info parsing -------------------------------------------------------\n\nexport interface FenceMeta {\n lang: string\n highlightLines: Set<number>\n lineNumbers: boolean\n title: string | null\n}\n\nexport function parseFenceInfo(info: string): FenceMeta {\n const rawLang = (info.match(/^(\\S+)/) ?? [])[1] ?? \"\"\n const lang = ALIASES[rawLang.toLowerCase()] ?? rawLang.toLowerCase()\n const lineNumbers = info.includes(\":line-numbers\")\n // Title: [text] where text contains non-digit chars (to not conflict with line range labels)\n const titleMatch = info.match(/\\[([^\\]]*[a-zA-Z.][^\\]]*)\\]/)\n const title = titleMatch ? titleMatch[1] : null\n const rangeMatch = info.match(/\\{([0-9,\\s\\-]+)\\}/)\n const highlightLines = new Set<number>()\n if (rangeMatch) {\n for (const part of rangeMatch[1].split(\",\")) {\n const range = part.trim().split(\"-\").map(Number)\n if (range.length === 1 && !isNaN(range[0])) highlightLines.add(range[0])\n else if (range.length === 2) for (let i = range[0]; i <= range[1]; i++) highlightLines.add(i)\n }\n }\n return { lang, highlightLines, lineNumbers, title }\n}\n\n// --- [!code ...] annotation extraction ----------------------------------------\n\nconst CODE_ANNOTATION_RE = /\\s*\\/\\/ \\[!code ([^\\]]+)\\]\\s*$/\n\nconst ANNOTATION_CLASSES: Record<string, string> = {\n \"++\": \"diff add\",\n \"--\": \"diff remove\",\n highlight: \"highlighted\",\n focus: \"focus\",\n error: \"highlighted error\",\n warning: \"highlighted warning\",\n}\n\ninterface Annotations {\n cleanCode: string\n lineClasses: Map<number, string>\n hasFocus: boolean\n}\n\nfunction extractAnnotations(code: string): Annotations {\n const lines = code.split(\"\\n\")\n const lineClasses = new Map<number, string>()\n const cleanLines: string[] = []\n let hasFocus = false\n\n for (const line of lines) {\n const match = CODE_ANNOTATION_RE.exec(line)\n if (match) {\n const keyword = match[1].trim()\n const cls = ANNOTATION_CLASSES[keyword]\n if (cls) {\n if (cls.includes(\"focus\")) hasFocus = true\n lineClasses.set(cleanLines.length + 1, cls)\n }\n cleanLines.push(line.replace(CODE_ANNOTATION_RE, \"\"))\n } else {\n cleanLines.push(line)\n }\n }\n return { cleanCode: cleanLines.join(\"\\n\"), lineClasses, hasFocus }\n}\n\n// --- Post-process shiki HTML --------------------------------------------------\n\nfunction annotateLines(\n html: string,\n lineClasses: Map<number, string>,\n highlightLines: Set<number>,\n hasFocus: boolean,\n lineNumbers: boolean,\n): string {\n let lineIndex = 0\n return html.replace(/<span class=\"line\">/g, () => {\n lineIndex++\n const annotationCls = lineClasses.get(lineIndex) ?? \"\"\n const classes = [\"line\"]\n if (annotationCls) classes.push(...annotationCls.split(\" \"))\n else if (highlightLines.has(lineIndex)) classes.push(\"highlighted\")\n if (hasFocus && !annotationCls.includes(\"focus\")) classes.push(\"dimmed\")\n const numHtml = lineNumbers ? `<span class=\"line-number\">${lineIndex}</span>` : \"\"\n return `${numHtml}<span class=\"${classes.join(\" \")}\">`\n })\n}\n\n// --- Public API ---------------------------------------------------------------\n\nexport async function createHighlighter(): Promise<(code: string, lang: string) => string> {\n if (!pending) pending = createShiki({ themes: [THEME], langs: LANGUAGES })\n const highlighter = await pending\n const loaded = new Set(highlighter.getLoadedLanguages())\n return (code: string, lang: string): string => {\n const resolved = ALIASES[lang?.toLowerCase()] ?? lang?.toLowerCase()\n if (!resolved || !loaded.has(resolved)) return escapeHtml(code)\n return unwrapCode(highlighter.codeToHtml(code, { lang: resolved, theme: THEME }))\n }\n}\n\n// renderFence: converts one fence block to HTML with title, copy button, line annotations.\nexport function renderFence(\n code: string,\n info: string,\n highlight: (code: string, lang: string) => string,\n): string {\n const { lang, highlightLines, lineNumbers, title } = parseFenceInfo(info)\n\n if (lang === \"mermaid\") {\n return `<div class=\"dp-mermaid language-mermaid\">${escapeHtml(code.trim())}</div>`\n }\n\n const { cleanCode, lineClasses, hasFocus } = extractAnnotations(code)\n const innerHtml = highlight(cleanCode.trimEnd(), lang)\n const annotated = annotateLines(innerHtml, lineClasses, highlightLines, hasFocus, lineNumbers)\n const hasAnnotations = highlightLines.size > 0 || lineClasses.size > 0\n const titleHtml = title ? `<div class=\"code-block-title\"><span>${escapeHtml(title)}</span></div>` : \"\"\n const preClass = [\n lineNumbers ? \"line-numbers\" : \"\",\n hasAnnotations ? \"has-annotations\" : \"\",\n hasFocus ? \"has-focus\" : \"\",\n ].filter(Boolean).join(\" \")\n const langClass = lang ? `language-${lang}` : \"\"\n return `<div class=\"code-block ${langClass}\">${titleHtml}<div class=\"code-block-inner\"><pre class=\"${preClass}\"><code>${annotated}</code></pre><button class=\"code-copy-btn\" type=\"button\" aria-label=\"Copy code\" data-copy>⎘</button></div></div>`\n}\n","// Page shell: header, sidebar, content, TOC aside, prev/next, footer.\n// Features: social links, edit link, last updated, sidebar collapsible,\n// announcement bar, reading time, page badges. Takes SiteConfig as param.\n\nimport { navLink } from \"@domphy/app\"\nimport type { DomphyElement } from \"@domphy/core\"\nimport { toolbar, toolbarSpacer } from \"@domphy/ui\"\nimport { prevNextForRoute, sidebarForRoute } from \"./routes.js\"\nimport type { SidebarItem, SiteConfig, SocialLink, TocEntry } from \"./types.js\"\n\nexport interface LayoutContext {\n route: string\n title: string\n body: DomphyElement[]\n toc: TocEntry[]\n frontmatter: Record<string, unknown>\n config: SiteConfig\n /** ISO date string from git log, if lastUpdated:true and git available. */\n lastUpdated?: string\n /** Estimated reading time in minutes. */\n readingTime?: number\n /** Relative path from srcDir (e.g. \"guide/index.md\"), used for editLink. */\n filePath?: string\n}\n\n// --- Social icons -------------------------------------------------------\n\nconst SOCIAL_LABELS: Record<string, string> = {\n github: \"GitHub\", twitter: \"Twitter\", discord: \"Discord\",\n youtube: \"YouTube\", linkedin: \"LinkedIn\", mastodon: \"Mastodon\",\n npm: \"npm\", bluesky: \"Bluesky\",\n}\n\nfunction socialLinkEl(social: SocialLink): DomphyElement {\n const name = social.icon.toLowerCase()\n const isUrl = social.icon.startsWith(\"http\") || social.icon.startsWith(\"/\")\n const innerEl: DomphyElement = isUrl\n ? { img: null, src: social.icon, alt: social.ariaLabel ?? name, width: \"18\", height: \"18\" } as DomphyElement\n : { span: \"\", class: `dp-social-icon dp-icon-${name}`, ariaHidden: \"true\" } as DomphyElement\n return {\n a: [innerEl],\n href: social.link,\n class: `dp-social-link dp-social-${name}`,\n ariaLabel: social.ariaLabel ?? SOCIAL_LABELS[name] ?? social.icon,\n target: \"_blank\",\n rel: \"noopener noreferrer\",\n } as DomphyElement\n}\n\n// --- Page link helper -------------------------------------------------------\n\nfunction pageLink(text: string, href: string, className?: string): DomphyElement {\n return { a: text, href, class: className, $: [navLink({ href })] } as DomphyElement\n}\n\n// --- Nav dropdown ----------------------------------------------------------\n\nfunction navDropdown(item: { text: string; items: { text: string; link: string }[] }): DomphyElement {\n return {\n div: [\n { span: item.text, class: \"dp-nav-dropdown-label\" },\n { div: item.items.map(child => pageLink(child.text, child.link)), class: \"dp-nav-dropdown-menu\" },\n ],\n class: \"dp-nav-dropdown\",\n }\n}\n\n// --- Announcement bar -------------------------------------------------------\n\nfunction announcementBar(config: SiteConfig): DomphyElement | null {\n const bar = config.themeConfig.announcementBar\n if (!bar) return null\n const idAttr = bar.id ? bar.id : \"\"\n const children: DomphyElement[] = [\n { span: bar.text, class: \"dp-announcement-text\" } as DomphyElement,\n ]\n if (bar.dismissible !== false) {\n children.push({ button: \"✕\", type: \"button\", class: \"dp-announcement-close\", dataDismissAnnouncement: \"\", ariaLabel: \"Dismiss\" } as DomphyElement)\n }\n return {\n div: children,\n class: \"dp-announcement\",\n ...(idAttr ? { dataId: idAttr } : {}),\n } as DomphyElement\n}\n\n// --- Locale switcher --------------------------------------------------------\n\nfunction localeSwitcher(ctx: LayoutContext): DomphyElement | null {\n const { config, route } = ctx\n if (!config.locales) return null\n const entries = Object.entries(config.locales)\n if (entries.length <= 1) return null\n\n let currentKey = \"/\"\n let barePath = route\n for (const [key] of entries) {\n if (key !== \"/\" && route.startsWith(key.replace(/\\/$/, \"\"))) {\n currentKey = key\n barePath = route.slice(key.replace(/\\/$/, \"\").length) || \"/\"\n break\n }\n }\n const currentLocale = config.locales[currentKey]\n if (!currentLocale) return null\n\n const links: DomphyElement[] = entries.map(([key, locale]) => {\n const prefix = key === \"/\" ? \"\" : key.replace(/\\/$/, \"\")\n const href = prefix + (barePath === \"/\" ? \"/\" : barePath)\n return {\n a: locale.label,\n href,\n class: `dp-locale-option${key === currentKey ? \" active\" : \"\"}`,\n ...(key === currentKey ? { ariaCurrent: \"true\" } : {}),\n lang: locale.lang,\n } as DomphyElement\n })\n\n return {\n div: [\n { span: [\"🌐 \", currentLocale.label], class: \"dp-locale-current\" },\n { div: links, class: \"dp-locale-menu\" },\n ],\n class: \"dp-locale-switcher\",\n ariaLabel: \"Select language\",\n } as DomphyElement\n}\n\n// --- Header -----------------------------------------------------------------\n\nfunction header(ctx: LayoutContext): DomphyElement {\n const { config } = ctx\n const searchEnabled = config.themeConfig.search !== false\n const logo = config.themeConfig.logo\n const logoInner: DomphyElement[] = logo\n ? (typeof logo === \"string\"\n ? [{ img: null, src: logo, alt: config.title, class: \"dp-logo-img\" } as DomphyElement]\n : [\n { img: null, src: logo.light, alt: config.title, class: \"dp-logo-img dp-logo-light\" } as DomphyElement,\n { img: null, src: logo.dark, alt: config.title, class: \"dp-logo-img dp-logo-dark\" } as DomphyElement,\n ])\n : []\n const logoEl: DomphyElement = logo\n ? { a: logoInner, href: config.base, class: \"dp-logo\" } as DomphyElement\n : { a: config.title, href: config.base, class: \"dp-logo\" } as DomphyElement\n\n const socialEls: DomphyElement[] = (config.themeConfig.socialLinks ?? []).map(socialLinkEl)\n const localeEl = localeSwitcher(ctx)\n\n return {\n header: [\n logoEl,\n toolbarSpacer(),\n {\n nav: config.themeConfig.nav.map(item =>\n item.items ? navDropdown(item as { text: string; items: { text: string; link: string }[] }) : pageLink(item.text, item.link!),\n ),\n $: [toolbar({ gap: 4 })],\n class: \"dp-nav\",\n ariaLabel: \"Primary\",\n },\n {\n div: [\n ...(searchEnabled ? [{\n div: [{\n input: null, type: \"search\",\n placeholder: (typeof config.themeConfig.search === \"object\" && config.themeConfig.search.placeholder) || \"Search...\",\n class: \"dp-search-static\", ariaLabel: \"Search documentation\",\n }],\n dataIsland: \"search\",\n class: \"dp-search-slot\",\n } as DomphyElement] : []),\n ...socialEls,\n ...(localeEl ? [localeEl] : []),\n { button: \"◐\", type: \"button\", class: \"dp-theme-toggle\", ariaLabel: \"Toggle dark mode\", dataThemeToggle: \"\" },\n { button: \"☰\", type: \"button\", class: \"dp-menu-toggle\", ariaLabel: \"Toggle menu\", dataMenuToggle: \"\" },\n ],\n $: [toolbar({ gap: 2 })],\n class: \"dp-header-actions\",\n },\n ],\n $: [toolbar({ gap: 4 })],\n class: \"dp-header\",\n }\n}\n\n// --- Sidebar ----------------------------------------------------------------\n\nfunction sidebarBadge(badge: NonNullable<SidebarItem[\"badge\"]>): DomphyElement {\n return { span: badge.text, class: `dp-badge dp-badge-${badge.type ?? \"tip\"}` } as DomphyElement\n}\n\nfunction pageLinkWithBadge(text: string, href: string, badge?: SidebarItem[\"badge\"]): DomphyElement {\n if (!badge) return pageLink(text, href)\n return {\n a: [{ span: text }, sidebarBadge(badge)],\n href, $: [navLink({ href })],\n class: \"dp-sidebar-link-with-badge\",\n } as DomphyElement\n}\n\nfunction sidebarGroup(group: SidebarItem): DomphyElement {\n const children: DomphyElement[] = []\n const isCollapsible = group.items && group.items.length > 0\n\n if (group.link) {\n children.push(pageLinkWithBadge(group.text, group.link, group.badge))\n } else {\n const titleChildren: DomphyElement[] = [\n { span: group.text } as DomphyElement,\n ]\n if (group.badge) titleChildren.push(sidebarBadge(group.badge))\n if (isCollapsible) {\n titleChildren.push({\n button: group.collapsed ? \"›\" : \"‹\",\n type: \"button\",\n class: \"dp-sidebar-toggle\",\n ariaLabel: group.collapsed ? \"Expand\" : \"Collapse\",\n dataSidebarToggle: \"\",\n } as DomphyElement)\n }\n children.push({ div: titleChildren, class: \"dp-sidebar-title\" } as DomphyElement)\n }\n\n if (group.items) {\n const itemsEl: DomphyElement[] = []\n for (const item of group.items) {\n if (item.items) {\n itemsEl.push({ div: item.text, class: \"dp-sidebar-subtitle\" } as DomphyElement)\n for (const leaf of item.items) {\n if (leaf.link) itemsEl.push(pageLinkWithBadge(leaf.text, leaf.link, leaf.badge))\n }\n } else if (item.link) {\n itemsEl.push(pageLinkWithBadge(item.text, item.link, item.badge))\n }\n }\n children.push({ div: itemsEl, class: \"dp-sidebar-items\" } as DomphyElement)\n }\n\n const groupClass = [\"dp-sidebar-group\", isCollapsible && group.collapsed ? \"collapsed\" : \"\"].filter(Boolean).join(\" \")\n return { div: children, class: groupClass } as DomphyElement\n}\n\nfunction sidebar(ctx: LayoutContext): DomphyElement {\n const groups = sidebarForRoute(ctx.route, ctx.config)\n return { nav: groups.map(sidebarGroup), class: \"dp-sidebar\", ariaLabel: \"Documentation\" }\n}\n\n// --- TOC aside --------------------------------------------------------------\n\nfunction tocAside(ctx: LayoutContext): DomphyElement | null {\n if (ctx.frontmatter.aside === false) return null\n const [minLevel, maxLevel] = ctx.config.themeConfig.outline?.level ?? [2, 3]\n const entries = ctx.toc.filter(e => e.level >= minLevel && e.level <= maxLevel)\n if (entries.length === 0) return null\n const tocTitle = ctx.config.themeConfig.tocTitle ?? \"On this page\"\n return {\n aside: [\n { div: tocTitle, class: \"dp-aside-title\" },\n { nav: entries.map(e => ({ a: e.text, href: `#${e.slug}`, class: `dp-toc-${e.level}` })), class: \"dp-toc\" },\n ],\n class: \"dp-aside\",\n }\n}\n\n// --- Prev/next ---------------------------------------------------------------\n\nfunction prevNext(ctx: LayoutContext): DomphyElement | null {\n const { prev, next } = prevNextForRoute(ctx.route, ctx.config)\n if (!prev && !next) return null\n return {\n nav: [\n prev ? { a: [{ small: \"Previous\" }, { span: prev.text }], href: prev.link, class: \"prev\" } : { span: \"\" },\n next ? { a: [{ small: \"Next\" }, { span: next.text }], href: next.link, class: \"next\" } : { span: \"\" },\n ],\n class: \"dp-prevnext\", ariaLabel: \"Page navigation\",\n }\n}\n\n// --- Edit link + last updated -----------------------------------------------\n\nfunction docFooter(ctx: LayoutContext): DomphyElement | null {\n const { editLink } = ctx.config.themeConfig\n const showLastUpdated = ctx.config.lastUpdated\n const hasEdit = editLink && ctx.filePath\n const hasDate = showLastUpdated && ctx.lastUpdated\n if (!hasEdit && !hasDate && !ctx.readingTime) return null\n\n const children: DomphyElement[] = []\n\n if (hasDate) {\n const date = new Date(ctx.lastUpdated!)\n const formatted = date.toLocaleDateString(\"en-US\", { year: \"numeric\", month: \"long\", day: \"numeric\" })\n children.push({ span: [`Last updated: `, { time: formatted, dateTime: ctx.lastUpdated, class: \"dp-last-updated-date\" }], class: \"dp-last-updated\" } as DomphyElement)\n }\n if (ctx.readingTime) {\n children.push({ span: `${ctx.readingTime} min read`, class: \"dp-reading-time\" } as DomphyElement)\n }\n if (hasEdit) {\n const pattern = editLink!.pattern\n const href = pattern.replace(/:path/g, ctx.filePath!)\n children.push({ a: editLink!.text ?? \"Edit this page\", href, class: \"dp-edit-link\", target: \"_blank\", rel: \"noopener noreferrer\" } as DomphyElement)\n }\n return { div: children, class: \"dp-doc-footer\" }\n}\n\n// --- Page badge (Starlight-style) from frontmatter --------------------------\n\nfunction pageBadge(frontmatter: Record<string, unknown>): DomphyElement | null {\n const badge = frontmatter.badge as { text?: string; type?: string } | string | undefined\n if (!badge) return null\n const text = typeof badge === \"string\" ? badge : badge.text ?? \"\"\n const type = typeof badge === \"object\" ? badge.type ?? \"tip\" : \"tip\"\n if (!text) return null\n return { span: text, class: `dp-badge dp-badge-${type} dp-page-badge` } as DomphyElement\n}\n\n// --- Shells -----------------------------------------------------------------\n\nexport function pageShell(ctx: LayoutContext): DomphyElement {\n const main: DomphyElement[] = []\n const badge = pageBadge(ctx.frontmatter)\n if (badge) main.push({ div: [badge], class: \"dp-page-badge-row\" })\n main.push({ div: ctx.body, class: \"dp-content\" })\n const pn = prevNext(ctx)\n if (pn) main.push(pn)\n const footer = docFooter(ctx)\n if (footer) main.push(footer)\n const shellChildren: DomphyElement[] = [sidebar(ctx), { main, class: \"dp-main\" }]\n const aside = tocAside(ctx)\n if (aside) shellChildren.push(aside)\n const bar = announcementBar(ctx.config)\n return {\n div: [\n ...(bar ? [bar] : []),\n header(ctx),\n { div: shellChildren, class: \"dp-shell\" },\n { footer: ctx.config.themeConfig.footerMessage ?? \"\", class: \"dp-footer\" },\n ],\n }\n}\n\ninterface HeroConfig {\n name?: string\n text?: string\n tagline?: string\n actions?: Array<{ theme?: string; text: string; link: string }>\n}\n\ninterface FeatureConfig {\n title: string\n details: string\n icon?: string\n link?: string\n}\n\nfunction heroSection(hero: HeroConfig): DomphyElement {\n const children: DomphyElement[] = []\n if (hero.name) children.push({ div: hero.name, class: \"dp-hero-name\" })\n if (hero.text) children.push({ h1: hero.text, class: \"dp-hero-text\" })\n if (hero.tagline) children.push({ p: hero.tagline, class: \"dp-hero-tagline\" })\n if (hero.actions?.length) {\n children.push({ div: hero.actions.map(a => ({ a: a.text, href: a.link, class: `dp-hero-action ${a.theme ?? \"brand\"}` })), class: \"dp-hero-actions\" })\n }\n return { section: children, class: \"dp-hero\" }\n}\n\nfunction featuresSection(features: FeatureConfig[]): DomphyElement {\n return {\n div: features.map(f => {\n const inner: DomphyElement[] = []\n if (f.icon) inner.push({ div: f.icon, class: \"dp-feature-icon\" })\n inner.push({ div: f.title, class: \"dp-feature-title\" })\n inner.push({ p: f.details, class: \"dp-feature-details\" })\n const el: DomphyElement = { div: inner, class: \"dp-feature\" }\n return f.link ? ({ a: [el], href: f.link, class: \"dp-feature-link\" } as DomphyElement) : el\n }),\n class: \"dp-features\",\n }\n}\n\nexport function homeShell(ctx: LayoutContext): DomphyElement {\n const main: DomphyElement[] = []\n const hero = ctx.frontmatter.hero as HeroConfig | undefined\n const features = ctx.frontmatter.features as FeatureConfig[] | undefined\n if (hero) main.push(heroSection(hero))\n if (features?.length) main.push(featuresSection(features))\n main.push({ div: ctx.body, class: \"dp-content dp-home\" })\n const bar = announcementBar(ctx.config)\n return {\n div: [\n ...(bar ? [bar] : []),\n header(ctx),\n { main, class: \"dp-main dp-main-home\" },\n { footer: ctx.config.themeConfig.footerMessage ?? \"\", class: \"dp-footer\" },\n ],\n }\n}\n","import { readdirSync, statSync } from \"node:fs\"\nimport { join, posix, relative, sep } from \"node:path\"\nimport type { PageEntry, SidebarItem, SiteConfig } from \"./types.js\"\n\nconst NON_PAGE_DIRS = new Set([\"snippets\", \"demos\", \"node_modules\", \".git\"])\n\nexport function routeForFile(srcRelativePath: string): string {\n const posixPath = srcRelativePath.split(sep).join(posix.sep)\n const withoutExt = posixPath.replace(/\\.md$/, \"\")\n const segments = withoutExt.split(\"/\")\n const last = segments[segments.length - 1]\n if (last === \"index\") {\n segments.pop()\n return segments.length === 0 ? \"/\" : `/${segments.join(\"/\")}/`\n }\n return `/${segments.join(\"/\")}`\n}\n\nexport function outFileForRoute(route: string): string {\n if (route === \"/\") return \"index.html\"\n const trimmed = route.replace(/^\\/+/, \"\").replace(/\\/+$/, \"\")\n return `${trimmed}/index.html`\n}\n\nfunction listMarkdown(dir: string): string[] {\n const found: string[] = []\n for (const name of readdirSync(dir)) {\n const full = join(dir, name)\n const stats = statSync(full)\n if (stats.isDirectory()) {\n if (NON_PAGE_DIRS.has(name) || name.startsWith(\".\")) continue\n found.push(...listMarkdown(full))\n } else if (name.endsWith(\".md\") && name.toLowerCase() !== \"readme.md\") {\n found.push(full)\n }\n }\n return found\n}\n\nexport function discoverPages(srcDir: string): PageEntry[] {\n const files = listMarkdown(srcDir)\n const pages = files.map((filePath): PageEntry => {\n const rel = relative(srcDir, filePath)\n const route = routeForFile(rel)\n return { route, outFile: outFileForRoute(route), filePath }\n })\n pages.sort((a, b) => a.route.localeCompare(b.route))\n return pages\n}\n\nexport function flattenSidebar(items: SidebarItem[]): { text: string; link: string }[] {\n const out: { text: string; link: string }[] = []\n for (const item of items) {\n if (item.link) out.push({ text: item.text, link: item.link })\n if (item.items) out.push(...flattenSidebar(item.items))\n }\n return out\n}\n\nexport function sidebarForRoute(route: string, config: SiteConfig): SidebarItem[] {\n let bestPrefix = \"\"\n for (const prefix of Object.keys(config.themeConfig.sidebar)) {\n if (route.startsWith(prefix) && prefix.length > bestPrefix.length) {\n bestPrefix = prefix\n }\n }\n return bestPrefix ? config.themeConfig.sidebar[bestPrefix] : []\n}\n\nexport function prevNextForRoute(\n route: string,\n config: SiteConfig,\n): { prev?: { text: string; link: string }; next?: { text: string; link: string } } {\n const flat = flattenSidebar(sidebarForRoute(route, config))\n const index = flat.findIndex(\n (item) =>\n item.link === route ||\n item.link === route.replace(/\\/$/, \"\") ||\n `${item.link}/` === route,\n )\n if (index === -1) return {}\n return {\n prev: index > 0 ? flat[index - 1] : undefined,\n next: index < flat.length - 1 ? flat[index + 1] : undefined,\n }\n}\n","// Markdown pipeline: VitePress-baseline markdown → Domphy element tree.\n// Containers, <<< imports, frontmatter, TOC, line highlights, external links.\n\nimport { readFileSync } from \"node:fs\"\nimport { dirname, extname, isAbsolute, resolve } from \"node:path\"\nimport type { DomphyElement } from \"@domphy/core\"\nimport { type MarkdownItToken, splitFrontmatter, tokensToDomphy } from \"@domphy/markdown\"\nimport MarkdownIt from \"markdown-it\"\nimport container from \"markdown-it-container\"\n// @ts-expect-error -- no bundled types\nimport markUntyped from \"markdown-it-mark\"\n// @ts-expect-error -- no bundled types\nimport subUntyped from \"markdown-it-sub\"\n// @ts-expect-error -- no bundled types\nimport supUntyped from \"markdown-it-sup\"\n// @ts-expect-error -- no bundled types\nimport includeUntyped from \"markdown-it-include\"\n// @ts-expect-error -- no bundled types\nimport emojiPkg from \"markdown-it-emoji\"\nimport { escapeHtml, renderFence } from \"./highlight.js\"\nimport type { RenderDocOptions, RenderedDoc, TocEntry } from \"./types.js\"\n\ntype CoreState = { tokens: MarkdownItToken[] }\ntype MdPlugin = (md: MarkdownIt) => void\nconst include = includeUntyped as (md: MarkdownIt, options: { root: string }) => void\nconst markPlugin = markUntyped as MdPlugin\nconst subPlugin = subUntyped as MdPlugin\nconst supPlugin = supUntyped as MdPlugin\n// markdown-it-emoji@3.x exports { bare, full, light } — use the full set\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst emojiPlugin = ((emojiPkg as any).full ?? emojiPkg) as MdPlugin\n\n// --- <<< code imports --------------------------------------------------------\n\nconst CODE_IMPORT_PATTERN = /^<<<\\s+(\\S+?)(?:\\s+\\[([^\\]]*)\\])?\\s*$/gm\n\nconst EXT_LANG: Record<string, string> = {\n \".ts\": \"ts\", \".tsx\": \"tsx\", \".js\": \"js\", \".jsx\": \"jsx\",\n \".mjs\": \"js\", \".cjs\": \"js\", \".json\": \"json\", \".css\": \"css\",\n \".html\": \"html\", \".vue\": \"vue\", \".md\": \"markdown\",\n \".sh\": \"bash\", \".bash\": \"bash\", \".yml\": \"yaml\", \".yaml\": \"yaml\",\n \".rb\": \"ruby\", \".py\": \"python\", \".go\": \"go\", \".rs\": \"rust\",\n}\n\nfunction resolveSpecifier(spec: string, fileDir: string, docsDir: string): string {\n if (spec.startsWith(\"@/\")) return resolve(dirname(docsDir), spec.slice(2))\n if (isAbsolute(spec)) return spec\n return resolve(fileDir, spec)\n}\n\nfunction expandCodeImports(body: string, fileDir: string, docsDir: string): string {\n return body.replace(CODE_IMPORT_PATTERN, (_whole, rawPath: string, label?: string) => {\n const absolute = resolveSpecifier(rawPath, fileDir, docsDir)\n const fence = \"```\"\n let contents: string\n try { contents = readFileSync(absolute, \"utf8\") }\n catch { return [fence, `Could not import: ${rawPath}`, fence].join(\"\\n\") }\n const language = EXT_LANG[extname(absolute).toLowerCase()] ?? \"\"\n const info = label ? `${language} [${label}]` : language\n return [fence + info, contents.trimEnd(), fence].join(\"\\n\")\n })\n}\n\n// --- Strip <script> blocks ---------------------------------------------------\n\nfunction stripScriptBlocks(source: string): string {\n return source.replace(/<script\\b[^>]*>[\\s\\S]*?<\\/script>/gi, \"\").replace(/^\\s*\\n/, \"\")\n}\n\n// --- Container token shaping -------------------------------------------------\n\nconst ADMONITION_TITLES: Record<string, string> = {\n tip: \"TIP\", warning: \"WARNING\", info: \"INFO\", danger: \"DANGER\",\n note: \"NOTE\", abstract: \"ABSTRACT\", success: \"SUCCESS\",\n question: \"QUESTION\", failure: \"FAILURE\", bug: \"BUG\",\n example: \"EXAMPLE\", quote: \"QUOTE\",\n}\n\nfunction containerTitle(info: string, type: string): string {\n return info.slice(info.indexOf(type) + type.length).trim()\n}\n\nfunction buildTitleTokens(\n Token: new (type: string, tag: string, nesting: number) => MarkdownItToken,\n tag: string, openType: string, closeType: string, className: string | null, title: string,\n): MarkdownItToken[] {\n const open = new Token(openType, tag, 1)\n open.block = true\n if (className) open.attrSet(\"class\", className)\n const inline = new Token(\"inline\", \"\", 0)\n inline.content = title\n inline.children = []\n const text = new Token(\"text\", \"\", 0)\n text.content = title\n inline.children.push(text)\n const close = new Token(closeType, tag, -1)\n close.block = true\n return [open, inline, close]\n}\n\nfunction buildHtmlBlock(Token: new (type: string, tag: string, nesting: number) => MarkdownItToken, content: string): MarkdownItToken {\n const token = new Token(\"html_block\", \"\", 0)\n token.content = content\n token.block = true\n return token\n}\n\nfunction buildCodeGroupTokens(\n Token: new (type: string, tag: string, nesting: number) => MarkdownItToken,\n tokens: MarkdownItToken[], openIndex: number, closeIndex: number, groupId: number,\n): MarkdownItToken[] {\n const open = tokens[openIndex]\n open.tag = \"div\"\n open.attrSet(\"class\", \"code-group\")\n const close = tokens[closeIndex]\n close.tag = \"div\"\n\n const fences: Array<{ token: MarkdownItToken; label: string }> = []\n for (let i = openIndex + 1; i < closeIndex; i++) {\n const token = tokens[i]\n if (token.type !== \"fence\") continue\n const info = (token.info ?? \"\").trim()\n const labelMatch = info.match(/\\[([^\\]]+)\\]/)\n const language = info.split(/\\s+/, 1)[0] ?? \"\"\n fences.push({ token, label: labelMatch ? labelMatch[1] : language || \"Code\" })\n }\n\n if (fences.length === 0) return tokens.slice(openIndex, closeIndex + 1)\n\n // Inputs as direct children of .code-group (before .tabs) — enables CSS :checked sibling selector\n const inputsHtml = fences.map((_, i) =>\n `<input type=\"radio\" name=\"cg-${groupId}\" id=\"cgt-${groupId}-${i}\"${i === 0 ? \" checked\" : \"\"}>`\n ).join(\"\")\n const labelsHtml = fences.map((fence, i) =>\n `<label for=\"cgt-${groupId}-${i}\">${escapeHtml(fence.label)}</label>`\n ).join(\"\")\n\n const inner: MarkdownItToken[] = [\n buildHtmlBlock(Token, `${inputsHtml}<div class=\"tabs\">${labelsHtml}</div>`),\n buildHtmlBlock(Token, `<div class=\"blocks\">`),\n ]\n fences.forEach((fence) => {\n fence.token.info = (fence.token.info ?? \"\").replace(/\\[[^\\]]*\\]/, \"\").trim()\n inner.push(fence.token)\n })\n inner.push(buildHtmlBlock(Token, `</div>`))\n return [open, ...inner, close]\n}\n\nfunction shapeContainers(tokens: MarkdownItToken[]): MarkdownItToken[] {\n if (tokens.length === 0) return tokens\n const Token = tokens[0].constructor as new (type: string, tag: string, nesting: number) => MarkdownItToken\n const output: MarkdownItToken[] = []\n let groupCounter = 0\n\n const ALL_ADMONITIONS = Object.keys(ADMONITION_TITLES).join(\"|\")\n const admonitionRe = new RegExp(`^container_(${ALL_ADMONITIONS})_open$`)\n const admonitionCloseRe = new RegExp(`^container_(${ALL_ADMONITIONS})_close$`)\n\n for (let i = 0; i < tokens.length; i++) {\n const token = tokens[i]\n const admonition = token.type.match(admonitionRe)\n if (admonition) {\n const type = admonition[1]\n token.tag = \"div\"\n token.attrSet(\"class\", `custom-block ${type}`)\n const custom = containerTitle(token.info.trim(), type)\n output.push(token)\n output.push(...buildTitleTokens(Token, \"p\", \"paragraph_open\", \"paragraph_close\", \"custom-block-title\", custom || ADMONITION_TITLES[type] || type.toUpperCase()))\n continue\n }\n if (admonitionCloseRe.test(token.type)) { token.tag = \"div\"; output.push(token); continue }\n if (token.type === \"container_details_open\") {\n token.tag = \"details\"; token.attrSet(\"class\", \"custom-block details\")\n output.push(token)\n output.push(...buildTitleTokens(Token, \"summary\", \"summary_open\", \"summary_close\", null, containerTitle(token.info.trim(), \"details\") || \"Details\"))\n continue\n }\n if (token.type === \"container_details_close\") { token.tag = \"details\"; output.push(token); continue }\n if (token.type === \"container_steps_open\") {\n token.tag = \"div\"; token.attrSet(\"class\", \"custom-block steps\")\n output.push(token); continue\n }\n if (token.type === \"container_steps_close\") { token.tag = \"div\"; output.push(token); continue }\n if (token.type === \"container_card-grid_open\") {\n token.tag = \"div\"; token.attrSet(\"class\", \"custom-block card-grid\")\n output.push(token); continue\n }\n if (token.type === \"container_card-grid_close\") { token.tag = \"div\"; output.push(token); continue }\n if (token.type === \"container_card_open\") {\n token.tag = \"div\"; token.attrSet(\"class\", \"custom-block card\")\n const title = containerTitle(token.info.trim(), \"card\")\n output.push(token)\n if (title) output.push(...buildTitleTokens(Token, \"p\", \"paragraph_open\", \"paragraph_close\", \"card-title\", title))\n continue\n }\n if (token.type === \"container_card_close\") { token.tag = \"div\"; output.push(token); continue }\n if (token.type === \"container_link-card_open\") {\n const info = token.info.trim().slice(\"link-card\".length).trim()\n const linkMatch = info.match(/^\\[([^\\]]+)\\]\\(([^)]+)\\)/)\n const href = linkMatch ? linkMatch[2] : \"#\"\n const title = linkMatch ? linkMatch[1] : info\n token.tag = \"a\"; token.attrSet(\"class\", \"custom-block link-card\"); token.attrSet(\"href\", href)\n output.push(token)\n if (title) output.push(...buildTitleTokens(Token, \"p\", \"paragraph_open\", \"paragraph_close\", \"link-card-title\", title))\n continue\n }\n if (token.type === \"container_link-card_close\") { token.tag = \"a\"; output.push(token); continue }\n if (token.type === \"container_code-group_open\") {\n let depth = 0, closeIndex = -1\n for (let j = i; j < tokens.length; j++) {\n if (tokens[j].type === \"container_code-group_open\") depth++\n else if (tokens[j].type === \"container_code-group_close\") { depth--; if (depth === 0) { closeIndex = j; break } }\n }\n if (closeIndex === -1) { output.push(token); continue }\n output.push(...buildCodeGroupTokens(Token, tokens, i, closeIndex, groupCounter++))\n i = closeIndex; continue\n }\n output.push(token)\n }\n return output\n}\n\n// --- Task list detection (GFM-style) -----------------------------------------\n\nfunction shapeTaskLists(tokens: MarkdownItToken[]): MarkdownItToken[] {\n if (tokens.length === 0) return tokens\n const Token = tokens[0].constructor as new (type: string, tag: string, nesting: number) => MarkdownItToken\n for (let i = 1; i < tokens.length; i++) {\n const token = tokens[i]\n if (token.type !== \"inline\" || !token.children?.length) continue\n const prev = tokens[i - 1]\n if (prev?.type !== \"list_item_open\") continue\n const firstChild = token.children[0]\n if (firstChild.type !== \"text\") continue\n const text = firstChild.content\n const isTask = text.startsWith(\"[ ] \") || text.startsWith(\"[x] \") || text.startsWith(\"[X] \")\n if (!isTask) continue\n const checked = text[1].toLowerCase() === \"x\"\n firstChild.content = text.slice(4)\n token.content = token.content.replace(/^\\[[ xX]\\] /, \"\")\n prev.attrSet(\"class\", ((prev.attrGet(\"class\") ?? \"\") + \" task-list-item\").trim())\n const checkToken = new Token(\"html_inline\", \"\", 0)\n checkToken.content = `<input type=\"checkbox\"${checked ? \" checked\" : \"\"} disabled class=\"task-list-check\" aria-label=\"${checked ? \"done\" : \"todo\"}\">`\n token.children.unshift(checkToken)\n }\n return tokens\n}\n\n// --- Parser ------------------------------------------------------------------\n\nfunction createParser(docsDir: string, highlight: (code: string, lang: string) => string): MarkdownIt {\n const md = new MarkdownIt({ html: true, linkify: true, typographer: false })\n md.enable([\"strikethrough\", \"table\"])\n md.use(include, { root: docsDir })\n md.use(markPlugin)\n md.use(subPlugin)\n md.use(supPlugin)\n md.use(emojiPlugin)\n const noopRender = () => \"\"\n const ADMONITION_NAMES = Object.keys(ADMONITION_TITLES)\n for (const name of [...ADMONITION_NAMES, \"details\", \"code-group\", \"steps\", \"card\", \"card-grid\", \"link-card\"]) {\n // biome-ignore lint/suspicious/noExplicitAny: markdown-it-container type mismatch\n md.use(container as any, name, { render: noopRender })\n }\n md.core.ruler.push(\"press_containers\", (state: CoreState) => {\n state.tokens = shapeContainers(state.tokens)\n return true\n })\n md.core.ruler.push(\"press_task_lists\", (state: CoreState) => {\n state.tokens = shapeTaskLists(state.tokens)\n return true\n })\n // Convert fence tokens → html_block with full rendering (line highlights, copy button)\n md.core.ruler.push(\"press_fences\", (state: CoreState) => {\n for (const token of state.tokens) {\n if (token.type !== \"fence\") continue\n const html = renderFence(token.content, token.info ?? \"\", highlight)\n token.type = \"html_block\"\n token.content = html\n token.tag = \"\"\n }\n return true\n })\n // External links: add target=_blank + rel=noopener\n md.core.ruler.push(\"press_external_links\", (state: CoreState) => {\n for (const token of state.tokens) {\n if (token.type !== \"inline\" || !token.children) continue\n for (const child of token.children) {\n if (child.type !== \"link_open\") continue\n const href = child.attrGet(\"href\") ?? \"\"\n if (href.startsWith(\"http://\") || href.startsWith(\"https://\")) {\n child.attrSet(\"target\", \"_blank\")\n child.attrSet(\"rel\", \"noopener noreferrer\")\n }\n }\n }\n return true\n })\n // Images: add loading=lazy\n md.core.ruler.push(\"press_image_lazy\", (state: CoreState) => {\n for (const token of state.tokens) {\n if (token.type !== \"inline\" || !token.children) continue\n for (const child of token.children) {\n if (child.type === \"image\") child.attrSet(\"loading\", \"lazy\")\n }\n }\n return true\n })\n return md\n}\n\n// --- Title resolution --------------------------------------------------------\n\nfunction titleFromFilePath(filePath: string): string {\n const base = filePath.split(/[\\\\/]/).pop() ?? filePath\n const name = base.replace(/\\.md$/i, \"\")\n if (name.toLowerCase() === \"index\") {\n const parts = filePath.split(/[\\\\/]/).filter(Boolean)\n return parts[parts.length - 2] ?? name\n }\n return name\n}\n\nfunction firstH1(toc: TocEntry[]): string | undefined {\n return toc.find(e => e.level === 1)?.text\n}\n\n// --- Public API --------------------------------------------------------------\n\n// Inject visual anchor link into heading elements after tokensToDomphy.\nfunction injectHeadingAnchors(elements: DomphyElement[]): DomphyElement[] {\n return elements.map(el => {\n if (!el || typeof el !== \"object\" || Array.isArray(el)) return el\n const rec = el as Record<string, unknown>\n const tag = Object.keys(rec).find(k => /^h[1-6]$/.test(k))\n if (tag && typeof rec.id === \"string\") {\n const id = rec.id\n const children = Array.isArray(rec[tag]) ? [...(rec[tag] as DomphyElement[])] : rec[tag] != null ? [rec[tag] as DomphyElement] : []\n children.push({ a: \"#\", href: `#${id}`, class: \"header-anchor\", ariaHidden: \"true\" } as DomphyElement)\n return { ...rec, [tag]: children } as DomphyElement\n }\n const tag2 = Object.keys(rec).find(k => /^[a-z][a-z0-9]*$/.test(k) && k !== \"style\" && k !== \"class\" && !k.startsWith(\"data\") && !k.startsWith(\"on\") && !k.startsWith(\"aria\") && !k.startsWith(\"_\") && k !== \"$\" && k !== \"href\" && k !== \"src\" && k !== \"id\" && k !== \"type\" && k !== \"name\")\n if (tag2 && Array.isArray(rec[tag2])) {\n return { ...rec, [tag2]: injectHeadingAnchors(rec[tag2] as DomphyElement[]) } as DomphyElement\n }\n return el\n })\n}\n\nexport async function renderDoc(source: string, options: RenderDocOptions): Promise<RenderedDoc> {\n const { filePath, docsDir, highlight } = options\n const fileDir = dirname(filePath)\n const { frontmatter, content } = splitFrontmatter(source)\n const stripped = stripScriptBlocks(content)\n const expanded = expandCodeImports(stripped, fileDir, docsDir)\n const md = createParser(docsDir, highlight)\n const tokens = md.parse(expanded, {}) as MarkdownItToken[]\n const { body, toc } = tokensToDomphy(tokens, { highlight })\n const withAnchors = injectHeadingAnchors(body as DomphyElement[])\n const frontmatterTitle = typeof frontmatter.title === \"string\" ? frontmatter.title : undefined\n const title = frontmatterTitle ?? firstH1(toc) ?? titleFromFilePath(filePath)\n return { frontmatter, body: withAnchors, toc, islands: [], title }\n}\n","// Self-contained search: build-time inverted index + client Domphy widget.\n// No third-party search dependency — zero runtime dep, deterministic output.\n\nimport { type DomphyElement, ElementNode, RecordState } from \"@domphy/core\"\nimport { themeColor, themeSpacing } from \"@domphy/theme\"\nimport { card, inputSearch, link, menu, small } from \"@domphy/ui\"\nimport type { SearchDocument, TocEntry } from \"./types.js\"\n\n// --- Index shape -------------------------------------------------------------\n\ninterface SearchEntry {\n route: string\n pageTitle: string\n heading: string\n slug: string\n isPage: boolean\n}\n\ninterface SerializedIndex {\n entries: SearchEntry[]\n postings: Record<string, [number, number][]>\n}\n\nexport interface SearchResult {\n route: string\n pageTitle: string\n heading: string\n slug: string\n isPage: boolean\n score: number\n href: string\n}\n\nconst FIELD_TITLE = 3\nconst FIELD_HEADING = 2\nconst FIELD_BODY = 1\n\n// --- Tokenizer ---------------------------------------------------------------\n\nfunction tokenize(text: string): string[] {\n const tokens: string[] = []\n for (const raw of text.toLowerCase().split(/[^\\p{L}\\p{N}]+/u)) {\n if (raw.length >= 2) tokens.push(raw)\n }\n return tokens\n}\n\n// --- Build-time --------------------------------------------------------------\n\nfunction indexText(\n postings: Map<string, Map<number, number>>,\n entryIndex: number, text: string, fieldWeight: number,\n): void {\n for (const term of tokenize(text)) {\n let perEntry = postings.get(term)\n if (!perEntry) { perEntry = new Map(); postings.set(term, perEntry) }\n const existing = perEntry.get(entryIndex)\n if (existing === undefined || fieldWeight > existing) perEntry.set(entryIndex, fieldWeight)\n }\n}\n\nexport function buildSearchIndex(docs: SearchDocument[]): string {\n const entries: SearchEntry[] = []\n const postings = new Map<string, Map<number, number>>()\n\n for (const doc of docs) {\n const pageIndex = entries.length\n entries.push({ route: doc.route, pageTitle: doc.title, heading: doc.title, slug: \"\", isPage: true })\n indexText(postings, pageIndex, doc.title, FIELD_TITLE)\n indexText(postings, pageIndex, doc.text, FIELD_BODY)\n for (const entry of doc.toc as TocEntry[]) {\n const sectionIndex = entries.length\n entries.push({ route: doc.route, pageTitle: doc.title, heading: entry.text, slug: entry.slug, isPage: false })\n indexText(postings, sectionIndex, entry.text, FIELD_HEADING)\n }\n }\n\n const serializedPostings: Record<string, [number, number][]> = {}\n for (const [term, perEntry] of Array.from(postings.entries()).sort((a, b) => a[0] < b[0] ? -1 : 1)) {\n serializedPostings[term] = Array.from(perEntry.entries()).sort((a, b) => a[0] - b[0]).map(([i, w]) => [i, w])\n }\n return JSON.stringify({ entries, postings: serializedPostings } satisfies SerializedIndex)\n}\n\n// --- Query -------------------------------------------------------------------\n\nexport function queryIndex(serializedIndex: string, query: string, limit = 10): SearchResult[] {\n const index = JSON.parse(serializedIndex) as SerializedIndex\n const terms = tokenize(query)\n if (terms.length === 0) return []\n\n const scoreByEntry = new Map<number, number>()\n const matchedTermsByEntry = new Map<number, number>()\n\n for (const term of terms) {\n const seen = new Set<number>()\n for (const indexedTerm in index.postings) {\n if (indexedTerm !== term && !indexedTerm.startsWith(term)) continue\n const exact = indexedTerm === term\n for (const [entryIndex, fieldWeight] of index.postings[indexedTerm]) {\n const contribution = exact ? fieldWeight : fieldWeight * 0.5\n scoreByEntry.set(entryIndex, (scoreByEntry.get(entryIndex) ?? 0) + contribution)\n if (!seen.has(entryIndex)) {\n seen.add(entryIndex)\n matchedTermsByEntry.set(entryIndex, (matchedTermsByEntry.get(entryIndex) ?? 0) + 1)\n }\n }\n }\n }\n\n const results: SearchResult[] = []\n for (const [entryIndex, score] of scoreByEntry) {\n const entry = index.entries[entryIndex]\n const coverage = matchedTermsByEntry.get(entryIndex) ?? 0\n results.push({\n route: entry.route, pageTitle: entry.pageTitle, heading: entry.heading,\n slug: entry.slug, isPage: entry.isPage,\n score: coverage * 100 + score,\n href: entry.slug ? `${entry.route}#${entry.slug}` : entry.route,\n })\n }\n\n results.sort((a, b) => {\n if (b.score !== a.score) return b.score - a.score\n if (a.route !== b.route) return a.route < b.route ? -1 : 1\n return a.isPage === b.isPage ? 0 : a.isPage ? -1 : 1\n })\n return results.slice(0, limit)\n}\n\n// --- Client widget -----------------------------------------------------------\n\nexport interface SearchWidgetOptions {\n indexUrl?: string\n placeholder?: string\n limit?: number\n}\n\ninterface WidgetState {\n index: string | null\n query: string\n results: SearchResult[]\n open: boolean\n active: number\n}\n\nfunction optionId(widgetId: number, resultIndex: number): string {\n return `dp-search-${widgetId}-option-${resultIndex}`\n}\n\nlet widgetCounter = 0\n\nfunction resultRow(\n result: SearchResult, resultIndex: number, widgetId: number,\n state: RecordState<WidgetState>,\n): DomphyElement {\n const id = optionId(widgetId, resultIndex)\n return {\n a: [\n { div: result.isPage ? result.pageTitle : result.heading },\n result.isPage ? null : { small: result.pageTitle, $: [small({ color: \"neutral\" })] },\n ],\n href: result.href, role: \"option\", id,\n ariaSelected: (l) => state.get(\"active\", l) === resultIndex || undefined,\n onClick: () => { state.set(\"open\", false) },\n onMouseEnter: () => { state.set(\"active\", resultIndex) },\n $: [link({ color: \"neutral\", accentColor: \"primary\" })],\n style: {\n display: \"flex\", flexDirection: \"column\", gap: themeSpacing(1),\n paddingBlock: themeSpacing(2), paddingInline: themeSpacing(3),\n borderRadius: themeSpacing(1),\n backgroundColor: (l) =>\n state.get(\"active\", l) === resultIndex\n ? themeColor(l, \"shift-3\", \"primary\")\n : themeColor(l, \"inherit\", \"neutral\"),\n },\n _key: result.href,\n }\n}\n\nfunction runQuery(state: RecordState<WidgetState>, limit: number): void {\n const index = state.get(\"index\")\n const query = state.get(\"query\")\n const results = index && query.trim() ? queryIndex(index, query, limit) : []\n state.set(\"results\", results)\n state.set(\"active\", -1)\n state.set(\"open\", results.length > 0)\n}\n\nexport function searchWidget(options: SearchWidgetOptions = {}): DomphyElement {\n const { indexUrl = \"/search-index.json\", placeholder = \"Search docs…\", limit = 10 } = options\n const widgetId = ++widgetCounter\n const listboxId = `dp-search-${widgetId}-listbox`\n\n const state = new RecordState<WidgetState>({ index: null, query: \"\", results: [], open: false, active: -1 })\n let debounceTimer: ReturnType<typeof setTimeout> | null = null\n\n function navigate(result: SearchResult | undefined): void {\n if (!result) return\n state.set(\"open\", false)\n window.location.assign(result.href)\n }\n\n const input: DomphyElement = {\n input: null, type: \"search\", placeholder, autocomplete: \"off\",\n role: \"combobox\",\n ariaExpanded: (l) => (state.get(\"open\", l) ? \"true\" : \"false\"),\n ariaControls: listboxId, ariaAutocomplete: \"list\",\n ariaActiveDescendant: (l) => { const a = state.get(\"active\", l); return a >= 0 ? optionId(widgetId, a) : undefined },\n value: (l) => state.get(\"query\", l),\n onInput: (e) => {\n state.set(\"query\", (e.target as HTMLInputElement).value)\n if (debounceTimer) clearTimeout(debounceTimer)\n debounceTimer = setTimeout(() => runQuery(state, limit), 120)\n },\n onFocus: () => { if (state.get(\"results\").length > 0) state.set(\"open\", true) },\n onKeyDown: (e: KeyboardEvent) => {\n const results = state.get(\"results\")\n if (e.key === \"Escape\") { state.set(\"open\", false); state.set(\"active\", -1); return }\n if (e.key === \"ArrowDown\") {\n if (!results.length) return; e.preventDefault()\n state.set(\"open\", true); state.set(\"active\", (state.get(\"active\") + 1) % results.length); return\n }\n if (e.key === \"ArrowUp\") {\n if (!results.length) return; e.preventDefault()\n state.set(\"active\", (state.get(\"active\") - 1 + results.length) % results.length); return\n }\n if (e.key === \"Enter\") {\n const active = state.get(\"active\"); navigate(active >= 0 ? results[active] : results[0])\n }\n },\n $: [inputSearch({ color: \"neutral\", accentColor: \"primary\" })],\n style: { width: \"100%\" },\n }\n\n const dropdown: DomphyElement = {\n div: (l) => state.get(\"open\", l)\n ? state.get(\"results\", l).map((r, i) => resultRow(r, i, widgetId, state))\n : [],\n id: listboxId, role: \"listbox\",\n $: [menu({ selectable: false, color: \"neutral\" }), card({ color: \"neutral\" })],\n style: {\n display: (l) => state.get(\"open\", l) ? \"block\" : \"none\",\n position: \"absolute\", insetInlineStart: 0, insetInlineEnd: 0,\n marginBlockStart: themeSpacing(1), maxHeight: themeSpacing(80),\n overflowY: \"auto\", zIndex: \"50\",\n },\n }\n\n return {\n div: [input, dropdown],\n role: \"search\",\n style: { position: \"relative\", display: \"block\", width: \"100%\" },\n _onMount: (node) => {\n fetch(indexUrl).then(r => r.text()).then(text => {\n state.set(\"index\", text)\n if (state.get(\"query\").trim()) runQuery(state, limit)\n }).catch(() => {})\n const host = node.domElement as HTMLElement\n const handler = (e: Event) => { if (!host.contains(e.target as Node)) state.set(\"open\", false) }\n document.addEventListener(\"pointerdown\", handler)\n node.setMetadata(\"dpSearchHandler\", handler)\n },\n _onRemove: (node) => {\n const handler = node.getMetadata(\"dpSearchHandler\") as ((e: Event) => void) | undefined\n if (handler) document.removeEventListener(\"pointerdown\", handler)\n if (debounceTimer) clearTimeout(debounceTimer)\n },\n }\n}\n\nexport function mountSearch(host: HTMLElement, options: SearchWidgetOptions = {}): ElementNode {\n while (host.firstChild) host.removeChild(host.firstChild)\n const node = new ElementNode(searchWidget(options))\n node.render(host)\n return node\n}\n","// Generates all DomphyPress CSS as a string — no static .css file needed.\n// Uses themeColor(null, ...) which returns var(--neutral-N) / var(--primary-N)\n// references. themeCSS() from @domphy/theme provides the :root + dark-mode\n// overrides that resolve those vars, so dark mode just works.\n\nimport { themeColor, themeSpacing } from \"@domphy/theme\"\n\n// Shorthand helpers (no listener — static CSS var references)\nconst tc = (tone: string, color?: string): string => themeColor(null, tone as any, color)\nconst ts = (n: number): string => themeSpacing(n)\n\n// Named semantic tokens\nconst bg = tc(\"inherit\") // surface background\nconst bgSoft = tc(\"shift-1\") // subtle background\nconst bgMute = tc(\"shift-2\") // muted background\nconst border = tc(\"shift-3\") // dividers / borders\nconst textSoft = tc(\"shift-6\") // placeholder / hint text\nconst text = tc(\"shift-9\") // body text\nconst textStrong = tc(\"shift-11\") // headings / emphasis\nconst brand = tc(\"shift-9\", \"primary\") // link / active / brand color\nconst brandHover = tc(\"shift-10\", \"primary\") // hovered link\n\n// Structural sizes (all em so they scale with root font-size)\nconst headerH = ts(14) // 3.5em = 56px @ 16px\nconst sidebarW = ts(62) // 15.5em = 248px @ 16px\nconst asideW = ts(56) // 14em = 224px @ 16px\nconst contentMax = ts(190) // 47.5em = 760px @ 16px\n\nexport function pressCSS(): string { return `\n/* ------------------------------------------------------------------ reset */\n*,*::before,*::after{box-sizing:border-box}\nhtml{scroll-behavior:smooth;scroll-padding-top:calc(${headerH} + ${ts(4)})}\nbody{margin:0;font-family:-apple-system,BlinkMacSystemFont,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif;background:${bg};color:${text};line-height:1.6;font-size:16px}\na{color:${brand};text-decoration:none}\na:hover{text-decoration:underline}\n\n/* -------------------------------------------------------- announcement bar */\n.dp-announcement{display:flex;align-items:center;justify-content:center;gap:${ts(3)};padding:${ts(2.5)} ${ts(6)};background:${brand};color:${bg};font-size:14px;font-weight:500;text-align:center}\n.dp-announcement a{color:${bg};font-weight:700}\n.dp-announcement-close{background:none;border:none;color:${bg};cursor:pointer;font-size:14px;opacity:.7;padding:${ts(0.5)} ${ts(1.5)};border-radius:${ts(1)};flex-shrink:0}\n.dp-announcement-close:hover{opacity:1}\n\n/* ------------------------------------------------------------------ header */\n.dp-logo{font-weight:700;font-size:18px;color:${textStrong};white-space:nowrap;flex-shrink:0}\n.dp-logo:hover{text-decoration:none}\n.dp-logo-img{height:${ts(7)};width:auto;display:block}\n.dp-nav a{color:${textSoft};font-size:14px;font-weight:500;white-space:nowrap;line-height:1}\n.dp-nav a:hover,.dp-nav a[aria-current=\"page\"]{color:${brand};text-decoration:none}\n.dp-nav-dropdown{position:relative;display:flex;align-items:center}\n.dp-nav-dropdown-label{color:${textSoft};font-size:14px;font-weight:500;cursor:pointer;user-select:none}\n.dp-nav-dropdown-label::after{content:\" ▾\";font-size:10px;opacity:.6}\n.dp-nav-dropdown-menu{display:none;position:absolute;top:calc(100% + ${ts(2)});right:0;background:${bgSoft};border:1px solid ${border};border-radius:${ts(2)};padding:${ts(1.5)};min-width:${ts(40)};z-index:100;flex-direction:column;gap:${ts(0.5)};box-shadow:0 4px 16px rgba(0,0,0,.1)}\n.dp-nav-dropdown-menu a{display:block;padding:${ts(1.25)} ${ts(2.5)};border-radius:${ts(1.25)};font-size:13px}\n.dp-nav-dropdown-menu a:hover{background:${bgMute}}\n.dp-nav-dropdown:hover .dp-nav-dropdown-menu,.dp-nav-dropdown:focus-within .dp-nav-dropdown-menu{display:flex}\n.dp-header-actions{flex-shrink:0}\n.dp-search-slot{width:${ts(50)}}\n.dp-search-static{width:100%;height:${ts(8)};padding:0 ${ts(2.5)};border:1px solid ${border};border-radius:${ts(1.5)};background:${bgSoft};color:${textSoft};font-size:13px;font-family:inherit;outline:none;cursor:pointer}\n.dp-search-static::placeholder{color:${textSoft}}\n.dp-theme-toggle,.dp-menu-toggle{border:1px solid ${border};background:${bgSoft};color:${text};border-radius:${ts(2)};width:${ts(8.5)};height:${ts(8.5)};cursor:pointer;font-size:16px}\n.dp-menu-toggle{display:none}\n\n/* --------------------------------------------------------- locale switcher */\n.dp-locale-switcher{position:relative;display:flex;align-items:center}\n.dp-locale-current{color:${textSoft};font-size:13px;font-weight:500;cursor:pointer;user-select:none;padding:${ts(1)} ${ts(2)};border:1px solid ${border};border-radius:${ts(1.5)};background:${bgSoft};white-space:nowrap;display:flex;align-items:center;gap:${ts(1)}}\n.dp-locale-current::after{content:\" ▾\";font-size:10px;opacity:.6}\n.dp-locale-menu{display:none;position:absolute;top:calc(100% + ${ts(2)});right:0;background:${bgSoft};border:1px solid ${border};border-radius:${ts(2)};padding:${ts(1.5)};min-width:${ts(32)};z-index:200;flex-direction:column;gap:${ts(0.5)};box-shadow:0 4px 16px rgba(0,0,0,.1)}\n.dp-locale-switcher:hover .dp-locale-menu,.dp-locale-switcher:focus-within .dp-locale-menu{display:flex}\n.dp-locale-option{display:block;padding:${ts(1.25)} ${ts(2.5)};border-radius:${ts(1.25)};font-size:13px;color:${textSoft}}\n.dp-locale-option:hover{background:${bgMute};color:${text};text-decoration:none}\n.dp-locale-option.active{color:${brand};font-weight:600}\n\n/* -------------------------------------------------- logo light/dark variant */\n[data-theme=\"dark\"] .dp-logo-light{display:none}\n[data-theme=\"light\"] .dp-logo-dark,.dp-logo-dark{display:none}\n[data-theme=\"dark\"] .dp-logo-dark{display:block}\n\n/* ------------------------------------------------------------ social links */\n.dp-social-link{display:inline-flex;align-items:center;justify-content:center;width:${ts(8.5)};height:${ts(8.5)};border-radius:${ts(2)};color:${textSoft};background:${bgSoft};border:1px solid ${border};font-size:10px;font-weight:700;flex-shrink:0}\n.dp-social-link:hover{color:${text};border-color:${textSoft};text-decoration:none}\n.dp-social-icon{display:block;width:${ts(4)};height:${ts(4)};background:currentColor;flex-shrink:0}\n.dp-icon-github{-webkit-mask:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M12 2C6.477 2 2 6.477 2 12c0 4.42 2.865 8.17 6.839 9.49.5.092.682-.217.682-.482 0-.237-.008-.866-.013-1.7-2.782.603-3.369-1.342-3.369-1.342-.454-1.155-1.11-1.463-1.11-1.463-.908-.62.069-.608.069-.608 1.003.07 1.531 1.03 1.531 1.03.892 1.529 2.341 1.088 2.91.832.092-.647.35-1.088.636-1.338-2.22-.253-4.555-1.11-4.555-4.943 0-1.091.39-1.984 1.029-2.683-.103-.253-.446-1.27.098-2.647 0 0 .84-.269 2.75 1.025A9.578 9.578 0 0 1 12 6.836c.85.004 1.705.115 2.504.337 1.909-1.294 2.747-1.025 2.747-1.025.546 1.377.202 2.394.1 2.647.64.699 1.028 1.592 1.028 2.683 0 3.842-2.339 4.687-4.566 4.935.359.309.678.919.678 1.852 0 1.336-.012 2.415-.012 2.741 0 .267.18.578.688.48C19.138 20.167 22 16.418 22 12c0-5.523-4.477-10-10-10z'/%3E%3C/svg%3E\") center/contain no-repeat;mask:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M12 2C6.477 2 2 6.477 2 12c0 4.42 2.865 8.17 6.839 9.49.5.092.682-.217.682-.482 0-.237-.008-.866-.013-1.7-2.782.603-3.369-1.342-3.369-1.342-.454-1.155-1.11-1.463-1.11-1.463-.908-.62.069-.608.069-.608 1.003.07 1.531 1.03 1.531 1.03.892 1.529 2.341 1.088 2.91.832.092-.647.35-1.088.636-1.338-2.22-.253-4.555-1.11-4.555-4.943 0-1.091.39-1.984 1.029-2.683-.103-.253-.446-1.27.098-2.647 0 0 .84-.269 2.75 1.025A9.578 9.578 0 0 1 12 6.836c.85.004 1.705.115 2.504.337 1.909-1.294 2.747-1.025 2.747-1.025.546 1.377.202 2.394.1 2.647.64.699 1.028 1.592 1.028 2.683 0 3.842-2.339 4.687-4.566 4.935.359.309.678.919.678 1.852 0 1.336-.012 2.415-.012 2.741 0 .267.18.578.688.48C19.138 20.167 22 16.418 22 12c0-5.523-4.477-10-10-10z'/%3E%3C/svg%3E\") center/contain no-repeat}\n.dp-icon-twitter{-webkit-mask:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M18.244 2.25h3.308l-7.227 8.26 8.502 11.24H16.17l-4.714-6.231-5.401 6.231H2.744l7.737-8.835L1.254 2.25H8.08l4.713 6.231zm-1.161 17.52h1.833L7.084 4.126H5.117z'/%3E%3C/svg%3E\") center/contain no-repeat;mask:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M18.244 2.25h3.308l-7.227 8.26 8.502 11.24H16.17l-4.714-6.231-5.401 6.231H2.744l7.737-8.835L1.254 2.25H8.08l4.713 6.231zm-1.161 17.52h1.833L7.084 4.126H5.117z'/%3E%3C/svg%3E\") center/contain no-repeat}\n.dp-icon-discord{-webkit-mask:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M20.317 4.37a19.791 19.791 0 0 0-4.885-1.515.074.074 0 0 0-.079.037c-.21.375-.444.864-.608 1.25a18.27 18.27 0 0 0-5.487 0 12.64 12.64 0 0 0-.617-1.25.077.077 0 0 0-.079-.037A19.736 19.736 0 0 0 3.677 4.37a.07.07 0 0 0-.032.027C.533 9.046-.32 13.58.099 18.057c.01.044.032.084.064.107a19.9 19.9 0 0 0 5.993 3.03.078.078 0 0 0 .084-.028 14.09 14.09 0 0 0 1.226-1.994.076.076 0 0 0-.041-.106 13.107 13.107 0 0 1-1.872-.892.077.077 0 0 1-.008-.128 10.2 10.2 0 0 0 .372-.292.074.074 0 0 1 .077-.01c3.928 1.793 8.18 1.793 12.062 0a.074.074 0 0 1 .078.01 10.2 10.2 0 0 0 .373.292.077.077 0 0 1-.006.127 12.299 12.299 0 0 1-1.873.892.077.077 0 0 0-.041.107c.36.698.772 1.362 1.225 1.993a.076.076 0 0 0 .084.028 19.839 19.839 0 0 0 6.002-3.03.077.077 0 0 0 .032-.054c.5-5.177-.838-9.674-3.549-13.66a.061.061 0 0 0-.031-.03z'/%3E%3C/svg%3E\") center/contain no-repeat;mask:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M20.317 4.37a19.791 19.791 0 0 0-4.885-1.515.074.074 0 0 0-.079.037c-.21.375-.444.864-.608 1.25a18.27 18.27 0 0 0-5.487 0 12.64 12.64 0 0 0-.617-1.25.077.077 0 0 0-.079-.037A19.736 19.736 0 0 0 3.677 4.37a.07.07 0 0 0-.032.027C.533 9.046-.32 13.58.099 18.057c.01.044.032.084.064.107a19.9 19.9 0 0 0 5.993 3.03.078.078 0 0 0 .084-.028 14.09 14.09 0 0 0 1.226-1.994.076.076 0 0 0-.041-.106 13.107 13.107 0 0 1-1.872-.892.077.077 0 0 1-.008-.128 10.2 10.2 0 0 0 .372-.292.074.074 0 0 1 .077-.01c3.928 1.793 8.18 1.793 12.062 0a.074.074 0 0 1 .078.01 10.2 10.2 0 0 0 .373.292.077.077 0 0 1-.006.127 12.299 12.299 0 0 1-1.873.892.077.077 0 0 0-.041.107c.36.698.772 1.362 1.225 1.993a.076.076 0 0 0 .084.028 19.839 19.839 0 0 0 6.002-3.03.077.077 0 0 0 .032-.054c.5-5.177-.838-9.674-3.549-13.66a.061.061 0 0 0-.031-.03z'/%3E%3C/svg%3E\") center/contain no-repeat}\n\n/* ------------------------------------------------------------------ layout */\n.dp-shell{display:grid;grid-template-columns:${sidebarW} minmax(0,1fr) ${asideW};align-items:start;max-width:1440px;margin:0 auto}\n.dp-sidebar{position:sticky;top:${headerH};max-height:calc(100vh - ${headerH});overflow-y:auto;padding:${ts(6)} ${ts(3)} ${ts(12)} ${ts(6)};border-right:1px solid ${border}}\n.dp-sidebar-group{margin-bottom:${ts(3.5)}}\n.dp-sidebar-title{display:flex;align-items:center;gap:${ts(1.5)};font-size:13px;font-weight:700;color:${textStrong};margin:${ts(2)} 0 ${ts(1)}}\n.dp-sidebar-subtitle{font-size:12px;color:${textSoft};padding:${ts(1)} ${ts(3)};font-weight:600}\n.dp-sidebar-items{display:flex;flex-direction:column}\n.dp-sidebar-toggle{margin-left:auto;background:none;border:none;cursor:pointer;color:${textSoft};font-size:14px;padding:0 ${ts(1)};line-height:1}\n.dp-sidebar-toggle:hover{color:${text}}\n.dp-sidebar-group.collapsed .dp-sidebar-items{display:none}\n.dp-sidebar a{display:flex;align-items:center;gap:${ts(1.5)};padding:${ts(1.25)} ${ts(3)};font-size:14px;color:${textSoft};border-radius:${ts(1.5)}}\n.dp-sidebar a:hover{color:${text};text-decoration:none}\n.dp-sidebar a[aria-current=\"page\"]{color:${brand};font-weight:600;background:${bgSoft}}\n.dp-sidebar-link-with-badge{display:flex;align-items:center}\n.dp-main{padding:${ts(8)} ${ts(12)} ${ts(20)};min-width:0}\n.dp-content{max-width:${contentMax}}\n.dp-aside{position:sticky;top:${headerH};max-height:calc(100vh - ${headerH});overflow-y:auto;padding:${ts(8)} ${ts(6)};font-size:13px}\n.dp-aside-title{font-weight:700;margin-bottom:${ts(2)};color:${text}}\n.dp-toc a{display:block;padding:${ts(0.75)} 0;color:${textSoft}}\n.dp-toc a:hover{color:${brand};text-decoration:none}\n.dp-toc-2{padding-left:0}\n.dp-toc-3{padding-left:${ts(3)}}\n.dp-toc-4{padding-left:${ts(6)}}\n\n/* -------------------------------------------------- card / link-card / card-grid */\n.custom-block.card{background:${bgSoft};border:1px solid ${border};border-radius:${ts(3)};padding:${ts(5)} ${ts(6)};margin:${ts(3)} 0}\n.custom-block.card .card-title{font-size:16px;font-weight:600;color:${textStrong};margin:0 0 ${ts(2)}}\n.custom-block.card-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(${ts(56)},1fr));gap:${ts(4)};margin:${ts(4)} 0}\na.custom-block.link-card{display:block;background:${bgSoft};border:1px solid ${border};border-radius:${ts(3)};padding:${ts(5)} ${ts(6)};margin:${ts(3)} 0;transition:border-color .15s,background .15s;text-decoration:none;color:${text}}\na.custom-block.link-card:hover{border-color:${brand};background:${bgMute};text-decoration:none}\na.custom-block.link-card .link-card-title{font-size:16px;font-weight:600;color:${brand};margin:0 0 ${ts(2)}}\n.custom-block.card-grid .custom-block.card,.custom-block.card-grid a.custom-block.link-card{margin:0}\n\n/* ------------------------------------------------------------------ badges */\n.dp-badge{display:inline-block;padding:${ts(0.5)} ${ts(1.75)};border-radius:${ts(2.5)};font-size:11px;font-weight:700;line-height:1.4;white-space:nowrap;vertical-align:middle}\n.dp-badge-tip{background:color-mix(in srgb,${brand} 12%,${bg});color:${brand}}\n.dp-badge-info{background:${bgMute};color:${textSoft}}\n.dp-badge-warning{background:color-mix(in srgb,${tc(\"shift-9\",\"warning\")} 12%,${bg});color:${tc(\"shift-9\",\"warning\")}}\n.dp-badge-danger{background:color-mix(in srgb,${tc(\"shift-9\",\"danger\")} 12%,${bg});color:${tc(\"shift-9\",\"danger\")}}\n.dp-page-badge{margin-left:${ts(2)}}\n.dp-page-badge-row{margin-bottom:${ts(-2)}}\n\n/* ------------------------------------------------------------------- prose */\n.dp-content h1{font-size:30px;font-weight:700;line-height:1.25;margin:0 0 ${ts(6)};letter-spacing:-.02em;color:${textStrong}}\n.dp-content h2{font-size:22px;font-weight:700;margin:${ts(11)} 0 ${ts(4)};padding-top:${ts(5)};border-top:1px solid ${border};letter-spacing:-.01em;color:${textStrong}}\n.dp-content h3{font-size:18px;font-weight:600;margin:${ts(7)} 0 ${ts(3)};color:${textStrong}}\n.dp-content h4{font-size:16px;font-weight:600;margin:${ts(5.5)} 0 ${ts(2)};color:${textStrong}}\n.dp-content p{margin:${ts(4)} 0}\n.dp-content ul,.dp-content ol{margin:${ts(4)} 0;padding-left:1.4em}\n.dp-content li{margin:${ts(1.5)} 0}\n.dp-content a{font-weight:500}\n.dp-content strong{font-weight:600;color:${textStrong}}\n.dp-content em{font-style:italic}\n.dp-content mark{background:color-mix(in srgb,${tc(\"shift-6\",\"warning\")} 40%,${bg});color:inherit;padding:${ts(0.25)} ${ts(0.75)};border-radius:${ts(0.75)}}\n.dp-content sup{font-size:.75em;vertical-align:super}\n.dp-content sub{font-size:.75em;vertical-align:sub}\n.dp-content del{opacity:.5}\n.dp-content blockquote{margin:${ts(4)} 0;padding:0 ${ts(4)};border-left:3px solid ${border};color:${textSoft}}\n.dp-content img{max-width:100%;height:auto;border-radius:${ts(1.5)}}\n.dp-content hr{border:none;border-top:1px solid ${border};margin:${ts(8)} 0}\n.dp-content :not(pre)>code{font-family:ui-monospace,SFMono-Regular,\"SF Mono\",Menlo,monospace;font-size:.85em;background:${bgMute};padding:${ts(0.75)} ${ts(1.5)};border-radius:${ts(1)}}\n.dp-content pre{margin:${ts(4)} 0;padding:${ts(4)} ${ts(5)};background:${bgSoft};border:1px solid ${border};border-radius:${ts(2)};overflow-x:auto;font-size:13.5px;line-height:1.5}\n.dp-content pre code{font-family:ui-monospace,SFMono-Regular,\"SF Mono\",Menlo,monospace;background:none;padding:0}\n.dp-content table{border-collapse:collapse;margin:${ts(4)} 0;display:block;overflow-x:auto}\n.dp-content th,.dp-content td{border:1px solid ${border};padding:${ts(2)} ${ts(3.5)};text-align:left}\n.dp-content th{background:${bgSoft};font-weight:600}\n\n/* -------------------------------------------------------- heading anchors */\n.header-anchor{opacity:0;margin-left:${ts(2)};font-weight:400;font-size:.85em;color:${textSoft};transition:opacity .15s}\n:is(h1,h2,h3,h4,h5,h6):hover .header-anchor{opacity:1}\n.header-anchor:hover{color:${brand};text-decoration:none}\n\n/* -------------------------------------------------------- external links */\n.dp-content a[target=\"_blank\"]::after{content:\" ↗\";font-size:.75em;opacity:.6}\n\n/* --------------------------------------------------------------- task lists */\n.task-list-item{list-style:none;margin-left:-1.4em;padding-left:1.8em;position:relative}\n.task-list-check{position:absolute;left:0;top:.25em;width:14px;height:14px;cursor:default;accent-color:${brand}}\n\n/* ------------------------------------------------------------ code blocks */\n.code-block{margin:${ts(4)} 0;border:1px solid ${border};border-radius:${ts(2)};overflow:hidden}\n.code-block-title{display:flex;align-items:center;padding:${ts(1.5)} ${ts(4)};background:${bgMute};border-bottom:1px solid ${border};font-size:12px;font-family:ui-monospace,SFMono-Regular,\"SF Mono\",Menlo,monospace;color:${textSoft}}\n.code-block-inner{position:relative}\n.code-block pre{margin:0;padding:${ts(4)} ${ts(5)};background:${bgSoft};border:none;border-radius:0;overflow-x:auto;font-size:13.5px;line-height:1.5;font-family:ui-monospace,SFMono-Regular,\"SF Mono\",Menlo,monospace}\n.code-block code{font-family:inherit;background:none;padding:0;font-size:inherit}\n.code-block .line{display:inline-block;width:100%}\n.code-block .line.highlighted{background:color-mix(in srgb,${brand} 10%,transparent)}\n.code-block .line.diff.add{background:color-mix(in srgb,${tc(\"shift-7\",\"success\")} 12%,transparent)}\n.code-block .line.diff.add::before{content:\"+ \";color:${tc(\"shift-7\",\"success\")}}\n.code-block .line.diff.remove{background:color-mix(in srgb,${tc(\"shift-9\",\"danger\")} 10%,transparent);opacity:.7}\n.code-block .line.diff.remove::before{content:\"- \";color:${tc(\"shift-9\",\"danger\")}}\n.code-block .line.highlighted.error{background:color-mix(in srgb,${tc(\"shift-9\",\"error\")} 10%,transparent)}\n.code-block .line.highlighted.warning{background:color-mix(in srgb,${tc(\"shift-7\",\"warning\")} 10%,transparent)}\n.code-block pre.has-focus .line:not(.focus){opacity:.4;filter:blur(.4px);transition:opacity .2s,filter .2s}\n.code-block pre.has-focus:hover .line{opacity:1;filter:none}\n.code-block .line-number{display:inline-block;min-width:2.5em;margin-right:1em;color:${textSoft};text-align:right;user-select:none;font-size:.9em}\n.code-copy-btn{position:absolute;top:${ts(2)};right:${ts(2)};padding:${ts(1)} ${ts(2)};border-radius:${ts(1.25)};border:1px solid ${border};background:${bgSoft};color:${textSoft};cursor:pointer;font-size:13px;opacity:0;transition:opacity .15s}\n.code-block-inner:hover .code-copy-btn{opacity:1}\n.code-copy-btn:hover{background:${bgMute};color:${text}}\n\n/* ------------------------------------------------------------- code groups */\n.code-group{margin:${ts(4)} 0;border:1px solid ${border};border-radius:${ts(2)};overflow:hidden}\n.code-group>input[type=\"radio\"]{position:absolute;opacity:0;pointer-events:none;width:0;height:0}\n.code-group .tabs{display:flex;gap:${ts(0.5)};padding:${ts(1.5)} ${ts(2)};background:${bgSoft};border-bottom:1px solid ${border};flex-wrap:wrap}\n.code-group .tabs label{padding:${ts(1)} ${ts(3)};font-size:13px;font-weight:500;color:${textSoft};border-radius:${ts(1.25)};cursor:pointer}\n.code-group .blocks>.code-block{display:none;margin:0;border:none;border-radius:0}\n.code-group .blocks>.code-block pre{border-radius:0}\n${Array.from({length: 8}, (_, i) => `.code-group>input:nth-of-type(${i+1}):checked~.blocks>.code-block:nth-child(${i+1})`).join(\",\\n\")}{display:block}\n${Array.from({length: 8}, (_, i) => `.code-group>input:nth-of-type(${i+1}):checked~.tabs>label:nth-child(${i+1})`).join(\",\\n\")}{color:${brand};background:${bgMute}}\n\n/* --------------------------------------------------------- custom blocks */\n.custom-block{margin:${ts(4)} 0;padding:${ts(3)} ${ts(4)};border-radius:${ts(2)};border:1px solid transparent;font-size:14.5px}\n.custom-block p{margin:${ts(2)} 0}\n.custom-block-title{font-weight:700;margin:0 0 ${ts(1)} !important;font-size:13px}\n.custom-block.tip,.custom-block.success{background:color-mix(in srgb,${brand} 8%,${bg});border-color:color-mix(in srgb,${brand} 28%,transparent)}\n.custom-block.info,.custom-block.note,.custom-block.abstract{background:${bgSoft};border-color:${border}}\n.custom-block.warning,.custom-block.question{background:color-mix(in srgb,${tc(\"shift-6\",\"warning\")} 10%,${bg});border-color:${tc(\"shift-6\",\"warning\")}}\n.custom-block.danger,.custom-block.failure,.custom-block.bug{background:color-mix(in srgb,${tc(\"shift-7\",\"danger\")} 10%,${bg});border-color:${tc(\"shift-7\",\"danger\")}}\n.custom-block.example{background:color-mix(in srgb,${tc(\"shift-7\",\"secondary\")} 10%,${bg});border-color:${tc(\"shift-7\",\"secondary\")}}\n.custom-block.quote{background:${bgSoft};border-color:${border};border-left-width:4px;border-radius:0 ${ts(2)} ${ts(2)} 0}\ndetails.custom-block summary{cursor:pointer;font-weight:600}\n\n/* ------------------------------------------------------------------- steps */\n.custom-block.steps{background:none;border:none;padding:0}\n.custom-block.steps>ol{counter-reset:step;list-style:none;padding:0;margin:0}\n.custom-block.steps>ol>li{counter-increment:step;display:grid;grid-template-columns:${ts(9)} 1fr;gap:0 ${ts(4)};margin-bottom:${ts(6)}}\n.custom-block.steps>ol>li::before{content:counter(step);display:flex;align-items:center;justify-content:center;width:${ts(7.5)};height:${ts(7.5)};border-radius:50%;background:${brand};color:${bg};font-size:13px;font-weight:700;flex-shrink:0}\n\n/* ----------------------------------------------------------------- mermaid */\n.dp-mermaid{margin:${ts(5)} 0;text-align:center;overflow-x:auto}\n.dp-mermaid svg{max-width:100%;height:auto}\n\n/* --------------------------------------------------------------- doc footer */\n.dp-doc-footer{display:flex;align-items:center;gap:${ts(4)};flex-wrap:wrap;margin-top:${ts(8)};padding-top:${ts(5)};border-top:1px solid ${border};font-size:13px;color:${textSoft}}\n.dp-edit-link{font-weight:500;font-size:13px}\n.dp-reading-time::before{content:\"📖 \"}\n\n/* --------------------------------------------------------------- prev/next */\n.dp-prevnext{display:flex;justify-content:space-between;gap:${ts(4)};margin-top:${ts(12)};padding-top:${ts(6)};border-top:1px solid ${border}}\n.dp-prevnext a{display:block;padding:${ts(3)} ${ts(4)};border:1px solid ${border};border-radius:${ts(2)};font-weight:600;flex:1}\n.dp-prevnext a:hover{border-color:${brand};text-decoration:none}\n.dp-prevnext .next{text-align:right}\n.dp-prevnext small{display:block;color:${textSoft};font-weight:400;font-size:12px}\n\n/* ----------------------------------------------------------------- footer */\n.dp-footer{padding:${ts(6)} ${ts(12)};border-top:1px solid ${border};color:${textSoft};font-size:13px}\n\n/* ---------------------------------------------------------------- home page */\n.dp-main-home{max-width:1100px;margin:0 auto;padding:${ts(12)} ${ts(6)} ${ts(20)}}\n.dp-hero{text-align:center;padding:${ts(10)} 0 ${ts(6)}}\n.dp-hero-name{font-size:56px;font-weight:800;line-height:1.1;letter-spacing:-.03em;background:linear-gradient(120deg,${brand},${tc(\"shift-7\",\"secondary\")});-webkit-background-clip:text;background-clip:text;color:transparent}\n.dp-hero-text{font-size:30px;font-weight:700;margin:${ts(3)} 0 0;color:${textStrong}}\n.dp-hero-tagline{font-size:18px;color:${textSoft};max-width:${ts(160)};margin:${ts(5)} auto 0}\n.dp-hero-actions{display:flex;gap:${ts(3)};justify-content:center;margin-top:${ts(7)};flex-wrap:wrap}\n.dp-hero-action{padding:${ts(2.5)} ${ts(5.5)};border-radius:${ts(5.5)};font-weight:600;font-size:15px}\n.dp-hero-action.brand{background:${brand};color:${bg}}\n.dp-hero-action.brand:hover{background:${brandHover};text-decoration:none}\n.dp-hero-action.alt{background:${bgSoft};color:${text};border:1px solid ${border}}\n.dp-hero-action.alt:hover{border-color:${brand};text-decoration:none}\n.dp-features{display:grid;grid-template-columns:repeat(auto-fit,minmax(${ts(60)},1fr));gap:${ts(4)};margin:${ts(10)} 0}\n.dp-feature{padding:${ts(5)};background:${bgSoft};border:1px solid ${border};border-radius:${ts(3)}}\n.dp-feature-icon{font-size:28px;margin-bottom:${ts(3)}}\n.dp-feature-title{font-weight:700;font-size:17px;margin-bottom:${ts(2)};color:${textStrong}}\n.dp-feature-details{font-size:14px;color:${textSoft};margin:0;line-height:1.5}\n.dp-feature-link{display:block;color:inherit}\n.dp-feature-link:hover{text-decoration:none}\n.dp-feature-link:hover .dp-feature{border-color:${brand}}\n.dp-home{max-width:${contentMax};margin:0 auto}\n\n/* ---------------------------------------------------------------- shiki dark */\nhtml[data-theme=\"dark\"] .shiki,html[data-theme=\"dark\"] .shiki span{color:var(--shiki-dark,inherit) !important}\n\n/* -------------------------------------------------------------- responsive */\n@media(max-width:1200px){\n .dp-shell{grid-template-columns:${sidebarW} minmax(0,1fr)}\n .dp-aside{display:none}\n}\n@media(max-width:860px){\n .dp-shell{grid-template-columns:1fr}\n .dp-menu-toggle{display:block}\n .dp-sidebar{position:fixed;top:${headerH};left:0;bottom:0;width:80%;max-width:${ts(80)};background:${bg};z-index:25;transform:translateX(-100%);transition:transform .2s ease;max-height:none}\n html[data-sidebar=\"open\"] .dp-sidebar{transform:translateX(0)}\n .dp-nav{display:none}\n .dp-main{padding:${ts(6)} ${ts(5)} ${ts(16)}}\n .dp-search-slot{width:${ts(35)}}\n}\n` }\n","// Static file server with clean-URL support.\n// In dev mode: adds SSE endpoint /_dev/sse for live-reload.\n\nimport { createReadStream, existsSync, readFileSync, statSync } from \"node:fs\"\nimport { createServer, type Server, type ServerResponse } from \"node:http\"\nimport { extname, join, normalize } from \"node:path\"\n\nconst MIME: Record<string, string> = {\n \".html\": \"text/html; charset=utf-8\",\n \".js\": \"text/javascript; charset=utf-8\",\n \".mjs\": \"text/javascript; charset=utf-8\",\n \".css\": \"text/css; charset=utf-8\",\n \".json\": \"application/json; charset=utf-8\",\n \".svg\": \"image/svg+xml\",\n \".png\": \"image/png\",\n \".jpg\": \"image/jpeg\",\n \".jpeg\": \"image/jpeg\",\n \".webp\": \"image/webp\",\n \".gif\": \"image/gif\",\n \".ico\": \"image/x-icon\",\n \".woff\": \"font/woff\",\n \".woff2\": \"font/woff2\",\n \".ttf\": \"font/ttf\",\n \".txt\": \"text/plain; charset=utf-8\",\n \".map\": \"application/json; charset=utf-8\",\n \".xml\": \"application/xml; charset=utf-8\",\n}\n\nconst DEV_SCRIPT = `<script>(function(){var es=new EventSource('/_dev/sse');es.onmessage=function(e){if(e.data==='reload')location.reload();};es.onerror=function(){setTimeout(function(){location.reload();},2000);};})();</script>`\n\nfunction resolveFile(root: string, urlPath: string): string | null {\n const safe = normalize(decodeURIComponent(urlPath.split(\"?\")[0])).replace(/^(\\.\\.[/\\\\])+/, \"\")\n const candidates = extname(safe)\n ? [join(root, safe)]\n : [join(root, safe, \"index.html\"), join(root, `${safe}.html`)]\n for (const candidate of candidates) {\n if (existsSync(candidate) && statSync(candidate).isFile()) return candidate\n }\n return null\n}\n\nexport function startServer(root: string, port: number): Server {\n const server = createServer((request, response) => {\n const file = resolveFile(root, request.url ?? \"/\")\n if (!file) {\n const notFound = join(root, \"404.html\")\n response.statusCode = 404\n response.setHeader(\"content-type\", \"text/html; charset=utf-8\")\n if (existsSync(notFound)) createReadStream(notFound).pipe(response)\n else response.end(\"404 Not Found\")\n return\n }\n response.statusCode = 200\n response.setHeader(\"content-type\", MIME[extname(file)] ?? \"application/octet-stream\")\n createReadStream(file).pipe(response)\n })\n server.listen(port, () => console.log(`DomphyPress preview: http://localhost:${port}/`))\n return server\n}\n\nexport function startDevServer(root: string, port: number): { server: Server; notify: () => void } {\n const clients = new Set<ServerResponse>()\n\n const server = createServer((request, response) => {\n const url = request.url ?? \"/\"\n if (url === \"/_dev/sse\") {\n response.writeHead(200, {\n \"Content-Type\": \"text/event-stream\",\n \"Cache-Control\": \"no-cache\",\n \"Connection\": \"keep-alive\",\n })\n response.write(\"data: connected\\n\\n\")\n clients.add(response)\n request.on(\"close\", () => clients.delete(response))\n return\n }\n const file = resolveFile(root, url)\n if (!file) {\n response.statusCode = 404\n response.setHeader(\"content-type\", \"text/html; charset=utf-8\")\n const notFound = join(root, \"404.html\")\n if (existsSync(notFound)) createReadStream(notFound).pipe(response)\n else response.end(\"404 Not Found\")\n return\n }\n const mime = MIME[extname(file)] ?? \"application/octet-stream\"\n response.statusCode = 200\n response.setHeader(\"content-type\", mime)\n if (mime.startsWith(\"text/html\")) {\n const html = readFileSync(file, \"utf8\")\n response.end(html.replace(\"</body>\", `${DEV_SCRIPT}</body>`))\n } else {\n createReadStream(file).pipe(response)\n }\n })\n server.listen(port, () => console.log(`DomphyPress dev: http://localhost:${port}/ (live reload active)`))\n return {\n server,\n notify: () => { for (const client of clients) { try { client.write(\"data: reload\\n\\n\") } catch { clients.delete(client) } } },\n }\n}\n"],"mappings":"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","names":["defineConfig","config","cpSync","existsSync","mkdirSync","readFileSync","rmSync","writeFileSync","dirname","join","relative","resolve","fileURLToPath","execSync","createApp","defineRoutes","themeCSS","createShiki","THEME","LANGUAGES","ALIASES","pending","escapeHtml","text","unwrapCode","html","match","parseFenceInfo","info","rawLang","lang","lineNumbers","titleMatch","title","rangeMatch","highlightLines","part","range","i","CODE_ANNOTATION_RE","ANNOTATION_CLASSES","extractAnnotations","code","lines","lineClasses","cleanLines","hasFocus","line","keyword","cls","annotateLines","lineIndex","annotationCls","classes","createHighlighter","highlighter","loaded","resolved","renderFence","highlight","cleanCode","innerHtml","annotated","hasAnnotations","titleHtml","preClass","navLink","toolbar","toolbarSpacer","readdirSync","statSync","join","posix","relative","sep","NON_PAGE_DIRS","routeForFile","srcRelativePath","segments","outFileForRoute","route","listMarkdown","dir","found","name","full","discoverPages","srcDir","pages","filePath","rel","a","b","flattenSidebar","items","out","item","sidebarForRoute","config","bestPrefix","prefix","prevNextForRoute","flat","index","SOCIAL_LABELS","socialLinkEl","social","name","pageLink","text","href","className","navLink","navDropdown","item","child","announcementBar","config","bar","idAttr","children","localeSwitcher","ctx","route","entries","currentKey","barePath","key","currentLocale","links","locale","header","searchEnabled","logo","logoInner","logoEl","socialEls","localeEl","toolbarSpacer","toolbar","sidebarBadge","badge","pageLinkWithBadge","sidebarGroup","group","isCollapsible","titleChildren","itemsEl","leaf","groupClass","sidebar","sidebarForRoute","tocAside","minLevel","maxLevel","e","prevNext","prev","next","prevNextForRoute","docFooter","editLink","showLastUpdated","hasEdit","hasDate","formatted","pageBadge","frontmatter","type","pageShell","main","pn","footer","shellChildren","aside","heroSection","hero","a","featuresSection","features","f","inner","el","homeShell","readFileSync","dirname","extname","isAbsolute","resolve","splitFrontmatter","tokensToDomphy","MarkdownIt","container","markUntyped","subUntyped","supUntyped","includeUntyped","emojiPkg","include","includeUntyped","markPlugin","markUntyped","subPlugin","subUntyped","supPlugin","supUntyped","emojiPlugin","emojiPkg","CODE_IMPORT_PATTERN","EXT_LANG","resolveSpecifier","spec","fileDir","docsDir","resolve","dirname","isAbsolute","expandCodeImports","body","_whole","rawPath","label","absolute","fence","contents","readFileSync","language","extname","info","stripScriptBlocks","source","ADMONITION_TITLES","containerTitle","type","buildTitleTokens","Token","tag","openType","closeType","className","title","open","inline","text","close","buildHtmlBlock","content","token","buildCodeGroupTokens","tokens","openIndex","closeIndex","groupId","fences","i","labelMatch","inputsHtml","_","labelsHtml","escapeHtml","inner","shapeContainers","output","groupCounter","ALL_ADMONITIONS","admonitionRe","admonitionCloseRe","admonition","custom","linkMatch","href","depth","j","shapeTaskLists","prev","firstChild","checked","checkToken","createParser","highlight","md","MarkdownIt","noopRender","ADMONITION_NAMES","name","container","state","html","renderFence","child","titleFromFilePath","filePath","parts","firstH1","toc","e","injectHeadingAnchors","elements","el","rec","k","id","children","tag2","renderDoc","options","frontmatter","splitFrontmatter","stripped","expanded","tokensToDomphy","withAnchors","ElementNode","RecordState","themeColor","themeSpacing","card","inputSearch","link","menu","small","FIELD_TITLE","FIELD_HEADING","FIELD_BODY","tokenize","text","tokens","raw","indexText","postings","entryIndex","fieldWeight","term","perEntry","existing","buildSearchIndex","docs","entries","doc","pageIndex","entry","sectionIndex","serializedPostings","b","i","w","queryIndex","serializedIndex","query","limit","index","terms","scoreByEntry","matchedTermsByEntry","seen","indexedTerm","exact","contribution","results","score","coverage","a","optionId","widgetId","resultIndex","widgetCounter","resultRow","result","state","id","l","runQuery","searchWidget","options","indexUrl","placeholder","listboxId","debounceTimer","navigate","input","e","active","dropdown","r","node","host","handler","mountSearch","themeColor","themeSpacing","tc","tone","color","ts","n","bg","bgSoft","bgMute","border","textSoft","text","textStrong","brand","brandHover","headerH","sidebarW","asideW","contentMax","pressCSS","_","i","here","dirname","fileURLToPath","flattenText","node","out","child","key","value","parseStyleString","style","decl","colon","prop","val","_m","c","sanitizeStyles","record","firstParagraphText","body","parts","text","estimateReadingTime","textContent","getLastUpdated","filePath","execSync","buildIslandsBundle","outDir","searchEnabled","islandsSource","join","entrySource","tmpEntry","mkdirSync","writeFileSync","esbuildBuild","rmSync","buildSitemap","routes","hostname","route","RUNTIME_SCRIPT","mermaidHeadScript","mermaid","htmlDocument","result","config","generatedCss","pageHead","lang","islandsScript","mermaidScript","buildSite","options","srcDir","publicDir","showLastUpdated","localePages","discoverPages","localeKey","locale","localeDir","resolve","existsSync","p","prefix","highlight","createHighlighter","themeCSS","pressCSS","built","searchDocs","page","source","readFileSync","doc","renderDoc","textParts","readingTime","lastUpdated","relPath","relative","pageHeadMap","pageLangMap","appRoutes","defineRoutes","localeConfig","mergedTheme","mergedConfig","ctx","isHome","description","siteTitle","pageTitle","canonical","s","homeShell","pageShell","app","createApp","failures","totalBytes","html","outPath","error","failure","buildSearchIndex","cpSync","createReadStream","existsSync","readFileSync","statSync","createServer","extname","join","normalize","MIME","DEV_SCRIPT","resolveFile","root","urlPath","safe","candidates","candidate","startServer","port","server","request","response","file","notFound","startDevServer","clients","url","mime","html","client"]}
1
+ {"version":3,"sources":["../src/build.ts","../src/highlight.ts","../src/layout.ts","../src/routes.ts","../src/pipeline.ts","../src/search.ts","../src/theme.ts","../src/config.ts","../src/serve.ts"],"sourcesContent":["// DomphyPress static site generator.\n// Pipeline: discover pages → renderDoc → layout → renderToString → HTML.\n// Extras: islands bundle, search index, sitemap, git last-updated, locales.\n\nimport { execSync } from \"node:child_process\";\nimport {\n cpSync,\n existsSync,\n mkdirSync,\n readFileSync,\n rmSync,\n writeFileSync,\n} from \"node:fs\";\nimport { dirname, join, relative, resolve } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { createApp, defineRoutes } from \"@domphy/app\";\nimport { themeCSS } from \"@domphy/theme\";\nimport type * as EsbuildType from \"esbuild\";\nimport { createHighlighter } from \"./highlight.js\";\nimport { homeShell, type LayoutContext, pageShell } from \"./layout.js\";\nimport { renderDoc } from \"./pipeline.js\";\nimport { discoverPages } from \"./routes.js\";\nimport { buildSearchIndex } from \"./search.js\";\nimport { pressCSS } from \"./theme.js\";\nimport type { SiteConfig } from \"./types.js\";\n\nconst here = dirname(fileURLToPath(import.meta.url));\n\n// --- Utilities ---------------------------------------------------------------\n\nfunction flattenText(node: unknown, out: string[]): void {\n if (node == null) return;\n if (typeof node === \"string\") {\n if (!node.trimStart().startsWith(\"<\")) out.push(node);\n return;\n }\n if (typeof node === \"number\") {\n out.push(String(node));\n return;\n }\n if (Array.isArray(node)) {\n for (const child of node) flattenText(child, out);\n return;\n }\n if (typeof node === \"object\") {\n for (const [key, value] of Object.entries(\n node as Record<string, unknown>,\n )) {\n if (key.startsWith(\"_\") || key === \"$\" || key === \"style\") continue;\n if (\n key === \"class\" ||\n key.startsWith(\"data\") ||\n key === \"href\" ||\n key === \"id\"\n )\n continue;\n flattenText(value, out);\n }\n }\n}\n\nfunction parseStyleString(value: string): Record<string, string> {\n const style: Record<string, string> = {};\n for (const decl of value.split(\";\")) {\n const colon = decl.indexOf(\":\");\n if (colon === -1) continue;\n const prop = decl.slice(0, colon).trim();\n const val = decl.slice(colon + 1).trim();\n if (!prop || !val) continue;\n style[prop.replace(/-([a-z])/g, (_m, c: string) => c.toUpperCase())] = val;\n }\n return style;\n}\n\nfunction sanitizeStyles(node: unknown): void {\n if (Array.isArray(node)) {\n for (const child of node) sanitizeStyles(child);\n return;\n }\n if (!node || typeof node !== \"object\") return;\n const record = node as Record<string, unknown>;\n if (typeof record.style === \"string\")\n record.style = parseStyleString(record.style);\n for (const value of Object.values(record)) {\n if (value && (typeof value === \"object\" || Array.isArray(value)))\n sanitizeStyles(value);\n }\n}\n\nfunction firstParagraphText(body: unknown[]): string {\n for (const node of body) {\n if (!node || typeof node !== \"object\" || Array.isArray(node)) continue;\n const record = node as Record<string, unknown>;\n if (\"p\" in record) {\n const parts: string[] = [];\n flattenText(record.p, parts);\n const text = parts.join(\" \").replace(/\\s+/g, \" \").trim();\n if (text.length > 10) return text.slice(0, 160);\n }\n }\n return \"\";\n}\n\nfunction estimateReadingTime(textContent: string): number {\n return Math.max(1, Math.round(textContent.split(/\\s+/).length / 200));\n}\n\nfunction getLastUpdated(filePath: string): string | undefined {\n try {\n const result = execSync(`git log -1 --format=\"%aI\" -- \"${filePath}\"`, {\n encoding: \"utf8\",\n stdio: [\"pipe\", \"pipe\", \"ignore\"],\n timeout: 5000,\n }).trim();\n return result || undefined;\n } catch {\n return undefined;\n }\n}\n\n// --- Islands bundle ----------------------------------------------------------\n\nasync function buildIslandsBundle(\n outDir: string,\n searchEnabled: boolean,\n): Promise<void> {\n if (!searchEnabled) return;\n const islandsSource = join(here, \"islands.js\");\n const entrySource = `import{bootstrap}from${JSON.stringify(islandsSource)};bootstrap({search:{kind:\"search\",id:\"search\"}});`;\n const tmpEntry = join(outDir, \"_press_islands_entry.js\");\n mkdirSync(outDir, { recursive: true });\n writeFileSync(tmpEntry, entrySource, \"utf8\");\n const { build: esbuildBuild } = (await import(\n \"esbuild\"\n )) as typeof EsbuildType;\n await esbuildBuild({\n entryPoints: { \"press-islands\": tmpEntry },\n bundle: true,\n splitting: false,\n format: \"esm\",\n outdir: join(outDir, \"assets\"),\n entryNames: \"[name]\",\n minify: true,\n sourcemap: false,\n target: \"es2020\",\n define: { \"process.env.NODE_ENV\": '\"production\"' },\n logLevel: \"error\",\n });\n rmSync(tmpEntry);\n}\n\n// --- Sitemap -----------------------------------------------------------------\n\nfunction buildSitemap(routes: string[], hostname: string): string {\n const urls = routes.map((route) => {\n const loc =\n route === \"/\"\n ? `${hostname}/`\n : `${`${hostname}${route}`.replace(/\\/+$/, \"\")}/`;\n return ` <url><loc>${loc}</loc></url>`;\n });\n return `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\\n<urlset xmlns=\"http://www.sitemaps.org/schemas/sitemap/0.9\">\\n${urls.join(\"\\n\")}\\n</urlset>`;\n}\n\n// --- HTML document -----------------------------------------------------------\n\nconst RUNTIME_SCRIPT = `(function(){\ntry{var t=localStorage.getItem('dp-theme');if(t)document.documentElement.setAttribute('data-theme',t);}catch(_){}\naddEventListener('click',function(e){\n var el=e.target.closest&&e.target.closest('[data-theme-toggle]');\n if(el){var d=document.documentElement;var n=d.getAttribute('data-theme')==='dark'?'':'dark';d.setAttribute('data-theme',n);try{localStorage.setItem('dp-theme',n);}catch(_){}return;}\n var m=e.target.closest&&e.target.closest('[data-menu-toggle]');\n if(m){var d2=document.documentElement;d2.setAttribute('data-sidebar',d2.getAttribute('data-sidebar')==='open'?'':'open');return;}\n var cp=e.target.closest&&e.target.closest('[data-copy]');\n if(cp){var ci=cp.closest('.code-block-inner');var ce=ci&&ci.querySelector('code');if(ce){navigator.clipboard&&navigator.clipboard.writeText(ce.textContent||'').then(function(){cp.textContent='✓';setTimeout(function(){cp.textContent='⎘';},2000);}).catch(function(){});}return;}\n var st=e.target.closest&&e.target.closest('[data-sidebar-toggle]');\n if(st){var gr=st.closest('.dp-sidebar-group');if(gr)gr.classList.toggle('collapsed');return;}\n var da=e.target.closest&&e.target.closest('[data-dismiss-announcement]');\n if(da){var bar=document.querySelector('.dp-announcement');if(bar){var id=bar.getAttribute('data-id');if(id)try{localStorage.setItem('dp-dismiss-'+id,'1');}catch(_){}bar.remove();}return;}\n});\naddEventListener('DOMContentLoaded',function(){\n try{document.querySelectorAll('.dp-announcement[data-id]').forEach(function(b){if(localStorage.getItem('dp-dismiss-'+b.getAttribute('data-id')))b.remove();});}catch(_){}\n});\n})();`;\n\nfunction mermaidHeadScript(mermaid: boolean | { cdn?: string }): string {\n const cdn =\n typeof mermaid === \"object\" && mermaid.cdn\n ? mermaid.cdn\n : \"https://cdn.jsdelivr.net/npm/mermaid@11/dist/mermaid.esm.min.mjs\";\n return `<script type=\"module\">import mermaid from '${cdn}';mermaid.initialize({startOnLoad:false,theme:document.documentElement.getAttribute('data-theme')==='dark'?'dark':'default'});document.addEventListener('DOMContentLoaded',()=>mermaid.run({querySelector:'.dp-mermaid'}));</script>`;\n}\n\nfunction htmlDocument(\n result: { html: string; css: string; head: string; status: number },\n config: SiteConfig,\n searchEnabled: boolean,\n generatedCss: string,\n pageHead: string[],\n lang: string,\n): string {\n const islandsScript = searchEnabled\n ? `\\n<script type=\"module\" src=\"${config.base}assets/press-islands.js\"></script>`\n : \"\";\n const mermaidScript = config.themeConfig.mermaid\n ? mermaidHeadScript(config.themeConfig.mermaid)\n : \"\";\n return `<!DOCTYPE html>\n<html lang=\"${lang}\">\n<head>\n<meta charset=\"utf-8\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n${result.head}\n${config.head.join(\"\\n\")}\n${pageHead.join(\"\\n\")}\n${mermaidScript}\n<style>${generatedCss}</style>\n<style id=\"domphy-style\">${result.css}</style>\n<script>${RUNTIME_SCRIPT}</script>\n</head>\n<body>\n<div id=\"domphy-app\">${result.html}</div>${islandsScript}\n</body>\n</html>`;\n}\n\n// --- Main build --------------------------------------------------------------\n\nexport interface BuildOptions {\n config: SiteConfig;\n srcDir: string;\n outDir: string;\n publicDir?: string;\n}\n\nexport async function buildSite(options: BuildOptions): Promise<void> {\n const { config, srcDir, outDir, publicDir } = options;\n const searchEnabled = config.themeConfig.search !== false;\n const showLastUpdated = !!config.lastUpdated;\n\n // Discover pages: root + locales\n const pages = discoverPages(srcDir);\n const localePages: Array<{\n filePath: string;\n route: string;\n outFile: string;\n localeKey: string;\n }> = pages.map((p) => ({ ...p, localeKey: \"/\" }));\n if (config.locales) {\n for (const [localeKey, _locale] of Object.entries(config.locales)) {\n if (localeKey === \"/\") continue;\n const localeDir = resolve(\n srcDir,\n localeKey.replace(/^\\//, \"\").replace(/\\/$/, \"\"),\n );\n if (!existsSync(localeDir)) continue;\n for (const p of discoverPages(localeDir)) {\n const prefix = localeKey.replace(/\\/$/, \"\");\n localePages.push({\n filePath: p.filePath,\n route: prefix + p.route,\n outFile:\n p.outFile === \"index.html\"\n ? `${localeKey.replace(/^\\//, \"\")}index.html`\n : localeKey.replace(/^\\//, \"\") + p.outFile,\n localeKey,\n });\n }\n }\n }\n console.log(`Discovered ${localePages.length} pages.`);\n\n const highlight = await createHighlighter();\n const generatedCss = themeCSS() + pressCSS();\n\n // 1. Render markdown → Domphy docs\n const built: Array<{\n route: string;\n outFile: string;\n title: string;\n localeKey: string;\n doc: Awaited<ReturnType<typeof renderDoc>>;\n lastUpdated: string | undefined;\n readingTime: number;\n filePath: string;\n relPath: string;\n }> = [];\n const searchDocs = [];\n\n for (const page of localePages) {\n const source = readFileSync(page.filePath, \"utf8\");\n const doc = await renderDoc(source, {\n filePath: page.filePath,\n docsDir: srcDir,\n repoRoot: srcDir,\n highlight,\n });\n if (doc.frontmatter.draft === true) {\n console.log(` ↷ ${page.route} (draft, skipped)`);\n continue;\n }\n sanitizeStyles(doc.body);\n const textParts: string[] = [];\n flattenText(doc.body, textParts);\n const textContent = textParts.join(\" \").replace(/\\s+/g, \" \").trim();\n const readingTime = estimateReadingTime(textContent);\n const lastUpdated = showLastUpdated\n ? getLastUpdated(page.filePath)\n : undefined;\n const relPath = relative(srcDir, page.filePath).replace(/\\\\/g, \"/\");\n\n built.push({\n route: page.route,\n outFile: page.outFile,\n title: doc.title,\n localeKey: page.localeKey,\n doc,\n lastUpdated,\n readingTime,\n filePath: page.filePath,\n relPath,\n });\n searchDocs.push({\n route: page.route,\n title: doc.title,\n text: textContent.slice(0, 20000),\n toc: doc.toc,\n });\n }\n\n // Per-page metadata maps (route → head strings / lang code)\n const pageHeadMap = new Map<string, string[]>();\n const pageLangMap = new Map<string, string>();\n\n // 2. Define @domphy/app routes\n const appRoutes = defineRoutes(\n built.map((page) => {\n const localeConfig = config.locales?.[page.localeKey];\n const mergedTheme = localeConfig?.themeConfig\n ? { ...config.themeConfig, ...localeConfig.themeConfig }\n : config.themeConfig;\n const mergedConfig: SiteConfig = { ...config, themeConfig: mergedTheme };\n const lang = localeConfig?.lang ?? \"en\";\n const ctx: LayoutContext = {\n route: page.route,\n title: page.title,\n body: page.doc.body,\n toc: page.doc.toc,\n frontmatter: page.doc.frontmatter,\n config: mergedConfig,\n lastUpdated: page.lastUpdated,\n readingTime: page.readingTime,\n filePath: page.relPath,\n };\n const isHome =\n page.route === \"/\" ||\n (page.localeKey !== \"/\" && page.route === page.localeKey);\n const description =\n typeof page.doc.frontmatter.description === \"string\"\n ? page.doc.frontmatter.description\n : firstParagraphText(page.doc.body) || config.description;\n const siteTitle = localeConfig?.title ?? config.title;\n const pageTitle =\n page.title === siteTitle ? siteTitle : `${page.title} | ${siteTitle}`;\n const canonical =\n page.route === \"/\"\n ? `${config.hostname}/`\n : `${config.hostname}${page.route}/`;\n // Store per-page head and lang for use during HTML serialization\n const pageHead = Array.isArray(page.doc.frontmatter.head)\n ? (page.doc.frontmatter.head as string[]).filter(\n (s) => typeof s === \"string\",\n )\n : [];\n pageHeadMap.set(page.route, pageHead);\n pageLangMap.set(page.route, lang);\n return {\n path: page.route,\n metadata: {\n title: pageTitle,\n description,\n metadataBase: config.hostname,\n openGraph: {\n title: pageTitle,\n description,\n url: page.route === \"/\" ? \"/\" : `${page.route}/`,\n siteName: siteTitle,\n type: \"website\" as const,\n },\n twitter: { card: \"summary\" as const, title: pageTitle, description },\n alternates: { canonical },\n },\n page: () => (isHome ? homeShell(ctx) : pageShell(ctx)),\n };\n }),\n );\n const app = createApp(appRoutes);\n\n // 3. Render each route to static HTML\n rmSync(outDir, { recursive: true, force: true });\n mkdirSync(outDir, { recursive: true });\n\n const failures: Array<{ route: string; error: string }> = [];\n let totalBytes = 0;\n for (const page of built) {\n try {\n const result = await app.renderToString(page.route);\n const pageHead = pageHeadMap.get(page.route) ?? [];\n const lang = pageLangMap.get(page.route) ?? \"en\";\n const html = htmlDocument(\n result,\n config,\n searchEnabled,\n generatedCss,\n pageHead,\n lang,\n );\n const outPath = join(outDir, page.outFile);\n mkdirSync(dirname(outPath), { recursive: true });\n writeFileSync(outPath, html, \"utf8\");\n totalBytes += html.length;\n if (result.status !== 200)\n console.warn(` ! ${page.route} -> status ${result.status}`);\n } catch (error) {\n failures.push({\n route: page.route,\n error: String((error as Error).message || error),\n });\n }\n }\n if (failures.length > 0) {\n console.warn(`\\n${failures.length} page(s) failed:`);\n for (const failure of failures)\n console.warn(` ✗ ${failure.route}: ${failure.error}`);\n }\n\n // 4. Islands bundle\n await buildIslandsBundle(outDir, searchEnabled);\n\n // 5. Search index\n writeFileSync(\n join(outDir, \"search-index.json\"),\n buildSearchIndex(searchDocs),\n \"utf8\",\n );\n\n // 6. Public dir\n if (publicDir && existsSync(publicDir))\n cpSync(publicDir, outDir, { recursive: true });\n\n // 7. Sitemap\n if (config.hostname) {\n writeFileSync(\n join(outDir, \"sitemap.xml\"),\n buildSitemap(\n built.map((p) => p.route),\n config.hostname,\n ),\n \"utf8\",\n );\n }\n\n console.log(\n `Built ${built.length} pages (${(totalBytes / 1024).toFixed(0)} KB) → ${outDir}`,\n );\n}\n","import { type BundledLanguage, createHighlighter as createShiki } from \"shiki\";\n\nconst THEME = \"github-light\";\n\nconst LANGUAGES: BundledLanguage[] = [\n \"typescript\",\n \"javascript\",\n \"tsx\",\n \"jsx\",\n \"json\",\n \"bash\",\n \"shellscript\",\n \"html\",\n \"css\",\n \"vue\",\n \"svelte\",\n \"markdown\",\n \"diff\",\n \"yaml\",\n \"ruby\",\n \"python\",\n \"go\",\n \"rust\",\n \"sql\",\n];\n\nconst ALIASES: Record<string, string> = {\n ts: \"typescript\",\n js: \"javascript\",\n sh: \"bash\",\n shell: \"bash\",\n zsh: \"bash\",\n md: \"markdown\",\n yml: \"yaml\",\n htm: \"html\",\n rb: \"ruby\",\n py: \"python\",\n};\n\nlet pending: ReturnType<typeof createShiki> | null = null;\n\nexport function escapeHtml(text: string): string {\n return text\n .replace(/&/g, \"&amp;\")\n .replace(/</g, \"&lt;\")\n .replace(/>/g, \"&gt;\")\n .replace(/\"/g, \"&quot;\");\n}\n\nfunction unwrapCode(html: string): string {\n const match = html.match(/<code[^>]*>([\\s\\S]*)<\\/code>/);\n return match ? match[1] : html;\n}\n\n// --- Fence info parsing -------------------------------------------------------\n\nexport interface FenceMeta {\n lang: string;\n highlightLines: Set<number>;\n lineNumbers: boolean;\n title: string | null;\n}\n\nexport function parseFenceInfo(info: string): FenceMeta {\n const rawLang = (info.match(/^(\\S+)/) ?? [])[1] ?? \"\";\n const lang = ALIASES[rawLang.toLowerCase()] ?? rawLang.toLowerCase();\n const lineNumbers = info.includes(\":line-numbers\");\n // Title: [text] where text contains non-digit chars (to not conflict with line range labels)\n const titleMatch = info.match(/\\[([^\\]]*[a-zA-Z.][^\\]]*)\\]/);\n const title = titleMatch ? titleMatch[1] : null;\n const rangeMatch = info.match(/\\{([0-9,\\s-]+)\\}/);\n const highlightLines = new Set<number>();\n if (rangeMatch) {\n for (const part of rangeMatch[1].split(\",\")) {\n const range = part.trim().split(\"-\").map(Number);\n if (range.length === 1 && !Number.isNaN(range[0]))\n highlightLines.add(range[0]);\n else if (range.length === 2)\n for (let i = range[0]; i <= range[1]; i++) highlightLines.add(i);\n }\n }\n return { lang, highlightLines, lineNumbers, title };\n}\n\n// --- [!code ...] annotation extraction ----------------------------------------\n\nconst CODE_ANNOTATION_RE = /\\s*\\/\\/ \\[!code ([^\\]]+)\\]\\s*$/;\n\nconst ANNOTATION_CLASSES: Record<string, string> = {\n \"++\": \"diff add\",\n \"--\": \"diff remove\",\n highlight: \"highlighted\",\n focus: \"focus\",\n error: \"highlighted error\",\n warning: \"highlighted warning\",\n};\n\ninterface Annotations {\n cleanCode: string;\n lineClasses: Map<number, string>;\n hasFocus: boolean;\n}\n\nfunction extractAnnotations(code: string): Annotations {\n const lines = code.split(\"\\n\");\n const lineClasses = new Map<number, string>();\n const cleanLines: string[] = [];\n let hasFocus = false;\n\n for (const line of lines) {\n const match = CODE_ANNOTATION_RE.exec(line);\n if (match) {\n const keyword = match[1].trim();\n const cls = ANNOTATION_CLASSES[keyword];\n if (cls) {\n if (cls.includes(\"focus\")) hasFocus = true;\n lineClasses.set(cleanLines.length + 1, cls);\n }\n cleanLines.push(line.replace(CODE_ANNOTATION_RE, \"\"));\n } else {\n cleanLines.push(line);\n }\n }\n return { cleanCode: cleanLines.join(\"\\n\"), lineClasses, hasFocus };\n}\n\n// --- Post-process shiki HTML --------------------------------------------------\n\nfunction annotateLines(\n html: string,\n lineClasses: Map<number, string>,\n highlightLines: Set<number>,\n hasFocus: boolean,\n lineNumbers: boolean,\n): string {\n let lineIndex = 0;\n return html.replace(/<span class=\"line\">/g, () => {\n lineIndex++;\n const annotationCls = lineClasses.get(lineIndex) ?? \"\";\n const classes = [\"line\"];\n if (annotationCls) classes.push(...annotationCls.split(\" \"));\n else if (highlightLines.has(lineIndex)) classes.push(\"highlighted\");\n if (hasFocus && !annotationCls.includes(\"focus\")) classes.push(\"dimmed\");\n const numHtml = lineNumbers\n ? `<span class=\"line-number\">${lineIndex}</span>`\n : \"\";\n return `${numHtml}<span class=\"${classes.join(\" \")}\">`;\n });\n}\n\n// --- Public API ---------------------------------------------------------------\n\nexport async function createHighlighter(): Promise<\n (code: string, lang: string) => string\n> {\n if (!pending) pending = createShiki({ themes: [THEME], langs: LANGUAGES });\n const highlighter = await pending;\n const loaded = new Set(highlighter.getLoadedLanguages());\n return (code: string, lang: string): string => {\n const resolved = ALIASES[lang?.toLowerCase()] ?? lang?.toLowerCase();\n if (!resolved || !loaded.has(resolved)) return escapeHtml(code);\n return unwrapCode(\n highlighter.codeToHtml(code, { lang: resolved, theme: THEME }),\n );\n };\n}\n\n// renderFence: converts one fence block to HTML with title, copy button, line annotations.\nexport function renderFence(\n code: string,\n info: string,\n highlight: (code: string, lang: string) => string,\n): string {\n const { lang, highlightLines, lineNumbers, title } = parseFenceInfo(info);\n\n if (lang === \"mermaid\") {\n return `<div class=\"dp-mermaid language-mermaid\">${escapeHtml(code.trim())}</div>`;\n }\n\n const { cleanCode, lineClasses, hasFocus } = extractAnnotations(code);\n const innerHtml = highlight(cleanCode.trimEnd(), lang);\n const annotated = annotateLines(\n innerHtml,\n lineClasses,\n highlightLines,\n hasFocus,\n lineNumbers,\n );\n const hasAnnotations = highlightLines.size > 0 || lineClasses.size > 0;\n const titleHtml = title\n ? `<div class=\"code-block-title\"><span>${escapeHtml(title)}</span></div>`\n : \"\";\n const preClass = [\n lineNumbers ? \"line-numbers\" : \"\",\n hasAnnotations ? \"has-annotations\" : \"\",\n hasFocus ? \"has-focus\" : \"\",\n ]\n .filter(Boolean)\n .join(\" \");\n const langClass = lang ? `language-${lang}` : \"\";\n return `<div class=\"code-block ${langClass}\">${titleHtml}<div class=\"code-block-inner\"><pre class=\"${preClass}\"><code>${annotated}</code></pre><button class=\"code-copy-btn\" type=\"button\" aria-label=\"Copy code\" data-copy>⎘</button></div></div>`;\n}\n","// Page shell: header, sidebar, content, TOC aside, prev/next, footer.\n// CSS comes entirely from inline style:{} objects so generateCSS() is the\n// single source of truth — no hand-written class-targeted CSS strings.\n\nimport { navLink } from \"@domphy/app\";\nimport type { DomphyElement, StyleObject } from \"@domphy/core\";\nimport { themeColor, themeSpacing } from \"@domphy/theme\";\nimport { toolbar, toolbarSpacer } from \"@domphy/ui\";\nimport { prevNextForRoute, sidebarForRoute } from \"./routes.js\";\nimport type { SidebarItem, SiteConfig, SocialLink, TocEntry } from \"./types.js\";\n\n// Avoids TypeScript widening string literals to 'string' when style objects\n// are defined as standalone variables (not inlined directly on elements).\nconst style = <T extends StyleObject>(obj: T): T => obj;\n\nexport interface LayoutContext {\n route: string;\n title: string;\n body: DomphyElement[];\n toc: TocEntry[];\n frontmatter: Record<string, unknown>;\n config: SiteConfig;\n /** ISO date string from git log, if lastUpdated:true and git available. */\n lastUpdated?: string;\n /** Estimated reading time in minutes. */\n readingTime?: number;\n /** Relative path from srcDir (e.g. \"guide/index.md\"), used for editLink. */\n filePath?: string;\n}\n\n// Theme tokens — static CSS var references (no listener needed for SSR CSS)\nconst tc = (tone: string, color?: string): string =>\n themeColor(null, tone as any, color);\nconst ts = (n: number): string => themeSpacing(n);\n\nconst bg = tc(\"inherit\");\nconst bgSoft = tc(\"shift-1\");\nconst bgMute = tc(\"shift-2\");\nconst border = tc(\"shift-3\");\nconst textSoft = tc(\"shift-6\");\nconst text = tc(\"shift-9\");\nconst textStrong = tc(\"shift-11\");\nconst brand = tc(\"shift-9\", \"primary\");\nconst brandHover = tc(\"shift-10\", \"primary\");\n\nconst headerH = ts(14);\nconst sidebarW = ts(62);\nconst asideW = ts(56);\nconst contentMax = ts(190);\n\n// --- Social icons -------------------------------------------------------\n\nconst SOCIAL_LABELS: Record<string, string> = {\n github: \"GitHub\",\n twitter: \"Twitter\",\n discord: \"Discord\",\n youtube: \"YouTube\",\n linkedin: \"LinkedIn\",\n mastodon: \"Mastodon\",\n npm: \"npm\",\n bluesky: \"Bluesky\",\n};\n\nfunction socialLinkEl(social: SocialLink): DomphyElement {\n const name = social.icon.toLowerCase();\n const isUrl = social.icon.startsWith(\"http\") || social.icon.startsWith(\"/\");\n const innerEl: DomphyElement = isUrl\n ? ({\n img: null,\n src: social.icon,\n alt: social.ariaLabel ?? name,\n width: \"18\",\n height: \"18\",\n } as DomphyElement)\n : // dp-social-icon dp-icon-* classes drive SVG mask-image in pressCSS\n ({\n span: \"\",\n class: `dp-social-icon dp-icon-${name}`,\n ariaHidden: \"true\",\n } as DomphyElement);\n return {\n a: [innerEl],\n href: social.link,\n ariaLabel: social.ariaLabel ?? SOCIAL_LABELS[name] ?? social.icon,\n target: \"_blank\",\n rel: \"noopener noreferrer\",\n style: {\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n width: ts(8.5),\n height: ts(8.5),\n borderRadius: ts(2),\n color: textSoft,\n background: bgSoft,\n border: `1px solid ${border}`,\n fontSize: \"10px\",\n fontWeight: \"700\",\n flexShrink: \"0\",\n \"&:hover\": { color: text, borderColor: textSoft, textDecoration: \"none\" },\n },\n } as DomphyElement;\n}\n\n// --- Page link helper ---------------------------------------------------\n\nfunction pageLink(text: string, href: string): DomphyElement {\n return { a: text, href, $: [navLink({ href })] } as DomphyElement;\n}\n\n// --- Nav dropdown -------------------------------------------------------\n\nfunction navDropdown(item: {\n text: string;\n items: { text: string; link: string }[];\n}): DomphyElement {\n const menuStyle = style({\n display: \"none\",\n position: \"absolute\",\n top: `calc(100% + ${ts(2)})`,\n right: \"0\",\n background: bgSoft,\n border: `1px solid ${border}`,\n borderRadius: ts(2),\n padding: ts(1.5),\n minWidth: ts(40),\n zIndex: \"100\",\n flexDirection: \"column\" as const,\n gap: ts(0.5),\n boxShadow: \"0 4px 16px rgba(0,0,0,.1)\",\n \"& a\": {\n display: \"block\",\n padding: `${ts(1.25)} ${ts(2.5)}`,\n borderRadius: ts(1.25),\n fontSize: \"13px\",\n },\n \"& a:hover\": { background: bgMute },\n });\n return {\n div: [\n {\n span: item.text,\n style: {\n color: textSoft,\n fontSize: \"14px\",\n fontWeight: \"500\",\n cursor: \"pointer\",\n userSelect: \"none\",\n \"&::after\": { content: '\" ▾\"', fontSize: \"10px\", opacity: \".6\" },\n },\n },\n {\n div: item.items.map((child) => pageLink(child.text, child.link)),\n style: menuStyle,\n },\n ],\n style: {\n position: \"relative\",\n display: \"flex\",\n alignItems: \"center\",\n \"&:hover > div:last-child, &:focus-within > div:last-child\": {\n display: \"flex\",\n },\n },\n };\n}\n\n// --- Announcement bar ---------------------------------------------------\n\nfunction announcementBar(config: SiteConfig): DomphyElement | null {\n const bar = config.themeConfig.announcementBar;\n if (!bar) return null;\n const idAttr = bar.id ? bar.id : \"\";\n const children: DomphyElement[] = [{ span: bar.text } as DomphyElement];\n if (bar.dismissible !== false) {\n children.push({\n button: \"✕\",\n type: \"button\",\n dataDismissAnnouncement: \"\",\n ariaLabel: \"Dismiss\",\n style: {\n background: \"none\",\n border: \"none\",\n color: bg,\n cursor: \"pointer\",\n fontSize: \"14px\",\n opacity: \".7\",\n padding: `${ts(0.5)} ${ts(1.5)}`,\n borderRadius: ts(1),\n flexShrink: \"0\",\n \"&:hover\": { opacity: \"1\" },\n },\n } as DomphyElement);\n }\n return {\n div: children,\n class: \"dp-announcement\", // kept: JS uses querySelector('.dp-announcement')\n ...(idAttr ? { dataId: idAttr } : {}),\n style: {\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n gap: ts(3),\n padding: `${ts(2.5)} ${ts(6)}`,\n background: brand,\n color: bg,\n fontSize: \"14px\",\n fontWeight: \"500\",\n textAlign: \"center\",\n \"& a\": { color: bg, fontWeight: \"700\" },\n },\n } as DomphyElement;\n}\n\n// --- Locale switcher ----------------------------------------------------\n\nfunction localeSwitcher(ctx: LayoutContext): DomphyElement | null {\n const { config, route } = ctx;\n if (!config.locales) return null;\n const entries = Object.entries(config.locales);\n if (entries.length <= 1) return null;\n\n let currentKey = \"/\";\n let barePath = route;\n for (const [key] of entries) {\n if (key !== \"/\" && route.startsWith(key.replace(/\\/$/, \"\"))) {\n currentKey = key;\n barePath = route.slice(key.replace(/\\/$/, \"\").length) || \"/\";\n break;\n }\n }\n const currentLocale = config.locales[currentKey];\n if (!currentLocale) return null;\n\n const links: DomphyElement[] = entries.map(([key, locale]) => {\n const prefix = key === \"/\" ? \"\" : key.replace(/\\/$/, \"\");\n const href = prefix + (barePath === \"/\" ? \"/\" : barePath);\n const isActive = key === currentKey;\n return {\n a: locale.label,\n href,\n ...(isActive ? { ariaCurrent: \"true\" } : {}),\n lang: locale.lang,\n style: {\n display: \"block\",\n padding: `${ts(1.25)} ${ts(2.5)}`,\n borderRadius: ts(1.25),\n fontSize: \"13px\",\n color: textSoft,\n ...(isActive ? { color: brand, fontWeight: \"600\" } : {}),\n \"&:hover\": { background: bgMute, color: text, textDecoration: \"none\" },\n },\n } as DomphyElement;\n });\n\n const menuStyle = style({\n display: \"none\",\n position: \"absolute\",\n top: `calc(100% + ${ts(2)})`,\n right: \"0\",\n background: bgSoft,\n border: `1px solid ${border}`,\n borderRadius: ts(2),\n padding: ts(1.5),\n minWidth: ts(32),\n zIndex: \"200\",\n flexDirection: \"column\" as const,\n gap: ts(0.5),\n boxShadow: \"0 4px 16px rgba(0,0,0,.1)\",\n });\n return {\n div: [\n {\n span: [\"🌐 \", currentLocale.label],\n style: {\n color: textSoft,\n fontSize: \"13px\",\n fontWeight: \"500\",\n cursor: \"pointer\",\n userSelect: \"none\",\n padding: `${ts(1)} ${ts(2)}`,\n border: `1px solid ${border}`,\n borderRadius: ts(1.5),\n background: bgSoft,\n whiteSpace: \"nowrap\",\n display: \"flex\",\n alignItems: \"center\",\n gap: ts(1),\n \"&::after\": { content: '\" ▾\"', fontSize: \"10px\", opacity: \".6\" },\n },\n },\n { div: links, style: menuStyle },\n ],\n ariaLabel: \"Select language\",\n style: {\n position: \"relative\",\n display: \"flex\",\n alignItems: \"center\",\n \"&:hover > div:last-child, &:focus-within > div:last-child\": {\n display: \"flex\",\n },\n },\n } as DomphyElement;\n}\n\n// --- Header -------------------------------------------------------------\n\nfunction header(ctx: LayoutContext): DomphyElement {\n const { config } = ctx;\n const searchEnabled = config.themeConfig.search !== false;\n const logo = config.themeConfig.logo;\n\n const logoInner: DomphyElement[] = logo\n ? typeof logo === \"string\"\n ? [\n {\n img: null,\n src: logo,\n alt: config.title,\n style: { height: ts(7), width: \"auto\", display: \"block\" },\n } as DomphyElement,\n ]\n : [\n {\n img: null,\n src: logo.light,\n alt: config.title,\n class: \"dp-logo-light\",\n style: { height: ts(7), width: \"auto\", display: \"block\" },\n } as DomphyElement,\n {\n img: null,\n src: logo.dark,\n alt: config.title,\n class: \"dp-logo-dark\",\n style: { height: ts(7), width: \"auto\", display: \"block\" },\n } as DomphyElement,\n ]\n : [];\n\n const logoStyle = {\n fontWeight: \"700\",\n fontSize: \"18px\",\n color: textStrong,\n whiteSpace: \"nowrap\",\n flexShrink: \"0\",\n textDecoration: \"none\",\n \"&:hover\": { textDecoration: \"none\" },\n };\n const logoEl: DomphyElement = logo\n ? ({ a: logoInner, href: config.base, style: logoStyle } as DomphyElement)\n : ({\n a: config.title,\n href: config.base,\n style: logoStyle,\n } as DomphyElement);\n\n const socialEls: DomphyElement[] = (config.themeConfig.socialLinks ?? []).map(\n socialLinkEl,\n );\n const localeEl = localeSwitcher(ctx);\n\n return {\n header: [\n logoEl,\n toolbarSpacer(),\n {\n nav: config.themeConfig.nav.map((item) =>\n item.items\n ? navDropdown(\n item as {\n text: string;\n items: { text: string; link: string }[];\n },\n )\n : pageLink(item.text, item.link!),\n ),\n $: [toolbar({ gap: 4 })],\n ariaLabel: \"Primary\",\n style: {\n \"& a\": {\n color: textSoft,\n fontSize: \"14px\",\n fontWeight: \"500\",\n whiteSpace: \"nowrap\",\n lineHeight: \"1\",\n },\n \"& a:hover, & a[aria-current='page']\": {\n color: brand,\n textDecoration: \"none\",\n },\n \"@media (max-width: 860px)\": { display: \"none\" },\n },\n },\n {\n div: [\n ...(searchEnabled\n ? [\n {\n div: [\n {\n input: null,\n type: \"search\",\n placeholder:\n (typeof config.themeConfig.search === \"object\" &&\n config.themeConfig.search.placeholder) ||\n \"Search...\",\n ariaLabel: \"Search documentation\",\n style: {\n width: \"100%\",\n height: ts(8),\n padding: `0 ${ts(2.5)}`,\n border: `1px solid ${border}`,\n borderRadius: ts(1.5),\n background: bgSoft,\n color: textSoft,\n fontSize: \"13px\",\n fontFamily: \"inherit\",\n outline: \"none\",\n cursor: \"pointer\",\n \"&::placeholder\": { color: textSoft },\n },\n },\n ],\n dataIsland: \"search\",\n style: {\n width: ts(50),\n \"@media (max-width: 860px)\": { width: ts(35) },\n },\n } as DomphyElement,\n ]\n : []),\n ...socialEls,\n ...(localeEl ? [localeEl] : []),\n {\n button: \"◐\",\n type: \"button\",\n ariaLabel: \"Toggle dark mode\",\n dataThemeToggle: \"\",\n style: {\n border: `1px solid ${border}`,\n background: bgSoft,\n color: text,\n borderRadius: ts(2),\n width: ts(8.5),\n height: ts(8.5),\n cursor: \"pointer\",\n fontSize: \"16px\",\n flexShrink: \"0\",\n },\n },\n {\n button: \"☰\",\n type: \"button\",\n ariaLabel: \"Toggle menu\",\n dataMenuToggle: \"\",\n style: {\n border: `1px solid ${border}`,\n background: bgSoft,\n color: text,\n borderRadius: ts(2),\n width: ts(8.5),\n height: ts(8.5),\n cursor: \"pointer\",\n fontSize: \"16px\",\n flexShrink: \"0\",\n display: \"none\",\n \"@media (max-width: 860px)\": { display: \"block\" },\n },\n },\n ],\n $: [toolbar({ gap: 2 })],\n style: { flexShrink: \"0\" },\n },\n ],\n $: [toolbar({ gap: 4 })],\n style: {\n position: \"sticky\",\n top: \"0\",\n height: headerH,\n background: bg,\n borderBottom: `1px solid ${border}`,\n zIndex: \"100\",\n padding: `0 ${ts(6)}`,\n \"@media (max-width: 860px)\": { padding: `0 ${ts(3)}` },\n },\n };\n}\n\n// --- Sidebar badges -----------------------------------------------------\n\nfunction badgeEl(badge: NonNullable<SidebarItem[\"badge\"]>): DomphyElement {\n const colorMap: Record<string, string> = {\n tip: brand,\n info: textSoft,\n warning: tc(\"shift-9\", \"warning\"),\n danger: tc(\"shift-9\", \"danger\"),\n };\n const bgMap: Record<string, string> = {\n tip: `color-mix(in srgb,${brand} 12%,${bg})`,\n info: bgMute,\n warning: `color-mix(in srgb,${tc(\"shift-9\", \"warning\")} 12%,${bg})`,\n danger: `color-mix(in srgb,${tc(\"shift-9\", \"danger\")} 12%,${bg})`,\n };\n const type = badge.type ?? \"tip\";\n return {\n span: badge.text,\n style: {\n display: \"inline-block\",\n padding: `${ts(0.5)} ${ts(1.75)}`,\n borderRadius: ts(2.5),\n fontSize: \"11px\",\n fontWeight: \"700\",\n lineHeight: \"1.4\",\n whiteSpace: \"nowrap\",\n verticalAlign: \"middle\",\n background: bgMap[type] ?? bgMute,\n color: colorMap[type] ?? textSoft,\n },\n } as DomphyElement;\n}\n\n// --- Sidebar ------------------------------------------------------------\n\nfunction pageLinkWithBadge(\n text: string,\n href: string,\n badge?: SidebarItem[\"badge\"],\n): DomphyElement {\n if (!badge) return pageLink(text, href);\n return {\n a: [{ span: text }, badgeEl(badge)],\n href,\n $: [navLink({ href })],\n style: { display: \"flex\", alignItems: \"center\" },\n } as DomphyElement;\n}\n\nfunction sidebarGroup(group: SidebarItem): DomphyElement {\n const children: DomphyElement[] = [];\n const isCollapsible = group.items && group.items.length > 0;\n\n if (group.link) {\n children.push(pageLinkWithBadge(group.text, group.link, group.badge));\n } else {\n const titleChildren: DomphyElement[] = [\n { span: group.text } as DomphyElement,\n ];\n if (group.badge) titleChildren.push(badgeEl(group.badge));\n if (isCollapsible) {\n titleChildren.push({\n button: group.collapsed ? \"›\" : \"‹\",\n type: \"button\",\n ariaLabel: group.collapsed ? \"Expand\" : \"Collapse\",\n dataSidebarToggle: \"\",\n style: {\n marginLeft: \"auto\",\n background: \"none\",\n border: \"none\",\n cursor: \"pointer\",\n color: textSoft,\n fontSize: \"14px\",\n padding: `0 ${ts(1)}`,\n lineHeight: \"1\",\n \"&:hover\": { color: text },\n },\n } as DomphyElement);\n }\n children.push({\n div: titleChildren,\n style: {\n display: \"flex\",\n alignItems: \"center\",\n gap: ts(1.5),\n fontSize: \"13px\",\n fontWeight: \"700\",\n color: textStrong,\n margin: `${ts(2)} 0 ${ts(1)}`,\n },\n } as DomphyElement);\n }\n\n if (group.items) {\n const itemsEl: DomphyElement[] = [];\n for (const item of group.items) {\n if (item.items) {\n itemsEl.push({\n div: item.text,\n style: {\n fontSize: \"12px\",\n color: textSoft,\n padding: `${ts(1)} ${ts(3)}`,\n fontWeight: \"600\",\n },\n } as DomphyElement);\n for (const leaf of item.items) {\n if (leaf.link)\n itemsEl.push(pageLinkWithBadge(leaf.text, leaf.link, leaf.badge));\n }\n } else if (item.link) {\n itemsEl.push(pageLinkWithBadge(item.text, item.link, item.badge));\n }\n }\n // dp-sidebar-items class kept: pressCSS uses it for .dp-sidebar-group.collapsed .dp-sidebar-items\n children.push({\n div: itemsEl,\n class: \"dp-sidebar-items\",\n style: { display: \"flex\", flexDirection: \"column\" },\n } as DomphyElement);\n }\n\n const groupClass = [\n \"dp-sidebar-group\",\n isCollapsible && group.collapsed ? \"collapsed\" : \"\",\n ]\n .filter(Boolean)\n .join(\" \");\n // dp-sidebar-group class kept: JS uses .closest('.dp-sidebar-group') + classList.toggle('collapsed')\n return {\n div: children,\n class: groupClass,\n style: { marginBottom: ts(3.5) },\n } as DomphyElement;\n}\n\nfunction sidebar(ctx: LayoutContext): DomphyElement {\n const groups = sidebarForRoute(ctx.route, ctx.config);\n return {\n nav: groups.map(sidebarGroup),\n ariaLabel: \"Documentation\", // used as stable selector in pressCSS mobile-open rule\n style: {\n position: \"sticky\",\n top: headerH,\n maxHeight: `calc(100vh - ${headerH})`,\n overflowY: \"auto\",\n padding: `${ts(6)} ${ts(3)} ${ts(12)} ${ts(6)}`,\n borderRight: `1px solid ${border}`,\n \"& a\": {\n display: \"flex\",\n alignItems: \"center\",\n gap: ts(1.5),\n padding: `${ts(1.25)} ${ts(3)}`,\n fontSize: \"14px\",\n color: textSoft,\n borderRadius: ts(1.5),\n },\n \"& a:hover\": { color: text, textDecoration: \"none\" },\n \"& a[aria-current='page']\": {\n color: brand,\n fontWeight: \"600\",\n background: bgSoft,\n },\n \"@media (max-width: 860px)\": {\n position: \"fixed\",\n top: headerH,\n left: \"0\",\n bottom: \"0\",\n width: \"80%\",\n maxWidth: ts(80),\n background: bg,\n zIndex: \"25\",\n transform: \"translateX(-100%)\",\n transition: \"transform .2s ease\",\n maxHeight: \"none\",\n },\n },\n };\n}\n\n// --- TOC aside ----------------------------------------------------------\n\nfunction tocAside(ctx: LayoutContext): DomphyElement | null {\n if (ctx.frontmatter.aside === false) return null;\n const [minLevel, maxLevel] = ctx.config.themeConfig.outline?.level ?? [2, 3];\n const entries = ctx.toc.filter(\n (e) => e.level >= minLevel && e.level <= maxLevel,\n );\n if (entries.length === 0) return null;\n const tocTitle = ctx.config.themeConfig.tocTitle ?? \"On this page\";\n\n const indentMap: Record<number, string> = { 2: \"0\", 3: ts(3), 4: ts(6) };\n return {\n aside: [\n {\n div: tocTitle,\n style: { fontWeight: \"700\", marginBottom: ts(2), color: text },\n },\n {\n nav: entries.map((e) => ({\n a: e.text,\n href: `#${e.slug}`,\n style: {\n display: \"block\",\n padding: `${ts(0.75)} 0`,\n color: textSoft,\n paddingLeft: indentMap[e.level] ?? \"0\",\n \"&:hover\": { color: brand, textDecoration: \"none\" },\n },\n })),\n },\n ],\n style: {\n position: \"sticky\",\n top: headerH,\n maxHeight: `calc(100vh - ${headerH})`,\n overflowY: \"auto\",\n padding: `${ts(8)} ${ts(6)}`,\n fontSize: \"13px\",\n },\n };\n}\n\n// --- Prev/next ----------------------------------------------------------\n\nfunction prevNext(ctx: LayoutContext): DomphyElement | null {\n const { prev, next } = prevNextForRoute(ctx.route, ctx.config);\n if (!prev && !next) return null;\n const linkStyle = style({\n display: \"block\",\n padding: `${ts(3)} ${ts(4)}`,\n border: `1px solid ${border}`,\n borderRadius: ts(2),\n fontWeight: \"600\",\n flex: \"1\",\n \"&:hover\": { borderColor: brand, textDecoration: \"none\" },\n });\n return {\n nav: [\n prev\n ? {\n a: [\n {\n small: \"Previous\",\n style: {\n display: \"block\",\n color: textSoft,\n fontWeight: \"400\",\n fontSize: \"12px\",\n },\n },\n { span: prev.text },\n ],\n href: prev.link,\n style: linkStyle,\n }\n : { span: \"\" },\n next\n ? {\n a: [\n {\n small: \"Next\",\n style: {\n display: \"block\",\n color: textSoft,\n fontWeight: \"400\",\n fontSize: \"12px\",\n },\n },\n { span: next.text },\n ],\n href: next.link,\n style: { ...linkStyle, textAlign: \"right\" },\n }\n : { span: \"\" },\n ],\n ariaLabel: \"Page navigation\",\n style: {\n display: \"flex\",\n justifyContent: \"space-between\",\n gap: ts(4),\n marginTop: ts(12),\n paddingTop: ts(6),\n borderTop: `1px solid ${border}`,\n },\n };\n}\n\n// --- Edit link + last updated -------------------------------------------\n\nfunction docFooter(ctx: LayoutContext): DomphyElement | null {\n const { editLink } = ctx.config.themeConfig;\n const showLastUpdated = ctx.config.lastUpdated;\n const hasEdit = editLink && ctx.filePath;\n const hasDate = showLastUpdated && ctx.lastUpdated;\n if (!hasEdit && !hasDate && !ctx.readingTime) return null;\n\n const children: DomphyElement[] = [];\n if (hasDate) {\n const date = new Date(ctx.lastUpdated!);\n const formatted = date.toLocaleDateString(\"en-US\", {\n year: \"numeric\",\n month: \"long\",\n day: \"numeric\",\n });\n children.push({\n span: [`Last updated: `, { time: formatted, dateTime: ctx.lastUpdated }],\n } as DomphyElement);\n }\n if (ctx.readingTime) {\n children.push({ span: `📖 ${ctx.readingTime} min read` } as DomphyElement);\n }\n if (hasEdit) {\n const pattern = editLink!.pattern;\n const href = pattern.replace(/:path/g, ctx.filePath!);\n children.push({\n a: editLink!.text ?? \"Edit this page\",\n href,\n target: \"_blank\",\n rel: \"noopener noreferrer\",\n style: { fontWeight: \"500\", fontSize: \"13px\" },\n } as DomphyElement);\n }\n return {\n div: children,\n style: {\n display: \"flex\",\n alignItems: \"center\",\n gap: ts(4),\n flexWrap: \"wrap\",\n marginTop: ts(8),\n paddingTop: ts(5),\n borderTop: `1px solid ${border}`,\n fontSize: \"13px\",\n color: textSoft,\n },\n };\n}\n\n// --- Page badge (from frontmatter) --------------------------------------\n\nfunction pageBadge(frontmatter: Record<string, unknown>): DomphyElement | null {\n const badge = frontmatter.badge as\n | { text?: string; type?: string }\n | string\n | undefined;\n if (!badge) return null;\n const text2 = typeof badge === \"string\" ? badge : (badge.text ?? \"\");\n const type = typeof badge === \"object\" ? (badge.type ?? \"tip\") : \"tip\";\n if (!text2) return null;\n return badgeEl({\n text: text2,\n type: type as \"tip\" | \"info\" | \"warning\" | \"danger\",\n });\n}\n\n// --- Slot resolver ------------------------------------------------------\n\ntype SlotFn = (ctx: LayoutContext) => DomphyElement | null;\n\nfunction resolveSlot(\n ctx: LayoutContext,\n key: keyof import(\"./types.js\").LayoutSlots,\n fallback: SlotFn,\n): DomphyElement | null {\n const override = ctx.config.themeConfig.slots?.[key];\n return override ? (override as SlotFn)(ctx) : fallback(ctx);\n}\n\n// --- Content div with prose styles -------------------------------------\n\nfunction contentDiv(body: DomphyElement[]): DomphyElement {\n return {\n div: body,\n style: {\n maxWidth: contentMax,\n \"& h1\": {\n fontSize: \"30px\",\n fontWeight: \"700\",\n lineHeight: \"1.25\",\n margin: `0 0 ${ts(6)}`,\n letterSpacing: \"-.02em\",\n color: textStrong,\n },\n \"& h2\": {\n fontSize: \"22px\",\n fontWeight: \"700\",\n margin: `${ts(11)} 0 ${ts(4)}`,\n paddingTop: ts(5),\n borderTop: `1px solid ${border}`,\n letterSpacing: \"-.01em\",\n color: textStrong,\n },\n \"& h3\": {\n fontSize: \"18px\",\n fontWeight: \"600\",\n margin: `${ts(7)} 0 ${ts(3)}`,\n color: textStrong,\n },\n \"& h4\": {\n fontSize: \"16px\",\n fontWeight: \"600\",\n margin: `${ts(5.5)} 0 ${ts(2)}`,\n color: textStrong,\n },\n \"& p\": { margin: `${ts(4)} 0` },\n \"& ul, & ol\": { margin: `${ts(4)} 0`, paddingLeft: \"1.4em\" },\n \"& li\": { margin: `${ts(1.5)} 0` },\n \"& a\": { fontWeight: \"500\" },\n \"& a[target='_blank']::after\": {\n content: '\" ↗\"',\n fontSize: \".75em\",\n opacity: \".6\",\n },\n \"& strong\": { fontWeight: \"600\", color: textStrong },\n \"& em\": { fontStyle: \"italic\" },\n \"& mark\": {\n background: `color-mix(in srgb,${tc(\"shift-6\", \"warning\")} 40%,${bg})`,\n color: \"inherit\",\n padding: `${ts(0.25)} ${ts(0.75)}`,\n borderRadius: ts(0.75),\n },\n \"& sup\": { fontSize: \".75em\", verticalAlign: \"super\" },\n \"& sub\": { fontSize: \".75em\", verticalAlign: \"sub\" },\n \"& del\": { opacity: \".5\" },\n \"& blockquote\": {\n margin: `${ts(4)} 0`,\n padding: `0 ${ts(4)}`,\n borderLeft: `3px solid ${border}`,\n color: textSoft,\n },\n \"& img\": { maxWidth: \"100%\", height: \"auto\", borderRadius: ts(1.5) },\n \"& hr\": {\n border: \"none\",\n borderTop: `1px solid ${border}`,\n margin: `${ts(8)} 0`,\n },\n \"& :not(pre)>code\": {\n fontFamily: `ui-monospace,SFMono-Regular,\"SF Mono\",Menlo,monospace`,\n fontSize: \".85em\",\n background: bgMute,\n padding: `${ts(0.75)} ${ts(1.5)}`,\n borderRadius: ts(1),\n },\n \"& pre\": {\n margin: `${ts(4)} 0`,\n padding: `${ts(4)} ${ts(5)}`,\n background: bgSoft,\n border: `1px solid ${border}`,\n borderRadius: ts(2),\n overflowX: \"auto\",\n fontSize: \"13.5px\",\n lineHeight: \"1.5\",\n },\n \"& pre code\": {\n fontFamily: `ui-monospace,SFMono-Regular,\"SF Mono\",Menlo,monospace`,\n background: \"none\",\n padding: \"0\",\n },\n \"& table\": {\n borderCollapse: \"collapse\",\n margin: `${ts(4)} 0`,\n display: \"block\",\n overflowX: \"auto\",\n },\n \"& th, & td\": {\n border: `1px solid ${border}`,\n padding: `${ts(2)} ${ts(3.5)}`,\n textAlign: \"left\",\n },\n \"& th\": { background: bgSoft, fontWeight: \"600\" },\n },\n } as DomphyElement;\n}\n\n// --- Shells -------------------------------------------------------------\n\nexport function pageShell(ctx: LayoutContext): DomphyElement {\n const showSidebar = ctx.frontmatter.sidebar !== false;\n\n const main: DomphyElement[] = [];\n const badge = pageBadge(ctx.frontmatter);\n if (badge)\n main.push({\n div: [badge],\n style: { marginBottom: ts(-2) },\n } as DomphyElement);\n main.push(contentDiv(ctx.body));\n const pn = resolveSlot(ctx, \"prevNext\", prevNext);\n if (pn) main.push(pn);\n const docFooterEl = resolveSlot(ctx, \"docFooter\", docFooter);\n if (docFooterEl) main.push(docFooterEl);\n\n const sidebarEl = showSidebar ? resolveSlot(ctx, \"sidebar\", sidebar) : null;\n const mainStyle = showSidebar\n ? {\n padding: `${ts(8)} ${ts(12)} ${ts(20)}`,\n minWidth: \"0\",\n \"@media (max-width: 860px)\": { padding: `${ts(6)} ${ts(5)} ${ts(16)}` },\n }\n : {\n padding: `${ts(8)} ${ts(12)} ${ts(20)}`,\n gridColumn: \"1 / -1\",\n maxWidth: contentMax,\n margin: \"0 auto\",\n \"@media (max-width: 860px)\": { padding: `${ts(6)} ${ts(5)} ${ts(16)}` },\n };\n\n const shellChildren: DomphyElement[] = [\n ...(sidebarEl ? [sidebarEl] : []),\n { main, style: mainStyle },\n ];\n const asideEl = resolveSlot(ctx, \"aside\", tocAside);\n if (asideEl && showSidebar) shellChildren.push(asideEl);\n\n const headerEl = resolveSlot(ctx, \"header\", header);\n const bar = announcementBar(ctx.config);\n const slots = ctx.config.themeConfig.slots;\n const footerContent = slots?.footer\n ? slots.footer(ctx)\n : ({\n footer: ctx.config.themeConfig.footerMessage ?? \"\",\n style: {\n padding: `${ts(6)} ${ts(12)}`,\n borderTop: `1px solid ${border}`,\n color: textSoft,\n fontSize: \"13px\",\n },\n } as DomphyElement);\n\n return {\n div: [\n ...(bar ? [bar] : []),\n ...(headerEl ? [headerEl] : []),\n {\n div: shellChildren,\n style: {\n display: \"grid\",\n gridTemplateColumns: showSidebar\n ? `${sidebarW} minmax(0,1fr) ${asideW}`\n : \"1fr\",\n alignItems: \"start\",\n maxWidth: \"1440px\",\n margin: \"0 auto\",\n \"@media (max-width: 1200px)\": showSidebar\n ? { gridTemplateColumns: `${sidebarW} minmax(0,1fr)` }\n : {},\n \"@media (max-width: 860px)\": { gridTemplateColumns: \"1fr\" },\n },\n },\n ...(footerContent ? [footerContent] : []),\n ],\n };\n}\n\ninterface HeroConfig {\n name?: string;\n text?: string;\n tagline?: string;\n actions?: Array<{ theme?: string; text: string; link: string }>;\n}\n\ninterface FeatureConfig {\n title: string;\n details: string;\n icon?: string;\n link?: string;\n}\n\nfunction heroSection(hero: HeroConfig): DomphyElement {\n const children: DomphyElement[] = [];\n if (hero.name)\n children.push({\n div: hero.name,\n style: {\n fontSize: \"56px\",\n fontWeight: \"800\",\n lineHeight: \"1.1\",\n letterSpacing: \"-.03em\",\n background: `linear-gradient(120deg,${brand},${tc(\"shift-7\", \"secondary\")})`,\n WebkitBackgroundClip: \"text\",\n backgroundClip: \"text\",\n color: \"transparent\",\n },\n } as DomphyElement);\n if (hero.text)\n children.push({\n h1: hero.text,\n style: {\n fontSize: \"30px\",\n fontWeight: \"700\",\n margin: `${ts(3)} 0 0`,\n color: textStrong,\n },\n } as DomphyElement);\n if (hero.tagline)\n children.push({\n p: hero.tagline,\n style: {\n fontSize: \"18px\",\n color: textSoft,\n maxWidth: ts(160),\n margin: `${ts(5)} auto 0`,\n },\n } as DomphyElement);\n if (hero.actions?.length) {\n const actionStyle = (theme?: string): Record<string, any> => {\n if (!theme || theme === \"brand\")\n return {\n padding: `${ts(2.5)} ${ts(5.5)}`,\n borderRadius: ts(5.5),\n fontWeight: \"600\",\n fontSize: \"15px\",\n background: brand,\n color: bg,\n \"&:hover\": { background: brandHover, textDecoration: \"none\" },\n };\n return {\n padding: `${ts(2.5)} ${ts(5.5)}`,\n borderRadius: ts(5.5),\n fontWeight: \"600\",\n fontSize: \"15px\",\n background: bgSoft,\n color: text,\n border: `1px solid ${border}`,\n \"&:hover\": { borderColor: brand, textDecoration: \"none\" },\n };\n };\n children.push({\n div: hero.actions.map(\n (a) =>\n ({\n a: a.text,\n href: a.link,\n style: actionStyle(a.theme),\n }) as DomphyElement,\n ),\n style: {\n display: \"flex\",\n gap: ts(3),\n justifyContent: \"center\",\n marginTop: ts(7),\n flexWrap: \"wrap\",\n },\n } as DomphyElement);\n }\n return {\n section: children,\n style: { textAlign: \"center\", padding: `${ts(10)} 0 ${ts(6)}` },\n };\n}\n\nfunction featuresSection(features: FeatureConfig[]): DomphyElement {\n return {\n div: features.map((f) => {\n const inner: DomphyElement[] = [];\n if (f.icon)\n inner.push({\n div: f.icon,\n style: { fontSize: \"28px\", marginBottom: ts(3) },\n } as DomphyElement);\n inner.push({\n div: f.title,\n style: {\n fontWeight: \"700\",\n fontSize: \"17px\",\n marginBottom: ts(2),\n color: textStrong,\n },\n } as DomphyElement);\n inner.push({\n p: f.details,\n style: {\n fontSize: \"14px\",\n color: textSoft,\n margin: \"0\",\n lineHeight: \"1.5\",\n },\n } as DomphyElement);\n const featureStyle = {\n padding: ts(5),\n background: bgSoft,\n border: `1px solid ${border}`,\n borderRadius: ts(3),\n };\n const el: DomphyElement = {\n div: inner,\n style: featureStyle,\n } as DomphyElement;\n return f.link\n ? ({\n a: [el],\n href: f.link,\n style: {\n display: \"block\",\n color: \"inherit\",\n \"&:hover\": { textDecoration: \"none\" },\n \"&:hover > div\": { borderColor: brand },\n },\n } as DomphyElement)\n : el;\n }),\n style: {\n display: \"grid\",\n gridTemplateColumns: `repeat(auto-fit,minmax(${ts(60)},1fr))`,\n gap: ts(4),\n margin: `${ts(10)} 0`,\n },\n };\n}\n\nexport function homeShell(ctx: LayoutContext): DomphyElement {\n const main: DomphyElement[] = [];\n const hero = ctx.frontmatter.hero as HeroConfig | undefined;\n const features = ctx.frontmatter.features as FeatureConfig[] | undefined;\n if (hero) main.push(heroSection(hero));\n if (features?.length) main.push(featuresSection(features));\n main.push(contentDiv(ctx.body));\n const bar = announcementBar(ctx.config);\n return {\n div: [\n ...(bar ? [bar] : []),\n header(ctx),\n {\n main,\n style: {\n maxWidth: \"1100px\",\n margin: \"0 auto\",\n padding: `${ts(12)} ${ts(6)} ${ts(20)}`,\n },\n },\n {\n footer: ctx.config.themeConfig.footerMessage ?? \"\",\n style: {\n padding: `${ts(6)} ${ts(12)}`,\n borderTop: `1px solid ${border}`,\n color: textSoft,\n fontSize: \"13px\",\n },\n },\n ],\n };\n}\n","import { readdirSync, statSync } from \"node:fs\";\nimport { join, posix, relative, sep } from \"node:path\";\nimport type { PageEntry, SidebarItem, SiteConfig } from \"./types.js\";\n\nconst NON_PAGE_DIRS = new Set([\"snippets\", \"demos\", \"node_modules\", \".git\"]);\n\nexport function routeForFile(srcRelativePath: string): string {\n const posixPath = srcRelativePath.split(sep).join(posix.sep);\n const withoutExt = posixPath.replace(/\\.md$/, \"\");\n const segments = withoutExt.split(\"/\");\n const last = segments[segments.length - 1];\n if (last === \"index\") {\n segments.pop();\n return segments.length === 0 ? \"/\" : `/${segments.join(\"/\")}/`;\n }\n return `/${segments.join(\"/\")}`;\n}\n\nexport function outFileForRoute(route: string): string {\n if (route === \"/\") return \"index.html\";\n const trimmed = route.replace(/^\\/+/, \"\").replace(/\\/+$/, \"\");\n return `${trimmed}/index.html`;\n}\n\nfunction listMarkdown(dir: string): string[] {\n const found: string[] = [];\n for (const name of readdirSync(dir)) {\n const full = join(dir, name);\n const stats = statSync(full);\n if (stats.isDirectory()) {\n if (NON_PAGE_DIRS.has(name) || name.startsWith(\".\")) continue;\n found.push(...listMarkdown(full));\n } else if (name.endsWith(\".md\") && name.toLowerCase() !== \"readme.md\") {\n found.push(full);\n }\n }\n return found;\n}\n\nexport function discoverPages(srcDir: string): PageEntry[] {\n const files = listMarkdown(srcDir);\n const pages = files.map((filePath): PageEntry => {\n const rel = relative(srcDir, filePath);\n const route = routeForFile(rel);\n return { route, outFile: outFileForRoute(route), filePath };\n });\n pages.sort((a, b) => a.route.localeCompare(b.route));\n return pages;\n}\n\nexport function flattenSidebar(\n items: SidebarItem[],\n): { text: string; link: string }[] {\n const out: { text: string; link: string }[] = [];\n for (const item of items) {\n if (item.link) out.push({ text: item.text, link: item.link });\n if (item.items) out.push(...flattenSidebar(item.items));\n }\n return out;\n}\n\nexport function sidebarForRoute(\n route: string,\n config: SiteConfig,\n): SidebarItem[] {\n let bestPrefix = \"\";\n for (const prefix of Object.keys(config.themeConfig.sidebar)) {\n if (route.startsWith(prefix) && prefix.length > bestPrefix.length) {\n bestPrefix = prefix;\n }\n }\n return bestPrefix ? config.themeConfig.sidebar[bestPrefix] : [];\n}\n\nexport function prevNextForRoute(\n route: string,\n config: SiteConfig,\n): {\n prev?: { text: string; link: string };\n next?: { text: string; link: string };\n} {\n const flat = flattenSidebar(sidebarForRoute(route, config));\n const index = flat.findIndex(\n (item) =>\n item.link === route ||\n item.link === route.replace(/\\/$/, \"\") ||\n `${item.link}/` === route,\n );\n if (index === -1) return {};\n return {\n prev: index > 0 ? flat[index - 1] : undefined,\n next: index < flat.length - 1 ? flat[index + 1] : undefined,\n };\n}\n","// Markdown pipeline: VitePress-baseline markdown → Domphy element tree.\n// Containers, <<< imports, frontmatter, TOC, line highlights, external links.\n\nimport { readFileSync } from \"node:fs\";\nimport { dirname, extname, isAbsolute, resolve } from \"node:path\";\nimport type { DomphyElement } from \"@domphy/core\";\nimport {\n type MarkdownItToken,\n splitFrontmatter,\n tokensToDomphy,\n} from \"@domphy/markdown\";\nimport MarkdownIt from \"markdown-it\";\nimport container from \"markdown-it-container\";\n// @ts-expect-error -- no bundled types\nimport emojiPkg from \"markdown-it-emoji\";\n// @ts-expect-error -- no bundled types\nimport includeUntyped from \"markdown-it-include\";\n// @ts-expect-error -- no bundled types\nimport markUntyped from \"markdown-it-mark\";\n// @ts-expect-error -- no bundled types\nimport subUntyped from \"markdown-it-sub\";\n// @ts-expect-error -- no bundled types\nimport supUntyped from \"markdown-it-sup\";\nimport { escapeHtml, renderFence } from \"./highlight.js\";\nimport type { RenderDocOptions, RenderedDoc, TocEntry } from \"./types.js\";\n\ntype CoreState = { tokens: MarkdownItToken[] };\ntype MdPlugin = (md: MarkdownIt) => void;\nconst include = includeUntyped as (\n md: MarkdownIt,\n options: { root: string },\n) => void;\nconst markPlugin = markUntyped as MdPlugin;\nconst subPlugin = subUntyped as MdPlugin;\nconst supPlugin = supUntyped as MdPlugin;\n// markdown-it-emoji@3.x exports { bare, full, light } — use the full set\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst emojiPlugin = ((emojiPkg as any).full ?? emojiPkg) as MdPlugin;\n\n// --- <<< code imports --------------------------------------------------------\n\nconst CODE_IMPORT_PATTERN = /^<<<\\s+(\\S+?)(?:\\s+\\[([^\\]]*)\\])?\\s*$/gm;\n\nconst EXT_LANG: Record<string, string> = {\n \".ts\": \"ts\",\n \".tsx\": \"tsx\",\n \".js\": \"js\",\n \".jsx\": \"jsx\",\n \".mjs\": \"js\",\n \".cjs\": \"js\",\n \".json\": \"json\",\n \".css\": \"css\",\n \".html\": \"html\",\n \".vue\": \"vue\",\n \".md\": \"markdown\",\n \".sh\": \"bash\",\n \".bash\": \"bash\",\n \".yml\": \"yaml\",\n \".yaml\": \"yaml\",\n \".rb\": \"ruby\",\n \".py\": \"python\",\n \".go\": \"go\",\n \".rs\": \"rust\",\n};\n\nfunction resolveSpecifier(\n spec: string,\n fileDir: string,\n docsDir: string,\n): string {\n if (spec.startsWith(\"@/\")) return resolve(dirname(docsDir), spec.slice(2));\n if (isAbsolute(spec)) return spec;\n return resolve(fileDir, spec);\n}\n\nfunction expandCodeImports(\n body: string,\n fileDir: string,\n docsDir: string,\n): string {\n return body.replace(\n CODE_IMPORT_PATTERN,\n (_whole, rawPath: string, label?: string) => {\n const absolute = resolveSpecifier(rawPath, fileDir, docsDir);\n const fence = \"```\";\n let contents: string;\n try {\n contents = readFileSync(absolute, \"utf8\");\n } catch {\n return [fence, `Could not import: ${rawPath}`, fence].join(\"\\n\");\n }\n const language = EXT_LANG[extname(absolute).toLowerCase()] ?? \"\";\n const info = label ? `${language} [${label}]` : language;\n return [fence + info, contents.trimEnd(), fence].join(\"\\n\");\n },\n );\n}\n\n// --- Strip <script> blocks ---------------------------------------------------\n\nfunction stripScriptBlocks(source: string): string {\n return source\n .replace(/<script\\b[^>]*>[\\s\\S]*?<\\/script>/gi, \"\")\n .replace(/^\\s*\\n/, \"\");\n}\n\n// --- Container token shaping -------------------------------------------------\n\nconst ADMONITION_TITLES: Record<string, string> = {\n tip: \"TIP\",\n warning: \"WARNING\",\n info: \"INFO\",\n danger: \"DANGER\",\n note: \"NOTE\",\n abstract: \"ABSTRACT\",\n success: \"SUCCESS\",\n question: \"QUESTION\",\n failure: \"FAILURE\",\n bug: \"BUG\",\n example: \"EXAMPLE\",\n quote: \"QUOTE\",\n};\n\nfunction containerTitle(info: string, type: string): string {\n return info.slice(info.indexOf(type) + type.length).trim();\n}\n\nfunction buildTitleTokens(\n Token: new (type: string, tag: string, nesting: number) => MarkdownItToken,\n tag: string,\n openType: string,\n closeType: string,\n className: string | null,\n title: string,\n): MarkdownItToken[] {\n const open = new Token(openType, tag, 1);\n open.block = true;\n if (className) open.attrSet(\"class\", className);\n const inline = new Token(\"inline\", \"\", 0);\n inline.content = title;\n inline.children = [];\n const text = new Token(\"text\", \"\", 0);\n text.content = title;\n inline.children.push(text);\n const close = new Token(closeType, tag, -1);\n close.block = true;\n return [open, inline, close];\n}\n\nfunction buildHtmlBlock(\n Token: new (type: string, tag: string, nesting: number) => MarkdownItToken,\n content: string,\n): MarkdownItToken {\n const token = new Token(\"html_block\", \"\", 0);\n token.content = content;\n token.block = true;\n return token;\n}\n\nfunction buildCodeGroupTokens(\n Token: new (type: string, tag: string, nesting: number) => MarkdownItToken,\n tokens: MarkdownItToken[],\n openIndex: number,\n closeIndex: number,\n groupId: number,\n): MarkdownItToken[] {\n const open = tokens[openIndex];\n open.tag = \"div\";\n open.attrSet(\"class\", \"code-group\");\n const close = tokens[closeIndex];\n close.tag = \"div\";\n\n const fences: Array<{ token: MarkdownItToken; label: string }> = [];\n for (let i = openIndex + 1; i < closeIndex; i++) {\n const token = tokens[i];\n if (token.type !== \"fence\") continue;\n const info = (token.info ?? \"\").trim();\n const labelMatch = info.match(/\\[([^\\]]+)\\]/);\n const language = info.split(/\\s+/, 1)[0] ?? \"\";\n fences.push({\n token,\n label: labelMatch ? labelMatch[1] : language || \"Code\",\n });\n }\n\n if (fences.length === 0) return tokens.slice(openIndex, closeIndex + 1);\n\n // Inputs as direct children of .code-group (before .tabs) — enables CSS :checked sibling selector\n const inputsHtml = fences\n .map(\n (_, i) =>\n `<input type=\"radio\" name=\"cg-${groupId}\" id=\"cgt-${groupId}-${i}\"${i === 0 ? \" checked\" : \"\"}>`,\n )\n .join(\"\");\n const labelsHtml = fences\n .map(\n (fence, i) =>\n `<label for=\"cgt-${groupId}-${i}\">${escapeHtml(fence.label)}</label>`,\n )\n .join(\"\");\n\n const inner: MarkdownItToken[] = [\n buildHtmlBlock(Token, `${inputsHtml}<div class=\"tabs\">${labelsHtml}</div>`),\n buildHtmlBlock(Token, `<div class=\"blocks\">`),\n ];\n fences.forEach((fence) => {\n fence.token.info = (fence.token.info ?? \"\")\n .replace(/\\[[^\\]]*\\]/, \"\")\n .trim();\n inner.push(fence.token);\n });\n inner.push(buildHtmlBlock(Token, `</div>`));\n return [open, ...inner, close];\n}\n\nfunction shapeContainers(tokens: MarkdownItToken[]): MarkdownItToken[] {\n if (tokens.length === 0) return tokens;\n const Token = tokens[0].constructor as new (\n type: string,\n tag: string,\n nesting: number,\n ) => MarkdownItToken;\n const output: MarkdownItToken[] = [];\n let groupCounter = 0;\n\n const ALL_ADMONITIONS = Object.keys(ADMONITION_TITLES).join(\"|\");\n const admonitionRe = new RegExp(`^container_(${ALL_ADMONITIONS})_open$`);\n const admonitionCloseRe = new RegExp(\n `^container_(${ALL_ADMONITIONS})_close$`,\n );\n\n for (let i = 0; i < tokens.length; i++) {\n const token = tokens[i];\n const admonition = token.type.match(admonitionRe);\n if (admonition) {\n const type = admonition[1];\n token.tag = \"div\";\n token.attrSet(\"class\", `custom-block ${type}`);\n const custom = containerTitle(token.info.trim(), type);\n output.push(token);\n output.push(\n ...buildTitleTokens(\n Token,\n \"p\",\n \"paragraph_open\",\n \"paragraph_close\",\n \"custom-block-title\",\n custom || ADMONITION_TITLES[type] || type.toUpperCase(),\n ),\n );\n continue;\n }\n if (admonitionCloseRe.test(token.type)) {\n token.tag = \"div\";\n output.push(token);\n continue;\n }\n if (token.type === \"container_details_open\") {\n token.tag = \"details\";\n token.attrSet(\"class\", \"custom-block details\");\n output.push(token);\n output.push(\n ...buildTitleTokens(\n Token,\n \"summary\",\n \"summary_open\",\n \"summary_close\",\n null,\n containerTitle(token.info.trim(), \"details\") || \"Details\",\n ),\n );\n continue;\n }\n if (token.type === \"container_details_close\") {\n token.tag = \"details\";\n output.push(token);\n continue;\n }\n if (token.type === \"container_steps_open\") {\n token.tag = \"div\";\n token.attrSet(\"class\", \"custom-block steps\");\n output.push(token);\n continue;\n }\n if (token.type === \"container_steps_close\") {\n token.tag = \"div\";\n output.push(token);\n continue;\n }\n if (token.type === \"container_card-grid_open\") {\n token.tag = \"div\";\n token.attrSet(\"class\", \"custom-block card-grid\");\n output.push(token);\n continue;\n }\n if (token.type === \"container_card-grid_close\") {\n token.tag = \"div\";\n output.push(token);\n continue;\n }\n if (token.type === \"container_card_open\") {\n token.tag = \"div\";\n token.attrSet(\"class\", \"custom-block card\");\n const title = containerTitle(token.info.trim(), \"card\");\n output.push(token);\n if (title)\n output.push(\n ...buildTitleTokens(\n Token,\n \"p\",\n \"paragraph_open\",\n \"paragraph_close\",\n \"card-title\",\n title,\n ),\n );\n continue;\n }\n if (token.type === \"container_card_close\") {\n token.tag = \"div\";\n output.push(token);\n continue;\n }\n if (token.type === \"container_link-card_open\") {\n const info = token.info.trim().slice(\"link-card\".length).trim();\n const linkMatch = info.match(/^\\[([^\\]]+)\\]\\(([^)]+)\\)/);\n const href = linkMatch ? linkMatch[2] : \"#\";\n const title = linkMatch ? linkMatch[1] : info;\n token.tag = \"a\";\n token.attrSet(\"class\", \"custom-block link-card\");\n token.attrSet(\"href\", href);\n output.push(token);\n if (title)\n output.push(\n ...buildTitleTokens(\n Token,\n \"p\",\n \"paragraph_open\",\n \"paragraph_close\",\n \"link-card-title\",\n title,\n ),\n );\n continue;\n }\n if (token.type === \"container_link-card_close\") {\n token.tag = \"a\";\n output.push(token);\n continue;\n }\n if (token.type === \"container_code-group_open\") {\n let depth = 0,\n closeIndex = -1;\n for (let j = i; j < tokens.length; j++) {\n if (tokens[j].type === \"container_code-group_open\") depth++;\n else if (tokens[j].type === \"container_code-group_close\") {\n depth--;\n if (depth === 0) {\n closeIndex = j;\n break;\n }\n }\n }\n if (closeIndex === -1) {\n output.push(token);\n continue;\n }\n output.push(\n ...buildCodeGroupTokens(Token, tokens, i, closeIndex, groupCounter++),\n );\n i = closeIndex;\n continue;\n }\n output.push(token);\n }\n return output;\n}\n\n// --- Task list detection (GFM-style) -----------------------------------------\n\nfunction shapeTaskLists(tokens: MarkdownItToken[]): MarkdownItToken[] {\n if (tokens.length === 0) return tokens;\n const Token = tokens[0].constructor as new (\n type: string,\n tag: string,\n nesting: number,\n ) => MarkdownItToken;\n for (let i = 1; i < tokens.length; i++) {\n const token = tokens[i];\n if (token.type !== \"inline\" || !token.children?.length) continue;\n const prev = tokens[i - 1];\n if (prev?.type !== \"list_item_open\") continue;\n const firstChild = token.children[0];\n if (firstChild.type !== \"text\") continue;\n const text = firstChild.content;\n const isTask =\n text.startsWith(\"[ ] \") ||\n text.startsWith(\"[x] \") ||\n text.startsWith(\"[X] \");\n if (!isTask) continue;\n const checked = text[1].toLowerCase() === \"x\";\n firstChild.content = text.slice(4);\n token.content = token.content.replace(/^\\[[ xX]\\] /, \"\");\n prev.attrSet(\n \"class\",\n `${prev.attrGet(\"class\") ?? \"\"} task-list-item`.trim(),\n );\n const checkToken = new Token(\"html_inline\", \"\", 0);\n checkToken.content = `<input type=\"checkbox\"${checked ? \" checked\" : \"\"} disabled class=\"task-list-check\" aria-label=\"${checked ? \"done\" : \"todo\"}\">`;\n token.children.unshift(checkToken);\n }\n return tokens;\n}\n\n// --- Parser ------------------------------------------------------------------\n\nfunction createParser(\n docsDir: string,\n highlight: (code: string, lang: string) => string,\n): MarkdownIt {\n const md = new MarkdownIt({ html: true, linkify: true, typographer: false });\n md.enable([\"strikethrough\", \"table\"]);\n md.use(include, { root: docsDir });\n md.use(markPlugin);\n md.use(subPlugin);\n md.use(supPlugin);\n md.use(emojiPlugin);\n const noopRender = () => \"\";\n const ADMONITION_NAMES = Object.keys(ADMONITION_TITLES);\n for (const name of [\n ...ADMONITION_NAMES,\n \"details\",\n \"code-group\",\n \"steps\",\n \"card\",\n \"card-grid\",\n \"link-card\",\n ]) {\n // biome-ignore lint/suspicious/noExplicitAny: markdown-it-container type mismatch\n md.use(container as any, name, { render: noopRender });\n }\n md.core.ruler.push(\"press_containers\", (state: CoreState) => {\n state.tokens = shapeContainers(state.tokens);\n return true;\n });\n md.core.ruler.push(\"press_task_lists\", (state: CoreState) => {\n state.tokens = shapeTaskLists(state.tokens);\n return true;\n });\n // Convert fence tokens → html_block with full rendering (line highlights, copy button)\n md.core.ruler.push(\"press_fences\", (state: CoreState) => {\n for (const token of state.tokens) {\n if (token.type !== \"fence\") continue;\n const html = renderFence(token.content, token.info ?? \"\", highlight);\n token.type = \"html_block\";\n token.content = html;\n token.tag = \"\";\n }\n return true;\n });\n // External links: add target=_blank + rel=noopener\n md.core.ruler.push(\"press_external_links\", (state: CoreState) => {\n for (const token of state.tokens) {\n if (token.type !== \"inline\" || !token.children) continue;\n for (const child of token.children) {\n if (child.type !== \"link_open\") continue;\n const href = child.attrGet(\"href\") ?? \"\";\n if (href.startsWith(\"http://\") || href.startsWith(\"https://\")) {\n child.attrSet(\"target\", \"_blank\");\n child.attrSet(\"rel\", \"noopener noreferrer\");\n }\n }\n }\n return true;\n });\n // Images: add loading=lazy\n md.core.ruler.push(\"press_image_lazy\", (state: CoreState) => {\n for (const token of state.tokens) {\n if (token.type !== \"inline\" || !token.children) continue;\n for (const child of token.children) {\n if (child.type === \"image\") child.attrSet(\"loading\", \"lazy\");\n }\n }\n return true;\n });\n return md;\n}\n\n// --- Title resolution --------------------------------------------------------\n\nfunction titleFromFilePath(filePath: string): string {\n const base = filePath.split(/[\\\\/]/).pop() ?? filePath;\n const name = base.replace(/\\.md$/i, \"\");\n if (name.toLowerCase() === \"index\") {\n const parts = filePath.split(/[\\\\/]/).filter(Boolean);\n return parts[parts.length - 2] ?? name;\n }\n return name;\n}\n\nfunction firstH1(toc: TocEntry[]): string | undefined {\n return toc.find((e) => e.level === 1)?.text;\n}\n\n// --- Public API --------------------------------------------------------------\n\n// Inject visual anchor link into heading elements after tokensToDomphy.\nfunction injectHeadingAnchors(elements: DomphyElement[]): DomphyElement[] {\n return elements.map((el) => {\n if (!el || typeof el !== \"object\" || Array.isArray(el)) return el;\n const rec = el as Record<string, unknown>;\n const tag = Object.keys(rec).find((k) => /^h[1-6]$/.test(k));\n if (tag && typeof rec.id === \"string\") {\n const id = rec.id;\n const children = Array.isArray(rec[tag])\n ? [...(rec[tag] as DomphyElement[])]\n : rec[tag] != null\n ? [rec[tag] as DomphyElement]\n : [];\n children.push({\n a: \"#\",\n href: `#${id}`,\n class: \"header-anchor\",\n ariaHidden: \"true\",\n } as DomphyElement);\n return { ...rec, [tag]: children } as DomphyElement;\n }\n const tag2 = Object.keys(rec).find(\n (k) =>\n /^[a-z][a-z0-9]*$/.test(k) &&\n k !== \"style\" &&\n k !== \"class\" &&\n !k.startsWith(\"data\") &&\n !k.startsWith(\"on\") &&\n !k.startsWith(\"aria\") &&\n !k.startsWith(\"_\") &&\n k !== \"$\" &&\n k !== \"href\" &&\n k !== \"src\" &&\n k !== \"id\" &&\n k !== \"type\" &&\n k !== \"name\",\n );\n if (tag2 && Array.isArray(rec[tag2])) {\n return {\n ...rec,\n [tag2]: injectHeadingAnchors(rec[tag2] as DomphyElement[]),\n } as DomphyElement;\n }\n return el;\n });\n}\n\nexport async function renderDoc(\n source: string,\n options: RenderDocOptions,\n): Promise<RenderedDoc> {\n const { filePath, docsDir, highlight } = options;\n const fileDir = dirname(filePath);\n const { frontmatter, content } = splitFrontmatter(source);\n const stripped = stripScriptBlocks(content);\n const expanded = expandCodeImports(stripped, fileDir, docsDir);\n const md = createParser(docsDir, highlight);\n const tokens = md.parse(expanded, {}) as MarkdownItToken[];\n const { body, toc } = tokensToDomphy(tokens, { highlight });\n const withAnchors = injectHeadingAnchors(body as DomphyElement[]);\n const frontmatterTitle =\n typeof frontmatter.title === \"string\" ? frontmatter.title : undefined;\n const title = frontmatterTitle ?? firstH1(toc) ?? titleFromFilePath(filePath);\n return { frontmatter, body: withAnchors, toc, islands: [], title };\n}\n","// Self-contained search: build-time inverted index + client Domphy widget.\n// No third-party search dependency — zero runtime dep, deterministic output.\n\nimport { type DomphyElement, ElementNode, RecordState } from \"@domphy/core\";\nimport { themeColor, themeSpacing } from \"@domphy/theme\";\nimport { card, inputSearch, link, menu, small } from \"@domphy/ui\";\nimport type { SearchDocument, TocEntry } from \"./types.js\";\n\n// --- Index shape -------------------------------------------------------------\n\ninterface SearchEntry {\n route: string;\n pageTitle: string;\n heading: string;\n slug: string;\n isPage: boolean;\n}\n\ninterface SerializedIndex {\n entries: SearchEntry[];\n postings: Record<string, [number, number][]>;\n}\n\nexport interface SearchResult {\n route: string;\n pageTitle: string;\n heading: string;\n slug: string;\n isPage: boolean;\n score: number;\n href: string;\n}\n\nconst FIELD_TITLE = 3;\nconst FIELD_HEADING = 2;\nconst FIELD_BODY = 1;\n\n// --- Tokenizer ---------------------------------------------------------------\n\nfunction tokenize(text: string): string[] {\n const tokens: string[] = [];\n for (const raw of text.toLowerCase().split(/[^\\p{L}\\p{N}]+/u)) {\n if (raw.length >= 2) tokens.push(raw);\n }\n return tokens;\n}\n\n// --- Build-time --------------------------------------------------------------\n\nfunction indexText(\n postings: Map<string, Map<number, number>>,\n entryIndex: number,\n text: string,\n fieldWeight: number,\n): void {\n for (const term of tokenize(text)) {\n let perEntry = postings.get(term);\n if (!perEntry) {\n perEntry = new Map();\n postings.set(term, perEntry);\n }\n const existing = perEntry.get(entryIndex);\n if (existing === undefined || fieldWeight > existing)\n perEntry.set(entryIndex, fieldWeight);\n }\n}\n\nexport function buildSearchIndex(docs: SearchDocument[]): string {\n const entries: SearchEntry[] = [];\n const postings = new Map<string, Map<number, number>>();\n\n for (const doc of docs) {\n const pageIndex = entries.length;\n entries.push({\n route: doc.route,\n pageTitle: doc.title,\n heading: doc.title,\n slug: \"\",\n isPage: true,\n });\n indexText(postings, pageIndex, doc.title, FIELD_TITLE);\n indexText(postings, pageIndex, doc.text, FIELD_BODY);\n for (const entry of doc.toc as TocEntry[]) {\n const sectionIndex = entries.length;\n entries.push({\n route: doc.route,\n pageTitle: doc.title,\n heading: entry.text,\n slug: entry.slug,\n isPage: false,\n });\n indexText(postings, sectionIndex, entry.text, FIELD_HEADING);\n }\n }\n\n const serializedPostings: Record<string, [number, number][]> = {};\n for (const [term, perEntry] of Array.from(postings.entries()).sort((a, b) =>\n a[0] < b[0] ? -1 : 1,\n )) {\n serializedPostings[term] = Array.from(perEntry.entries())\n .sort((a, b) => a[0] - b[0])\n .map(([i, w]) => [i, w]);\n }\n return JSON.stringify({\n entries,\n postings: serializedPostings,\n } satisfies SerializedIndex);\n}\n\n// --- Query -------------------------------------------------------------------\n\nexport function queryIndex(\n serializedIndex: string,\n query: string,\n limit = 10,\n): SearchResult[] {\n const index = JSON.parse(serializedIndex) as SerializedIndex;\n const terms = tokenize(query);\n if (terms.length === 0) return [];\n\n const scoreByEntry = new Map<number, number>();\n const matchedTermsByEntry = new Map<number, number>();\n\n for (const term of terms) {\n const seen = new Set<number>();\n for (const indexedTerm in index.postings) {\n if (indexedTerm !== term && !indexedTerm.startsWith(term)) continue;\n const exact = indexedTerm === term;\n for (const [entryIndex, fieldWeight] of index.postings[indexedTerm]) {\n const contribution = exact ? fieldWeight : fieldWeight * 0.5;\n scoreByEntry.set(\n entryIndex,\n (scoreByEntry.get(entryIndex) ?? 0) + contribution,\n );\n if (!seen.has(entryIndex)) {\n seen.add(entryIndex);\n matchedTermsByEntry.set(\n entryIndex,\n (matchedTermsByEntry.get(entryIndex) ?? 0) + 1,\n );\n }\n }\n }\n }\n\n const results: SearchResult[] = [];\n for (const [entryIndex, score] of scoreByEntry) {\n const entry = index.entries[entryIndex];\n const coverage = matchedTermsByEntry.get(entryIndex) ?? 0;\n results.push({\n route: entry.route,\n pageTitle: entry.pageTitle,\n heading: entry.heading,\n slug: entry.slug,\n isPage: entry.isPage,\n score: coverage * 100 + score,\n href: entry.slug ? `${entry.route}#${entry.slug}` : entry.route,\n });\n }\n\n results.sort((a, b) => {\n if (b.score !== a.score) return b.score - a.score;\n if (a.route !== b.route) return a.route < b.route ? -1 : 1;\n return a.isPage === b.isPage ? 0 : a.isPage ? -1 : 1;\n });\n return results.slice(0, limit);\n}\n\n// --- Client widget -----------------------------------------------------------\n\nexport interface SearchWidgetOptions {\n indexUrl?: string;\n placeholder?: string;\n limit?: number;\n}\n\ninterface WidgetState {\n index: string | null;\n query: string;\n results: SearchResult[];\n open: boolean;\n active: number;\n}\n\nfunction optionId(widgetId: number, resultIndex: number): string {\n return `dp-search-${widgetId}-option-${resultIndex}`;\n}\n\nlet widgetCounter = 0;\n\nfunction resultRow(\n result: SearchResult,\n resultIndex: number,\n widgetId: number,\n state: RecordState<WidgetState>,\n): DomphyElement {\n const id = optionId(widgetId, resultIndex);\n return {\n a: [\n { div: result.isPage ? result.pageTitle : result.heading },\n result.isPage\n ? null\n : { small: result.pageTitle, $: [small({ color: \"neutral\" })] },\n ],\n href: result.href,\n role: \"option\",\n id,\n ariaSelected: (l) => state.get(\"active\", l) === resultIndex || undefined,\n onClick: () => {\n state.set(\"open\", false);\n },\n onMouseEnter: () => {\n state.set(\"active\", resultIndex);\n },\n $: [link({ color: \"neutral\", accentColor: \"primary\" })],\n style: {\n display: \"flex\",\n flexDirection: \"column\",\n gap: themeSpacing(1),\n paddingBlock: themeSpacing(2),\n paddingInline: themeSpacing(3),\n borderRadius: themeSpacing(1),\n backgroundColor: (l) =>\n state.get(\"active\", l) === resultIndex\n ? themeColor(l, \"shift-3\", \"primary\")\n : themeColor(l, \"inherit\", \"neutral\"),\n },\n _key: result.href,\n };\n}\n\nfunction runQuery(state: RecordState<WidgetState>, limit: number): void {\n const index = state.get(\"index\");\n const query = state.get(\"query\");\n const results = index && query.trim() ? queryIndex(index, query, limit) : [];\n state.set(\"results\", results);\n state.set(\"active\", -1);\n state.set(\"open\", results.length > 0);\n}\n\nexport function searchWidget(options: SearchWidgetOptions = {}): DomphyElement {\n const {\n indexUrl = \"/search-index.json\",\n placeholder = \"Search docs…\",\n limit = 10,\n } = options;\n const widgetId = ++widgetCounter;\n const listboxId = `dp-search-${widgetId}-listbox`;\n\n const state = new RecordState<WidgetState>({\n index: null,\n query: \"\",\n results: [],\n open: false,\n active: -1,\n });\n let debounceTimer: ReturnType<typeof setTimeout> | null = null;\n\n function navigate(result: SearchResult | undefined): void {\n if (!result) return;\n state.set(\"open\", false);\n window.location.assign(result.href);\n }\n\n const input: DomphyElement = {\n input: null,\n type: \"search\",\n placeholder,\n autocomplete: \"off\",\n role: \"combobox\",\n ariaExpanded: (l) => (state.get(\"open\", l) ? \"true\" : \"false\"),\n ariaControls: listboxId,\n ariaAutocomplete: \"list\",\n ariaActiveDescendant: (l) => {\n const a = state.get(\"active\", l);\n return a >= 0 ? optionId(widgetId, a) : undefined;\n },\n value: (l) => state.get(\"query\", l),\n onInput: (e) => {\n state.set(\"query\", (e.target as HTMLInputElement).value);\n if (debounceTimer) clearTimeout(debounceTimer);\n debounceTimer = setTimeout(() => runQuery(state, limit), 120);\n },\n onFocus: () => {\n if (state.get(\"results\").length > 0) state.set(\"open\", true);\n },\n onKeyDown: (e: KeyboardEvent) => {\n const results = state.get(\"results\");\n if (e.key === \"Escape\") {\n state.set(\"open\", false);\n state.set(\"active\", -1);\n return;\n }\n if (e.key === \"ArrowDown\") {\n if (!results.length) return;\n e.preventDefault();\n state.set(\"open\", true);\n state.set(\"active\", (state.get(\"active\") + 1) % results.length);\n return;\n }\n if (e.key === \"ArrowUp\") {\n if (!results.length) return;\n e.preventDefault();\n state.set(\n \"active\",\n (state.get(\"active\") - 1 + results.length) % results.length,\n );\n return;\n }\n if (e.key === \"Enter\") {\n const active = state.get(\"active\");\n navigate(active >= 0 ? results[active] : results[0]);\n }\n },\n $: [inputSearch({ color: \"neutral\", accentColor: \"primary\" })],\n style: { width: \"100%\" },\n };\n\n const dropdown: DomphyElement = {\n div: (l) =>\n state.get(\"open\", l)\n ? state\n .get(\"results\", l)\n .map((r, i) => resultRow(r, i, widgetId, state))\n : [],\n id: listboxId,\n role: \"listbox\",\n $: [\n menu({ selectable: false, color: \"neutral\" }),\n card({ color: \"neutral\" }),\n ],\n style: {\n display: (l) => (state.get(\"open\", l) ? \"block\" : \"none\"),\n position: \"absolute\",\n insetInlineStart: 0,\n insetInlineEnd: 0,\n marginBlockStart: themeSpacing(1),\n maxHeight: themeSpacing(80),\n overflowY: \"auto\",\n zIndex: \"50\",\n },\n };\n\n return {\n div: [input, dropdown],\n role: \"search\",\n style: { position: \"relative\", display: \"block\", width: \"100%\" },\n _onMount: (node) => {\n fetch(indexUrl)\n .then((r) => r.text())\n .then((text) => {\n state.set(\"index\", text);\n if (state.get(\"query\").trim()) runQuery(state, limit);\n })\n .catch(() => {});\n const host = node.domElement as HTMLElement;\n const handler = (e: Event) => {\n if (!host.contains(e.target as Node)) state.set(\"open\", false);\n };\n document.addEventListener(\"pointerdown\", handler);\n node.setMetadata(\"dpSearchHandler\", handler);\n },\n _onRemove: (node) => {\n const handler = node.getMetadata(\"dpSearchHandler\") as\n | ((e: Event) => void)\n | undefined;\n if (handler) document.removeEventListener(\"pointerdown\", handler);\n if (debounceTimer) clearTimeout(debounceTimer);\n },\n };\n}\n\nexport function mountSearch(\n host: HTMLElement,\n options: SearchWidgetOptions = {},\n): ElementNode {\n while (host.firstChild) host.removeChild(host.firstChild);\n const node = new ElementNode(searchWidget(options));\n node.render(host);\n return node;\n}\n","// Minimal global CSS for @domphy/press.\n// Layout element styles now live in layout.ts as inline style:{} objects\n// so generateCSS() is the single source of truth for component CSS.\n// Only rules that CANNOT be expressed as element-scoped styles remain here:\n// 1. Global reset (*, html, body, a)\n// 2. JS-managed class-state cross-element selectors\n// 3. SVG icon masks (class-targeted, third-party)\n// 4. Markdown-rendered HTML content (code blocks, custom blocks, etc.)\n// 5. Shiki dark-mode override (data-attr on html, targets third-party spans)\n\nimport { themeColor, themeSpacing } from \"@domphy/theme\";\n\nconst tc = (tone: string, color?: string): string =>\n themeColor(null, tone as any, color);\nconst ts = (n: number): string => themeSpacing(n);\n\nconst bg = tc(\"inherit\");\nconst bgSoft = tc(\"shift-1\");\nconst bgMute = tc(\"shift-2\");\nconst border = tc(\"shift-3\");\nconst textSoft = tc(\"shift-6\");\nconst text = tc(\"shift-9\");\nconst textStrong = tc(\"shift-11\");\nconst brand = tc(\"shift-9\", \"primary\");\n\nconst headerH = ts(14);\n\nexport function pressCSS(): string {\n return `\n/* ------------------------------------------------------------------ reset */\n*,*::before,*::after{box-sizing:border-box}\nhtml{scroll-behavior:smooth;scroll-padding-top:calc(${headerH} + ${ts(4)})}\nbody{margin:0;font-family:-apple-system,BlinkMacSystemFont,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif;background:${bg};color:${text};line-height:1.6;font-size:16px}\na{color:${brand};text-decoration:none}\na:hover{text-decoration:underline}\n\n/* -------------------------------------------------------- logo theme variants */\n/* dp-logo-light/dark classes set in layout.ts img elements */\n[data-theme=\"dark\"] .dp-logo-light{display:none}\n[data-theme=\"light\"] .dp-logo-dark,.dp-logo-dark{display:none}\n[data-theme=\"dark\"] .dp-logo-dark{display:block}\n\n/* ---------------------------------------------------------- social icon masks */\n/* dp-social-icon + dp-icon-* classes set in layout.ts socialLinkEl */\n.dp-social-icon{display:block;width:${ts(4)};height:${ts(4)};background:currentColor;flex-shrink:0}\n.dp-icon-github{-webkit-mask:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M12 2C6.477 2 2 6.477 2 12c0 4.42 2.865 8.17 6.839 9.49.5.092.682-.217.682-.482 0-.237-.008-.866-.013-1.7-2.782.603-3.369-1.342-3.369-1.342-.454-1.155-1.11-1.463-1.11-1.463-.908-.62.069-.608.069-.608 1.003.07 1.531 1.03 1.531 1.03.892 1.529 2.341 1.088 2.91.832.092-.647.35-1.088.636-1.338-2.22-.253-4.555-1.11-4.555-4.943 0-1.091.39-1.984 1.029-2.683-.103-.253-.446-1.27.098-2.647 0 0 .84-.269 2.75 1.025A9.578 9.578 0 0 1 12 6.836c.85.004 1.705.115 2.504.337 1.909-1.294 2.747-1.025 2.747-1.025.546 1.377.202 2.394.1 2.647.64.699 1.028 1.592 1.028 2.683 0 3.842-2.339 4.687-4.566 4.935.359.309.678.919.678 1.852 0 1.336-.012 2.415-.012 2.741 0 .267.18.578.688.48C19.138 20.167 22 16.418 22 12c0-5.523-4.477-10-10-10z'/%3E%3C/svg%3E\") center/contain no-repeat;mask:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M12 2C6.477 2 2 6.477 2 12c0 4.42 2.865 8.17 6.839 9.49.5.092.682-.217.682-.482 0-.237-.008-.866-.013-1.7-2.782.603-3.369-1.342-3.369-1.342-.454-1.155-1.11-1.463-1.11-1.463-.908-.62.069-.608.069-.608 1.003.07 1.531 1.03 1.531 1.03.892 1.529 2.341 1.088 2.91.832.092-.647.35-1.088.636-1.338-2.22-.253-4.555-1.11-4.555-4.943 0-1.091.39-1.984 1.029-2.683-.103-.253-.446-1.27.098-2.647 0 0 .84-.269 2.75 1.025A9.578 9.578 0 0 1 12 6.836c.85.004 1.705.115 2.504.337 1.909-1.294 2.747-1.025 2.747-1.025.546 1.377.202 2.394.1 2.647.64.699 1.028 1.592 1.028 2.683 0 3.842-2.339 4.687-4.566 4.935.359.309.678.919.678 1.852 0 1.336-.012 2.415-.012 2.741 0 .267.18.578.688.48C19.138 20.167 22 16.418 22 12c0-5.523-4.477-10-10-10z'/%3E%3C/svg%3E\") center/contain no-repeat}\n.dp-icon-twitter{-webkit-mask:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M18.244 2.25h3.308l-7.227 8.26 8.502 11.24H16.17l-4.714-6.231-5.401 6.231H2.744l7.737-8.835L1.254 2.25H8.08l4.713 6.231zm-1.161 17.52h1.833L7.084 4.126H5.117z'/%3E%3C/svg%3E\") center/contain no-repeat;mask:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M18.244 2.25h3.308l-7.227 8.26 8.502 11.24H16.17l-4.714-6.231-5.401 6.231H2.744l7.737-8.835L1.254 2.25H8.08l4.713 6.231zm-1.161 17.52h1.833L7.084 4.126H5.117z'/%3E%3C/svg%3E\") center/contain no-repeat}\n.dp-icon-discord{-webkit-mask:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M20.317 4.37a19.791 19.791 0 0 0-4.885-1.515.074.074 0 0 0-.079.037c-.21.375-.444.864-.608 1.25a18.27 18.27 0 0 0-5.487 0 12.64 12.64 0 0 0-.617-1.25.077.077 0 0 0-.079-.037A19.736 19.736 0 0 0 3.677 4.37a.07.07 0 0 0-.032.027C.533 9.046-.32 13.58.099 18.057c.01.044.032.084.064.107a19.9 19.9 0 0 0 5.993 3.03.078.078 0 0 0 .084-.028 14.09 14.09 0 0 0 1.226-1.994.076.076 0 0 0-.041-.106 13.107 13.107 0 0 1-1.872-.892.077.077 0 0 1-.008-.128 10.2 10.2 0 0 0 .372-.292.074.074 0 0 1 .077-.01c3.928 1.793 8.18 1.793 12.062 0a.074.074 0 0 1 .078.01 10.2 10.2 0 0 0 .373.292.077.077 0 0 1-.006.127 12.299 12.299 0 0 1-1.873.892.077.077 0 0 0-.041.107c.36.698.772 1.362 1.225 1.993a.076.076 0 0 0 .084.028 19.839 19.839 0 0 0 6.002-3.03.077.077 0 0 0 .032-.054c.5-5.177-.838-9.674-3.549-13.66a.061.061 0 0 0-.031-.03z'/%3E%3C/svg%3E\") center/contain no-repeat;mask:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M20.317 4.37a19.791 19.791 0 0 0-4.885-1.515.074.074 0 0 0-.079.037c-.21.375-.444.864-.608 1.25a18.27 18.27 0 0 0-5.487 0 12.64 12.64 0 0 0-.617-1.25.077.077 0 0 0-.079-.037A19.736 19.736 0 0 0 3.677 4.37a.07.07 0 0 0-.032.027C.533 9.046-.32 13.58.099 18.057c.01.044.032.084.064.107a19.9 19.9 0 0 0 5.993 3.03.078.078 0 0 0 .084-.028 14.09 14.09 0 0 0 1.226-1.994.076.076 0 0 0-.041-.106 13.107 13.107 0 0 1-1.872-.892.077.077 0 0 1-.008-.128 10.2 10.2 0 0 0 .372-.292.074.074 0 0 1 .077-.01c3.928 1.793 8.18 1.793 12.062 0a.074.074 0 0 1 .078.01 10.2 10.2 0 0 0 .373.292.077.077 0 0 1-.006.127 12.299 12.299 0 0 1-1.873.892.077.077 0 0 0-.041.107c.36.698.772 1.362 1.225 1.993a.076.076 0 0 0 .084.028 19.839 19.839 0 0 0 6.002-3.03.077.077 0 0 0 .032-.054c.5-5.177-.838-9.674-3.549-13.66a.061.061 0 0 0-.031-.03z'/%3E%3C/svg%3E\") center/contain no-repeat}\n\n/* ------- sidebar collapsed state (JS toggles 'collapsed' class on group) ------- */\n.dp-sidebar-group.collapsed .dp-sidebar-items{display:none}\n\n/* ------- sidebar open state on mobile (JS sets html[data-sidebar=\"open\"]) ------ */\n@media(max-width:860px){\n html[data-sidebar=\"open\"] nav[aria-label=\"Documentation\"]{transform:translateX(0)}\n}\n\n/* -------------------------------------------------------- heading anchors */\n.header-anchor{opacity:0;margin-left:${ts(2)};font-weight:400;font-size:.85em;color:${textSoft};transition:opacity .15s}\n:is(h1,h2,h3,h4,h5,h6):hover .header-anchor{opacity:1}\n.header-anchor:hover{color:${brand};text-decoration:none}\n\n/* ------------------------------------------------------------ code blocks */\n.code-block{margin:${ts(4)} 0;border:1px solid ${border};border-radius:${ts(2)};overflow:hidden}\n.code-block-title{display:flex;align-items:center;padding:${ts(1.5)} ${ts(4)};background:${bgMute};border-bottom:1px solid ${border};font-size:12px;font-family:ui-monospace,SFMono-Regular,\"SF Mono\",Menlo,monospace;color:${textSoft}}\n.code-block-inner{position:relative}\n.code-block pre{margin:0;padding:${ts(4)} ${ts(5)};background:${bgSoft};border:none;border-radius:0;overflow-x:auto;font-size:13.5px;line-height:1.5;font-family:ui-monospace,SFMono-Regular,\"SF Mono\",Menlo,monospace}\n.code-block code{font-family:inherit;background:none;padding:0;font-size:inherit}\n.code-block .line{display:inline-block;width:100%}\n.code-block .line.highlighted{background:color-mix(in srgb,${brand} 10%,transparent)}\n.code-block .line.diff.add{background:color-mix(in srgb,${tc(\"shift-7\", \"success\")} 12%,transparent)}\n.code-block .line.diff.add::before{content:\"+ \";color:${tc(\"shift-7\", \"success\")}}\n.code-block .line.diff.remove{background:color-mix(in srgb,${tc(\"shift-9\", \"danger\")} 10%,transparent);opacity:.7}\n.code-block .line.diff.remove::before{content:\"- \";color:${tc(\"shift-9\", \"danger\")}}\n.code-block .line.highlighted.error{background:color-mix(in srgb,${tc(\"shift-9\", \"error\")} 10%,transparent)}\n.code-block .line.highlighted.warning{background:color-mix(in srgb,${tc(\"shift-7\", \"warning\")} 10%,transparent)}\n.code-block pre.has-focus .line:not(.focus){opacity:.4;filter:blur(.4px);transition:opacity .2s,filter .2s}\n.code-block pre.has-focus:hover .line{opacity:1;filter:none}\n.code-block .line-number{display:inline-block;min-width:2.5em;margin-right:1em;color:${textSoft};text-align:right;user-select:none;font-size:.9em}\n.code-copy-btn{position:absolute;top:${ts(2)};right:${ts(2)};padding:${ts(1)} ${ts(2)};border-radius:${ts(1.25)};border:1px solid ${border};background:${bgSoft};color:${textSoft};cursor:pointer;font-size:13px;opacity:0;transition:opacity .15s}\n.code-block-inner:hover .code-copy-btn{opacity:1}\n.code-copy-btn:hover{background:${bgMute};color:${text}}\n\n/* ------------------------------------------------------------- code groups */\n.code-group{margin:${ts(4)} 0;border:1px solid ${border};border-radius:${ts(2)};overflow:hidden}\n.code-group>input[type=\"radio\"]{position:absolute;opacity:0;pointer-events:none;width:0;height:0}\n.code-group .tabs{display:flex;gap:${ts(0.5)};padding:${ts(1.5)} ${ts(2)};background:${bgSoft};border-bottom:1px solid ${border};flex-wrap:wrap}\n.code-group .tabs label{padding:${ts(1)} ${ts(3)};font-size:13px;font-weight:500;color:${textSoft};border-radius:${ts(1.25)};cursor:pointer}\n.code-group .blocks>.code-block{display:none;margin:0;border:none;border-radius:0}\n.code-group .blocks>.code-block pre{border-radius:0}\n${Array.from({ length: 8 }, (_, i) => `.code-group>input:nth-of-type(${i + 1}):checked~.blocks>.code-block:nth-child(${i + 1})`).join(\",\\n\")}{display:block}\n${Array.from({ length: 8 }, (_, i) => `.code-group>input:nth-of-type(${i + 1}):checked~.tabs>label:nth-child(${i + 1})`).join(\",\\n\")}{color:${brand};background:${bgMute}}\n\n/* ---------------------------------------------------------- card containers */\n.custom-block.card{background:${bgSoft};border:1px solid ${border};border-radius:${ts(3)};padding:${ts(5)} ${ts(6)};margin:${ts(3)} 0}\n.custom-block.card .card-title{font-size:16px;font-weight:600;color:${textStrong};margin:0 0 ${ts(2)}}\n.custom-block.card-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(${ts(56)},1fr));gap:${ts(4)};margin:${ts(4)} 0}\na.custom-block.link-card{display:block;background:${bgSoft};border:1px solid ${border};border-radius:${ts(3)};padding:${ts(5)} ${ts(6)};margin:${ts(3)} 0;transition:border-color .15s,background .15s;text-decoration:none;color:${text}}\na.custom-block.link-card:hover{border-color:${brand};background:${bgMute};text-decoration:none}\na.custom-block.link-card .link-card-title{font-size:16px;font-weight:600;color:${brand};margin:0 0 ${ts(2)}}\n.custom-block.card-grid .custom-block.card,.custom-block.card-grid a.custom-block.link-card{margin:0}\n\n/* --------------------------------------------------------- custom blocks */\n.custom-block{margin:${ts(4)} 0;padding:${ts(3)} ${ts(4)};border-radius:${ts(2)};border:1px solid transparent;font-size:14.5px}\n.custom-block p{margin:${ts(2)} 0}\n.custom-block-title{font-weight:700;margin:0 0 ${ts(1)} !important;font-size:13px}\n.custom-block.tip,.custom-block.success{background:color-mix(in srgb,${brand} 8%,${bg});border-color:color-mix(in srgb,${brand} 28%,transparent)}\n.custom-block.info,.custom-block.note,.custom-block.abstract{background:${bgSoft};border-color:${border}}\n.custom-block.warning,.custom-block.question{background:color-mix(in srgb,${tc(\"shift-6\", \"warning\")} 10%,${bg});border-color:${tc(\"shift-6\", \"warning\")}}\n.custom-block.danger,.custom-block.failure,.custom-block.bug{background:color-mix(in srgb,${tc(\"shift-7\", \"danger\")} 10%,${bg});border-color:${tc(\"shift-7\", \"danger\")}}\n.custom-block.example{background:color-mix(in srgb,${tc(\"shift-7\", \"secondary\")} 10%,${bg});border-color:${tc(\"shift-7\", \"secondary\")}}\n.custom-block.quote{background:${bgSoft};border-color:${border};border-left-width:4px;border-radius:0 ${ts(2)} ${ts(2)} 0}\ndetails.custom-block summary{cursor:pointer;font-weight:600}\n\n/* ------------------------------------------------------------------- steps */\n.custom-block.steps{background:none;border:none;padding:0}\n.custom-block.steps>ol{counter-reset:step;list-style:none;padding:0;margin:0}\n.custom-block.steps>ol>li{counter-increment:step;display:grid;grid-template-columns:${ts(9)} 1fr;gap:0 ${ts(4)};margin-bottom:${ts(6)}}\n.custom-block.steps>ol>li::before{content:counter(step);display:flex;align-items:center;justify-content:center;width:${ts(7.5)};height:${ts(7.5)};border-radius:50%;background:${brand};color:${bg};font-size:13px;font-weight:700;flex-shrink:0}\n\n/* ----------------------------------------------------------------- mermaid */\n.dp-mermaid{margin:${ts(5)} 0;text-align:center;overflow-x:auto}\n.dp-mermaid svg{max-width:100%;height:auto}\n\n/* --------------------------------------------------------------- task lists */\n.task-list-item{list-style:none;margin-left:-1.4em;padding-left:1.8em;position:relative}\n.task-list-check{position:absolute;left:0;top:.25em;width:14px;height:14px;cursor:default;accent-color:${brand}}\n\n/* ---------------------------------------------------------------- shiki dark */\nhtml[data-theme=\"dark\"] .shiki,html[data-theme=\"dark\"] .shiki span{color:var(--shiki-dark,inherit) !important}\n`;\n}\n","import type { SiteConfig } from \"./types.js\";\n\nexport type { SiteConfig };\n\nexport type UserConfig = Omit<\n SiteConfig,\n \"base\" | \"srcDir\" | \"outDir\" | \"head\"\n> & {\n base?: string;\n srcDir?: string;\n outDir?: string;\n head?: string[];\n};\n\nexport function defineConfig(config: UserConfig): SiteConfig {\n return {\n base: \"/\",\n srcDir: \".\",\n outDir: \"dist\",\n head: [],\n ...config,\n themeConfig: Object.assign({ nav: [], sidebar: {} }, config.themeConfig),\n };\n}\n","// Static file server with clean-URL support.\n// In dev mode: adds SSE endpoint /_dev/sse for live-reload.\n\nimport { createReadStream, existsSync, readFileSync, statSync } from \"node:fs\";\nimport { createServer, type Server, type ServerResponse } from \"node:http\";\nimport { extname, join, normalize } from \"node:path\";\n\nconst MIME: Record<string, string> = {\n \".html\": \"text/html; charset=utf-8\",\n \".js\": \"text/javascript; charset=utf-8\",\n \".mjs\": \"text/javascript; charset=utf-8\",\n \".css\": \"text/css; charset=utf-8\",\n \".json\": \"application/json; charset=utf-8\",\n \".svg\": \"image/svg+xml\",\n \".png\": \"image/png\",\n \".jpg\": \"image/jpeg\",\n \".jpeg\": \"image/jpeg\",\n \".webp\": \"image/webp\",\n \".gif\": \"image/gif\",\n \".ico\": \"image/x-icon\",\n \".woff\": \"font/woff\",\n \".woff2\": \"font/woff2\",\n \".ttf\": \"font/ttf\",\n \".txt\": \"text/plain; charset=utf-8\",\n \".map\": \"application/json; charset=utf-8\",\n \".xml\": \"application/xml; charset=utf-8\",\n};\n\nconst DEV_SCRIPT = `<script>(function(){var es=new EventSource('/_dev/sse');es.onmessage=function(e){if(e.data==='reload')location.reload();};es.onerror=function(){setTimeout(function(){location.reload();},2000);};})();</script>`;\n\nfunction resolveFile(root: string, urlPath: string): string | null {\n const safe = normalize(decodeURIComponent(urlPath.split(\"?\")[0])).replace(\n /^(\\.\\.[/\\\\])+/,\n \"\",\n );\n const candidates = extname(safe)\n ? [join(root, safe)]\n : [join(root, safe, \"index.html\"), join(root, `${safe}.html`)];\n for (const candidate of candidates) {\n if (existsSync(candidate) && statSync(candidate).isFile()) return candidate;\n }\n return null;\n}\n\nexport function startServer(root: string, port: number): Server {\n const server = createServer((request, response) => {\n const file = resolveFile(root, request.url ?? \"/\");\n if (!file) {\n const notFound = join(root, \"404.html\");\n response.statusCode = 404;\n response.setHeader(\"content-type\", \"text/html; charset=utf-8\");\n if (existsSync(notFound)) createReadStream(notFound).pipe(response);\n else response.end(\"404 Not Found\");\n return;\n }\n response.statusCode = 200;\n response.setHeader(\n \"content-type\",\n MIME[extname(file)] ?? \"application/octet-stream\",\n );\n createReadStream(file).pipe(response);\n });\n server.listen(port, () =>\n console.log(`DomphyPress preview: http://localhost:${port}/`),\n );\n return server;\n}\n\nexport function startDevServer(\n root: string,\n port: number,\n): { server: Server; notify: () => void } {\n const clients = new Set<ServerResponse>();\n\n const server = createServer((request, response) => {\n const url = request.url ?? \"/\";\n if (url === \"/_dev/sse\") {\n response.writeHead(200, {\n \"Content-Type\": \"text/event-stream\",\n \"Cache-Control\": \"no-cache\",\n Connection: \"keep-alive\",\n });\n response.write(\"data: connected\\n\\n\");\n clients.add(response);\n request.on(\"close\", () => clients.delete(response));\n return;\n }\n const file = resolveFile(root, url);\n if (!file) {\n response.statusCode = 404;\n response.setHeader(\"content-type\", \"text/html; charset=utf-8\");\n const notFound = join(root, \"404.html\");\n if (existsSync(notFound)) createReadStream(notFound).pipe(response);\n else response.end(\"404 Not Found\");\n return;\n }\n const mime = MIME[extname(file)] ?? \"application/octet-stream\";\n response.statusCode = 200;\n response.setHeader(\"content-type\", mime);\n if (mime.startsWith(\"text/html\")) {\n const html = readFileSync(file, \"utf8\");\n response.end(html.replace(\"</body>\", `${DEV_SCRIPT}</body>`));\n } else {\n createReadStream(file).pipe(response);\n }\n });\n server.listen(port, () =>\n console.log(\n `DomphyPress dev: http://localhost:${port}/ (live reload active)`,\n ),\n );\n return {\n server,\n notify: () => {\n for (const client of clients) {\n try {\n client.write(\"data: reload\\n\\n\");\n } catch {\n clients.delete(client);\n }\n }\n },\n };\n}\n"],"mappings":"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","names":["execSync","cpSync","existsSync","mkdirSync","readFileSync","rmSync","writeFileSync","dirname","join","relative","resolve","fileURLToPath","createApp","defineRoutes","themeCSS","createShiki","THEME","LANGUAGES","ALIASES","pending","escapeHtml","text","unwrapCode","html","match","parseFenceInfo","info","rawLang","lang","lineNumbers","titleMatch","title","rangeMatch","highlightLines","part","range","i","CODE_ANNOTATION_RE","ANNOTATION_CLASSES","extractAnnotations","code","lines","lineClasses","cleanLines","hasFocus","line","keyword","cls","annotateLines","lineIndex","annotationCls","classes","createHighlighter","highlighter","loaded","resolved","renderFence","highlight","cleanCode","innerHtml","annotated","hasAnnotations","titleHtml","preClass","navLink","themeColor","themeSpacing","toolbar","toolbarSpacer","readdirSync","statSync","join","posix","relative","sep","NON_PAGE_DIRS","routeForFile","srcRelativePath","segments","outFileForRoute","route","listMarkdown","dir","found","name","full","discoverPages","srcDir","pages","filePath","rel","a","b","flattenSidebar","items","out","item","sidebarForRoute","config","bestPrefix","prefix","prevNextForRoute","flat","index","style","obj","tc","tone","color","themeColor","ts","n","themeSpacing","bg","bgSoft","bgMute","border","textSoft","text","textStrong","brand","brandHover","headerH","sidebarW","asideW","contentMax","SOCIAL_LABELS","socialLinkEl","social","name","pageLink","href","navLink","navDropdown","item","menuStyle","child","announcementBar","config","bar","idAttr","children","localeSwitcher","ctx","route","entries","currentKey","barePath","key","currentLocale","links","locale","isActive","header","searchEnabled","logo","logoInner","logoStyle","logoEl","socialEls","localeEl","toolbarSpacer","toolbar","badgeEl","badge","colorMap","bgMap","type","pageLinkWithBadge","sidebarGroup","group","isCollapsible","titleChildren","itemsEl","leaf","groupClass","sidebar","sidebarForRoute","tocAside","minLevel","maxLevel","e","tocTitle","indentMap","prevNext","prev","next","prevNextForRoute","linkStyle","docFooter","editLink","showLastUpdated","hasEdit","hasDate","formatted","pageBadge","frontmatter","text2","resolveSlot","fallback","override","contentDiv","body","pageShell","showSidebar","main","pn","docFooterEl","sidebarEl","mainStyle","shellChildren","asideEl","headerEl","slots","footerContent","heroSection","hero","actionStyle","theme","a","featuresSection","features","f","inner","featureStyle","el","homeShell","readFileSync","dirname","extname","isAbsolute","resolve","splitFrontmatter","tokensToDomphy","MarkdownIt","container","emojiPkg","includeUntyped","markUntyped","subUntyped","supUntyped","include","includeUntyped","markPlugin","markUntyped","subPlugin","subUntyped","supPlugin","supUntyped","emojiPlugin","emojiPkg","CODE_IMPORT_PATTERN","EXT_LANG","resolveSpecifier","spec","fileDir","docsDir","resolve","dirname","isAbsolute","expandCodeImports","body","_whole","rawPath","label","absolute","fence","contents","readFileSync","language","extname","info","stripScriptBlocks","source","ADMONITION_TITLES","containerTitle","type","buildTitleTokens","Token","tag","openType","closeType","className","title","open","inline","text","close","buildHtmlBlock","content","token","buildCodeGroupTokens","tokens","openIndex","closeIndex","groupId","fences","i","labelMatch","inputsHtml","_","labelsHtml","escapeHtml","inner","shapeContainers","output","groupCounter","ALL_ADMONITIONS","admonitionRe","admonitionCloseRe","admonition","custom","linkMatch","href","depth","j","shapeTaskLists","prev","firstChild","checked","checkToken","createParser","highlight","md","MarkdownIt","noopRender","ADMONITION_NAMES","name","container","state","html","renderFence","child","titleFromFilePath","filePath","parts","firstH1","toc","injectHeadingAnchors","elements","el","rec","k","id","children","tag2","renderDoc","options","frontmatter","splitFrontmatter","stripped","expanded","tokensToDomphy","withAnchors","ElementNode","RecordState","themeColor","themeSpacing","card","inputSearch","link","menu","small","FIELD_TITLE","FIELD_HEADING","FIELD_BODY","tokenize","text","tokens","raw","indexText","postings","entryIndex","fieldWeight","term","perEntry","existing","buildSearchIndex","docs","entries","doc","pageIndex","entry","sectionIndex","serializedPostings","b","i","w","queryIndex","serializedIndex","query","limit","index","terms","scoreByEntry","matchedTermsByEntry","seen","indexedTerm","exact","contribution","results","score","coverage","a","optionId","widgetId","resultIndex","widgetCounter","resultRow","result","state","id","l","runQuery","searchWidget","options","indexUrl","placeholder","listboxId","debounceTimer","navigate","input","e","active","dropdown","r","node","host","handler","mountSearch","themeColor","themeSpacing","tc","tone","color","ts","n","bg","bgSoft","bgMute","border","textSoft","text","textStrong","brand","headerH","pressCSS","_","i","here","dirname","fileURLToPath","flattenText","node","out","child","key","value","parseStyleString","style","decl","colon","prop","val","_m","sanitizeStyles","record","firstParagraphText","body","parts","text","estimateReadingTime","textContent","getLastUpdated","filePath","execSync","buildIslandsBundle","outDir","searchEnabled","islandsSource","join","entrySource","tmpEntry","mkdirSync","writeFileSync","esbuildBuild","rmSync","buildSitemap","routes","hostname","route","RUNTIME_SCRIPT","mermaidHeadScript","mermaid","htmlDocument","result","config","generatedCss","pageHead","lang","islandsScript","mermaidScript","buildSite","options","srcDir","publicDir","showLastUpdated","localePages","discoverPages","p","localeKey","_locale","localeDir","resolve","existsSync","prefix","highlight","createHighlighter","themeCSS","pressCSS","built","searchDocs","page","source","readFileSync","doc","renderDoc","textParts","readingTime","lastUpdated","relPath","relative","pageHeadMap","pageLangMap","appRoutes","defineRoutes","localeConfig","mergedTheme","mergedConfig","ctx","isHome","description","siteTitle","pageTitle","canonical","s","homeShell","pageShell","app","createApp","failures","totalBytes","html","outPath","error","failure","buildSearchIndex","cpSync","defineConfig","config","createReadStream","existsSync","readFileSync","statSync","createServer","extname","join","normalize","MIME","DEV_SCRIPT","resolveFile","root","urlPath","safe","candidates","candidate","startServer","port","server","request","response","file","notFound","startDevServer","clients","url","mime","html","client"]}