@knkcs/anker 2.0.3 → 2.0.4
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/templates/index.js
CHANGED
|
@@ -593,7 +593,7 @@ function SettingsPageTemplate({
|
|
|
593
593
|
if (bodyTabs) {
|
|
594
594
|
const tabsRootProps = bodyTabs.value !== void 0 ? {
|
|
595
595
|
value: bodyTabs.value,
|
|
596
|
-
onValueChange: (d) => bodyTabs.onValueChange(d.value)
|
|
596
|
+
onValueChange: (d) => bodyTabs.onValueChange?.(d.value)
|
|
597
597
|
} : { defaultValue: bodyTabs.defaultValue };
|
|
598
598
|
return /* @__PURE__ */ jsxs(
|
|
599
599
|
Flex,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/templates/app-shell.tsx","../../src/templates/auth-page-template.tsx","../../src/templates/dashboard-page-template.tsx","../../src/templates/detail-page-template.tsx","../../src/templates/error-page.tsx","../../src/templates/index-page-template.tsx","../../src/templates/loading-page.tsx","../../src/templates/maintenance-page.tsx","../../src/templates/marketing-page-template.tsx","../../src/templates/settings-page-template.tsx"],"names":["jsx","jsxs"],"mappings":"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","file":"index.js","sourcesContent":["// src/templates/app-shell.tsx\n//\n// AppShell — top-level layout for authenticated knkCMS pages.\n//\n// Composition: a 3-column CSS grid with a fixed-width sidebar, a fluid main\n// content column, and an optional fixed-width context rail.\n//\n// ┌─────────┬───────────────────────────┬─────────┐\n// │ │ │ │\n// │ sidebar │ children │ rail │\n// │ │ (page header / content) │ │\n// │ │ │ │\n// └─────────┴───────────────────────────┴─────────┘\n//\n// Slot mechanism\n// --------------\n// AppShell installs an external slot store on its descendants via context.\n// Two named slots are exposed:\n//\n// - \"actions\" — registered via `usePageActions(node)` — surfaced by page\n// templates inside their <PageHeader actions=…> slot.\n// - \"rail\" — registered via `usePageRail(node)` — surfaced by AppShell\n// as the content of the right rail column.\n//\n// The store uses `useSyncExternalStore` so that producers (deep child\n// components rendered after the consumer) and consumers (AppShell, the page\n// templates) stay decoupled. A naive `useState`-based context would force the\n// consumer to render in the same React commit as the producer, which causes\n// the actions/rail to flicker on route changes (the Path-B fix originally\n// shipped in odon as PR #115). The external-store pattern lets the producer\n// register its content in a `useEffect`, the consumer re-reads on the next\n// browser frame, and React's concurrent renderer is happy.\n\nimport {\n\tcreateContext,\n\ttype ReactNode,\n\tuseCallback,\n\tuseContext,\n\tuseEffect,\n\tuseMemo,\n\tuseRef,\n\tuseSyncExternalStore,\n} from \"react\";\nimport { Box, Flex, Grid } from \"../primitives/layout\";\n\ntype SlotName = \"actions\" | \"rail\";\n\ninterface SlotStore {\n\tget(slot: SlotName): ReactNode;\n\tset(slot: SlotName, node: ReactNode): void;\n\tclear(slot: SlotName): void;\n\tsubscribe(slot: SlotName, listener: () => void): () => void;\n}\n\nfunction createSlotStore(): SlotStore {\n\tconst values: Record<SlotName, ReactNode> = {\n\t\tactions: null,\n\t\trail: null,\n\t};\n\tconst listeners: Record<SlotName, Set<() => void>> = {\n\t\tactions: new Set(),\n\t\trail: new Set(),\n\t};\n\n\tfunction notify(slot: SlotName) {\n\t\tfor (const listener of listeners[slot]) listener();\n\t}\n\n\treturn {\n\t\tget(slot) {\n\t\t\treturn values[slot];\n\t\t},\n\t\tset(slot, node) {\n\t\t\tif (values[slot] === node) return;\n\t\t\tvalues[slot] = node;\n\t\t\tnotify(slot);\n\t\t},\n\t\tclear(slot) {\n\t\t\tif (values[slot] === null) return;\n\t\t\tvalues[slot] = null;\n\t\t\tnotify(slot);\n\t\t},\n\t\tsubscribe(slot, listener) {\n\t\t\tlisteners[slot].add(listener);\n\t\t\treturn () => {\n\t\t\t\tlisteners[slot].delete(listener);\n\t\t\t};\n\t\t},\n\t};\n}\n\nconst SlotStoreContext = createContext<SlotStore | null>(null);\n\n/**\n * Read-side hook used internally by AppShell and the page templates to\n * subscribe to a named slot's currently-registered ReactNode. Returns `null`\n * when no producer has registered content (or when called outside an AppShell).\n */\nfunction useSlotValue(slot: SlotName): ReactNode {\n\tconst store = useContext(SlotStoreContext);\n\tconst subscribe = useCallback(\n\t\t(listener: () => void) => {\n\t\t\tif (!store) return () => undefined;\n\t\t\treturn store.subscribe(slot, listener);\n\t\t},\n\t\t[store, slot],\n\t);\n\tconst getSnapshot = useCallback(() => {\n\t\tif (!store) return null;\n\t\treturn store.get(slot);\n\t}, [store, slot]);\n\treturn useSyncExternalStore(subscribe, getSnapshot, getSnapshot);\n}\n\n/**\n * Register page-action content (typically buttons rendered to the right of\n * the page title) from any descendant of `<AppShell>`. The content is\n * surfaced by the active page template inside its `<PageHeader>` actions\n * slot.\n *\n * Pass `null` (or omit) to clear the registration. The hook is a no-op when\n * called outside an AppShell, which keeps it safe to use in stories and\n * isolated component tests.\n */\nexport function usePageActions(content: ReactNode): void {\n\tconst store = useContext(SlotStoreContext);\n\t// Stash the most recent content in a ref so the effect can run on every\n\t// render without forcing a fresh effect-cleanup cycle for unstable nodes.\n\tconst latest = useRef<ReactNode>(content);\n\tlatest.current = content;\n\tuseEffect(() => {\n\t\tif (!store) return;\n\t\tstore.set(\"actions\", latest.current);\n\t\treturn () => {\n\t\t\tstore.clear(\"actions\");\n\t\t};\n\t}, [store]);\n\t// Re-register on every change of `content` (effect above only runs once\n\t// per mount; this second effect re-pushes the latest value).\n\tuseEffect(() => {\n\t\tif (!store) return;\n\t\tstore.set(\"actions\", content);\n\t}, [store, content]);\n}\n\n/**\n * Register context-rail content from any descendant of `<AppShell>`. The\n * content is rendered in the rail column (assuming the AppShell has a rail\n * slot enabled).\n *\n * Pass `null` (or omit) to clear the registration. The hook is a no-op when\n * called outside an AppShell.\n */\nexport function usePageRail(content: ReactNode): void {\n\tconst store = useContext(SlotStoreContext);\n\tconst latest = useRef<ReactNode>(content);\n\tlatest.current = content;\n\tuseEffect(() => {\n\t\tif (!store) return;\n\t\tstore.set(\"rail\", latest.current);\n\t\treturn () => {\n\t\t\tstore.clear(\"rail\");\n\t\t};\n\t}, [store]);\n\tuseEffect(() => {\n\t\tif (!store) return;\n\t\tstore.set(\"rail\", content);\n\t}, [store, content]);\n}\n\n/**\n * Internal hook used by page templates to read the currently-registered\n * page-actions ReactNode. Page templates fall back to a locally-passed\n * `actions` prop when nothing is registered.\n */\nexport function useRegisteredPageActions(): ReactNode {\n\treturn useSlotValue(\"actions\");\n}\n\nexport interface AppShellProps {\n\t/**\n\t * Sidebar element — the navigation column. Required. Typically an instance\n\t * of `<Sidebar>` from `@knkcs/anker/components`. AppShell does not own the\n\t * sidebar's collapsed-state — pass it through the Sidebar's own props.\n\t */\n\tsidebar: ReactNode;\n\t/**\n\t * Context rail element. Acts as a *fallback* for the rail column: it\n\t * renders when no descendant has registered rail content via\n\t * `usePageRail`. Registered content always wins over the prop.\n\t *\n\t * The rail column is enabled — and a grid track is reserved — when *either*\n\t * a `rail` prop is supplied *or* a descendant has registered rail content.\n\t * Omit both (or pass `null`) to drop the rail column entirely.\n\t */\n\trail?: ReactNode;\n\t/** Page content. */\n\tchildren: ReactNode;\n}\n\n/**\n * AppShell is the top-level layout for authenticated knkCMS pages. It owns\n * the slot context that powers `usePageActions` and `usePageRail`, and\n * arranges sidebar / main / rail in a 3-column CSS grid.\n *\n * AppShell is layout-only — it does not render a PageHeader, and it does not\n * inject any business chrome. Pages compose `<IndexPageTemplate>`,\n * `<DetailPageTemplate>`, etc. inside `children`.\n *\n * Rail precedence: content registered by a descendant via `usePageRail` wins\n * over the static `rail` prop. The prop is the fallback when no descendant\n * has registered content. Rationale: a descendant explicitly registering\n * content is signaling \"show this here\", which should trump the static prop.\n */\nexport function AppShell({ sidebar, rail, children }: AppShellProps) {\n\t// AppShell is split into an outer Provider and an inner Renderer so the\n\t// renderer's `useContext(SlotStoreContext)` resolves to *our* store rather\n\t// than the parent context. (A naive single component that both provides\n\t// and consumes the context at the same level reads the parent context —\n\t// the Provider only takes effect for descendants.)\n\tconst store = useMemo(() => createSlotStore(), []);\n\treturn (\n\t\t<SlotStoreContext.Provider value={store}>\n\t\t\t<AppShellInner sidebar={sidebar} rail={rail}>\n\t\t\t\t{children}\n\t\t\t</AppShellInner>\n\t\t</SlotStoreContext.Provider>\n\t);\n}\nAppShell.displayName = \"AppShell\";\n\nfunction AppShellInner({ sidebar, rail, children }: AppShellProps) {\n\tconst railNode = useSlotValue(\"rail\");\n\n\t// Precedence: registered rail content wins, fall back to the `rail` prop.\n\t// The rail column is enabled when *either* the consumer passed a `rail`\n\t// element *or* a descendant registered content via `usePageRail`.\n\tconst renderedRail = railNode ?? rail;\n\tconst showRailColumn =\n\t\trenderedRail !== undefined &&\n\t\trenderedRail !== null &&\n\t\trenderedRail !== false;\n\n\treturn (\n\t\t<Grid\n\t\t\tdata-testid=\"app-shell\"\n\t\t\tdata-rail={showRailColumn ? \"true\" : \"false\"}\n\t\t\ttemplateColumns={showRailColumn ? \"auto 1fr auto\" : \"auto 1fr\"}\n\t\t\tminH=\"100vh\"\n\t\t\tbg=\"bg-canvas\"\n\t\t>\n\t\t\t<Box\n\t\t\t\tdata-testid=\"app-shell-sidebar\"\n\t\t\t\tgridColumn=\"1\"\n\t\t\t\tminW=\"0\"\n\t\t\t\tposition=\"sticky\"\n\t\t\t\ttop=\"0\"\n\t\t\t\talignSelf=\"start\"\n\t\t\t\tmaxH=\"100vh\"\n\t\t\t\toverflowY=\"auto\"\n\t\t\t>\n\t\t\t\t{sidebar}\n\t\t\t</Box>\n\t\t\t<Flex\n\t\t\t\tdata-testid=\"app-shell-main\"\n\t\t\t\tgridColumn=\"2\"\n\t\t\t\tdirection=\"column\"\n\t\t\t\tminW=\"0\"\n\t\t\t\tminH=\"100vh\"\n\t\t\t\tbg=\"bg-canvas\"\n\t\t\t\tborderLeftWidth=\"1px\"\n\t\t\t\tborderColor=\"border\"\n\t\t\t>\n\t\t\t\t{children}\n\t\t\t</Flex>\n\t\t\t{showRailColumn ? (\n\t\t\t\t<Box\n\t\t\t\t\tdata-testid=\"app-shell-rail\"\n\t\t\t\t\tgridColumn=\"3\"\n\t\t\t\t\tminW=\"0\"\n\t\t\t\t\tposition=\"sticky\"\n\t\t\t\t\ttop=\"0\"\n\t\t\t\t\talignSelf=\"start\"\n\t\t\t\t\tmaxH=\"100vh\"\n\t\t\t\t\toverflowY=\"auto\"\n\t\t\t\t\tbg=\"bg-surface\"\n\t\t\t\t\tborderLeftWidth=\"1px\"\n\t\t\t\t\tborderColor=\"border\"\n\t\t\t\t>\n\t\t\t\t\t{renderedRail}\n\t\t\t\t</Box>\n\t\t\t) : null}\n\t\t</Grid>\n\t);\n}\nAppShellInner.displayName = \"AppShellInner\";\n","// src/templates/auth-page-template.tsx\n//\n// AuthPageTemplate — full-bleed centered card on a neutral canvas. No app\n// shell, no sidebar, no rail. Used for login, register, MFA challenge,\n// forgot/reset password, and email-verification screens.\n//\n// Internally this is a thin wrapper around `<AuthCard>` (in\n// `@knkcs/anker/components`) — surfaced under the templates module so\n// consumers can import their layout chrome from one entry point.\n//\n// We re-expose the wrapper rather than re-implementing it because AuthCard\n// is already battle-tested and stable; the templates module is the consumer\n// contract, AuthCard is the implementation.\n\nimport type { ReactNode } from \"react\";\nimport { AuthCard, type AuthCardProps } from \"../components/auth-card\";\n\nexport interface AuthPageTemplateProps extends AuthCardProps {\n\t/**\n\t * Page body — typically a form or a verification CTA. Inherits all\n\t * AuthCard slots (logo, topBarRight, eyebrow, title, subtitle, footer).\n\t */\n\tchildren: ReactNode;\n}\n\n/**\n * Auth-flow page layout. Use for any pre-authentication screen (login,\n * register, MFA, forgot-password, reset-password) and for short\n * confirmation flows (email-verify, account-deleted). For consent\n * dialogs, prefer `<OAuthConsentPageTemplate>` (denser layout).\n *\n * The template supplies a centered card with a dot-grid background, an\n * optional topbar with logo + locale switcher, and a footer slot. To hide\n * the topbar (rare — embedded preview, printable receipts) pass\n * `hideTopBar`. To hide the dot-grid (printable) pass `hideBackground`.\n */\nexport function AuthPageTemplate(props: AuthPageTemplateProps) {\n\treturn <AuthCard {...props} />;\n}\nAuthPageTemplate.displayName = \"AuthPageTemplate\";\n","// src/templates/dashboard-page-template.tsx\n//\n// DashboardPageTemplate — for at-a-glance overview pages composed of a grid\n// of widgets (Stat cards, mini-charts, recent-activity panes, etc.).\n//\n// ┌─────────────────────────────────────────┐\n// │ PageHeader (greeting · range picker) │\n// ├─────────────────────────────────────────┤\n// │ ┌──────┬──────┬──────┬──────┐ │\n// │ │ stat │ stat │ stat │ stat │ │\n// │ ├──────┴──────┼──────┴──────┤ │\n// │ │ widget │ widget │ │\n// │ │ │ │ │\n// │ ├─────────────┴─────────────┤ │\n// │ │ wide widget │ │\n// │ └───────────────────────────┘ │\n// └─────────────────────────────────────────┘\n//\n// The template provides the page chrome and a 12-column responsive grid.\n// Widgets opt into the column count via Chakra's `gridColumn` prop on each\n// child. Inspired by Linear's \"All issues\" overview and GitHub's repo\n// insights — calm surfaces, dense info, clear hierarchy.\n\nimport type { ReactNode } from \"react\";\nimport { PageHeader, type PageHeaderProps } from \"../components/page-header\";\nimport { Box, Flex, Grid } from \"../primitives/layout\";\nimport { useRegisteredPageActions } from \"./app-shell\";\n\nexport interface DashboardPageTemplateProps\n\textends Pick<\n\t\tPageHeaderProps,\n\t\t\"breadcrumbs\" | \"title\" | \"subtitle\" | \"eyebrow\"\n\t> {\n\tactions?: ReactNode;\n\t/**\n\t * Dashboard widgets. Children are placed inside a 12-column responsive\n\t * CSS grid with `gap=\"4\"`. Each child should set `gridColumn` (e.g.\n\t * `\"span 3\"` for a quarter-width tile, `\"span 6\"` for half, `\"span 12\"`\n\t * for full-width). The default per-child column span is `\"span 12\"`.\n\t */\n\tchildren: ReactNode;\n\t/**\n\t * Override the grid `gap` between widgets. @default \"4\" (= 16px)\n\t */\n\tgap?: string;\n}\n\nexport function DashboardPageTemplate({\n\tbreadcrumbs,\n\ttitle,\n\tsubtitle,\n\teyebrow,\n\tactions,\n\tchildren,\n\tgap = \"4\",\n}: DashboardPageTemplateProps) {\n\tconst registered = useRegisteredPageActions();\n\tconst resolvedActions = actions ?? registered;\n\treturn (\n\t\t<Flex\n\t\t\tdata-testid=\"dashboard-page-template\"\n\t\t\tdirection=\"column\"\n\t\t\tflex=\"1\"\n\t\t\tminH=\"0\"\n\t\t>\n\t\t\t<PageHeader\n\t\t\t\tbreadcrumbs={breadcrumbs}\n\t\t\t\ttitle={title}\n\t\t\t\tsubtitle={subtitle}\n\t\t\t\teyebrow={eyebrow}\n\t\t\t\tactions={resolvedActions}\n\t\t\t/>\n\t\t\t<Box flex=\"1\" minH=\"0\" px=\"8\" py=\"6\">\n\t\t\t\t<Grid\n\t\t\t\t\tdata-testid=\"dashboard-grid\"\n\t\t\t\t\ttemplateColumns=\"repeat(12, minmax(0, 1fr))\"\n\t\t\t\t\tgap={gap}\n\t\t\t\t>\n\t\t\t\t\t{children}\n\t\t\t\t</Grid>\n\t\t\t</Box>\n\t\t</Flex>\n\t);\n}\nDashboardPageTemplate.displayName = \"DashboardPageTemplate\";\n","// src/templates/detail-page-template.tsx\n//\n// DetailPageTemplate — the canonical \"single entity\" page layout.\n//\n// Composition:\n//\n// ┌─────────────────────────────────────────┐\n// │ PageHeader (breadcrumbs · title · …) │\n// ├─────────────────────────────────────────┤\n// │ subheader (optional — e.g. identity card)│\n// ├─────────────────────────────────────────┤\n// │ Tabs (optional — pinned beneath subhead) │\n// ├─────────────────────────────────────────┤\n// │ children OR bodyTabs panes │\n// └─────────────────────────────────────────┘\n//\n// Two ways to render tabs:\n//\n// 1. `bodyTabs` — declarative panels owned by the template. Template wraps\n// Tabs.Root with `lazyMount unmountOnExit` so only the active panel\n// mounts. Use this for any case where each tab has its own body\n// component (Members, Security, Sessions panes).\n//\n// 2. `tabs` — ReactNode slot for nav-mode or filter-mode tab strips\n// (Tabs.List with no Tabs.Content; the body comes from `children`,\n// typically a route's outlet). Use this when each tab is a separate\n// route or when tab state is controlled externally.\n//\n// `bodyTabs` and `tabs` are mutually exclusive. Passing both throws.\n\nimport type { ReactNode } from \"react\";\nimport { PageHeader, type PageHeaderProps } from \"../components/page-header\";\nimport { Box, Flex } from \"../primitives/layout\";\nimport { Tabs } from \"../primitives/tabs\";\nimport { useRegisteredPageActions } from \"./app-shell\";\n\nexport interface BodyTabsItem {\n\tvalue: string;\n\tlabel: ReactNode;\n\tcontent: ReactNode;\n}\n\nexport type BodyTabsProp =\n\t| {\n\t\t\titems: BodyTabsItem[];\n\t\t\tdefaultValue: string;\n\t\t\tvalue?: never;\n\t\t\tonValueChange?: never;\n\t }\n\t| {\n\t\t\titems: BodyTabsItem[];\n\t\t\tvalue: string;\n\t\t\tonValueChange: (next: string) => void;\n\t\t\tdefaultValue?: never;\n\t };\n\nexport interface DetailPageTemplateProps\n\textends Pick<\n\t\tPageHeaderProps,\n\t\t\"breadcrumbs\" | \"title\" | \"subtitle\" | \"eyebrow\"\n\t> {\n\tactions?: ReactNode;\n\t/**\n\t * Tab strip rendered immediately under the PageHeader / subheader.\n\t * Use this for nav-mode/filter-mode tabs (Tabs.List, no Tabs.Content);\n\t * the body comes from `children`. For owned-panel tabs, use `bodyTabs`\n\t * instead. Mutually exclusive with `bodyTabs`.\n\t */\n\ttabs?: ReactNode;\n\t/**\n\t * Owned-panel tabs. Template renders Tabs.Root with `lazyMount\n\t * unmountOnExit`; only the active item's `content` mounts. Mutually\n\t * exclusive with `tabs` and `children` is ignored when this is set.\n\t */\n\tbodyTabs?: BodyTabsProp;\n\t/**\n\t * ReactNode rendered between the PageHeader and the tabs (or the body\n\t * if no tabs). Use for identity-card-style summaries.\n\t */\n\tsubheader?: ReactNode;\n\t/**\n\t * Page body — rendered when `bodyTabs` is not set. Flush against the\n\t * canvas; add internal padding inside `children` if you need it.\n\t */\n\tchildren?: ReactNode;\n}\n\nexport function DetailPageTemplate({\n\tbreadcrumbs,\n\ttitle,\n\tsubtitle,\n\teyebrow,\n\tactions,\n\ttabs,\n\tbodyTabs,\n\tsubheader,\n\tchildren,\n}: DetailPageTemplateProps) {\n\tif (tabs && bodyTabs) {\n\t\tthrow new Error(\n\t\t\t\"DetailPageTemplate: `tabs` and `bodyTabs` are mutually exclusive — use `bodyTabs` for owned panels, `tabs` for nav/filter strips.\",\n\t\t);\n\t}\n\tconst registered = useRegisteredPageActions();\n\tconst resolvedActions = actions ?? registered;\n\n\tif (bodyTabs) {\n\t\tconst tabsRootProps =\n\t\t\tbodyTabs.value !== undefined\n\t\t\t\t? {\n\t\t\t\t\t\tvalue: bodyTabs.value,\n\t\t\t\t\t\tonValueChange: (d: { value: string }) =>\n\t\t\t\t\t\t\tbodyTabs.onValueChange!(d.value),\n\t\t\t\t\t}\n\t\t\t\t: { defaultValue: bodyTabs.defaultValue };\n\t\treturn (\n\t\t\t<Flex\n\t\t\t\tdata-testid=\"detail-page-template\"\n\t\t\t\tdirection=\"column\"\n\t\t\t\tflex=\"1\"\n\t\t\t\tminH=\"0\"\n\t\t\t>\n\t\t\t\t<PageHeader\n\t\t\t\t\tbreadcrumbs={breadcrumbs}\n\t\t\t\t\ttitle={title}\n\t\t\t\t\tsubtitle={subtitle}\n\t\t\t\t\teyebrow={eyebrow}\n\t\t\t\t\tactions={resolvedActions}\n\t\t\t\t/>\n\t\t\t\t{subheader ? <Box>{subheader}</Box> : null}\n\t\t\t\t<Tabs.Root lazyMount unmountOnExit {...tabsRootProps}>\n\t\t\t\t\t<Box>\n\t\t\t\t\t\t<Tabs.List>\n\t\t\t\t\t\t\t{bodyTabs.items.map((item) => (\n\t\t\t\t\t\t\t\t<Tabs.Trigger key={item.value} value={item.value}>\n\t\t\t\t\t\t\t\t\t{item.label}\n\t\t\t\t\t\t\t\t</Tabs.Trigger>\n\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t</Tabs.List>\n\t\t\t\t\t</Box>\n\t\t\t\t\t<Box flex=\"1\" minH=\"0\">\n\t\t\t\t\t\t{bodyTabs.items.map((item) => (\n\t\t\t\t\t\t\t<Tabs.Content key={item.value} value={item.value}>\n\t\t\t\t\t\t\t\t{item.content}\n\t\t\t\t\t\t\t</Tabs.Content>\n\t\t\t\t\t\t))}\n\t\t\t\t\t</Box>\n\t\t\t\t</Tabs.Root>\n\t\t\t</Flex>\n\t\t);\n\t}\n\n\treturn (\n\t\t<Flex\n\t\t\tdata-testid=\"detail-page-template\"\n\t\t\tdirection=\"column\"\n\t\t\tflex=\"1\"\n\t\t\tminH=\"0\"\n\t\t>\n\t\t\t<PageHeader\n\t\t\t\tbreadcrumbs={breadcrumbs}\n\t\t\t\ttitle={title}\n\t\t\t\tsubtitle={subtitle}\n\t\t\t\teyebrow={eyebrow}\n\t\t\t\tactions={resolvedActions}\n\t\t\t/>\n\t\t\t{subheader ? <Box>{subheader}</Box> : null}\n\t\t\t{tabs ? <Box>{tabs}</Box> : null}\n\t\t\t<Box flex=\"1\" minH=\"0\">\n\t\t\t\t{children}\n\t\t\t</Box>\n\t\t</Flex>\n\t);\n}\nDetailPageTemplate.displayName = \"DetailPageTemplate\";\n","// src/templates/error-page.tsx\n//\n// ErrorPage — full-bleed error layout for 404 / 403 / 500 / generic\n// failures. Centered status code + message + suggested next step. No app\n// shell, no sidebar.\n//\n// We keep it deliberately spare — an enterprise B2B error screen does not\n// need a 404-illustration of an astronaut. The optional `illustration`\n// slot is there for the rare case where a product wants to reach for one\n// (e.g. a dedicated brand \"OOPS\" SVG).\n\nimport type { ReactNode } from \"react\";\nimport { Box, Flex } from \"../primitives/layout\";\nimport { Heading, Text } from \"../primitives/typography\";\n\nexport interface ErrorPageProps {\n\t/**\n\t * Status code (404, 500, 403, …) shown as the page's largest piece of\n\t * type. Pass any string — non-numeric codes like \"OOPS\" work too.\n\t */\n\tstatusCode: ReactNode;\n\t/** Short headline — e.g. \"Page not found\" or \"Something went wrong\". */\n\ttitle: ReactNode;\n\t/**\n\t * One-paragraph explanation. Keep it short — the user is already in a\n\t * frustrated state.\n\t */\n\tdescription?: ReactNode;\n\t/**\n\t * Action(s) — typically one solid button (back home / retry) plus an\n\t * optional secondary link.\n\t */\n\tactions?: ReactNode;\n\t/**\n\t * Optional illustration rendered above the status code. Use sparingly.\n\t */\n\tillustration?: ReactNode;\n\t/**\n\t * Logo or wordmark rendered top-left. Useful for branded error pages\n\t * served from the root domain.\n\t */\n\tlogo?: ReactNode;\n}\n\nexport function ErrorPage({\n\tstatusCode,\n\ttitle,\n\tdescription,\n\tactions,\n\tillustration,\n\tlogo,\n}: ErrorPageProps) {\n\treturn (\n\t\t<Flex\n\t\t\tdata-testid=\"error-page\"\n\t\t\tdirection=\"column\"\n\t\t\tminH=\"100vh\"\n\t\t\tbg=\"bg-canvas\"\n\t\t>\n\t\t\t{logo && (\n\t\t\t\t<Box px=\"8\" py=\"6\">\n\t\t\t\t\t{logo}\n\t\t\t\t</Box>\n\t\t\t)}\n\t\t\t<Flex\n\t\t\t\tflex=\"1\"\n\t\t\t\tdirection=\"column\"\n\t\t\t\talign=\"center\"\n\t\t\t\tjustify=\"center\"\n\t\t\t\tpx=\"8\"\n\t\t\t\tpb=\"16\"\n\t\t\t\ttextAlign=\"center\"\n\t\t\t>\n\t\t\t\t{illustration && <Box mb=\"8\">{illustration}</Box>}\n\t\t\t\t<Text\n\t\t\t\t\tfontSize=\"7xl\"\n\t\t\t\t\tfontWeight=\"semibold\"\n\t\t\t\t\tcolor=\"muted\"\n\t\t\t\t\tletterSpacing=\"-0.04em\"\n\t\t\t\t\tlineHeight=\"1\"\n\t\t\t\t\tmb=\"4\"\n\t\t\t\t>\n\t\t\t\t\t{statusCode}\n\t\t\t\t</Text>\n\t\t\t\t<Heading\n\t\t\t\t\tas=\"h1\"\n\t\t\t\t\tfontSize=\"2xl\"\n\t\t\t\t\tfontWeight=\"semibold\"\n\t\t\t\t\tcolor=\"default\"\n\t\t\t\t\tletterSpacing=\"-0.02em\"\n\t\t\t\t\tmb=\"3\"\n\t\t\t\t>\n\t\t\t\t\t{title}\n\t\t\t\t</Heading>\n\t\t\t\t{description && (\n\t\t\t\t\t<Text fontSize=\"md\" color=\"muted\" lineHeight=\"1.6\" maxW=\"lg\" mb=\"8\">\n\t\t\t\t\t\t{description}\n\t\t\t\t\t</Text>\n\t\t\t\t)}\n\t\t\t\t{actions && (\n\t\t\t\t\t<Flex gap=\"3\" align=\"center\" justify=\"center\">\n\t\t\t\t\t\t{actions}\n\t\t\t\t\t</Flex>\n\t\t\t\t)}\n\t\t\t</Flex>\n\t\t</Flex>\n\t);\n}\nErrorPage.displayName = \"ErrorPage\";\n","// src/templates/index-page-template.tsx\n//\n// IndexPageTemplate — the canonical \"list of items\" page layout.\n//\n// Composition (top to bottom):\n//\n// ┌─────────────────────────────────────────┐\n// │ PageHeader (breadcrumbs · title · …) │\n// ├─────────────────────────────────────────┤\n// │ Tabs (optional — under header) │\n// ├─────────────────────────────────────────┤\n// │ Toolbar (search · filters · count) │\n// ├─────────────────────────────────────────┤\n// │ children (DataTable, list, empty state) │\n// └─────────────────────────────────────────┘\n//\n// Use this template for any \"browse a list\" page: users index, OAuth-clients\n// index, audit-log, etc. The template flushes its content (no horizontal\n// padding) so a full-bleed DataTable sits cleanly under the toolbar. Pages\n// that need padded content should wrap children in a `<Box px=\"8\" py=\"6\">`.\n\nimport type { ReactNode } from \"react\";\nimport { PageHeader, type PageHeaderProps } from \"../components/page-header\";\nimport { Box, Flex } from \"../primitives/layout\";\nimport { useRegisteredPageActions } from \"./app-shell\";\n\nexport interface IndexPageTemplateProps\n\textends Pick<\n\t\tPageHeaderProps,\n\t\t\"breadcrumbs\" | \"title\" | \"subtitle\" | \"eyebrow\"\n\t> {\n\t/**\n\t * Optional explicit page-action content (rendered inside the PageHeader's\n\t * actions slot). When omitted, the template falls back to whatever a\n\t * descendant has registered via `usePageActions`.\n\t */\n\tactions?: ReactNode;\n\t/**\n\t * Optional tab strip rendered between the PageHeader and the toolbar.\n\t * Pass an instance of `<Tabs.Root>` (with its own `<Tabs.List>` and\n\t * `<Tabs.Content>`s). When omitted, no tab strip is rendered.\n\t */\n\ttabs?: ReactNode;\n\t/**\n\t * Toolbar element rendered between the tabs (if any) and the page body.\n\t * Typically an instance of `<Toolbar>` from `@knkcs/anker/components`.\n\t * Pass `null` to omit the toolbar entirely (rare).\n\t */\n\ttoolbar?: ReactNode;\n\t/**\n\t * Page body — DataTable, list, empty state, or error/loading content.\n\t * Rendered flush against the canvas. Add internal padding inside\n\t * `children` if you need it.\n\t */\n\tchildren: ReactNode;\n}\n\n/**\n * Canonical list-page layout. Renders PageHeader → optional Tabs → optional\n * Toolbar → children, full-bleed against the canvas.\n *\n * Page actions are sourced from (in priority order): `actions` prop →\n * registered slot via `usePageActions`. This lets a tab-pane component deep\n * inside `children` register its own actions without prop-drilling.\n */\nexport function IndexPageTemplate({\n\tbreadcrumbs,\n\ttitle,\n\tsubtitle,\n\teyebrow,\n\tactions,\n\ttabs,\n\ttoolbar,\n\tchildren,\n}: IndexPageTemplateProps) {\n\tconst registered = useRegisteredPageActions();\n\tconst resolvedActions = actions ?? registered;\n\treturn (\n\t\t<Flex\n\t\t\tdata-testid=\"index-page-template\"\n\t\t\tdirection=\"column\"\n\t\t\tflex=\"1\"\n\t\t\tminH=\"0\"\n\t\t>\n\t\t\t<PageHeader\n\t\t\t\tbreadcrumbs={breadcrumbs}\n\t\t\t\ttitle={title}\n\t\t\t\tsubtitle={subtitle}\n\t\t\t\teyebrow={eyebrow}\n\t\t\t\tactions={resolvedActions}\n\t\t\t/>\n\t\t\t{tabs ? <Box>{tabs}</Box> : null}\n\t\t\t{toolbar ? <Box>{toolbar}</Box> : null}\n\t\t\t<Box flex=\"1\" minH=\"0\">\n\t\t\t\t{children}\n\t\t\t</Box>\n\t\t</Flex>\n\t);\n}\nIndexPageTemplate.displayName = \"IndexPageTemplate\";\n","// src/templates/loading-page.tsx\n//\n// LoadingPage — full-bleed initial-boot loading screen. Used while the\n// authenticated app shell is being hydrated (auth check, theme loading,\n// initial data fetch). For in-page loading states (e.g. tab switch),\n// prefer a centered <Spinner /> inside the page body — this template is\n// only for the very first frame of the app.\n\nimport type { ReactNode } from \"react\";\nimport { Box, Flex } from \"../primitives/layout\";\nimport { Spinner } from \"../primitives/spinner\";\nimport { Text } from \"../primitives/typography\";\n\nexport interface LoadingPageProps {\n\t/** Optional logo rendered above the spinner. */\n\tlogo?: ReactNode;\n\t/**\n\t * Optional message rendered below the spinner. Keep it short\n\t * (e.g. \"Loading your workspace…\").\n\t */\n\tmessage?: ReactNode;\n}\n\nexport function LoadingPage({ logo, message }: LoadingPageProps) {\n\treturn (\n\t\t<Flex\n\t\t\tdata-testid=\"loading-page\"\n\t\t\tdirection=\"column\"\n\t\t\talign=\"center\"\n\t\t\tjustify=\"center\"\n\t\t\tminH=\"100vh\"\n\t\t\tbg=\"bg-canvas\"\n\t\t\tgap=\"6\"\n\t\t\ttextAlign=\"center\"\n\t\t>\n\t\t\t{logo && <Box>{logo}</Box>}\n\t\t\t<Spinner size=\"lg\" color=\"accent\" />\n\t\t\t{message && (\n\t\t\t\t<Text fontSize=\"sm\" color=\"muted\">\n\t\t\t\t\t{message}\n\t\t\t\t</Text>\n\t\t\t)}\n\t\t</Flex>\n\t);\n}\nLoadingPage.displayName = \"LoadingPage\";\n","// src/templates/maintenance-page.tsx\n//\n// MaintenancePage — full-bleed maintenance/down-for-upgrade screen. No app\n// shell. Surfaces a clear message, an optional ETA, and an optional link\n// to a status page. Operators serve this from a static asset or a\n// fallback handler when the app is offline.\n\nimport type { ReactNode } from \"react\";\nimport { Box, Flex } from \"../primitives/layout\";\nimport { Heading, Text } from \"../primitives/typography\";\n\nexport interface MaintenancePageProps {\n\t/** Logo rendered top-left. */\n\tlogo?: ReactNode;\n\t/** Headline — e.g. \"We'll be right back\". */\n\ttitle?: ReactNode;\n\t/**\n\t * One-paragraph message explaining what's happening and what users\n\t * should do (typically \"wait, we'll be back shortly\").\n\t */\n\tdescription?: ReactNode;\n\t/**\n\t * Estimated-time-of-restoration banner. Pass a string like\n\t * \"Estimated back online: 14:30 UTC\". Rendered below the description.\n\t */\n\teta?: ReactNode;\n\t/**\n\t * Optional link to a status page or twitter status. Pass a fully-\n\t * styled `<Link>` or an `<a>` element.\n\t */\n\tstatusLink?: ReactNode;\n}\n\nexport function MaintenancePage({\n\tlogo,\n\ttitle = \"We'll be right back\",\n\tdescription = \"We're upgrading the service. Please refresh in a few minutes.\",\n\teta,\n\tstatusLink,\n}: MaintenancePageProps) {\n\treturn (\n\t\t<Flex\n\t\t\tdata-testid=\"maintenance-page\"\n\t\t\tdirection=\"column\"\n\t\t\tminH=\"100vh\"\n\t\t\tbg=\"bg-canvas\"\n\t\t>\n\t\t\t{logo && (\n\t\t\t\t<Box px=\"8\" py=\"6\">\n\t\t\t\t\t{logo}\n\t\t\t\t</Box>\n\t\t\t)}\n\t\t\t<Flex\n\t\t\t\tflex=\"1\"\n\t\t\t\tdirection=\"column\"\n\t\t\t\talign=\"center\"\n\t\t\t\tjustify=\"center\"\n\t\t\t\tpx=\"8\"\n\t\t\t\tpb=\"16\"\n\t\t\t\ttextAlign=\"center\"\n\t\t\t>\n\t\t\t\t<Heading\n\t\t\t\t\tas=\"h1\"\n\t\t\t\t\tfontSize=\"3xl\"\n\t\t\t\t\tfontWeight=\"semibold\"\n\t\t\t\t\tcolor=\"default\"\n\t\t\t\t\tletterSpacing=\"-0.02em\"\n\t\t\t\t\tmb=\"4\"\n\t\t\t\t>\n\t\t\t\t\t{title}\n\t\t\t\t</Heading>\n\t\t\t\t{description && (\n\t\t\t\t\t<Text fontSize=\"md\" color=\"muted\" lineHeight=\"1.6\" maxW=\"lg\" mb=\"6\">\n\t\t\t\t\t\t{description}\n\t\t\t\t\t</Text>\n\t\t\t\t)}\n\t\t\t\t{eta && (\n\t\t\t\t\t<Box\n\t\t\t\t\t\tpx=\"4\"\n\t\t\t\t\t\tpy=\"2\"\n\t\t\t\t\t\tborderWidth=\"1px\"\n\t\t\t\t\t\tborderColor=\"border\"\n\t\t\t\t\t\tborderRadius=\"md\"\n\t\t\t\t\t\tbg=\"bg-surface\"\n\t\t\t\t\t\tmb=\"6\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<Text fontSize=\"sm\" fontWeight=\"medium\" color=\"emphasized\">\n\t\t\t\t\t\t\t{eta}\n\t\t\t\t\t\t</Text>\n\t\t\t\t\t</Box>\n\t\t\t\t)}\n\t\t\t\t{statusLink && <Box>{statusLink}</Box>}\n\t\t\t</Flex>\n\t\t</Flex>\n\t);\n}\nMaintenancePage.displayName = \"MaintenancePage\";\n","// src/templates/marketing-page-template.tsx\n//\n// MarketingPageTemplate — full-bleed landing-page chrome. No app shell, no\n// sidebar, no rail. Used for product landing pages, \"about us\", coming-\n// soon teasers, and other unauthenticated marketing surfaces.\n//\n// Composition (top to bottom):\n//\n// ┌──────────────────────────────────────────┐\n// │ topbar (logo · nav · CTA) │\n// ├──────────────────────────────────────────┤\n// │ hero (eyebrow · title · subtitle · CTAs) │\n// ├──────────────────────────────────────────┤\n// │ children (feature sections, testimonials) │\n// ├──────────────────────────────────────────┤\n// │ footer (copyright, links) │\n// └──────────────────────────────────────────┘\n//\n// The template aims for the same refined-minimalism aesthetic as the rest\n// of anker — calm surfaces, generous spacing on the hero only, brand\n// colors used as accents rather than full backgrounds. No carousels, no\n// animated parallax, no auto-rotating testimonials.\n\nimport type { ReactNode } from \"react\";\nimport { Box, Flex } from \"../primitives/layout\";\nimport { Heading, Text } from \"../primitives/typography\";\n\nexport interface MarketingPageTemplateProps {\n\t/** Logo or wordmark, far-left of the topbar. */\n\tlogo?: ReactNode;\n\t/** Navigation links and/or sign-in CTA, far-right of the topbar. */\n\ttopBarRight?: ReactNode;\n\t/** Hide the topbar (rare). */\n\thideTopBar?: boolean;\n\t/** Eyebrow above the hero title (uppercase, muted). */\n\theroEyebrow?: ReactNode;\n\t/** Hero title — large display text. */\n\theroTitle?: ReactNode;\n\t/** Hero subtitle — one-paragraph value statement. */\n\theroSubtitle?: ReactNode;\n\t/** Hero CTAs — typically one solid button + one ghost link. */\n\theroActions?: ReactNode;\n\t/** Optional visual rendered to the right of the hero copy on wide viewports. */\n\theroVisual?: ReactNode;\n\t/**\n\t * Feature sections, testimonials, etc. Rendered with `maxW=\"6xl\"` and\n\t * `marginInline=\"auto\"` so content tracks a consistent reading column.\n\t */\n\tchildren?: ReactNode;\n\t/** Footer content — copyright, secondary nav, contact. */\n\tfooter?: ReactNode;\n}\n\nexport function MarketingPageTemplate({\n\tlogo,\n\ttopBarRight,\n\thideTopBar,\n\theroEyebrow,\n\theroTitle,\n\theroSubtitle,\n\theroActions,\n\theroVisual,\n\tchildren,\n\tfooter,\n}: MarketingPageTemplateProps) {\n\treturn (\n\t\t<Box data-testid=\"marketing-page-template\" minH=\"100vh\" bg=\"bg-canvas\">\n\t\t\t{!hideTopBar && (\n\t\t\t\t<Flex\n\t\t\t\t\talign=\"center\"\n\t\t\t\t\tjustify=\"space-between\"\n\t\t\t\t\tpx=\"8\"\n\t\t\t\t\tpy=\"4\"\n\t\t\t\t\tbg=\"bg-surface\"\n\t\t\t\t\tborderBottomWidth=\"1px\"\n\t\t\t\t\tborderBottomColor=\"border\"\n\t\t\t\t>\n\t\t\t\t\t<Box>{logo}</Box>\n\t\t\t\t\t<Flex gap=\"6\" align=\"center\" fontSize=\"sm\" color=\"emphasized\">\n\t\t\t\t\t\t{topBarRight}\n\t\t\t\t\t</Flex>\n\t\t\t\t</Flex>\n\t\t\t)}\n\n\t\t\t{(heroEyebrow || heroTitle || heroSubtitle || heroActions) && (\n\t\t\t\t<Box px=\"8\" py=\"20\" bg=\"bg-canvas\">\n\t\t\t\t\t<Flex\n\t\t\t\t\t\tmaxW=\"6xl\"\n\t\t\t\t\t\tmarginInline=\"auto\"\n\t\t\t\t\t\talign=\"center\"\n\t\t\t\t\t\tgap=\"12\"\n\t\t\t\t\t\tdirection={{ base: \"column\", md: \"row\" }}\n\t\t\t\t\t>\n\t\t\t\t\t\t<Box flex=\"1\" minW=\"0\">\n\t\t\t\t\t\t\t{heroEyebrow && (\n\t\t\t\t\t\t\t\t<Text\n\t\t\t\t\t\t\t\t\tfontSize=\"2xs\"\n\t\t\t\t\t\t\t\t\tfontWeight=\"semibold\"\n\t\t\t\t\t\t\t\t\tletterSpacing=\"wider\"\n\t\t\t\t\t\t\t\t\ttextTransform=\"uppercase\"\n\t\t\t\t\t\t\t\t\tcolor=\"muted\"\n\t\t\t\t\t\t\t\t\tmb=\"3\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{heroEyebrow}\n\t\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t{heroTitle && (\n\t\t\t\t\t\t\t\t<Heading\n\t\t\t\t\t\t\t\t\tas=\"h1\"\n\t\t\t\t\t\t\t\t\tfontSize={{ base: \"4xl\", md: \"6xl\" }}\n\t\t\t\t\t\t\t\t\tfontWeight=\"semibold\"\n\t\t\t\t\t\t\t\t\tcolor=\"default\"\n\t\t\t\t\t\t\t\t\tletterSpacing=\"-0.02em\"\n\t\t\t\t\t\t\t\t\tlineHeight=\"1.05\"\n\t\t\t\t\t\t\t\t\tmb=\"5\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{heroTitle}\n\t\t\t\t\t\t\t\t</Heading>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t{heroSubtitle && (\n\t\t\t\t\t\t\t\t<Text\n\t\t\t\t\t\t\t\t\tfontSize=\"lg\"\n\t\t\t\t\t\t\t\t\tcolor=\"muted\"\n\t\t\t\t\t\t\t\t\tlineHeight=\"1.6\"\n\t\t\t\t\t\t\t\t\tmaxW=\"2xl\"\n\t\t\t\t\t\t\t\t\tmb=\"8\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{heroSubtitle}\n\t\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t{heroActions && (\n\t\t\t\t\t\t\t\t<Flex gap=\"3\" align=\"center\">\n\t\t\t\t\t\t\t\t\t{heroActions}\n\t\t\t\t\t\t\t\t</Flex>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</Box>\n\t\t\t\t\t\t{heroVisual && (\n\t\t\t\t\t\t\t<Box flex=\"1\" minW=\"0\" display={{ base: \"none\", md: \"block\" }}>\n\t\t\t\t\t\t\t\t{heroVisual}\n\t\t\t\t\t\t\t</Box>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</Flex>\n\t\t\t\t</Box>\n\t\t\t)}\n\n\t\t\t{children && (\n\t\t\t\t<Box px=\"8\" py=\"16\">\n\t\t\t\t\t<Box maxW=\"6xl\" marginInline=\"auto\">\n\t\t\t\t\t\t{children}\n\t\t\t\t\t</Box>\n\t\t\t\t</Box>\n\t\t\t)}\n\n\t\t\t{footer && (\n\t\t\t\t<Box\n\t\t\t\t\tpx=\"8\"\n\t\t\t\t\tpy=\"8\"\n\t\t\t\t\tbg=\"bg-subtle\"\n\t\t\t\t\tborderTopWidth=\"1px\"\n\t\t\t\t\tborderTopColor=\"border\"\n\t\t\t\t>\n\t\t\t\t\t<Box maxW=\"6xl\" marginInline=\"auto\">\n\t\t\t\t\t\t{footer}\n\t\t\t\t\t</Box>\n\t\t\t\t</Box>\n\t\t\t)}\n\t\t</Box>\n\t);\n}\nMarketingPageTemplate.displayName = \"MarketingPageTemplate\";\n","// src/templates/settings-page-template.tsx\n//\n// SettingsPageTemplate — for any \"preferences / configuration\" page that\n// uses a tabbed split between mixed form / list content.\n//\n// ┌─────────────────────────────────────────┐\n// │ PageHeader (breadcrumbs · title · …) │\n// ├─────────────────────────────────────────┤\n// │ Tabs (required for settings) │\n// ├─────────────────────────────────────────┤\n// │ children OR bodyTabs panes │\n// └─────────────────────────────────────────┘\n//\n// Two ways to render tabs (mutually exclusive):\n//\n// 1. `bodyTabs` — declarative panels owned by the template. Template\n// wraps Tabs.Root with `lazyMount unmountOnExit`. Prefer this for\n// settings pages.\n//\n// 2. `tabs` + `children` — consumer owns Tabs.Root and Tabs.Content.\n// Retained for back-compat / advanced cases.\n\nimport type { ReactNode } from \"react\";\nimport { PageHeader, type PageHeaderProps } from \"../components/page-header\";\nimport { Box, Flex } from \"../primitives/layout\";\nimport { Tabs } from \"../primitives/tabs\";\nimport { useRegisteredPageActions } from \"./app-shell\";\nimport type { BodyTabsProp } from \"./detail-page-template\";\n\nexport type { BodyTabsItem, BodyTabsProp } from \"./detail-page-template\";\n\nexport interface SettingsPageTemplateProps\n\textends Pick<\n\t\tPageHeaderProps,\n\t\t\"breadcrumbs\" | \"title\" | \"subtitle\" | \"eyebrow\"\n\t> {\n\tactions?: ReactNode;\n\t/**\n\t * Tab strip (consumer-owned). Mutually exclusive with `bodyTabs`.\n\t * Settings pages should always have at least two tabs — if you only\n\t * have one section, use DetailPageTemplate instead.\n\t */\n\ttabs?: ReactNode;\n\t/**\n\t * Owned-panel tabs. Template renders Tabs.Root with `lazyMount\n\t * unmountOnExit`; only the active item's `content` mounts. Mutually\n\t * exclusive with `tabs`.\n\t */\n\tbodyTabs?: BodyTabsProp;\n\t/** Page body when `bodyTabs` is not set. */\n\tchildren?: ReactNode;\n\t/**\n\t * Constrain the body width for readability. @default \"3xl\" (= 768px).\n\t * Pass `\"full\"` to disable the constraint entirely.\n\t */\n\tmaxBodyWidth?: string;\n\t/**\n\t * Padding applied to the body between the tab strip and the page\n\t * content. @default \"default\" (`px=\"8\" pt=\"6\"`). Pass `\"none\"` to\n\t * render flush.\n\t */\n\tbodyPadding?: \"default\" | \"none\";\n}\n\nexport function SettingsPageTemplate({\n\tbreadcrumbs,\n\ttitle,\n\tsubtitle,\n\teyebrow,\n\tactions,\n\ttabs,\n\tbodyTabs,\n\tchildren,\n\tmaxBodyWidth = \"3xl\",\n\tbodyPadding = \"default\",\n}: SettingsPageTemplateProps) {\n\tif (tabs && bodyTabs) {\n\t\tthrow new Error(\n\t\t\t\"SettingsPageTemplate: `tabs` and `bodyTabs` are mutually exclusive — use `bodyTabs` for owned panels, `tabs` for consumer-owned tab strips.\",\n\t\t);\n\t}\n\tconst registered = useRegisteredPageActions();\n\tconst resolvedActions = actions ?? registered;\n\tconst bodyPx = bodyPadding === \"none\" ? \"0\" : \"8\";\n\tconst bodyPt = bodyPadding === \"none\" ? \"0\" : \"6\";\n\n\tconst renderBody = (node: ReactNode) => (\n\t\t<Box flex=\"1\" minH=\"0\" px={bodyPx} pt={bodyPt}>\n\t\t\t<Box\n\t\t\t\tmaxW={maxBodyWidth}\n\t\t\t\tmarginInline={maxBodyWidth === \"full\" ? \"0\" : \"auto\"}\n\t\t\t>\n\t\t\t\t{node}\n\t\t\t</Box>\n\t\t</Box>\n\t);\n\n\tif (bodyTabs) {\n\t\tconst tabsRootProps =\n\t\t\tbodyTabs.value !== undefined\n\t\t\t\t? {\n\t\t\t\t\t\tvalue: bodyTabs.value,\n\t\t\t\t\t\tonValueChange: (d: { value: string }) =>\n\t\t\t\t\t\t\tbodyTabs.onValueChange!(d.value),\n\t\t\t\t\t}\n\t\t\t\t: { defaultValue: bodyTabs.defaultValue };\n\t\treturn (\n\t\t\t<Flex\n\t\t\t\tdata-testid=\"settings-page-template\"\n\t\t\t\tdirection=\"column\"\n\t\t\t\tflex=\"1\"\n\t\t\t\tminH=\"0\"\n\t\t\t>\n\t\t\t\t<PageHeader\n\t\t\t\t\tbreadcrumbs={breadcrumbs}\n\t\t\t\t\ttitle={title}\n\t\t\t\t\tsubtitle={subtitle}\n\t\t\t\t\teyebrow={eyebrow}\n\t\t\t\t\tactions={resolvedActions}\n\t\t\t\t/>\n\t\t\t\t<Tabs.Root lazyMount unmountOnExit {...tabsRootProps}>\n\t\t\t\t\t<Box>\n\t\t\t\t\t\t<Tabs.List>\n\t\t\t\t\t\t\t{bodyTabs.items.map((item) => (\n\t\t\t\t\t\t\t\t<Tabs.Trigger key={item.value} value={item.value}>\n\t\t\t\t\t\t\t\t\t{item.label}\n\t\t\t\t\t\t\t\t</Tabs.Trigger>\n\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t</Tabs.List>\n\t\t\t\t\t</Box>\n\t\t\t\t\t{renderBody(\n\t\t\t\t\t\tbodyTabs.items.map((item) => (\n\t\t\t\t\t\t\t<Tabs.Content key={item.value} value={item.value}>\n\t\t\t\t\t\t\t\t{item.content}\n\t\t\t\t\t\t\t</Tabs.Content>\n\t\t\t\t\t\t)),\n\t\t\t\t\t)}\n\t\t\t\t</Tabs.Root>\n\t\t\t</Flex>\n\t\t);\n\t}\n\n\treturn (\n\t\t<Flex\n\t\t\tdata-testid=\"settings-page-template\"\n\t\t\tdirection=\"column\"\n\t\t\tflex=\"1\"\n\t\t\tminH=\"0\"\n\t\t>\n\t\t\t<PageHeader\n\t\t\t\tbreadcrumbs={breadcrumbs}\n\t\t\t\ttitle={title}\n\t\t\t\tsubtitle={subtitle}\n\t\t\t\teyebrow={eyebrow}\n\t\t\t\tactions={resolvedActions}\n\t\t\t/>\n\t\t\t<Box>{tabs}</Box>\n\t\t\t{renderBody(children)}\n\t\t</Flex>\n\t);\n}\nSettingsPageTemplate.displayName = \"SettingsPageTemplate\";\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/templates/app-shell.tsx","../../src/templates/auth-page-template.tsx","../../src/templates/dashboard-page-template.tsx","../../src/templates/detail-page-template.tsx","../../src/templates/error-page.tsx","../../src/templates/index-page-template.tsx","../../src/templates/loading-page.tsx","../../src/templates/maintenance-page.tsx","../../src/templates/marketing-page-template.tsx","../../src/templates/settings-page-template.tsx"],"names":["jsx","jsxs"],"mappings":"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","file":"index.js","sourcesContent":["// src/templates/app-shell.tsx\n//\n// AppShell — top-level layout for authenticated knkCMS pages.\n//\n// Composition: a 3-column CSS grid with a fixed-width sidebar, a fluid main\n// content column, and an optional fixed-width context rail.\n//\n// ┌─────────┬───────────────────────────┬─────────┐\n// │ │ │ │\n// │ sidebar │ children │ rail │\n// │ │ (page header / content) │ │\n// │ │ │ │\n// └─────────┴───────────────────────────┴─────────┘\n//\n// Slot mechanism\n// --------------\n// AppShell installs an external slot store on its descendants via context.\n// Two named slots are exposed:\n//\n// - \"actions\" — registered via `usePageActions(node)` — surfaced by page\n// templates inside their <PageHeader actions=…> slot.\n// - \"rail\" — registered via `usePageRail(node)` — surfaced by AppShell\n// as the content of the right rail column.\n//\n// The store uses `useSyncExternalStore` so that producers (deep child\n// components rendered after the consumer) and consumers (AppShell, the page\n// templates) stay decoupled. A naive `useState`-based context would force the\n// consumer to render in the same React commit as the producer, which causes\n// the actions/rail to flicker on route changes (the Path-B fix originally\n// shipped in odon as PR #115). The external-store pattern lets the producer\n// register its content in a `useEffect`, the consumer re-reads on the next\n// browser frame, and React's concurrent renderer is happy.\n\nimport {\n\tcreateContext,\n\ttype ReactNode,\n\tuseCallback,\n\tuseContext,\n\tuseEffect,\n\tuseMemo,\n\tuseRef,\n\tuseSyncExternalStore,\n} from \"react\";\nimport { Box, Flex, Grid } from \"../primitives/layout\";\n\ntype SlotName = \"actions\" | \"rail\";\n\ninterface SlotStore {\n\tget(slot: SlotName): ReactNode;\n\tset(slot: SlotName, node: ReactNode): void;\n\tclear(slot: SlotName): void;\n\tsubscribe(slot: SlotName, listener: () => void): () => void;\n}\n\nfunction createSlotStore(): SlotStore {\n\tconst values: Record<SlotName, ReactNode> = {\n\t\tactions: null,\n\t\trail: null,\n\t};\n\tconst listeners: Record<SlotName, Set<() => void>> = {\n\t\tactions: new Set(),\n\t\trail: new Set(),\n\t};\n\n\tfunction notify(slot: SlotName) {\n\t\tfor (const listener of listeners[slot]) listener();\n\t}\n\n\treturn {\n\t\tget(slot) {\n\t\t\treturn values[slot];\n\t\t},\n\t\tset(slot, node) {\n\t\t\tif (values[slot] === node) return;\n\t\t\tvalues[slot] = node;\n\t\t\tnotify(slot);\n\t\t},\n\t\tclear(slot) {\n\t\t\tif (values[slot] === null) return;\n\t\t\tvalues[slot] = null;\n\t\t\tnotify(slot);\n\t\t},\n\t\tsubscribe(slot, listener) {\n\t\t\tlisteners[slot].add(listener);\n\t\t\treturn () => {\n\t\t\t\tlisteners[slot].delete(listener);\n\t\t\t};\n\t\t},\n\t};\n}\n\nconst SlotStoreContext = createContext<SlotStore | null>(null);\n\n/**\n * Read-side hook used internally by AppShell and the page templates to\n * subscribe to a named slot's currently-registered ReactNode. Returns `null`\n * when no producer has registered content (or when called outside an AppShell).\n */\nfunction useSlotValue(slot: SlotName): ReactNode {\n\tconst store = useContext(SlotStoreContext);\n\tconst subscribe = useCallback(\n\t\t(listener: () => void) => {\n\t\t\tif (!store) return () => undefined;\n\t\t\treturn store.subscribe(slot, listener);\n\t\t},\n\t\t[store, slot],\n\t);\n\tconst getSnapshot = useCallback(() => {\n\t\tif (!store) return null;\n\t\treturn store.get(slot);\n\t}, [store, slot]);\n\treturn useSyncExternalStore(subscribe, getSnapshot, getSnapshot);\n}\n\n/**\n * Register page-action content (typically buttons rendered to the right of\n * the page title) from any descendant of `<AppShell>`. The content is\n * surfaced by the active page template inside its `<PageHeader>` actions\n * slot.\n *\n * Pass `null` (or omit) to clear the registration. The hook is a no-op when\n * called outside an AppShell, which keeps it safe to use in stories and\n * isolated component tests.\n */\nexport function usePageActions(content: ReactNode): void {\n\tconst store = useContext(SlotStoreContext);\n\t// Stash the most recent content in a ref so the effect can run on every\n\t// render without forcing a fresh effect-cleanup cycle for unstable nodes.\n\tconst latest = useRef<ReactNode>(content);\n\tlatest.current = content;\n\tuseEffect(() => {\n\t\tif (!store) return;\n\t\tstore.set(\"actions\", latest.current);\n\t\treturn () => {\n\t\t\tstore.clear(\"actions\");\n\t\t};\n\t}, [store]);\n\t// Re-register on every change of `content` (effect above only runs once\n\t// per mount; this second effect re-pushes the latest value).\n\tuseEffect(() => {\n\t\tif (!store) return;\n\t\tstore.set(\"actions\", content);\n\t}, [store, content]);\n}\n\n/**\n * Register context-rail content from any descendant of `<AppShell>`. The\n * content is rendered in the rail column (assuming the AppShell has a rail\n * slot enabled).\n *\n * Pass `null` (or omit) to clear the registration. The hook is a no-op when\n * called outside an AppShell.\n */\nexport function usePageRail(content: ReactNode): void {\n\tconst store = useContext(SlotStoreContext);\n\tconst latest = useRef<ReactNode>(content);\n\tlatest.current = content;\n\tuseEffect(() => {\n\t\tif (!store) return;\n\t\tstore.set(\"rail\", latest.current);\n\t\treturn () => {\n\t\t\tstore.clear(\"rail\");\n\t\t};\n\t}, [store]);\n\tuseEffect(() => {\n\t\tif (!store) return;\n\t\tstore.set(\"rail\", content);\n\t}, [store, content]);\n}\n\n/**\n * Internal hook used by page templates to read the currently-registered\n * page-actions ReactNode. Page templates fall back to a locally-passed\n * `actions` prop when nothing is registered.\n */\nexport function useRegisteredPageActions(): ReactNode {\n\treturn useSlotValue(\"actions\");\n}\n\nexport interface AppShellProps {\n\t/**\n\t * Sidebar element — the navigation column. Required. Typically an instance\n\t * of `<Sidebar>` from `@knkcs/anker/components`. AppShell does not own the\n\t * sidebar's collapsed-state — pass it through the Sidebar's own props.\n\t */\n\tsidebar: ReactNode;\n\t/**\n\t * Context rail element. Acts as a *fallback* for the rail column: it\n\t * renders when no descendant has registered rail content via\n\t * `usePageRail`. Registered content always wins over the prop.\n\t *\n\t * The rail column is enabled — and a grid track is reserved — when *either*\n\t * a `rail` prop is supplied *or* a descendant has registered rail content.\n\t * Omit both (or pass `null`) to drop the rail column entirely.\n\t */\n\trail?: ReactNode;\n\t/** Page content. */\n\tchildren: ReactNode;\n}\n\n/**\n * AppShell is the top-level layout for authenticated knkCMS pages. It owns\n * the slot context that powers `usePageActions` and `usePageRail`, and\n * arranges sidebar / main / rail in a 3-column CSS grid.\n *\n * AppShell is layout-only — it does not render a PageHeader, and it does not\n * inject any business chrome. Pages compose `<IndexPageTemplate>`,\n * `<DetailPageTemplate>`, etc. inside `children`.\n *\n * Rail precedence: content registered by a descendant via `usePageRail` wins\n * over the static `rail` prop. The prop is the fallback when no descendant\n * has registered content. Rationale: a descendant explicitly registering\n * content is signaling \"show this here\", which should trump the static prop.\n */\nexport function AppShell({ sidebar, rail, children }: AppShellProps) {\n\t// AppShell is split into an outer Provider and an inner Renderer so the\n\t// renderer's `useContext(SlotStoreContext)` resolves to *our* store rather\n\t// than the parent context. (A naive single component that both provides\n\t// and consumes the context at the same level reads the parent context —\n\t// the Provider only takes effect for descendants.)\n\tconst store = useMemo(() => createSlotStore(), []);\n\treturn (\n\t\t<SlotStoreContext.Provider value={store}>\n\t\t\t<AppShellInner sidebar={sidebar} rail={rail}>\n\t\t\t\t{children}\n\t\t\t</AppShellInner>\n\t\t</SlotStoreContext.Provider>\n\t);\n}\nAppShell.displayName = \"AppShell\";\n\nfunction AppShellInner({ sidebar, rail, children }: AppShellProps) {\n\tconst railNode = useSlotValue(\"rail\");\n\n\t// Precedence: registered rail content wins, fall back to the `rail` prop.\n\t// The rail column is enabled when *either* the consumer passed a `rail`\n\t// element *or* a descendant registered content via `usePageRail`.\n\tconst renderedRail = railNode ?? rail;\n\tconst showRailColumn =\n\t\trenderedRail !== undefined &&\n\t\trenderedRail !== null &&\n\t\trenderedRail !== false;\n\n\treturn (\n\t\t<Grid\n\t\t\tdata-testid=\"app-shell\"\n\t\t\tdata-rail={showRailColumn ? \"true\" : \"false\"}\n\t\t\ttemplateColumns={showRailColumn ? \"auto 1fr auto\" : \"auto 1fr\"}\n\t\t\tminH=\"100vh\"\n\t\t\tbg=\"bg-canvas\"\n\t\t>\n\t\t\t<Box\n\t\t\t\tdata-testid=\"app-shell-sidebar\"\n\t\t\t\tgridColumn=\"1\"\n\t\t\t\tminW=\"0\"\n\t\t\t\tposition=\"sticky\"\n\t\t\t\ttop=\"0\"\n\t\t\t\talignSelf=\"start\"\n\t\t\t\tmaxH=\"100vh\"\n\t\t\t\toverflowY=\"auto\"\n\t\t\t>\n\t\t\t\t{sidebar}\n\t\t\t</Box>\n\t\t\t<Flex\n\t\t\t\tdata-testid=\"app-shell-main\"\n\t\t\t\tgridColumn=\"2\"\n\t\t\t\tdirection=\"column\"\n\t\t\t\tminW=\"0\"\n\t\t\t\tminH=\"100vh\"\n\t\t\t\tbg=\"bg-canvas\"\n\t\t\t\tborderLeftWidth=\"1px\"\n\t\t\t\tborderColor=\"border\"\n\t\t\t>\n\t\t\t\t{children}\n\t\t\t</Flex>\n\t\t\t{showRailColumn ? (\n\t\t\t\t<Box\n\t\t\t\t\tdata-testid=\"app-shell-rail\"\n\t\t\t\t\tgridColumn=\"3\"\n\t\t\t\t\tminW=\"0\"\n\t\t\t\t\tposition=\"sticky\"\n\t\t\t\t\ttop=\"0\"\n\t\t\t\t\talignSelf=\"start\"\n\t\t\t\t\tmaxH=\"100vh\"\n\t\t\t\t\toverflowY=\"auto\"\n\t\t\t\t\tbg=\"bg-surface\"\n\t\t\t\t\tborderLeftWidth=\"1px\"\n\t\t\t\t\tborderColor=\"border\"\n\t\t\t\t>\n\t\t\t\t\t{renderedRail}\n\t\t\t\t</Box>\n\t\t\t) : null}\n\t\t</Grid>\n\t);\n}\nAppShellInner.displayName = \"AppShellInner\";\n","// src/templates/auth-page-template.tsx\n//\n// AuthPageTemplate — full-bleed centered card on a neutral canvas. No app\n// shell, no sidebar, no rail. Used for login, register, MFA challenge,\n// forgot/reset password, and email-verification screens.\n//\n// Internally this is a thin wrapper around `<AuthCard>` (in\n// `@knkcs/anker/components`) — surfaced under the templates module so\n// consumers can import their layout chrome from one entry point.\n//\n// We re-expose the wrapper rather than re-implementing it because AuthCard\n// is already battle-tested and stable; the templates module is the consumer\n// contract, AuthCard is the implementation.\n\nimport type { ReactNode } from \"react\";\nimport { AuthCard, type AuthCardProps } from \"../components/auth-card\";\n\nexport interface AuthPageTemplateProps extends AuthCardProps {\n\t/**\n\t * Page body — typically a form or a verification CTA. Inherits all\n\t * AuthCard slots (logo, topBarRight, eyebrow, title, subtitle, footer).\n\t */\n\tchildren: ReactNode;\n}\n\n/**\n * Auth-flow page layout. Use for any pre-authentication screen (login,\n * register, MFA, forgot-password, reset-password) and for short\n * confirmation flows (email-verify, account-deleted). For consent\n * dialogs, prefer `<OAuthConsentPageTemplate>` (denser layout).\n *\n * The template supplies a centered card with a dot-grid background, an\n * optional topbar with logo + locale switcher, and a footer slot. To hide\n * the topbar (rare — embedded preview, printable receipts) pass\n * `hideTopBar`. To hide the dot-grid (printable) pass `hideBackground`.\n */\nexport function AuthPageTemplate(props: AuthPageTemplateProps) {\n\treturn <AuthCard {...props} />;\n}\nAuthPageTemplate.displayName = \"AuthPageTemplate\";\n","// src/templates/dashboard-page-template.tsx\n//\n// DashboardPageTemplate — for at-a-glance overview pages composed of a grid\n// of widgets (Stat cards, mini-charts, recent-activity panes, etc.).\n//\n// ┌─────────────────────────────────────────┐\n// │ PageHeader (greeting · range picker) │\n// ├─────────────────────────────────────────┤\n// │ ┌──────┬──────┬──────┬──────┐ │\n// │ │ stat │ stat │ stat │ stat │ │\n// │ ├──────┴──────┼──────┴──────┤ │\n// │ │ widget │ widget │ │\n// │ │ │ │ │\n// │ ├─────────────┴─────────────┤ │\n// │ │ wide widget │ │\n// │ └───────────────────────────┘ │\n// └─────────────────────────────────────────┘\n//\n// The template provides the page chrome and a 12-column responsive grid.\n// Widgets opt into the column count via Chakra's `gridColumn` prop on each\n// child. Inspired by Linear's \"All issues\" overview and GitHub's repo\n// insights — calm surfaces, dense info, clear hierarchy.\n\nimport type { ReactNode } from \"react\";\nimport { PageHeader, type PageHeaderProps } from \"../components/page-header\";\nimport { Box, Flex, Grid } from \"../primitives/layout\";\nimport { useRegisteredPageActions } from \"./app-shell\";\n\nexport interface DashboardPageTemplateProps\n\textends Pick<\n\t\tPageHeaderProps,\n\t\t\"breadcrumbs\" | \"title\" | \"subtitle\" | \"eyebrow\"\n\t> {\n\tactions?: ReactNode;\n\t/**\n\t * Dashboard widgets. Children are placed inside a 12-column responsive\n\t * CSS grid with `gap=\"4\"`. Each child should set `gridColumn` (e.g.\n\t * `\"span 3\"` for a quarter-width tile, `\"span 6\"` for half, `\"span 12\"`\n\t * for full-width). The default per-child column span is `\"span 12\"`.\n\t */\n\tchildren: ReactNode;\n\t/**\n\t * Override the grid `gap` between widgets. @default \"4\" (= 16px)\n\t */\n\tgap?: string;\n}\n\nexport function DashboardPageTemplate({\n\tbreadcrumbs,\n\ttitle,\n\tsubtitle,\n\teyebrow,\n\tactions,\n\tchildren,\n\tgap = \"4\",\n}: DashboardPageTemplateProps) {\n\tconst registered = useRegisteredPageActions();\n\tconst resolvedActions = actions ?? registered;\n\treturn (\n\t\t<Flex\n\t\t\tdata-testid=\"dashboard-page-template\"\n\t\t\tdirection=\"column\"\n\t\t\tflex=\"1\"\n\t\t\tminH=\"0\"\n\t\t>\n\t\t\t<PageHeader\n\t\t\t\tbreadcrumbs={breadcrumbs}\n\t\t\t\ttitle={title}\n\t\t\t\tsubtitle={subtitle}\n\t\t\t\teyebrow={eyebrow}\n\t\t\t\tactions={resolvedActions}\n\t\t\t/>\n\t\t\t<Box flex=\"1\" minH=\"0\" px=\"8\" py=\"6\">\n\t\t\t\t<Grid\n\t\t\t\t\tdata-testid=\"dashboard-grid\"\n\t\t\t\t\ttemplateColumns=\"repeat(12, minmax(0, 1fr))\"\n\t\t\t\t\tgap={gap}\n\t\t\t\t>\n\t\t\t\t\t{children}\n\t\t\t\t</Grid>\n\t\t\t</Box>\n\t\t</Flex>\n\t);\n}\nDashboardPageTemplate.displayName = \"DashboardPageTemplate\";\n","// src/templates/detail-page-template.tsx\n//\n// DetailPageTemplate — the canonical \"single entity\" page layout.\n//\n// Composition:\n//\n// ┌─────────────────────────────────────────┐\n// │ PageHeader (breadcrumbs · title · …) │\n// ├─────────────────────────────────────────┤\n// │ subheader (optional — e.g. identity card)│\n// ├─────────────────────────────────────────┤\n// │ Tabs (optional — pinned beneath subhead) │\n// ├─────────────────────────────────────────┤\n// │ children OR bodyTabs panes │\n// └─────────────────────────────────────────┘\n//\n// Two ways to render tabs:\n//\n// 1. `bodyTabs` — declarative panels owned by the template. Template wraps\n// Tabs.Root with `lazyMount unmountOnExit` so only the active panel\n// mounts. Use this for any case where each tab has its own body\n// component (Members, Security, Sessions panes).\n//\n// 2. `tabs` — ReactNode slot for nav-mode or filter-mode tab strips\n// (Tabs.List with no Tabs.Content; the body comes from `children`,\n// typically a route's outlet). Use this when each tab is a separate\n// route or when tab state is controlled externally.\n//\n// `bodyTabs` and `tabs` are mutually exclusive. Passing both throws.\n\nimport type { ReactNode } from \"react\";\nimport { PageHeader, type PageHeaderProps } from \"../components/page-header\";\nimport { Box, Flex } from \"../primitives/layout\";\nimport { Tabs } from \"../primitives/tabs\";\nimport { useRegisteredPageActions } from \"./app-shell\";\n\nexport interface BodyTabsItem {\n\tvalue: string;\n\tlabel: ReactNode;\n\tcontent: ReactNode;\n}\n\nexport type BodyTabsProp =\n\t| {\n\t\t\titems: BodyTabsItem[];\n\t\t\tdefaultValue: string;\n\t\t\tvalue?: never;\n\t\t\tonValueChange?: never;\n\t }\n\t| {\n\t\t\titems: BodyTabsItem[];\n\t\t\tvalue: string;\n\t\t\tonValueChange: (next: string) => void;\n\t\t\tdefaultValue?: never;\n\t };\n\nexport interface DetailPageTemplateProps\n\textends Pick<\n\t\tPageHeaderProps,\n\t\t\"breadcrumbs\" | \"title\" | \"subtitle\" | \"eyebrow\"\n\t> {\n\tactions?: ReactNode;\n\t/**\n\t * Tab strip rendered immediately under the PageHeader / subheader.\n\t * Use this for nav-mode/filter-mode tabs (Tabs.List, no Tabs.Content);\n\t * the body comes from `children`. For owned-panel tabs, use `bodyTabs`\n\t * instead. Mutually exclusive with `bodyTabs`.\n\t */\n\ttabs?: ReactNode;\n\t/**\n\t * Owned-panel tabs. Template renders Tabs.Root with `lazyMount\n\t * unmountOnExit`; only the active item's `content` mounts. Mutually\n\t * exclusive with `tabs` and `children` is ignored when this is set.\n\t */\n\tbodyTabs?: BodyTabsProp;\n\t/**\n\t * ReactNode rendered between the PageHeader and the tabs (or the body\n\t * if no tabs). Use for identity-card-style summaries.\n\t */\n\tsubheader?: ReactNode;\n\t/**\n\t * Page body — rendered when `bodyTabs` is not set. Flush against the\n\t * canvas; add internal padding inside `children` if you need it.\n\t */\n\tchildren?: ReactNode;\n}\n\nexport function DetailPageTemplate({\n\tbreadcrumbs,\n\ttitle,\n\tsubtitle,\n\teyebrow,\n\tactions,\n\ttabs,\n\tbodyTabs,\n\tsubheader,\n\tchildren,\n}: DetailPageTemplateProps) {\n\tif (tabs && bodyTabs) {\n\t\tthrow new Error(\n\t\t\t\"DetailPageTemplate: `tabs` and `bodyTabs` are mutually exclusive — use `bodyTabs` for owned panels, `tabs` for nav/filter strips.\",\n\t\t);\n\t}\n\tconst registered = useRegisteredPageActions();\n\tconst resolvedActions = actions ?? registered;\n\n\tif (bodyTabs) {\n\t\tconst tabsRootProps =\n\t\t\tbodyTabs.value !== undefined\n\t\t\t\t? {\n\t\t\t\t\t\tvalue: bodyTabs.value,\n\t\t\t\t\t\tonValueChange: (d: { value: string }) =>\n\t\t\t\t\t\t\tbodyTabs.onValueChange!(d.value),\n\t\t\t\t\t}\n\t\t\t\t: { defaultValue: bodyTabs.defaultValue };\n\t\treturn (\n\t\t\t<Flex\n\t\t\t\tdata-testid=\"detail-page-template\"\n\t\t\t\tdirection=\"column\"\n\t\t\t\tflex=\"1\"\n\t\t\t\tminH=\"0\"\n\t\t\t>\n\t\t\t\t<PageHeader\n\t\t\t\t\tbreadcrumbs={breadcrumbs}\n\t\t\t\t\ttitle={title}\n\t\t\t\t\tsubtitle={subtitle}\n\t\t\t\t\teyebrow={eyebrow}\n\t\t\t\t\tactions={resolvedActions}\n\t\t\t\t/>\n\t\t\t\t{subheader ? <Box>{subheader}</Box> : null}\n\t\t\t\t<Tabs.Root lazyMount unmountOnExit {...tabsRootProps}>\n\t\t\t\t\t<Box>\n\t\t\t\t\t\t<Tabs.List>\n\t\t\t\t\t\t\t{bodyTabs.items.map((item) => (\n\t\t\t\t\t\t\t\t<Tabs.Trigger key={item.value} value={item.value}>\n\t\t\t\t\t\t\t\t\t{item.label}\n\t\t\t\t\t\t\t\t</Tabs.Trigger>\n\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t</Tabs.List>\n\t\t\t\t\t</Box>\n\t\t\t\t\t<Box flex=\"1\" minH=\"0\">\n\t\t\t\t\t\t{bodyTabs.items.map((item) => (\n\t\t\t\t\t\t\t<Tabs.Content key={item.value} value={item.value}>\n\t\t\t\t\t\t\t\t{item.content}\n\t\t\t\t\t\t\t</Tabs.Content>\n\t\t\t\t\t\t))}\n\t\t\t\t\t</Box>\n\t\t\t\t</Tabs.Root>\n\t\t\t</Flex>\n\t\t);\n\t}\n\n\treturn (\n\t\t<Flex\n\t\t\tdata-testid=\"detail-page-template\"\n\t\t\tdirection=\"column\"\n\t\t\tflex=\"1\"\n\t\t\tminH=\"0\"\n\t\t>\n\t\t\t<PageHeader\n\t\t\t\tbreadcrumbs={breadcrumbs}\n\t\t\t\ttitle={title}\n\t\t\t\tsubtitle={subtitle}\n\t\t\t\teyebrow={eyebrow}\n\t\t\t\tactions={resolvedActions}\n\t\t\t/>\n\t\t\t{subheader ? <Box>{subheader}</Box> : null}\n\t\t\t{tabs ? <Box>{tabs}</Box> : null}\n\t\t\t<Box flex=\"1\" minH=\"0\">\n\t\t\t\t{children}\n\t\t\t</Box>\n\t\t</Flex>\n\t);\n}\nDetailPageTemplate.displayName = \"DetailPageTemplate\";\n","// src/templates/error-page.tsx\n//\n// ErrorPage — full-bleed error layout for 404 / 403 / 500 / generic\n// failures. Centered status code + message + suggested next step. No app\n// shell, no sidebar.\n//\n// We keep it deliberately spare — an enterprise B2B error screen does not\n// need a 404-illustration of an astronaut. The optional `illustration`\n// slot is there for the rare case where a product wants to reach for one\n// (e.g. a dedicated brand \"OOPS\" SVG).\n\nimport type { ReactNode } from \"react\";\nimport { Box, Flex } from \"../primitives/layout\";\nimport { Heading, Text } from \"../primitives/typography\";\n\nexport interface ErrorPageProps {\n\t/**\n\t * Status code (404, 500, 403, …) shown as the page's largest piece of\n\t * type. Pass any string — non-numeric codes like \"OOPS\" work too.\n\t */\n\tstatusCode: ReactNode;\n\t/** Short headline — e.g. \"Page not found\" or \"Something went wrong\". */\n\ttitle: ReactNode;\n\t/**\n\t * One-paragraph explanation. Keep it short — the user is already in a\n\t * frustrated state.\n\t */\n\tdescription?: ReactNode;\n\t/**\n\t * Action(s) — typically one solid button (back home / retry) plus an\n\t * optional secondary link.\n\t */\n\tactions?: ReactNode;\n\t/**\n\t * Optional illustration rendered above the status code. Use sparingly.\n\t */\n\tillustration?: ReactNode;\n\t/**\n\t * Logo or wordmark rendered top-left. Useful for branded error pages\n\t * served from the root domain.\n\t */\n\tlogo?: ReactNode;\n}\n\nexport function ErrorPage({\n\tstatusCode,\n\ttitle,\n\tdescription,\n\tactions,\n\tillustration,\n\tlogo,\n}: ErrorPageProps) {\n\treturn (\n\t\t<Flex\n\t\t\tdata-testid=\"error-page\"\n\t\t\tdirection=\"column\"\n\t\t\tminH=\"100vh\"\n\t\t\tbg=\"bg-canvas\"\n\t\t>\n\t\t\t{logo && (\n\t\t\t\t<Box px=\"8\" py=\"6\">\n\t\t\t\t\t{logo}\n\t\t\t\t</Box>\n\t\t\t)}\n\t\t\t<Flex\n\t\t\t\tflex=\"1\"\n\t\t\t\tdirection=\"column\"\n\t\t\t\talign=\"center\"\n\t\t\t\tjustify=\"center\"\n\t\t\t\tpx=\"8\"\n\t\t\t\tpb=\"16\"\n\t\t\t\ttextAlign=\"center\"\n\t\t\t>\n\t\t\t\t{illustration && <Box mb=\"8\">{illustration}</Box>}\n\t\t\t\t<Text\n\t\t\t\t\tfontSize=\"7xl\"\n\t\t\t\t\tfontWeight=\"semibold\"\n\t\t\t\t\tcolor=\"muted\"\n\t\t\t\t\tletterSpacing=\"-0.04em\"\n\t\t\t\t\tlineHeight=\"1\"\n\t\t\t\t\tmb=\"4\"\n\t\t\t\t>\n\t\t\t\t\t{statusCode}\n\t\t\t\t</Text>\n\t\t\t\t<Heading\n\t\t\t\t\tas=\"h1\"\n\t\t\t\t\tfontSize=\"2xl\"\n\t\t\t\t\tfontWeight=\"semibold\"\n\t\t\t\t\tcolor=\"default\"\n\t\t\t\t\tletterSpacing=\"-0.02em\"\n\t\t\t\t\tmb=\"3\"\n\t\t\t\t>\n\t\t\t\t\t{title}\n\t\t\t\t</Heading>\n\t\t\t\t{description && (\n\t\t\t\t\t<Text fontSize=\"md\" color=\"muted\" lineHeight=\"1.6\" maxW=\"lg\" mb=\"8\">\n\t\t\t\t\t\t{description}\n\t\t\t\t\t</Text>\n\t\t\t\t)}\n\t\t\t\t{actions && (\n\t\t\t\t\t<Flex gap=\"3\" align=\"center\" justify=\"center\">\n\t\t\t\t\t\t{actions}\n\t\t\t\t\t</Flex>\n\t\t\t\t)}\n\t\t\t</Flex>\n\t\t</Flex>\n\t);\n}\nErrorPage.displayName = \"ErrorPage\";\n","// src/templates/index-page-template.tsx\n//\n// IndexPageTemplate — the canonical \"list of items\" page layout.\n//\n// Composition (top to bottom):\n//\n// ┌─────────────────────────────────────────┐\n// │ PageHeader (breadcrumbs · title · …) │\n// ├─────────────────────────────────────────┤\n// │ Tabs (optional — under header) │\n// ├─────────────────────────────────────────┤\n// │ Toolbar (search · filters · count) │\n// ├─────────────────────────────────────────┤\n// │ children (DataTable, list, empty state) │\n// └─────────────────────────────────────────┘\n//\n// Use this template for any \"browse a list\" page: users index, OAuth-clients\n// index, audit-log, etc. The template flushes its content (no horizontal\n// padding) so a full-bleed DataTable sits cleanly under the toolbar. Pages\n// that need padded content should wrap children in a `<Box px=\"8\" py=\"6\">`.\n\nimport type { ReactNode } from \"react\";\nimport { PageHeader, type PageHeaderProps } from \"../components/page-header\";\nimport { Box, Flex } from \"../primitives/layout\";\nimport { useRegisteredPageActions } from \"./app-shell\";\n\nexport interface IndexPageTemplateProps\n\textends Pick<\n\t\tPageHeaderProps,\n\t\t\"breadcrumbs\" | \"title\" | \"subtitle\" | \"eyebrow\"\n\t> {\n\t/**\n\t * Optional explicit page-action content (rendered inside the PageHeader's\n\t * actions slot). When omitted, the template falls back to whatever a\n\t * descendant has registered via `usePageActions`.\n\t */\n\tactions?: ReactNode;\n\t/**\n\t * Optional tab strip rendered between the PageHeader and the toolbar.\n\t * Pass an instance of `<Tabs.Root>` (with its own `<Tabs.List>` and\n\t * `<Tabs.Content>`s). When omitted, no tab strip is rendered.\n\t */\n\ttabs?: ReactNode;\n\t/**\n\t * Toolbar element rendered between the tabs (if any) and the page body.\n\t * Typically an instance of `<Toolbar>` from `@knkcs/anker/components`.\n\t * Pass `null` to omit the toolbar entirely (rare).\n\t */\n\ttoolbar?: ReactNode;\n\t/**\n\t * Page body — DataTable, list, empty state, or error/loading content.\n\t * Rendered flush against the canvas. Add internal padding inside\n\t * `children` if you need it.\n\t */\n\tchildren: ReactNode;\n}\n\n/**\n * Canonical list-page layout. Renders PageHeader → optional Tabs → optional\n * Toolbar → children, full-bleed against the canvas.\n *\n * Page actions are sourced from (in priority order): `actions` prop →\n * registered slot via `usePageActions`. This lets a tab-pane component deep\n * inside `children` register its own actions without prop-drilling.\n */\nexport function IndexPageTemplate({\n\tbreadcrumbs,\n\ttitle,\n\tsubtitle,\n\teyebrow,\n\tactions,\n\ttabs,\n\ttoolbar,\n\tchildren,\n}: IndexPageTemplateProps) {\n\tconst registered = useRegisteredPageActions();\n\tconst resolvedActions = actions ?? registered;\n\treturn (\n\t\t<Flex\n\t\t\tdata-testid=\"index-page-template\"\n\t\t\tdirection=\"column\"\n\t\t\tflex=\"1\"\n\t\t\tminH=\"0\"\n\t\t>\n\t\t\t<PageHeader\n\t\t\t\tbreadcrumbs={breadcrumbs}\n\t\t\t\ttitle={title}\n\t\t\t\tsubtitle={subtitle}\n\t\t\t\teyebrow={eyebrow}\n\t\t\t\tactions={resolvedActions}\n\t\t\t/>\n\t\t\t{tabs ? <Box>{tabs}</Box> : null}\n\t\t\t{toolbar ? <Box>{toolbar}</Box> : null}\n\t\t\t<Box flex=\"1\" minH=\"0\">\n\t\t\t\t{children}\n\t\t\t</Box>\n\t\t</Flex>\n\t);\n}\nIndexPageTemplate.displayName = \"IndexPageTemplate\";\n","// src/templates/loading-page.tsx\n//\n// LoadingPage — full-bleed initial-boot loading screen. Used while the\n// authenticated app shell is being hydrated (auth check, theme loading,\n// initial data fetch). For in-page loading states (e.g. tab switch),\n// prefer a centered <Spinner /> inside the page body — this template is\n// only for the very first frame of the app.\n\nimport type { ReactNode } from \"react\";\nimport { Box, Flex } from \"../primitives/layout\";\nimport { Spinner } from \"../primitives/spinner\";\nimport { Text } from \"../primitives/typography\";\n\nexport interface LoadingPageProps {\n\t/** Optional logo rendered above the spinner. */\n\tlogo?: ReactNode;\n\t/**\n\t * Optional message rendered below the spinner. Keep it short\n\t * (e.g. \"Loading your workspace…\").\n\t */\n\tmessage?: ReactNode;\n}\n\nexport function LoadingPage({ logo, message }: LoadingPageProps) {\n\treturn (\n\t\t<Flex\n\t\t\tdata-testid=\"loading-page\"\n\t\t\tdirection=\"column\"\n\t\t\talign=\"center\"\n\t\t\tjustify=\"center\"\n\t\t\tminH=\"100vh\"\n\t\t\tbg=\"bg-canvas\"\n\t\t\tgap=\"6\"\n\t\t\ttextAlign=\"center\"\n\t\t>\n\t\t\t{logo && <Box>{logo}</Box>}\n\t\t\t<Spinner size=\"lg\" color=\"accent\" />\n\t\t\t{message && (\n\t\t\t\t<Text fontSize=\"sm\" color=\"muted\">\n\t\t\t\t\t{message}\n\t\t\t\t</Text>\n\t\t\t)}\n\t\t</Flex>\n\t);\n}\nLoadingPage.displayName = \"LoadingPage\";\n","// src/templates/maintenance-page.tsx\n//\n// MaintenancePage — full-bleed maintenance/down-for-upgrade screen. No app\n// shell. Surfaces a clear message, an optional ETA, and an optional link\n// to a status page. Operators serve this from a static asset or a\n// fallback handler when the app is offline.\n\nimport type { ReactNode } from \"react\";\nimport { Box, Flex } from \"../primitives/layout\";\nimport { Heading, Text } from \"../primitives/typography\";\n\nexport interface MaintenancePageProps {\n\t/** Logo rendered top-left. */\n\tlogo?: ReactNode;\n\t/** Headline — e.g. \"We'll be right back\". */\n\ttitle?: ReactNode;\n\t/**\n\t * One-paragraph message explaining what's happening and what users\n\t * should do (typically \"wait, we'll be back shortly\").\n\t */\n\tdescription?: ReactNode;\n\t/**\n\t * Estimated-time-of-restoration banner. Pass a string like\n\t * \"Estimated back online: 14:30 UTC\". Rendered below the description.\n\t */\n\teta?: ReactNode;\n\t/**\n\t * Optional link to a status page or twitter status. Pass a fully-\n\t * styled `<Link>` or an `<a>` element.\n\t */\n\tstatusLink?: ReactNode;\n}\n\nexport function MaintenancePage({\n\tlogo,\n\ttitle = \"We'll be right back\",\n\tdescription = \"We're upgrading the service. Please refresh in a few minutes.\",\n\teta,\n\tstatusLink,\n}: MaintenancePageProps) {\n\treturn (\n\t\t<Flex\n\t\t\tdata-testid=\"maintenance-page\"\n\t\t\tdirection=\"column\"\n\t\t\tminH=\"100vh\"\n\t\t\tbg=\"bg-canvas\"\n\t\t>\n\t\t\t{logo && (\n\t\t\t\t<Box px=\"8\" py=\"6\">\n\t\t\t\t\t{logo}\n\t\t\t\t</Box>\n\t\t\t)}\n\t\t\t<Flex\n\t\t\t\tflex=\"1\"\n\t\t\t\tdirection=\"column\"\n\t\t\t\talign=\"center\"\n\t\t\t\tjustify=\"center\"\n\t\t\t\tpx=\"8\"\n\t\t\t\tpb=\"16\"\n\t\t\t\ttextAlign=\"center\"\n\t\t\t>\n\t\t\t\t<Heading\n\t\t\t\t\tas=\"h1\"\n\t\t\t\t\tfontSize=\"3xl\"\n\t\t\t\t\tfontWeight=\"semibold\"\n\t\t\t\t\tcolor=\"default\"\n\t\t\t\t\tletterSpacing=\"-0.02em\"\n\t\t\t\t\tmb=\"4\"\n\t\t\t\t>\n\t\t\t\t\t{title}\n\t\t\t\t</Heading>\n\t\t\t\t{description && (\n\t\t\t\t\t<Text fontSize=\"md\" color=\"muted\" lineHeight=\"1.6\" maxW=\"lg\" mb=\"6\">\n\t\t\t\t\t\t{description}\n\t\t\t\t\t</Text>\n\t\t\t\t)}\n\t\t\t\t{eta && (\n\t\t\t\t\t<Box\n\t\t\t\t\t\tpx=\"4\"\n\t\t\t\t\t\tpy=\"2\"\n\t\t\t\t\t\tborderWidth=\"1px\"\n\t\t\t\t\t\tborderColor=\"border\"\n\t\t\t\t\t\tborderRadius=\"md\"\n\t\t\t\t\t\tbg=\"bg-surface\"\n\t\t\t\t\t\tmb=\"6\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<Text fontSize=\"sm\" fontWeight=\"medium\" color=\"emphasized\">\n\t\t\t\t\t\t\t{eta}\n\t\t\t\t\t\t</Text>\n\t\t\t\t\t</Box>\n\t\t\t\t)}\n\t\t\t\t{statusLink && <Box>{statusLink}</Box>}\n\t\t\t</Flex>\n\t\t</Flex>\n\t);\n}\nMaintenancePage.displayName = \"MaintenancePage\";\n","// src/templates/marketing-page-template.tsx\n//\n// MarketingPageTemplate — full-bleed landing-page chrome. No app shell, no\n// sidebar, no rail. Used for product landing pages, \"about us\", coming-\n// soon teasers, and other unauthenticated marketing surfaces.\n//\n// Composition (top to bottom):\n//\n// ┌──────────────────────────────────────────┐\n// │ topbar (logo · nav · CTA) │\n// ├──────────────────────────────────────────┤\n// │ hero (eyebrow · title · subtitle · CTAs) │\n// ├──────────────────────────────────────────┤\n// │ children (feature sections, testimonials) │\n// ├──────────────────────────────────────────┤\n// │ footer (copyright, links) │\n// └──────────────────────────────────────────┘\n//\n// The template aims for the same refined-minimalism aesthetic as the rest\n// of anker — calm surfaces, generous spacing on the hero only, brand\n// colors used as accents rather than full backgrounds. No carousels, no\n// animated parallax, no auto-rotating testimonials.\n\nimport type { ReactNode } from \"react\";\nimport { Box, Flex } from \"../primitives/layout\";\nimport { Heading, Text } from \"../primitives/typography\";\n\nexport interface MarketingPageTemplateProps {\n\t/** Logo or wordmark, far-left of the topbar. */\n\tlogo?: ReactNode;\n\t/** Navigation links and/or sign-in CTA, far-right of the topbar. */\n\ttopBarRight?: ReactNode;\n\t/** Hide the topbar (rare). */\n\thideTopBar?: boolean;\n\t/** Eyebrow above the hero title (uppercase, muted). */\n\theroEyebrow?: ReactNode;\n\t/** Hero title — large display text. */\n\theroTitle?: ReactNode;\n\t/** Hero subtitle — one-paragraph value statement. */\n\theroSubtitle?: ReactNode;\n\t/** Hero CTAs — typically one solid button + one ghost link. */\n\theroActions?: ReactNode;\n\t/** Optional visual rendered to the right of the hero copy on wide viewports. */\n\theroVisual?: ReactNode;\n\t/**\n\t * Feature sections, testimonials, etc. Rendered with `maxW=\"6xl\"` and\n\t * `marginInline=\"auto\"` so content tracks a consistent reading column.\n\t */\n\tchildren?: ReactNode;\n\t/** Footer content — copyright, secondary nav, contact. */\n\tfooter?: ReactNode;\n}\n\nexport function MarketingPageTemplate({\n\tlogo,\n\ttopBarRight,\n\thideTopBar,\n\theroEyebrow,\n\theroTitle,\n\theroSubtitle,\n\theroActions,\n\theroVisual,\n\tchildren,\n\tfooter,\n}: MarketingPageTemplateProps) {\n\treturn (\n\t\t<Box data-testid=\"marketing-page-template\" minH=\"100vh\" bg=\"bg-canvas\">\n\t\t\t{!hideTopBar && (\n\t\t\t\t<Flex\n\t\t\t\t\talign=\"center\"\n\t\t\t\t\tjustify=\"space-between\"\n\t\t\t\t\tpx=\"8\"\n\t\t\t\t\tpy=\"4\"\n\t\t\t\t\tbg=\"bg-surface\"\n\t\t\t\t\tborderBottomWidth=\"1px\"\n\t\t\t\t\tborderBottomColor=\"border\"\n\t\t\t\t>\n\t\t\t\t\t<Box>{logo}</Box>\n\t\t\t\t\t<Flex gap=\"6\" align=\"center\" fontSize=\"sm\" color=\"emphasized\">\n\t\t\t\t\t\t{topBarRight}\n\t\t\t\t\t</Flex>\n\t\t\t\t</Flex>\n\t\t\t)}\n\n\t\t\t{(heroEyebrow || heroTitle || heroSubtitle || heroActions) && (\n\t\t\t\t<Box px=\"8\" py=\"20\" bg=\"bg-canvas\">\n\t\t\t\t\t<Flex\n\t\t\t\t\t\tmaxW=\"6xl\"\n\t\t\t\t\t\tmarginInline=\"auto\"\n\t\t\t\t\t\talign=\"center\"\n\t\t\t\t\t\tgap=\"12\"\n\t\t\t\t\t\tdirection={{ base: \"column\", md: \"row\" }}\n\t\t\t\t\t>\n\t\t\t\t\t\t<Box flex=\"1\" minW=\"0\">\n\t\t\t\t\t\t\t{heroEyebrow && (\n\t\t\t\t\t\t\t\t<Text\n\t\t\t\t\t\t\t\t\tfontSize=\"2xs\"\n\t\t\t\t\t\t\t\t\tfontWeight=\"semibold\"\n\t\t\t\t\t\t\t\t\tletterSpacing=\"wider\"\n\t\t\t\t\t\t\t\t\ttextTransform=\"uppercase\"\n\t\t\t\t\t\t\t\t\tcolor=\"muted\"\n\t\t\t\t\t\t\t\t\tmb=\"3\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{heroEyebrow}\n\t\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t{heroTitle && (\n\t\t\t\t\t\t\t\t<Heading\n\t\t\t\t\t\t\t\t\tas=\"h1\"\n\t\t\t\t\t\t\t\t\tfontSize={{ base: \"4xl\", md: \"6xl\" }}\n\t\t\t\t\t\t\t\t\tfontWeight=\"semibold\"\n\t\t\t\t\t\t\t\t\tcolor=\"default\"\n\t\t\t\t\t\t\t\t\tletterSpacing=\"-0.02em\"\n\t\t\t\t\t\t\t\t\tlineHeight=\"1.05\"\n\t\t\t\t\t\t\t\t\tmb=\"5\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{heroTitle}\n\t\t\t\t\t\t\t\t</Heading>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t{heroSubtitle && (\n\t\t\t\t\t\t\t\t<Text\n\t\t\t\t\t\t\t\t\tfontSize=\"lg\"\n\t\t\t\t\t\t\t\t\tcolor=\"muted\"\n\t\t\t\t\t\t\t\t\tlineHeight=\"1.6\"\n\t\t\t\t\t\t\t\t\tmaxW=\"2xl\"\n\t\t\t\t\t\t\t\t\tmb=\"8\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{heroSubtitle}\n\t\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t{heroActions && (\n\t\t\t\t\t\t\t\t<Flex gap=\"3\" align=\"center\">\n\t\t\t\t\t\t\t\t\t{heroActions}\n\t\t\t\t\t\t\t\t</Flex>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</Box>\n\t\t\t\t\t\t{heroVisual && (\n\t\t\t\t\t\t\t<Box flex=\"1\" minW=\"0\" display={{ base: \"none\", md: \"block\" }}>\n\t\t\t\t\t\t\t\t{heroVisual}\n\t\t\t\t\t\t\t</Box>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</Flex>\n\t\t\t\t</Box>\n\t\t\t)}\n\n\t\t\t{children && (\n\t\t\t\t<Box px=\"8\" py=\"16\">\n\t\t\t\t\t<Box maxW=\"6xl\" marginInline=\"auto\">\n\t\t\t\t\t\t{children}\n\t\t\t\t\t</Box>\n\t\t\t\t</Box>\n\t\t\t)}\n\n\t\t\t{footer && (\n\t\t\t\t<Box\n\t\t\t\t\tpx=\"8\"\n\t\t\t\t\tpy=\"8\"\n\t\t\t\t\tbg=\"bg-subtle\"\n\t\t\t\t\tborderTopWidth=\"1px\"\n\t\t\t\t\tborderTopColor=\"border\"\n\t\t\t\t>\n\t\t\t\t\t<Box maxW=\"6xl\" marginInline=\"auto\">\n\t\t\t\t\t\t{footer}\n\t\t\t\t\t</Box>\n\t\t\t\t</Box>\n\t\t\t)}\n\t\t</Box>\n\t);\n}\nMarketingPageTemplate.displayName = \"MarketingPageTemplate\";\n","// src/templates/settings-page-template.tsx\n//\n// SettingsPageTemplate — for any \"preferences / configuration\" page that\n// uses a tabbed split between mixed form / list content.\n//\n// ┌─────────────────────────────────────────┐\n// │ PageHeader (breadcrumbs · title · …) │\n// ├─────────────────────────────────────────┤\n// │ Tabs (required for settings) │\n// ├─────────────────────────────────────────┤\n// │ children OR bodyTabs panes │\n// └─────────────────────────────────────────┘\n//\n// Two ways to render tabs (mutually exclusive):\n//\n// 1. `bodyTabs` — declarative panels owned by the template. Template\n// wraps Tabs.Root with `lazyMount unmountOnExit`. Prefer this for\n// settings pages.\n//\n// 2. `tabs` + `children` — consumer owns Tabs.Root and Tabs.Content.\n// Retained for back-compat / advanced cases.\n\nimport type { ReactNode } from \"react\";\nimport { PageHeader, type PageHeaderProps } from \"../components/page-header\";\nimport { Box, Flex } from \"../primitives/layout\";\nimport { Tabs } from \"../primitives/tabs\";\nimport { useRegisteredPageActions } from \"./app-shell\";\nimport type { BodyTabsProp } from \"./detail-page-template\";\n\nexport type { BodyTabsItem, BodyTabsProp } from \"./detail-page-template\";\n\nexport interface SettingsPageTemplateProps\n\textends Pick<\n\t\tPageHeaderProps,\n\t\t\"breadcrumbs\" | \"title\" | \"subtitle\" | \"eyebrow\"\n\t> {\n\tactions?: ReactNode;\n\t/**\n\t * Tab strip (consumer-owned). Mutually exclusive with `bodyTabs`.\n\t * Settings pages should always have at least two tabs — if you only\n\t * have one section, use DetailPageTemplate instead.\n\t */\n\ttabs?: ReactNode;\n\t/**\n\t * Owned-panel tabs. Template renders Tabs.Root with `lazyMount\n\t * unmountOnExit`; only the active item's `content` mounts. Mutually\n\t * exclusive with `tabs`.\n\t */\n\tbodyTabs?: BodyTabsProp;\n\t/** Page body when `bodyTabs` is not set. */\n\tchildren?: ReactNode;\n\t/**\n\t * Constrain the body width for readability. @default \"3xl\" (= 768px).\n\t * Pass `\"full\"` to disable the constraint entirely.\n\t */\n\tmaxBodyWidth?: string;\n\t/**\n\t * Padding applied to the body between the tab strip and the page\n\t * content. @default \"default\" (`px=\"8\" pt=\"6\"`). Pass `\"none\"` to\n\t * render flush.\n\t */\n\tbodyPadding?: \"default\" | \"none\";\n}\n\nexport function SettingsPageTemplate({\n\tbreadcrumbs,\n\ttitle,\n\tsubtitle,\n\teyebrow,\n\tactions,\n\ttabs,\n\tbodyTabs,\n\tchildren,\n\tmaxBodyWidth = \"3xl\",\n\tbodyPadding = \"default\",\n}: SettingsPageTemplateProps) {\n\tif (tabs && bodyTabs) {\n\t\tthrow new Error(\n\t\t\t\"SettingsPageTemplate: `tabs` and `bodyTabs` are mutually exclusive — use `bodyTabs` for owned panels, `tabs` for consumer-owned tab strips.\",\n\t\t);\n\t}\n\tconst registered = useRegisteredPageActions();\n\tconst resolvedActions = actions ?? registered;\n\tconst bodyPx = bodyPadding === \"none\" ? \"0\" : \"8\";\n\tconst bodyPt = bodyPadding === \"none\" ? \"0\" : \"6\";\n\n\tconst renderBody = (node: ReactNode) => (\n\t\t<Box flex=\"1\" minH=\"0\" px={bodyPx} pt={bodyPt}>\n\t\t\t<Box\n\t\t\t\tmaxW={maxBodyWidth}\n\t\t\t\tmarginInline={maxBodyWidth === \"full\" ? \"0\" : \"auto\"}\n\t\t\t>\n\t\t\t\t{node}\n\t\t\t</Box>\n\t\t</Box>\n\t);\n\n\tif (bodyTabs) {\n\t\tconst tabsRootProps =\n\t\t\tbodyTabs.value !== undefined\n\t\t\t\t? {\n\t\t\t\t\t\tvalue: bodyTabs.value,\n\t\t\t\t\t\tonValueChange: (d: { value: string }) =>\n\t\t\t\t\t\t\tbodyTabs.onValueChange?.(d.value),\n\t\t\t\t\t}\n\t\t\t\t: { defaultValue: bodyTabs.defaultValue };\n\t\treturn (\n\t\t\t<Flex\n\t\t\t\tdata-testid=\"settings-page-template\"\n\t\t\t\tdirection=\"column\"\n\t\t\t\tflex=\"1\"\n\t\t\t\tminH=\"0\"\n\t\t\t>\n\t\t\t\t<PageHeader\n\t\t\t\t\tbreadcrumbs={breadcrumbs}\n\t\t\t\t\ttitle={title}\n\t\t\t\t\tsubtitle={subtitle}\n\t\t\t\t\teyebrow={eyebrow}\n\t\t\t\t\tactions={resolvedActions}\n\t\t\t\t/>\n\t\t\t\t<Tabs.Root lazyMount unmountOnExit {...tabsRootProps}>\n\t\t\t\t\t<Box>\n\t\t\t\t\t\t<Tabs.List>\n\t\t\t\t\t\t\t{bodyTabs.items.map((item) => (\n\t\t\t\t\t\t\t\t<Tabs.Trigger key={item.value} value={item.value}>\n\t\t\t\t\t\t\t\t\t{item.label}\n\t\t\t\t\t\t\t\t</Tabs.Trigger>\n\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t</Tabs.List>\n\t\t\t\t\t</Box>\n\t\t\t\t\t{renderBody(\n\t\t\t\t\t\tbodyTabs.items.map((item) => (\n\t\t\t\t\t\t\t<Tabs.Content key={item.value} value={item.value}>\n\t\t\t\t\t\t\t\t{item.content}\n\t\t\t\t\t\t\t</Tabs.Content>\n\t\t\t\t\t\t)),\n\t\t\t\t\t)}\n\t\t\t\t</Tabs.Root>\n\t\t\t</Flex>\n\t\t);\n\t}\n\n\treturn (\n\t\t<Flex\n\t\t\tdata-testid=\"settings-page-template\"\n\t\t\tdirection=\"column\"\n\t\t\tflex=\"1\"\n\t\t\tminH=\"0\"\n\t\t>\n\t\t\t<PageHeader\n\t\t\t\tbreadcrumbs={breadcrumbs}\n\t\t\t\ttitle={title}\n\t\t\t\tsubtitle={subtitle}\n\t\t\t\teyebrow={eyebrow}\n\t\t\t\tactions={resolvedActions}\n\t\t\t/>\n\t\t\t<Box>{tabs}</Box>\n\t\t\t{renderBody(children)}\n\t\t</Flex>\n\t);\n}\nSettingsPageTemplate.displayName = \"SettingsPageTemplate\";\n"]}
|