@nexpress/theme-docs 0.3.5 → 0.3.7

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.d.ts CHANGED
@@ -9,17 +9,21 @@ import { z } from 'zod';
9
9
 
10
10
  /**
11
11
  * Docs theme masthead. Brand strap (mark + wordmark + version
12
- * pill) on the left, ⌘K search form centered, primary nav +
13
- * GitHub repo link on the right.
12
+ * pill) on the left, ⌘K search form centered, primary nav on
13
+ * the right three intrinsic-width columns with the search
14
+ * filling the middle track.
14
15
  *
15
16
  * Search is a plain GET form to `/docs/search` — the theme's
16
17
  * own route handles the query so the host's `(site)/search`
17
18
  * page doesn't shadow it (#609). The ⌘K affordance is purely
18
- * visual hint copy in a `<kbd>`; wiring it to a global hotkey
19
- * is a separate client island sites can add on top.
20
- *
21
- * The GitHub link reads `settings.githubRepo`. When the admin
22
- * setting is unset, the link is hidden.
19
+ * visual hint copy in a `<kbd>`; the `<SearchKeyboardShortcut>`
20
+ * client island wires the actual focus shortcut.
21
+ *
22
+ * Operators who want a GitHub link in the header add it via the
23
+ * primary nav (Settings Menus header), pointing at
24
+ * `settings.githubRepo`. The doc-page footer's "Edit this
25
+ * page" / "Report issue" links continue to read the same setting
26
+ * independently.
23
27
  */
24
28
  declare function DocsHeader(): Promise<React.ReactElement>;
25
29
 
@@ -117,7 +121,7 @@ declare function DocsSidebar(): Promise<React.ReactElement>;
117
121
  * (not `.np-docs-shell`) because `.np-docs-shell` is already
118
122
  * claimed by the route shell's root container.
119
123
  */
120
- declare 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/* ============================================================\n * Header \u2014 sticky bar with brand + version pill, \u2318K 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: minmax(220px, 1fr) minmax(0, 2fr) 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-name { font-weight: 700; }\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.np-docs-github,\n.np-docs-github-link {\n display: inline-flex;\n align-items: center;\n gap: 0.45rem;\n padding: 0.4rem 0.7rem;\n font-size: 0.8125rem;\n color: var(--np-color-muted-foreground);\n background: var(--np-color-muted);\n border: 1px solid var(--np-color-border);\n border-radius: 7px;\n text-decoration: none;\n}\n.np-docs-github:hover,\n.np-docs-github-link:hover {\n color: var(--np-color-foreground);\n}\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 \u2014 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 \u2014 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 \u2014 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 \u2014 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 \u2014 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 \u2014 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 \u2014 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 \u2014 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 \u2014 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 \u2014 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 \u2014 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 \u2014 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 \u2014 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 \u2014 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 \u2014 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/* \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n * Members shell (DocsMembersShell \u2014 /members/* routes)\n *\n * Drops the docs sidebar \u2014 hierarchical navigation is useless\n * on auth forms. Reuses DocsHeader directly. Body becomes a\n * narrow centered column for the form / status content.\n * \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\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";
124
+ declare 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/* ============================================================\n * Header \u2014 sticky bar with brand + version pill, \u2318K 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 \u2014 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 \u2014 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 \u2014 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 \u2014 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 \u2014 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 \u2014 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 \u2014 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 \u2014 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 \u2014 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 \u2014 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 \u2014 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 \u2014 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 \u2014 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 \u2014 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 \u2014 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/* \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n * Members shell (DocsMembersShell \u2014 /members/* routes)\n *\n * Drops the docs sidebar \u2014 hierarchical navigation is useless\n * on auth forms. Reuses DocsHeader directly. Body becomes a\n * narrow centered column for the form / status content.\n * \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\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";
121
125
 
122
126
  /**
123
127
  * Doc page template — three-zone article: header strap
package/dist/index.js CHANGED
@@ -411,7 +411,7 @@ async function DocsHeader() {
411
411
  return /* @__PURE__ */ jsx2("header", { className: "np-docs-header", children: /* @__PURE__ */ jsxs2("div", { className: "np-docs-header-inner", children: [
412
412
  /* @__PURE__ */ jsxs2("a", { href: "/", className: "np-docs-brand", children: [
413
413
  /* @__PURE__ */ jsx2("span", { className: "np-docs-brand-mark", "aria-hidden": "true" }),
414
- /* @__PURE__ */ jsx2("span", { className: "np-docs-brand-name", children: siteName }),
414
+ /* @__PURE__ */ jsx2("span", { children: siteName }),
415
415
  /* @__PURE__ */ jsx2("span", { className: "np-docs-brand-version", children: settings.version })
416
416
  ] }),
417
417
  /* @__PURE__ */ jsxs2(
@@ -454,33 +454,7 @@ async function DocsHeader() {
454
454
  }
455
455
  ),
456
456
  /* @__PURE__ */ jsx2(SearchKeyboardShortcut, { targetId: "np-docs-search-input" }),
457
- /* @__PURE__ */ jsxs2("nav", { className: "np-docs-nav", "aria-label": "Primary", children: [
458
- /* @__PURE__ */ jsx2(NavMenu, { location: "header", className: "np-docs-primary-nav" }),
459
- settings.githubRepo ? /* @__PURE__ */ jsxs2(
460
- "a",
461
- {
462
- href: settings.githubRepo,
463
- className: "np-docs-github",
464
- target: "_blank",
465
- rel: "noreferrer",
466
- "aria-label": "GitHub repository",
467
- children: [
468
- /* @__PURE__ */ jsx2(
469
- "svg",
470
- {
471
- width: "14",
472
- height: "14",
473
- viewBox: "0 0 24 24",
474
- fill: "currentColor",
475
- "aria-hidden": "true",
476
- children: /* @__PURE__ */ jsx2("path", { d: "M12 .5a12 12 0 0 0-3.8 23.39c.6.11.82-.26.82-.58v-2c-3.34.73-4.04-1.61-4.04-1.61-.55-1.39-1.34-1.76-1.34-1.76-1.1-.75.08-.74.08-.74 1.21.09 1.85 1.24 1.85 1.24 1.07 1.84 2.81 1.31 3.5 1 .11-.78.42-1.31.76-1.61-2.66-.3-5.47-1.33-5.47-5.93 0-1.31.47-2.38 1.24-3.22-.12-.3-.54-1.52.12-3.17 0 0 1-.32 3.3 1.23a11.5 11.5 0 0 1 6 0c2.28-1.55 3.29-1.23 3.29-1.23.66 1.65.25 2.87.12 3.17.77.84 1.24 1.91 1.24 3.22 0 4.61-2.81 5.62-5.49 5.92.43.37.81 1.1.81 2.22v3.29c0 .32.22.7.83.58A12 12 0 0 0 12 .5Z" })
477
- }
478
- ),
479
- "GitHub"
480
- ]
481
- }
482
- ) : null
483
- ] })
457
+ /* @__PURE__ */ jsx2("nav", { className: "np-docs-nav", "aria-label": "Primary", children: /* @__PURE__ */ jsx2(NavMenu, { location: "header", className: "np-docs-primary-nav" }) })
484
458
  ] }) });
485
459
  }
486
460
 
@@ -1115,7 +1089,7 @@ var docsCss = `
1115
1089
  margin: 0 auto;
1116
1090
  padding: 0.7rem 1.5rem;
1117
1091
  display: grid;
1118
- grid-template-columns: minmax(220px, 1fr) minmax(0, 2fr) auto;
1092
+ grid-template-columns: auto 1fr auto;
1119
1093
  gap: 1.5rem;
1120
1094
  align-items: center;
1121
1095
  }
@@ -1145,7 +1119,6 @@ var docsCss = `
1145
1119
  opacity: 0.95;
1146
1120
  clip-path: polygon(0 0, 100% 0, 100% 100%, 60% 100%, 0 35%);
1147
1121
  }
1148
- .np-docs-brand-name { font-weight: 700; }
1149
1122
  .np-docs-brand-version {
1150
1123
  font-family: var(--np-font-mono);
1151
1124
  font-size: 0.72rem;
@@ -1221,24 +1194,6 @@ var docsCss = `
1221
1194
  .np-docs-primary-nav a[aria-current="page"] {
1222
1195
  color: var(--np-color-foreground);
1223
1196
  }
1224
- .np-docs-github,
1225
- .np-docs-github-link {
1226
- display: inline-flex;
1227
- align-items: center;
1228
- gap: 0.45rem;
1229
- padding: 0.4rem 0.7rem;
1230
- font-size: 0.8125rem;
1231
- color: var(--np-color-muted-foreground);
1232
- background: var(--np-color-muted);
1233
- border: 1px solid var(--np-color-border);
1234
- border-radius: 7px;
1235
- text-decoration: none;
1236
- }
1237
- .np-docs-github:hover,
1238
- .np-docs-github-link:hover {
1239
- color: var(--np-color-foreground);
1240
- }
1241
-
1242
1197
  @media (max-width: 800px) {
1243
1198
  .np-docs-header-inner {
1244
1199
  grid-template-columns: auto 1fr auto;
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-front.tsx"],"sourcesContent":["import {\n defineTheme,\n type NpThemeSeedPage,\n type NpThemeSeedPost,\n} 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 { PageFrontTemplate } from \"./templates/page-front.js\";\n\nconst SEED_NAV = {\n header: [\n { id: \"nav-docs-docs\", label: \"Docs\", type: \"link\" as const, url: \"/docs\" },\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: \"/docs\" },\n { id: \"nav-docs-footer-reference\", label: \"Reference\", type: \"link\" as const, url: \"/docs/reference\" },\n { id: \"nav-docs-footer-changelog\", label: \"Changelog\", type: \"link\" as const, url: \"/changelog\" },\n { id: \"nav-docs-footer-github\", label: \"GitHub\", type: \"link\" as const, url: \"https://github.com\" },\n ],\n};\n\n\nfunction paragraph(text: string) {\n return {\n type: \"paragraph\", version: 1, direction: null, format: \"\", indent: 0,\n children: [{\n type: \"text\", version: 1, detail: 0, format: 0, mode: \"normal\", style: \"\", text,\n }],\n };\n}\n\nfunction heading(tag: \"h2\" | \"h3\", text: string) {\n return {\n type: \"heading\", tag, version: 1, direction: null, format: \"\", indent: 0,\n children: [{\n type: \"text\", version: 1, detail: 0, format: 0, mode: \"normal\", style: \"\", text,\n }],\n };\n}\n\nfunction codeBlock(text: string, language?: string) {\n return {\n type: \"code\", language: language ?? null, version: 1, direction: null, format: \"\", indent: 0,\n children: [{\n type: \"text\", version: 1, detail: 0, format: 0, mode: \"normal\", style: \"\", text,\n }],\n };\n}\n\nfunction listItem(text: string) {\n return {\n type: \"listitem\", value: 1, version: 1, direction: null, format: \"\", indent: 0,\n children: [{\n type: \"text\", version: 1, detail: 0, format: 0, mode: \"normal\", style: \"\", text,\n }],\n };\n}\n\nfunction bulletList(items: string[]) {\n return {\n type: \"list\", listType: \"bullet\", start: 1, tag: \"ul\",\n version: 1, direction: null, format: \"\", indent: 0,\n children: items.map((t) => listItem(t)),\n };\n}\n\nfunction lexicalDoc(blocks: unknown[]): unknown {\n return {\n root: {\n type: \"root\", version: 1, direction: null, format: \"\", 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(`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 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: the dev server 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(\n \"You have a plugin that runs. Two natural directions from here:\",\n ),\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\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({ title: \"Install & bootstrap\", parentSlug: \"get-started\", order: 1, stableSince: \"Stable since 0.1\" }),\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({ title: \"Collections\", parentSlug: \"core-concepts\", order: 0, stableSince: \"Stable since 0.1\" }),\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: \"Plugin overview\", parentSlug: \"plugins\", order: 0 }),\n {\n title: \"Author quickstart\",\n excerpt:\n \"From \\\"I want to add behavior to NexPress\\\" to a running plugin in about ten minutes. Walks through the manifest, a lifecycle hook, and shipping the result to your own site.\",\n content: QUICKSTART_BODY,\n publishedAt: DOCS_NOW,\n kind: \"doc\",\n parentSlug: \"plugins\",\n order: 1,\n data: {\n badge: \"NEW\",\n lede:\n \"From \\\"I want to add behavior to NexPress\\\" to a running plugin in about ten minutes. Walks through the manifest, a lifecycle hook, and shipping the result to your own site.\",\n stableSince: \"Stable since 0.1\",\n },\n },\n stubDoc({ title: \"Manifest reference\", parentSlug: \"plugins\", order: 2 }),\n stubDoc({ title: \"Lifecycle hooks\", 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 },\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};\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:\n \"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 ? (\n <span className=\"np-docs-brand-version\">{language}</span>\n ) : 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\n .filter(isRecord)\n .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\nfunction readApiColumns(value: unknown): string[] {\n if (!Array.isArray(value)) return [];\n return value.filter((cell): cell is string => typeof cell === \"string\");\n}\n\nfunction readApiRows(value: unknown): ApiRow[] {\n if (!Array.isArray(value)) return [];\n return value.filter(isRecord).map((row) => ({\n cells: readApiColumns(row.cells),\n required: row.required === true,\n }));\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: [\n { name: \"value\", label: \"Header\", type: \"text\", defaultValue: \"Column\" },\n ],\n },\n {\n name: \"rows\",\n label: \"Rows\",\n type: \"array\",\n defaultValue: [\n { cells: [\"slug\", \"string\", \"Unique URL fragment.\"], required: true },\n ],\n itemDefault: { cells: [], required: false },\n itemSchema: [\n {\n name: \"cells\",\n label: \"Cells\",\n type: \"array\",\n defaultValue: [],\n itemDefault: { value: \"\" },\n itemSchema: [\n { name: \"value\", label: \"Cell\", type: \"text\", defaultValue: \"\" },\n ],\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 +\n * GitHub repo link on the right.\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>`; wiring it to a global hotkey\n * is a separate client island sites can add on top.\n *\n * The GitHub link reads `settings.githubRepo`. When the admin\n * setting is unset, the link is hidden.\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 className=\"np-docs-brand-name\">{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 {settings.githubRepo ? (\n <a\n href={settings.githubRepo}\n className=\"np-docs-github\"\n target=\"_blank\"\n rel=\"noreferrer\"\n aria-label=\"GitHub repository\"\n >\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n aria-hidden=\"true\"\n >\n <path d=\"M12 .5a12 12 0 0 0-3.8 23.39c.6.11.82-.26.82-.58v-2c-3.34.73-4.04-1.61-4.04-1.61-.55-1.39-1.34-1.76-1.34-1.76-1.1-.75.08-.74.08-.74 1.21.09 1.85 1.24 1.85 1.24 1.07 1.84 2.81 1.31 3.5 1 .11-.78.42-1.31.76-1.61-2.66-.3-5.47-1.33-5.47-5.93 0-1.31.47-2.38 1.24-3.22-.12-.3-.54-1.52.12-3.17 0 0 1-.32 3.3 1.23a11.5 11.5 0 0 1 6 0c2.28-1.55 3.29-1.23 3.29-1.23.66 1.65.25 2.87.12 3.17.77.84 1.24 1.91 1.24 3.22 0 4.61-2.81 5.62-5.49 5.92.43.37.81 1.1.81 2.22v3.29c0 .32.22.7.83.58A12 12 0 0 0 12 .5Z\" />\n </svg>\n GitHub\n </a>\n ) : null}\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&apos;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>&ldquo;{query}&rdquo;</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/* ============================================================\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: minmax(220px, 1fr) minmax(0, 2fr) 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-name { font-weight: 700; }\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.np-docs-github,\n.np-docs-github-link {\n display: inline-flex;\n align-items: center;\n gap: 0.45rem;\n padding: 0.4rem 0.7rem;\n font-size: 0.8125rem;\n color: var(--np-color-muted-foreground);\n background: var(--np-color-muted);\n border: 1px solid var(--np-color-border);\n border-radius: 7px;\n text-decoration: none;\n}\n.np-docs-github:hover,\n.np-docs-github-link:hover {\n color: var(--np-color-foreground);\n}\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 * 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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AA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;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","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-front.tsx"],"sourcesContent":["import {\n defineTheme,\n type NpThemeSeedPage,\n type NpThemeSeedPost,\n} 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 { PageFrontTemplate } from \"./templates/page-front.js\";\n\nconst SEED_NAV = {\n header: [\n { id: \"nav-docs-docs\", label: \"Docs\", type: \"link\" as const, url: \"/docs\" },\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: \"/docs\" },\n { id: \"nav-docs-footer-reference\", label: \"Reference\", type: \"link\" as const, url: \"/docs/reference\" },\n { id: \"nav-docs-footer-changelog\", label: \"Changelog\", type: \"link\" as const, url: \"/changelog\" },\n { id: \"nav-docs-footer-github\", label: \"GitHub\", type: \"link\" as const, url: \"https://github.com\" },\n ],\n};\n\n\nfunction paragraph(text: string) {\n return {\n type: \"paragraph\", version: 1, direction: null, format: \"\", indent: 0,\n children: [{\n type: \"text\", version: 1, detail: 0, format: 0, mode: \"normal\", style: \"\", text,\n }],\n };\n}\n\nfunction heading(tag: \"h2\" | \"h3\", text: string) {\n return {\n type: \"heading\", tag, version: 1, direction: null, format: \"\", indent: 0,\n children: [{\n type: \"text\", version: 1, detail: 0, format: 0, mode: \"normal\", style: \"\", text,\n }],\n };\n}\n\nfunction codeBlock(text: string, language?: string) {\n return {\n type: \"code\", language: language ?? null, version: 1, direction: null, format: \"\", indent: 0,\n children: [{\n type: \"text\", version: 1, detail: 0, format: 0, mode: \"normal\", style: \"\", text,\n }],\n };\n}\n\nfunction listItem(text: string) {\n return {\n type: \"listitem\", value: 1, version: 1, direction: null, format: \"\", indent: 0,\n children: [{\n type: \"text\", version: 1, detail: 0, format: 0, mode: \"normal\", style: \"\", text,\n }],\n };\n}\n\nfunction bulletList(items: string[]) {\n return {\n type: \"list\", listType: \"bullet\", start: 1, tag: \"ul\",\n version: 1, direction: null, format: \"\", indent: 0,\n children: items.map((t) => listItem(t)),\n };\n}\n\nfunction lexicalDoc(blocks: unknown[]): unknown {\n return {\n root: {\n type: \"root\", version: 1, direction: null, format: \"\", 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(`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 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: the dev server 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(\n \"You have a plugin that runs. Two natural directions from here:\",\n ),\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\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({ title: \"Install & bootstrap\", parentSlug: \"get-started\", order: 1, stableSince: \"Stable since 0.1\" }),\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({ title: \"Collections\", parentSlug: \"core-concepts\", order: 0, stableSince: \"Stable since 0.1\" }),\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: \"Plugin overview\", parentSlug: \"plugins\", order: 0 }),\n {\n title: \"Author quickstart\",\n excerpt:\n \"From \\\"I want to add behavior to NexPress\\\" to a running plugin in about ten minutes. Walks through the manifest, a lifecycle hook, and shipping the result to your own site.\",\n content: QUICKSTART_BODY,\n publishedAt: DOCS_NOW,\n kind: \"doc\",\n parentSlug: \"plugins\",\n order: 1,\n data: {\n badge: \"NEW\",\n lede:\n \"From \\\"I want to add behavior to NexPress\\\" to a running plugin in about ten minutes. Walks through the manifest, a lifecycle hook, and shipping the result to your own site.\",\n stableSince: \"Stable since 0.1\",\n },\n },\n stubDoc({ title: \"Manifest reference\", parentSlug: \"plugins\", order: 2 }),\n stubDoc({ title: \"Lifecycle hooks\", 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 },\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};\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:\n \"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 ? (\n <span className=\"np-docs-brand-version\">{language}</span>\n ) : 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\n .filter(isRecord)\n .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\nfunction readApiColumns(value: unknown): string[] {\n if (!Array.isArray(value)) return [];\n return value.filter((cell): cell is string => typeof cell === \"string\");\n}\n\nfunction readApiRows(value: unknown): ApiRow[] {\n if (!Array.isArray(value)) return [];\n return value.filter(isRecord).map((row) => ({\n cells: readApiColumns(row.cells),\n required: row.required === true,\n }));\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: [\n { name: \"value\", label: \"Header\", type: \"text\", defaultValue: \"Column\" },\n ],\n },\n {\n name: \"rows\",\n label: \"Rows\",\n type: \"array\",\n defaultValue: [\n { cells: [\"slug\", \"string\", \"Unique URL fragment.\"], required: true },\n ],\n itemDefault: { cells: [], required: false },\n itemSchema: [\n {\n name: \"cells\",\n label: \"Cells\",\n type: \"array\",\n defaultValue: [],\n itemDefault: { value: \"\" },\n itemSchema: [\n { name: \"value\", label: \"Cell\", type: \"text\", defaultValue: \"\" },\n ],\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&apos;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>&ldquo;{query}&rdquo;</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/* ============================================================\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 * 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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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","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.5",
3
+ "version": "0.3.7",
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.5",
52
- "@nexpress/core": "0.3.5",
53
- "@nexpress/editor": "0.3.5",
54
- "@nexpress/next": "0.3.5",
55
- "@nexpress/theme": "0.3.5"
51
+ "@nexpress/blocks": "0.3.7",
52
+ "@nexpress/core": "0.3.7",
53
+ "@nexpress/editor": "0.3.7",
54
+ "@nexpress/next": "0.3.7",
55
+ "@nexpress/theme": "0.3.7"
56
56
  },
57
57
  "devDependencies": {
58
58
  "@types/react": "^19.0.0",