@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
@@ -54,6 +54,75 @@ const footerModeSchema = z.enum([
54
54
  "none"
55
55
  ]);
56
56
  //#endregion
57
+ //#region ../api/src/defineEndpointDefinitions.ts
58
+ /**
59
+ * Validates extracted endpoint descriptors while preserving each literal path,
60
+ * method, and parameter contract for the typed URL builders.
61
+ */
62
+ function defineEndpointDefinitions(definitions) {
63
+ return definitions;
64
+ }
65
+ //#endregion
66
+ //#region ../api/src/publicNewsletterEndpointDefinitions.ts
67
+ const PUBLIC_NEWSLETTER_ENDPOINT_DEFINITIONS = defineEndpointDefinitions({
68
+ subscribeNewsletter: {
69
+ path: "/public/sites/{siteId}/newsletter/subscribe",
70
+ method: "POST",
71
+ tags: ["public-newsletter-{siteId}"],
72
+ auth: "public",
73
+ responseKind: "json"
74
+ },
75
+ confirmNewsletter: {
76
+ path: "/public/sites/{siteId}/newsletter/confirm/{token}",
77
+ method: "GET",
78
+ tags: ["public-newsletter-{siteId}"],
79
+ auth: "public",
80
+ responseKind: "text"
81
+ },
82
+ unsubscribeNewsletter: {
83
+ path: "/public/sites/{siteId}/newsletter/unsubscribe/{token}",
84
+ method: "GET",
85
+ tags: ["public-newsletter-{siteId}"],
86
+ auth: "public",
87
+ responseKind: "text"
88
+ },
89
+ unsubscribeNewsletterPost: {
90
+ path: "/public/sites/{siteId}/newsletter/unsubscribe/{token}",
91
+ method: "POST",
92
+ tags: ["public-newsletter-{siteId}"],
93
+ auth: "public",
94
+ responseKind: "text"
95
+ },
96
+ confirmNewsletterPost: {
97
+ path: "/public/sites/{siteId}/newsletter/confirm/{token}",
98
+ method: "POST",
99
+ tags: ["public-newsletter-{siteId}"],
100
+ auth: "public",
101
+ responseKind: "text"
102
+ },
103
+ getNewsletterPreferences: {
104
+ path: "/public/sites/{siteId}/newsletter/preferences/{token}",
105
+ method: "GET",
106
+ tags: ["public-newsletter-{siteId}"],
107
+ auth: "public",
108
+ responseKind: "text"
109
+ },
110
+ saveNewsletterPreferences: {
111
+ path: "/public/sites/{siteId}/newsletter/preferences/{token}",
112
+ method: "POST",
113
+ tags: ["public-newsletter-{siteId}"],
114
+ auth: "public",
115
+ responseKind: "text"
116
+ },
117
+ getNewsletterArchive: {
118
+ path: "/public/sites/{siteId}/newsletter/archive/{token}",
119
+ method: "GET",
120
+ tags: ["public-newsletter-{siteId}"],
121
+ auth: "public",
122
+ responseKind: "text"
123
+ }
124
+ });
125
+ //#endregion
57
126
  //#region ../api/src/apiEndpointTypes.ts
58
127
  function allowedDemoMutationPolicy() {
59
128
  return {
@@ -145,17 +214,85 @@ const SDK_ENTRY_READ_ENDPOINTS = {
145
214
  }
146
215
  };
147
216
  //#endregion
148
- //#region ../api/src/defineEndpointDefinitions.ts
149
- /**
150
- * Validates extracted endpoint descriptors while preserving each literal path,
151
- * method, and parameter contract for the typed URL builders.
152
- */
153
- function defineEndpointDefinitions(definitions) {
154
- return definitions;
155
- }
156
- //#endregion
157
217
  //#region ../api/src/appointmentEndpointDefinitions.ts
158
218
  const APPOINTMENT_ENDPOINT_DEFINITIONS = defineEndpointDefinitions({
219
+ ...defineEndpointDefinitions({
220
+ listGroupedAppointmentServices: {
221
+ path: "/sites/{siteId}/bookings/services/grouped",
222
+ method: "GET",
223
+ auth: "user",
224
+ responseKind: "json",
225
+ errors: ["server:internal_error"]
226
+ },
227
+ reorderAppointmentServices: {
228
+ path: "/sites/{siteId}/bookings/services/order",
229
+ method: "PUT",
230
+ auth: "user",
231
+ responseKind: "json",
232
+ errors: [
233
+ "validation:invalid_input",
234
+ "auth:forbidden",
235
+ "resource:not_found",
236
+ "resource:conflict",
237
+ "server:internal_error"
238
+ ]
239
+ },
240
+ listAppointmentServiceCategories: {
241
+ path: "/sites/{siteId}/bookings/service-categories",
242
+ method: "GET",
243
+ auth: "user",
244
+ responseKind: "json",
245
+ errors: ["server:internal_error"]
246
+ },
247
+ createAppointmentServiceCategory: {
248
+ path: "/sites/{siteId}/bookings/service-categories",
249
+ method: "POST",
250
+ auth: "user",
251
+ responseKind: "json",
252
+ errors: [
253
+ "validation:invalid_input",
254
+ "auth:forbidden",
255
+ "resource:conflict",
256
+ "server:internal_error"
257
+ ]
258
+ },
259
+ updateAppointmentServiceCategory: {
260
+ path: "/sites/{siteId}/bookings/service-categories/{categoryId}",
261
+ method: "PUT",
262
+ auth: "user",
263
+ responseKind: "json",
264
+ errors: [
265
+ "validation:invalid_input",
266
+ "auth:forbidden",
267
+ "resource:not_found",
268
+ "resource:conflict",
269
+ "server:internal_error"
270
+ ]
271
+ },
272
+ deleteAppointmentServiceCategory: {
273
+ path: "/sites/{siteId}/bookings/service-categories/{categoryId}",
274
+ method: "DELETE",
275
+ auth: "user",
276
+ responseKind: "json",
277
+ errors: [
278
+ "auth:forbidden",
279
+ "resource:not_found",
280
+ "server:internal_error"
281
+ ]
282
+ },
283
+ reorderAppointmentServiceCategories: {
284
+ path: "/sites/{siteId}/bookings/service-categories/order",
285
+ method: "PUT",
286
+ auth: "user",
287
+ responseKind: "json",
288
+ errors: [
289
+ "validation:invalid_input",
290
+ "auth:forbidden",
291
+ "resource:conflict",
292
+ "server:internal_error"
293
+ ]
294
+ }
295
+ }),
159
296
  listAppointmentResources: {
160
297
  path: "/sites/{siteId}/bookings/resources",
161
298
  method: "GET",
@@ -866,6 +1003,13 @@ const EVENT_SERIES_REGISTRATION_ENDPOINT_DEFINITIONS = defineEndpointDefinitions
866
1003
  errors: [],
867
1004
  responseKind: "blob"
868
1005
  },
1006
+ exportEventOfferingRegistrationsCsv: {
1007
+ path: "/sites/{siteId}/bookings/event-offerings/{eventOfferingId}/registrations/export.csv",
1008
+ method: "GET",
1009
+ auth: "user",
1010
+ errors: [],
1011
+ responseKind: "blob"
1012
+ },
869
1013
  updateEventSeriesRegistration: {
870
1014
  path: "/sites/{siteId}/bookings/event-series/{seriesId}/registrations/{registrationId}",
871
1015
  method: "PATCH",
@@ -876,6 +1020,19 @@ const EVENT_SERIES_REGISTRATION_ENDPOINT_DEFINITIONS = defineEndpointDefinitions
876
1020
  "resource:not_found",
877
1021
  "server:internal_error"
878
1022
  ]
1023
+ },
1024
+ saveEventSeriesRegistrationAnswers: {
1025
+ path: "/sites/{siteId}/bookings/event-series/{seriesId}/registrations/{registrationId}/answers",
1026
+ method: "PUT",
1027
+ auth: "user",
1028
+ responseKind: "json",
1029
+ errors: [
1030
+ "validation:invalid_input",
1031
+ "auth:forbidden",
1032
+ "resource:not_found",
1033
+ "resource:conflict",
1034
+ "server:internal_error"
1035
+ ]
879
1036
  }
880
1037
  });
881
1038
  //#endregion
@@ -1296,46 +1453,185 @@ const NEWSLETTER_ENDPOINT_DEFINITIONS = defineEndpointDefinitions({
1296
1453
  responseKind: "json",
1297
1454
  demoMutation: DEMO_MUTATION_BLOCKED_HIDDEN
1298
1455
  },
1299
- testSendNewsletterCampaign: {
1300
- path: "/sites/{siteId}/newsletter/campaigns/{campaignId}/test-send",
1456
+ scheduleNewsletterCampaign: {
1457
+ path: "/sites/{siteId}/newsletter/campaigns/{campaignId}/schedule",
1301
1458
  method: "POST",
1302
1459
  tags: [TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter],
1303
1460
  auth: "user",
1304
1461
  responseKind: "json",
1305
1462
  demoMutation: DEMO_MUTATION_BLOCKED_HIDDEN
1306
1463
  },
1307
- listNewsletterSendJobs: {
1308
- path: "/sites/{siteId}/newsletter/jobs",
1309
- method: "GET",
1464
+ unscheduleNewsletterCampaign: {
1465
+ path: "/sites/{siteId}/newsletter/campaigns/{campaignId}/unschedule",
1466
+ method: "POST",
1467
+ tags: [TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter],
1468
+ auth: "user",
1469
+ responseKind: "json",
1470
+ demoMutation: DEMO_MUTATION_BLOCKED_HIDDEN
1471
+ },
1472
+ stopNewsletterCampaign: {
1473
+ path: "/sites/{siteId}/newsletter/campaigns/{campaignId}/stop",
1474
+ method: "POST",
1310
1475
  tags: [TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter],
1311
1476
  auth: "user",
1477
+ responseKind: "json",
1478
+ demoMutation: DEMO_MUTATION_BLOCKED_HIDDEN
1479
+ },
1480
+ testSendNewsletterCampaign: {
1481
+ path: "/sites/{siteId}/newsletter/campaigns/{campaignId}/test-send",
1482
+ method: "POST",
1483
+ tags: [TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter],
1484
+ auth: "user",
1485
+ responseKind: "json",
1486
+ demoMutation: DEMO_MUTATION_BLOCKED_HIDDEN
1487
+ }
1488
+ });
1489
+ //#endregion
1490
+ //#region ../api/src/sdkEventEndpointDefinitions.ts
1491
+ /**
1492
+ * The SDK's Event graph: the Events themselves and the occurrences of one run.
1493
+ * Extracted from `endpoints.ts` so this family can be read, and added to, on
1494
+ * its own. New entries here must declare `errors`; the
1495
+ * require-api-endpoint-errors lint enforces that here as in endpoints.ts.
1496
+ */
1497
+ const SDK_EVENT_ENDPOINT_DEFINITIONS = defineEndpointDefinitions({
1498
+ sdkListEvents: {
1499
+ path: "/sdk/{siteId}/events",
1500
+ method: "GET",
1501
+ auth: "service",
1312
1502
  responseKind: "json"
1313
1503
  },
1314
- retryNewsletterSendJob: {
1315
- path: "/sites/{siteId}/newsletter/jobs/{jobId}/retry",
1504
+ sdkUpsertEvent: {
1505
+ path: "/sdk/{siteId}/events",
1316
1506
  method: "POST",
1507
+ auth: "service",
1508
+ responseKind: "json",
1317
1509
  errors: [
1318
1510
  "validation:invalid_input",
1319
1511
  "resource:not_found",
1320
- "auth:forbidden",
1512
+ "resource:conflict",
1513
+ "billing:plan_limit_exceeded",
1321
1514
  "server:internal_error"
1322
- ],
1323
- tags: [TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter],
1324
- auth: "user",
1515
+ ]
1516
+ },
1517
+ sdkGetEvent: {
1518
+ path: "/sdk/{siteId}/events/{identifier}",
1519
+ method: "GET",
1520
+ auth: "service",
1325
1521
  responseKind: "json"
1326
1522
  },
1327
- cancelNewsletterSendJob: {
1328
- path: "/sites/{siteId}/newsletter/jobs/{jobId}/cancel",
1523
+ sdkDeleteEvent: {
1524
+ path: "/sdk/{siteId}/events/{identifier}",
1525
+ method: "DELETE",
1526
+ auth: "service",
1527
+ responseKind: "json",
1528
+ errors: [
1529
+ "resource:not_found",
1530
+ "resource:conflict",
1531
+ "server:internal_error"
1532
+ ]
1533
+ },
1534
+ sdkTakeEventOffline: {
1535
+ path: "/sdk/{siteId}/events/{identifier}/lifecycle",
1329
1536
  method: "POST",
1537
+ auth: "service",
1538
+ responseKind: "json",
1539
+ errors: [
1540
+ "resource:not_found",
1541
+ "validation:invalid_input",
1542
+ "resource:conflict",
1543
+ "server:internal_error"
1544
+ ]
1545
+ },
1546
+ sdkListEventOccurrences: {
1547
+ path: "/sdk/{siteId}/events/{identifier}/runs/{runIdentifier}/occurrences",
1548
+ method: "GET",
1549
+ auth: "service",
1550
+ responseKind: "json",
1330
1551
  errors: [
1552
+ "resource:not_found",
1331
1553
  "validation:invalid_input",
1554
+ "server:internal_error"
1555
+ ]
1556
+ },
1557
+ sdkAddEventOccurrence: {
1558
+ path: "/sdk/{siteId}/events/{identifier}/runs/{runIdentifier}/occurrences",
1559
+ method: "POST",
1560
+ auth: "service",
1561
+ responseKind: "json",
1562
+ errors: [
1332
1563
  "resource:not_found",
1333
- "auth:forbidden",
1564
+ "validation:invalid_input",
1565
+ "resource:conflict",
1334
1566
  "server:internal_error"
1335
- ],
1336
- tags: [TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter],
1337
- auth: "user",
1338
- responseKind: "json"
1567
+ ]
1568
+ },
1569
+ sdkUpdateEventOccurrence: {
1570
+ path: "/sdk/{siteId}/events/{identifier}/runs/{runIdentifier}/occurrences/{occurrenceId}",
1571
+ method: "PATCH",
1572
+ auth: "service",
1573
+ responseKind: "json",
1574
+ errors: [
1575
+ "resource:not_found",
1576
+ "validation:invalid_input",
1577
+ "resource:conflict",
1578
+ "server:internal_error"
1579
+ ]
1580
+ },
1581
+ sdkCancelEventOccurrence: {
1582
+ path: "/sdk/{siteId}/events/{identifier}/runs/{runIdentifier}/occurrences/{occurrenceId}/cancel",
1583
+ method: "POST",
1584
+ auth: "service",
1585
+ responseKind: "json",
1586
+ errors: [
1587
+ "resource:not_found",
1588
+ "resource:conflict",
1589
+ "server:internal_error"
1590
+ ]
1591
+ },
1592
+ sdkDeleteEventOccurrence: {
1593
+ path: "/sdk/{siteId}/events/{identifier}/runs/{runIdentifier}/occurrences/{occurrenceId}",
1594
+ method: "DELETE",
1595
+ auth: "service",
1596
+ responseKind: "json",
1597
+ errors: [
1598
+ "resource:not_found",
1599
+ "resource:conflict",
1600
+ "server:internal_error"
1601
+ ]
1602
+ }
1603
+ });
1604
+ //#endregion
1605
+ //#region ../api/src/sdkPageDesignEndpointDefinitions.ts
1606
+ /**
1607
+ * SDK management endpoints for a page's draft design (issue 1497), spread into
1608
+ * `ENDPOINT_DEFINITIONS` like the other endpoint-definition modules. New
1609
+ * entries here must declare `errors`, which the require-api-endpoint-errors
1610
+ * lint enforces.
1611
+ */
1612
+ const SDK_PAGE_DESIGN_ENDPOINT_DEFINITIONS = defineEndpointDefinitions({
1613
+ sdkGetPageDesign: {
1614
+ path: "/sdk/{siteId}/pages/{identifier}/design",
1615
+ method: "GET",
1616
+ auth: "service",
1617
+ responseKind: "json",
1618
+ errors: [
1619
+ "resource:not_found",
1620
+ "validation:invalid_input",
1621
+ "server:internal_error"
1622
+ ]
1623
+ },
1624
+ sdkSavePageDesign: {
1625
+ path: "/sdk/{siteId}/pages/{identifier}/design",
1626
+ method: "POST",
1627
+ auth: "service",
1628
+ responseKind: "json",
1629
+ errors: [
1630
+ "resource:not_found",
1631
+ "validation:invalid_input",
1632
+ "resource:conflict",
1633
+ "server:internal_error"
1634
+ ]
1339
1635
  }
1340
1636
  });
1341
1637
  //#endregion
@@ -2268,15 +2564,6 @@ function parseMailingListContentVersionId(value) {
2268
2564
  const parsed = parseContentVersionId(value);
2269
2565
  return parsed.ok ? parsed.value : null;
2270
2566
  }
2271
- function buildMailingListSignupBlockSourceRef(blockId, contentVersionId) {
2272
- const parsedBlockId = parseMailingListBlockId(blockId);
2273
- const parsedContentVersionId = parseMailingListContentVersionId(contentVersionId);
2274
- return parsedBlockId !== null && parsedContentVersionId !== null ? {
2275
- tag: "block_ref",
2276
- blockId: parsedBlockId,
2277
- contentVersionId: parsedContentVersionId
2278
- } : null;
2279
- }
2280
2567
  //#endregion
2281
2568
  //#region ../core/src/secret.ts
2282
2569
  /**
@@ -2925,6 +3212,45 @@ const SITE_API_KEY_ENDPOINT_DEFINITIONS = defineEndpointDefinitions({
2925
3212
  }
2926
3213
  });
2927
3214
  //#endregion
3215
+ //#region ../api/src/siteManagementEndpointDefinitions.ts
3216
+ const SITE_MANAGEMENT_ENDPOINT_DEFINITIONS = defineEndpointDefinitions({
3217
+ createSite: {
3218
+ path: "/sites/manage",
3219
+ method: "POST",
3220
+ tags: ["site"],
3221
+ auth: "user",
3222
+ responseKind: "json"
3223
+ },
3224
+ updateSite: {
3225
+ path: "/sites/manage",
3226
+ method: "PUT",
3227
+ tags: ["site"],
3228
+ auth: "user",
3229
+ responseKind: "json"
3230
+ },
3231
+ changeSiteAddress: {
3232
+ path: "/sites/{siteId}/address",
3233
+ method: "PUT",
3234
+ auth: "user",
3235
+ responseKind: "json",
3236
+ demoMutation: DEMO_MUTATION_BLOCKED_DISABLED
3237
+ },
3238
+ getSiteAddressAvailability: {
3239
+ path: "/sites/{siteId}/address/availability",
3240
+ method: "GET",
3241
+ auth: "user",
3242
+ responseKind: "json"
3243
+ },
3244
+ deleteSite: {
3245
+ path: "/sites/{siteId}",
3246
+ method: "DELETE",
3247
+ tags: ["site", "site-{siteId}"],
3248
+ auth: "user",
3249
+ responseKind: "json",
3250
+ demoMutation: DEMO_MUTATION_BLOCKED_HIDDEN
3251
+ }
3252
+ });
3253
+ //#endregion
2928
3254
  //#region ../api/src/eventManagementEndpointDefinitions.ts
2929
3255
  const EVENT_MANAGEMENT_ENDPOINT_DEFINITIONS = defineEndpointDefinitions({
2930
3256
  listEvents: {
@@ -2972,6 +3298,28 @@ const EVENT_MANAGEMENT_ENDPOINT_DEFINITIONS = defineEndpointDefinitions({
2972
3298
  "server:internal_error"
2973
3299
  ]
2974
3300
  },
3301
+ /**
3302
+ * The web address of an event's own page. A course page belongs to the
3303
+ * event itself, so its address is written here rather than through a run.
3304
+ */
3305
+ updateEventAddress: {
3306
+ path: "/sites/{siteId}/bookings/events/{eventId}/address",
3307
+ method: "PATCH",
3308
+ tags: [
3309
+ "site-{siteId}",
3310
+ "event-series-{siteId}",
3311
+ TAG_TEMPLATES.siteRoutableContent,
3312
+ TAG_TEMPLATES.siteRedirects
3313
+ ],
3314
+ auth: "user",
3315
+ responseKind: "json",
3316
+ errors: [
3317
+ "validation:invalid_input",
3318
+ "resource:not_found",
3319
+ "resource:conflict",
3320
+ "server:internal_error"
3321
+ ]
3322
+ },
2975
3323
  createWholeSeriesRun: {
2976
3324
  path: "/sites/{siteId}/bookings/events/{eventId}/runs",
2977
3325
  method: "POST",
@@ -2998,6 +3346,20 @@ const EVENT_MANAGEMENT_ENDPOINT_DEFINITIONS = defineEndpointDefinitions({
2998
3346
  "server:internal_error"
2999
3347
  ]
3000
3348
  },
3349
+ updateCourseBookingSettings: {
3350
+ path: "/sites/{siteId}/bookings/events/{eventId}/booking-settings",
3351
+ method: "PATCH",
3352
+ tags: ["site-{siteId}", "event-series-{siteId}"],
3353
+ auth: "user",
3354
+ responseKind: "json",
3355
+ errors: [
3356
+ "validation:invalid_input",
3357
+ "auth:forbidden",
3358
+ "resource:not_found",
3359
+ "resource:conflict",
3360
+ "server:internal_error"
3361
+ ]
3362
+ },
3001
3363
  cancelWholeSeriesRun: {
3002
3364
  path: "/sites/{siteId}/bookings/events/{eventId}/runs/{runId}/cancellation",
3003
3365
  method: "POST",
@@ -3010,6 +3372,28 @@ const EVENT_MANAGEMENT_ENDPOINT_DEFINITIONS = defineEndpointDefinitions({
3010
3372
  "resource:conflict",
3011
3373
  "server:internal_error"
3012
3374
  ]
3375
+ },
3376
+ /**
3377
+ * The Content tab's one write: the short introduction, image and
3378
+ * description of an event's page, published without its layout.
3379
+ */
3380
+ saveEventPageWords: {
3381
+ path: "/sites/{siteId}/page-surfaces/{pageSurfaceId}/words",
3382
+ method: "PUT",
3383
+ tags: [
3384
+ TAG_TEMPLATES.siteCollection,
3385
+ TAG_TEMPLATES.siteRoutableContent,
3386
+ TAG_TEMPLATES.pageSurfaceById
3387
+ ],
3388
+ auth: "user",
3389
+ responseKind: "json",
3390
+ errors: [
3391
+ "auth:forbidden",
3392
+ "validation:invalid_input",
3393
+ "resource:not_found",
3394
+ "resource:conflict",
3395
+ "server:internal_error"
3396
+ ]
3013
3397
  }
3014
3398
  });
3015
3399
  //#endregion
@@ -3442,18 +3826,56 @@ const BILLING_ENDPOINT_DEFINITIONS = defineEndpointDefinitions({
3442
3826
  responseKind: "json"
3443
3827
  }
3444
3828
  });
3829
+ //#endregion
3830
+ //#region ../api/src/clientErrorReporting.ts
3831
+ const CLIENT_ERROR_REPORT_ENDPOINT_DEFINITIONS = defineEndpointDefinitions({ reportClientError: {
3832
+ path: "/client/error-report",
3833
+ method: "POST",
3834
+ auth: "user",
3835
+ errors: [],
3836
+ responseKind: "json"
3837
+ } });
3838
+ const CLIENT_ERROR_REPORT_LIMITS = {
3839
+ pathname: 1024,
3840
+ name: 120,
3841
+ message: 2e3,
3842
+ stack: 8e3,
3843
+ digest: 128,
3844
+ componentStack: 8e3,
3845
+ sourceLocation: 1024
3846
+ };
3847
+ const clientErrorEventSchema = z.enum([
3848
+ "dashboard:route-error",
3849
+ "dashboard:app-error",
3850
+ "client:error-boundary",
3851
+ "client:window-error",
3852
+ "client:unhandled-rejection"
3853
+ ]);
3854
+ z.object({
3855
+ event: clientErrorEventSchema,
3856
+ pathname: z.string().startsWith("/").max(CLIENT_ERROR_REPORT_LIMITS.pathname),
3857
+ name: z.string().max(CLIENT_ERROR_REPORT_LIMITS.name),
3858
+ message: z.string().max(CLIENT_ERROR_REPORT_LIMITS.message),
3859
+ stack: z.string().max(CLIENT_ERROR_REPORT_LIMITS.stack).nullable(),
3860
+ digest: z.string().max(CLIENT_ERROR_REPORT_LIMITS.digest).nullable(),
3861
+ componentStack: z.string().max(CLIENT_ERROR_REPORT_LIMITS.componentStack).nullable(),
3862
+ sourceLocation: z.string().max(CLIENT_ERROR_REPORT_LIMITS.sourceLocation).nullable()
3863
+ }).strict();
3445
3864
  ({
3865
+ ...CLIENT_ERROR_REPORT_ENDPOINT_DEFINITIONS,
3866
+ ...PUBLIC_NEWSLETTER_ENDPOINT_DEFINITIONS,
3446
3867
  ...ACCOUNT_ENDPOINT_DEFINITIONS,
3447
3868
  ...PUBLIC_ONBOARDING_ATTEMPT_ENDPOINT_DEFINITIONS,
3448
3869
  ...PUBLIC_EVENT_ENDPOINT_DEFINITIONS,
3449
3870
  ...GIFTING_ENDPOINT_DEFINITIONS,
3450
3871
  ...PUBLIC_READ_ENDPOINT_DEFINITIONS,
3451
- ...BILLING_ENDPOINT_DEFINITIONS
3872
+ ...BILLING_ENDPOINT_DEFINITIONS,
3873
+ ...SITE_MANAGEMENT_ENDPOINT_DEFINITIONS
3452
3874
  }), TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteTheme, TAG_TEMPLATES.siteCollection, { ...SITE_API_KEY_ENDPOINT_DEFINITIONS }, TAG_TEMPLATES.site, TAG_TEMPLATES.siteBookingSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteBookingSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteEmailSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteEmailSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteEmailSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteEmailSettings, {
3453
3875
  ...NEWSLETTER_ENDPOINT_DEFINITIONS,
3454
3876
  ...APPOINTMENT_ENDPOINT_DEFINITIONS,
3455
3877
  ...EVENT_SERIES_REGISTRATION_ENDPOINT_DEFINITIONS
3456
- }, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteById, TAG_TEMPLATES.siteBySlug, TAG_TEMPLATES.siteByDomain, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteById, TAG_TEMPLATES.siteBySlug, TAG_TEMPLATES.siteByDomain, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.pageSurfaceById, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.pageSurfaceById, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.pageSurfaceById, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.pageSurfaceById, TAG_TEMPLATES.workflowRunById, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.routeById, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.site, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteNavigation, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteNavigation, TAG_TEMPLATES.navigationMenuById, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteNavigation, TAG_TEMPLATES.navigationMenuById, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteNavigation, TAG_TEMPLATES.navigationMenuById, TAG_TEMPLATES.navigationItemById, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteNavigation, TAG_TEMPLATES.navigationMenuById, TAG_TEMPLATES.navigationItemById, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteNavigation, TAG_TEMPLATES.navigationMenuById, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.publicEvents, TAG_TEMPLATES.publicBookingServices, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteTheme, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteTheme, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteTheme, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.pageSurfaceById, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.pageSurfaceById, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.pageSurfaceById, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.pageSurfaceById, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.pageById, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.pageById, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.pageById, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.pageById, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.pageById, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.pageById, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.pageById, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.pageById, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.pageById, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.siteRedirects, TAG_TEMPLATES.siteRouteOutcomes, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.siteRedirects, TAG_TEMPLATES.siteRouteOutcomes, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.siteForms, TAG_TEMPLATES.siteForms, TAG_TEMPLATES.siteForms, TAG_TEMPLATES.siteForms, TAG_TEMPLATES.siteForms, TAG_TEMPLATES.siteForms, TAG_TEMPLATES.formSubmissionsBySlug, TAG_TEMPLATES.siteForms, TAG_TEMPLATES.formSubmissionsBySlug, TAG_TEMPLATES.siteForms, TAG_TEMPLATES.formSubmissionsBySlug, TAG_TEMPLATES.siteForms, { ...PUBLIC_BOOKING_AVAILABILITY_ENDPOINT_DEFINITIONS }, TAG_TEMPLATES.publicEventFilters, TAG_TEMPLATES.publicEvents, TAG_TEMPLATES.publicShop, TAG_TEMPLATES.publicCheckout, TAG_TEMPLATES.siteRoutableContent, { ...PUBLIC_EVENT_CHECKOUT_ENDPOINT_DEFINITIONS }, TAG_TEMPLATES.publicEvents, TAG_TEMPLATES.publicEvents, { ...EVENT_MANAGEMENT_ENDPOINT_DEFINITIONS }, { ...SDK_MEDIA_ENDPOINT_DEFINITIONS }, { ...SDK_ENDPOINT_DEFINITIONS }, { ...SDK_ENTRY_READ_ENDPOINTS };
3878
+ }, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteById, TAG_TEMPLATES.siteBySlug, TAG_TEMPLATES.siteByDomain, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteById, TAG_TEMPLATES.siteBySlug, TAG_TEMPLATES.siteByDomain, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.pageSurfaceById, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.pageSurfaceById, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.pageSurfaceById, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.pageSurfaceById, TAG_TEMPLATES.workflowRunById, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.routeById, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.site, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteNavigation, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteNavigation, TAG_TEMPLATES.navigationMenuById, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteNavigation, TAG_TEMPLATES.navigationMenuById, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteNavigation, TAG_TEMPLATES.navigationMenuById, TAG_TEMPLATES.navigationItemById, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteNavigation, TAG_TEMPLATES.navigationMenuById, TAG_TEMPLATES.navigationItemById, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteNavigation, TAG_TEMPLATES.navigationMenuById, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.publicEvents, TAG_TEMPLATES.publicBookingServices, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteTheme, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteTheme, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteTheme, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.pageSurfaceById, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.pageSurfaceById, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.pageSurfaceById, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.pageSurfaceById, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.pageById, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.pageById, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.pageById, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.pageById, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.pageById, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.pageById, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.pageById, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.pageById, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.pageById, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.siteRedirects, TAG_TEMPLATES.siteRouteOutcomes, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.siteRedirects, TAG_TEMPLATES.siteRouteOutcomes, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.siteForms, TAG_TEMPLATES.siteForms, TAG_TEMPLATES.siteForms, TAG_TEMPLATES.siteForms, TAG_TEMPLATES.siteForms, TAG_TEMPLATES.siteForms, TAG_TEMPLATES.formSubmissionsBySlug, TAG_TEMPLATES.siteForms, TAG_TEMPLATES.formSubmissionsBySlug, TAG_TEMPLATES.siteForms, TAG_TEMPLATES.formSubmissionsBySlug, TAG_TEMPLATES.siteForms, { ...PUBLIC_BOOKING_AVAILABILITY_ENDPOINT_DEFINITIONS }, TAG_TEMPLATES.publicEventFilters, TAG_TEMPLATES.publicEvents, TAG_TEMPLATES.publicShop, TAG_TEMPLATES.publicCheckout, TAG_TEMPLATES.siteRoutableContent, { ...PUBLIC_EVENT_CHECKOUT_ENDPOINT_DEFINITIONS }, TAG_TEMPLATES.publicEvents, TAG_TEMPLATES.publicEvents, { ...EVENT_MANAGEMENT_ENDPOINT_DEFINITIONS }, { ...SDK_MEDIA_ENDPOINT_DEFINITIONS }, { ...SDK_ENDPOINT_DEFINITIONS }, { ...SDK_PAGE_DESIGN_ENDPOINT_DEFINITIONS }, { ...SDK_EVENT_ENDPOINT_DEFINITIONS }, { ...SDK_ENTRY_READ_ENDPOINTS };
3457
3879
  z.object({ refreshToken: z.string().min(1).max(4096) }).strict();
3458
3880
  z.object({
3459
3881
  accessToken: z.string().min(1).max(4096),
@@ -10165,6 +10587,15 @@ function asSiteStyleId(value) {
10165
10587
  function asDesignSystemTemplateId(value) {
10166
10588
  return brandNonEmptyString(value, "DesignSystemTemplateId");
10167
10589
  }
10590
+ function toNonEmptyReadonlyArray(values) {
10591
+ const [first, ...rest] = values;
10592
+ return first === void 0 ? null : [first, ...rest];
10593
+ }
10594
+ function requireNonEmptyReadonlyArray(values, message = "Expected a non-empty array.") {
10595
+ const result = toNonEmptyReadonlyArray(values);
10596
+ if (!result) throw new Error(message);
10597
+ return result;
10598
+ }
10168
10599
  function makeBoundaryId(previousBlockId, nextBlockId) {
10169
10600
  return asDesignBoundaryId(`boundary:${encodeURIComponent(previousBlockId)}:${encodeURIComponent(nextBlockId)}`);
10170
10601
  }
@@ -10367,16 +10798,18 @@ const themeV2RuntimeStyleFieldNames = [
10367
10798
  "_frameStyles",
10368
10799
  "_sectionStyles",
10369
10800
  "_containerStyles",
10370
- "_cardStyles",
10371
- "_transitionStyles",
10372
- "styleGroup"
10801
+ "_cardStyles"
10373
10802
  ];
10374
10803
  const themeV2BlockSpecificRawStyleFieldNames = [
10375
10804
  "_contentCardStyles",
10376
10805
  "_heroLayoutStyles",
10377
10806
  "_textCardStyles"
10378
10807
  ];
10379
- const themeV2NormalEditorRawStyleFieldNames = [...themeV2RuntimeStyleFieldNames, ...themeV2BlockSpecificRawStyleFieldNames];
10808
+ const themeV2NormalEditorRawStyleFieldNames = [
10809
+ ...themeV2RuntimeStyleFieldNames,
10810
+ ...themeV2BlockSpecificRawStyleFieldNames,
10811
+ "styleGroup"
10812
+ ];
10380
10813
  new Set(themeV2NormalEditorRawStyleFieldNames);
10381
10814
  [...themeV2RuntimeStyleFieldNames, ...themeV2BlockSpecificRawStyleFieldNames];
10382
10815
  const pageDesignEditorBackgroundOverrideOwner = "page-design-editor";
@@ -12102,11 +12535,260 @@ function cardRoleFromLegacyVocabulary(value) {
12102
12535
  */
12103
12536
  const cardRoleWithLegacyAliasSchema = z.preprocess((value) => cardRoleFromLegacyVocabulary(value) ?? value, cardRoleSchema);
12104
12537
  //#endregion
12105
- //#region ../theme-core/src/site-styles/compilationPlan.ts
12106
- const defaultHeaderBrandPreferences = {
12107
- brandDisplay: "auto",
12108
- logoSize: "auto"
12109
- };
12538
+ //#region ../theme-core/src/site-styles/transitionCatalogue.ts
12539
+ /**
12540
+ * Family order for pickers. Entries below are listed family by family in this
12541
+ * same order, so the flat option list and the grouped families agree.
12542
+ */
12543
+ const transitionCatalogueFamilies = [
12544
+ {
12545
+ id: "gradient",
12546
+ label: "Gradient"
12547
+ },
12548
+ {
12549
+ id: "wave",
12550
+ label: "Wave"
12551
+ },
12552
+ {
12553
+ id: "angle",
12554
+ label: "Angle"
12555
+ }
12556
+ ];
12557
+ const mediumHeight = "6rem + 2px";
12558
+ const compactHeight = "4.5rem + 2px";
12559
+ const largeHeight = "7rem + 2px";
12560
+ /**
12561
+ * The single source of transition vocabulary. Order is significant: it is the
12562
+ * order of `boundaryOptions` (after `none`) and of each family's variants,
12563
+ * which persisted pins, page-flow presets and the editor picker all rely on.
12564
+ *
12565
+ * Shapes match what `generateLayoutCss` draws today. Structured
12566
+ * amplitude/frequency treatments (issue 826) extend this list later.
12567
+ */
12568
+ const transitionCatalogueEntries = defineExactCatalog()([
12569
+ {
12570
+ intent: "soft-fade-short",
12571
+ optionId: asBoundaryOptionId("break:soft"),
12572
+ family: "gradient",
12573
+ variantId: "soft",
12574
+ label: "Soft",
12575
+ variantLabel: "Soft",
12576
+ treatment: {
12577
+ kind: "soft-fade",
12578
+ height: "medium",
12579
+ curve: "soft"
12580
+ },
12581
+ size: "medium",
12582
+ heightExpression: mediumHeight,
12583
+ shape: { kind: "fade" }
12584
+ },
12585
+ {
12586
+ intent: "soft-fade-long",
12587
+ optionId: asBoundaryOptionId("break:spacious"),
12588
+ family: "gradient",
12589
+ variantId: "spacious",
12590
+ label: "Spacious",
12591
+ variantLabel: "Spacious",
12592
+ treatment: {
12593
+ kind: "soft-fade",
12594
+ height: "large",
12595
+ curve: "spacious"
12596
+ },
12597
+ size: "spacious",
12598
+ heightExpression: "10rem",
12599
+ shape: { kind: "fade" }
12600
+ },
12601
+ {
12602
+ intent: "soft-fade-expansive",
12603
+ optionId: asBoundaryOptionId("break:expansive"),
12604
+ family: "gradient",
12605
+ variantId: "expansive",
12606
+ label: "Expansive",
12607
+ variantLabel: "Expansive",
12608
+ treatment: {
12609
+ kind: "soft-fade",
12610
+ height: "expansive",
12611
+ curve: "expansive"
12612
+ },
12613
+ size: "expansive",
12614
+ heightExpression: "14rem",
12615
+ shape: { kind: "fade" }
12616
+ },
12617
+ {
12618
+ intent: "wave-edge-balanced",
12619
+ optionId: asBoundaryOptionId("break:wave-balanced"),
12620
+ family: "wave",
12621
+ variantId: "balanced",
12622
+ label: "Balanced wave",
12623
+ variantLabel: "Balanced",
12624
+ treatment: {
12625
+ kind: "wave-edge",
12626
+ height: "medium",
12627
+ amplitude: "balanced",
12628
+ rhythm: "double",
12629
+ symmetry: "symmetrical"
12630
+ },
12631
+ size: "medium",
12632
+ heightExpression: mediumHeight,
12633
+ shape: {
12634
+ kind: "wave",
12635
+ mask: "balanced"
12636
+ }
12637
+ },
12638
+ {
12639
+ intent: "wave-edge",
12640
+ optionId: asBoundaryOptionId("break:wave"),
12641
+ family: "wave",
12642
+ variantId: "classic",
12643
+ label: "Classic wave",
12644
+ variantLabel: "Classic",
12645
+ treatment: {
12646
+ kind: "wave-edge",
12647
+ height: "medium",
12648
+ amplitude: "balanced",
12649
+ rhythm: "double",
12650
+ symmetry: "asymmetrical"
12651
+ },
12652
+ size: "medium",
12653
+ heightExpression: mediumHeight,
12654
+ shape: {
12655
+ kind: "wave",
12656
+ mask: "classic"
12657
+ }
12658
+ },
12659
+ {
12660
+ intent: "wave-edge-gentle",
12661
+ optionId: asBoundaryOptionId("break:wave-gentle"),
12662
+ family: "wave",
12663
+ variantId: "gentle",
12664
+ label: "Gentle wave",
12665
+ variantLabel: "Gentle",
12666
+ treatment: {
12667
+ kind: "wave-edge",
12668
+ height: "compact",
12669
+ amplitude: "subtle",
12670
+ rhythm: "single",
12671
+ symmetry: "symmetrical"
12672
+ },
12673
+ size: "compact",
12674
+ heightExpression: compactHeight,
12675
+ shape: {
12676
+ kind: "wave",
12677
+ mask: "gentle"
12678
+ }
12679
+ },
12680
+ {
12681
+ intent: "wave-edge-bold",
12682
+ optionId: asBoundaryOptionId("break:wave-bold"),
12683
+ family: "wave",
12684
+ variantId: "bold",
12685
+ label: "Bold wave",
12686
+ variantLabel: "Bold",
12687
+ treatment: {
12688
+ kind: "wave-edge",
12689
+ height: "large",
12690
+ amplitude: "bold",
12691
+ rhythm: "double",
12692
+ symmetry: "symmetrical"
12693
+ },
12694
+ size: "large",
12695
+ heightExpression: largeHeight,
12696
+ shape: {
12697
+ kind: "wave",
12698
+ mask: "bold"
12699
+ }
12700
+ },
12701
+ {
12702
+ intent: "wave-edge-drift",
12703
+ optionId: asBoundaryOptionId("break:wave-drift"),
12704
+ family: "wave",
12705
+ variantId: "drift",
12706
+ label: "Drift wave",
12707
+ variantLabel: "Drift",
12708
+ treatment: {
12709
+ kind: "wave-edge",
12710
+ height: "medium",
12711
+ amplitude: "balanced",
12712
+ rhythm: "double",
12713
+ symmetry: "drift"
12714
+ },
12715
+ size: "medium",
12716
+ heightExpression: mediumHeight,
12717
+ shape: {
12718
+ kind: "wave",
12719
+ mask: "drift"
12720
+ }
12721
+ },
12722
+ {
12723
+ intent: "angle-edge-subtle",
12724
+ optionId: asBoundaryOptionId("break:angle-subtle"),
12725
+ family: "angle",
12726
+ variantId: "subtle",
12727
+ label: "Subtle angle",
12728
+ variantLabel: "Subtle",
12729
+ treatment: {
12730
+ kind: "angle-edge",
12731
+ height: "compact",
12732
+ slope: "subtle",
12733
+ direction: "forward"
12734
+ },
12735
+ size: "compact",
12736
+ heightExpression: compactHeight,
12737
+ shape: {
12738
+ kind: "angle",
12739
+ polygon: {
12740
+ startTopPercent: 34,
12741
+ endTopPercent: 18
12742
+ }
12743
+ }
12744
+ },
12745
+ {
12746
+ intent: "angle-edge",
12747
+ optionId: asBoundaryOptionId("break:angle-balanced"),
12748
+ family: "angle",
12749
+ variantId: "balanced",
12750
+ label: "Balanced angle",
12751
+ variantLabel: "Balanced",
12752
+ treatment: {
12753
+ kind: "angle-edge",
12754
+ height: "medium",
12755
+ slope: "balanced",
12756
+ direction: "forward"
12757
+ },
12758
+ size: "medium",
12759
+ heightExpression: mediumHeight,
12760
+ shape: {
12761
+ kind: "angle",
12762
+ polygon: {
12763
+ startTopPercent: 42,
12764
+ endTopPercent: 8
12765
+ }
12766
+ }
12767
+ },
12768
+ {
12769
+ intent: "angle-edge-steep",
12770
+ optionId: asBoundaryOptionId("break:angle-steep"),
12771
+ family: "angle",
12772
+ variantId: "steep",
12773
+ label: "Steep angle",
12774
+ variantLabel: "Steep",
12775
+ treatment: {
12776
+ kind: "angle-edge",
12777
+ height: "large",
12778
+ slope: "steep",
12779
+ direction: "forward"
12780
+ },
12781
+ size: "large",
12782
+ heightExpression: largeHeight,
12783
+ shape: {
12784
+ kind: "angle",
12785
+ polygon: {
12786
+ startTopPercent: 54,
12787
+ endTopPercent: 0
12788
+ }
12789
+ }
12790
+ }
12791
+ ]);
12110
12792
  //#endregion
12111
12793
  //#region ../theme-core/src/site-styles/sectionTransitions.ts
12112
12794
  function boundaryRuntimeMetrics(family, size, heightExpression) {
@@ -12117,42 +12799,106 @@ function boundaryRuntimeMetrics(family, size, heightExpression) {
12117
12799
  reserveCss: `calc((${heightExpression}) / 2)`
12118
12800
  };
12119
12801
  }
12120
- 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");
12802
+ new Map(transitionCatalogueEntries.map((entry) => [entry.intent, entry]));
12803
+ new Map(transitionCatalogueEntries.map((entry) => [entry.intent, boundaryRuntimeMetrics(entry.family, entry.size, entry.heightExpression)]));
12804
+ /**
12805
+ * The catalogue's compile-time coverage check guarantees an entry per
12806
+ * decorative intent, so a miss here is a broken invariant, not bad input.
12807
+ */
12808
+ function requireCatalogueValue(values, intent) {
12809
+ const value = values.get(intent);
12810
+ if (value === void 0) throw new Error(`Transition catalogue has no entry for ${intent}`);
12811
+ return value;
12812
+ }
12121
12813
  const noneBoundaryOption = {
12122
12814
  id: asBoundaryOptionId("break:none"),
12123
12815
  label: "None",
12124
12816
  transitionAfter: "none",
12125
12817
  treatment: { kind: "none" }
12126
12818
  };
12127
- const softBoundaryOption = {
12128
- id: asBoundaryOptionId("break:soft"),
12129
- label: "Soft",
12130
- transitionAfter: "soft-fade-short",
12131
- treatment: {
12132
- kind: "soft-fade",
12133
- height: "medium",
12134
- curve: "soft"
12135
- }
12819
+ const boundaryOptionByIntent = new Map(transitionCatalogueEntries.map((entry) => [entry.intent, {
12820
+ id: entry.optionId,
12821
+ label: entry.label,
12822
+ transitionAfter: entry.intent,
12823
+ treatment: entry.treatment
12824
+ }]));
12825
+ function boundaryOptionForTransitionIntent(intent) {
12826
+ return requireCatalogueValue(boundaryOptionByIntent, intent);
12827
+ }
12828
+ const softBoundaryOption = boundaryOptionForTransitionIntent("soft-fade-short");
12829
+ const spaciousBoundaryOption = boundaryOptionForTransitionIntent("soft-fade-long");
12830
+ boundaryOptionForTransitionIntent("soft-fade-expansive");
12831
+ boundaryOptionForTransitionIntent("wave-edge");
12832
+ boundaryOptionForTransitionIntent("wave-edge-balanced");
12833
+ boundaryOptionForTransitionIntent("wave-edge-gentle");
12834
+ boundaryOptionForTransitionIntent("wave-edge-bold");
12835
+ boundaryOptionForTransitionIntent("wave-edge-drift");
12836
+ boundaryOptionForTransitionIntent("angle-edge-subtle");
12837
+ boundaryOptionForTransitionIntent("angle-edge");
12838
+ boundaryOptionForTransitionIntent("angle-edge-steep");
12839
+ /**
12840
+ * Must remain non-empty; downstream code indexes `[0]` as the documented default.
12841
+ */
12842
+ const boundaryOptions = [noneBoundaryOption, ...transitionCatalogueEntries.map((entry) => boundaryOptionForTransitionIntent(entry.intent))];
12843
+ const noneTransitionVariant = {
12844
+ familyId: "none",
12845
+ variantId: "none",
12846
+ label: "None",
12847
+ boundaryOption: noneBoundaryOption
12136
12848
  };
12137
- const spaciousBoundaryOption = {
12138
- id: asBoundaryOptionId("break:spacious"),
12139
- label: "Spacious",
12140
- transitionAfter: "soft-fade-long",
12141
- treatment: {
12142
- kind: "soft-fade",
12143
- height: "large",
12144
- curve: "spacious"
12145
- }
12849
+ function transitionVariantForEntry(entry) {
12850
+ return {
12851
+ familyId: entry.family,
12852
+ variantId: entry.variantId,
12853
+ label: entry.variantLabel,
12854
+ boundaryOption: boundaryOptionForTransitionIntent(entry.intent)
12855
+ };
12856
+ }
12857
+ const sectionTransitionFamilies = [{
12858
+ id: "none",
12859
+ label: "None",
12860
+ variants: [noneTransitionVariant]
12861
+ }, ...transitionCatalogueFamilies.map((family) => ({
12862
+ id: family.id,
12863
+ label: family.label,
12864
+ variants: requireNonEmptyReadonlyArray(transitionCatalogueEntries.filter((entry) => entry.family === family.id).map(transitionVariantForEntry), `Transition family ${family.id} has no catalogue entries.`)
12865
+ }))];
12866
+ new Map(boundaryOptions.map((option) => [option.id, option]));
12867
+ new Map(boundaryOptions.map((option) => [stableTreatmentKey(option.treatment), option]));
12868
+ new Map(sectionTransitionFamilies.flatMap((family) => family.variants.map((variant) => [variant.boundaryOption.id, variant])));
12869
+ new Map(sectionTransitionFamilies.map((family) => [family.id, family]));
12870
+ function stableTreatmentKey(treatment) {
12871
+ switch (treatment.kind) {
12872
+ case "none": return "none";
12873
+ case "soft-fade": return `${treatment.kind}:${treatment.height}:${treatment.curve}`;
12874
+ case "wave-edge": return [
12875
+ treatment.kind,
12876
+ treatment.height,
12877
+ treatment.amplitude,
12878
+ treatment.rhythm,
12879
+ treatment.symmetry
12880
+ ].join(":");
12881
+ case "angle-edge": return [
12882
+ treatment.kind,
12883
+ treatment.height,
12884
+ treatment.slope,
12885
+ treatment.direction
12886
+ ].join(":");
12887
+ case "legacy-unsupported": return `${treatment.kind}:${treatment.boundaryOptionId}`;
12888
+ }
12889
+ }
12890
+ requireThemeColorToken$1("background");
12891
+ function requireThemeColorToken$1(value) {
12892
+ const token = parseThemeColorToken(value);
12893
+ if (!token) throw new Error(`Expected a theme color token. Received: ${value}`);
12894
+ return token;
12895
+ }
12896
+ //#endregion
12897
+ //#region ../theme-core/src/site-styles/compilationPlan.ts
12898
+ const defaultHeaderBrandPreferences = {
12899
+ brandDisplay: "auto",
12900
+ logoSize: "auto"
12146
12901
  };
12147
- asBoundaryOptionId("break:expansive");
12148
- asBoundaryOptionId("break:wave");
12149
- asBoundaryOptionId("break:wave-balanced");
12150
- asBoundaryOptionId("break:wave-gentle");
12151
- asBoundaryOptionId("break:wave-bold");
12152
- asBoundaryOptionId("break:wave-drift");
12153
- asBoundaryOptionId("break:angle-subtle");
12154
- asBoundaryOptionId("break:angle-balanced");
12155
- asBoundaryOptionId("break:angle-steep");
12156
12902
  asBoundaryOptionId("break:unknown");
12157
12903
  const pageDesignUserPinnedAppearanceChoiceSchema = z.object({
12158
12904
  kind: z.literal("user-pinned"),
@@ -12279,14 +13025,11 @@ function validateUniquePageDesignPins(intent, ctx) {
12279
13025
  label: "block Look pin"
12280
13026
  });
12281
13027
  addDuplicateStringIssues(ctx, {
12282
- values: intent.boundaryPins.map((pin) => boundaryKey(pin.previousBlockId, pin.nextBlockId)),
13028
+ values: intent.boundaryPins.map((pin) => makeBoundaryId(pin.previousBlockId, pin.nextBlockId)),
12283
13029
  path: ["boundaryPins"],
12284
13030
  label: "boundary pin"
12285
13031
  });
12286
13032
  }
12287
- function boundaryKey(previousBlockId, nextBlockId) {
12288
- return makeBoundaryId(previousBlockId, nextBlockId);
12289
- }
12290
13033
  //#endregion
12291
13034
  //#region ../theme-core/src/accordions/siteStyleDefaults.ts
12292
13035
  /**
@@ -13914,6 +14657,13 @@ z.object({
13914
14657
  fields: nonEmptyRuntimeStyleFieldNamesSchema,
13915
14658
  authority: styleAuthoritySchema
13916
14659
  }).strict();
14660
+ asPageFlowPresetId("flow:quiet"), noneBoundaryOption.id, asPageFlowPresetId("flow:balanced"), softBoundaryOption.id, asPageFlowPresetId("flow:expressive"), spaciousBoundaryOption.id;
14661
+ asPageFlowPresetId("generated-default");
14662
+ asSiteStyleId("site-style:south-west-twerk-school");
14663
+ asAppearancePresetId("hero-brand-scrim-fixed-frame");
14664
+ asLayoutVariantKey("classic");
14665
+ asLayoutVariantKey("micro");
14666
+ asBoundaryOptionId("break:wave");
13917
14667
  //#endregion
13918
14668
  //#region ../theme-core/src/site-styles/runtimeCompiler.ts
13919
14669
  function defineSectionForegroundRuntimeTokens(input) {
@@ -13937,7 +14687,7 @@ function defineComponentRuntimeRules(rules) {
13937
14687
  }
13938
14688
  /**
13939
14689
  * Default design rules translate semantic page-level choices into the current
13940
- * runtime's section background and transition style-group vocabulary.
14690
+ * runtime's section background vocabulary.
13941
14691
  */
13942
14692
  const defaultDesignRuntimeRules = defineDesignRuntimeRules({
13943
14693
  sectionSurfaces: {
@@ -13972,8 +14722,7 @@ const defaultDesignRuntimeRules = defineDesignRuntimeRules({
13972
14722
  color: "surface",
13973
14723
  opacity: .88
13974
14724
  }
13975
- },
13976
- transitionClassName: (transition, fromSurface, toSurface) => transition === "none" ? null : `site-style-transition-${transition}-from-${fromSurface}-to-${toSurface}`
14725
+ }
13977
14726
  });
13978
14727
  /**
13979
14728
  * Default component rules translate frame and item-surface semantics into the
@@ -15708,19 +16457,11 @@ const curatedSiteStyles = [
15708
16457
  })
15709
16458
  ];
15710
16459
  new Map(curatedSiteStyles.map((style) => [style.id, style]));
15711
- asPageFlowPresetId("generated-default");
15712
- asSiteStyleId("site-style:south-west-twerk-school");
15713
- asAppearancePresetId("hero-brand-scrim-fixed-frame");
15714
- asLayoutVariantKey("classic");
15715
- asLayoutVariantKey("micro");
15716
- asBoundaryOptionId("break:wave");
15717
- asPageFlowPresetId("flow:quiet"), noneBoundaryOption.id, asPageFlowPresetId("flow:balanced"), softBoundaryOption.id, asPageFlowPresetId("flow:expressive"), spaciousBoundaryOption.id;
15718
16460
  //#endregion
15719
16461
  //#region ../theme-core/src/site-styles/resolver.ts
15720
16462
  const blockDesignFallback = {
15721
16463
  sectionSurface: "base",
15722
16464
  contentFrame: plainFrame,
15723
- transitionAfter: "none",
15724
16465
  sectionHeight: "default",
15725
16466
  heroLegibility: "none",
15726
16467
  imageSurfaceTreatment: { kind: "none" },
@@ -15731,7 +16472,7 @@ const blockDesignFallback = {
15731
16472
  accordionIconTreatment: null,
15732
16473
  composition: null
15733
16474
  };
15734
- blockDesignFallback.sectionSurface, blockDesignFallback.contentFrame, blockDesignFallback.transitionAfter, blockDesignFallback.sectionHeight, blockDesignFallback.heroLegibility, blockDesignFallback.imageSurfaceTreatment, blockDesignFallback.imageSurfaceMotion, blockDesignFallback.tileTreatment, blockDesignFallback.eventListTreatment, blockDesignFallback.eyebrowTreatment, blockDesignFallback.accordionIconTreatment, blockDesignFallback.composition;
16475
+ blockDesignFallback.sectionSurface, blockDesignFallback.contentFrame, blockDesignFallback.sectionHeight, blockDesignFallback.heroLegibility, blockDesignFallback.imageSurfaceTreatment, blockDesignFallback.imageSurfaceMotion, blockDesignFallback.tileTreatment, blockDesignFallback.eventListTreatment, blockDesignFallback.eyebrowTreatment, blockDesignFallback.accordionIconTreatment, blockDesignFallback.composition;
15735
16476
  //#endregion
15736
16477
  //#region ../theme-core/src/site-styles/siteChromeBackgrounds.ts
15737
16478
  const siteChromeBackgroundColorTokens = toSiteChromeBackgroundColorTokens(backgroundAppearanceColorTokenNames);
@@ -16543,7 +17284,8 @@ const siteOptionSources = [
16543
17284
  "eventCategories",
16544
17285
  "eventSeries",
16545
17286
  "venues",
16546
- "staffMembers"
17287
+ "staffMembers",
17288
+ "appointmentServiceCategories"
16547
17289
  ];
16548
17290
  const mediaDeliverySchema = z.object({
16549
17291
  sizes: z.string().optional(),
@@ -25764,13 +26506,13 @@ const hours = stack({
25764
26506
  as: "p",
25765
26507
  className: "rb-caption rb-opacity-70"
25766
26508
  }, bind("module.timeZone"), when("module.timeZone"))], when("module.kind", { equals: "opening-hours" }));
25767
- const socials = inline({ className: "rb-flex rb-flex-wrap rb-gap-x-5 rb-gap-y-3" }, [link({
26509
+ const socials = inline({ className: "rb-footer-socials" }, [link({
25768
26510
  href: { $bind: { from: "social.href" } },
25769
26511
  target: "_blank",
25770
26512
  rel: "noreferrer noopener",
25771
26513
  "aria-label": { $bind: { from: "social.label" } },
25772
- className: "rb-nav-text transition-theme-standard"
25773
- }, [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" }));
26514
+ className: "rb-footer-social-link rb-nav-text transition-theme-standard"
26515
+ }, [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" }));
25774
26516
  const authoredCopy = richText({
25775
26517
  className: "rb-prose rb-prose-sm rb-max-w-none",
25776
26518
  style: textColorStyle("text/80")
@@ -27411,6 +28153,15 @@ const appointmentServicesBlockDefinition = {
27411
28153
  required: false,
27412
28154
  ui: { intent: "content" }
27413
28155
  },
28156
+ createSiteOptionSelectField({
28157
+ id: "categoryId",
28158
+ label: "Category",
28159
+ description: "Show one category (with its heading and intro), or leave it on All categories to show everything grouped.",
28160
+ required: false,
28161
+ multiple: false,
28162
+ optionSource: "appointmentServiceCategories",
28163
+ ui: { intent: "content" }
28164
+ }),
27414
28165
  sectionStylesField({
27415
28166
  id: "_sectionStyles",
27416
28167
  label: "Section styles",
@@ -27445,6 +28196,7 @@ const appointmentServicesBlockDefinition = {
27445
28196
  richText({ className: "rb-prose rb-max-w-none" }, bind("content.description"), when("content.description")),
27446
28197
  el("appointment-services", {
27447
28198
  sectionHeading: { $bind: { from: "content.heading" } },
28199
+ categoryId: { $bind: { from: "content.categoryId" } },
27448
28200
  services: { $bind: { from: "data.services" } },
27449
28201
  pathname: { $bind: { from: "$root.pathname" } },
27450
28202
  servicePathPrefix: { $bind: { from: "$root.appointmentServicePathPrefix" } }
@@ -27845,6 +28597,7 @@ const publicEventLoaderQuerySchemaShape = {
27845
28597
  seriesSlug: z.string().optional(),
27846
28598
  includeOccurrenceId: z.string().optional(),
27847
28599
  readIntent: z.string().optional(),
28600
+ detailAdmission: z.string().optional(),
27848
28601
  detailLevel: z.string().optional(),
27849
28602
  readProfile: z.string().optional()
27850
28603
  };
@@ -28011,11 +28764,11 @@ const publicEventBookingAvailabilitySchema = z.discriminatedUnion("kind", [z.obj
28011
28764
  "series_archived",
28012
28765
  "parent_archived",
28013
28766
  "parent_inconsistent",
28014
- "not_public",
28015
28767
  "already_started",
28016
28768
  "enrollment_closed"
28017
28769
  ])
28018
28770
  })]);
28771
+ const publicEventBookingClosedDetailSchema = z.discriminatedUnion("kind", [z.object({ kind: z.literal("opensSoon") }), z.object({ kind: z.literal("paused") })]);
28019
28772
  const publicRunSessionSchema = z.object({
28020
28773
  occurrenceId: z.string(),
28021
28774
  startsAt: z.string(),
@@ -28060,6 +28813,7 @@ const publicEventBaseSchema = z.object({
28060
28813
  destination: publicEventDestinationSchema,
28061
28814
  requiresRegistration: z.boolean(),
28062
28815
  bookingAvailability: publicEventBookingAvailabilitySchema,
28816
+ bookingClosedDetail: publicEventBookingClosedDetailSchema.optional(),
28063
28817
  deliveryMode: z.enum([
28064
28818
  "in_person",
28065
28819
  "online",
@@ -35723,6 +36477,11 @@ const mailingListContentVersionIdSchema = z.string().transform((value, ctx) => {
35723
36477
  });
35724
36478
  return z.NEVER;
35725
36479
  });
36480
+ const mailingListSignupBlockSourceRefSchema = z.object({
36481
+ tag: z.literal("block_ref"),
36482
+ blockId: mailingListSignupBlockIdSchema,
36483
+ contentVersionId: mailingListContentVersionIdSchema
36484
+ });
35726
36485
  const signedMailingListSourceTokenSchema = z.string().trim().min(1).transform(parseRequiredMailingListSignedSourceToken);
35727
36486
  const newsletterSourceCommonSchema = z.object({
35728
36487
  siteId: z.string().optional(),
@@ -35737,7 +36496,15 @@ const newsletterSourceSchema = z.discriminatedUnion("source", [
35737
36496
  newsletterSourceCommonSchema.extend({
35738
36497
  source: z.literal("block"),
35739
36498
  blockId: z.string().nullable().optional(),
35740
- contentVersionId: z.string().nullable().optional()
36499
+ newsletterBlockSubmission: z.discriminatedUnion("tag", [
36500
+ z.object({
36501
+ tag: z.literal("ready"),
36502
+ sourceRef: mailingListSignupBlockSourceRefSchema
36503
+ }),
36504
+ z.object({ tag: z.literal("unpublished-form") }),
36505
+ z.object({ tag: z.literal("unpublished-settings") }),
36506
+ z.object({ tag: z.literal("unavailable") })
36507
+ ])
35741
36508
  }),
35742
36509
  newsletterSourceCommonSchema.extend({
35743
36510
  source: z.literal("signed-footer"),
@@ -35766,11 +36533,7 @@ const newsletterHydrationSchema = z.object({
35766
36533
  target: z.discriminatedUnion("tag", [
35767
36534
  z.object({
35768
36535
  tag: z.literal("block-source"),
35769
- sourceRef: z.object({
35770
- tag: z.literal("block_ref"),
35771
- blockId: mailingListSignupBlockIdSchema,
35772
- contentVersionId: mailingListContentVersionIdSchema
35773
- }).nullable()
36536
+ sourceRef: mailingListSignupBlockSourceRefSchema.nullable()
35774
36537
  }),
35775
36538
  z.object({
35776
36539
  tag: z.literal("signed-footer-source"),
@@ -35779,7 +36542,11 @@ const newsletterHydrationSchema = z.object({
35779
36542
  token: signedMailingListSourceTokenSchema
35780
36543
  })
35781
36544
  }),
35782
- z.object({ tag: z.literal("preview") })
36545
+ z.object({ tag: z.literal("preview") }),
36546
+ z.object({
36547
+ tag: z.literal("unpublished-preview"),
36548
+ reason: z.enum(["unpublished-form", "unpublished-settings"])
36549
+ })
35783
36550
  ]),
35784
36551
  setupRevision: z.number().int().positive().nullable(),
35785
36552
  choiceProvider: z.enum([
@@ -35848,16 +36615,21 @@ const newsletterFormBlockRuntime = defineProgressiveBlockRuntime({
35848
36615
  });
35849
36616
  function projectNewsletterFormHydrationTarget(source) {
35850
36617
  switch (source.source) {
35851
- case "block": {
35852
- const sourceRef = buildMailingListSignupBlockSourceRef(source.blockId, source.contentVersionId);
35853
- if (sourceRef?.tag === "block_ref") return {
36618
+ case "block": switch (source.newsletterBlockSubmission.tag) {
36619
+ case "unpublished-form":
36620
+ case "unpublished-settings": return {
36621
+ tag: "unpublished-preview",
36622
+ reason: source.newsletterBlockSubmission.tag
36623
+ };
36624
+ case "ready": return {
35854
36625
  tag: "block-source",
35855
- sourceRef
36626
+ sourceRef: source.newsletterBlockSubmission.sourceRef
35856
36627
  };
35857
- return {
36628
+ case "unavailable": return {
35858
36629
  tag: "block-source",
35859
36630
  sourceRef: null
35860
36631
  };
36632
+ default: return assertNever$2(source.newsletterBlockSubmission);
35861
36633
  }
35862
36634
  case "signed-footer": return {
35863
36635
  tag: "signed-footer-source",
@@ -38410,6 +39182,46 @@ z.object({ acceptExtraSiteCharge: z.boolean().optional() });
38410
39182
  //#region ../surfaces/src/index.ts
38411
39183
  const SURFACE_IDS = ["core", "macadamia"];
38412
39184
  const DEFAULT_SURFACE_ID = "core";
39185
+ /**
39186
+ * Root hosts for each surface, keyed by deployment tier. The tier-keyed shape
39187
+ * makes it impossible to mis-order entries: callers like
39188
+ * `buildSurfaceAwareDashboardOriginForSurfaceId` look up by tier directly
39189
+ * rather than relying on positional alignment between arrays.
39190
+ */
39191
+ const SURFACE_ROOT_HOSTS = {
39192
+ core: {
39193
+ local: "localhost",
39194
+ prod: "riverbankcms.com"
39195
+ },
39196
+ macadamia: {
39197
+ local: "macadamia.localhost",
39198
+ prod: "macadamia.studio"
39199
+ }
39200
+ };
39201
+ const SURFACE_SITE_ROOT_HOSTS = {
39202
+ core: {
39203
+ local: "localhost",
39204
+ prod: "riverbanksites.com"
39205
+ },
39206
+ macadamia: {
39207
+ local: "macadamia.localhost",
39208
+ prod: "macadamia.studio"
39209
+ }
39210
+ };
39211
+ const SURFACE_SITE_ROOT_HOST_ALIASES = { core: { prod: ["preview.riverbanksites.com"] } };
39212
+ function surfaceHostTableValues(table) {
39213
+ return Object.values(table).flatMap((byTier) => Object.values(byTier).flat());
39214
+ }
39215
+ function siteSlugLabelUnderRoot(host, siteRootHost) {
39216
+ if (!host.endsWith(`.${siteRootHost}`)) return [];
39217
+ return host.slice(0, host.length - siteRootHost.length - 1).split(".").slice(-1);
39218
+ }
39219
+ function deriveSurfaceOwnedSiteSlugs() {
39220
+ const siteRootHosts = [...surfaceHostTableValues(SURFACE_SITE_ROOT_HOSTS), ...surfaceHostTableValues(SURFACE_SITE_ROOT_HOST_ALIASES)];
39221
+ const labels = [...surfaceHostTableValues(SURFACE_ROOT_HOSTS), ...siteRootHosts].flatMap((host) => siteRootHosts.flatMap((root) => siteSlugLabelUnderRoot(host, root)));
39222
+ return [...new Set(labels)].sort();
39223
+ }
39224
+ deriveSurfaceOwnedSiteSlugs();
38413
39225
  [...SURFACE_IDS.filter((surfaceId) => surfaceId !== DEFAULT_SURFACE_ID)];
38414
39226
  //#endregion
38415
39227
  //#region ../api/src/accountApi.ts
@@ -38792,7 +39604,12 @@ const appointmentSetupServiceDraftSchema = z.object({
38792
39604
  venue: appointmentSetupVenueChoiceSchema,
38793
39605
  timezone: z.string().trim().min(1).nullable(),
38794
39606
  payment: appointmentSetupPaymentDraftSchema,
38795
- assignment: appointmentSetupServiceAssignmentDraftSchema
39607
+ assignment: appointmentSetupServiceAssignmentDraftSchema,
39608
+ /**
39609
+ * The service's category, or null for "Other" (issue 1403). Omitted leaves
39610
+ * an existing service's category alone and puts a new one in "Other".
39611
+ */
39612
+ categoryId: z.string().uuid().nullable().optional()
38796
39613
  }).superRefine((service, ctx) => {
38797
39614
  if (service.payment.kind !== "free" && (service.priceAmount === null || service.priceAmount <= 0)) ctx.addIssue({
38798
39615
  code: "custom",
@@ -39006,6 +39823,7 @@ function collectText(node) {
39006
39823
  if (node.type === "text") return node.text ?? "";
39007
39824
  return (node.content ?? []).map(collectText).join("");
39008
39825
  }
39826
+ z.enum(["public", "unlisted"], { error: "visibility must be 'public' or 'unlisted'" });
39009
39827
  //#endregion
39010
39828
  //#region ../api/src/bookingPaymentTermSchemas.ts
39011
39829
  const bookingDepositRefundPolicySchema = z.enum(["refundable", "non_refundable"]);