@riverbankcms/sdk 0.144.0 → 0.146.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (228) hide show
  1. package/CHANGELOG.md +17 -0
  2. package/dist/{PreviewEditorSidebar-CQZNnFiM.mjs → PreviewEditorSidebar-kg2r2Fyi.mjs} +4 -4
  3. package/dist/{PreviewEditorUI-DCNxnmI0.mjs → PreviewEditorUI-sWMLp5dT.mjs} +3 -3
  4. package/dist/{PreviewQueryProvider-BCYICImX.mjs → PreviewQueryProvider-Cg51xq1w.mjs} +1 -1
  5. package/dist/{SdkPreviewModeRuntime-BJolUbr1.mjs → SdkPreviewModeRuntime-h2ti3Hch.mjs} +688 -519
  6. package/dist/{SiteChromeCustomizeContext-CKgEpoxi.mjs → SiteChromeCustomizeContext-DEACFH9m.mjs} +3381 -2017
  7. package/dist/_dts/ai/src/contracts/proposals.d.ts +5643 -66
  8. package/dist/_dts/ai/src/contracts/siteStyleProposalSchemas.d.ts +513 -6
  9. package/dist/_dts/api/src/appointmentEndpointDefinitions.d.ts +49 -0
  10. package/dist/_dts/api/src/appointmentServiceCategoryEndpoints.d.ts +75 -0
  11. package/dist/_dts/api/src/appointmentServiceContracts.d.ts +80 -0
  12. package/dist/_dts/api/src/appointmentSetup.d.ts +8 -1
  13. package/dist/_dts/api/src/bookingConfig.d.ts +8 -1
  14. package/dist/_dts/api/src/bookingManagementEndpoints.d.ts +10 -26
  15. package/dist/_dts/api/src/bookingManagementEventEndpointTypes.d.ts +45 -1
  16. package/dist/_dts/api/src/clientErrorReporting.d.ts +50 -0
  17. package/dist/_dts/api/src/communications.d.ts +32 -24
  18. package/dist/_dts/api/src/contentRuntime.d.ts +3 -5
  19. package/dist/_dts/api/src/endpoints.d.ts +316 -134
  20. package/dist/_dts/api/src/event-visibility.d.ts +20 -0
  21. package/dist/_dts/api/src/eventManagementContracts.d.ts +56 -3
  22. package/dist/_dts/api/src/eventManagementEndpointDefinitions.d.ts +24 -0
  23. package/dist/_dts/api/src/eventPageWords.d.ts +19 -0
  24. package/dist/_dts/api/src/eventSeriesRegistrationEndpointDefinitions.d.ts +14 -0
  25. package/dist/_dts/api/src/index.d.ts +7 -1
  26. package/dist/_dts/api/src/indexCoreTypes.d.ts +1 -1
  27. package/dist/_dts/api/src/indexExtendedTypes.d.ts +1 -1
  28. package/dist/_dts/api/src/launchReadiness.d.ts +22 -2
  29. package/dist/_dts/api/src/launchRequirementPriority.d.ts +3 -0
  30. package/dist/_dts/api/src/newsletterCampaignCommandEndpoints.d.ts +13 -0
  31. package/dist/_dts/api/src/newsletterEndpointDefinitions.d.ts +30 -11
  32. package/dist/_dts/api/src/occurrenceScheduling.d.ts +10 -0
  33. package/dist/_dts/api/src/onboarding/confirmationResend.d.ts +3 -0
  34. package/dist/_dts/api/src/pageSurfaceEndpoints.d.ts +44 -0
  35. package/dist/_dts/api/src/participantMessaging.d.ts +11 -1
  36. package/dist/_dts/api/src/publicBookingService.d.ts +35 -1
  37. package/dist/_dts/api/src/publicExperience/newsletterEndpoints.d.ts +13 -0
  38. package/dist/_dts/api/src/publicNewsletterEndpointDefinitions.d.ts +58 -0
  39. package/dist/_dts/api/src/schemas/admin-observability-logs.d.ts +3 -3
  40. package/dist/_dts/api/src/sdk-event-upsert.d.ts +40 -1
  41. package/dist/_dts/api/src/sdkContracts.d.ts +3 -42
  42. package/dist/_dts/api/src/sdkCourseBooking.d.ts +30 -0
  43. package/dist/_dts/api/src/sdkEventEndpointDefinitions.d.ts +76 -0
  44. package/dist/_dts/api/src/sdkEventLifecycle.d.ts +37 -0
  45. package/dist/_dts/api/src/sdkManagedEventContracts.d.ts +18 -0
  46. package/dist/_dts/api/src/sdkPageDesign.d.ts +388 -0
  47. package/dist/_dts/api/src/sdkPageDesignEndpointDefinitions.d.ts +22 -0
  48. package/dist/_dts/api/src/sdkPullEventContracts.d.ts +46 -0
  49. package/dist/_dts/api/src/siteAddressEndpoints.d.ts +29 -0
  50. package/dist/_dts/api/src/siteManagementEndpointDefinitions.d.ts +49 -0
  51. package/dist/_dts/api/src/siteManagementEndpoints.d.ts +4 -38
  52. package/dist/_dts/api/src/siteOnboarding.d.ts +75 -9
  53. package/dist/_dts/api/src/sitePlatformEndpoints.d.ts +1 -1
  54. package/dist/_dts/api/src/types.d.ts +8 -1
  55. package/dist/_dts/api/src/wholeSeriesRuns.d.ts +14 -0
  56. package/dist/_dts/blocks/src/PageRenderer.d.ts +4 -4
  57. package/dist/_dts/blocks/src/bindings/index.d.ts +2 -2
  58. package/dist/_dts/blocks/src/contracts/proof-block-islands.d.ts +24 -0
  59. package/dist/_dts/blocks/src/index.d.ts +3 -1
  60. package/dist/_dts/blocks/src/pageRenderAdmission.d.ts +10 -0
  61. package/dist/_dts/blocks/src/pageRenderJoins.d.ts +68 -0
  62. package/dist/_dts/blocks/src/pageRenderPlan.d.ts +8 -27
  63. package/dist/_dts/blocks/src/pageRenderPreparation.d.ts +7 -4
  64. package/dist/_dts/blocks/src/pageRendererBoundaries.d.ts +40 -23
  65. package/dist/_dts/blocks/src/pageRendererContracts.d.ts +3 -1
  66. package/dist/_dts/blocks/src/server.d.ts +1 -1
  67. package/dist/_dts/blocks/src/system/blocks/appointment-services.d.ts +2 -0
  68. package/dist/_dts/blocks/src/system/blocks/events/eventSelectionFields.d.ts +2 -2
  69. package/dist/_dts/blocks/src/system/blocks/events/shared/calendarWindow.d.ts +1 -1
  70. package/dist/_dts/blocks/src/system/blocks/events/shared/schemas.d.ts +27 -5
  71. package/dist/_dts/blocks/src/system/blocks/events/shared/types.d.ts +14 -1
  72. package/dist/_dts/blocks/src/system/blocks/location-map.d.ts +2 -2
  73. package/dist/_dts/blocks/src/system/blocks/media-text.d.ts +47 -47
  74. package/dist/_dts/blocks/src/system/icons/social.d.ts +1 -1
  75. package/dist/_dts/blocks/src/system/manifest/schema.d.ts +29 -3
  76. package/dist/_dts/blocks/src/system/registry.d.ts +1 -1
  77. package/dist/_dts/blocks/src/system/runtime/hooks/useHeadlessBookingFlow.d.ts +8 -1
  78. package/dist/_dts/blocks/src/system/runtime/nodes/appointment-services.d.ts +22 -2
  79. package/dist/_dts/blocks/src/system/runtime/nodes/booking-form.headless.state.d.ts +3 -1
  80. package/dist/_dts/blocks/src/system/runtime/nodes/booking-form.interactive.d.ts +57 -2
  81. package/dist/_dts/blocks/src/system/runtime/nodes/booking-form.service-categories.d.ts +29 -0
  82. package/dist/_dts/blocks/src/system/runtime/nodes/booking-form.service-choices.d.ts +13 -0
  83. package/dist/_dts/blocks/src/system/runtime/nodes/booking-form.state.d.ts +3 -3
  84. package/dist/_dts/blocks/src/system/runtime/nodes/booking-runtime-sources.d.ts +13 -1
  85. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/eventSourceRecovery.d.ts +2 -1
  86. package/dist/_dts/blocks/src/system/runtime/nodes/events/shared/eventCollectionContract.d.ts +23 -7
  87. package/dist/_dts/blocks/src/system/runtime/nodes/form.fields.d.ts +5 -0
  88. package/dist/_dts/blocks/src/system/runtime/nodes/newsletter-form.block-submission.d.ts +36 -0
  89. package/dist/_dts/blocks/src/system/runtime/nodes/newsletter-form.client.d.ts +1 -1
  90. package/dist/_dts/blocks/src/system/runtime/nodes/newsletter-form.interactive.d.ts +6 -1
  91. package/dist/_dts/blocks/src/system/runtime/nodes/newsletter-form.parts.d.ts +46 -0
  92. package/dist/_dts/blocks/src/system/runtime/nodes/newsletter-form.submission.d.ts +20 -1
  93. package/dist/_dts/blocks/src/system/runtime/nodes/newsletter-form.types.d.ts +2 -1
  94. package/dist/_dts/blocks/src/system/runtime/resolver.d.ts +2 -1
  95. package/dist/_dts/blocks/src/system/runtime/shared/components/CheckboxChoice.d.ts +18 -0
  96. package/dist/_dts/blocks/src/system/runtime/shared/components/index.d.ts +1 -0
  97. package/dist/_dts/content-editor/src/index.d.ts +1 -0
  98. package/dist/_dts/content-editor/src/primitives/previewEditableOutline.d.ts +2 -0
  99. package/dist/_dts/content-editor/src/ui/editorBlockEquality.d.ts +3 -0
  100. package/dist/_dts/content-editor/src/ui/editorSnapshot.d.ts +3 -3
  101. package/dist/_dts/content-model/src/content-types/schema.d.ts +1 -1
  102. package/dist/_dts/core/src/appointment-service-categories.d.ts +108 -0
  103. package/dist/_dts/core/src/block-content-identity.d.ts +5 -0
  104. package/dist/_dts/core/src/editor-state.d.ts +2 -1
  105. package/dist/_dts/core/src/index.d.ts +2 -0
  106. package/dist/_dts/core/src/mailing-list-submission.d.ts +3 -1
  107. package/dist/_dts/core/src/public-event-booking-availability.d.ts +20 -1
  108. package/dist/_dts/core/src/public-profile.d.ts +12 -1
  109. package/dist/_dts/db/src/generated/supabase/database.types.d.ts +711 -242
  110. package/dist/_dts/editor-blocks/src/BlockEditor.d.ts +3 -0
  111. package/dist/_dts/editor-blocks/src/block-editor/EmptyState.d.ts +13 -1
  112. package/dist/_dts/editor-blocks/src/block-editor/types.d.ts +2 -2
  113. package/dist/_dts/editor-blocks/src/index.d.ts +1 -0
  114. package/dist/_dts/editor-blocks/src/widgets/site-option-picker/loaders.d.ts +16 -1
  115. package/dist/_dts/editor-blocks/src/widgets/site-option-picker/types.d.ts +13 -0
  116. package/dist/_dts/editor-blocks/src/widgets/site-option-picker/utils.d.ts +29 -0
  117. package/dist/_dts/preview-next/src/client/blocks/BoundaryControl.d.ts +7 -2
  118. package/dist/_dts/preview-next/src/client/blocks/composer/mergeDrafts.d.ts +1 -1
  119. package/dist/_dts/preview-next/src/client/blocks/composer/types.d.ts +3 -3
  120. package/dist/_dts/preview-next/src/client/blocks/previewProjection/applyPreviewProjections.d.ts +1 -3
  121. package/dist/_dts/preview-next/src/client/blocks/previewProjection/runtimeContentDecoration.d.ts +2 -2
  122. package/dist/_dts/preview-next/src/client/blocks/previewProjection/types.d.ts +2 -2
  123. package/dist/_dts/preview-next/src/client/preview/PreviewEntryControllerProvider.d.ts +1 -1
  124. package/dist/_dts/sdk/src/client/runtimeCacheKeys.d.ts +8 -0
  125. package/dist/_dts/sdk/src/client/types.d.ts +1 -1
  126. package/dist/_dts/sdk/src/contracts/index.d.ts +1 -1
  127. package/dist/_dts/sdk/src/contracts/page.d.ts +7 -2
  128. package/dist/_dts/sdk/src/contracts/system-block-content.d.ts +5 -0
  129. package/dist/_dts/sdk/src/manifest/passes/pass1-fields.d.ts +2 -2
  130. package/dist/_dts/sdk/src/next/renderSdkContent.d.ts +0 -1
  131. package/dist/_dts/sdk/src/public-api/contracts.d.ts +6 -8
  132. package/dist/_dts/sdk/src/rendering/blocks-page-renderer.d.ts +4 -4
  133. package/dist/_dts/sdk/src/rendering/components/pageShared.d.ts +4 -4
  134. package/dist/_dts/sdk/src/rendering/helpers/loadContent.d.ts +7 -2
  135. package/dist/_dts/sdk/src/rendering/helpers/loadPage.d.ts +5 -2
  136. package/dist/_dts/sdk/src/rendering/helpers/pageRuntimeSupport.d.ts +6 -1
  137. package/dist/_dts/sdk/src/rendering/helpers/templateContent.d.ts +2 -0
  138. package/dist/_dts/sdk/src/rendering/hooks/useContent.d.ts +6 -2
  139. package/dist/_dts/sdk/src/rendering/hooks/usePage.d.ts +5 -1
  140. package/dist/_dts/sdk/src/version.d.ts +1 -1
  141. package/dist/_dts/surfaces/src/index.d.ts +10 -0
  142. package/dist/_dts/theme-core/src/generated/containerResponsiveThemeCss.d.ts +1 -1
  143. package/dist/_dts/theme-core/src/inputs/checkable.d.ts +42 -0
  144. package/dist/_dts/theme-core/src/inputs/inputGroup.d.ts +19 -0
  145. package/dist/_dts/theme-core/src/layout/boundaryCss.d.ts +3 -0
  146. package/dist/_dts/theme-core/src/site-styles/compositionBudget.d.ts +8 -0
  147. package/dist/_dts/theme-core/src/site-styles/contentTemplateRuntimeCompiler.d.ts +3 -2
  148. package/dist/_dts/theme-core/src/site-styles/designState.d.ts +1 -3
  149. package/dist/_dts/theme-core/src/site-styles/generatedDesignPipeline.d.ts +3 -0
  150. package/dist/_dts/theme-core/src/site-styles/index.d.ts +3 -0
  151. package/dist/_dts/theme-core/src/site-styles/joinTreatment.d.ts +132 -0
  152. package/dist/_dts/theme-core/src/site-styles/pageDesignEditorBoundaries.d.ts +31 -0
  153. package/dist/_dts/theme-core/src/site-styles/pageDesignEditorModel.d.ts +33 -29
  154. package/dist/_dts/theme-core/src/site-styles/pageDesignIntent.d.ts +4 -4
  155. package/dist/_dts/theme-core/src/site-styles/pageFlowPresets.d.ts +36 -0
  156. package/dist/_dts/theme-core/src/site-styles/previewCompiler.d.ts +4 -10
  157. package/dist/_dts/theme-core/src/site-styles/rawStyleFields.d.ts +17 -4
  158. package/dist/_dts/theme-core/src/site-styles/runtimeCompiler.d.ts +20 -74
  159. package/dist/_dts/theme-core/src/site-styles/sectionBoundaryComposition.d.ts +95 -0
  160. package/dist/_dts/theme-core/src/site-styles/sectionTransitions.d.ts +80 -518
  161. package/dist/_dts/theme-core/src/site-styles/siteStyleBlockPolicies.d.ts +9 -4
  162. package/dist/_dts/theme-core/src/site-styles/transitionCatalogue.d.ts +320 -0
  163. package/dist/_dts/theme-core/src/site-styles/types.d.ts +3 -18
  164. package/dist/_dts/ui/src/navigation-tabs.d.ts +2 -1
  165. package/dist/client/{BookingConsentAgreement-DoAILrkN.mjs → BookingConsentAgreement-BQKL045f.mjs} +2 -2
  166. package/dist/client/CheckboxChoice--W2n6yKs.mjs +24 -0
  167. package/dist/client/{DiscountCodeDisclosure-X528hUTf.mjs → DiscountCodeDisclosure-CsOtjFY7.mjs} +1 -1
  168. package/dist/client/{EventCombined.client-DSBVwq5m.mjs → EventCombined.client-BdRjVbhH.mjs} +6 -6
  169. package/dist/client/{EventListing.client-DmFAX7Vb.mjs → EventListing.client-DBxC6xOU.mjs} +2 -2
  170. package/dist/client/{LeafletStaticMap-BAqXdfhq.mjs → LeafletStaticMap-mHEJKrTs.mjs} +1 -1
  171. package/dist/client/{ThemedButton-BwNFVwi4.mjs → ThemedButton-CE5KYT6z.mjs} +1 -1
  172. package/dist/client/{accordion-DRhMdkbd.mjs → accordion-BEQNSptH.mjs} +1 -1
  173. package/dist/client/{bookingForm-iJ_nCsNF.mjs → bookingForm-AMr-s5vw.mjs} +168 -95
  174. package/dist/client/bookings.mjs +239 -110
  175. package/dist/client/{carousel-D8zuffZr.mjs → carousel-Bbt_QgJy.mjs} +1 -1
  176. package/dist/client/{cart-DeMGJViN.mjs → cart-CnWi30zJ.mjs} +3 -3
  177. package/dist/client/{checkout-DXc06Km2.mjs → checkout-f3nkWgd4.mjs} +3 -3
  178. package/dist/client/client.mjs +3222 -1612
  179. package/dist/client/{context-CDLCfDep.mjs → context-Bc8T6pCe.mjs} +1 -1
  180. package/dist/client/{dates-ClFx7Epy.mjs → dates-DUsCEzLb.mjs} +2 -3
  181. package/dist/client/{eventCalendar-BaGpnOGN.mjs → eventCalendar-CKwgXui5.mjs} +9 -9
  182. package/dist/client/{eventCombined-ywONOx2m.mjs → eventCombined-CBAOSTGR.mjs} +4 -4
  183. package/dist/client/{eventDetails-B2LlOTYY.mjs → eventDetails-Dh-_WiBD.mjs} +4 -4
  184. package/dist/client/{eventListing-CMgxWpqP.mjs → eventListing-CA3frIH5.mjs} +4 -4
  185. package/dist/client/{eventRegistration-BarLDNHR.mjs → eventRegistration-BHtsgdcg.mjs} +21 -22
  186. package/dist/client/{form-BjqKaBJ7.mjs → form-C2h3YAcg.mjs} +135 -104
  187. package/dist/client/{headerSection-CP4XDwz1.mjs → headerSection-lwMuMTH9.mjs} +3 -3
  188. package/dist/client/hooks.mjs +1023 -148
  189. package/dist/client/{locationMap-C5gW-d-w.mjs → locationMap-DJ2bLODV.mjs} +3 -3
  190. package/dist/client/{newsletterForm-afXlVSA0.mjs → newsletterForm-8Pu5K32g.mjs} +225 -102
  191. package/dist/client/{pricing-Bl1CAl28.mjs → pricing-HHx3IgBz.mjs} +1 -1
  192. package/dist/client/{productDetail-CvQ3jWQe.mjs → productDetail-C_1odnAf.mjs} +3 -3
  193. package/dist/client/{productList-U874PGO7.mjs → productList-CtCv-Nmx.mjs} +3 -3
  194. package/dist/client/{propsDecoder-DPXtCZWP.mjs → propsDecoder-Dcgsncxb.mjs} +111 -55
  195. package/dist/client/rendering/client.mjs +1389 -722
  196. package/dist/client/rendering/islands.mjs +17 -17
  197. package/dist/client/rendering.mjs +3136 -1400
  198. package/dist/client/{routeIslandApiConfig-NGYiUWXu.mjs → routeIslandApiConfig-CWLP7wu3.mjs} +1 -1
  199. package/dist/client/{scrollToBlock-0-C3DVhK.mjs → scrollToBlock-BNgaEUpo.mjs} +1 -1
  200. package/dist/client/{shop-BXjXhM9P.mjs → shop-DQXrQ8kJ.mjs} +7 -7
  201. package/dist/client/{shop-commerce-BZ6UlWJ7.mjs → shop-commerce-B88zmWWo.mjs} +6 -6
  202. package/dist/client/{shop-commerce-store-DlSBXb3D.mjs → shop-commerce-store-DtSfkKuX.mjs} +1 -1
  203. package/dist/client/{shopShared-kkEOiLPA.mjs → shopShared-cuaONpkJ.mjs} +4 -4
  204. package/dist/client/{useEventFilters-zvnnE1ro.mjs → useEventFilters-Bukew6Gb.mjs} +6 -6
  205. package/dist/preview-next/before-render.mjs +500 -165
  206. package/dist/preview-next/client/runtime.mjs +4 -4
  207. package/dist/preview-next/editor-base.css +11 -0
  208. package/dist/preview-next/keepAlive.mjs +460 -165
  209. package/dist/preview-next/middleware.mjs +461 -165
  210. package/dist/{previewAuthStore-JA6-I_sL.mjs → previewAuthStore-h5IgbSp4.mjs} +485 -165
  211. package/dist/{sdk-runtime-DFJlQt3q.mjs → sdk-runtime-DTc1uIXn.mjs} +2 -2
  212. package/dist/{separator-o8GHb1xh.mjs → separator-BpHS1KZK.mjs} +1 -1
  213. package/dist/server/components.mjs +3088 -1307
  214. package/dist/server/config-validation.mjs +927 -109
  215. package/dist/server/config.mjs +927 -109
  216. package/dist/server/data.mjs +939 -110
  217. package/dist/server/index.mjs +513 -169
  218. package/dist/server/next.mjs +2874 -1195
  219. package/dist/server/page-converter.mjs +420 -79
  220. package/dist/server/prebuild.mjs +1 -1
  221. package/dist/server/rendering/server.mjs +3071 -1289
  222. package/dist/server/rendering.mjs +3169 -1350
  223. package/dist/server/routing.mjs +1085 -159
  224. package/dist/server/server.mjs +1042 -291
  225. package/dist/server/theme-bridge.mjs +1658 -137
  226. package/dist/server/theme.mjs +6 -4
  227. package/dist/styles/index.css +186 -65
  228. package/package.json +2 -1
@@ -43,6 +43,75 @@ function parsePublicProductCategorySelector(value) {
43
43
  };
44
44
  }
45
45
  //#endregion
46
+ //#region ../api/src/defineEndpointDefinitions.ts
47
+ /**
48
+ * Validates extracted endpoint descriptors while preserving each literal path,
49
+ * method, and parameter contract for the typed URL builders.
50
+ */
51
+ function defineEndpointDefinitions(definitions) {
52
+ return definitions;
53
+ }
54
+ //#endregion
55
+ //#region ../api/src/publicNewsletterEndpointDefinitions.ts
56
+ const PUBLIC_NEWSLETTER_ENDPOINT_DEFINITIONS = defineEndpointDefinitions({
57
+ subscribeNewsletter: {
58
+ path: "/public/sites/{siteId}/newsletter/subscribe",
59
+ method: "POST",
60
+ tags: ["public-newsletter-{siteId}"],
61
+ auth: "public",
62
+ responseKind: "json"
63
+ },
64
+ confirmNewsletter: {
65
+ path: "/public/sites/{siteId}/newsletter/confirm/{token}",
66
+ method: "GET",
67
+ tags: ["public-newsletter-{siteId}"],
68
+ auth: "public",
69
+ responseKind: "text"
70
+ },
71
+ unsubscribeNewsletter: {
72
+ path: "/public/sites/{siteId}/newsletter/unsubscribe/{token}",
73
+ method: "GET",
74
+ tags: ["public-newsletter-{siteId}"],
75
+ auth: "public",
76
+ responseKind: "text"
77
+ },
78
+ unsubscribeNewsletterPost: {
79
+ path: "/public/sites/{siteId}/newsletter/unsubscribe/{token}",
80
+ method: "POST",
81
+ tags: ["public-newsletter-{siteId}"],
82
+ auth: "public",
83
+ responseKind: "text"
84
+ },
85
+ confirmNewsletterPost: {
86
+ path: "/public/sites/{siteId}/newsletter/confirm/{token}",
87
+ method: "POST",
88
+ tags: ["public-newsletter-{siteId}"],
89
+ auth: "public",
90
+ responseKind: "text"
91
+ },
92
+ getNewsletterPreferences: {
93
+ path: "/public/sites/{siteId}/newsletter/preferences/{token}",
94
+ method: "GET",
95
+ tags: ["public-newsletter-{siteId}"],
96
+ auth: "public",
97
+ responseKind: "text"
98
+ },
99
+ saveNewsletterPreferences: {
100
+ path: "/public/sites/{siteId}/newsletter/preferences/{token}",
101
+ method: "POST",
102
+ tags: ["public-newsletter-{siteId}"],
103
+ auth: "public",
104
+ responseKind: "text"
105
+ },
106
+ getNewsletterArchive: {
107
+ path: "/public/sites/{siteId}/newsletter/archive/{token}",
108
+ method: "GET",
109
+ tags: ["public-newsletter-{siteId}"],
110
+ auth: "public",
111
+ responseKind: "text"
112
+ }
113
+ });
114
+ //#endregion
46
115
  //#region ../api/src/apiEndpointTypes.ts
47
116
  function allowedDemoMutationPolicy() {
48
117
  return {
@@ -134,17 +203,85 @@ const SDK_ENTRY_READ_ENDPOINTS = {
134
203
  }
135
204
  };
136
205
  //#endregion
137
- //#region ../api/src/defineEndpointDefinitions.ts
138
- /**
139
- * Validates extracted endpoint descriptors while preserving each literal path,
140
- * method, and parameter contract for the typed URL builders.
141
- */
142
- function defineEndpointDefinitions(definitions) {
143
- return definitions;
144
- }
145
- //#endregion
146
206
  //#region ../api/src/appointmentEndpointDefinitions.ts
147
207
  const APPOINTMENT_ENDPOINT_DEFINITIONS = defineEndpointDefinitions({
208
+ ...defineEndpointDefinitions({
209
+ listGroupedAppointmentServices: {
210
+ path: "/sites/{siteId}/bookings/services/grouped",
211
+ method: "GET",
212
+ auth: "user",
213
+ responseKind: "json",
214
+ errors: ["server:internal_error"]
215
+ },
216
+ reorderAppointmentServices: {
217
+ path: "/sites/{siteId}/bookings/services/order",
218
+ method: "PUT",
219
+ auth: "user",
220
+ responseKind: "json",
221
+ errors: [
222
+ "validation:invalid_input",
223
+ "auth:forbidden",
224
+ "resource:not_found",
225
+ "resource:conflict",
226
+ "server:internal_error"
227
+ ]
228
+ },
229
+ listAppointmentServiceCategories: {
230
+ path: "/sites/{siteId}/bookings/service-categories",
231
+ method: "GET",
232
+ auth: "user",
233
+ responseKind: "json",
234
+ errors: ["server:internal_error"]
235
+ },
236
+ createAppointmentServiceCategory: {
237
+ path: "/sites/{siteId}/bookings/service-categories",
238
+ method: "POST",
239
+ auth: "user",
240
+ responseKind: "json",
241
+ errors: [
242
+ "validation:invalid_input",
243
+ "auth:forbidden",
244
+ "resource:conflict",
245
+ "server:internal_error"
246
+ ]
247
+ },
248
+ updateAppointmentServiceCategory: {
249
+ path: "/sites/{siteId}/bookings/service-categories/{categoryId}",
250
+ method: "PUT",
251
+ auth: "user",
252
+ responseKind: "json",
253
+ errors: [
254
+ "validation:invalid_input",
255
+ "auth:forbidden",
256
+ "resource:not_found",
257
+ "resource:conflict",
258
+ "server:internal_error"
259
+ ]
260
+ },
261
+ deleteAppointmentServiceCategory: {
262
+ path: "/sites/{siteId}/bookings/service-categories/{categoryId}",
263
+ method: "DELETE",
264
+ auth: "user",
265
+ responseKind: "json",
266
+ errors: [
267
+ "auth:forbidden",
268
+ "resource:not_found",
269
+ "server:internal_error"
270
+ ]
271
+ },
272
+ reorderAppointmentServiceCategories: {
273
+ path: "/sites/{siteId}/bookings/service-categories/order",
274
+ method: "PUT",
275
+ auth: "user",
276
+ responseKind: "json",
277
+ errors: [
278
+ "validation:invalid_input",
279
+ "auth:forbidden",
280
+ "resource:conflict",
281
+ "server:internal_error"
282
+ ]
283
+ }
284
+ }),
148
285
  listAppointmentResources: {
149
286
  path: "/sites/{siteId}/bookings/resources",
150
287
  method: "GET",
@@ -855,6 +992,13 @@ const EVENT_SERIES_REGISTRATION_ENDPOINT_DEFINITIONS = defineEndpointDefinitions
855
992
  errors: [],
856
993
  responseKind: "blob"
857
994
  },
995
+ exportEventOfferingRegistrationsCsv: {
996
+ path: "/sites/{siteId}/bookings/event-offerings/{eventOfferingId}/registrations/export.csv",
997
+ method: "GET",
998
+ auth: "user",
999
+ errors: [],
1000
+ responseKind: "blob"
1001
+ },
858
1002
  updateEventSeriesRegistration: {
859
1003
  path: "/sites/{siteId}/bookings/event-series/{seriesId}/registrations/{registrationId}",
860
1004
  method: "PATCH",
@@ -865,6 +1009,19 @@ const EVENT_SERIES_REGISTRATION_ENDPOINT_DEFINITIONS = defineEndpointDefinitions
865
1009
  "resource:not_found",
866
1010
  "server:internal_error"
867
1011
  ]
1012
+ },
1013
+ saveEventSeriesRegistrationAnswers: {
1014
+ path: "/sites/{siteId}/bookings/event-series/{seriesId}/registrations/{registrationId}/answers",
1015
+ method: "PUT",
1016
+ auth: "user",
1017
+ responseKind: "json",
1018
+ errors: [
1019
+ "validation:invalid_input",
1020
+ "auth:forbidden",
1021
+ "resource:not_found",
1022
+ "resource:conflict",
1023
+ "server:internal_error"
1024
+ ]
868
1025
  }
869
1026
  });
870
1027
  //#endregion
@@ -1285,46 +1442,185 @@ const NEWSLETTER_ENDPOINT_DEFINITIONS = defineEndpointDefinitions({
1285
1442
  responseKind: "json",
1286
1443
  demoMutation: DEMO_MUTATION_BLOCKED_HIDDEN
1287
1444
  },
1288
- testSendNewsletterCampaign: {
1289
- path: "/sites/{siteId}/newsletter/campaigns/{campaignId}/test-send",
1445
+ scheduleNewsletterCampaign: {
1446
+ path: "/sites/{siteId}/newsletter/campaigns/{campaignId}/schedule",
1290
1447
  method: "POST",
1291
1448
  tags: [TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter],
1292
1449
  auth: "user",
1293
1450
  responseKind: "json",
1294
1451
  demoMutation: DEMO_MUTATION_BLOCKED_HIDDEN
1295
1452
  },
1296
- listNewsletterSendJobs: {
1297
- path: "/sites/{siteId}/newsletter/jobs",
1298
- method: "GET",
1453
+ unscheduleNewsletterCampaign: {
1454
+ path: "/sites/{siteId}/newsletter/campaigns/{campaignId}/unschedule",
1455
+ method: "POST",
1299
1456
  tags: [TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter],
1300
1457
  auth: "user",
1458
+ responseKind: "json",
1459
+ demoMutation: DEMO_MUTATION_BLOCKED_HIDDEN
1460
+ },
1461
+ stopNewsletterCampaign: {
1462
+ path: "/sites/{siteId}/newsletter/campaigns/{campaignId}/stop",
1463
+ method: "POST",
1464
+ tags: [TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter],
1465
+ auth: "user",
1466
+ responseKind: "json",
1467
+ demoMutation: DEMO_MUTATION_BLOCKED_HIDDEN
1468
+ },
1469
+ testSendNewsletterCampaign: {
1470
+ path: "/sites/{siteId}/newsletter/campaigns/{campaignId}/test-send",
1471
+ method: "POST",
1472
+ tags: [TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter],
1473
+ auth: "user",
1474
+ responseKind: "json",
1475
+ demoMutation: DEMO_MUTATION_BLOCKED_HIDDEN
1476
+ }
1477
+ });
1478
+ //#endregion
1479
+ //#region ../api/src/sdkEventEndpointDefinitions.ts
1480
+ /**
1481
+ * The SDK's Event graph: the Events themselves and the occurrences of one run.
1482
+ * Extracted from `endpoints.ts` so this family can be read, and added to, on
1483
+ * its own. New entries here must declare `errors`; the
1484
+ * require-api-endpoint-errors lint enforces that here as in endpoints.ts.
1485
+ */
1486
+ const SDK_EVENT_ENDPOINT_DEFINITIONS = defineEndpointDefinitions({
1487
+ sdkListEvents: {
1488
+ path: "/sdk/{siteId}/events",
1489
+ method: "GET",
1490
+ auth: "service",
1301
1491
  responseKind: "json"
1302
1492
  },
1303
- retryNewsletterSendJob: {
1304
- path: "/sites/{siteId}/newsletter/jobs/{jobId}/retry",
1493
+ sdkUpsertEvent: {
1494
+ path: "/sdk/{siteId}/events",
1305
1495
  method: "POST",
1496
+ auth: "service",
1497
+ responseKind: "json",
1306
1498
  errors: [
1307
1499
  "validation:invalid_input",
1308
1500
  "resource:not_found",
1309
- "auth:forbidden",
1501
+ "resource:conflict",
1502
+ "billing:plan_limit_exceeded",
1310
1503
  "server:internal_error"
1311
- ],
1312
- tags: [TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter],
1313
- auth: "user",
1504
+ ]
1505
+ },
1506
+ sdkGetEvent: {
1507
+ path: "/sdk/{siteId}/events/{identifier}",
1508
+ method: "GET",
1509
+ auth: "service",
1314
1510
  responseKind: "json"
1315
1511
  },
1316
- cancelNewsletterSendJob: {
1317
- path: "/sites/{siteId}/newsletter/jobs/{jobId}/cancel",
1512
+ sdkDeleteEvent: {
1513
+ path: "/sdk/{siteId}/events/{identifier}",
1514
+ method: "DELETE",
1515
+ auth: "service",
1516
+ responseKind: "json",
1517
+ errors: [
1518
+ "resource:not_found",
1519
+ "resource:conflict",
1520
+ "server:internal_error"
1521
+ ]
1522
+ },
1523
+ sdkTakeEventOffline: {
1524
+ path: "/sdk/{siteId}/events/{identifier}/lifecycle",
1318
1525
  method: "POST",
1526
+ auth: "service",
1527
+ responseKind: "json",
1319
1528
  errors: [
1529
+ "resource:not_found",
1320
1530
  "validation:invalid_input",
1531
+ "resource:conflict",
1532
+ "server:internal_error"
1533
+ ]
1534
+ },
1535
+ sdkListEventOccurrences: {
1536
+ path: "/sdk/{siteId}/events/{identifier}/runs/{runIdentifier}/occurrences",
1537
+ method: "GET",
1538
+ auth: "service",
1539
+ responseKind: "json",
1540
+ errors: [
1321
1541
  "resource:not_found",
1322
- "auth:forbidden",
1542
+ "validation:invalid_input",
1323
1543
  "server:internal_error"
1324
- ],
1325
- tags: [TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter],
1326
- auth: "user",
1327
- responseKind: "json"
1544
+ ]
1545
+ },
1546
+ sdkAddEventOccurrence: {
1547
+ path: "/sdk/{siteId}/events/{identifier}/runs/{runIdentifier}/occurrences",
1548
+ method: "POST",
1549
+ auth: "service",
1550
+ responseKind: "json",
1551
+ errors: [
1552
+ "resource:not_found",
1553
+ "validation:invalid_input",
1554
+ "resource:conflict",
1555
+ "server:internal_error"
1556
+ ]
1557
+ },
1558
+ sdkUpdateEventOccurrence: {
1559
+ path: "/sdk/{siteId}/events/{identifier}/runs/{runIdentifier}/occurrences/{occurrenceId}",
1560
+ method: "PATCH",
1561
+ auth: "service",
1562
+ responseKind: "json",
1563
+ errors: [
1564
+ "resource:not_found",
1565
+ "validation:invalid_input",
1566
+ "resource:conflict",
1567
+ "server:internal_error"
1568
+ ]
1569
+ },
1570
+ sdkCancelEventOccurrence: {
1571
+ path: "/sdk/{siteId}/events/{identifier}/runs/{runIdentifier}/occurrences/{occurrenceId}/cancel",
1572
+ method: "POST",
1573
+ auth: "service",
1574
+ responseKind: "json",
1575
+ errors: [
1576
+ "resource:not_found",
1577
+ "resource:conflict",
1578
+ "server:internal_error"
1579
+ ]
1580
+ },
1581
+ sdkDeleteEventOccurrence: {
1582
+ path: "/sdk/{siteId}/events/{identifier}/runs/{runIdentifier}/occurrences/{occurrenceId}",
1583
+ method: "DELETE",
1584
+ auth: "service",
1585
+ responseKind: "json",
1586
+ errors: [
1587
+ "resource:not_found",
1588
+ "resource:conflict",
1589
+ "server:internal_error"
1590
+ ]
1591
+ }
1592
+ });
1593
+ //#endregion
1594
+ //#region ../api/src/sdkPageDesignEndpointDefinitions.ts
1595
+ /**
1596
+ * SDK management endpoints for a page's draft design (issue 1497), spread into
1597
+ * `ENDPOINT_DEFINITIONS` like the other endpoint-definition modules. New
1598
+ * entries here must declare `errors`, which the require-api-endpoint-errors
1599
+ * lint enforces.
1600
+ */
1601
+ const SDK_PAGE_DESIGN_ENDPOINT_DEFINITIONS = defineEndpointDefinitions({
1602
+ sdkGetPageDesign: {
1603
+ path: "/sdk/{siteId}/pages/{identifier}/design",
1604
+ method: "GET",
1605
+ auth: "service",
1606
+ responseKind: "json",
1607
+ errors: [
1608
+ "resource:not_found",
1609
+ "validation:invalid_input",
1610
+ "server:internal_error"
1611
+ ]
1612
+ },
1613
+ sdkSavePageDesign: {
1614
+ path: "/sdk/{siteId}/pages/{identifier}/design",
1615
+ method: "POST",
1616
+ auth: "service",
1617
+ responseKind: "json",
1618
+ errors: [
1619
+ "resource:not_found",
1620
+ "validation:invalid_input",
1621
+ "resource:conflict",
1622
+ "server:internal_error"
1623
+ ]
1328
1624
  }
1329
1625
  });
1330
1626
  //#endregion
@@ -2225,15 +2521,6 @@ function parseMailingListContentVersionId(value) {
2225
2521
  const parsed = parseContentVersionId(value);
2226
2522
  return parsed.ok ? parsed.value : null;
2227
2523
  }
2228
- function buildMailingListSignupBlockSourceRef(blockId, contentVersionId) {
2229
- const parsedBlockId = parseMailingListBlockId(blockId);
2230
- const parsedContentVersionId = parseMailingListContentVersionId(contentVersionId);
2231
- return parsedBlockId !== null && parsedContentVersionId !== null ? {
2232
- tag: "block_ref",
2233
- blockId: parsedBlockId,
2234
- contentVersionId: parsedContentVersionId
2235
- } : null;
2236
- }
2237
2524
  //#endregion
2238
2525
  //#region ../core/src/secret.ts
2239
2526
  /**
@@ -2885,6 +3172,45 @@ const SITE_API_KEY_ENDPOINT_DEFINITIONS = defineEndpointDefinitions({
2885
3172
  }
2886
3173
  });
2887
3174
  //#endregion
3175
+ //#region ../api/src/siteManagementEndpointDefinitions.ts
3176
+ const SITE_MANAGEMENT_ENDPOINT_DEFINITIONS = defineEndpointDefinitions({
3177
+ createSite: {
3178
+ path: "/sites/manage",
3179
+ method: "POST",
3180
+ tags: ["site"],
3181
+ auth: "user",
3182
+ responseKind: "json"
3183
+ },
3184
+ updateSite: {
3185
+ path: "/sites/manage",
3186
+ method: "PUT",
3187
+ tags: ["site"],
3188
+ auth: "user",
3189
+ responseKind: "json"
3190
+ },
3191
+ changeSiteAddress: {
3192
+ path: "/sites/{siteId}/address",
3193
+ method: "PUT",
3194
+ auth: "user",
3195
+ responseKind: "json",
3196
+ demoMutation: DEMO_MUTATION_BLOCKED_DISABLED
3197
+ },
3198
+ getSiteAddressAvailability: {
3199
+ path: "/sites/{siteId}/address/availability",
3200
+ method: "GET",
3201
+ auth: "user",
3202
+ responseKind: "json"
3203
+ },
3204
+ deleteSite: {
3205
+ path: "/sites/{siteId}",
3206
+ method: "DELETE",
3207
+ tags: ["site", "site-{siteId}"],
3208
+ auth: "user",
3209
+ responseKind: "json",
3210
+ demoMutation: DEMO_MUTATION_BLOCKED_HIDDEN
3211
+ }
3212
+ });
3213
+ //#endregion
2888
3214
  //#region ../api/src/eventManagementEndpointDefinitions.ts
2889
3215
  const EVENT_MANAGEMENT_ENDPOINT_DEFINITIONS = defineEndpointDefinitions({
2890
3216
  listEvents: {
@@ -2932,6 +3258,28 @@ const EVENT_MANAGEMENT_ENDPOINT_DEFINITIONS = defineEndpointDefinitions({
2932
3258
  "server:internal_error"
2933
3259
  ]
2934
3260
  },
3261
+ /**
3262
+ * The web address of an event's own page. A course page belongs to the
3263
+ * event itself, so its address is written here rather than through a run.
3264
+ */
3265
+ updateEventAddress: {
3266
+ path: "/sites/{siteId}/bookings/events/{eventId}/address",
3267
+ method: "PATCH",
3268
+ tags: [
3269
+ "site-{siteId}",
3270
+ "event-series-{siteId}",
3271
+ TAG_TEMPLATES.siteRoutableContent,
3272
+ TAG_TEMPLATES.siteRedirects
3273
+ ],
3274
+ auth: "user",
3275
+ responseKind: "json",
3276
+ errors: [
3277
+ "validation:invalid_input",
3278
+ "resource:not_found",
3279
+ "resource:conflict",
3280
+ "server:internal_error"
3281
+ ]
3282
+ },
2935
3283
  createWholeSeriesRun: {
2936
3284
  path: "/sites/{siteId}/bookings/events/{eventId}/runs",
2937
3285
  method: "POST",
@@ -2958,6 +3306,20 @@ const EVENT_MANAGEMENT_ENDPOINT_DEFINITIONS = defineEndpointDefinitions({
2958
3306
  "server:internal_error"
2959
3307
  ]
2960
3308
  },
3309
+ updateCourseBookingSettings: {
3310
+ path: "/sites/{siteId}/bookings/events/{eventId}/booking-settings",
3311
+ method: "PATCH",
3312
+ tags: ["site-{siteId}", "event-series-{siteId}"],
3313
+ auth: "user",
3314
+ responseKind: "json",
3315
+ errors: [
3316
+ "validation:invalid_input",
3317
+ "auth:forbidden",
3318
+ "resource:not_found",
3319
+ "resource:conflict",
3320
+ "server:internal_error"
3321
+ ]
3322
+ },
2961
3323
  cancelWholeSeriesRun: {
2962
3324
  path: "/sites/{siteId}/bookings/events/{eventId}/runs/{runId}/cancellation",
2963
3325
  method: "POST",
@@ -2970,6 +3332,28 @@ const EVENT_MANAGEMENT_ENDPOINT_DEFINITIONS = defineEndpointDefinitions({
2970
3332
  "resource:conflict",
2971
3333
  "server:internal_error"
2972
3334
  ]
3335
+ },
3336
+ /**
3337
+ * The Content tab's one write: the short introduction, image and
3338
+ * description of an event's page, published without its layout.
3339
+ */
3340
+ saveEventPageWords: {
3341
+ path: "/sites/{siteId}/page-surfaces/{pageSurfaceId}/words",
3342
+ method: "PUT",
3343
+ tags: [
3344
+ TAG_TEMPLATES.siteCollection,
3345
+ TAG_TEMPLATES.siteRoutableContent,
3346
+ TAG_TEMPLATES.pageSurfaceById
3347
+ ],
3348
+ auth: "user",
3349
+ responseKind: "json",
3350
+ errors: [
3351
+ "auth:forbidden",
3352
+ "validation:invalid_input",
3353
+ "resource:not_found",
3354
+ "resource:conflict",
3355
+ "server:internal_error"
3356
+ ]
2973
3357
  }
2974
3358
  });
2975
3359
  //#endregion
@@ -3402,13 +3786,51 @@ const BILLING_ENDPOINT_DEFINITIONS = defineEndpointDefinitions({
3402
3786
  responseKind: "json"
3403
3787
  }
3404
3788
  });
3789
+ //#endregion
3790
+ //#region ../api/src/clientErrorReporting.ts
3791
+ const CLIENT_ERROR_REPORT_ENDPOINT_DEFINITIONS = defineEndpointDefinitions({ reportClientError: {
3792
+ path: "/client/error-report",
3793
+ method: "POST",
3794
+ auth: "user",
3795
+ errors: [],
3796
+ responseKind: "json"
3797
+ } });
3798
+ const CLIENT_ERROR_REPORT_LIMITS = {
3799
+ pathname: 1024,
3800
+ name: 120,
3801
+ message: 2e3,
3802
+ stack: 8e3,
3803
+ digest: 128,
3804
+ componentStack: 8e3,
3805
+ sourceLocation: 1024
3806
+ };
3807
+ const clientErrorEventSchema = z.enum([
3808
+ "dashboard:route-error",
3809
+ "dashboard:app-error",
3810
+ "client:error-boundary",
3811
+ "client:window-error",
3812
+ "client:unhandled-rejection"
3813
+ ]);
3814
+ z.object({
3815
+ event: clientErrorEventSchema,
3816
+ pathname: z.string().startsWith("/").max(CLIENT_ERROR_REPORT_LIMITS.pathname),
3817
+ name: z.string().max(CLIENT_ERROR_REPORT_LIMITS.name),
3818
+ message: z.string().max(CLIENT_ERROR_REPORT_LIMITS.message),
3819
+ stack: z.string().max(CLIENT_ERROR_REPORT_LIMITS.stack).nullable(),
3820
+ digest: z.string().max(CLIENT_ERROR_REPORT_LIMITS.digest).nullable(),
3821
+ componentStack: z.string().max(CLIENT_ERROR_REPORT_LIMITS.componentStack).nullable(),
3822
+ sourceLocation: z.string().max(CLIENT_ERROR_REPORT_LIMITS.sourceLocation).nullable()
3823
+ }).strict();
3405
3824
  const API_ENDPOINTS$1 = {
3825
+ ...CLIENT_ERROR_REPORT_ENDPOINT_DEFINITIONS,
3826
+ ...PUBLIC_NEWSLETTER_ENDPOINT_DEFINITIONS,
3406
3827
  ...ACCOUNT_ENDPOINT_DEFINITIONS,
3407
3828
  ...PUBLIC_ONBOARDING_ATTEMPT_ENDPOINT_DEFINITIONS,
3408
3829
  ...PUBLIC_EVENT_ENDPOINT_DEFINITIONS,
3409
3830
  ...GIFTING_ENDPOINT_DEFINITIONS,
3410
3831
  ...PUBLIC_READ_ENDPOINT_DEFINITIONS,
3411
3832
  ...BILLING_ENDPOINT_DEFINITIONS,
3833
+ ...SITE_MANAGEMENT_ENDPOINT_DEFINITIONS,
3412
3834
  aiContentUpdateChat: {
3413
3835
  path: "/ai/content-update-chat",
3414
3836
  method: "POST",
@@ -3935,13 +4357,6 @@ const API_ENDPOINTS$1 = {
3935
4357
  auth: "user",
3936
4358
  responseKind: "json"
3937
4359
  },
3938
- createSite: {
3939
- path: "/sites/manage",
3940
- method: "POST",
3941
- tags: ["site"],
3942
- auth: "user",
3943
- responseKind: "json"
3944
- },
3945
4360
  createSiteManual: {
3946
4361
  path: "/sites/manual",
3947
4362
  method: "POST",
@@ -3949,21 +4364,6 @@ const API_ENDPOINTS$1 = {
3949
4364
  auth: "user",
3950
4365
  responseKind: "json"
3951
4366
  },
3952
- updateSite: {
3953
- path: "/sites/manage",
3954
- method: "PUT",
3955
- tags: ["site"],
3956
- auth: "user",
3957
- responseKind: "json"
3958
- },
3959
- deleteSite: {
3960
- path: "/sites/{siteId}",
3961
- method: "DELETE",
3962
- tags: ["site", "site-{siteId}"],
3963
- auth: "user",
3964
- responseKind: "json",
3965
- demoMutation: DEMO_MUTATION_BLOCKED_HIDDEN
3966
- },
3967
4367
  listSiteMembers: {
3968
4368
  path: "/sites/{siteId}/members",
3969
4369
  method: "GET",
@@ -6537,41 +6937,6 @@ const API_ENDPOINTS$1 = {
6537
6937
  "server:internal_error"
6538
6938
  ]
6539
6939
  },
6540
- subscribeNewsletter: {
6541
- path: "/public/sites/{siteId}/newsletter/subscribe",
6542
- method: "POST",
6543
- tags: ["public-newsletter-{siteId}"],
6544
- auth: "public",
6545
- responseKind: "json"
6546
- },
6547
- confirmNewsletter: {
6548
- path: "/public/sites/{siteId}/newsletter/confirm/{token}",
6549
- method: "GET",
6550
- tags: ["public-newsletter-{siteId}"],
6551
- auth: "public",
6552
- responseKind: "text"
6553
- },
6554
- unsubscribeNewsletter: {
6555
- path: "/public/sites/{siteId}/newsletter/unsubscribe/{token}",
6556
- method: "GET",
6557
- tags: ["public-newsletter-{siteId}"],
6558
- auth: "public",
6559
- responseKind: "text"
6560
- },
6561
- unsubscribeNewsletterPost: {
6562
- path: "/public/sites/{siteId}/newsletter/unsubscribe/{token}",
6563
- method: "POST",
6564
- tags: ["public-newsletter-{siteId}"],
6565
- auth: "public",
6566
- responseKind: "text"
6567
- },
6568
- getNewsletterArchive: {
6569
- path: "/public/sites/{siteId}/newsletter/archive/{token}",
6570
- method: "GET",
6571
- tags: ["public-newsletter-{siteId}"],
6572
- auth: "public",
6573
- responseKind: "text"
6574
- },
6575
6940
  listSiteContentTypes: {
6576
6941
  path: "/sites/{siteId}/content-types",
6577
6942
  method: "GET",
@@ -8231,6 +8596,7 @@ const API_ENDPOINTS$1 = {
8231
8596
  auth: "service",
8232
8597
  responseKind: "json"
8233
8598
  },
8599
+ ...SDK_PAGE_DESIGN_ENDPOINT_DEFINITIONS,
8234
8600
  sdkUpsertPageBlock: {
8235
8601
  path: "/sdk/{siteId}/pages/{identifier}/blocks",
8236
8602
  method: "POST",
@@ -8353,87 +8719,7 @@ const API_ENDPOINTS$1 = {
8353
8719
  auth: "service",
8354
8720
  responseKind: "json"
8355
8721
  },
8356
- sdkListEvents: {
8357
- path: "/sdk/{siteId}/events",
8358
- method: "GET",
8359
- auth: "service",
8360
- responseKind: "json"
8361
- },
8362
- sdkUpsertEvent: {
8363
- path: "/sdk/{siteId}/events",
8364
- method: "POST",
8365
- auth: "service",
8366
- responseKind: "json"
8367
- },
8368
- sdkGetEvent: {
8369
- path: "/sdk/{siteId}/events/{identifier}",
8370
- method: "GET",
8371
- auth: "service",
8372
- responseKind: "json"
8373
- },
8374
- sdkDeleteEvent: {
8375
- path: "/sdk/{siteId}/events/{identifier}",
8376
- method: "DELETE",
8377
- auth: "service",
8378
- responseKind: "json"
8379
- },
8380
- sdkListEventOccurrences: {
8381
- path: "/sdk/{siteId}/events/{identifier}/runs/{runIdentifier}/occurrences",
8382
- method: "GET",
8383
- auth: "service",
8384
- responseKind: "json",
8385
- errors: [
8386
- "resource:not_found",
8387
- "validation:invalid_input",
8388
- "server:internal_error"
8389
- ]
8390
- },
8391
- sdkAddEventOccurrence: {
8392
- path: "/sdk/{siteId}/events/{identifier}/runs/{runIdentifier}/occurrences",
8393
- method: "POST",
8394
- auth: "service",
8395
- responseKind: "json",
8396
- errors: [
8397
- "resource:not_found",
8398
- "validation:invalid_input",
8399
- "resource:conflict",
8400
- "server:internal_error"
8401
- ]
8402
- },
8403
- sdkUpdateEventOccurrence: {
8404
- path: "/sdk/{siteId}/events/{identifier}/runs/{runIdentifier}/occurrences/{occurrenceId}",
8405
- method: "PATCH",
8406
- auth: "service",
8407
- responseKind: "json",
8408
- errors: [
8409
- "resource:not_found",
8410
- "validation:invalid_input",
8411
- "resource:conflict",
8412
- "server:internal_error"
8413
- ]
8414
- },
8415
- sdkCancelEventOccurrence: {
8416
- path: "/sdk/{siteId}/events/{identifier}/runs/{runIdentifier}/occurrences/{occurrenceId}/cancel",
8417
- method: "POST",
8418
- auth: "service",
8419
- responseKind: "json",
8420
- errors: [
8421
- "resource:not_found",
8422
- "resource:conflict",
8423
- "server:internal_error"
8424
- ]
8425
- },
8426
- sdkDeleteEventOccurrence: {
8427
- path: "/sdk/{siteId}/events/{identifier}/runs/{runIdentifier}/occurrences/{occurrenceId}",
8428
- method: "DELETE",
8429
- auth: "service",
8430
- responseKind: "json",
8431
- errors: [
8432
- "resource:not_found",
8433
- "resource:conflict",
8434
- "server:internal_error"
8435
- ]
8436
- },
8722
+ ...SDK_EVENT_ENDPOINT_DEFINITIONS,
8437
8723
  sdkUpsertEntry: {
8438
8724
  path: "/sdk/{siteId}/entries",
8439
8725
  method: "POST",
@@ -8927,6 +9213,46 @@ const API_ENDPOINTS$1 = {
8927
9213
  //#region ../surfaces/src/index.ts
8928
9214
  const SURFACE_IDS = ["core", "macadamia"];
8929
9215
  const DEFAULT_SURFACE_ID = "core";
9216
+ /**
9217
+ * Root hosts for each surface, keyed by deployment tier. The tier-keyed shape
9218
+ * makes it impossible to mis-order entries: callers like
9219
+ * `buildSurfaceAwareDashboardOriginForSurfaceId` look up by tier directly
9220
+ * rather than relying on positional alignment between arrays.
9221
+ */
9222
+ const SURFACE_ROOT_HOSTS = {
9223
+ core: {
9224
+ local: "localhost",
9225
+ prod: "riverbankcms.com"
9226
+ },
9227
+ macadamia: {
9228
+ local: "macadamia.localhost",
9229
+ prod: "macadamia.studio"
9230
+ }
9231
+ };
9232
+ const SURFACE_SITE_ROOT_HOSTS = {
9233
+ core: {
9234
+ local: "localhost",
9235
+ prod: "riverbanksites.com"
9236
+ },
9237
+ macadamia: {
9238
+ local: "macadamia.localhost",
9239
+ prod: "macadamia.studio"
9240
+ }
9241
+ };
9242
+ const SURFACE_SITE_ROOT_HOST_ALIASES = { core: { prod: ["preview.riverbanksites.com"] } };
9243
+ function surfaceHostTableValues(table) {
9244
+ return Object.values(table).flatMap((byTier) => Object.values(byTier).flat());
9245
+ }
9246
+ function siteSlugLabelUnderRoot(host, siteRootHost) {
9247
+ if (!host.endsWith(`.${siteRootHost}`)) return [];
9248
+ return host.slice(0, host.length - siteRootHost.length - 1).split(".").slice(-1);
9249
+ }
9250
+ function deriveSurfaceOwnedSiteSlugs() {
9251
+ const siteRootHosts = [...surfaceHostTableValues(SURFACE_SITE_ROOT_HOSTS), ...surfaceHostTableValues(SURFACE_SITE_ROOT_HOST_ALIASES)];
9252
+ const labels = [...surfaceHostTableValues(SURFACE_ROOT_HOSTS), ...siteRootHosts].flatMap((host) => siteRootHosts.flatMap((root) => siteSlugLabelUnderRoot(host, root)));
9253
+ return [...new Set(labels)].sort();
9254
+ }
9255
+ deriveSurfaceOwnedSiteSlugs();
8930
9256
  [...SURFACE_IDS.filter((surfaceId) => surfaceId !== DEFAULT_SURFACE_ID)];
8931
9257
  //#endregion
8932
9258
  //#region ../api/src/url.ts
@@ -9539,7 +9865,7 @@ var SimpleCache = class {
9539
9865
  * 1. This constant
9540
9866
  * 2. The "version" field in package.json
9541
9867
  */
9542
- const SDK_VERSION = "0.144.0";
9868
+ const SDK_VERSION = "0.146.0";
9543
9869
  //#endregion
9544
9870
  //#region src/client/error.ts
9545
9871
  let _Symbol$for;
@@ -15055,6 +15381,15 @@ function asSiteStyleId(value) {
15055
15381
  function asDesignSystemTemplateId(value) {
15056
15382
  return brandNonEmptyString(value, "DesignSystemTemplateId");
15057
15383
  }
15384
+ function toNonEmptyReadonlyArray(values) {
15385
+ const [first, ...rest] = values;
15386
+ return first === void 0 ? null : [first, ...rest];
15387
+ }
15388
+ function requireNonEmptyReadonlyArray(values, message = "Expected a non-empty array.") {
15389
+ const result = toNonEmptyReadonlyArray(values);
15390
+ if (!result) throw new Error(message);
15391
+ return result;
15392
+ }
15058
15393
  function makeBoundaryId(previousBlockId, nextBlockId) {
15059
15394
  return asDesignBoundaryId(`boundary:${encodeURIComponent(previousBlockId)}:${encodeURIComponent(nextBlockId)}`);
15060
15395
  }
@@ -15257,16 +15592,18 @@ const themeV2RuntimeStyleFieldNames = [
15257
15592
  "_frameStyles",
15258
15593
  "_sectionStyles",
15259
15594
  "_containerStyles",
15260
- "_cardStyles",
15261
- "_transitionStyles",
15262
- "styleGroup"
15595
+ "_cardStyles"
15263
15596
  ];
15264
15597
  const themeV2BlockSpecificRawStyleFieldNames = [
15265
15598
  "_contentCardStyles",
15266
15599
  "_heroLayoutStyles",
15267
15600
  "_textCardStyles"
15268
15601
  ];
15269
- const themeV2NormalEditorRawStyleFieldNames = [...themeV2RuntimeStyleFieldNames, ...themeV2BlockSpecificRawStyleFieldNames];
15602
+ const themeV2NormalEditorRawStyleFieldNames = [
15603
+ ...themeV2RuntimeStyleFieldNames,
15604
+ ...themeV2BlockSpecificRawStyleFieldNames,
15605
+ "styleGroup"
15606
+ ];
15270
15607
  new Set(themeV2NormalEditorRawStyleFieldNames);
15271
15608
  [...themeV2RuntimeStyleFieldNames, ...themeV2BlockSpecificRawStyleFieldNames];
15272
15609
  const pageDesignEditorBackgroundOverrideOwner = "page-design-editor";
@@ -16547,7 +16884,8 @@ const siteOptionSources = [
16547
16884
  "eventCategories",
16548
16885
  "eventSeries",
16549
16886
  "venues",
16550
- "staffMembers"
16887
+ "staffMembers",
16888
+ "appointmentServiceCategories"
16551
16889
  ];
16552
16890
  const mediaDeliverySchema = z.object({
16553
16891
  sizes: z.string().optional(),
@@ -19922,11 +20260,260 @@ function cardRoleFromLegacyVocabulary(value) {
19922
20260
  */
19923
20261
  const cardRoleWithLegacyAliasSchema = z.preprocess((value) => cardRoleFromLegacyVocabulary(value) ?? value, cardRoleSchema);
19924
20262
  //#endregion
19925
- //#region ../theme-core/src/site-styles/compilationPlan.ts
19926
- const defaultHeaderBrandPreferences = {
19927
- brandDisplay: "auto",
19928
- logoSize: "auto"
19929
- };
20263
+ //#region ../theme-core/src/site-styles/transitionCatalogue.ts
20264
+ /**
20265
+ * Family order for pickers. Entries below are listed family by family in this
20266
+ * same order, so the flat option list and the grouped families agree.
20267
+ */
20268
+ const transitionCatalogueFamilies = [
20269
+ {
20270
+ id: "gradient",
20271
+ label: "Gradient"
20272
+ },
20273
+ {
20274
+ id: "wave",
20275
+ label: "Wave"
20276
+ },
20277
+ {
20278
+ id: "angle",
20279
+ label: "Angle"
20280
+ }
20281
+ ];
20282
+ const mediumHeight = "6rem + 2px";
20283
+ const compactHeight = "4.5rem + 2px";
20284
+ const largeHeight = "7rem + 2px";
20285
+ /**
20286
+ * The single source of transition vocabulary. Order is significant: it is the
20287
+ * order of `boundaryOptions` (after `none`) and of each family's variants,
20288
+ * which persisted pins, page-flow presets and the editor picker all rely on.
20289
+ *
20290
+ * Shapes match what `generateLayoutCss` draws today. Structured
20291
+ * amplitude/frequency treatments (issue 826) extend this list later.
20292
+ */
20293
+ const transitionCatalogueEntries = defineExactCatalog()([
20294
+ {
20295
+ intent: "soft-fade-short",
20296
+ optionId: asBoundaryOptionId("break:soft"),
20297
+ family: "gradient",
20298
+ variantId: "soft",
20299
+ label: "Soft",
20300
+ variantLabel: "Soft",
20301
+ treatment: {
20302
+ kind: "soft-fade",
20303
+ height: "medium",
20304
+ curve: "soft"
20305
+ },
20306
+ size: "medium",
20307
+ heightExpression: mediumHeight,
20308
+ shape: { kind: "fade" }
20309
+ },
20310
+ {
20311
+ intent: "soft-fade-long",
20312
+ optionId: asBoundaryOptionId("break:spacious"),
20313
+ family: "gradient",
20314
+ variantId: "spacious",
20315
+ label: "Spacious",
20316
+ variantLabel: "Spacious",
20317
+ treatment: {
20318
+ kind: "soft-fade",
20319
+ height: "large",
20320
+ curve: "spacious"
20321
+ },
20322
+ size: "spacious",
20323
+ heightExpression: "10rem",
20324
+ shape: { kind: "fade" }
20325
+ },
20326
+ {
20327
+ intent: "soft-fade-expansive",
20328
+ optionId: asBoundaryOptionId("break:expansive"),
20329
+ family: "gradient",
20330
+ variantId: "expansive",
20331
+ label: "Expansive",
20332
+ variantLabel: "Expansive",
20333
+ treatment: {
20334
+ kind: "soft-fade",
20335
+ height: "expansive",
20336
+ curve: "expansive"
20337
+ },
20338
+ size: "expansive",
20339
+ heightExpression: "14rem",
20340
+ shape: { kind: "fade" }
20341
+ },
20342
+ {
20343
+ intent: "wave-edge-balanced",
20344
+ optionId: asBoundaryOptionId("break:wave-balanced"),
20345
+ family: "wave",
20346
+ variantId: "balanced",
20347
+ label: "Balanced wave",
20348
+ variantLabel: "Balanced",
20349
+ treatment: {
20350
+ kind: "wave-edge",
20351
+ height: "medium",
20352
+ amplitude: "balanced",
20353
+ rhythm: "double",
20354
+ symmetry: "symmetrical"
20355
+ },
20356
+ size: "medium",
20357
+ heightExpression: mediumHeight,
20358
+ shape: {
20359
+ kind: "wave",
20360
+ mask: "balanced"
20361
+ }
20362
+ },
20363
+ {
20364
+ intent: "wave-edge",
20365
+ optionId: asBoundaryOptionId("break:wave"),
20366
+ family: "wave",
20367
+ variantId: "classic",
20368
+ label: "Classic wave",
20369
+ variantLabel: "Classic",
20370
+ treatment: {
20371
+ kind: "wave-edge",
20372
+ height: "medium",
20373
+ amplitude: "balanced",
20374
+ rhythm: "double",
20375
+ symmetry: "asymmetrical"
20376
+ },
20377
+ size: "medium",
20378
+ heightExpression: mediumHeight,
20379
+ shape: {
20380
+ kind: "wave",
20381
+ mask: "classic"
20382
+ }
20383
+ },
20384
+ {
20385
+ intent: "wave-edge-gentle",
20386
+ optionId: asBoundaryOptionId("break:wave-gentle"),
20387
+ family: "wave",
20388
+ variantId: "gentle",
20389
+ label: "Gentle wave",
20390
+ variantLabel: "Gentle",
20391
+ treatment: {
20392
+ kind: "wave-edge",
20393
+ height: "compact",
20394
+ amplitude: "subtle",
20395
+ rhythm: "single",
20396
+ symmetry: "symmetrical"
20397
+ },
20398
+ size: "compact",
20399
+ heightExpression: compactHeight,
20400
+ shape: {
20401
+ kind: "wave",
20402
+ mask: "gentle"
20403
+ }
20404
+ },
20405
+ {
20406
+ intent: "wave-edge-bold",
20407
+ optionId: asBoundaryOptionId("break:wave-bold"),
20408
+ family: "wave",
20409
+ variantId: "bold",
20410
+ label: "Bold wave",
20411
+ variantLabel: "Bold",
20412
+ treatment: {
20413
+ kind: "wave-edge",
20414
+ height: "large",
20415
+ amplitude: "bold",
20416
+ rhythm: "double",
20417
+ symmetry: "symmetrical"
20418
+ },
20419
+ size: "large",
20420
+ heightExpression: largeHeight,
20421
+ shape: {
20422
+ kind: "wave",
20423
+ mask: "bold"
20424
+ }
20425
+ },
20426
+ {
20427
+ intent: "wave-edge-drift",
20428
+ optionId: asBoundaryOptionId("break:wave-drift"),
20429
+ family: "wave",
20430
+ variantId: "drift",
20431
+ label: "Drift wave",
20432
+ variantLabel: "Drift",
20433
+ treatment: {
20434
+ kind: "wave-edge",
20435
+ height: "medium",
20436
+ amplitude: "balanced",
20437
+ rhythm: "double",
20438
+ symmetry: "drift"
20439
+ },
20440
+ size: "medium",
20441
+ heightExpression: mediumHeight,
20442
+ shape: {
20443
+ kind: "wave",
20444
+ mask: "drift"
20445
+ }
20446
+ },
20447
+ {
20448
+ intent: "angle-edge-subtle",
20449
+ optionId: asBoundaryOptionId("break:angle-subtle"),
20450
+ family: "angle",
20451
+ variantId: "subtle",
20452
+ label: "Subtle angle",
20453
+ variantLabel: "Subtle",
20454
+ treatment: {
20455
+ kind: "angle-edge",
20456
+ height: "compact",
20457
+ slope: "subtle",
20458
+ direction: "forward"
20459
+ },
20460
+ size: "compact",
20461
+ heightExpression: compactHeight,
20462
+ shape: {
20463
+ kind: "angle",
20464
+ polygon: {
20465
+ startTopPercent: 34,
20466
+ endTopPercent: 18
20467
+ }
20468
+ }
20469
+ },
20470
+ {
20471
+ intent: "angle-edge",
20472
+ optionId: asBoundaryOptionId("break:angle-balanced"),
20473
+ family: "angle",
20474
+ variantId: "balanced",
20475
+ label: "Balanced angle",
20476
+ variantLabel: "Balanced",
20477
+ treatment: {
20478
+ kind: "angle-edge",
20479
+ height: "medium",
20480
+ slope: "balanced",
20481
+ direction: "forward"
20482
+ },
20483
+ size: "medium",
20484
+ heightExpression: mediumHeight,
20485
+ shape: {
20486
+ kind: "angle",
20487
+ polygon: {
20488
+ startTopPercent: 42,
20489
+ endTopPercent: 8
20490
+ }
20491
+ }
20492
+ },
20493
+ {
20494
+ intent: "angle-edge-steep",
20495
+ optionId: asBoundaryOptionId("break:angle-steep"),
20496
+ family: "angle",
20497
+ variantId: "steep",
20498
+ label: "Steep angle",
20499
+ variantLabel: "Steep",
20500
+ treatment: {
20501
+ kind: "angle-edge",
20502
+ height: "large",
20503
+ slope: "steep",
20504
+ direction: "forward"
20505
+ },
20506
+ size: "large",
20507
+ heightExpression: largeHeight,
20508
+ shape: {
20509
+ kind: "angle",
20510
+ polygon: {
20511
+ startTopPercent: 54,
20512
+ endTopPercent: 0
20513
+ }
20514
+ }
20515
+ }
20516
+ ]);
19930
20517
  //#endregion
19931
20518
  //#region ../theme-core/src/site-styles/sectionTransitions.ts
19932
20519
  function boundaryRuntimeMetrics(family, size, heightExpression) {
@@ -19937,42 +20524,106 @@ function boundaryRuntimeMetrics(family, size, heightExpression) {
19937
20524
  reserveCss: `calc((${heightExpression}) / 2)`
19938
20525
  };
19939
20526
  }
19940
- boundaryRuntimeMetrics("gradient", "medium", "6rem + 2px"), boundaryRuntimeMetrics("gradient", "spacious", "10rem"), boundaryRuntimeMetrics("gradient", "expansive", "14rem"), boundaryRuntimeMetrics("wave", "medium", "6rem + 2px"), boundaryRuntimeMetrics("wave", "medium", "6rem + 2px"), boundaryRuntimeMetrics("wave", "compact", "4.5rem + 2px"), boundaryRuntimeMetrics("wave", "large", "7rem + 2px"), boundaryRuntimeMetrics("wave", "medium", "6rem + 2px"), boundaryRuntimeMetrics("angle", "medium", "6rem + 2px"), boundaryRuntimeMetrics("angle", "compact", "4.5rem + 2px"), boundaryRuntimeMetrics("angle", "large", "7rem + 2px");
20527
+ new Map(transitionCatalogueEntries.map((entry) => [entry.intent, entry]));
20528
+ new Map(transitionCatalogueEntries.map((entry) => [entry.intent, boundaryRuntimeMetrics(entry.family, entry.size, entry.heightExpression)]));
20529
+ /**
20530
+ * The catalogue's compile-time coverage check guarantees an entry per
20531
+ * decorative intent, so a miss here is a broken invariant, not bad input.
20532
+ */
20533
+ function requireCatalogueValue(values, intent) {
20534
+ const value = values.get(intent);
20535
+ if (value === void 0) throw new Error(`Transition catalogue has no entry for ${intent}`);
20536
+ return value;
20537
+ }
19941
20538
  const noneBoundaryOption = {
19942
20539
  id: asBoundaryOptionId("break:none"),
19943
20540
  label: "None",
19944
20541
  transitionAfter: "none",
19945
20542
  treatment: { kind: "none" }
19946
20543
  };
19947
- const softBoundaryOption = {
19948
- id: asBoundaryOptionId("break:soft"),
19949
- label: "Soft",
19950
- transitionAfter: "soft-fade-short",
19951
- treatment: {
19952
- kind: "soft-fade",
19953
- height: "medium",
19954
- curve: "soft"
19955
- }
20544
+ const boundaryOptionByIntent = new Map(transitionCatalogueEntries.map((entry) => [entry.intent, {
20545
+ id: entry.optionId,
20546
+ label: entry.label,
20547
+ transitionAfter: entry.intent,
20548
+ treatment: entry.treatment
20549
+ }]));
20550
+ function boundaryOptionForTransitionIntent(intent) {
20551
+ return requireCatalogueValue(boundaryOptionByIntent, intent);
20552
+ }
20553
+ const softBoundaryOption = boundaryOptionForTransitionIntent("soft-fade-short");
20554
+ const spaciousBoundaryOption = boundaryOptionForTransitionIntent("soft-fade-long");
20555
+ boundaryOptionForTransitionIntent("soft-fade-expansive");
20556
+ boundaryOptionForTransitionIntent("wave-edge");
20557
+ boundaryOptionForTransitionIntent("wave-edge-balanced");
20558
+ boundaryOptionForTransitionIntent("wave-edge-gentle");
20559
+ boundaryOptionForTransitionIntent("wave-edge-bold");
20560
+ boundaryOptionForTransitionIntent("wave-edge-drift");
20561
+ boundaryOptionForTransitionIntent("angle-edge-subtle");
20562
+ boundaryOptionForTransitionIntent("angle-edge");
20563
+ boundaryOptionForTransitionIntent("angle-edge-steep");
20564
+ /**
20565
+ * Must remain non-empty; downstream code indexes `[0]` as the documented default.
20566
+ */
20567
+ const boundaryOptions = [noneBoundaryOption, ...transitionCatalogueEntries.map((entry) => boundaryOptionForTransitionIntent(entry.intent))];
20568
+ const noneTransitionVariant = {
20569
+ familyId: "none",
20570
+ variantId: "none",
20571
+ label: "None",
20572
+ boundaryOption: noneBoundaryOption
19956
20573
  };
19957
- const spaciousBoundaryOption = {
19958
- id: asBoundaryOptionId("break:spacious"),
19959
- label: "Spacious",
19960
- transitionAfter: "soft-fade-long",
19961
- treatment: {
19962
- kind: "soft-fade",
19963
- height: "large",
19964
- curve: "spacious"
19965
- }
20574
+ function transitionVariantForEntry(entry) {
20575
+ return {
20576
+ familyId: entry.family,
20577
+ variantId: entry.variantId,
20578
+ label: entry.variantLabel,
20579
+ boundaryOption: boundaryOptionForTransitionIntent(entry.intent)
20580
+ };
20581
+ }
20582
+ const sectionTransitionFamilies = [{
20583
+ id: "none",
20584
+ label: "None",
20585
+ variants: [noneTransitionVariant]
20586
+ }, ...transitionCatalogueFamilies.map((family) => ({
20587
+ id: family.id,
20588
+ label: family.label,
20589
+ variants: requireNonEmptyReadonlyArray(transitionCatalogueEntries.filter((entry) => entry.family === family.id).map(transitionVariantForEntry), `Transition family ${family.id} has no catalogue entries.`)
20590
+ }))];
20591
+ new Map(boundaryOptions.map((option) => [option.id, option]));
20592
+ new Map(boundaryOptions.map((option) => [stableTreatmentKey(option.treatment), option]));
20593
+ new Map(sectionTransitionFamilies.flatMap((family) => family.variants.map((variant) => [variant.boundaryOption.id, variant])));
20594
+ new Map(sectionTransitionFamilies.map((family) => [family.id, family]));
20595
+ function stableTreatmentKey(treatment) {
20596
+ switch (treatment.kind) {
20597
+ case "none": return "none";
20598
+ case "soft-fade": return `${treatment.kind}:${treatment.height}:${treatment.curve}`;
20599
+ case "wave-edge": return [
20600
+ treatment.kind,
20601
+ treatment.height,
20602
+ treatment.amplitude,
20603
+ treatment.rhythm,
20604
+ treatment.symmetry
20605
+ ].join(":");
20606
+ case "angle-edge": return [
20607
+ treatment.kind,
20608
+ treatment.height,
20609
+ treatment.slope,
20610
+ treatment.direction
20611
+ ].join(":");
20612
+ case "legacy-unsupported": return `${treatment.kind}:${treatment.boundaryOptionId}`;
20613
+ }
20614
+ }
20615
+ requireThemeColorToken$1("background");
20616
+ function requireThemeColorToken$1(value) {
20617
+ const token = parseThemeColorToken(value);
20618
+ if (!token) throw new Error(`Expected a theme color token. Received: ${value}`);
20619
+ return token;
20620
+ }
20621
+ //#endregion
20622
+ //#region ../theme-core/src/site-styles/compilationPlan.ts
20623
+ const defaultHeaderBrandPreferences = {
20624
+ brandDisplay: "auto",
20625
+ logoSize: "auto"
19966
20626
  };
19967
- asBoundaryOptionId("break:expansive");
19968
- asBoundaryOptionId("break:wave");
19969
- asBoundaryOptionId("break:wave-balanced");
19970
- asBoundaryOptionId("break:wave-gentle");
19971
- asBoundaryOptionId("break:wave-bold");
19972
- asBoundaryOptionId("break:wave-drift");
19973
- asBoundaryOptionId("break:angle-subtle");
19974
- asBoundaryOptionId("break:angle-balanced");
19975
- asBoundaryOptionId("break:angle-steep");
19976
20627
  asBoundaryOptionId("break:unknown");
19977
20628
  const pageDesignUserPinnedAppearanceChoiceSchema = z.object({
19978
20629
  kind: z.literal("user-pinned"),
@@ -20099,14 +20750,11 @@ function validateUniquePageDesignPins(intent, ctx) {
20099
20750
  label: "block Look pin"
20100
20751
  });
20101
20752
  addDuplicateStringIssues(ctx, {
20102
- values: intent.boundaryPins.map((pin) => boundaryKey(pin.previousBlockId, pin.nextBlockId)),
20753
+ values: intent.boundaryPins.map((pin) => makeBoundaryId(pin.previousBlockId, pin.nextBlockId)),
20103
20754
  path: ["boundaryPins"],
20104
20755
  label: "boundary pin"
20105
20756
  });
20106
20757
  }
20107
- function boundaryKey(previousBlockId, nextBlockId) {
20108
- return makeBoundaryId(previousBlockId, nextBlockId);
20109
- }
20110
20758
  //#endregion
20111
20759
  //#region ../theme-core/src/site-styles/styleTags.ts
20112
20760
  /**
@@ -23062,6 +23710,13 @@ z.object({
23062
23710
  fields: nonEmptyRuntimeStyleFieldNamesSchema,
23063
23711
  authority: styleAuthoritySchema
23064
23712
  }).strict();
23713
+ asPageFlowPresetId("flow:quiet"), noneBoundaryOption.id, asPageFlowPresetId("flow:balanced"), softBoundaryOption.id, asPageFlowPresetId("flow:expressive"), spaciousBoundaryOption.id;
23714
+ asPageFlowPresetId("generated-default");
23715
+ asSiteStyleId("site-style:south-west-twerk-school");
23716
+ asAppearancePresetId("hero-brand-scrim-fixed-frame");
23717
+ asLayoutVariantKey("classic");
23718
+ asLayoutVariantKey("micro");
23719
+ asBoundaryOptionId("break:wave");
23065
23720
  //#endregion
23066
23721
  //#region ../theme-core/src/site-styles/runtimeCompiler.ts
23067
23722
  function defineSectionForegroundRuntimeTokens(input) {
@@ -23085,7 +23740,7 @@ function defineComponentRuntimeRules(rules) {
23085
23740
  }
23086
23741
  /**
23087
23742
  * Default design rules translate semantic page-level choices into the current
23088
- * runtime's section background and transition style-group vocabulary.
23743
+ * runtime's section background vocabulary.
23089
23744
  */
23090
23745
  const defaultDesignRuntimeRules = defineDesignRuntimeRules({
23091
23746
  sectionSurfaces: {
@@ -23120,8 +23775,7 @@ const defaultDesignRuntimeRules = defineDesignRuntimeRules({
23120
23775
  color: "surface",
23121
23776
  opacity: .88
23122
23777
  }
23123
- },
23124
- transitionClassName: (transition, fromSurface, toSurface) => transition === "none" ? null : `site-style-transition-${transition}-from-${fromSurface}-to-${toSurface}`
23778
+ }
23125
23779
  });
23126
23780
  /**
23127
23781
  * Default component rules translate frame and item-surface semantics into the
@@ -24856,19 +25510,11 @@ const curatedSiteStyles = [
24856
25510
  })
24857
25511
  ];
24858
25512
  new Map(curatedSiteStyles.map((style) => [style.id, style]));
24859
- asPageFlowPresetId("generated-default");
24860
- asSiteStyleId("site-style:south-west-twerk-school");
24861
- asAppearancePresetId("hero-brand-scrim-fixed-frame");
24862
- asLayoutVariantKey("classic");
24863
- asLayoutVariantKey("micro");
24864
- asBoundaryOptionId("break:wave");
24865
- asPageFlowPresetId("flow:quiet"), noneBoundaryOption.id, asPageFlowPresetId("flow:balanced"), softBoundaryOption.id, asPageFlowPresetId("flow:expressive"), spaciousBoundaryOption.id;
24866
25513
  //#endregion
24867
25514
  //#region ../theme-core/src/site-styles/resolver.ts
24868
25515
  const blockDesignFallback = {
24869
25516
  sectionSurface: "base",
24870
25517
  contentFrame: plainFrame,
24871
- transitionAfter: "none",
24872
25518
  sectionHeight: "default",
24873
25519
  heroLegibility: "none",
24874
25520
  imageSurfaceTreatment: { kind: "none" },
@@ -24879,7 +25525,7 @@ const blockDesignFallback = {
24879
25525
  accordionIconTreatment: null,
24880
25526
  composition: null
24881
25527
  };
24882
- blockDesignFallback.sectionSurface, blockDesignFallback.contentFrame, blockDesignFallback.transitionAfter, blockDesignFallback.sectionHeight, blockDesignFallback.heroLegibility, blockDesignFallback.imageSurfaceTreatment, blockDesignFallback.imageSurfaceMotion, blockDesignFallback.tileTreatment, blockDesignFallback.eventListTreatment, blockDesignFallback.eyebrowTreatment, blockDesignFallback.accordionIconTreatment, blockDesignFallback.composition;
25528
+ blockDesignFallback.sectionSurface, blockDesignFallback.contentFrame, blockDesignFallback.sectionHeight, blockDesignFallback.heroLegibility, blockDesignFallback.imageSurfaceTreatment, blockDesignFallback.imageSurfaceMotion, blockDesignFallback.tileTreatment, blockDesignFallback.eventListTreatment, blockDesignFallback.eyebrowTreatment, blockDesignFallback.accordionIconTreatment, blockDesignFallback.composition;
24883
25529
  //#endregion
24884
25530
  //#region ../theme-core/src/site-styles/siteChromeBackgrounds.ts
24885
25531
  const siteChromeBackgroundColorTokens = toSiteChromeBackgroundColorTokens(backgroundAppearanceColorTokenNames);
@@ -33824,13 +34470,13 @@ const hours = stack({
33824
34470
  as: "p",
33825
34471
  className: "rb-caption rb-opacity-70"
33826
34472
  }, bind("module.timeZone"), when("module.timeZone"))], when("module.kind", { equals: "opening-hours" }));
33827
- const socials = inline({ className: "rb-flex rb-flex-wrap rb-gap-x-5 rb-gap-y-3" }, [link({
34473
+ const socials = inline({ className: "rb-footer-socials" }, [link({
33828
34474
  href: { $bind: { from: "social.href" } },
33829
34475
  target: "_blank",
33830
34476
  rel: "noreferrer noopener",
33831
34477
  "aria-label": { $bind: { from: "social.label" } },
33832
- className: "rb-nav-text transition-theme-standard"
33833
- }, [icon({ className: "rb-h-5 rb-w-5" }, bind("social.icon"), when("social.icon")), text({ as: "span" }, bind("social.label"), when("social.icon", { equals: null }))], repeat("module.socialLinks", "social"))], when("module.kind", { equals: "social-links" }));
34478
+ className: "rb-footer-social-link rb-nav-text transition-theme-standard"
34479
+ }, [icon({ className: "rb-footer-social-icon" }, bind("social.icon"), when("social.icon")), text({ as: "span" }, bind("social.label"), when("social.icon", { equals: null }))], repeat("module.socialLinks", "social"))], when("module.kind", { equals: "social-links" }));
33834
34480
  const authoredCopy = richText({
33835
34481
  className: "rb-prose rb-prose-sm rb-max-w-none",
33836
34482
  style: textColorStyle("text/80")
@@ -35471,6 +36117,15 @@ const appointmentServicesBlockDefinition = {
35471
36117
  required: false,
35472
36118
  ui: { intent: "content" }
35473
36119
  },
36120
+ createSiteOptionSelectField({
36121
+ id: "categoryId",
36122
+ label: "Category",
36123
+ description: "Show one category (with its heading and intro), or leave it on All categories to show everything grouped.",
36124
+ required: false,
36125
+ multiple: false,
36126
+ optionSource: "appointmentServiceCategories",
36127
+ ui: { intent: "content" }
36128
+ }),
35474
36129
  sectionStylesField({
35475
36130
  id: "_sectionStyles",
35476
36131
  label: "Section styles",
@@ -35505,6 +36160,7 @@ const appointmentServicesBlockDefinition = {
35505
36160
  richText({ className: "rb-prose rb-max-w-none" }, bind("content.description"), when("content.description")),
35506
36161
  el("appointment-services", {
35507
36162
  sectionHeading: { $bind: { from: "content.heading" } },
36163
+ categoryId: { $bind: { from: "content.categoryId" } },
35508
36164
  services: { $bind: { from: "data.services" } },
35509
36165
  pathname: { $bind: { from: "$root.pathname" } },
35510
36166
  servicePathPrefix: { $bind: { from: "$root.appointmentServicePathPrefix" } }
@@ -35828,6 +36484,7 @@ const publicEventLoaderQuerySchemaShape = {
35828
36484
  seriesSlug: z.string().optional(),
35829
36485
  includeOccurrenceId: z.string().optional(),
35830
36486
  readIntent: z.string().optional(),
36487
+ detailAdmission: z.string().optional(),
35831
36488
  detailLevel: z.string().optional(),
35832
36489
  readProfile: z.string().optional()
35833
36490
  };
@@ -35994,11 +36651,11 @@ const publicEventBookingAvailabilitySchema = z.discriminatedUnion("kind", [z.obj
35994
36651
  "series_archived",
35995
36652
  "parent_archived",
35996
36653
  "parent_inconsistent",
35997
- "not_public",
35998
36654
  "already_started",
35999
36655
  "enrollment_closed"
36000
36656
  ])
36001
36657
  })]);
36658
+ const publicEventBookingClosedDetailSchema = z.discriminatedUnion("kind", [z.object({ kind: z.literal("opensSoon") }), z.object({ kind: z.literal("paused") })]);
36002
36659
  const publicRunSessionSchema = z.object({
36003
36660
  occurrenceId: z.string(),
36004
36661
  startsAt: z.string(),
@@ -36043,6 +36700,7 @@ const publicEventBaseSchema = z.object({
36043
36700
  destination: publicEventDestinationSchema,
36044
36701
  requiresRegistration: z.boolean(),
36045
36702
  bookingAvailability: publicEventBookingAvailabilitySchema,
36703
+ bookingClosedDetail: publicEventBookingClosedDetailSchema.optional(),
36046
36704
  deliveryMode: z.enum([
36047
36705
  "in_person",
36048
36706
  "online",
@@ -43930,6 +44588,11 @@ const mailingListContentVersionIdSchema = z.string().transform((value, ctx) => {
43930
44588
  });
43931
44589
  return z.NEVER;
43932
44590
  });
44591
+ const mailingListSignupBlockSourceRefSchema = z.object({
44592
+ tag: z.literal("block_ref"),
44593
+ blockId: mailingListSignupBlockIdSchema,
44594
+ contentVersionId: mailingListContentVersionIdSchema
44595
+ });
43933
44596
  const signedMailingListSourceTokenSchema = z.string().trim().min(1).transform(parseRequiredMailingListSignedSourceToken);
43934
44597
  const newsletterSourceCommonSchema = z.object({
43935
44598
  siteId: z.string().optional(),
@@ -43944,7 +44607,15 @@ const newsletterSourceSchema = z.discriminatedUnion("source", [
43944
44607
  newsletterSourceCommonSchema.extend({
43945
44608
  source: z.literal("block"),
43946
44609
  blockId: z.string().nullable().optional(),
43947
- contentVersionId: z.string().nullable().optional()
44610
+ newsletterBlockSubmission: z.discriminatedUnion("tag", [
44611
+ z.object({
44612
+ tag: z.literal("ready"),
44613
+ sourceRef: mailingListSignupBlockSourceRefSchema
44614
+ }),
44615
+ z.object({ tag: z.literal("unpublished-form") }),
44616
+ z.object({ tag: z.literal("unpublished-settings") }),
44617
+ z.object({ tag: z.literal("unavailable") })
44618
+ ])
43948
44619
  }),
43949
44620
  newsletterSourceCommonSchema.extend({
43950
44621
  source: z.literal("signed-footer"),
@@ -43973,11 +44644,7 @@ const newsletterHydrationSchema = z.object({
43973
44644
  target: z.discriminatedUnion("tag", [
43974
44645
  z.object({
43975
44646
  tag: z.literal("block-source"),
43976
- sourceRef: z.object({
43977
- tag: z.literal("block_ref"),
43978
- blockId: mailingListSignupBlockIdSchema,
43979
- contentVersionId: mailingListContentVersionIdSchema
43980
- }).nullable()
44647
+ sourceRef: mailingListSignupBlockSourceRefSchema.nullable()
43981
44648
  }),
43982
44649
  z.object({
43983
44650
  tag: z.literal("signed-footer-source"),
@@ -43986,7 +44653,11 @@ const newsletterHydrationSchema = z.object({
43986
44653
  token: signedMailingListSourceTokenSchema
43987
44654
  })
43988
44655
  }),
43989
- z.object({ tag: z.literal("preview") })
44656
+ z.object({ tag: z.literal("preview") }),
44657
+ z.object({
44658
+ tag: z.literal("unpublished-preview"),
44659
+ reason: z.enum(["unpublished-form", "unpublished-settings"])
44660
+ })
43990
44661
  ]),
43991
44662
  setupRevision: z.number().int().positive().nullable(),
43992
44663
  choiceProvider: z.enum([
@@ -44055,16 +44726,21 @@ const newsletterFormBlockRuntime = defineProgressiveBlockRuntime({
44055
44726
  });
44056
44727
  function projectNewsletterFormHydrationTarget(source) {
44057
44728
  switch (source.source) {
44058
- case "block": {
44059
- const sourceRef = buildMailingListSignupBlockSourceRef(source.blockId, source.contentVersionId);
44060
- if (sourceRef?.tag === "block_ref") return {
44729
+ case "block": switch (source.newsletterBlockSubmission.tag) {
44730
+ case "unpublished-form":
44731
+ case "unpublished-settings": return {
44732
+ tag: "unpublished-preview",
44733
+ reason: source.newsletterBlockSubmission.tag
44734
+ };
44735
+ case "ready": return {
44061
44736
  tag: "block-source",
44062
- sourceRef
44737
+ sourceRef: source.newsletterBlockSubmission.sourceRef
44063
44738
  };
44064
- return {
44739
+ case "unavailable": return {
44065
44740
  tag: "block-source",
44066
44741
  sourceRef: null
44067
44742
  };
44743
+ default: return assertNever$6(source.newsletterBlockSubmission);
44068
44744
  }
44069
44745
  case "signed-footer": return {
44070
44746
  tag: "signed-footer-source",
@@ -46575,6 +47251,17 @@ function coerceToString(value) {
46575
47251
  return "";
46576
47252
  }
46577
47253
  /**
47254
+ * The appointment-services catalogue (issue 1403) pairs the services with the
47255
+ * site's ordered categories. Both are needed to group them, so that response
47256
+ * is passed through whole; any other `{ services }` wrapper is unwrapped.
47257
+ */
47258
+ function coerceServicesPayload(record) {
47259
+ return Array.isArray(record.services) && Array.isArray(record.categories) ? {
47260
+ services: record.services,
47261
+ categories: record.categories
47262
+ } : record.services;
47263
+ }
47264
+ /**
46578
47265
  * Extract data from API response.
46579
47266
  * Unwraps common response wrappers: { data }, { form }, { entries }, { services }, { teamMembers }
46580
47267
  *
@@ -46589,7 +47276,7 @@ function coercePayload(payload) {
46589
47276
  if ("data" in record && typeof record.data !== "function") return record.data;
46590
47277
  if ("form" in record && typeof record.form !== "function") return record.form;
46591
47278
  if ("entries" in record && typeof record.entries !== "function") return record.entries;
46592
- if ("services" in record && typeof record.services !== "function") return record.services;
47279
+ if ("services" in record && typeof record.services !== "function") return coerceServicesPayload(record);
46593
47280
  if ("teamMembers" in record && typeof record.teamMembers !== "function") return record.teamMembers;
46594
47281
  }
46595
47282
  return payload;
@@ -48123,7 +48810,7 @@ function createRiverbankClientWithDeps(deps, config) {
48123
48810
  const result = await reader({
48124
48811
  cacheKey: plan.cacheKey,
48125
48812
  endpoint: plan.endpoint,
48126
- payloadSchemaVersion: 1
48813
+ payloadSchemaVersion: 2
48127
48814
  });
48128
48815
  if (result.kind === "miss") return {
48129
48816
  kind: "miss",
@@ -48172,7 +48859,7 @@ function createRiverbankClientWithDeps(deps, config) {
48172
48859
  siteId: plan.siteId ?? getRuntimePayloadSiteId(payload),
48173
48860
  freshTtlSec: plan.freshTtlSec,
48174
48861
  staleTtlSec: plan.staleTtlSec,
48175
- payloadSchemaVersion: 1,
48862
+ payloadSchemaVersion: 2,
48176
48863
  writeReason: "live_success"
48177
48864
  });
48178
48865
  } catch {}
@@ -49238,6 +49925,17 @@ const navigationLinkInputSchemaOptions = [
49238
49925
  ];
49239
49926
  z.discriminatedUnion("kind", navigationLinkInputSchemaOptions);
49240
49927
  //#endregion
49928
+ //#region ../blocks/src/pageRenderAdmission.ts
49929
+ /** Pair a published version with the content it authorises at the render boundary. */
49930
+ function readPublishedBlockPlacement(id, content) {
49931
+ if (id == null && content == null) return null;
49932
+ if (id == null || content == null) throw new Error("Published block placement requires both an ID and content");
49933
+ return {
49934
+ id,
49935
+ content
49936
+ };
49937
+ }
49938
+ //#endregion
49241
49939
  //#region ../api/src/sdkConfig/contracts.ts
49242
49940
  /**
49243
49941
  * Canonical SDK config Zod contracts.
@@ -49927,7 +50625,12 @@ const appointmentSetupServiceDraftSchema = z.object({
49927
50625
  venue: appointmentSetupVenueChoiceSchema,
49928
50626
  timezone: z.string().trim().min(1).nullable(),
49929
50627
  payment: appointmentSetupPaymentDraftSchema,
49930
- assignment: appointmentSetupServiceAssignmentDraftSchema
50628
+ assignment: appointmentSetupServiceAssignmentDraftSchema,
50629
+ /**
50630
+ * The service's category, or null for "Other" (issue 1403). Omitted leaves
50631
+ * an existing service's category alone and puts a new one in "Other".
50632
+ */
50633
+ categoryId: z.string().uuid().nullable().optional()
49931
50634
  }).superRefine((service, ctx) => {
49932
50635
  if (service.payment.kind !== "free" && (service.priceAmount === null || service.priceAmount <= 0)) ctx.addIssue({
49933
50636
  code: "custom",
@@ -50141,6 +50844,7 @@ function collectText(node) {
50141
50844
  if (node.type === "text") return node.text ?? "";
50142
50845
  return (node.content ?? []).map(collectText).join("");
50143
50846
  }
50847
+ z.enum(["public", "unlisted"], { error: "visibility must be 'public' or 'unlisted'" });
50144
50848
  //#endregion
50145
50849
  //#region ../api/src/bookingPaymentTermSchemas.ts
50146
50850
  const bookingDepositRefundPolicySchema = z.enum(["refundable", "non_refundable"]);
@@ -50689,21 +51393,39 @@ function buildSiteRenderSupport(site, mediaAssets) {
50689
51393
  function collectMediaAssetSidecar(mediaAssets) {
50690
51394
  return Array.isArray(mediaAssets) && mediaAssets.length > 0 ? mediaAssets : void 0;
50691
51395
  }
50692
- function convertPageResponseBlock(block) {
51396
+ function readBlockContentId(value, name) {
51397
+ if (value === null || value === void 0) return null;
51398
+ if (typeof value === "string") return value;
51399
+ throw new Error(`Invalid ${name} in page: expected string or null`);
51400
+ }
51401
+ function readTransportedBlockIdentity(block, kind, stage) {
51402
+ return {
51403
+ draftContentId: readBlockContentId(block.draftContentId, "draft content id"),
51404
+ publishedPlacement: stage === "preview" ? readPublishedBlockPlacement(readBlockContentId(block.publishedContentId, "published content id"), sanitizeNullableSdkRuntimeBlockContent(kind, readNestedContentRecord(block.publishedContent))) : null
51405
+ };
51406
+ }
51407
+ function convertPageResponseBlock(block, stage) {
50693
51408
  if (!isRecord$1(block)) throw new Error("Invalid block format in page API response");
51409
+ const header = readTransportedBlockHeader(block);
51410
+ const admission = readInvalidBlockAdmission(block.admission);
51411
+ return {
51412
+ ...header,
51413
+ ...readTransportedBlockIdentity(block, header.kind, stage),
51414
+ content: sanitizeSdkRuntimeBlockContent(header.kind, readContentRecord(block.content) ?? {}),
51415
+ draftContent: sanitizeNullableSdkRuntimeBlockContent(header.kind, readNestedContentRecord(block.draftContent)),
51416
+ ...admission ? { admission } : {}
51417
+ };
51418
+ }
51419
+ function readTransportedBlockHeader(block) {
50694
51420
  if (typeof block.id !== "string" && block.id !== null) throw new Error(`Invalid block id in page: expected string or null, got ${typeof block.id}`);
50695
51421
  if (typeof block.kind !== "string") throw new Error(`Invalid block kind in page: expected string, got ${typeof block.kind}`);
50696
51422
  if (typeof block.purpose !== "string") throw new Error(`Invalid block purpose in page: expected string, got ${typeof block.purpose}`);
50697
51423
  if (block.contentVersionId !== void 0 && block.contentVersionId !== null && typeof block.contentVersionId !== "string") throw new Error(`Invalid content version id in page: expected string or null, got ${typeof block.contentVersionId}`);
50698
- const admission = readInvalidBlockAdmission(block.admission);
50699
51424
  return {
50700
51425
  id: block.id,
50701
51426
  ...block.contentVersionId !== void 0 ? { contentVersionId: block.contentVersionId } : {},
50702
51427
  kind: block.kind,
50703
- purpose: block.purpose,
50704
- content: sanitizeSdkRuntimeBlockContent(block.kind, readContentRecord(block.content) ?? {}),
50705
- draftContent: sanitizeNullableSdkRuntimeBlockContent(block.kind, readNestedContentRecord(block.draftContent)),
50706
- ...admission ? { admission } : {}
51428
+ purpose: block.purpose
50707
51429
  };
50708
51430
  }
50709
51431
  function readInvalidBlockAdmission(value) {
@@ -50716,7 +51438,7 @@ function buildPageOutline(input) {
50716
51438
  name: input.name,
50717
51439
  path: input.path ?? input.fallbackPath,
50718
51440
  purpose: input.purpose,
50719
- blocks: input.blocks.map(convertPageResponseBlock)
51441
+ blocks: input.blocks.map((block) => convertPageResponseBlock(block, input.previewStage))
50720
51442
  };
50721
51443
  }
50722
51444
  function buildRenderablePageOutline(input) {
@@ -50742,6 +51464,8 @@ function projectRenderablePageOutline(page) {
50742
51464
  function admitSdkRuntimePageBlock(block, customBlocks) {
50743
51465
  const base = {
50744
51466
  id: block.id,
51467
+ draftContentId: block.draftContentId,
51468
+ publishedPlacement: block.publishedPlacement,
50745
51469
  ...block.contentVersionId !== void 0 ? { contentVersionId: block.contentVersionId } : {},
50746
51470
  kind: block.kind,
50747
51471
  purpose: block.purpose,
@@ -50889,23 +51613,23 @@ async function loadPageWithDeps(deps, params) {
50889
51613
  if ("pageSurface" in pageResponse) throw new Error("This path resolves to a page surface, not a page. Use loadContent() instead, which handles pages, entries, and page surfaces.");
50890
51614
  const { page: pageData } = pageResponse;
50891
51615
  const support = buildSiteRenderSupport(site, collectMediaAssetSidecar(pageResponse.mediaAssets));
51616
+ const previewStage = preview ? "preview" : "published";
50892
51617
  const pageOutline = buildRenderablePageOutline({
50893
51618
  name: pageData.name,
50894
51619
  path: pageData.path,
50895
51620
  fallbackPath: path,
50896
51621
  purpose: pageData.purpose,
50897
51622
  blocks: pageData.blocks,
51623
+ previewStage,
50898
51624
  customBlocks: support.customBlocks
50899
51625
  });
50900
- const previewStage = preview ? "preview" : "published";
50901
- const renderTarget = {
50902
- kind: "page",
50903
- pageId: pageId ?? pageData.id
50904
- };
50905
51626
  const resolvedData = await resolveBlockDataWithDeps(deps, {
50906
51627
  page: projectRenderablePageOutline(pageOutline),
50907
51628
  siteId,
50908
- renderTarget,
51629
+ renderTarget: {
51630
+ kind: "page",
51631
+ pageId: pageId ?? pageData.id
51632
+ },
50909
51633
  previewStage,
50910
51634
  policy: createBlockDataLoadPolicy(dataLoaderOverrides, normalizeDataLoaderSearchParams(searchParams)),
50911
51635
  client,
@@ -50913,11 +51637,12 @@ async function loadPageWithDeps(deps, params) {
50913
51637
  });
50914
51638
  return {
50915
51639
  page: pageOutline,
50916
- runtimeBoundaries: pageData.runtimeBoundaries,
51640
+ runtimeJoins: pageData.runtimeJoins,
50917
51641
  theme: requireSdkTheme(support.theme, siteId),
50918
51642
  sdkConfig: support.sdkConfig,
50919
51643
  siteId,
50920
51644
  resolvedData,
51645
+ dataContext: { previewStage },
50921
51646
  bookingOfferingPresets: support.bookingOfferingPresets,
50922
51647
  mailingList: support.mailingList,
50923
51648
  bookingTimeZone: support.bookingTimeZone,
@@ -51311,7 +52036,8 @@ async function processTemplatePage(input) {
51311
52036
  block,
51312
52037
  bindingContext: input.bindingContext,
51313
52038
  slotContent: input.slotContent,
51314
- customBlocks: input.customBlocks
52039
+ customBlocks: input.customBlocks,
52040
+ previewStage: input.previewStage
51315
52041
  }));
51316
52042
  if (blocks.length === 0) return {
51317
52043
  templatePage: null,
@@ -51342,7 +52068,7 @@ function resolveTemplateBlockSequence(input) {
51342
52068
  if (slotKey) return selectBlocksForDeclaredEntrySlot({
51343
52069
  declaredSlotKey: slotKey,
51344
52070
  entrySlots: input.slotContent ?? []
51345
- }).map((slotBlock) => admitEntrySlotBlock(slotBlock, input.customBlocks));
52071
+ }).map((slotBlock) => admitEntrySlotBlock(slotBlock, input.customBlocks, input.previewStage));
51346
52072
  if (block.blockKind === "system.entry-slot") return [];
51347
52073
  return [resolveTemplateBlock(block, input.bindingContext, input.customBlocks)];
51348
52074
  }
@@ -51376,10 +52102,11 @@ function readEntrySlotKey(block) {
51376
52102
  const parsed = parseSlotKey(block.content?.slotKey);
51377
52103
  return parsed.ok ? parsed.value : null;
51378
52104
  }
51379
- function admitEntrySlotBlock(block, customBlocks) {
52105
+ function admitEntrySlotBlock(block, customBlocks, previewStage) {
51380
52106
  const base = {
51381
52107
  id: block.id ?? block.blockId ?? null,
51382
52108
  contentVersionId: block.contentVersionId,
52109
+ ...entrySlotBlockIdentity(block, previewStage),
51383
52110
  kind: block.kind,
51384
52111
  purpose: block.purpose,
51385
52112
  ...isRecord(block.bindings) ? { bindings: block.bindings } : {}
@@ -51400,6 +52127,12 @@ function admitEntrySlotBlock(block, customBlocks) {
51400
52127
  error: renderable.error
51401
52128
  });
51402
52129
  }
52130
+ function entrySlotBlockIdentity(block, previewStage) {
52131
+ return {
52132
+ draftContentId: block.draftContentId ?? null,
52133
+ publishedPlacement: previewStage === "preview" ? readPublishedBlockPlacement(block.publishedContentId, isRecord(block.publishedContent) && isRecord(block.publishedContent.data) ? block.publishedContent.data : null) : null
52134
+ };
52135
+ }
51403
52136
  //#endregion
51404
52137
  //#region src/rendering/helpers/loadContent.ts
51405
52138
  /**
@@ -51571,15 +52304,18 @@ async function loadContentFromContentResponseWithDeps(deps, params) {
51571
52304
  entry,
51572
52305
  templatePage,
51573
52306
  resolvedData,
51574
- dataContext: { contentEntry: {
51575
- ...entry.content ?? {},
51576
- id: entry.id,
51577
- slug: entry.slug,
51578
- contentTypeSlug: entry.type,
51579
- _entryId: entry.id,
51580
- _entrySlug: entry.slug,
51581
- _contentTypeSlug: entry.type
51582
- } },
52307
+ dataContext: {
52308
+ previewStage,
52309
+ contentEntry: {
52310
+ ...entry.content ?? {},
52311
+ id: entry.id,
52312
+ slug: entry.slug,
52313
+ contentTypeSlug: entry.type,
52314
+ _entryId: entry.id,
52315
+ _entrySlug: entry.slug,
52316
+ _contentTypeSlug: entry.type
52317
+ }
52318
+ },
51583
52319
  ...templateContentSupport
51584
52320
  };
51585
52321
  }
@@ -51640,6 +52376,7 @@ async function loadContentFromContentResponseWithDeps(deps, params) {
51640
52376
  templatePage,
51641
52377
  resolvedData,
51642
52378
  dataContext: {
52379
+ previewStage,
51643
52380
  pageSurface: {
51644
52381
  ...pageSurface.content ?? {},
51645
52382
  id: pageSurface.id,
@@ -51656,13 +52393,13 @@ async function loadContentFromContentResponseWithDeps(deps, params) {
51656
52393
  const { page: pageData } = contentResponse;
51657
52394
  const pageRecord = pageData;
51658
52395
  const canonicalPagePath = pageData.path ?? pageRecord.path ?? "/";
51659
- const draftPagePath = pageRecord.draftPath ?? pageRecord.path ?? canonicalPagePath;
51660
52396
  const pageOutline = buildRenderablePageOutline({
51661
52397
  name: pageData.name,
51662
52398
  path: canonicalPagePath,
51663
52399
  fallbackPath: "/",
51664
52400
  purpose: pageData.purpose,
51665
52401
  blocks: pageData.blocks,
52402
+ previewStage,
51666
52403
  customBlocks: support.customBlocks
51667
52404
  });
51668
52405
  const resolvedData = await resolveBlockDataWithDeps(deps, {
@@ -51681,26 +52418,14 @@ async function loadContentFromContentResponseWithDeps(deps, params) {
51681
52418
  type: "page",
51682
52419
  pageId: pageRecord.id,
51683
52420
  routeId: pageRecord.routeId ?? null,
51684
- pageMetadata: {
51685
- draftTitle: pageRecord.draftTitle ?? pageRecord.name ?? pageData.name,
51686
- draftPath: draftPagePath,
51687
- draftStatus: pageRecord.draftStatus ?? pageRecord.status ?? "draft",
51688
- title: pageRecord.name ?? pageData.name,
51689
- path: canonicalPagePath,
51690
- status: pageRecord.status ?? pageRecord.draftStatus ?? "draft",
51691
- publishedAt: pageRecord.publishedAt ?? null,
51692
- draftMetaTitle: pageRecord.draftMetaTitle ?? null,
51693
- draftMetaDescription: pageRecord.draftMetaDescription ?? null,
51694
- publishedMetaTitle: pageRecord.publishedMetaTitle ?? null,
51695
- publishedMetaDescription: pageRecord.publishedMetaDescription ?? null,
51696
- ogImageId: pageRecord.ogImageId ?? null
51697
- },
52421
+ pageMetadata: projectPagePreviewMetadata(pageRecord, pageData.name, canonicalPagePath),
51698
52422
  page: pageOutline,
51699
- runtimeBoundaries: pageData.runtimeBoundaries,
52423
+ runtimeJoins: pageData.runtimeJoins,
51700
52424
  theme: support.theme,
51701
52425
  siteId,
51702
52426
  ...support.customBlocks ? { customBlocks: support.customBlocks } : {},
51703
52427
  resolvedData,
52428
+ dataContext: { previewStage },
51704
52429
  bookingOfferingPresets: support.bookingOfferingPresets,
51705
52430
  mailingList: support.mailingList,
51706
52431
  bookingTimeZone: support.bookingTimeZone,
@@ -51713,6 +52438,32 @@ async function loadContentFromContentResponseWithDeps(deps, params) {
51713
52438
  ...support.mediaAssets ? { mediaAssets: support.mediaAssets } : {}
51714
52439
  };
51715
52440
  }
52441
+ function projectPagePreviewMetadata(page, pageName, canonicalPath) {
52442
+ return {
52443
+ ...projectDraftPageMetadata(page, pageName, canonicalPath),
52444
+ ...projectPublishedPageMetadata(page, pageName, canonicalPath)
52445
+ };
52446
+ }
52447
+ function projectDraftPageMetadata(page, pageName, canonicalPath) {
52448
+ return {
52449
+ draftTitle: page.draftTitle ?? page.name ?? pageName,
52450
+ draftPath: page.draftPath ?? page.path ?? canonicalPath,
52451
+ draftStatus: page.draftStatus ?? page.status ?? "draft",
52452
+ draftMetaTitle: page.draftMetaTitle ?? null,
52453
+ draftMetaDescription: page.draftMetaDescription ?? null
52454
+ };
52455
+ }
52456
+ function projectPublishedPageMetadata(page, pageName, canonicalPath) {
52457
+ return {
52458
+ title: page.name ?? pageName,
52459
+ path: canonicalPath,
52460
+ status: page.status ?? page.draftStatus ?? "draft",
52461
+ publishedAt: page.publishedAt ?? null,
52462
+ publishedMetaTitle: page.publishedMetaTitle ?? null,
52463
+ publishedMetaDescription: page.publishedMetaDescription ?? null,
52464
+ ogImageId: page.ogImageId ?? null
52465
+ };
52466
+ }
51716
52467
  /**
51717
52468
  * Type guard to check if API response is an entry
51718
52469
  */