@knkcs/anker 2.5.1 → 2.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -25,13 +25,14 @@ declare function usePageRail(content: ReactNode): void;
25
25
  /**
26
26
  * Register page-header content (typically a <PageHeader>) from any descendant
27
27
  * of `<AppShell>`. The content is rendered by AppShell in grid row 1, spanning
28
- * the main column and the rail column (when present), so the header band
29
- * crosses both columns and the rail starts below it.
28
+ * the main column and the rail column (when present).
30
29
  *
31
- * Pass `null` (or omit) to clear the registration. The hook is a no-op when
32
- * called outside an AppShell.
30
+ * Pass `options.sticky === false` to opt out of the default sticky behaviour
31
+ * for the specific page. The hook is a no-op when called outside an AppShell.
33
32
  */
34
- declare function usePageHeader(content: ReactNode): void;
33
+ declare function usePageHeader(content: ReactNode, options?: {
34
+ sticky?: boolean;
35
+ }): void;
35
36
  interface AppShellProps {
36
37
  /**
37
38
  * Sidebar element — the navigation column. Required. Typically an instance
@@ -128,8 +129,13 @@ interface DetailPageTemplateProps extends Pick<PageHeaderProps, "breadcrumbs" |
128
129
  /** Optional tab strip rendered as the third row of the page header band. */
129
130
  tabs?: ReactNode;
130
131
  children?: ReactNode;
132
+ /**
133
+ * Pin the page-header band to the top of the viewport while the body
134
+ * scrolls. @default true
135
+ */
136
+ stickyHeader?: boolean;
131
137
  }
132
- declare function DetailPageTemplate({ breadcrumbs, title, subtitle, eyebrow, actions, avatar, badges, meta, tabs, children, }: DetailPageTemplateProps): react_jsx_runtime.JSX.Element;
138
+ declare function DetailPageTemplate({ breadcrumbs, title, subtitle, eyebrow, actions, avatar, badges, meta, tabs, children, stickyHeader, }: DetailPageTemplateProps): react_jsx_runtime.JSX.Element;
133
139
  declare namespace DetailPageTemplate {
134
140
  var displayName: string;
135
141
  }
@@ -192,6 +198,11 @@ interface IndexPageTemplateProps extends Pick<PageHeaderProps, "breadcrumbs" | "
192
198
  * `children` if you need it.
193
199
  */
194
200
  children: ReactNode;
201
+ /**
202
+ * Pin the page-header band to the top of the viewport while the body
203
+ * scrolls. @default true
204
+ */
205
+ stickyHeader?: boolean;
195
206
  }
196
207
  /**
197
208
  * Canonical list-page layout. Renders PageHeader (with optional tabs inside) →
@@ -201,7 +212,7 @@ interface IndexPageTemplateProps extends Pick<PageHeaderProps, "breadcrumbs" | "
201
212
  * registered slot via `usePageActions`. This lets a tab-pane component deep
202
213
  * inside `children` register its own actions without prop-drilling.
203
214
  */
204
- declare function IndexPageTemplate({ breadcrumbs, title, subtitle, eyebrow, actions, tabs, toolbar, children, }: IndexPageTemplateProps): react_jsx_runtime.JSX.Element;
215
+ declare function IndexPageTemplate({ breadcrumbs, title, subtitle, eyebrow, actions, tabs, toolbar, children, stickyHeader, }: IndexPageTemplateProps): react_jsx_runtime.JSX.Element;
205
216
  declare namespace IndexPageTemplate {
206
217
  var displayName: string;
207
218
  }
@@ -303,8 +314,13 @@ interface SettingsPageTemplateProps extends Pick<PageHeaderProps, "breadcrumbs"
303
314
  * render flush.
304
315
  */
305
316
  bodyPadding?: "default" | "none";
317
+ /**
318
+ * Pin the page-header band to the top of the viewport while the body
319
+ * scrolls. @default true
320
+ */
321
+ stickyHeader?: boolean;
306
322
  }
307
- declare function SettingsPageTemplate({ breadcrumbs, title, subtitle, eyebrow, actions, avatar, badges, meta, tabs, children, maxBodyWidth, bodyPadding, }: SettingsPageTemplateProps): react_jsx_runtime.JSX.Element;
323
+ declare function SettingsPageTemplate({ breadcrumbs, title, subtitle, eyebrow, actions, avatar, badges, meta, tabs, children, maxBodyWidth, bodyPadding, stickyHeader, }: SettingsPageTemplateProps): react_jsx_runtime.JSX.Element;
308
324
  declare namespace SettingsPageTemplate {
309
325
  var displayName: string;
310
326
  }
@@ -24,9 +24,9 @@ function createSlotStore() {
24
24
  get(slot) {
25
25
  return values[slot];
26
26
  },
27
- set(slot, node) {
28
- if (values[slot] === node) return;
29
- values[slot] = node;
27
+ set(slot, value) {
28
+ if (values[slot] === value) return;
29
+ values[slot] = value;
30
30
  notify(slot);
31
31
  },
32
32
  clear(slot) {
@@ -90,10 +90,12 @@ function usePageRail(content) {
90
90
  store.set("rail", content);
91
91
  }, [store, content]);
92
92
  }
93
- function usePageHeader(content) {
93
+ function usePageHeader(content, options) {
94
94
  const store = useContext(SlotStoreContext);
95
- const latest = useRef(content);
96
- latest.current = content;
95
+ const sticky = options?.sticky ?? true;
96
+ const value = { node: content, sticky };
97
+ const latest = useRef(value);
98
+ latest.current = value;
97
99
  useEffect(() => {
98
100
  if (!store) return;
99
101
  store.set("header", latest.current);
@@ -103,8 +105,8 @@ function usePageHeader(content) {
103
105
  }, [store]);
104
106
  useEffect(() => {
105
107
  if (!store) return;
106
- store.set("header", content);
107
- }, [store, content]);
108
+ store.set("header", { node: content, sticky });
109
+ }, [store, content, sticky]);
108
110
  }
109
111
  function useRegisteredPageActions() {
110
112
  return useSlotValue("actions");
@@ -116,7 +118,9 @@ function AppShell({ sidebar, rail, children }) {
116
118
  AppShell.displayName = "AppShell";
117
119
  function AppShellInner({ sidebar, rail, children }) {
118
120
  const railNode = useSlotValue("rail");
119
- const headerNode = useSlotValue("header");
121
+ const headerSlot = useSlotValue("header");
122
+ const headerNode = headerSlot?.node ?? null;
123
+ const headerSticky = headerSlot?.sticky ?? true;
120
124
  const renderedRail = railNode ?? rail;
121
125
  const showRailColumn = renderedRail !== void 0 && renderedRail !== null && renderedRail !== false;
122
126
  const showHeaderRow = headerNode !== null && headerNode !== void 0;
@@ -149,9 +153,13 @@ function AppShellInner({ sidebar, rail, children }) {
149
153
  Box,
150
154
  {
151
155
  "data-testid": "app-shell-header",
156
+ "data-sticky-header": headerSticky ? "true" : "false",
152
157
  gridColumn: showRailColumn ? "2 / 4" : "2 / 3",
153
158
  gridRow: "1",
154
159
  minW: "0",
160
+ position: headerSticky ? "sticky" : void 0,
161
+ top: headerSticky ? "0" : void 0,
162
+ zIndex: headerSticky ? "docked" : void 0,
155
163
  children: headerNode
156
164
  }
157
165
  ) : null,
@@ -248,7 +256,8 @@ function DetailPageTemplate({
248
256
  badges,
249
257
  meta,
250
258
  tabs,
251
- children
259
+ children,
260
+ stickyHeader = true
252
261
  }) {
253
262
  const registered = useRegisteredPageActions();
254
263
  const resolvedActions = actions ?? registered;
@@ -266,7 +275,8 @@ function DetailPageTemplate({
266
275
  meta,
267
276
  tabs
268
277
  }
269
- )
278
+ ),
279
+ { sticky: stickyHeader }
270
280
  );
271
281
  return /* @__PURE__ */ jsx(
272
282
  Flex,
@@ -351,7 +361,8 @@ function IndexPageTemplate({
351
361
  actions,
352
362
  tabs,
353
363
  toolbar,
354
- children
364
+ children,
365
+ stickyHeader = true
355
366
  }) {
356
367
  const registered = useRegisteredPageActions();
357
368
  const resolvedActions = actions ?? registered;
@@ -366,7 +377,8 @@ function IndexPageTemplate({
366
377
  actions: resolvedActions,
367
378
  tabs
368
379
  }
369
- )
380
+ ),
381
+ { sticky: stickyHeader }
370
382
  );
371
383
  return /* @__PURE__ */ jsxs(
372
384
  Flex,
@@ -574,7 +586,8 @@ function SettingsPageTemplate({
574
586
  tabs,
575
587
  children,
576
588
  maxBodyWidth = "3xl",
577
- bodyPadding = "default"
589
+ bodyPadding = "default",
590
+ stickyHeader = true
578
591
  }) {
579
592
  const registered = useRegisteredPageActions();
580
593
  const resolvedActions = actions ?? registered;
@@ -592,7 +605,8 @@ function SettingsPageTemplate({
592
605
  meta,
593
606
  tabs
594
607
  }
595
- )
608
+ ),
609
+ { sticky: stickyHeader }
596
610
  );
597
611
  const bodyPx = bodyPadding === "none" ? "0" : "8";
598
612
  const bodyPt = bodyPadding === "none" ? "0" : "6";
@@ -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","../../src/templates/subnav-layout.tsx"],"names":["jsx","jsxs","useEffect","useCallback","useMemo"],"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 × 2-row CSS grid. The sidebar spans the full\n// height on the left. The page header band (when registered) spans the\n// main + rail columns across row 1. The main content sits in row 2\n// column 2; the optional context rail sits in row 2 column 3, beginning\n// below the header band.\n//\n// ┌─────────┬───────────────────────────────────┐\n// │ │ page header band │\n// │ │ ┌ breadcrumb ─────────────────┐ │\n// │ │ ┌ detail (avatar/title/etc.) ─┐ │\n// │ │ ┌ tabs (optional) ────────────┐ │\n// │ ├───────────────────────┬───────────┤\n// │ sidebar │ children │ rail │\n// │ │ (body / cards / …) │ │\n// │ │ │ │\n// └─────────┴───────────────────────┴───────────┘\n//\n// Slot mechanism\n// --------------\n// AppShell installs an external slot store on its descendants via context.\n// Three named slots are exposed:\n//\n// - \"actions\" — registered via `usePageActions(node)` — surfaced by page\n// templates inside their <PageHeader actions=…> slot.\n// - \"header\" — registered via `usePageHeader(node)` — surfaced by\n// AppShell as the content of grid row 1 (spanning the main + rail\n// columns). Page templates push their <PageHeader> here.\n// - \"rail\" — registered via `usePageRail(node)` — surfaced by\n// AppShell as the content of the right rail column (row 2 column 3).\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\" | \"header\" | \"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\theader: null,\n\t\trail: null,\n\t};\n\tconst listeners: Record<SlotName, Set<() => void>> = {\n\t\tactions: new Set(),\n\t\theader: 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 * Register page-header content (typically a <PageHeader>) from any descendant\n * of `<AppShell>`. The content is rendered by AppShell in grid row 1, spanning\n * the main column and the rail column (when present), so the header band\n * crosses both columns and the rail starts below it.\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 usePageHeader(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(\"header\", latest.current);\n\t\treturn () => {\n\t\t\tstore.clear(\"header\");\n\t\t};\n\t}, [store]);\n\tuseEffect(() => {\n\t\tif (!store) return;\n\t\tstore.set(\"header\", 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\tconst headerNode = useSlotValue(\"header\");\n\n\tconst renderedRail = railNode ?? rail;\n\tconst showRailColumn =\n\t\trenderedRail !== undefined &&\n\t\trenderedRail !== null &&\n\t\trenderedRail !== false;\n\tconst showHeaderRow = headerNode !== null && headerNode !== undefined;\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\tdata-header={showHeaderRow ? \"true\" : \"false\"}\n\t\t\ttemplateColumns={showRailColumn ? \"auto 1fr auto\" : \"auto 1fr\"}\n\t\t\ttemplateRows=\"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\tgridRow=\"1 / 3\"\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>\n\t\t\t\t{sidebar}\n\t\t\t</Box>\n\t\t\t{showHeaderRow ? (\n\t\t\t\t<Box\n\t\t\t\t\tdata-testid=\"app-shell-header\"\n\t\t\t\t\tgridColumn={showRailColumn ? \"2 / 4\" : \"2 / 3\"}\n\t\t\t\t\tgridRow=\"1\"\n\t\t\t\t\tminW=\"0\"\n\t\t\t\t>\n\t\t\t\t\t{headerNode}\n\t\t\t\t</Box>\n\t\t\t) : null}\n\t\t\t<Flex\n\t\t\t\tdata-testid=\"app-shell-main\"\n\t\t\t\tgridColumn=\"2\"\n\t\t\t\tgridRow=\"2\"\n\t\t\t\tdirection=\"column\"\n\t\t\t\tminW=\"0\"\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\tgridRow=\"2\"\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\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// │ avatar · badges · meta (detail row) │\n// │ tabs (optional third row) │\n// └─────────────────────────────────────────┘\n// ┌─────────────────────────────────────────┐\n// │ children (body — flush, no padding) │\n// └─────────────────────────────────────────┘\n//\n// The tab list renders inside the header band via the slot store.\n// The active panel is provided as `children`. Use nav-link tabs:\n// build a `<Tabs.Root value={current}>` with only `<Tabs.List>` inside,\n// pass to `tabs`, and let the router render the active panel as children.\n\nimport type { ReactNode } from \"react\";\nimport { PageHeader, type PageHeaderProps } from \"../components/page-header\";\nimport { Box, Flex } from \"../primitives/layout\";\nimport { usePageHeader, useRegisteredPageActions } from \"./app-shell\";\n\nexport interface DetailPageTemplateProps\n\textends Pick<\n\t\tPageHeaderProps,\n\t\t\"breadcrumbs\" | \"title\" | \"subtitle\" | \"eyebrow\"\n\t> {\n\t/**\n\t * Optional explicit page-action content. Falls back to the actions\n\t * registered via `usePageActions` if not provided.\n\t */\n\tactions?: ReactNode;\n\t/** Avatar slot for the page header's detail row. */\n\tavatar?: ReactNode;\n\t/** Badges shown inline next to the title. */\n\tbadges?: ReactNode;\n\t/** Secondary meta line below the title (email, dept, ID, etc.). */\n\tmeta?: ReactNode;\n\t/** Optional tab strip rendered as the third row of the page header band. */\n\ttabs?: ReactNode;\n\tchildren?: ReactNode;\n}\n\nexport function DetailPageTemplate({\n\tbreadcrumbs,\n\ttitle,\n\tsubtitle,\n\teyebrow,\n\tactions,\n\tavatar,\n\tbadges,\n\tmeta,\n\ttabs,\n\tchildren,\n}: DetailPageTemplateProps) {\n\tconst registered = useRegisteredPageActions();\n\tconst resolvedActions = actions ?? registered;\n\tusePageHeader(\n\t\t<PageHeader\n\t\t\tbreadcrumbs={breadcrumbs}\n\t\t\ttitle={title}\n\t\t\tsubtitle={subtitle}\n\t\t\teyebrow={eyebrow}\n\t\t\tactions={resolvedActions}\n\t\t\tavatar={avatar}\n\t\t\tbadges={badges}\n\t\t\tmeta={meta}\n\t\t\ttabs={tabs}\n\t\t/>,\n\t);\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<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// │ (tabs — third row) │\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 { usePageHeader, 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 inside the PageHeader band as the third row.\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 (with optional tabs inside) →\n * optional 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\tusePageHeader(\n\t\t<PageHeader\n\t\t\tbreadcrumbs={breadcrumbs}\n\t\t\ttitle={title}\n\t\t\tsubtitle={subtitle}\n\t\t\teyebrow={eyebrow}\n\t\t\tactions={resolvedActions}\n\t\t\ttabs={tabs}\n\t\t/>,\n\t);\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{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.\n//\n// ┌─────────────────────────────────────────┐\n// │ PageHeader (breadcrumbs · title · …) │\n// │ avatar · badges · meta (detail row) │\n// │ tabs (optional third row) │\n// └─────────────────────────────────────────┘\n// ┌─────────────────────────────────────────┐\n// │ children (body — constrained width) │\n// └─────────────────────────────────────────┘\n//\n// Pass a `<Tabs.Root value={current}>` with only `<Tabs.List>` inside to\n// `tabs`; let the router (or parent) render the active panel as `children`.\n\nimport type { ReactNode } from \"react\";\nimport { PageHeader, type PageHeaderProps } from \"../components/page-header\";\nimport { Box, Flex } from \"../primitives/layout\";\nimport { usePageHeader, useRegisteredPageActions } from \"./app-shell\";\n\nexport interface SettingsPageTemplateProps\n\textends Pick<\n\t\tPageHeaderProps,\n\t\t\"breadcrumbs\" | \"title\" | \"subtitle\" | \"eyebrow\"\n\t> {\n\t/**\n\t * Optional explicit page-action content. Falls back to the actions\n\t * registered via `usePageActions` if not provided.\n\t */\n\tactions?: ReactNode;\n\t/** Avatar slot for the page header's detail row. */\n\tavatar?: ReactNode;\n\t/** Badges shown inline next to the title. */\n\tbadges?: ReactNode;\n\t/** Secondary meta line below the title (email, dept, ID, etc.). */\n\tmeta?: ReactNode;\n\t/** Tab strip rendered as the third row of the page header band. */\n\ttabs?: ReactNode;\n\t/** Page body content. */\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\tavatar,\n\tbadges,\n\tmeta,\n\ttabs,\n\tchildren,\n\tmaxBodyWidth = \"3xl\",\n\tbodyPadding = \"default\",\n}: SettingsPageTemplateProps) {\n\tconst registered = useRegisteredPageActions();\n\tconst resolvedActions = actions ?? registered;\n\tusePageHeader(\n\t\t<PageHeader\n\t\t\tbreadcrumbs={breadcrumbs}\n\t\t\ttitle={title}\n\t\t\tsubtitle={subtitle}\n\t\t\teyebrow={eyebrow}\n\t\t\tactions={resolvedActions}\n\t\t\tavatar={avatar}\n\t\t\tbadges={badges}\n\t\t\tmeta={meta}\n\t\t\ttabs={tabs}\n\t\t/>,\n\t);\n\n\tconst bodyPx = bodyPadding === \"none\" ? \"0\" : \"8\";\n\tconst bodyPt = bodyPadding === \"none\" ? \"0\" : \"6\";\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<Box flex=\"1\" minH=\"0\" px={bodyPx} pt={bodyPt}>\n\t\t\t\t<Box\n\t\t\t\t\tmaxW={maxBodyWidth}\n\t\t\t\t\tmarginInline={maxBodyWidth === \"full\" ? \"0\" : \"auto\"}\n\t\t\t\t>\n\t\t\t\t\t{children}\n\t\t\t\t</Box>\n\t\t\t</Box>\n\t\t</Flex>\n\t);\n}\nSettingsPageTemplate.displayName = \"SettingsPageTemplate\";\n","// src/templates/subnav-layout.tsx\nimport { PanelLeftClose, PanelLeftOpen } from \"lucide-react\";\nimport type { ReactNode } from \"react\";\nimport { useCallback, useEffect, useMemo, useState } from \"react\";\nimport { IconButton } from \"../atoms/button\";\nimport { NavListModeProvider } from \"../components/nav-list/nav-list-context\";\nimport { Box, Grid } from \"../primitives/layout\";\n\nconst EXPANDED_NAV = \"220px\";\nconst COLLAPSED_NAV = \"56px\";\n\nfunction getInitialCollapsed(\n\tstorageKey: string | undefined,\n\tdefaultCollapsed: boolean | undefined,\n): boolean {\n\tif (typeof window === \"undefined\") return defaultCollapsed ?? false;\n\tif (storageKey) {\n\t\tconst stored = window.localStorage.getItem(storageKey);\n\t\tif (stored === \"true\") return true;\n\t\tif (stored === \"false\") return false;\n\t}\n\treturn defaultCollapsed ?? false;\n}\n\nexport interface SubNavLayoutProps {\n\tstorageKey?: string;\n\tdefaultCollapsed?: boolean;\n\t/** Overrides the toggle's aria-label. */\n\ttoggleAriaLabel?: string;\n\tchildren: ReactNode;\n}\n\nconst SubNavLayoutRoot = ({\n\tstorageKey,\n\tdefaultCollapsed,\n\ttoggleAriaLabel,\n\tchildren,\n}: SubNavLayoutProps) => {\n\tconst [collapsed, setCollapsed] = useState(() =>\n\t\tgetInitialCollapsed(storageKey, defaultCollapsed),\n\t);\n\n\tuseEffect(() => {\n\t\tif (storageKey) {\n\t\t\twindow.localStorage.setItem(storageKey, String(collapsed));\n\t\t}\n\t}, [collapsed, storageKey]);\n\n\tconst toggle = useCallback(() => setCollapsed((c) => !c), []);\n\tconst navMode = useMemo(() => ({ collapsed }), [collapsed]);\n\tconst label =\n\t\ttoggleAriaLabel ?? (collapsed ? \"Expand sub-nav\" : \"Collapse sub-nav\");\n\n\treturn (\n\t\t<NavListModeProvider value={navMode}>\n\t\t\t<Grid\n\t\t\t\tdata-testid=\"subnav-layout\"\n\t\t\t\tdata-collapsed={collapsed ? \"true\" : \"false\"}\n\t\t\t\tgridTemplateColumns={`${collapsed ? COLLAPSED_NAV : EXPANDED_NAV} 1fr`}\n\t\t\t\talignItems=\"stretch\"\n\t\t\t\tminH=\"0\"\n\t\t\t\tflex=\"1\"\n\t\t\t\tposition=\"relative\"\n\t\t\t\ttransition=\"grid-template-columns 250ms ease-out\"\n\t\t\t>\n\t\t\t\t{children}\n\t\t\t\t<IconButton\n\t\t\t\t\tdata-testid=\"subnav-toggle\"\n\t\t\t\t\taria-label={label}\n\t\t\t\t\tonClick={toggle}\n\t\t\t\t\tvariant=\"outline\"\n\t\t\t\t\tsize=\"xs\"\n\t\t\t\t\tposition=\"absolute\"\n\t\t\t\t\ttop=\"3\"\n\t\t\t\t\tleft={collapsed ? \"44px\" : \"208px\"}\n\t\t\t\t\twidth=\"7\"\n\t\t\t\t\theight=\"7\"\n\t\t\t\t\tminW=\"7\"\n\t\t\t\t\tborderRadius=\"full\"\n\t\t\t\t\tbg=\"bg-surface\"\n\t\t\t\t\tborderColor=\"border\"\n\t\t\t\t\tboxShadow=\"sm\"\n\t\t\t\t\tzIndex={4}\n\t\t\t\t\t_hover={{ bg: \"bg-muted\" }}\n\t\t\t\t\ttransition=\"left 250ms ease-out\"\n\t\t\t\t>\n\t\t\t\t\t{collapsed ? (\n\t\t\t\t\t\t<PanelLeftOpen size={14} />\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<PanelLeftClose size={14} />\n\t\t\t\t\t)}\n\t\t\t\t</IconButton>\n\t\t\t</Grid>\n\t\t</NavListModeProvider>\n\t);\n};\nSubNavLayoutRoot.displayName = \"SubNavLayout\";\n\nexport interface SubNavLayoutNavProps {\n\t\"aria-label\"?: string;\n\tchildren: ReactNode;\n}\n\nconst SubNavLayoutNav = ({ children, ...rest }: SubNavLayoutNavProps) => (\n\t<Box\n\t\tas=\"nav\"\n\t\taria-label={rest[\"aria-label\"]}\n\t\tdata-testid=\"subnav-layout-nav\"\n\t\tpy=\"3\"\n\t\tpx=\"1\"\n\t\tminW=\"0\"\n\t>\n\t\t{children}\n\t</Box>\n);\nSubNavLayoutNav.displayName = \"SubNavLayout.Nav\";\n\nexport interface SubNavLayoutDetailProps {\n\tchildren: ReactNode;\n}\n\nconst SubNavLayoutDetail = ({ children }: SubNavLayoutDetailProps) => (\n\t<Box\n\t\tdata-testid=\"subnav-layout-detail\"\n\t\tborderLeftWidth=\"1px\"\n\t\tborderColor=\"border\"\n\t\tminW=\"0\"\n\t\tdisplay=\"flex\"\n\t\tflexDirection=\"column\"\n\t>\n\t\t{children}\n\t</Box>\n);\nSubNavLayoutDetail.displayName = \"SubNavLayout.Detail\";\n\nexport interface SubNavLayoutToolbarProps {\n\tchildren: ReactNode;\n}\n\nconst SubNavLayoutToolbar = ({ children }: SubNavLayoutToolbarProps) => (\n\t<Box\n\t\tdata-testid=\"subnav-layout-toolbar\"\n\t\tdisplay=\"flex\"\n\t\talignItems=\"center\"\n\t\tgap=\"3\"\n\t\tpx=\"5\"\n\t\tpy=\"3\"\n\t\tborderBottomWidth=\"1px\"\n\t\tborderColor=\"border-muted\"\n\t\tbg=\"bg-canvas\"\n\t>\n\t\t{children}\n\t</Box>\n);\nSubNavLayoutToolbar.displayName = \"SubNavLayout.Toolbar\";\n\nexport const SubNavLayout = Object.assign(SubNavLayoutRoot, {\n\tNav: SubNavLayoutNav,\n\tDetail: SubNavLayoutDetail,\n\tToolbar: SubNavLayoutToolbar,\n});\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","../../src/templates/subnav-layout.tsx"],"names":["jsx","jsxs","useEffect","useCallback","useMemo"],"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 × 2-row CSS grid. The sidebar spans the full\n// height on the left. The page header band (when registered) spans the\n// main + rail columns across row 1. The main content sits in row 2\n// column 2; the optional context rail sits in row 2 column 3, beginning\n// below the header band.\n//\n// ┌─────────┬───────────────────────────────────┐\n// │ │ page header band │\n// │ │ ┌ breadcrumb ─────────────────┐ │\n// │ │ ┌ detail (avatar/title/etc.) ─┐ │\n// │ │ ┌ tabs (optional) ────────────┐ │\n// │ ├───────────────────────┬───────────┤\n// │ sidebar │ children │ rail │\n// │ │ (body / cards / …) │ │\n// │ │ │ │\n// └─────────┴───────────────────────┴───────────┘\n//\n// Slot mechanism\n// --------------\n// AppShell installs an external slot store on its descendants via context.\n// Three named slots are exposed:\n//\n// - \"actions\" — registered via `usePageActions(node)` — surfaced by page\n// templates inside their <PageHeader actions=…> slot.\n// - \"header\" — registered via `usePageHeader(node)` — surfaced by\n// AppShell as the content of grid row 1 (spanning the main + rail\n// columns). Page templates push their <PageHeader> here.\n// - \"rail\" — registered via `usePageRail(node)` — surfaced by\n// AppShell as the content of the right rail column (row 2 column 3).\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\" | \"header\" | \"rail\";\n\ninterface HeaderSlotValue {\n\tnode: ReactNode;\n\tsticky: boolean;\n}\n\ninterface SlotStore {\n\tget(slot: SlotName): unknown;\n\tset(slot: SlotName, value: unknown): void;\n\tclear(slot: SlotName): void;\n\tsubscribe(slot: SlotName, listener: () => void): () => void;\n}\n\nfunction createSlotStore(): SlotStore {\n\tconst values: Record<SlotName, unknown> = {\n\t\tactions: null,\n\t\theader: null,\n\t\trail: null,\n\t};\n\tconst listeners: Record<SlotName, Set<() => void>> = {\n\t\tactions: new Set(),\n\t\theader: 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, value) {\n\t\t\tif (values[slot] === value) return;\n\t\t\tvalues[slot] = value;\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): unknown {\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 * Register page-header content (typically a <PageHeader>) from any descendant\n * of `<AppShell>`. The content is rendered by AppShell in grid row 1, spanning\n * the main column and the rail column (when present).\n *\n * Pass `options.sticky === false` to opt out of the default sticky behaviour\n * for the specific page. The hook is a no-op when called outside an AppShell.\n */\nexport function usePageHeader(\n\tcontent: ReactNode,\n\toptions?: { sticky?: boolean },\n): void {\n\tconst store = useContext(SlotStoreContext);\n\tconst sticky = options?.sticky ?? true;\n\tconst value: HeaderSlotValue = { node: content, sticky };\n\tconst latest = useRef<HeaderSlotValue>(value);\n\tlatest.current = value;\n\tuseEffect(() => {\n\t\tif (!store) return;\n\t\tstore.set(\"header\", latest.current);\n\t\treturn () => {\n\t\t\tstore.clear(\"header\");\n\t\t};\n\t}, [store]);\n\tuseEffect(() => {\n\t\tif (!store) return;\n\t\tstore.set(\"header\", { node: content, sticky });\n\t}, [store, content, sticky]);\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\") as ReactNode;\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\") as ReactNode;\n\tconst headerSlot = useSlotValue(\"header\") as HeaderSlotValue | null;\n\n\tconst headerNode: ReactNode = headerSlot?.node ?? null;\n\tconst headerSticky = headerSlot?.sticky ?? true;\n\n\tconst renderedRail = railNode ?? rail;\n\tconst showRailColumn =\n\t\trenderedRail !== undefined &&\n\t\trenderedRail !== null &&\n\t\trenderedRail !== false;\n\tconst showHeaderRow = headerNode !== null && headerNode !== undefined;\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\tdata-header={showHeaderRow ? \"true\" : \"false\"}\n\t\t\ttemplateColumns={showRailColumn ? \"auto 1fr auto\" : \"auto 1fr\"}\n\t\t\ttemplateRows=\"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\tgridRow=\"1 / 3\"\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>\n\t\t\t\t{sidebar}\n\t\t\t</Box>\n\t\t\t{showHeaderRow ? (\n\t\t\t\t<Box\n\t\t\t\t\tdata-testid=\"app-shell-header\"\n\t\t\t\t\tdata-sticky-header={headerSticky ? \"true\" : \"false\"}\n\t\t\t\t\tgridColumn={showRailColumn ? \"2 / 4\" : \"2 / 3\"}\n\t\t\t\t\tgridRow=\"1\"\n\t\t\t\t\tminW=\"0\"\n\t\t\t\t\tposition={headerSticky ? \"sticky\" : undefined}\n\t\t\t\t\ttop={headerSticky ? \"0\" : undefined}\n\t\t\t\t\tzIndex={headerSticky ? \"docked\" : undefined}\n\t\t\t\t>\n\t\t\t\t\t{headerNode}\n\t\t\t\t</Box>\n\t\t\t) : null}\n\t\t\t<Flex\n\t\t\t\tdata-testid=\"app-shell-main\"\n\t\t\t\tgridColumn=\"2\"\n\t\t\t\tgridRow=\"2\"\n\t\t\t\tdirection=\"column\"\n\t\t\t\tminW=\"0\"\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\tgridRow=\"2\"\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\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// │ avatar · badges · meta (detail row) │\n// │ tabs (optional third row) │\n// └─────────────────────────────────────────┘\n// ┌─────────────────────────────────────────┐\n// │ children (body — flush, no padding) │\n// └─────────────────────────────────────────┘\n//\n// The tab list renders inside the header band via the slot store.\n// The active panel is provided as `children`. Use nav-link tabs:\n// build a `<Tabs.Root value={current}>` with only `<Tabs.List>` inside,\n// pass to `tabs`, and let the router render the active panel as children.\n\nimport type { ReactNode } from \"react\";\nimport { PageHeader, type PageHeaderProps } from \"../components/page-header\";\nimport { Box, Flex } from \"../primitives/layout\";\nimport { usePageHeader, useRegisteredPageActions } from \"./app-shell\";\n\nexport interface DetailPageTemplateProps\n\textends Pick<\n\t\tPageHeaderProps,\n\t\t\"breadcrumbs\" | \"title\" | \"subtitle\" | \"eyebrow\"\n\t> {\n\t/**\n\t * Optional explicit page-action content. Falls back to the actions\n\t * registered via `usePageActions` if not provided.\n\t */\n\tactions?: ReactNode;\n\t/** Avatar slot for the page header's detail row. */\n\tavatar?: ReactNode;\n\t/** Badges shown inline next to the title. */\n\tbadges?: ReactNode;\n\t/** Secondary meta line below the title (email, dept, ID, etc.). */\n\tmeta?: ReactNode;\n\t/** Optional tab strip rendered as the third row of the page header band. */\n\ttabs?: ReactNode;\n\tchildren?: ReactNode;\n\t/**\n\t * Pin the page-header band to the top of the viewport while the body\n\t * scrolls. @default true\n\t */\n\tstickyHeader?: boolean;\n}\n\nexport function DetailPageTemplate({\n\tbreadcrumbs,\n\ttitle,\n\tsubtitle,\n\teyebrow,\n\tactions,\n\tavatar,\n\tbadges,\n\tmeta,\n\ttabs,\n\tchildren,\n\tstickyHeader = true,\n}: DetailPageTemplateProps) {\n\tconst registered = useRegisteredPageActions();\n\tconst resolvedActions = actions ?? registered;\n\tusePageHeader(\n\t\t<PageHeader\n\t\t\tbreadcrumbs={breadcrumbs}\n\t\t\ttitle={title}\n\t\t\tsubtitle={subtitle}\n\t\t\teyebrow={eyebrow}\n\t\t\tactions={resolvedActions}\n\t\t\tavatar={avatar}\n\t\t\tbadges={badges}\n\t\t\tmeta={meta}\n\t\t\ttabs={tabs}\n\t\t/>,\n\t\t{ sticky: stickyHeader },\n\t);\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<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// │ (tabs — third row) │\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 { usePageHeader, 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 inside the PageHeader band as the third row.\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\t/**\n\t * Pin the page-header band to the top of the viewport while the body\n\t * scrolls. @default true\n\t */\n\tstickyHeader?: boolean;\n}\n\n/**\n * Canonical list-page layout. Renders PageHeader (with optional tabs inside) →\n * optional 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\tstickyHeader = true,\n}: IndexPageTemplateProps) {\n\tconst registered = useRegisteredPageActions();\n\tconst resolvedActions = actions ?? registered;\n\tusePageHeader(\n\t\t<PageHeader\n\t\t\tbreadcrumbs={breadcrumbs}\n\t\t\ttitle={title}\n\t\t\tsubtitle={subtitle}\n\t\t\teyebrow={eyebrow}\n\t\t\tactions={resolvedActions}\n\t\t\ttabs={tabs}\n\t\t/>,\n\t\t{ sticky: stickyHeader },\n\t);\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{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.\n//\n// ┌─────────────────────────────────────────┐\n// │ PageHeader (breadcrumbs · title · …) │\n// │ avatar · badges · meta (detail row) │\n// │ tabs (optional third row) │\n// └─────────────────────────────────────────┘\n// ┌─────────────────────────────────────────┐\n// │ children (body — constrained width) │\n// └─────────────────────────────────────────┘\n//\n// Pass a `<Tabs.Root value={current}>` with only `<Tabs.List>` inside to\n// `tabs`; let the router (or parent) render the active panel as `children`.\n\nimport type { ReactNode } from \"react\";\nimport { PageHeader, type PageHeaderProps } from \"../components/page-header\";\nimport { Box, Flex } from \"../primitives/layout\";\nimport { usePageHeader, useRegisteredPageActions } from \"./app-shell\";\n\nexport interface SettingsPageTemplateProps\n\textends Pick<\n\t\tPageHeaderProps,\n\t\t\"breadcrumbs\" | \"title\" | \"subtitle\" | \"eyebrow\"\n\t> {\n\t/**\n\t * Optional explicit page-action content. Falls back to the actions\n\t * registered via `usePageActions` if not provided.\n\t */\n\tactions?: ReactNode;\n\t/** Avatar slot for the page header's detail row. */\n\tavatar?: ReactNode;\n\t/** Badges shown inline next to the title. */\n\tbadges?: ReactNode;\n\t/** Secondary meta line below the title (email, dept, ID, etc.). */\n\tmeta?: ReactNode;\n\t/** Tab strip rendered as the third row of the page header band. */\n\ttabs?: ReactNode;\n\t/** Page body content. */\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\t/**\n\t * Pin the page-header band to the top of the viewport while the body\n\t * scrolls. @default true\n\t */\n\tstickyHeader?: boolean;\n}\n\nexport function SettingsPageTemplate({\n\tbreadcrumbs,\n\ttitle,\n\tsubtitle,\n\teyebrow,\n\tactions,\n\tavatar,\n\tbadges,\n\tmeta,\n\ttabs,\n\tchildren,\n\tmaxBodyWidth = \"3xl\",\n\tbodyPadding = \"default\",\n\tstickyHeader = true,\n}: SettingsPageTemplateProps) {\n\tconst registered = useRegisteredPageActions();\n\tconst resolvedActions = actions ?? registered;\n\tusePageHeader(\n\t\t<PageHeader\n\t\t\tbreadcrumbs={breadcrumbs}\n\t\t\ttitle={title}\n\t\t\tsubtitle={subtitle}\n\t\t\teyebrow={eyebrow}\n\t\t\tactions={resolvedActions}\n\t\t\tavatar={avatar}\n\t\t\tbadges={badges}\n\t\t\tmeta={meta}\n\t\t\ttabs={tabs}\n\t\t/>,\n\t\t{ sticky: stickyHeader },\n\t);\n\n\tconst bodyPx = bodyPadding === \"none\" ? \"0\" : \"8\";\n\tconst bodyPt = bodyPadding === \"none\" ? \"0\" : \"6\";\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<Box flex=\"1\" minH=\"0\" px={bodyPx} pt={bodyPt}>\n\t\t\t\t<Box\n\t\t\t\t\tmaxW={maxBodyWidth}\n\t\t\t\t\tmarginInline={maxBodyWidth === \"full\" ? \"0\" : \"auto\"}\n\t\t\t\t>\n\t\t\t\t\t{children}\n\t\t\t\t</Box>\n\t\t\t</Box>\n\t\t</Flex>\n\t);\n}\nSettingsPageTemplate.displayName = \"SettingsPageTemplate\";\n","// src/templates/subnav-layout.tsx\nimport { PanelLeftClose, PanelLeftOpen } from \"lucide-react\";\nimport type { ReactNode } from \"react\";\nimport { useCallback, useEffect, useMemo, useState } from \"react\";\nimport { IconButton } from \"../atoms/button\";\nimport { NavListModeProvider } from \"../components/nav-list/nav-list-context\";\nimport { Box, Grid } from \"../primitives/layout\";\n\nconst EXPANDED_NAV = \"220px\";\nconst COLLAPSED_NAV = \"56px\";\n\nfunction getInitialCollapsed(\n\tstorageKey: string | undefined,\n\tdefaultCollapsed: boolean | undefined,\n): boolean {\n\tif (typeof window === \"undefined\") return defaultCollapsed ?? false;\n\tif (storageKey) {\n\t\tconst stored = window.localStorage.getItem(storageKey);\n\t\tif (stored === \"true\") return true;\n\t\tif (stored === \"false\") return false;\n\t}\n\treturn defaultCollapsed ?? false;\n}\n\nexport interface SubNavLayoutProps {\n\tstorageKey?: string;\n\tdefaultCollapsed?: boolean;\n\t/** Overrides the toggle's aria-label. */\n\ttoggleAriaLabel?: string;\n\tchildren: ReactNode;\n}\n\nconst SubNavLayoutRoot = ({\n\tstorageKey,\n\tdefaultCollapsed,\n\ttoggleAriaLabel,\n\tchildren,\n}: SubNavLayoutProps) => {\n\tconst [collapsed, setCollapsed] = useState(() =>\n\t\tgetInitialCollapsed(storageKey, defaultCollapsed),\n\t);\n\n\tuseEffect(() => {\n\t\tif (storageKey) {\n\t\t\twindow.localStorage.setItem(storageKey, String(collapsed));\n\t\t}\n\t}, [collapsed, storageKey]);\n\n\tconst toggle = useCallback(() => setCollapsed((c) => !c), []);\n\tconst navMode = useMemo(() => ({ collapsed }), [collapsed]);\n\tconst label =\n\t\ttoggleAriaLabel ?? (collapsed ? \"Expand sub-nav\" : \"Collapse sub-nav\");\n\n\treturn (\n\t\t<NavListModeProvider value={navMode}>\n\t\t\t<Grid\n\t\t\t\tdata-testid=\"subnav-layout\"\n\t\t\t\tdata-collapsed={collapsed ? \"true\" : \"false\"}\n\t\t\t\tgridTemplateColumns={`${collapsed ? COLLAPSED_NAV : EXPANDED_NAV} 1fr`}\n\t\t\t\talignItems=\"stretch\"\n\t\t\t\tminH=\"0\"\n\t\t\t\tflex=\"1\"\n\t\t\t\tposition=\"relative\"\n\t\t\t\ttransition=\"grid-template-columns 250ms ease-out\"\n\t\t\t>\n\t\t\t\t{children}\n\t\t\t\t<IconButton\n\t\t\t\t\tdata-testid=\"subnav-toggle\"\n\t\t\t\t\taria-label={label}\n\t\t\t\t\tonClick={toggle}\n\t\t\t\t\tvariant=\"outline\"\n\t\t\t\t\tsize=\"xs\"\n\t\t\t\t\tposition=\"absolute\"\n\t\t\t\t\ttop=\"3\"\n\t\t\t\t\tleft={collapsed ? \"44px\" : \"208px\"}\n\t\t\t\t\twidth=\"7\"\n\t\t\t\t\theight=\"7\"\n\t\t\t\t\tminW=\"7\"\n\t\t\t\t\tborderRadius=\"full\"\n\t\t\t\t\tbg=\"bg-surface\"\n\t\t\t\t\tborderColor=\"border\"\n\t\t\t\t\tboxShadow=\"sm\"\n\t\t\t\t\tzIndex={4}\n\t\t\t\t\t_hover={{ bg: \"bg-muted\" }}\n\t\t\t\t\ttransition=\"left 250ms ease-out\"\n\t\t\t\t>\n\t\t\t\t\t{collapsed ? (\n\t\t\t\t\t\t<PanelLeftOpen size={14} />\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<PanelLeftClose size={14} />\n\t\t\t\t\t)}\n\t\t\t\t</IconButton>\n\t\t\t</Grid>\n\t\t</NavListModeProvider>\n\t);\n};\nSubNavLayoutRoot.displayName = \"SubNavLayout\";\n\nexport interface SubNavLayoutNavProps {\n\t\"aria-label\"?: string;\n\tchildren: ReactNode;\n}\n\nconst SubNavLayoutNav = ({ children, ...rest }: SubNavLayoutNavProps) => (\n\t<Box\n\t\tas=\"nav\"\n\t\taria-label={rest[\"aria-label\"]}\n\t\tdata-testid=\"subnav-layout-nav\"\n\t\tpy=\"3\"\n\t\tpx=\"1\"\n\t\tminW=\"0\"\n\t>\n\t\t{children}\n\t</Box>\n);\nSubNavLayoutNav.displayName = \"SubNavLayout.Nav\";\n\nexport interface SubNavLayoutDetailProps {\n\tchildren: ReactNode;\n}\n\nconst SubNavLayoutDetail = ({ children }: SubNavLayoutDetailProps) => (\n\t<Box\n\t\tdata-testid=\"subnav-layout-detail\"\n\t\tborderLeftWidth=\"1px\"\n\t\tborderColor=\"border\"\n\t\tminW=\"0\"\n\t\tdisplay=\"flex\"\n\t\tflexDirection=\"column\"\n\t>\n\t\t{children}\n\t</Box>\n);\nSubNavLayoutDetail.displayName = \"SubNavLayout.Detail\";\n\nexport interface SubNavLayoutToolbarProps {\n\tchildren: ReactNode;\n}\n\nconst SubNavLayoutToolbar = ({ children }: SubNavLayoutToolbarProps) => (\n\t<Box\n\t\tdata-testid=\"subnav-layout-toolbar\"\n\t\tdisplay=\"flex\"\n\t\talignItems=\"center\"\n\t\tgap=\"3\"\n\t\tpx=\"5\"\n\t\tpy=\"3\"\n\t\tborderBottomWidth=\"1px\"\n\t\tborderColor=\"border-muted\"\n\t\tbg=\"bg-canvas\"\n\t>\n\t\t{children}\n\t</Box>\n);\nSubNavLayoutToolbar.displayName = \"SubNavLayout.Toolbar\";\n\nexport const SubNavLayout = Object.assign(SubNavLayoutRoot, {\n\tNav: SubNavLayoutNav,\n\tDetail: SubNavLayoutDetail,\n\tToolbar: SubNavLayoutToolbar,\n});\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@knkcs/anker",
3
- "version": "2.5.1",
3
+ "version": "2.6.0",
4
4
  "description": "UI component library for the knk software group",
5
5
  "repository": {
6
6
  "type": "git",