@nexpress/theme-docs 0.3.10 → 0.3.12
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 +4 -3
- package/dist/index.js.map +1 -1
- package/package.json +6 -6
package/dist/index.js
CHANGED
|
@@ -615,7 +615,8 @@ async function DocPageTemplate({
|
|
|
615
615
|
const updatedLabel = formatUpdated(doc.updatedAt ?? doc.publishedAt);
|
|
616
616
|
const readingLabel = readingMinutesLabel(doc.readingTime);
|
|
617
617
|
const editHref = settings.githubRepo ? `${settings.githubRepo}/edit/${settings.githubBranch}/${settings.githubDocsPath}/${doc.slug}${settings.githubExtension}` : null;
|
|
618
|
-
const
|
|
618
|
+
const richText = doc.body ?? doc.content;
|
|
619
|
+
const toc = extractHeadingToc(richText);
|
|
619
620
|
const reportIssueHref = settings.githubRepo ? `${settings.githubRepo}/issues/new` : null;
|
|
620
621
|
return /* @__PURE__ */ jsxs6(Fragment2, { children: [
|
|
621
622
|
/* @__PURE__ */ jsxs6("article", { className: "np-docs-page", children: [
|
|
@@ -643,14 +644,14 @@ async function DocPageTemplate({
|
|
|
643
644
|
] }) : null,
|
|
644
645
|
editHref ? /* @__PURE__ */ jsx6("a", { href: editHref, target: "_blank", rel: "noreferrer", children: "Edit this page \u2192" }) : null
|
|
645
646
|
] }) : null,
|
|
646
|
-
/* @__PURE__ */ jsx6("div", { className: "np-docs-page-body", children:
|
|
647
|
+
/* @__PURE__ */ jsx6("div", { className: "np-docs-page-body", children: richText ? (
|
|
647
648
|
// Core types `NpRichTextContent` as the opaque
|
|
648
649
|
// `Record<string, unknown>`; the editor's renderer
|
|
649
650
|
// refines it to `{ root: ... }`. Structural cast at
|
|
650
651
|
// the boundary — both sides go through the same
|
|
651
652
|
// Lexical serializer.
|
|
652
653
|
renderRichText(
|
|
653
|
-
|
|
654
|
+
richText,
|
|
654
655
|
{ headingAnchors: true }
|
|
655
656
|
)
|
|
656
657
|
) : /* @__PURE__ */ jsx6("p", { style: { color: "var(--np-color-muted-foreground)" }, children: "No body content yet." }) }),
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/copy-button-bridge.ts","../src/blocks/index.tsx","../src/header.tsx","../src/settings-helpers.ts","../src/settings.ts","../src/members-not-found.tsx","../src/members-shell.tsx","../src/not-found.tsx","../src/routes/doc-detail.tsx","../src/templates/doc-page.tsx","../src/toc-scrollspy-bridge.ts","../src/search.tsx","../src/shell.tsx","../src/sidebar.tsx","../src/lib/doc-tree.ts","../src/styles.ts","../src/templates/page-api-reference.tsx","../src/templates/page-changelog.tsx","../src/templates/page-front.tsx"],"sourcesContent":["import { defineTheme, type NpThemeSeedPage, type NpThemeSeedPost } from \"@nexpress/theme\";\n\nimport { docsBlocks } from \"./blocks/index.js\";\nimport { CopyButton } from \"./copy-button-bridge.js\";\nimport { DocsHeader } from \"./header.js\";\nimport { DocsMembersNotFound } from \"./members-not-found.js\";\nimport { DocsMembersShell } from \"./members-shell.js\";\nimport { DocsNotFound } from \"./not-found.js\";\nimport { DocsDetailRoute } from \"./routes/doc-detail.js\";\nimport { DocsSearch } from \"./search.js\";\nimport { DocsShell } from \"./shell.js\";\nimport { DocsSidebar } from \"./sidebar.js\";\nimport { docsCss } from \"./styles.js\";\nimport { docsSettingsSchema } from \"./settings.js\";\nimport { DocPageTemplate } from \"./templates/doc-page.js\";\nimport { PageApiReferenceTemplate } from \"./templates/page-api-reference.js\";\nimport { PageChangelogTemplate } from \"./templates/page-changelog.js\";\nimport { PageFrontTemplate } from \"./templates/page-front.js\";\n\nconst SEED_NAV = {\n header: [\n { id: \"nav-docs-docs\", label: \"Docs\", type: \"link\" as const, url: \"/\" },\n { id: \"nav-docs-reference\", label: \"Reference\", type: \"link\" as const, url: \"/docs/reference\" },\n { id: \"nav-docs-blog\", label: \"Blog\", type: \"link\" as const, url: \"/blog\" },\n ],\n footer: [\n { id: \"nav-docs-footer-docs\", label: \"Documentation\", type: \"link\" as const, url: \"/\" },\n {\n id: \"nav-docs-footer-reference\",\n label: \"Reference\",\n type: \"link\" as const,\n url: \"/docs/reference\",\n },\n {\n id: \"nav-docs-footer-changelog\",\n label: \"Changelog\",\n type: \"link\" as const,\n url: \"/changelog\",\n },\n {\n id: \"nav-docs-footer-github\",\n label: \"GitHub\",\n type: \"link\" as const,\n url: \"https://github.com\",\n },\n ],\n};\n\nfunction paragraph(text: string) {\n return {\n type: \"paragraph\",\n version: 1,\n direction: null,\n format: \"\",\n indent: 0,\n children: [\n {\n type: \"text\",\n version: 1,\n detail: 0,\n format: 0,\n mode: \"normal\",\n style: \"\",\n text,\n },\n ],\n };\n}\n\nfunction heading(tag: \"h2\" | \"h3\", text: string) {\n return {\n type: \"heading\",\n tag,\n version: 1,\n direction: null,\n format: \"\",\n indent: 0,\n children: [\n {\n type: \"text\",\n version: 1,\n detail: 0,\n format: 0,\n mode: \"normal\",\n style: \"\",\n text,\n },\n ],\n };\n}\n\nfunction codeBlock(text: string, language?: string) {\n return {\n type: \"code\",\n language: language ?? null,\n version: 1,\n direction: null,\n format: \"\",\n indent: 0,\n children: [\n {\n type: \"text\",\n version: 1,\n detail: 0,\n format: 0,\n mode: \"normal\",\n style: \"\",\n text,\n },\n ],\n };\n}\n\nfunction listItem(text: string) {\n return {\n type: \"listitem\",\n value: 1,\n version: 1,\n direction: null,\n format: \"\",\n indent: 0,\n children: [\n {\n type: \"text\",\n version: 1,\n detail: 0,\n format: 0,\n mode: \"normal\",\n style: \"\",\n text,\n },\n ],\n };\n}\n\nfunction bulletList(items: string[]) {\n return {\n type: \"list\",\n listType: \"bullet\",\n start: 1,\n tag: \"ul\",\n version: 1,\n direction: null,\n format: \"\",\n indent: 0,\n children: items.map((t) => listItem(t)),\n };\n}\n\nfunction lexicalDoc(blocks: unknown[]): unknown {\n return {\n root: {\n type: \"root\",\n version: 1,\n direction: null,\n format: \"\",\n indent: 0,\n children: blocks,\n },\n };\n}\n\nconst DOCS_NOW = \"2026-05-02T12:00:00.000Z\";\n\nfunction stubDoc(opts: {\n title: string;\n parentSlug?: string;\n order?: number;\n badge?: string;\n lede?: string;\n stableSince?: string;\n}): NpThemeSeedPost {\n return {\n title: opts.title,\n excerpt: opts.lede ?? `${opts.title} reference page.`,\n content: lexicalDoc([\n paragraph(\n `Placeholder body for ${opts.title}. Operators replace this once they're set up — every doc-kind post renders through the three-column docs template.`,\n ),\n ]),\n publishedAt: DOCS_NOW,\n kind: \"doc\",\n ...(opts.parentSlug ? { parentSlug: opts.parentSlug } : {}),\n ...(typeof opts.order === \"number\" ? { order: opts.order } : {}),\n data: {\n ...(opts.badge ? { badge: opts.badge } : {}),\n ...(opts.lede ? { lede: opts.lede } : {}),\n ...(opts.stableSince ? { stableSince: opts.stableSince } : {}),\n },\n };\n}\n\nconst QUICKSTART_BODY = lexicalDoc([\n paragraph(\n \"A NexPress plugin is a single function that returns a manifest. The framework loads it during boot, validates its declared shape, and wires the hooks and routes into the request pipeline. There's no plugin loader to learn — if you can write a TypeScript module, you can write a plugin.\",\n ),\n paragraph(\n \"Prerequisites: a running NexPress site (see Install & bootstrap) and Node 20+. The plugin lives inside your app — no separate workspace required to start.\",\n ),\n heading(\"h2\", \"Scaffold the plugin\"),\n paragraph(\n \"The CLI ships a scaffold command that drops a typed plugin module into plugins/. The generated file imports definePlugin from the SDK and exports a single function.\",\n ),\n codeBlock(\"pnpm nexpress plugin:new hello-world\", \"bash\"),\n paragraph(\n \"The generated module is ~20 lines, ready to run. Open it in your editor before continuing.\",\n ),\n codeBlock(\n [\n 'import { definePlugin } from \"@nexpress/plugin-sdk\";',\n \"\",\n \"export default definePlugin({\",\n \" manifest: {\",\n ' id: \"hello-world\",',\n ' name: \"Hello, world\",',\n ' version: \"0.1.0\",',\n ' nexpress: { minVersion: \"0.1.0\" },',\n \" },\",\n \" hooks: {\",\n \" onDocumentPublished: async ({ doc, collection }) => {\",\n ' if (collection !== \"posts\") return;',\n \" console.log(`Published: ${doc.title}`);\",\n \" },\",\n \" },\",\n \"});\",\n ].join(\"\\n\"),\n \"typescript\",\n ),\n heading(\"h2\", \"Register it with your site\"),\n paragraph(\n \"NexPress loads plugins from nexpress.config.ts. Import your module and add it to the plugins array — order matters, hooks run in the order they're registered.\",\n ),\n codeBlock(\n [\n 'import { defineConfig } from \"@nexpress/core\";',\n 'import helloWorld from \"./plugins/hello-world\";',\n \"\",\n \"export default defineConfig({\",\n \" plugins: [helloWorld()],\",\n \"});\",\n ].join(\"\\n\"),\n \"typescript\",\n ),\n paragraph(\n \"Hot reload picks up new plugin files without a restart. Config changes do require one — that's a Next.js constraint, not ours.\",\n ),\n heading(\"h2\", \"Lifecycle hooks at a glance\"),\n paragraph(\n \"Hooks are typed callbacks NexPress invokes at well-known points. Each receives a context object scoped to that event. The most commonly used hooks:\",\n ),\n bulletList([\n \"onBoot — after config load, before request handling. Context: { config, env }.\",\n \"onDocumentPublished (async) — a document's status transitions to published. Context: { doc, collection, by }.\",\n \"onDocumentUnpublished — status leaves published. Context: { doc, collection, by }.\",\n \"onRequest — every request, after routing, before render. Context: { req, route, user }.\",\n \"onSchedule — cron-like; declare cadence in the manifest. Context: { now, schedule }.\",\n ]),\n paragraph(\n \"The full list — including admin-surface and search hooks — lives in the lifecycle hooks reference.\",\n ),\n heading(\"h2\", \"Run and verify\"),\n bulletList([\n \"Start the dev server. pnpm dev from the repo root. Codegen runs alongside Next's watcher, so plugin types are picked up as you save.\",\n \"Publish a post from the admin. Open /admin, create a draft in the posts collection, and click Publish. The hook fires inside the same request.\",\n \"Check the dev server log. You should see Published: <title> in the terminal. That's it — the plugin is live.\",\n ]),\n paragraph(\n \"Hooks block the response: onDocumentPublished runs inside the publish request. Long-running work — sending emails, regenerating sitemaps — belongs in onSchedule or a queued job. Otherwise the editor will wait on it.\",\n ),\n heading(\"h2\", \"Next steps\"),\n paragraph(\"You have a plugin that runs. Two natural directions from here:\"),\n bulletList([\n \"Add a route. Declare a routes entry in the manifest to expose a public URL — for webhooks, OAuth callbacks, or a custom admin screen.\",\n \"Add collections. Plugins can declare their own collections, which the admin surfaces alongside the operator's. See the Plugin manifest reference.\",\n ]),\n]);\n\nconst SEED_PAGES: NpThemeSeedPage[] = [\n {\n title: \"Documentation\",\n slug: \"/\",\n seoDescription:\n \"Install NexPress, learn the core concepts, write plugins, and look up the API.\",\n blocks: [],\n template: \"front\",\n },\n {\n title: \"definePlugin\",\n slug: \"docs/reference/define-plugin\",\n seoDescription: \"API reference for definePlugin from @nexpress/plugin-sdk.\",\n blocks: [],\n template: \"apiReference\",\n },\n {\n title: \"Changelog\",\n slug: \"changelog\",\n seoDescription: \"Reverse-chronological changelog for NexPress pre-1.0 releases.\",\n blocks: [],\n template: \"changelog\",\n },\n];\n\nconst SEED_DOCS: NpThemeSeedPost[] = [\n stubDoc({\n title: \"Get started\",\n order: 0,\n lede: \"Install NexPress, scaffold a site, and ship a first deploy.\",\n }),\n stubDoc({\n title: \"Introduction\",\n parentSlug: \"get-started\",\n order: 0,\n lede: \"What NexPress is, what it isn't, and who it's for.\",\n stableSince: \"Stable since 0.1\",\n }),\n stubDoc({\n title: \"Install\",\n parentSlug: \"get-started\",\n order: 1,\n stableSince: \"Stable since 0.1\",\n }),\n stubDoc({ title: \"Project structure\", parentSlug: \"get-started\", order: 2 }),\n stubDoc({ title: \"Configuration\", parentSlug: \"get-started\", order: 3 }),\n stubDoc({ title: \"Deployment\", parentSlug: \"get-started\", order: 4 }),\n\n stubDoc({\n title: \"Core concepts\",\n order: 1,\n lede: \"The model behind collections, themes, plugins, and blocks.\",\n }),\n stubDoc({\n title: \"Collections\",\n parentSlug: \"core-concepts\",\n order: 0,\n stableSince: \"Stable since 0.1\",\n }),\n stubDoc({ title: \"Pages & routing\", parentSlug: \"core-concepts\", order: 1 }),\n stubDoc({ title: \"Themes\", parentSlug: \"core-concepts\", order: 2 }),\n stubDoc({ title: \"Blocks\", parentSlug: \"core-concepts\", order: 3 }),\n stubDoc({ title: \"Hooks & access\", parentSlug: \"core-concepts\", order: 4 }),\n stubDoc({ title: \"Internationalization\", parentSlug: \"core-concepts\", order: 5 }),\n\n stubDoc({\n title: \"Plugins\",\n order: 2,\n lede: \"Extend NexPress with hooks, routes, blocks, and scheduled jobs.\",\n }),\n stubDoc({ title: \"Overview\", parentSlug: \"plugins\", order: 0 }),\n {\n title: \"Plugin author quickstart\",\n excerpt: 'From \"I want to add behavior\" to a running plugin in ten minutes.',\n content: QUICKSTART_BODY,\n publishedAt: DOCS_NOW,\n kind: \"doc\",\n parentSlug: \"plugins\",\n order: 1,\n data: {\n badge: \"NEW\",\n lede: 'From \"I want to add behavior\" to a running plugin in ten minutes.',\n stableSince: \"Stable since 0.1\",\n },\n },\n stubDoc({ title: \"Manifest\", parentSlug: \"plugins\", order: 2 }),\n stubDoc({ title: \"Lifecycle\", parentSlug: \"plugins\", order: 3 }),\n stubDoc({ title: \"Publishing\", parentSlug: \"plugins\", order: 4 }),\n\n stubDoc({\n title: \"Reference\",\n order: 3,\n lede: \"API surface — CLI, define* helpers, server functions.\",\n }),\n stubDoc({ title: \"CLI\", parentSlug: \"reference\", order: 0 }),\n stubDoc({ title: \"defineCollection\", parentSlug: \"reference\", order: 1, badge: \"API\" }),\n stubDoc({ title: \"defineTheme\", parentSlug: \"reference\", order: 2 }),\n stubDoc({ title: \"definePlugin\", parentSlug: \"reference\", order: 3 }),\n stubDoc({ title: \"Server functions\", parentSlug: \"reference\", order: 4, badge: \"BETA\" }),\n];\n\n/**\n * `@nexpress/theme-docs` — documentation theme for NexPress.\n *\n * Three-column reference-docs layout: sticky search-first header\n * (brand mark + version pill + ⌘K search + primary nav + GitHub\n * link), hierarchical sidebar with bullet-eyebrow groups + nested\n * links + status badges, centered article column with breadcrumbs\n * + lede + meta pills + Lexical body, on-this-page TOC on the\n * right. Sidebar collapses out at the tablet breakpoint; TOC\n * collapses out below 1100px.\n *\n * Pairs with `posts` rows of `kind: \"doc\"`\n * (universal-content-model #748 — docs are posts with a kind\n * discriminator, not a separate collection). The doc-specific\n * fields (`lede`, `stableSince`) are contributed via\n * `requires.collections.posts.fields` and merged onto the\n * built-in posts collection at config-resolution time.\n *\n * `seedContent.navigation` ships the primary header / footer\n * links. Doc rows are operator-authored; themes that want to\n * seed kind=\"doc\" content use `seedContent.posts` with the\n * `kind` field set on each entry (see U.1 #749).\n */\nexport const docsTheme = defineTheme({\n manifest: {\n id: \"docs\",\n name: \"Docs\",\n version: \"0.2.0\",\n description:\n \"Documentation theme — three-column layout with hierarchical sidebar, breadcrumbs + lede + meta pills on the article column, on-this-page TOC on the right rail. Blue accent on a near-white surface; pairs with a `docs` collection.\",\n author: { name: \"NexPress\" },\n nexpress: { minVersion: \"0.1.0\" },\n requires: {\n collections: {\n posts: {\n // Universal-content-model #748 — docs are posts with\n // `kind: \"doc\"`. The framework's built-in `posts`\n // collection already supplies `title` / `body` /\n // `parent` (rel→posts) / `order`. Docs theme adds the\n // doc-specific meta pills and contributes the kind\n // option + kinds metadata block for admin / URL\n // routing.\n fields: {\n kind: {\n type: \"select\",\n options: [{ label: \"Doc\", value: \"doc\" }],\n },\n // Short opening paragraph rendered as a lede under\n // the h1. Optional — the article still renders\n // without it. Lives in a \"Docs\" sidebar group with\n // `stableSince`; the group + fields hide entirely\n // when the active kind isn't `\"doc\"`.\n lede: {\n type: \"textarea\",\n hard: false,\n admin: {\n position: \"sidebar\",\n group: \"Docs\",\n condition: { when: \"kind\", equals: \"doc\" },\n },\n },\n // Meta-pill slot — advisory hint the doc-page\n // template surfaces in the strap row. Note: portfolio\n // theme also contributes a `badge: text` field on\n // posts; the merge-requirements union picks the first\n // declarer. Docs reads `doc.badge` regardless of which\n // theme declared the column.\n stableSince: {\n type: \"text\",\n hard: false,\n admin: {\n position: \"sidebar\",\n group: \"Docs\",\n condition: { when: \"kind\", equals: \"doc\" },\n },\n },\n },\n groupMeta: {\n Docs: {\n icon: \"BookOpen\",\n description: \"Doc-specific meta — lede and API stability hint.\",\n },\n },\n kinds: {\n doc: {\n label: \"Doc\",\n labelPlural: \"Documentation\",\n icon: \"BookOpen\",\n // Public-site URL pattern. The catch-all router\n // matches `/docs/<slug>` and queries posts with\n // `where: { kind: \"doc\", slug }`.\n urlPattern: \"/docs/:slug\",\n // Hint to admin: show parent + order controls and\n // render the list as a tree, not a flat table.\n hierarchical: true,\n },\n },\n },\n },\n },\n settingsSchema: docsSettingsSchema,\n },\n impl: {\n shell: DocsShell,\n slots: {\n header: DocsHeader,\n sidebar: DocsSidebar,\n },\n css: docsCss,\n tokens: {\n colors: {\n primary: \"#2563eb\",\n primaryForeground: \"#ffffff\",\n // 10% tint of primary — equivalent to the color-mix\n // fallback in styles.ts, but materialised so the\n // generated theme CSS picks it up explicitly.\n primarySoft: \"rgba(37, 99, 235, 0.1)\",\n background: \"#fbfcfe\",\n foreground: \"#0c1320\",\n muted: \"#f1f4f9\",\n mutedForeground: \"#5b6478\",\n border: \"#e2e7ef\",\n card: \"#ffffff\",\n },\n typography: {\n fontHeading:\n '\"Geist\", -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, sans-serif',\n fontBody:\n '\"Geist\", -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, sans-serif',\n fontMono:\n '\"Geist Mono\", ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace',\n },\n shape: {\n radiusSm: \"5px\",\n radiusMd: \"9px\",\n radiusLg: \"10px\",\n },\n },\n seedContent: {\n navigation: SEED_NAV,\n pages: SEED_PAGES,\n posts: SEED_DOCS,\n },\n templates: {\n pages: {\n front: {\n label: \"Front page\",\n description:\n 'Docs landing — hero + 2x2 group cards walking the kind=\"doc\" tree + recently-updated row. The seeded home page (slug \"/\") ships with this template.',\n component: PageFrontTemplate,\n },\n apiReference: {\n label: \"API reference\",\n description: \"Docs reference page with signature, parameter table, and return contract.\",\n component: PageApiReferenceTemplate,\n },\n changelog: {\n label: \"Changelog\",\n description: \"Reverse-chronological release timeline with typed change labels.\",\n component: PageChangelogTemplate,\n },\n },\n // Universal-content-model #748 — docs are posts with\n // `kind: \"doc\"`. The template key matches the kind value so\n // the per-kind template lookup picks this up automatically.\n // Article-kind posts continue rendering through the\n // framework's inline article markup unless the operator\n // declares a `templates.posts.default` of their own.\n posts: {\n doc: {\n label: \"Doc page\",\n description:\n \"Three-column reference layout — breadcrumbs + lede + meta + Lexical body + feedback + prev/next, with the docs sidebar slotted on the left and the on-page TOC on the right.\",\n component: DocPageTemplate,\n },\n },\n },\n routes: [\n // F.2 — docs theme's scoped search route. Lives at\n // `/docs/search` rather than `/search` (#609): the host's\n // reference app has an app-explicit `/search` page route\n // that takes precedence over theme routes per the locked\n // dispatch order (app file > page > theme > plugin). The\n // theme can't override the universal search page, so it\n // scopes its own search to a `/docs/*` namespace and the\n // operator gets both routes: framework `/search` + docs\n // theme `/docs/search`.\n //\n // Order matters: search comes first so `/docs/search` is\n // matched as a literal rather than `{ slug: \"search\" }`\n // by the parametric detail route below (dispatcher is\n // first-match-wins).\n { pattern: \"/docs/search\", component: DocsSearch },\n // Doc detail dispatch. The sidebar + template emit\n // `/docs/<slug>` links; the route component looks up the\n // doc-kind post by slug and renders through DocPageTemplate.\n // Universal-content-model #748 — docs are posts with\n // `kind=\"doc\"`; the lookup filters on kind, not collection.\n { pattern: \"/docs/:slug\", component: DocsDetailRoute },\n ],\n navLocations: {\n header: {\n label: \"Primary header nav\",\n description: \"Inline links beside the masthead search box.\",\n maxItems: 5,\n },\n },\n notFound: DocsNotFound,\n // M.* adoption (2026-05-11). Docs gains purpose-built member\n // chrome: drops the docs sidebar (hierarchical doc nav is\n // useless on auth forms), keeps the masthead, narrows the\n // content column. Without this, the fallback chain would\n // walk back to `impl.shell` (the 3-column grid) and the\n // sidebar slot would surface alongside an auth form.\n // - `shell`: DocsMembersShell (header + narrow column, no\n // sidebar).\n // - `notFound`: DocsMembersNotFound (stale-auth-link framing\n // with /members/login CTA, monospace accent matching the\n // theme).\n // - `error`: forward-compat type marker; the actual render\n // goes through `./components/members-error`'s client\n // subpath, lazy-imported by\n // `apps/web/src/app/(member)/error.tsx`'s registry\n // (F.7.1 delegation — Next mandates `error.tsx` is \"use\n // client\").\n members: {\n shell: DocsMembersShell,\n notFound: DocsMembersNotFound,\n },\n blocks: docsBlocks,\n },\n});\n\nexport {\n CopyButton,\n DocsHeader,\n DocsShell,\n DocsSidebar,\n DocsNotFound,\n DocsMembersShell,\n DocsMembersNotFound,\n DocsSearch,\n DocPageTemplate,\n PageApiReferenceTemplate,\n PageChangelogTemplate,\n};\nexport { docsBlocks } from \"./blocks/index.js\";\nexport { docsCss };\nexport { docsSettingsSchema, type DocsSettings } from \"./settings.js\";\n","// Sibling-depth re-export of the client CopyButton component.\n//\n// Same shape as `toc-scrollspy-bridge.ts` — tsup's `external` rule\n// matches the import specifier verbatim, and a parent-relative spec\n// from `src/blocks/` or `src/templates/` would bake\n// `\"../components/...\"` into `dist/index.js` and escape the dist\n// root at consume time. Routing through this sibling-depth bridge\n// keeps the bundled specifier at `./components/copy-button.js`,\n// which the package's `external` list matches.\nexport { CopyButton } from \"./components/copy-button.js\";\n","import * as React from \"react\";\nimport type { NpBlockDefinition } from \"@nexpress/blocks\";\n\nimport { CopyButton } from \"../copy-button-bridge.js\";\n\nconst readString = (value: unknown, fallback: string): string =>\n typeof value === \"string\" && value.trim().length > 0 ? value : fallback;\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === \"object\" && value !== null && !Array.isArray(value);\n\nconst CALLOUT_VARIANTS = [\"default\", \"note\", \"warn\", \"danger\"] as const;\ntype CalloutVariant = (typeof CALLOUT_VARIANTS)[number];\n\nfunction readCalloutVariant(value: unknown): CalloutVariant {\n if (typeof value === \"string\") {\n for (const candidate of CALLOUT_VARIANTS) {\n if (candidate === value) return candidate;\n }\n }\n return \"default\";\n}\n\nfunction CalloutIcon({ variant }: { variant: CalloutVariant }): React.ReactElement {\n if (variant === \"warn\") {\n return (\n <svg\n width=\"18\"\n height=\"18\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n <path d=\"M10.29 3.86 1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0Z\" />\n <line x1=\"12\" y1=\"9\" x2=\"12\" y2=\"13\" />\n <line x1=\"12\" y1=\"17\" x2=\"12.01\" y2=\"17\" />\n </svg>\n );\n }\n if (variant === \"danger\") {\n return (\n <svg\n width=\"18\"\n height=\"18\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n <polygon points=\"7.86 2 16.14 2 22 7.86 22 16.14 16.14 22 7.86 22 2 16.14 2 7.86 7.86 2\" />\n <line x1=\"15\" y1=\"9\" x2=\"9\" y2=\"15\" />\n <line x1=\"9\" y1=\"9\" x2=\"15\" y2=\"15\" />\n </svg>\n );\n }\n return (\n <svg\n width=\"18\"\n height=\"18\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <line x1=\"12\" y1=\"16\" x2=\"12\" y2=\"12\" />\n <line x1=\"12\" y1=\"8\" x2=\"12.01\" y2=\"8\" />\n </svg>\n );\n}\n\nconst docsCalloutBlock: NpBlockDefinition = {\n type: \"docsCallout\",\n label: \"Callout\",\n description: \"Highlighted note / warning / danger panel with a leading icon.\",\n icon: \"Info\",\n iconKind: \"lucide\",\n summaryFields: [\"title\"],\n category: \"Content\",\n source: \"theme\",\n keywords: [\"note\", \"warning\", \"danger\", \"admonition\", \"info\"],\n defaultProps: {\n variant: \"default\",\n title: \"Heads up\",\n body: \"Add context that an operator should not miss when scanning the page.\",\n },\n propsSchema: [\n {\n name: \"variant\",\n label: \"Variant\",\n type: \"select\",\n defaultValue: \"default\",\n options: [\n { label: \"Default\", value: \"default\" },\n { label: \"Note\", value: \"note\" },\n { label: \"Warning\", value: \"warn\" },\n { label: \"Danger\", value: \"danger\" },\n ],\n },\n { name: \"title\", label: \"Title\", type: \"text\", defaultValue: \"Heads up\" },\n {\n name: \"body\",\n label: \"Body\",\n type: \"textarea\",\n defaultValue: \"Add context that an operator should not miss when scanning the page.\",\n },\n ],\n render: (props) => {\n const variant = readCalloutVariant(props.variant);\n const title = readString(props.title, \"Heads up\");\n const body = readString(props.body, \"\");\n return (\n <aside className={`np-docs-callout np-docs-callout--${variant}`}>\n <CalloutIcon variant={variant} />\n <div>\n <div className=\"np-docs-callout-title\">{title}</div>\n {body ? <p>{body}</p> : null}\n </div>\n </aside>\n );\n },\n};\n\nconst docsCodePanelBlock: NpBlockDefinition = {\n type: \"docsCodePanel\",\n label: \"Code panel\",\n description: \"Dark code surface with filename, language pill, and copy button.\",\n icon: \"Code2\",\n iconKind: \"lucide\",\n summaryFields: [\"filename\", \"language\"],\n category: \"Content\",\n source: \"theme\",\n keywords: [\"code\", \"snippet\", \"syntax\", \"block\"],\n defaultProps: {\n filename: \"example.ts\",\n language: \"ts\",\n source: 'export const greeting = \"hello\";',\n },\n propsSchema: [\n {\n name: \"filename\",\n label: \"Filename\",\n type: \"text\",\n defaultValue: \"example.ts\",\n },\n {\n name: \"language\",\n label: \"Language\",\n type: \"text\",\n defaultValue: \"ts\",\n },\n {\n name: \"source\",\n label: \"Source\",\n type: \"textarea\",\n rows: 10,\n defaultValue: 'export const greeting = \"hello\";',\n },\n ],\n render: (props) => {\n const filename = readString(props.filename, \"\");\n const language = readString(props.language, \"\");\n const source = readString(props.source, \"\");\n return (\n <div className=\"np-docs-code\">\n <div className=\"np-docs-code-head\">\n <span className=\"np-docs-code-file\">\n {filename ? <span>{filename}</span> : null}\n {language ? <span className=\"np-docs-brand-version\">{language}</span> : null}\n </span>\n <CopyButton text={source} />\n </div>\n <pre>\n <code>{source}</code>\n </pre>\n </div>\n );\n },\n};\n\nconst docsShellCommandBlock: NpBlockDefinition = {\n type: \"docsShellCommand\",\n label: \"Shell command\",\n description: \"Inline terminal-style command snippet with a copy button.\",\n icon: \"Terminal\",\n iconKind: \"lucide\",\n summaryFields: [\"command\"],\n category: \"Content\",\n source: \"theme\",\n keywords: [\"terminal\", \"shell\", \"bash\", \"command\", \"cli\"],\n defaultProps: {\n prompt: \"$\",\n command: \"pnpm install\",\n },\n propsSchema: [\n { name: \"prompt\", label: \"Prompt\", type: \"text\", defaultValue: \"$\" },\n {\n name: \"command\",\n label: \"Command\",\n type: \"text\",\n defaultValue: \"pnpm install\",\n },\n ],\n render: (props) => {\n const prompt = readString(props.prompt, \"$\");\n const command = readString(props.command, \"\");\n return (\n <div className=\"np-docs-cmdline\">\n <span className=\"np-docs-cmdline-prompt\">{prompt}</span>\n <code className=\"np-docs-cmdline-cmd\">{command}</code>\n <CopyButton text={command} className=\"np-docs-cmdline-copy\" />\n </div>\n );\n },\n};\n\ninterface StepItem {\n title: string;\n body: string;\n}\n\nfunction readSteps(value: unknown): StepItem[] {\n if (!Array.isArray(value)) return [];\n return value.filter(isRecord).map((item) => ({\n title: readString(item.title, \"Step\"),\n body: readString(item.body, \"\"),\n }));\n}\n\nconst docsStepsBlock: NpBlockDefinition = {\n type: \"docsSteps\",\n label: \"Steps\",\n description: \"Numbered checklist of ordered steps.\",\n icon: \"ListOrdered\",\n iconKind: \"lucide\",\n category: \"Content\",\n source: \"theme\",\n keywords: [\"steps\", \"checklist\", \"ordered\", \"numbered\", \"tutorial\"],\n defaultProps: {\n items: [\n { title: \"Install\", body: \"Add the package to your workspace.\" },\n { title: \"Configure\", body: \"Wire it into the bootstrap.\" },\n { title: \"Run\", body: \"Boot the dev server and verify.\" },\n ],\n },\n propsSchema: [\n {\n name: \"items\",\n label: \"Steps\",\n type: \"array\",\n defaultValue: [\n { title: \"Install\", body: \"Add the package to your workspace.\" },\n { title: \"Configure\", body: \"Wire it into the bootstrap.\" },\n { title: \"Run\", body: \"Boot the dev server and verify.\" },\n ],\n itemDefault: { title: \"New step\", body: \"\" },\n itemSchema: [\n { name: \"title\", label: \"Title\", type: \"text\", defaultValue: \"New step\" },\n { name: \"body\", label: \"Body\", type: \"textarea\", defaultValue: \"\" },\n ],\n },\n ],\n render: (props) => {\n const items = readSteps(props.items);\n if (items.length === 0) return <ol className=\"np-docs-steps\" />;\n return (\n <ol className=\"np-docs-steps\">\n {items.map((step, index) => (\n <li key={`step-${index.toString()}`}>\n <div className=\"np-docs-step-title\">{step.title}</div>\n {step.body ? <p className=\"np-docs-step-body\">{step.body}</p> : null}\n </li>\n ))}\n </ol>\n );\n },\n};\n\ninterface ApiRow {\n cells: string[];\n required: boolean;\n}\n\nconst docsApiTableBlock: NpBlockDefinition = {\n type: \"docsApiTable\",\n label: \"API table\",\n description: \"Reference table with uppercase mono headers and a required pill.\",\n icon: \"Table\",\n iconKind: \"lucide\",\n category: \"Content\",\n source: \"theme\",\n keywords: [\"api\", \"reference\", \"table\", \"schema\", \"props\"],\n defaultProps: {\n columns: [\"Name\", \"Type\", \"Description\"],\n rows: [\n { cells: [\"slug\", \"string\", \"Unique URL fragment.\"], required: true },\n { cells: [\"title\", \"string\", \"Document title.\"], required: true },\n { cells: [\"body\", \"RichText\", \"Lexical body content.\"], required: false },\n ],\n },\n propsSchema: [\n {\n name: \"columns\",\n label: \"Columns\",\n type: \"array\",\n defaultValue: [\"Name\", \"Type\", \"Description\"],\n itemDefault: { value: \"Column\" },\n itemSchema: [{ name: \"value\", label: \"Header\", type: \"text\", defaultValue: \"Column\" }],\n },\n {\n name: \"rows\",\n label: \"Rows\",\n type: \"array\",\n defaultValue: [{ cells: [\"slug\", \"string\", \"Unique URL fragment.\"], required: true }],\n itemDefault: { cells: [], required: false },\n itemSchema: [\n {\n name: \"cells\",\n label: \"Cells\",\n type: \"array\",\n defaultValue: [],\n itemDefault: { value: \"\" },\n itemSchema: [{ name: \"value\", label: \"Cell\", type: \"text\", defaultValue: \"\" }],\n },\n {\n name: \"required\",\n label: \"Required\",\n type: \"boolean\",\n defaultValue: false,\n },\n ],\n },\n ],\n render: (props) => {\n // The propsSchema `array.itemSchema` UI nests cell objects with a\n // `{ value }` shape; runtime / seed data ships flat string arrays.\n // Normalise both shapes back to `string[]` so the seeded fixtures\n // and the admin-authored data render identically.\n const rawColumns: unknown = props.columns;\n const columns = Array.isArray(rawColumns)\n ? rawColumns.map((entry) => {\n if (typeof entry === \"string\") return entry;\n if (isRecord(entry) && typeof entry.value === \"string\") return entry.value;\n return \"\";\n })\n : [];\n const rawRows = Array.isArray(props.rows) ? props.rows : [];\n const rows: ApiRow[] = rawRows.filter(isRecord).map((row) => {\n const cellsRaw: unknown = row.cells;\n const cells = Array.isArray(cellsRaw)\n ? cellsRaw.map((entry) => {\n if (typeof entry === \"string\") return entry;\n if (isRecord(entry) && typeof entry.value === \"string\") return entry.value;\n return \"\";\n })\n : [];\n return { cells, required: row.required === true };\n });\n if (columns.length === 0 && rows.length === 0) {\n return <table className=\"np-docs-table\" />;\n }\n return (\n <table className=\"np-docs-table\">\n <thead>\n <tr>\n {columns.map((col, i) => (\n <th key={`col-${i.toString()}`}>{col}</th>\n ))}\n </tr>\n </thead>\n <tbody>\n {rows.map((row, i) => (\n <tr key={`row-${i.toString()}`}>\n {row.cells.map((cell, j) => {\n const isFirst = j === 0;\n return (\n <td key={`cell-${i.toString()}-${j.toString()}`}>\n {isFirst ? <code>{cell}</code> : cell}\n {isFirst && row.required ? (\n <span className=\"np-docs-table-required\">required</span>\n ) : null}\n </td>\n );\n })}\n </tr>\n ))}\n </tbody>\n </table>\n );\n },\n};\n\nexport const docsBlocks: NpBlockDefinition[] = [\n docsCalloutBlock,\n docsCodePanelBlock,\n docsShellCommandBlock,\n docsStepsBlock,\n docsApiTableBlock,\n];\n\nvoid (0 as React.ReactNode | undefined);\n","import * as React from \"react\";\nimport { NavMenu, getCachedSite } from \"@nexpress/next\";\n\nimport { SearchKeyboardShortcut } from \"./components/search-keyboard-shortcut.js\";\nimport { resolveDocsSettings } from \"./settings-helpers.js\";\n\nconst FALLBACK_SITE_NAME = \"NexPress\";\n\n/**\n * Docs theme masthead. Brand strap (mark + wordmark + version\n * pill) on the left, ⌘K search form centered, primary nav on\n * the right — three intrinsic-width columns with the search\n * filling the middle track.\n *\n * Search is a plain GET form to `/docs/search` — the theme's\n * own route handles the query so the host's `(site)/search`\n * page doesn't shadow it (#609). The ⌘K affordance is purely\n * visual hint copy in a `<kbd>`; the `<SearchKeyboardShortcut>`\n * client island wires the actual focus shortcut.\n *\n * Operators who want a GitHub link in the header add it via the\n * primary nav (Settings → Menus → header), pointing at\n * `settings.githubRepo`. The doc-page footer's \"Edit this\n * page\" / \"Report issue\" links continue to read the same setting\n * independently.\n */\nexport async function DocsHeader(): Promise<React.ReactElement> {\n const [settings, site] = await Promise.all([\n resolveDocsSettings(),\n getCachedSite(),\n ]);\n const siteName = site?.name?.trim() || FALLBACK_SITE_NAME;\n return (\n <header className=\"np-docs-header\">\n <div className=\"np-docs-header-inner\">\n <a href=\"/\" className=\"np-docs-brand\">\n <span className=\"np-docs-brand-mark\" aria-hidden=\"true\" />\n <span>{siteName}</span>\n <span className=\"np-docs-brand-version\">{settings.version}</span>\n </a>\n <form\n action=\"/docs/search\"\n method=\"get\"\n className=\"np-docs-search-form\"\n role=\"search\"\n >\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n aria-hidden=\"true\"\n >\n <circle cx=\"11\" cy=\"11\" r=\"7\" />\n <path d=\"m21 21-4.3-4.3\" />\n </svg>\n <label className=\"sr-only\" htmlFor=\"np-docs-search-input\">\n Search the docs\n </label>\n <input\n id=\"np-docs-search-input\"\n type=\"search\"\n name=\"q\"\n placeholder={settings.searchPlaceholder}\n className=\"np-docs-search-input\"\n />\n <kbd className=\"np-docs-search-kbd\">⌘K</kbd>\n </form>\n <SearchKeyboardShortcut targetId=\"np-docs-search-input\" />\n <nav className=\"np-docs-nav\" aria-label=\"Primary\">\n <NavMenu location=\"header\" className=\"np-docs-primary-nav\" />\n </nav>\n </div>\n </header>\n );\n}\n","import { getCachedThemeSettings } from \"@nexpress/next\";\n\nimport { docsSettingsSchema, type DocsSettings } from \"./settings.js\";\n\n/**\n * Phase F.9-B / F.9.1-B — typed accessor over the cached theme\n * settings read.\n *\n * Uses `getCachedThemeSettings` so multiple resolveSettings()\n * calls in the same request (header + sidebar + page template +\n * search) share one DB hit via Next's `unstable_cache`. The\n * `nx:theme:<siteId>` tag handles invalidation.\n *\n * On parse failure (theme upgrade changed the shape, etc.)\n * falls back to the schema defaults. The admin's\n * `getThemeSettingsWithStatus` surfaces a banner when this\n * happens; the runtime keeps rendering with safe values.\n */\nexport async function resolveDocsSettings(): Promise<DocsSettings> {\n const raw = await getCachedThemeSettings(\"docs\");\n const parsed = docsSettingsSchema.safeParse(raw);\n if (parsed.success) return parsed.data;\n return docsSettingsSchema.parse({});\n}\n","import { z } from \"zod\";\n\n/**\n * Phase F.9-B — operator-tunable docs settings.\n *\n * Stresses F.3's settings auto-form on a different axis from\n * magazine: more URL inputs, a select/enum for sidebar\n * orientation, and a documentation-flavored field set.\n */\nexport const docsSettingsSchema = z.object({\n version: z\n .string()\n .default(\"v1\")\n .describe(\n \"Currently-displayed version label, shown in the masthead. Update on each release.\",\n ),\n githubRepo: z\n .string()\n .url()\n .optional()\n .describe(\n \"Optional repository URL — when set, page templates render an 'Edit on GitHub' link in the prev/next bar.\",\n ),\n githubBranch: z\n .string()\n .default(\"main\")\n .describe(\n \"Branch the 'Edit on GitHub' link points at. Default 'main' — change to 'master' / 'docs' / whatever the repo uses.\",\n ),\n githubDocsPath: z\n .string()\n .default(\"docs\")\n .describe(\n \"Path under the repo where doc source files live. Joined with the doc slug to build the edit link target.\",\n ),\n githubExtension: z\n .string()\n .default(\".md\")\n .describe(\n \"File extension appended to the slug when building the edit link (e.g. '.md', '.mdx'). Include the leading dot.\",\n ),\n sidebarHeading: z\n .string()\n .default(\"Documentation\")\n .describe(\"Heading shown above the hierarchical sidebar nav.\"),\n showTableOfContents: z\n .boolean()\n .default(true)\n .describe(\"Render the in-page TOC sidebar on doc pages.\"),\n searchPlaceholder: z\n .string()\n .default(\"Search the docs…\")\n .describe(\"Placeholder text for the search input in the masthead.\"),\n});\n\nexport type DocsSettings = z.infer<typeof docsSettingsSchema>;\n","import * as React from \"react\";\n\n/**\n * Docs theme's member-tree 404.\n *\n * Mirrors `DocsNotFound`'s technical voice but tuned for the\n * member context — CTA points at `/members/login` rather than\n * the docs index, and the copy acknowledges stale auth links\n * (the dominant cause of 404s inside `/members/*`).\n *\n * Server component; rendered by `(member)/not-found.tsx` when\n * the active theme is docs and `impl.members.notFound` is\n * declared.\n *\n * Renders a `<div>`, not `<main>`, because the framework's\n * `<ShellWrap surface=\"member\">` already emits the page's\n * `<main className=\"np-member-main\">` landmark.\n */\nexport function DocsMembersNotFound(): React.ReactElement {\n return (\n <div\n className=\"np-docs-members-not-found\"\n style={{\n maxWidth: 520,\n margin: \"5rem auto\",\n padding: \"0 1.5rem\",\n }}\n >\n <p\n style={{\n margin: 0,\n fontSize: \"0.75rem\",\n textTransform: \"uppercase\",\n letterSpacing: \"0.12em\",\n color: \"var(--np-color-muted-foreground)\",\n fontFamily: \"var(--np-font-mono, ui-monospace, monospace)\",\n }}\n >\n 404 · account\n </p>\n <h1\n style={{\n margin: \"0.75rem 0 0\",\n fontSize: \"1.875rem\",\n fontFamily: \"var(--np-font-heading)\",\n fontWeight: 600,\n lineHeight: 1.2,\n }}\n >\n That account link is no longer valid.\n </h1>\n <p\n style={{\n margin: \"1.25rem 0 0\",\n color: \"var(--np-color-muted-foreground)\",\n fontSize: \"0.9375rem\",\n lineHeight: 1.6,\n }}\n >\n Verification and password-reset links are single-use and expire after a\n short window. Open the sign-in page and request a fresh one.\n </p>\n <p style={{ margin: \"1.75rem 0 0\" }}>\n <a\n href=\"/members/login\"\n style={{\n display: \"inline-block\",\n padding: \"0.5rem 1.25rem\",\n borderRadius: \"0.375rem\",\n background: \"var(--np-color-primary)\",\n color: \"var(--np-color-primary-foreground)\",\n textDecoration: \"none\",\n fontSize: \"0.875rem\",\n fontWeight: 500,\n }}\n >\n Go to sign in\n </a>\n </p>\n </div>\n );\n}\n","import type { ReactNode } from \"react\";\n\nimport { DocsHeader } from \"./header.js\";\n\n/**\n * Docs theme's member-tree shell.\n *\n * Drops the docs sidebar (which is hierarchical-doc navigation —\n * useless on auth forms) and renders a narrow column under the\n * masthead. Reuses `DocsHeader` directly so a masthead bump\n * cascades to member pages — single source of truth for chrome.\n *\n * Skips the public `DocsShell`'s 3-column grid because the\n * `<ShellWrap surface=\"member\">` fallback chain only invokes\n * `impl.members.shell` (this component); the public shell never\n * wraps the member tree.\n */\nexport function DocsMembersShell({ children }: { children: ReactNode }) {\n return (\n <div className=\"np-docs np-docs-shell\">\n <DocsHeader />\n <div className=\"np-docs-members\">\n <div className=\"np-docs-members-column\">{children}</div>\n </div>\n </div>\n );\n}\n","import * as React from \"react\";\n\n/**\n * Phase F.9-B — docs 404.\n *\n * Tighter / less editorial than magazine's; suggests search +\n * homepage as next steps.\n */\nexport function DocsNotFound(): React.ReactElement {\n // `<div>` — (site)/layout.tsx already emits the page's `<main>`.\n return (\n <div\n className=\"np-docs-not-found\"\n style={{\n maxWidth: 560,\n margin: \"5rem auto\",\n padding: \"0 1.5rem\",\n }}\n >\n <p\n style={{\n margin: 0,\n fontSize: \"0.75rem\",\n textTransform: \"uppercase\",\n letterSpacing: \"0.08em\",\n color: \"var(--np-color-muted-foreground)\",\n }}\n >\n 404 — Not found\n </p>\n <h1 style={{ margin: \"0.75rem 0 0.5rem\", fontSize: \"1.75rem\" }}>\n That page isn't in the docs.\n </h1>\n <p\n style={{\n margin: \"0.75rem 0 1.5rem\",\n color: \"var(--np-color-muted-foreground)\",\n }}\n >\n It may have been renamed or merged into another section. Try the\n search bar in the header, or head to the homepage.\n </p>\n <a\n href=\"/\"\n style={{\n display: \"inline-block\",\n padding: \"0.4rem 1rem\",\n borderRadius: \"0.375rem\",\n background: \"var(--np-color-primary)\",\n color: \"var(--np-color-primary-foreground)\",\n textDecoration: \"none\",\n fontWeight: 500,\n }}\n >\n Homepage\n </a>\n </div>\n );\n}\n","import { findDocuments } from \"@nexpress/core\";\nimport type { NpRouteRenderProps, NpTemplateRenderProps } from \"@nexpress/theme\";\nimport { notFound } from \"next/navigation\";\nimport * as React from \"react\";\n\nimport { DocPageTemplate } from \"../templates/doc-page.js\";\n\n/**\n * Theme route for `/docs/:slug` — looks up a doc-kind post and\n * renders it through `DocPageTemplate`.\n *\n * Universal-content-model #748: docs are posts with `kind=\"doc\"`.\n * The framework's catch-all also matches `/docs/:slug` via the\n * theme's `kinds.doc.urlPattern` metadata; this explicit theme\n * route stays for two reasons:\n *\n * 1. It's the supported path for theme-internal navigation\n * that bypasses the kinds-metadata dispatcher (prev/next,\n * sidebar links).\n * 2. It runs ahead of the kinds dispatcher in the precedence\n * order so a future themes feature that needs to wrap\n * doc-page rendering (e.g. signing-aware drafts) can hook\n * in here without touching the framework.\n *\n * Membership / access: same path the catch-all uses for `pages`\n * — `findDocuments` already enforces `access.read` and\n * `community.visibility` so we don't need to gate here.\n */\n\ninterface DocsRow {\n id: string;\n slug: string;\n title: string;\n body?: unknown;\n parent?: string | null;\n order?: number;\n status?: string;\n excerpt?: string;\n kind?: string;\n}\n\nexport async function DocsDetailRoute({\n params,\n blockCtx,\n}: NpRouteRenderProps): Promise<React.ReactElement> {\n const slug = typeof params.slug === \"string\" ? params.slug : \"\";\n if (!slug) notFound();\n\n const result = await findDocuments<DocsRow>(\"posts\", {\n where: { slug, status: \"published\", kind: \"doc\" },\n limit: 1,\n });\n const doc = result.docs[0];\n if (!doc) notFound();\n\n // `DocPageTemplate`'s prop generic defaults to\n // `Record<string, unknown>` — cast through `unknown` so our\n // narrower `DocsRow` shape (which doesn't carry an index\n // signature) matches the template's contract.\n const templateProps: NpTemplateRenderProps = {\n doc: doc as unknown as Record<string, unknown>,\n blockCtx,\n };\n return <DocPageTemplate {...templateProps} />;\n}\n","import * as React from \"react\";\nimport type { NpTemplateRenderProps } from \"@nexpress/theme\";\nimport { findDocuments, type NpRichTextContent } from \"@nexpress/core\";\nimport { extractHeadingToc, renderRichText } from \"@nexpress/editor/server\";\n\n// Routed via a sibling-depth bridge module (`../toc-scrollspy-\n// bridge.js`) rather than `../components/toc-scrollspy.js`\n// directly: tsup's `external` rule matches the import specifier\n// verbatim, and a parent-relative spec at this depth would\n// preserve `\"../components/...\"` in the bundled `dist/index.js`\n// (escapes dist at consume time). The bridge re-exports from a\n// sibling-depth path that DOES match the external rule, so the\n// final bundle carries `import \"./components/toc-scrollspy.js\"`\n// which resolves cleanly to `dist/components/toc-scrollspy.js`.\n// A package-subpath self-import was tried first but fails\n// during tsup's parallel dts step (the index dts can't see the\n// component's freshly-written .d.ts in time, TS7016).\nimport { TocScrollspy } from \"../toc-scrollspy-bridge.js\";\nimport { resolveDocsSettings } from \"../settings-helpers.js\";\n\ninterface DocDoc {\n id: string;\n slug: string;\n title: string;\n lede?: string;\n body?: NpRichTextContent;\n parent?: string | null;\n order?: number;\n updatedAt?: string | Date;\n publishedAt?: string | Date;\n stableSince?: string;\n readingTime?: number | string;\n}\n\n\n/**\n * Doc page template — three-zone article: header strap\n * (breadcrumbs + h1 + lede + meta pills), Lexical-rendered body,\n * footer (feedback widget + prev/next pair).\n *\n * Breadcrumbs walk the parent chain so a nested doc shows\n * `Docs / Plugins / Author quickstart` without the operator\n * configuring it explicitly. Falls back to a single \"Docs\" entry\n * for root-level pages.\n *\n * Meta pills render only when their data is present:\n *\n * - `stableSince` (e.g. `\"0.1\"`) → green pill `\"Stable since 0.1\"`.\n * - `readingTime` (number or string) → `\"X min read\"` pill.\n * - `updatedAt` → date string after a · separator.\n * - `settings.githubRepo` set → `\"Edit this page →\"` link to GH.\n *\n * Feedback row is static HTML (Yes / Could be better buttons)\n * without a wired endpoint — operators that want a real\n * feedback API drop in their own client island.\n *\n * Prev/next walks the same ordered list the sidebar uses; the\n * doc immediately before / after `current` in render-order wins.\n */\nexport async function DocPageTemplate({\n doc: rawDoc,\n}: NpTemplateRenderProps): Promise<React.ReactElement> {\n const doc = rawDoc as unknown as DocDoc;\n const settings = await resolveDocsSettings();\n const breadcrumbs = await loadBreadcrumbs(doc);\n const navInfo = await loadPrevNext(doc);\n const updatedLabel = formatUpdated(doc.updatedAt ?? doc.publishedAt);\n const readingLabel = readingMinutesLabel(doc.readingTime);\n const editHref = settings.githubRepo\n ? `${settings.githubRepo}/edit/${settings.githubBranch}/${settings.githubDocsPath}/${doc.slug}${settings.githubExtension}`\n : null;\n const toc = extractHeadingToc(doc.body);\n const reportIssueHref = settings.githubRepo\n ? `${settings.githubRepo}/issues/new`\n : null;\n\n return (\n <>\n <article className=\"np-docs-page\">\n <nav className=\"np-docs-breadcrumbs\" aria-label=\"Breadcrumb\">\n {breadcrumbs.map((crumb, index) => {\n const isLast = index === breadcrumbs.length - 1;\n return (\n <React.Fragment key={`crumb-${index.toString()}-${crumb.slug ?? \"root\"}`}>\n {index > 0 ? (\n <span className=\"np-docs-breadcrumbs-sep\" aria-hidden=\"true\">\n /\n </span>\n ) : null}\n {isLast || !crumb.slug ? (\n <span>{crumb.title}</span>\n ) : (\n <a href={`/docs/${crumb.slug}`}>{crumb.title}</a>\n )}\n </React.Fragment>\n );\n })}\n </nav>\n\n <h1>{doc.title}</h1>\n {doc.lede ? <p className=\"np-docs-page-lede\">{doc.lede}</p> : null}\n\n {(doc.stableSince || readingLabel || updatedLabel || editHref) ? (\n <div className=\"np-docs-page-meta\">\n {doc.stableSince ? (\n <span className=\"np-docs-page-meta-pill status\">\n Stable since {doc.stableSince}\n </span>\n ) : null}\n {readingLabel ? (\n <span className=\"np-docs-page-meta-pill\">{readingLabel}</span>\n ) : null}\n {updatedLabel ? (\n <>\n <span className=\"np-docs-page-meta-sep\" aria-hidden=\"true\">\n ·\n </span>\n <span>Updated {updatedLabel}</span>\n </>\n ) : null}\n {editHref ? (\n <a href={editHref} target=\"_blank\" rel=\"noreferrer\">\n Edit this page →\n </a>\n ) : null}\n </div>\n ) : null}\n\n <div className=\"np-docs-page-body\">\n {doc.body ? (\n // Core types `NpRichTextContent` as the opaque\n // `Record<string, unknown>`; the editor's renderer\n // refines it to `{ root: ... }`. Structural cast at\n // the boundary — both sides go through the same\n // Lexical serializer.\n renderRichText(\n doc.body as unknown as Parameters<typeof renderRichText>[0],\n { headingAnchors: true },\n )\n ) : (\n <p style={{ color: \"var(--np-color-muted-foreground)\" }}>\n No body content yet.\n </p>\n )}\n </div>\n\n <div className=\"np-docs-feedback\">\n <div>\n <div className=\"np-docs-feedback-title\">Was this page helpful?</div>\n <div className=\"np-docs-feedback-helper\">\n Operators wire the feedback endpoint via a plugin or a custom\n client island — the form is intentionally inert in v0.1.\n </div>\n </div>\n <div className=\"np-docs-feedback-buttons\">\n <button type=\"button\">Yes</button>\n <button type=\"button\">Could be better</button>\n </div>\n </div>\n\n {navInfo.prev || navInfo.next ? (\n <nav\n className=\"np-docs-prev-next\"\n aria-label=\"Pagination\"\n data-single={\n navInfo.prev && !navInfo.next\n ? \"prev\"\n : navInfo.next && !navInfo.prev\n ? \"next\"\n : undefined\n }\n >\n {navInfo.prev ? (\n <a\n href={`/docs/${navInfo.prev.slug}`}\n className=\"np-docs-prev-next-prev\"\n >\n <div className=\"np-docs-prev-next-dir\">← Previous</div>\n <div className=\"np-docs-prev-next-title\">{navInfo.prev.title}</div>\n </a>\n ) : null}\n {navInfo.next ? (\n <a\n href={`/docs/${navInfo.next.slug}`}\n className=\"np-docs-prev-next-next\"\n >\n <div className=\"np-docs-prev-next-dir\">Next →</div>\n <div className=\"np-docs-prev-next-title\">{navInfo.next.title}</div>\n </a>\n ) : null}\n </nav>\n ) : null}\n </article>\n\n {toc.length > 0 ? (\n <aside className=\"np-docs-toc\" aria-label=\"On this page\">\n <p className=\"np-docs-toc-eyebrow\">On this page</p>\n <ul>\n {toc.map((entry) => (\n <li\n key={`toc-${entry.id}`}\n className={entry.level === 3 ? \"np-docs-toc-l3\" : undefined}\n >\n <a href={`#${entry.id}`}>{entry.text}</a>\n </li>\n ))}\n </ul>\n <TocScrollspy ids={toc.map((entry) => entry.id)} />\n\n {(editHref || reportIssueHref) ? (\n <div className=\"np-docs-toc-secondary\">\n {editHref ? (\n <a href={editHref} target=\"_blank\" rel=\"noreferrer\">\n <svg\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n aria-hidden=\"true\"\n >\n <path d=\"M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7\" />\n <path d=\"m18.5 2.5 3 3L12 15l-4 1 1-4 9.5-9.5z\" />\n </svg>\n Edit on GitHub\n </a>\n ) : null}\n {reportIssueHref ? (\n <a href={reportIssueHref} target=\"_blank\" rel=\"noreferrer\">\n <svg\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n aria-hidden=\"true\"\n >\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <path d=\"M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3\" />\n <line x1=\"12\" y1=\"17\" x2=\"12.01\" y2=\"17\" />\n </svg>\n Report an issue\n </a>\n ) : null}\n </div>\n ) : null}\n </aside>\n ) : null}\n </>\n );\n}\n\ninterface Crumb {\n slug: string | null;\n title: string;\n}\n\nasync function loadBreadcrumbs(current: DocDoc): Promise<Crumb[]> {\n const root: Crumb = { slug: null, title: \"Docs\" };\n if (!current.parent) {\n return [root, { slug: null, title: current.title }];\n }\n // Walk parents in a single bounded query — sidebar already\n // pulls the same list so the row count is small.\n const result = await findDocuments<Record<string, unknown>>(\"posts\", {\n where: { status: \"published\", kind: \"doc\" },\n sort: \"order\",\n limit: 500,\n });\n const byId = new Map<string, DocDoc>();\n for (const r of result.docs as unknown as DocDoc[]) {\n if (r.id) byId.set(r.id, r);\n }\n const chain: Crumb[] = [];\n let cursor: string | null = current.parent;\n let safety = 6;\n while (cursor && safety-- > 0) {\n const node = byId.get(cursor);\n if (!node) break;\n chain.unshift({ slug: node.slug, title: node.title });\n cursor = node.parent ?? null;\n }\n return [root, ...chain, { slug: null, title: current.title }];\n}\n\nasync function loadPrevNext(\n current: DocDoc,\n): Promise<{ prev: DocDoc | null; next: DocDoc | null }> {\n const result = await findDocuments<Record<string, unknown>>(\"posts\", {\n where: { status: \"published\", kind: \"doc\" },\n sort: \"order\",\n limit: 500,\n });\n const docs = result.docs as unknown as DocDoc[];\n const idx = docs.findIndex((d) => d.id === current.id);\n if (idx < 0) return { prev: null, next: null };\n return {\n prev: idx > 0 ? docs[idx - 1] ?? null : null,\n next: idx < docs.length - 1 ? docs[idx + 1] ?? null : null,\n };\n}\n\nfunction formatUpdated(value: DocDoc[\"updatedAt\"]): string | null {\n if (!value) return null;\n try {\n const d = typeof value === \"string\" ? new Date(value) : value;\n if (Number.isNaN(d.getTime())) return null;\n return d.toLocaleDateString(undefined, {\n year: \"numeric\",\n month: \"short\",\n day: \"numeric\",\n });\n } catch {\n return null;\n }\n}\n\nfunction readingMinutesLabel(value: DocDoc[\"readingTime\"]): string | null {\n if (!value && value !== 0) return null;\n if (typeof value === \"number\") return `${value.toString()} min read`;\n return value;\n}\n","// Sibling-depth re-export of the client TocScrollspy component.\n//\n// Why this file exists: `doc-page.tsx` lives at `src/templates/`\n// and needs the client island that lives at\n// `src/components/toc-scrollspy.tsx`. Importing it directly\n// would require `../components/toc-scrollspy.js`, and tsup's\n// `external` rule matches the specifier verbatim — a parent-\n// relative spec gets baked into `dist/index.js` and escapes the\n// dist root at consume time (Turbopack reports `Module not\n// found`).\n//\n// Routing through this bridge moves the externalized import to\n// sibling-depth (`./components/toc-scrollspy.js`) which is what\n// the `dist/` layout expects.\nexport { TocScrollspy } from \"./components/toc-scrollspy.js\";\n","import * as React from \"react\";\nimport type { NpRouteRenderProps } from \"@nexpress/theme\";\nimport { getCollectionConfig, searchCollections } from \"@nexpress/core\";\n\n/**\n * Resolves a search-result URL via the collection's\n * `seo.urlPath` config when available, falling back to\n * `/<collection>/<slug>` convention. Without this, posts (which\n * typically live under `/blog/`) would 404 from search hits.\n * Wrapped in try/catch because `getCollectionConfig` throws for\n * unknown collections — a search adapter that returns rows from\n * a no-longer-registered collection shouldn't crash the page.\n */\nfunction resolveResultUrl(\n collection: string,\n doc: Record<string, unknown>,\n): string {\n try {\n const config = getCollectionConfig(collection);\n const urlPath = config.seo?.urlPath;\n if (typeof urlPath === \"function\") {\n const result = urlPath(doc);\n if (typeof result === \"string\" && result.length > 0) return result;\n }\n } catch {\n // Unknown collection or missing seo config — fall through.\n }\n const slug = typeof doc.slug === \"string\" ? doc.slug : \"\";\n return slug ? `/${collection}/${slug}` : \"#\";\n}\n\n/**\n * Phase F.9-B — `/search` route component.\n *\n * Reads `?q=` from searchParams, runs `searchCollections` (the\n * full-text search API), and renders the hits. Empty query →\n * empty results pane with hint copy. Stresses F.2's route\n * dispatch with a non-collection-walk shape (search is\n * cross-collection by design).\n */\n\nexport async function DocsSearch({\n searchParams,\n}: NpRouteRenderProps): Promise<React.ReactElement> {\n const raw = searchParams.q;\n const query = typeof raw === \"string\" ? raw.trim() : \"\";\n\n if (query.length === 0) {\n return (\n <div className=\"np-docs-search\">\n <p className=\"np-docs-search-heading\">Search</p>\n <h1>Search the docs</h1>\n <p className=\"np-docs-search-empty\">\n Enter a query in the masthead search box to find pages.\n </p>\n </div>\n );\n }\n\n const result = await searchCollections({ q: query, limit: 20 });\n return (\n <div className=\"np-docs-search\">\n <p className=\"np-docs-search-heading\">Search results for</p>\n <h1>“{query}”</h1>\n {result.results.length === 0 ? (\n <p className=\"np-docs-search-empty\">No matches.</p>\n ) : (\n <ul className=\"np-docs-search-results\">\n {result.results.map((item, i) => {\n const doc = item.doc;\n const slug = typeof doc.slug === \"string\" ? doc.slug : null;\n const title =\n typeof doc.title === \"string\" ? doc.title : (slug ?? \"Untitled\");\n const url = resolveResultUrl(item.collection, doc);\n return (\n <li\n key={`${item.collection}:${(doc.id as string | undefined) ?? i}`}\n className=\"np-docs-search-result\"\n >\n <p className=\"np-docs-search-result-eyebrow\">{item.collection}</p>\n <h2>\n <a href={url}>{title}</a>\n </h2>\n {typeof doc.excerpt === \"string\" ? (\n <p className=\"np-docs-search-result-excerpt\">{doc.excerpt}</p>\n ) : null}\n </li>\n );\n })}\n </ul>\n )}\n </div>\n );\n}\n","import * as React from \"react\";\nimport type { NpThemeShellProps } from \"@nexpress/theme\";\n\n/**\n * `NpThemeColors` (from `@nexpress/core`) is a strict interface\n * — success / warning / danger / code-surface colors aren't\n * legal `tokens.colors` keys. The docs CSS still depends on\n * them, so the shell injects them as `--np-color-*` vars inline\n * once per render. Anything the operator overrides via the\n * settings cascade still wins (cascade order — later rule\n * applied to the same custom property — keeps admin overrides\n * effective even with this baseline injected).\n */\nconst TOKEN_CSS = `:root{--np-color-success:#047857;--np-color-warning:#b45309;--np-color-danger:#b91c1c;--np-color-success-soft:#ecfdf5;--np-color-warning-soft:#fffbeb;--np-color-danger-soft:#fef2f2;--np-color-code-bg:#0b1220;--np-color-code-fg:#e6edf6;--np-color-code-head:#1e2939;--np-color-code-border:#0f1a2b;}`;\n\nexport async function DocsShell({\n children,\n}: NpThemeShellProps): Promise<React.ReactElement> {\n let layout: \"docs\" | \"page\" = \"docs\";\n try {\n const { headers } = await import(\"next/headers\");\n const pathname = (await headers()).get(\"x-np-pathname\") ?? \"\";\n if (!pathname.startsWith(\"/docs\")) layout = \"page\";\n } catch {\n // Outside a request scope — keep the docs grid as the default.\n }\n return (\n <div className=\"np-docs-shell\" data-layout={layout}>\n <style dangerouslySetInnerHTML={{ __html: TOKEN_CSS }} />\n <div className=\"np-docs-grid\">{children}</div>\n </div>\n );\n}\n","import * as React from \"react\";\nimport { findDocuments } from \"@nexpress/core\";\n\nimport { buildDocTree } from \"./lib/doc-tree.js\";\nimport { resolveDocsSettings } from \"./settings-helpers.js\";\n\ninterface DocNode {\n id: string;\n slug: string;\n title: string;\n parent: string | null;\n order: number;\n /**\n * Optional small label rendered next to the link\n * (`new` / `beta` / `api`). Renders as a pill via the\n * `.np-docs-sidebar-badge.{value}` selector in styles.ts.\n * Treated as advisory; sites without the field render no\n * badge.\n */\n badge: string | null;\n children: DocNode[];\n}\n\n/**\n * Hierarchical sidebar for the docs theme.\n *\n * Top-level docs (those without a `parent`) become **group\n * eyebrows** rendered with a bullet dot indicator; each\n * group's children are the linkable items under the eyebrow.\n * Deeper levels render as nested lists with a hairline left\n * rule.\n *\n * A top-level doc with no children is itself rendered as a\n * clickable eyebrow rather than an eyebrow + duplicate link\n * below (the eyebrow text and the only link would otherwise be\n * the same string).\n *\n * The current doc is highlighted via `data-current=\"true\"`\n * resolved from the request's pathname. Wired through\n * `next/headers` (`x-np-pathname`) so the highlight survives\n * server rendering with no client-side hydration.\n */\nexport async function DocsSidebar(): Promise<React.ReactElement> {\n const settings = await resolveDocsSettings();\n const currentSlug = await currentPathSlug();\n\n // Pull every doc and assemble the hierarchy. Capped at 500 to\n // keep the query bounded — typical doc sites stay well under.\n // Universal-content-model #748: docs are posts with kind=\"doc\".\n const result = await findDocuments<Record<string, unknown>>(\"posts\", {\n where: { status: \"published\", kind: \"doc\" },\n sort: \"order\",\n limit: 500,\n });\n\n const tree = buildTree(result.docs);\n\n if (tree.length === 0) {\n return (\n <aside className=\"np-docs-sidebar\" aria-label=\"Docs navigation\">\n <div className=\"np-docs-sidebar-group\">\n <h2 className=\"np-docs-sidebar-eyebrow\">\n <span className=\"np-docs-sidebar-eyebrow-dot\" aria-hidden=\"true\" />\n {settings.sidebarHeading}\n </h2>\n <p\n style={{\n padding: \"0.34rem 0.6rem\",\n fontSize: \"0.875rem\",\n color: \"var(--np-color-muted-foreground)\",\n margin: 0,\n }}\n >\n No docs yet.\n </p>\n </div>\n </aside>\n );\n }\n\n return (\n <aside className=\"np-docs-sidebar\" aria-label=\"Docs navigation\">\n {tree.map((group) => {\n const isLeaf = group.children.length === 0;\n const isLeafCurrent = isLeaf && currentSlug === group.slug;\n return (\n <div className=\"np-docs-sidebar-group\" key={group.id}>\n <h2 className=\"np-docs-sidebar-eyebrow\">\n <span className=\"np-docs-sidebar-eyebrow-dot\" aria-hidden=\"true\" />\n {isLeaf ? (\n <a\n className=\"np-docs-sidebar-eyebrow-link\"\n href={`/docs/${group.slug}`}\n data-current={isLeafCurrent ? \"true\" : undefined}\n aria-current={isLeafCurrent ? \"page\" : undefined}\n >\n {group.title}\n </a>\n ) : (\n group.title\n )}\n </h2>\n {isLeaf ? null : (\n <NavTree nodes={group.children} currentSlug={currentSlug} />\n )}\n </div>\n );\n })}\n </aside>\n );\n}\n\ninterface DocRow {\n id: unknown;\n slug: unknown;\n title: unknown;\n parent: unknown;\n order: unknown;\n badge: unknown;\n}\n\nasync function currentPathSlug(): Promise<string | null> {\n try {\n const { headers } = await import(\"next/headers\");\n const list = await headers();\n const pathname = list.get(\"x-np-pathname\");\n if (!pathname) return null;\n const m = /^\\/docs\\/(.+?)\\/?$/.exec(pathname);\n return m ? (m[1] ?? null) : null;\n } catch {\n return null;\n }\n}\n\nfunction buildTree(rawDocs: Record<string, unknown>[]): DocNode[] {\n const docs = rawDocs as unknown as DocRow[];\n return buildDocTree<DocNode, DocRow>(docs, (d) => {\n if (typeof d.id !== \"string\") return null;\n if (typeof d.slug !== \"string\") return null;\n return {\n id: d.id,\n slug: d.slug,\n title: typeof d.title === \"string\" ? d.title : d.slug,\n parent: typeof d.parent === \"string\" ? d.parent : null,\n order: typeof d.order === \"number\" ? d.order : 0,\n badge: typeof d.badge === \"string\" ? d.badge : null,\n children: [],\n };\n });\n}\n\nfunction NavTree({\n nodes,\n currentSlug,\n}: {\n nodes: DocNode[];\n currentSlug: string | null;\n}): React.ReactElement {\n return (\n <ul>\n {nodes.map((n) => (\n <li key={n.id}>\n <SidebarLink node={n} currentSlug={currentSlug} />\n {n.children.length > 0 ? (\n <NavTree nodes={n.children} currentSlug={currentSlug} />\n ) : null}\n </li>\n ))}\n </ul>\n );\n}\n\nfunction SidebarLink({\n node,\n currentSlug,\n}: {\n node: DocNode;\n currentSlug: string | null;\n}): React.ReactElement {\n const isCurrent = currentSlug !== null && currentSlug === node.slug;\n const badgeClass = node.badge\n ? `np-docs-sidebar-badge ${node.badge.toLowerCase()}`\n : null;\n return (\n <a\n href={`/docs/${node.slug}`}\n data-current={isCurrent ? \"true\" : undefined}\n aria-current={isCurrent ? \"page\" : undefined}\n >\n {node.title}\n {badgeClass ? (\n <span className={badgeClass}>{node.badge!.toUpperCase()}</span>\n ) : null}\n </a>\n );\n}\n","/**\n * Shared doc-tree assembly for the docs theme.\n *\n * Both the sidebar (a navigation tree) and the front-page landing\n * (a featured-children grid) need to walk a flat list of doc rows\n * and turn it into a parent → children tree, sorted by `order` at\n * every level. The two surfaces project different fields onto the\n * node (the sidebar doesn't need `lede`/`updatedAt`; the front\n * page does), so the build function is generic over the node\n * shape — callers pass a row-to-node mapper.\n *\n * Lives in `lib/` rather than alongside either surface so neither\n * is the \"owner\" — the function belongs to the docs theme as a\n * whole.\n */\n\n/**\n * The minimal shape every node needs to participate in the tree\n * walk. Concrete callers extend this with whatever extra fields\n * the surface renders.\n */\nexport interface NpDocTreeNode<Self extends NpDocTreeNode<Self>> {\n id: string;\n parent: string | null;\n order: number;\n children: Self[];\n}\n\n/**\n * Builds a sorted tree of nodes from a flat list of rows.\n *\n * `toNode` returns the typed node for a row, or `null` to skip\n * the row (e.g. when required fields like `id` / `slug` are\n * malformed). The function preserves the order rows are mapped\n * in for the `byId` map's iteration but re-sorts every level by\n * `order` afterward.\n */\nexport function buildDocTree<N extends NpDocTreeNode<N>, R>(\n rows: R[],\n toNode: (row: R) => N | null,\n): N[] {\n const byId = new Map<string, N>();\n for (const row of rows) {\n const node = toNode(row);\n if (node) byId.set(node.id, node);\n }\n const roots: N[] = [];\n for (const node of byId.values()) {\n if (node.parent && byId.has(node.parent)) {\n byId.get(node.parent)!.children.push(node);\n } else {\n roots.push(node);\n }\n }\n const sortLevel = (list: N[]) => {\n list.sort((a, b) => a.order - b.order);\n for (const n of list) sortLevel(n.children);\n };\n sortLevel(roots);\n return roots;\n}\n","/**\n * `@nexpress/theme-docs` — CSS layout.\n *\n * Three-column reference-docs layout: sticky search-first header,\n * hierarchical sidebar (groups with bullet eyebrows + nested\n * links + status badges), centered article column, on-this-page\n * TOC on the right. Sidebar + TOC collapse out below the\n * tablet / phone breakpoints respectively.\n *\n * Scoped under `.np-docs-*` so a theme swap to another v0.2\n * theme doesn't leave residue. All colors resolve through the\n * `--np-color-*` tokens so admin overrides on top still apply.\n *\n * The terminal-style shell command snippet uses `.np-docs-cmdline`\n * (not `.np-docs-shell`) because `.np-docs-shell` is already\n * claimed by the route shell's root container.\n */\nexport const docsCss = `\n.np-docs-shell {\n display: flex;\n flex-direction: column;\n min-height: 100vh;\n background: var(--np-color-background);\n color: var(--np-color-foreground);\n font-family: var(--np-font-body, \"Geist\", -apple-system, BlinkMacSystemFont, \"Segoe UI\", sans-serif);\n line-height: 1.6;\n -webkit-font-smoothing: antialiased;\n}\n.np-docs-shell a { color: inherit; }\n.np-docs-shell code,\n.np-docs-shell pre,\n.np-docs-shell kbd {\n font-family: var(--np-font-mono, \"Geist Mono\", ui-monospace, SFMono-Regular, Menlo, monospace);\n}\n\n.np-docs-api,\n.np-docs-changelog-page {\n max-width: 980px;\n margin: 0 auto;\n padding: 3rem 1rem 5rem;\n}\n.np-docs-api-hero,\n.np-docs-changelog-hero {\n padding: 3rem 0 2rem;\n}\n.np-docs-api-eyebrow,\n.np-docs-changelog-hero p {\n margin: 0 0 0.8rem;\n font-family: var(--np-font-mono);\n color: var(--np-color-primary);\n font-size: 0.78rem;\n letter-spacing: 0.08em;\n text-transform: uppercase;\n}\n.np-docs-api-hero h1,\n.np-docs-changelog-hero h1 {\n margin: 0;\n font-size: clamp(2.4rem, 5vw, 4.4rem);\n line-height: 1;\n letter-spacing: -0.04em;\n}\n.np-docs-api-hero p,\n.np-docs-changelog-hero span {\n display: block;\n max-width: 44rem;\n margin-top: 1rem;\n color: var(--np-color-muted-foreground);\n font-size: 1.05rem;\n}\n.np-docs-api-signature {\n overflow: hidden;\n border: 1px solid var(--np-color-border);\n border-radius: 14px;\n background: #0b1220;\n color: #e6edf6;\n}\n.np-docs-api-signature-head {\n display: flex;\n justify-content: space-between;\n gap: 1rem;\n padding: 0.8rem 1rem;\n color: #93c5fd;\n border-bottom: 1px solid rgba(255,255,255,0.12);\n font-family: var(--np-font-mono);\n font-size: 0.78rem;\n}\n.np-docs-api-signature pre {\n margin: 0;\n padding: 1.2rem;\n overflow-x: auto;\n font-size: 0.85rem;\n line-height: 1.65;\n}\n.np-docs-api-section { padding-top: 2.5rem; }\n.np-docs-api-section h2 {\n margin: 0 0 1rem;\n font-size: 1.35rem;\n}\n.np-docs-api-table {\n border: 1px solid var(--np-color-border);\n border-radius: 14px;\n overflow: hidden;\n background: var(--np-color-card);\n}\n.np-docs-api-row {\n display: grid;\n grid-template-columns: 10rem 7rem minmax(0, 1fr);\n gap: 1rem;\n padding: 1rem;\n border-bottom: 1px solid var(--np-color-border);\n}\n.np-docs-api-row:last-child { border-bottom: 0; }\n.np-docs-api-row span {\n color: var(--np-color-primary);\n font-family: var(--np-font-mono);\n font-size: 0.76rem;\n}\n.np-docs-api-row p { margin: 0; color: var(--np-color-muted-foreground); }\n.np-docs-changelog-timeline {\n list-style: none;\n margin: 2rem 0 0;\n padding: 0;\n border-top: 1px solid var(--np-color-border);\n}\n.np-docs-changelog-release {\n display: grid;\n grid-template-columns: 13rem minmax(0, 1fr);\n gap: 2rem;\n padding: 1.6rem 0;\n border-bottom: 1px solid var(--np-color-border);\n}\n.np-docs-changelog-release aside {\n display: grid;\n gap: 0.3rem;\n align-content: start;\n}\n.np-docs-changelog-release aside strong {\n font-size: 1.25rem;\n letter-spacing: -0.02em;\n}\n.np-docs-changelog-release aside span,\n.np-docs-changelog-release aside i {\n color: var(--np-color-muted-foreground);\n font-style: normal;\n font-size: 0.82rem;\n}\n.np-docs-changelog-release p {\n display: grid;\n grid-template-columns: 6.5rem minmax(0, 1fr);\n gap: 1rem;\n margin: 0 0 0.85rem;\n}\n.np-docs-changelog-release p span {\n justify-self: start;\n padding: 0.12rem 0.45rem;\n border-radius: 999px;\n border: 1px solid var(--np-color-border);\n font-family: var(--np-font-mono);\n font-size: 0.7rem;\n color: var(--np-color-primary);\n}\n@media (max-width: 760px) {\n .np-docs-api-row,\n .np-docs-changelog-release,\n .np-docs-changelog-release p {\n grid-template-columns: 1fr;\n }\n}\n\n/* ============================================================\n * Header — sticky bar with brand + version pill, ⌘K search in\n * the center, primary nav + GitHub link on the right. Grid\n * keeps everything anchored regardless of viewport width.\n * ============================================================ */\n.np-docs-header {\n position: sticky;\n top: 0;\n z-index: 30;\n background: color-mix(in oklab, var(--np-color-background) 80%, transparent);\n backdrop-filter: saturate(140%) blur(14px);\n -webkit-backdrop-filter: saturate(140%) blur(14px);\n border-bottom: 1px solid var(--np-color-border);\n}\n.np-docs-header-inner {\n max-width: 1380px;\n margin: 0 auto;\n padding: 0.7rem 1.5rem;\n display: grid;\n grid-template-columns: auto 1fr auto;\n gap: 1.5rem;\n align-items: center;\n}\n.np-docs-brand {\n display: inline-flex;\n align-items: center;\n gap: 0.55rem;\n font-weight: 700;\n font-size: 1.0625rem;\n letter-spacing: -0.02em;\n text-decoration: none;\n}\n.np-docs-brand-mark {\n width: 1.55rem;\n height: 1.55rem;\n border-radius: 6px;\n background: linear-gradient(135deg, var(--np-color-primary, #2563eb), #0ea5e9);\n position: relative;\n flex: none;\n}\n.np-docs-brand-mark::after {\n content: \"\";\n position: absolute;\n inset: 5px;\n border-radius: 2px;\n background: var(--np-color-background, #fff);\n opacity: 0.95;\n clip-path: polygon(0 0, 100% 0, 100% 100%, 60% 100%, 0 35%);\n}\n.np-docs-brand-version {\n font-family: var(--np-font-mono);\n font-size: 0.72rem;\n font-weight: 500;\n color: var(--np-color-primary);\n background: color-mix(in oklab, var(--np-color-primary) 14%, var(--np-color-card));\n padding: 0.15rem 0.45rem;\n border-radius: 5px;\n}\n\n.np-docs-search-form {\n max-width: 520px;\n width: 100%;\n position: relative;\n justify-self: center;\n}\n.np-docs-search-form svg {\n position: absolute;\n top: 50%;\n left: 0.85rem;\n transform: translateY(-50%);\n color: var(--np-color-muted-foreground);\n}\n.np-docs-search-input {\n width: 100%;\n padding: 0.55rem 0.85rem 0.55rem 2.4rem;\n font: inherit;\n font-size: 0.875rem;\n color: var(--np-color-foreground);\n background: var(--np-color-card);\n border: 1px solid var(--np-color-border);\n border-radius: 9px;\n}\n.np-docs-search-input::placeholder {\n color: var(--np-color-muted-foreground);\n}\n.np-docs-search-input:focus {\n outline: none;\n border-color: var(--np-color-primary);\n box-shadow: 0 0 0 3px color-mix(in oklab, var(--np-color-primary) 22%, transparent);\n}\n.np-docs-search-kbd {\n position: absolute;\n right: 0.6rem;\n top: 50%;\n transform: translateY(-50%);\n font-size: 0.7rem;\n padding: 0.1rem 0.4rem;\n color: var(--np-color-muted-foreground);\n border: 1px solid var(--np-color-border);\n border-radius: 4px;\n}\n\n.np-docs-nav {\n display: flex;\n align-items: center;\n gap: 1.25rem;\n}\n.np-docs-primary-nav {\n display: flex;\n list-style: none;\n gap: 1.25rem;\n margin: 0;\n padding: 0;\n}\n.np-docs-primary-nav a {\n color: var(--np-color-muted-foreground);\n font-size: 0.875rem;\n font-weight: 500;\n text-decoration: none;\n}\n.np-docs-primary-nav a:hover,\n.np-docs-primary-nav a[aria-current=\"page\"] {\n color: var(--np-color-foreground);\n}\n@media (max-width: 800px) {\n .np-docs-header-inner {\n grid-template-columns: auto 1fr auto;\n gap: 0.75rem;\n }\n .np-docs-search-form { display: none; }\n .np-docs-primary-nav { display: none; }\n}\n\n/* ============================================================\n * 3-column layout: sidebar + article + on-page TOC.\n * ============================================================ */\n.np-docs-grid,\n.np-docs-body {\n max-width: 1380px;\n margin: 0 auto;\n width: 100%;\n display: grid;\n grid-template-columns: 260px minmax(0, 1fr) 220px;\n gap: 3rem;\n padding: 2.25rem 1.5rem 4rem;\n}\n@media (max-width: 1100px) {\n .np-docs-grid,\n .np-docs-body {\n grid-template-columns: 240px minmax(0, 1fr);\n }\n .np-docs-toc { display: none; }\n}\n@media (max-width: 800px) {\n .np-docs-grid,\n .np-docs-body {\n grid-template-columns: 1fr;\n }\n .np-docs-sidebar { display: none; }\n}\n\n/* Non-docs routes (home / about / pricing / contact / member pages):\n * collapse the 3-col grid to a single wide column and hide the\n * doc-only chrome (sidebar + TOC) so a generic pages doc has full\n * canvas width instead of being squeezed into the 800-ish px\n * article column reserved for the /docs reading lane. */\n.np-docs-shell[data-layout=\"page\"] .np-docs-grid {\n grid-template-columns: minmax(0, 1fr);\n}\n.np-docs-shell[data-layout=\"page\"] .np-docs-sidebar,\n.np-docs-shell[data-layout=\"page\"] .np-docs-toc {\n display: none;\n}\n/* Framework's globals.css caps .np-page at 48rem (~768px) so a\n * regular pages doc rendered through the catch-all's fallback\n * wrapper stays squeezed even after the grid collapse above.\n * Lift the cap inside the page-layout so block-level content\n * (hero, features, stats) can stretch to the docs container. */\n.np-docs-shell[data-layout=\"page\"] .np-page {\n max-width: none;\n margin: 0;\n padding: 0;\n}\n\n/* ============================================================\n * Sidebar — grouped link list with bullet eyebrow + badges.\n * ============================================================ */\n.np-docs-sidebar {\n position: sticky;\n top: 4.25rem;\n align-self: start;\n max-height: calc(100vh - 5rem);\n overflow-y: auto;\n padding-right: 0.5rem;\n}\n.np-docs-sidebar-group { margin-bottom: 1.5rem; }\n.np-docs-sidebar-eyebrow {\n display: flex;\n align-items: center;\n gap: 0.4rem;\n font-family: var(--np-font-mono);\n font-size: 0.7rem;\n text-transform: uppercase;\n letter-spacing: 0.08em;\n color: var(--np-color-muted-foreground);\n margin: 0 0 0.65rem;\n font-weight: 600;\n}\n.np-docs-sidebar-eyebrow-dot {\n width: 0.4rem;\n height: 0.4rem;\n border-radius: 50%;\n background: var(--np-color-primary);\n}\n/* Leaf top-level doc rendered as a clickable eyebrow — inherits\n * the eyebrow typography (mono / uppercase / 0.7rem) so it sits\n * in the same visual row as sibling group eyebrows; primary\n * accent on current, foreground on hover. */\n.np-docs-sidebar-eyebrow-link {\n color: inherit;\n text-decoration: none;\n font: inherit;\n letter-spacing: inherit;\n text-transform: inherit;\n}\n.np-docs-sidebar-eyebrow-link:hover {\n color: var(--np-color-foreground);\n}\n.np-docs-sidebar-eyebrow-link[data-current=\"true\"],\n.np-docs-sidebar-eyebrow-link[aria-current=\"page\"] {\n color: var(--np-color-primary);\n}\n.np-docs-sidebar ul {\n list-style: none;\n padding: 0;\n margin: 0;\n}\n.np-docs-sidebar li { margin: 0.05rem 0; }\n.np-docs-sidebar a {\n display: block;\n padding: 0.34rem 0.6rem;\n font-size: 0.875rem;\n color: var(--np-color-muted-foreground);\n text-decoration: none;\n border-radius: 6px;\n line-height: 1.35;\n}\n.np-docs-sidebar a:hover {\n background: var(--np-color-muted);\n color: var(--np-color-foreground);\n}\n.np-docs-sidebar a[data-current=\"true\"],\n.np-docs-sidebar a[aria-current=\"page\"] {\n color: var(--np-color-primary);\n background: color-mix(in oklab, var(--np-color-primary) 14%, var(--np-color-card));\n font-weight: 500;\n}\n.np-docs-sidebar ul ul {\n margin-left: 0.5rem;\n padding-left: 0.85rem;\n border-left: 1px solid var(--np-color-border);\n}\n.np-docs-sidebar-badge {\n display: inline-block;\n font-family: var(--np-font-mono);\n font-size: 0.62rem;\n padding: 0.02rem 0.34rem;\n margin-left: 0.4rem;\n vertical-align: 1px;\n border-radius: 4px;\n background: var(--np-color-muted);\n color: var(--np-color-muted-foreground);\n font-weight: 500;\n}\n.np-docs-sidebar-badge.new { background: #dcfce7; color: #166534; }\n.np-docs-sidebar-badge.beta { background: #fef3c7; color: #92400e; }\n.np-docs-sidebar-badge.api {\n background: color-mix(in oklab, var(--np-color-primary) 16%, var(--np-color-card));\n color: var(--np-color-primary);\n}\n\n/* ============================================================\n * Doc page — article column. h1 + lede + meta row + sections\n * with hovered anchor link icon.\n * ============================================================ */\n.np-docs-page {\n max-width: 760px;\n min-width: 0;\n}\n.np-docs-breadcrumbs {\n display: flex;\n align-items: center;\n gap: 0.4rem;\n font-size: 0.8125rem;\n color: var(--np-color-muted-foreground);\n margin-bottom: 1rem;\n}\n.np-docs-breadcrumbs a {\n color: inherit;\n text-decoration: none;\n}\n.np-docs-breadcrumbs a:hover { color: var(--np-color-foreground); }\n.np-docs-breadcrumbs-sep { opacity: 0.5; }\n\n.np-docs-page h1 {\n font-size: clamp(2rem, 3.6vw, 2.5rem);\n font-weight: 700;\n letter-spacing: -0.03em;\n line-height: 1.1;\n margin: 0 0 0.5rem;\n text-wrap: balance;\n}\n.np-docs-page-lede {\n font-size: 1.125rem;\n color: var(--np-color-muted-foreground);\n line-height: 1.55;\n margin: 0 0 2rem;\n max-width: 38rem;\n text-wrap: pretty;\n}\n.np-docs-page-meta {\n display: flex;\n flex-wrap: wrap;\n gap: 0.5rem;\n align-items: center;\n font-size: 0.8125rem;\n color: var(--np-color-muted-foreground);\n padding: 0.85rem 0;\n margin-bottom: 2rem;\n border-top: 1px solid var(--np-color-border);\n border-bottom: 1px solid var(--np-color-border);\n}\n.np-docs-page-meta-pill {\n display: inline-flex;\n align-items: center;\n gap: 0.35rem;\n padding: 0.15rem 0.55rem;\n font-family: var(--np-font-mono);\n font-size: 0.72rem;\n border: 1px solid var(--np-color-border);\n border-radius: 999px;\n background: var(--np-color-card);\n}\n.np-docs-page-meta-pill.status {\n color: var(--np-color-success, #047857);\n border-color: #bbf7d0;\n background: var(--np-color-success-soft, #f0fdf4);\n}\n.np-docs-page-meta-pill.status::before {\n content: \"\";\n width: 0.4rem;\n height: 0.4rem;\n border-radius: 50%;\n background: var(--np-color-success, #047857);\n}\n.np-docs-page-meta-sep { opacity: 0.4; }\n.np-docs-page-meta a {\n color: var(--np-color-primary);\n text-decoration: none;\n margin-left: auto;\n}\n.np-docs-page-meta a:hover { text-decoration: underline; }\n\n.np-docs-page h2 {\n font-size: 1.5rem;\n font-weight: 600;\n letter-spacing: -0.02em;\n line-height: 1.25;\n margin: 3rem 0 0.85rem;\n scroll-margin-top: 5rem;\n position: relative;\n}\n.np-docs-page h2:first-of-type { margin-top: 2.5rem; }\n.np-docs-page h3 {\n font-size: 1.1rem;\n font-weight: 600;\n letter-spacing: -0.01em;\n margin: 2.25rem 0 0.7rem;\n scroll-margin-top: 5rem;\n position: relative;\n}\n.np-docs-page p { margin: 0 0 1rem; }\n.np-docs-page p code,\n.np-docs-page li code {\n font-size: 0.875em;\n padding: 0.1em 0.35em;\n background: var(--np-color-muted);\n border: 1px solid var(--np-color-border);\n border-radius: 4px;\n}\n.np-docs-page strong { font-weight: 600; }\n.np-docs-page ul,\n.np-docs-page ol {\n margin: 0 0 1rem;\n padding-left: 1.4rem;\n}\n.np-docs-page li { margin: 0.35rem 0; }\n.np-docs-page a:not(.np-docs-prev-next a):not(.np-docs-anchor) {\n color: var(--np-color-primary);\n text-decoration: underline;\n text-underline-offset: 3px;\n text-decoration-thickness: 1px;\n text-decoration-color: color-mix(in oklab, var(--np-color-primary) 45%, transparent);\n}\n.np-docs-page a:not(.np-docs-prev-next a):not(.np-docs-anchor):hover {\n text-decoration-color: currentColor;\n}\n\n/* Anchor icon — visible only on heading hover. */\n.np-docs-anchor {\n position: absolute;\n left: -1.3rem;\n top: 50%;\n transform: translateY(-50%);\n color: var(--np-color-muted-foreground);\n opacity: 0;\n text-decoration: none !important;\n font-weight: 400;\n}\n.np-docs-page h2:hover .np-docs-anchor,\n.np-docs-page h3:hover .np-docs-anchor { opacity: 1; }\n\n/* ============================================================\n * Callouts — info (default) / note (indigo) / warn (amber) /\n * danger (red). 3px left rule carries the variant color.\n * ============================================================ */\n.np-docs-callout {\n display: grid;\n grid-template-columns: auto 1fr;\n gap: 0.85rem;\n padding: 1rem 1.15rem;\n border: 1px solid var(--np-color-border);\n border-left: 3px solid var(--np-color-primary);\n border-radius: 8px;\n background: var(--np-color-card);\n margin: 1.25rem 0;\n font-size: 0.95rem;\n line-height: 1.55;\n}\n.np-docs-callout > svg,\n.np-docs-callout-icon {\n width: 1.25rem;\n height: 1.25rem;\n flex-shrink: 0;\n color: var(--np-color-primary);\n margin-top: 0.1rem;\n}\n.np-docs-callout p { margin: 0; }\n.np-docs-callout-title {\n font-weight: 600;\n margin-bottom: 0.15rem;\n color: var(--np-color-foreground);\n}\n.np-docs-callout--warn {\n border-left-color: var(--np-color-warning, #b45309);\n background: var(--np-color-warning-soft, #fffbeb);\n border-color: #fde68a;\n}\n.np-docs-callout--warn .np-docs-callout-icon,\n.np-docs-callout--warn > svg { color: var(--np-color-warning, #b45309); }\n.np-docs-callout--note {\n border-left-color: #6366f1;\n background: #eef2ff;\n border-color: #c7d2fe;\n}\n.np-docs-callout--note .np-docs-callout-icon,\n.np-docs-callout--note > svg { color: #4338ca; }\n.np-docs-callout--danger {\n border-left-color: var(--np-color-danger, #b91c1c);\n background: var(--np-color-danger-soft, #fef2f2);\n border-color: #fecaca;\n}\n.np-docs-callout--danger .np-docs-callout-icon,\n.np-docs-callout--danger > svg { color: var(--np-color-danger, #b91c1c); }\n\n/* ============================================================\n * Code blocks — dark surface with a file-named header and a\n * copy button. Syntax tokens (.tk-*) cover the common slots\n * (keyword / string / function / number / type / punctuation /\n * comment) using a muted neutral-paired palette so the block\n * reads at the same contrast as the page chrome.\n * ============================================================ */\n.np-docs-code {\n margin: 1.25rem 0;\n border-radius: 10px;\n background: var(--np-color-code-bg, #0b1220);\n color: var(--np-color-code-fg, #e6edf6);\n overflow: hidden;\n border: 1px solid var(--np-color-code-head, #1e2939);\n}\n.np-docs-code-head {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 0.55rem 0.85rem;\n background: var(--np-color-code-border, #0f1a2b);\n border-bottom: 1px solid #1e293b;\n}\n.np-docs-code-file {\n display: inline-flex;\n align-items: center;\n gap: 0.5rem;\n font-family: var(--np-font-mono);\n font-size: 0.78rem;\n color: #94a3b8;\n}\n.np-docs-code-file svg { color: #64748b; }\n.np-docs-code-copy {\n display: inline-flex;\n align-items: center;\n gap: 0.35rem;\n padding: 0.25rem 0.55rem;\n font-size: 0.72rem;\n font-family: var(--np-font-mono);\n color: #94a3b8;\n background: transparent;\n border: 1px solid #1e293b;\n border-radius: 5px;\n cursor: pointer;\n}\n.np-docs-code-copy:hover {\n color: #e2e8f0;\n border-color: #334155;\n}\n.np-docs-code pre {\n margin: 0;\n padding: 1rem 1.1rem;\n font-size: 0.825rem;\n line-height: 1.65;\n overflow-x: auto;\n}\n.np-docs-code pre code {\n display: block;\n font-family: inherit;\n background: transparent;\n border: 0;\n padding: 0;\n color: inherit;\n}\n.tk-c { color: #64748b; font-style: italic; }\n.tk-k { color: #c084fc; }\n.tk-s { color: #86efac; }\n.tk-f { color: #93c5fd; }\n.tk-t { color: #fcd34d; }\n.tk-n { color: #f9a8d4; }\n.tk-p { color: #e2e8f0; }\n\n/* Inline shell snippet — for terse \\`pnpm dev\\` style commands.\n * Named \\`cmdline\\` (not \\`shell\\`) so it doesn't collide with the\n * route shell container at \\`.np-docs-shell\\`. */\n.np-docs-cmdline {\n display: grid;\n grid-template-columns: auto 1fr auto;\n gap: 0.7rem;\n align-items: center;\n padding: 0.75rem 1rem;\n margin: 1.25rem 0;\n background: var(--np-color-code-bg, #0b1220);\n color: var(--np-color-code-fg, #e6edf6);\n border-radius: 9px;\n font-family: var(--np-font-mono);\n font-size: 0.875rem;\n}\n.np-docs-cmdline-prompt { color: #34d399; }\n.np-docs-cmdline-cmd { color: #e2e8f0; }\n.np-docs-cmdline-copy {\n padding: 0.2rem 0.55rem;\n font-size: 0.7rem;\n color: #94a3b8;\n background: transparent;\n border: 1px solid #1e293b;\n border-radius: 5px;\n cursor: pointer;\n}\n.np-docs-cmdline-copy:hover { color: #e2e8f0; border-color: #334155; }\n\n/* ============================================================\n * Numbered steps — counter on a soft pill before each step.\n * ============================================================ */\n.np-docs-steps {\n counter-reset: step;\n list-style: none;\n padding: 0;\n margin: 1.5rem 0;\n display: grid;\n gap: 1rem;\n}\n.np-docs-steps > li {\n counter-increment: step;\n display: grid;\n grid-template-columns: 2.1rem 1fr;\n gap: 0.85rem;\n align-items: start;\n}\n.np-docs-steps > li::before {\n content: counter(step);\n width: 1.85rem;\n height: 1.85rem;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n font-family: var(--np-font-mono);\n font-size: 0.85rem;\n font-weight: 600;\n color: var(--np-color-primary);\n background: color-mix(in oklab, var(--np-color-primary) 14%, var(--np-color-card));\n border-radius: 50%;\n}\n.np-docs-step-title {\n font-weight: 600;\n margin: 0.25rem 0 0.25rem;\n}\n.np-docs-step-body {\n margin: 0;\n color: var(--np-color-muted-foreground);\n}\n\n/* ============================================================\n * API / reference tables — uppercase mono headers.\n * ============================================================ */\n.np-docs-table {\n width: 100%;\n border-collapse: collapse;\n font-size: 0.875rem;\n margin: 1.25rem 0;\n}\n.np-docs-table thead { background: var(--np-color-muted); }\n.np-docs-table th,\n.np-docs-table td {\n text-align: left;\n padding: 0.7rem 0.85rem;\n border-bottom: 1px solid var(--np-color-border);\n vertical-align: top;\n}\n.np-docs-table th {\n font-family: var(--np-font-mono);\n font-size: 0.72rem;\n text-transform: uppercase;\n letter-spacing: 0.06em;\n color: var(--np-color-muted-foreground);\n font-weight: 600;\n}\n.np-docs-table td:first-child code {\n color: var(--np-color-foreground);\n font-weight: 500;\n}\n.np-docs-table-required {\n display: inline-block;\n font-family: var(--np-font-mono);\n font-size: 0.65rem;\n padding: 0.05rem 0.35rem;\n margin-left: 0.4rem;\n background: #fef3c7;\n color: #92400e;\n border-radius: 4px;\n vertical-align: 1px;\n}\n\n/* ============================================================\n * Prev / next — symmetric pair at the foot of every doc page.\n * Hover lifts the bordered card and tints the border primary.\n * ============================================================ */\n.np-docs-prev-next {\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: 1rem;\n margin: 3.5rem 0 1rem;\n padding-top: 2rem;\n border-top: 1px solid var(--np-color-border);\n}\n.np-docs-prev-next a {\n display: block;\n padding: 1rem 1.15rem;\n background: var(--np-color-card);\n border: 1px solid var(--np-color-border);\n border-radius: 10px;\n text-decoration: none;\n transition: border-color 0.15s ease, transform 0.2s ease;\n}\n.np-docs-prev-next a:hover {\n border-color: var(--np-color-primary);\n transform: translateY(-1px);\n}\n.np-docs-prev-next-dir,\n.np-docs-prev-next-label {\n font-family: var(--np-font-mono);\n font-size: 0.72rem;\n color: var(--np-color-muted-foreground);\n letter-spacing: 0.05em;\n margin-bottom: 0.25rem;\n}\n.np-docs-prev-next-title {\n font-weight: 600;\n font-size: 0.95rem;\n}\n.np-docs-prev-next a.np-docs-prev-next-next,\n.np-docs-prev-next a:last-child { text-align: right; }\n.np-docs-prev-next[data-single=\"prev\"],\n.np-docs-prev-next[data-single=\"next\"] { grid-template-columns: 1fr; }\n.np-docs-prev-next[data-single=\"prev\"] a.np-docs-prev-next-prev,\n.np-docs-prev-next[data-single=\"next\"] a.np-docs-prev-next-next { width: 100%; }\n.np-docs-prev-next[data-single=\"prev\"] a.np-docs-prev-next-prev { text-align: left; }\n\n/* ============================================================\n * Feedback row — Yes / Could be better buttons under each page.\n * ============================================================ */\n.np-docs-feedback {\n margin-top: 3rem;\n padding: 1.25rem;\n background: var(--np-color-muted);\n border: 1px solid var(--np-color-border);\n border-radius: 10px;\n display: flex;\n gap: 1rem;\n align-items: center;\n justify-content: space-between;\n flex-wrap: wrap;\n}\n.np-docs-feedback-title { font-weight: 600; font-size: 0.95rem; }\n.np-docs-feedback-helper {\n font-size: 0.825rem;\n color: var(--np-color-muted-foreground);\n margin-top: 0.15rem;\n}\n.np-docs-feedback-buttons {\n display: flex;\n gap: 0.5rem;\n}\n.np-docs-feedback-buttons button {\n padding: 0.4rem 0.85rem;\n font: inherit;\n font-size: 0.825rem;\n background: var(--np-color-card);\n border: 1px solid var(--np-color-border);\n border-radius: 7px;\n cursor: pointer;\n}\n.np-docs-feedback-buttons button:hover {\n border-color: var(--np-color-primary);\n color: var(--np-color-primary);\n}\n\n/* ============================================================\n * On-page TOC — right rail, sticky, current section gets a\n * primary border + soft gradient.\n * ============================================================ */\n.np-docs-toc {\n position: sticky;\n top: 4.25rem;\n align-self: start;\n max-height: calc(100vh - 5rem);\n overflow-y: auto;\n font-size: 0.825rem;\n}\n.np-docs-toc-eyebrow {\n font-family: var(--np-font-mono);\n font-size: 0.7rem;\n text-transform: uppercase;\n letter-spacing: 0.08em;\n color: var(--np-color-muted-foreground);\n margin: 0 0 0.75rem;\n font-weight: 600;\n}\n.np-docs-toc ul {\n list-style: none;\n padding: 0;\n margin: 0;\n}\n.np-docs-toc li { margin: 0.05rem 0; }\n.np-docs-toc a {\n display: block;\n padding: 0.3rem 0.5rem;\n color: var(--np-color-muted-foreground);\n text-decoration: none;\n border-left: 2px solid transparent;\n margin-left: -2px;\n line-height: 1.4;\n}\n.np-docs-toc a:hover { color: var(--np-color-foreground); }\n.np-docs-toc a[data-current=\"true\"],\n.np-docs-toc a[aria-current=\"location\"],\n.np-docs-toc a[aria-current=\"true\"] {\n color: var(--np-color-primary);\n border-left-color: var(--np-color-primary);\n background: linear-gradient(\n to right,\n color-mix(in oklab, var(--np-color-primary) 14%, var(--np-color-card)),\n transparent 80%\n );\n}\n.np-docs-toc ul ul { margin-left: 0.85rem; }\n.np-docs-toc-l3 { margin-left: 0.85rem; }\n.np-docs-toc-secondary {\n margin-top: 1.5rem;\n padding-top: 1rem;\n border-top: 1px solid var(--np-color-border);\n}\n.np-docs-toc-secondary a {\n display: inline-flex;\n align-items: center;\n gap: 0.35rem;\n padding: 0.2rem 0;\n border-left: 0;\n margin: 0;\n}\n.np-docs-toc-secondary a:hover { background: transparent; }\n\n/* Empty / not-found surfaces — used by routes/not-found and\n * the docs collection's empty state. */\n.np-docs-empty {\n padding: 4rem 1.5rem;\n text-align: center;\n color: var(--np-color-muted-foreground);\n}\n.np-docs-empty h1 {\n font-size: 1.5rem;\n margin: 0 0 0.5rem;\n color: var(--np-color-foreground);\n}\n\n/* ============================================================\n * Search route — wraps DocsSearch's output. Eyebrow + result\n * cards reuse the docs chrome (mono small caps, hairline rules,\n * bordered card with hover lift).\n * ============================================================ */\n.np-docs-search {\n max-width: 800px;\n margin: 0 auto;\n padding-top: 2.25rem;\n}\n.np-docs-search-heading {\n font-family: var(--np-font-mono);\n font-size: 0.72rem;\n text-transform: uppercase;\n letter-spacing: 0.08em;\n color: var(--np-color-muted-foreground);\n font-weight: 600;\n margin: 0 0 0.5rem;\n}\n.np-docs-search h1 {\n font-size: 1.75rem;\n font-weight: 700;\n letter-spacing: -0.02em;\n margin: 0 0 1.5rem;\n text-wrap: balance;\n}\n.np-docs-search-empty {\n color: var(--np-color-muted-foreground);\n padding: 1.5rem 0;\n font-size: 0.95rem;\n}\n.np-docs-search-results {\n list-style: none;\n padding: 0;\n margin: 1.5rem 0 0;\n display: grid;\n gap: 1rem;\n}\n.np-docs-search-result {\n padding: 1rem 1.15rem;\n border: 1px solid var(--np-color-border);\n border-radius: 10px;\n background: var(--np-color-card);\n transition: border-color 0.15s ease, transform 0.2s ease;\n}\n.np-docs-search-result:hover {\n border-color: var(--np-color-primary);\n transform: translateY(-1px);\n}\n.np-docs-search-result-eyebrow {\n font-family: var(--np-font-mono);\n font-size: 0.68rem;\n text-transform: uppercase;\n letter-spacing: 0.08em;\n color: var(--np-color-muted-foreground);\n margin: 0 0 0.35rem;\n}\n.np-docs-search-result h2 {\n font-size: 1.05rem;\n font-weight: 600;\n margin: 0 0 0.4rem;\n}\n.np-docs-search-result h2 a {\n color: var(--np-color-foreground);\n text-decoration: none;\n}\n.np-docs-search-result h2 a:hover { color: var(--np-color-primary); }\n.np-docs-search-result-excerpt {\n margin: 0;\n font-size: 0.875rem;\n color: var(--np-color-muted-foreground);\n line-height: 1.55;\n}\n\n/* ============================================================\n * Front-page landing — eyebrow + display heading + lede +\n * primary CTA + 2x2 group cards + recently-updated row.\n * Renders inside the single-column page layout\n * (data-layout=\"page\" on the shell collapses the 3-col grid).\n * ============================================================ */\n.np-docs-front {\n max-width: 880px;\n margin: 0 auto;\n padding: 2.5rem 0 4rem;\n display: grid;\n gap: 3rem;\n}\n.np-docs-front-hero {\n display: grid;\n gap: 1rem;\n}\n.np-docs-front-eyebrow {\n display: inline-flex;\n align-items: center;\n gap: 0.5rem;\n font-family: var(--np-font-mono, ui-monospace, monospace);\n font-size: 0.72rem;\n letter-spacing: 0.16em;\n text-transform: uppercase;\n color: var(--np-color-primary);\n background: var(--np-color-primary-soft, color-mix(in oklab, var(--np-color-primary) 10%, transparent));\n padding: 0.32rem 0.6rem;\n border-radius: 999px;\n align-self: start;\n justify-self: start;\n}\n.np-docs-front-eyebrow-dot {\n width: 6px;\n height: 6px;\n border-radius: 999px;\n background: var(--np-color-success, currentColor);\n display: inline-block;\n}\n.np-docs-front h1 {\n font-size: clamp(2.4rem, 4.2vw, 3rem);\n font-weight: 700;\n letter-spacing: -0.03em;\n line-height: 1.05;\n margin: 0;\n text-wrap: balance;\n}\n.np-docs-front-lede {\n font-size: 1.125rem;\n line-height: 1.55;\n color: var(--np-color-muted-foreground);\n max-width: 60ch;\n margin: 0;\n}\n.np-docs-front-cta {\n display: flex;\n flex-wrap: wrap;\n gap: 0.65rem;\n margin-top: 0.5rem;\n}\n.np-docs-front-cta-primary {\n display: inline-flex;\n align-items: center;\n gap: 0.4rem;\n font-size: 0.92rem;\n font-weight: 500;\n padding: 0.55rem 1.05rem;\n border-radius: 999px;\n background: var(--np-color-foreground);\n color: var(--np-color-background);\n text-decoration: none;\n}\n.np-docs-front-cta-primary:hover {\n background: color-mix(in oklab, var(--np-color-foreground) 85%, transparent);\n}\n.np-docs-front-cta-secondary {\n display: inline-flex;\n align-items: center;\n font-size: 0.92rem;\n padding: 0.55rem 1.05rem;\n border-radius: 999px;\n color: var(--np-color-foreground);\n text-decoration: none;\n border: 1px solid var(--np-color-border);\n}\n.np-docs-front-cta-secondary:hover {\n background: var(--np-color-muted);\n}\n\n.np-docs-front-groups {\n display: grid;\n grid-template-columns: repeat(2, 1fr);\n gap: 1rem;\n}\n@media (max-width: 720px) {\n .np-docs-front-groups { grid-template-columns: 1fr; }\n}\n.np-docs-front-group {\n display: grid;\n gap: 0.5rem;\n padding: 1.4rem 1.4rem 1.6rem;\n border-radius: var(--np-radius-lg, 10px);\n border: 1px solid var(--np-color-border);\n background: var(--np-color-card);\n text-decoration: none;\n color: inherit;\n transition: border-color 120ms ease, transform 120ms ease;\n}\n.np-docs-front-group:hover {\n border-color: var(--np-color-primary);\n transform: translateY(-1px);\n}\n.np-docs-front-group-title {\n display: flex;\n align-items: center;\n justify-content: space-between;\n font-size: 1.05rem;\n font-weight: 600;\n margin: 0;\n}\n.np-docs-front-group-count {\n font-family: var(--np-font-mono, ui-monospace, monospace);\n font-size: 0.7rem;\n letter-spacing: 0.04em;\n color: var(--np-color-muted-foreground);\n font-weight: 400;\n}\n.np-docs-front-group-lede {\n margin: 0;\n font-size: 0.9rem;\n line-height: 1.5;\n color: var(--np-color-muted-foreground);\n}\n.np-docs-front-group-children {\n list-style: none;\n margin: 0.4rem 0 0;\n padding: 0;\n display: grid;\n gap: 0.25rem;\n}\n.np-docs-front-group-children li {\n font-size: 0.86rem;\n color: var(--np-color-muted-foreground);\n display: inline-flex;\n align-items: center;\n gap: 0.4rem;\n}\n\n.np-docs-front-recent {\n display: grid;\n gap: 0.75rem;\n}\n.np-docs-front-recent-eyebrow {\n font-family: var(--np-font-mono, ui-monospace, monospace);\n font-size: 0.7rem;\n letter-spacing: 0.18em;\n text-transform: uppercase;\n color: var(--np-color-muted-foreground);\n margin: 0;\n}\n.np-docs-front-recent-list {\n list-style: none;\n margin: 0;\n padding: 0;\n display: grid;\n gap: 0.5rem;\n}\n.np-docs-front-recent-list a {\n display: flex;\n align-items: baseline;\n justify-content: space-between;\n gap: 1rem;\n padding: 0.5rem 0;\n border-bottom: 1px solid var(--np-color-border);\n text-decoration: none;\n color: inherit;\n}\n.np-docs-front-recent-list li:last-child a {\n border-bottom: 0;\n}\n.np-docs-front-recent-list a:hover {\n color: var(--np-color-primary);\n}\n.np-docs-front-recent-title {\n font-size: 0.95rem;\n}\n.np-docs-front-recent-time {\n font-family: var(--np-font-mono, ui-monospace, monospace);\n font-size: 0.75rem;\n color: var(--np-color-muted-foreground);\n flex-shrink: 0;\n}\n\n/* ────────────────────────────────────────────────────────────\n * Members shell (DocsMembersShell — /members/* routes)\n *\n * Drops the docs sidebar — hierarchical navigation is useless\n * on auth forms. Reuses DocsHeader directly. Body becomes a\n * narrow centered column for the form / status content.\n * ──────────────────────────────────────────────────────────── */\n.np-docs-members {\n padding: 4rem 1.5rem;\n min-height: 60vh;\n}\n.np-docs-members-column {\n max-width: 32rem;\n margin: 0 auto;\n display: flex;\n flex-direction: column;\n gap: 1.5rem;\n}\n`;\n","import type { NpTemplateRenderProps } from \"@nexpress/theme\";\n\nexport function PageApiReferenceTemplate(_props: NpTemplateRenderProps) {\n const params = [\n [\"manifest\", \"required\", \"Plugin metadata: id, name, version, and supported NexPress range.\"],\n [\"hooks\", \"optional\", \"Lifecycle hooks such as content:beforeSave and content:afterSave.\"],\n [\"actions\", \"optional\", \"Custom action handlers mounted under the plugin action endpoint.\"],\n [\"routes\", \"optional\", \"API-style route handlers registered by the plugin host.\"],\n [\"pageRoutes\", \"optional\", \"Public-site React routes rendered through the site shell.\"],\n [\"scheduled\", \"optional\", \"pg-boss scheduled tasks reconciled at boot.\"],\n [\"blocks\", \"optional\", \"Page-builder block definitions registered into the shared registry.\"],\n ];\n\n return (\n <article className=\"np-docs-api\">\n <header className=\"np-docs-api-hero\">\n <p className=\"np-docs-api-eyebrow\">API reference</p>\n <h1>\n <code>definePlugin</code>\n </h1>\n <p>\n Declares a NexPress plugin. v1 plugins are npm package + rebuild:\n they run in-process, can register hooks, actions, API routes,\n public page routes, scheduled tasks, and page-builder blocks.\n </p>\n </header>\n\n <section className=\"np-docs-api-signature\" aria-label=\"Signature\">\n <div className=\"np-docs-api-signature-head\">\n <span>Signature</span>\n <code>@nexpress/plugin-sdk</code>\n </div>\n <pre>{`import { definePlugin } from \"@nexpress/plugin-sdk\";\n\nexport default definePlugin({\n manifest: {\n id: \"reading-time\",\n name: \"Reading time\",\n version: \"0.1.0\",\n nexpress: { minVersion: \"0.1.0\" },\n },\n hooks: {\n \"content:beforeSave\": async (ctx) => ctx.data,\n },\n pageRoutes: [],\n blocks: [],\n});`}</pre>\n </section>\n\n <section className=\"np-docs-api-section\">\n <h2>Parameters</h2>\n <div className=\"np-docs-api-table\">\n {params.map(([name, state, desc]) => (\n <div className=\"np-docs-api-row\" key={name}>\n <code>{name}</code>\n <span>{state}</span>\n <p>{desc}</p>\n </div>\n ))}\n </div>\n </section>\n\n <section className=\"np-docs-api-section\">\n <h2>Returns</h2>\n <p>\n A plugin definition object consumed by the NexPress bootstrap. The\n host validates the manifest and registers every declared surface in a\n predictable order. Capability and route checks happen at the\n framework boundary.\n </p>\n </section>\n </article>\n );\n}\n","import type { NpTemplateRenderProps } from \"@nexpress/theme\";\n\nconst RELEASES = [\n {\n version: \"0.3.6\",\n date: \"May 2026\",\n tag: \"latest\",\n changes: [\n [\"Improved\", \"Theme seed content now owns first-boot pages and posts per active theme.\"],\n [\"Added\", \"Built-in theme docs, magazine, and portfolio front-page render coverage.\"],\n [\"Fixed\", \"Theme-contributed fields are gated by active theme in the admin editor.\"],\n ],\n },\n {\n version: \"0.3.0\",\n date: \"May 2026\",\n tag: \"theme v0.2\",\n changes: [\n [\"Added\", \"Theme routes, archives, nav locations, settings schema, and patterns.\"],\n [\"Added\", \"Docs and portfolio kinds on the universal posts collection.\"],\n [\"Breaking\", \"Legacy nx prefix moved to np across framework-owned identifiers.\"],\n ],\n },\n {\n version: \"0.2.0\",\n date: \"April 2026\",\n tag: \"pre-1.0\",\n changes: [\n [\"Added\", \"Plugin page routes and page-builder block contributions.\"],\n [\"Improved\", \"pg-boss worker lifecycle and admin jobs surface.\"],\n [\"Fixed\", \"CSRF and rate limiting now live in the app proxy boundary.\"],\n ],\n },\n];\n\nexport function PageChangelogTemplate(_props: NpTemplateRenderProps) {\n return (\n <article className=\"np-docs-changelog-page\">\n <header className=\"np-docs-changelog-hero\">\n <p>Changelog</p>\n <h1>Every shipped change, in reverse.</h1>\n <span>Pre-1.0 packages use minor releases for breaking changes.</span>\n </header>\n\n <ol className=\"np-docs-changelog-timeline\">\n {RELEASES.map((release) => (\n <li className=\"np-docs-changelog-release\" key={release.version}>\n <aside>\n <strong>v{release.version}</strong>\n <span>{release.date}</span>\n <i>{release.tag}</i>\n </aside>\n <div>\n {release.changes.map(([kind, text]) => (\n <p key={`${release.version}-${text}`}>\n <span data-kind={kind.toLowerCase()}>{kind}</span>\n {text}\n </p>\n ))}\n </div>\n </li>\n ))}\n </ol>\n </article>\n );\n}\n","import * as React from \"react\";\nimport { findDocuments } from \"@nexpress/core\";\nimport type { NpTemplateRenderProps } from \"@nexpress/theme\";\n\nimport { buildDocTree } from \"../lib/doc-tree.js\";\nimport { resolveDocsSettings } from \"../settings-helpers.js\";\n\ninterface DocRow {\n id: unknown;\n slug: unknown;\n title: unknown;\n parent: unknown;\n order: unknown;\n lede: unknown;\n badge: unknown;\n publishedAt: unknown;\n updatedAt: unknown;\n /** Universal-content-model discriminator (#748) — filtered at query time. */\n kind?: string;\n}\n\ninterface DocNode {\n id: string;\n slug: string;\n title: string;\n lede: string | null;\n parent: string | null;\n order: number;\n badge: string | null;\n publishedAt: string | null;\n updatedAt: string | null;\n children: DocNode[];\n}\n\n/**\n * Docs theme front page — the landing operators see at `/` once they\n * activate the docs theme.\n *\n * Walks the seeded `kind=\"doc\"` tree: hero (site name + version pill +\n * lede), a 2x2 card grid of the top-level group docs with their first\n * three children listed, and a \"Recently updated\" row with the four\n * most recently touched docs. Each card title links into `/docs/<slug>`.\n *\n * Lives outside the 3-col docs grid (the shell stamps\n * `data-layout=\"page\"` for non-`/docs` routes, collapsing the grid to a\n * single 1380px column and hiding the sidebar + TOC). Operators who\n * want a marketing-style home swap the template via the admin picker.\n */\nexport async function PageFrontTemplate(_props: NpTemplateRenderProps) {\n const settings = await resolveDocsSettings();\n const result = await findDocuments<DocRow>(\"posts\", {\n where: { status: \"published\", kind: \"doc\" },\n sort: \"order\",\n limit: 200,\n });\n\n const tree = buildTree(result.docs);\n const recent = recentlyUpdated(result.docs, 4);\n // Primary CTA points at the plugin author quickstart when the\n // doc set includes it; otherwise falls back to the first leaf\n // / first root. Split into two explicit lookups so the intent\n // reads top-to-bottom: find the parent, then the child.\n const pluginsRoot = tree.find((node) => node.slug === \"plugins\");\n const quickstartChild = pluginsRoot?.children.find(\n (c) => c.slug === \"author-quickstart\",\n );\n const quickstartTarget =\n quickstartChild ?? tree[0]?.children[0] ?? tree[0] ?? null;\n\n return (\n <article className=\"np-docs-front\">\n <header className=\"np-docs-front-hero\">\n <span className=\"np-docs-front-eyebrow\">\n <span className=\"np-docs-front-eyebrow-dot\" aria-hidden=\"true\" />\n {settings.version}\n <span aria-hidden=\"true\"> · Stable</span>\n </span>\n <h1>Documentation</h1>\n <p className=\"np-docs-front-lede\">\n Everything you need to install, configure, extend, and ship a\n NexPress site — from a first install to the API reference. Browse\n by section, or jump straight into the plugin author quickstart.\n </p>\n {quickstartTarget ? (\n <div className=\"np-docs-front-cta\">\n <a className=\"np-docs-front-cta-primary\" href={`/docs/${quickstartTarget.slug}`}>\n Open {quickstartTarget.title} →\n </a>\n {settings.githubRepo ? (\n <a\n className=\"np-docs-front-cta-secondary\"\n href={settings.githubRepo}\n target=\"_blank\"\n rel=\"noreferrer\"\n >\n Browse the repository\n </a>\n ) : null}\n </div>\n ) : null}\n </header>\n\n {tree.length > 0 ? (\n <section className=\"np-docs-front-groups\" aria-label=\"Documentation sections\">\n {tree.map((group) => (\n <a\n className=\"np-docs-front-group\"\n key={group.id}\n href={`/docs/${group.slug}`}\n >\n <h2 className=\"np-docs-front-group-title\">\n {group.title}\n <span className=\"np-docs-front-group-count\">\n {group.children.length.toString()} page\n {group.children.length === 1 ? \"\" : \"s\"}\n </span>\n </h2>\n {group.lede ? (\n <p className=\"np-docs-front-group-lede\">{group.lede}</p>\n ) : null}\n {group.children.length > 0 ? (\n <ul className=\"np-docs-front-group-children\">\n {group.children.slice(0, 4).map((child) => (\n <li key={child.id}>\n {child.title}\n {child.badge ? (\n <span\n className={`np-docs-sidebar-badge ${child.badge.toLowerCase()}`}\n >\n {child.badge.toUpperCase()}\n </span>\n ) : null}\n </li>\n ))}\n </ul>\n ) : null}\n </a>\n ))}\n </section>\n ) : null}\n\n {recent.length > 0 ? (\n <section\n className=\"np-docs-front-recent\"\n aria-label=\"Recently updated docs\"\n >\n <h2 className=\"np-docs-front-recent-eyebrow\">Recently updated</h2>\n <ul className=\"np-docs-front-recent-list\">\n {recent.map((node) => (\n <li key={node.id}>\n <a href={`/docs/${node.slug}`}>\n <span className=\"np-docs-front-recent-title\">{node.title}</span>\n {node.updatedAt ? (\n <time\n className=\"np-docs-front-recent-time\"\n dateTime={node.updatedAt}\n >\n {formatRelative(node.updatedAt)}\n </time>\n ) : null}\n </a>\n </li>\n ))}\n </ul>\n </section>\n ) : null}\n </article>\n );\n}\n\nfunction buildTree(rows: DocRow[]): DocNode[] {\n return buildDocTree<DocNode, DocRow>(rows, (r) => {\n if (typeof r.id !== \"string\") return null;\n if (typeof r.slug !== \"string\") return null;\n return {\n id: r.id,\n slug: r.slug,\n title: typeof r.title === \"string\" ? r.title : r.slug,\n lede: typeof r.lede === \"string\" ? r.lede : null,\n parent: typeof r.parent === \"string\" ? r.parent : null,\n order: typeof r.order === \"number\" ? r.order : 0,\n badge: typeof r.badge === \"string\" ? r.badge : null,\n publishedAt:\n typeof r.publishedAt === \"string\" ? r.publishedAt : null,\n updatedAt: typeof r.updatedAt === \"string\" ? r.updatedAt : null,\n children: [],\n };\n });\n}\n\nfunction recentlyUpdated(rows: DocRow[], limit: number): DocNode[] {\n const all: DocNode[] = [];\n for (const r of rows) {\n if (typeof r.id !== \"string\" || typeof r.slug !== \"string\") continue;\n if (typeof r.parent !== \"string\") continue;\n all.push({\n id: r.id,\n slug: r.slug,\n title: typeof r.title === \"string\" ? r.title : r.slug,\n lede: null,\n parent: typeof r.parent === \"string\" ? r.parent : null,\n order: 0,\n badge: typeof r.badge === \"string\" ? r.badge : null,\n publishedAt:\n typeof r.publishedAt === \"string\" ? r.publishedAt : null,\n updatedAt: typeof r.updatedAt === \"string\" ? r.updatedAt : null,\n children: [],\n });\n }\n return all\n .filter((n) => n.updatedAt !== null)\n .sort((a, b) => {\n const at = a.updatedAt ?? \"\";\n const bt = b.updatedAt ?? \"\";\n return bt.localeCompare(at);\n })\n .slice(0, limit);\n}\n\nfunction formatRelative(iso: string): string {\n try {\n const then = new Date(iso).getTime();\n const now = Date.now();\n const ms = Math.max(now - then, 0);\n const minute = 60 * 1000;\n const hour = 60 * minute;\n const day = 24 * hour;\n if (ms < hour) return `${Math.max(1, Math.round(ms / minute)).toString()} min ago`;\n if (ms < day) return `${Math.round(ms / hour).toString()} h ago`;\n if (ms < 7 * day) return `${Math.round(ms / day).toString()} d ago`;\n return new Date(iso).toLocaleDateString(undefined, {\n month: \"short\",\n day: \"numeric\",\n year: \"numeric\",\n });\n } catch {\n return \"\";\n }\n}\n"],"mappings":"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AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;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","names":["jsx","jsxs","jsx","jsxs","jsx","jsxs","jsx","jsxs","findDocuments","Fragment","jsx","jsxs","jsx","findDocuments","jsx","jsxs","jsx","jsxs","findDocuments","jsx","jsxs","findDocuments","jsx","jsxs","jsx","jsxs","findDocuments","jsx","jsxs","findDocuments","buildTree"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/copy-button-bridge.ts","../src/blocks/index.tsx","../src/header.tsx","../src/settings-helpers.ts","../src/settings.ts","../src/members-not-found.tsx","../src/members-shell.tsx","../src/not-found.tsx","../src/routes/doc-detail.tsx","../src/templates/doc-page.tsx","../src/toc-scrollspy-bridge.ts","../src/search.tsx","../src/shell.tsx","../src/sidebar.tsx","../src/lib/doc-tree.ts","../src/styles.ts","../src/templates/page-api-reference.tsx","../src/templates/page-changelog.tsx","../src/templates/page-front.tsx"],"sourcesContent":["import { defineTheme, type NpThemeSeedPage, type NpThemeSeedPost } from \"@nexpress/theme\";\n\nimport { docsBlocks } from \"./blocks/index.js\";\nimport { CopyButton } from \"./copy-button-bridge.js\";\nimport { DocsHeader } from \"./header.js\";\nimport { DocsMembersNotFound } from \"./members-not-found.js\";\nimport { DocsMembersShell } from \"./members-shell.js\";\nimport { DocsNotFound } from \"./not-found.js\";\nimport { DocsDetailRoute } from \"./routes/doc-detail.js\";\nimport { DocsSearch } from \"./search.js\";\nimport { DocsShell } from \"./shell.js\";\nimport { DocsSidebar } from \"./sidebar.js\";\nimport { docsCss } from \"./styles.js\";\nimport { docsSettingsSchema } from \"./settings.js\";\nimport { DocPageTemplate } from \"./templates/doc-page.js\";\nimport { PageApiReferenceTemplate } from \"./templates/page-api-reference.js\";\nimport { PageChangelogTemplate } from \"./templates/page-changelog.js\";\nimport { PageFrontTemplate } from \"./templates/page-front.js\";\n\nconst SEED_NAV = {\n header: [\n { id: \"nav-docs-docs\", label: \"Docs\", type: \"link\" as const, url: \"/\" },\n { id: \"nav-docs-reference\", label: \"Reference\", type: \"link\" as const, url: \"/docs/reference\" },\n { id: \"nav-docs-blog\", label: \"Blog\", type: \"link\" as const, url: \"/blog\" },\n ],\n footer: [\n { id: \"nav-docs-footer-docs\", label: \"Documentation\", type: \"link\" as const, url: \"/\" },\n {\n id: \"nav-docs-footer-reference\",\n label: \"Reference\",\n type: \"link\" as const,\n url: \"/docs/reference\",\n },\n {\n id: \"nav-docs-footer-changelog\",\n label: \"Changelog\",\n type: \"link\" as const,\n url: \"/changelog\",\n },\n {\n id: \"nav-docs-footer-github\",\n label: \"GitHub\",\n type: \"link\" as const,\n url: \"https://github.com\",\n },\n ],\n};\n\nfunction paragraph(text: string) {\n return {\n type: \"paragraph\",\n version: 1,\n direction: null,\n format: \"\",\n indent: 0,\n children: [\n {\n type: \"text\",\n version: 1,\n detail: 0,\n format: 0,\n mode: \"normal\",\n style: \"\",\n text,\n },\n ],\n };\n}\n\nfunction heading(tag: \"h2\" | \"h3\", text: string) {\n return {\n type: \"heading\",\n tag,\n version: 1,\n direction: null,\n format: \"\",\n indent: 0,\n children: [\n {\n type: \"text\",\n version: 1,\n detail: 0,\n format: 0,\n mode: \"normal\",\n style: \"\",\n text,\n },\n ],\n };\n}\n\nfunction codeBlock(text: string, language?: string) {\n return {\n type: \"code\",\n language: language ?? null,\n version: 1,\n direction: null,\n format: \"\",\n indent: 0,\n children: [\n {\n type: \"text\",\n version: 1,\n detail: 0,\n format: 0,\n mode: \"normal\",\n style: \"\",\n text,\n },\n ],\n };\n}\n\nfunction listItem(text: string) {\n return {\n type: \"listitem\",\n value: 1,\n version: 1,\n direction: null,\n format: \"\",\n indent: 0,\n children: [\n {\n type: \"text\",\n version: 1,\n detail: 0,\n format: 0,\n mode: \"normal\",\n style: \"\",\n text,\n },\n ],\n };\n}\n\nfunction bulletList(items: string[]) {\n return {\n type: \"list\",\n listType: \"bullet\",\n start: 1,\n tag: \"ul\",\n version: 1,\n direction: null,\n format: \"\",\n indent: 0,\n children: items.map((t) => listItem(t)),\n };\n}\n\nfunction lexicalDoc(blocks: unknown[]): unknown {\n return {\n root: {\n type: \"root\",\n version: 1,\n direction: null,\n format: \"\",\n indent: 0,\n children: blocks,\n },\n };\n}\n\nconst DOCS_NOW = \"2026-05-02T12:00:00.000Z\";\n\nfunction stubDoc(opts: {\n title: string;\n parentSlug?: string;\n order?: number;\n badge?: string;\n lede?: string;\n stableSince?: string;\n}): NpThemeSeedPost {\n return {\n title: opts.title,\n excerpt: opts.lede ?? `${opts.title} reference page.`,\n content: lexicalDoc([\n paragraph(\n `Placeholder body for ${opts.title}. Operators replace this once they're set up — every doc-kind post renders through the three-column docs template.`,\n ),\n ]),\n publishedAt: DOCS_NOW,\n kind: \"doc\",\n ...(opts.parentSlug ? { parentSlug: opts.parentSlug } : {}),\n ...(typeof opts.order === \"number\" ? { order: opts.order } : {}),\n data: {\n ...(opts.badge ? { badge: opts.badge } : {}),\n ...(opts.lede ? { lede: opts.lede } : {}),\n ...(opts.stableSince ? { stableSince: opts.stableSince } : {}),\n },\n };\n}\n\nconst QUICKSTART_BODY = lexicalDoc([\n paragraph(\n \"A NexPress plugin is a single function that returns a manifest. The framework loads it during boot, validates its declared shape, and wires the hooks and routes into the request pipeline. There's no plugin loader to learn — if you can write a TypeScript module, you can write a plugin.\",\n ),\n paragraph(\n \"Prerequisites: a running NexPress site (see Install & bootstrap) and Node 20+. The plugin lives inside your app — no separate workspace required to start.\",\n ),\n heading(\"h2\", \"Scaffold the plugin\"),\n paragraph(\n \"The CLI ships a scaffold command that drops a typed plugin module into plugins/. The generated file imports definePlugin from the SDK and exports a single function.\",\n ),\n codeBlock(\"pnpm nexpress plugin:new hello-world\", \"bash\"),\n paragraph(\n \"The generated module is ~20 lines, ready to run. Open it in your editor before continuing.\",\n ),\n codeBlock(\n [\n 'import { definePlugin } from \"@nexpress/plugin-sdk\";',\n \"\",\n \"export default definePlugin({\",\n \" manifest: {\",\n ' id: \"hello-world\",',\n ' name: \"Hello, world\",',\n ' version: \"0.1.0\",',\n ' nexpress: { minVersion: \"0.1.0\" },',\n \" },\",\n \" hooks: {\",\n \" onDocumentPublished: async ({ doc, collection }) => {\",\n ' if (collection !== \"posts\") return;',\n \" console.log(`Published: ${doc.title}`);\",\n \" },\",\n \" },\",\n \"});\",\n ].join(\"\\n\"),\n \"typescript\",\n ),\n heading(\"h2\", \"Register it with your site\"),\n paragraph(\n \"NexPress loads plugins from nexpress.config.ts. Import your module and add it to the plugins array — order matters, hooks run in the order they're registered.\",\n ),\n codeBlock(\n [\n 'import { defineConfig } from \"@nexpress/core\";',\n 'import helloWorld from \"./plugins/hello-world\";',\n \"\",\n \"export default defineConfig({\",\n \" plugins: [helloWorld()],\",\n \"});\",\n ].join(\"\\n\"),\n \"typescript\",\n ),\n paragraph(\n \"Hot reload picks up new plugin files without a restart. Config changes do require one — that's a Next.js constraint, not ours.\",\n ),\n heading(\"h2\", \"Lifecycle hooks at a glance\"),\n paragraph(\n \"Hooks are typed callbacks NexPress invokes at well-known points. Each receives a context object scoped to that event. The most commonly used hooks:\",\n ),\n bulletList([\n \"onBoot — after config load, before request handling. Context: { config, env }.\",\n \"onDocumentPublished (async) — a document's status transitions to published. Context: { doc, collection, by }.\",\n \"onDocumentUnpublished — status leaves published. Context: { doc, collection, by }.\",\n \"onRequest — every request, after routing, before render. Context: { req, route, user }.\",\n \"onSchedule — cron-like; declare cadence in the manifest. Context: { now, schedule }.\",\n ]),\n paragraph(\n \"The full list — including admin-surface and search hooks — lives in the lifecycle hooks reference.\",\n ),\n heading(\"h2\", \"Run and verify\"),\n bulletList([\n \"Start the dev server. pnpm dev from the repo root. Codegen runs alongside Next's watcher, so plugin types are picked up as you save.\",\n \"Publish a post from the admin. Open /admin, create a draft in the posts collection, and click Publish. The hook fires inside the same request.\",\n \"Check the dev server log. You should see Published: <title> in the terminal. That's it — the plugin is live.\",\n ]),\n paragraph(\n \"Hooks block the response: onDocumentPublished runs inside the publish request. Long-running work — sending emails, regenerating sitemaps — belongs in onSchedule or a queued job. Otherwise the editor will wait on it.\",\n ),\n heading(\"h2\", \"Next steps\"),\n paragraph(\"You have a plugin that runs. Two natural directions from here:\"),\n bulletList([\n \"Add a route. Declare a routes entry in the manifest to expose a public URL — for webhooks, OAuth callbacks, or a custom admin screen.\",\n \"Add collections. Plugins can declare their own collections, which the admin surfaces alongside the operator's. See the Plugin manifest reference.\",\n ]),\n]);\n\nconst SEED_PAGES: NpThemeSeedPage[] = [\n {\n title: \"Documentation\",\n slug: \"/\",\n seoDescription:\n \"Install NexPress, learn the core concepts, write plugins, and look up the API.\",\n blocks: [],\n template: \"front\",\n },\n {\n title: \"definePlugin\",\n slug: \"docs/reference/define-plugin\",\n seoDescription: \"API reference for definePlugin from @nexpress/plugin-sdk.\",\n blocks: [],\n template: \"apiReference\",\n },\n {\n title: \"Changelog\",\n slug: \"changelog\",\n seoDescription: \"Reverse-chronological changelog for NexPress pre-1.0 releases.\",\n blocks: [],\n template: \"changelog\",\n },\n];\n\nconst SEED_DOCS: NpThemeSeedPost[] = [\n stubDoc({\n title: \"Get started\",\n order: 0,\n lede: \"Install NexPress, scaffold a site, and ship a first deploy.\",\n }),\n stubDoc({\n title: \"Introduction\",\n parentSlug: \"get-started\",\n order: 0,\n lede: \"What NexPress is, what it isn't, and who it's for.\",\n stableSince: \"Stable since 0.1\",\n }),\n stubDoc({\n title: \"Install\",\n parentSlug: \"get-started\",\n order: 1,\n stableSince: \"Stable since 0.1\",\n }),\n stubDoc({ title: \"Project structure\", parentSlug: \"get-started\", order: 2 }),\n stubDoc({ title: \"Configuration\", parentSlug: \"get-started\", order: 3 }),\n stubDoc({ title: \"Deployment\", parentSlug: \"get-started\", order: 4 }),\n\n stubDoc({\n title: \"Core concepts\",\n order: 1,\n lede: \"The model behind collections, themes, plugins, and blocks.\",\n }),\n stubDoc({\n title: \"Collections\",\n parentSlug: \"core-concepts\",\n order: 0,\n stableSince: \"Stable since 0.1\",\n }),\n stubDoc({ title: \"Pages & routing\", parentSlug: \"core-concepts\", order: 1 }),\n stubDoc({ title: \"Themes\", parentSlug: \"core-concepts\", order: 2 }),\n stubDoc({ title: \"Blocks\", parentSlug: \"core-concepts\", order: 3 }),\n stubDoc({ title: \"Hooks & access\", parentSlug: \"core-concepts\", order: 4 }),\n stubDoc({ title: \"Internationalization\", parentSlug: \"core-concepts\", order: 5 }),\n\n stubDoc({\n title: \"Plugins\",\n order: 2,\n lede: \"Extend NexPress with hooks, routes, blocks, and scheduled jobs.\",\n }),\n stubDoc({ title: \"Overview\", parentSlug: \"plugins\", order: 0 }),\n {\n title: \"Plugin author quickstart\",\n excerpt: 'From \"I want to add behavior\" to a running plugin in ten minutes.',\n content: QUICKSTART_BODY,\n publishedAt: DOCS_NOW,\n kind: \"doc\",\n parentSlug: \"plugins\",\n order: 1,\n data: {\n badge: \"NEW\",\n lede: 'From \"I want to add behavior\" to a running plugin in ten minutes.',\n stableSince: \"Stable since 0.1\",\n },\n },\n stubDoc({ title: \"Manifest\", parentSlug: \"plugins\", order: 2 }),\n stubDoc({ title: \"Lifecycle\", parentSlug: \"plugins\", order: 3 }),\n stubDoc({ title: \"Publishing\", parentSlug: \"plugins\", order: 4 }),\n\n stubDoc({\n title: \"Reference\",\n order: 3,\n lede: \"API surface — CLI, define* helpers, server functions.\",\n }),\n stubDoc({ title: \"CLI\", parentSlug: \"reference\", order: 0 }),\n stubDoc({ title: \"defineCollection\", parentSlug: \"reference\", order: 1, badge: \"API\" }),\n stubDoc({ title: \"defineTheme\", parentSlug: \"reference\", order: 2 }),\n stubDoc({ title: \"definePlugin\", parentSlug: \"reference\", order: 3 }),\n stubDoc({ title: \"Server functions\", parentSlug: \"reference\", order: 4, badge: \"BETA\" }),\n];\n\n/**\n * `@nexpress/theme-docs` — documentation theme for NexPress.\n *\n * Three-column reference-docs layout: sticky search-first header\n * (brand mark + version pill + ⌘K search + primary nav + GitHub\n * link), hierarchical sidebar with bullet-eyebrow groups + nested\n * links + status badges, centered article column with breadcrumbs\n * + lede + meta pills + Lexical body, on-this-page TOC on the\n * right. Sidebar collapses out at the tablet breakpoint; TOC\n * collapses out below 1100px.\n *\n * Pairs with `posts` rows of `kind: \"doc\"`\n * (universal-content-model #748 — docs are posts with a kind\n * discriminator, not a separate collection). The doc-specific\n * fields (`lede`, `stableSince`) are contributed via\n * `requires.collections.posts.fields` and merged onto the\n * built-in posts collection at config-resolution time.\n *\n * `seedContent.navigation` ships the primary header / footer\n * links. Doc rows are operator-authored; themes that want to\n * seed kind=\"doc\" content use `seedContent.posts` with the\n * `kind` field set on each entry (see U.1 #749).\n */\nexport const docsTheme = defineTheme({\n manifest: {\n id: \"docs\",\n name: \"Docs\",\n version: \"0.2.0\",\n description:\n \"Documentation theme — three-column layout with hierarchical sidebar, breadcrumbs + lede + meta pills on the article column, on-this-page TOC on the right rail. Blue accent on a near-white surface; pairs with a `docs` collection.\",\n author: { name: \"NexPress\" },\n nexpress: { minVersion: \"0.1.0\" },\n requires: {\n collections: {\n posts: {\n // Universal-content-model #748 — docs are posts with\n // `kind: \"doc\"`. The framework's built-in `posts`\n // collection already supplies `title` / `body` /\n // `parent` (rel→posts) / `order`. Docs theme adds the\n // doc-specific meta pills and contributes the kind\n // option + kinds metadata block for admin / URL\n // routing.\n fields: {\n kind: {\n type: \"select\",\n options: [{ label: \"Doc\", value: \"doc\" }],\n },\n // Short opening paragraph rendered as a lede under\n // the h1. Optional — the article still renders\n // without it. Lives in a \"Docs\" sidebar group with\n // `stableSince`; the group + fields hide entirely\n // when the active kind isn't `\"doc\"`.\n lede: {\n type: \"textarea\",\n hard: false,\n admin: {\n position: \"sidebar\",\n group: \"Docs\",\n condition: { when: \"kind\", equals: \"doc\" },\n },\n },\n // Meta-pill slot — advisory hint the doc-page\n // template surfaces in the strap row. Note: portfolio\n // theme also contributes a `badge: text` field on\n // posts; the merge-requirements union picks the first\n // declarer. Docs reads `doc.badge` regardless of which\n // theme declared the column.\n stableSince: {\n type: \"text\",\n hard: false,\n admin: {\n position: \"sidebar\",\n group: \"Docs\",\n condition: { when: \"kind\", equals: \"doc\" },\n },\n },\n },\n groupMeta: {\n Docs: {\n icon: \"BookOpen\",\n description: \"Doc-specific meta — lede and API stability hint.\",\n },\n },\n kinds: {\n doc: {\n label: \"Doc\",\n labelPlural: \"Documentation\",\n icon: \"BookOpen\",\n // Public-site URL pattern. The catch-all router\n // matches `/docs/<slug>` and queries posts with\n // `where: { kind: \"doc\", slug }`.\n urlPattern: \"/docs/:slug\",\n // Hint to admin: show parent + order controls and\n // render the list as a tree, not a flat table.\n hierarchical: true,\n },\n },\n },\n },\n },\n settingsSchema: docsSettingsSchema,\n },\n impl: {\n shell: DocsShell,\n slots: {\n header: DocsHeader,\n sidebar: DocsSidebar,\n },\n css: docsCss,\n tokens: {\n colors: {\n primary: \"#2563eb\",\n primaryForeground: \"#ffffff\",\n // 10% tint of primary — equivalent to the color-mix\n // fallback in styles.ts, but materialised so the\n // generated theme CSS picks it up explicitly.\n primarySoft: \"rgba(37, 99, 235, 0.1)\",\n background: \"#fbfcfe\",\n foreground: \"#0c1320\",\n muted: \"#f1f4f9\",\n mutedForeground: \"#5b6478\",\n border: \"#e2e7ef\",\n card: \"#ffffff\",\n },\n typography: {\n fontHeading:\n '\"Geist\", -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, sans-serif',\n fontBody:\n '\"Geist\", -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, sans-serif',\n fontMono:\n '\"Geist Mono\", ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace',\n },\n shape: {\n radiusSm: \"5px\",\n radiusMd: \"9px\",\n radiusLg: \"10px\",\n },\n },\n seedContent: {\n navigation: SEED_NAV,\n pages: SEED_PAGES,\n posts: SEED_DOCS,\n },\n templates: {\n pages: {\n front: {\n label: \"Front page\",\n description:\n 'Docs landing — hero + 2x2 group cards walking the kind=\"doc\" tree + recently-updated row. The seeded home page (slug \"/\") ships with this template.',\n component: PageFrontTemplate,\n },\n apiReference: {\n label: \"API reference\",\n description: \"Docs reference page with signature, parameter table, and return contract.\",\n component: PageApiReferenceTemplate,\n },\n changelog: {\n label: \"Changelog\",\n description: \"Reverse-chronological release timeline with typed change labels.\",\n component: PageChangelogTemplate,\n },\n },\n // Universal-content-model #748 — docs are posts with\n // `kind: \"doc\"`. The template key matches the kind value so\n // the per-kind template lookup picks this up automatically.\n // Article-kind posts continue rendering through the\n // framework's inline article markup unless the operator\n // declares a `templates.posts.default` of their own.\n posts: {\n doc: {\n label: \"Doc page\",\n description:\n \"Three-column reference layout — breadcrumbs + lede + meta + Lexical body + feedback + prev/next, with the docs sidebar slotted on the left and the on-page TOC on the right.\",\n component: DocPageTemplate,\n },\n },\n },\n routes: [\n // F.2 — docs theme's scoped search route. Lives at\n // `/docs/search` rather than `/search` (#609): the host's\n // reference app has an app-explicit `/search` page route\n // that takes precedence over theme routes per the locked\n // dispatch order (app file > page > theme > plugin). The\n // theme can't override the universal search page, so it\n // scopes its own search to a `/docs/*` namespace and the\n // operator gets both routes: framework `/search` + docs\n // theme `/docs/search`.\n //\n // Order matters: search comes first so `/docs/search` is\n // matched as a literal rather than `{ slug: \"search\" }`\n // by the parametric detail route below (dispatcher is\n // first-match-wins).\n { pattern: \"/docs/search\", component: DocsSearch },\n // Doc detail dispatch. The sidebar + template emit\n // `/docs/<slug>` links; the route component looks up the\n // doc-kind post by slug and renders through DocPageTemplate.\n // Universal-content-model #748 — docs are posts with\n // `kind=\"doc\"`; the lookup filters on kind, not collection.\n { pattern: \"/docs/:slug\", component: DocsDetailRoute },\n ],\n navLocations: {\n header: {\n label: \"Primary header nav\",\n description: \"Inline links beside the masthead search box.\",\n maxItems: 5,\n },\n },\n notFound: DocsNotFound,\n // M.* adoption (2026-05-11). Docs gains purpose-built member\n // chrome: drops the docs sidebar (hierarchical doc nav is\n // useless on auth forms), keeps the masthead, narrows the\n // content column. Without this, the fallback chain would\n // walk back to `impl.shell` (the 3-column grid) and the\n // sidebar slot would surface alongside an auth form.\n // - `shell`: DocsMembersShell (header + narrow column, no\n // sidebar).\n // - `notFound`: DocsMembersNotFound (stale-auth-link framing\n // with /members/login CTA, monospace accent matching the\n // theme).\n // - `error`: forward-compat type marker; the actual render\n // goes through `./components/members-error`'s client\n // subpath, lazy-imported by\n // `apps/web/src/app/(member)/error.tsx`'s registry\n // (F.7.1 delegation — Next mandates `error.tsx` is \"use\n // client\").\n members: {\n shell: DocsMembersShell,\n notFound: DocsMembersNotFound,\n },\n blocks: docsBlocks,\n },\n});\n\nexport {\n CopyButton,\n DocsHeader,\n DocsShell,\n DocsSidebar,\n DocsNotFound,\n DocsMembersShell,\n DocsMembersNotFound,\n DocsSearch,\n DocPageTemplate,\n PageApiReferenceTemplate,\n PageChangelogTemplate,\n};\nexport { docsBlocks } from \"./blocks/index.js\";\nexport { docsCss };\nexport { docsSettingsSchema, type DocsSettings } from \"./settings.js\";\n","// Sibling-depth re-export of the client CopyButton component.\n//\n// Same shape as `toc-scrollspy-bridge.ts` — tsup's `external` rule\n// matches the import specifier verbatim, and a parent-relative spec\n// from `src/blocks/` or `src/templates/` would bake\n// `\"../components/...\"` into `dist/index.js` and escape the dist\n// root at consume time. Routing through this sibling-depth bridge\n// keeps the bundled specifier at `./components/copy-button.js`,\n// which the package's `external` list matches.\nexport { CopyButton } from \"./components/copy-button.js\";\n","import * as React from \"react\";\nimport type { NpBlockDefinition } from \"@nexpress/blocks\";\n\nimport { CopyButton } from \"../copy-button-bridge.js\";\n\nconst readString = (value: unknown, fallback: string): string =>\n typeof value === \"string\" && value.trim().length > 0 ? value : fallback;\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === \"object\" && value !== null && !Array.isArray(value);\n\nconst CALLOUT_VARIANTS = [\"default\", \"note\", \"warn\", \"danger\"] as const;\ntype CalloutVariant = (typeof CALLOUT_VARIANTS)[number];\n\nfunction readCalloutVariant(value: unknown): CalloutVariant {\n if (typeof value === \"string\") {\n for (const candidate of CALLOUT_VARIANTS) {\n if (candidate === value) return candidate;\n }\n }\n return \"default\";\n}\n\nfunction CalloutIcon({ variant }: { variant: CalloutVariant }): React.ReactElement {\n if (variant === \"warn\") {\n return (\n <svg\n width=\"18\"\n height=\"18\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n <path d=\"M10.29 3.86 1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0Z\" />\n <line x1=\"12\" y1=\"9\" x2=\"12\" y2=\"13\" />\n <line x1=\"12\" y1=\"17\" x2=\"12.01\" y2=\"17\" />\n </svg>\n );\n }\n if (variant === \"danger\") {\n return (\n <svg\n width=\"18\"\n height=\"18\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n <polygon points=\"7.86 2 16.14 2 22 7.86 22 16.14 16.14 22 7.86 22 2 16.14 2 7.86 7.86 2\" />\n <line x1=\"15\" y1=\"9\" x2=\"9\" y2=\"15\" />\n <line x1=\"9\" y1=\"9\" x2=\"15\" y2=\"15\" />\n </svg>\n );\n }\n return (\n <svg\n width=\"18\"\n height=\"18\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <line x1=\"12\" y1=\"16\" x2=\"12\" y2=\"12\" />\n <line x1=\"12\" y1=\"8\" x2=\"12.01\" y2=\"8\" />\n </svg>\n );\n}\n\nconst docsCalloutBlock: NpBlockDefinition = {\n type: \"docsCallout\",\n label: \"Callout\",\n description: \"Highlighted note / warning / danger panel with a leading icon.\",\n icon: \"Info\",\n iconKind: \"lucide\",\n summaryFields: [\"title\"],\n category: \"Content\",\n source: \"theme\",\n keywords: [\"note\", \"warning\", \"danger\", \"admonition\", \"info\"],\n defaultProps: {\n variant: \"default\",\n title: \"Heads up\",\n body: \"Add context that an operator should not miss when scanning the page.\",\n },\n propsSchema: [\n {\n name: \"variant\",\n label: \"Variant\",\n type: \"select\",\n defaultValue: \"default\",\n options: [\n { label: \"Default\", value: \"default\" },\n { label: \"Note\", value: \"note\" },\n { label: \"Warning\", value: \"warn\" },\n { label: \"Danger\", value: \"danger\" },\n ],\n },\n { name: \"title\", label: \"Title\", type: \"text\", defaultValue: \"Heads up\" },\n {\n name: \"body\",\n label: \"Body\",\n type: \"textarea\",\n defaultValue: \"Add context that an operator should not miss when scanning the page.\",\n },\n ],\n render: (props) => {\n const variant = readCalloutVariant(props.variant);\n const title = readString(props.title, \"Heads up\");\n const body = readString(props.body, \"\");\n return (\n <aside className={`np-docs-callout np-docs-callout--${variant}`}>\n <CalloutIcon variant={variant} />\n <div>\n <div className=\"np-docs-callout-title\">{title}</div>\n {body ? <p>{body}</p> : null}\n </div>\n </aside>\n );\n },\n};\n\nconst docsCodePanelBlock: NpBlockDefinition = {\n type: \"docsCodePanel\",\n label: \"Code panel\",\n description: \"Dark code surface with filename, language pill, and copy button.\",\n icon: \"Code2\",\n iconKind: \"lucide\",\n summaryFields: [\"filename\", \"language\"],\n category: \"Content\",\n source: \"theme\",\n keywords: [\"code\", \"snippet\", \"syntax\", \"block\"],\n defaultProps: {\n filename: \"example.ts\",\n language: \"ts\",\n source: 'export const greeting = \"hello\";',\n },\n propsSchema: [\n {\n name: \"filename\",\n label: \"Filename\",\n type: \"text\",\n defaultValue: \"example.ts\",\n },\n {\n name: \"language\",\n label: \"Language\",\n type: \"text\",\n defaultValue: \"ts\",\n },\n {\n name: \"source\",\n label: \"Source\",\n type: \"textarea\",\n rows: 10,\n defaultValue: 'export const greeting = \"hello\";',\n },\n ],\n render: (props) => {\n const filename = readString(props.filename, \"\");\n const language = readString(props.language, \"\");\n const source = readString(props.source, \"\");\n return (\n <div className=\"np-docs-code\">\n <div className=\"np-docs-code-head\">\n <span className=\"np-docs-code-file\">\n {filename ? <span>{filename}</span> : null}\n {language ? <span className=\"np-docs-brand-version\">{language}</span> : null}\n </span>\n <CopyButton text={source} />\n </div>\n <pre>\n <code>{source}</code>\n </pre>\n </div>\n );\n },\n};\n\nconst docsShellCommandBlock: NpBlockDefinition = {\n type: \"docsShellCommand\",\n label: \"Shell command\",\n description: \"Inline terminal-style command snippet with a copy button.\",\n icon: \"Terminal\",\n iconKind: \"lucide\",\n summaryFields: [\"command\"],\n category: \"Content\",\n source: \"theme\",\n keywords: [\"terminal\", \"shell\", \"bash\", \"command\", \"cli\"],\n defaultProps: {\n prompt: \"$\",\n command: \"pnpm install\",\n },\n propsSchema: [\n { name: \"prompt\", label: \"Prompt\", type: \"text\", defaultValue: \"$\" },\n {\n name: \"command\",\n label: \"Command\",\n type: \"text\",\n defaultValue: \"pnpm install\",\n },\n ],\n render: (props) => {\n const prompt = readString(props.prompt, \"$\");\n const command = readString(props.command, \"\");\n return (\n <div className=\"np-docs-cmdline\">\n <span className=\"np-docs-cmdline-prompt\">{prompt}</span>\n <code className=\"np-docs-cmdline-cmd\">{command}</code>\n <CopyButton text={command} className=\"np-docs-cmdline-copy\" />\n </div>\n );\n },\n};\n\ninterface StepItem {\n title: string;\n body: string;\n}\n\nfunction readSteps(value: unknown): StepItem[] {\n if (!Array.isArray(value)) return [];\n return value.filter(isRecord).map((item) => ({\n title: readString(item.title, \"Step\"),\n body: readString(item.body, \"\"),\n }));\n}\n\nconst docsStepsBlock: NpBlockDefinition = {\n type: \"docsSteps\",\n label: \"Steps\",\n description: \"Numbered checklist of ordered steps.\",\n icon: \"ListOrdered\",\n iconKind: \"lucide\",\n category: \"Content\",\n source: \"theme\",\n keywords: [\"steps\", \"checklist\", \"ordered\", \"numbered\", \"tutorial\"],\n defaultProps: {\n items: [\n { title: \"Install\", body: \"Add the package to your workspace.\" },\n { title: \"Configure\", body: \"Wire it into the bootstrap.\" },\n { title: \"Run\", body: \"Boot the dev server and verify.\" },\n ],\n },\n propsSchema: [\n {\n name: \"items\",\n label: \"Steps\",\n type: \"array\",\n defaultValue: [\n { title: \"Install\", body: \"Add the package to your workspace.\" },\n { title: \"Configure\", body: \"Wire it into the bootstrap.\" },\n { title: \"Run\", body: \"Boot the dev server and verify.\" },\n ],\n itemDefault: { title: \"New step\", body: \"\" },\n itemSchema: [\n { name: \"title\", label: \"Title\", type: \"text\", defaultValue: \"New step\" },\n { name: \"body\", label: \"Body\", type: \"textarea\", defaultValue: \"\" },\n ],\n },\n ],\n render: (props) => {\n const items = readSteps(props.items);\n if (items.length === 0) return <ol className=\"np-docs-steps\" />;\n return (\n <ol className=\"np-docs-steps\">\n {items.map((step, index) => (\n <li key={`step-${index.toString()}`}>\n <div className=\"np-docs-step-title\">{step.title}</div>\n {step.body ? <p className=\"np-docs-step-body\">{step.body}</p> : null}\n </li>\n ))}\n </ol>\n );\n },\n};\n\ninterface ApiRow {\n cells: string[];\n required: boolean;\n}\n\nconst docsApiTableBlock: NpBlockDefinition = {\n type: \"docsApiTable\",\n label: \"API table\",\n description: \"Reference table with uppercase mono headers and a required pill.\",\n icon: \"Table\",\n iconKind: \"lucide\",\n category: \"Content\",\n source: \"theme\",\n keywords: [\"api\", \"reference\", \"table\", \"schema\", \"props\"],\n defaultProps: {\n columns: [\"Name\", \"Type\", \"Description\"],\n rows: [\n { cells: [\"slug\", \"string\", \"Unique URL fragment.\"], required: true },\n { cells: [\"title\", \"string\", \"Document title.\"], required: true },\n { cells: [\"body\", \"RichText\", \"Lexical body content.\"], required: false },\n ],\n },\n propsSchema: [\n {\n name: \"columns\",\n label: \"Columns\",\n type: \"array\",\n defaultValue: [\"Name\", \"Type\", \"Description\"],\n itemDefault: { value: \"Column\" },\n itemSchema: [{ name: \"value\", label: \"Header\", type: \"text\", defaultValue: \"Column\" }],\n },\n {\n name: \"rows\",\n label: \"Rows\",\n type: \"array\",\n defaultValue: [{ cells: [\"slug\", \"string\", \"Unique URL fragment.\"], required: true }],\n itemDefault: { cells: [], required: false },\n itemSchema: [\n {\n name: \"cells\",\n label: \"Cells\",\n type: \"array\",\n defaultValue: [],\n itemDefault: { value: \"\" },\n itemSchema: [{ name: \"value\", label: \"Cell\", type: \"text\", defaultValue: \"\" }],\n },\n {\n name: \"required\",\n label: \"Required\",\n type: \"boolean\",\n defaultValue: false,\n },\n ],\n },\n ],\n render: (props) => {\n // The propsSchema `array.itemSchema` UI nests cell objects with a\n // `{ value }` shape; runtime / seed data ships flat string arrays.\n // Normalise both shapes back to `string[]` so the seeded fixtures\n // and the admin-authored data render identically.\n const rawColumns: unknown = props.columns;\n const columns = Array.isArray(rawColumns)\n ? rawColumns.map((entry) => {\n if (typeof entry === \"string\") return entry;\n if (isRecord(entry) && typeof entry.value === \"string\") return entry.value;\n return \"\";\n })\n : [];\n const rawRows = Array.isArray(props.rows) ? props.rows : [];\n const rows: ApiRow[] = rawRows.filter(isRecord).map((row) => {\n const cellsRaw: unknown = row.cells;\n const cells = Array.isArray(cellsRaw)\n ? cellsRaw.map((entry) => {\n if (typeof entry === \"string\") return entry;\n if (isRecord(entry) && typeof entry.value === \"string\") return entry.value;\n return \"\";\n })\n : [];\n return { cells, required: row.required === true };\n });\n if (columns.length === 0 && rows.length === 0) {\n return <table className=\"np-docs-table\" />;\n }\n return (\n <table className=\"np-docs-table\">\n <thead>\n <tr>\n {columns.map((col, i) => (\n <th key={`col-${i.toString()}`}>{col}</th>\n ))}\n </tr>\n </thead>\n <tbody>\n {rows.map((row, i) => (\n <tr key={`row-${i.toString()}`}>\n {row.cells.map((cell, j) => {\n const isFirst = j === 0;\n return (\n <td key={`cell-${i.toString()}-${j.toString()}`}>\n {isFirst ? <code>{cell}</code> : cell}\n {isFirst && row.required ? (\n <span className=\"np-docs-table-required\">required</span>\n ) : null}\n </td>\n );\n })}\n </tr>\n ))}\n </tbody>\n </table>\n );\n },\n};\n\nexport const docsBlocks: NpBlockDefinition[] = [\n docsCalloutBlock,\n docsCodePanelBlock,\n docsShellCommandBlock,\n docsStepsBlock,\n docsApiTableBlock,\n];\n\nvoid (0 as React.ReactNode | undefined);\n","import * as React from \"react\";\nimport { NavMenu, getCachedSite } from \"@nexpress/next\";\n\nimport { SearchKeyboardShortcut } from \"./components/search-keyboard-shortcut.js\";\nimport { resolveDocsSettings } from \"./settings-helpers.js\";\n\nconst FALLBACK_SITE_NAME = \"NexPress\";\n\n/**\n * Docs theme masthead. Brand strap (mark + wordmark + version\n * pill) on the left, ⌘K search form centered, primary nav on\n * the right — three intrinsic-width columns with the search\n * filling the middle track.\n *\n * Search is a plain GET form to `/docs/search` — the theme's\n * own route handles the query so the host's `(site)/search`\n * page doesn't shadow it (#609). The ⌘K affordance is purely\n * visual hint copy in a `<kbd>`; the `<SearchKeyboardShortcut>`\n * client island wires the actual focus shortcut.\n *\n * Operators who want a GitHub link in the header add it via the\n * primary nav (Settings → Menus → header), pointing at\n * `settings.githubRepo`. The doc-page footer's \"Edit this\n * page\" / \"Report issue\" links continue to read the same setting\n * independently.\n */\nexport async function DocsHeader(): Promise<React.ReactElement> {\n const [settings, site] = await Promise.all([\n resolveDocsSettings(),\n getCachedSite(),\n ]);\n const siteName = site?.name?.trim() || FALLBACK_SITE_NAME;\n return (\n <header className=\"np-docs-header\">\n <div className=\"np-docs-header-inner\">\n <a href=\"/\" className=\"np-docs-brand\">\n <span className=\"np-docs-brand-mark\" aria-hidden=\"true\" />\n <span>{siteName}</span>\n <span className=\"np-docs-brand-version\">{settings.version}</span>\n </a>\n <form\n action=\"/docs/search\"\n method=\"get\"\n className=\"np-docs-search-form\"\n role=\"search\"\n >\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n aria-hidden=\"true\"\n >\n <circle cx=\"11\" cy=\"11\" r=\"7\" />\n <path d=\"m21 21-4.3-4.3\" />\n </svg>\n <label className=\"sr-only\" htmlFor=\"np-docs-search-input\">\n Search the docs\n </label>\n <input\n id=\"np-docs-search-input\"\n type=\"search\"\n name=\"q\"\n placeholder={settings.searchPlaceholder}\n className=\"np-docs-search-input\"\n />\n <kbd className=\"np-docs-search-kbd\">⌘K</kbd>\n </form>\n <SearchKeyboardShortcut targetId=\"np-docs-search-input\" />\n <nav className=\"np-docs-nav\" aria-label=\"Primary\">\n <NavMenu location=\"header\" className=\"np-docs-primary-nav\" />\n </nav>\n </div>\n </header>\n );\n}\n","import { getCachedThemeSettings } from \"@nexpress/next\";\n\nimport { docsSettingsSchema, type DocsSettings } from \"./settings.js\";\n\n/**\n * Phase F.9-B / F.9.1-B — typed accessor over the cached theme\n * settings read.\n *\n * Uses `getCachedThemeSettings` so multiple resolveSettings()\n * calls in the same request (header + sidebar + page template +\n * search) share one DB hit via Next's `unstable_cache`. The\n * `nx:theme:<siteId>` tag handles invalidation.\n *\n * On parse failure (theme upgrade changed the shape, etc.)\n * falls back to the schema defaults. The admin's\n * `getThemeSettingsWithStatus` surfaces a banner when this\n * happens; the runtime keeps rendering with safe values.\n */\nexport async function resolveDocsSettings(): Promise<DocsSettings> {\n const raw = await getCachedThemeSettings(\"docs\");\n const parsed = docsSettingsSchema.safeParse(raw);\n if (parsed.success) return parsed.data;\n return docsSettingsSchema.parse({});\n}\n","import { z } from \"zod\";\n\n/**\n * Phase F.9-B — operator-tunable docs settings.\n *\n * Stresses F.3's settings auto-form on a different axis from\n * magazine: more URL inputs, a select/enum for sidebar\n * orientation, and a documentation-flavored field set.\n */\nexport const docsSettingsSchema = z.object({\n version: z\n .string()\n .default(\"v1\")\n .describe(\n \"Currently-displayed version label, shown in the masthead. Update on each release.\",\n ),\n githubRepo: z\n .string()\n .url()\n .optional()\n .describe(\n \"Optional repository URL — when set, page templates render an 'Edit on GitHub' link in the prev/next bar.\",\n ),\n githubBranch: z\n .string()\n .default(\"main\")\n .describe(\n \"Branch the 'Edit on GitHub' link points at. Default 'main' — change to 'master' / 'docs' / whatever the repo uses.\",\n ),\n githubDocsPath: z\n .string()\n .default(\"docs\")\n .describe(\n \"Path under the repo where doc source files live. Joined with the doc slug to build the edit link target.\",\n ),\n githubExtension: z\n .string()\n .default(\".md\")\n .describe(\n \"File extension appended to the slug when building the edit link (e.g. '.md', '.mdx'). Include the leading dot.\",\n ),\n sidebarHeading: z\n .string()\n .default(\"Documentation\")\n .describe(\"Heading shown above the hierarchical sidebar nav.\"),\n showTableOfContents: z\n .boolean()\n .default(true)\n .describe(\"Render the in-page TOC sidebar on doc pages.\"),\n searchPlaceholder: z\n .string()\n .default(\"Search the docs…\")\n .describe(\"Placeholder text for the search input in the masthead.\"),\n});\n\nexport type DocsSettings = z.infer<typeof docsSettingsSchema>;\n","import * as React from \"react\";\n\n/**\n * Docs theme's member-tree 404.\n *\n * Mirrors `DocsNotFound`'s technical voice but tuned for the\n * member context — CTA points at `/members/login` rather than\n * the docs index, and the copy acknowledges stale auth links\n * (the dominant cause of 404s inside `/members/*`).\n *\n * Server component; rendered by `(member)/not-found.tsx` when\n * the active theme is docs and `impl.members.notFound` is\n * declared.\n *\n * Renders a `<div>`, not `<main>`, because the framework's\n * `<ShellWrap surface=\"member\">` already emits the page's\n * `<main className=\"np-member-main\">` landmark.\n */\nexport function DocsMembersNotFound(): React.ReactElement {\n return (\n <div\n className=\"np-docs-members-not-found\"\n style={{\n maxWidth: 520,\n margin: \"5rem auto\",\n padding: \"0 1.5rem\",\n }}\n >\n <p\n style={{\n margin: 0,\n fontSize: \"0.75rem\",\n textTransform: \"uppercase\",\n letterSpacing: \"0.12em\",\n color: \"var(--np-color-muted-foreground)\",\n fontFamily: \"var(--np-font-mono, ui-monospace, monospace)\",\n }}\n >\n 404 · account\n </p>\n <h1\n style={{\n margin: \"0.75rem 0 0\",\n fontSize: \"1.875rem\",\n fontFamily: \"var(--np-font-heading)\",\n fontWeight: 600,\n lineHeight: 1.2,\n }}\n >\n That account link is no longer valid.\n </h1>\n <p\n style={{\n margin: \"1.25rem 0 0\",\n color: \"var(--np-color-muted-foreground)\",\n fontSize: \"0.9375rem\",\n lineHeight: 1.6,\n }}\n >\n Verification and password-reset links are single-use and expire after a\n short window. Open the sign-in page and request a fresh one.\n </p>\n <p style={{ margin: \"1.75rem 0 0\" }}>\n <a\n href=\"/members/login\"\n style={{\n display: \"inline-block\",\n padding: \"0.5rem 1.25rem\",\n borderRadius: \"0.375rem\",\n background: \"var(--np-color-primary)\",\n color: \"var(--np-color-primary-foreground)\",\n textDecoration: \"none\",\n fontSize: \"0.875rem\",\n fontWeight: 500,\n }}\n >\n Go to sign in\n </a>\n </p>\n </div>\n );\n}\n","import type { ReactNode } from \"react\";\n\nimport { DocsHeader } from \"./header.js\";\n\n/**\n * Docs theme's member-tree shell.\n *\n * Drops the docs sidebar (which is hierarchical-doc navigation —\n * useless on auth forms) and renders a narrow column under the\n * masthead. Reuses `DocsHeader` directly so a masthead bump\n * cascades to member pages — single source of truth for chrome.\n *\n * Skips the public `DocsShell`'s 3-column grid because the\n * `<ShellWrap surface=\"member\">` fallback chain only invokes\n * `impl.members.shell` (this component); the public shell never\n * wraps the member tree.\n */\nexport function DocsMembersShell({ children }: { children: ReactNode }) {\n return (\n <div className=\"np-docs np-docs-shell\">\n <DocsHeader />\n <div className=\"np-docs-members\">\n <div className=\"np-docs-members-column\">{children}</div>\n </div>\n </div>\n );\n}\n","import * as React from \"react\";\n\n/**\n * Phase F.9-B — docs 404.\n *\n * Tighter / less editorial than magazine's; suggests search +\n * homepage as next steps.\n */\nexport function DocsNotFound(): React.ReactElement {\n // `<div>` — (site)/layout.tsx already emits the page's `<main>`.\n return (\n <div\n className=\"np-docs-not-found\"\n style={{\n maxWidth: 560,\n margin: \"5rem auto\",\n padding: \"0 1.5rem\",\n }}\n >\n <p\n style={{\n margin: 0,\n fontSize: \"0.75rem\",\n textTransform: \"uppercase\",\n letterSpacing: \"0.08em\",\n color: \"var(--np-color-muted-foreground)\",\n }}\n >\n 404 — Not found\n </p>\n <h1 style={{ margin: \"0.75rem 0 0.5rem\", fontSize: \"1.75rem\" }}>\n That page isn't in the docs.\n </h1>\n <p\n style={{\n margin: \"0.75rem 0 1.5rem\",\n color: \"var(--np-color-muted-foreground)\",\n }}\n >\n It may have been renamed or merged into another section. Try the\n search bar in the header, or head to the homepage.\n </p>\n <a\n href=\"/\"\n style={{\n display: \"inline-block\",\n padding: \"0.4rem 1rem\",\n borderRadius: \"0.375rem\",\n background: \"var(--np-color-primary)\",\n color: \"var(--np-color-primary-foreground)\",\n textDecoration: \"none\",\n fontWeight: 500,\n }}\n >\n Homepage\n </a>\n </div>\n );\n}\n","import { findDocuments } from \"@nexpress/core\";\nimport type { NpRouteRenderProps, NpTemplateRenderProps } from \"@nexpress/theme\";\nimport { notFound } from \"next/navigation\";\nimport * as React from \"react\";\n\nimport { DocPageTemplate } from \"../templates/doc-page.js\";\n\n/**\n * Theme route for `/docs/:slug` — looks up a doc-kind post and\n * renders it through `DocPageTemplate`.\n *\n * Universal-content-model #748: docs are posts with `kind=\"doc\"`.\n * The framework's catch-all also matches `/docs/:slug` via the\n * theme's `kinds.doc.urlPattern` metadata; this explicit theme\n * route stays for two reasons:\n *\n * 1. It's the supported path for theme-internal navigation\n * that bypasses the kinds-metadata dispatcher (prev/next,\n * sidebar links).\n * 2. It runs ahead of the kinds dispatcher in the precedence\n * order so a future themes feature that needs to wrap\n * doc-page rendering (e.g. signing-aware drafts) can hook\n * in here without touching the framework.\n *\n * Membership / access: same path the catch-all uses for `pages`\n * — `findDocuments` already enforces `access.read` and\n * `community.visibility` so we don't need to gate here.\n */\n\ninterface DocsRow {\n id: string;\n slug: string;\n title: string;\n body?: unknown;\n parent?: string | null;\n order?: number;\n status?: string;\n excerpt?: string;\n kind?: string;\n}\n\nexport async function DocsDetailRoute({\n params,\n blockCtx,\n}: NpRouteRenderProps): Promise<React.ReactElement> {\n const slug = typeof params.slug === \"string\" ? params.slug : \"\";\n if (!slug) notFound();\n\n const result = await findDocuments<DocsRow>(\"posts\", {\n where: { slug, status: \"published\", kind: \"doc\" },\n limit: 1,\n });\n const doc = result.docs[0];\n if (!doc) notFound();\n\n // `DocPageTemplate`'s prop generic defaults to\n // `Record<string, unknown>` — cast through `unknown` so our\n // narrower `DocsRow` shape (which doesn't carry an index\n // signature) matches the template's contract.\n const templateProps: NpTemplateRenderProps = {\n doc: doc as unknown as Record<string, unknown>,\n blockCtx,\n };\n return <DocPageTemplate {...templateProps} />;\n}\n","import * as React from \"react\";\nimport type { NpTemplateRenderProps } from \"@nexpress/theme\";\nimport { findDocuments, type NpRichTextContent } from \"@nexpress/core\";\nimport { extractHeadingToc, renderRichText } from \"@nexpress/editor/server\";\n\n// Routed via a sibling-depth bridge module (`../toc-scrollspy-\n// bridge.js`) rather than `../components/toc-scrollspy.js`\n// directly: tsup's `external` rule matches the import specifier\n// verbatim, and a parent-relative spec at this depth would\n// preserve `\"../components/...\"` in the bundled `dist/index.js`\n// (escapes dist at consume time). The bridge re-exports from a\n// sibling-depth path that DOES match the external rule, so the\n// final bundle carries `import \"./components/toc-scrollspy.js\"`\n// which resolves cleanly to `dist/components/toc-scrollspy.js`.\n// A package-subpath self-import was tried first but fails\n// during tsup's parallel dts step (the index dts can't see the\n// component's freshly-written .d.ts in time, TS7016).\nimport { TocScrollspy } from \"../toc-scrollspy-bridge.js\";\nimport { resolveDocsSettings } from \"../settings-helpers.js\";\n\ninterface DocDoc {\n id: string;\n slug: string;\n title: string;\n lede?: string;\n body?: NpRichTextContent;\n content?: NpRichTextContent;\n parent?: string | null;\n order?: number;\n updatedAt?: string | Date;\n publishedAt?: string | Date;\n stableSince?: string;\n readingTime?: number | string;\n}\n\n\n/**\n * Doc page template — three-zone article: header strap\n * (breadcrumbs + h1 + lede + meta pills), Lexical-rendered body,\n * footer (feedback widget + prev/next pair).\n *\n * Breadcrumbs walk the parent chain so a nested doc shows\n * `Docs / Plugins / Author quickstart` without the operator\n * configuring it explicitly. Falls back to a single \"Docs\" entry\n * for root-level pages.\n *\n * Meta pills render only when their data is present:\n *\n * - `stableSince` (e.g. `\"0.1\"`) → green pill `\"Stable since 0.1\"`.\n * - `readingTime` (number or string) → `\"X min read\"` pill.\n * - `updatedAt` → date string after a · separator.\n * - `settings.githubRepo` set → `\"Edit this page →\"` link to GH.\n *\n * Feedback row is static HTML (Yes / Could be better buttons)\n * without a wired endpoint — operators that want a real\n * feedback API drop in their own client island.\n *\n * Prev/next walks the same ordered list the sidebar uses; the\n * doc immediately before / after `current` in render-order wins.\n */\nexport async function DocPageTemplate({\n doc: rawDoc,\n}: NpTemplateRenderProps): Promise<React.ReactElement> {\n const doc = rawDoc as unknown as DocDoc;\n const settings = await resolveDocsSettings();\n const breadcrumbs = await loadBreadcrumbs(doc);\n const navInfo = await loadPrevNext(doc);\n const updatedLabel = formatUpdated(doc.updatedAt ?? doc.publishedAt);\n const readingLabel = readingMinutesLabel(doc.readingTime);\n const editHref = settings.githubRepo\n ? `${settings.githubRepo}/edit/${settings.githubBranch}/${settings.githubDocsPath}/${doc.slug}${settings.githubExtension}`\n : null;\n const richText = doc.body ?? doc.content;\n const toc = extractHeadingToc(richText);\n const reportIssueHref = settings.githubRepo\n ? `${settings.githubRepo}/issues/new`\n : null;\n\n return (\n <>\n <article className=\"np-docs-page\">\n <nav className=\"np-docs-breadcrumbs\" aria-label=\"Breadcrumb\">\n {breadcrumbs.map((crumb, index) => {\n const isLast = index === breadcrumbs.length - 1;\n return (\n <React.Fragment key={`crumb-${index.toString()}-${crumb.slug ?? \"root\"}`}>\n {index > 0 ? (\n <span className=\"np-docs-breadcrumbs-sep\" aria-hidden=\"true\">\n /\n </span>\n ) : null}\n {isLast || !crumb.slug ? (\n <span>{crumb.title}</span>\n ) : (\n <a href={`/docs/${crumb.slug}`}>{crumb.title}</a>\n )}\n </React.Fragment>\n );\n })}\n </nav>\n\n <h1>{doc.title}</h1>\n {doc.lede ? <p className=\"np-docs-page-lede\">{doc.lede}</p> : null}\n\n {(doc.stableSince || readingLabel || updatedLabel || editHref) ? (\n <div className=\"np-docs-page-meta\">\n {doc.stableSince ? (\n <span className=\"np-docs-page-meta-pill status\">\n Stable since {doc.stableSince}\n </span>\n ) : null}\n {readingLabel ? (\n <span className=\"np-docs-page-meta-pill\">{readingLabel}</span>\n ) : null}\n {updatedLabel ? (\n <>\n <span className=\"np-docs-page-meta-sep\" aria-hidden=\"true\">\n ·\n </span>\n <span>Updated {updatedLabel}</span>\n </>\n ) : null}\n {editHref ? (\n <a href={editHref} target=\"_blank\" rel=\"noreferrer\">\n Edit this page →\n </a>\n ) : null}\n </div>\n ) : null}\n\n <div className=\"np-docs-page-body\">\n {richText ? (\n // Core types `NpRichTextContent` as the opaque\n // `Record<string, unknown>`; the editor's renderer\n // refines it to `{ root: ... }`. Structural cast at\n // the boundary — both sides go through the same\n // Lexical serializer.\n renderRichText(\n richText as unknown as Parameters<typeof renderRichText>[0],\n { headingAnchors: true },\n )\n ) : (\n <p style={{ color: \"var(--np-color-muted-foreground)\" }}>\n No body content yet.\n </p>\n )}\n </div>\n\n <div className=\"np-docs-feedback\">\n <div>\n <div className=\"np-docs-feedback-title\">Was this page helpful?</div>\n <div className=\"np-docs-feedback-helper\">\n Operators wire the feedback endpoint via a plugin or a custom\n client island — the form is intentionally inert in v0.1.\n </div>\n </div>\n <div className=\"np-docs-feedback-buttons\">\n <button type=\"button\">Yes</button>\n <button type=\"button\">Could be better</button>\n </div>\n </div>\n\n {navInfo.prev || navInfo.next ? (\n <nav\n className=\"np-docs-prev-next\"\n aria-label=\"Pagination\"\n data-single={\n navInfo.prev && !navInfo.next\n ? \"prev\"\n : navInfo.next && !navInfo.prev\n ? \"next\"\n : undefined\n }\n >\n {navInfo.prev ? (\n <a\n href={`/docs/${navInfo.prev.slug}`}\n className=\"np-docs-prev-next-prev\"\n >\n <div className=\"np-docs-prev-next-dir\">← Previous</div>\n <div className=\"np-docs-prev-next-title\">{navInfo.prev.title}</div>\n </a>\n ) : null}\n {navInfo.next ? (\n <a\n href={`/docs/${navInfo.next.slug}`}\n className=\"np-docs-prev-next-next\"\n >\n <div className=\"np-docs-prev-next-dir\">Next →</div>\n <div className=\"np-docs-prev-next-title\">{navInfo.next.title}</div>\n </a>\n ) : null}\n </nav>\n ) : null}\n </article>\n\n {toc.length > 0 ? (\n <aside className=\"np-docs-toc\" aria-label=\"On this page\">\n <p className=\"np-docs-toc-eyebrow\">On this page</p>\n <ul>\n {toc.map((entry) => (\n <li\n key={`toc-${entry.id}`}\n className={entry.level === 3 ? \"np-docs-toc-l3\" : undefined}\n >\n <a href={`#${entry.id}`}>{entry.text}</a>\n </li>\n ))}\n </ul>\n <TocScrollspy ids={toc.map((entry) => entry.id)} />\n\n {(editHref || reportIssueHref) ? (\n <div className=\"np-docs-toc-secondary\">\n {editHref ? (\n <a href={editHref} target=\"_blank\" rel=\"noreferrer\">\n <svg\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n aria-hidden=\"true\"\n >\n <path d=\"M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7\" />\n <path d=\"m18.5 2.5 3 3L12 15l-4 1 1-4 9.5-9.5z\" />\n </svg>\n Edit on GitHub\n </a>\n ) : null}\n {reportIssueHref ? (\n <a href={reportIssueHref} target=\"_blank\" rel=\"noreferrer\">\n <svg\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n aria-hidden=\"true\"\n >\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <path d=\"M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3\" />\n <line x1=\"12\" y1=\"17\" x2=\"12.01\" y2=\"17\" />\n </svg>\n Report an issue\n </a>\n ) : null}\n </div>\n ) : null}\n </aside>\n ) : null}\n </>\n );\n}\n\ninterface Crumb {\n slug: string | null;\n title: string;\n}\n\nasync function loadBreadcrumbs(current: DocDoc): Promise<Crumb[]> {\n const root: Crumb = { slug: null, title: \"Docs\" };\n if (!current.parent) {\n return [root, { slug: null, title: current.title }];\n }\n // Walk parents in a single bounded query — sidebar already\n // pulls the same list so the row count is small.\n const result = await findDocuments<Record<string, unknown>>(\"posts\", {\n where: { status: \"published\", kind: \"doc\" },\n sort: \"order\",\n limit: 500,\n });\n const byId = new Map<string, DocDoc>();\n for (const r of result.docs as unknown as DocDoc[]) {\n if (r.id) byId.set(r.id, r);\n }\n const chain: Crumb[] = [];\n let cursor: string | null = current.parent;\n let safety = 6;\n while (cursor && safety-- > 0) {\n const node = byId.get(cursor);\n if (!node) break;\n chain.unshift({ slug: node.slug, title: node.title });\n cursor = node.parent ?? null;\n }\n return [root, ...chain, { slug: null, title: current.title }];\n}\n\nasync function loadPrevNext(\n current: DocDoc,\n): Promise<{ prev: DocDoc | null; next: DocDoc | null }> {\n const result = await findDocuments<Record<string, unknown>>(\"posts\", {\n where: { status: \"published\", kind: \"doc\" },\n sort: \"order\",\n limit: 500,\n });\n const docs = result.docs as unknown as DocDoc[];\n const idx = docs.findIndex((d) => d.id === current.id);\n if (idx < 0) return { prev: null, next: null };\n return {\n prev: idx > 0 ? docs[idx - 1] ?? null : null,\n next: idx < docs.length - 1 ? docs[idx + 1] ?? null : null,\n };\n}\n\nfunction formatUpdated(value: DocDoc[\"updatedAt\"]): string | null {\n if (!value) return null;\n try {\n const d = typeof value === \"string\" ? new Date(value) : value;\n if (Number.isNaN(d.getTime())) return null;\n return d.toLocaleDateString(undefined, {\n year: \"numeric\",\n month: \"short\",\n day: \"numeric\",\n });\n } catch {\n return null;\n }\n}\n\nfunction readingMinutesLabel(value: DocDoc[\"readingTime\"]): string | null {\n if (!value && value !== 0) return null;\n if (typeof value === \"number\") return `${value.toString()} min read`;\n return value;\n}\n","// Sibling-depth re-export of the client TocScrollspy component.\n//\n// Why this file exists: `doc-page.tsx` lives at `src/templates/`\n// and needs the client island that lives at\n// `src/components/toc-scrollspy.tsx`. Importing it directly\n// would require `../components/toc-scrollspy.js`, and tsup's\n// `external` rule matches the specifier verbatim — a parent-\n// relative spec gets baked into `dist/index.js` and escapes the\n// dist root at consume time (Turbopack reports `Module not\n// found`).\n//\n// Routing through this bridge moves the externalized import to\n// sibling-depth (`./components/toc-scrollspy.js`) which is what\n// the `dist/` layout expects.\nexport { TocScrollspy } from \"./components/toc-scrollspy.js\";\n","import * as React from \"react\";\nimport type { NpRouteRenderProps } from \"@nexpress/theme\";\nimport { getCollectionConfig, searchCollections } from \"@nexpress/core\";\n\n/**\n * Resolves a search-result URL via the collection's\n * `seo.urlPath` config when available, falling back to\n * `/<collection>/<slug>` convention. Without this, posts (which\n * typically live under `/blog/`) would 404 from search hits.\n * Wrapped in try/catch because `getCollectionConfig` throws for\n * unknown collections — a search adapter that returns rows from\n * a no-longer-registered collection shouldn't crash the page.\n */\nfunction resolveResultUrl(\n collection: string,\n doc: Record<string, unknown>,\n): string {\n try {\n const config = getCollectionConfig(collection);\n const urlPath = config.seo?.urlPath;\n if (typeof urlPath === \"function\") {\n const result = urlPath(doc);\n if (typeof result === \"string\" && result.length > 0) return result;\n }\n } catch {\n // Unknown collection or missing seo config — fall through.\n }\n const slug = typeof doc.slug === \"string\" ? doc.slug : \"\";\n return slug ? `/${collection}/${slug}` : \"#\";\n}\n\n/**\n * Phase F.9-B — `/search` route component.\n *\n * Reads `?q=` from searchParams, runs `searchCollections` (the\n * full-text search API), and renders the hits. Empty query →\n * empty results pane with hint copy. Stresses F.2's route\n * dispatch with a non-collection-walk shape (search is\n * cross-collection by design).\n */\n\nexport async function DocsSearch({\n searchParams,\n}: NpRouteRenderProps): Promise<React.ReactElement> {\n const raw = searchParams.q;\n const query = typeof raw === \"string\" ? raw.trim() : \"\";\n\n if (query.length === 0) {\n return (\n <div className=\"np-docs-search\">\n <p className=\"np-docs-search-heading\">Search</p>\n <h1>Search the docs</h1>\n <p className=\"np-docs-search-empty\">\n Enter a query in the masthead search box to find pages.\n </p>\n </div>\n );\n }\n\n const result = await searchCollections({ q: query, limit: 20 });\n return (\n <div className=\"np-docs-search\">\n <p className=\"np-docs-search-heading\">Search results for</p>\n <h1>“{query}”</h1>\n {result.results.length === 0 ? (\n <p className=\"np-docs-search-empty\">No matches.</p>\n ) : (\n <ul className=\"np-docs-search-results\">\n {result.results.map((item, i) => {\n const doc = item.doc;\n const slug = typeof doc.slug === \"string\" ? doc.slug : null;\n const title =\n typeof doc.title === \"string\" ? doc.title : (slug ?? \"Untitled\");\n const url = resolveResultUrl(item.collection, doc);\n return (\n <li\n key={`${item.collection}:${(doc.id as string | undefined) ?? i}`}\n className=\"np-docs-search-result\"\n >\n <p className=\"np-docs-search-result-eyebrow\">{item.collection}</p>\n <h2>\n <a href={url}>{title}</a>\n </h2>\n {typeof doc.excerpt === \"string\" ? (\n <p className=\"np-docs-search-result-excerpt\">{doc.excerpt}</p>\n ) : null}\n </li>\n );\n })}\n </ul>\n )}\n </div>\n );\n}\n","import * as React from \"react\";\nimport type { NpThemeShellProps } from \"@nexpress/theme\";\n\n/**\n * `NpThemeColors` (from `@nexpress/core`) is a strict interface\n * — success / warning / danger / code-surface colors aren't\n * legal `tokens.colors` keys. The docs CSS still depends on\n * them, so the shell injects them as `--np-color-*` vars inline\n * once per render. Anything the operator overrides via the\n * settings cascade still wins (cascade order — later rule\n * applied to the same custom property — keeps admin overrides\n * effective even with this baseline injected).\n */\nconst TOKEN_CSS = `:root{--np-color-success:#047857;--np-color-warning:#b45309;--np-color-danger:#b91c1c;--np-color-success-soft:#ecfdf5;--np-color-warning-soft:#fffbeb;--np-color-danger-soft:#fef2f2;--np-color-code-bg:#0b1220;--np-color-code-fg:#e6edf6;--np-color-code-head:#1e2939;--np-color-code-border:#0f1a2b;}`;\n\nexport async function DocsShell({\n children,\n}: NpThemeShellProps): Promise<React.ReactElement> {\n let layout: \"docs\" | \"page\" = \"docs\";\n try {\n const { headers } = await import(\"next/headers\");\n const pathname = (await headers()).get(\"x-np-pathname\") ?? \"\";\n if (!pathname.startsWith(\"/docs\")) layout = \"page\";\n } catch {\n // Outside a request scope — keep the docs grid as the default.\n }\n return (\n <div className=\"np-docs-shell\" data-layout={layout}>\n <style dangerouslySetInnerHTML={{ __html: TOKEN_CSS }} />\n <div className=\"np-docs-grid\">{children}</div>\n </div>\n );\n}\n","import * as React from \"react\";\nimport { findDocuments } from \"@nexpress/core\";\n\nimport { buildDocTree } from \"./lib/doc-tree.js\";\nimport { resolveDocsSettings } from \"./settings-helpers.js\";\n\ninterface DocNode {\n id: string;\n slug: string;\n title: string;\n parent: string | null;\n order: number;\n /**\n * Optional small label rendered next to the link\n * (`new` / `beta` / `api`). Renders as a pill via the\n * `.np-docs-sidebar-badge.{value}` selector in styles.ts.\n * Treated as advisory; sites without the field render no\n * badge.\n */\n badge: string | null;\n children: DocNode[];\n}\n\n/**\n * Hierarchical sidebar for the docs theme.\n *\n * Top-level docs (those without a `parent`) become **group\n * eyebrows** rendered with a bullet dot indicator; each\n * group's children are the linkable items under the eyebrow.\n * Deeper levels render as nested lists with a hairline left\n * rule.\n *\n * A top-level doc with no children is itself rendered as a\n * clickable eyebrow rather than an eyebrow + duplicate link\n * below (the eyebrow text and the only link would otherwise be\n * the same string).\n *\n * The current doc is highlighted via `data-current=\"true\"`\n * resolved from the request's pathname. Wired through\n * `next/headers` (`x-np-pathname`) so the highlight survives\n * server rendering with no client-side hydration.\n */\nexport async function DocsSidebar(): Promise<React.ReactElement> {\n const settings = await resolveDocsSettings();\n const currentSlug = await currentPathSlug();\n\n // Pull every doc and assemble the hierarchy. Capped at 500 to\n // keep the query bounded — typical doc sites stay well under.\n // Universal-content-model #748: docs are posts with kind=\"doc\".\n const result = await findDocuments<Record<string, unknown>>(\"posts\", {\n where: { status: \"published\", kind: \"doc\" },\n sort: \"order\",\n limit: 500,\n });\n\n const tree = buildTree(result.docs);\n\n if (tree.length === 0) {\n return (\n <aside className=\"np-docs-sidebar\" aria-label=\"Docs navigation\">\n <div className=\"np-docs-sidebar-group\">\n <h2 className=\"np-docs-sidebar-eyebrow\">\n <span className=\"np-docs-sidebar-eyebrow-dot\" aria-hidden=\"true\" />\n {settings.sidebarHeading}\n </h2>\n <p\n style={{\n padding: \"0.34rem 0.6rem\",\n fontSize: \"0.875rem\",\n color: \"var(--np-color-muted-foreground)\",\n margin: 0,\n }}\n >\n No docs yet.\n </p>\n </div>\n </aside>\n );\n }\n\n return (\n <aside className=\"np-docs-sidebar\" aria-label=\"Docs navigation\">\n {tree.map((group) => {\n const isLeaf = group.children.length === 0;\n const isLeafCurrent = isLeaf && currentSlug === group.slug;\n return (\n <div className=\"np-docs-sidebar-group\" key={group.id}>\n <h2 className=\"np-docs-sidebar-eyebrow\">\n <span className=\"np-docs-sidebar-eyebrow-dot\" aria-hidden=\"true\" />\n {isLeaf ? (\n <a\n className=\"np-docs-sidebar-eyebrow-link\"\n href={`/docs/${group.slug}`}\n data-current={isLeafCurrent ? \"true\" : undefined}\n aria-current={isLeafCurrent ? \"page\" : undefined}\n >\n {group.title}\n </a>\n ) : (\n group.title\n )}\n </h2>\n {isLeaf ? null : (\n <NavTree nodes={group.children} currentSlug={currentSlug} />\n )}\n </div>\n );\n })}\n </aside>\n );\n}\n\ninterface DocRow {\n id: unknown;\n slug: unknown;\n title: unknown;\n parent: unknown;\n order: unknown;\n badge: unknown;\n}\n\nasync function currentPathSlug(): Promise<string | null> {\n try {\n const { headers } = await import(\"next/headers\");\n const list = await headers();\n const pathname = list.get(\"x-np-pathname\");\n if (!pathname) return null;\n const m = /^\\/docs\\/(.+?)\\/?$/.exec(pathname);\n return m ? (m[1] ?? null) : null;\n } catch {\n return null;\n }\n}\n\nfunction buildTree(rawDocs: Record<string, unknown>[]): DocNode[] {\n const docs = rawDocs as unknown as DocRow[];\n return buildDocTree<DocNode, DocRow>(docs, (d) => {\n if (typeof d.id !== \"string\") return null;\n if (typeof d.slug !== \"string\") return null;\n return {\n id: d.id,\n slug: d.slug,\n title: typeof d.title === \"string\" ? d.title : d.slug,\n parent: typeof d.parent === \"string\" ? d.parent : null,\n order: typeof d.order === \"number\" ? d.order : 0,\n badge: typeof d.badge === \"string\" ? d.badge : null,\n children: [],\n };\n });\n}\n\nfunction NavTree({\n nodes,\n currentSlug,\n}: {\n nodes: DocNode[];\n currentSlug: string | null;\n}): React.ReactElement {\n return (\n <ul>\n {nodes.map((n) => (\n <li key={n.id}>\n <SidebarLink node={n} currentSlug={currentSlug} />\n {n.children.length > 0 ? (\n <NavTree nodes={n.children} currentSlug={currentSlug} />\n ) : null}\n </li>\n ))}\n </ul>\n );\n}\n\nfunction SidebarLink({\n node,\n currentSlug,\n}: {\n node: DocNode;\n currentSlug: string | null;\n}): React.ReactElement {\n const isCurrent = currentSlug !== null && currentSlug === node.slug;\n const badgeClass = node.badge\n ? `np-docs-sidebar-badge ${node.badge.toLowerCase()}`\n : null;\n return (\n <a\n href={`/docs/${node.slug}`}\n data-current={isCurrent ? \"true\" : undefined}\n aria-current={isCurrent ? \"page\" : undefined}\n >\n {node.title}\n {badgeClass ? (\n <span className={badgeClass}>{node.badge!.toUpperCase()}</span>\n ) : null}\n </a>\n );\n}\n","/**\n * Shared doc-tree assembly for the docs theme.\n *\n * Both the sidebar (a navigation tree) and the front-page landing\n * (a featured-children grid) need to walk a flat list of doc rows\n * and turn it into a parent → children tree, sorted by `order` at\n * every level. The two surfaces project different fields onto the\n * node (the sidebar doesn't need `lede`/`updatedAt`; the front\n * page does), so the build function is generic over the node\n * shape — callers pass a row-to-node mapper.\n *\n * Lives in `lib/` rather than alongside either surface so neither\n * is the \"owner\" — the function belongs to the docs theme as a\n * whole.\n */\n\n/**\n * The minimal shape every node needs to participate in the tree\n * walk. Concrete callers extend this with whatever extra fields\n * the surface renders.\n */\nexport interface NpDocTreeNode<Self extends NpDocTreeNode<Self>> {\n id: string;\n parent: string | null;\n order: number;\n children: Self[];\n}\n\n/**\n * Builds a sorted tree of nodes from a flat list of rows.\n *\n * `toNode` returns the typed node for a row, or `null` to skip\n * the row (e.g. when required fields like `id` / `slug` are\n * malformed). The function preserves the order rows are mapped\n * in for the `byId` map's iteration but re-sorts every level by\n * `order` afterward.\n */\nexport function buildDocTree<N extends NpDocTreeNode<N>, R>(\n rows: R[],\n toNode: (row: R) => N | null,\n): N[] {\n const byId = new Map<string, N>();\n for (const row of rows) {\n const node = toNode(row);\n if (node) byId.set(node.id, node);\n }\n const roots: N[] = [];\n for (const node of byId.values()) {\n if (node.parent && byId.has(node.parent)) {\n byId.get(node.parent)!.children.push(node);\n } else {\n roots.push(node);\n }\n }\n const sortLevel = (list: N[]) => {\n list.sort((a, b) => a.order - b.order);\n for (const n of list) sortLevel(n.children);\n };\n sortLevel(roots);\n return roots;\n}\n","/**\n * `@nexpress/theme-docs` — CSS layout.\n *\n * Three-column reference-docs layout: sticky search-first header,\n * hierarchical sidebar (groups with bullet eyebrows + nested\n * links + status badges), centered article column, on-this-page\n * TOC on the right. Sidebar + TOC collapse out below the\n * tablet / phone breakpoints respectively.\n *\n * Scoped under `.np-docs-*` so a theme swap to another v0.2\n * theme doesn't leave residue. All colors resolve through the\n * `--np-color-*` tokens so admin overrides on top still apply.\n *\n * The terminal-style shell command snippet uses `.np-docs-cmdline`\n * (not `.np-docs-shell`) because `.np-docs-shell` is already\n * claimed by the route shell's root container.\n */\nexport const docsCss = `\n.np-docs-shell {\n display: flex;\n flex-direction: column;\n min-height: 100vh;\n background: var(--np-color-background);\n color: var(--np-color-foreground);\n font-family: var(--np-font-body, \"Geist\", -apple-system, BlinkMacSystemFont, \"Segoe UI\", sans-serif);\n line-height: 1.6;\n -webkit-font-smoothing: antialiased;\n}\n.np-docs-shell a { color: inherit; }\n.np-docs-shell code,\n.np-docs-shell pre,\n.np-docs-shell kbd {\n font-family: var(--np-font-mono, \"Geist Mono\", ui-monospace, SFMono-Regular, Menlo, monospace);\n}\n\n.np-docs-api,\n.np-docs-changelog-page {\n max-width: 980px;\n margin: 0 auto;\n padding: 3rem 1rem 5rem;\n}\n.np-docs-api-hero,\n.np-docs-changelog-hero {\n padding: 3rem 0 2rem;\n}\n.np-docs-api-eyebrow,\n.np-docs-changelog-hero p {\n margin: 0 0 0.8rem;\n font-family: var(--np-font-mono);\n color: var(--np-color-primary);\n font-size: 0.78rem;\n letter-spacing: 0.08em;\n text-transform: uppercase;\n}\n.np-docs-api-hero h1,\n.np-docs-changelog-hero h1 {\n margin: 0;\n font-size: clamp(2.4rem, 5vw, 4.4rem);\n line-height: 1;\n letter-spacing: -0.04em;\n}\n.np-docs-api-hero p,\n.np-docs-changelog-hero span {\n display: block;\n max-width: 44rem;\n margin-top: 1rem;\n color: var(--np-color-muted-foreground);\n font-size: 1.05rem;\n}\n.np-docs-api-signature {\n overflow: hidden;\n border: 1px solid var(--np-color-border);\n border-radius: 14px;\n background: #0b1220;\n color: #e6edf6;\n}\n.np-docs-api-signature-head {\n display: flex;\n justify-content: space-between;\n gap: 1rem;\n padding: 0.8rem 1rem;\n color: #93c5fd;\n border-bottom: 1px solid rgba(255,255,255,0.12);\n font-family: var(--np-font-mono);\n font-size: 0.78rem;\n}\n.np-docs-api-signature pre {\n margin: 0;\n padding: 1.2rem;\n overflow-x: auto;\n font-size: 0.85rem;\n line-height: 1.65;\n}\n.np-docs-api-section { padding-top: 2.5rem; }\n.np-docs-api-section h2 {\n margin: 0 0 1rem;\n font-size: 1.35rem;\n}\n.np-docs-api-table {\n border: 1px solid var(--np-color-border);\n border-radius: 14px;\n overflow: hidden;\n background: var(--np-color-card);\n}\n.np-docs-api-row {\n display: grid;\n grid-template-columns: 10rem 7rem minmax(0, 1fr);\n gap: 1rem;\n padding: 1rem;\n border-bottom: 1px solid var(--np-color-border);\n}\n.np-docs-api-row:last-child { border-bottom: 0; }\n.np-docs-api-row span {\n color: var(--np-color-primary);\n font-family: var(--np-font-mono);\n font-size: 0.76rem;\n}\n.np-docs-api-row p { margin: 0; color: var(--np-color-muted-foreground); }\n.np-docs-changelog-timeline {\n list-style: none;\n margin: 2rem 0 0;\n padding: 0;\n border-top: 1px solid var(--np-color-border);\n}\n.np-docs-changelog-release {\n display: grid;\n grid-template-columns: 13rem minmax(0, 1fr);\n gap: 2rem;\n padding: 1.6rem 0;\n border-bottom: 1px solid var(--np-color-border);\n}\n.np-docs-changelog-release aside {\n display: grid;\n gap: 0.3rem;\n align-content: start;\n}\n.np-docs-changelog-release aside strong {\n font-size: 1.25rem;\n letter-spacing: -0.02em;\n}\n.np-docs-changelog-release aside span,\n.np-docs-changelog-release aside i {\n color: var(--np-color-muted-foreground);\n font-style: normal;\n font-size: 0.82rem;\n}\n.np-docs-changelog-release p {\n display: grid;\n grid-template-columns: 6.5rem minmax(0, 1fr);\n gap: 1rem;\n margin: 0 0 0.85rem;\n}\n.np-docs-changelog-release p span {\n justify-self: start;\n padding: 0.12rem 0.45rem;\n border-radius: 999px;\n border: 1px solid var(--np-color-border);\n font-family: var(--np-font-mono);\n font-size: 0.7rem;\n color: var(--np-color-primary);\n}\n@media (max-width: 760px) {\n .np-docs-api-row,\n .np-docs-changelog-release,\n .np-docs-changelog-release p {\n grid-template-columns: 1fr;\n }\n}\n\n/* ============================================================\n * Header — sticky bar with brand + version pill, ⌘K search in\n * the center, primary nav + GitHub link on the right. Grid\n * keeps everything anchored regardless of viewport width.\n * ============================================================ */\n.np-docs-header {\n position: sticky;\n top: 0;\n z-index: 30;\n background: color-mix(in oklab, var(--np-color-background) 80%, transparent);\n backdrop-filter: saturate(140%) blur(14px);\n -webkit-backdrop-filter: saturate(140%) blur(14px);\n border-bottom: 1px solid var(--np-color-border);\n}\n.np-docs-header-inner {\n max-width: 1380px;\n margin: 0 auto;\n padding: 0.7rem 1.5rem;\n display: grid;\n grid-template-columns: auto 1fr auto;\n gap: 1.5rem;\n align-items: center;\n}\n.np-docs-brand {\n display: inline-flex;\n align-items: center;\n gap: 0.55rem;\n font-weight: 700;\n font-size: 1.0625rem;\n letter-spacing: -0.02em;\n text-decoration: none;\n}\n.np-docs-brand-mark {\n width: 1.55rem;\n height: 1.55rem;\n border-radius: 6px;\n background: linear-gradient(135deg, var(--np-color-primary, #2563eb), #0ea5e9);\n position: relative;\n flex: none;\n}\n.np-docs-brand-mark::after {\n content: \"\";\n position: absolute;\n inset: 5px;\n border-radius: 2px;\n background: var(--np-color-background, #fff);\n opacity: 0.95;\n clip-path: polygon(0 0, 100% 0, 100% 100%, 60% 100%, 0 35%);\n}\n.np-docs-brand-version {\n font-family: var(--np-font-mono);\n font-size: 0.72rem;\n font-weight: 500;\n color: var(--np-color-primary);\n background: color-mix(in oklab, var(--np-color-primary) 14%, var(--np-color-card));\n padding: 0.15rem 0.45rem;\n border-radius: 5px;\n}\n\n.np-docs-search-form {\n max-width: 520px;\n width: 100%;\n position: relative;\n justify-self: center;\n}\n.np-docs-search-form svg {\n position: absolute;\n top: 50%;\n left: 0.85rem;\n transform: translateY(-50%);\n color: var(--np-color-muted-foreground);\n}\n.np-docs-search-input {\n width: 100%;\n padding: 0.55rem 0.85rem 0.55rem 2.4rem;\n font: inherit;\n font-size: 0.875rem;\n color: var(--np-color-foreground);\n background: var(--np-color-card);\n border: 1px solid var(--np-color-border);\n border-radius: 9px;\n}\n.np-docs-search-input::placeholder {\n color: var(--np-color-muted-foreground);\n}\n.np-docs-search-input:focus {\n outline: none;\n border-color: var(--np-color-primary);\n box-shadow: 0 0 0 3px color-mix(in oklab, var(--np-color-primary) 22%, transparent);\n}\n.np-docs-search-kbd {\n position: absolute;\n right: 0.6rem;\n top: 50%;\n transform: translateY(-50%);\n font-size: 0.7rem;\n padding: 0.1rem 0.4rem;\n color: var(--np-color-muted-foreground);\n border: 1px solid var(--np-color-border);\n border-radius: 4px;\n}\n\n.np-docs-nav {\n display: flex;\n align-items: center;\n gap: 1.25rem;\n}\n.np-docs-primary-nav {\n display: flex;\n list-style: none;\n gap: 1.25rem;\n margin: 0;\n padding: 0;\n}\n.np-docs-primary-nav a {\n color: var(--np-color-muted-foreground);\n font-size: 0.875rem;\n font-weight: 500;\n text-decoration: none;\n}\n.np-docs-primary-nav a:hover,\n.np-docs-primary-nav a[aria-current=\"page\"] {\n color: var(--np-color-foreground);\n}\n@media (max-width: 800px) {\n .np-docs-header-inner {\n grid-template-columns: auto 1fr auto;\n gap: 0.75rem;\n }\n .np-docs-search-form { display: none; }\n .np-docs-primary-nav { display: none; }\n}\n\n/* ============================================================\n * 3-column layout: sidebar + article + on-page TOC.\n * ============================================================ */\n.np-docs-grid,\n.np-docs-body {\n max-width: 1380px;\n margin: 0 auto;\n width: 100%;\n display: grid;\n grid-template-columns: 260px minmax(0, 1fr) 220px;\n gap: 3rem;\n padding: 2.25rem 1.5rem 4rem;\n}\n@media (max-width: 1100px) {\n .np-docs-grid,\n .np-docs-body {\n grid-template-columns: 240px minmax(0, 1fr);\n }\n .np-docs-toc { display: none; }\n}\n@media (max-width: 800px) {\n .np-docs-grid,\n .np-docs-body {\n grid-template-columns: 1fr;\n }\n .np-docs-sidebar { display: none; }\n}\n\n/* Non-docs routes (home / about / pricing / contact / member pages):\n * collapse the 3-col grid to a single wide column and hide the\n * doc-only chrome (sidebar + TOC) so a generic pages doc has full\n * canvas width instead of being squeezed into the 800-ish px\n * article column reserved for the /docs reading lane. */\n.np-docs-shell[data-layout=\"page\"] .np-docs-grid {\n grid-template-columns: minmax(0, 1fr);\n}\n.np-docs-shell[data-layout=\"page\"] .np-docs-sidebar,\n.np-docs-shell[data-layout=\"page\"] .np-docs-toc {\n display: none;\n}\n/* Framework's globals.css caps .np-page at 48rem (~768px) so a\n * regular pages doc rendered through the catch-all's fallback\n * wrapper stays squeezed even after the grid collapse above.\n * Lift the cap inside the page-layout so block-level content\n * (hero, features, stats) can stretch to the docs container. */\n.np-docs-shell[data-layout=\"page\"] .np-page {\n max-width: none;\n margin: 0;\n padding: 0;\n}\n\n/* ============================================================\n * Sidebar — grouped link list with bullet eyebrow + badges.\n * ============================================================ */\n.np-docs-sidebar {\n position: sticky;\n top: 4.25rem;\n align-self: start;\n max-height: calc(100vh - 5rem);\n overflow-y: auto;\n padding-right: 0.5rem;\n}\n.np-docs-sidebar-group { margin-bottom: 1.5rem; }\n.np-docs-sidebar-eyebrow {\n display: flex;\n align-items: center;\n gap: 0.4rem;\n font-family: var(--np-font-mono);\n font-size: 0.7rem;\n text-transform: uppercase;\n letter-spacing: 0.08em;\n color: var(--np-color-muted-foreground);\n margin: 0 0 0.65rem;\n font-weight: 600;\n}\n.np-docs-sidebar-eyebrow-dot {\n width: 0.4rem;\n height: 0.4rem;\n border-radius: 50%;\n background: var(--np-color-primary);\n}\n/* Leaf top-level doc rendered as a clickable eyebrow — inherits\n * the eyebrow typography (mono / uppercase / 0.7rem) so it sits\n * in the same visual row as sibling group eyebrows; primary\n * accent on current, foreground on hover. */\n.np-docs-sidebar-eyebrow-link {\n color: inherit;\n text-decoration: none;\n font: inherit;\n letter-spacing: inherit;\n text-transform: inherit;\n}\n.np-docs-sidebar-eyebrow-link:hover {\n color: var(--np-color-foreground);\n}\n.np-docs-sidebar-eyebrow-link[data-current=\"true\"],\n.np-docs-sidebar-eyebrow-link[aria-current=\"page\"] {\n color: var(--np-color-primary);\n}\n.np-docs-sidebar ul {\n list-style: none;\n padding: 0;\n margin: 0;\n}\n.np-docs-sidebar li { margin: 0.05rem 0; }\n.np-docs-sidebar a {\n display: block;\n padding: 0.34rem 0.6rem;\n font-size: 0.875rem;\n color: var(--np-color-muted-foreground);\n text-decoration: none;\n border-radius: 6px;\n line-height: 1.35;\n}\n.np-docs-sidebar a:hover {\n background: var(--np-color-muted);\n color: var(--np-color-foreground);\n}\n.np-docs-sidebar a[data-current=\"true\"],\n.np-docs-sidebar a[aria-current=\"page\"] {\n color: var(--np-color-primary);\n background: color-mix(in oklab, var(--np-color-primary) 14%, var(--np-color-card));\n font-weight: 500;\n}\n.np-docs-sidebar ul ul {\n margin-left: 0.5rem;\n padding-left: 0.85rem;\n border-left: 1px solid var(--np-color-border);\n}\n.np-docs-sidebar-badge {\n display: inline-block;\n font-family: var(--np-font-mono);\n font-size: 0.62rem;\n padding: 0.02rem 0.34rem;\n margin-left: 0.4rem;\n vertical-align: 1px;\n border-radius: 4px;\n background: var(--np-color-muted);\n color: var(--np-color-muted-foreground);\n font-weight: 500;\n}\n.np-docs-sidebar-badge.new { background: #dcfce7; color: #166534; }\n.np-docs-sidebar-badge.beta { background: #fef3c7; color: #92400e; }\n.np-docs-sidebar-badge.api {\n background: color-mix(in oklab, var(--np-color-primary) 16%, var(--np-color-card));\n color: var(--np-color-primary);\n}\n\n/* ============================================================\n * Doc page — article column. h1 + lede + meta row + sections\n * with hovered anchor link icon.\n * ============================================================ */\n.np-docs-page {\n max-width: 760px;\n min-width: 0;\n}\n.np-docs-breadcrumbs {\n display: flex;\n align-items: center;\n gap: 0.4rem;\n font-size: 0.8125rem;\n color: var(--np-color-muted-foreground);\n margin-bottom: 1rem;\n}\n.np-docs-breadcrumbs a {\n color: inherit;\n text-decoration: none;\n}\n.np-docs-breadcrumbs a:hover { color: var(--np-color-foreground); }\n.np-docs-breadcrumbs-sep { opacity: 0.5; }\n\n.np-docs-page h1 {\n font-size: clamp(2rem, 3.6vw, 2.5rem);\n font-weight: 700;\n letter-spacing: -0.03em;\n line-height: 1.1;\n margin: 0 0 0.5rem;\n text-wrap: balance;\n}\n.np-docs-page-lede {\n font-size: 1.125rem;\n color: var(--np-color-muted-foreground);\n line-height: 1.55;\n margin: 0 0 2rem;\n max-width: 38rem;\n text-wrap: pretty;\n}\n.np-docs-page-meta {\n display: flex;\n flex-wrap: wrap;\n gap: 0.5rem;\n align-items: center;\n font-size: 0.8125rem;\n color: var(--np-color-muted-foreground);\n padding: 0.85rem 0;\n margin-bottom: 2rem;\n border-top: 1px solid var(--np-color-border);\n border-bottom: 1px solid var(--np-color-border);\n}\n.np-docs-page-meta-pill {\n display: inline-flex;\n align-items: center;\n gap: 0.35rem;\n padding: 0.15rem 0.55rem;\n font-family: var(--np-font-mono);\n font-size: 0.72rem;\n border: 1px solid var(--np-color-border);\n border-radius: 999px;\n background: var(--np-color-card);\n}\n.np-docs-page-meta-pill.status {\n color: var(--np-color-success, #047857);\n border-color: #bbf7d0;\n background: var(--np-color-success-soft, #f0fdf4);\n}\n.np-docs-page-meta-pill.status::before {\n content: \"\";\n width: 0.4rem;\n height: 0.4rem;\n border-radius: 50%;\n background: var(--np-color-success, #047857);\n}\n.np-docs-page-meta-sep { opacity: 0.4; }\n.np-docs-page-meta a {\n color: var(--np-color-primary);\n text-decoration: none;\n margin-left: auto;\n}\n.np-docs-page-meta a:hover { text-decoration: underline; }\n\n.np-docs-page h2 {\n font-size: 1.5rem;\n font-weight: 600;\n letter-spacing: -0.02em;\n line-height: 1.25;\n margin: 3rem 0 0.85rem;\n scroll-margin-top: 5rem;\n position: relative;\n}\n.np-docs-page h2:first-of-type { margin-top: 2.5rem; }\n.np-docs-page h3 {\n font-size: 1.1rem;\n font-weight: 600;\n letter-spacing: -0.01em;\n margin: 2.25rem 0 0.7rem;\n scroll-margin-top: 5rem;\n position: relative;\n}\n.np-docs-page p { margin: 0 0 1rem; }\n.np-docs-page p code,\n.np-docs-page li code {\n font-size: 0.875em;\n padding: 0.1em 0.35em;\n background: var(--np-color-muted);\n border: 1px solid var(--np-color-border);\n border-radius: 4px;\n}\n.np-docs-page strong { font-weight: 600; }\n.np-docs-page ul,\n.np-docs-page ol {\n margin: 0 0 1rem;\n padding-left: 1.4rem;\n}\n.np-docs-page li { margin: 0.35rem 0; }\n.np-docs-page a:not(.np-docs-prev-next a):not(.np-docs-anchor) {\n color: var(--np-color-primary);\n text-decoration: underline;\n text-underline-offset: 3px;\n text-decoration-thickness: 1px;\n text-decoration-color: color-mix(in oklab, var(--np-color-primary) 45%, transparent);\n}\n.np-docs-page a:not(.np-docs-prev-next a):not(.np-docs-anchor):hover {\n text-decoration-color: currentColor;\n}\n\n/* Anchor icon — visible only on heading hover. */\n.np-docs-anchor {\n position: absolute;\n left: -1.3rem;\n top: 50%;\n transform: translateY(-50%);\n color: var(--np-color-muted-foreground);\n opacity: 0;\n text-decoration: none !important;\n font-weight: 400;\n}\n.np-docs-page h2:hover .np-docs-anchor,\n.np-docs-page h3:hover .np-docs-anchor { opacity: 1; }\n\n/* ============================================================\n * Callouts — info (default) / note (indigo) / warn (amber) /\n * danger (red). 3px left rule carries the variant color.\n * ============================================================ */\n.np-docs-callout {\n display: grid;\n grid-template-columns: auto 1fr;\n gap: 0.85rem;\n padding: 1rem 1.15rem;\n border: 1px solid var(--np-color-border);\n border-left: 3px solid var(--np-color-primary);\n border-radius: 8px;\n background: var(--np-color-card);\n margin: 1.25rem 0;\n font-size: 0.95rem;\n line-height: 1.55;\n}\n.np-docs-callout > svg,\n.np-docs-callout-icon {\n width: 1.25rem;\n height: 1.25rem;\n flex-shrink: 0;\n color: var(--np-color-primary);\n margin-top: 0.1rem;\n}\n.np-docs-callout p { margin: 0; }\n.np-docs-callout-title {\n font-weight: 600;\n margin-bottom: 0.15rem;\n color: var(--np-color-foreground);\n}\n.np-docs-callout--warn {\n border-left-color: var(--np-color-warning, #b45309);\n background: var(--np-color-warning-soft, #fffbeb);\n border-color: #fde68a;\n}\n.np-docs-callout--warn .np-docs-callout-icon,\n.np-docs-callout--warn > svg { color: var(--np-color-warning, #b45309); }\n.np-docs-callout--note {\n border-left-color: #6366f1;\n background: #eef2ff;\n border-color: #c7d2fe;\n}\n.np-docs-callout--note .np-docs-callout-icon,\n.np-docs-callout--note > svg { color: #4338ca; }\n.np-docs-callout--danger {\n border-left-color: var(--np-color-danger, #b91c1c);\n background: var(--np-color-danger-soft, #fef2f2);\n border-color: #fecaca;\n}\n.np-docs-callout--danger .np-docs-callout-icon,\n.np-docs-callout--danger > svg { color: var(--np-color-danger, #b91c1c); }\n\n/* ============================================================\n * Code blocks — dark surface with a file-named header and a\n * copy button. Syntax tokens (.tk-*) cover the common slots\n * (keyword / string / function / number / type / punctuation /\n * comment) using a muted neutral-paired palette so the block\n * reads at the same contrast as the page chrome.\n * ============================================================ */\n.np-docs-code {\n margin: 1.25rem 0;\n border-radius: 10px;\n background: var(--np-color-code-bg, #0b1220);\n color: var(--np-color-code-fg, #e6edf6);\n overflow: hidden;\n border: 1px solid var(--np-color-code-head, #1e2939);\n}\n.np-docs-code-head {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 0.55rem 0.85rem;\n background: var(--np-color-code-border, #0f1a2b);\n border-bottom: 1px solid #1e293b;\n}\n.np-docs-code-file {\n display: inline-flex;\n align-items: center;\n gap: 0.5rem;\n font-family: var(--np-font-mono);\n font-size: 0.78rem;\n color: #94a3b8;\n}\n.np-docs-code-file svg { color: #64748b; }\n.np-docs-code-copy {\n display: inline-flex;\n align-items: center;\n gap: 0.35rem;\n padding: 0.25rem 0.55rem;\n font-size: 0.72rem;\n font-family: var(--np-font-mono);\n color: #94a3b8;\n background: transparent;\n border: 1px solid #1e293b;\n border-radius: 5px;\n cursor: pointer;\n}\n.np-docs-code-copy:hover {\n color: #e2e8f0;\n border-color: #334155;\n}\n.np-docs-code pre {\n margin: 0;\n padding: 1rem 1.1rem;\n font-size: 0.825rem;\n line-height: 1.65;\n overflow-x: auto;\n}\n.np-docs-code pre code {\n display: block;\n font-family: inherit;\n background: transparent;\n border: 0;\n padding: 0;\n color: inherit;\n}\n.tk-c { color: #64748b; font-style: italic; }\n.tk-k { color: #c084fc; }\n.tk-s { color: #86efac; }\n.tk-f { color: #93c5fd; }\n.tk-t { color: #fcd34d; }\n.tk-n { color: #f9a8d4; }\n.tk-p { color: #e2e8f0; }\n\n/* Inline shell snippet — for terse \\`pnpm dev\\` style commands.\n * Named \\`cmdline\\` (not \\`shell\\`) so it doesn't collide with the\n * route shell container at \\`.np-docs-shell\\`. */\n.np-docs-cmdline {\n display: grid;\n grid-template-columns: auto 1fr auto;\n gap: 0.7rem;\n align-items: center;\n padding: 0.75rem 1rem;\n margin: 1.25rem 0;\n background: var(--np-color-code-bg, #0b1220);\n color: var(--np-color-code-fg, #e6edf6);\n border-radius: 9px;\n font-family: var(--np-font-mono);\n font-size: 0.875rem;\n}\n.np-docs-cmdline-prompt { color: #34d399; }\n.np-docs-cmdline-cmd { color: #e2e8f0; }\n.np-docs-cmdline-copy {\n padding: 0.2rem 0.55rem;\n font-size: 0.7rem;\n color: #94a3b8;\n background: transparent;\n border: 1px solid #1e293b;\n border-radius: 5px;\n cursor: pointer;\n}\n.np-docs-cmdline-copy:hover { color: #e2e8f0; border-color: #334155; }\n\n/* ============================================================\n * Numbered steps — counter on a soft pill before each step.\n * ============================================================ */\n.np-docs-steps {\n counter-reset: step;\n list-style: none;\n padding: 0;\n margin: 1.5rem 0;\n display: grid;\n gap: 1rem;\n}\n.np-docs-steps > li {\n counter-increment: step;\n display: grid;\n grid-template-columns: 2.1rem 1fr;\n gap: 0.85rem;\n align-items: start;\n}\n.np-docs-steps > li::before {\n content: counter(step);\n width: 1.85rem;\n height: 1.85rem;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n font-family: var(--np-font-mono);\n font-size: 0.85rem;\n font-weight: 600;\n color: var(--np-color-primary);\n background: color-mix(in oklab, var(--np-color-primary) 14%, var(--np-color-card));\n border-radius: 50%;\n}\n.np-docs-step-title {\n font-weight: 600;\n margin: 0.25rem 0 0.25rem;\n}\n.np-docs-step-body {\n margin: 0;\n color: var(--np-color-muted-foreground);\n}\n\n/* ============================================================\n * API / reference tables — uppercase mono headers.\n * ============================================================ */\n.np-docs-table {\n width: 100%;\n border-collapse: collapse;\n font-size: 0.875rem;\n margin: 1.25rem 0;\n}\n.np-docs-table thead { background: var(--np-color-muted); }\n.np-docs-table th,\n.np-docs-table td {\n text-align: left;\n padding: 0.7rem 0.85rem;\n border-bottom: 1px solid var(--np-color-border);\n vertical-align: top;\n}\n.np-docs-table th {\n font-family: var(--np-font-mono);\n font-size: 0.72rem;\n text-transform: uppercase;\n letter-spacing: 0.06em;\n color: var(--np-color-muted-foreground);\n font-weight: 600;\n}\n.np-docs-table td:first-child code {\n color: var(--np-color-foreground);\n font-weight: 500;\n}\n.np-docs-table-required {\n display: inline-block;\n font-family: var(--np-font-mono);\n font-size: 0.65rem;\n padding: 0.05rem 0.35rem;\n margin-left: 0.4rem;\n background: #fef3c7;\n color: #92400e;\n border-radius: 4px;\n vertical-align: 1px;\n}\n\n/* ============================================================\n * Prev / next — symmetric pair at the foot of every doc page.\n * Hover lifts the bordered card and tints the border primary.\n * ============================================================ */\n.np-docs-prev-next {\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: 1rem;\n margin: 3.5rem 0 1rem;\n padding-top: 2rem;\n border-top: 1px solid var(--np-color-border);\n}\n.np-docs-prev-next a {\n display: block;\n padding: 1rem 1.15rem;\n background: var(--np-color-card);\n border: 1px solid var(--np-color-border);\n border-radius: 10px;\n text-decoration: none;\n transition: border-color 0.15s ease, transform 0.2s ease;\n}\n.np-docs-prev-next a:hover {\n border-color: var(--np-color-primary);\n transform: translateY(-1px);\n}\n.np-docs-prev-next-dir,\n.np-docs-prev-next-label {\n font-family: var(--np-font-mono);\n font-size: 0.72rem;\n color: var(--np-color-muted-foreground);\n letter-spacing: 0.05em;\n margin-bottom: 0.25rem;\n}\n.np-docs-prev-next-title {\n font-weight: 600;\n font-size: 0.95rem;\n}\n.np-docs-prev-next a.np-docs-prev-next-next,\n.np-docs-prev-next a:last-child { text-align: right; }\n.np-docs-prev-next[data-single=\"prev\"],\n.np-docs-prev-next[data-single=\"next\"] { grid-template-columns: 1fr; }\n.np-docs-prev-next[data-single=\"prev\"] a.np-docs-prev-next-prev,\n.np-docs-prev-next[data-single=\"next\"] a.np-docs-prev-next-next { width: 100%; }\n.np-docs-prev-next[data-single=\"prev\"] a.np-docs-prev-next-prev { text-align: left; }\n\n/* ============================================================\n * Feedback row — Yes / Could be better buttons under each page.\n * ============================================================ */\n.np-docs-feedback {\n margin-top: 3rem;\n padding: 1.25rem;\n background: var(--np-color-muted);\n border: 1px solid var(--np-color-border);\n border-radius: 10px;\n display: flex;\n gap: 1rem;\n align-items: center;\n justify-content: space-between;\n flex-wrap: wrap;\n}\n.np-docs-feedback-title { font-weight: 600; font-size: 0.95rem; }\n.np-docs-feedback-helper {\n font-size: 0.825rem;\n color: var(--np-color-muted-foreground);\n margin-top: 0.15rem;\n}\n.np-docs-feedback-buttons {\n display: flex;\n gap: 0.5rem;\n}\n.np-docs-feedback-buttons button {\n padding: 0.4rem 0.85rem;\n font: inherit;\n font-size: 0.825rem;\n background: var(--np-color-card);\n border: 1px solid var(--np-color-border);\n border-radius: 7px;\n cursor: pointer;\n}\n.np-docs-feedback-buttons button:hover {\n border-color: var(--np-color-primary);\n color: var(--np-color-primary);\n}\n\n/* ============================================================\n * On-page TOC — right rail, sticky, current section gets a\n * primary border + soft gradient.\n * ============================================================ */\n.np-docs-toc {\n position: sticky;\n top: 4.25rem;\n align-self: start;\n max-height: calc(100vh - 5rem);\n overflow-y: auto;\n font-size: 0.825rem;\n}\n.np-docs-toc-eyebrow {\n font-family: var(--np-font-mono);\n font-size: 0.7rem;\n text-transform: uppercase;\n letter-spacing: 0.08em;\n color: var(--np-color-muted-foreground);\n margin: 0 0 0.75rem;\n font-weight: 600;\n}\n.np-docs-toc ul {\n list-style: none;\n padding: 0;\n margin: 0;\n}\n.np-docs-toc li { margin: 0.05rem 0; }\n.np-docs-toc a {\n display: block;\n padding: 0.3rem 0.5rem;\n color: var(--np-color-muted-foreground);\n text-decoration: none;\n border-left: 2px solid transparent;\n margin-left: -2px;\n line-height: 1.4;\n}\n.np-docs-toc a:hover { color: var(--np-color-foreground); }\n.np-docs-toc a[data-current=\"true\"],\n.np-docs-toc a[aria-current=\"location\"],\n.np-docs-toc a[aria-current=\"true\"] {\n color: var(--np-color-primary);\n border-left-color: var(--np-color-primary);\n background: linear-gradient(\n to right,\n color-mix(in oklab, var(--np-color-primary) 14%, var(--np-color-card)),\n transparent 80%\n );\n}\n.np-docs-toc ul ul { margin-left: 0.85rem; }\n.np-docs-toc-l3 { margin-left: 0.85rem; }\n.np-docs-toc-secondary {\n margin-top: 1.5rem;\n padding-top: 1rem;\n border-top: 1px solid var(--np-color-border);\n}\n.np-docs-toc-secondary a {\n display: inline-flex;\n align-items: center;\n gap: 0.35rem;\n padding: 0.2rem 0;\n border-left: 0;\n margin: 0;\n}\n.np-docs-toc-secondary a:hover { background: transparent; }\n\n/* Empty / not-found surfaces — used by routes/not-found and\n * the docs collection's empty state. */\n.np-docs-empty {\n padding: 4rem 1.5rem;\n text-align: center;\n color: var(--np-color-muted-foreground);\n}\n.np-docs-empty h1 {\n font-size: 1.5rem;\n margin: 0 0 0.5rem;\n color: var(--np-color-foreground);\n}\n\n/* ============================================================\n * Search route — wraps DocsSearch's output. Eyebrow + result\n * cards reuse the docs chrome (mono small caps, hairline rules,\n * bordered card with hover lift).\n * ============================================================ */\n.np-docs-search {\n max-width: 800px;\n margin: 0 auto;\n padding-top: 2.25rem;\n}\n.np-docs-search-heading {\n font-family: var(--np-font-mono);\n font-size: 0.72rem;\n text-transform: uppercase;\n letter-spacing: 0.08em;\n color: var(--np-color-muted-foreground);\n font-weight: 600;\n margin: 0 0 0.5rem;\n}\n.np-docs-search h1 {\n font-size: 1.75rem;\n font-weight: 700;\n letter-spacing: -0.02em;\n margin: 0 0 1.5rem;\n text-wrap: balance;\n}\n.np-docs-search-empty {\n color: var(--np-color-muted-foreground);\n padding: 1.5rem 0;\n font-size: 0.95rem;\n}\n.np-docs-search-results {\n list-style: none;\n padding: 0;\n margin: 1.5rem 0 0;\n display: grid;\n gap: 1rem;\n}\n.np-docs-search-result {\n padding: 1rem 1.15rem;\n border: 1px solid var(--np-color-border);\n border-radius: 10px;\n background: var(--np-color-card);\n transition: border-color 0.15s ease, transform 0.2s ease;\n}\n.np-docs-search-result:hover {\n border-color: var(--np-color-primary);\n transform: translateY(-1px);\n}\n.np-docs-search-result-eyebrow {\n font-family: var(--np-font-mono);\n font-size: 0.68rem;\n text-transform: uppercase;\n letter-spacing: 0.08em;\n color: var(--np-color-muted-foreground);\n margin: 0 0 0.35rem;\n}\n.np-docs-search-result h2 {\n font-size: 1.05rem;\n font-weight: 600;\n margin: 0 0 0.4rem;\n}\n.np-docs-search-result h2 a {\n color: var(--np-color-foreground);\n text-decoration: none;\n}\n.np-docs-search-result h2 a:hover { color: var(--np-color-primary); }\n.np-docs-search-result-excerpt {\n margin: 0;\n font-size: 0.875rem;\n color: var(--np-color-muted-foreground);\n line-height: 1.55;\n}\n\n/* ============================================================\n * Front-page landing — eyebrow + display heading + lede +\n * primary CTA + 2x2 group cards + recently-updated row.\n * Renders inside the single-column page layout\n * (data-layout=\"page\" on the shell collapses the 3-col grid).\n * ============================================================ */\n.np-docs-front {\n max-width: 880px;\n margin: 0 auto;\n padding: 2.5rem 0 4rem;\n display: grid;\n gap: 3rem;\n}\n.np-docs-front-hero {\n display: grid;\n gap: 1rem;\n}\n.np-docs-front-eyebrow {\n display: inline-flex;\n align-items: center;\n gap: 0.5rem;\n font-family: var(--np-font-mono, ui-monospace, monospace);\n font-size: 0.72rem;\n letter-spacing: 0.16em;\n text-transform: uppercase;\n color: var(--np-color-primary);\n background: var(--np-color-primary-soft, color-mix(in oklab, var(--np-color-primary) 10%, transparent));\n padding: 0.32rem 0.6rem;\n border-radius: 999px;\n align-self: start;\n justify-self: start;\n}\n.np-docs-front-eyebrow-dot {\n width: 6px;\n height: 6px;\n border-radius: 999px;\n background: var(--np-color-success, currentColor);\n display: inline-block;\n}\n.np-docs-front h1 {\n font-size: clamp(2.4rem, 4.2vw, 3rem);\n font-weight: 700;\n letter-spacing: -0.03em;\n line-height: 1.05;\n margin: 0;\n text-wrap: balance;\n}\n.np-docs-front-lede {\n font-size: 1.125rem;\n line-height: 1.55;\n color: var(--np-color-muted-foreground);\n max-width: 60ch;\n margin: 0;\n}\n.np-docs-front-cta {\n display: flex;\n flex-wrap: wrap;\n gap: 0.65rem;\n margin-top: 0.5rem;\n}\n.np-docs-front-cta-primary {\n display: inline-flex;\n align-items: center;\n gap: 0.4rem;\n font-size: 0.92rem;\n font-weight: 500;\n padding: 0.55rem 1.05rem;\n border-radius: 999px;\n background: var(--np-color-foreground);\n color: var(--np-color-background);\n text-decoration: none;\n}\n.np-docs-front-cta-primary:hover {\n background: color-mix(in oklab, var(--np-color-foreground) 85%, transparent);\n}\n.np-docs-front-cta-secondary {\n display: inline-flex;\n align-items: center;\n font-size: 0.92rem;\n padding: 0.55rem 1.05rem;\n border-radius: 999px;\n color: var(--np-color-foreground);\n text-decoration: none;\n border: 1px solid var(--np-color-border);\n}\n.np-docs-front-cta-secondary:hover {\n background: var(--np-color-muted);\n}\n\n.np-docs-front-groups {\n display: grid;\n grid-template-columns: repeat(2, 1fr);\n gap: 1rem;\n}\n@media (max-width: 720px) {\n .np-docs-front-groups { grid-template-columns: 1fr; }\n}\n.np-docs-front-group {\n display: grid;\n gap: 0.5rem;\n padding: 1.4rem 1.4rem 1.6rem;\n border-radius: var(--np-radius-lg, 10px);\n border: 1px solid var(--np-color-border);\n background: var(--np-color-card);\n text-decoration: none;\n color: inherit;\n transition: border-color 120ms ease, transform 120ms ease;\n}\n.np-docs-front-group:hover {\n border-color: var(--np-color-primary);\n transform: translateY(-1px);\n}\n.np-docs-front-group-title {\n display: flex;\n align-items: center;\n justify-content: space-between;\n font-size: 1.05rem;\n font-weight: 600;\n margin: 0;\n}\n.np-docs-front-group-count {\n font-family: var(--np-font-mono, ui-monospace, monospace);\n font-size: 0.7rem;\n letter-spacing: 0.04em;\n color: var(--np-color-muted-foreground);\n font-weight: 400;\n}\n.np-docs-front-group-lede {\n margin: 0;\n font-size: 0.9rem;\n line-height: 1.5;\n color: var(--np-color-muted-foreground);\n}\n.np-docs-front-group-children {\n list-style: none;\n margin: 0.4rem 0 0;\n padding: 0;\n display: grid;\n gap: 0.25rem;\n}\n.np-docs-front-group-children li {\n font-size: 0.86rem;\n color: var(--np-color-muted-foreground);\n display: inline-flex;\n align-items: center;\n gap: 0.4rem;\n}\n\n.np-docs-front-recent {\n display: grid;\n gap: 0.75rem;\n}\n.np-docs-front-recent-eyebrow {\n font-family: var(--np-font-mono, ui-monospace, monospace);\n font-size: 0.7rem;\n letter-spacing: 0.18em;\n text-transform: uppercase;\n color: var(--np-color-muted-foreground);\n margin: 0;\n}\n.np-docs-front-recent-list {\n list-style: none;\n margin: 0;\n padding: 0;\n display: grid;\n gap: 0.5rem;\n}\n.np-docs-front-recent-list a {\n display: flex;\n align-items: baseline;\n justify-content: space-between;\n gap: 1rem;\n padding: 0.5rem 0;\n border-bottom: 1px solid var(--np-color-border);\n text-decoration: none;\n color: inherit;\n}\n.np-docs-front-recent-list li:last-child a {\n border-bottom: 0;\n}\n.np-docs-front-recent-list a:hover {\n color: var(--np-color-primary);\n}\n.np-docs-front-recent-title {\n font-size: 0.95rem;\n}\n.np-docs-front-recent-time {\n font-family: var(--np-font-mono, ui-monospace, monospace);\n font-size: 0.75rem;\n color: var(--np-color-muted-foreground);\n flex-shrink: 0;\n}\n\n/* ────────────────────────────────────────────────────────────\n * Members shell (DocsMembersShell — /members/* routes)\n *\n * Drops the docs sidebar — hierarchical navigation is useless\n * on auth forms. Reuses DocsHeader directly. Body becomes a\n * narrow centered column for the form / status content.\n * ──────────────────────────────────────────────────────────── */\n.np-docs-members {\n padding: 4rem 1.5rem;\n min-height: 60vh;\n}\n.np-docs-members-column {\n max-width: 32rem;\n margin: 0 auto;\n display: flex;\n flex-direction: column;\n gap: 1.5rem;\n}\n`;\n","import type { NpTemplateRenderProps } from \"@nexpress/theme\";\n\nexport function PageApiReferenceTemplate(_props: NpTemplateRenderProps) {\n const params = [\n [\"manifest\", \"required\", \"Plugin metadata: id, name, version, and supported NexPress range.\"],\n [\"hooks\", \"optional\", \"Lifecycle hooks such as content:beforeSave and content:afterSave.\"],\n [\"actions\", \"optional\", \"Custom action handlers mounted under the plugin action endpoint.\"],\n [\"routes\", \"optional\", \"API-style route handlers registered by the plugin host.\"],\n [\"pageRoutes\", \"optional\", \"Public-site React routes rendered through the site shell.\"],\n [\"scheduled\", \"optional\", \"pg-boss scheduled tasks reconciled at boot.\"],\n [\"blocks\", \"optional\", \"Page-builder block definitions registered into the shared registry.\"],\n ];\n\n return (\n <article className=\"np-docs-api\">\n <header className=\"np-docs-api-hero\">\n <p className=\"np-docs-api-eyebrow\">API reference</p>\n <h1>\n <code>definePlugin</code>\n </h1>\n <p>\n Declares a NexPress plugin. v1 plugins are npm package + rebuild:\n they run in-process, can register hooks, actions, API routes,\n public page routes, scheduled tasks, and page-builder blocks.\n </p>\n </header>\n\n <section className=\"np-docs-api-signature\" aria-label=\"Signature\">\n <div className=\"np-docs-api-signature-head\">\n <span>Signature</span>\n <code>@nexpress/plugin-sdk</code>\n </div>\n <pre>{`import { definePlugin } from \"@nexpress/plugin-sdk\";\n\nexport default definePlugin({\n manifest: {\n id: \"reading-time\",\n name: \"Reading time\",\n version: \"0.1.0\",\n nexpress: { minVersion: \"0.1.0\" },\n },\n hooks: {\n \"content:beforeSave\": async (ctx) => ctx.data,\n },\n pageRoutes: [],\n blocks: [],\n});`}</pre>\n </section>\n\n <section className=\"np-docs-api-section\">\n <h2>Parameters</h2>\n <div className=\"np-docs-api-table\">\n {params.map(([name, state, desc]) => (\n <div className=\"np-docs-api-row\" key={name}>\n <code>{name}</code>\n <span>{state}</span>\n <p>{desc}</p>\n </div>\n ))}\n </div>\n </section>\n\n <section className=\"np-docs-api-section\">\n <h2>Returns</h2>\n <p>\n A plugin definition object consumed by the NexPress bootstrap. The\n host validates the manifest and registers every declared surface in a\n predictable order. Capability and route checks happen at the\n framework boundary.\n </p>\n </section>\n </article>\n );\n}\n","import type { NpTemplateRenderProps } from \"@nexpress/theme\";\n\nconst RELEASES = [\n {\n version: \"0.3.6\",\n date: \"May 2026\",\n tag: \"latest\",\n changes: [\n [\"Improved\", \"Theme seed content now owns first-boot pages and posts per active theme.\"],\n [\"Added\", \"Built-in theme docs, magazine, and portfolio front-page render coverage.\"],\n [\"Fixed\", \"Theme-contributed fields are gated by active theme in the admin editor.\"],\n ],\n },\n {\n version: \"0.3.0\",\n date: \"May 2026\",\n tag: \"theme v0.2\",\n changes: [\n [\"Added\", \"Theme routes, archives, nav locations, settings schema, and patterns.\"],\n [\"Added\", \"Docs and portfolio kinds on the universal posts collection.\"],\n [\"Breaking\", \"Legacy nx prefix moved to np across framework-owned identifiers.\"],\n ],\n },\n {\n version: \"0.2.0\",\n date: \"April 2026\",\n tag: \"pre-1.0\",\n changes: [\n [\"Added\", \"Plugin page routes and page-builder block contributions.\"],\n [\"Improved\", \"pg-boss worker lifecycle and admin jobs surface.\"],\n [\"Fixed\", \"CSRF and rate limiting now live in the app proxy boundary.\"],\n ],\n },\n];\n\nexport function PageChangelogTemplate(_props: NpTemplateRenderProps) {\n return (\n <article className=\"np-docs-changelog-page\">\n <header className=\"np-docs-changelog-hero\">\n <p>Changelog</p>\n <h1>Every shipped change, in reverse.</h1>\n <span>Pre-1.0 packages use minor releases for breaking changes.</span>\n </header>\n\n <ol className=\"np-docs-changelog-timeline\">\n {RELEASES.map((release) => (\n <li className=\"np-docs-changelog-release\" key={release.version}>\n <aside>\n <strong>v{release.version}</strong>\n <span>{release.date}</span>\n <i>{release.tag}</i>\n </aside>\n <div>\n {release.changes.map(([kind, text]) => (\n <p key={`${release.version}-${text}`}>\n <span data-kind={kind.toLowerCase()}>{kind}</span>\n {text}\n </p>\n ))}\n </div>\n </li>\n ))}\n </ol>\n </article>\n );\n}\n","import * as React from \"react\";\nimport { findDocuments } from \"@nexpress/core\";\nimport type { NpTemplateRenderProps } from \"@nexpress/theme\";\n\nimport { buildDocTree } from \"../lib/doc-tree.js\";\nimport { resolveDocsSettings } from \"../settings-helpers.js\";\n\ninterface DocRow {\n id: unknown;\n slug: unknown;\n title: unknown;\n parent: unknown;\n order: unknown;\n lede: unknown;\n badge: unknown;\n publishedAt: unknown;\n updatedAt: unknown;\n /** Universal-content-model discriminator (#748) — filtered at query time. */\n kind?: string;\n}\n\ninterface DocNode {\n id: string;\n slug: string;\n title: string;\n lede: string | null;\n parent: string | null;\n order: number;\n badge: string | null;\n publishedAt: string | null;\n updatedAt: string | null;\n children: DocNode[];\n}\n\n/**\n * Docs theme front page — the landing operators see at `/` once they\n * activate the docs theme.\n *\n * Walks the seeded `kind=\"doc\"` tree: hero (site name + version pill +\n * lede), a 2x2 card grid of the top-level group docs with their first\n * three children listed, and a \"Recently updated\" row with the four\n * most recently touched docs. Each card title links into `/docs/<slug>`.\n *\n * Lives outside the 3-col docs grid (the shell stamps\n * `data-layout=\"page\"` for non-`/docs` routes, collapsing the grid to a\n * single 1380px column and hiding the sidebar + TOC). Operators who\n * want a marketing-style home swap the template via the admin picker.\n */\nexport async function PageFrontTemplate(_props: NpTemplateRenderProps) {\n const settings = await resolveDocsSettings();\n const result = await findDocuments<DocRow>(\"posts\", {\n where: { status: \"published\", kind: \"doc\" },\n sort: \"order\",\n limit: 200,\n });\n\n const tree = buildTree(result.docs);\n const recent = recentlyUpdated(result.docs, 4);\n // Primary CTA points at the plugin author quickstart when the\n // doc set includes it; otherwise falls back to the first leaf\n // / first root. Split into two explicit lookups so the intent\n // reads top-to-bottom: find the parent, then the child.\n const pluginsRoot = tree.find((node) => node.slug === \"plugins\");\n const quickstartChild = pluginsRoot?.children.find(\n (c) => c.slug === \"author-quickstart\",\n );\n const quickstartTarget =\n quickstartChild ?? tree[0]?.children[0] ?? tree[0] ?? null;\n\n return (\n <article className=\"np-docs-front\">\n <header className=\"np-docs-front-hero\">\n <span className=\"np-docs-front-eyebrow\">\n <span className=\"np-docs-front-eyebrow-dot\" aria-hidden=\"true\" />\n {settings.version}\n <span aria-hidden=\"true\"> · Stable</span>\n </span>\n <h1>Documentation</h1>\n <p className=\"np-docs-front-lede\">\n Everything you need to install, configure, extend, and ship a\n NexPress site — from a first install to the API reference. Browse\n by section, or jump straight into the plugin author quickstart.\n </p>\n {quickstartTarget ? (\n <div className=\"np-docs-front-cta\">\n <a className=\"np-docs-front-cta-primary\" href={`/docs/${quickstartTarget.slug}`}>\n Open {quickstartTarget.title} →\n </a>\n {settings.githubRepo ? (\n <a\n className=\"np-docs-front-cta-secondary\"\n href={settings.githubRepo}\n target=\"_blank\"\n rel=\"noreferrer\"\n >\n Browse the repository\n </a>\n ) : null}\n </div>\n ) : null}\n </header>\n\n {tree.length > 0 ? (\n <section className=\"np-docs-front-groups\" aria-label=\"Documentation sections\">\n {tree.map((group) => (\n <a\n className=\"np-docs-front-group\"\n key={group.id}\n href={`/docs/${group.slug}`}\n >\n <h2 className=\"np-docs-front-group-title\">\n {group.title}\n <span className=\"np-docs-front-group-count\">\n {group.children.length.toString()} page\n {group.children.length === 1 ? \"\" : \"s\"}\n </span>\n </h2>\n {group.lede ? (\n <p className=\"np-docs-front-group-lede\">{group.lede}</p>\n ) : null}\n {group.children.length > 0 ? (\n <ul className=\"np-docs-front-group-children\">\n {group.children.slice(0, 4).map((child) => (\n <li key={child.id}>\n {child.title}\n {child.badge ? (\n <span\n className={`np-docs-sidebar-badge ${child.badge.toLowerCase()}`}\n >\n {child.badge.toUpperCase()}\n </span>\n ) : null}\n </li>\n ))}\n </ul>\n ) : null}\n </a>\n ))}\n </section>\n ) : null}\n\n {recent.length > 0 ? (\n <section\n className=\"np-docs-front-recent\"\n aria-label=\"Recently updated docs\"\n >\n <h2 className=\"np-docs-front-recent-eyebrow\">Recently updated</h2>\n <ul className=\"np-docs-front-recent-list\">\n {recent.map((node) => (\n <li key={node.id}>\n <a href={`/docs/${node.slug}`}>\n <span className=\"np-docs-front-recent-title\">{node.title}</span>\n {node.updatedAt ? (\n <time\n className=\"np-docs-front-recent-time\"\n dateTime={node.updatedAt}\n >\n {formatRelative(node.updatedAt)}\n </time>\n ) : null}\n </a>\n </li>\n ))}\n </ul>\n </section>\n ) : null}\n </article>\n );\n}\n\nfunction buildTree(rows: DocRow[]): DocNode[] {\n return buildDocTree<DocNode, DocRow>(rows, (r) => {\n if (typeof r.id !== \"string\") return null;\n if (typeof r.slug !== \"string\") return null;\n return {\n id: r.id,\n slug: r.slug,\n title: typeof r.title === \"string\" ? r.title : r.slug,\n lede: typeof r.lede === \"string\" ? r.lede : null,\n parent: typeof r.parent === \"string\" ? r.parent : null,\n order: typeof r.order === \"number\" ? r.order : 0,\n badge: typeof r.badge === \"string\" ? r.badge : null,\n publishedAt:\n typeof r.publishedAt === \"string\" ? r.publishedAt : null,\n updatedAt: typeof r.updatedAt === \"string\" ? r.updatedAt : null,\n children: [],\n };\n });\n}\n\nfunction recentlyUpdated(rows: DocRow[], limit: number): DocNode[] {\n const all: DocNode[] = [];\n for (const r of rows) {\n if (typeof r.id !== \"string\" || typeof r.slug !== \"string\") continue;\n if (typeof r.parent !== \"string\") continue;\n all.push({\n id: r.id,\n slug: r.slug,\n title: typeof r.title === \"string\" ? r.title : r.slug,\n lede: null,\n parent: typeof r.parent === \"string\" ? r.parent : null,\n order: 0,\n badge: typeof r.badge === \"string\" ? r.badge : null,\n publishedAt:\n typeof r.publishedAt === \"string\" ? r.publishedAt : null,\n updatedAt: typeof r.updatedAt === \"string\" ? r.updatedAt : null,\n children: [],\n });\n }\n return all\n .filter((n) => n.updatedAt !== null)\n .sort((a, b) => {\n const at = a.updatedAt ?? \"\";\n const bt = b.updatedAt ?? \"\";\n return bt.localeCompare(at);\n })\n .slice(0, limit);\n}\n\nfunction formatRelative(iso: string): string {\n try {\n const then = new Date(iso).getTime();\n const now = Date.now();\n const ms = Math.max(now - then, 0);\n const minute = 60 * 1000;\n const hour = 60 * minute;\n const day = 24 * hour;\n if (ms < hour) return `${Math.max(1, Math.round(ms / minute)).toString()} min ago`;\n if (ms < day) return `${Math.round(ms / hour).toString()} h ago`;\n if (ms < 7 * day) return `${Math.round(ms / day).toString()} d ago`;\n return new Date(iso).toLocaleDateString(undefined, {\n month: \"short\",\n day: \"numeric\",\n year: \"numeric\",\n });\n } catch {\n return \"\";\n }\n}\n"],"mappings":"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;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA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","names":["jsx","jsxs","jsx","jsxs","jsx","jsxs","jsx","jsxs","findDocuments","Fragment","jsx","jsxs","jsx","findDocuments","jsx","jsxs","jsx","jsxs","findDocuments","jsx","jsxs","findDocuments","jsx","jsxs","jsx","jsxs","findDocuments","jsx","jsxs","findDocuments","buildTree"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@nexpress/theme-docs",
|
|
3
|
-
"version": "0.3.
|
|
3
|
+
"version": "0.3.12",
|
|
4
4
|
"description": "Documentation theme for NexPress — hierarchical sidebar, prev/next nav, in-page TOC.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "Nexpress",
|
|
@@ -48,11 +48,11 @@
|
|
|
48
48
|
},
|
|
49
49
|
"dependencies": {
|
|
50
50
|
"zod": "^4.4.3",
|
|
51
|
-
"@nexpress/blocks": "0.3.
|
|
52
|
-
"@nexpress/core": "0.3.
|
|
53
|
-
"@nexpress/editor": "0.3.
|
|
54
|
-
"@nexpress/next": "0.3.
|
|
55
|
-
"@nexpress/theme": "0.3.
|
|
51
|
+
"@nexpress/blocks": "0.3.12",
|
|
52
|
+
"@nexpress/core": "0.3.12",
|
|
53
|
+
"@nexpress/editor": "0.3.12",
|
|
54
|
+
"@nexpress/next": "0.3.12",
|
|
55
|
+
"@nexpress/theme": "0.3.12"
|
|
56
56
|
},
|
|
57
57
|
"devDependencies": {
|
|
58
58
|
"@types/react": "^19.0.0",
|