@riverbankcms/sdk 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (157) hide show
  1. package/README.md +1892 -0
  2. package/dist/cli/index.js +327 -0
  3. package/dist/cli/index.js.map +1 -0
  4. package/dist/client/analytics.d.mts +103 -0
  5. package/dist/client/analytics.d.ts +103 -0
  6. package/dist/client/analytics.js +197 -0
  7. package/dist/client/analytics.js.map +1 -0
  8. package/dist/client/analytics.mjs +169 -0
  9. package/dist/client/analytics.mjs.map +1 -0
  10. package/dist/client/bookings.d.mts +89 -0
  11. package/dist/client/bookings.d.ts +89 -0
  12. package/dist/client/bookings.js +34 -0
  13. package/dist/client/bookings.js.map +1 -0
  14. package/dist/client/bookings.mjs +11 -0
  15. package/dist/client/bookings.mjs.map +1 -0
  16. package/dist/client/client.d.mts +195 -0
  17. package/dist/client/client.d.ts +195 -0
  18. package/dist/client/client.js +606 -0
  19. package/dist/client/client.js.map +1 -0
  20. package/dist/client/client.mjs +572 -0
  21. package/dist/client/client.mjs.map +1 -0
  22. package/dist/client/hooks.d.mts +71 -0
  23. package/dist/client/hooks.d.ts +71 -0
  24. package/dist/client/hooks.js +264 -0
  25. package/dist/client/hooks.js.map +1 -0
  26. package/dist/client/hooks.mjs +235 -0
  27. package/dist/client/hooks.mjs.map +1 -0
  28. package/dist/client/rendering/client.d.mts +1 -0
  29. package/dist/client/rendering/client.d.ts +1 -0
  30. package/dist/client/rendering/client.js +33 -0
  31. package/dist/client/rendering/client.js.map +1 -0
  32. package/dist/client/rendering/client.mjs +8 -0
  33. package/dist/client/rendering/client.mjs.map +1 -0
  34. package/dist/client/usePage-BvKAa3Zw.d.mts +366 -0
  35. package/dist/client/usePage-BvKAa3Zw.d.ts +366 -0
  36. package/dist/server/chunk-2RW5HAQQ.mjs +86 -0
  37. package/dist/server/chunk-2RW5HAQQ.mjs.map +1 -0
  38. package/dist/server/chunk-3KKZVGH4.mjs +179 -0
  39. package/dist/server/chunk-3KKZVGH4.mjs.map +1 -0
  40. package/dist/server/chunk-4Z3GPTCS.js +179 -0
  41. package/dist/server/chunk-4Z3GPTCS.js.map +1 -0
  42. package/dist/server/chunk-4Z5FBFRL.mjs +211 -0
  43. package/dist/server/chunk-4Z5FBFRL.mjs.map +1 -0
  44. package/dist/server/chunk-ADREPXFU.js +86 -0
  45. package/dist/server/chunk-ADREPXFU.js.map +1 -0
  46. package/dist/server/chunk-F472SMKX.js +140 -0
  47. package/dist/server/chunk-F472SMKX.js.map +1 -0
  48. package/dist/server/chunk-GWBMJPLH.mjs +57 -0
  49. package/dist/server/chunk-GWBMJPLH.mjs.map +1 -0
  50. package/dist/server/chunk-JB4LIEFS.js +85 -0
  51. package/dist/server/chunk-JB4LIEFS.js.map +1 -0
  52. package/dist/server/chunk-PEAXKTDU.mjs +140 -0
  53. package/dist/server/chunk-PEAXKTDU.mjs.map +1 -0
  54. package/dist/server/chunk-QQ6U4QX6.js +120 -0
  55. package/dist/server/chunk-QQ6U4QX6.js.map +1 -0
  56. package/dist/server/chunk-R5YGLRUG.mjs +122 -0
  57. package/dist/server/chunk-R5YGLRUG.mjs.map +1 -0
  58. package/dist/server/chunk-SW7LE4M3.js +211 -0
  59. package/dist/server/chunk-SW7LE4M3.js.map +1 -0
  60. package/dist/server/chunk-W3K7LVPS.mjs +120 -0
  61. package/dist/server/chunk-W3K7LVPS.mjs.map +1 -0
  62. package/dist/server/chunk-WKG57P2H.mjs +85 -0
  63. package/dist/server/chunk-WKG57P2H.mjs.map +1 -0
  64. package/dist/server/chunk-YHEZMVTS.js +122 -0
  65. package/dist/server/chunk-YHEZMVTS.js.map +1 -0
  66. package/dist/server/chunk-YXDDFG3N.js +57 -0
  67. package/dist/server/chunk-YXDDFG3N.js.map +1 -0
  68. package/dist/server/components.d.mts +49 -0
  69. package/dist/server/components.d.ts +49 -0
  70. package/dist/server/components.js +22 -0
  71. package/dist/server/components.js.map +1 -0
  72. package/dist/server/components.mjs +22 -0
  73. package/dist/server/components.mjs.map +1 -0
  74. package/dist/server/config-validation.d.mts +300 -0
  75. package/dist/server/config-validation.d.ts +300 -0
  76. package/dist/server/config-validation.js +50 -0
  77. package/dist/server/config-validation.js.map +1 -0
  78. package/dist/server/config-validation.mjs +50 -0
  79. package/dist/server/config-validation.mjs.map +1 -0
  80. package/dist/server/config.d.mts +38 -0
  81. package/dist/server/config.d.ts +38 -0
  82. package/dist/server/config.js +44 -0
  83. package/dist/server/config.js.map +1 -0
  84. package/dist/server/config.mjs +44 -0
  85. package/dist/server/config.mjs.map +1 -0
  86. package/dist/server/data.d.mts +108 -0
  87. package/dist/server/data.d.ts +108 -0
  88. package/dist/server/data.js +15 -0
  89. package/dist/server/data.js.map +1 -0
  90. package/dist/server/data.mjs +15 -0
  91. package/dist/server/data.mjs.map +1 -0
  92. package/dist/server/index-B0yI_V6Z.d.mts +18 -0
  93. package/dist/server/index-C6M0Wfjq.d.ts +18 -0
  94. package/dist/server/index.d.mts +5 -0
  95. package/dist/server/index.d.ts +5 -0
  96. package/dist/server/index.js +12 -0
  97. package/dist/server/index.js.map +1 -0
  98. package/dist/server/index.mjs +12 -0
  99. package/dist/server/index.mjs.map +1 -0
  100. package/dist/server/loadContent-CJcbYF3J.d.ts +152 -0
  101. package/dist/server/loadContent-zhlL4YSE.d.mts +152 -0
  102. package/dist/server/loadPage-BYmVMk0V.d.ts +216 -0
  103. package/dist/server/loadPage-CCf15nt8.d.mts +216 -0
  104. package/dist/server/loadPage-DVH3DW6E.js +9 -0
  105. package/dist/server/loadPage-DVH3DW6E.js.map +1 -0
  106. package/dist/server/loadPage-PHQZ6XQZ.mjs +9 -0
  107. package/dist/server/loadPage-PHQZ6XQZ.mjs.map +1 -0
  108. package/dist/server/metadata.d.mts +135 -0
  109. package/dist/server/metadata.d.ts +135 -0
  110. package/dist/server/metadata.js +68 -0
  111. package/dist/server/metadata.js.map +1 -0
  112. package/dist/server/metadata.mjs +68 -0
  113. package/dist/server/metadata.mjs.map +1 -0
  114. package/dist/server/rendering/server.d.mts +83 -0
  115. package/dist/server/rendering/server.d.ts +83 -0
  116. package/dist/server/rendering/server.js +14 -0
  117. package/dist/server/rendering/server.js.map +1 -0
  118. package/dist/server/rendering/server.mjs +14 -0
  119. package/dist/server/rendering/server.mjs.map +1 -0
  120. package/dist/server/rendering.d.mts +12 -0
  121. package/dist/server/rendering.d.ts +12 -0
  122. package/dist/server/rendering.js +40 -0
  123. package/dist/server/rendering.js.map +1 -0
  124. package/dist/server/rendering.mjs +40 -0
  125. package/dist/server/rendering.mjs.map +1 -0
  126. package/dist/server/routing.d.mts +115 -0
  127. package/dist/server/routing.d.ts +115 -0
  128. package/dist/server/routing.js +57 -0
  129. package/dist/server/routing.js.map +1 -0
  130. package/dist/server/routing.mjs +57 -0
  131. package/dist/server/routing.mjs.map +1 -0
  132. package/dist/server/server.d.mts +9 -0
  133. package/dist/server/server.d.ts +9 -0
  134. package/dist/server/server.js +21 -0
  135. package/dist/server/server.js.map +1 -0
  136. package/dist/server/server.mjs +21 -0
  137. package/dist/server/server.mjs.map +1 -0
  138. package/dist/server/theme-bridge.d.mts +232 -0
  139. package/dist/server/theme-bridge.d.ts +232 -0
  140. package/dist/server/theme-bridge.js +231 -0
  141. package/dist/server/theme-bridge.js.map +1 -0
  142. package/dist/server/theme-bridge.mjs +231 -0
  143. package/dist/server/theme-bridge.mjs.map +1 -0
  144. package/dist/server/theme.d.mts +40 -0
  145. package/dist/server/theme.d.ts +40 -0
  146. package/dist/server/theme.js +17 -0
  147. package/dist/server/theme.js.map +1 -0
  148. package/dist/server/theme.mjs +17 -0
  149. package/dist/server/theme.mjs.map +1 -0
  150. package/dist/server/types-BCeqWtI2.d.mts +333 -0
  151. package/dist/server/types-BCeqWtI2.d.ts +333 -0
  152. package/dist/server/types-Bbo01M7P.d.mts +76 -0
  153. package/dist/server/types-Bbo01M7P.d.ts +76 -0
  154. package/dist/server/types-C6gmRHLe.d.mts +150 -0
  155. package/dist/server/types-C6gmRHLe.d.ts +150 -0
  156. package/package.json +147 -0
  157. package/src/styles/index.css +10 -0
@@ -0,0 +1,152 @@
1
+ import { Theme } from '@riverbankcms/blocks';
2
+ import { R as RiverbankClient } from './types-C6gmRHLe.js';
3
+ import { b as PageProps } from './loadPage-BYmVMk0V.js';
4
+ import { ResolvedBlockData } from '@riverbankcms/blocks/system/data';
5
+
6
+ /**
7
+ * Server-side helper to fetch content (page or entry) by path.
8
+ *
9
+ * Use this for dynamic routing where a path could resolve to either
10
+ * a page or a content entry.
11
+ */
12
+
13
+ type LoadContentParams = {
14
+ client: RiverbankClient;
15
+ siteId: string;
16
+ path: string;
17
+ /**
18
+ * If true, fetches draft/unpublished content instead of published content.
19
+ * This affects both pages and entries.
20
+ * Requires API key with site access.
21
+ *
22
+ * @default false
23
+ */
24
+ preview?: boolean;
25
+ };
26
+ /**
27
+ * Content entry data returned when a path resolves to an entry
28
+ */
29
+ type ContentEntryData = {
30
+ id: string;
31
+ /** Content type key (e.g., 'blog-post', 'product') */
32
+ type: string | null;
33
+ title: string;
34
+ slug: string | null;
35
+ path: string | null;
36
+ status: string;
37
+ publishAt: string | null;
38
+ /** The raw content fields - use these to render your own UI */
39
+ content: Record<string, unknown>;
40
+ metaTitle: string | null;
41
+ metaDescription: string | null;
42
+ createdAt: string;
43
+ updatedAt: string;
44
+ };
45
+ /**
46
+ * Result when path resolves to a page
47
+ */
48
+ type PageContentResult = {
49
+ type: 'page';
50
+ /** Page outline ready for rendering with <Page> component */
51
+ page: PageProps['page'];
52
+ /** Site theme for styling */
53
+ theme: Theme;
54
+ /** Site ID */
55
+ siteId: string;
56
+ /** Pre-fetched block data for data loaders */
57
+ resolvedData: ResolvedBlockData;
58
+ };
59
+ /**
60
+ * Result when path resolves to a content entry
61
+ */
62
+ type EntryContentResult = {
63
+ type: 'entry';
64
+ /** Raw entry data - render this however you want */
65
+ entry: ContentEntryData;
66
+ /** Template page for rendering the entry (if available) */
67
+ templatePage: PageProps['page'] | null;
68
+ /** Pre-fetched block data for template page data loaders */
69
+ resolvedData: ResolvedBlockData;
70
+ /** Data context for template blocks (includes entry content for bindings) */
71
+ dataContext: {
72
+ contentEntry: Record<string, unknown>;
73
+ };
74
+ /** Site theme for styling (useful if rendering with SDK components) */
75
+ theme: Theme;
76
+ /** Site ID */
77
+ siteId: string;
78
+ };
79
+ /**
80
+ * Discriminated union result from loadContent
81
+ */
82
+ type LoadContentResult = PageContentResult | EntryContentResult;
83
+ /**
84
+ * Type guard to check if result is a page
85
+ */
86
+ declare function isPageContent(result: LoadContentResult): result is PageContentResult;
87
+ /**
88
+ * Type guard to check if result is an entry
89
+ */
90
+ declare function isEntryContent(result: LoadContentResult): result is EntryContentResult;
91
+ /**
92
+ * Server-side helper to fetch content by path.
93
+ *
94
+ * Returns a discriminated union - either page data (ready for `<Page>` component)
95
+ * or raw entry data (for custom rendering).
96
+ *
97
+ * @example Dynamic routing with both pages and entries
98
+ * ```tsx
99
+ * import { loadContent, Page, isPageContent } from '@riverbankcms/sdk';
100
+ *
101
+ * export default async function DynamicRoute({ params }) {
102
+ * const content = await loadContent({
103
+ * client,
104
+ * siteId: 'site-123',
105
+ * path: `/${params.slug?.join('/') || ''}`,
106
+ * });
107
+ *
108
+ * if (isPageContent(content)) {
109
+ * return <Page {...content} />;
110
+ * }
111
+ *
112
+ * // Render entry with custom UI
113
+ * return (
114
+ * <article>
115
+ * <h1>{content.entry.title}</h1>
116
+ * <div>{content.entry.content.body}</div>
117
+ * </article>
118
+ * );
119
+ * }
120
+ * ```
121
+ *
122
+ * @example Entry-specific rendering based on content type
123
+ * ```tsx
124
+ * const content = await loadContent({ client, siteId, path });
125
+ *
126
+ * if (content.type === 'entry') {
127
+ * switch (content.entry.type) {
128
+ * case 'blog-post':
129
+ * return <BlogPost entry={content.entry} theme={content.theme} />;
130
+ * case 'product':
131
+ * return <ProductPage entry={content.entry} theme={content.theme} />;
132
+ * default:
133
+ * return <GenericEntry entry={content.entry} />;
134
+ * }
135
+ * }
136
+ *
137
+ * return <Page {...content} />;
138
+ * ```
139
+ *
140
+ * @example Preview mode for draft content
141
+ * ```tsx
142
+ * const content = await loadContent({
143
+ * client,
144
+ * siteId,
145
+ * path,
146
+ * preview: true, // Fetches draft content for both pages and entries
147
+ * });
148
+ * ```
149
+ */
150
+ declare function loadContent(params: LoadContentParams): Promise<LoadContentResult>;
151
+
152
+ export { type ContentEntryData as C, type EntryContentResult as E, type LoadContentParams as L, type PageContentResult as P, isEntryContent as a, type LoadContentResult as b, isPageContent as i, loadContent as l };
@@ -0,0 +1,152 @@
1
+ import { Theme } from '@riverbankcms/blocks';
2
+ import { R as RiverbankClient } from './types-C6gmRHLe.mjs';
3
+ import { b as PageProps } from './loadPage-CCf15nt8.mjs';
4
+ import { ResolvedBlockData } from '@riverbankcms/blocks/system/data';
5
+
6
+ /**
7
+ * Server-side helper to fetch content (page or entry) by path.
8
+ *
9
+ * Use this for dynamic routing where a path could resolve to either
10
+ * a page or a content entry.
11
+ */
12
+
13
+ type LoadContentParams = {
14
+ client: RiverbankClient;
15
+ siteId: string;
16
+ path: string;
17
+ /**
18
+ * If true, fetches draft/unpublished content instead of published content.
19
+ * This affects both pages and entries.
20
+ * Requires API key with site access.
21
+ *
22
+ * @default false
23
+ */
24
+ preview?: boolean;
25
+ };
26
+ /**
27
+ * Content entry data returned when a path resolves to an entry
28
+ */
29
+ type ContentEntryData = {
30
+ id: string;
31
+ /** Content type key (e.g., 'blog-post', 'product') */
32
+ type: string | null;
33
+ title: string;
34
+ slug: string | null;
35
+ path: string | null;
36
+ status: string;
37
+ publishAt: string | null;
38
+ /** The raw content fields - use these to render your own UI */
39
+ content: Record<string, unknown>;
40
+ metaTitle: string | null;
41
+ metaDescription: string | null;
42
+ createdAt: string;
43
+ updatedAt: string;
44
+ };
45
+ /**
46
+ * Result when path resolves to a page
47
+ */
48
+ type PageContentResult = {
49
+ type: 'page';
50
+ /** Page outline ready for rendering with <Page> component */
51
+ page: PageProps['page'];
52
+ /** Site theme for styling */
53
+ theme: Theme;
54
+ /** Site ID */
55
+ siteId: string;
56
+ /** Pre-fetched block data for data loaders */
57
+ resolvedData: ResolvedBlockData;
58
+ };
59
+ /**
60
+ * Result when path resolves to a content entry
61
+ */
62
+ type EntryContentResult = {
63
+ type: 'entry';
64
+ /** Raw entry data - render this however you want */
65
+ entry: ContentEntryData;
66
+ /** Template page for rendering the entry (if available) */
67
+ templatePage: PageProps['page'] | null;
68
+ /** Pre-fetched block data for template page data loaders */
69
+ resolvedData: ResolvedBlockData;
70
+ /** Data context for template blocks (includes entry content for bindings) */
71
+ dataContext: {
72
+ contentEntry: Record<string, unknown>;
73
+ };
74
+ /** Site theme for styling (useful if rendering with SDK components) */
75
+ theme: Theme;
76
+ /** Site ID */
77
+ siteId: string;
78
+ };
79
+ /**
80
+ * Discriminated union result from loadContent
81
+ */
82
+ type LoadContentResult = PageContentResult | EntryContentResult;
83
+ /**
84
+ * Type guard to check if result is a page
85
+ */
86
+ declare function isPageContent(result: LoadContentResult): result is PageContentResult;
87
+ /**
88
+ * Type guard to check if result is an entry
89
+ */
90
+ declare function isEntryContent(result: LoadContentResult): result is EntryContentResult;
91
+ /**
92
+ * Server-side helper to fetch content by path.
93
+ *
94
+ * Returns a discriminated union - either page data (ready for `<Page>` component)
95
+ * or raw entry data (for custom rendering).
96
+ *
97
+ * @example Dynamic routing with both pages and entries
98
+ * ```tsx
99
+ * import { loadContent, Page, isPageContent } from '@riverbankcms/sdk';
100
+ *
101
+ * export default async function DynamicRoute({ params }) {
102
+ * const content = await loadContent({
103
+ * client,
104
+ * siteId: 'site-123',
105
+ * path: `/${params.slug?.join('/') || ''}`,
106
+ * });
107
+ *
108
+ * if (isPageContent(content)) {
109
+ * return <Page {...content} />;
110
+ * }
111
+ *
112
+ * // Render entry with custom UI
113
+ * return (
114
+ * <article>
115
+ * <h1>{content.entry.title}</h1>
116
+ * <div>{content.entry.content.body}</div>
117
+ * </article>
118
+ * );
119
+ * }
120
+ * ```
121
+ *
122
+ * @example Entry-specific rendering based on content type
123
+ * ```tsx
124
+ * const content = await loadContent({ client, siteId, path });
125
+ *
126
+ * if (content.type === 'entry') {
127
+ * switch (content.entry.type) {
128
+ * case 'blog-post':
129
+ * return <BlogPost entry={content.entry} theme={content.theme} />;
130
+ * case 'product':
131
+ * return <ProductPage entry={content.entry} theme={content.theme} />;
132
+ * default:
133
+ * return <GenericEntry entry={content.entry} />;
134
+ * }
135
+ * }
136
+ *
137
+ * return <Page {...content} />;
138
+ * ```
139
+ *
140
+ * @example Preview mode for draft content
141
+ * ```tsx
142
+ * const content = await loadContent({
143
+ * client,
144
+ * siteId,
145
+ * path,
146
+ * preview: true, // Fetches draft content for both pages and entries
147
+ * });
148
+ * ```
149
+ */
150
+ declare function loadContent(params: LoadContentParams): Promise<LoadContentResult>;
151
+
152
+ export { type ContentEntryData as C, type EntryContentResult as E, type LoadContentParams as L, type PageContentResult as P, isEntryContent as a, type LoadContentResult as b, isPageContent as i, loadContent as l };
@@ -0,0 +1,216 @@
1
+ import { R as RiverbankClient, S as SiteResponse } from './types-C6gmRHLe.js';
2
+ import * as react_jsx_runtime from 'react/jsx-runtime';
3
+ import { PageOutline, Theme, ThemeTokens, RouteMap, OccurrenceContextData, PageRenderer, BlockOverrides } from '@riverbankcms/blocks';
4
+ import { ResolvedBlockData } from '@riverbankcms/blocks/system/data';
5
+ import { D as DataLoaderOverrides } from './types-Bbo01M7P.js';
6
+
7
+ type PageProps = {
8
+ page: PageOutline;
9
+ theme: Theme;
10
+ siteId: string;
11
+ themeTokens?: ThemeTokens;
12
+ resolvedData?: ResolvedBlockData;
13
+ routeMap?: RouteMap;
14
+ /**
15
+ * SDK site configuration containing theme palette overrides.
16
+ * When provided, the SDK palette tokens are merged into the theme tokens,
17
+ * allowing blocks to use SDK-defined color tokens for section backgrounds.
18
+ */
19
+ sdkConfig?: RuntimeSdkConfig | null;
20
+ /**
21
+ * Additional context data for content entry pages.
22
+ * Used to pass occurrence context and content entry data to blocks.
23
+ */
24
+ dataContext?: {
25
+ /** Occurrence context for event pages (from URL like /events/yoga/2025-01-15) */
26
+ occurrenceContext?: OccurrenceContextData | null;
27
+ /** Content entry data for template pages */
28
+ contentEntry?: Record<string, unknown> | null;
29
+ };
30
+ wrapBlock?: (blockId: string, rendered: React.ReactNode) => React.ReactNode;
31
+ registry?: Parameters<typeof PageRenderer>[0]['registry'];
32
+ usePlaceholders?: boolean;
33
+ /**
34
+ * Custom components to override default block rendering.
35
+ * Keys can be full block kind ("block.hero") or short form ("hero").
36
+ *
37
+ * This is SSR-safe - no context or hooks required.
38
+ *
39
+ * @example
40
+ * ```tsx
41
+ * <Page
42
+ * {...pageData}
43
+ * blockOverrides={{
44
+ * 'hero': MyCustomHero,
45
+ * 'block.testimonials': MyCustomTestimonials,
46
+ * }}
47
+ * />
48
+ * ```
49
+ */
50
+ blockOverrides?: BlockOverrides;
51
+ };
52
+ /**
53
+ * Pure renderer for Riverbank CMS pages.
54
+ *
55
+ * This component expects all data to be provided via props.
56
+ * For data fetching, use:
57
+ * - Server-side: `await loadPage({ client, siteId, path })`
58
+ * - Client-side: `usePage({ client, siteId, path })`
59
+ *
60
+ * @example Server-side (Next.js App Router)
61
+ * ```tsx
62
+ * import { createRiverbankClient } from '@riverbankcms/sdk';
63
+ * import { loadPage, Page } from '@riverbankcms/sdk/rendering';
64
+ *
65
+ * const client = createRiverbankClient({ apiKey, baseUrl });
66
+ *
67
+ * export default async function PageRoute({ params }) {
68
+ * const pageData = await loadPage({
69
+ * client,
70
+ * siteId: 'site-id',
71
+ * path: `/${params.slug}`,
72
+ * });
73
+ *
74
+ * return <Page {...pageData} />;
75
+ * }
76
+ * ```
77
+ *
78
+ * @example Client-side
79
+ * ```tsx
80
+ * import { createRiverbankClient } from '@riverbankcms/sdk';
81
+ * import { usePage, Page } from '@riverbankcms/sdk/rendering';
82
+ *
83
+ * const client = createRiverbankClient({ apiKey, baseUrl });
84
+ *
85
+ * function MyPage({ path }) {
86
+ * const pageData = usePage({ client, siteId: 'site-id', path });
87
+ *
88
+ * if (pageData.loading) return <LoadingState />;
89
+ * if (pageData.error) return <ErrorState error={pageData.error} />;
90
+ * if (!pageData.page) return <NotFound />;
91
+ *
92
+ * return <Page {...pageData} />;
93
+ * }
94
+ * ```
95
+ */
96
+ declare function Page({ page, theme, themeTokens: providedTokens, siteId, resolvedData, routeMap, wrapBlock, registry, usePlaceholders, blockOverrides, sdkConfig, dataContext, }: PageProps): react_jsx_runtime.JSX.Element;
97
+
98
+ /**
99
+ * Server-side helper to fetch all data needed for <Page> component.
100
+ *
101
+ * Use this in server components, getServerSideProps, or API routes.
102
+ */
103
+
104
+ /**
105
+ * SDK config from API response (without siteId which is stripped at storage).
106
+ * This is the runtime representation - for defining configs, use RiverbankSiteConfig.
107
+ */
108
+ type RuntimeSdkConfig = NonNullable<SiteResponse['sdkConfig']>;
109
+ type LoadPageParams = {
110
+ client: RiverbankClient;
111
+ siteId: string;
112
+ path: string;
113
+ pageId?: string;
114
+ /**
115
+ * If true, fetches draft/unpublished content instead of published content.
116
+ * This affects both the page structure and block data loaders.
117
+ * Requires API key with site access.
118
+ *
119
+ * @default false
120
+ */
121
+ preview?: boolean;
122
+ /**
123
+ * Code-based data loaders for custom blocks.
124
+ *
125
+ * Use this to fetch data from external APIs (not just whitelisted CMS endpoints).
126
+ * Keys are block kinds (e.g., 'custom.featured-products').
127
+ *
128
+ * Config-based loaders (defined in riverbank.config.ts) run first.
129
+ * Code loaders run second and take precedence on key conflicts.
130
+ *
131
+ * @example
132
+ * ```typescript
133
+ * const pageData = await loadPage({
134
+ * client,
135
+ * siteId: 'site-123',
136
+ * path: '/',
137
+ * dataLoaderOverrides: {
138
+ * 'custom.featured-products': {
139
+ * products: async (ctx) => {
140
+ * const res = await fetch(`https://api.shop.com/products?category=${ctx.content.categoryId}`);
141
+ * return res.json();
142
+ * },
143
+ * },
144
+ * },
145
+ * });
146
+ * ```
147
+ */
148
+ dataLoaderOverrides?: DataLoaderOverrides;
149
+ };
150
+ type LoadPageResult = Omit<PageProps, 'registry' | 'wrapBlock' | 'usePlaceholders' | 'blockOverrides'> & {
151
+ /**
152
+ * SDK site configuration, if available.
153
+ * Contains SDK-defined theme palette, section backgrounds, and style options.
154
+ */
155
+ sdkConfig: RuntimeSdkConfig | null;
156
+ };
157
+ /**
158
+ * Server-side helper to fetch all data needed for <Page> component.
159
+ *
160
+ * Fetches site data, page data, and prefetches block data loaders in parallel.
161
+ *
162
+ * @example Next.js App Router (published content)
163
+ * ```tsx
164
+ * import { createRiverbankClient } from '@riverbankcms/sdk';
165
+ * import { loadPage, Page } from '@riverbankcms/sdk/rendering';
166
+ *
167
+ * const client = createRiverbankClient({
168
+ * apiKey: process.env.RIVERBANK_API_KEY!,
169
+ * baseUrl: process.env.NEXT_PUBLIC_DASHBOARD_URL + '/api',
170
+ * });
171
+ *
172
+ * export default async function PageRoute({ params }) {
173
+ * const pageData = await loadPage({
174
+ * client,
175
+ * siteId: 'site-123',
176
+ * path: `/${params.slug || ''}`,
177
+ * });
178
+ *
179
+ * return <Page {...pageData} />;
180
+ * }
181
+ * ```
182
+ *
183
+ * @example Next.js App Router (preview/draft content)
184
+ * ```tsx
185
+ * export default async function PreviewRoute({ params, searchParams }) {
186
+ * const pageData = await loadPage({
187
+ * client,
188
+ * siteId: searchParams.siteId,
189
+ * path: `/${params.slug || ''}`,
190
+ * preview: true, // Fetch draft content
191
+ * });
192
+ *
193
+ * return <Page {...pageData} />;
194
+ * }
195
+ * ```
196
+ *
197
+ * @example Next.js Pages Router (getServerSideProps)
198
+ * ```tsx
199
+ * export async function getServerSideProps({ params }) {
200
+ * const pageData = await loadPage({
201
+ * client,
202
+ * siteId: 'site-123',
203
+ * path: `/${params.slug || ''}`,
204
+ * });
205
+ *
206
+ * return { props: pageData };
207
+ * }
208
+ *
209
+ * export default function PageRoute(props) {
210
+ * return <Page {...props} />;
211
+ * }
212
+ * ```
213
+ */
214
+ declare function loadPage(params: LoadPageParams): Promise<LoadPageResult>;
215
+
216
+ export { type LoadPageParams as L, Page as P, type RuntimeSdkConfig as R, type LoadPageResult as a, type PageProps as b, loadPage as l };