@riverbankcms/sdk 0.4.3 → 0.5.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 (178) hide show
  1. package/README.md +84 -0
  2. package/dist/cli/index.js +3463 -120
  3. package/dist/cli/index.js.map +1 -1
  4. package/dist/client/analytics.js +1 -1
  5. package/dist/client/analytics.js.map +1 -1
  6. package/dist/client/analytics.mjs +1 -1
  7. package/dist/client/analytics.mjs.map +1 -1
  8. package/dist/client/bookings.js +6 -6
  9. package/dist/client/bookings.js.map +1 -1
  10. package/dist/client/bookings.mjs +6 -6
  11. package/dist/client/bookings.mjs.map +1 -1
  12. package/dist/client/client.d.mts +2 -2
  13. package/dist/client/client.d.ts +2 -2
  14. package/dist/client/client.js +1379 -519
  15. package/dist/client/client.js.map +1 -1
  16. package/dist/client/client.mjs +1379 -519
  17. package/dist/client/client.mjs.map +1 -1
  18. package/dist/client/hooks.d.mts +2 -2
  19. package/dist/client/hooks.d.ts +2 -2
  20. package/dist/client/hooks.js +26 -11
  21. package/dist/client/hooks.js.map +1 -1
  22. package/dist/client/hooks.mjs +26 -11
  23. package/dist/client/hooks.mjs.map +1 -1
  24. package/dist/client/rendering/client.js +20 -14
  25. package/dist/client/rendering/client.js.map +1 -1
  26. package/dist/client/rendering/client.mjs +20 -14
  27. package/dist/client/rendering/client.mjs.map +1 -1
  28. package/dist/client/usePage-BTPnCuWC.d.mts +6511 -0
  29. package/dist/client/usePage-BXjk8BhD.d.mts +6704 -0
  30. package/dist/client/usePage-BafOS9UT.d.mts +6512 -0
  31. package/dist/client/usePage-BiOReg0_.d.ts +6704 -0
  32. package/dist/client/usePage-Bnx-kA6x.d.mts +6670 -0
  33. package/dist/client/usePage-DoPI6b8V.d.ts +6511 -0
  34. package/dist/client/usePage-QNWArrVO.d.ts +6670 -0
  35. package/dist/client/usePage-fBgPB6Oq.d.ts +6512 -0
  36. package/dist/server/{Layout-CXI_VkhN.d.ts → Layout-BClXUTsd.d.mts} +4 -4
  37. package/dist/server/{Layout-p6f3TLw9.d.mts → Layout-UXGjXv8M.d.ts} +4 -4
  38. package/dist/server/{chunk-6JBKKV3G.js → chunk-2KCF2DNK.js} +30 -10
  39. package/dist/server/chunk-2KCF2DNK.js.map +1 -0
  40. package/dist/server/chunk-5STV4MWD.js +189 -0
  41. package/dist/server/chunk-5STV4MWD.js.map +1 -0
  42. package/dist/server/{chunk-VHDDXCK6.js → chunk-7UPVCT3K.js} +1206 -496
  43. package/dist/server/chunk-7UPVCT3K.js.map +1 -0
  44. package/dist/server/{chunk-7DS4Q3GA.mjs → chunk-AEFWG657.mjs} +3 -3
  45. package/dist/server/chunk-AEFWG657.mjs.map +1 -0
  46. package/dist/server/{chunk-USQF2XTU.mjs → chunk-BYBJA6SP.mjs} +26 -11
  47. package/dist/server/chunk-BYBJA6SP.mjs.map +1 -0
  48. package/dist/server/{chunk-ES6QDZUX.mjs → chunk-C6FIJC7T.mjs} +2 -2
  49. package/dist/server/{chunk-N3PX76AP.mjs → chunk-CMABGYGI.mjs} +269 -135
  50. package/dist/server/chunk-CMABGYGI.mjs.map +1 -0
  51. package/dist/server/{chunk-TO7FD6TQ.js → chunk-I2D7KOEA.js} +4 -4
  52. package/dist/server/{chunk-TO7FD6TQ.js.map → chunk-I2D7KOEA.js.map} +1 -1
  53. package/dist/server/{chunk-R5B6IOFQ.js → chunk-KA74YRK6.js} +269 -135
  54. package/dist/server/chunk-KA74YRK6.js.map +1 -0
  55. package/dist/server/chunk-KFLZGNPO.mjs +189 -0
  56. package/dist/server/chunk-KFLZGNPO.mjs.map +1 -0
  57. package/dist/server/chunk-L5EA4FXU.mjs +134 -0
  58. package/dist/server/chunk-L5EA4FXU.mjs.map +1 -0
  59. package/dist/server/{chunk-U2NI3TS3.mjs → chunk-LNOUXALA.mjs} +1135 -425
  60. package/dist/server/chunk-LNOUXALA.mjs.map +1 -0
  61. package/dist/server/{chunk-24F6FTCI.mjs → chunk-OSF34JTQ.mjs} +4 -4
  62. package/dist/server/{chunk-G35R7N7B.js → chunk-P3NNN73G.js} +3 -3
  63. package/dist/server/{chunk-G35R7N7B.js.map → chunk-P3NNN73G.js.map} +1 -1
  64. package/dist/server/{chunk-I6K5REFT.mjs → chunk-P4K63SBZ.mjs} +24 -4
  65. package/dist/server/chunk-P4K63SBZ.mjs.map +1 -0
  66. package/dist/server/{chunk-HOY77YBF.js → chunk-RVDS7VSP.js} +5 -5
  67. package/dist/server/chunk-RVDS7VSP.js.map +1 -0
  68. package/dist/server/{chunk-2SSEBAHC.js → chunk-TT5JWA4X.js} +9 -9
  69. package/dist/server/{chunk-2SSEBAHC.js.map → chunk-TT5JWA4X.js.map} +1 -1
  70. package/dist/server/chunk-VSFQRHYZ.js +134 -0
  71. package/dist/server/chunk-VSFQRHYZ.js.map +1 -0
  72. package/dist/server/{chunk-EGTDJ4PL.js → chunk-YYO3RIFO.js} +26 -11
  73. package/dist/server/chunk-YYO3RIFO.js.map +1 -0
  74. package/dist/server/{chunk-OP2GHK27.mjs → chunk-Z5ZA6Q4D.mjs} +2 -2
  75. package/dist/server/{components-Dhiemsjd.d.ts → components-BmaJxgCV.d.mts} +20 -75
  76. package/dist/server/{components-C75e4poV.d.mts → components-DppHY5oD.d.ts} +20 -75
  77. package/dist/server/components.d.mts +11 -8
  78. package/dist/server/components.d.ts +11 -8
  79. package/dist/server/components.js +5 -4
  80. package/dist/server/components.js.map +1 -1
  81. package/dist/server/components.mjs +4 -3
  82. package/dist/server/config-validation.d.mts +3 -3
  83. package/dist/server/config-validation.d.ts +3 -3
  84. package/dist/server/config-validation.js +9 -5
  85. package/dist/server/config-validation.js.map +1 -1
  86. package/dist/server/config-validation.mjs +8 -4
  87. package/dist/server/config.d.mts +243 -5
  88. package/dist/server/config.d.ts +243 -5
  89. package/dist/server/config.js +72 -5
  90. package/dist/server/config.js.map +1 -1
  91. package/dist/server/config.mjs +72 -5
  92. package/dist/server/config.mjs.map +1 -1
  93. package/dist/server/core-DsNWrl3o.d.mts +44 -0
  94. package/dist/server/core-DsNWrl3o.d.ts +44 -0
  95. package/dist/server/data.d.mts +4 -3
  96. package/dist/server/data.d.ts +4 -3
  97. package/dist/server/data.js +3 -3
  98. package/dist/server/data.mjs +2 -2
  99. package/dist/server/{index-CAwBj3-A.d.ts → index-Bucs6UqG.d.mts} +2 -1
  100. package/dist/server/{index-C6o9LPvq.d.mts → index-Cp7tJuRt.d.ts} +2 -1
  101. package/dist/server/index.d.mts +84 -6
  102. package/dist/server/index.d.ts +84 -6
  103. package/dist/server/index.js +91 -2
  104. package/dist/server/index.js.map +1 -1
  105. package/dist/server/index.mjs +90 -1
  106. package/dist/server/index.mjs.map +1 -1
  107. package/dist/server/link-DjxLyC82.d.mts +23 -0
  108. package/dist/server/link-DjxLyC82.d.ts +23 -0
  109. package/dist/server/{loadContent-CdXfuCuE.d.mts → loadContent-BS-3wesN.d.mts} +4 -4
  110. package/dist/server/{loadContent-CsvQRoxb.d.ts → loadContent-Buvmudee.d.ts} +4 -4
  111. package/dist/server/{loadPage-p3AWwwrd.d.mts → loadPage-B8mQUUSo.d.mts} +5 -46
  112. package/dist/server/loadPage-DNQTTRHL.mjs +11 -0
  113. package/dist/server/{loadPage-BA0HiT-6.d.ts → loadPage-DP3nrHBi.d.ts} +5 -46
  114. package/dist/server/loadPage-IDGVDFBB.js +11 -0
  115. package/dist/server/{loadPage-DLC7DJZP.js.map → loadPage-IDGVDFBB.js.map} +1 -1
  116. package/dist/server/metadata.d.mts +6 -4
  117. package/dist/server/metadata.d.ts +6 -4
  118. package/dist/server/navigation.d.mts +199 -29
  119. package/dist/server/navigation.d.ts +199 -29
  120. package/dist/server/navigation.js +27 -43
  121. package/dist/server/navigation.js.map +1 -1
  122. package/dist/server/navigation.mjs +20 -36
  123. package/dist/server/navigation.mjs.map +1 -1
  124. package/dist/server/rendering/server.d.mts +8 -6
  125. package/dist/server/rendering/server.d.ts +8 -6
  126. package/dist/server/rendering/server.js +7 -6
  127. package/dist/server/rendering/server.js.map +1 -1
  128. package/dist/server/rendering/server.mjs +6 -5
  129. package/dist/server/rendering.d.mts +14 -10
  130. package/dist/server/rendering.d.ts +14 -10
  131. package/dist/server/rendering.js +9 -8
  132. package/dist/server/rendering.js.map +1 -1
  133. package/dist/server/rendering.mjs +8 -7
  134. package/dist/server/richTextSchema-DURiozvD.d.mts +62 -0
  135. package/dist/server/richTextSchema-DURiozvD.d.ts +62 -0
  136. package/dist/server/routing.d.mts +178 -11
  137. package/dist/server/routing.d.ts +178 -11
  138. package/dist/server/routing.js +95 -2
  139. package/dist/server/routing.js.map +1 -1
  140. package/dist/server/routing.mjs +94 -1
  141. package/dist/server/routing.mjs.map +1 -1
  142. package/dist/server/{schema-Bpy9N5ZI.d.mts → schema-Z6-afHJG.d.mts} +1 -1
  143. package/dist/server/{schema-Bpy9N5ZI.d.ts → schema-Z6-afHJG.d.ts} +1 -1
  144. package/dist/server/server.d.mts +9 -7
  145. package/dist/server/server.d.ts +9 -7
  146. package/dist/server/server.js +6 -6
  147. package/dist/server/server.mjs +5 -5
  148. package/dist/server/theme-bridge.js +8 -8
  149. package/dist/server/theme-bridge.mjs +2 -2
  150. package/dist/server/{types-Dj8B3QRb.d.ts → types-1cLz0vnq.d.mts} +55 -2
  151. package/dist/server/{types-txWsSxN7.d.mts → types-BjgZt8xJ.d.mts} +63 -2
  152. package/dist/server/{types-CdhKJrB0.d.mts → types-BvcJU7zk.d.ts} +55 -2
  153. package/dist/server/{types-BWQ-TohG.d.ts → types-CVykEqXN.d.ts} +289 -83
  154. package/dist/server/{types-CL916r6x.d.ts → types-DLBhEPSt.d.ts} +63 -2
  155. package/dist/server/{types-BLf-hE50.d.mts → types-Dsu9wsUh.d.mts} +289 -83
  156. package/dist/server/{validation-DzvDwwRo.d.mts → validation-BGuRo8P1.d.mts} +18 -5
  157. package/dist/server/{validation-CoU8uAiu.d.ts → validation-DU2YE7u5.d.ts} +18 -5
  158. package/package.json +5 -1
  159. package/dist/server/chunk-6JBKKV3G.js.map +0 -1
  160. package/dist/server/chunk-7DS4Q3GA.mjs.map +0 -1
  161. package/dist/server/chunk-EGTDJ4PL.js.map +0 -1
  162. package/dist/server/chunk-HOY77YBF.js.map +0 -1
  163. package/dist/server/chunk-I6K5REFT.mjs.map +0 -1
  164. package/dist/server/chunk-LCYGQDAB.mjs +0 -835
  165. package/dist/server/chunk-LCYGQDAB.mjs.map +0 -1
  166. package/dist/server/chunk-N3PX76AP.mjs.map +0 -1
  167. package/dist/server/chunk-R5B6IOFQ.js.map +0 -1
  168. package/dist/server/chunk-TNYU5EIO.js +0 -835
  169. package/dist/server/chunk-TNYU5EIO.js.map +0 -1
  170. package/dist/server/chunk-U2NI3TS3.mjs.map +0 -1
  171. package/dist/server/chunk-USQF2XTU.mjs.map +0 -1
  172. package/dist/server/chunk-VHDDXCK6.js.map +0 -1
  173. package/dist/server/loadPage-DLC7DJZP.js +0 -11
  174. package/dist/server/loadPage-GEGN4UAL.mjs +0 -11
  175. /package/dist/server/{chunk-ES6QDZUX.mjs.map → chunk-C6FIJC7T.mjs.map} +0 -0
  176. /package/dist/server/{chunk-24F6FTCI.mjs.map → chunk-OSF34JTQ.mjs.map} +0 -0
  177. /package/dist/server/{chunk-OP2GHK27.mjs.map → chunk-Z5ZA6Q4D.mjs.map} +0 -0
  178. /package/dist/server/{loadPage-GEGN4UAL.mjs.map → loadPage-DNQTTRHL.mjs.map} +0 -0
@@ -1,835 +0,0 @@
1
- import {
2
- PageRenderer,
3
- buildRichTextSchema,
4
- buildThemeRuntime,
5
- renderBlock
6
- } from "./chunk-U2NI3TS3.mjs";
7
- import {
8
- siteFooterManifest,
9
- siteHeaderManifest
10
- } from "./chunk-USQF2XTU.mjs";
11
- import {
12
- __require
13
- } from "./chunk-BJTO5JO5.mjs";
14
-
15
- // src/rendering/components/Page.tsx
16
- import { jsx } from "react/jsx-runtime";
17
- function Page({
18
- page,
19
- theme,
20
- themeTokens: providedTokens,
21
- siteId,
22
- resolvedData,
23
- routeMap,
24
- wrapBlock,
25
- registry,
26
- usePlaceholders = false,
27
- blockOverrides,
28
- sdkConfig,
29
- supabaseUrl,
30
- dataContext
31
- }) {
32
- const baseTokens = providedTokens ?? buildThemeRuntime(theme).tokens;
33
- const themeTokens = sdkConfig?.theme?.palette ? { ...baseTokens, palette: { ...baseTokens.palette, ...sdkConfig.theme.palette } } : baseTokens;
34
- return /* @__PURE__ */ jsx(
35
- PageRenderer,
36
- {
37
- theme,
38
- page,
39
- themeTokens,
40
- usePlaceholders,
41
- dataContext: {
42
- siteId,
43
- resolvedData,
44
- routes: routeMap,
45
- occurrenceContext: dataContext?.occurrenceContext ?? null,
46
- contentEntry: dataContext?.contentEntry ?? null,
47
- supabaseUrl
48
- },
49
- routeMap,
50
- wrapBlock,
51
- registry,
52
- blockOverrides,
53
- sdkConfig
54
- }
55
- );
56
- }
57
-
58
- // ../block-form/dist/server/index.mjs
59
- import { z as z18 } from "zod";
60
- import { z } from "zod";
61
- import { z as z2 } from "zod";
62
- import { z as z3 } from "zod";
63
- import { z as z4 } from "zod";
64
- import { z as z5 } from "zod";
65
- import { z as z6 } from "zod";
66
- import { z as z7 } from "zod";
67
- import { z as z8 } from "zod";
68
- import { z as z9 } from "zod";
69
- import { z as z10 } from "zod";
70
- import { z as z11 } from "zod";
71
- import { z as z12 } from "zod";
72
- import { z as z13 } from "zod";
73
- import { z as z14 } from "zod";
74
- import { z as z15 } from "zod";
75
- import { z as z16 } from "zod";
76
- import { z as z17 } from "zod";
77
- var __require2 = /* @__PURE__ */ ((x) => typeof __require !== "undefined" ? __require : typeof Proxy !== "undefined" ? new Proxy(x, {
78
- get: (a, b) => (typeof __require !== "undefined" ? __require : a)[b]
79
- }) : x)(function(x) {
80
- if (typeof __require !== "undefined") return __require.apply(this, arguments);
81
- throw Error('Dynamic require of "' + x + '" is not supported');
82
- });
83
- function buildTextFieldSchema(field) {
84
- const ui = field?.ui ?? {};
85
- const inputType = ui?.inputType;
86
- if (inputType === "email") {
87
- let s2 = z.string().email("Enter a valid email");
88
- if (typeof field.maxLength === "number") {
89
- s2 = s2.max(field.maxLength);
90
- }
91
- if (field.required) {
92
- return s2.min(1, "This field is required");
93
- }
94
- return s2.optional().nullable().or(z.literal(""));
95
- }
96
- if (inputType === "tel") {
97
- let s2 = z.string().regex(/^[+()0-9\s\-]{3,}$/, "Enter a valid phone number");
98
- if (typeof field.maxLength === "number") {
99
- s2 = s2.max(field.maxLength);
100
- }
101
- if (field.required) {
102
- return s2.min(1, "This field is required");
103
- }
104
- return s2.optional().nullable().or(z.literal(""));
105
- }
106
- let s = z.string();
107
- if (typeof field.maxLength === "number") {
108
- s = s.max(field.maxLength);
109
- }
110
- if (ui?.pattern) {
111
- try {
112
- const re = new RegExp(ui.pattern);
113
- s = s.regex(re);
114
- } catch {
115
- }
116
- }
117
- if (field.required) {
118
- return s.min(1, "This field is required");
119
- }
120
- return s.optional().nullable().or(z.literal(""));
121
- }
122
- function getTextFieldDefault(field) {
123
- if (field.defaultValue !== void 0 && field.defaultValue !== null) {
124
- return String(field.defaultValue);
125
- }
126
- if (field.required) {
127
- return field.label;
128
- }
129
- return "";
130
- }
131
- function buildNumberFieldSchema(field) {
132
- const ui = field?.ui ?? {};
133
- let s = z2.coerce.number();
134
- if (typeof ui?.min === "number") {
135
- s = s.min(ui.min);
136
- }
137
- if (typeof ui?.max === "number") {
138
- s = s.max(ui.max);
139
- }
140
- if (!field.required) {
141
- s = s.optional().nullable();
142
- }
143
- return s;
144
- }
145
- function getNumberFieldDefault(field) {
146
- if (field.defaultValue !== void 0) {
147
- return typeof field.defaultValue === "number" ? field.defaultValue : null;
148
- }
149
- return null;
150
- }
151
- function buildSelectFieldSchema(field) {
152
- const validValues = field.options?.map((opt) => opt.value) ?? [];
153
- if (validValues.length === 0) {
154
- return field.required ? z3.string().min(1) : z3.string().optional();
155
- }
156
- let schema = z3.enum(validValues);
157
- if (!field.required) {
158
- schema = schema.optional();
159
- }
160
- return schema;
161
- }
162
- function getSelectFieldDefault(field) {
163
- if (field.defaultValue !== void 0 && field.defaultValue !== null) {
164
- return String(field.defaultValue);
165
- }
166
- return field.options?.[0]?.value ?? "";
167
- }
168
- function buildBooleanFieldSchema(field) {
169
- return z4.boolean();
170
- }
171
- function getBooleanFieldDefault(field) {
172
- if (field.defaultValue !== void 0) {
173
- return Boolean(field.defaultValue);
174
- }
175
- return false;
176
- }
177
- function buildGroupFieldSchema(field, ctx) {
178
- const shape = {};
179
- for (const child of field.fields) {
180
- shape[child.id] = ctx.getFieldSchema(child);
181
- }
182
- return z5.object(shape).catchall(z5.unknown()).passthrough();
183
- }
184
- function getGroupFieldDefault(field, ctx) {
185
- const obj = {};
186
- for (const child of field.fields) {
187
- obj[child.id] = ctx.resolve(child);
188
- }
189
- return obj;
190
- }
191
- function buildModalFieldSchema(field, ctx) {
192
- const shape = {};
193
- const fields = field.schema?.fields ?? field.fields ?? [];
194
- for (const child of fields) {
195
- shape[child.id] = ctx.getFieldSchema(child);
196
- }
197
- return z6.object(shape).catchall(z6.unknown()).passthrough();
198
- }
199
- function getModalFieldDefault(field, ctx) {
200
- const obj = {};
201
- const fields = field.schema?.fields ?? field.fields ?? [];
202
- for (const child of fields) {
203
- obj[child.id] = ctx.resolve(child);
204
- }
205
- return obj;
206
- }
207
- function buildRepeaterFieldSchema(field, ctx) {
208
- let itemSchema;
209
- if (field.polymorphic && field.itemTypes) {
210
- const itemTypeSchemas = [];
211
- for (const [typeKey, itemType] of Object.entries(field.itemTypes)) {
212
- const childShape = {
213
- _type: z7.literal(typeKey)
214
- };
215
- for (const childField of itemType.fields) {
216
- childShape[childField.id] = ctx.getFieldSchema(childField);
217
- }
218
- itemTypeSchemas.push(z7.object(childShape).catchall(z7.unknown()).passthrough());
219
- }
220
- itemSchema = itemTypeSchemas.length > 1 ? z7.discriminatedUnion("_type", itemTypeSchemas) : itemTypeSchemas[0] ?? z7.object({ _type: z7.string() }).passthrough();
221
- } else if (!field.polymorphic && field.fields) {
222
- const childShape = {};
223
- for (const childField of field.fields) {
224
- childShape[childField.id] = ctx.getFieldSchema(childField);
225
- }
226
- itemSchema = z7.object(childShape).catchall(z7.unknown()).passthrough();
227
- } else {
228
- itemSchema = z7.any();
229
- }
230
- if (field.validation) {
231
- const customValidation = field.validation;
232
- if (field.required) {
233
- return customValidation;
234
- }
235
- return customValidation.optional();
236
- }
237
- let schema = z7.array(itemSchema);
238
- const minItems = field.minItems ?? 0;
239
- if (minItems > 0) {
240
- schema = schema.min(minItems, `Must have at least ${minItems} item(s)`);
241
- }
242
- if (field.maxItems !== void 0) {
243
- schema = schema.max(field.maxItems, `Must have at most ${field.maxItems} item(s)`);
244
- }
245
- if (field.required) {
246
- return schema;
247
- }
248
- return schema.optional();
249
- }
250
- function getRepeaterFieldDefault(field, ctx) {
251
- if (field.defaultValue !== void 0) {
252
- return Array.isArray(field.defaultValue) ? field.defaultValue : [];
253
- }
254
- const minItems = field.minItems ?? 0;
255
- if (minItems > 0) {
256
- const items = [];
257
- for (let i = 0; i < minItems; i++) {
258
- const item = {};
259
- if (field.polymorphic && field.itemTypes) {
260
- const firstType = Object.keys(field.itemTypes)[0];
261
- if (firstType) {
262
- item._type = firstType;
263
- const typeSchema = field.itemTypes[firstType];
264
- if (typeSchema) {
265
- for (const childField of typeSchema.fields) {
266
- item[childField.id] = ctx.resolve(childField);
267
- }
268
- }
269
- }
270
- } else if (field.fields) {
271
- for (const childField of field.fields) {
272
- item[childField.id] = ctx.resolve(childField);
273
- }
274
- }
275
- items.push(item);
276
- }
277
- return items;
278
- }
279
- return [];
280
- }
281
- var ALLOWED_PROTOCOLS = ["http:", "https:"];
282
- function buildUrlFieldSchema(field) {
283
- const message = `${field.label} must be a valid URL`;
284
- const validator = (value) => {
285
- if (!value) {
286
- return !field.required;
287
- }
288
- if (field.allowRelative && value.startsWith("/")) {
289
- return true;
290
- }
291
- try {
292
- const parsed = new URL(value);
293
- return ALLOWED_PROTOCOLS.includes(parsed.protocol);
294
- } catch {
295
- return false;
296
- }
297
- };
298
- const base = z8.string().trim().refine(validator, message);
299
- if (field.required) {
300
- return base.min(1, { message: `${field.label} is required` });
301
- }
302
- return z8.union([base, z8.literal("")]).optional().nullable();
303
- }
304
- function getUrlFieldDefault(field) {
305
- return field.defaultValue ?? "";
306
- }
307
- function buildTimeFieldSchema(field) {
308
- const base = z9.string();
309
- if (field.required) {
310
- return base.min(1, { message: `${field.label} is required` });
311
- }
312
- return z9.union([base, z9.literal(""), z9.null()]).optional().nullable();
313
- }
314
- function getTimeFieldDefault(field) {
315
- return field.defaultValue ?? null;
316
- }
317
- function buildDateFieldSchema(field) {
318
- const base = z10.string();
319
- if (field.required) {
320
- return base.min(1, { message: `${field.label} is required` });
321
- }
322
- return z10.union([base, z10.literal(""), z10.null()]).optional().nullable();
323
- }
324
- function getDateFieldDefault(field) {
325
- return field.defaultValue ?? null;
326
- }
327
- function buildDateTimeFieldSchema(field) {
328
- const base = z11.string().refine(
329
- (val) => {
330
- if (!val) return true;
331
- const date = new Date(val);
332
- return !isNaN(date.getTime());
333
- },
334
- { message: `${field.label} must be a valid date-time` }
335
- );
336
- if (field.required) {
337
- return base.min(1, { message: `${field.label} is required` });
338
- }
339
- return z11.union([base, z11.literal(""), z11.null()]).optional().nullable();
340
- }
341
- function getDateTimeFieldDefault(field) {
342
- return field.defaultValue ?? null;
343
- }
344
- var SLUG_PATTERN = /^(?:[a-z0-9]+(?:-[a-z0-9]+)*)(?:\/(?:[a-z0-9]+(?:-[a-z0-9]+)*))*$/;
345
- function buildSlugFieldSchema(field) {
346
- const base = z12.string().regex(SLUG_PATTERN, `${field.label} must use lowercase letters, numbers, and dashes`);
347
- const withLength = field.maxLength ? base.max(field.maxLength, { message: `${field.label} must be at most ${field.maxLength} characters` }) : base;
348
- if (field.required) {
349
- return withLength.min(1, { message: `${field.label} is required` });
350
- }
351
- return z12.union([withLength, z12.literal("")]).optional().nullable();
352
- }
353
- function getSlugFieldDefault(field) {
354
- return field.defaultValue ?? "";
355
- }
356
- function buildLinkFieldSchema(field) {
357
- const nullableString = z13.union([z13.string().min(1), z13.null()]);
358
- const internal = z13.object({
359
- kind: z13.literal("internal"),
360
- routeId: z13.string().min(1),
361
- entityId: z13.string().min(1).optional(),
362
- entityType: z13.enum(["page", "content"]).optional(),
363
- href: nullableString.optional(),
364
- title: nullableString.optional(),
365
- typeLabel: nullableString.optional(),
366
- contentTypeKey: nullableString.optional(),
367
- contentTypeName: nullableString.optional(),
368
- updatedAt: nullableString.optional()
369
- }).passthrough();
370
- const external = z13.object({
371
- kind: z13.literal("external"),
372
- href: z13.string().min(1)
373
- }).passthrough();
374
- const custom = z13.object({
375
- kind: z13.literal("url"),
376
- href: z13.string().min(1)
377
- }).passthrough();
378
- const linkSchema = z13.union([internal, external, custom]);
379
- if (field.required) {
380
- return linkSchema;
381
- }
382
- return z13.union([linkSchema, z13.null()]).optional();
383
- }
384
- function getLinkFieldDefault(_field) {
385
- return null;
386
- }
387
- function buildRichTextFieldSchema(config) {
388
- return buildRichTextSchema({
389
- required: config.required,
390
- label: config.label
391
- });
392
- }
393
- var EMPTY_RICH_TEXT_DOC = {
394
- type: "doc",
395
- content: [
396
- {
397
- type: "paragraph"
398
- }
399
- ]
400
- };
401
- function getRichTextFieldDefaultValue(_config) {
402
- return EMPTY_RICH_TEXT_DOC;
403
- }
404
- var MediaValueSchema = z14.object({
405
- kind: z14.enum(["image", "video"]),
406
- url: z14.string().url(),
407
- alt: z14.string().optional(),
408
- caption: z14.string().optional(),
409
- credit: z14.string().optional(),
410
- width: z14.number().optional(),
411
- height: z14.number().optional(),
412
- size: z14.number().optional(),
413
- mimeType: z14.string().optional()
414
- });
415
- function buildMediaFieldSchema(config) {
416
- let schema = MediaValueSchema.nullable();
417
- if (config.required) {
418
- schema = schema.refine((val) => val !== null, {
419
- message: `${config.label} is required`
420
- });
421
- }
422
- return schema;
423
- }
424
- function getMediaFieldDefaultValue(_config) {
425
- return null;
426
- }
427
- function buildTabGroupFieldSchema(field, ctx) {
428
- const shape = {};
429
- for (const tab of field.tabs) {
430
- for (const child of tab.fields) {
431
- shape[child.id] = ctx.getFieldSchema(child);
432
- }
433
- }
434
- if (field.activeTabField) {
435
- const tabIds = field.tabs.map((t) => t.id);
436
- if (tabIds.length > 0) {
437
- shape[field.activeTabField] = z15.enum(tabIds);
438
- }
439
- }
440
- return z15.object(shape).catchall(z15.unknown()).passthrough();
441
- }
442
- function getTabGroupFieldDefault(field, ctx) {
443
- const defaults = {};
444
- for (const tab of field.tabs) {
445
- for (const child of tab.fields) {
446
- defaults[child.id] = ctx.resolve(child);
447
- }
448
- }
449
- if (field.activeTabField && field.tabs.length > 0) {
450
- defaults[field.activeTabField] = field.tabs[0].id;
451
- }
452
- return defaults;
453
- }
454
- function buildPresetOrCustomFieldSchema(field, _ctx) {
455
- const presetValues = field.presets.map((p) => p.value);
456
- return z16.string();
457
- }
458
- function getPresetOrCustomFieldDefault(field, _ctx) {
459
- if (field.defaultValue !== void 0 && field.defaultValue !== null) {
460
- return String(field.defaultValue);
461
- }
462
- return field.presets[0]?.value ?? "";
463
- }
464
- function buildReferenceFieldSchema(field, _ctx) {
465
- return z17.string();
466
- }
467
- function getReferenceFieldDefault(field, _ctx) {
468
- if (field.defaultValue !== void 0 && field.defaultValue !== null) {
469
- return String(field.defaultValue);
470
- }
471
- if (field.required) {
472
- return `placeholder-${field.id}`;
473
- }
474
- return "";
475
- }
476
- var SCHEMA_BUILDERS = {
477
- text: buildTextFieldSchema,
478
- number: buildNumberFieldSchema,
479
- select: buildSelectFieldSchema,
480
- boolean: buildBooleanFieldSchema,
481
- group: buildGroupFieldSchema,
482
- modal: buildModalFieldSchema,
483
- repeater: buildRepeaterFieldSchema,
484
- url: buildUrlFieldSchema,
485
- time: buildTimeFieldSchema,
486
- date: buildDateFieldSchema,
487
- datetime: buildDateTimeFieldSchema,
488
- slug: buildSlugFieldSchema,
489
- link: buildLinkFieldSchema,
490
- richText: buildRichTextFieldSchema,
491
- media: buildMediaFieldSchema,
492
- tabGroup: buildTabGroupFieldSchema,
493
- presetOrCustom: buildPresetOrCustomFieldSchema,
494
- reference: buildReferenceFieldSchema
495
- };
496
- var DEFAULT_VALUE_BUILDERS = {
497
- text: getTextFieldDefault,
498
- number: getNumberFieldDefault,
499
- select: getSelectFieldDefault,
500
- boolean: getBooleanFieldDefault,
501
- group: getGroupFieldDefault,
502
- modal: getModalFieldDefault,
503
- repeater: getRepeaterFieldDefault,
504
- url: getUrlFieldDefault,
505
- time: getTimeFieldDefault,
506
- date: getDateFieldDefault,
507
- datetime: getDateTimeFieldDefault,
508
- slug: getSlugFieldDefault,
509
- link: getLinkFieldDefault,
510
- richText: getRichTextFieldDefaultValue,
511
- media: getMediaFieldDefaultValue,
512
- tabGroup: getTabGroupFieldDefault,
513
- presetOrCustom: getPresetOrCustomFieldDefault,
514
- reference: getReferenceFieldDefault
515
- };
516
- function buildFieldSchema(field, ctx) {
517
- const builder = SCHEMA_BUILDERS[field.type];
518
- if (!builder) {
519
- console.warn(`No schema builder registered for field type: ${field.type}`);
520
- return __require2("zod").z.any();
521
- }
522
- return builder(field, ctx);
523
- }
524
- function getFieldDefault(field, ctx) {
525
- const getDefault = DEFAULT_VALUE_BUILDERS[field.type];
526
- if (!getDefault) {
527
- console.warn(`No default value builder registered for field type: ${field.type}`);
528
- return field.defaultValue;
529
- }
530
- return getDefault(field, ctx);
531
- }
532
- var DEFAULT_ROLE = "author";
533
- var rolePriority = {
534
- author: 0,
535
- designer: 1,
536
- admin: 2
537
- };
538
- function createManifestFormAdapter(manifest, options) {
539
- const role = options?.role ?? DEFAULT_ROLE;
540
- const fields = (manifest.fields ?? []).map((field) => transformField(field, role)).filter(Boolean);
541
- const schema = buildValidationSchema(fields);
542
- return { fields, schema };
543
- }
544
- function transformField(field, role) {
545
- if (!isFieldVisible(field, role)) {
546
- return void 0;
547
- }
548
- if (field.type !== "group" && field.type !== "repeater") {
549
- return field;
550
- }
551
- if (field.type === "group") {
552
- const children = (field.schema?.fields ?? []).map((child) => transformField(child, role)).filter(Boolean);
553
- if (!children.length) {
554
- return void 0;
555
- }
556
- const { schema: _schema, ...rest } = field;
557
- return { ...rest, fields: children };
558
- }
559
- if (field.type === "repeater") {
560
- if (field.polymorphic && field.itemTypes) {
561
- const itemTypes = {};
562
- for (const [typeKey, itemType] of Object.entries(field.itemTypes)) {
563
- const children2 = (itemType.fields ?? []).map((child) => transformField(child, role)).filter(Boolean);
564
- if (children2.length > 0) {
565
- itemTypes[typeKey] = {
566
- label: itemType.label,
567
- icon: itemType.icon,
568
- fields: children2
569
- };
570
- }
571
- }
572
- if (Object.keys(itemTypes).length === 0) {
573
- return void 0;
574
- }
575
- const { schema: _schema2, ...rest2 } = field;
576
- return { ...rest2, itemTypes };
577
- }
578
- const children = (field.schema?.fields ?? []).map((child) => transformField(child, role)).filter(Boolean);
579
- if (!children.length) {
580
- return void 0;
581
- }
582
- const { schema: _schema3, polymorphic: _polymorphic, itemTypes: _itemTypes, ...rest } = field;
583
- return { ...rest, fields: children };
584
- }
585
- return void 0;
586
- }
587
- function isFieldVisible(field, role) {
588
- if (role === "admin") {
589
- return true;
590
- }
591
- const allowed = field.visibleRoles;
592
- if (!allowed || allowed.length === 0) {
593
- return true;
594
- }
595
- return allowed.some((visibility) => rolePriority[role] >= rolePriority[visibility]);
596
- }
597
- function buildValidationSchema(fields) {
598
- const shape = {};
599
- const ctx = {
600
- getFieldSchema: (field) => buildFieldSchema(field, ctx)
601
- };
602
- for (const field of fields) {
603
- shape[field.id] = buildFieldSchema(field, ctx);
604
- }
605
- return z18.object(shape).catchall(z18.unknown()).passthrough();
606
- }
607
- function createManifestDefaultValues(manifest, data = {}, options = {}) {
608
- const { fields } = createManifestFormAdapter(manifest, {
609
- role: options.role,
610
- ...options.adapterOptions
611
- });
612
- const ctx = {
613
- resolve: (field) => getFieldDefault(field, ctx)
614
- };
615
- const result = {};
616
- for (const field of fields) {
617
- const rawValue = data[field.id];
618
- result[field.id] = ensureFieldValue(field, rawValue, ctx);
619
- }
620
- return result;
621
- }
622
- function ensureFieldValue(field, rawValue, ctx) {
623
- if (field.type === "repeater") {
624
- if (rawValue === void 0) {
625
- rawValue = getFieldDefault(field, ctx);
626
- }
627
- const items = Array.isArray(rawValue) ? rawValue : [];
628
- return items.map((item) => ensureRepeaterItem(field, item, ctx));
629
- }
630
- if (rawValue === void 0) {
631
- return getFieldDefault(field, ctx);
632
- }
633
- return rawValue;
634
- }
635
- function ensureRepeaterItem(field, value, ctx) {
636
- const itemData = typeof value === "object" && value !== null ? { ...value } : {};
637
- if (field.polymorphic && field.itemTypes) {
638
- const itemType = typeof itemData._type === "string" ? itemData._type : Object.keys(field.itemTypes)[0];
639
- const typeSchema = field.itemTypes[itemType];
640
- if (!typeSchema) return itemData;
641
- for (const child of typeSchema.fields) {
642
- if (child.type === "group" && child?.ui?.flattenInRepeater) {
643
- const group = child;
644
- for (const gc of group.fields) {
645
- itemData[gc.id] = ensureFieldValue(gc, itemData[gc.id], ctx);
646
- }
647
- } else {
648
- itemData[child.id] = ensureFieldValue(child, itemData[child.id], ctx);
649
- }
650
- }
651
- return itemData;
652
- }
653
- if (!field.polymorphic && field.fields) {
654
- for (const child of field.fields) {
655
- if (child.type === "group" && child?.ui?.flattenInRepeater) {
656
- const group = child;
657
- for (const gc of group.fields) {
658
- itemData[gc.id] = ensureFieldValue(gc, itemData[gc.id], ctx);
659
- }
660
- } else {
661
- itemData[child.id] = ensureFieldValue(child, itemData[child.id], ctx);
662
- }
663
- }
664
- }
665
- return itemData;
666
- }
667
-
668
- // ../site-renderer/dist/index.mjs
669
- function selectPrimaryMenu(menus) {
670
- if (!menus.length) {
671
- return null;
672
- }
673
- const primary = menus.find((menu) => menu.isPrimary);
674
- return primary ?? menus[0] ?? null;
675
- }
676
- function buildMenuViewModel(menu) {
677
- if (!menu) {
678
- return { items: [], ctaItem: null };
679
- }
680
- const flatItems = menu.items.filter((item) => item.parentId === null && item.urlType !== "dropdown").sort((a, b) => a.orderIndex - b.orderIndex);
681
- const items = [];
682
- let ctaItem = null;
683
- for (const item of flatItems) {
684
- const viewItem = {
685
- id: item.id,
686
- label: item.label,
687
- link: convertNavigationLink(item),
688
- target: null,
689
- rel: null,
690
- active: false
691
- // TODO: Compute active state based on current route
692
- };
693
- if (!ctaItem && Boolean(item.isCta)) {
694
- ctaItem = { ...viewItem, variant: "primary" };
695
- continue;
696
- }
697
- items.push(viewItem);
698
- }
699
- return { items, ctaItem };
700
- }
701
- function buildLogoViewModel(logo, fallbackTitle) {
702
- if (!logo) {
703
- return null;
704
- }
705
- if (!logo.url && !logo.storagePath) {
706
- return null;
707
- }
708
- const alt = logo.alt && logo.alt.trim().length > 0 ? logo.alt : fallbackTitle ?? "Site logo";
709
- const viewModel = {
710
- type: "image",
711
- src: logo.url ?? "",
712
- // Empty when using storagePath - MediaNode builds direct URL
713
- alt,
714
- assetId: logo.assetId ?? void 0,
715
- width: logo.width ?? void 0,
716
- height: logo.height ?? void 0,
717
- storagePath: logo.storagePath ?? void 0,
718
- storageBucket: logo.storageBucket ?? void 0
719
- };
720
- return viewModel;
721
- }
722
- function convertNavigationLink(item) {
723
- const payload = item.url ?? null;
724
- if (!payload) return null;
725
- const kind = typeof payload.kind === "string" ? payload.kind : null;
726
- if (kind === "external" || kind === "url") {
727
- const href = typeof payload.href === "string" ? payload.href : null;
728
- return href ? { kind, href } : null;
729
- }
730
- if (kind === "internal") {
731
- const routeId = typeof payload.routeId === "string" ? payload.routeId : null;
732
- const entityId = typeof payload.entityId === "string" ? payload.entityId : null;
733
- const entityType = typeof payload.entityType === "string" && (payload.entityType === "page" || payload.entityType === "content") ? payload.entityType : null;
734
- const href = typeof payload.href === "string" ? payload.href : null;
735
- const title = typeof payload.title === "string" ? payload.title : null;
736
- const typeLabel = typeof payload.typeLabel === "string" ? payload.typeLabel : null;
737
- if (!routeId || !entityId || !entityType || !href || !title || !typeLabel) {
738
- return null;
739
- }
740
- return {
741
- kind: "internal",
742
- routeId,
743
- entityId,
744
- entityType,
745
- href,
746
- title,
747
- typeLabel,
748
- contentTypeKey: typeof payload.contentTypeKey === "string" ? payload.contentTypeKey : null,
749
- contentTypeName: typeof payload.contentTypeName === "string" ? payload.contentTypeName : null,
750
- updatedAt: typeof payload.updatedAt === "string" ? payload.updatedAt : null
751
- };
752
- }
753
- return null;
754
- }
755
- var HEADER_DEFAULTS = createManifestDefaultValues(siteHeaderManifest);
756
- var FOOTER_DEFAULTS = createManifestDefaultValues(siteFooterManifest);
757
-
758
- // src/rendering/components/Layout.tsx
759
- import { Fragment, jsxs } from "react/jsx-runtime";
760
- async function Layout({
761
- siteData: providedSiteData,
762
- client,
763
- siteId,
764
- slug,
765
- domain,
766
- children,
767
- header = true,
768
- footer = true,
769
- headerVariant
770
- }) {
771
- let siteData = providedSiteData;
772
- if (!siteData) {
773
- if (!client) {
774
- throw new Error("Layout: must provide either siteData or client");
775
- }
776
- if (!siteId && !slug && !domain) {
777
- throw new Error("Layout: must provide siteId, slug, or domain when using client");
778
- }
779
- siteData = await client.getSite({ id: siteId, slug, domain });
780
- }
781
- const { site, theme, navigation, layout, routes } = siteData;
782
- const themeRuntime = buildThemeRuntime(theme);
783
- const menu = selectPrimaryMenu(navigation);
784
- const menuViewModel = buildMenuViewModel(menu);
785
- const logoViewModel = buildLogoViewModel(layout.logo ?? null, site.title);
786
- const headerData = {
787
- menu: menuViewModel,
788
- logo: logoViewModel,
789
- site,
790
- theme,
791
- routes
792
- };
793
- const headerContent = headerVariant ? { ...layout.header, variant: headerVariant } : layout.header;
794
- const themeWithVariant = headerVariant ? {
795
- ...theme,
796
- header: { ...theme.header, variant: headerVariant }
797
- } : theme;
798
- const viewModelOverrides = {
799
- $root: {
800
- siteId: site.id,
801
- routes,
802
- theme: themeWithVariant
803
- },
804
- site,
805
- menu: menuViewModel,
806
- content: {
807
- logo: logoViewModel
808
- }
809
- };
810
- let headerElement = null;
811
- if (header === true) {
812
- headerElement = renderBlock(siteHeaderManifest, headerContent, {
813
- theme: themeRuntime.tokens,
814
- themeConfig: themeWithVariant,
815
- viewModelOverrides
816
- });
817
- } else if (typeof header === "function") {
818
- headerElement = header(headerData);
819
- }
820
- return /* @__PURE__ */ jsxs(Fragment, { children: [
821
- headerElement,
822
- children,
823
- footer && renderBlock(siteFooterManifest, layout.footer, {
824
- theme: themeRuntime.tokens,
825
- themeConfig: theme,
826
- viewModelOverrides
827
- })
828
- ] });
829
- }
830
-
831
- export {
832
- Page,
833
- Layout
834
- };
835
- //# sourceMappingURL=chunk-LCYGQDAB.mjs.map