@riverbankcms/sdk 0.1.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.
- package/README.md +1892 -0
- package/dist/cli/index.js +327 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/client/analytics.d.mts +103 -0
- package/dist/client/analytics.d.ts +103 -0
- package/dist/client/analytics.js +197 -0
- package/dist/client/analytics.js.map +1 -0
- package/dist/client/analytics.mjs +169 -0
- package/dist/client/analytics.mjs.map +1 -0
- package/dist/client/bookings.d.mts +89 -0
- package/dist/client/bookings.d.ts +89 -0
- package/dist/client/bookings.js +34 -0
- package/dist/client/bookings.js.map +1 -0
- package/dist/client/bookings.mjs +11 -0
- package/dist/client/bookings.mjs.map +1 -0
- package/dist/client/client.d.mts +195 -0
- package/dist/client/client.d.ts +195 -0
- package/dist/client/client.js +606 -0
- package/dist/client/client.js.map +1 -0
- package/dist/client/client.mjs +572 -0
- package/dist/client/client.mjs.map +1 -0
- package/dist/client/hooks.d.mts +71 -0
- package/dist/client/hooks.d.ts +71 -0
- package/dist/client/hooks.js +264 -0
- package/dist/client/hooks.js.map +1 -0
- package/dist/client/hooks.mjs +235 -0
- package/dist/client/hooks.mjs.map +1 -0
- package/dist/client/rendering/client.d.mts +1 -0
- package/dist/client/rendering/client.d.ts +1 -0
- package/dist/client/rendering/client.js +33 -0
- package/dist/client/rendering/client.js.map +1 -0
- package/dist/client/rendering/client.mjs +8 -0
- package/dist/client/rendering/client.mjs.map +1 -0
- package/dist/client/usePage-BvKAa3Zw.d.mts +366 -0
- package/dist/client/usePage-BvKAa3Zw.d.ts +366 -0
- package/dist/server/chunk-2RW5HAQQ.mjs +86 -0
- package/dist/server/chunk-2RW5HAQQ.mjs.map +1 -0
- package/dist/server/chunk-3KKZVGH4.mjs +179 -0
- package/dist/server/chunk-3KKZVGH4.mjs.map +1 -0
- package/dist/server/chunk-4Z3GPTCS.js +179 -0
- package/dist/server/chunk-4Z3GPTCS.js.map +1 -0
- package/dist/server/chunk-4Z5FBFRL.mjs +211 -0
- package/dist/server/chunk-4Z5FBFRL.mjs.map +1 -0
- package/dist/server/chunk-ADREPXFU.js +86 -0
- package/dist/server/chunk-ADREPXFU.js.map +1 -0
- package/dist/server/chunk-F472SMKX.js +140 -0
- package/dist/server/chunk-F472SMKX.js.map +1 -0
- package/dist/server/chunk-GWBMJPLH.mjs +57 -0
- package/dist/server/chunk-GWBMJPLH.mjs.map +1 -0
- package/dist/server/chunk-JB4LIEFS.js +85 -0
- package/dist/server/chunk-JB4LIEFS.js.map +1 -0
- package/dist/server/chunk-PEAXKTDU.mjs +140 -0
- package/dist/server/chunk-PEAXKTDU.mjs.map +1 -0
- package/dist/server/chunk-QQ6U4QX6.js +120 -0
- package/dist/server/chunk-QQ6U4QX6.js.map +1 -0
- package/dist/server/chunk-R5YGLRUG.mjs +122 -0
- package/dist/server/chunk-R5YGLRUG.mjs.map +1 -0
- package/dist/server/chunk-SW7LE4M3.js +211 -0
- package/dist/server/chunk-SW7LE4M3.js.map +1 -0
- package/dist/server/chunk-W3K7LVPS.mjs +120 -0
- package/dist/server/chunk-W3K7LVPS.mjs.map +1 -0
- package/dist/server/chunk-WKG57P2H.mjs +85 -0
- package/dist/server/chunk-WKG57P2H.mjs.map +1 -0
- package/dist/server/chunk-YHEZMVTS.js +122 -0
- package/dist/server/chunk-YHEZMVTS.js.map +1 -0
- package/dist/server/chunk-YXDDFG3N.js +57 -0
- package/dist/server/chunk-YXDDFG3N.js.map +1 -0
- package/dist/server/components.d.mts +49 -0
- package/dist/server/components.d.ts +49 -0
- package/dist/server/components.js +22 -0
- package/dist/server/components.js.map +1 -0
- package/dist/server/components.mjs +22 -0
- package/dist/server/components.mjs.map +1 -0
- package/dist/server/config-validation.d.mts +300 -0
- package/dist/server/config-validation.d.ts +300 -0
- package/dist/server/config-validation.js +50 -0
- package/dist/server/config-validation.js.map +1 -0
- package/dist/server/config-validation.mjs +50 -0
- package/dist/server/config-validation.mjs.map +1 -0
- package/dist/server/config.d.mts +38 -0
- package/dist/server/config.d.ts +38 -0
- package/dist/server/config.js +44 -0
- package/dist/server/config.js.map +1 -0
- package/dist/server/config.mjs +44 -0
- package/dist/server/config.mjs.map +1 -0
- package/dist/server/data.d.mts +108 -0
- package/dist/server/data.d.ts +108 -0
- package/dist/server/data.js +15 -0
- package/dist/server/data.js.map +1 -0
- package/dist/server/data.mjs +15 -0
- package/dist/server/data.mjs.map +1 -0
- package/dist/server/index-B0yI_V6Z.d.mts +18 -0
- package/dist/server/index-C6M0Wfjq.d.ts +18 -0
- package/dist/server/index.d.mts +5 -0
- package/dist/server/index.d.ts +5 -0
- package/dist/server/index.js +12 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server/index.mjs +12 -0
- package/dist/server/index.mjs.map +1 -0
- package/dist/server/loadContent-CJcbYF3J.d.ts +152 -0
- package/dist/server/loadContent-zhlL4YSE.d.mts +152 -0
- package/dist/server/loadPage-BYmVMk0V.d.ts +216 -0
- package/dist/server/loadPage-CCf15nt8.d.mts +216 -0
- package/dist/server/loadPage-DVH3DW6E.js +9 -0
- package/dist/server/loadPage-DVH3DW6E.js.map +1 -0
- package/dist/server/loadPage-PHQZ6XQZ.mjs +9 -0
- package/dist/server/loadPage-PHQZ6XQZ.mjs.map +1 -0
- package/dist/server/metadata.d.mts +135 -0
- package/dist/server/metadata.d.ts +135 -0
- package/dist/server/metadata.js +68 -0
- package/dist/server/metadata.js.map +1 -0
- package/dist/server/metadata.mjs +68 -0
- package/dist/server/metadata.mjs.map +1 -0
- package/dist/server/rendering/server.d.mts +83 -0
- package/dist/server/rendering/server.d.ts +83 -0
- package/dist/server/rendering/server.js +14 -0
- package/dist/server/rendering/server.js.map +1 -0
- package/dist/server/rendering/server.mjs +14 -0
- package/dist/server/rendering/server.mjs.map +1 -0
- package/dist/server/rendering.d.mts +12 -0
- package/dist/server/rendering.d.ts +12 -0
- package/dist/server/rendering.js +40 -0
- package/dist/server/rendering.js.map +1 -0
- package/dist/server/rendering.mjs +40 -0
- package/dist/server/rendering.mjs.map +1 -0
- package/dist/server/routing.d.mts +115 -0
- package/dist/server/routing.d.ts +115 -0
- package/dist/server/routing.js +57 -0
- package/dist/server/routing.js.map +1 -0
- package/dist/server/routing.mjs +57 -0
- package/dist/server/routing.mjs.map +1 -0
- package/dist/server/server.d.mts +9 -0
- package/dist/server/server.d.ts +9 -0
- package/dist/server/server.js +21 -0
- package/dist/server/server.js.map +1 -0
- package/dist/server/server.mjs +21 -0
- package/dist/server/server.mjs.map +1 -0
- package/dist/server/theme-bridge.d.mts +232 -0
- package/dist/server/theme-bridge.d.ts +232 -0
- package/dist/server/theme-bridge.js +231 -0
- package/dist/server/theme-bridge.js.map +1 -0
- package/dist/server/theme-bridge.mjs +231 -0
- package/dist/server/theme-bridge.mjs.map +1 -0
- package/dist/server/theme.d.mts +40 -0
- package/dist/server/theme.d.ts +40 -0
- package/dist/server/theme.js +17 -0
- package/dist/server/theme.js.map +1 -0
- package/dist/server/theme.mjs +17 -0
- package/dist/server/theme.mjs.map +1 -0
- package/dist/server/types-BCeqWtI2.d.mts +333 -0
- package/dist/server/types-BCeqWtI2.d.ts +333 -0
- package/dist/server/types-Bbo01M7P.d.mts +76 -0
- package/dist/server/types-Bbo01M7P.d.ts +76 -0
- package/dist/server/types-C6gmRHLe.d.mts +150 -0
- package/dist/server/types-C6gmRHLe.d.ts +150 -0
- package/package.json +147 -0
- package/src/styles/index.css +10 -0
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import {
|
|
2
|
+
prefetchBlockData
|
|
3
|
+
} from "./chunk-W3K7LVPS.mjs";
|
|
4
|
+
|
|
5
|
+
// src/rendering/components/Block.tsx
|
|
6
|
+
import { getBlockDefinition, makeDefaultBlockComponent, buildThemeRuntime, getDefaultComponentRegistry } from "@riverbankcms/blocks";
|
|
7
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
8
|
+
async function Block({
|
|
9
|
+
blockKind,
|
|
10
|
+
blockId,
|
|
11
|
+
content,
|
|
12
|
+
theme,
|
|
13
|
+
siteId,
|
|
14
|
+
pageId,
|
|
15
|
+
previewStage,
|
|
16
|
+
client,
|
|
17
|
+
usePlaceholders: _usePlaceholders = false,
|
|
18
|
+
override: OverrideComponent
|
|
19
|
+
}) {
|
|
20
|
+
const definition = getBlockDefinition(blockKind);
|
|
21
|
+
if (!definition && !OverrideComponent) {
|
|
22
|
+
return /* @__PURE__ */ jsx("div", { className: "p-4 border border-red-300 bg-red-50 rounded", children: /* @__PURE__ */ jsxs("p", { className: "text-red-800 font-semibold", children: [
|
|
23
|
+
"Unknown block type: ",
|
|
24
|
+
blockKind
|
|
25
|
+
] }) });
|
|
26
|
+
}
|
|
27
|
+
const themeRuntime = buildThemeRuntime(theme);
|
|
28
|
+
let resolvedData;
|
|
29
|
+
if (client && blockId && definition) {
|
|
30
|
+
const pageOutline = {
|
|
31
|
+
name: "Single Block",
|
|
32
|
+
path: "/block",
|
|
33
|
+
purpose: "Block preview",
|
|
34
|
+
blocks: [{
|
|
35
|
+
id: blockId,
|
|
36
|
+
kind: blockKind,
|
|
37
|
+
purpose: "preview"
|
|
38
|
+
}]
|
|
39
|
+
};
|
|
40
|
+
const allResolvedData = await prefetchBlockData(
|
|
41
|
+
pageOutline,
|
|
42
|
+
{ siteId, pageId, previewStage },
|
|
43
|
+
client
|
|
44
|
+
);
|
|
45
|
+
resolvedData = allResolvedData[blockId];
|
|
46
|
+
}
|
|
47
|
+
if (OverrideComponent) {
|
|
48
|
+
return /* @__PURE__ */ jsx(
|
|
49
|
+
OverrideComponent,
|
|
50
|
+
{
|
|
51
|
+
content,
|
|
52
|
+
theme: themeRuntime.tokens,
|
|
53
|
+
themeConfig: theme,
|
|
54
|
+
data: resolvedData,
|
|
55
|
+
blockId: blockId ?? null,
|
|
56
|
+
blockKind
|
|
57
|
+
}
|
|
58
|
+
);
|
|
59
|
+
}
|
|
60
|
+
if (!definition) {
|
|
61
|
+
return /* @__PURE__ */ jsx("div", { className: "p-4 border border-red-300 bg-red-50 rounded", children: /* @__PURE__ */ jsxs("p", { className: "text-red-800 font-semibold", children: [
|
|
62
|
+
"Unknown block type: ",
|
|
63
|
+
blockKind
|
|
64
|
+
] }) });
|
|
65
|
+
}
|
|
66
|
+
const BlockComponent = makeDefaultBlockComponent({ manifest: definition.manifest });
|
|
67
|
+
const registry = getDefaultComponentRegistry();
|
|
68
|
+
return /* @__PURE__ */ jsx(
|
|
69
|
+
BlockComponent,
|
|
70
|
+
{
|
|
71
|
+
blockId: blockId ?? void 0,
|
|
72
|
+
blockKind,
|
|
73
|
+
theme: themeRuntime.tokens,
|
|
74
|
+
themeConfig: theme,
|
|
75
|
+
content,
|
|
76
|
+
data: resolvedData,
|
|
77
|
+
registry
|
|
78
|
+
}
|
|
79
|
+
);
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
export {
|
|
83
|
+
Block
|
|
84
|
+
};
|
|
85
|
+
//# sourceMappingURL=chunk-WKG57P2H.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/rendering/components/Block.tsx"],"sourcesContent":["/**\n * Block component for rendering individual CMS blocks\n *\n * Renders a single block with its content and data.\n */\n\nimport * as React from 'react';\nimport { getBlockDefinition, makeDefaultBlockComponent, buildThemeRuntime, getDefaultComponentRegistry } from '@riverbankcms/blocks';\nimport type { Theme } from '@riverbankcms/blocks';\nimport type { RiverbankClient } from '../../client/types';\nimport { prefetchBlockData } from '../../data/prefetchBlockData';\n\n/**\n * Override component for custom block rendering.\n * Receives the same props as default block components.\n */\nexport type BlockOverrideComponent = React.ComponentType<{\n content: Record<string, unknown>;\n theme?: Record<string, unknown>;\n themeConfig?: Theme;\n data?: Record<string, unknown>;\n blockId?: string | null;\n blockKind?: string;\n}>;\n\nexport type BlockProps = {\n // Block identification\n blockKind: string;\n blockId?: string | null;\n\n // Block content\n content: Record<string, unknown>;\n\n // Required styling\n theme: Theme;\n siteId: string;\n\n // Optional data context for loaders\n pageId?: string;\n previewStage?: 'published' | 'preview';\n client?: RiverbankClient;\n\n // Optional customization\n usePlaceholders?: boolean;\n\n /**\n * Custom component to override default block rendering.\n * When provided, renders this component instead of the manifest-based default.\n * This is SSR-safe - no context or hooks required.\n *\n * @example\n * ```tsx\n * <Block\n * blockKind=\"block.hero\"\n * content={heroContent}\n * theme={theme}\n * siteId={siteId}\n * override={MyCustomHero}\n * />\n * ```\n */\n override?: BlockOverrideComponent;\n};\n\n/**\n * Renders a single CMS block with optional data loading.\n *\n * Use this component when you want to render individual blocks outside of a full page context,\n * or when mixing CMS blocks with custom JSX.\n *\n * @example Basic usage\n * ```tsx\n * <Block\n * blockKind=\"block.hero\"\n * content={{ headline: 'Welcome', subheadline: 'To our site' }}\n * theme={theme}\n * siteId=\"site-123\"\n * />\n * ```\n *\n * @example With data loading\n * ```tsx\n * <Block\n * blockKind=\"block.blog-listing\"\n * blockId=\"block-456\"\n * content={blockContent}\n * theme={theme}\n * siteId=\"site-123\"\n * pageId=\"page-789\"\n * client={client}\n * />\n * ```\n */\nexport async function Block({\n blockKind,\n blockId,\n content,\n theme,\n siteId,\n pageId,\n previewStage,\n client,\n usePlaceholders: _usePlaceholders = false,\n override: OverrideComponent,\n}: BlockProps) {\n // Get block definition (needed for data loaders even if using override)\n const definition = getBlockDefinition(blockKind);\n if (!definition && !OverrideComponent) {\n return (\n <div className=\"p-4 border border-red-300 bg-red-50 rounded\">\n <p className=\"text-red-800 font-semibold\">Unknown block type: {blockKind}</p>\n </div>\n );\n }\n\n // Build theme tokens\n const themeRuntime = buildThemeRuntime(theme);\n\n // Prefetch block data if client is provided and block has an ID\n let resolvedData: Record<string, unknown> | undefined;\n if (client && blockId && definition) {\n const pageOutline = {\n name: 'Single Block',\n path: '/block',\n purpose: 'Block preview',\n blocks: [{\n id: blockId,\n kind: blockKind,\n purpose: 'preview',\n }],\n };\n\n const allResolvedData = await prefetchBlockData(\n pageOutline,\n { siteId, pageId, previewStage },\n client\n );\n\n resolvedData = allResolvedData[blockId];\n }\n\n // If override component provided, use it instead of manifest-based rendering\n if (OverrideComponent) {\n return (\n <OverrideComponent\n content={content}\n theme={themeRuntime.tokens}\n themeConfig={theme}\n data={resolvedData}\n blockId={blockId ?? null}\n blockKind={blockKind}\n />\n );\n }\n\n // Fallback to manifest-based rendering\n if (!definition) {\n return (\n <div className=\"p-4 border border-red-300 bg-red-50 rounded\">\n <p className=\"text-red-800 font-semibold\">Unknown block type: {blockKind}</p>\n </div>\n );\n }\n\n // Create block component from manifest\n const BlockComponent = makeDefaultBlockComponent({ manifest: definition.manifest });\n\n // Get default component registry\n const registry = getDefaultComponentRegistry();\n\n return (\n <BlockComponent\n blockId={blockId ?? undefined}\n blockKind={blockKind}\n theme={themeRuntime.tokens}\n themeConfig={theme}\n content={content}\n data={resolvedData}\n registry={registry}\n />\n );\n}\n"],"mappings":";;;;;AAOA,SAAS,oBAAoB,2BAA2B,mBAAmB,mCAAmC;AAsGxG,cACE,YADF;AAhBN,eAAsB,MAAM;AAAA,EAC1B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,iBAAiB,mBAAmB;AAAA,EACpC,UAAU;AACZ,GAAe;AAEb,QAAM,aAAa,mBAAmB,SAAS;AAC/C,MAAI,CAAC,cAAc,CAAC,mBAAmB;AACrC,WACE,oBAAC,SAAI,WAAU,+CACb,+BAAC,OAAE,WAAU,8BAA6B;AAAA;AAAA,MAAqB;AAAA,OAAU,GAC3E;AAAA,EAEJ;AAGA,QAAM,eAAe,kBAAkB,KAAK;AAG5C,MAAI;AACJ,MAAI,UAAU,WAAW,YAAY;AACnC,UAAM,cAAc;AAAA,MAClB,MAAM;AAAA,MACN,MAAM;AAAA,MACN,SAAS;AAAA,MACT,QAAQ,CAAC;AAAA,QACP,IAAI;AAAA,QACJ,MAAM;AAAA,QACN,SAAS;AAAA,MACX,CAAC;AAAA,IACH;AAEA,UAAM,kBAAkB,MAAM;AAAA,MAC5B;AAAA,MACA,EAAE,QAAQ,QAAQ,aAAa;AAAA,MAC/B;AAAA,IACF;AAEA,mBAAe,gBAAgB,OAAO;AAAA,EACxC;AAGA,MAAI,mBAAmB;AACrB,WACE;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,OAAO,aAAa;AAAA,QACpB,aAAa;AAAA,QACb,MAAM;AAAA,QACN,SAAS,WAAW;AAAA,QACpB;AAAA;AAAA,IACF;AAAA,EAEJ;AAGA,MAAI,CAAC,YAAY;AACf,WACE,oBAAC,SAAI,WAAU,+CACb,+BAAC,OAAE,WAAU,8BAA6B;AAAA;AAAA,MAAqB;AAAA,OAAU,GAC3E;AAAA,EAEJ;AAGA,QAAM,iBAAiB,0BAA0B,EAAE,UAAU,WAAW,SAAS,CAAC;AAGlF,QAAM,WAAW,4BAA4B;AAE7C,SACE;AAAA,IAAC;AAAA;AAAA,MACC,SAAS,WAAW;AAAA,MACpB;AAAA,MACA,OAAO,aAAa;AAAA,MACpB,aAAa;AAAA,MACb;AAAA,MACA,MAAM;AAAA,MACN;AAAA;AAAA,EACF;AAEJ;","names":[]}
|
|
@@ -0,0 +1,122 @@
|
|
|
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; }// src/rendering/components/Page.tsx
|
|
2
|
+
var _blocks = require('@riverbankcms/blocks');
|
|
3
|
+
var _jsxruntime = require('react/jsx-runtime');
|
|
4
|
+
function Page({
|
|
5
|
+
page,
|
|
6
|
+
theme,
|
|
7
|
+
themeTokens: providedTokens,
|
|
8
|
+
siteId,
|
|
9
|
+
resolvedData,
|
|
10
|
+
routeMap,
|
|
11
|
+
wrapBlock,
|
|
12
|
+
registry,
|
|
13
|
+
usePlaceholders = false,
|
|
14
|
+
blockOverrides,
|
|
15
|
+
sdkConfig,
|
|
16
|
+
dataContext
|
|
17
|
+
}) {
|
|
18
|
+
const baseTokens = _nullishCoalesce(providedTokens, () => ( _blocks.buildThemeRuntime.call(void 0, theme).tokens));
|
|
19
|
+
const themeTokens = _optionalChain([sdkConfig, 'optionalAccess', _ => _.theme, 'optionalAccess', _2 => _2.palette]) ? { ...baseTokens, palette: { ...baseTokens.palette, ...sdkConfig.theme.palette } } : baseTokens;
|
|
20
|
+
return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
21
|
+
_blocks.PageRenderer,
|
|
22
|
+
{
|
|
23
|
+
theme,
|
|
24
|
+
page,
|
|
25
|
+
themeTokens,
|
|
26
|
+
usePlaceholders,
|
|
27
|
+
dataContext: {
|
|
28
|
+
siteId,
|
|
29
|
+
resolvedData,
|
|
30
|
+
routes: routeMap,
|
|
31
|
+
occurrenceContext: _nullishCoalesce(_optionalChain([dataContext, 'optionalAccess', _3 => _3.occurrenceContext]), () => ( null)),
|
|
32
|
+
contentEntry: _nullishCoalesce(_optionalChain([dataContext, 'optionalAccess', _4 => _4.contentEntry]), () => ( null))
|
|
33
|
+
},
|
|
34
|
+
routeMap,
|
|
35
|
+
wrapBlock,
|
|
36
|
+
registry,
|
|
37
|
+
blockOverrides,
|
|
38
|
+
sdkConfig
|
|
39
|
+
}
|
|
40
|
+
);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
// src/rendering/components/Layout.tsx
|
|
44
|
+
|
|
45
|
+
var _siterenderer = require('@riverbankcms/site-renderer');
|
|
46
|
+
|
|
47
|
+
async function Layout({
|
|
48
|
+
siteData: providedSiteData,
|
|
49
|
+
client,
|
|
50
|
+
siteId,
|
|
51
|
+
slug,
|
|
52
|
+
domain,
|
|
53
|
+
children,
|
|
54
|
+
header = true,
|
|
55
|
+
footer = true,
|
|
56
|
+
headerVariant
|
|
57
|
+
}) {
|
|
58
|
+
let siteData = providedSiteData;
|
|
59
|
+
if (!siteData) {
|
|
60
|
+
if (!client) {
|
|
61
|
+
throw new Error("Layout: must provide either siteData or client");
|
|
62
|
+
}
|
|
63
|
+
if (!siteId && !slug && !domain) {
|
|
64
|
+
throw new Error("Layout: must provide siteId, slug, or domain when using client");
|
|
65
|
+
}
|
|
66
|
+
siteData = await client.getSite({ id: siteId, slug, domain });
|
|
67
|
+
}
|
|
68
|
+
const { site, theme, navigation, layout, routes } = siteData;
|
|
69
|
+
const themeRuntime = _blocks.buildThemeRuntime.call(void 0, theme);
|
|
70
|
+
const menu = _siterenderer.selectPrimaryMenu.call(void 0, navigation);
|
|
71
|
+
const menuViewModel = _siterenderer.buildMenuViewModel.call(void 0, menu);
|
|
72
|
+
const logoViewModel = _siterenderer.buildLogoViewModel.call(void 0, _nullishCoalesce(layout.logo, () => ( null)), site.title);
|
|
73
|
+
const headerData = {
|
|
74
|
+
menu: menuViewModel,
|
|
75
|
+
logo: logoViewModel,
|
|
76
|
+
site,
|
|
77
|
+
theme,
|
|
78
|
+
routes
|
|
79
|
+
};
|
|
80
|
+
const headerContent = headerVariant ? { ...layout.header, variant: headerVariant } : layout.header;
|
|
81
|
+
const themeWithVariant = headerVariant ? {
|
|
82
|
+
...theme,
|
|
83
|
+
header: { ...theme.header, variant: headerVariant }
|
|
84
|
+
} : theme;
|
|
85
|
+
const viewModelOverrides = {
|
|
86
|
+
$root: {
|
|
87
|
+
siteId: site.id,
|
|
88
|
+
routes,
|
|
89
|
+
theme: themeWithVariant
|
|
90
|
+
},
|
|
91
|
+
site,
|
|
92
|
+
menu: menuViewModel,
|
|
93
|
+
content: {
|
|
94
|
+
logo: logoViewModel
|
|
95
|
+
}
|
|
96
|
+
};
|
|
97
|
+
let headerElement = null;
|
|
98
|
+
if (header === true) {
|
|
99
|
+
headerElement = _blocks.renderBlock.call(void 0, _blocks.siteHeaderManifest, headerContent, {
|
|
100
|
+
theme: themeRuntime.tokens,
|
|
101
|
+
themeConfig: themeWithVariant,
|
|
102
|
+
viewModelOverrides
|
|
103
|
+
});
|
|
104
|
+
} else if (typeof header === "function") {
|
|
105
|
+
headerElement = header(headerData);
|
|
106
|
+
}
|
|
107
|
+
return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _jsxruntime.Fragment, { children: [
|
|
108
|
+
headerElement,
|
|
109
|
+
children,
|
|
110
|
+
footer && _blocks.renderBlock.call(void 0, _blocks.siteFooterManifest, layout.footer, {
|
|
111
|
+
theme: themeRuntime.tokens,
|
|
112
|
+
themeConfig: theme,
|
|
113
|
+
viewModelOverrides
|
|
114
|
+
})
|
|
115
|
+
] });
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
|
|
119
|
+
|
|
120
|
+
|
|
121
|
+
exports.Page = Page; exports.Layout = Layout;
|
|
122
|
+
//# sourceMappingURL=chunk-YHEZMVTS.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["/Users/will/Projects/Business/cms/builder/packages/sdk/dist/server/chunk-YHEZMVTS.js","../../src/rendering/components/Page.tsx","../../src/rendering/components/Layout.tsx"],"names":["buildThemeRuntime"],"mappings":"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","file":"/Users/will/Projects/Business/cms/builder/packages/sdk/dist/server/chunk-YHEZMVTS.js","sourcesContent":[null,"/**\n * Pure Page renderer component for Riverbank CMS.\n *\n * This component expects all data to be provided via props.\n * For data fetching, use:\n * - Server-side: `await loadPage({ client, siteId, path })`\n * - Client-side: `usePage({ client, siteId, path })`\n */\n\nimport { PageRenderer, buildThemeRuntime } from '@riverbankcms/blocks';\nimport type { PageOutline, RouteMap, Theme, ThemeTokens, BlockOverrides, OccurrenceContextData } from '@riverbankcms/blocks';\nimport type { ResolvedBlockData } from '../../data';\nimport type { RuntimeSdkConfig } from '../helpers/loadPage';\n\n// Re-export OccurrenceContextData for SDK consumers\nexport type { OccurrenceContextData };\n\nexport type PageProps = {\n // Required data (must be provided by caller)\n page: PageOutline;\n theme: Theme;\n siteId: string;\n\n // Optional data\n themeTokens?: ThemeTokens; // If not provided, will be built from theme\n resolvedData?: ResolvedBlockData; // Pre-fetched block data\n routeMap?: RouteMap;\n /**\n * SDK site configuration containing theme palette overrides.\n * When provided, the SDK palette tokens are merged into the theme tokens,\n * allowing blocks to use SDK-defined color tokens for section backgrounds.\n */\n sdkConfig?: RuntimeSdkConfig | null;\n\n /**\n * Additional context data for content entry pages.\n * Used to pass occurrence context and content entry data to blocks.\n */\n dataContext?: {\n /** Occurrence context for event pages (from URL like /events/yoga/2025-01-15) */\n occurrenceContext?: OccurrenceContextData | null;\n /** Content entry data for template pages */\n contentEntry?: Record<string, unknown> | null;\n };\n\n // Customization\n wrapBlock?: (blockId: string, rendered: React.ReactNode) => React.ReactNode;\n registry?: Parameters<typeof PageRenderer>[0]['registry'];\n usePlaceholders?: boolean;\n /**\n * Custom components to override default block rendering.\n * Keys can be full block kind (\"block.hero\") or short form (\"hero\").\n *\n * This is SSR-safe - no context or hooks required.\n *\n * @example\n * ```tsx\n * <Page\n * {...pageData}\n * blockOverrides={{\n * 'hero': MyCustomHero,\n * 'block.testimonials': MyCustomTestimonials,\n * }}\n * />\n * ```\n */\n blockOverrides?: BlockOverrides;\n};\n\n/**\n * Pure renderer for Riverbank CMS pages.\n *\n * This component expects all data to be provided via props.\n * For data fetching, use:\n * - Server-side: `await loadPage({ client, siteId, path })`\n * - Client-side: `usePage({ client, siteId, path })`\n *\n * @example Server-side (Next.js App Router)\n * ```tsx\n * import { createRiverbankClient } from '@riverbankcms/sdk';\n * import { loadPage, Page } from '@riverbankcms/sdk/rendering';\n *\n * const client = createRiverbankClient({ apiKey, baseUrl });\n *\n * export default async function PageRoute({ params }) {\n * const pageData = await loadPage({\n * client,\n * siteId: 'site-id',\n * path: `/${params.slug}`,\n * });\n *\n * return <Page {...pageData} />;\n * }\n * ```\n *\n * @example Client-side\n * ```tsx\n * import { createRiverbankClient } from '@riverbankcms/sdk';\n * import { usePage, Page } from '@riverbankcms/sdk/rendering';\n *\n * const client = createRiverbankClient({ apiKey, baseUrl });\n *\n * function MyPage({ path }) {\n * const pageData = usePage({ client, siteId: 'site-id', path });\n *\n * if (pageData.loading) return <LoadingState />;\n * if (pageData.error) return <ErrorState error={pageData.error} />;\n * if (!pageData.page) return <NotFound />;\n *\n * return <Page {...pageData} />;\n * }\n * ```\n */\nexport function Page({\n page,\n theme,\n themeTokens: providedTokens,\n siteId,\n resolvedData,\n routeMap,\n wrapBlock,\n registry,\n usePlaceholders = false,\n blockOverrides,\n sdkConfig,\n dataContext,\n}: PageProps) {\n // Build theme tokens if not provided\n const baseTokens = providedTokens ?? buildThemeRuntime(theme).tokens;\n\n // Merge SDK palette tokens into theme tokens\n // This allows blocks to resolve SDK-defined color tokens (e.g., 'primary' -> '#6d28d9')\n const themeTokens = sdkConfig?.theme?.palette\n ? { ...baseTokens, palette: { ...baseTokens.palette, ...sdkConfig.theme.palette } }\n : baseTokens;\n\n return (\n <PageRenderer\n theme={theme}\n page={page}\n themeTokens={themeTokens}\n usePlaceholders={usePlaceholders}\n dataContext={{\n siteId,\n resolvedData,\n routes: routeMap,\n occurrenceContext: dataContext?.occurrenceContext ?? null,\n contentEntry: dataContext?.contentEntry ?? null,\n }}\n routeMap={routeMap}\n wrapBlock={wrapBlock}\n registry={registry}\n blockOverrides={blockOverrides}\n sdkConfig={sdkConfig}\n />\n );\n}\n","/**\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 { selectPrimaryMenu, buildMenuViewModel, buildLogoViewModel } from '@riverbankcms/site-renderer';\nimport type { RiverbankClient, SiteResponse } from '../../client/types';\n\nexport type HeaderData = {\n menu: ReturnType<typeof buildMenuViewModel>;\n logo: ReturnType<typeof buildLogoViewModel>;\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 using proper helpers from @riverbankcms/site-renderer\n const menu = selectPrimaryMenu(navigation);\n const menuViewModel = buildMenuViewModel(menu);\n const logoViewModel = buildLogoViewModel(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"]}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } }// src/data/executeCodeLoaders.ts
|
|
2
|
+
async function executeCodeLoaders(page, context, overrides) {
|
|
3
|
+
const results = {};
|
|
4
|
+
const tasks = [];
|
|
5
|
+
for (const block of page.blocks) {
|
|
6
|
+
const blockId = block.id;
|
|
7
|
+
if (!blockId) continue;
|
|
8
|
+
const blockLoaders = overrides[block.kind];
|
|
9
|
+
if (!blockLoaders) continue;
|
|
10
|
+
const content = _nullishCoalesce(_nullishCoalesce(block.draftContent, () => ( block.content)), () => ( {}));
|
|
11
|
+
for (const [key, loaderFn] of Object.entries(blockLoaders)) {
|
|
12
|
+
tasks.push(
|
|
13
|
+
(async () => {
|
|
14
|
+
try {
|
|
15
|
+
const loaderContext = {
|
|
16
|
+
siteId: _nullishCoalesce(context.siteId, () => ( "")),
|
|
17
|
+
pageId: _nullishCoalesce(context.pageId, () => ( "")),
|
|
18
|
+
blockId,
|
|
19
|
+
blockKind: block.kind,
|
|
20
|
+
content,
|
|
21
|
+
previewStage: _nullishCoalesce(context.previewStage, () => ( "published"))
|
|
22
|
+
};
|
|
23
|
+
const data = await loaderFn(loaderContext);
|
|
24
|
+
if (!results[blockId]) {
|
|
25
|
+
results[blockId] = {};
|
|
26
|
+
}
|
|
27
|
+
results[blockId][key] = data;
|
|
28
|
+
} catch (error) {
|
|
29
|
+
console.warn("[executeCodeLoaders] Loader failed:", {
|
|
30
|
+
blockKind: block.kind,
|
|
31
|
+
loaderKey: key,
|
|
32
|
+
error
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
})()
|
|
36
|
+
);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
await Promise.all(tasks);
|
|
40
|
+
return results;
|
|
41
|
+
}
|
|
42
|
+
function mergeLoaderResults(configResults, codeResults) {
|
|
43
|
+
const merged = { ...configResults };
|
|
44
|
+
for (const [blockId, loaderData] of Object.entries(codeResults)) {
|
|
45
|
+
if (!merged[blockId]) {
|
|
46
|
+
merged[blockId] = {};
|
|
47
|
+
}
|
|
48
|
+
merged[blockId] = { ...merged[blockId], ...loaderData };
|
|
49
|
+
}
|
|
50
|
+
return merged;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
exports.executeCodeLoaders = executeCodeLoaders; exports.mergeLoaderResults = mergeLoaderResults;
|
|
57
|
+
//# sourceMappingURL=chunk-YXDDFG3N.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["/Users/will/Projects/Business/cms/builder/packages/sdk/dist/server/chunk-YXDDFG3N.js","../../src/data/executeCodeLoaders.ts"],"names":[],"mappings":"AAAA;ACiCA,MAAA,SAAsB,kBAAA,CACpB,IAAA,EACA,OAAA,EACA,SAAA,EAC4B;AAC5B,EAAA,MAAM,QAAA,EAA6B,CAAC,CAAA;AACpC,EAAA,MAAM,MAAA,EAAyB,CAAC,CAAA;AAEhC,EAAA,IAAA,CAAA,MAAW,MAAA,GAAS,IAAA,CAAK,MAAA,EAAQ;AAC/B,IAAA,MAAM,QAAA,EAAU,KAAA,CAAM,EAAA;AACtB,IAAA,GAAA,CAAI,CAAC,OAAA,EAAS,QAAA;AAGd,IAAA,MAAM,aAAA,EAAe,SAAA,CAAU,KAAA,CAAM,IAAI,CAAA;AACzC,IAAA,GAAA,CAAI,CAAC,YAAA,EAAc,QAAA;AAGnB,IAAA,MAAM,QAAA,oCACH,KAAA,CAAqC,YAAA,UACrC,KAAA,CAAgC,SAAA,UACjC,CAAC,GAAA;AAIH,IAAA,IAAA,CAAA,MAAW,CAAC,GAAA,EAAK,QAAQ,EAAA,GAAK,MAAA,CAAO,OAAA,CAAQ,YAAY,CAAA,EAAG;AAC1D,MAAA,KAAA,CAAM,IAAA;AAAA,QAAA,CACH,MAAA,CAAA,EAAA,GAAY;AACX,UAAA,IAAI;AACF,YAAA,MAAM,cAAA,EAAmC;AAAA,cACvC,MAAA,mBAAQ,OAAA,CAAQ,MAAA,UAAU,IAAA;AAAA,cAC1B,MAAA,mBAAQ,OAAA,CAAQ,MAAA,UAAU,IAAA;AAAA,cAC1B,OAAA;AAAA,cACA,SAAA,EAAW,KAAA,CAAM,IAAA;AAAA,cACjB,OAAA;AAAA,cACA,YAAA,mBAAc,OAAA,CAAQ,YAAA,UAAgB;AAAA,YACxC,CAAA;AAEA,YAAA,MAAM,KAAA,EAAO,MAAM,QAAA,CAAS,aAAa,CAAA;AAEzC,YAAA,GAAA,CAAI,CAAC,OAAA,CAAQ,OAAO,CAAA,EAAG;AACrB,cAAA,OAAA,CAAQ,OAAO,EAAA,EAAI,CAAC,CAAA;AAAA,YACtB;AACA,YAAA,OAAA,CAAQ,OAAO,CAAA,CAAG,GAAG,EAAA,EAAI,IAAA;AAAA,UAC3B,EAAA,MAAA,CAAS,KAAA,EAAO;AAGd,YAAA,OAAA,CAAQ,IAAA,CAAK,qCAAA,EAAuC;AAAA,cAClD,SAAA,EAAW,KAAA,CAAM,IAAA;AAAA,cACjB,SAAA,EAAW,GAAA;AAAA,cACX;AAAA,YACF,CAAC,CAAA;AAAA,UACH;AAAA,QACF,CAAA,CAAA,CAAG;AAAA,MACL,CAAA;AAAA,IACF;AAAA,EACF;AAEA,EAAA,MAAM,OAAA,CAAQ,GAAA,CAAI,KAAK,CAAA;AACvB,EAAA,OAAO,OAAA;AACT;AAWO,SAAS,kBAAA,CACd,aAAA,EACA,WAAA,EACmB;AACnB,EAAA,MAAM,OAAA,EAA4B,EAAE,GAAG,cAAc,CAAA;AAErD,EAAA,IAAA,CAAA,MAAW,CAAC,OAAA,EAAS,UAAU,EAAA,GAAK,MAAA,CAAO,OAAA,CAAQ,WAAW,CAAA,EAAG;AAC/D,IAAA,GAAA,CAAI,CAAC,MAAA,CAAO,OAAO,CAAA,EAAG;AACpB,MAAA,MAAA,CAAO,OAAO,EAAA,EAAI,CAAC,CAAA;AAAA,IACrB;AAEA,IAAA,MAAA,CAAO,OAAO,EAAA,EAAI,EAAE,GAAG,MAAA,CAAO,OAAO,CAAA,EAAG,GAAG,WAAW,CAAA;AAAA,EACxD;AAEA,EAAA,OAAO,MAAA;AACT;ADnEA;AACA;AACE;AACA;AACF,iGAAC","file":"/Users/will/Projects/Business/cms/builder/packages/sdk/dist/server/chunk-YXDDFG3N.js","sourcesContent":[null,"/**\n * Execute code-based data loaders for SDK custom blocks.\n *\n * Code loaders are user-defined async functions that can fetch data\n * from any API (not just whitelisted CMS endpoints). They run\n * server-side during loadPage().\n */\n\nimport type { PageOutline } from '@riverbankcms/blocks';\nimport type { PrefetchContext, ResolvedBlockData } from '@riverbankcms/blocks/system/data';\nimport type { DataLoaderContext, DataLoaderOverrides } from './types';\n\n/**\n * Execute code-based data loaders for blocks on a page.\n *\n * Iterates through page blocks and executes any registered loader\n * functions for matching block kinds. Runs all loaders in parallel.\n *\n * @param page - Page outline with blocks to process\n * @param context - Prefetch context (siteId, pageId, previewStage)\n * @param overrides - Map of block kinds to loader functions\n * @returns Resolved data keyed by blockId, then loader key\n *\n * @example\n * ```typescript\n * const codeData = await executeCodeLoaders(page, context, {\n * 'custom.featured-products': {\n * products: async (ctx) => fetchProducts(ctx.content.categoryId),\n * },\n * });\n * // codeData: { 'block-123': { products: [...] } }\n * ```\n */\nexport async function executeCodeLoaders(\n page: PageOutline,\n context: PrefetchContext,\n overrides: DataLoaderOverrides,\n): Promise<ResolvedBlockData> {\n const results: ResolvedBlockData = {};\n const tasks: Promise<void>[] = [];\n\n for (const block of page.blocks) {\n const blockId = block.id;\n if (!blockId) continue;\n\n // Look up loaders for this block kind\n const blockLoaders = overrides[block.kind];\n if (!blockLoaders) continue;\n\n // Get block content (prefer draft in preview mode)\n const content = (\n (block as { draftContent?: unknown }).draftContent ??\n (block as { content?: unknown }).content ??\n {}\n ) as Record<string, unknown>;\n\n // Execute each loader for this block\n for (const [key, loaderFn] of Object.entries(blockLoaders)) {\n tasks.push(\n (async () => {\n try {\n const loaderContext: DataLoaderContext = {\n siteId: context.siteId ?? '',\n pageId: context.pageId ?? '',\n blockId,\n blockKind: block.kind,\n content,\n previewStage: context.previewStage ?? 'published',\n };\n\n const data = await loaderFn(loaderContext);\n\n if (!results[blockId]) {\n results[blockId] = {};\n }\n results[blockId]![key] = data;\n } catch (error) {\n // Log but don't throw - data loading is best-effort\n // SDK users should handle missing data gracefully in components\n console.warn('[executeCodeLoaders] Loader failed:', {\n blockKind: block.kind,\n loaderKey: key,\n error,\n });\n }\n })(),\n );\n }\n }\n\n await Promise.all(tasks);\n return results;\n}\n\n/**\n * Merge resolved data from config loaders and code loaders.\n *\n * Code loader results take precedence on key conflicts.\n *\n * @param configResults - Data from config-based loaders (CMS endpoints)\n * @param codeResults - Data from code-based loaders (external APIs)\n * @returns Merged data with code results overwriting config on conflicts\n */\nexport function mergeLoaderResults(\n configResults: ResolvedBlockData,\n codeResults: ResolvedBlockData,\n): ResolvedBlockData {\n const merged: ResolvedBlockData = { ...configResults };\n\n for (const [blockId, loaderData] of Object.entries(codeResults)) {\n if (!merged[blockId]) {\n merged[blockId] = {};\n }\n // Code loaders take precedence on key conflicts\n merged[blockId] = { ...merged[blockId], ...loaderData };\n }\n\n return merged;\n}\n"]}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
export { P as Page, b as PageProps } from './loadPage-CCf15nt8.mjs';
|
|
2
|
+
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
3
|
+
import { buildMenuViewModel, buildLogoViewModel } from '@riverbankcms/site-renderer';
|
|
4
|
+
import { S as SiteResponse, R as RiverbankClient } from './types-C6gmRHLe.mjs';
|
|
5
|
+
export { BackgroundInput, BlockOverrideComponent, BlockOverrides, BodyTextContent, HeroContent, PageOutline, PageRenderer, ResolvedBackground, RichText, RichTextPrimitiveProps, RouteMap, SectionBackground, SectionBackgroundProps, SystemBlockComponentProps, Theme, ThemeTokens, TipTapNode, buildThemeRuntime, resolveBackground, resolveImageUrl } from '@riverbankcms/blocks';
|
|
6
|
+
import '@riverbankcms/blocks/system/data';
|
|
7
|
+
import './types-Bbo01M7P.mjs';
|
|
8
|
+
import '@riverbankcms/api';
|
|
9
|
+
|
|
10
|
+
type HeaderData = {
|
|
11
|
+
menu: ReturnType<typeof buildMenuViewModel>;
|
|
12
|
+
logo: ReturnType<typeof buildLogoViewModel>;
|
|
13
|
+
site: SiteResponse['site'];
|
|
14
|
+
theme: SiteResponse['theme'];
|
|
15
|
+
routes: SiteResponse['routes'];
|
|
16
|
+
};
|
|
17
|
+
type LayoutProps = {
|
|
18
|
+
siteData?: SiteResponse;
|
|
19
|
+
client?: RiverbankClient;
|
|
20
|
+
siteId?: string;
|
|
21
|
+
slug?: string;
|
|
22
|
+
domain?: string;
|
|
23
|
+
children: React.ReactNode;
|
|
24
|
+
header?: boolean | ((data: HeaderData) => React.ReactNode);
|
|
25
|
+
footer?: boolean;
|
|
26
|
+
headerVariant?: 'classic' | 'centered' | 'transparent' | 'floating' | 'editorial';
|
|
27
|
+
};
|
|
28
|
+
/**
|
|
29
|
+
* Layout component that wraps content with site header and footer.
|
|
30
|
+
*
|
|
31
|
+
* @example With pre-fetched site data (recommended)
|
|
32
|
+
* ```tsx
|
|
33
|
+
* const site = await client.getSite({ slug: 'my-site' });
|
|
34
|
+
*
|
|
35
|
+
* <Layout siteData={site}>
|
|
36
|
+
* <Page {...pageData} />
|
|
37
|
+
* </Layout>
|
|
38
|
+
* ```
|
|
39
|
+
*
|
|
40
|
+
* @example With automatic fetching
|
|
41
|
+
* ```tsx
|
|
42
|
+
* <Layout client={client} slug="my-site">
|
|
43
|
+
* <Page {...pageData} />
|
|
44
|
+
* </Layout>
|
|
45
|
+
* ```
|
|
46
|
+
*/
|
|
47
|
+
declare function Layout({ siteData: providedSiteData, client, siteId, slug, domain, children, header, footer, headerVariant, }: LayoutProps): Promise<react_jsx_runtime.JSX.Element>;
|
|
48
|
+
|
|
49
|
+
export { type HeaderData, Layout, type LayoutProps };
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
export { P as Page, b as PageProps } from './loadPage-BYmVMk0V.js';
|
|
2
|
+
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
3
|
+
import { buildMenuViewModel, buildLogoViewModel } from '@riverbankcms/site-renderer';
|
|
4
|
+
import { S as SiteResponse, R as RiverbankClient } from './types-C6gmRHLe.js';
|
|
5
|
+
export { BackgroundInput, BlockOverrideComponent, BlockOverrides, BodyTextContent, HeroContent, PageOutline, PageRenderer, ResolvedBackground, RichText, RichTextPrimitiveProps, RouteMap, SectionBackground, SectionBackgroundProps, SystemBlockComponentProps, Theme, ThemeTokens, TipTapNode, buildThemeRuntime, resolveBackground, resolveImageUrl } from '@riverbankcms/blocks';
|
|
6
|
+
import '@riverbankcms/blocks/system/data';
|
|
7
|
+
import './types-Bbo01M7P.js';
|
|
8
|
+
import '@riverbankcms/api';
|
|
9
|
+
|
|
10
|
+
type HeaderData = {
|
|
11
|
+
menu: ReturnType<typeof buildMenuViewModel>;
|
|
12
|
+
logo: ReturnType<typeof buildLogoViewModel>;
|
|
13
|
+
site: SiteResponse['site'];
|
|
14
|
+
theme: SiteResponse['theme'];
|
|
15
|
+
routes: SiteResponse['routes'];
|
|
16
|
+
};
|
|
17
|
+
type LayoutProps = {
|
|
18
|
+
siteData?: SiteResponse;
|
|
19
|
+
client?: RiverbankClient;
|
|
20
|
+
siteId?: string;
|
|
21
|
+
slug?: string;
|
|
22
|
+
domain?: string;
|
|
23
|
+
children: React.ReactNode;
|
|
24
|
+
header?: boolean | ((data: HeaderData) => React.ReactNode);
|
|
25
|
+
footer?: boolean;
|
|
26
|
+
headerVariant?: 'classic' | 'centered' | 'transparent' | 'floating' | 'editorial';
|
|
27
|
+
};
|
|
28
|
+
/**
|
|
29
|
+
* Layout component that wraps content with site header and footer.
|
|
30
|
+
*
|
|
31
|
+
* @example With pre-fetched site data (recommended)
|
|
32
|
+
* ```tsx
|
|
33
|
+
* const site = await client.getSite({ slug: 'my-site' });
|
|
34
|
+
*
|
|
35
|
+
* <Layout siteData={site}>
|
|
36
|
+
* <Page {...pageData} />
|
|
37
|
+
* </Layout>
|
|
38
|
+
* ```
|
|
39
|
+
*
|
|
40
|
+
* @example With automatic fetching
|
|
41
|
+
* ```tsx
|
|
42
|
+
* <Layout client={client} slug="my-site">
|
|
43
|
+
* <Page {...pageData} />
|
|
44
|
+
* </Layout>
|
|
45
|
+
* ```
|
|
46
|
+
*/
|
|
47
|
+
declare function Layout({ siteData: providedSiteData, client, siteId, slug, domain, children, header, footer, headerVariant, }: LayoutProps): Promise<react_jsx_runtime.JSX.Element>;
|
|
48
|
+
|
|
49
|
+
export { type HeaderData, Layout, type LayoutProps };
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true});
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
var _chunkYHEZMVTSjs = require('./chunk-YHEZMVTS.js');
|
|
5
|
+
|
|
6
|
+
// src/components.ts
|
|
7
|
+
var _blocks = require('@riverbankcms/blocks');
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
exports.Layout = _chunkYHEZMVTSjs.Layout; exports.Page = _chunkYHEZMVTSjs.Page; exports.PageRenderer = _blocks.PageRenderer; exports.RichText = _blocks.RichText; exports.SectionBackground = _blocks.SectionBackground; exports.buildThemeRuntime = _blocks.buildThemeRuntime; exports.resolveBackground = _blocks.resolveBackground; exports.resolveImageUrl = _blocks.resolveImageUrl;
|
|
22
|
+
//# sourceMappingURL=components.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["/Users/will/Projects/Business/cms/builder/packages/sdk/dist/server/components.js","../../src/components.ts"],"names":[],"mappings":"AAAA;AACE;AACA;AACF,sDAA4B;AAC5B;AACA;AC2BA,8CAA2E;AAiB3E;AACE;AACA;AAAA;ADxCF;AACE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACF,yXAAC","file":"/Users/will/Projects/Business/cms/builder/packages/sdk/dist/server/components.js","sourcesContent":[null,"/**\n * React components for Riverbank CMS\n *\n * This entry point exports Server Components (Page, Layout, PageRenderer).\n * These components do NOT use hooks and can be used in Server Components.\n *\n * Prefer importing from '@riverbankcms/sdk/rendering' which exports the same\n * components plus server-side data loading helpers (loadPage, loadContent).\n *\n * @example\n * ```tsx\n * import { createRiverbankClient } from '@riverbankcms/sdk';\n * import { loadPage } from '@riverbankcms/sdk/server';\n * import { Page } from '@riverbankcms/sdk/components';\n *\n * const client = createRiverbankClient({ apiKey, baseUrl });\n *\n * export default async function MyPage() {\n * const pageData = await loadPage({ client, siteId, path: '/' });\n * return <Page {...pageData} />;\n * }\n * ```\n */\n\n// High-level components\nexport { Page } from './rendering/components/Page';\nexport type { PageProps } from './rendering/components/Page';\n\nexport { Layout } from './rendering/components/Layout';\nexport type { LayoutProps, HeaderData } from './rendering/components/Layout';\n\n// Low-level re-exports from @riverbankcms/blocks (for advanced usage)\nexport { PageRenderer, buildThemeRuntime, RichText, resolveImageUrl } from '@riverbankcms/blocks';\nexport type {\n PageOutline,\n RouteMap,\n Theme,\n ThemeTokens,\n BlockOverrides,\n BlockOverrideComponent,\n SystemBlockComponentProps,\n HeroContent,\n BodyTextContent,\n // Rich text types\n RichTextPrimitiveProps,\n TipTapNode,\n} from '@riverbankcms/blocks';\n\n// Helpers for custom block components\nexport {\n resolveBackground,\n SectionBackground,\n type BackgroundInput,\n type ResolvedBackground,\n type SectionBackgroundProps,\n} from '@riverbankcms/blocks';\n"]}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import {
|
|
2
|
+
Layout,
|
|
3
|
+
Page
|
|
4
|
+
} from "./chunk-R5YGLRUG.mjs";
|
|
5
|
+
|
|
6
|
+
// src/components.ts
|
|
7
|
+
import { PageRenderer, buildThemeRuntime, RichText, resolveImageUrl } from "@riverbankcms/blocks";
|
|
8
|
+
import {
|
|
9
|
+
resolveBackground,
|
|
10
|
+
SectionBackground
|
|
11
|
+
} from "@riverbankcms/blocks";
|
|
12
|
+
export {
|
|
13
|
+
Layout,
|
|
14
|
+
Page,
|
|
15
|
+
PageRenderer,
|
|
16
|
+
RichText,
|
|
17
|
+
SectionBackground,
|
|
18
|
+
buildThemeRuntime,
|
|
19
|
+
resolveBackground,
|
|
20
|
+
resolveImageUrl
|
|
21
|
+
};
|
|
22
|
+
//# sourceMappingURL=components.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/components.ts"],"sourcesContent":["/**\n * React components for Riverbank CMS\n *\n * This entry point exports Server Components (Page, Layout, PageRenderer).\n * These components do NOT use hooks and can be used in Server Components.\n *\n * Prefer importing from '@riverbankcms/sdk/rendering' which exports the same\n * components plus server-side data loading helpers (loadPage, loadContent).\n *\n * @example\n * ```tsx\n * import { createRiverbankClient } from '@riverbankcms/sdk';\n * import { loadPage } from '@riverbankcms/sdk/server';\n * import { Page } from '@riverbankcms/sdk/components';\n *\n * const client = createRiverbankClient({ apiKey, baseUrl });\n *\n * export default async function MyPage() {\n * const pageData = await loadPage({ client, siteId, path: '/' });\n * return <Page {...pageData} />;\n * }\n * ```\n */\n\n// High-level components\nexport { Page } from './rendering/components/Page';\nexport type { PageProps } from './rendering/components/Page';\n\nexport { Layout } from './rendering/components/Layout';\nexport type { LayoutProps, HeaderData } from './rendering/components/Layout';\n\n// Low-level re-exports from @riverbankcms/blocks (for advanced usage)\nexport { PageRenderer, buildThemeRuntime, RichText, resolveImageUrl } from '@riverbankcms/blocks';\nexport type {\n PageOutline,\n RouteMap,\n Theme,\n ThemeTokens,\n BlockOverrides,\n BlockOverrideComponent,\n SystemBlockComponentProps,\n HeroContent,\n BodyTextContent,\n // Rich text types\n RichTextPrimitiveProps,\n TipTapNode,\n} from '@riverbankcms/blocks';\n\n// Helpers for custom block components\nexport {\n resolveBackground,\n SectionBackground,\n type BackgroundInput,\n type ResolvedBackground,\n type SectionBackgroundProps,\n} from '@riverbankcms/blocks';\n"],"mappings":";;;;;;AAgCA,SAAS,cAAc,mBAAmB,UAAU,uBAAuB;AAiB3E;AAAA,EACE;AAAA,EACA;AAAA,OAIK;","names":[]}
|