@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.
- 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-PHS2KWJX.js → chunk-3B364WO2.js} +4 -4
- package/dist/server/chunk-3B364WO2.js.map +1 -0
- package/dist/server/{chunk-SSS7CCRR.js → chunk-EIVISR62.js} +15 -57
- package/dist/server/chunk-EIVISR62.js.map +1 -0
- package/dist/server/{chunk-SQMGHEJM.mjs → chunk-I7ZR2WO3.mjs} +2 -2
- package/dist/server/{chunk-SQMGHEJM.mjs.map → chunk-I7ZR2WO3.mjs.map} +1 -1
- package/dist/server/{chunk-EOWGKCUZ.js → chunk-IVHIQFJH.js} +2 -2
- package/dist/server/{chunk-EOWGKCUZ.js.map → chunk-IVHIQFJH.js.map} +1 -1
- package/dist/server/{chunk-2HXHFSMI.mjs → chunk-XXFF4RVR.mjs} +6 -6
- package/dist/server/chunk-XXFF4RVR.mjs.map +1 -0
- package/dist/server/{chunk-PMHLZ3FW.mjs → chunk-YXA4GAAQ.mjs} +15 -57
- 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 +80 -145
- package/dist/server/navigation.d.ts +80 -145
- package/dist/server/navigation.js +2 -10
- package/dist/server/navigation.js.map +1 -1
- package/dist/server/navigation.mjs +7 -15
- 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-2HXHFSMI.mjs.map +0 -1
- package/dist/server/chunk-PHS2KWJX.js.map +0 -1
- package/dist/server/chunk-PMHLZ3FW.mjs.map +0 -1
- 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
|
-
*
|
|
15
|
+
* All navigation functions return nested structures supporting dropdowns.
|
|
16
16
|
*
|
|
17
|
-
* @example
|
|
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
|
-
*
|
|
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
|
|
31
|
+
* @example Building menu and logo
|
|
26
32
|
* ```ts
|
|
27
|
-
* import {
|
|
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
|
-
*
|
|
33
|
-
*
|
|
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
|
-
*
|
|
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 =
|
|
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
|
|
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:
|
|
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:
|
|
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
|
-
*
|
|
198
|
-
*
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
*
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
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
|
|
231
|
-
items:
|
|
232
|
-
ctaItem:
|
|
194
|
+
type Menu = {
|
|
195
|
+
items: NavItem[];
|
|
196
|
+
ctaItem: NavLink | null;
|
|
233
197
|
};
|
|
234
198
|
/**
|
|
235
|
-
*
|
|
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
|
|
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?.
|
|
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
|
|
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
|
-
*
|
|
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
|
-
*
|
|
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
|
|
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 =
|
|
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
|
|
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
|
|
360
|
-
*
|
|
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 =
|
|
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
|
|
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
|
|
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 =
|
|
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
|
|
400
|
-
|
|
401
|
-
|
|
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
|
|
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;
|
|
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
|
-
|
|
16
|
-
|
|
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
|
-
|
|
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-
|
|
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-
|
|
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
|
|
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":["../../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"]}
|