@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
@@ -9,6 +9,75 @@ const footerModeSchema = z.enum([
9
9
  "none"
10
10
  ]);
11
11
  //#endregion
12
+ //#region ../api/src/defineEndpointDefinitions.ts
13
+ /**
14
+ * Validates extracted endpoint descriptors while preserving each literal path,
15
+ * method, and parameter contract for the typed URL builders.
16
+ */
17
+ function defineEndpointDefinitions(definitions) {
18
+ return definitions;
19
+ }
20
+ //#endregion
21
+ //#region ../api/src/publicNewsletterEndpointDefinitions.ts
22
+ const PUBLIC_NEWSLETTER_ENDPOINT_DEFINITIONS = defineEndpointDefinitions({
23
+ subscribeNewsletter: {
24
+ path: "/public/sites/{siteId}/newsletter/subscribe",
25
+ method: "POST",
26
+ tags: ["public-newsletter-{siteId}"],
27
+ auth: "public",
28
+ responseKind: "json"
29
+ },
30
+ confirmNewsletter: {
31
+ path: "/public/sites/{siteId}/newsletter/confirm/{token}",
32
+ method: "GET",
33
+ tags: ["public-newsletter-{siteId}"],
34
+ auth: "public",
35
+ responseKind: "text"
36
+ },
37
+ unsubscribeNewsletter: {
38
+ path: "/public/sites/{siteId}/newsletter/unsubscribe/{token}",
39
+ method: "GET",
40
+ tags: ["public-newsletter-{siteId}"],
41
+ auth: "public",
42
+ responseKind: "text"
43
+ },
44
+ unsubscribeNewsletterPost: {
45
+ path: "/public/sites/{siteId}/newsletter/unsubscribe/{token}",
46
+ method: "POST",
47
+ tags: ["public-newsletter-{siteId}"],
48
+ auth: "public",
49
+ responseKind: "text"
50
+ },
51
+ confirmNewsletterPost: {
52
+ path: "/public/sites/{siteId}/newsletter/confirm/{token}",
53
+ method: "POST",
54
+ tags: ["public-newsletter-{siteId}"],
55
+ auth: "public",
56
+ responseKind: "text"
57
+ },
58
+ getNewsletterPreferences: {
59
+ path: "/public/sites/{siteId}/newsletter/preferences/{token}",
60
+ method: "GET",
61
+ tags: ["public-newsletter-{siteId}"],
62
+ auth: "public",
63
+ responseKind: "text"
64
+ },
65
+ saveNewsletterPreferences: {
66
+ path: "/public/sites/{siteId}/newsletter/preferences/{token}",
67
+ method: "POST",
68
+ tags: ["public-newsletter-{siteId}"],
69
+ auth: "public",
70
+ responseKind: "text"
71
+ },
72
+ getNewsletterArchive: {
73
+ path: "/public/sites/{siteId}/newsletter/archive/{token}",
74
+ method: "GET",
75
+ tags: ["public-newsletter-{siteId}"],
76
+ auth: "public",
77
+ responseKind: "text"
78
+ }
79
+ });
80
+ //#endregion
12
81
  //#region ../api/src/apiEndpointTypes.ts
13
82
  function allowedDemoMutationPolicy() {
14
83
  return {
@@ -100,17 +169,85 @@ const SDK_ENTRY_READ_ENDPOINTS = {
100
169
  }
101
170
  };
102
171
  //#endregion
103
- //#region ../api/src/defineEndpointDefinitions.ts
104
- /**
105
- * Validates extracted endpoint descriptors while preserving each literal path,
106
- * method, and parameter contract for the typed URL builders.
107
- */
108
- function defineEndpointDefinitions(definitions) {
109
- return definitions;
110
- }
111
- //#endregion
112
172
  //#region ../api/src/appointmentEndpointDefinitions.ts
113
173
  const APPOINTMENT_ENDPOINT_DEFINITIONS = defineEndpointDefinitions({
174
+ ...defineEndpointDefinitions({
175
+ listGroupedAppointmentServices: {
176
+ path: "/sites/{siteId}/bookings/services/grouped",
177
+ method: "GET",
178
+ auth: "user",
179
+ responseKind: "json",
180
+ errors: ["server:internal_error"]
181
+ },
182
+ reorderAppointmentServices: {
183
+ path: "/sites/{siteId}/bookings/services/order",
184
+ method: "PUT",
185
+ auth: "user",
186
+ responseKind: "json",
187
+ errors: [
188
+ "validation:invalid_input",
189
+ "auth:forbidden",
190
+ "resource:not_found",
191
+ "resource:conflict",
192
+ "server:internal_error"
193
+ ]
194
+ },
195
+ listAppointmentServiceCategories: {
196
+ path: "/sites/{siteId}/bookings/service-categories",
197
+ method: "GET",
198
+ auth: "user",
199
+ responseKind: "json",
200
+ errors: ["server:internal_error"]
201
+ },
202
+ createAppointmentServiceCategory: {
203
+ path: "/sites/{siteId}/bookings/service-categories",
204
+ method: "POST",
205
+ auth: "user",
206
+ responseKind: "json",
207
+ errors: [
208
+ "validation:invalid_input",
209
+ "auth:forbidden",
210
+ "resource:conflict",
211
+ "server:internal_error"
212
+ ]
213
+ },
214
+ updateAppointmentServiceCategory: {
215
+ path: "/sites/{siteId}/bookings/service-categories/{categoryId}",
216
+ method: "PUT",
217
+ auth: "user",
218
+ responseKind: "json",
219
+ errors: [
220
+ "validation:invalid_input",
221
+ "auth:forbidden",
222
+ "resource:not_found",
223
+ "resource:conflict",
224
+ "server:internal_error"
225
+ ]
226
+ },
227
+ deleteAppointmentServiceCategory: {
228
+ path: "/sites/{siteId}/bookings/service-categories/{categoryId}",
229
+ method: "DELETE",
230
+ auth: "user",
231
+ responseKind: "json",
232
+ errors: [
233
+ "auth:forbidden",
234
+ "resource:not_found",
235
+ "server:internal_error"
236
+ ]
237
+ },
238
+ reorderAppointmentServiceCategories: {
239
+ path: "/sites/{siteId}/bookings/service-categories/order",
240
+ method: "PUT",
241
+ auth: "user",
242
+ responseKind: "json",
243
+ errors: [
244
+ "validation:invalid_input",
245
+ "auth:forbidden",
246
+ "resource:conflict",
247
+ "server:internal_error"
248
+ ]
249
+ }
250
+ }),
114
251
  listAppointmentResources: {
115
252
  path: "/sites/{siteId}/bookings/resources",
116
253
  method: "GET",
@@ -821,6 +958,13 @@ const EVENT_SERIES_REGISTRATION_ENDPOINT_DEFINITIONS = defineEndpointDefinitions
821
958
  errors: [],
822
959
  responseKind: "blob"
823
960
  },
961
+ exportEventOfferingRegistrationsCsv: {
962
+ path: "/sites/{siteId}/bookings/event-offerings/{eventOfferingId}/registrations/export.csv",
963
+ method: "GET",
964
+ auth: "user",
965
+ errors: [],
966
+ responseKind: "blob"
967
+ },
824
968
  updateEventSeriesRegistration: {
825
969
  path: "/sites/{siteId}/bookings/event-series/{seriesId}/registrations/{registrationId}",
826
970
  method: "PATCH",
@@ -831,6 +975,19 @@ const EVENT_SERIES_REGISTRATION_ENDPOINT_DEFINITIONS = defineEndpointDefinitions
831
975
  "resource:not_found",
832
976
  "server:internal_error"
833
977
  ]
978
+ },
979
+ saveEventSeriesRegistrationAnswers: {
980
+ path: "/sites/{siteId}/bookings/event-series/{seriesId}/registrations/{registrationId}/answers",
981
+ method: "PUT",
982
+ auth: "user",
983
+ responseKind: "json",
984
+ errors: [
985
+ "validation:invalid_input",
986
+ "auth:forbidden",
987
+ "resource:not_found",
988
+ "resource:conflict",
989
+ "server:internal_error"
990
+ ]
834
991
  }
835
992
  });
836
993
  //#endregion
@@ -1251,46 +1408,185 @@ const NEWSLETTER_ENDPOINT_DEFINITIONS = defineEndpointDefinitions({
1251
1408
  responseKind: "json",
1252
1409
  demoMutation: DEMO_MUTATION_BLOCKED_HIDDEN
1253
1410
  },
1254
- testSendNewsletterCampaign: {
1255
- path: "/sites/{siteId}/newsletter/campaigns/{campaignId}/test-send",
1411
+ scheduleNewsletterCampaign: {
1412
+ path: "/sites/{siteId}/newsletter/campaigns/{campaignId}/schedule",
1256
1413
  method: "POST",
1257
1414
  tags: [TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter],
1258
1415
  auth: "user",
1259
1416
  responseKind: "json",
1260
1417
  demoMutation: DEMO_MUTATION_BLOCKED_HIDDEN
1261
1418
  },
1262
- listNewsletterSendJobs: {
1263
- path: "/sites/{siteId}/newsletter/jobs",
1264
- method: "GET",
1419
+ unscheduleNewsletterCampaign: {
1420
+ path: "/sites/{siteId}/newsletter/campaigns/{campaignId}/unschedule",
1421
+ method: "POST",
1422
+ tags: [TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter],
1423
+ auth: "user",
1424
+ responseKind: "json",
1425
+ demoMutation: DEMO_MUTATION_BLOCKED_HIDDEN
1426
+ },
1427
+ stopNewsletterCampaign: {
1428
+ path: "/sites/{siteId}/newsletter/campaigns/{campaignId}/stop",
1429
+ method: "POST",
1265
1430
  tags: [TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter],
1266
1431
  auth: "user",
1432
+ responseKind: "json",
1433
+ demoMutation: DEMO_MUTATION_BLOCKED_HIDDEN
1434
+ },
1435
+ testSendNewsletterCampaign: {
1436
+ path: "/sites/{siteId}/newsletter/campaigns/{campaignId}/test-send",
1437
+ method: "POST",
1438
+ tags: [TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter],
1439
+ auth: "user",
1440
+ responseKind: "json",
1441
+ demoMutation: DEMO_MUTATION_BLOCKED_HIDDEN
1442
+ }
1443
+ });
1444
+ //#endregion
1445
+ //#region ../api/src/sdkEventEndpointDefinitions.ts
1446
+ /**
1447
+ * The SDK's Event graph: the Events themselves and the occurrences of one run.
1448
+ * Extracted from `endpoints.ts` so this family can be read, and added to, on
1449
+ * its own. New entries here must declare `errors`; the
1450
+ * require-api-endpoint-errors lint enforces that here as in endpoints.ts.
1451
+ */
1452
+ const SDK_EVENT_ENDPOINT_DEFINITIONS = defineEndpointDefinitions({
1453
+ sdkListEvents: {
1454
+ path: "/sdk/{siteId}/events",
1455
+ method: "GET",
1456
+ auth: "service",
1267
1457
  responseKind: "json"
1268
1458
  },
1269
- retryNewsletterSendJob: {
1270
- path: "/sites/{siteId}/newsletter/jobs/{jobId}/retry",
1459
+ sdkUpsertEvent: {
1460
+ path: "/sdk/{siteId}/events",
1271
1461
  method: "POST",
1462
+ auth: "service",
1463
+ responseKind: "json",
1272
1464
  errors: [
1273
1465
  "validation:invalid_input",
1274
1466
  "resource:not_found",
1275
- "auth:forbidden",
1467
+ "resource:conflict",
1468
+ "billing:plan_limit_exceeded",
1276
1469
  "server:internal_error"
1277
- ],
1278
- tags: [TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter],
1279
- auth: "user",
1470
+ ]
1471
+ },
1472
+ sdkGetEvent: {
1473
+ path: "/sdk/{siteId}/events/{identifier}",
1474
+ method: "GET",
1475
+ auth: "service",
1280
1476
  responseKind: "json"
1281
1477
  },
1282
- cancelNewsletterSendJob: {
1283
- path: "/sites/{siteId}/newsletter/jobs/{jobId}/cancel",
1478
+ sdkDeleteEvent: {
1479
+ path: "/sdk/{siteId}/events/{identifier}",
1480
+ method: "DELETE",
1481
+ auth: "service",
1482
+ responseKind: "json",
1483
+ errors: [
1484
+ "resource:not_found",
1485
+ "resource:conflict",
1486
+ "server:internal_error"
1487
+ ]
1488
+ },
1489
+ sdkTakeEventOffline: {
1490
+ path: "/sdk/{siteId}/events/{identifier}/lifecycle",
1284
1491
  method: "POST",
1492
+ auth: "service",
1493
+ responseKind: "json",
1494
+ errors: [
1495
+ "resource:not_found",
1496
+ "validation:invalid_input",
1497
+ "resource:conflict",
1498
+ "server:internal_error"
1499
+ ]
1500
+ },
1501
+ sdkListEventOccurrences: {
1502
+ path: "/sdk/{siteId}/events/{identifier}/runs/{runIdentifier}/occurrences",
1503
+ method: "GET",
1504
+ auth: "service",
1505
+ responseKind: "json",
1285
1506
  errors: [
1507
+ "resource:not_found",
1286
1508
  "validation:invalid_input",
1509
+ "server:internal_error"
1510
+ ]
1511
+ },
1512
+ sdkAddEventOccurrence: {
1513
+ path: "/sdk/{siteId}/events/{identifier}/runs/{runIdentifier}/occurrences",
1514
+ method: "POST",
1515
+ auth: "service",
1516
+ responseKind: "json",
1517
+ errors: [
1287
1518
  "resource:not_found",
1288
- "auth:forbidden",
1519
+ "validation:invalid_input",
1520
+ "resource:conflict",
1289
1521
  "server:internal_error"
1290
- ],
1291
- tags: [TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter],
1292
- auth: "user",
1293
- responseKind: "json"
1522
+ ]
1523
+ },
1524
+ sdkUpdateEventOccurrence: {
1525
+ path: "/sdk/{siteId}/events/{identifier}/runs/{runIdentifier}/occurrences/{occurrenceId}",
1526
+ method: "PATCH",
1527
+ auth: "service",
1528
+ responseKind: "json",
1529
+ errors: [
1530
+ "resource:not_found",
1531
+ "validation:invalid_input",
1532
+ "resource:conflict",
1533
+ "server:internal_error"
1534
+ ]
1535
+ },
1536
+ sdkCancelEventOccurrence: {
1537
+ path: "/sdk/{siteId}/events/{identifier}/runs/{runIdentifier}/occurrences/{occurrenceId}/cancel",
1538
+ method: "POST",
1539
+ auth: "service",
1540
+ responseKind: "json",
1541
+ errors: [
1542
+ "resource:not_found",
1543
+ "resource:conflict",
1544
+ "server:internal_error"
1545
+ ]
1546
+ },
1547
+ sdkDeleteEventOccurrence: {
1548
+ path: "/sdk/{siteId}/events/{identifier}/runs/{runIdentifier}/occurrences/{occurrenceId}",
1549
+ method: "DELETE",
1550
+ auth: "service",
1551
+ responseKind: "json",
1552
+ errors: [
1553
+ "resource:not_found",
1554
+ "resource:conflict",
1555
+ "server:internal_error"
1556
+ ]
1557
+ }
1558
+ });
1559
+ //#endregion
1560
+ //#region ../api/src/sdkPageDesignEndpointDefinitions.ts
1561
+ /**
1562
+ * SDK management endpoints for a page's draft design (issue 1497), spread into
1563
+ * `ENDPOINT_DEFINITIONS` like the other endpoint-definition modules. New
1564
+ * entries here must declare `errors`, which the require-api-endpoint-errors
1565
+ * lint enforces.
1566
+ */
1567
+ const SDK_PAGE_DESIGN_ENDPOINT_DEFINITIONS = defineEndpointDefinitions({
1568
+ sdkGetPageDesign: {
1569
+ path: "/sdk/{siteId}/pages/{identifier}/design",
1570
+ method: "GET",
1571
+ auth: "service",
1572
+ responseKind: "json",
1573
+ errors: [
1574
+ "resource:not_found",
1575
+ "validation:invalid_input",
1576
+ "server:internal_error"
1577
+ ]
1578
+ },
1579
+ sdkSavePageDesign: {
1580
+ path: "/sdk/{siteId}/pages/{identifier}/design",
1581
+ method: "POST",
1582
+ auth: "service",
1583
+ responseKind: "json",
1584
+ errors: [
1585
+ "resource:not_found",
1586
+ "validation:invalid_input",
1587
+ "resource:conflict",
1588
+ "server:internal_error"
1589
+ ]
1294
1590
  }
1295
1591
  });
1296
1592
  //#endregion
@@ -2191,15 +2487,6 @@ function parseMailingListContentVersionId(value) {
2191
2487
  const parsed = parseContentVersionId(value);
2192
2488
  return parsed.ok ? parsed.value : null;
2193
2489
  }
2194
- function buildMailingListSignupBlockSourceRef(blockId, contentVersionId) {
2195
- const parsedBlockId = parseMailingListBlockId(blockId);
2196
- const parsedContentVersionId = parseMailingListContentVersionId(contentVersionId);
2197
- return parsedBlockId !== null && parsedContentVersionId !== null ? {
2198
- tag: "block_ref",
2199
- blockId: parsedBlockId,
2200
- contentVersionId: parsedContentVersionId
2201
- } : null;
2202
- }
2203
2490
  //#endregion
2204
2491
  //#region ../core/src/secret.ts
2205
2492
  /**
@@ -2848,6 +3135,45 @@ const SITE_API_KEY_ENDPOINT_DEFINITIONS = defineEndpointDefinitions({
2848
3135
  }
2849
3136
  });
2850
3137
  //#endregion
3138
+ //#region ../api/src/siteManagementEndpointDefinitions.ts
3139
+ const SITE_MANAGEMENT_ENDPOINT_DEFINITIONS = defineEndpointDefinitions({
3140
+ createSite: {
3141
+ path: "/sites/manage",
3142
+ method: "POST",
3143
+ tags: ["site"],
3144
+ auth: "user",
3145
+ responseKind: "json"
3146
+ },
3147
+ updateSite: {
3148
+ path: "/sites/manage",
3149
+ method: "PUT",
3150
+ tags: ["site"],
3151
+ auth: "user",
3152
+ responseKind: "json"
3153
+ },
3154
+ changeSiteAddress: {
3155
+ path: "/sites/{siteId}/address",
3156
+ method: "PUT",
3157
+ auth: "user",
3158
+ responseKind: "json",
3159
+ demoMutation: DEMO_MUTATION_BLOCKED_DISABLED
3160
+ },
3161
+ getSiteAddressAvailability: {
3162
+ path: "/sites/{siteId}/address/availability",
3163
+ method: "GET",
3164
+ auth: "user",
3165
+ responseKind: "json"
3166
+ },
3167
+ deleteSite: {
3168
+ path: "/sites/{siteId}",
3169
+ method: "DELETE",
3170
+ tags: ["site", "site-{siteId}"],
3171
+ auth: "user",
3172
+ responseKind: "json",
3173
+ demoMutation: DEMO_MUTATION_BLOCKED_HIDDEN
3174
+ }
3175
+ });
3176
+ //#endregion
2851
3177
  //#region ../api/src/eventManagementEndpointDefinitions.ts
2852
3178
  const EVENT_MANAGEMENT_ENDPOINT_DEFINITIONS = defineEndpointDefinitions({
2853
3179
  listEvents: {
@@ -2895,6 +3221,28 @@ const EVENT_MANAGEMENT_ENDPOINT_DEFINITIONS = defineEndpointDefinitions({
2895
3221
  "server:internal_error"
2896
3222
  ]
2897
3223
  },
3224
+ /**
3225
+ * The web address of an event's own page. A course page belongs to the
3226
+ * event itself, so its address is written here rather than through a run.
3227
+ */
3228
+ updateEventAddress: {
3229
+ path: "/sites/{siteId}/bookings/events/{eventId}/address",
3230
+ method: "PATCH",
3231
+ tags: [
3232
+ "site-{siteId}",
3233
+ "event-series-{siteId}",
3234
+ TAG_TEMPLATES.siteRoutableContent,
3235
+ TAG_TEMPLATES.siteRedirects
3236
+ ],
3237
+ auth: "user",
3238
+ responseKind: "json",
3239
+ errors: [
3240
+ "validation:invalid_input",
3241
+ "resource:not_found",
3242
+ "resource:conflict",
3243
+ "server:internal_error"
3244
+ ]
3245
+ },
2898
3246
  createWholeSeriesRun: {
2899
3247
  path: "/sites/{siteId}/bookings/events/{eventId}/runs",
2900
3248
  method: "POST",
@@ -2921,6 +3269,20 @@ const EVENT_MANAGEMENT_ENDPOINT_DEFINITIONS = defineEndpointDefinitions({
2921
3269
  "server:internal_error"
2922
3270
  ]
2923
3271
  },
3272
+ updateCourseBookingSettings: {
3273
+ path: "/sites/{siteId}/bookings/events/{eventId}/booking-settings",
3274
+ method: "PATCH",
3275
+ tags: ["site-{siteId}", "event-series-{siteId}"],
3276
+ auth: "user",
3277
+ responseKind: "json",
3278
+ errors: [
3279
+ "validation:invalid_input",
3280
+ "auth:forbidden",
3281
+ "resource:not_found",
3282
+ "resource:conflict",
3283
+ "server:internal_error"
3284
+ ]
3285
+ },
2924
3286
  cancelWholeSeriesRun: {
2925
3287
  path: "/sites/{siteId}/bookings/events/{eventId}/runs/{runId}/cancellation",
2926
3288
  method: "POST",
@@ -2933,6 +3295,28 @@ const EVENT_MANAGEMENT_ENDPOINT_DEFINITIONS = defineEndpointDefinitions({
2933
3295
  "resource:conflict",
2934
3296
  "server:internal_error"
2935
3297
  ]
3298
+ },
3299
+ /**
3300
+ * The Content tab's one write: the short introduction, image and
3301
+ * description of an event's page, published without its layout.
3302
+ */
3303
+ saveEventPageWords: {
3304
+ path: "/sites/{siteId}/page-surfaces/{pageSurfaceId}/words",
3305
+ method: "PUT",
3306
+ tags: [
3307
+ TAG_TEMPLATES.siteCollection,
3308
+ TAG_TEMPLATES.siteRoutableContent,
3309
+ TAG_TEMPLATES.pageSurfaceById
3310
+ ],
3311
+ auth: "user",
3312
+ responseKind: "json",
3313
+ errors: [
3314
+ "auth:forbidden",
3315
+ "validation:invalid_input",
3316
+ "resource:not_found",
3317
+ "resource:conflict",
3318
+ "server:internal_error"
3319
+ ]
2936
3320
  }
2937
3321
  });
2938
3322
  //#endregion
@@ -3365,18 +3749,56 @@ const BILLING_ENDPOINT_DEFINITIONS = defineEndpointDefinitions({
3365
3749
  responseKind: "json"
3366
3750
  }
3367
3751
  });
3752
+ //#endregion
3753
+ //#region ../api/src/clientErrorReporting.ts
3754
+ const CLIENT_ERROR_REPORT_ENDPOINT_DEFINITIONS = defineEndpointDefinitions({ reportClientError: {
3755
+ path: "/client/error-report",
3756
+ method: "POST",
3757
+ auth: "user",
3758
+ errors: [],
3759
+ responseKind: "json"
3760
+ } });
3761
+ const CLIENT_ERROR_REPORT_LIMITS = {
3762
+ pathname: 1024,
3763
+ name: 120,
3764
+ message: 2e3,
3765
+ stack: 8e3,
3766
+ digest: 128,
3767
+ componentStack: 8e3,
3768
+ sourceLocation: 1024
3769
+ };
3770
+ const clientErrorEventSchema = z.enum([
3771
+ "dashboard:route-error",
3772
+ "dashboard:app-error",
3773
+ "client:error-boundary",
3774
+ "client:window-error",
3775
+ "client:unhandled-rejection"
3776
+ ]);
3777
+ z.object({
3778
+ event: clientErrorEventSchema,
3779
+ pathname: z.string().startsWith("/").max(CLIENT_ERROR_REPORT_LIMITS.pathname),
3780
+ name: z.string().max(CLIENT_ERROR_REPORT_LIMITS.name),
3781
+ message: z.string().max(CLIENT_ERROR_REPORT_LIMITS.message),
3782
+ stack: z.string().max(CLIENT_ERROR_REPORT_LIMITS.stack).nullable(),
3783
+ digest: z.string().max(CLIENT_ERROR_REPORT_LIMITS.digest).nullable(),
3784
+ componentStack: z.string().max(CLIENT_ERROR_REPORT_LIMITS.componentStack).nullable(),
3785
+ sourceLocation: z.string().max(CLIENT_ERROR_REPORT_LIMITS.sourceLocation).nullable()
3786
+ }).strict();
3368
3787
  ({
3788
+ ...CLIENT_ERROR_REPORT_ENDPOINT_DEFINITIONS,
3789
+ ...PUBLIC_NEWSLETTER_ENDPOINT_DEFINITIONS,
3369
3790
  ...ACCOUNT_ENDPOINT_DEFINITIONS,
3370
3791
  ...PUBLIC_ONBOARDING_ATTEMPT_ENDPOINT_DEFINITIONS,
3371
3792
  ...PUBLIC_EVENT_ENDPOINT_DEFINITIONS,
3372
3793
  ...GIFTING_ENDPOINT_DEFINITIONS,
3373
3794
  ...PUBLIC_READ_ENDPOINT_DEFINITIONS,
3374
- ...BILLING_ENDPOINT_DEFINITIONS
3795
+ ...BILLING_ENDPOINT_DEFINITIONS,
3796
+ ...SITE_MANAGEMENT_ENDPOINT_DEFINITIONS
3375
3797
  }), 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, {
3376
3798
  ...NEWSLETTER_ENDPOINT_DEFINITIONS,
3377
3799
  ...APPOINTMENT_ENDPOINT_DEFINITIONS,
3378
3800
  ...EVENT_SERIES_REGISTRATION_ENDPOINT_DEFINITIONS
3379
- }, 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 };
3801
+ }, 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 };
3380
3802
  z.object({ refreshToken: z.string().min(1).max(4096) }).strict();
3381
3803
  z.object({
3382
3804
  accessToken: z.string().min(1).max(4096),
@@ -10088,6 +10510,15 @@ function asSiteStyleId(value) {
10088
10510
  function asDesignSystemTemplateId(value) {
10089
10511
  return brandNonEmptyString(value, "DesignSystemTemplateId");
10090
10512
  }
10513
+ function toNonEmptyReadonlyArray(values) {
10514
+ const [first, ...rest] = values;
10515
+ return first === void 0 ? null : [first, ...rest];
10516
+ }
10517
+ function requireNonEmptyReadonlyArray(values, message = "Expected a non-empty array.") {
10518
+ const result = toNonEmptyReadonlyArray(values);
10519
+ if (!result) throw new Error(message);
10520
+ return result;
10521
+ }
10091
10522
  function makeBoundaryId(previousBlockId, nextBlockId) {
10092
10523
  return asDesignBoundaryId(`boundary:${encodeURIComponent(previousBlockId)}:${encodeURIComponent(nextBlockId)}`);
10093
10524
  }
@@ -10290,16 +10721,18 @@ const themeV2RuntimeStyleFieldNames = [
10290
10721
  "_frameStyles",
10291
10722
  "_sectionStyles",
10292
10723
  "_containerStyles",
10293
- "_cardStyles",
10294
- "_transitionStyles",
10295
- "styleGroup"
10724
+ "_cardStyles"
10296
10725
  ];
10297
10726
  const themeV2BlockSpecificRawStyleFieldNames = [
10298
10727
  "_contentCardStyles",
10299
10728
  "_heroLayoutStyles",
10300
10729
  "_textCardStyles"
10301
10730
  ];
10302
- const themeV2NormalEditorRawStyleFieldNames = [...themeV2RuntimeStyleFieldNames, ...themeV2BlockSpecificRawStyleFieldNames];
10731
+ const themeV2NormalEditorRawStyleFieldNames = [
10732
+ ...themeV2RuntimeStyleFieldNames,
10733
+ ...themeV2BlockSpecificRawStyleFieldNames,
10734
+ "styleGroup"
10735
+ ];
10303
10736
  new Set(themeV2NormalEditorRawStyleFieldNames);
10304
10737
  [...themeV2RuntimeStyleFieldNames, ...themeV2BlockSpecificRawStyleFieldNames];
10305
10738
  const pageDesignEditorBackgroundOverrideOwner = "page-design-editor";
@@ -12025,11 +12458,260 @@ function cardRoleFromLegacyVocabulary(value) {
12025
12458
  */
12026
12459
  const cardRoleWithLegacyAliasSchema = z.preprocess((value) => cardRoleFromLegacyVocabulary(value) ?? value, cardRoleSchema);
12027
12460
  //#endregion
12028
- //#region ../theme-core/src/site-styles/compilationPlan.ts
12029
- const defaultHeaderBrandPreferences = {
12030
- brandDisplay: "auto",
12031
- logoSize: "auto"
12032
- };
12461
+ //#region ../theme-core/src/site-styles/transitionCatalogue.ts
12462
+ /**
12463
+ * Family order for pickers. Entries below are listed family by family in this
12464
+ * same order, so the flat option list and the grouped families agree.
12465
+ */
12466
+ const transitionCatalogueFamilies = [
12467
+ {
12468
+ id: "gradient",
12469
+ label: "Gradient"
12470
+ },
12471
+ {
12472
+ id: "wave",
12473
+ label: "Wave"
12474
+ },
12475
+ {
12476
+ id: "angle",
12477
+ label: "Angle"
12478
+ }
12479
+ ];
12480
+ const mediumHeight = "6rem + 2px";
12481
+ const compactHeight = "4.5rem + 2px";
12482
+ const largeHeight = "7rem + 2px";
12483
+ /**
12484
+ * The single source of transition vocabulary. Order is significant: it is the
12485
+ * order of `boundaryOptions` (after `none`) and of each family's variants,
12486
+ * which persisted pins, page-flow presets and the editor picker all rely on.
12487
+ *
12488
+ * Shapes match what `generateLayoutCss` draws today. Structured
12489
+ * amplitude/frequency treatments (issue 826) extend this list later.
12490
+ */
12491
+ const transitionCatalogueEntries = defineExactCatalog()([
12492
+ {
12493
+ intent: "soft-fade-short",
12494
+ optionId: asBoundaryOptionId("break:soft"),
12495
+ family: "gradient",
12496
+ variantId: "soft",
12497
+ label: "Soft",
12498
+ variantLabel: "Soft",
12499
+ treatment: {
12500
+ kind: "soft-fade",
12501
+ height: "medium",
12502
+ curve: "soft"
12503
+ },
12504
+ size: "medium",
12505
+ heightExpression: mediumHeight,
12506
+ shape: { kind: "fade" }
12507
+ },
12508
+ {
12509
+ intent: "soft-fade-long",
12510
+ optionId: asBoundaryOptionId("break:spacious"),
12511
+ family: "gradient",
12512
+ variantId: "spacious",
12513
+ label: "Spacious",
12514
+ variantLabel: "Spacious",
12515
+ treatment: {
12516
+ kind: "soft-fade",
12517
+ height: "large",
12518
+ curve: "spacious"
12519
+ },
12520
+ size: "spacious",
12521
+ heightExpression: "10rem",
12522
+ shape: { kind: "fade" }
12523
+ },
12524
+ {
12525
+ intent: "soft-fade-expansive",
12526
+ optionId: asBoundaryOptionId("break:expansive"),
12527
+ family: "gradient",
12528
+ variantId: "expansive",
12529
+ label: "Expansive",
12530
+ variantLabel: "Expansive",
12531
+ treatment: {
12532
+ kind: "soft-fade",
12533
+ height: "expansive",
12534
+ curve: "expansive"
12535
+ },
12536
+ size: "expansive",
12537
+ heightExpression: "14rem",
12538
+ shape: { kind: "fade" }
12539
+ },
12540
+ {
12541
+ intent: "wave-edge-balanced",
12542
+ optionId: asBoundaryOptionId("break:wave-balanced"),
12543
+ family: "wave",
12544
+ variantId: "balanced",
12545
+ label: "Balanced wave",
12546
+ variantLabel: "Balanced",
12547
+ treatment: {
12548
+ kind: "wave-edge",
12549
+ height: "medium",
12550
+ amplitude: "balanced",
12551
+ rhythm: "double",
12552
+ symmetry: "symmetrical"
12553
+ },
12554
+ size: "medium",
12555
+ heightExpression: mediumHeight,
12556
+ shape: {
12557
+ kind: "wave",
12558
+ mask: "balanced"
12559
+ }
12560
+ },
12561
+ {
12562
+ intent: "wave-edge",
12563
+ optionId: asBoundaryOptionId("break:wave"),
12564
+ family: "wave",
12565
+ variantId: "classic",
12566
+ label: "Classic wave",
12567
+ variantLabel: "Classic",
12568
+ treatment: {
12569
+ kind: "wave-edge",
12570
+ height: "medium",
12571
+ amplitude: "balanced",
12572
+ rhythm: "double",
12573
+ symmetry: "asymmetrical"
12574
+ },
12575
+ size: "medium",
12576
+ heightExpression: mediumHeight,
12577
+ shape: {
12578
+ kind: "wave",
12579
+ mask: "classic"
12580
+ }
12581
+ },
12582
+ {
12583
+ intent: "wave-edge-gentle",
12584
+ optionId: asBoundaryOptionId("break:wave-gentle"),
12585
+ family: "wave",
12586
+ variantId: "gentle",
12587
+ label: "Gentle wave",
12588
+ variantLabel: "Gentle",
12589
+ treatment: {
12590
+ kind: "wave-edge",
12591
+ height: "compact",
12592
+ amplitude: "subtle",
12593
+ rhythm: "single",
12594
+ symmetry: "symmetrical"
12595
+ },
12596
+ size: "compact",
12597
+ heightExpression: compactHeight,
12598
+ shape: {
12599
+ kind: "wave",
12600
+ mask: "gentle"
12601
+ }
12602
+ },
12603
+ {
12604
+ intent: "wave-edge-bold",
12605
+ optionId: asBoundaryOptionId("break:wave-bold"),
12606
+ family: "wave",
12607
+ variantId: "bold",
12608
+ label: "Bold wave",
12609
+ variantLabel: "Bold",
12610
+ treatment: {
12611
+ kind: "wave-edge",
12612
+ height: "large",
12613
+ amplitude: "bold",
12614
+ rhythm: "double",
12615
+ symmetry: "symmetrical"
12616
+ },
12617
+ size: "large",
12618
+ heightExpression: largeHeight,
12619
+ shape: {
12620
+ kind: "wave",
12621
+ mask: "bold"
12622
+ }
12623
+ },
12624
+ {
12625
+ intent: "wave-edge-drift",
12626
+ optionId: asBoundaryOptionId("break:wave-drift"),
12627
+ family: "wave",
12628
+ variantId: "drift",
12629
+ label: "Drift wave",
12630
+ variantLabel: "Drift",
12631
+ treatment: {
12632
+ kind: "wave-edge",
12633
+ height: "medium",
12634
+ amplitude: "balanced",
12635
+ rhythm: "double",
12636
+ symmetry: "drift"
12637
+ },
12638
+ size: "medium",
12639
+ heightExpression: mediumHeight,
12640
+ shape: {
12641
+ kind: "wave",
12642
+ mask: "drift"
12643
+ }
12644
+ },
12645
+ {
12646
+ intent: "angle-edge-subtle",
12647
+ optionId: asBoundaryOptionId("break:angle-subtle"),
12648
+ family: "angle",
12649
+ variantId: "subtle",
12650
+ label: "Subtle angle",
12651
+ variantLabel: "Subtle",
12652
+ treatment: {
12653
+ kind: "angle-edge",
12654
+ height: "compact",
12655
+ slope: "subtle",
12656
+ direction: "forward"
12657
+ },
12658
+ size: "compact",
12659
+ heightExpression: compactHeight,
12660
+ shape: {
12661
+ kind: "angle",
12662
+ polygon: {
12663
+ startTopPercent: 34,
12664
+ endTopPercent: 18
12665
+ }
12666
+ }
12667
+ },
12668
+ {
12669
+ intent: "angle-edge",
12670
+ optionId: asBoundaryOptionId("break:angle-balanced"),
12671
+ family: "angle",
12672
+ variantId: "balanced",
12673
+ label: "Balanced angle",
12674
+ variantLabel: "Balanced",
12675
+ treatment: {
12676
+ kind: "angle-edge",
12677
+ height: "medium",
12678
+ slope: "balanced",
12679
+ direction: "forward"
12680
+ },
12681
+ size: "medium",
12682
+ heightExpression: mediumHeight,
12683
+ shape: {
12684
+ kind: "angle",
12685
+ polygon: {
12686
+ startTopPercent: 42,
12687
+ endTopPercent: 8
12688
+ }
12689
+ }
12690
+ },
12691
+ {
12692
+ intent: "angle-edge-steep",
12693
+ optionId: asBoundaryOptionId("break:angle-steep"),
12694
+ family: "angle",
12695
+ variantId: "steep",
12696
+ label: "Steep angle",
12697
+ variantLabel: "Steep",
12698
+ treatment: {
12699
+ kind: "angle-edge",
12700
+ height: "large",
12701
+ slope: "steep",
12702
+ direction: "forward"
12703
+ },
12704
+ size: "large",
12705
+ heightExpression: largeHeight,
12706
+ shape: {
12707
+ kind: "angle",
12708
+ polygon: {
12709
+ startTopPercent: 54,
12710
+ endTopPercent: 0
12711
+ }
12712
+ }
12713
+ }
12714
+ ]);
12033
12715
  //#endregion
12034
12716
  //#region ../theme-core/src/site-styles/sectionTransitions.ts
12035
12717
  function boundaryRuntimeMetrics(family, size, heightExpression) {
@@ -12040,42 +12722,106 @@ function boundaryRuntimeMetrics(family, size, heightExpression) {
12040
12722
  reserveCss: `calc((${heightExpression}) / 2)`
12041
12723
  };
12042
12724
  }
12043
- 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");
12725
+ new Map(transitionCatalogueEntries.map((entry) => [entry.intent, entry]));
12726
+ new Map(transitionCatalogueEntries.map((entry) => [entry.intent, boundaryRuntimeMetrics(entry.family, entry.size, entry.heightExpression)]));
12727
+ /**
12728
+ * The catalogue's compile-time coverage check guarantees an entry per
12729
+ * decorative intent, so a miss here is a broken invariant, not bad input.
12730
+ */
12731
+ function requireCatalogueValue(values, intent) {
12732
+ const value = values.get(intent);
12733
+ if (value === void 0) throw new Error(`Transition catalogue has no entry for ${intent}`);
12734
+ return value;
12735
+ }
12044
12736
  const noneBoundaryOption = {
12045
12737
  id: asBoundaryOptionId("break:none"),
12046
12738
  label: "None",
12047
12739
  transitionAfter: "none",
12048
12740
  treatment: { kind: "none" }
12049
12741
  };
12050
- const softBoundaryOption = {
12051
- id: asBoundaryOptionId("break:soft"),
12052
- label: "Soft",
12053
- transitionAfter: "soft-fade-short",
12054
- treatment: {
12055
- kind: "soft-fade",
12056
- height: "medium",
12057
- curve: "soft"
12058
- }
12742
+ const boundaryOptionByIntent = new Map(transitionCatalogueEntries.map((entry) => [entry.intent, {
12743
+ id: entry.optionId,
12744
+ label: entry.label,
12745
+ transitionAfter: entry.intent,
12746
+ treatment: entry.treatment
12747
+ }]));
12748
+ function boundaryOptionForTransitionIntent(intent) {
12749
+ return requireCatalogueValue(boundaryOptionByIntent, intent);
12750
+ }
12751
+ const softBoundaryOption = boundaryOptionForTransitionIntent("soft-fade-short");
12752
+ const spaciousBoundaryOption = boundaryOptionForTransitionIntent("soft-fade-long");
12753
+ boundaryOptionForTransitionIntent("soft-fade-expansive");
12754
+ boundaryOptionForTransitionIntent("wave-edge");
12755
+ boundaryOptionForTransitionIntent("wave-edge-balanced");
12756
+ boundaryOptionForTransitionIntent("wave-edge-gentle");
12757
+ boundaryOptionForTransitionIntent("wave-edge-bold");
12758
+ boundaryOptionForTransitionIntent("wave-edge-drift");
12759
+ boundaryOptionForTransitionIntent("angle-edge-subtle");
12760
+ boundaryOptionForTransitionIntent("angle-edge");
12761
+ boundaryOptionForTransitionIntent("angle-edge-steep");
12762
+ /**
12763
+ * Must remain non-empty; downstream code indexes `[0]` as the documented default.
12764
+ */
12765
+ const boundaryOptions = [noneBoundaryOption, ...transitionCatalogueEntries.map((entry) => boundaryOptionForTransitionIntent(entry.intent))];
12766
+ const noneTransitionVariant = {
12767
+ familyId: "none",
12768
+ variantId: "none",
12769
+ label: "None",
12770
+ boundaryOption: noneBoundaryOption
12059
12771
  };
12060
- const spaciousBoundaryOption = {
12061
- id: asBoundaryOptionId("break:spacious"),
12062
- label: "Spacious",
12063
- transitionAfter: "soft-fade-long",
12064
- treatment: {
12065
- kind: "soft-fade",
12066
- height: "large",
12067
- curve: "spacious"
12068
- }
12772
+ function transitionVariantForEntry(entry) {
12773
+ return {
12774
+ familyId: entry.family,
12775
+ variantId: entry.variantId,
12776
+ label: entry.variantLabel,
12777
+ boundaryOption: boundaryOptionForTransitionIntent(entry.intent)
12778
+ };
12779
+ }
12780
+ const sectionTransitionFamilies = [{
12781
+ id: "none",
12782
+ label: "None",
12783
+ variants: [noneTransitionVariant]
12784
+ }, ...transitionCatalogueFamilies.map((family) => ({
12785
+ id: family.id,
12786
+ label: family.label,
12787
+ variants: requireNonEmptyReadonlyArray(transitionCatalogueEntries.filter((entry) => entry.family === family.id).map(transitionVariantForEntry), `Transition family ${family.id} has no catalogue entries.`)
12788
+ }))];
12789
+ new Map(boundaryOptions.map((option) => [option.id, option]));
12790
+ new Map(boundaryOptions.map((option) => [stableTreatmentKey(option.treatment), option]));
12791
+ new Map(sectionTransitionFamilies.flatMap((family) => family.variants.map((variant) => [variant.boundaryOption.id, variant])));
12792
+ new Map(sectionTransitionFamilies.map((family) => [family.id, family]));
12793
+ function stableTreatmentKey(treatment) {
12794
+ switch (treatment.kind) {
12795
+ case "none": return "none";
12796
+ case "soft-fade": return `${treatment.kind}:${treatment.height}:${treatment.curve}`;
12797
+ case "wave-edge": return [
12798
+ treatment.kind,
12799
+ treatment.height,
12800
+ treatment.amplitude,
12801
+ treatment.rhythm,
12802
+ treatment.symmetry
12803
+ ].join(":");
12804
+ case "angle-edge": return [
12805
+ treatment.kind,
12806
+ treatment.height,
12807
+ treatment.slope,
12808
+ treatment.direction
12809
+ ].join(":");
12810
+ case "legacy-unsupported": return `${treatment.kind}:${treatment.boundaryOptionId}`;
12811
+ }
12812
+ }
12813
+ requireThemeColorToken$1("background");
12814
+ function requireThemeColorToken$1(value) {
12815
+ const token = parseThemeColorToken(value);
12816
+ if (!token) throw new Error(`Expected a theme color token. Received: ${value}`);
12817
+ return token;
12818
+ }
12819
+ //#endregion
12820
+ //#region ../theme-core/src/site-styles/compilationPlan.ts
12821
+ const defaultHeaderBrandPreferences = {
12822
+ brandDisplay: "auto",
12823
+ logoSize: "auto"
12069
12824
  };
12070
- asBoundaryOptionId("break:expansive");
12071
- asBoundaryOptionId("break:wave");
12072
- asBoundaryOptionId("break:wave-balanced");
12073
- asBoundaryOptionId("break:wave-gentle");
12074
- asBoundaryOptionId("break:wave-bold");
12075
- asBoundaryOptionId("break:wave-drift");
12076
- asBoundaryOptionId("break:angle-subtle");
12077
- asBoundaryOptionId("break:angle-balanced");
12078
- asBoundaryOptionId("break:angle-steep");
12079
12825
  asBoundaryOptionId("break:unknown");
12080
12826
  const pageDesignUserPinnedAppearanceChoiceSchema = z.object({
12081
12827
  kind: z.literal("user-pinned"),
@@ -12202,14 +12948,11 @@ function validateUniquePageDesignPins(intent, ctx) {
12202
12948
  label: "block Look pin"
12203
12949
  });
12204
12950
  addDuplicateStringIssues(ctx, {
12205
- values: intent.boundaryPins.map((pin) => boundaryKey(pin.previousBlockId, pin.nextBlockId)),
12951
+ values: intent.boundaryPins.map((pin) => makeBoundaryId(pin.previousBlockId, pin.nextBlockId)),
12206
12952
  path: ["boundaryPins"],
12207
12953
  label: "boundary pin"
12208
12954
  });
12209
12955
  }
12210
- function boundaryKey(previousBlockId, nextBlockId) {
12211
- return makeBoundaryId(previousBlockId, nextBlockId);
12212
- }
12213
12956
  //#endregion
12214
12957
  //#region ../theme-core/src/accordions/siteStyleDefaults.ts
12215
12958
  /**
@@ -13837,6 +14580,13 @@ z.object({
13837
14580
  fields: nonEmptyRuntimeStyleFieldNamesSchema,
13838
14581
  authority: styleAuthoritySchema
13839
14582
  }).strict();
14583
+ asPageFlowPresetId("flow:quiet"), noneBoundaryOption.id, asPageFlowPresetId("flow:balanced"), softBoundaryOption.id, asPageFlowPresetId("flow:expressive"), spaciousBoundaryOption.id;
14584
+ asPageFlowPresetId("generated-default");
14585
+ asSiteStyleId("site-style:south-west-twerk-school");
14586
+ asAppearancePresetId("hero-brand-scrim-fixed-frame");
14587
+ asLayoutVariantKey("classic");
14588
+ asLayoutVariantKey("micro");
14589
+ asBoundaryOptionId("break:wave");
13840
14590
  //#endregion
13841
14591
  //#region ../theme-core/src/site-styles/runtimeCompiler.ts
13842
14592
  function defineSectionForegroundRuntimeTokens(input) {
@@ -13860,7 +14610,7 @@ function defineComponentRuntimeRules(rules) {
13860
14610
  }
13861
14611
  /**
13862
14612
  * Default design rules translate semantic page-level choices into the current
13863
- * runtime's section background and transition style-group vocabulary.
14613
+ * runtime's section background vocabulary.
13864
14614
  */
13865
14615
  const defaultDesignRuntimeRules = defineDesignRuntimeRules({
13866
14616
  sectionSurfaces: {
@@ -13895,8 +14645,7 @@ const defaultDesignRuntimeRules = defineDesignRuntimeRules({
13895
14645
  color: "surface",
13896
14646
  opacity: .88
13897
14647
  }
13898
- },
13899
- transitionClassName: (transition, fromSurface, toSurface) => transition === "none" ? null : `site-style-transition-${transition}-from-${fromSurface}-to-${toSurface}`
14648
+ }
13900
14649
  });
13901
14650
  /**
13902
14651
  * Default component rules translate frame and item-surface semantics into the
@@ -15631,19 +16380,11 @@ const curatedSiteStyles = [
15631
16380
  })
15632
16381
  ];
15633
16382
  new Map(curatedSiteStyles.map((style) => [style.id, style]));
15634
- asPageFlowPresetId("generated-default");
15635
- asSiteStyleId("site-style:south-west-twerk-school");
15636
- asAppearancePresetId("hero-brand-scrim-fixed-frame");
15637
- asLayoutVariantKey("classic");
15638
- asLayoutVariantKey("micro");
15639
- asBoundaryOptionId("break:wave");
15640
- asPageFlowPresetId("flow:quiet"), noneBoundaryOption.id, asPageFlowPresetId("flow:balanced"), softBoundaryOption.id, asPageFlowPresetId("flow:expressive"), spaciousBoundaryOption.id;
15641
16383
  //#endregion
15642
16384
  //#region ../theme-core/src/site-styles/resolver.ts
15643
16385
  const blockDesignFallback = {
15644
16386
  sectionSurface: "base",
15645
16387
  contentFrame: plainFrame,
15646
- transitionAfter: "none",
15647
16388
  sectionHeight: "default",
15648
16389
  heroLegibility: "none",
15649
16390
  imageSurfaceTreatment: { kind: "none" },
@@ -15654,7 +16395,7 @@ const blockDesignFallback = {
15654
16395
  accordionIconTreatment: null,
15655
16396
  composition: null
15656
16397
  };
15657
- blockDesignFallback.sectionSurface, blockDesignFallback.contentFrame, blockDesignFallback.transitionAfter, blockDesignFallback.sectionHeight, blockDesignFallback.heroLegibility, blockDesignFallback.imageSurfaceTreatment, blockDesignFallback.imageSurfaceMotion, blockDesignFallback.tileTreatment, blockDesignFallback.eventListTreatment, blockDesignFallback.eyebrowTreatment, blockDesignFallback.accordionIconTreatment, blockDesignFallback.composition;
16398
+ blockDesignFallback.sectionSurface, blockDesignFallback.contentFrame, blockDesignFallback.sectionHeight, blockDesignFallback.heroLegibility, blockDesignFallback.imageSurfaceTreatment, blockDesignFallback.imageSurfaceMotion, blockDesignFallback.tileTreatment, blockDesignFallback.eventListTreatment, blockDesignFallback.eyebrowTreatment, blockDesignFallback.accordionIconTreatment, blockDesignFallback.composition;
15658
16399
  //#endregion
15659
16400
  //#region ../theme-core/src/site-styles/siteChromeBackgrounds.ts
15660
16401
  const siteChromeBackgroundColorTokens = toSiteChromeBackgroundColorTokens(backgroundAppearanceColorTokenNames);
@@ -16466,7 +17207,8 @@ const siteOptionSources = [
16466
17207
  "eventCategories",
16467
17208
  "eventSeries",
16468
17209
  "venues",
16469
- "staffMembers"
17210
+ "staffMembers",
17211
+ "appointmentServiceCategories"
16470
17212
  ];
16471
17213
  const mediaDeliverySchema = z.object({
16472
17214
  sizes: z.string().optional(),
@@ -25687,13 +26429,13 @@ const hours = stack({
25687
26429
  as: "p",
25688
26430
  className: "rb-caption rb-opacity-70"
25689
26431
  }, bind("module.timeZone"), when("module.timeZone"))], when("module.kind", { equals: "opening-hours" }));
25690
- const socials = inline({ className: "rb-flex rb-flex-wrap rb-gap-x-5 rb-gap-y-3" }, [link({
26432
+ const socials = inline({ className: "rb-footer-socials" }, [link({
25691
26433
  href: { $bind: { from: "social.href" } },
25692
26434
  target: "_blank",
25693
26435
  rel: "noreferrer noopener",
25694
26436
  "aria-label": { $bind: { from: "social.label" } },
25695
- className: "rb-nav-text transition-theme-standard"
25696
- }, [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" }));
26437
+ className: "rb-footer-social-link rb-nav-text transition-theme-standard"
26438
+ }, [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" }));
25697
26439
  const authoredCopy = richText({
25698
26440
  className: "rb-prose rb-prose-sm rb-max-w-none",
25699
26441
  style: textColorStyle("text/80")
@@ -27334,6 +28076,15 @@ const appointmentServicesBlockDefinition = {
27334
28076
  required: false,
27335
28077
  ui: { intent: "content" }
27336
28078
  },
28079
+ createSiteOptionSelectField({
28080
+ id: "categoryId",
28081
+ label: "Category",
28082
+ description: "Show one category (with its heading and intro), or leave it on All categories to show everything grouped.",
28083
+ required: false,
28084
+ multiple: false,
28085
+ optionSource: "appointmentServiceCategories",
28086
+ ui: { intent: "content" }
28087
+ }),
27337
28088
  sectionStylesField({
27338
28089
  id: "_sectionStyles",
27339
28090
  label: "Section styles",
@@ -27368,6 +28119,7 @@ const appointmentServicesBlockDefinition = {
27368
28119
  richText({ className: "rb-prose rb-max-w-none" }, bind("content.description"), when("content.description")),
27369
28120
  el("appointment-services", {
27370
28121
  sectionHeading: { $bind: { from: "content.heading" } },
28122
+ categoryId: { $bind: { from: "content.categoryId" } },
27371
28123
  services: { $bind: { from: "data.services" } },
27372
28124
  pathname: { $bind: { from: "$root.pathname" } },
27373
28125
  servicePathPrefix: { $bind: { from: "$root.appointmentServicePathPrefix" } }
@@ -27768,6 +28520,7 @@ const publicEventLoaderQuerySchemaShape = {
27768
28520
  seriesSlug: z.string().optional(),
27769
28521
  includeOccurrenceId: z.string().optional(),
27770
28522
  readIntent: z.string().optional(),
28523
+ detailAdmission: z.string().optional(),
27771
28524
  detailLevel: z.string().optional(),
27772
28525
  readProfile: z.string().optional()
27773
28526
  };
@@ -27934,11 +28687,11 @@ const publicEventBookingAvailabilitySchema = z.discriminatedUnion("kind", [z.obj
27934
28687
  "series_archived",
27935
28688
  "parent_archived",
27936
28689
  "parent_inconsistent",
27937
- "not_public",
27938
28690
  "already_started",
27939
28691
  "enrollment_closed"
27940
28692
  ])
27941
28693
  })]);
28694
+ const publicEventBookingClosedDetailSchema = z.discriminatedUnion("kind", [z.object({ kind: z.literal("opensSoon") }), z.object({ kind: z.literal("paused") })]);
27942
28695
  const publicRunSessionSchema = z.object({
27943
28696
  occurrenceId: z.string(),
27944
28697
  startsAt: z.string(),
@@ -27983,6 +28736,7 @@ const publicEventBaseSchema = z.object({
27983
28736
  destination: publicEventDestinationSchema,
27984
28737
  requiresRegistration: z.boolean(),
27985
28738
  bookingAvailability: publicEventBookingAvailabilitySchema,
28739
+ bookingClosedDetail: publicEventBookingClosedDetailSchema.optional(),
27986
28740
  deliveryMode: z.enum([
27987
28741
  "in_person",
27988
28742
  "online",
@@ -35646,6 +36400,11 @@ const mailingListContentVersionIdSchema = z.string().transform((value, ctx) => {
35646
36400
  });
35647
36401
  return z.NEVER;
35648
36402
  });
36403
+ const mailingListSignupBlockSourceRefSchema = z.object({
36404
+ tag: z.literal("block_ref"),
36405
+ blockId: mailingListSignupBlockIdSchema,
36406
+ contentVersionId: mailingListContentVersionIdSchema
36407
+ });
35649
36408
  const signedMailingListSourceTokenSchema = z.string().trim().min(1).transform(parseRequiredMailingListSignedSourceToken);
35650
36409
  const newsletterSourceCommonSchema = z.object({
35651
36410
  siteId: z.string().optional(),
@@ -35660,7 +36419,15 @@ const newsletterSourceSchema = z.discriminatedUnion("source", [
35660
36419
  newsletterSourceCommonSchema.extend({
35661
36420
  source: z.literal("block"),
35662
36421
  blockId: z.string().nullable().optional(),
35663
- contentVersionId: z.string().nullable().optional()
36422
+ newsletterBlockSubmission: z.discriminatedUnion("tag", [
36423
+ z.object({
36424
+ tag: z.literal("ready"),
36425
+ sourceRef: mailingListSignupBlockSourceRefSchema
36426
+ }),
36427
+ z.object({ tag: z.literal("unpublished-form") }),
36428
+ z.object({ tag: z.literal("unpublished-settings") }),
36429
+ z.object({ tag: z.literal("unavailable") })
36430
+ ])
35664
36431
  }),
35665
36432
  newsletterSourceCommonSchema.extend({
35666
36433
  source: z.literal("signed-footer"),
@@ -35689,11 +36456,7 @@ const newsletterHydrationSchema = z.object({
35689
36456
  target: z.discriminatedUnion("tag", [
35690
36457
  z.object({
35691
36458
  tag: z.literal("block-source"),
35692
- sourceRef: z.object({
35693
- tag: z.literal("block_ref"),
35694
- blockId: mailingListSignupBlockIdSchema,
35695
- contentVersionId: mailingListContentVersionIdSchema
35696
- }).nullable()
36459
+ sourceRef: mailingListSignupBlockSourceRefSchema.nullable()
35697
36460
  }),
35698
36461
  z.object({
35699
36462
  tag: z.literal("signed-footer-source"),
@@ -35702,7 +36465,11 @@ const newsletterHydrationSchema = z.object({
35702
36465
  token: signedMailingListSourceTokenSchema
35703
36466
  })
35704
36467
  }),
35705
- z.object({ tag: z.literal("preview") })
36468
+ z.object({ tag: z.literal("preview") }),
36469
+ z.object({
36470
+ tag: z.literal("unpublished-preview"),
36471
+ reason: z.enum(["unpublished-form", "unpublished-settings"])
36472
+ })
35706
36473
  ]),
35707
36474
  setupRevision: z.number().int().positive().nullable(),
35708
36475
  choiceProvider: z.enum([
@@ -35771,16 +36538,21 @@ const newsletterFormBlockRuntime = defineProgressiveBlockRuntime({
35771
36538
  });
35772
36539
  function projectNewsletterFormHydrationTarget(source) {
35773
36540
  switch (source.source) {
35774
- case "block": {
35775
- const sourceRef = buildMailingListSignupBlockSourceRef(source.blockId, source.contentVersionId);
35776
- if (sourceRef?.tag === "block_ref") return {
36541
+ case "block": switch (source.newsletterBlockSubmission.tag) {
36542
+ case "unpublished-form":
36543
+ case "unpublished-settings": return {
36544
+ tag: "unpublished-preview",
36545
+ reason: source.newsletterBlockSubmission.tag
36546
+ };
36547
+ case "ready": return {
35777
36548
  tag: "block-source",
35778
- sourceRef
36549
+ sourceRef: source.newsletterBlockSubmission.sourceRef
35779
36550
  };
35780
- return {
36551
+ case "unavailable": return {
35781
36552
  tag: "block-source",
35782
36553
  sourceRef: null
35783
36554
  };
36555
+ default: return assertNever$2(source.newsletterBlockSubmission);
35784
36556
  }
35785
36557
  case "signed-footer": return {
35786
36558
  tag: "signed-footer-source",
@@ -38333,6 +39105,46 @@ z.object({ acceptExtraSiteCharge: z.boolean().optional() });
38333
39105
  //#region ../surfaces/src/index.ts
38334
39106
  const SURFACE_IDS = ["core", "macadamia"];
38335
39107
  const DEFAULT_SURFACE_ID = "core";
39108
+ /**
39109
+ * Root hosts for each surface, keyed by deployment tier. The tier-keyed shape
39110
+ * makes it impossible to mis-order entries: callers like
39111
+ * `buildSurfaceAwareDashboardOriginForSurfaceId` look up by tier directly
39112
+ * rather than relying on positional alignment between arrays.
39113
+ */
39114
+ const SURFACE_ROOT_HOSTS = {
39115
+ core: {
39116
+ local: "localhost",
39117
+ prod: "riverbankcms.com"
39118
+ },
39119
+ macadamia: {
39120
+ local: "macadamia.localhost",
39121
+ prod: "macadamia.studio"
39122
+ }
39123
+ };
39124
+ const SURFACE_SITE_ROOT_HOSTS = {
39125
+ core: {
39126
+ local: "localhost",
39127
+ prod: "riverbanksites.com"
39128
+ },
39129
+ macadamia: {
39130
+ local: "macadamia.localhost",
39131
+ prod: "macadamia.studio"
39132
+ }
39133
+ };
39134
+ const SURFACE_SITE_ROOT_HOST_ALIASES = { core: { prod: ["preview.riverbanksites.com"] } };
39135
+ function surfaceHostTableValues(table) {
39136
+ return Object.values(table).flatMap((byTier) => Object.values(byTier).flat());
39137
+ }
39138
+ function siteSlugLabelUnderRoot(host, siteRootHost) {
39139
+ if (!host.endsWith(`.${siteRootHost}`)) return [];
39140
+ return host.slice(0, host.length - siteRootHost.length - 1).split(".").slice(-1);
39141
+ }
39142
+ function deriveSurfaceOwnedSiteSlugs() {
39143
+ const siteRootHosts = [...surfaceHostTableValues(SURFACE_SITE_ROOT_HOSTS), ...surfaceHostTableValues(SURFACE_SITE_ROOT_HOST_ALIASES)];
39144
+ const labels = [...surfaceHostTableValues(SURFACE_ROOT_HOSTS), ...siteRootHosts].flatMap((host) => siteRootHosts.flatMap((root) => siteSlugLabelUnderRoot(host, root)));
39145
+ return [...new Set(labels)].sort();
39146
+ }
39147
+ deriveSurfaceOwnedSiteSlugs();
38336
39148
  [...SURFACE_IDS.filter((surfaceId) => surfaceId !== DEFAULT_SURFACE_ID)];
38337
39149
  //#endregion
38338
39150
  //#region ../api/src/accountApi.ts
@@ -38715,7 +39527,12 @@ const appointmentSetupServiceDraftSchema = z.object({
38715
39527
  venue: appointmentSetupVenueChoiceSchema,
38716
39528
  timezone: z.string().trim().min(1).nullable(),
38717
39529
  payment: appointmentSetupPaymentDraftSchema,
38718
- assignment: appointmentSetupServiceAssignmentDraftSchema
39530
+ assignment: appointmentSetupServiceAssignmentDraftSchema,
39531
+ /**
39532
+ * The service's category, or null for "Other" (issue 1403). Omitted leaves
39533
+ * an existing service's category alone and puts a new one in "Other".
39534
+ */
39535
+ categoryId: z.string().uuid().nullable().optional()
38719
39536
  }).superRefine((service, ctx) => {
38720
39537
  if (service.payment.kind !== "free" && (service.priceAmount === null || service.priceAmount <= 0)) ctx.addIssue({
38721
39538
  code: "custom",
@@ -38929,6 +39746,7 @@ function collectText(node) {
38929
39746
  if (node.type === "text") return node.text ?? "";
38930
39747
  return (node.content ?? []).map(collectText).join("");
38931
39748
  }
39749
+ z.enum(["public", "unlisted"], { error: "visibility must be 'public' or 'unlisted'" });
38932
39750
  //#endregion
38933
39751
  //#region ../api/src/bookingPaymentTermSchemas.ts
38934
39752
  const bookingDepositRefundPolicySchema = z.enum(["refundable", "non_refundable"]);