@riverbankcms/sdk 0.6.0 → 0.7.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.
Files changed (84) hide show
  1. package/README.md +239 -0
  2. package/dist/cli/index.js +22 -5
  3. package/dist/cli/index.js.map +1 -1
  4. package/dist/client/client.js +1 -1
  5. package/dist/client/client.js.map +1 -1
  6. package/dist/client/client.mjs +1 -1
  7. package/dist/client/client.mjs.map +1 -1
  8. package/dist/server/{Layout-BClXUTsd.d.mts → Layout-B7cvis7r.d.mts} +3 -3
  9. package/dist/server/{Layout-UXGjXv8M.d.ts → Layout-wBtJLTVX.d.ts} +3 -3
  10. package/dist/server/{chunk-Z5ZA6Q4D.mjs → chunk-74XUVNOO.mjs} +5 -3
  11. package/dist/server/chunk-74XUVNOO.mjs.map +1 -0
  12. package/dist/server/{chunk-PHS2KWJX.js → chunk-7BVRA5MY.js} +7 -52
  13. package/dist/server/chunk-7BVRA5MY.js.map +1 -0
  14. package/dist/server/{chunk-SQMGHEJM.mjs → chunk-7FIJSGHU.mjs} +2 -2
  15. package/dist/server/{chunk-SQMGHEJM.mjs.map → chunk-7FIJSGHU.mjs.map} +1 -1
  16. package/dist/server/chunk-ARNCLSQT.mjs +52 -0
  17. package/dist/server/chunk-ARNCLSQT.mjs.map +1 -0
  18. package/dist/server/chunk-BNQV3PXP.js +69 -0
  19. package/dist/server/chunk-BNQV3PXP.js.map +1 -0
  20. package/dist/server/{chunk-SSS7CCRR.js → chunk-EIVISR62.js} +15 -57
  21. package/dist/server/chunk-EIVISR62.js.map +1 -0
  22. package/dist/server/{chunk-I2D7KOEA.js → chunk-JWRNMNWI.js} +5 -3
  23. package/dist/server/chunk-JWRNMNWI.js.map +1 -0
  24. package/dist/server/{chunk-EOWGKCUZ.js → chunk-P7UVAMK6.js} +2 -2
  25. package/dist/server/{chunk-EOWGKCUZ.js.map → chunk-P7UVAMK6.js.map} +1 -1
  26. package/dist/server/{chunk-2HXHFSMI.mjs → chunk-RBJFXNDM.mjs} +6 -51
  27. package/dist/server/chunk-RBJFXNDM.mjs.map +1 -0
  28. package/dist/server/chunk-SWYWZT3L.mjs +69 -0
  29. package/dist/server/chunk-SWYWZT3L.mjs.map +1 -0
  30. package/dist/server/chunk-T26N3P26.js +52 -0
  31. package/dist/server/chunk-T26N3P26.js.map +1 -0
  32. package/dist/server/{chunk-PMHLZ3FW.mjs → chunk-YXA4GAAQ.mjs} +15 -57
  33. package/dist/server/chunk-YXA4GAAQ.mjs.map +1 -0
  34. package/dist/server/{components-DppHY5oD.d.ts → components-CICSJyp_.d.ts} +1 -1
  35. package/dist/server/{components-BmaJxgCV.d.mts → components-CMMwDXTW.d.mts} +1 -1
  36. package/dist/server/components.d.mts +2 -2
  37. package/dist/server/components.d.ts +2 -2
  38. package/dist/server/components.js +5 -3
  39. package/dist/server/components.js.map +1 -1
  40. package/dist/server/components.mjs +5 -3
  41. package/dist/server/index-BTwWvSBu.d.ts +130 -0
  42. package/dist/server/index-DI_qlYx3.d.mts +130 -0
  43. package/dist/server/index.js +2 -2
  44. package/dist/server/index.mjs +1 -1
  45. package/dist/server/{loadContent-BS-3wesN.d.mts → loadContent-C-YYUKQa.d.mts} +10 -2
  46. package/dist/server/{loadContent-Buvmudee.d.ts → loadContent-DmgpFcFC.d.ts} +10 -2
  47. package/dist/server/metadata.d.mts +8 -135
  48. package/dist/server/metadata.d.ts +8 -135
  49. package/dist/server/metadata.js +5 -65
  50. package/dist/server/metadata.js.map +1 -1
  51. package/dist/server/metadata.mjs +4 -64
  52. package/dist/server/metadata.mjs.map +1 -1
  53. package/dist/server/navigation.d.mts +80 -145
  54. package/dist/server/navigation.d.ts +80 -145
  55. package/dist/server/navigation.js +2 -10
  56. package/dist/server/navigation.js.map +1 -1
  57. package/dist/server/navigation.mjs +7 -15
  58. package/dist/server/next.d.mts +274 -0
  59. package/dist/server/next.d.ts +274 -0
  60. package/dist/server/next.js +150 -0
  61. package/dist/server/next.js.map +1 -0
  62. package/dist/server/next.mjs +150 -0
  63. package/dist/server/next.mjs.map +1 -0
  64. package/dist/server/rendering/server.d.mts +1 -1
  65. package/dist/server/rendering/server.d.ts +1 -1
  66. package/dist/server/rendering/server.js +5 -3
  67. package/dist/server/rendering/server.js.map +1 -1
  68. package/dist/server/rendering/server.mjs +5 -3
  69. package/dist/server/rendering.d.mts +4 -4
  70. package/dist/server/rendering.d.ts +4 -4
  71. package/dist/server/rendering.js +6 -4
  72. package/dist/server/rendering.js.map +1 -1
  73. package/dist/server/rendering.mjs +6 -4
  74. package/dist/server/server.d.mts +1 -1
  75. package/dist/server/server.d.ts +1 -1
  76. package/dist/server/server.js +3 -3
  77. package/dist/server/server.mjs +2 -2
  78. package/package.json +13 -1
  79. package/dist/server/chunk-2HXHFSMI.mjs.map +0 -1
  80. package/dist/server/chunk-I2D7KOEA.js.map +0 -1
  81. package/dist/server/chunk-PHS2KWJX.js.map +0 -1
  82. package/dist/server/chunk-PMHLZ3FW.mjs.map +0 -1
  83. package/dist/server/chunk-SSS7CCRR.js.map +0 -1
  84. package/dist/server/chunk-Z5ZA6Q4D.mjs.map +0 -1
@@ -1,10 +1,10 @@
1
1
  import * as react_jsx_runtime from 'react/jsx-runtime';
2
- import { buildSimpleMenu, buildSimpleLogo } from './navigation.mjs';
2
+ import { buildMenu, buildLogo } from './navigation.mjs';
3
3
  import { S as SiteResponse, R as RiverbankClient } from './types-1cLz0vnq.mjs';
4
4
 
5
5
  type HeaderData = {
6
- menu: ReturnType<typeof buildSimpleMenu>;
7
- logo: ReturnType<typeof buildSimpleLogo>;
6
+ menu: ReturnType<typeof buildMenu>;
7
+ logo: ReturnType<typeof buildLogo>;
8
8
  site: SiteResponse['site'];
9
9
  theme: SiteResponse['theme'];
10
10
  routes: SiteResponse['routes'];
@@ -1,10 +1,10 @@
1
1
  import * as react_jsx_runtime from 'react/jsx-runtime';
2
- import { buildSimpleMenu, buildSimpleLogo } from './navigation.js';
2
+ import { buildMenu, buildLogo } from './navigation.js';
3
3
  import { S as SiteResponse, R as RiverbankClient } from './types-BvcJU7zk.js';
4
4
 
5
5
  type HeaderData = {
6
- menu: ReturnType<typeof buildSimpleMenu>;
7
- logo: ReturnType<typeof buildSimpleLogo>;
6
+ menu: ReturnType<typeof buildMenu>;
7
+ logo: ReturnType<typeof buildLogo>;
8
8
  site: SiteResponse['site'];
9
9
  theme: SiteResponse['theme'];
10
10
  routes: SiteResponse['routes'];
@@ -45,7 +45,8 @@ async function loadContent(params) {
45
45
  resolvedData: resolvedData2,
46
46
  dataContext: { contentEntry: entry.content },
47
47
  theme: site.theme,
48
- siteId
48
+ siteId,
49
+ site: site.site
49
50
  };
50
51
  }
51
52
  const { page: pageData } = contentResponse;
@@ -70,7 +71,8 @@ async function loadContent(params) {
70
71
  page: pageOutline,
71
72
  theme: site.theme,
72
73
  siteId,
73
- resolvedData
74
+ resolvedData,
75
+ site: site.site
74
76
  };
75
77
  }
76
78
  function isEntryResponse(response) {
@@ -137,4 +139,4 @@ export {
137
139
  isEntryContent,
138
140
  loadContent
139
141
  };
140
- //# sourceMappingURL=chunk-Z5ZA6Q4D.mjs.map
142
+ //# sourceMappingURL=chunk-74XUVNOO.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/rendering/helpers/loadContent.ts"],"sourcesContent":["/**\n * Server-side helper to fetch content (page or entry) by path.\n *\n * Use this for dynamic routing where a path could resolve to either\n * a page or a content entry.\n */\n\nimport type { Theme } from '@riverbankcms/blocks';\nimport type { RiverbankClient, PageResponse, SiteResponse } from '../../client/types';\nimport type { PageProps } from '../components/Page';\nimport { prefetchBlockData } from '../../data/prefetchBlockData';\nimport type { ResolvedBlockData } from '../../data/prefetchBlockData';\n\n/**\n * Site data included in content results for metadata generation.\n */\nexport type SiteData = SiteResponse['site'];\n\nexport type LoadContentParams = {\n client: RiverbankClient;\n siteId: string;\n path: string;\n /**\n * If true, fetches draft/unpublished content instead of published content.\n * This affects both pages and entries.\n * Requires API key with site access.\n *\n * @default false\n */\n preview?: boolean;\n};\n\n/**\n * Content entry data returned when a path resolves to an entry\n */\nexport type ContentEntryData = {\n id: string;\n /** Content type key (e.g., 'blog-post', 'product') */\n type: string | null;\n title: string;\n slug: string | null;\n path: string | null;\n status: string;\n publishAt: string | null;\n /** The raw content fields - use these to render your own UI */\n content: Record<string, unknown>;\n metaTitle: string | null;\n metaDescription: string | null;\n createdAt: string;\n updatedAt: string;\n};\n\n/**\n * Result when path resolves to a page\n */\nexport type PageContentResult = {\n type: 'page';\n /** Page outline ready for rendering with <Page> component */\n page: PageProps['page'];\n /** Site theme for styling */\n theme: Theme;\n /** Site ID */\n siteId: string;\n /** Pre-fetched block data for data loaders */\n resolvedData: ResolvedBlockData;\n /** Site data for metadata generation */\n site: SiteData;\n};\n\n/**\n * Result when path resolves to a content entry\n */\nexport type EntryContentResult = {\n type: 'entry';\n /** Raw entry data - render this however you want */\n entry: ContentEntryData;\n /** Template page for rendering the entry (if available) */\n templatePage: PageProps['page'] | null;\n /** Pre-fetched block data for template page data loaders */\n resolvedData: ResolvedBlockData;\n /** Data context for template blocks (includes entry content for bindings) */\n dataContext: { contentEntry: Record<string, unknown> };\n /** Site theme for styling (useful if rendering with SDK components) */\n theme: Theme;\n /** Site ID */\n siteId: string;\n /** Site data for metadata generation */\n site: SiteData;\n};\n\n/**\n * Discriminated union result from loadContent\n */\nexport type LoadContentResult = PageContentResult | EntryContentResult;\n\n/**\n * Type guard to check if result is a page\n */\nexport function isPageContent(result: LoadContentResult): result is PageContentResult {\n return result.type === 'page';\n}\n\n/**\n * Type guard to check if result is an entry\n */\nexport function isEntryContent(result: LoadContentResult): result is EntryContentResult {\n return result.type === 'entry';\n}\n\n/**\n * Server-side helper to fetch content by path.\n *\n * Returns a discriminated union - either page data (ready for `<Page>` component)\n * or raw entry data (for custom rendering).\n *\n * @example Dynamic routing with both pages and entries\n * ```tsx\n * import { loadContent, Page, isPageContent } from '@riverbankcms/sdk';\n *\n * export default async function DynamicRoute({ params }) {\n * const content = await loadContent({\n * client,\n * siteId: 'site-123',\n * path: `/${params.slug?.join('/') || ''}`,\n * });\n *\n * if (isPageContent(content)) {\n * return <Page {...content} />;\n * }\n *\n * // Render entry with custom UI\n * return (\n * <article>\n * <h1>{content.entry.title}</h1>\n * <div>{content.entry.content.body}</div>\n * </article>\n * );\n * }\n * ```\n *\n * @example Entry-specific rendering based on content type\n * ```tsx\n * const content = await loadContent({ client, siteId, path });\n *\n * if (content.type === 'entry') {\n * switch (content.entry.type) {\n * case 'blog-post':\n * return <BlogPost entry={content.entry} theme={content.theme} />;\n * case 'product':\n * return <ProductPage entry={content.entry} theme={content.theme} />;\n * default:\n * return <GenericEntry entry={content.entry} />;\n * }\n * }\n *\n * return <Page {...content} />;\n * ```\n *\n * @example Preview mode for draft content\n * ```tsx\n * const content = await loadContent({\n * client,\n * siteId,\n * path,\n * preview: true, // Fetches draft content for both pages and entries\n * });\n * ```\n */\nexport async function loadContent(params: LoadContentParams): Promise<LoadContentResult> {\n const { client, siteId, path, preview = false } = params;\n\n // Fetch site and content in parallel\n const [site, contentResponse] = await Promise.all([\n client.getSite({ id: siteId }),\n client.getPage({ siteId, path, preview }),\n ]);\n\n // Check if response is an entry\n if (isEntryResponse(contentResponse)) {\n const entryData = contentResponse.entry;\n\n const entry: ContentEntryData = {\n id: entryData.id,\n type: entryData.type,\n title: entryData.title,\n slug: entryData.slug,\n path: entryData.path,\n status: entryData.status,\n publishAt: entryData.publishAt,\n // Use draft content in preview mode, otherwise use published content\n content: preview\n ? (entryData.draftContent ?? entryData.content)\n : entryData.content,\n metaTitle: preview\n ? (entryData.draftMetaTitle ?? entryData.metaTitle)\n : entryData.metaTitle,\n metaDescription: preview\n ? (entryData.draftMetaDescription ?? entryData.metaDescription)\n : entryData.metaDescription,\n createdAt: entryData.createdAt,\n updatedAt: entryData.updatedAt,\n };\n\n // Process template if available (uses first template from content type)\n const { templatePage, resolvedData } = await processEntryTemplate(\n contentResponse.templates as Template[] | undefined,\n entry,\n { siteId, preview },\n client\n );\n\n return {\n type: 'entry',\n entry,\n templatePage,\n resolvedData,\n dataContext: { contentEntry: entry.content },\n theme: site.theme,\n siteId,\n site: site.site,\n };\n }\n\n // Handle page response\n const { page: pageData } = contentResponse;\n\n // Convert API response blocks to PageOutline format with validation\n const blocks = pageData.blocks.map((block) => validateAndConvertBlock(block, 'page'));\n\n const pageOutline = {\n name: pageData.name,\n path: pageData.path,\n purpose: pageData.purpose,\n blocks,\n };\n\n // Prefetch block data loaders for pages\n const resolvedData = await prefetchBlockData(\n pageOutline,\n {\n siteId,\n pageId: pageData.id,\n previewStage: preview ? 'preview' : 'published',\n },\n client\n );\n\n return {\n type: 'page',\n page: pageOutline,\n theme: site.theme,\n siteId,\n resolvedData,\n site: site.site,\n };\n}\n\n/**\n * Type guard to check if API response is an entry\n */\nfunction isEntryResponse(response: PageResponse): response is Extract<PageResponse, { type: 'entry' }> {\n return 'type' in response && response.type === 'entry';\n}\n\n/**\n * Validates and converts a raw block from API response to PageOutline block format.\n * Used for both page blocks and template blocks to ensure consistent validation.\n */\nfunction validateAndConvertBlock(\n block: unknown,\n source: 'page' | 'template'\n): { id: string | null; kind: string; purpose: string; content?: Record<string, unknown> } {\n if (!block || typeof block !== 'object') {\n throw new Error(`Invalid block format in ${source} API response`);\n }\n\n const blockRecord = block as Record<string, unknown>;\n\n // Template blocks use 'blockKind', page blocks use 'kind'\n const kindField = source === 'template' ? 'blockKind' : 'kind';\n const kindValue = blockRecord[kindField];\n\n if (typeof blockRecord.id !== 'string' && blockRecord.id !== null) {\n throw new Error(`Invalid block id in ${source}: expected string or null, got ${typeof blockRecord.id}`);\n }\n if (typeof kindValue !== 'string') {\n throw new Error(`Invalid block ${kindField} in ${source}: expected string, got ${typeof kindValue}`);\n }\n\n // Template blocks derive purpose from scope, page blocks have explicit purpose\n if (source === 'page') {\n if (typeof blockRecord.purpose !== 'string') {\n throw new Error(`Invalid block purpose in ${source}: expected string, got ${typeof blockRecord.purpose}`);\n }\n return {\n id: blockRecord.id as string | null,\n kind: kindValue,\n purpose: blockRecord.purpose,\n };\n }\n\n // Template block: derive purpose from scope, include content\n const scope = blockRecord.scope as 'entry' | 'template' | undefined;\n const content = (blockRecord.content as Record<string, unknown> | null) ?? {};\n\n return {\n id: blockRecord.id as string | null,\n kind: kindValue,\n purpose: scope === 'entry' ? 'entry-content' : 'template-layout',\n content,\n };\n}\n\n/** Template block structure from API response */\ntype TemplateBlock = {\n id: string;\n blockKind: string;\n scope: 'entry' | 'template';\n content: Record<string, unknown> | null;\n};\n\n/** Template structure from API response */\ntype Template = {\n id: string;\n name: string;\n templateKey: string;\n blocks: TemplateBlock[];\n};\n\n/**\n * Processes an entry's template into a PageOutline format and prefetches block data.\n * Returns null templatePage if no valid template with blocks is available.\n */\nasync function processEntryTemplate(\n templates: Template[] | undefined,\n entry: ContentEntryData,\n context: { siteId: string; preview: boolean },\n client: RiverbankClient\n): Promise<{ templatePage: PageProps['page'] | null; resolvedData: ResolvedBlockData }> {\n const template = templates?.[0];\n\n // Templates without blocks are treated as \"no template\" - the entry should be\n // rendered with custom UI rather than an empty template page\n if (!template || !template.blocks?.length) {\n return { templatePage: null, resolvedData: {} };\n }\n\n // Convert template blocks to PageOutline format with validation\n const blocks = template.blocks.map((block) => validateAndConvertBlock(block, 'template'));\n\n const templatePage: PageProps['page'] = {\n name: template.name || 'Entry Template',\n path: entry.path || '/',\n purpose: 'entry-template',\n blocks,\n };\n\n // Prefetch block data for template\n const resolvedData = await prefetchBlockData(\n templatePage,\n {\n siteId: context.siteId,\n pageId: template.id,\n previewStage: context.preview ? 'preview' : 'published',\n },\n client\n );\n\n return { templatePage, resolvedData };\n}\n"],"mappings":"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","names":["resolvedData"]}
@@ -1,8 +1,7 @@
1
- "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } }
2
2
 
3
3
 
4
- var _chunkSSS7CCRRjs = require('./chunk-SSS7CCRR.js');
5
-
4
+ var _chunkEIVISR62js = require('./chunk-EIVISR62.js');
6
5
 
7
6
 
8
7
 
@@ -12,51 +11,8 @@ var _chunk7UPVCT3Kjs = require('./chunk-7UPVCT3K.js');
12
11
 
13
12
  var _chunkYYO3RIFOjs = require('./chunk-YYO3RIFO.js');
14
13
 
15
- // src/rendering/components/Page.tsx
16
- var _jsxruntime = require('react/jsx-runtime');
17
- function Page({
18
- page,
19
- theme,
20
- themeTokens: providedTokens,
21
- siteId,
22
- resolvedData,
23
- routeMap,
24
- wrapBlock,
25
- registry,
26
- usePlaceholders = false,
27
- blockOverrides,
28
- sdkConfig,
29
- supabaseUrl,
30
- dataContext
31
- }) {
32
- const baseTokens = _nullishCoalesce(providedTokens, () => ( _chunk7UPVCT3Kjs.buildThemeRuntime.call(void 0, theme).tokens));
33
- const themeTokens = _optionalChain([sdkConfig, 'optionalAccess', _ => _.theme, 'optionalAccess', _2 => _2.palette]) ? { ...baseTokens, palette: { ...baseTokens.palette, ...sdkConfig.theme.palette } } : baseTokens;
34
- return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
35
- _chunk7UPVCT3Kjs.PageRenderer,
36
- {
37
- theme,
38
- page,
39
- themeTokens,
40
- usePlaceholders,
41
- dataContext: {
42
- siteId,
43
- resolvedData,
44
- routes: routeMap,
45
- occurrenceContext: _nullishCoalesce(_optionalChain([dataContext, 'optionalAccess', _3 => _3.occurrenceContext]), () => ( null)),
46
- contentEntry: _nullishCoalesce(_optionalChain([dataContext, 'optionalAccess', _4 => _4.contentEntry]), () => ( null)),
47
- supabaseUrl
48
- },
49
- routeMap,
50
- wrapBlock,
51
- registry,
52
- blockOverrides,
53
- sdkConfig
54
- }
55
- );
56
- }
57
-
58
14
  // src/rendering/components/Layout.tsx
59
-
15
+ var _jsxruntime = require('react/jsx-runtime');
60
16
  async function Layout({
61
17
  siteData: providedSiteData,
62
18
  client,
@@ -80,8 +36,8 @@ async function Layout({
80
36
  }
81
37
  const { site, theme, navigation, layout, routes } = siteData;
82
38
  const themeRuntime = _chunk7UPVCT3Kjs.buildThemeRuntime.call(void 0, theme);
83
- const menuViewModel = _chunkSSS7CCRRjs.buildSimpleMenu.call(void 0, navigation, routes);
84
- const logoViewModel = _chunkSSS7CCRRjs.buildSimpleLogo.call(void 0, _nullishCoalesce(layout.logo, () => ( null)), site.title);
39
+ const menuViewModel = _chunkEIVISR62js.buildMenu.call(void 0, navigation, routes);
40
+ const logoViewModel = _chunkEIVISR62js.buildLogo.call(void 0, _nullishCoalesce(layout.logo, () => ( null)), site.title);
85
41
  const headerData = {
86
42
  menu: menuViewModel,
87
43
  logo: logoViewModel,
@@ -129,6 +85,5 @@ async function Layout({
129
85
 
130
86
 
131
87
 
132
-
133
- exports.Page = Page; exports.Layout = Layout;
134
- //# sourceMappingURL=chunk-PHS2KWJX.js.map
88
+ exports.Layout = Layout;
89
+ //# sourceMappingURL=chunk-7BVRA5MY.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/Users/will/Projects/Business/cms/builder/packages/sdk/dist/server/chunk-7BVRA5MY.js","../../src/rendering/components/Layout.tsx"],"names":[],"mappings":"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","file":"/Users/will/Projects/Business/cms/builder/packages/sdk/dist/server/chunk-7BVRA5MY.js","sourcesContent":[null,"/**\n * Layout component with header and footer\n *\n * Renders site header and footer around content. Fetches site data if not provided.\n */\n\nimport { renderBlock, siteFooterManifest, siteHeaderManifest, buildThemeRuntime } from '@riverbankcms/blocks';\nimport { buildMenu, buildLogo } from '../../navigation';\nimport type { RiverbankClient, SiteResponse } from '../../client/types';\n\nexport type HeaderData = {\n menu: ReturnType<typeof buildMenu>;\n logo: ReturnType<typeof buildLogo>;\n site: SiteResponse['site'];\n theme: SiteResponse['theme'];\n routes: SiteResponse['routes'];\n};\n\nexport type LayoutProps = {\n // Option 1: Pass pre-fetched site data\n siteData?: SiteResponse;\n\n // Option 2: Fetch site data (provide client + identifier)\n client?: RiverbankClient;\n siteId?: string;\n slug?: string;\n domain?: string;\n\n // Content\n children: React.ReactNode;\n\n // Control rendering\n header?: boolean | ((data: HeaderData) => React.ReactNode);\n footer?: boolean;\n\n // Header variant override (if using default header)\n headerVariant?: 'classic' | 'centered' | 'transparent' | 'floating' | 'editorial';\n};\n\n/**\n * Layout component that wraps content with site header and footer.\n *\n * @example With pre-fetched site data (recommended)\n * ```tsx\n * const site = await client.getSite({ slug: 'my-site' });\n *\n * <Layout siteData={site}>\n * <Page {...pageData} />\n * </Layout>\n * ```\n *\n * @example With automatic fetching\n * ```tsx\n * <Layout client={client} slug=\"my-site\">\n * <Page {...pageData} />\n * </Layout>\n * ```\n */\nexport async function Layout({\n siteData: providedSiteData,\n client,\n siteId,\n slug,\n domain,\n children,\n header = true,\n footer = true,\n headerVariant,\n}: LayoutProps) {\n // Fetch site data if not provided\n let siteData = providedSiteData;\n if (!siteData) {\n if (!client) {\n throw new Error('Layout: must provide either siteData or client');\n }\n if (!siteId && !slug && !domain) {\n throw new Error('Layout: must provide siteId, slug, or domain when using client');\n }\n\n siteData = await client.getSite({ id: siteId, slug, domain });\n }\n\n const { site, theme, navigation, layout, routes } = siteData;\n const themeRuntime = buildThemeRuntime(theme);\n\n // Build view models for header/footer\n const menuViewModel = buildMenu(navigation, routes);\n const logoViewModel = buildLogo(layout.logo ?? null, site.title);\n\n // Prepare header data for custom headers\n const headerData: HeaderData = {\n menu: menuViewModel,\n logo: logoViewModel,\n site,\n theme,\n routes,\n };\n\n // Override header variant if specified\n const headerContent = headerVariant\n ? { ...layout.header, variant: headerVariant }\n : layout.header;\n\n // Override theme header variant if specified\n const themeWithVariant = headerVariant\n ? {\n ...theme,\n header: { ...theme.header, variant: headerVariant },\n }\n : theme;\n\n const viewModelOverrides = {\n $root: {\n siteId: site.id,\n routes,\n theme: themeWithVariant,\n },\n site,\n menu: menuViewModel,\n content: {\n logo: logoViewModel,\n },\n };\n\n // Render header based on type\n let headerElement: React.ReactNode = null;\n if (header === true) {\n // Default header rendering\n headerElement = renderBlock(siteHeaderManifest, headerContent, {\n theme: themeRuntime.tokens,\n themeConfig: themeWithVariant,\n viewModelOverrides,\n });\n } else if (typeof header === 'function') {\n // Custom header rendering\n headerElement = header(headerData);\n }\n\n return (\n <>\n {headerElement}\n\n {children}\n\n {footer && renderBlock(siteFooterManifest, layout.footer, {\n theme: themeRuntime.tokens,\n themeConfig: theme,\n viewModelOverrides,\n })}\n </>\n );\n}\n"]}
@@ -1996,7 +1996,7 @@ var SimpleCache = class {
1996
1996
  };
1997
1997
 
1998
1998
  // src/version.ts
1999
- var SDK_VERSION = "0.6.0";
1999
+ var SDK_VERSION = "0.7.0";
2000
2000
 
2001
2001
  // src/client/error.ts
2002
2002
  var RiverbankApiError = class _RiverbankApiError extends Error {
@@ -2267,4 +2267,4 @@ export {
2267
2267
  buildEndpointURL,
2268
2268
  createRiverbankClient
2269
2269
  };
2270
- //# sourceMappingURL=chunk-SQMGHEJM.mjs.map
2270
+ //# sourceMappingURL=chunk-7FIJSGHU.mjs.map