@riverbankcms/sdk 0.6.0 → 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.
Files changed (49) hide show
  1. package/README.md +239 -0
  2. package/dist/cli/index.js +22 -5
  3. package/dist/cli/index.js.map +1 -1
  4. package/dist/client/client.js +1 -1
  5. package/dist/client/client.js.map +1 -1
  6. package/dist/client/client.mjs +1 -1
  7. package/dist/client/client.mjs.map +1 -1
  8. package/dist/server/{Layout-BClXUTsd.d.mts → Layout-B7cvis7r.d.mts} +3 -3
  9. package/dist/server/{Layout-UXGjXv8M.d.ts → Layout-wBtJLTVX.d.ts} +3 -3
  10. package/dist/server/{chunk-PHS2KWJX.js → chunk-3B364WO2.js} +4 -4
  11. package/dist/server/chunk-3B364WO2.js.map +1 -0
  12. package/dist/server/{chunk-SSS7CCRR.js → chunk-EIVISR62.js} +15 -57
  13. package/dist/server/chunk-EIVISR62.js.map +1 -0
  14. package/dist/server/{chunk-SQMGHEJM.mjs → chunk-I7ZR2WO3.mjs} +2 -2
  15. package/dist/server/{chunk-SQMGHEJM.mjs.map → chunk-I7ZR2WO3.mjs.map} +1 -1
  16. package/dist/server/{chunk-EOWGKCUZ.js → chunk-IVHIQFJH.js} +2 -2
  17. package/dist/server/{chunk-EOWGKCUZ.js.map → chunk-IVHIQFJH.js.map} +1 -1
  18. package/dist/server/{chunk-2HXHFSMI.mjs → chunk-XXFF4RVR.mjs} +6 -6
  19. package/dist/server/chunk-XXFF4RVR.mjs.map +1 -0
  20. package/dist/server/{chunk-PMHLZ3FW.mjs → chunk-YXA4GAAQ.mjs} +15 -57
  21. package/dist/server/chunk-YXA4GAAQ.mjs.map +1 -0
  22. package/dist/server/{components-DppHY5oD.d.ts → components-CICSJyp_.d.ts} +1 -1
  23. package/dist/server/{components-BmaJxgCV.d.mts → components-CMMwDXTW.d.mts} +1 -1
  24. package/dist/server/components.d.mts +2 -2
  25. package/dist/server/components.d.ts +2 -2
  26. package/dist/server/components.js +3 -3
  27. package/dist/server/components.mjs +2 -2
  28. package/dist/server/index.js +2 -2
  29. package/dist/server/index.mjs +1 -1
  30. package/dist/server/navigation.d.mts +80 -145
  31. package/dist/server/navigation.d.ts +80 -145
  32. package/dist/server/navigation.js +2 -10
  33. package/dist/server/navigation.js.map +1 -1
  34. package/dist/server/navigation.mjs +7 -15
  35. package/dist/server/rendering/server.d.mts +1 -1
  36. package/dist/server/rendering/server.d.ts +1 -1
  37. package/dist/server/rendering/server.js +3 -3
  38. package/dist/server/rendering/server.mjs +2 -2
  39. package/dist/server/rendering.d.mts +3 -3
  40. package/dist/server/rendering.d.ts +3 -3
  41. package/dist/server/rendering.js +3 -3
  42. package/dist/server/rendering.mjs +2 -2
  43. package/dist/server/server.js +2 -2
  44. package/dist/server/server.mjs +1 -1
  45. package/package.json +1 -1
  46. package/dist/server/chunk-2HXHFSMI.mjs.map +0 -1
  47. package/dist/server/chunk-PHS2KWJX.js.map +0 -1
  48. package/dist/server/chunk-PMHLZ3FW.mjs.map +0 -1
  49. package/dist/server/chunk-SSS7CCRR.js.map +0 -1
@@ -12,26 +12,28 @@ import '@riverbankcms/db';
12
12
  * Navigation helper utilities for SDK sites.
13
13
  *
14
14
  * Provides helpers to transform CMS navigation data into render-ready structures.
15
- * Supports both simple NavItem arrays and full MenuViewModels for block rendering.
15
+ * All navigation functions return nested structures supporting dropdowns.
16
16
  *
17
- * @example Simple usage
17
+ * @example Getting nav items
18
18
  * ```ts
19
- * import { getPrimaryNavItems } from '@riverbankcms/sdk/navigation';
19
+ * import { getPrimaryNavItems, isNavLink, isNavDropdown } from '@riverbankcms/sdk/navigation';
20
20
  *
21
21
  * const headerNav = getPrimaryNavItems(siteData.navigation);
22
- * // [{ href: '/', label: 'Home', isExternal: false }, ...]
22
+ * headerNav.forEach(item => {
23
+ * if (isNavLink(item)) {
24
+ * console.log(item.href);
25
+ * } else {
26
+ * console.log(`${item.label} has ${item.children.length} children`);
27
+ * }
28
+ * });
23
29
  * ```
24
30
  *
25
- * @example Block rendering usage
31
+ * @example Building menu and logo
26
32
  * ```ts
27
- * import { buildMenuViewModel, buildLogoViewModel } from '@riverbankcms/sdk/navigation';
28
- *
29
- * const menu = buildMenuViewModel(siteData.navigation);
30
- * const logo = buildLogoViewModel(siteData.layout.logo, siteData.site.title);
33
+ * import { buildMenu, buildLogo } from '@riverbankcms/sdk/navigation';
31
34
  *
32
- * renderBlock(siteHeaderManifest, layout.header, {
33
- * viewModelOverrides: { menu, content: { logo } },
34
- * });
35
+ * const menu = buildMenu(siteData.navigation, siteData.routes);
36
+ * const logo = buildLogo(siteData.layout.logo, siteData.site.title);
35
37
  * ```
36
38
  *
37
39
  * @packageDocumentation
@@ -110,17 +112,6 @@ type LogoViewModel = {
110
112
  storagePath?: string;
111
113
  storageBucket?: string;
112
114
  } | null;
113
- /**
114
- * A simplified navigation item structure for component rendering.
115
- */
116
- type NavItem = {
117
- /** The URL to navigate to */
118
- href: string;
119
- /** Display text for the navigation link */
120
- label: string;
121
- /** Whether link should open in new tab (external links) */
122
- isExternal: boolean;
123
- };
124
115
  /**
125
116
  * A navigation link item with a direct URL.
126
117
  * Use `kind` discriminator for type-safe narrowing.
@@ -160,12 +151,12 @@ type NavDropdown = {
160
151
  children: NavLink[];
161
152
  };
162
153
  /**
163
- * Unified navigation item supporting both links and dropdowns.
154
+ * Navigation item - either a link or a dropdown container.
164
155
  * Use `kind` property for type-safe discrimination.
165
156
  *
166
157
  * @example
167
158
  * ```ts
168
- * const items = getNestedPrimaryNavItems(navigation);
159
+ * const items = getPrimaryNavItems(navigation);
169
160
  * items.forEach(item => {
170
161
  * if (item.kind === 'link') {
171
162
  * console.log(item.href);
@@ -175,72 +166,63 @@ type NavDropdown = {
175
166
  * });
176
167
  * ```
177
168
  */
178
- type NestedNavItem = NavLink | NavDropdown;
169
+ type NavItem = NavLink | NavDropdown;
179
170
  /**
180
171
  * Type guard to check if a navigation item is a link.
181
172
  */
182
- declare function isNavLink(item: NestedNavItem): item is NavLink;
173
+ declare function isNavLink(item: NavItem): item is NavLink;
183
174
  /**
184
175
  * Type guard to check if a navigation item is a dropdown.
185
176
  */
186
- declare function isNavDropdown(item: NestedNavItem): item is NavDropdown;
187
- /**
188
- * Simple nav link with pre-resolved href for block rendering.
189
- */
190
- type SimpleNavLink = {
191
- id: string;
192
- label: string;
193
- href: string;
194
- isExternal: boolean;
195
- };
177
+ declare function isNavDropdown(item: NavItem): item is NavDropdown;
196
178
  /**
197
- * Simple menu view model with pre-resolved hrefs.
198
- * Use this instead of MenuViewModel for cleaner data flow.
199
- */
200
- type SimpleMenuViewModel = {
201
- items: SimpleNavLink[];
202
- ctaItem: SimpleNavLink | null;
203
- };
204
- /**
205
- * Simple nested nav link with pre-resolved href.
206
- */
207
- type SimpleNestedNavLink = {
208
- kind: 'link';
209
- id: string;
210
- label: string;
211
- href: string;
212
- isExternal: boolean;
213
- };
214
- /**
215
- * Simple nested dropdown with pre-resolved children.
216
- */
217
- type SimpleNestedNavDropdown = {
218
- kind: 'dropdown';
219
- id: string;
220
- label: string;
221
- children: SimpleNestedNavLink[];
222
- };
223
- /**
224
- * Unified simple nested navigation item.
225
- */
226
- type SimpleNestedNavItem = SimpleNestedNavLink | SimpleNestedNavDropdown;
227
- /**
228
- * Simple menu view model with nested navigation support.
179
+ * Navigation menu with items and optional CTA.
180
+ * Built from CMS navigation data with pre-resolved hrefs.
181
+ *
182
+ * @example
183
+ * ```ts
184
+ * const menu = buildMenu(siteData.navigation, siteData.routes);
185
+ * menu.items.forEach(item => {
186
+ * if (item.kind === 'link') {
187
+ * console.log(item.href);
188
+ * } else {
189
+ * console.log(item.children);
190
+ * }
191
+ * });
192
+ * ```
229
193
  */
230
- type SimpleNestedMenuViewModel = {
231
- items: SimpleNestedNavItem[];
232
- ctaItem: SimpleNestedNavLink | null;
194
+ type Menu = {
195
+ items: NavItem[];
196
+ ctaItem: NavLink | null;
233
197
  };
234
198
  /**
235
- * Simple logo data for block rendering.
199
+ * Logo data for site rendering.
200
+ *
201
+ * @example
202
+ * ```ts
203
+ * const logo = buildLogo(siteData.layout.logo, siteData.site.title);
204
+ * if (logo) {
205
+ * <img src={logo.src} alt={logo.alt} />
206
+ * }
207
+ * ```
236
208
  */
237
- type SimpleLogo = {
209
+ type Logo = {
238
210
  type: 'image';
239
211
  src: string;
240
212
  alt: string;
241
213
  width?: number;
242
214
  height?: number;
243
215
  } | null;
216
+ /** @deprecated Use `NavLink` instead */
217
+ type SimpleNavLink = NavLink;
218
+ /** @deprecated Use `NavDropdown` instead */
219
+ type SimpleNavDropdown = NavDropdown;
220
+ /** @deprecated Use `NavItem` instead */
221
+ type SimpleNavItem = NavItem;
222
+ /** @deprecated Use `Menu` instead */
223
+ type SimpleMenuViewModel = Menu;
224
+ /** @deprecated Use `Logo` instead */
225
+ type SimpleLogo = Logo;
244
226
  /**
245
227
  * Get the primary navigation menu object.
246
228
  * Returns menu marked as isPrimary, or first menu if none marked.
@@ -248,7 +230,7 @@ type SimpleLogo = {
248
230
  * @example
249
231
  * ```ts
250
232
  * const menu = getPrimaryNavigation(siteData.navigation);
251
- * console.log(menu?.title); // "Main Navigation"
233
+ * console.log(menu?.name); // "main"
252
234
  * ```
253
235
  */
254
236
  declare function getPrimaryNavigation(navigation: NavigationMenuWithItems[]): NavigationMenuWithItems | null;
@@ -263,19 +245,22 @@ declare function getPrimaryNavigation(navigation: NavigationMenuWithItems[]): Na
263
245
  declare function getNavigationBySlug(navigation: NavigationMenuWithItems[], slug: string): NavigationMenuWithItems | null;
264
246
  /**
265
247
  * Get nav items from the primary menu (marked isPrimary, or first menu).
266
- * Returns empty array if no navigation configured.
248
+ * Returns nested structure supporting both links and dropdowns.
267
249
  *
268
250
  * @example
269
251
  * ```ts
270
252
  * const headerNav = getPrimaryNavItems(siteData.navigation);
271
- * // [{ href: '/', label: 'Home', isExternal: false }, ...]
253
+ * headerNav.forEach(item => {
254
+ * if (item.kind === 'dropdown') {
255
+ * console.log(`${item.label} has ${item.children.length} children`);
256
+ * }
257
+ * });
272
258
  * ```
273
259
  */
274
260
  declare function getPrimaryNavItems(navigation: NavigationMenuWithItems[]): NavItem[];
275
261
  /**
276
262
  * Get nav items from a specific menu by slug.
277
- * Useful for footer nav, secondary nav, etc.
278
- * Returns empty array if menu not found.
263
+ * Returns nested structure supporting both links and dropdowns.
279
264
  *
280
265
  * @example
281
266
  * ```ts
@@ -284,47 +269,19 @@ declare function getPrimaryNavItems(navigation: NavigationMenuWithItems[]): NavI
284
269
  */
285
270
  declare function getNavItemsBySlug(navigation: NavigationMenuWithItems[], slug: string): NavItem[];
286
271
  /**
287
- * Transform a menu into simple NavItem array.
288
- */
289
- declare function transformToNavItems(menu: NavigationMenuWithItems | null): NavItem[];
290
- /**
291
- * Transform a menu into nested NestedNavItem array.
292
- * Builds tree structure from flat items, supporting dropdowns with children.
272
+ * Transform a menu into NavItem array.
273
+ * Builds nested structure from flat items, supporting dropdowns with children.
293
274
  *
294
275
  * @example
295
276
  * ```ts
296
- * const nav = transformToNestedNavItems(menu);
277
+ * const nav = transformToNavItems(menu);
297
278
  * // [
298
279
  * // { kind: 'link', href: '/', label: 'Home', ... },
299
280
  * // { kind: 'dropdown', label: 'Services', children: [...] },
300
281
  * // ]
301
282
  * ```
302
283
  */
303
- declare function transformToNestedNavItems(menu: NavigationMenuWithItems | null): NestedNavItem[];
304
- /**
305
- * Get nested nav items from the primary menu.
306
- * Supports dropdowns with children for complex navigation structures.
307
- *
308
- * @example
309
- * ```ts
310
- * const nav = getNestedPrimaryNavItems(siteData.navigation);
311
- * nav.forEach(item => {
312
- * if (item.kind === 'dropdown') {
313
- * console.log(`${item.label} has ${item.children.length} children`);
314
- * }
315
- * });
316
- * ```
317
- */
318
- declare function getNestedPrimaryNavItems(navigation: NavigationMenuWithItems[]): NestedNavItem[];
319
- /**
320
- * Get nested nav items from a specific menu by slug.
321
- *
322
- * @example
323
- * ```ts
324
- * const footerNav = getNestedNavItemsBySlug(siteData.navigation, 'footer');
325
- * ```
326
- */
327
- declare function getNestedNavItemsBySlug(navigation: NavigationMenuWithItems[], slug: string): NestedNavItem[];
284
+ declare function transformToNavItems(menu: NavigationMenuWithItems | null): NavItem[];
328
285
  /**
329
286
  * Build a MenuViewModel from navigation data for block rendering.
330
287
  * Extracts CTA item separately and preserves full link data.
@@ -356,26 +313,15 @@ declare function buildMenuViewModel(navigation: NavigationMenuWithItems[]): Menu
356
313
  */
357
314
  declare function buildLogoViewModel(logo: LogoSource, fallbackTitle: string | null | undefined): LogoViewModel;
358
315
  /**
359
- * Build a SimpleMenuViewModel from navigation data with pre-resolved hrefs.
360
- * Use this instead of buildMenuViewModel for cleaner data flow.
316
+ * Build a Menu from navigation data with pre-resolved hrefs.
317
+ * Supports dropdown containers with nested children.
361
318
  *
362
319
  * @param navigation - Navigation menus from site data
363
320
  * @param routes - Route map for resolving internal links
364
321
  *
365
322
  * @example
366
323
  * ```ts
367
- * const menu = buildSimpleMenu(siteData.navigation, siteData.routes);
368
- * // { items: [{ id, label, href: '/', isExternal: false }], cta: null }
369
- * ```
370
- */
371
- declare function buildSimpleMenu(navigation: NavigationMenuWithItems[], routes: RouteMap): SimpleMenuViewModel;
372
- /**
373
- * Build a SimpleNestedMenuViewModel with pre-resolved hrefs.
374
- * Supports dropdown containers with nested children.
375
- *
376
- * @example
377
- * ```ts
378
- * const menu = buildSimpleNestedMenu(siteData.navigation, siteData.routes);
324
+ * const menu = buildMenu(siteData.navigation, siteData.routes);
379
325
  * menu.items.forEach(item => {
380
326
  * if (item.kind === 'dropdown') {
381
327
  * console.log(item.children);
@@ -383,34 +329,23 @@ declare function buildSimpleMenu(navigation: NavigationMenuWithItems[], routes:
383
329
  * });
384
330
  * ```
385
331
  */
386
- declare function buildSimpleNestedMenu(navigation: NavigationMenuWithItems[], routes: RouteMap): SimpleNestedMenuViewModel;
332
+ declare function buildMenu(navigation: NavigationMenuWithItems[], routes: RouteMap): Menu;
333
+ /** @deprecated Use `buildMenu` instead */
334
+ declare const buildSimpleMenu: typeof buildMenu;
387
335
  /**
388
- * Build a SimpleLogo from site layout data.
336
+ * Build a Logo from site layout data.
389
337
  *
390
338
  * @param logo - Logo data from site layout
391
339
  * @param fallbackAlt - Fallback alt text (usually site title)
392
340
  *
393
341
  * @example
394
342
  * ```ts
395
- * const logo = buildSimpleLogo(siteData.layout.logo, siteData.site.title);
343
+ * const logo = buildLogo(siteData.layout.logo, siteData.site.title);
396
344
  * // { src: 'https://...', alt: 'Site Name', width: 200, height: 50 }
397
345
  * ```
398
346
  */
399
- declare function buildSimpleLogo(logo: {
400
- url?: string | null;
401
- alt?: string | null;
402
- width?: number | null;
403
- height?: number | null;
404
- } | null, fallbackAlt: string | null | undefined): SimpleLogo;
405
- /**
406
- * @deprecated Use `transformToNavItems` instead.
407
- * This alias is maintained for backwards compatibility only.
408
- */
409
- declare const transformNavItems: typeof transformToNavItems;
410
- /**
411
- * @deprecated Use `getPrimaryNavigation` instead.
412
- * This alias is maintained for backwards compatibility only.
413
- */
414
- declare const selectPrimaryMenu: typeof getPrimaryNavigation;
347
+ declare function buildLogo(logo: Partial<LogoSource> | null, fallbackAlt: string | null | undefined): Logo;
348
+ /** @deprecated Use `buildLogo` instead */
349
+ declare const buildSimpleLogo: typeof buildLogo;
415
350
 
416
- export { type CustomLinkValue, type ExternalLinkValue, type InternalLinkValue, type LinkValue, type LogoSource, type LogoViewModel, type MenuCtaViewModel, type MenuLinkViewModel, type MenuViewModel, type NavDropdown, type NavItem, type NavLink, NavigationMenuWithItems, type NestedNavItem, type SimpleLogo, type SimpleMenuViewModel, type SimpleNavLink, type SimpleNestedMenuViewModel, type SimpleNestedNavDropdown, type SimpleNestedNavItem, type SimpleNestedNavLink, buildLogoViewModel, buildMenuViewModel, buildSimpleLogo, buildSimpleMenu, buildSimpleNestedMenu, getNavItemsBySlug, getNavigationBySlug, getNestedNavItemsBySlug, getNestedPrimaryNavItems, getPrimaryNavItems, getPrimaryNavigation, isNavDropdown, isNavLink, selectPrimaryMenu, transformNavItems, transformToNavItems, transformToNestedNavItems };
351
+ export { type CustomLinkValue, type ExternalLinkValue, type InternalLinkValue, type LinkValue, type Logo, type LogoSource, type LogoViewModel, type Menu, type MenuCtaViewModel, type MenuLinkViewModel, type MenuViewModel, type NavDropdown, type NavItem, type NavLink, NavigationMenuWithItems, type SimpleLogo, type SimpleMenuViewModel, type SimpleNavDropdown, type SimpleNavItem, type SimpleNavLink, buildLogo, buildLogoViewModel, buildMenu, buildMenuViewModel, buildSimpleLogo, buildSimpleMenu, getNavItemsBySlug, getNavigationBySlug, getPrimaryNavItems, getPrimaryNavigation, isNavDropdown, isNavLink, transformToNavItems };
@@ -12,11 +12,7 @@
12
12
 
13
13
 
14
14
 
15
-
16
-
17
-
18
-
19
- var _chunkSSS7CCRRjs = require('./chunk-SSS7CCRR.js');
15
+ var _chunkEIVISR62js = require('./chunk-EIVISR62.js');
20
16
  require('./chunk-DGUM43GV.js');
21
17
 
22
18
 
@@ -32,9 +28,5 @@ require('./chunk-DGUM43GV.js');
32
28
 
33
29
 
34
30
 
35
-
36
-
37
-
38
-
39
- exports.buildLogoViewModel = _chunkSSS7CCRRjs.buildLogoViewModel; exports.buildMenuViewModel = _chunkSSS7CCRRjs.buildMenuViewModel; exports.buildSimpleLogo = _chunkSSS7CCRRjs.buildSimpleLogo; exports.buildSimpleMenu = _chunkSSS7CCRRjs.buildSimpleMenu; exports.buildSimpleNestedMenu = _chunkSSS7CCRRjs.buildSimpleNestedMenu; exports.getNavItemsBySlug = _chunkSSS7CCRRjs.getNavItemsBySlug; exports.getNavigationBySlug = _chunkSSS7CCRRjs.getNavigationBySlug; exports.getNestedNavItemsBySlug = _chunkSSS7CCRRjs.getNestedNavItemsBySlug; exports.getNestedPrimaryNavItems = _chunkSSS7CCRRjs.getNestedPrimaryNavItems; exports.getPrimaryNavItems = _chunkSSS7CCRRjs.getPrimaryNavItems; exports.getPrimaryNavigation = _chunkSSS7CCRRjs.getPrimaryNavigation; exports.isNavDropdown = _chunkSSS7CCRRjs.isNavDropdown; exports.isNavLink = _chunkSSS7CCRRjs.isNavLink; exports.selectPrimaryMenu = _chunkSSS7CCRRjs.selectPrimaryMenu; exports.transformNavItems = _chunkSSS7CCRRjs.transformNavItems; exports.transformToNavItems = _chunkSSS7CCRRjs.transformToNavItems; exports.transformToNestedNavItems = _chunkSSS7CCRRjs.transformToNestedNavItems;
31
+ exports.buildLogo = _chunkEIVISR62js.buildLogo; exports.buildLogoViewModel = _chunkEIVISR62js.buildLogoViewModel; exports.buildMenu = _chunkEIVISR62js.buildMenu; exports.buildMenuViewModel = _chunkEIVISR62js.buildMenuViewModel; exports.buildSimpleLogo = _chunkEIVISR62js.buildSimpleLogo; exports.buildSimpleMenu = _chunkEIVISR62js.buildSimpleMenu; exports.getNavItemsBySlug = _chunkEIVISR62js.getNavItemsBySlug; exports.getNavigationBySlug = _chunkEIVISR62js.getNavigationBySlug; exports.getPrimaryNavItems = _chunkEIVISR62js.getPrimaryNavItems; exports.getPrimaryNavigation = _chunkEIVISR62js.getPrimaryNavigation; exports.isNavDropdown = _chunkEIVISR62js.isNavDropdown; exports.isNavLink = _chunkEIVISR62js.isNavLink; exports.transformToNavItems = _chunkEIVISR62js.transformToNavItems;
40
32
  //# sourceMappingURL=navigation.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/will/Projects/Business/cms/builder/packages/sdk/dist/server/navigation.js"],"names":[],"mappings":"AAAA;AACE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACF,sDAA4B;AAC5B,+BAA4B;AAC5B;AACE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACF,qmCAAC","file":"/Users/will/Projects/Business/cms/builder/packages/sdk/dist/server/navigation.js"}
1
+ {"version":3,"sources":["/Users/will/Projects/Business/cms/builder/packages/sdk/dist/server/navigation.js"],"names":[],"mappings":"AAAA;AACE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACF,sDAA4B;AAC5B,+BAA4B;AAC5B;AACE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACF,mxBAAC","file":"/Users/will/Projects/Business/cms/builder/packages/sdk/dist/server/navigation.js"}
@@ -1,40 +1,32 @@
1
1
  import {
2
+ buildLogo,
2
3
  buildLogoViewModel,
4
+ buildMenu,
3
5
  buildMenuViewModel,
4
6
  buildSimpleLogo,
5
7
  buildSimpleMenu,
6
- buildSimpleNestedMenu,
7
8
  getNavItemsBySlug,
8
9
  getNavigationBySlug,
9
- getNestedNavItemsBySlug,
10
- getNestedPrimaryNavItems,
11
10
  getPrimaryNavItems,
12
11
  getPrimaryNavigation,
13
12
  isNavDropdown,
14
13
  isNavLink,
15
- selectPrimaryMenu,
16
- transformNavItems,
17
- transformToNavItems,
18
- transformToNestedNavItems
19
- } from "./chunk-PMHLZ3FW.mjs";
14
+ transformToNavItems
15
+ } from "./chunk-YXA4GAAQ.mjs";
20
16
  import "./chunk-BJTO5JO5.mjs";
21
17
  export {
18
+ buildLogo,
22
19
  buildLogoViewModel,
20
+ buildMenu,
23
21
  buildMenuViewModel,
24
22
  buildSimpleLogo,
25
23
  buildSimpleMenu,
26
- buildSimpleNestedMenu,
27
24
  getNavItemsBySlug,
28
25
  getNavigationBySlug,
29
- getNestedNavItemsBySlug,
30
- getNestedPrimaryNavItems,
31
26
  getPrimaryNavItems,
32
27
  getPrimaryNavigation,
33
28
  isNavDropdown,
34
29
  isNavLink,
35
- selectPrimaryMenu,
36
- transformNavItems,
37
- transformToNavItems,
38
- transformToNestedNavItems
30
+ transformToNavItems
39
31
  };
40
32
  //# sourceMappingURL=navigation.mjs.map
@@ -1,5 +1,5 @@
1
1
  export { b as Page, P as PageProps } from '../loadPage-B8mQUUSo.mjs';
2
- export { H as HeaderData, L as Layout, a as LayoutProps } from '../Layout-BClXUTsd.mjs';
2
+ export { H as HeaderData, L as Layout, a as LayoutProps } from '../Layout-B7cvis7r.mjs';
3
3
  import * as react_jsx_runtime from 'react/jsx-runtime';
4
4
  import * as React from 'react';
5
5
  import { T as Theme } from '../types-Dsu9wsUh.mjs';
@@ -1,5 +1,5 @@
1
1
  export { b as Page, P as PageProps } from '../loadPage-DP3nrHBi.js';
2
- export { H as HeaderData, L as Layout, a as LayoutProps } from '../Layout-UXGjXv8M.js';
2
+ export { H as HeaderData, L as Layout, a as LayoutProps } from '../Layout-wBtJLTVX.js';
3
3
  import * as react_jsx_runtime from 'react/jsx-runtime';
4
4
  import * as React from 'react';
5
5
  import { T as Theme } from '../types-CVykEqXN.js';
@@ -4,8 +4,8 @@ var _chunkTT5JWA4Xjs = require('../chunk-TT5JWA4X.js');
4
4
 
5
5
 
6
6
 
7
- var _chunkPHS2KWJXjs = require('../chunk-PHS2KWJX.js');
8
- require('../chunk-SSS7CCRR.js');
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 = _chunkPHS2KWJXjs.Layout; exports.Page = _chunkPHS2KWJXjs.Page;
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-2HXHFSMI.mjs";
8
- import "../chunk-PMHLZ3FW.mjs";
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-BClXUTsd.mjs';
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-BmaJxgCV.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-BmaJxgCV.mjs';
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-UXGjXv8M.js';
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-DppHY5oD.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-DppHY5oD.js';
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';
@@ -12,8 +12,8 @@ var _chunkTT5JWA4Xjs = require('./chunk-TT5JWA4X.js');
12
12
 
13
13
 
14
14
 
15
- var _chunkPHS2KWJXjs = require('./chunk-PHS2KWJX.js');
16
- require('./chunk-SSS7CCRR.js');
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 = _chunkPHS2KWJXjs.Layout; exports.Page = _chunkPHS2KWJXjs.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;
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
@@ -12,8 +12,8 @@ import {
12
12
  import {
13
13
  Layout,
14
14
  Page
15
- } from "./chunk-2HXHFSMI.mjs";
16
- import "./chunk-PMHLZ3FW.mjs";
15
+ } from "./chunk-XXFF4RVR.mjs";
16
+ import "./chunk-YXA4GAAQ.mjs";
17
17
  import {
18
18
  PageRenderer,
19
19
  RichText,
@@ -1,6 +1,6 @@
1
1
  "use strict";Object.defineProperty(exports, "__esModule", {value: true});
2
2
 
3
- var _chunkEOWGKCUZjs = require('./chunk-EOWGKCUZ.js');
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 = _chunkEOWGKCUZjs.createRiverbankClient; exports.isEntryContent = _chunkI2D7KOEAjs.isEntryContent; exports.isPageContent = _chunkI2D7KOEAjs.isPageContent; exports.loadContent = _chunkI2D7KOEAjs.loadContent; exports.loadPage = _chunkP3NNN73Gjs.loadPage;
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
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  createRiverbankClient
3
- } from "./chunk-SQMGHEJM.mjs";
3
+ } from "./chunk-I7ZR2WO3.mjs";
4
4
  import {
5
5
  isEntryContent,
6
6
  isPageContent,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@riverbankcms/sdk",
3
- "version": "0.6.0",
3
+ "version": "0.6.1",
4
4
  "description": "Riverbank CMS SDK for headless content consumption",
5
5
  "main": "./dist/server/index.js",
6
6
  "module": "./dist/server/index.mjs",
@@ -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-PHS2KWJX.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-PHS2KWJX.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"]}