@riverbankcms/sdk 0.2.0 → 0.2.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 (176) hide show
  1. package/dist/cli/index.js +4840 -9
  2. package/dist/cli/index.js.map +1 -1
  3. package/dist/client/bookings.d.mts +82 -2
  4. package/dist/client/bookings.d.ts +82 -2
  5. package/dist/client/bookings.js +1623 -3
  6. package/dist/client/bookings.js.map +1 -1
  7. package/dist/client/bookings.mjs +1610 -5
  8. package/dist/client/bookings.mjs.map +1 -1
  9. package/dist/client/client.d.mts +8 -5
  10. package/dist/client/client.d.ts +8 -5
  11. package/dist/client/client.js +16856 -322
  12. package/dist/client/client.js.map +1 -1
  13. package/dist/client/client.mjs +16838 -307
  14. package/dist/client/client.mjs.map +1 -1
  15. package/dist/client/hooks.d.mts +10 -7
  16. package/dist/client/hooks.d.ts +10 -7
  17. package/dist/client/hooks.js +5074 -4
  18. package/dist/client/hooks.js.map +1 -1
  19. package/dist/client/hooks.mjs +5074 -4
  20. package/dist/client/hooks.mjs.map +1 -1
  21. package/dist/client/rendering/client.d.mts +7 -1
  22. package/dist/client/rendering/client.d.ts +7 -1
  23. package/dist/client/rendering/client.js +17388 -2
  24. package/dist/client/rendering/client.js.map +1 -1
  25. package/dist/client/rendering/client.mjs +17382 -2
  26. package/dist/client/rendering/client.mjs.map +1 -1
  27. package/dist/client/resolver-BhueZVxZ.d.mts +61 -0
  28. package/dist/client/resolver-BhueZVxZ.d.ts +61 -0
  29. package/dist/client/usePage-BBcFCxOU.d.ts +6297 -0
  30. package/dist/client/usePage-BydHcMYB.d.mts +6297 -0
  31. package/dist/server/Layout-CLg8oH_S.d.ts +44 -0
  32. package/dist/server/Layout-DK_9OOgb.d.mts +44 -0
  33. package/dist/server/chunk-3J46ILMJ.mjs +2111 -0
  34. package/dist/server/chunk-3J46ILMJ.mjs.map +1 -0
  35. package/dist/server/{chunk-JB4LIEFS.js → chunk-5R4NMVXA.js} +15 -8
  36. package/dist/server/chunk-5R4NMVXA.js.map +1 -0
  37. package/dist/server/{chunk-ADREPXFU.js → chunk-62ZJI564.js} +3 -3
  38. package/dist/server/{chunk-ADREPXFU.js.map → chunk-62ZJI564.js.map} +1 -1
  39. package/dist/server/chunk-7DS4Q3GA.mjs +333 -0
  40. package/dist/server/chunk-7DS4Q3GA.mjs.map +1 -0
  41. package/dist/server/chunk-BJTO5JO5.mjs +11 -0
  42. package/dist/server/{chunk-4Z5FBFRL.mjs → chunk-BPKYRPCQ.mjs} +7 -3
  43. package/dist/server/{chunk-4Z5FBFRL.mjs.map → chunk-BPKYRPCQ.mjs.map} +1 -1
  44. package/dist/server/chunk-DGUM43GV.js +11 -0
  45. package/dist/server/chunk-DGUM43GV.js.map +1 -0
  46. package/dist/server/chunk-EGTDJ4PL.js +5461 -0
  47. package/dist/server/chunk-EGTDJ4PL.js.map +1 -0
  48. package/dist/server/chunk-FK64TZBT.mjs +831 -0
  49. package/dist/server/chunk-FK64TZBT.mjs.map +1 -0
  50. package/dist/server/chunk-GKYNDDJS.js +2111 -0
  51. package/dist/server/chunk-GKYNDDJS.js.map +1 -0
  52. package/dist/server/chunk-HOY77YBF.js +333 -0
  53. package/dist/server/chunk-HOY77YBF.js.map +1 -0
  54. package/dist/server/chunk-INWKF3IC.js +831 -0
  55. package/dist/server/chunk-INWKF3IC.js.map +1 -0
  56. package/dist/server/{chunk-2RW5HAQQ.mjs → chunk-JTAERCX2.mjs} +2 -2
  57. package/dist/server/chunk-O5DC7MYW.mjs +9606 -0
  58. package/dist/server/chunk-O5DC7MYW.mjs.map +1 -0
  59. package/dist/server/{chunk-PEAXKTDU.mjs → chunk-OP2GHK27.mjs} +2 -2
  60. package/dist/server/{chunk-WKG57P2H.mjs → chunk-PN3CHDVX.mjs} +10 -3
  61. package/dist/server/{chunk-WKG57P2H.mjs.map → chunk-PN3CHDVX.mjs.map} +1 -1
  62. package/dist/server/chunk-SF63XAX7.js +9606 -0
  63. package/dist/server/chunk-SF63XAX7.js.map +1 -0
  64. package/dist/server/{chunk-F472SMKX.js → chunk-TO7FD6TQ.js} +4 -4
  65. package/dist/server/{chunk-F472SMKX.js.map → chunk-TO7FD6TQ.js.map} +1 -1
  66. package/dist/server/chunk-USQF2XTU.mjs +5461 -0
  67. package/dist/server/chunk-USQF2XTU.mjs.map +1 -0
  68. package/dist/server/{chunk-SW7LE4M3.js → chunk-XLVL5WPH.js} +12 -8
  69. package/dist/server/chunk-XLVL5WPH.js.map +1 -0
  70. package/dist/server/components-BzdA6NAc.d.mts +305 -0
  71. package/dist/server/components-DhIcstww.d.ts +305 -0
  72. package/dist/server/components.d.mts +13 -49
  73. package/dist/server/components.d.ts +13 -49
  74. package/dist/server/components.js +7 -4
  75. package/dist/server/components.js.map +1 -1
  76. package/dist/server/components.mjs +9 -6
  77. package/dist/server/components.mjs.map +1 -1
  78. package/dist/server/config-validation.d.mts +2 -2
  79. package/dist/server/config-validation.d.ts +2 -2
  80. package/dist/server/config-validation.js +6 -3
  81. package/dist/server/config-validation.js.map +1 -1
  82. package/dist/server/config-validation.mjs +5 -2
  83. package/dist/server/config.d.mts +3 -3
  84. package/dist/server/config.d.ts +3 -3
  85. package/dist/server/config.js +6 -3
  86. package/dist/server/config.js.map +1 -1
  87. package/dist/server/config.mjs +5 -2
  88. package/dist/server/config.mjs.map +1 -1
  89. package/dist/server/data.d.mts +9 -8
  90. package/dist/server/data.d.ts +9 -8
  91. package/dist/server/data.js +4 -2
  92. package/dist/server/data.js.map +1 -1
  93. package/dist/server/data.mjs +3 -1
  94. package/dist/server/{index-C6M0Wfjq.d.ts → index-BB28KAui.d.ts} +1 -1
  95. package/dist/server/{index-B0yI_V6Z.d.mts → index-C_FVup_o.d.mts} +1 -1
  96. package/dist/server/index.d.mts +1554 -5
  97. package/dist/server/index.d.ts +1554 -5
  98. package/dist/server/index.js +4 -4
  99. package/dist/server/index.js.map +1 -1
  100. package/dist/server/index.mjs +4 -4
  101. package/dist/server/index.mjs.map +1 -1
  102. package/dist/server/{loadContent-CJcbYF3J.d.ts → loadContent-AQOBf_gP.d.ts} +4 -4
  103. package/dist/server/{loadContent-zhlL4YSE.d.mts → loadContent-DBmprsB4.d.mts} +4 -4
  104. package/dist/server/loadPage-3ECPF426.js +11 -0
  105. package/dist/server/loadPage-3ECPF426.js.map +1 -0
  106. package/dist/server/{loadPage-CCf15nt8.d.mts → loadPage-BMg8PJxJ.d.ts} +146 -5
  107. package/dist/server/loadPage-LW273NYO.mjs +11 -0
  108. package/dist/server/loadPage-LW273NYO.mjs.map +1 -0
  109. package/dist/server/{loadPage-BYmVMk0V.d.ts → loadPage-pg4HimlK.d.mts} +146 -5
  110. package/dist/server/metadata.d.mts +9 -6
  111. package/dist/server/metadata.d.ts +9 -6
  112. package/dist/server/metadata.js +3 -1
  113. package/dist/server/metadata.js.map +1 -1
  114. package/dist/server/metadata.mjs +2 -0
  115. package/dist/server/metadata.mjs.map +1 -1
  116. package/dist/server/rendering/server.d.mts +9 -7
  117. package/dist/server/rendering/server.d.ts +9 -7
  118. package/dist/server/rendering/server.js +7 -4
  119. package/dist/server/rendering/server.js.map +1 -1
  120. package/dist/server/rendering/server.mjs +6 -3
  121. package/dist/server/rendering.d.mts +172 -9
  122. package/dist/server/rendering.d.ts +172 -9
  123. package/dist/server/rendering.js +12 -9
  124. package/dist/server/rendering.js.map +1 -1
  125. package/dist/server/rendering.mjs +14 -11
  126. package/dist/server/rendering.mjs.map +1 -1
  127. package/dist/server/routing.d.mts +9 -6
  128. package/dist/server/routing.d.ts +9 -6
  129. package/dist/server/routing.js +4 -2
  130. package/dist/server/routing.js.map +1 -1
  131. package/dist/server/routing.mjs +3 -1
  132. package/dist/server/routing.mjs.map +1 -1
  133. package/dist/server/schema-Bpy9N5ZI.d.mts +1870 -0
  134. package/dist/server/schema-Bpy9N5ZI.d.ts +1870 -0
  135. package/dist/server/server.d.mts +11 -8
  136. package/dist/server/server.d.ts +11 -8
  137. package/dist/server/server.js +7 -5
  138. package/dist/server/server.js.map +1 -1
  139. package/dist/server/server.mjs +6 -4
  140. package/dist/server/theme-bridge.js +13 -10
  141. package/dist/server/theme-bridge.js.map +1 -1
  142. package/dist/server/theme-bridge.mjs +10 -7
  143. package/dist/server/theme-bridge.mjs.map +1 -1
  144. package/dist/server/theme.js +3 -1
  145. package/dist/server/theme.js.map +1 -1
  146. package/dist/server/theme.mjs +2 -0
  147. package/dist/server/theme.mjs.map +1 -1
  148. package/dist/server/{types-BCeqWtI2.d.ts → types--u4GLCAY.d.ts} +1 -1
  149. package/dist/server/types-BprgZt-t.d.ts +4149 -0
  150. package/dist/server/types-C0G9IxWO.d.mts +4149 -0
  151. package/dist/server/{types-Bbo01M7P.d.mts → types-_nDnPHpv.d.mts} +27 -1
  152. package/dist/server/{types-Bbo01M7P.d.ts → types-_nDnPHpv.d.ts} +27 -1
  153. package/dist/server/{types-BCeqWtI2.d.mts → types-_zWJTgv0.d.mts} +1 -1
  154. package/package.json +6 -6
  155. package/dist/server/chunk-3KKZVGH4.mjs +0 -179
  156. package/dist/server/chunk-3KKZVGH4.mjs.map +0 -1
  157. package/dist/server/chunk-4Z3GPTCS.js +0 -179
  158. package/dist/server/chunk-4Z3GPTCS.js.map +0 -1
  159. package/dist/server/chunk-JB4LIEFS.js.map +0 -1
  160. package/dist/server/chunk-QQ6U4QX6.js +0 -120
  161. package/dist/server/chunk-QQ6U4QX6.js.map +0 -1
  162. package/dist/server/chunk-R5YGLRUG.mjs +0 -122
  163. package/dist/server/chunk-R5YGLRUG.mjs.map +0 -1
  164. package/dist/server/chunk-SW7LE4M3.js.map +0 -1
  165. package/dist/server/chunk-W3K7LVPS.mjs +0 -120
  166. package/dist/server/chunk-W3K7LVPS.mjs.map +0 -1
  167. package/dist/server/chunk-YHEZMVTS.js +0 -122
  168. package/dist/server/chunk-YHEZMVTS.js.map +0 -1
  169. package/dist/server/loadPage-DVH3DW6E.js +0 -9
  170. package/dist/server/loadPage-DVH3DW6E.js.map +0 -1
  171. package/dist/server/loadPage-PHQZ6XQZ.mjs +0 -9
  172. package/dist/server/types-C6gmRHLe.d.mts +0 -150
  173. package/dist/server/types-C6gmRHLe.d.ts +0 -150
  174. /package/dist/server/{loadPage-PHQZ6XQZ.mjs.map → chunk-BJTO5JO5.mjs.map} +0 -0
  175. /package/dist/server/{chunk-2RW5HAQQ.mjs.map → chunk-JTAERCX2.mjs.map} +0 -0
  176. /package/dist/server/{chunk-PEAXKTDU.mjs.map → chunk-OP2GHK27.mjs.map} +0 -0
@@ -0,0 +1,4149 @@
1
+ import { AIChatMessage } from '@riverbankcms/ai';
2
+ import { S as SdkCustomBlock } from './schema-Bpy9N5ZI.mjs';
3
+ import { z } from 'zod';
4
+ import { ListMediaAssetsResult, MediaAssetWithLabels } from '@riverbankcms/media-storage-supabase';
5
+ import { ImpersonationScope, DbRow, CamelizeKeys, DbJson, DbDatabase } from '@riverbankcms/db';
6
+
7
+ type BillingInterval = 'monthly' | 'annual';
8
+ type FeatureKey = 'sites.multiple' | 'ai.workflows' | 'support.priority' | 'themes.advanced' | 'limits.highUsage' | 'collaboration.admin' | 'collaboration.editor';
9
+
10
+ type SubscriptionStatus = 'incomplete' | 'trialing' | 'active' | 'past_due' | 'canceled' | 'unpaid';
11
+ interface SubscriptionRecord {
12
+ id: string;
13
+ userId: string;
14
+ customerId: string;
15
+ planId: string;
16
+ interval: BillingInterval;
17
+ status: SubscriptionStatus;
18
+ currentPeriodEnd: string;
19
+ cancelAtPeriodEnd: boolean;
20
+ trialEnds_at?: string | null;
21
+ raw?: Record<string, unknown>;
22
+ }
23
+
24
+ interface MembershipState {
25
+ userId: string;
26
+ planId: string;
27
+ interval: BillingInterval;
28
+ status: SubscriptionRecord['status'];
29
+ currentPeriodEnd: string;
30
+ cancelAtPeriodEnd: boolean;
31
+ trialEndsAt?: string | null;
32
+ isPaid: boolean;
33
+ active: boolean;
34
+ capabilities: FeatureKey[];
35
+ }
36
+
37
+ type ExpandedPalette = {
38
+ meta: PaletteMeta;
39
+ [token: string]: any;
40
+ };
41
+
42
+ declare const paletteMetaSchema: z.ZodObject<{
43
+ mode: z.ZodEnum<{
44
+ dark: "dark";
45
+ light: "light";
46
+ }>;
47
+ }, z.core.$strip>;
48
+ declare const themeSchema: z.ZodObject<{
49
+ name: z.ZodString;
50
+ description: z.ZodString;
51
+ rationale: z.ZodString;
52
+ axes: z.ZodObject<{
53
+ tone: z.ZodEnum<{
54
+ bold: "bold";
55
+ classic: "classic";
56
+ minimal: "minimal";
57
+ }>;
58
+ energy: z.ZodEnum<{
59
+ calm: "calm";
60
+ vibrant: "vibrant";
61
+ }>;
62
+ density: z.ZodEnum<{
63
+ compact: "compact";
64
+ airy: "airy";
65
+ regular: "regular";
66
+ }>;
67
+ mediaBias: z.ZodEnum<{
68
+ text: "text";
69
+ media: "media";
70
+ mixed: "mixed";
71
+ }>;
72
+ conversionBias: z.ZodEnum<{
73
+ low: "low";
74
+ high: "high";
75
+ med: "med";
76
+ }>;
77
+ motion: z.ZodEnum<{
78
+ subtle: "subtle";
79
+ standard: "standard";
80
+ expressive: "expressive";
81
+ }>;
82
+ }, z.core.$strip>;
83
+ palette: z.ZodObject<{
84
+ colors: z.ZodArray<z.ZodObject<{
85
+ name: z.ZodString;
86
+ hex: z.ZodString;
87
+ }, z.core.$strip>>;
88
+ meta: z.ZodObject<{
89
+ mode: z.ZodEnum<{
90
+ dark: "dark";
91
+ light: "light";
92
+ }>;
93
+ }, z.core.$strip>;
94
+ }, z.core.$strip>;
95
+ typography: z.ZodObject<{
96
+ body: z.ZodObject<{
97
+ family: z.ZodString;
98
+ weight: z.ZodEnum<{
99
+ bold: "bold";
100
+ medium: "medium";
101
+ light: "light";
102
+ regular: "regular";
103
+ semibold: "semibold";
104
+ }>;
105
+ letterSpacing: z.ZodEnum<{
106
+ normal: "normal";
107
+ loose: "loose";
108
+ tight: "tight";
109
+ }>;
110
+ lineHeight: z.ZodEnum<{
111
+ normal: "normal";
112
+ loose: "loose";
113
+ relaxed: "relaxed";
114
+ }>;
115
+ size: z.ZodEnum<{
116
+ md: "md";
117
+ lg: "lg";
118
+ xl: "xl";
119
+ }>;
120
+ }, z.core.$strip>;
121
+ headings: z.ZodObject<{
122
+ default: z.ZodObject<{
123
+ family: z.ZodString;
124
+ weight: z.ZodEnum<{
125
+ bold: "bold";
126
+ medium: "medium";
127
+ light: "light";
128
+ regular: "regular";
129
+ semibold: "semibold";
130
+ }>;
131
+ letterSpacing: z.ZodEnum<{
132
+ normal: "normal";
133
+ loose: "loose";
134
+ tight: "tight";
135
+ }>;
136
+ lineHeight: z.ZodEnum<{
137
+ normal: "normal";
138
+ loose: "loose";
139
+ relaxed: "relaxed";
140
+ }>;
141
+ case: z.ZodNullable<z.ZodEnum<{
142
+ uppercase: "uppercase";
143
+ normal: "normal";
144
+ smallCaps: "smallCaps";
145
+ }>>;
146
+ }, z.core.$strip>;
147
+ h1: z.ZodObject<{
148
+ weight: z.ZodNullable<z.ZodEnum<{
149
+ bold: "bold";
150
+ medium: "medium";
151
+ light: "light";
152
+ regular: "regular";
153
+ semibold: "semibold";
154
+ }>>;
155
+ letterSpacing: z.ZodNullable<z.ZodEnum<{
156
+ normal: "normal";
157
+ loose: "loose";
158
+ tight: "tight";
159
+ }>>;
160
+ size: z.ZodNullable<z.ZodEnum<{
161
+ md: "md";
162
+ lg: "lg";
163
+ xl: "xl";
164
+ }>>;
165
+ lineHeight: z.ZodNullable<z.ZodEnum<{
166
+ normal: "normal";
167
+ loose: "loose";
168
+ relaxed: "relaxed";
169
+ }>>;
170
+ }, z.core.$strip>;
171
+ h2: z.ZodObject<{
172
+ weight: z.ZodNullable<z.ZodEnum<{
173
+ bold: "bold";
174
+ medium: "medium";
175
+ light: "light";
176
+ regular: "regular";
177
+ semibold: "semibold";
178
+ }>>;
179
+ letterSpacing: z.ZodNullable<z.ZodEnum<{
180
+ normal: "normal";
181
+ loose: "loose";
182
+ tight: "tight";
183
+ }>>;
184
+ size: z.ZodNullable<z.ZodEnum<{
185
+ md: "md";
186
+ lg: "lg";
187
+ xl: "xl";
188
+ }>>;
189
+ lineHeight: z.ZodNullable<z.ZodEnum<{
190
+ normal: "normal";
191
+ loose: "loose";
192
+ relaxed: "relaxed";
193
+ }>>;
194
+ }, z.core.$strip>;
195
+ h3: z.ZodObject<{
196
+ weight: z.ZodNullable<z.ZodEnum<{
197
+ bold: "bold";
198
+ medium: "medium";
199
+ light: "light";
200
+ regular: "regular";
201
+ semibold: "semibold";
202
+ }>>;
203
+ letterSpacing: z.ZodNullable<z.ZodEnum<{
204
+ normal: "normal";
205
+ loose: "loose";
206
+ tight: "tight";
207
+ }>>;
208
+ size: z.ZodNullable<z.ZodEnum<{
209
+ md: "md";
210
+ lg: "lg";
211
+ xl: "xl";
212
+ }>>;
213
+ lineHeight: z.ZodNullable<z.ZodEnum<{
214
+ normal: "normal";
215
+ loose: "loose";
216
+ relaxed: "relaxed";
217
+ }>>;
218
+ }, z.core.$strip>;
219
+ h4: z.ZodOptional<z.ZodObject<{
220
+ weight: z.ZodNullable<z.ZodEnum<{
221
+ bold: "bold";
222
+ medium: "medium";
223
+ light: "light";
224
+ regular: "regular";
225
+ semibold: "semibold";
226
+ }>>;
227
+ letterSpacing: z.ZodNullable<z.ZodEnum<{
228
+ normal: "normal";
229
+ loose: "loose";
230
+ tight: "tight";
231
+ }>>;
232
+ size: z.ZodNullable<z.ZodEnum<{
233
+ md: "md";
234
+ lg: "lg";
235
+ xl: "xl";
236
+ }>>;
237
+ lineHeight: z.ZodNullable<z.ZodEnum<{
238
+ normal: "normal";
239
+ loose: "loose";
240
+ relaxed: "relaxed";
241
+ }>>;
242
+ }, z.core.$strip>>;
243
+ h5: z.ZodOptional<z.ZodObject<{
244
+ weight: z.ZodNullable<z.ZodEnum<{
245
+ bold: "bold";
246
+ medium: "medium";
247
+ light: "light";
248
+ regular: "regular";
249
+ semibold: "semibold";
250
+ }>>;
251
+ letterSpacing: z.ZodNullable<z.ZodEnum<{
252
+ normal: "normal";
253
+ loose: "loose";
254
+ tight: "tight";
255
+ }>>;
256
+ size: z.ZodNullable<z.ZodEnum<{
257
+ md: "md";
258
+ lg: "lg";
259
+ xl: "xl";
260
+ }>>;
261
+ lineHeight: z.ZodNullable<z.ZodEnum<{
262
+ normal: "normal";
263
+ loose: "loose";
264
+ relaxed: "relaxed";
265
+ }>>;
266
+ }, z.core.$strip>>;
267
+ h6: z.ZodOptional<z.ZodObject<{
268
+ weight: z.ZodNullable<z.ZodEnum<{
269
+ bold: "bold";
270
+ medium: "medium";
271
+ light: "light";
272
+ regular: "regular";
273
+ semibold: "semibold";
274
+ }>>;
275
+ letterSpacing: z.ZodNullable<z.ZodEnum<{
276
+ normal: "normal";
277
+ loose: "loose";
278
+ tight: "tight";
279
+ }>>;
280
+ size: z.ZodNullable<z.ZodEnum<{
281
+ md: "md";
282
+ lg: "lg";
283
+ xl: "xl";
284
+ }>>;
285
+ lineHeight: z.ZodNullable<z.ZodEnum<{
286
+ normal: "normal";
287
+ loose: "loose";
288
+ relaxed: "relaxed";
289
+ }>>;
290
+ }, z.core.$strip>>;
291
+ }, z.core.$strip>;
292
+ scale: z.ZodEnum<{
293
+ minorThird: "minorThird";
294
+ majorThird: "majorThird";
295
+ perfectFourth: "perfectFourth";
296
+ }>;
297
+ }, z.core.$strip>;
298
+ space: z.ZodEnum<{
299
+ dense: "dense";
300
+ comfortable: "comfortable";
301
+ standard: "standard";
302
+ }>;
303
+ border: z.ZodObject<{
304
+ width: z.ZodEnum<{
305
+ none: "none";
306
+ thick: "thick";
307
+ thin: "thin";
308
+ hairline: "hairline";
309
+ }>;
310
+ style: z.ZodEnum<{
311
+ dashed: "dashed";
312
+ solid: "solid";
313
+ }>;
314
+ }, z.core.$strip>;
315
+ shadow: z.ZodObject<{
316
+ elevation: z.ZodEnum<{
317
+ none: "none";
318
+ medium: "medium";
319
+ low: "low";
320
+ high: "high";
321
+ }>;
322
+ softness: z.ZodNullable<z.ZodEnum<{
323
+ soft: "soft";
324
+ crisp: "crisp";
325
+ hard: "hard";
326
+ }>>;
327
+ position: z.ZodDefault<z.ZodEnum<{
328
+ bottom: "bottom";
329
+ "bottom-right": "bottom-right";
330
+ }>>;
331
+ }, z.core.$strip>;
332
+ motion: z.ZodObject<{
333
+ level: z.ZodEnum<{
334
+ medium: "medium";
335
+ low: "low";
336
+ high: "high";
337
+ off: "off";
338
+ }>;
339
+ easing: z.ZodNullable<z.ZodEnum<{
340
+ standard: "standard";
341
+ snappy: "snappy";
342
+ gentle: "gentle";
343
+ }>>;
344
+ }, z.core.$strip>;
345
+ corners: z.ZodEnum<{
346
+ square: "square";
347
+ rounded: "rounded";
348
+ pill: "pill";
349
+ soft: "soft";
350
+ }>;
351
+ gradients: z.ZodOptional<z.ZodObject<{
352
+ button: z.ZodOptional<z.ZodNullable<z.ZodString>>;
353
+ hero: z.ZodOptional<z.ZodNullable<z.ZodString>>;
354
+ background: z.ZodOptional<z.ZodNullable<z.ZodString>>;
355
+ }, z.core.$strip>>;
356
+ header: z.ZodObject<{
357
+ variant: z.ZodEnum<{
358
+ transparent: "transparent";
359
+ classic: "classic";
360
+ centered: "centered";
361
+ floating: "floating";
362
+ editorial: "editorial";
363
+ }>;
364
+ positioning: z.ZodEnum<{
365
+ fixed: "fixed";
366
+ static: "static";
367
+ sticky: "sticky";
368
+ }>;
369
+ shrinkOnScroll: z.ZodBoolean;
370
+ maxWidth: z.ZodEnum<{
371
+ full: "full";
372
+ container: "container";
373
+ }>;
374
+ logoOverride: z.ZodOptional<z.ZodNullable<z.ZodObject<{
375
+ type: z.ZodEnum<{
376
+ image: "image";
377
+ video: "video";
378
+ }>;
379
+ purpose: z.ZodOptional<z.ZodString>;
380
+ placeholder: z.ZodOptional<z.ZodDefault<z.ZodBoolean>>;
381
+ assetId: z.ZodOptional<z.ZodString>;
382
+ src: z.ZodOptional<z.ZodString>;
383
+ alt: z.ZodOptional<z.ZodString>;
384
+ width: z.ZodOptional<z.ZodNumber>;
385
+ height: z.ZodOptional<z.ZodNumber>;
386
+ storageBucket: z.ZodOptional<z.ZodString>;
387
+ storagePath: z.ZodOptional<z.ZodString>;
388
+ transform: z.ZodOptional<z.ZodObject<{
389
+ rect: z.ZodOptional<z.ZodOptional<z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber, z.ZodNumber], null>>>;
390
+ hotspot: z.ZodOptional<z.ZodOptional<z.ZodObject<{
391
+ x: z.ZodNumber;
392
+ y: z.ZodNumber;
393
+ radius: z.ZodOptional<z.ZodNumber>;
394
+ }, z.core.$strip>>>;
395
+ }, z.core.$strip>>;
396
+ }, z.core.$strip>>>;
397
+ background: z.ZodDefault<z.ZodObject<{
398
+ type: z.ZodEnum<{
399
+ image: "image";
400
+ color: "color";
401
+ gradient: "gradient";
402
+ }>;
403
+ color: z.ZodOptional<z.ZodNullable<z.ZodString>>;
404
+ gradient: z.ZodOptional<z.ZodNullable<z.ZodObject<{
405
+ type: z.ZodEnum<{
406
+ linear: "linear";
407
+ radial: "radial";
408
+ }>;
409
+ angle: z.ZodOptional<z.ZodNumber>;
410
+ position: z.ZodOptional<z.ZodString>;
411
+ stops: z.ZodArray<z.ZodObject<{
412
+ color: z.ZodString;
413
+ position: z.ZodNumber;
414
+ }, z.core.$strip>>;
415
+ }, z.core.$strip>>>;
416
+ image: z.ZodOptional<z.ZodNullable<z.ZodObject<{
417
+ type: z.ZodEnum<{
418
+ image: "image";
419
+ video: "video";
420
+ }>;
421
+ purpose: z.ZodOptional<z.ZodString>;
422
+ placeholder: z.ZodOptional<z.ZodDefault<z.ZodBoolean>>;
423
+ assetId: z.ZodOptional<z.ZodString>;
424
+ src: z.ZodOptional<z.ZodString>;
425
+ alt: z.ZodOptional<z.ZodString>;
426
+ width: z.ZodOptional<z.ZodNumber>;
427
+ height: z.ZodOptional<z.ZodNumber>;
428
+ storageBucket: z.ZodOptional<z.ZodString>;
429
+ storagePath: z.ZodOptional<z.ZodString>;
430
+ transform: z.ZodOptional<z.ZodObject<{
431
+ rect: z.ZodOptional<z.ZodOptional<z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber, z.ZodNumber], null>>>;
432
+ hotspot: z.ZodOptional<z.ZodOptional<z.ZodObject<{
433
+ x: z.ZodNumber;
434
+ y: z.ZodNumber;
435
+ radius: z.ZodOptional<z.ZodNumber>;
436
+ }, z.core.$strip>>>;
437
+ }, z.core.$strip>>;
438
+ }, z.core.$strip>>>;
439
+ textColor: z.ZodOptional<z.ZodNullable<z.ZodString>>;
440
+ }, z.core.$strip>>;
441
+ navStyle: z.ZodEnum<{
442
+ solid: "solid";
443
+ underline: "underline";
444
+ scale: "scale";
445
+ minimal: "minimal";
446
+ "underline-grow": "underline-grow";
447
+ capsule: "capsule";
448
+ frosted: "frosted";
449
+ }>;
450
+ navColor: z.ZodOptional<z.ZodNullable<z.ZodString>>;
451
+ navWeight: z.ZodDefault<z.ZodEnum<{
452
+ bold: "bold";
453
+ medium: "medium";
454
+ regular: "regular";
455
+ semibold: "semibold";
456
+ }>>;
457
+ container: z.ZodOptional<z.ZodObject<{
458
+ rounded: z.ZodDefault<z.ZodEnum<{
459
+ none: "none";
460
+ sm: "sm";
461
+ md: "md";
462
+ lg: "lg";
463
+ xl: "xl";
464
+ "2xl": "2xl";
465
+ }>>;
466
+ border: z.ZodDefault<z.ZodBoolean>;
467
+ shadow: z.ZodDefault<z.ZodBoolean>;
468
+ padding: z.ZodDefault<z.ZodEnum<{
469
+ sm: "sm";
470
+ md: "md";
471
+ lg: "lg";
472
+ }>>;
473
+ tint: z.ZodOptional<z.ZodNullable<z.ZodString>>;
474
+ opacity: z.ZodDefault<z.ZodNumber>;
475
+ }, z.core.$strip>>;
476
+ border: z.ZodOptional<z.ZodObject<{
477
+ width: z.ZodDefault<z.ZodEnum<{
478
+ none: "none";
479
+ medium: "medium";
480
+ thick: "thick";
481
+ thin: "thin";
482
+ }>>;
483
+ style: z.ZodDefault<z.ZodEnum<{
484
+ none: "none";
485
+ dashed: "dashed";
486
+ solid: "solid";
487
+ }>>;
488
+ position: z.ZodDefault<z.ZodEnum<{
489
+ none: "none";
490
+ top: "top";
491
+ both: "both";
492
+ bottom: "bottom";
493
+ }>>;
494
+ color: z.ZodOptional<z.ZodNullable<z.ZodString>>;
495
+ }, z.core.$strip>>;
496
+ logo: z.ZodOptional<z.ZodObject<{
497
+ fontFamily: z.ZodDefault<z.ZodEnum<{
498
+ inherit: "inherit";
499
+ serif: "serif";
500
+ mono: "mono";
501
+ }>>;
502
+ letterSpacing: z.ZodDefault<z.ZodEnum<{
503
+ normal: "normal";
504
+ wide: "wide";
505
+ wider: "wider";
506
+ widest: "widest";
507
+ }>>;
508
+ gradient: z.ZodDefault<z.ZodBoolean>;
509
+ }, z.core.$strip>>;
510
+ navEffects: z.ZodOptional<z.ZodObject<{
511
+ underlineGradient: z.ZodDefault<z.ZodBoolean>;
512
+ glow: z.ZodDefault<z.ZodBoolean>;
513
+ glowColor: z.ZodOptional<z.ZodString>;
514
+ neumorphic: z.ZodDefault<z.ZodBoolean>;
515
+ }, z.core.$strip>>;
516
+ navContainer: z.ZodDefault<z.ZodObject<{
517
+ type: z.ZodDefault<z.ZodEnum<{
518
+ none: "none";
519
+ pill: "pill";
520
+ glass: "glass";
521
+ }>>;
522
+ tint: z.ZodOptional<z.ZodNullable<z.ZodString>>;
523
+ opacity: z.ZodDefault<z.ZodNumber>;
524
+ }, z.core.$strip>>;
525
+ }, z.core.$strip>;
526
+ footer: z.ZodObject<{
527
+ variant: z.ZodEnum<{
528
+ columns: "columns";
529
+ simple: "simple";
530
+ }>;
531
+ maxWidth: z.ZodEnum<{
532
+ full: "full";
533
+ container: "container";
534
+ }>;
535
+ background: z.ZodDefault<z.ZodObject<{
536
+ type: z.ZodEnum<{
537
+ image: "image";
538
+ color: "color";
539
+ gradient: "gradient";
540
+ }>;
541
+ color: z.ZodOptional<z.ZodNullable<z.ZodString>>;
542
+ gradient: z.ZodOptional<z.ZodNullable<z.ZodObject<{
543
+ type: z.ZodEnum<{
544
+ linear: "linear";
545
+ radial: "radial";
546
+ }>;
547
+ angle: z.ZodOptional<z.ZodNumber>;
548
+ position: z.ZodOptional<z.ZodString>;
549
+ stops: z.ZodArray<z.ZodObject<{
550
+ color: z.ZodString;
551
+ position: z.ZodNumber;
552
+ }, z.core.$strip>>;
553
+ }, z.core.$strip>>>;
554
+ image: z.ZodOptional<z.ZodNullable<z.ZodObject<{
555
+ type: z.ZodEnum<{
556
+ image: "image";
557
+ video: "video";
558
+ }>;
559
+ purpose: z.ZodOptional<z.ZodString>;
560
+ placeholder: z.ZodOptional<z.ZodDefault<z.ZodBoolean>>;
561
+ assetId: z.ZodOptional<z.ZodString>;
562
+ src: z.ZodOptional<z.ZodString>;
563
+ alt: z.ZodOptional<z.ZodString>;
564
+ width: z.ZodOptional<z.ZodNumber>;
565
+ height: z.ZodOptional<z.ZodNumber>;
566
+ storageBucket: z.ZodOptional<z.ZodString>;
567
+ storagePath: z.ZodOptional<z.ZodString>;
568
+ transform: z.ZodOptional<z.ZodObject<{
569
+ rect: z.ZodOptional<z.ZodOptional<z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber, z.ZodNumber], null>>>;
570
+ hotspot: z.ZodOptional<z.ZodOptional<z.ZodObject<{
571
+ x: z.ZodNumber;
572
+ y: z.ZodNumber;
573
+ radius: z.ZodOptional<z.ZodNumber>;
574
+ }, z.core.$strip>>>;
575
+ }, z.core.$strip>>;
576
+ }, z.core.$strip>>>;
577
+ textColor: z.ZodOptional<z.ZodNullable<z.ZodString>>;
578
+ }, z.core.$strip>>;
579
+ }, z.core.$strip>;
580
+ buttons: z.ZodOptional<z.ZodObject<{
581
+ global: z.ZodObject<{
582
+ cornerStyle: z.ZodEnum<{
583
+ square: "square";
584
+ rounded: "rounded";
585
+ pill: "pill";
586
+ }>;
587
+ cornerRadius: z.ZodOptional<z.ZodNumber>;
588
+ shadow: z.ZodEnum<{
589
+ none: "none";
590
+ medium: "medium";
591
+ low: "low";
592
+ high: "high";
593
+ }>;
594
+ textTransform: z.ZodEnum<{
595
+ none: "none";
596
+ lowercase: "lowercase";
597
+ uppercase: "uppercase";
598
+ capitalize: "capitalize";
599
+ }>;
600
+ fontWeight: z.ZodUnion<readonly [z.ZodLiteral<500>, z.ZodLiteral<600>, z.ZodLiteral<700>]>;
601
+ borderWidth: z.ZodUnion<readonly [z.ZodLiteral<1>, z.ZodLiteral<2>, z.ZodLiteral<3>]>;
602
+ hoverTransform: z.ZodEnum<{
603
+ none: "none";
604
+ scale: "scale";
605
+ lift: "lift";
606
+ press: "press";
607
+ }>;
608
+ hoverColor: z.ZodEnum<{
609
+ none: "none";
610
+ darken: "darken";
611
+ brighten: "brighten";
612
+ saturate: "saturate";
613
+ }>;
614
+ gradientStyle: z.ZodOptional<z.ZodEnum<{
615
+ linear: "linear";
616
+ radial: "radial";
617
+ conic: "conic";
618
+ }>>;
619
+ gradientAngle: z.ZodOptional<z.ZodNumber>;
620
+ gradientSharpness: z.ZodOptional<z.ZodEnum<{
621
+ medium: "medium";
622
+ smooth: "smooth";
623
+ hard: "hard";
624
+ }>>;
625
+ }, z.core.$strip>;
626
+ variants: z.ZodArray<z.ZodObject<{
627
+ id: z.ZodString;
628
+ name: z.ZodString;
629
+ enabled: z.ZodBoolean;
630
+ priority: z.ZodUnion<readonly [z.ZodLiteral<1>, z.ZodLiteral<2>, z.ZodLiteral<3>]>;
631
+ background: z.ZodDiscriminatedUnion<[z.ZodObject<{
632
+ type: z.ZodLiteral<"solid">;
633
+ colorToken: z.ZodString;
634
+ }, z.core.$strip>, z.ZodObject<{
635
+ type: z.ZodLiteral<"gradient">;
636
+ stops: z.ZodArray<z.ZodString>;
637
+ direction: z.ZodEnum<{
638
+ "to-r": "to-r";
639
+ "to-l": "to-l";
640
+ "to-t": "to-t";
641
+ "to-b": "to-b";
642
+ "to-tr": "to-tr";
643
+ "to-tl": "to-tl";
644
+ "to-br": "to-br";
645
+ "to-bl": "to-bl";
646
+ }>;
647
+ }, z.core.$strip>, z.ZodObject<{
648
+ type: z.ZodLiteral<"transparent">;
649
+ }, z.core.$strip>], "type">;
650
+ textColorToken: z.ZodString;
651
+ borderRadius: z.ZodString;
652
+ shadow: z.ZodOptional<z.ZodObject<{
653
+ elevation: z.ZodEnum<{
654
+ none: "none";
655
+ medium: "medium";
656
+ low: "low";
657
+ high: "high";
658
+ }>;
659
+ softness: z.ZodNullable<z.ZodEnum<{
660
+ soft: "soft";
661
+ crisp: "crisp";
662
+ hard: "hard";
663
+ }>>;
664
+ position: z.ZodDefault<z.ZodEnum<{
665
+ bottom: "bottom";
666
+ "bottom-right": "bottom-right";
667
+ }>>;
668
+ }, z.core.$strip>>;
669
+ border: z.ZodOptional<z.ZodObject<{
670
+ widthClass: z.ZodString;
671
+ colorToken: z.ZodString;
672
+ }, z.core.$strip>>;
673
+ padding: z.ZodOptional<z.ZodString>;
674
+ fontSize: z.ZodOptional<z.ZodString>;
675
+ effects: z.ZodOptional<z.ZodObject<{
676
+ base: z.ZodOptional<z.ZodArray<z.ZodObject<{
677
+ effectId: z.ZodString;
678
+ options: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodAny>>;
679
+ }, z.core.$strip>>>;
680
+ hover: z.ZodOptional<z.ZodArray<z.ZodObject<{
681
+ effectId: z.ZodString;
682
+ options: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodAny>>;
683
+ }, z.core.$strip>>>;
684
+ active: z.ZodOptional<z.ZodArray<z.ZodObject<{
685
+ effectId: z.ZodString;
686
+ options: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodAny>>;
687
+ }, z.core.$strip>>>;
688
+ focus: z.ZodOptional<z.ZodArray<z.ZodObject<{
689
+ effectId: z.ZodString;
690
+ options: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodAny>>;
691
+ }, z.core.$strip>>>;
692
+ }, z.core.$strip>>;
693
+ }, z.core.$strip>>;
694
+ sizes: z.ZodOptional<z.ZodObject<{
695
+ sm: z.ZodObject<{
696
+ padding: z.ZodString;
697
+ fontSize: z.ZodOptional<z.ZodString>;
698
+ }, z.core.$strip>;
699
+ md: z.ZodObject<{
700
+ padding: z.ZodString;
701
+ fontSize: z.ZodOptional<z.ZodString>;
702
+ }, z.core.$strip>;
703
+ lg: z.ZodObject<{
704
+ padding: z.ZodString;
705
+ fontSize: z.ZodOptional<z.ZodString>;
706
+ }, z.core.$strip>;
707
+ }, z.core.$strip>>;
708
+ }, z.core.$strip>>;
709
+ cards: z.ZodOptional<z.ZodObject<{
710
+ variants: z.ZodArray<z.ZodObject<{
711
+ id: z.ZodString;
712
+ name: z.ZodString;
713
+ enabled: z.ZodBoolean;
714
+ priority: z.ZodUnion<readonly [z.ZodLiteral<1>, z.ZodLiteral<2>, z.ZodLiteral<3>]>;
715
+ background: z.ZodDiscriminatedUnion<[z.ZodObject<{
716
+ type: z.ZodLiteral<"solid">;
717
+ colorToken: z.ZodString;
718
+ }, z.core.$strip>, z.ZodObject<{
719
+ type: z.ZodLiteral<"gradient">;
720
+ fromToken: z.ZodString;
721
+ toToken: z.ZodString;
722
+ direction: z.ZodEnum<{
723
+ "to-r": "to-r";
724
+ "to-l": "to-l";
725
+ "to-t": "to-t";
726
+ "to-b": "to-b";
727
+ "to-tr": "to-tr";
728
+ "to-tl": "to-tl";
729
+ "to-br": "to-br";
730
+ "to-bl": "to-bl";
731
+ }>;
732
+ }, z.core.$strip>, z.ZodObject<{
733
+ type: z.ZodLiteral<"transparent">;
734
+ }, z.core.$strip>], "type">;
735
+ spacing: z.ZodEnum<{
736
+ none: "none";
737
+ medium: "medium";
738
+ compact: "compact";
739
+ cozy: "cozy";
740
+ comfortable: "comfortable";
741
+ spacious: "spacious";
742
+ }>;
743
+ shadow: z.ZodOptional<z.ZodObject<{
744
+ elevation: z.ZodEnum<{
745
+ none: "none";
746
+ medium: "medium";
747
+ low: "low";
748
+ high: "high";
749
+ }>;
750
+ softness: z.ZodNullable<z.ZodEnum<{
751
+ soft: "soft";
752
+ crisp: "crisp";
753
+ hard: "hard";
754
+ }>>;
755
+ position: z.ZodDefault<z.ZodEnum<{
756
+ bottom: "bottom";
757
+ "bottom-right": "bottom-right";
758
+ }>>;
759
+ }, z.core.$strip>>;
760
+ corners: z.ZodOptional<z.ZodEnum<{
761
+ square: "square";
762
+ rounded: "rounded";
763
+ pill: "pill";
764
+ soft: "soft";
765
+ }>>;
766
+ border: z.ZodOptional<z.ZodObject<{
767
+ widthClass: z.ZodString;
768
+ colorToken: z.ZodString;
769
+ }, z.core.$strip>>;
770
+ }, z.core.$strip>>;
771
+ }, z.core.$strip>>;
772
+ accordions: z.ZodOptional<z.ZodObject<{
773
+ background: z.ZodObject<{
774
+ type: z.ZodLiteral<"solid">;
775
+ colorToken: z.ZodString;
776
+ }, z.core.$strip>;
777
+ spacing: z.ZodEnum<{
778
+ none: "none";
779
+ medium: "medium";
780
+ compact: "compact";
781
+ cozy: "cozy";
782
+ comfortable: "comfortable";
783
+ spacious: "spacious";
784
+ }>;
785
+ corners: z.ZodNullable<z.ZodEnum<{
786
+ square: "square";
787
+ rounded: "rounded";
788
+ pill: "pill";
789
+ soft: "soft";
790
+ }>>;
791
+ border: z.ZodNullable<z.ZodObject<{
792
+ widthClass: z.ZodString;
793
+ colorToken: z.ZodString;
794
+ }, z.core.$strip>>;
795
+ shadow: z.ZodNullable<z.ZodObject<{
796
+ elevation: z.ZodEnum<{
797
+ none: "none";
798
+ medium: "medium";
799
+ low: "low";
800
+ high: "high";
801
+ }>;
802
+ softness: z.ZodNullable<z.ZodEnum<{
803
+ soft: "soft";
804
+ crisp: "crisp";
805
+ hard: "hard";
806
+ }>>;
807
+ position: z.ZodEnum<{
808
+ bottom: "bottom";
809
+ "bottom-right": "bottom-right";
810
+ }>;
811
+ }, z.core.$strip>>;
812
+ icon: z.ZodObject<{
813
+ style: z.ZodEnum<{
814
+ caret: "caret";
815
+ "plus-minus": "plus-minus";
816
+ chevron: "chevron";
817
+ arrow: "arrow";
818
+ "circle-plus-minus": "circle-plus-minus";
819
+ }>;
820
+ position: z.ZodEnum<{
821
+ left: "left";
822
+ right: "right";
823
+ }>;
824
+ size: z.ZodEnum<{
825
+ sm: "sm";
826
+ md: "md";
827
+ lg: "lg";
828
+ }>;
829
+ }, z.core.$strip>;
830
+ trigger: z.ZodObject<{
831
+ textColorToken: z.ZodString;
832
+ fontWeight: z.ZodNullable<z.ZodEnum<{
833
+ bold: "bold";
834
+ medium: "medium";
835
+ regular: "regular";
836
+ semibold: "semibold";
837
+ }>>;
838
+ }, z.core.$strip>;
839
+ hover: z.ZodObject<{
840
+ backgroundColorToken: z.ZodOptional<z.ZodString>;
841
+ textColorToken: z.ZodOptional<z.ZodString>;
842
+ borderColorToken: z.ZodOptional<z.ZodString>;
843
+ scale: z.ZodOptional<z.ZodNumber>;
844
+ shadowElevation: z.ZodOptional<z.ZodEnum<{
845
+ medium: "medium";
846
+ low: "low";
847
+ high: "high";
848
+ }>>;
849
+ }, z.core.$strip>;
850
+ content: z.ZodObject<{
851
+ textColorToken: z.ZodString;
852
+ }, z.core.$strip>;
853
+ }, z.core.$strip>>;
854
+ inputs: z.ZodOptional<z.ZodObject<{
855
+ base: z.ZodObject<{
856
+ background: z.ZodObject<{
857
+ type: z.ZodLiteral<"solid">;
858
+ colorToken: z.ZodString;
859
+ }, z.core.$strip>;
860
+ textColorToken: z.ZodString;
861
+ border: z.ZodObject<{
862
+ widthClass: z.ZodString;
863
+ colorToken: z.ZodString;
864
+ }, z.core.$strip>;
865
+ corners: z.ZodNullable<z.ZodEnum<{
866
+ square: "square";
867
+ rounded: "rounded";
868
+ pill: "pill";
869
+ soft: "soft";
870
+ }>>;
871
+ shadow: z.ZodNullable<z.ZodObject<{
872
+ elevation: z.ZodEnum<{
873
+ none: "none";
874
+ medium: "medium";
875
+ low: "low";
876
+ }>;
877
+ softness: z.ZodNullable<z.ZodEnum<{
878
+ soft: "soft";
879
+ crisp: "crisp";
880
+ hard: "hard";
881
+ }>>;
882
+ }, z.core.$strip>>;
883
+ spacing: z.ZodEnum<{
884
+ medium: "medium";
885
+ compact: "compact";
886
+ cozy: "cozy";
887
+ comfortable: "comfortable";
888
+ }>;
889
+ fontSize: z.ZodEnum<{
890
+ sm: "sm";
891
+ lg: "lg";
892
+ base: "base";
893
+ }>;
894
+ }, z.core.$strip>;
895
+ label: z.ZodObject<{
896
+ textColorToken: z.ZodString;
897
+ fontWeight: z.ZodEnum<{
898
+ bold: "bold";
899
+ medium: "medium";
900
+ regular: "regular";
901
+ semibold: "semibold";
902
+ }>;
903
+ fontSize: z.ZodEnum<{
904
+ xs: "xs";
905
+ sm: "sm";
906
+ base: "base";
907
+ }>;
908
+ }, z.core.$strip>;
909
+ focus: z.ZodObject<{
910
+ ringColorToken: z.ZodString;
911
+ ringWidth: z.ZodEnum<{
912
+ 1: "1";
913
+ 2: "2";
914
+ 3: "3";
915
+ }>;
916
+ borderColorToken: z.ZodOptional<z.ZodString>;
917
+ }, z.core.$strip>;
918
+ error: z.ZodObject<{
919
+ borderColorToken: z.ZodString;
920
+ textColorToken: z.ZodString;
921
+ }, z.core.$strip>;
922
+ disabled: z.ZodObject<{
923
+ backgroundColorToken: z.ZodString;
924
+ textColorToken: z.ZodString;
925
+ opacity: z.ZodNumber;
926
+ }, z.core.$strip>;
927
+ }, z.core.$strip>>;
928
+ customCss: z.ZodOptional<z.ZodString>;
929
+ }, z.core.$strip>;
930
+ type PaletteMeta = z.infer<typeof paletteMetaSchema>;
931
+ type Theme = z.infer<typeof themeSchema>;
932
+ type HydratedTheme = Omit<Theme, 'palette'> & {
933
+ palette: ExpandedPalette;
934
+ };
935
+
936
+ type SiteHeaderContent = Record<string, never>;
937
+
938
+ type InternalLinkValue = {
939
+ kind: 'internal';
940
+ routeId: string;
941
+ entityId: string;
942
+ entityType: 'page' | 'content';
943
+ href: string;
944
+ title: string;
945
+ typeLabel: string;
946
+ contentTypeKey?: string | null;
947
+ contentTypeName?: string | null;
948
+ updatedAt?: string | null;
949
+ };
950
+ type ExternalLinkValue = {
951
+ kind: 'external';
952
+ href: string;
953
+ };
954
+ type CustomLinkValue = {
955
+ kind: 'url';
956
+ href: string;
957
+ };
958
+ type LinkValue = InternalLinkValue | ExternalLinkValue | CustomLinkValue;
959
+
960
+ type SiteFooterLink = {
961
+ label: string;
962
+ link: LinkValue | null;
963
+ target?: string | null;
964
+ rel?: string | null;
965
+ };
966
+ type SiteFooterLinkGroup = {
967
+ title?: string | null;
968
+ links: SiteFooterLink[];
969
+ };
970
+ type SiteFooterContent = {
971
+ bottomText?: unknown;
972
+ linkGroups?: SiteFooterLinkGroup[];
973
+ };
974
+
975
+ type AdminProfileRole = CamelizeKeys<DbRow<'profile_roles'>>;
976
+ type StartImpersonationRequest = {
977
+ targetUserId: string;
978
+ tenantId?: string | null;
979
+ scope?: ImpersonationScope;
980
+ reason?: string | null;
981
+ metadata?: Record<string, unknown> | null;
982
+ };
983
+ type StartImpersonationResponse = {
984
+ sessionId: string;
985
+ scope: ImpersonationScope;
986
+ targetUserId: string;
987
+ tenantId: string | null;
988
+ expiresAt: string;
989
+ };
990
+ type StopImpersonationRequest = {
991
+ sessionId?: string | null;
992
+ reason?: string | null;
993
+ };
994
+ type StopImpersonationResponse = {
995
+ ok: boolean;
996
+ };
997
+ type UpsertAdminRoleRequest = {
998
+ userId: string;
999
+ role: DbRow<'profile_roles'>['role'];
1000
+ tenantId?: string | null;
1001
+ reason?: string | null;
1002
+ };
1003
+ type RevokeAdminRoleRequest = UpsertAdminRoleRequest;
1004
+ type AdminRoleMutationResponse = {
1005
+ roles: AdminProfileRole[];
1006
+ };
1007
+
1008
+ type RouteMetadataPayload = {
1009
+ draftTitle?: string;
1010
+ draftSlug?: string;
1011
+ draftStatus?: 'draft' | 'scheduled' | 'published';
1012
+ publishedAt?: string | null;
1013
+ draftMetaTitle?: string | null;
1014
+ draftMetaDescription?: string | null;
1015
+ ogImageId?: string | null;
1016
+ };
1017
+ type RouteMetadataResponse = {
1018
+ route: {
1019
+ id: string;
1020
+ siteId: string;
1021
+ nodeId: string | null;
1022
+ nodeType: 'page' | 'content_entry' | null;
1023
+ draftTitle: string | null;
1024
+ draftPath: string | null;
1025
+ draftStatus: string | null;
1026
+ publishedTitle: string | null;
1027
+ publishedPath: string | null;
1028
+ status: string | null;
1029
+ publishedAt: string | null;
1030
+ draftMetaTitle: string | null;
1031
+ draftMetaDescription: string | null;
1032
+ publishedMetaTitle: string | null;
1033
+ publishedMetaDescription: string | null;
1034
+ ogImageId: string | null;
1035
+ draftUpdatedAt: string | null;
1036
+ updatedBy: string | null;
1037
+ };
1038
+ };
1039
+
1040
+ /**
1041
+ * SDK Site Configuration Types (local definition to avoid circular dependency)
1042
+ *
1043
+ * These types mirror the canonical definitions in @riverbankcms/sdk/config but are
1044
+ * defined locally to avoid circular dependency between @riverbankcms/api and @riverbankcms/sdk.
1045
+ *
1046
+ * The actual validation schema lives in @riverbankcms/sdk/config, which should be used
1047
+ * when validating config data. These types are for API response typing only.
1048
+ */
1049
+ /** SDK theme palette - maps token names to CSS color values */
1050
+ type SdkThemePalette = Record<string, string>;
1051
+ /** SDK theme configuration */
1052
+ interface SdkThemeConfig {
1053
+ palette: SdkThemePalette;
1054
+ }
1055
+ /** Section background with token reference */
1056
+ interface SdkSectionBackground {
1057
+ id: string;
1058
+ label: string;
1059
+ token: string;
1060
+ }
1061
+ interface SdkSectionOptionsConfig {
1062
+ backgroundColor?: boolean;
1063
+ backgroundImage?: boolean;
1064
+ backgroundGradient?: boolean;
1065
+ spacing?: ('compact' | 'default' | 'spacious')[] | boolean;
1066
+ textColor?: boolean;
1067
+ }
1068
+ interface SdkContainerOptionsConfig {
1069
+ maxWidth?: ('narrow' | 'default' | 'wide' | 'full')[] | boolean;
1070
+ alignment?: ('left' | 'center' | 'right')[] | boolean;
1071
+ }
1072
+ interface SdkSiteStyleConfig {
1073
+ sectionBackgrounds?: SdkSectionBackground[];
1074
+ sectionOptions?: SdkSectionOptionsConfig;
1075
+ containerOptions?: SdkContainerOptionsConfig;
1076
+ }
1077
+ /**
1078
+ * Field select option for SDK-provided field options.
1079
+ *
1080
+ * Note: This mirrors FieldSelectOption from @riverbankcms/sdk/config for use in API responses.
1081
+ * The API package cannot depend on SDK, so these types are duplicated here.
1082
+ */
1083
+ interface SdkFieldSelectOption {
1084
+ value: string;
1085
+ label: string;
1086
+ }
1087
+ /**
1088
+ * Per-field configuration within a block.
1089
+ *
1090
+ * Note: This mirrors BlockFieldConfig from @riverbankcms/sdk/config for use in API responses.
1091
+ */
1092
+ interface SdkBlockFieldConfig {
1093
+ options?: SdkFieldSelectOption[];
1094
+ }
1095
+ /**
1096
+ * Per-block field configurations map.
1097
+ *
1098
+ * Note: This mirrors BlockFieldOptionsMap from @riverbankcms/sdk/config for use in API responses.
1099
+ */
1100
+ type SdkBlockFieldOptionsMap = Record<string, Record<string, SdkBlockFieldConfig>>;
1101
+ interface RiverbankSiteConfig {
1102
+ theme?: SdkThemeConfig;
1103
+ styles?: SdkSiteStyleConfig;
1104
+ /** Custom blocks defined by SDK sites */
1105
+ customBlocks?: SdkCustomBlock[];
1106
+ blockFieldOptions?: SdkBlockFieldOptionsMap;
1107
+ }
1108
+ type HTTPMethod = "GET" | "POST" | "PUT" | "DELETE" | "PATCH" | "HEAD";
1109
+ type ApiResponseKind = 'json' | 'stream' | 'text' | 'void';
1110
+ type ApiAuthRequirement = 'public' | 'user' | 'admin' | 'service';
1111
+
1112
+ type APIEndpoint<TBody = unknown, TQuery = unknown, TResponse = unknown> = {
1113
+ path: string;
1114
+ method: HTTPMethod;
1115
+ body?: TBody;
1116
+ query?: TQuery;
1117
+ response?: TResponse;
1118
+ revalidate?: number;
1119
+ tags?: string[];
1120
+ responseKind?: ApiResponseKind;
1121
+ auth?: ApiAuthRequirement;
1122
+ };
1123
+ type SiteBriefRecord = CamelizeKeys<DbRow<'site_briefs'>>;
1124
+ type SiteProposalSelectionRecord = CamelizeKeys<DbRow<'site_proposal_selections'>>;
1125
+ type AdminInviteRow = DbRow<'admin_invites'>;
1126
+ type AllowedEmailDomainRow = DbRow<'allowed_email_domains'>;
1127
+ type AdminInvite = CamelizeKeys<AdminInviteRow>;
1128
+ type AllowedEmailDomain = CamelizeKeys<AllowedEmailDomainRow>;
1129
+ type PageRouteRecord = ContentRouteRecord & {
1130
+ canonicalUrl?: string | null;
1131
+ draftUpdatedAt?: string | null;
1132
+ createdAt?: string | null;
1133
+ createdBy?: string | null;
1134
+ updatedAt?: string | null;
1135
+ updatedBy?: string | null;
1136
+ };
1137
+ type PageRecord = {
1138
+ id: string;
1139
+ siteId: string;
1140
+ routeId: string;
1141
+ purpose: string;
1142
+ title: string;
1143
+ draftTitle: string;
1144
+ path: string;
1145
+ draftPath: string;
1146
+ slug: string | null;
1147
+ draftSlug: string | null;
1148
+ status: ContentEntryStatus;
1149
+ draftStatus: ContentEntryStatus;
1150
+ publishedAt: string | null;
1151
+ draftUpdatedAt: string | null;
1152
+ createdAt: string;
1153
+ updatedAt: string;
1154
+ deletedAt: string | null;
1155
+ route: PageRouteRecord | null;
1156
+ };
1157
+ type NavigationMenuRecord = CamelizeKeys<DbRow<'navigation_menus'>>;
1158
+ type NavigationItemRecord = CamelizeKeys<DbRow<'navigation_items'>>;
1159
+ type NavigationMenuWithItems = NavigationMenuRecord & {
1160
+ items: NavigationItemRecord[];
1161
+ };
1162
+ type SiteRole = 'owner' | 'administrator' | 'editor';
1163
+ type SiteMemberProfile = {
1164
+ displayName: string | null;
1165
+ avatarUrl: string | null;
1166
+ };
1167
+ type SiteMember = {
1168
+ id: string;
1169
+ siteId: string;
1170
+ userId: string;
1171
+ role: SiteRole;
1172
+ invitedBy: string | null;
1173
+ acceptedAt: string | null;
1174
+ removedAt: string | null;
1175
+ createdAt: string;
1176
+ updatedAt: string;
1177
+ profile: SiteMemberProfile | null;
1178
+ isCurrentUser: boolean;
1179
+ };
1180
+ type BlockListItem = {
1181
+ id: string;
1182
+ kind: string;
1183
+ purpose?: string | null;
1184
+ orderIndex?: number | null;
1185
+ content?: Record<string, unknown> | null;
1186
+ draftContent?: Record<string, unknown> | null;
1187
+ publishedContent?: Record<string, unknown> | null;
1188
+ };
1189
+ type SiteInvitation = {
1190
+ id: string;
1191
+ siteId: string;
1192
+ email: string;
1193
+ role: SiteRole;
1194
+ invitedBy: string | null;
1195
+ expiresAt: string | null;
1196
+ acceptedAt: string | null;
1197
+ acceptedBy: string | null;
1198
+ revokedAt: string | null;
1199
+ metadata?: Record<string, unknown> | null;
1200
+ createdAt: string;
1201
+ updatedAt: string;
1202
+ };
1203
+ type SiteAccessSummary = {
1204
+ membershipRole: SiteRole | null;
1205
+ canInvite: boolean;
1206
+ canManage: boolean;
1207
+ canTransferOwnership: boolean;
1208
+ };
1209
+ type SitePlanSummaryResponse = {
1210
+ planId: string;
1211
+ capabilities: FeatureKey[];
1212
+ maxCollaborators: number | null;
1213
+ canInviteEditors: boolean;
1214
+ canInviteAdmins: boolean;
1215
+ currentCollaborators: number;
1216
+ };
1217
+ type ListSiteMembersResponse = {
1218
+ members: SiteMember[];
1219
+ invitations: SiteInvitation[];
1220
+ access: SiteAccessSummary;
1221
+ plan: SitePlanSummaryResponse;
1222
+ };
1223
+ type AuthFieldKey = 'email' | 'password' | 'confirmPassword' | 'name' | 'terms' | 'magicLink';
1224
+ type AuthSubmissionErrorReason = 'validation' | 'turnstile' | 'supabase' | 'already_registered' | 'rate_limited' | 'email' | 'closed' | 'invalid_credentials' | 'not_confirmed' | 'not_allowed';
1225
+ type AuthSubmissionSuccess = {
1226
+ status: 'success';
1227
+ message: string;
1228
+ redirectTo?: string;
1229
+ flash?: Record<string, unknown>;
1230
+ };
1231
+ type AuthSubmissionError = {
1232
+ status: 'error';
1233
+ reason: AuthSubmissionErrorReason;
1234
+ message: string;
1235
+ fieldErrors?: Partial<Record<AuthFieldKey, string>>;
1236
+ retryAfterSeconds?: number;
1237
+ };
1238
+ type AuthSubmissionResult = AuthSubmissionSuccess | AuthSubmissionError;
1239
+ type ReauthSubmissionResult = AuthSubmissionResult & {
1240
+ setReenrollCookie?: boolean;
1241
+ };
1242
+ type DomainAvailability = {
1243
+ domain: string;
1244
+ available: boolean;
1245
+ price?: number;
1246
+ currency?: string;
1247
+ premium?: boolean;
1248
+ reason?: string;
1249
+ source?: 'lookup' | 'suggestion' | 'heuristic';
1250
+ };
1251
+ type SiteDomainRecord = CamelizeKeys<DbRow<'site_domains'>>;
1252
+ type SiteDomainContactPayload = {
1253
+ firstName: string;
1254
+ lastName: string;
1255
+ organization?: string;
1256
+ addressLine1: string;
1257
+ addressLine2?: string;
1258
+ city: string;
1259
+ state: string;
1260
+ postalCode: string;
1261
+ country: string;
1262
+ phone: string;
1263
+ email: string;
1264
+ };
1265
+ type ApplySeoChangesRequest = {
1266
+ siteId: string;
1267
+ target: {
1268
+ type: 'page';
1269
+ pageId: string;
1270
+ };
1271
+ changes: {
1272
+ title?: string;
1273
+ metaTitle?: string;
1274
+ metaDescription?: string | null;
1275
+ };
1276
+ };
1277
+ type ApplySeoChangesResponse = {
1278
+ ok: true;
1279
+ pageId: string;
1280
+ routeId: string | null;
1281
+ draftTitle: string | null;
1282
+ draftMetaTitle: string | null;
1283
+ draftMetaDescription: string | null;
1284
+ };
1285
+ type LookupSiteDomainRequest = {
1286
+ query: string;
1287
+ };
1288
+ type LookupSiteDomainResponse = {
1289
+ domains: DomainAvailability[];
1290
+ };
1291
+ type RegisterSiteDomainRequest = {
1292
+ domain: string;
1293
+ useProfileContact?: boolean;
1294
+ contact?: SiteDomainContactPayload;
1295
+ saveContactToProfile?: boolean;
1296
+ };
1297
+ type RegisterSiteDomainResponse = {
1298
+ domain: SiteDomainRecord;
1299
+ };
1300
+ type AddCustomDomainRequest = {
1301
+ domain: string;
1302
+ };
1303
+ type AddCustomDomainResponse = {
1304
+ domain: SiteDomainRecord;
1305
+ vercel: {
1306
+ verified: boolean;
1307
+ verification?: Array<{
1308
+ type: string;
1309
+ domain: string;
1310
+ value: string;
1311
+ reason: string;
1312
+ }>;
1313
+ };
1314
+ };
1315
+ type DomainSearchResultResponse = {
1316
+ query: string;
1317
+ primary: DomainAvailability | null;
1318
+ tldAlternatives: DomainAvailability[];
1319
+ nameVariants: DomainAvailability[];
1320
+ suggestions: DomainAvailability[];
1321
+ errors: string[];
1322
+ };
1323
+ type AnalyticsPreset = '1d' | '7d' | '30d' | '90d' | '365d';
1324
+ type AnalyticsReportQuery = {
1325
+ siteId: string;
1326
+ period?: AnalyticsPreset;
1327
+ from?: string;
1328
+ to?: string;
1329
+ };
1330
+ type AnalyticsSeriesPoint = {
1331
+ date: string;
1332
+ pageViews: number;
1333
+ uniqueVisitors: number;
1334
+ conversions: number;
1335
+ };
1336
+ type AnalyticsTopPage = {
1337
+ path: string;
1338
+ views: number;
1339
+ conversions: number;
1340
+ conversionRate: number;
1341
+ };
1342
+ type AnalyticsReferrer = {
1343
+ source: string;
1344
+ visits: number;
1345
+ };
1346
+ type AnalyticsTotals = {
1347
+ visits: number;
1348
+ uniqueVisitors: number;
1349
+ conversions: number;
1350
+ };
1351
+ type AnalyticsReportResponse = {
1352
+ range: {
1353
+ from: string;
1354
+ to: string;
1355
+ preset?: AnalyticsPreset | null;
1356
+ };
1357
+ series: AnalyticsSeriesPoint[];
1358
+ totals: AnalyticsTotals;
1359
+ breakdown: {
1360
+ conversionsByEvent: Record<'cta_click' | 'form_submit' | string, number>;
1361
+ };
1362
+ topPages: AnalyticsTopPage[];
1363
+ topReferrers: AnalyticsReferrer[];
1364
+ partial?: boolean;
1365
+ goLiveAt: string | null;
1366
+ clamped?: boolean;
1367
+ noDataYet?: boolean;
1368
+ };
1369
+ type AnalyticsReportFilters = Omit<AnalyticsReportQuery, 'siteId'>;
1370
+ type RegisterDomainContactInput = SiteDomainContactPayload;
1371
+ type RegisterDomainRequestPayload = {
1372
+ siteId: string;
1373
+ domain: string;
1374
+ years?: number;
1375
+ useProfileContact?: boolean;
1376
+ contact?: RegisterDomainContactInput;
1377
+ saveContactToProfile?: boolean;
1378
+ };
1379
+ type RegisterDomainResponse = {
1380
+ domain: SiteDomainRecord;
1381
+ registration: {
1382
+ orderId: string;
1383
+ status: string;
1384
+ };
1385
+ };
1386
+ type SetHomepageRequest = {
1387
+ pageId: string;
1388
+ };
1389
+ type SetHomepageResponse = {
1390
+ homepage: PageRecord;
1391
+ previous?: PageRecord | null;
1392
+ };
1393
+ type InviteSiteMemberRequest = {
1394
+ email: string;
1395
+ role: Exclude<SiteRole, 'owner'>;
1396
+ };
1397
+ type InviteSiteMemberResponse = {
1398
+ invitation: SiteInvitation;
1399
+ token: string;
1400
+ };
1401
+ type UpdateSiteMemberRoleRequest = {
1402
+ role: Exclude<SiteRole, 'owner'>;
1403
+ };
1404
+ type UpdateSiteMemberRoleResponse = {
1405
+ member: SiteMember;
1406
+ };
1407
+ type RemoveSiteMemberResponse = {
1408
+ success: boolean;
1409
+ };
1410
+ type RevokeSiteInvitationResponse = {
1411
+ invitation: SiteInvitation | null;
1412
+ };
1413
+ type TransferSiteOwnershipRequest = {
1414
+ memberId: string;
1415
+ };
1416
+ type TransferSiteOwnershipResponse = {
1417
+ siteId: string;
1418
+ ownerId: string;
1419
+ };
1420
+ type AcceptSiteInvitationRequest = {
1421
+ token: string;
1422
+ };
1423
+ type AcceptSiteInvitationResponse = {
1424
+ membership: SiteMember;
1425
+ };
1426
+ type InternalLinkRoutablePayload = {
1427
+ kind: 'internal';
1428
+ routeId: string;
1429
+ entityId: string;
1430
+ entityType: 'page' | 'content';
1431
+ href: string;
1432
+ title: string;
1433
+ typeLabel: string;
1434
+ contentTypeKey?: string | null;
1435
+ contentTypeName?: string | null;
1436
+ updatedAt?: string | null;
1437
+ };
1438
+ type LinkPayload = InternalLinkRoutablePayload | {
1439
+ kind: 'external';
1440
+ href: string;
1441
+ } | {
1442
+ kind: 'url';
1443
+ href: string;
1444
+ };
1445
+ type RoutableContentItem = {
1446
+ routeId: string;
1447
+ entityId: string;
1448
+ entityType: 'page' | 'content';
1449
+ contentTypeKey?: string | null;
1450
+ contentTypeName?: string | null;
1451
+ title: string;
1452
+ draftTitle: string | null;
1453
+ path: string;
1454
+ draftPath: string | null;
1455
+ status: DbRow<'site_routes'>['status'];
1456
+ draftStatus: DbRow<'site_routes'>['draft_status'];
1457
+ typeLabel: string;
1458
+ updatedAt: string | null;
1459
+ };
1460
+ type MfaFactorSummary = {
1461
+ id: string;
1462
+ type: 'totp' | 'phone' | (string & {});
1463
+ status: 'verified' | 'unverified' | 'pending' | 'failed' | (string & {});
1464
+ friendlyName: string | null;
1465
+ createdAt: string | null;
1466
+ updatedAt: string | null;
1467
+ };
1468
+ type MfaOverviewPayload = {
1469
+ userId: string;
1470
+ requiresEnrollment: boolean;
1471
+ mfaEnrolled: boolean;
1472
+ mfaEnrolledAt: string | null;
1473
+ factors: MfaFactorSummary[];
1474
+ verifiedCount: number;
1475
+ totpFactors: MfaFactorSummary[];
1476
+ pendingTotpFactor: MfaFactorSummary | null;
1477
+ loadError: string | null;
1478
+ };
1479
+ type MfaTotpEnrollResponse = {
1480
+ factorId: string;
1481
+ type: 'totp';
1482
+ friendlyName: string | null;
1483
+ secret: string;
1484
+ uri: string;
1485
+ qrCode: string;
1486
+ challengeId: string;
1487
+ challengeExpiresAt: number;
1488
+ };
1489
+ type MfaTotpVerifyRequest = {
1490
+ factorId: string;
1491
+ code: string;
1492
+ challengeId?: string | null;
1493
+ };
1494
+ type MfaTotpVerifyResponse = {
1495
+ factorId: string;
1496
+ challengeId: string;
1497
+ expiresIn: number;
1498
+ mfaVerified: true;
1499
+ };
1500
+ type MfaTotpActivateRequest = {
1501
+ requireEnrollment?: boolean;
1502
+ };
1503
+ type MfaOverviewResponse = {
1504
+ overview: MfaOverviewPayload;
1505
+ };
1506
+ type MfaPhoneEnrollRequest = {
1507
+ phone: string;
1508
+ friendlyName?: string;
1509
+ };
1510
+ type MfaPhoneEnrollResponse = {
1511
+ factorId: string;
1512
+ phone: string;
1513
+ friendlyName: string | null;
1514
+ challengeId: string;
1515
+ challengeExpiresAt: string | number;
1516
+ };
1517
+ type MfaPhoneChallengeRequest = {
1518
+ factorId: string;
1519
+ };
1520
+ type MfaPhoneChallengeResponse = {
1521
+ factorId: string;
1522
+ challengeId: string;
1523
+ challengeExpiresAt: string | number;
1524
+ };
1525
+ type MfaPhoneVerifyRequest = {
1526
+ factorId: string;
1527
+ code: string;
1528
+ challengeId?: string | null;
1529
+ requireEnrollment?: boolean;
1530
+ };
1531
+ type MfaBackupCodeSummary = {
1532
+ sequence: number;
1533
+ codeHint: string;
1534
+ usedAt: string | null;
1535
+ };
1536
+ type MfaBackupCodesOverview = {
1537
+ batchId: string | null;
1538
+ rotatedAt: string | null;
1539
+ totalCodes: number;
1540
+ unusedCodes: number;
1541
+ codes: MfaBackupCodeSummary[];
1542
+ };
1543
+ type MfaBackupCodesOverviewResponse = {
1544
+ overview: MfaBackupCodesOverview;
1545
+ };
1546
+ type MfaBackupCodesRotateResponse = {
1547
+ batchId: string;
1548
+ rotatedAt: string;
1549
+ count: number;
1550
+ codes: string[];
1551
+ };
1552
+ type CreateAdminInviteRequest = {
1553
+ email: string;
1554
+ role: DbRow<'profile_roles'>['role'];
1555
+ tenantId?: string | null;
1556
+ expiresAt?: string | null;
1557
+ metadata?: Record<string, unknown> | null;
1558
+ };
1559
+ type CreateAdminInviteResponse = {
1560
+ invite: AdminInvite;
1561
+ token: string;
1562
+ };
1563
+ type ListAdminInvitesResponse = {
1564
+ invites: AdminInvite[];
1565
+ };
1566
+ type RevokeAdminInviteResponse = {
1567
+ invite: AdminInvite;
1568
+ };
1569
+ type CreateAdminUserRequest = {
1570
+ email: string;
1571
+ displayName?: string;
1572
+ sendInvite?: boolean;
1573
+ };
1574
+ type CreateAdminUserResponse = {
1575
+ user: {
1576
+ id: string;
1577
+ email: string;
1578
+ displayName?: string;
1579
+ createdAt: string;
1580
+ };
1581
+ inviteSent: boolean;
1582
+ };
1583
+ type AcceptAdminInviteRequest = {
1584
+ token: string;
1585
+ };
1586
+ type AcceptAdminInviteResponse = {
1587
+ invite: AdminInvite;
1588
+ };
1589
+ type ListAllowedDomainsResponse = {
1590
+ domains: AllowedEmailDomain[];
1591
+ };
1592
+ type CreateAllowedDomainRequest = {
1593
+ domain: string;
1594
+ tenantId?: string | null;
1595
+ };
1596
+ type CreateAllowedDomainResponse = {
1597
+ domain: AllowedEmailDomain;
1598
+ };
1599
+ type DeleteAllowedDomainResponse = {
1600
+ domain: AllowedEmailDomain;
1601
+ };
1602
+ type SiteDeploymentMode = 'managed' | 'headless_cms' | 'headless_full';
1603
+ type AdminCreateSiteRequest = {
1604
+ title: string;
1605
+ slug: string;
1606
+ ownerEmail: string;
1607
+ deploymentMode: SiteDeploymentMode;
1608
+ };
1609
+ type AdminCreateSiteResponse = {
1610
+ site: {
1611
+ id: string;
1612
+ title: string;
1613
+ slug: string;
1614
+ deployment_mode: SiteDeploymentMode;
1615
+ created_at: string;
1616
+ };
1617
+ };
1618
+ type ChangePlanRequest = {
1619
+ planId: string;
1620
+ interval: BillingInterval;
1621
+ prorationBehavior?: 'create_prorations' | 'always_invoice' | 'none';
1622
+ };
1623
+ type ChangePlanResponse = {
1624
+ membership: MembershipState | null;
1625
+ };
1626
+ type AdminChangePlanRequest = ChangePlanRequest & {
1627
+ userId: string;
1628
+ reason?: string;
1629
+ bypassProration?: boolean;
1630
+ };
1631
+ type AdminChangePlanResponse = ChangePlanResponse;
1632
+ type BillingPriceOverride = {
1633
+ id: string;
1634
+ userId: string;
1635
+ planId: string;
1636
+ interval: 'month' | 'year';
1637
+ amountCents: number;
1638
+ currency: string;
1639
+ validFrom: string | null;
1640
+ validUntil: string | null;
1641
+ isActive: boolean;
1642
+ createdBy: string | null;
1643
+ reason: string | null;
1644
+ createdAt: string;
1645
+ updatedAt: string;
1646
+ };
1647
+ type AdminGetPriceOverrideQuery = {
1648
+ userId: string;
1649
+ planId: string;
1650
+ interval: 'month' | 'year';
1651
+ };
1652
+ type AdminGetPriceOverrideResponse = {
1653
+ hasOverride: boolean;
1654
+ override: BillingPriceOverride | null;
1655
+ formattedPrice: string | null;
1656
+ };
1657
+ type AdminUpsertPriceOverrideRequest = {
1658
+ userId: string;
1659
+ planId: string;
1660
+ interval: 'month' | 'year';
1661
+ amountCents: number;
1662
+ currency?: string;
1663
+ validFrom?: string | null;
1664
+ validUntil?: string | null;
1665
+ reason?: string;
1666
+ };
1667
+ type AdminUpsertPriceOverrideResponse = {
1668
+ override: BillingPriceOverride;
1669
+ };
1670
+ type AdminDeletePriceOverrideRequest = {
1671
+ userId: string;
1672
+ planId: string;
1673
+ interval: 'month' | 'year';
1674
+ reason?: string;
1675
+ };
1676
+ type AdminDeletePriceOverrideResponse = {
1677
+ success: boolean;
1678
+ };
1679
+ type TableName = keyof DbDatabase['public']['Tables'];
1680
+ type DTOType<K extends TableName> = Partial<CamelizeKeys<DbRow<K>>>;
1681
+ type GetBriefResponse = {
1682
+ brief: SiteBriefRecord | null;
1683
+ };
1684
+ type BriefTurnEnvelope = DTOType<'brief_turn_envelopes'>;
1685
+ type SiteSpecEnvelope = DTOType<'site_spec_envelopes'>;
1686
+ type CreateBriefTurnRequest = {
1687
+ envelope: BriefTurnEnvelope;
1688
+ briefId: string;
1689
+ };
1690
+ type CreateBriefTurnResponse = {
1691
+ briefTurn: BriefTurnEnvelope;
1692
+ };
1693
+ type SiteBriefStatePatch = Partial<SiteBriefRecord> & Record<string, unknown>;
1694
+ type AiBriefTurn = {
1695
+ nextState: 'brief_collecting' | 'brief_ready';
1696
+ statePatch: SiteBriefStatePatch;
1697
+ questions?: string[];
1698
+ message: string;
1699
+ };
1700
+ type PrototypeClientBrief = {
1701
+ site_id: string;
1702
+ title: string;
1703
+ entity_type: string;
1704
+ entity_name: string;
1705
+ field_category: string;
1706
+ primary_purpose: string;
1707
+ secondary_purpose?: string[];
1708
+ audiences?: string[];
1709
+ desired_features?: string[];
1710
+ tone?: string;
1711
+ locations?: string[];
1712
+ inspiration_urls?: string[];
1713
+ };
1714
+ type PrototypeUncertainty = {
1715
+ question: string;
1716
+ impact: 'high' | 'medium' | 'low';
1717
+ toggle_key: string | null;
1718
+ };
1719
+ type PrototypeToggleKey = 'enable_blog' | 'add_portfolio' | 'add_faq' | 'add_testimonials' | 'add_gallery' | 'add_about' | 'show_pricing' | 'enable_booking' | 'enable_newsletter' | 'add_cta' | 'enable_reviews' | 'add_team' | 'one_pager' | 'add_contact_map' | 'add_legal';
1720
+ type PrototypeProposal = {
1721
+ description: string;
1722
+ style: string;
1723
+ rationale: string;
1724
+ pages: Array<Record<string, unknown>>;
1725
+ assumptions: string[];
1726
+ uncertainties: PrototypeUncertainty[];
1727
+ quick_toggle_keys: PrototypeToggleKey[];
1728
+ custom_toggles: Array<{
1729
+ label: string;
1730
+ description: string | null;
1731
+ }> | null;
1732
+ };
1733
+ type PrototypeTurn = {
1734
+ message: string;
1735
+ proposals: PrototypeProposal[];
1736
+ };
1737
+ type PrototypeChatResponse = {
1738
+ text: string | null;
1739
+ output: DbJson;
1740
+ messages: PrototypeTurn[];
1741
+ responseId: string;
1742
+ };
1743
+ type Site = DbRow<'sites'>;
1744
+ type MediaClassifyJobResponse = {
1745
+ id: string;
1746
+ site_id: string;
1747
+ status: 'pending' | 'processing' | 'completed' | 'failed';
1748
+ asset_ids: string[];
1749
+ next_index: number;
1750
+ force: boolean;
1751
+ requested_by: string | null;
1752
+ prompt: string | null;
1753
+ results: Array<{
1754
+ assetId: string;
1755
+ ok: boolean;
1756
+ skipped?: boolean;
1757
+ error?: string | null;
1758
+ }>;
1759
+ last_error: string | null;
1760
+ created_at: string;
1761
+ updated_at: string;
1762
+ started_at: string | null;
1763
+ completed_at: string | null;
1764
+ };
1765
+ type MediaLabelSummary = {
1766
+ slug: string;
1767
+ name: string;
1768
+ count: number;
1769
+ };
1770
+ type MediaSettingsResponse = {
1771
+ siteId: string;
1772
+ persistVariants: boolean;
1773
+ updatedAt: string | null;
1774
+ };
1775
+ type BookingModuleToggles = {
1776
+ appointments: boolean;
1777
+ events: boolean;
1778
+ };
1779
+ type BookingReminderOverrides = Record<string, number>;
1780
+ type BookingSettings = {
1781
+ modules: BookingModuleToggles;
1782
+ defaultTimezone: string | null;
1783
+ defaultVenueId: string | null;
1784
+ calendarDisplay: 'list' | 'calendar';
1785
+ remindersEnabled: boolean;
1786
+ appointmentReminderHours: number;
1787
+ eventReminderHours: number;
1788
+ appointmentReminderOverrides: BookingReminderOverrides;
1789
+ eventReminderOverrides: BookingReminderOverrides;
1790
+ icsFeedsEnabled: boolean;
1791
+ };
1792
+ type UpdateBookingSettingsRequest = BookingSettings;
1793
+ type BookingSettingsResponse = {
1794
+ settings: BookingSettings;
1795
+ };
1796
+ type AppointmentResource = {
1797
+ id: string;
1798
+ siteId: string;
1799
+ userId: string | null;
1800
+ displayName: string;
1801
+ bio: string | null;
1802
+ colorHex: string | null;
1803
+ avatarAssetId: string | null;
1804
+ timezone: string;
1805
+ calendarSyncEnabled: boolean;
1806
+ createdAt: string;
1807
+ updatedAt: string;
1808
+ };
1809
+ type CreateAppointmentResourceRequest = {
1810
+ displayName: string;
1811
+ bio?: string | null;
1812
+ timezone?: string;
1813
+ colorHex?: string | null;
1814
+ calendarSyncEnabled?: boolean;
1815
+ };
1816
+ type UpdateAppointmentResourceRequest = Partial<CreateAppointmentResourceRequest>;
1817
+ type AppointmentResourceResponse = {
1818
+ resource: AppointmentResource;
1819
+ };
1820
+ type ListAppointmentResourcesResponse = {
1821
+ resources: AppointmentResource[];
1822
+ };
1823
+ type DeleteResourceResponse = {
1824
+ success: boolean;
1825
+ };
1826
+ type AppointmentService = {
1827
+ id: string;
1828
+ siteId: string;
1829
+ title: string;
1830
+ slug: string;
1831
+ description: string | null;
1832
+ durationMinutes: number;
1833
+ priceAmount: number | null;
1834
+ priceCurrency: string;
1835
+ bufferBeforeMinutes: number;
1836
+ bufferAfterMinutes: number;
1837
+ colorHex: string | null;
1838
+ isActive: boolean;
1839
+ locationType: 'virtual' | 'in_person' | 'hybrid';
1840
+ venueId: string | null;
1841
+ timezone: string | null;
1842
+ formId: string | null;
1843
+ createdAt: string;
1844
+ updatedAt: string;
1845
+ };
1846
+ type CreateAppointmentServiceRequest = {
1847
+ title: string;
1848
+ description?: string | null;
1849
+ durationMinutes: number;
1850
+ priceAmount?: number | null;
1851
+ priceCurrency?: string;
1852
+ bufferBeforeMinutes?: number;
1853
+ bufferAfterMinutes?: number;
1854
+ colorHex?: string | null;
1855
+ isActive?: boolean;
1856
+ locationType?: 'virtual' | 'in_person' | 'hybrid';
1857
+ venueId?: string | null;
1858
+ timezone?: string | null;
1859
+ formId?: string | null;
1860
+ };
1861
+ type UpdateAppointmentServiceRequest = Partial<CreateAppointmentServiceRequest>;
1862
+ type AppointmentServiceResponse = {
1863
+ service: AppointmentService;
1864
+ };
1865
+ type ListAppointmentServicesResponse = {
1866
+ services: AppointmentService[];
1867
+ };
1868
+ type DeleteServiceResponse = {
1869
+ success: boolean;
1870
+ };
1871
+ type ReferenceOption = {
1872
+ id: string;
1873
+ label: string;
1874
+ };
1875
+ type ReferenceOptionsResponse = {
1876
+ options: ReferenceOption[];
1877
+ };
1878
+ type AvailabilityRule = {
1879
+ id: string;
1880
+ siteId: string;
1881
+ resourceId: string;
1882
+ serviceId: string | null;
1883
+ weekday: number;
1884
+ startTime: string;
1885
+ endTime: string;
1886
+ minLeadMinutes: number;
1887
+ maxBookingNoticeMinutes: number;
1888
+ bufferMinutes: number;
1889
+ createdAt: string;
1890
+ updatedAt: string;
1891
+ };
1892
+ type CreateAvailabilityRuleRequest = {
1893
+ id?: string;
1894
+ weekday: number;
1895
+ startTime: string;
1896
+ endTime: string;
1897
+ minLeadMinutes?: number;
1898
+ maxBookingNoticeMinutes?: number;
1899
+ bufferMinutes?: number;
1900
+ serviceId?: string | null;
1901
+ };
1902
+ type ListAvailabilityRulesResponse = {
1903
+ rules: AvailabilityRule[];
1904
+ };
1905
+ type UpsertAvailabilityRuleResponse = {
1906
+ rule: AvailabilityRule;
1907
+ };
1908
+ type AppointmentBlackout = {
1909
+ id: string;
1910
+ siteId: string;
1911
+ resourceId: string | null;
1912
+ startsAt: string;
1913
+ endsAt: string;
1914
+ reason: string | null;
1915
+ createdAt: string;
1916
+ };
1917
+ type CreateBlackoutRequest = {
1918
+ startsAt: string;
1919
+ endsAt: string;
1920
+ reason?: string | null;
1921
+ };
1922
+ type ListBlackoutsResponse = {
1923
+ blackouts: AppointmentBlackout[];
1924
+ };
1925
+ type CreateBlackoutResponse = {
1926
+ blackout: AppointmentBlackout;
1927
+ };
1928
+ type DeleteAvailabilityRuleResponse = {
1929
+ success: boolean;
1930
+ };
1931
+ type DeleteBlackoutResponse = {
1932
+ success: boolean;
1933
+ };
1934
+ type TimeSlot = {
1935
+ startAt: string;
1936
+ endAt: string;
1937
+ resourceId: string;
1938
+ };
1939
+ type GetAvailableSlotsQuery = {
1940
+ serviceId: string;
1941
+ resourceId?: string;
1942
+ startDate: string;
1943
+ endDate: string;
1944
+ timezone?: string;
1945
+ };
1946
+ type GetAvailableSlotsResponse = {
1947
+ slots: TimeSlot[];
1948
+ };
1949
+ type CreateAppointmentRequest = {
1950
+ serviceId: string;
1951
+ resourceId: string;
1952
+ startAt: string;
1953
+ endAt: string;
1954
+ customerName: string;
1955
+ customerEmail: string;
1956
+ customerPhone?: string | null;
1957
+ notes?: string | null;
1958
+ timezone?: string;
1959
+ };
1960
+ type AppointmentRecord = {
1961
+ id: string;
1962
+ siteId: string;
1963
+ serviceId: string;
1964
+ resourceId: string;
1965
+ customerId: string;
1966
+ startAt: string;
1967
+ endAt: string;
1968
+ timezone: string;
1969
+ status: 'pending' | 'confirmed' | 'cancelled' | 'no_show';
1970
+ source: string;
1971
+ metadata: Record<string, unknown>;
1972
+ formSubmissionJson: Record<string, unknown>;
1973
+ reminderScheduledAt: string | null;
1974
+ createdAt: string;
1975
+ updatedAt: string;
1976
+ };
1977
+ type BookingCustomerRecord = {
1978
+ id: string;
1979
+ siteId: string;
1980
+ name: string | null;
1981
+ email: string | null;
1982
+ phone: string | null;
1983
+ timezone: string | null;
1984
+ metadata: Record<string, unknown>;
1985
+ createdAt: string;
1986
+ updatedAt: string;
1987
+ };
1988
+ type CreateAppointmentResponse = {
1989
+ appointment: AppointmentRecord;
1990
+ customer: BookingCustomerRecord;
1991
+ };
1992
+ type AccountRevokeSessionsBody = {
1993
+ scope?: 'others' | 'global';
1994
+ };
1995
+ type AccountRevokeSessionsResponse = {
1996
+ ok: boolean;
1997
+ scope: 'others' | 'global';
1998
+ };
1999
+ type AccountUpdatePasswordBody = {
2000
+ currentPassword: string;
2001
+ newPassword: string;
2002
+ };
2003
+ type AccountUpdatePasswordResponse = {
2004
+ ok: boolean;
2005
+ passwordSetAt?: string | null;
2006
+ };
2007
+ type MediaJobSummaryResponse = {
2008
+ processed: number;
2009
+ skipped: number;
2010
+ failures: number;
2011
+ };
2012
+ type CreateMediaAssetBody = {
2013
+ siteId: string;
2014
+ storageBucket: string;
2015
+ storagePath: string;
2016
+ filename: string;
2017
+ mimeType: string;
2018
+ width?: number;
2019
+ height?: number;
2020
+ bytes?: number;
2021
+ checksumSha256?: string | null;
2022
+ source?: 'upload' | 'instagram';
2023
+ altText?: string | null;
2024
+ caption?: string | null;
2025
+ exif?: Record<string, unknown> | null;
2026
+ };
2027
+ type MediaAssetResponse = {
2028
+ id: string;
2029
+ siteId: string;
2030
+ storageBucket: string | null;
2031
+ storagePath: string;
2032
+ filename: string;
2033
+ mimeType: string;
2034
+ width: number | null;
2035
+ height: number | null;
2036
+ bytes: number | null;
2037
+ checksumSha256: string | null;
2038
+ source: 'upload' | 'instagram';
2039
+ altText: string | null;
2040
+ caption: string | null;
2041
+ exif: Record<string, unknown> | null;
2042
+ createdBy: string | null;
2043
+ createdAt: string;
2044
+ updatedAt: string;
2045
+ labels?: Array<{
2046
+ id: number;
2047
+ slug: string;
2048
+ name: string;
2049
+ }>;
2050
+ };
2051
+ type ContentRouteRecord = {
2052
+ id: string;
2053
+ draftTitle: string;
2054
+ draftPath: string;
2055
+ draftSlug: string | null;
2056
+ draftStatus: 'draft' | 'scheduled' | 'published' | 'archived';
2057
+ draftMetaTitle?: string | null;
2058
+ draftMetaDescription?: string | null;
2059
+ draftUpdatedAt?: string | null;
2060
+ publishedTitle?: string | null;
2061
+ publishedPath?: string | null;
2062
+ publishedSlug?: string | null;
2063
+ publishedMetaTitle?: string | null;
2064
+ publishedMetaDescription?: string | null;
2065
+ publishedAt?: string | null;
2066
+ status?: 'draft' | 'scheduled' | 'published' | 'archived';
2067
+ ogImageId?: string | null;
2068
+ };
2069
+ type ContentEntryStatus = 'draft' | 'scheduled' | 'published' | 'archived';
2070
+ type ContentEntryRecord = {
2071
+ id: string;
2072
+ siteId: string;
2073
+ contentTypeId: string;
2074
+ routeId: string | null;
2075
+ draftVersionId: string | null;
2076
+ publishedVersionId: string | null;
2077
+ createdAt: string;
2078
+ updatedAt: string;
2079
+ createdBy: string | null;
2080
+ updatedBy: string | null;
2081
+ };
2082
+ type ContentEntrySummary = {
2083
+ id: string;
2084
+ title: string;
2085
+ status: ContentEntryStatus;
2086
+ slug: string | null;
2087
+ publishAt: string | null;
2088
+ updatedAt: string;
2089
+ draftTitle: string;
2090
+ draftPath: string;
2091
+ routeId: string | null;
2092
+ };
2093
+ type FormSummary = {
2094
+ id: string;
2095
+ name: string;
2096
+ updatedAt: string | null;
2097
+ };
2098
+ type FormRecord = CamelizeKeys<DbRow<'forms'>>;
2099
+ type FormSubmissionRecord = DbRow<'form_submissions'>;
2100
+ type ThemePreferencesRecord = DbRow<'site_theme_preferences'>;
2101
+ type ThemeRow = DbRow<'themes'>;
2102
+ type ThemeGenerationTurn = {
2103
+ message: string;
2104
+ themes: Theme[];
2105
+ };
2106
+ type ContentEntryDetail<TContent> = {
2107
+ entry: ContentEntryRecord;
2108
+ route: ContentRouteRecord | null;
2109
+ draftContent: TContent;
2110
+ publishedContent: TContent | null;
2111
+ };
2112
+ type ContentEntryDetailResponse<TContent = Record<string, unknown>> = {
2113
+ entry: ContentEntryDetail<TContent>;
2114
+ };
2115
+ type ContentEntryOrPageResponse<TContent = Record<string, unknown>> = ContentEntryDetailResponse<TContent> | {
2116
+ entry: PageRecord;
2117
+ };
2118
+ type PublishedContentEntryPreview = {
2119
+ id: string;
2120
+ title: string;
2121
+ slug: string;
2122
+ path: string;
2123
+ excerpt: string;
2124
+ publishedAt: string | null;
2125
+ image: {
2126
+ url?: string | null;
2127
+ alt?: string | null;
2128
+ } | null;
2129
+ };
2130
+ type PublishedContentEntryPreviewResponse = {
2131
+ data: PublishedContentEntryPreview | null;
2132
+ };
2133
+ type PublishedPostPreviewResponse = PublishedContentEntryPreviewResponse;
2134
+ type ContentEntryListStage = 'published' | 'preview';
2135
+ type ContentEntryListItem<TContent = Record<string, unknown>> = {
2136
+ id: string;
2137
+ slug: string | null;
2138
+ path: string;
2139
+ title: string;
2140
+ status: ContentEntryStatus;
2141
+ publishedAt: string | null;
2142
+ content: TContent;
2143
+ excerpt: string;
2144
+ routeId: string | null;
2145
+ };
2146
+ type ListPublishedEntriesResponse<TContent = Record<string, unknown>> = {
2147
+ entries: ContentEntryListItem<TContent>[];
2148
+ };
2149
+ type UpsertBriefRequest = Partial<CamelizeKeys<SiteBriefRecord>>;
2150
+ type UpsertBriefResponse = SiteBriefRecord;
2151
+ type SerializedContentTypeSummary = {
2152
+ id: string | null;
2153
+ siteId: string;
2154
+ key: string;
2155
+ name: string;
2156
+ description: string | null;
2157
+ hasPages: boolean;
2158
+ routePattern: string | null;
2159
+ };
2160
+ type ContentTypeTemplateSummary = SerializedContentTypeSummary & {
2161
+ schema: Record<string, unknown>;
2162
+ titleField: string | null;
2163
+ defaultTemplateId: string | null;
2164
+ templateAddons: string[] | null;
2165
+ createdAt: string | null;
2166
+ updatedAt: string | null;
2167
+ };
2168
+ type ContentTemplateSummary = {
2169
+ id: string;
2170
+ contentTypeId: string;
2171
+ templateKey: string;
2172
+ name: string;
2173
+ description: string | null;
2174
+ isDefault: boolean;
2175
+ metadata: Record<string, unknown>;
2176
+ createdAt: string | null;
2177
+ updatedAt: string | null;
2178
+ };
2179
+ type ContentTemplateBlockSummary = {
2180
+ id: string;
2181
+ templateId: string;
2182
+ orderIndex: number;
2183
+ blockKind: string;
2184
+ scope: 'entry' | 'template';
2185
+ content: Record<string, unknown> | null;
2186
+ bindings: Record<string, unknown> | null;
2187
+ dataDependencies: Record<string, unknown> | null;
2188
+ createdAt: string | null;
2189
+ updatedAt: string | null;
2190
+ };
2191
+ type ContentTemplateAddonSummary = {
2192
+ addonKey: string;
2193
+ enabled: boolean;
2194
+ metadata: Record<string, unknown>;
2195
+ createdAt: string | null;
2196
+ updatedAt: string | null;
2197
+ };
2198
+ type ContentAddonDefinition = {
2199
+ addonKey: string;
2200
+ name: string;
2201
+ description: string | null;
2202
+ schemaPatch: DbJson;
2203
+ blockPatch: DbJson;
2204
+ version: string | null;
2205
+ metadata: Record<string, unknown>;
2206
+ createdAt: string | null;
2207
+ updatedAt: string | null;
2208
+ };
2209
+ type ContentTemplateDetailsResponse = {
2210
+ contentType: ContentTypeTemplateSummary;
2211
+ template: ContentTemplateSummary | null;
2212
+ blocks: ContentTemplateBlockSummary[];
2213
+ addons: ContentTemplateAddonSummary[];
2214
+ availableAddons: ContentAddonDefinition[];
2215
+ };
2216
+ type UpdateContentTemplateBlockRequest = {
2217
+ content: Record<string, unknown>;
2218
+ };
2219
+ type ApplyContentTemplateAddonRequest = {
2220
+ addonKey: string;
2221
+ };
2222
+ type UpdateContentTemplateBlockBindingsRequest = {
2223
+ bindings: Record<string, unknown>;
2224
+ };
2225
+ type CreateTemplateBlockRequest = {
2226
+ blockKind: string;
2227
+ scope: 'entry' | 'template';
2228
+ position?: number;
2229
+ };
2230
+ type ReorderTemplateBlocksRequest = {
2231
+ blockIds: string[];
2232
+ };
2233
+ type TransformMetadata = {
2234
+ id: string;
2235
+ summary: string;
2236
+ kind: 'formatter' | 'collection' | 'string' | 'html';
2237
+ };
2238
+ type GetTransformsResponse = {
2239
+ transforms: TransformMetadata[];
2240
+ };
2241
+ type SiteGeneralSettingsPayload = {
2242
+ siteTitle: string;
2243
+ logoAssetId: string | null;
2244
+ };
2245
+ type SiteGeneralSettingsResponse = {
2246
+ settings: SiteGeneralSettingsPayload;
2247
+ };
2248
+ type SiteLayoutSettingsPayload = {
2249
+ logoAssetId: string | null;
2250
+ header: SiteHeaderContent;
2251
+ footer: SiteFooterContent;
2252
+ };
2253
+ type SiteLayoutResolvedPayload = SiteLayoutSettingsPayload & {
2254
+ logo?: {
2255
+ assetId: string | null;
2256
+ url: string | null;
2257
+ alt: string | null;
2258
+ width?: number | null;
2259
+ height?: number | null;
2260
+ };
2261
+ };
2262
+ type SiteLayoutSettingsResponse = {
2263
+ settings: SiteLayoutSettingsPayload;
2264
+ };
2265
+ type MaintenanceSettingsPayload = {
2266
+ enabled: boolean;
2267
+ message: any;
2268
+ };
2269
+ type MaintenanceSettingsResponse = {
2270
+ settings: MaintenanceSettingsPayload;
2271
+ };
2272
+ type SiteBySlugResponse = {
2273
+ site: {
2274
+ id: string;
2275
+ title: string;
2276
+ slug: string;
2277
+ created_at: string;
2278
+ updated_at: string;
2279
+ maintenance_mode_enabled?: boolean | undefined;
2280
+ maintenance_mode_message?: unknown | null | undefined;
2281
+ };
2282
+ theme: Theme;
2283
+ themeId?: string | null;
2284
+ selectionId?: string | null;
2285
+ navigation: NavigationMenuWithItems[];
2286
+ routes: Record<string, {
2287
+ path: string;
2288
+ draftPath: string | null;
2289
+ status: string | null;
2290
+ draftStatus?: string | null;
2291
+ publishedAt?: string | null;
2292
+ }>;
2293
+ layout: SiteLayoutResolvedPayload;
2294
+ customDomain: string | null;
2295
+ sdkConfig?: RiverbankSiteConfig | null;
2296
+ };
2297
+ type BlockWithContentResponse = {
2298
+ id: string;
2299
+ kind: string;
2300
+ siteId: string;
2301
+ pageId: string | null;
2302
+ draftContentId: string | null;
2303
+ publishedContentId: string | null;
2304
+ draftContent: Record<string, unknown> | null;
2305
+ publishedContent: Record<string, unknown> | null;
2306
+ };
2307
+ type DevToolsImpersonationResponse = {
2308
+ userId: string;
2309
+ email: string | null;
2310
+ mode: 'superadmin' | 'random';
2311
+ };
2312
+ type DevToolsSeedResponse = {
2313
+ summary: {
2314
+ usersCreated: number;
2315
+ usersUpdated: number;
2316
+ sitesCreated: number;
2317
+ sitesUpdated: number;
2318
+ pagesCreated: number;
2319
+ pagesUpdated: number;
2320
+ blocksCreated: number;
2321
+ };
2322
+ };
2323
+ type CreateManualSiteRequest = {
2324
+ title: string;
2325
+ description?: string | null;
2326
+ themeKey: string;
2327
+ contentTypes: Array<'page' | 'post' | 'event' | 'testimonial'>;
2328
+ scaffoldHome: boolean;
2329
+ scaffoldContact: boolean;
2330
+ scaffoldBlog: boolean;
2331
+ invitees?: string[];
2332
+ };
2333
+ type CreateManualSiteResponse = {
2334
+ siteId: string;
2335
+ slug: string;
2336
+ seeded: {
2337
+ pages: Array<{
2338
+ id: string;
2339
+ name: string;
2340
+ path: string;
2341
+ }>;
2342
+ forms: Array<{
2343
+ id: string;
2344
+ name: string;
2345
+ slug: string;
2346
+ }>;
2347
+ contentTypes: Array<'page' | 'post' | 'event' | 'testimonial'>;
2348
+ };
2349
+ };
2350
+ type APIEndpoints = {
2351
+ aiContentUpdateChat: APIEndpoint<{
2352
+ messages: AIChatMessage[];
2353
+ }, never, ReadableStream<Uint8Array>>;
2354
+ aiChat: APIEndpoint<{
2355
+ messages: AIChatMessage[];
2356
+ }, never, ReadableStream<Uint8Array>>;
2357
+ aiCreateBriefChat: APIEndpoint<{
2358
+ messages: AIChatMessage[];
2359
+ }, never, AiBriefTurn>;
2360
+ aiPrototypeChat: APIEndpoint<{
2361
+ client: PrototypeClientBrief;
2362
+ }, never, PrototypeChatResponse>;
2363
+ aiPatchDryRun: APIEndpoint<AiPatchRequest, never, AiPatchDryRunResponse>;
2364
+ aiPatchApply: APIEndpoint<AiPatchRequest, never, AiPatchApplyResponse>;
2365
+ aiPlaygroundPropose: APIEndpoint<{
2366
+ request: string;
2367
+ }, {
2368
+ siteId: string;
2369
+ pageId: string;
2370
+ }, {
2371
+ patches: Array<{
2372
+ blockId: string;
2373
+ ops: Array<Record<string, unknown>>;
2374
+ rationale: string;
2375
+ }>;
2376
+ assistantMessage: string;
2377
+ validation: {
2378
+ valid: boolean;
2379
+ issues: string[];
2380
+ filtered: number;
2381
+ };
2382
+ }>;
2383
+ getBrief: APIEndpoint<never, // No body for GET
2384
+ {
2385
+ id?: string;
2386
+ }, // Optional query parameters
2387
+ GetBriefResponse>;
2388
+ createBriefTurn: APIEndpoint<CreateBriefTurnRequest, never, CreateBriefTurnResponse>;
2389
+ aiBriefToSpec: APIEndpoint<{
2390
+ briefId: string;
2391
+ }, never, SiteSpecEnvelope>;
2392
+ upsertBrief: APIEndpoint<UpsertBriefRequest, never, UpsertBriefResponse>;
2393
+ createSite: APIEndpoint<{
2394
+ title: string;
2395
+ }, never, {
2396
+ id: string;
2397
+ title: string;
2398
+ }>;
2399
+ createSiteManual: APIEndpoint<CreateManualSiteRequest, never, CreateManualSiteResponse>;
2400
+ updateSite: APIEndpoint<Partial<Site>, never, Partial<Site>>;
2401
+ deleteSite: APIEndpoint<never, {
2402
+ siteId: string;
2403
+ }, {
2404
+ ok: boolean;
2405
+ }>;
2406
+ listContentEntries: APIEndpoint<never, {
2407
+ siteId: string;
2408
+ type: string;
2409
+ }, {
2410
+ entries: ContentEntrySummary[];
2411
+ contentType: SerializedContentTypeSummary;
2412
+ }>;
2413
+ getContentTemplate: APIEndpoint<never, {
2414
+ siteId: string;
2415
+ type: string;
2416
+ }, ContentTemplateDetailsResponse>;
2417
+ updateContentTemplateBlock: APIEndpoint<UpdateContentTemplateBlockRequest, {
2418
+ siteId: string;
2419
+ type: string;
2420
+ blockId: string;
2421
+ }, ContentTemplateDetailsResponse>;
2422
+ applyContentTemplateAddon: APIEndpoint<ApplyContentTemplateAddonRequest, {
2423
+ siteId: string;
2424
+ type: string;
2425
+ }, ContentTemplateDetailsResponse>;
2426
+ updateContentTemplateBlockBindings: APIEndpoint<UpdateContentTemplateBlockBindingsRequest, {
2427
+ siteId: string;
2428
+ type: string;
2429
+ blockId: string;
2430
+ }, ContentTemplateDetailsResponse>;
2431
+ createTemplateBlock: APIEndpoint<CreateTemplateBlockRequest, {
2432
+ siteId: string;
2433
+ type: string;
2434
+ }, ContentTemplateDetailsResponse>;
2435
+ deleteTemplateBlock: APIEndpoint<never, {
2436
+ siteId: string;
2437
+ type: string;
2438
+ blockId: string;
2439
+ }, ContentTemplateDetailsResponse>;
2440
+ reorderTemplateBlocks: APIEndpoint<ReorderTemplateBlocksRequest, {
2441
+ siteId: string;
2442
+ type: string;
2443
+ }, ContentTemplateDetailsResponse>;
2444
+ getTransforms: APIEndpoint<never, never, GetTransformsResponse>;
2445
+ createContentEntry: APIEndpoint<Record<string, unknown> | undefined, {
2446
+ siteId: string;
2447
+ type: string;
2448
+ }, ContentEntryOrPageResponse>;
2449
+ getContentEntry: APIEndpoint<never, {
2450
+ siteId: string;
2451
+ type: string;
2452
+ entryId: string;
2453
+ }, ContentEntryOrPageResponse>;
2454
+ updateContentEntry: APIEndpoint<Record<string, unknown>, {
2455
+ siteId: string;
2456
+ type: string;
2457
+ entryId: string;
2458
+ }, ContentEntryOrPageResponse>;
2459
+ updateContentEntryContent: APIEndpoint<{
2460
+ data: Record<string, unknown>;
2461
+ optimistic_hash?: string | null;
2462
+ } | {
2463
+ path: string;
2464
+ value: unknown;
2465
+ optimistic_hash?: string | null;
2466
+ }, {
2467
+ siteId: string;
2468
+ type: string;
2469
+ entryId: string;
2470
+ }, ContentEntryOrPageResponse>;
2471
+ publishContentEntry: APIEndpoint<Record<string, unknown> | undefined, {
2472
+ siteId: string;
2473
+ type: string;
2474
+ entryId: string;
2475
+ }, ContentEntryOrPageResponse>;
2476
+ discardContentEntry: APIEndpoint<never, {
2477
+ siteId: string;
2478
+ type: string;
2479
+ entryId: string;
2480
+ }, ContentEntryOrPageResponse>;
2481
+ unpublishContentEntry: APIEndpoint<never, {
2482
+ siteId: string;
2483
+ type: string;
2484
+ entryId: string;
2485
+ }, ContentEntryOrPageResponse>;
2486
+ deleteContentEntry: APIEndpoint<never, {
2487
+ siteId: string;
2488
+ type: string;
2489
+ entryId: string;
2490
+ }, {
2491
+ ok: boolean;
2492
+ }>;
2493
+ updateRouteMetadata: APIEndpoint<RouteMetadataPayload, {
2494
+ siteId: string;
2495
+ routeId: string;
2496
+ }, RouteMetadataResponse>;
2497
+ listSiteMembers: APIEndpoint<never, {
2498
+ siteId: string;
2499
+ }, ListSiteMembersResponse>;
2500
+ inviteSiteMember: APIEndpoint<InviteSiteMemberRequest, {
2501
+ siteId: string;
2502
+ }, InviteSiteMemberResponse>;
2503
+ updateSiteMemberRole: APIEndpoint<UpdateSiteMemberRoleRequest, {
2504
+ siteId: string;
2505
+ memberId: string;
2506
+ }, UpdateSiteMemberRoleResponse>;
2507
+ authLogin: APIEndpoint<FormData, never, AuthSubmissionResult>;
2508
+ authForgotPassword: APIEndpoint<FormData, never, AuthSubmissionResult>;
2509
+ authRegister: APIEndpoint<FormData, never, AuthSubmissionResult>;
2510
+ authReauthenticate: APIEndpoint<FormData, never, ReauthSubmissionResult>;
2511
+ lookupSiteDomains: APIEndpoint<LookupSiteDomainRequest, {
2512
+ siteId: string;
2513
+ }, LookupSiteDomainResponse>;
2514
+ registerSiteDomain: APIEndpoint<RegisterSiteDomainRequest, {
2515
+ siteId: string;
2516
+ }, RegisterSiteDomainResponse>;
2517
+ addCustomDomain: APIEndpoint<AddCustomDomainRequest, {
2518
+ siteId: string;
2519
+ }, AddCustomDomainResponse>;
2520
+ removeCustomDomain: APIEndpoint<never, {
2521
+ siteId: string;
2522
+ }, {
2523
+ success: boolean;
2524
+ }>;
2525
+ syncCustomDomainToEdgeConfig: APIEndpoint<never, {
2526
+ siteId: string;
2527
+ }, {
2528
+ success: boolean;
2529
+ domain: string;
2530
+ siteId: string;
2531
+ message: string;
2532
+ }>;
2533
+ listAccountDomains: APIEndpoint<never, never, {
2534
+ domains: SiteDomainRecord[];
2535
+ }>;
2536
+ searchDomains: APIEndpoint<{
2537
+ query: string;
2538
+ }, never, {
2539
+ result: DomainSearchResultResponse;
2540
+ }>;
2541
+ registerDomain: APIEndpoint<RegisterDomainRequestPayload, never, RegisterDomainResponse>;
2542
+ assignDomain: APIEndpoint<{
2543
+ siteId: string;
2544
+ }, {
2545
+ domainId: string;
2546
+ }, {
2547
+ domain: SiteDomainRecord;
2548
+ }>;
2549
+ removeSiteMember: APIEndpoint<never, {
2550
+ siteId: string;
2551
+ memberId: string;
2552
+ }, RemoveSiteMemberResponse>;
2553
+ revokeSiteInvitation: APIEndpoint<never, {
2554
+ siteId: string;
2555
+ invitationId: string;
2556
+ }, RevokeSiteInvitationResponse>;
2557
+ transferSiteOwnership: APIEndpoint<TransferSiteOwnershipRequest, {
2558
+ siteId: string;
2559
+ }, TransferSiteOwnershipResponse>;
2560
+ updateSiteGeneralSettings: APIEndpoint<SiteGeneralSettingsPayload, {
2561
+ siteId: string;
2562
+ }, SiteGeneralSettingsResponse>;
2563
+ getSiteLayoutSettings: APIEndpoint<never, {
2564
+ siteId: string;
2565
+ }, SiteLayoutSettingsResponse>;
2566
+ updateSiteLayoutSettings: APIEndpoint<SiteLayoutSettingsPayload, {
2567
+ siteId: string;
2568
+ }, SiteLayoutSettingsResponse>;
2569
+ getMaintenanceSettings: APIEndpoint<never, {
2570
+ siteId: string;
2571
+ }, MaintenanceSettingsResponse>;
2572
+ updateMaintenanceSettings: APIEndpoint<MaintenanceSettingsPayload, {
2573
+ siteId: string;
2574
+ }, MaintenanceSettingsResponse>;
2575
+ setHomepage: APIEndpoint<SetHomepageRequest, {
2576
+ siteId: string;
2577
+ }, SetHomepageResponse>;
2578
+ listContentTypes: APIEndpoint<undefined, {
2579
+ siteId: string;
2580
+ }, {
2581
+ contentTypes: SerializedContentTypeSummary[];
2582
+ }>;
2583
+ enableContentType: APIEndpoint<undefined | Record<string, never>, {
2584
+ siteId: string;
2585
+ key: string;
2586
+ }, {
2587
+ ok: boolean;
2588
+ contentType: SerializedContentTypeSummary;
2589
+ }>;
2590
+ setupContentType: APIEndpoint<{
2591
+ addListingPage?: boolean;
2592
+ addNavItem?: boolean;
2593
+ seedExample?: boolean;
2594
+ } | undefined, {
2595
+ siteId: string;
2596
+ key: string;
2597
+ }, {
2598
+ ok: true;
2599
+ type: string;
2600
+ pageId?: string;
2601
+ navItemId?: string;
2602
+ entryId?: string;
2603
+ }>;
2604
+ adminStartImpersonation: APIEndpoint<StartImpersonationRequest, never, StartImpersonationResponse>;
2605
+ adminStopImpersonation: APIEndpoint<StopImpersonationRequest, never, StopImpersonationResponse>;
2606
+ adminAssignRole: APIEndpoint<UpsertAdminRoleRequest, never, AdminRoleMutationResponse>;
2607
+ adminRevokeRole: APIEndpoint<RevokeAdminRoleRequest, never, AdminRoleMutationResponse>;
2608
+ adminChangePlan: APIEndpoint<AdminChangePlanRequest, never, AdminChangePlanResponse>;
2609
+ changePlan: APIEndpoint<ChangePlanRequest, never, ChangePlanResponse>;
2610
+ mfaTotpEnroll: APIEndpoint<never, never, MfaTotpEnrollResponse>;
2611
+ mfaTotpVerify: APIEndpoint<MfaTotpVerifyRequest, never, MfaTotpVerifyResponse>;
2612
+ mfaTotpActivate: APIEndpoint<MfaTotpActivateRequest | undefined, never, MfaOverviewResponse>;
2613
+ mfaDeleteFactor: APIEndpoint<MfaTotpActivateRequest | undefined, {
2614
+ factorId: string;
2615
+ }, MfaOverviewResponse>;
2616
+ mfaBackupCodesGet: APIEndpoint<never, never, MfaBackupCodesOverviewResponse>;
2617
+ mfaBackupCodesRotate: APIEndpoint<{
2618
+ count?: number;
2619
+ } | undefined, never, MfaBackupCodesRotateResponse>;
2620
+ mfaPhoneEnroll: APIEndpoint<MfaPhoneEnrollRequest, never, MfaPhoneEnrollResponse>;
2621
+ mfaPhoneChallenge: APIEndpoint<MfaPhoneChallengeRequest, never, MfaPhoneChallengeResponse>;
2622
+ mfaPhoneVerify: APIEndpoint<MfaPhoneVerifyRequest, never, MfaOverviewResponse>;
2623
+ accountUpdatePassword: APIEndpoint<AccountUpdatePasswordBody, never, AccountUpdatePasswordResponse>;
2624
+ accountRevokeSessions: APIEndpoint<AccountRevokeSessionsBody, never, AccountRevokeSessionsResponse>;
2625
+ adminListInvites: APIEndpoint<{
2626
+ tenantId?: string | null;
2627
+ }, never, ListAdminInvitesResponse>;
2628
+ adminCreateInvite: APIEndpoint<CreateAdminInviteRequest, never, CreateAdminInviteResponse>;
2629
+ adminRevokeInvite: APIEndpoint<never, {
2630
+ inviteId: string;
2631
+ }, RevokeAdminInviteResponse>;
2632
+ adminCreateUser: APIEndpoint<CreateAdminUserRequest, never, CreateAdminUserResponse>;
2633
+ adminListAllowedDomains: APIEndpoint<{
2634
+ tenantId?: string | null;
2635
+ }, never, ListAllowedDomainsResponse>;
2636
+ adminAddAllowedDomain: APIEndpoint<CreateAllowedDomainRequest, never, CreateAllowedDomainResponse>;
2637
+ adminDeleteAllowedDomain: APIEndpoint<never, {
2638
+ domainId: string;
2639
+ }, DeleteAllowedDomainResponse>;
2640
+ authAcceptInvite: APIEndpoint<AcceptAdminInviteRequest, never, AcceptAdminInviteResponse>;
2641
+ acceptSiteInvitation: APIEndpoint<AcceptSiteInvitationRequest, never, AcceptSiteInvitationResponse>;
2642
+ getNavigationMenus: APIEndpoint<never, {
2643
+ siteId: string;
2644
+ }, {
2645
+ menus: NavigationMenuWithItems[];
2646
+ }>;
2647
+ createNavigationMenu: APIEndpoint<{
2648
+ name: string;
2649
+ isPrimary?: boolean;
2650
+ position?: number;
2651
+ }, {
2652
+ siteId: string;
2653
+ }, {
2654
+ menus: NavigationMenuWithItems[];
2655
+ }>;
2656
+ updateNavigationMenu: APIEndpoint<{
2657
+ name?: string;
2658
+ isPrimary?: boolean;
2659
+ position?: number;
2660
+ }, {
2661
+ siteId: string;
2662
+ menuId: string;
2663
+ }, {
2664
+ menus: NavigationMenuWithItems[];
2665
+ }>;
2666
+ deleteNavigationMenu: APIEndpoint<never, {
2667
+ siteId: string;
2668
+ menuId: string;
2669
+ }, {
2670
+ menus: NavigationMenuWithItems[];
2671
+ }>;
2672
+ createNavigationItem: APIEndpoint<{
2673
+ label: string;
2674
+ type: 'link' | 'dropdown';
2675
+ link?: LinkPayload;
2676
+ parentId?: string | null;
2677
+ orderIndex?: number;
2678
+ isCta?: boolean;
2679
+ }, {
2680
+ siteId: string;
2681
+ menuId: string;
2682
+ }, {
2683
+ menus: NavigationMenuWithItems[];
2684
+ }>;
2685
+ updateNavigationItem: APIEndpoint<{
2686
+ label?: string;
2687
+ type?: 'link' | 'dropdown';
2688
+ link?: LinkPayload;
2689
+ parentId?: string | null;
2690
+ orderIndex?: number;
2691
+ isCta?: boolean;
2692
+ }, {
2693
+ siteId: string;
2694
+ menuId: string;
2695
+ itemId: string;
2696
+ }, {
2697
+ menus: NavigationMenuWithItems[];
2698
+ }>;
2699
+ deleteNavigationItem: APIEndpoint<never, {
2700
+ siteId: string;
2701
+ menuId: string;
2702
+ itemId: string;
2703
+ }, {
2704
+ menus: NavigationMenuWithItems[];
2705
+ }>;
2706
+ reorderNavigationItems: APIEndpoint<{
2707
+ items: Array<{
2708
+ id: string;
2709
+ orderIndex: number;
2710
+ parentId: string | null;
2711
+ }>;
2712
+ }, {
2713
+ siteId: string;
2714
+ menuId: string;
2715
+ }, {
2716
+ menus: NavigationMenuWithItems[];
2717
+ }>;
2718
+ getRoutableContent: APIEndpoint<never, {
2719
+ siteId: string;
2720
+ }, {
2721
+ items: RoutableContentItem[];
2722
+ }>;
2723
+ listForms: APIEndpoint<never, {
2724
+ siteId: string;
2725
+ }, {
2726
+ forms: FormSummary[];
2727
+ }>;
2728
+ listBookingForms: APIEndpoint<never, {
2729
+ siteId: string;
2730
+ }, {
2731
+ forms: FormSummary[];
2732
+ }>;
2733
+ createForm: APIEndpoint<{
2734
+ name: string;
2735
+ slug: string;
2736
+ schema: DbJson;
2737
+ settings?: DbJson;
2738
+ }, {
2739
+ siteId: string;
2740
+ }, {
2741
+ form: FormRecord;
2742
+ }>;
2743
+ updateForm: APIEndpoint<{
2744
+ name?: string;
2745
+ schema?: DbJson;
2746
+ settings?: DbJson;
2747
+ }, {
2748
+ siteId: string;
2749
+ slug: string;
2750
+ }, {
2751
+ form: FormRecord;
2752
+ }>;
2753
+ deleteForm: APIEndpoint<never, {
2754
+ siteId: string;
2755
+ slug: string;
2756
+ }, {
2757
+ ok: boolean;
2758
+ }>;
2759
+ listFormSubmissions: APIEndpoint<never, {
2760
+ siteId: string;
2761
+ slug: string;
2762
+ page?: string;
2763
+ perPage?: string;
2764
+ since?: string;
2765
+ until?: string;
2766
+ }, {
2767
+ submissions: FormSubmissionRecord[];
2768
+ page: number;
2769
+ perPage: number;
2770
+ total: number;
2771
+ since: string | null;
2772
+ until: string | null;
2773
+ }>;
2774
+ submitForm: APIEndpoint<{
2775
+ siteId: string;
2776
+ slug: string;
2777
+ data: Record<string, unknown>;
2778
+ meta?: {
2779
+ ip?: string;
2780
+ userAgent?: string;
2781
+ referer?: string;
2782
+ path?: string;
2783
+ honeypot?: string;
2784
+ turnstileToken?: string | null;
2785
+ };
2786
+ }, never, {
2787
+ ok: boolean;
2788
+ }>;
2789
+ getPublicFormById: APIEndpoint<never, {
2790
+ formId: string;
2791
+ }, {
2792
+ form: FormRecord;
2793
+ }>;
2794
+ getPublicBookingServices: APIEndpoint<never, {
2795
+ siteId: string;
2796
+ ids?: string;
2797
+ }, {
2798
+ services: Array<{
2799
+ id: string;
2800
+ siteId: string;
2801
+ title: string;
2802
+ description?: string;
2803
+ durationMinutes?: number;
2804
+ }>;
2805
+ }>;
2806
+ getPublishedPostPreview: APIEndpoint<never, {
2807
+ siteId: string;
2808
+ slug: string;
2809
+ }, PublishedPostPreviewResponse>;
2810
+ getPublishedEntryPreview: APIEndpoint<never, {
2811
+ siteId: string;
2812
+ type: string;
2813
+ slug: string;
2814
+ }, PublishedContentEntryPreviewResponse>;
2815
+ listPublishedEntries: APIEndpoint<never, {
2816
+ siteId: string;
2817
+ type: string;
2818
+ limit?: string;
2819
+ order?: 'published_at.asc' | 'published_at.desc';
2820
+ stage?: ContentEntryListStage;
2821
+ }, ListPublishedEntriesResponse>;
2822
+ proposalsSelect: APIEndpoint<{
2823
+ site_id: string;
2824
+ proposal_id: string;
2825
+ selected_toggle_keys: string[];
2826
+ }, never, {
2827
+ ok: boolean;
2828
+ selection: SiteProposalSelectionRecord;
2829
+ }>;
2830
+ createTheme: APIEndpoint<{
2831
+ site_id: string;
2832
+ brief?: DbJson;
2833
+ materialized_proposal?: DbJson;
2834
+ }, never, {
2835
+ output: ThemeGenerationTurn[];
2836
+ text: string[] | null;
2837
+ }>;
2838
+ generateThemes: APIEndpoint<{
2839
+ site_id: string;
2840
+ }, never, {
2841
+ ok: boolean;
2842
+ themes: ThemeRow[];
2843
+ }>;
2844
+ extractThemeFromInspiration: APIEndpoint<{
2845
+ urls: string[];
2846
+ }, never, {
2847
+ palette: {
2848
+ primary: string;
2849
+ secondary: string;
2850
+ accent: string;
2851
+ background: string;
2852
+ surface: string;
2853
+ text: string;
2854
+ };
2855
+ mode: 'light' | 'dark';
2856
+ }>;
2857
+ saveSiteTheme: APIEndpoint<{
2858
+ theme: Theme;
2859
+ themeId?: string | null;
2860
+ selectionId?: string | null;
2861
+ overrides?: Record<string, unknown> | null;
2862
+ }, {
2863
+ siteId: string;
2864
+ }, {
2865
+ success: boolean;
2866
+ themeId: string;
2867
+ selectionId: string;
2868
+ savedAt: string;
2869
+ overrides: Record<string, unknown> | null;
2870
+ theme: Theme;
2871
+ }>;
2872
+ uploadSiteLogo: APIEndpoint<FormData, never, {
2873
+ path: string;
2874
+ publicUrl: string | null;
2875
+ palette: string[];
2876
+ }>;
2877
+ upsertThemePreferences: APIEndpoint<{
2878
+ site_id: string;
2879
+ has_brand_colors?: boolean;
2880
+ brand_colors?: string[];
2881
+ inspiration_urls?: string[];
2882
+ logo_path?: string | null;
2883
+ palette_variants?: Array<{
2884
+ key: string;
2885
+ recipe_id?: string;
2886
+ strategy?: 'seedLocked' | 'blendLocked';
2887
+ palette: {
2888
+ primary: string;
2889
+ secondary: string;
2890
+ accent: string;
2891
+ background: string;
2892
+ surface: string;
2893
+ text: string;
2894
+ };
2895
+ }>;
2896
+ selected_palette_key?: string;
2897
+ style_axes?: {
2898
+ energy?: 'calm' | 'vibrant';
2899
+ density?: 'airy' | 'compact';
2900
+ };
2901
+ }, never, {
2902
+ ok: boolean;
2903
+ preferences: ThemePreferencesRecord;
2904
+ }>;
2905
+ finalizeSite: APIEndpoint<{
2906
+ siteId: string;
2907
+ themeId: string;
2908
+ }, // Body parameters
2909
+ never, // No query parameters
2910
+ {
2911
+ success: boolean;
2912
+ redirectUrl: string;
2913
+ siteSlug: string;
2914
+ }>;
2915
+ getSite: APIEndpoint<never, // GET requests don't have body
2916
+ {
2917
+ id?: string;
2918
+ slug?: string;
2919
+ domain?: string;
2920
+ scope?: 'id-only' | 'full';
2921
+ }, // Query parameters
2922
+ SiteBySlugResponse>;
2923
+ getSiteBySlug: APIEndpoint<never, // GET requests don't have body
2924
+ {
2925
+ slug: string;
2926
+ }, // Query parameters
2927
+ SiteBySlugResponse>;
2928
+ getSiteByDomain: APIEndpoint<never, // GET requests don't have body
2929
+ {
2930
+ domain: string;
2931
+ }, // Query parameters
2932
+ SiteBySlugResponse>;
2933
+ getSiteById: APIEndpoint<never, // GET requests don't have body
2934
+ {
2935
+ id: string;
2936
+ }, // Path parameters
2937
+ SiteBySlugResponse>;
2938
+ getBlockContent: APIEndpoint<never, // GET requests don't have body
2939
+ {
2940
+ blockId: string;
2941
+ }, // Path parameters
2942
+ BlockWithContentResponse>;
2943
+ instagramUploadZip: APIEndpoint<FormData, undefined, {
2944
+ ok: boolean;
2945
+ imported: number;
2946
+ skipped: number;
2947
+ failed: number;
2948
+ totalPosts: number;
2949
+ errors: Array<{
2950
+ uri: string;
2951
+ error: string;
2952
+ }>;
2953
+ }>;
2954
+ getAnalyticsReport: APIEndpoint<AnalyticsReportFilters, {
2955
+ siteId: string;
2956
+ }, AnalyticsReportResponse>;
2957
+ getSeoOverview: APIEndpoint<never, SeoOverviewQuery, SeoOverviewResponse>;
2958
+ getSeoPages: APIEndpoint<never, SeoSearchPagesQuery, SeoSearchPagesResponse>;
2959
+ getSeoQueries: APIEndpoint<never, SeoSearchQueriesQuery, SeoSearchQueriesResponse>;
2960
+ getPerformanceOverview: APIEndpoint<never, PerformanceOverviewQuery, PerformanceOverviewResponse>;
2961
+ createMediaAsset: APIEndpoint<CreateMediaAssetBody, undefined, MediaAssetResponse>;
2962
+ mediaList: APIEndpoint<{
2963
+ siteId: string;
2964
+ q?: string;
2965
+ limit?: number;
2966
+ offset?: number;
2967
+ labels?: string;
2968
+ }, never, ListMediaAssetsResult>;
2969
+ mediaGet: APIEndpoint<never, {
2970
+ assetId: string;
2971
+ }, MediaAssetWithLabels>;
2972
+ mediaUpdate: APIEndpoint<{
2973
+ filename?: string;
2974
+ altText?: string | null;
2975
+ caption?: string | null;
2976
+ width?: number | null;
2977
+ height?: number | null;
2978
+ durationSeconds?: number | null;
2979
+ thumbnailAssetId?: string | null;
2980
+ isThumbnail?: boolean;
2981
+ }, {
2982
+ assetId: string;
2983
+ }, MediaAssetWithLabels>;
2984
+ mediaDelete: APIEndpoint<{
2985
+ deleteObject?: boolean;
2986
+ cascadeLabels?: boolean;
2987
+ }, {
2988
+ assetId: string;
2989
+ }, void>;
2990
+ mediaBulkDelete: APIEndpoint<{
2991
+ assetIds: string[];
2992
+ deleteObjects?: boolean;
2993
+ cascadeLabels?: boolean;
2994
+ }, never, {
2995
+ deleted: number;
2996
+ failed: number;
2997
+ errors?: Array<{
2998
+ assetId: string;
2999
+ error: string;
3000
+ }>;
3001
+ }>;
3002
+ mediaGetSignedUrl: APIEndpoint<never, {
3003
+ assetId: string;
3004
+ }, {
3005
+ signedUrl: string;
3006
+ }>;
3007
+ mediaUpload: APIEndpoint<FormData, undefined, MediaAssetWithLabels>;
3008
+ updateBlockContent: APIEndpoint<{
3009
+ path: string;
3010
+ value: DbJson;
3011
+ optimistic_hash?: string | null;
3012
+ }, {
3013
+ siteId: string;
3014
+ blockId: string;
3015
+ }, {
3016
+ ok: boolean;
3017
+ contentId: string;
3018
+ version: number;
3019
+ data: DbJson;
3020
+ stage: 'draft' | 'published';
3021
+ optimistic_hash?: string | null;
3022
+ }>;
3023
+ saveBlockContent: APIEndpoint<{
3024
+ data: DbJson;
3025
+ optimistic_hash?: string | null;
3026
+ }, {
3027
+ siteId: string;
3028
+ blockId: string;
3029
+ }, {
3030
+ ok: boolean;
3031
+ contentId: string;
3032
+ version: number;
3033
+ data: DbJson;
3034
+ stage: 'draft' | 'published';
3035
+ optimistic_hash?: string | null;
3036
+ }>;
3037
+ createBlock: APIEndpoint<{
3038
+ kind: string;
3039
+ position?: number;
3040
+ purpose?: string;
3041
+ }, {
3042
+ siteId: string;
3043
+ pageId: string;
3044
+ }, {
3045
+ ok: boolean;
3046
+ block: Record<string, unknown>;
3047
+ }>;
3048
+ reorderBlocks: APIEndpoint<{
3049
+ blockIds: string[];
3050
+ }, {
3051
+ siteId: string;
3052
+ pageId: string;
3053
+ }, {
3054
+ ok: boolean;
3055
+ }>;
3056
+ deleteBlock: APIEndpoint<never, {
3057
+ siteId: string;
3058
+ pageId: string;
3059
+ blockId: string;
3060
+ }, {
3061
+ ok: boolean;
3062
+ }>;
3063
+ listBlocks: APIEndpoint<never, {
3064
+ siteId: string;
3065
+ pageId: string;
3066
+ }, {
3067
+ blocks: BlockListItem[];
3068
+ }>;
3069
+ getPageById: APIEndpoint<never, {
3070
+ siteId: string;
3071
+ pageId: string;
3072
+ }, {
3073
+ page: {
3074
+ id: string;
3075
+ purpose: string;
3076
+ created_at: string;
3077
+ updated_at: string;
3078
+ name: string;
3079
+ path: string;
3080
+ status: string | null;
3081
+ draft_status: string | null;
3082
+ published_at: string | null;
3083
+ draft_updated_at: string | null;
3084
+ routeId: string | null;
3085
+ blocks: Array<Record<string, unknown>>;
3086
+ };
3087
+ templates?: Array<Record<string, unknown>>;
3088
+ }>;
3089
+ getContentByPath: APIEndpoint<{
3090
+ path: string;
3091
+ preview?: boolean;
3092
+ }, {
3093
+ siteId: string;
3094
+ }, {
3095
+ type?: 'page';
3096
+ page: {
3097
+ id: string;
3098
+ purpose: string;
3099
+ created_at: string;
3100
+ updated_at: string;
3101
+ name: string;
3102
+ path: string;
3103
+ status: string | null;
3104
+ draft_status: string | null;
3105
+ published_at: string | null;
3106
+ draft_updated_at: string | null;
3107
+ routeId: string | null;
3108
+ blocks: Array<Record<string, unknown>>;
3109
+ };
3110
+ templates?: Array<Record<string, unknown>>;
3111
+ } | {
3112
+ type: 'entry';
3113
+ entry: {
3114
+ id: string;
3115
+ type: string | null;
3116
+ title: string;
3117
+ slug: string | null;
3118
+ status: string;
3119
+ publishAt: string | null;
3120
+ path: string | null;
3121
+ draftPath: string | null;
3122
+ content: Record<string, unknown>;
3123
+ draftContent: Record<string, unknown> | null;
3124
+ publishedContent: Record<string, unknown> | null;
3125
+ metaTitle: string | null;
3126
+ draftMetaTitle: string | null;
3127
+ metaDescription: string | null;
3128
+ draftMetaDescription: string | null;
3129
+ createdAt: string;
3130
+ updatedAt: string;
3131
+ };
3132
+ templates: Array<Record<string, unknown>>;
3133
+ }>;
3134
+ getPageByPath: APIEndpoint<never, {
3135
+ siteId: string;
3136
+ path: string;
3137
+ }, {
3138
+ page: {
3139
+ id: string;
3140
+ purpose: string;
3141
+ created_at: string;
3142
+ updated_at: string;
3143
+ name: string;
3144
+ path: string;
3145
+ status: string | null;
3146
+ draft_status: string | null;
3147
+ published_at: string | null;
3148
+ draft_updated_at: string | null;
3149
+ routeId: string | null;
3150
+ blocks: Array<Record<string, unknown>>;
3151
+ };
3152
+ templates?: Array<Record<string, unknown>>;
3153
+ }>;
3154
+ initSiteContent: APIEndpoint<{}, {
3155
+ siteId: string;
3156
+ }, {
3157
+ ok: boolean;
3158
+ created: number;
3159
+ totalBlocks: number;
3160
+ }>;
3161
+ getMediaLabels: APIEndpoint<{
3162
+ siteId: string;
3163
+ }, never, {
3164
+ items: MediaLabelSummary[];
3165
+ }>;
3166
+ getMediaSettings: APIEndpoint<{
3167
+ siteId: string;
3168
+ }, never, MediaSettingsResponse>;
3169
+ updateMediaSettings: APIEndpoint<{
3170
+ siteId: string;
3171
+ persistVariants: boolean;
3172
+ }, never, MediaSettingsResponse>;
3173
+ mediaSearch: APIEndpoint<{
3174
+ siteId: string;
3175
+ query: string;
3176
+ limit?: number;
3177
+ threshold?: number;
3178
+ labels?: string[];
3179
+ }, never, ListMediaAssetsResult>;
3180
+ classifyMediaAsset: APIEndpoint<{
3181
+ force?: boolean;
3182
+ prompt?: string;
3183
+ }, {
3184
+ assetId: string;
3185
+ }, {
3186
+ ok: boolean;
3187
+ job: MediaClassifyJobResponse | null;
3188
+ summary?: MediaJobSummaryResponse;
3189
+ reason?: string;
3190
+ }>;
3191
+ classifyMediaBatch: APIEndpoint<{
3192
+ siteId: string;
3193
+ assetIds?: string[];
3194
+ limit?: number;
3195
+ force?: boolean;
3196
+ prompt?: string;
3197
+ }, never, {
3198
+ ok: boolean;
3199
+ job: MediaClassifyJobResponse | null;
3200
+ summary: MediaJobSummaryResponse;
3201
+ }>;
3202
+ enqueueMediaClassifyJob: APIEndpoint<{
3203
+ siteId: string;
3204
+ assetIds?: string[];
3205
+ limit?: number;
3206
+ force?: boolean;
3207
+ prompt?: string;
3208
+ }, never, {
3209
+ ok: boolean;
3210
+ job: MediaClassifyJobResponse | null;
3211
+ reason?: string;
3212
+ }>;
3213
+ runMediaClassifyJob: APIEndpoint<{
3214
+ siteId: string;
3215
+ jobId?: string;
3216
+ maxSteps?: number;
3217
+ }, never, {
3218
+ ok: boolean;
3219
+ job: MediaClassifyJobResponse | null;
3220
+ summary?: MediaJobSummaryResponse;
3221
+ completed?: boolean;
3222
+ reason?: string;
3223
+ }>;
3224
+ runAllMediaClassifyJobs: APIEndpoint<{
3225
+ siteIds?: string[];
3226
+ maxSites?: number;
3227
+ maxSteps?: number;
3228
+ }, never, {
3229
+ ok: boolean;
3230
+ results: Array<{
3231
+ siteId: string;
3232
+ jobId: string | null;
3233
+ status: 'skipped' | 'completed' | 'processing';
3234
+ summary?: MediaJobSummaryResponse;
3235
+ }>;
3236
+ }>;
3237
+ mediaJobsStatus: APIEndpoint<{
3238
+ siteId: string;
3239
+ limit?: number;
3240
+ statuses?: string;
3241
+ }, never, {
3242
+ jobs: MediaClassifyJobResponse[];
3243
+ }>;
3244
+ devToolsImpersonateAdmin: APIEndpoint<undefined, never, DevToolsImpersonationResponse>;
3245
+ devToolsImpersonateRandom: APIEndpoint<undefined, never, DevToolsImpersonationResponse>;
3246
+ devToolsSeedDemoData: APIEndpoint<undefined, never, DevToolsSeedResponse>;
3247
+ analyticsCollect: APIEndpoint<{
3248
+ siteId?: string;
3249
+ eventName: 'page_view' | 'cta_click' | 'form_submit';
3250
+ path: string;
3251
+ referrer?: string | null;
3252
+ metadata?: Record<string, unknown>;
3253
+ sessionId?: string;
3254
+ }, never, {
3255
+ ok: true;
3256
+ }>;
3257
+ listPublicEvents: APIEndpoint<never, {
3258
+ siteId: string;
3259
+ limit?: string;
3260
+ from?: string;
3261
+ to?: string;
3262
+ stage?: string;
3263
+ }, Array<{
3264
+ id: string;
3265
+ seriesId: string;
3266
+ title: string;
3267
+ description: string | null;
3268
+ slug: string;
3269
+ startsAt: string;
3270
+ endsAt: string;
3271
+ capacity: number | null;
3272
+ registeredCount: number;
3273
+ availableSpots: number | null;
3274
+ venue: {
3275
+ id: string;
3276
+ name: string;
3277
+ address: string | null;
3278
+ } | null;
3279
+ }>>;
3280
+ registerForEvent: APIEndpoint<{
3281
+ occurrenceId: string;
3282
+ email: string;
3283
+ name: string;
3284
+ ticketsCount?: number;
3285
+ phone?: string;
3286
+ notes?: string;
3287
+ formData?: Record<string, unknown>;
3288
+ }, {
3289
+ siteId: string;
3290
+ }, {
3291
+ success: boolean;
3292
+ attendeeId: string;
3293
+ status: 'confirmed' | 'waitlist';
3294
+ waitlistPosition?: number;
3295
+ message: string;
3296
+ }>;
3297
+ applySeoChanges: APIEndpoint<ApplySeoChangesRequest, never, ApplySeoChangesResponse>;
3298
+ listGscPropertiesAdmin: APIEndpoint<never, never, ListGscPropertiesAdminResponse>;
3299
+ adminSetGscPersist: APIEndpoint<AdminSetGscPersistRequest, never, AdminSetGscPersistResponse>;
3300
+ adminStartGscVerification: APIEndpoint<AdminStartGscVerifyRequest, never, AdminStartGscVerifyResponse>;
3301
+ adminConfirmGscVerification: APIEndpoint<AdminConfirmGscVerifyRequest, never, AdminConfirmGscVerifyResponse>;
3302
+ adminRunGscIngest: APIEndpoint<AdminRunIngestRequest, never, AdminRunIngestResponse>;
3303
+ getSeoVerificationMeta: APIEndpoint<never, GetSeoVerificationMetaQuery, GetSeoVerificationMetaResponse>;
3304
+ checkRedirect: APIEndpoint<never, CheckRedirectQuery, CheckRedirectResponse>;
3305
+ listRedirectRules: APIEndpoint<never, {
3306
+ siteId: string;
3307
+ }, ListRedirectRulesResponse>;
3308
+ createRedirectRule: APIEndpoint<CreateRedirectRuleRequest, {
3309
+ siteId: string;
3310
+ }, CreateRedirectRuleResponse>;
3311
+ deleteRedirectRule: APIEndpoint<never, {
3312
+ siteId: string;
3313
+ ruleId: string;
3314
+ }, DeleteRedirectRuleResponse>;
3315
+ listApiKeys: APIEndpoint<never, never, ListApiKeysResponse>;
3316
+ createApiKey: APIEndpoint<CreateApiKeyRequest, never, CreateApiKeyResponse>;
3317
+ revokeApiKey: APIEndpoint<never, {
3318
+ keyId: string;
3319
+ }, RevokeApiKeyResponse>;
3320
+ listSiteApiKeys: APIEndpoint<never, {
3321
+ siteId: string;
3322
+ }, ListSiteApiKeysResponse>;
3323
+ createSiteApiKey: APIEndpoint<CreateSiteApiKeyRequest, {
3324
+ siteId: string;
3325
+ }, CreateSiteApiKeyResponse>;
3326
+ revokeSiteApiKey: APIEndpoint<never, {
3327
+ siteId: string;
3328
+ keyId: string;
3329
+ }, RevokeSiteApiKeyResponse>;
3330
+ getSitePreviewKey: APIEndpoint<never, {
3331
+ siteId: string;
3332
+ }, GetSitePreviewKeyResponse>;
3333
+ regenerateSitePreviewKey: APIEndpoint<never, {
3334
+ siteId: string;
3335
+ }, RegenerateSitePreviewKeyResponse>;
3336
+ getSiteApiKeyAccessLogs: APIEndpoint<never, {
3337
+ siteId: string;
3338
+ }, GetSiteApiKeyAccessLogsResponse>;
3339
+ getBookingSettings: APIEndpoint<never, {
3340
+ siteId: string;
3341
+ }, BookingSettingsResponse>;
3342
+ updateBookingSettings: APIEndpoint<UpdateBookingSettingsRequest, {
3343
+ siteId: string;
3344
+ }, BookingSettingsResponse>;
3345
+ listAppointmentResources: APIEndpoint<never, {
3346
+ siteId: string;
3347
+ }, ListAppointmentResourcesResponse>;
3348
+ createAppointmentResource: APIEndpoint<CreateAppointmentResourceRequest, {
3349
+ siteId: string;
3350
+ }, AppointmentResourceResponse>;
3351
+ getAppointmentResource: APIEndpoint<never, {
3352
+ siteId: string;
3353
+ resourceId: string;
3354
+ }, AppointmentResourceResponse>;
3355
+ updateAppointmentResource: APIEndpoint<UpdateAppointmentResourceRequest, {
3356
+ siteId: string;
3357
+ resourceId: string;
3358
+ }, AppointmentResourceResponse>;
3359
+ deleteAppointmentResource: APIEndpoint<never, {
3360
+ siteId: string;
3361
+ resourceId: string;
3362
+ }, DeleteResourceResponse>;
3363
+ listAppointmentServices: APIEndpoint<never, {
3364
+ siteId: string;
3365
+ }, ListAppointmentServicesResponse>;
3366
+ createAppointmentService: APIEndpoint<CreateAppointmentServiceRequest, {
3367
+ siteId: string;
3368
+ }, AppointmentServiceResponse>;
3369
+ getAppointmentService: APIEndpoint<never, {
3370
+ siteId: string;
3371
+ serviceId: string;
3372
+ }, AppointmentServiceResponse>;
3373
+ updateAppointmentService: APIEndpoint<UpdateAppointmentServiceRequest, {
3374
+ siteId: string;
3375
+ serviceId: string;
3376
+ }, AppointmentServiceResponse>;
3377
+ deleteAppointmentService: APIEndpoint<never, {
3378
+ siteId: string;
3379
+ serviceId: string;
3380
+ }, DeleteServiceResponse>;
3381
+ getAppointmentServicesReference: APIEndpoint<never, {
3382
+ siteId: string;
3383
+ }, ReferenceOptionsResponse>;
3384
+ getAppointmentResourcesReference: APIEndpoint<never, {
3385
+ siteId: string;
3386
+ }, ReferenceOptionsResponse>;
3387
+ getResourceServices: APIEndpoint<never, {
3388
+ siteId: string;
3389
+ resourceId: string;
3390
+ }, {
3391
+ serviceIds: string[];
3392
+ }>;
3393
+ updateResourceServices: APIEndpoint<{
3394
+ serviceIds: string[];
3395
+ }, {
3396
+ siteId: string;
3397
+ resourceId: string;
3398
+ }, {
3399
+ success: boolean;
3400
+ serviceIds: string[];
3401
+ }>;
3402
+ getServiceResources: APIEndpoint<never, {
3403
+ siteId: string;
3404
+ serviceId: string;
3405
+ }, {
3406
+ resourceIds: string[];
3407
+ }>;
3408
+ updateServiceResources: APIEndpoint<{
3409
+ resourceIds: string[];
3410
+ }, {
3411
+ siteId: string;
3412
+ serviceId: string;
3413
+ }, {
3414
+ success: boolean;
3415
+ resourceIds: string[];
3416
+ }>;
3417
+ listAvailabilityRules: APIEndpoint<never, {
3418
+ siteId: string;
3419
+ resourceId: string;
3420
+ }, ListAvailabilityRulesResponse>;
3421
+ upsertAvailabilityRule: APIEndpoint<CreateAvailabilityRuleRequest, {
3422
+ siteId: string;
3423
+ resourceId: string;
3424
+ }, UpsertAvailabilityRuleResponse>;
3425
+ deleteAvailabilityRule: APIEndpoint<never, {
3426
+ siteId: string;
3427
+ resourceId: string;
3428
+ ruleId: string;
3429
+ }, DeleteAvailabilityRuleResponse>;
3430
+ listBlackouts: APIEndpoint<never, {
3431
+ siteId: string;
3432
+ resourceId: string;
3433
+ }, ListBlackoutsResponse>;
3434
+ createBlackout: APIEndpoint<CreateBlackoutRequest, {
3435
+ siteId: string;
3436
+ resourceId: string;
3437
+ }, CreateBlackoutResponse>;
3438
+ deleteBlackout: APIEndpoint<never, {
3439
+ siteId: string;
3440
+ resourceId: string;
3441
+ blackoutId: string;
3442
+ }, DeleteBlackoutResponse>;
3443
+ getAvailableSlots: APIEndpoint<GetAvailableSlotsQuery, {
3444
+ siteId: string;
3445
+ } & GetAvailableSlotsQuery, GetAvailableSlotsResponse>;
3446
+ createAppointment: APIEndpoint<CreateAppointmentRequest, {
3447
+ siteId: string;
3448
+ }, CreateAppointmentResponse>;
3449
+ listSiteContentTypes: APIEndpoint<never, {
3450
+ siteId: string;
3451
+ }, ListContentTypesResponse>;
3452
+ getContentType: APIEndpoint<never, {
3453
+ siteId: string;
3454
+ typeId: string;
3455
+ }, {
3456
+ contentType: ContentTypeRecord;
3457
+ }>;
3458
+ createContentType: APIEndpoint<CreateContentTypeRequest, {
3459
+ siteId: string;
3460
+ }, CreateContentTypeResponse>;
3461
+ updateContentType: APIEndpoint<UpdateContentTypeRequest, {
3462
+ siteId: string;
3463
+ typeId: string;
3464
+ }, UpdateContentTypeResponse>;
3465
+ deleteContentType: APIEndpoint<never, {
3466
+ siteId: string;
3467
+ typeId: string;
3468
+ }, DeleteContentTypeResponse>;
3469
+ duplicateContentType: APIEndpoint<{
3470
+ newKey: string;
3471
+ }, {
3472
+ siteId: string;
3473
+ typeId: string;
3474
+ }, DuplicateContentTypeResponse>;
3475
+ adminCreateSite: APIEndpoint<AdminCreateSiteRequest, never, AdminCreateSiteResponse>;
3476
+ refreshSdkConfig: APIEndpoint<never, {
3477
+ siteId: string;
3478
+ }, RefreshSdkConfigResponse>;
3479
+ stripeConnectAuthorize: APIEndpoint<never, {
3480
+ siteId: string;
3481
+ }, StripeConnectAuthorizeResponse>;
3482
+ stripeConnectStatus: APIEndpoint<never, {
3483
+ siteId: string;
3484
+ }, StripeConnectStatusResponse>;
3485
+ stripeConnectDisconnect: APIEndpoint<never, {
3486
+ siteId: string;
3487
+ }, StripeConnectDisconnectResponse>;
3488
+ adminGetPriceOverride: APIEndpoint<never, AdminGetPriceOverrideQuery, AdminGetPriceOverrideResponse>;
3489
+ adminUpsertPriceOverride: APIEndpoint<AdminUpsertPriceOverrideRequest, never, AdminUpsertPriceOverrideResponse>;
3490
+ adminDeletePriceOverride: APIEndpoint<AdminDeletePriceOverrideRequest, never, AdminDeletePriceOverrideResponse>;
3491
+ importSiteBackup: APIEndpoint<FormData, {
3492
+ siteId: string;
3493
+ }, BackupImportResponse>;
3494
+ };
3495
+ type APICallParams<E extends keyof APIEndpoints> = APIEndpoints[E] extends {
3496
+ method: 'GET';
3497
+ } ? {
3498
+ endpoint: E;
3499
+ body?: APIEndpoints[E]['body'];
3500
+ params?: APIEndpoints[E]['query'] extends Record<string, any> ? Record<keyof APIEndpoints[E]['query'], string> : Record<string, string>;
3501
+ options?: RequestInit;
3502
+ } : APIEndpoints[E] extends {
3503
+ method: 'POST' | 'PUT' | 'PATCH';
3504
+ } ? {
3505
+ endpoint: E;
3506
+ body: APIEndpoints[E]['body'];
3507
+ params?: APIEndpoints[E]['query'] extends Record<string, any> ? Record<keyof APIEndpoints[E]['query'], string> : Record<string, string>;
3508
+ options?: RequestInit;
3509
+ } : {
3510
+ endpoint: E;
3511
+ body?: APIEndpoints[E]['body'];
3512
+ params?: APIEndpoints[E]['query'] extends Record<string, any> ? Record<keyof APIEndpoints[E]['query'], string> : Record<string, string>;
3513
+ options?: RequestInit;
3514
+ };
3515
+ type AiPatchPageMetaOp = {
3516
+ type: 'pageMeta';
3517
+ set: {
3518
+ metaTitle?: string | null;
3519
+ metaDescription?: string | null;
3520
+ };
3521
+ };
3522
+ type AiPatchBlockSetOp = {
3523
+ type: 'block.set';
3524
+ blockId: string;
3525
+ path: string;
3526
+ value: unknown;
3527
+ };
3528
+ type AiPatchOp = AiPatchPageMetaOp | AiPatchBlockSetOp;
3529
+ type AiPatchRequest = {
3530
+ siteId: string;
3531
+ pageId?: string;
3532
+ ops: AiPatchOp[];
3533
+ };
3534
+ type AiPatchDryRunResponse = {
3535
+ ok: true;
3536
+ valid: boolean;
3537
+ issues: string[];
3538
+ ops: AiPatchOp[];
3539
+ };
3540
+ type AiPatchApplyResponse = {
3541
+ ok: true;
3542
+ applied: number;
3543
+ issues: string[];
3544
+ };
3545
+ type ListGscPropertiesAdminResponse = {
3546
+ properties: Array<{
3547
+ id: string;
3548
+ siteId: string;
3549
+ siteUrl: string;
3550
+ type: 'domain' | 'url_prefix';
3551
+ verificationMethod: string | null;
3552
+ verificationToken: string | null;
3553
+ verifiedAt: string | null;
3554
+ status: string;
3555
+ firstSeenDate: string | null;
3556
+ lastSyncedDate: string | null;
3557
+ persistEnabled: boolean;
3558
+ createdAt: string;
3559
+ updatedAt: string;
3560
+ }>;
3561
+ };
3562
+ type AdminSetGscPersistRequest = {
3563
+ siteId: string;
3564
+ enabled: boolean;
3565
+ };
3566
+ type AdminSetGscPersistResponse = {
3567
+ ok: true;
3568
+ meta: {
3569
+ site_id: string;
3570
+ persist_enabled?: boolean | null;
3571
+ first_seen_date?: string | null;
3572
+ last_synced_date?: string | null;
3573
+ };
3574
+ };
3575
+ type AdminStartGscVerifyRequest = {
3576
+ siteId: string;
3577
+ siteUrl: string;
3578
+ };
3579
+ type AdminStartGscVerifyResponse = {
3580
+ ok: true;
3581
+ siteId: string;
3582
+ siteUrl: string;
3583
+ type: 'url_prefix';
3584
+ token: string;
3585
+ tag: string | null;
3586
+ };
3587
+ type AdminConfirmGscVerifyRequest = {
3588
+ siteId: string;
3589
+ siteUrl: string;
3590
+ };
3591
+ type AdminConfirmGscVerifyResponse = {
3592
+ ok: boolean;
3593
+ status?: string;
3594
+ verifiedAt?: string;
3595
+ message?: string;
3596
+ };
3597
+ type AdminRunIngestRequest = {
3598
+ siteId: string;
3599
+ };
3600
+ type AdminRunIngestResponse = {
3601
+ ok: true;
3602
+ result: {
3603
+ ok: true;
3604
+ startedAt: string;
3605
+ processed: number;
3606
+ updatedMeta: number;
3607
+ seededReports: number;
3608
+ skipped: number;
3609
+ apiRequests: number;
3610
+ throttledMs: number;
3611
+ };
3612
+ };
3613
+ type GetSeoVerificationMetaQuery = {
3614
+ host?: string;
3615
+ siteId?: string;
3616
+ };
3617
+ type GetSeoVerificationMetaResponse = {
3618
+ ok: true;
3619
+ token: string | null;
3620
+ };
3621
+ type SeoRangePreset = '1d' | '7d' | '30d' | '90d' | '365d';
3622
+ type SeoOverviewQuery = {
3623
+ siteId: string;
3624
+ preset?: SeoRangePreset;
3625
+ start?: string;
3626
+ end?: string;
3627
+ };
3628
+ type SeoOverviewTimePoint = {
3629
+ date: string;
3630
+ clicks: number;
3631
+ impressions: number;
3632
+ ctr: number;
3633
+ position: number;
3634
+ };
3635
+ type SeoOverviewResponse = {
3636
+ ok: true;
3637
+ overview: {
3638
+ range: {
3639
+ from: string;
3640
+ to: string;
3641
+ preset?: SeoRangePreset;
3642
+ };
3643
+ totals: {
3644
+ clicks: number;
3645
+ impressions: number;
3646
+ ctr: number;
3647
+ position: number;
3648
+ };
3649
+ timeseries: SeoOverviewTimePoint[];
3650
+ lastSyncedDate: string | null;
3651
+ persistEnabled: boolean;
3652
+ hasData: boolean;
3653
+ };
3654
+ preset: SeoRangePreset;
3655
+ };
3656
+ type PerformanceRangePreset = '1d' | '7d' | '30d' | '90d' | '365d';
3657
+ type PerformanceOverviewQuery = {
3658
+ siteId: string;
3659
+ preset?: PerformanceRangePreset;
3660
+ start?: string;
3661
+ end?: string;
3662
+ };
3663
+ type PerformanceOverviewResponse = {
3664
+ ok: true;
3665
+ overview: {
3666
+ range: {
3667
+ from: string;
3668
+ to: string;
3669
+ preset?: PerformanceRangePreset;
3670
+ };
3671
+ gscConnected: boolean;
3672
+ gscDataThrough: string | null;
3673
+ gscPersistEnabled: boolean;
3674
+ gscLastSyncedDate: string | null;
3675
+ seo: {
3676
+ totals: SeoOverviewResponse['overview']['totals'];
3677
+ timeseries: SeoOverviewTimePoint[];
3678
+ hasData: boolean;
3679
+ };
3680
+ analytics: {
3681
+ range: AnalyticsReportResponse['range'];
3682
+ totals: AnalyticsReportResponse['totals'];
3683
+ series: AnalyticsReportResponse['series'];
3684
+ topPages: AnalyticsReportResponse['topPages'];
3685
+ topReferrers: AnalyticsReportResponse['topReferrers'];
3686
+ goLiveAt: AnalyticsReportResponse['goLiveAt'];
3687
+ clamped: boolean;
3688
+ partial: boolean;
3689
+ noDataYet: boolean;
3690
+ };
3691
+ };
3692
+ preset: PerformanceRangePreset;
3693
+ };
3694
+ type SeoSearchSummary = {
3695
+ clicks: number;
3696
+ impressions: number;
3697
+ ctr: number;
3698
+ position: number;
3699
+ };
3700
+ type SeoSearchPagesQuery = {
3701
+ siteId: string;
3702
+ preset?: PerformanceRangePreset;
3703
+ start?: string;
3704
+ end?: string;
3705
+ pageNumber?: number;
3706
+ perPage?: number;
3707
+ sort?: 'clicks' | 'impressions' | 'ctr' | 'position' | 'queryCount' | 'page';
3708
+ direction?: 'asc' | 'desc';
3709
+ search?: string;
3710
+ page?: string;
3711
+ device?: 'DESKTOP' | 'MOBILE' | 'TABLET';
3712
+ country?: string;
3713
+ format?: 'csv';
3714
+ };
3715
+ type SeoSearchPagesResponse = {
3716
+ ok: true;
3717
+ range: {
3718
+ from: string;
3719
+ to: string;
3720
+ preset?: PerformanceRangePreset;
3721
+ };
3722
+ preset: PerformanceRangePreset;
3723
+ page: number;
3724
+ perPage: number;
3725
+ total: number;
3726
+ totalPages: number;
3727
+ sort: {
3728
+ by: NonNullable<SeoSearchPagesQuery['sort']>;
3729
+ direction: NonNullable<SeoSearchPagesQuery['direction']>;
3730
+ };
3731
+ search: string | null;
3732
+ filters: {
3733
+ page: string | null;
3734
+ device: SeoSearchPagesQuery['device'] | null;
3735
+ country: string | null;
3736
+ };
3737
+ summary: SeoSearchSummary;
3738
+ items: Array<{
3739
+ page: string;
3740
+ clicks: number;
3741
+ impressions: number;
3742
+ ctr: number;
3743
+ position: number;
3744
+ queryCount: number;
3745
+ }>;
3746
+ };
3747
+ type SeoSearchQueriesQuery = {
3748
+ siteId: string;
3749
+ preset?: PerformanceRangePreset;
3750
+ start?: string;
3751
+ end?: string;
3752
+ pageNumber?: number;
3753
+ perPage?: number;
3754
+ sort?: 'clicks' | 'impressions' | 'ctr' | 'position' | 'pageCount' | 'query';
3755
+ direction?: 'asc' | 'desc';
3756
+ search?: string;
3757
+ page?: string;
3758
+ query?: string;
3759
+ device?: 'DESKTOP' | 'MOBILE' | 'TABLET';
3760
+ country?: string;
3761
+ format?: 'csv';
3762
+ };
3763
+ type SeoSearchQueriesResponse = {
3764
+ ok: true;
3765
+ range: {
3766
+ from: string;
3767
+ to: string;
3768
+ preset?: PerformanceRangePreset;
3769
+ };
3770
+ preset: PerformanceRangePreset;
3771
+ page: number;
3772
+ perPage: number;
3773
+ total: number;
3774
+ totalPages: number;
3775
+ sort: {
3776
+ by: NonNullable<SeoSearchQueriesQuery['sort']>;
3777
+ direction: NonNullable<SeoSearchQueriesQuery['direction']>;
3778
+ };
3779
+ search: string | null;
3780
+ filters: {
3781
+ page: string | null;
3782
+ query: string | null;
3783
+ device: SeoSearchQueriesQuery['device'] | null;
3784
+ country: string | null;
3785
+ };
3786
+ summary: SeoSearchSummary;
3787
+ items: Array<{
3788
+ query: string;
3789
+ clicks: number;
3790
+ impressions: number;
3791
+ ctr: number;
3792
+ position: number;
3793
+ pageCount: number;
3794
+ }>;
3795
+ };
3796
+ type CheckRedirectQuery = {
3797
+ site: string;
3798
+ path: string;
3799
+ };
3800
+ type CheckRedirectResponse = {
3801
+ redirectTo: string | null;
3802
+ status?: number;
3803
+ };
3804
+ type RedirectRuleRecord = {
3805
+ id: string;
3806
+ siteId: string;
3807
+ fromPath: string;
3808
+ toPath: string;
3809
+ httpStatus: number | null;
3810
+ isActive: boolean;
3811
+ createdAt?: string;
3812
+ createdBy?: string | null;
3813
+ updatedAt?: string;
3814
+ };
3815
+ type ListRedirectRulesResponse = {
3816
+ redirects: RedirectRuleRecord[];
3817
+ };
3818
+ type CreateRedirectRuleRequest = {
3819
+ fromPath: string;
3820
+ toPath: string;
3821
+ status?: 301 | 302 | 307 | 308;
3822
+ };
3823
+ type CreateRedirectRuleResponse = {
3824
+ redirect: RedirectRuleRecord;
3825
+ };
3826
+ type DeleteRedirectRuleResponse = {
3827
+ redirects: RedirectRuleRecord[];
3828
+ };
3829
+ type ApiKeyType = 'content' | 'preview';
3830
+ type ApiKeyRecord = {
3831
+ id: string;
3832
+ name: string;
3833
+ keyPrefix: string;
3834
+ keyType: ApiKeyType;
3835
+ createdAt: string;
3836
+ lastUsedAt: string | null;
3837
+ revokedAt: string | null;
3838
+ site?: {
3839
+ id: string;
3840
+ title: string;
3841
+ slug: string;
3842
+ };
3843
+ };
3844
+ type PreviewKeyRecord = {
3845
+ id: string;
3846
+ name: string;
3847
+ keyPrefix: string;
3848
+ createdAt: string;
3849
+ lastUsedAt: string | null;
3850
+ };
3851
+ type ApiKeyAccessLogRecord = {
3852
+ id: string;
3853
+ keyId: string;
3854
+ keyType: ApiKeyType;
3855
+ accessedAt: string;
3856
+ ipAddress: string | null;
3857
+ userAgent: string | null;
3858
+ path: string | null;
3859
+ };
3860
+ type ListApiKeysResponse = {
3861
+ apiKeys: ApiKeyRecord[];
3862
+ };
3863
+ type CreateApiKeyRequest = {
3864
+ siteId: string;
3865
+ name: string;
3866
+ environment?: 'live' | 'test';
3867
+ };
3868
+ type CreateApiKeyResponse = {
3869
+ key: string;
3870
+ keyId: string;
3871
+ message: string;
3872
+ };
3873
+ type RevokeApiKeyResponse = {
3874
+ message: string;
3875
+ };
3876
+ type ListSiteApiKeysResponse = {
3877
+ contentKeys: ApiKeyRecord[];
3878
+ previewKey: PreviewKeyRecord | null;
3879
+ };
3880
+ type CreateSiteApiKeyRequest = {
3881
+ name: string;
3882
+ environment?: 'live' | 'test';
3883
+ };
3884
+ type CreateSiteApiKeyResponse = {
3885
+ key: string;
3886
+ keyId: string;
3887
+ message: string;
3888
+ };
3889
+ type RevokeSiteApiKeyResponse = {
3890
+ message: string;
3891
+ };
3892
+ type GetSitePreviewKeyResponse = {
3893
+ previewKey: PreviewKeyRecord | null;
3894
+ newKey?: string;
3895
+ message?: string;
3896
+ };
3897
+ type RegenerateSitePreviewKeyResponse = {
3898
+ key: string;
3899
+ keyId: string;
3900
+ message: string;
3901
+ };
3902
+ type ApiKeyAccessLogsPagination = {
3903
+ limit: number;
3904
+ offset: number;
3905
+ hasMore: boolean;
3906
+ };
3907
+ type GetSiteApiKeyAccessLogsResponse = {
3908
+ logs: ApiKeyAccessLogRecord[];
3909
+ pagination: ApiKeyAccessLogsPagination;
3910
+ };
3911
+ type ContentTypeSummary = {
3912
+ id: string;
3913
+ siteId: string;
3914
+ key: string;
3915
+ name: string;
3916
+ description: string | null;
3917
+ hasPages: boolean;
3918
+ routePattern: string | null;
3919
+ isBuiltin: boolean;
3920
+ createdAt: string;
3921
+ updatedAt: string;
3922
+ };
3923
+ type ContentTypeRecord = ContentTypeSummary & {
3924
+ schema: Record<string, unknown>;
3925
+ titleField: string | null;
3926
+ };
3927
+ type CreateContentTypeRequest = {
3928
+ key: string;
3929
+ name: string;
3930
+ description?: string | null;
3931
+ schema: Record<string, unknown>;
3932
+ titleField?: string | null;
3933
+ };
3934
+ type UpdateContentTypeRequest = {
3935
+ name?: string;
3936
+ description?: string | null;
3937
+ schema?: Record<string, unknown>;
3938
+ titleField?: string | null;
3939
+ };
3940
+ type ListContentTypesResponse = {
3941
+ contentTypes: ContentTypeSummary[];
3942
+ };
3943
+ type CreateContentTypeResponse = {
3944
+ contentType: ContentTypeRecord;
3945
+ };
3946
+ type UpdateContentTypeResponse = {
3947
+ contentType: ContentTypeRecord;
3948
+ warnings?: string[];
3949
+ };
3950
+ type DeleteContentTypeResponse = {
3951
+ success: boolean;
3952
+ entriesCount: number;
3953
+ deletedAt: string;
3954
+ };
3955
+ type DuplicateContentTypeResponse = {
3956
+ contentType: ContentTypeRecord;
3957
+ };
3958
+ type RefreshSdkConfigResponse = {
3959
+ success: boolean;
3960
+ config: RiverbankSiteConfig;
3961
+ };
3962
+ type StripeConnectAuthorizeResponse = {
3963
+ authorizationUrl: string;
3964
+ state: string;
3965
+ };
3966
+ type StripeConnectStatusResponse = {
3967
+ isConnected: boolean;
3968
+ stripeAccountId: string | null;
3969
+ stripeAccountEmail: string | null;
3970
+ onboardingComplete: boolean;
3971
+ detailsSubmitted: boolean;
3972
+ chargesEnabled: boolean;
3973
+ payoutsEnabled: boolean;
3974
+ connectedAt: string | null;
3975
+ metadata?: Record<string, unknown> | null;
3976
+ refreshError?: boolean;
3977
+ };
3978
+ type StripeConnectDisconnectResponse = {
3979
+ success: boolean;
3980
+ message: string;
3981
+ };
3982
+ type BackupImportResponse = {
3983
+ ok: boolean;
3984
+ siteId?: string;
3985
+ dryRun?: boolean;
3986
+ counts?: Record<string, {
3987
+ created: number;
3988
+ updated: number;
3989
+ failed: number;
3990
+ }>;
3991
+ warnings?: string[];
3992
+ errors?: Array<{
3993
+ table: string;
3994
+ id: string;
3995
+ error: string;
3996
+ }>;
3997
+ error?: string;
3998
+ code?: string;
3999
+ details?: unknown;
4000
+ };
4001
+
4002
+ type SiteResponse = NonNullable<APIEndpoints['getSite']['response']>;
4003
+ type PageResponse = NonNullable<APIEndpoints['getContentByPath']['response']>;
4004
+ type EntriesResponse = NonNullable<APIEndpoints['listPublishedEntries']['response']>;
4005
+ type EntryResponse = NonNullable<APIEndpoints['getPublishedEntryPreview']['response']>;
4006
+ type PublicFormResponse = NonNullable<APIEndpoints['getPublicFormById']['response']>;
4007
+ type PublicBookingServicesResponse = NonNullable<APIEndpoints['getPublicBookingServices']['response']>;
4008
+ type PublicEventsResponse = NonNullable<APIEndpoints['listPublicEvents']['response']>;
4009
+ /**
4010
+ * Configuration for creating a Riverbank CMS client
4011
+ */
4012
+ interface RiverbankClientConfig {
4013
+ /**
4014
+ * API key for authentication (format: bld_live_... or bld_test_...)
4015
+ */
4016
+ apiKey: string;
4017
+ /**
4018
+ * Base URL for the Riverbank CMS API (required; e.g. https://dashboard.example.com/api)
4019
+ */
4020
+ baseUrl: string;
4021
+ /**
4022
+ * Cache configuration
4023
+ */
4024
+ cache?: {
4025
+ /**
4026
+ * Enable caching (default: true)
4027
+ */
4028
+ enabled?: boolean;
4029
+ /**
4030
+ * Time-to-live for cached responses in seconds
4031
+ * @default 300 (5 minutes)
4032
+ */
4033
+ ttl?: number;
4034
+ /**
4035
+ * Maximum number of cached responses
4036
+ * @default 100
4037
+ */
4038
+ maxSize?: number;
4039
+ };
4040
+ }
4041
+ /**
4042
+ * Riverbank CMS client interface
4043
+ */
4044
+ interface RiverbankClient {
4045
+ /**
4046
+ * Fetch site data by slug, domain, or ID
4047
+ */
4048
+ getSite(params: {
4049
+ slug?: string;
4050
+ domain?: string;
4051
+ id?: string;
4052
+ }): Promise<SiteResponse>;
4053
+ /**
4054
+ * Fetch a specific page by path
4055
+ *
4056
+ * @param params.preview - If true, returns draft content instead of published content (requires API key with site access)
4057
+ */
4058
+ getPage(params: {
4059
+ siteId: string;
4060
+ path: string;
4061
+ preview?: boolean;
4062
+ }): Promise<PageResponse>;
4063
+ /**
4064
+ * Fetch published content entries with optional pagination, sorting, and preview mode
4065
+ *
4066
+ * @param params.siteId - The site ID
4067
+ * @param params.contentType - The content type key (e.g., 'blog-post', 'product')
4068
+ * @param params.limit - Maximum number of entries to return
4069
+ * @param params.order - Sort order: 'newest' (published_at desc) or 'oldest' (published_at asc)
4070
+ * @param params.preview - If true, includes draft entries (requires API key with site access)
4071
+ * @param params.mode - 'query' for automatic fetching, 'manual' for specific entry IDs
4072
+ * @param params.entryIds - Array of entry IDs to fetch (only used when mode is 'manual')
4073
+ *
4074
+ * @example
4075
+ * ```ts
4076
+ * // Fetch latest 10 blog posts
4077
+ * const entries = await client.getEntries({
4078
+ * siteId: 'site-id',
4079
+ * contentType: 'blog-post',
4080
+ * limit: 10,
4081
+ * order: 'newest',
4082
+ * });
4083
+ *
4084
+ * // Fetch draft entries for preview
4085
+ * const drafts = await client.getEntries({
4086
+ * siteId: 'site-id',
4087
+ * contentType: 'blog-post',
4088
+ * preview: true,
4089
+ * });
4090
+ *
4091
+ * // Fetch specific entries by ID (manual mode)
4092
+ * const specific = await client.getEntries({
4093
+ * siteId: 'site-id',
4094
+ * contentType: 'blog-post',
4095
+ * mode: 'manual',
4096
+ * entryIds: ['uuid-1', 'uuid-2'],
4097
+ * });
4098
+ * ```
4099
+ */
4100
+ getEntries(params: {
4101
+ siteId: string;
4102
+ contentType: string;
4103
+ limit?: number;
4104
+ /** Sort order for entries. 'order' uses custom ordering (default behavior). */
4105
+ order?: 'newest' | 'oldest' | 'title' | 'order';
4106
+ preview?: boolean;
4107
+ /** Selection mode: 'query' for automatic, 'manual' for specific entry IDs */
4108
+ mode?: 'query' | 'manual';
4109
+ /** Entry IDs to fetch when mode is 'manual' */
4110
+ entryIds?: string[];
4111
+ }): Promise<EntriesResponse>;
4112
+ /**
4113
+ * Fetch a specific content entry by slug
4114
+ */
4115
+ getEntry(params: {
4116
+ siteId: string;
4117
+ contentType: string;
4118
+ slug: string;
4119
+ }): Promise<EntryResponse>;
4120
+ /**
4121
+ * Fetch a public form definition by ID
4122
+ */
4123
+ getPublicFormById(params: {
4124
+ formId: string;
4125
+ }): Promise<PublicFormResponse>;
4126
+ /**
4127
+ * Fetch public booking services for a site
4128
+ */
4129
+ getPublicBookingServices(params: {
4130
+ siteId: string;
4131
+ ids?: string;
4132
+ }): Promise<PublicBookingServicesResponse>;
4133
+ /**
4134
+ * List public events for a site (optionally time-filtered)
4135
+ */
4136
+ listPublicEvents(params: {
4137
+ siteId: string;
4138
+ limit?: number;
4139
+ from?: string;
4140
+ to?: string;
4141
+ stage?: string;
4142
+ }): Promise<PublicEventsResponse>;
4143
+ /**
4144
+ * Force clear the cache
4145
+ */
4146
+ clearCache(): void;
4147
+ }
4148
+
4149
+ export type { APIEndpoints as A, CustomLinkValue as C, EntriesResponse as E, HydratedTheme as H, InternalLinkValue as I, LinkValue as L, PageResponse as P, RiverbankClient as R, SiteResponse as S, Theme as T, RiverbankClientConfig as a, EntryResponse as b, APICallParams as c, SiteHeaderContent as d, SiteFooterContent as e, ExternalLinkValue as f, ExpandedPalette as g };