@riverbankcms/sdk 0.5.3 → 0.6.1
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 +239 -0
- package/dist/cli/index.js +22 -5
- package/dist/cli/index.js.map +1 -1
- package/dist/client/client.js +1 -1
- package/dist/client/client.js.map +1 -1
- package/dist/client/client.mjs +1 -1
- package/dist/client/client.mjs.map +1 -1
- package/dist/server/{Layout-BClXUTsd.d.mts → Layout-B7cvis7r.d.mts} +3 -3
- package/dist/server/{Layout-UXGjXv8M.d.ts → Layout-wBtJLTVX.d.ts} +3 -3
- package/dist/server/{chunk-VSFQRHYZ.js → chunk-3B364WO2.js} +4 -4
- package/dist/server/chunk-3B364WO2.js.map +1 -0
- package/dist/server/{chunk-5STV4MWD.js → chunk-EIVISR62.js} +112 -27
- package/dist/server/chunk-EIVISR62.js.map +1 -0
- package/dist/server/{chunk-X4STRF2V.mjs → chunk-I7ZR2WO3.mjs} +2 -2
- package/dist/server/{chunk-X4STRF2V.mjs.map → chunk-I7ZR2WO3.mjs.map} +1 -1
- package/dist/server/{chunk-ZSKOHNE7.js → chunk-IVHIQFJH.js} +2 -2
- package/dist/server/{chunk-ZSKOHNE7.js.map → chunk-IVHIQFJH.js.map} +1 -1
- package/dist/server/{chunk-L5EA4FXU.mjs → chunk-XXFF4RVR.mjs} +6 -6
- package/dist/server/chunk-XXFF4RVR.mjs.map +1 -0
- package/dist/server/{chunk-KFLZGNPO.mjs → chunk-YXA4GAAQ.mjs} +113 -28
- package/dist/server/chunk-YXA4GAAQ.mjs.map +1 -0
- package/dist/server/{components-DppHY5oD.d.ts → components-CICSJyp_.d.ts} +1 -1
- package/dist/server/{components-BmaJxgCV.d.mts → components-CMMwDXTW.d.mts} +1 -1
- package/dist/server/components.d.mts +2 -2
- package/dist/server/components.d.ts +2 -2
- package/dist/server/components.js +3 -3
- package/dist/server/components.mjs +2 -2
- package/dist/server/index.js +2 -2
- package/dist/server/index.mjs +1 -1
- package/dist/server/navigation.d.mts +138 -57
- package/dist/server/navigation.d.ts +138 -57
- package/dist/server/navigation.js +6 -2
- package/dist/server/navigation.js.map +1 -1
- package/dist/server/navigation.mjs +9 -5
- package/dist/server/rendering/server.d.mts +1 -1
- package/dist/server/rendering/server.d.ts +1 -1
- package/dist/server/rendering/server.js +3 -3
- package/dist/server/rendering/server.mjs +2 -2
- package/dist/server/rendering.d.mts +3 -3
- package/dist/server/rendering.d.ts +3 -3
- package/dist/server/rendering.js +3 -3
- package/dist/server/rendering.mjs +2 -2
- package/dist/server/server.js +2 -2
- package/dist/server/server.mjs +1 -1
- package/package.json +1 -1
- package/dist/server/chunk-5STV4MWD.js.map +0 -1
- package/dist/server/chunk-KFLZGNPO.mjs.map +0 -1
- package/dist/server/chunk-L5EA4FXU.mjs.map +0 -1
- package/dist/server/chunk-VSFQRHYZ.js.map +0 -1
|
@@ -4,8 +4,8 @@ var _chunkTT5JWA4Xjs = require('../chunk-TT5JWA4X.js');
|
|
|
4
4
|
|
|
5
5
|
|
|
6
6
|
|
|
7
|
-
var
|
|
8
|
-
require('../chunk-
|
|
7
|
+
var _chunk3B364WO2js = require('../chunk-3B364WO2.js');
|
|
8
|
+
require('../chunk-EIVISR62.js');
|
|
9
9
|
require('../chunk-7UPVCT3K.js');
|
|
10
10
|
require('../chunk-RVDS7VSP.js');
|
|
11
11
|
require('../chunk-YYO3RIFO.js');
|
|
@@ -14,5 +14,5 @@ require('../chunk-DGUM43GV.js');
|
|
|
14
14
|
|
|
15
15
|
|
|
16
16
|
|
|
17
|
-
exports.Block = _chunkTT5JWA4Xjs.Block; exports.Layout =
|
|
17
|
+
exports.Block = _chunkTT5JWA4Xjs.Block; exports.Layout = _chunk3B364WO2js.Layout; exports.Page = _chunk3B364WO2js.Page;
|
|
18
18
|
//# sourceMappingURL=server.js.map
|
|
@@ -4,8 +4,8 @@ import {
|
|
|
4
4
|
import {
|
|
5
5
|
Layout,
|
|
6
6
|
Page
|
|
7
|
-
} from "../chunk-
|
|
8
|
-
import "../chunk-
|
|
7
|
+
} from "../chunk-XXFF4RVR.mjs";
|
|
8
|
+
import "../chunk-YXA4GAAQ.mjs";
|
|
9
9
|
import "../chunk-LNOUXALA.mjs";
|
|
10
10
|
import "../chunk-AEFWG657.mjs";
|
|
11
11
|
import "../chunk-BYBJA6SP.mjs";
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
export { d as BlockOverrideComponent, e as BlockOverrideProps, B as BlockOverrides, L as LoadPageParams, a as LoadPageResult, b as Page, P as PageProps, c as PageRenderer, l as loadPage } from './loadPage-B8mQUUSo.mjs';
|
|
2
|
-
export { H as HeaderData, L as Layout, a as LayoutProps } from './Layout-
|
|
2
|
+
export { H as HeaderData, L as Layout, a as LayoutProps } from './Layout-B7cvis7r.mjs';
|
|
3
3
|
export { Block, BlockProps } from './rendering/server.mjs';
|
|
4
4
|
export { C as ContentEntryData, L as LoadContentParams, b as LoadContentResult, a as isEntryContent, i as isPageContent, l as loadContent } from './loadContent-BS-3wesN.mjs';
|
|
5
5
|
export { c as SiteFooterContent, S as SiteHeaderContent, T as Theme } from './types-Dsu9wsUh.mjs';
|
|
6
6
|
export { P as PageOutline } from './schema-Z6-afHJG.mjs';
|
|
7
|
-
import { G as GradientConfig } from './components-
|
|
8
|
-
export { f as BackgroundInput, B as BodyTextContent, H as HeroContent, a as HeroMedia, g as ResolvedBackground, R as RichText, c as RichTextPrimitiveProps, e as SectionBackground, h as SectionBackgroundProps, S as SystemBlockComponentProps, b as buildThemeRuntime, d as resolveBackground, r as resolveImageUrl } from './components-
|
|
7
|
+
import { G as GradientConfig } from './components-CMMwDXTW.mjs';
|
|
8
|
+
export { f as BackgroundInput, B as BodyTextContent, H as HeroContent, a as HeroMedia, g as ResolvedBackground, R as RichText, c as RichTextPrimitiveProps, e as SectionBackground, h as SectionBackgroundProps, S as SystemBlockComponentProps, b as buildThemeRuntime, d as resolveBackground, r as resolveImageUrl } from './components-CMMwDXTW.mjs';
|
|
9
9
|
export { R as RouteMap, a as ThemeTokens } from './core-DsNWrl3o.mjs';
|
|
10
10
|
import { M as Media } from './richTextSchema-DURiozvD.mjs';
|
|
11
11
|
export { T as TipTapNode } from './richTextSchema-DURiozvD.mjs';
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
export { d as BlockOverrideComponent, e as BlockOverrideProps, B as BlockOverrides, L as LoadPageParams, a as LoadPageResult, b as Page, P as PageProps, c as PageRenderer, l as loadPage } from './loadPage-DP3nrHBi.js';
|
|
2
|
-
export { H as HeaderData, L as Layout, a as LayoutProps } from './Layout-
|
|
2
|
+
export { H as HeaderData, L as Layout, a as LayoutProps } from './Layout-wBtJLTVX.js';
|
|
3
3
|
export { Block, BlockProps } from './rendering/server.js';
|
|
4
4
|
export { C as ContentEntryData, L as LoadContentParams, b as LoadContentResult, a as isEntryContent, i as isPageContent, l as loadContent } from './loadContent-Buvmudee.js';
|
|
5
5
|
export { c as SiteFooterContent, S as SiteHeaderContent, T as Theme } from './types-CVykEqXN.js';
|
|
6
6
|
export { P as PageOutline } from './schema-Z6-afHJG.js';
|
|
7
|
-
import { G as GradientConfig } from './components-
|
|
8
|
-
export { f as BackgroundInput, B as BodyTextContent, H as HeroContent, a as HeroMedia, g as ResolvedBackground, R as RichText, c as RichTextPrimitiveProps, e as SectionBackground, h as SectionBackgroundProps, S as SystemBlockComponentProps, b as buildThemeRuntime, d as resolveBackground, r as resolveImageUrl } from './components-
|
|
7
|
+
import { G as GradientConfig } from './components-CICSJyp_.js';
|
|
8
|
+
export { f as BackgroundInput, B as BodyTextContent, H as HeroContent, a as HeroMedia, g as ResolvedBackground, R as RichText, c as RichTextPrimitiveProps, e as SectionBackground, h as SectionBackgroundProps, S as SystemBlockComponentProps, b as buildThemeRuntime, d as resolveBackground, r as resolveImageUrl } from './components-CICSJyp_.js';
|
|
9
9
|
export { R as RouteMap, a as ThemeTokens } from './core-DsNWrl3o.js';
|
|
10
10
|
import { M as Media } from './richTextSchema-DURiozvD.js';
|
|
11
11
|
export { T as TipTapNode } from './richTextSchema-DURiozvD.js';
|
package/dist/server/rendering.js
CHANGED
|
@@ -12,8 +12,8 @@ var _chunkTT5JWA4Xjs = require('./chunk-TT5JWA4X.js');
|
|
|
12
12
|
|
|
13
13
|
|
|
14
14
|
|
|
15
|
-
var
|
|
16
|
-
require('./chunk-
|
|
15
|
+
var _chunk3B364WO2js = require('./chunk-3B364WO2.js');
|
|
16
|
+
require('./chunk-EIVISR62.js');
|
|
17
17
|
|
|
18
18
|
|
|
19
19
|
|
|
@@ -40,5 +40,5 @@ require('./chunk-DGUM43GV.js');
|
|
|
40
40
|
|
|
41
41
|
|
|
42
42
|
|
|
43
|
-
exports.Block = _chunkTT5JWA4Xjs.Block; exports.Layout =
|
|
43
|
+
exports.Block = _chunkTT5JWA4Xjs.Block; exports.Layout = _chunk3B364WO2js.Layout; exports.Page = _chunk3B364WO2js.Page; exports.PageRenderer = _chunk7UPVCT3Kjs.PageRenderer; exports.RichText = _chunk7UPVCT3Kjs.RichText; exports.SectionBackground = _chunk7UPVCT3Kjs.SectionBackground; exports.buildThemeRuntime = _chunk7UPVCT3Kjs.buildThemeRuntime; exports.isEntryContent = _chunkI2D7KOEAjs.isEntryContent; exports.isPageContent = _chunkI2D7KOEAjs.isPageContent; exports.loadContent = _chunkI2D7KOEAjs.loadContent; exports.loadPage = _chunkP3NNN73Gjs.loadPage; exports.resolveBackground = _chunk7UPVCT3Kjs.resolveBackground; exports.resolveImageUrl = _chunk7UPVCT3Kjs.resolveImageUrl;
|
|
44
44
|
//# sourceMappingURL=rendering.js.map
|
package/dist/server/server.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";Object.defineProperty(exports, "__esModule", {value: true});
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var _chunkIVHIQFJHjs = require('./chunk-IVHIQFJH.js');
|
|
4
4
|
|
|
5
5
|
|
|
6
6
|
|
|
@@ -19,5 +19,5 @@ require('./chunk-DGUM43GV.js');
|
|
|
19
19
|
|
|
20
20
|
|
|
21
21
|
|
|
22
|
-
exports.createRiverbankClient =
|
|
22
|
+
exports.createRiverbankClient = _chunkIVHIQFJHjs.createRiverbankClient; exports.isEntryContent = _chunkI2D7KOEAjs.isEntryContent; exports.isPageContent = _chunkI2D7KOEAjs.isPageContent; exports.loadContent = _chunkI2D7KOEAjs.loadContent; exports.loadPage = _chunkP3NNN73Gjs.loadPage;
|
|
23
23
|
//# sourceMappingURL=server.js.map
|
package/dist/server/server.mjs
CHANGED
package/package.json
CHANGED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/will/Projects/Business/cms/builder/packages/sdk/dist/server/chunk-5STV4MWD.js","../../src/navigation/index.ts"],"names":[],"mappings":"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","file":"/Users/will/Projects/Business/cms/builder/packages/sdk/dist/server/chunk-5STV4MWD.js","sourcesContent":[null,"/**\n * Navigation helper utilities for SDK sites.\n *\n * Provides helpers to transform CMS navigation data into render-ready structures.\n * Supports both simple NavItem arrays and full MenuViewModels for block rendering.\n *\n * @example Simple usage\n * ```ts\n * import { getPrimaryNavItems } from '@riverbankcms/sdk/navigation';\n *\n * const headerNav = getPrimaryNavItems(siteData.navigation);\n * // [{ href: '/', label: 'Home', isExternal: false }, ...]\n * ```\n *\n * @example Block rendering usage\n * ```ts\n * import { buildMenuViewModel, buildLogoViewModel } from '@riverbankcms/sdk/navigation';\n *\n * const menu = buildMenuViewModel(siteData.navigation);\n * const logo = buildLogoViewModel(siteData.layout.logo, siteData.site.title);\n *\n * renderBlock(siteHeaderManifest, layout.header, {\n * viewModelOverrides: { menu, content: { logo } },\n * });\n * ```\n *\n * @packageDocumentation\n */\n\nimport type { NavigationMenuWithItems, NavigationItemRecord, LinkPayload } from '@riverbankcms/api';\nimport type { RouteMap } from '@riverbankcms/blocks';\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Types for block rendering\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Link value types matching @riverbankcms/blocks\n */\nexport type InternalLinkValue = {\n kind: 'internal';\n routeId: string;\n entityId: string;\n entityType: 'page' | 'content';\n href: string;\n title: string;\n typeLabel: string;\n contentTypeKey?: string | null;\n contentTypeName?: string | null;\n updatedAt?: string | null;\n};\n\nexport type ExternalLinkValue = {\n kind: 'external';\n href: string;\n};\n\nexport type CustomLinkValue = {\n kind: 'url';\n href: string;\n};\n\nexport type LinkValue = InternalLinkValue | ExternalLinkValue | CustomLinkValue;\n\n/**\n * Menu link view model for block rendering\n */\nexport type MenuLinkViewModel = {\n id: string;\n label: string;\n link: LinkValue | null;\n target: string | null;\n rel: string | null;\n active?: boolean;\n};\n\n/**\n * CTA link view model (extends MenuLinkViewModel with variant)\n */\nexport type MenuCtaViewModel = MenuLinkViewModel & {\n variant: string;\n};\n\n/**\n * Complete menu view model for header/footer blocks\n */\nexport type MenuViewModel = {\n items: MenuLinkViewModel[];\n ctaItem: MenuCtaViewModel | null;\n};\n\n/**\n * Logo source data from site layout\n */\nexport type LogoSource = {\n url: string | null;\n alt: string | null;\n assetId?: string | null;\n width?: number | null;\n height?: number | null;\n storagePath?: string | null;\n storageBucket?: string | null;\n} | null;\n\n/**\n * Logo view model for block rendering\n */\nexport type LogoViewModel = {\n type: 'image';\n src: string;\n alt: string;\n assetId?: string;\n width?: number | null;\n height?: number | null;\n storagePath?: string;\n storageBucket?: string;\n} | null;\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Simple NavItem type for basic usage\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * A simplified navigation item structure for component rendering.\n */\nexport type NavItem = {\n /** The URL to navigate to */\n href: string;\n /** Display text for the navigation link */\n label: string;\n /** Whether link should open in new tab (external links) */\n isExternal: boolean;\n};\n\n/**\n * Simple nav link with pre-resolved href for block rendering.\n */\nexport type SimpleNavLink = {\n id: string;\n label: string;\n href: string;\n isExternal: boolean;\n};\n\n/**\n * Simple menu view model with pre-resolved hrefs.\n * Use this instead of MenuViewModel for cleaner data flow.\n */\nexport type SimpleMenuViewModel = {\n items: SimpleNavLink[];\n ctaItem: SimpleNavLink | null;\n};\n\n/**\n * Simple logo data for block rendering.\n */\nexport type SimpleLogo = {\n type: 'image';\n src: string;\n alt: string;\n width?: number;\n height?: number;\n} | null;\n\n// RouteMap type is imported from @riverbankcms/blocks for consistency\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Menu selection helpers\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Get the primary navigation menu object.\n * Returns menu marked as isPrimary, or first menu if none marked.\n *\n * @example\n * ```ts\n * const menu = getPrimaryNavigation(siteData.navigation);\n * console.log(menu?.title); // \"Main Navigation\"\n * ```\n */\nexport function getPrimaryNavigation(\n navigation: NavigationMenuWithItems[],\n): NavigationMenuWithItems | null {\n if (!navigation || navigation.length === 0) return null;\n // navigation.length > 0 is guaranteed above, so [0] exists\n return navigation.find((menu) => menu.isPrimary) ?? navigation[0] ?? null;\n}\n\n/**\n * Get a navigation menu by name/slug.\n *\n * @example\n * ```ts\n * const footerMenu = getNavigationBySlug(siteData.navigation, 'footer');\n * ```\n */\nexport function getNavigationBySlug(\n navigation: NavigationMenuWithItems[],\n slug: string,\n): NavigationMenuWithItems | null {\n if (!navigation || navigation.length === 0) return null;\n return navigation.find((menu) => menu.name === slug) ?? null;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Simple NavItem[] transformations\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Get nav items from the primary menu (marked isPrimary, or first menu).\n * Returns empty array if no navigation configured.\n *\n * @example\n * ```ts\n * const headerNav = getPrimaryNavItems(siteData.navigation);\n * // [{ href: '/', label: 'Home', isExternal: false }, ...]\n * ```\n */\nexport function getPrimaryNavItems(navigation: NavigationMenuWithItems[]): NavItem[] {\n return transformToNavItems(getPrimaryNavigation(navigation));\n}\n\n/**\n * Get nav items from a specific menu by slug.\n * Useful for footer nav, secondary nav, etc.\n * Returns empty array if menu not found.\n *\n * @example\n * ```ts\n * const footerNav = getNavItemsBySlug(siteData.navigation, 'footer');\n * ```\n */\nexport function getNavItemsBySlug(navigation: NavigationMenuWithItems[], slug: string): NavItem[] {\n return transformToNavItems(getNavigationBySlug(navigation, slug));\n}\n\n/**\n * Transform a menu into simple NavItem array.\n */\nexport function transformToNavItems(menu: NavigationMenuWithItems | null): NavItem[] {\n if (!menu?.items || menu.items.length === 0) return [];\n\n return menu.items\n .filter((item) => !item.parentId && item.urlType !== 'dropdown')\n .sort((a, b) => (a.orderIndex ?? 0) - (b.orderIndex ?? 0))\n .map((item) => ({\n label: item.label,\n href: extractHref(item),\n isExternal: isExternalLink(item),\n }))\n .filter((item): item is NavItem => Boolean(item.href));\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Full MenuViewModel for block rendering\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Build a MenuViewModel from navigation data for block rendering.\n * Extracts CTA item separately and preserves full link data.\n *\n * @example\n * ```ts\n * const menuViewModel = buildMenuViewModel(siteData.navigation);\n *\n * renderBlock(siteHeaderManifest, layout.header, {\n * viewModelOverrides: { menu: menuViewModel },\n * });\n * ```\n */\nexport function buildMenuViewModel(navigation: NavigationMenuWithItems[]): MenuViewModel {\n const menu = getPrimaryNavigation(navigation);\n\n if (!menu) {\n return { items: [], ctaItem: null };\n }\n\n const flatItems = menu.items\n .filter((item) => !item.parentId && item.urlType !== 'dropdown')\n .sort((a, b) => (a.orderIndex ?? 0) - (b.orderIndex ?? 0));\n\n const items: MenuLinkViewModel[] = [];\n let ctaItem: MenuCtaViewModel | null = null;\n\n for (const item of flatItems) {\n const viewItem: MenuLinkViewModel = {\n id: item.id,\n label: item.label,\n link: convertToLinkValue(item),\n target: null,\n rel: null,\n active: false,\n };\n\n // Extract first CTA item separately\n if (!ctaItem && Boolean(item.isCta)) {\n ctaItem = { ...viewItem, variant: 'primary' };\n continue;\n }\n\n items.push(viewItem);\n }\n\n return { items, ctaItem };\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Logo view model helper\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Build a LogoViewModel from site layout data.\n *\n * @param logo - Logo source from siteData.layout.logo\n * @param fallbackTitle - Site title to use as alt text fallback\n *\n * @example\n * ```ts\n * const logoViewModel = buildLogoViewModel(siteData.layout.logo, siteData.site.title);\n *\n * renderBlock(siteHeaderManifest, layout.header, {\n * viewModelOverrides: { content: { logo: logoViewModel } },\n * });\n * ```\n */\nexport function buildLogoViewModel(\n logo: LogoSource,\n fallbackTitle: string | null | undefined,\n): LogoViewModel {\n if (!logo) {\n return null;\n }\n\n // Logo must have storagePath (for direct Supabase URL) or explicit url\n if (!logo.url && !logo.storagePath) {\n return null;\n }\n\n const alt = logo.alt && logo.alt.trim().length > 0 ? logo.alt : fallbackTitle ?? 'Site logo';\n\n return {\n type: 'image',\n src: logo.url ?? '', // Empty when using storagePath - MediaNode builds direct URL\n alt,\n assetId: logo.assetId ?? undefined,\n width: logo.width ?? undefined,\n height: logo.height ?? undefined,\n storagePath: logo.storagePath ?? undefined,\n storageBucket: logo.storageBucket ?? undefined,\n };\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Internal helpers\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Extracts the href from a navigation item's url field.\n */\nfunction extractHref(item: NavigationItemRecord): string {\n const link = item.url as LinkPayload | null | undefined;\n if (!link || typeof link !== 'object' || !('href' in link)) return '';\n return link.href;\n}\n\n/**\n * Determines if a navigation item's link is external.\n */\nfunction isExternalLink(item: NavigationItemRecord): boolean {\n const link = item.url as LinkPayload | null | undefined;\n if (!link || typeof link !== 'object' || !('kind' in link)) return false;\n return link.kind === 'external';\n}\n\n/**\n * Convert navigation item to LinkValue for block rendering.\n */\nfunction convertToLinkValue(item: NavigationItemRecord): LinkValue | null {\n const payload = item.url as Record<string, unknown> | null;\n if (!payload) return null;\n\n const kind = typeof payload.kind === 'string' ? payload.kind : null;\n\n if (kind === 'external' || kind === 'url') {\n const href = typeof payload.href === 'string' ? payload.href : null;\n return href ? { kind, href } as ExternalLinkValue | CustomLinkValue : null;\n }\n\n if (kind === 'internal') {\n const routeId = typeof payload.routeId === 'string' ? payload.routeId : null;\n const entityId = typeof payload.entityId === 'string' ? payload.entityId : null;\n const entityType = payload.entityType === 'page' || payload.entityType === 'content'\n ? payload.entityType\n : null;\n const href = typeof payload.href === 'string' ? payload.href : null;\n const title = typeof payload.title === 'string' ? payload.title : null;\n const typeLabel = typeof payload.typeLabel === 'string' ? payload.typeLabel : null;\n\n if (!routeId || !entityId || !entityType || !href || !title || !typeLabel) {\n return null;\n }\n\n return {\n kind: 'internal',\n routeId,\n entityId,\n entityType,\n href,\n title,\n typeLabel,\n contentTypeKey: typeof payload.contentTypeKey === 'string' ? payload.contentTypeKey : null,\n contentTypeName: typeof payload.contentTypeName === 'string' ? payload.contentTypeName : null,\n updatedAt: typeof payload.updatedAt === 'string' ? payload.updatedAt : null,\n };\n }\n\n return null;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Simple pre-resolved menu/logo helpers\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Build a SimpleMenuViewModel from navigation data with pre-resolved hrefs.\n * Use this instead of buildMenuViewModel for cleaner data flow.\n *\n * @param navigation - Navigation menus from site data\n * @param routes - Route map for resolving internal links\n *\n * @example\n * ```ts\n * const menu = buildSimpleMenu(siteData.navigation, siteData.routes);\n * // { items: [{ id, label, href: '/', isExternal: false }], cta: null }\n * ```\n */\nexport function buildSimpleMenu(\n navigation: NavigationMenuWithItems[],\n routes: RouteMap,\n): SimpleMenuViewModel {\n const menu = getPrimaryNavigation(navigation);\n\n if (!menu) {\n return { items: [], ctaItem: null };\n }\n\n const flatItems = menu.items\n .filter((item) => !item.parentId && item.urlType !== 'dropdown')\n .sort((a, b) => (a.orderIndex ?? 0) - (b.orderIndex ?? 0));\n\n const items: SimpleNavLink[] = [];\n let ctaItem: SimpleNavLink | null = null;\n\n for (const item of flatItems) {\n const link = item.url as LinkPayload | null;\n const href = resolveHref(link, routes);\n\n if (!href) continue;\n\n const navLink: SimpleNavLink = {\n id: item.id,\n label: item.label,\n href,\n isExternal: link?.kind === 'external',\n };\n\n // Extract first CTA item separately\n if (!ctaItem && Boolean(item.isCta)) {\n ctaItem = navLink;\n continue;\n }\n\n items.push(navLink);\n }\n\n return { items, ctaItem };\n}\n\n/**\n * Resolve href from a link payload using route map.\n * @internal\n */\nfunction resolveHref(link: LinkPayload | null, routes: RouteMap): string | null {\n if (!link) return null;\n\n // External or custom URL links - use href directly\n if (link.kind === 'external' || link.kind === 'url') {\n return link.href || null;\n }\n\n // Internal link - resolve from route map\n if (link.kind === 'internal' && link.routeId) {\n const route = routes[link.routeId];\n if (route) {\n if (typeof route === 'string') {\n return route;\n }\n // Try path first, then href, then draftPath\n return route.path ?? route.href ?? route.draftPath ?? link.href ?? null;\n }\n // Fall back to link.href if route not found\n return link.href ?? null;\n }\n\n return null;\n}\n\n/**\n * Build a SimpleLogo from site layout data.\n *\n * @param logo - Logo data from site layout\n * @param fallbackAlt - Fallback alt text (usually site title)\n *\n * @example\n * ```ts\n * const logo = buildSimpleLogo(siteData.layout.logo, siteData.site.title);\n * // { src: 'https://...', alt: 'Site Name', width: 200, height: 50 }\n * ```\n */\nexport function buildSimpleLogo(\n logo: { url?: string | null; alt?: string | null; width?: number | null; height?: number | null } | null,\n fallbackAlt: string | null | undefined,\n): SimpleLogo {\n if (!logo || !logo.url) {\n return null;\n }\n\n const alt = logo.alt && logo.alt.trim().length > 0 ? logo.alt : (fallbackAlt ?? 'Site logo');\n\n const result: NonNullable<SimpleLogo> = {\n type: 'image',\n src: logo.url,\n alt,\n };\n\n if (logo.width != null) {\n result.width = logo.width;\n }\n if (logo.height != null) {\n result.height = logo.height;\n }\n\n return result;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Deprecated aliases (for backwards compatibility during migration)\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * @deprecated Use `transformToNavItems` instead.\n * This alias is maintained for backwards compatibility only.\n */\nexport const transformNavItems = transformToNavItems;\n\n/**\n * @deprecated Use `getPrimaryNavigation` instead.\n * This alias is maintained for backwards compatibility only.\n */\nexport const selectPrimaryMenu = getPrimaryNavigation;\n\n// Re-export types for convenience\nexport type { NavigationMenuWithItems, NavigationItemRecord, LinkPayload } from '@riverbankcms/api';\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/navigation/index.ts"],"sourcesContent":["/**\n * Navigation helper utilities for SDK sites.\n *\n * Provides helpers to transform CMS navigation data into render-ready structures.\n * Supports both simple NavItem arrays and full MenuViewModels for block rendering.\n *\n * @example Simple usage\n * ```ts\n * import { getPrimaryNavItems } from '@riverbankcms/sdk/navigation';\n *\n * const headerNav = getPrimaryNavItems(siteData.navigation);\n * // [{ href: '/', label: 'Home', isExternal: false }, ...]\n * ```\n *\n * @example Block rendering usage\n * ```ts\n * import { buildMenuViewModel, buildLogoViewModel } from '@riverbankcms/sdk/navigation';\n *\n * const menu = buildMenuViewModel(siteData.navigation);\n * const logo = buildLogoViewModel(siteData.layout.logo, siteData.site.title);\n *\n * renderBlock(siteHeaderManifest, layout.header, {\n * viewModelOverrides: { menu, content: { logo } },\n * });\n * ```\n *\n * @packageDocumentation\n */\n\nimport type { NavigationMenuWithItems, NavigationItemRecord, LinkPayload } from '@riverbankcms/api';\nimport type { RouteMap } from '@riverbankcms/blocks';\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Types for block rendering\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Link value types matching @riverbankcms/blocks\n */\nexport type InternalLinkValue = {\n kind: 'internal';\n routeId: string;\n entityId: string;\n entityType: 'page' | 'content';\n href: string;\n title: string;\n typeLabel: string;\n contentTypeKey?: string | null;\n contentTypeName?: string | null;\n updatedAt?: string | null;\n};\n\nexport type ExternalLinkValue = {\n kind: 'external';\n href: string;\n};\n\nexport type CustomLinkValue = {\n kind: 'url';\n href: string;\n};\n\nexport type LinkValue = InternalLinkValue | ExternalLinkValue | CustomLinkValue;\n\n/**\n * Menu link view model for block rendering\n */\nexport type MenuLinkViewModel = {\n id: string;\n label: string;\n link: LinkValue | null;\n target: string | null;\n rel: string | null;\n active?: boolean;\n};\n\n/**\n * CTA link view model (extends MenuLinkViewModel with variant)\n */\nexport type MenuCtaViewModel = MenuLinkViewModel & {\n variant: string;\n};\n\n/**\n * Complete menu view model for header/footer blocks\n */\nexport type MenuViewModel = {\n items: MenuLinkViewModel[];\n ctaItem: MenuCtaViewModel | null;\n};\n\n/**\n * Logo source data from site layout\n */\nexport type LogoSource = {\n url: string | null;\n alt: string | null;\n assetId?: string | null;\n width?: number | null;\n height?: number | null;\n storagePath?: string | null;\n storageBucket?: string | null;\n} | null;\n\n/**\n * Logo view model for block rendering\n */\nexport type LogoViewModel = {\n type: 'image';\n src: string;\n alt: string;\n assetId?: string;\n width?: number | null;\n height?: number | null;\n storagePath?: string;\n storageBucket?: string;\n} | null;\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Simple NavItem type for basic usage\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * A simplified navigation item structure for component rendering.\n */\nexport type NavItem = {\n /** The URL to navigate to */\n href: string;\n /** Display text for the navigation link */\n label: string;\n /** Whether link should open in new tab (external links) */\n isExternal: boolean;\n};\n\n/**\n * Simple nav link with pre-resolved href for block rendering.\n */\nexport type SimpleNavLink = {\n id: string;\n label: string;\n href: string;\n isExternal: boolean;\n};\n\n/**\n * Simple menu view model with pre-resolved hrefs.\n * Use this instead of MenuViewModel for cleaner data flow.\n */\nexport type SimpleMenuViewModel = {\n items: SimpleNavLink[];\n ctaItem: SimpleNavLink | null;\n};\n\n/**\n * Simple logo data for block rendering.\n */\nexport type SimpleLogo = {\n type: 'image';\n src: string;\n alt: string;\n width?: number;\n height?: number;\n} | null;\n\n// RouteMap type is imported from @riverbankcms/blocks for consistency\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Menu selection helpers\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Get the primary navigation menu object.\n * Returns menu marked as isPrimary, or first menu if none marked.\n *\n * @example\n * ```ts\n * const menu = getPrimaryNavigation(siteData.navigation);\n * console.log(menu?.title); // \"Main Navigation\"\n * ```\n */\nexport function getPrimaryNavigation(\n navigation: NavigationMenuWithItems[],\n): NavigationMenuWithItems | null {\n if (!navigation || navigation.length === 0) return null;\n // navigation.length > 0 is guaranteed above, so [0] exists\n return navigation.find((menu) => menu.isPrimary) ?? navigation[0] ?? null;\n}\n\n/**\n * Get a navigation menu by name/slug.\n *\n * @example\n * ```ts\n * const footerMenu = getNavigationBySlug(siteData.navigation, 'footer');\n * ```\n */\nexport function getNavigationBySlug(\n navigation: NavigationMenuWithItems[],\n slug: string,\n): NavigationMenuWithItems | null {\n if (!navigation || navigation.length === 0) return null;\n return navigation.find((menu) => menu.name === slug) ?? null;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Simple NavItem[] transformations\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Get nav items from the primary menu (marked isPrimary, or first menu).\n * Returns empty array if no navigation configured.\n *\n * @example\n * ```ts\n * const headerNav = getPrimaryNavItems(siteData.navigation);\n * // [{ href: '/', label: 'Home', isExternal: false }, ...]\n * ```\n */\nexport function getPrimaryNavItems(navigation: NavigationMenuWithItems[]): NavItem[] {\n return transformToNavItems(getPrimaryNavigation(navigation));\n}\n\n/**\n * Get nav items from a specific menu by slug.\n * Useful for footer nav, secondary nav, etc.\n * Returns empty array if menu not found.\n *\n * @example\n * ```ts\n * const footerNav = getNavItemsBySlug(siteData.navigation, 'footer');\n * ```\n */\nexport function getNavItemsBySlug(navigation: NavigationMenuWithItems[], slug: string): NavItem[] {\n return transformToNavItems(getNavigationBySlug(navigation, slug));\n}\n\n/**\n * Transform a menu into simple NavItem array.\n */\nexport function transformToNavItems(menu: NavigationMenuWithItems | null): NavItem[] {\n if (!menu?.items || menu.items.length === 0) return [];\n\n return menu.items\n .filter((item) => !item.parentId && item.urlType !== 'dropdown')\n .sort((a, b) => (a.orderIndex ?? 0) - (b.orderIndex ?? 0))\n .map((item) => ({\n label: item.label,\n href: extractHref(item),\n isExternal: isExternalLink(item),\n }))\n .filter((item): item is NavItem => Boolean(item.href));\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Full MenuViewModel for block rendering\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Build a MenuViewModel from navigation data for block rendering.\n * Extracts CTA item separately and preserves full link data.\n *\n * @example\n * ```ts\n * const menuViewModel = buildMenuViewModel(siteData.navigation);\n *\n * renderBlock(siteHeaderManifest, layout.header, {\n * viewModelOverrides: { menu: menuViewModel },\n * });\n * ```\n */\nexport function buildMenuViewModel(navigation: NavigationMenuWithItems[]): MenuViewModel {\n const menu = getPrimaryNavigation(navigation);\n\n if (!menu) {\n return { items: [], ctaItem: null };\n }\n\n const flatItems = menu.items\n .filter((item) => !item.parentId && item.urlType !== 'dropdown')\n .sort((a, b) => (a.orderIndex ?? 0) - (b.orderIndex ?? 0));\n\n const items: MenuLinkViewModel[] = [];\n let ctaItem: MenuCtaViewModel | null = null;\n\n for (const item of flatItems) {\n const viewItem: MenuLinkViewModel = {\n id: item.id,\n label: item.label,\n link: convertToLinkValue(item),\n target: null,\n rel: null,\n active: false,\n };\n\n // Extract first CTA item separately\n if (!ctaItem && Boolean(item.isCta)) {\n ctaItem = { ...viewItem, variant: 'primary' };\n continue;\n }\n\n items.push(viewItem);\n }\n\n return { items, ctaItem };\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Logo view model helper\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Build a LogoViewModel from site layout data.\n *\n * @param logo - Logo source from siteData.layout.logo\n * @param fallbackTitle - Site title to use as alt text fallback\n *\n * @example\n * ```ts\n * const logoViewModel = buildLogoViewModel(siteData.layout.logo, siteData.site.title);\n *\n * renderBlock(siteHeaderManifest, layout.header, {\n * viewModelOverrides: { content: { logo: logoViewModel } },\n * });\n * ```\n */\nexport function buildLogoViewModel(\n logo: LogoSource,\n fallbackTitle: string | null | undefined,\n): LogoViewModel {\n if (!logo) {\n return null;\n }\n\n // Logo must have storagePath (for direct Supabase URL) or explicit url\n if (!logo.url && !logo.storagePath) {\n return null;\n }\n\n const alt = logo.alt && logo.alt.trim().length > 0 ? logo.alt : fallbackTitle ?? 'Site logo';\n\n return {\n type: 'image',\n src: logo.url ?? '', // Empty when using storagePath - MediaNode builds direct URL\n alt,\n assetId: logo.assetId ?? undefined,\n width: logo.width ?? undefined,\n height: logo.height ?? undefined,\n storagePath: logo.storagePath ?? undefined,\n storageBucket: logo.storageBucket ?? undefined,\n };\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Internal helpers\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Extracts the href from a navigation item's url field.\n */\nfunction extractHref(item: NavigationItemRecord): string {\n const link = item.url as LinkPayload | null | undefined;\n if (!link || typeof link !== 'object' || !('href' in link)) return '';\n return link.href;\n}\n\n/**\n * Determines if a navigation item's link is external.\n */\nfunction isExternalLink(item: NavigationItemRecord): boolean {\n const link = item.url as LinkPayload | null | undefined;\n if (!link || typeof link !== 'object' || !('kind' in link)) return false;\n return link.kind === 'external';\n}\n\n/**\n * Convert navigation item to LinkValue for block rendering.\n */\nfunction convertToLinkValue(item: NavigationItemRecord): LinkValue | null {\n const payload = item.url as Record<string, unknown> | null;\n if (!payload) return null;\n\n const kind = typeof payload.kind === 'string' ? payload.kind : null;\n\n if (kind === 'external' || kind === 'url') {\n const href = typeof payload.href === 'string' ? payload.href : null;\n return href ? { kind, href } as ExternalLinkValue | CustomLinkValue : null;\n }\n\n if (kind === 'internal') {\n const routeId = typeof payload.routeId === 'string' ? payload.routeId : null;\n const entityId = typeof payload.entityId === 'string' ? payload.entityId : null;\n const entityType = payload.entityType === 'page' || payload.entityType === 'content'\n ? payload.entityType\n : null;\n const href = typeof payload.href === 'string' ? payload.href : null;\n const title = typeof payload.title === 'string' ? payload.title : null;\n const typeLabel = typeof payload.typeLabel === 'string' ? payload.typeLabel : null;\n\n if (!routeId || !entityId || !entityType || !href || !title || !typeLabel) {\n return null;\n }\n\n return {\n kind: 'internal',\n routeId,\n entityId,\n entityType,\n href,\n title,\n typeLabel,\n contentTypeKey: typeof payload.contentTypeKey === 'string' ? payload.contentTypeKey : null,\n contentTypeName: typeof payload.contentTypeName === 'string' ? payload.contentTypeName : null,\n updatedAt: typeof payload.updatedAt === 'string' ? payload.updatedAt : null,\n };\n }\n\n return null;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Simple pre-resolved menu/logo helpers\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Build a SimpleMenuViewModel from navigation data with pre-resolved hrefs.\n * Use this instead of buildMenuViewModel for cleaner data flow.\n *\n * @param navigation - Navigation menus from site data\n * @param routes - Route map for resolving internal links\n *\n * @example\n * ```ts\n * const menu = buildSimpleMenu(siteData.navigation, siteData.routes);\n * // { items: [{ id, label, href: '/', isExternal: false }], cta: null }\n * ```\n */\nexport function buildSimpleMenu(\n navigation: NavigationMenuWithItems[],\n routes: RouteMap,\n): SimpleMenuViewModel {\n const menu = getPrimaryNavigation(navigation);\n\n if (!menu) {\n return { items: [], ctaItem: null };\n }\n\n const flatItems = menu.items\n .filter((item) => !item.parentId && item.urlType !== 'dropdown')\n .sort((a, b) => (a.orderIndex ?? 0) - (b.orderIndex ?? 0));\n\n const items: SimpleNavLink[] = [];\n let ctaItem: SimpleNavLink | null = null;\n\n for (const item of flatItems) {\n const link = item.url as LinkPayload | null;\n const href = resolveHref(link, routes);\n\n if (!href) continue;\n\n const navLink: SimpleNavLink = {\n id: item.id,\n label: item.label,\n href,\n isExternal: link?.kind === 'external',\n };\n\n // Extract first CTA item separately\n if (!ctaItem && Boolean(item.isCta)) {\n ctaItem = navLink;\n continue;\n }\n\n items.push(navLink);\n }\n\n return { items, ctaItem };\n}\n\n/**\n * Resolve href from a link payload using route map.\n * @internal\n */\nfunction resolveHref(link: LinkPayload | null, routes: RouteMap): string | null {\n if (!link) return null;\n\n // External or custom URL links - use href directly\n if (link.kind === 'external' || link.kind === 'url') {\n return link.href || null;\n }\n\n // Internal link - resolve from route map\n if (link.kind === 'internal' && link.routeId) {\n const route = routes[link.routeId];\n if (route) {\n if (typeof route === 'string') {\n return route;\n }\n // Try path first, then href, then draftPath\n return route.path ?? route.href ?? route.draftPath ?? link.href ?? null;\n }\n // Fall back to link.href if route not found\n return link.href ?? null;\n }\n\n return null;\n}\n\n/**\n * Build a SimpleLogo from site layout data.\n *\n * @param logo - Logo data from site layout\n * @param fallbackAlt - Fallback alt text (usually site title)\n *\n * @example\n * ```ts\n * const logo = buildSimpleLogo(siteData.layout.logo, siteData.site.title);\n * // { src: 'https://...', alt: 'Site Name', width: 200, height: 50 }\n * ```\n */\nexport function buildSimpleLogo(\n logo: { url?: string | null; alt?: string | null; width?: number | null; height?: number | null } | null,\n fallbackAlt: string | null | undefined,\n): SimpleLogo {\n if (!logo || !logo.url) {\n return null;\n }\n\n const alt = logo.alt && logo.alt.trim().length > 0 ? logo.alt : (fallbackAlt ?? 'Site logo');\n\n const result: NonNullable<SimpleLogo> = {\n type: 'image',\n src: logo.url,\n alt,\n };\n\n if (logo.width != null) {\n result.width = logo.width;\n }\n if (logo.height != null) {\n result.height = logo.height;\n }\n\n return result;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Deprecated aliases (for backwards compatibility during migration)\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * @deprecated Use `transformToNavItems` instead.\n * This alias is maintained for backwards compatibility only.\n */\nexport const transformNavItems = transformToNavItems;\n\n/**\n * @deprecated Use `getPrimaryNavigation` instead.\n * This alias is maintained for backwards compatibility only.\n */\nexport const selectPrimaryMenu = getPrimaryNavigation;\n\n// Re-export types for convenience\nexport type { NavigationMenuWithItems, NavigationItemRecord, LinkPayload } from '@riverbankcms/api';\n"],"mappings":"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","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/rendering/components/Page.tsx","../../src/rendering/components/Layout.tsx"],"sourcesContent":["/**\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 * Supabase storage URL for direct image access.\n * SDK sites receive this from the API instead of requiring NEXT_PUBLIC_SUPABASE_URL env var.\n */\n supabaseUrl?: string;\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 supabaseUrl,\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 supabaseUrl,\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 { buildSimpleMenu, buildSimpleLogo } from '../../navigation';\nimport type { RiverbankClient, SiteResponse } from '../../client/types';\n\nexport type HeaderData = {\n menu: ReturnType<typeof buildSimpleMenu>;\n logo: ReturnType<typeof buildSimpleLogo>;\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 = buildSimpleMenu(navigation, routes);\n const logoViewModel = buildSimpleLogo(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"],"mappings":";;;;;;;;;;;;;;;AA+II;AAzBG,SAAS,KAAK;AAAA,EACnB;AAAA,EACA;AAAA,EACA,aAAa;AAAA,EACb;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,kBAAkB;AAAA,EAClB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAc;AAEZ,QAAM,aAAa,kBAAkB,kBAAkB,KAAK,EAAE;AAI9D,QAAM,cAAc,WAAW,OAAO,UAClC,EAAE,GAAG,YAAY,SAAS,EAAE,GAAG,WAAW,SAAS,GAAG,UAAU,MAAM,QAAQ,EAAE,IAChF;AAEJ,SACE;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,aAAa;AAAA,QACX;AAAA,QACA;AAAA,QACA,QAAQ;AAAA,QACR,mBAAmB,aAAa,qBAAqB;AAAA,QACrD,cAAc,aAAa,gBAAgB;AAAA,QAC3C;AAAA,MACF;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,EACF;AAEJ;;;ACxBI;AAjFJ,eAAsB,OAAO;AAAA,EAC3B,UAAU;AAAA,EACV;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,SAAS;AAAA,EACT,SAAS;AAAA,EACT;AACF,GAAgB;AAEd,MAAI,WAAW;AACf,MAAI,CAAC,UAAU;AACb,QAAI,CAAC,QAAQ;AACX,YAAM,IAAI,MAAM,gDAAgD;AAAA,IAClE;AACA,QAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,QAAQ;AAC/B,YAAM,IAAI,MAAM,gEAAgE;AAAA,IAClF;AAEA,eAAW,MAAM,OAAO,QAAQ,EAAE,IAAI,QAAQ,MAAM,OAAO,CAAC;AAAA,EAC9D;AAEA,QAAM,EAAE,MAAM,OAAO,YAAY,QAAQ,OAAO,IAAI;AACpD,QAAM,eAAe,kBAAkB,KAAK;AAG5C,QAAM,gBAAgB,gBAAgB,YAAY,MAAM;AACxD,QAAM,gBAAgB,gBAAgB,OAAO,QAAQ,MAAM,KAAK,KAAK;AAGrE,QAAM,aAAyB;AAAA,IAC7B,MAAM;AAAA,IACN,MAAM;AAAA,IACN;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAGA,QAAM,gBAAgB,gBAClB,EAAE,GAAG,OAAO,QAAQ,SAAS,cAAc,IAC3C,OAAO;AAGX,QAAM,mBAAmB,gBACrB;AAAA,IACE,GAAG;AAAA,IACH,QAAQ,EAAE,GAAG,MAAM,QAAQ,SAAS,cAAc;AAAA,EACpD,IACA;AAEJ,QAAM,qBAAqB;AAAA,IACzB,OAAO;AAAA,MACL,QAAQ,KAAK;AAAA,MACb;AAAA,MACA,OAAO;AAAA,IACT;AAAA,IACA;AAAA,IACA,MAAM;AAAA,IACN,SAAS;AAAA,MACP,MAAM;AAAA,IACR;AAAA,EACF;AAGA,MAAI,gBAAiC;AACrC,MAAI,WAAW,MAAM;AAEnB,oBAAgB,YAAY,oBAAoB,eAAe;AAAA,MAC7D,OAAO,aAAa;AAAA,MACpB,aAAa;AAAA,MACb;AAAA,IACF,CAAC;AAAA,EACH,WAAW,OAAO,WAAW,YAAY;AAEvC,oBAAgB,OAAO,UAAU;AAAA,EACnC;AAEA,SACE,iCACG;AAAA;AAAA,IAEA;AAAA,IAEA,UAAU,YAAY,oBAAoB,OAAO,QAAQ;AAAA,MACxD,OAAO,aAAa;AAAA,MACpB,aAAa;AAAA,MACb;AAAA,IACF,CAAC;AAAA,KACH;AAEJ;","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/will/Projects/Business/cms/builder/packages/sdk/dist/server/chunk-VSFQRHYZ.js","../../src/rendering/components/Page.tsx","../../src/rendering/components/Layout.tsx"],"names":[],"mappings":"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","file":"/Users/will/Projects/Business/cms/builder/packages/sdk/dist/server/chunk-VSFQRHYZ.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 * Supabase storage URL for direct image access.\n * SDK sites receive this from the API instead of requiring NEXT_PUBLIC_SUPABASE_URL env var.\n */\n supabaseUrl?: string;\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 supabaseUrl,\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 supabaseUrl,\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 { buildSimpleMenu, buildSimpleLogo } from '../../navigation';\nimport type { RiverbankClient, SiteResponse } from '../../client/types';\n\nexport type HeaderData = {\n menu: ReturnType<typeof buildSimpleMenu>;\n logo: ReturnType<typeof buildSimpleLogo>;\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 = buildSimpleMenu(navigation, routes);\n const logoViewModel = buildSimpleLogo(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"]}
|