@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
@@ -899,15 +899,6 @@ function parseMailingListContentVersionId(value) {
899
899
  const parsed = parseContentVersionId(value);
900
900
  return parsed.ok ? parsed.value : null;
901
901
  }
902
- function buildMailingListSignupBlockSourceRef(blockId, contentVersionId) {
903
- const parsedBlockId = parseMailingListBlockId(blockId);
904
- const parsedContentVersionId = parseMailingListContentVersionId(contentVersionId);
905
- return parsedBlockId !== null && parsedContentVersionId !== null ? {
906
- tag: "block_ref",
907
- blockId: parsedBlockId,
908
- contentVersionId: parsedContentVersionId
909
- } : null;
910
- }
911
902
  //#endregion
912
903
  //#region ../core/src/secret.ts
913
904
  /**
@@ -6705,6 +6696,15 @@ function asSiteStyleId(value) {
6705
6696
  function asDesignSystemTemplateId(value) {
6706
6697
  return brandNonEmptyString(value, "DesignSystemTemplateId");
6707
6698
  }
6699
+ function toNonEmptyReadonlyArray(values) {
6700
+ const [first, ...rest] = values;
6701
+ return first === void 0 ? null : [first, ...rest];
6702
+ }
6703
+ function requireNonEmptyReadonlyArray(values, message = "Expected a non-empty array.") {
6704
+ const result = toNonEmptyReadonlyArray(values);
6705
+ if (!result) throw new Error(message);
6706
+ return result;
6707
+ }
6708
6708
  function makeBoundaryId(previousBlockId, nextBlockId) {
6709
6709
  return asDesignBoundaryId(`boundary:${encodeURIComponent(previousBlockId)}:${encodeURIComponent(nextBlockId)}`);
6710
6710
  }
@@ -6907,16 +6907,18 @@ const themeV2RuntimeStyleFieldNames = [
6907
6907
  "_frameStyles",
6908
6908
  "_sectionStyles",
6909
6909
  "_containerStyles",
6910
- "_cardStyles",
6911
- "_transitionStyles",
6912
- "styleGroup"
6910
+ "_cardStyles"
6913
6911
  ];
6914
6912
  const themeV2BlockSpecificRawStyleFieldNames = [
6915
6913
  "_contentCardStyles",
6916
6914
  "_heroLayoutStyles",
6917
6915
  "_textCardStyles"
6918
6916
  ];
6919
- const themeV2NormalEditorRawStyleFieldNames = [...themeV2RuntimeStyleFieldNames, ...themeV2BlockSpecificRawStyleFieldNames];
6917
+ const themeV2NormalEditorRawStyleFieldNames = [
6918
+ ...themeV2RuntimeStyleFieldNames,
6919
+ ...themeV2BlockSpecificRawStyleFieldNames,
6920
+ "styleGroup"
6921
+ ];
6920
6922
  new Set(themeV2NormalEditorRawStyleFieldNames);
6921
6923
  [...themeV2RuntimeStyleFieldNames, ...themeV2BlockSpecificRawStyleFieldNames];
6922
6924
  const pageDesignEditorBackgroundOverrideOwner = "page-design-editor";
@@ -8051,6 +8053,7 @@ const publicEventLoaderQuerySchemaShape = {
8051
8053
  seriesSlug: z.string().optional(),
8052
8054
  includeOccurrenceId: z.string().optional(),
8053
8055
  readIntent: z.string().optional(),
8056
+ detailAdmission: z.string().optional(),
8054
8057
  detailLevel: z.string().optional(),
8055
8058
  readProfile: z.string().optional()
8056
8059
  };
@@ -8217,11 +8220,11 @@ const publicEventBookingAvailabilitySchema = z.discriminatedUnion("kind", [z.obj
8217
8220
  "series_archived",
8218
8221
  "parent_archived",
8219
8222
  "parent_inconsistent",
8220
- "not_public",
8221
8223
  "already_started",
8222
8224
  "enrollment_closed"
8223
8225
  ])
8224
8226
  })]);
8227
+ const publicEventBookingClosedDetailSchema = z.discriminatedUnion("kind", [z.object({ kind: z.literal("opensSoon") }), z.object({ kind: z.literal("paused") })]);
8225
8228
  const publicRunSessionSchema = z.object({
8226
8229
  occurrenceId: z.string(),
8227
8230
  startsAt: z.string(),
@@ -8266,6 +8269,7 @@ const publicEventBaseSchema = z.object({
8266
8269
  destination: publicEventDestinationSchema,
8267
8270
  requiresRegistration: z.boolean(),
8268
8271
  bookingAvailability: publicEventBookingAvailabilitySchema,
8272
+ bookingClosedDetail: publicEventBookingClosedDetailSchema.optional(),
8269
8273
  deliveryMode: z.enum([
8270
8274
  "in_person",
8271
8275
  "online",
@@ -8550,6 +8554,75 @@ const calendarWindowPageSchema = z.discriminatedUnion("kind", [z.object({
8550
8554
  nextCursor: calendarSourceCursorSchema
8551
8555
  })]);
8552
8556
  //#endregion
8557
+ //#region ../api/src/defineEndpointDefinitions.ts
8558
+ /**
8559
+ * Validates extracted endpoint descriptors while preserving each literal path,
8560
+ * method, and parameter contract for the typed URL builders.
8561
+ */
8562
+ function defineEndpointDefinitions(definitions) {
8563
+ return definitions;
8564
+ }
8565
+ //#endregion
8566
+ //#region ../api/src/publicNewsletterEndpointDefinitions.ts
8567
+ const PUBLIC_NEWSLETTER_ENDPOINT_DEFINITIONS = defineEndpointDefinitions({
8568
+ subscribeNewsletter: {
8569
+ path: "/public/sites/{siteId}/newsletter/subscribe",
8570
+ method: "POST",
8571
+ tags: ["public-newsletter-{siteId}"],
8572
+ auth: "public",
8573
+ responseKind: "json"
8574
+ },
8575
+ confirmNewsletter: {
8576
+ path: "/public/sites/{siteId}/newsletter/confirm/{token}",
8577
+ method: "GET",
8578
+ tags: ["public-newsletter-{siteId}"],
8579
+ auth: "public",
8580
+ responseKind: "text"
8581
+ },
8582
+ unsubscribeNewsletter: {
8583
+ path: "/public/sites/{siteId}/newsletter/unsubscribe/{token}",
8584
+ method: "GET",
8585
+ tags: ["public-newsletter-{siteId}"],
8586
+ auth: "public",
8587
+ responseKind: "text"
8588
+ },
8589
+ unsubscribeNewsletterPost: {
8590
+ path: "/public/sites/{siteId}/newsletter/unsubscribe/{token}",
8591
+ method: "POST",
8592
+ tags: ["public-newsletter-{siteId}"],
8593
+ auth: "public",
8594
+ responseKind: "text"
8595
+ },
8596
+ confirmNewsletterPost: {
8597
+ path: "/public/sites/{siteId}/newsletter/confirm/{token}",
8598
+ method: "POST",
8599
+ tags: ["public-newsletter-{siteId}"],
8600
+ auth: "public",
8601
+ responseKind: "text"
8602
+ },
8603
+ getNewsletterPreferences: {
8604
+ path: "/public/sites/{siteId}/newsletter/preferences/{token}",
8605
+ method: "GET",
8606
+ tags: ["public-newsletter-{siteId}"],
8607
+ auth: "public",
8608
+ responseKind: "text"
8609
+ },
8610
+ saveNewsletterPreferences: {
8611
+ path: "/public/sites/{siteId}/newsletter/preferences/{token}",
8612
+ method: "POST",
8613
+ tags: ["public-newsletter-{siteId}"],
8614
+ auth: "public",
8615
+ responseKind: "text"
8616
+ },
8617
+ getNewsletterArchive: {
8618
+ path: "/public/sites/{siteId}/newsletter/archive/{token}",
8619
+ method: "GET",
8620
+ tags: ["public-newsletter-{siteId}"],
8621
+ auth: "public",
8622
+ responseKind: "text"
8623
+ }
8624
+ });
8625
+ //#endregion
8553
8626
  //#region ../api/src/apiEndpointTypes.ts
8554
8627
  function allowedDemoMutationPolicy() {
8555
8628
  return {
@@ -8641,17 +8714,85 @@ const SDK_ENTRY_READ_ENDPOINTS = {
8641
8714
  }
8642
8715
  };
8643
8716
  //#endregion
8644
- //#region ../api/src/defineEndpointDefinitions.ts
8645
- /**
8646
- * Validates extracted endpoint descriptors while preserving each literal path,
8647
- * method, and parameter contract for the typed URL builders.
8648
- */
8649
- function defineEndpointDefinitions(definitions) {
8650
- return definitions;
8651
- }
8652
- //#endregion
8653
8717
  //#region ../api/src/appointmentEndpointDefinitions.ts
8654
8718
  const APPOINTMENT_ENDPOINT_DEFINITIONS = defineEndpointDefinitions({
8719
+ ...defineEndpointDefinitions({
8720
+ listGroupedAppointmentServices: {
8721
+ path: "/sites/{siteId}/bookings/services/grouped",
8722
+ method: "GET",
8723
+ auth: "user",
8724
+ responseKind: "json",
8725
+ errors: ["server:internal_error"]
8726
+ },
8727
+ reorderAppointmentServices: {
8728
+ path: "/sites/{siteId}/bookings/services/order",
8729
+ method: "PUT",
8730
+ auth: "user",
8731
+ responseKind: "json",
8732
+ errors: [
8733
+ "validation:invalid_input",
8734
+ "auth:forbidden",
8735
+ "resource:not_found",
8736
+ "resource:conflict",
8737
+ "server:internal_error"
8738
+ ]
8739
+ },
8740
+ listAppointmentServiceCategories: {
8741
+ path: "/sites/{siteId}/bookings/service-categories",
8742
+ method: "GET",
8743
+ auth: "user",
8744
+ responseKind: "json",
8745
+ errors: ["server:internal_error"]
8746
+ },
8747
+ createAppointmentServiceCategory: {
8748
+ path: "/sites/{siteId}/bookings/service-categories",
8749
+ method: "POST",
8750
+ auth: "user",
8751
+ responseKind: "json",
8752
+ errors: [
8753
+ "validation:invalid_input",
8754
+ "auth:forbidden",
8755
+ "resource:conflict",
8756
+ "server:internal_error"
8757
+ ]
8758
+ },
8759
+ updateAppointmentServiceCategory: {
8760
+ path: "/sites/{siteId}/bookings/service-categories/{categoryId}",
8761
+ method: "PUT",
8762
+ auth: "user",
8763
+ responseKind: "json",
8764
+ errors: [
8765
+ "validation:invalid_input",
8766
+ "auth:forbidden",
8767
+ "resource:not_found",
8768
+ "resource:conflict",
8769
+ "server:internal_error"
8770
+ ]
8771
+ },
8772
+ deleteAppointmentServiceCategory: {
8773
+ path: "/sites/{siteId}/bookings/service-categories/{categoryId}",
8774
+ method: "DELETE",
8775
+ auth: "user",
8776
+ responseKind: "json",
8777
+ errors: [
8778
+ "auth:forbidden",
8779
+ "resource:not_found",
8780
+ "server:internal_error"
8781
+ ]
8782
+ },
8783
+ reorderAppointmentServiceCategories: {
8784
+ path: "/sites/{siteId}/bookings/service-categories/order",
8785
+ method: "PUT",
8786
+ auth: "user",
8787
+ responseKind: "json",
8788
+ errors: [
8789
+ "validation:invalid_input",
8790
+ "auth:forbidden",
8791
+ "resource:conflict",
8792
+ "server:internal_error"
8793
+ ]
8794
+ }
8795
+ }),
8655
8796
  listAppointmentResources: {
8656
8797
  path: "/sites/{siteId}/bookings/resources",
8657
8798
  method: "GET",
@@ -9362,6 +9503,13 @@ const EVENT_SERIES_REGISTRATION_ENDPOINT_DEFINITIONS = defineEndpointDefinitions
9362
9503
  errors: [],
9363
9504
  responseKind: "blob"
9364
9505
  },
9506
+ exportEventOfferingRegistrationsCsv: {
9507
+ path: "/sites/{siteId}/bookings/event-offerings/{eventOfferingId}/registrations/export.csv",
9508
+ method: "GET",
9509
+ auth: "user",
9510
+ errors: [],
9511
+ responseKind: "blob"
9512
+ },
9365
9513
  updateEventSeriesRegistration: {
9366
9514
  path: "/sites/{siteId}/bookings/event-series/{seriesId}/registrations/{registrationId}",
9367
9515
  method: "PATCH",
@@ -9372,6 +9520,19 @@ const EVENT_SERIES_REGISTRATION_ENDPOINT_DEFINITIONS = defineEndpointDefinitions
9372
9520
  "resource:not_found",
9373
9521
  "server:internal_error"
9374
9522
  ]
9523
+ },
9524
+ saveEventSeriesRegistrationAnswers: {
9525
+ path: "/sites/{siteId}/bookings/event-series/{seriesId}/registrations/{registrationId}/answers",
9526
+ method: "PUT",
9527
+ auth: "user",
9528
+ responseKind: "json",
9529
+ errors: [
9530
+ "validation:invalid_input",
9531
+ "auth:forbidden",
9532
+ "resource:not_found",
9533
+ "resource:conflict",
9534
+ "server:internal_error"
9535
+ ]
9375
9536
  }
9376
9537
  });
9377
9538
  //#endregion
@@ -9792,46 +9953,185 @@ const NEWSLETTER_ENDPOINT_DEFINITIONS = defineEndpointDefinitions({
9792
9953
  responseKind: "json",
9793
9954
  demoMutation: DEMO_MUTATION_BLOCKED_HIDDEN
9794
9955
  },
9795
- testSendNewsletterCampaign: {
9796
- path: "/sites/{siteId}/newsletter/campaigns/{campaignId}/test-send",
9956
+ scheduleNewsletterCampaign: {
9957
+ path: "/sites/{siteId}/newsletter/campaigns/{campaignId}/schedule",
9797
9958
  method: "POST",
9798
9959
  tags: [TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter],
9799
9960
  auth: "user",
9800
9961
  responseKind: "json",
9801
9962
  demoMutation: DEMO_MUTATION_BLOCKED_HIDDEN
9802
9963
  },
9803
- listNewsletterSendJobs: {
9804
- path: "/sites/{siteId}/newsletter/jobs",
9805
- method: "GET",
9964
+ unscheduleNewsletterCampaign: {
9965
+ path: "/sites/{siteId}/newsletter/campaigns/{campaignId}/unschedule",
9966
+ method: "POST",
9967
+ tags: [TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter],
9968
+ auth: "user",
9969
+ responseKind: "json",
9970
+ demoMutation: DEMO_MUTATION_BLOCKED_HIDDEN
9971
+ },
9972
+ stopNewsletterCampaign: {
9973
+ path: "/sites/{siteId}/newsletter/campaigns/{campaignId}/stop",
9974
+ method: "POST",
9806
9975
  tags: [TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter],
9807
9976
  auth: "user",
9977
+ responseKind: "json",
9978
+ demoMutation: DEMO_MUTATION_BLOCKED_HIDDEN
9979
+ },
9980
+ testSendNewsletterCampaign: {
9981
+ path: "/sites/{siteId}/newsletter/campaigns/{campaignId}/test-send",
9982
+ method: "POST",
9983
+ tags: [TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter],
9984
+ auth: "user",
9985
+ responseKind: "json",
9986
+ demoMutation: DEMO_MUTATION_BLOCKED_HIDDEN
9987
+ }
9988
+ });
9989
+ //#endregion
9990
+ //#region ../api/src/sdkEventEndpointDefinitions.ts
9991
+ /**
9992
+ * The SDK's Event graph: the Events themselves and the occurrences of one run.
9993
+ * Extracted from `endpoints.ts` so this family can be read, and added to, on
9994
+ * its own. New entries here must declare `errors`; the
9995
+ * require-api-endpoint-errors lint enforces that here as in endpoints.ts.
9996
+ */
9997
+ const SDK_EVENT_ENDPOINT_DEFINITIONS = defineEndpointDefinitions({
9998
+ sdkListEvents: {
9999
+ path: "/sdk/{siteId}/events",
10000
+ method: "GET",
10001
+ auth: "service",
9808
10002
  responseKind: "json"
9809
10003
  },
9810
- retryNewsletterSendJob: {
9811
- path: "/sites/{siteId}/newsletter/jobs/{jobId}/retry",
10004
+ sdkUpsertEvent: {
10005
+ path: "/sdk/{siteId}/events",
9812
10006
  method: "POST",
10007
+ auth: "service",
10008
+ responseKind: "json",
9813
10009
  errors: [
9814
10010
  "validation:invalid_input",
9815
10011
  "resource:not_found",
9816
- "auth:forbidden",
10012
+ "resource:conflict",
10013
+ "billing:plan_limit_exceeded",
9817
10014
  "server:internal_error"
9818
- ],
9819
- tags: [TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter],
9820
- auth: "user",
10015
+ ]
10016
+ },
10017
+ sdkGetEvent: {
10018
+ path: "/sdk/{siteId}/events/{identifier}",
10019
+ method: "GET",
10020
+ auth: "service",
9821
10021
  responseKind: "json"
9822
10022
  },
9823
- cancelNewsletterSendJob: {
9824
- path: "/sites/{siteId}/newsletter/jobs/{jobId}/cancel",
10023
+ sdkDeleteEvent: {
10024
+ path: "/sdk/{siteId}/events/{identifier}",
10025
+ method: "DELETE",
10026
+ auth: "service",
10027
+ responseKind: "json",
10028
+ errors: [
10029
+ "resource:not_found",
10030
+ "resource:conflict",
10031
+ "server:internal_error"
10032
+ ]
10033
+ },
10034
+ sdkTakeEventOffline: {
10035
+ path: "/sdk/{siteId}/events/{identifier}/lifecycle",
9825
10036
  method: "POST",
10037
+ auth: "service",
10038
+ responseKind: "json",
9826
10039
  errors: [
10040
+ "resource:not_found",
9827
10041
  "validation:invalid_input",
10042
+ "resource:conflict",
10043
+ "server:internal_error"
10044
+ ]
10045
+ },
10046
+ sdkListEventOccurrences: {
10047
+ path: "/sdk/{siteId}/events/{identifier}/runs/{runIdentifier}/occurrences",
10048
+ method: "GET",
10049
+ auth: "service",
10050
+ responseKind: "json",
10051
+ errors: [
9828
10052
  "resource:not_found",
9829
- "auth:forbidden",
10053
+ "validation:invalid_input",
9830
10054
  "server:internal_error"
9831
- ],
9832
- tags: [TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter],
9833
- auth: "user",
9834
- responseKind: "json"
10055
+ ]
10056
+ },
10057
+ sdkAddEventOccurrence: {
10058
+ path: "/sdk/{siteId}/events/{identifier}/runs/{runIdentifier}/occurrences",
10059
+ method: "POST",
10060
+ auth: "service",
10061
+ responseKind: "json",
10062
+ errors: [
10063
+ "resource:not_found",
10064
+ "validation:invalid_input",
10065
+ "resource:conflict",
10066
+ "server:internal_error"
10067
+ ]
10068
+ },
10069
+ sdkUpdateEventOccurrence: {
10070
+ path: "/sdk/{siteId}/events/{identifier}/runs/{runIdentifier}/occurrences/{occurrenceId}",
10071
+ method: "PATCH",
10072
+ auth: "service",
10073
+ responseKind: "json",
10074
+ errors: [
10075
+ "resource:not_found",
10076
+ "validation:invalid_input",
10077
+ "resource:conflict",
10078
+ "server:internal_error"
10079
+ ]
10080
+ },
10081
+ sdkCancelEventOccurrence: {
10082
+ path: "/sdk/{siteId}/events/{identifier}/runs/{runIdentifier}/occurrences/{occurrenceId}/cancel",
10083
+ method: "POST",
10084
+ auth: "service",
10085
+ responseKind: "json",
10086
+ errors: [
10087
+ "resource:not_found",
10088
+ "resource:conflict",
10089
+ "server:internal_error"
10090
+ ]
10091
+ },
10092
+ sdkDeleteEventOccurrence: {
10093
+ path: "/sdk/{siteId}/events/{identifier}/runs/{runIdentifier}/occurrences/{occurrenceId}",
10094
+ method: "DELETE",
10095
+ auth: "service",
10096
+ responseKind: "json",
10097
+ errors: [
10098
+ "resource:not_found",
10099
+ "resource:conflict",
10100
+ "server:internal_error"
10101
+ ]
10102
+ }
10103
+ });
10104
+ //#endregion
10105
+ //#region ../api/src/sdkPageDesignEndpointDefinitions.ts
10106
+ /**
10107
+ * SDK management endpoints for a page's draft design (issue 1497), spread into
10108
+ * `ENDPOINT_DEFINITIONS` like the other endpoint-definition modules. New
10109
+ * entries here must declare `errors`, which the require-api-endpoint-errors
10110
+ * lint enforces.
10111
+ */
10112
+ const SDK_PAGE_DESIGN_ENDPOINT_DEFINITIONS = defineEndpointDefinitions({
10113
+ sdkGetPageDesign: {
10114
+ path: "/sdk/{siteId}/pages/{identifier}/design",
10115
+ method: "GET",
10116
+ auth: "service",
10117
+ responseKind: "json",
10118
+ errors: [
10119
+ "resource:not_found",
10120
+ "validation:invalid_input",
10121
+ "server:internal_error"
10122
+ ]
10123
+ },
10124
+ sdkSavePageDesign: {
10125
+ path: "/sdk/{siteId}/pages/{identifier}/design",
10126
+ method: "POST",
10127
+ auth: "service",
10128
+ responseKind: "json",
10129
+ errors: [
10130
+ "resource:not_found",
10131
+ "validation:invalid_input",
10132
+ "resource:conflict",
10133
+ "server:internal_error"
10134
+ ]
9835
10135
  }
9836
10136
  });
9837
10137
  //#endregion
@@ -10079,6 +10379,45 @@ const SITE_API_KEY_ENDPOINT_DEFINITIONS = defineEndpointDefinitions({
10079
10379
  }
10080
10380
  });
10081
10381
  //#endregion
10382
+ //#region ../api/src/siteManagementEndpointDefinitions.ts
10383
+ const SITE_MANAGEMENT_ENDPOINT_DEFINITIONS = defineEndpointDefinitions({
10384
+ createSite: {
10385
+ path: "/sites/manage",
10386
+ method: "POST",
10387
+ tags: ["site"],
10388
+ auth: "user",
10389
+ responseKind: "json"
10390
+ },
10391
+ updateSite: {
10392
+ path: "/sites/manage",
10393
+ method: "PUT",
10394
+ tags: ["site"],
10395
+ auth: "user",
10396
+ responseKind: "json"
10397
+ },
10398
+ changeSiteAddress: {
10399
+ path: "/sites/{siteId}/address",
10400
+ method: "PUT",
10401
+ auth: "user",
10402
+ responseKind: "json",
10403
+ demoMutation: DEMO_MUTATION_BLOCKED_DISABLED
10404
+ },
10405
+ getSiteAddressAvailability: {
10406
+ path: "/sites/{siteId}/address/availability",
10407
+ method: "GET",
10408
+ auth: "user",
10409
+ responseKind: "json"
10410
+ },
10411
+ deleteSite: {
10412
+ path: "/sites/{siteId}",
10413
+ method: "DELETE",
10414
+ tags: ["site", "site-{siteId}"],
10415
+ auth: "user",
10416
+ responseKind: "json",
10417
+ demoMutation: DEMO_MUTATION_BLOCKED_HIDDEN
10418
+ }
10419
+ });
10420
+ //#endregion
10082
10421
  //#region ../api/src/eventManagementEndpointDefinitions.ts
10083
10422
  const EVENT_MANAGEMENT_ENDPOINT_DEFINITIONS = defineEndpointDefinitions({
10084
10423
  listEvents: {
@@ -10126,6 +10465,28 @@ const EVENT_MANAGEMENT_ENDPOINT_DEFINITIONS = defineEndpointDefinitions({
10126
10465
  "server:internal_error"
10127
10466
  ]
10128
10467
  },
10468
+ /**
10469
+ * The web address of an event's own page. A course page belongs to the
10470
+ * event itself, so its address is written here rather than through a run.
10471
+ */
10472
+ updateEventAddress: {
10473
+ path: "/sites/{siteId}/bookings/events/{eventId}/address",
10474
+ method: "PATCH",
10475
+ tags: [
10476
+ "site-{siteId}",
10477
+ "event-series-{siteId}",
10478
+ TAG_TEMPLATES.siteRoutableContent,
10479
+ TAG_TEMPLATES.siteRedirects
10480
+ ],
10481
+ auth: "user",
10482
+ responseKind: "json",
10483
+ errors: [
10484
+ "validation:invalid_input",
10485
+ "resource:not_found",
10486
+ "resource:conflict",
10487
+ "server:internal_error"
10488
+ ]
10489
+ },
10129
10490
  createWholeSeriesRun: {
10130
10491
  path: "/sites/{siteId}/bookings/events/{eventId}/runs",
10131
10492
  method: "POST",
@@ -10152,6 +10513,20 @@ const EVENT_MANAGEMENT_ENDPOINT_DEFINITIONS = defineEndpointDefinitions({
10152
10513
  "server:internal_error"
10153
10514
  ]
10154
10515
  },
10516
+ updateCourseBookingSettings: {
10517
+ path: "/sites/{siteId}/bookings/events/{eventId}/booking-settings",
10518
+ method: "PATCH",
10519
+ tags: ["site-{siteId}", "event-series-{siteId}"],
10520
+ auth: "user",
10521
+ responseKind: "json",
10522
+ errors: [
10523
+ "validation:invalid_input",
10524
+ "auth:forbidden",
10525
+ "resource:not_found",
10526
+ "resource:conflict",
10527
+ "server:internal_error"
10528
+ ]
10529
+ },
10155
10530
  cancelWholeSeriesRun: {
10156
10531
  path: "/sites/{siteId}/bookings/events/{eventId}/runs/{runId}/cancellation",
10157
10532
  method: "POST",
@@ -10164,6 +10539,28 @@ const EVENT_MANAGEMENT_ENDPOINT_DEFINITIONS = defineEndpointDefinitions({
10164
10539
  "resource:conflict",
10165
10540
  "server:internal_error"
10166
10541
  ]
10542
+ },
10543
+ /**
10544
+ * The Content tab's one write: the short introduction, image and
10545
+ * description of an event's page, published without its layout.
10546
+ */
10547
+ saveEventPageWords: {
10548
+ path: "/sites/{siteId}/page-surfaces/{pageSurfaceId}/words",
10549
+ method: "PUT",
10550
+ tags: [
10551
+ TAG_TEMPLATES.siteCollection,
10552
+ TAG_TEMPLATES.siteRoutableContent,
10553
+ TAG_TEMPLATES.pageSurfaceById
10554
+ ],
10555
+ auth: "user",
10556
+ responseKind: "json",
10557
+ errors: [
10558
+ "auth:forbidden",
10559
+ "validation:invalid_input",
10560
+ "resource:not_found",
10561
+ "resource:conflict",
10562
+ "server:internal_error"
10563
+ ]
10167
10564
  }
10168
10565
  });
10169
10566
  //#endregion
@@ -10596,18 +10993,56 @@ const BILLING_ENDPOINT_DEFINITIONS = defineEndpointDefinitions({
10596
10993
  responseKind: "json"
10597
10994
  }
10598
10995
  });
10996
+ //#endregion
10997
+ //#region ../api/src/clientErrorReporting.ts
10998
+ const CLIENT_ERROR_REPORT_ENDPOINT_DEFINITIONS = defineEndpointDefinitions({ reportClientError: {
10999
+ path: "/client/error-report",
11000
+ method: "POST",
11001
+ auth: "user",
11002
+ errors: [],
11003
+ responseKind: "json"
11004
+ } });
11005
+ const CLIENT_ERROR_REPORT_LIMITS = {
11006
+ pathname: 1024,
11007
+ name: 120,
11008
+ message: 2e3,
11009
+ stack: 8e3,
11010
+ digest: 128,
11011
+ componentStack: 8e3,
11012
+ sourceLocation: 1024
11013
+ };
11014
+ const clientErrorEventSchema = z.enum([
11015
+ "dashboard:route-error",
11016
+ "dashboard:app-error",
11017
+ "client:error-boundary",
11018
+ "client:window-error",
11019
+ "client:unhandled-rejection"
11020
+ ]);
11021
+ z.object({
11022
+ event: clientErrorEventSchema,
11023
+ pathname: z.string().startsWith("/").max(CLIENT_ERROR_REPORT_LIMITS.pathname),
11024
+ name: z.string().max(CLIENT_ERROR_REPORT_LIMITS.name),
11025
+ message: z.string().max(CLIENT_ERROR_REPORT_LIMITS.message),
11026
+ stack: z.string().max(CLIENT_ERROR_REPORT_LIMITS.stack).nullable(),
11027
+ digest: z.string().max(CLIENT_ERROR_REPORT_LIMITS.digest).nullable(),
11028
+ componentStack: z.string().max(CLIENT_ERROR_REPORT_LIMITS.componentStack).nullable(),
11029
+ sourceLocation: z.string().max(CLIENT_ERROR_REPORT_LIMITS.sourceLocation).nullable()
11030
+ }).strict();
10599
11031
  ({
11032
+ ...CLIENT_ERROR_REPORT_ENDPOINT_DEFINITIONS,
11033
+ ...PUBLIC_NEWSLETTER_ENDPOINT_DEFINITIONS,
10600
11034
  ...ACCOUNT_ENDPOINT_DEFINITIONS,
10601
11035
  ...PUBLIC_ONBOARDING_ATTEMPT_ENDPOINT_DEFINITIONS,
10602
11036
  ...PUBLIC_EVENT_ENDPOINT_DEFINITIONS,
10603
11037
  ...GIFTING_ENDPOINT_DEFINITIONS,
10604
11038
  ...PUBLIC_READ_ENDPOINT_DEFINITIONS,
10605
- ...BILLING_ENDPOINT_DEFINITIONS
11039
+ ...BILLING_ENDPOINT_DEFINITIONS,
11040
+ ...SITE_MANAGEMENT_ENDPOINT_DEFINITIONS
10606
11041
  }), 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, {
10607
11042
  ...NEWSLETTER_ENDPOINT_DEFINITIONS,
10608
11043
  ...APPOINTMENT_ENDPOINT_DEFINITIONS,
10609
11044
  ...EVENT_SERIES_REGISTRATION_ENDPOINT_DEFINITIONS
10610
- }, 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 };
11045
+ }, 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 };
10611
11046
  z.object({ refreshToken: z.string().min(1).max(4096) }).strict();
10612
11047
  z.object({
10613
11048
  accessToken: z.string().min(1).max(4096),
@@ -10834,6 +11269,17 @@ const navigationLinkInputSchemaOptions = [
10834
11269
  ];
10835
11270
  z.discriminatedUnion("kind", navigationLinkInputSchemaOptions);
10836
11271
  //#endregion
11272
+ //#region ../blocks/src/pageRenderAdmission.ts
11273
+ /** Pair a published version with the content it authorises at the render boundary. */
11274
+ function readPublishedBlockPlacement(id, content) {
11275
+ if (id == null && content == null) return null;
11276
+ if (id == null || content == null) throw new Error("Published block placement requires both an ID and content");
11277
+ return {
11278
+ id,
11279
+ content
11280
+ };
11281
+ }
11282
+ //#endregion
10837
11283
  //#region ../theme-core/src/site-styles/styleTags.ts
10838
11284
  /**
10839
11285
  * Descriptive style-axis metadata for button personalities and palette
@@ -12957,11 +13403,260 @@ function cardRoleFromLegacyVocabulary(value) {
12957
13403
  */
12958
13404
  const cardRoleWithLegacyAliasSchema = z.preprocess((value) => cardRoleFromLegacyVocabulary(value) ?? value, cardRoleSchema);
12959
13405
  //#endregion
12960
- //#region ../theme-core/src/site-styles/compilationPlan.ts
12961
- const defaultHeaderBrandPreferences = {
12962
- brandDisplay: "auto",
12963
- logoSize: "auto"
12964
- };
13406
+ //#region ../theme-core/src/site-styles/transitionCatalogue.ts
13407
+ /**
13408
+ * Family order for pickers. Entries below are listed family by family in this
13409
+ * same order, so the flat option list and the grouped families agree.
13410
+ */
13411
+ const transitionCatalogueFamilies = [
13412
+ {
13413
+ id: "gradient",
13414
+ label: "Gradient"
13415
+ },
13416
+ {
13417
+ id: "wave",
13418
+ label: "Wave"
13419
+ },
13420
+ {
13421
+ id: "angle",
13422
+ label: "Angle"
13423
+ }
13424
+ ];
13425
+ const mediumHeight = "6rem + 2px";
13426
+ const compactHeight = "4.5rem + 2px";
13427
+ const largeHeight = "7rem + 2px";
13428
+ /**
13429
+ * The single source of transition vocabulary. Order is significant: it is the
13430
+ * order of `boundaryOptions` (after `none`) and of each family's variants,
13431
+ * which persisted pins, page-flow presets and the editor picker all rely on.
13432
+ *
13433
+ * Shapes match what `generateLayoutCss` draws today. Structured
13434
+ * amplitude/frequency treatments (issue 826) extend this list later.
13435
+ */
13436
+ const transitionCatalogueEntries = defineExactCatalog()([
13437
+ {
13438
+ intent: "soft-fade-short",
13439
+ optionId: asBoundaryOptionId("break:soft"),
13440
+ family: "gradient",
13441
+ variantId: "soft",
13442
+ label: "Soft",
13443
+ variantLabel: "Soft",
13444
+ treatment: {
13445
+ kind: "soft-fade",
13446
+ height: "medium",
13447
+ curve: "soft"
13448
+ },
13449
+ size: "medium",
13450
+ heightExpression: mediumHeight,
13451
+ shape: { kind: "fade" }
13452
+ },
13453
+ {
13454
+ intent: "soft-fade-long",
13455
+ optionId: asBoundaryOptionId("break:spacious"),
13456
+ family: "gradient",
13457
+ variantId: "spacious",
13458
+ label: "Spacious",
13459
+ variantLabel: "Spacious",
13460
+ treatment: {
13461
+ kind: "soft-fade",
13462
+ height: "large",
13463
+ curve: "spacious"
13464
+ },
13465
+ size: "spacious",
13466
+ heightExpression: "10rem",
13467
+ shape: { kind: "fade" }
13468
+ },
13469
+ {
13470
+ intent: "soft-fade-expansive",
13471
+ optionId: asBoundaryOptionId("break:expansive"),
13472
+ family: "gradient",
13473
+ variantId: "expansive",
13474
+ label: "Expansive",
13475
+ variantLabel: "Expansive",
13476
+ treatment: {
13477
+ kind: "soft-fade",
13478
+ height: "expansive",
13479
+ curve: "expansive"
13480
+ },
13481
+ size: "expansive",
13482
+ heightExpression: "14rem",
13483
+ shape: { kind: "fade" }
13484
+ },
13485
+ {
13486
+ intent: "wave-edge-balanced",
13487
+ optionId: asBoundaryOptionId("break:wave-balanced"),
13488
+ family: "wave",
13489
+ variantId: "balanced",
13490
+ label: "Balanced wave",
13491
+ variantLabel: "Balanced",
13492
+ treatment: {
13493
+ kind: "wave-edge",
13494
+ height: "medium",
13495
+ amplitude: "balanced",
13496
+ rhythm: "double",
13497
+ symmetry: "symmetrical"
13498
+ },
13499
+ size: "medium",
13500
+ heightExpression: mediumHeight,
13501
+ shape: {
13502
+ kind: "wave",
13503
+ mask: "balanced"
13504
+ }
13505
+ },
13506
+ {
13507
+ intent: "wave-edge",
13508
+ optionId: asBoundaryOptionId("break:wave"),
13509
+ family: "wave",
13510
+ variantId: "classic",
13511
+ label: "Classic wave",
13512
+ variantLabel: "Classic",
13513
+ treatment: {
13514
+ kind: "wave-edge",
13515
+ height: "medium",
13516
+ amplitude: "balanced",
13517
+ rhythm: "double",
13518
+ symmetry: "asymmetrical"
13519
+ },
13520
+ size: "medium",
13521
+ heightExpression: mediumHeight,
13522
+ shape: {
13523
+ kind: "wave",
13524
+ mask: "classic"
13525
+ }
13526
+ },
13527
+ {
13528
+ intent: "wave-edge-gentle",
13529
+ optionId: asBoundaryOptionId("break:wave-gentle"),
13530
+ family: "wave",
13531
+ variantId: "gentle",
13532
+ label: "Gentle wave",
13533
+ variantLabel: "Gentle",
13534
+ treatment: {
13535
+ kind: "wave-edge",
13536
+ height: "compact",
13537
+ amplitude: "subtle",
13538
+ rhythm: "single",
13539
+ symmetry: "symmetrical"
13540
+ },
13541
+ size: "compact",
13542
+ heightExpression: compactHeight,
13543
+ shape: {
13544
+ kind: "wave",
13545
+ mask: "gentle"
13546
+ }
13547
+ },
13548
+ {
13549
+ intent: "wave-edge-bold",
13550
+ optionId: asBoundaryOptionId("break:wave-bold"),
13551
+ family: "wave",
13552
+ variantId: "bold",
13553
+ label: "Bold wave",
13554
+ variantLabel: "Bold",
13555
+ treatment: {
13556
+ kind: "wave-edge",
13557
+ height: "large",
13558
+ amplitude: "bold",
13559
+ rhythm: "double",
13560
+ symmetry: "symmetrical"
13561
+ },
13562
+ size: "large",
13563
+ heightExpression: largeHeight,
13564
+ shape: {
13565
+ kind: "wave",
13566
+ mask: "bold"
13567
+ }
13568
+ },
13569
+ {
13570
+ intent: "wave-edge-drift",
13571
+ optionId: asBoundaryOptionId("break:wave-drift"),
13572
+ family: "wave",
13573
+ variantId: "drift",
13574
+ label: "Drift wave",
13575
+ variantLabel: "Drift",
13576
+ treatment: {
13577
+ kind: "wave-edge",
13578
+ height: "medium",
13579
+ amplitude: "balanced",
13580
+ rhythm: "double",
13581
+ symmetry: "drift"
13582
+ },
13583
+ size: "medium",
13584
+ heightExpression: mediumHeight,
13585
+ shape: {
13586
+ kind: "wave",
13587
+ mask: "drift"
13588
+ }
13589
+ },
13590
+ {
13591
+ intent: "angle-edge-subtle",
13592
+ optionId: asBoundaryOptionId("break:angle-subtle"),
13593
+ family: "angle",
13594
+ variantId: "subtle",
13595
+ label: "Subtle angle",
13596
+ variantLabel: "Subtle",
13597
+ treatment: {
13598
+ kind: "angle-edge",
13599
+ height: "compact",
13600
+ slope: "subtle",
13601
+ direction: "forward"
13602
+ },
13603
+ size: "compact",
13604
+ heightExpression: compactHeight,
13605
+ shape: {
13606
+ kind: "angle",
13607
+ polygon: {
13608
+ startTopPercent: 34,
13609
+ endTopPercent: 18
13610
+ }
13611
+ }
13612
+ },
13613
+ {
13614
+ intent: "angle-edge",
13615
+ optionId: asBoundaryOptionId("break:angle-balanced"),
13616
+ family: "angle",
13617
+ variantId: "balanced",
13618
+ label: "Balanced angle",
13619
+ variantLabel: "Balanced",
13620
+ treatment: {
13621
+ kind: "angle-edge",
13622
+ height: "medium",
13623
+ slope: "balanced",
13624
+ direction: "forward"
13625
+ },
13626
+ size: "medium",
13627
+ heightExpression: mediumHeight,
13628
+ shape: {
13629
+ kind: "angle",
13630
+ polygon: {
13631
+ startTopPercent: 42,
13632
+ endTopPercent: 8
13633
+ }
13634
+ }
13635
+ },
13636
+ {
13637
+ intent: "angle-edge-steep",
13638
+ optionId: asBoundaryOptionId("break:angle-steep"),
13639
+ family: "angle",
13640
+ variantId: "steep",
13641
+ label: "Steep angle",
13642
+ variantLabel: "Steep",
13643
+ treatment: {
13644
+ kind: "angle-edge",
13645
+ height: "large",
13646
+ slope: "steep",
13647
+ direction: "forward"
13648
+ },
13649
+ size: "large",
13650
+ heightExpression: largeHeight,
13651
+ shape: {
13652
+ kind: "angle",
13653
+ polygon: {
13654
+ startTopPercent: 54,
13655
+ endTopPercent: 0
13656
+ }
13657
+ }
13658
+ }
13659
+ ]);
12965
13660
  //#endregion
12966
13661
  //#region ../theme-core/src/site-styles/sectionTransitions.ts
12967
13662
  function boundaryRuntimeMetrics(family, size, heightExpression) {
@@ -12972,42 +13667,106 @@ function boundaryRuntimeMetrics(family, size, heightExpression) {
12972
13667
  reserveCss: `calc((${heightExpression}) / 2)`
12973
13668
  };
12974
13669
  }
12975
- 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");
13670
+ new Map(transitionCatalogueEntries.map((entry) => [entry.intent, entry]));
13671
+ new Map(transitionCatalogueEntries.map((entry) => [entry.intent, boundaryRuntimeMetrics(entry.family, entry.size, entry.heightExpression)]));
13672
+ /**
13673
+ * The catalogue's compile-time coverage check guarantees an entry per
13674
+ * decorative intent, so a miss here is a broken invariant, not bad input.
13675
+ */
13676
+ function requireCatalogueValue(values, intent) {
13677
+ const value = values.get(intent);
13678
+ if (value === void 0) throw new Error(`Transition catalogue has no entry for ${intent}`);
13679
+ return value;
13680
+ }
12976
13681
  const noneBoundaryOption = {
12977
13682
  id: asBoundaryOptionId("break:none"),
12978
13683
  label: "None",
12979
13684
  transitionAfter: "none",
12980
13685
  treatment: { kind: "none" }
12981
13686
  };
12982
- const softBoundaryOption = {
12983
- id: asBoundaryOptionId("break:soft"),
12984
- label: "Soft",
12985
- transitionAfter: "soft-fade-short",
12986
- treatment: {
12987
- kind: "soft-fade",
12988
- height: "medium",
12989
- curve: "soft"
12990
- }
13687
+ const boundaryOptionByIntent = new Map(transitionCatalogueEntries.map((entry) => [entry.intent, {
13688
+ id: entry.optionId,
13689
+ label: entry.label,
13690
+ transitionAfter: entry.intent,
13691
+ treatment: entry.treatment
13692
+ }]));
13693
+ function boundaryOptionForTransitionIntent(intent) {
13694
+ return requireCatalogueValue(boundaryOptionByIntent, intent);
13695
+ }
13696
+ const softBoundaryOption = boundaryOptionForTransitionIntent("soft-fade-short");
13697
+ const spaciousBoundaryOption = boundaryOptionForTransitionIntent("soft-fade-long");
13698
+ boundaryOptionForTransitionIntent("soft-fade-expansive");
13699
+ boundaryOptionForTransitionIntent("wave-edge");
13700
+ boundaryOptionForTransitionIntent("wave-edge-balanced");
13701
+ boundaryOptionForTransitionIntent("wave-edge-gentle");
13702
+ boundaryOptionForTransitionIntent("wave-edge-bold");
13703
+ boundaryOptionForTransitionIntent("wave-edge-drift");
13704
+ boundaryOptionForTransitionIntent("angle-edge-subtle");
13705
+ boundaryOptionForTransitionIntent("angle-edge");
13706
+ boundaryOptionForTransitionIntent("angle-edge-steep");
13707
+ /**
13708
+ * Must remain non-empty; downstream code indexes `[0]` as the documented default.
13709
+ */
13710
+ const boundaryOptions = [noneBoundaryOption, ...transitionCatalogueEntries.map((entry) => boundaryOptionForTransitionIntent(entry.intent))];
13711
+ const noneTransitionVariant = {
13712
+ familyId: "none",
13713
+ variantId: "none",
13714
+ label: "None",
13715
+ boundaryOption: noneBoundaryOption
12991
13716
  };
12992
- const spaciousBoundaryOption = {
12993
- id: asBoundaryOptionId("break:spacious"),
12994
- label: "Spacious",
12995
- transitionAfter: "soft-fade-long",
12996
- treatment: {
12997
- kind: "soft-fade",
12998
- height: "large",
12999
- curve: "spacious"
13000
- }
13717
+ function transitionVariantForEntry(entry) {
13718
+ return {
13719
+ familyId: entry.family,
13720
+ variantId: entry.variantId,
13721
+ label: entry.variantLabel,
13722
+ boundaryOption: boundaryOptionForTransitionIntent(entry.intent)
13723
+ };
13724
+ }
13725
+ const sectionTransitionFamilies = [{
13726
+ id: "none",
13727
+ label: "None",
13728
+ variants: [noneTransitionVariant]
13729
+ }, ...transitionCatalogueFamilies.map((family) => ({
13730
+ id: family.id,
13731
+ label: family.label,
13732
+ variants: requireNonEmptyReadonlyArray(transitionCatalogueEntries.filter((entry) => entry.family === family.id).map(transitionVariantForEntry), `Transition family ${family.id} has no catalogue entries.`)
13733
+ }))];
13734
+ new Map(boundaryOptions.map((option) => [option.id, option]));
13735
+ new Map(boundaryOptions.map((option) => [stableTreatmentKey(option.treatment), option]));
13736
+ new Map(sectionTransitionFamilies.flatMap((family) => family.variants.map((variant) => [variant.boundaryOption.id, variant])));
13737
+ new Map(sectionTransitionFamilies.map((family) => [family.id, family]));
13738
+ function stableTreatmentKey(treatment) {
13739
+ switch (treatment.kind) {
13740
+ case "none": return "none";
13741
+ case "soft-fade": return `${treatment.kind}:${treatment.height}:${treatment.curve}`;
13742
+ case "wave-edge": return [
13743
+ treatment.kind,
13744
+ treatment.height,
13745
+ treatment.amplitude,
13746
+ treatment.rhythm,
13747
+ treatment.symmetry
13748
+ ].join(":");
13749
+ case "angle-edge": return [
13750
+ treatment.kind,
13751
+ treatment.height,
13752
+ treatment.slope,
13753
+ treatment.direction
13754
+ ].join(":");
13755
+ case "legacy-unsupported": return `${treatment.kind}:${treatment.boundaryOptionId}`;
13756
+ }
13757
+ }
13758
+ requireThemeColorToken$1("background");
13759
+ function requireThemeColorToken$1(value) {
13760
+ const token = parseThemeColorToken(value);
13761
+ if (!token) throw new Error(`Expected a theme color token. Received: ${value}`);
13762
+ return token;
13763
+ }
13764
+ //#endregion
13765
+ //#region ../theme-core/src/site-styles/compilationPlan.ts
13766
+ const defaultHeaderBrandPreferences = {
13767
+ brandDisplay: "auto",
13768
+ logoSize: "auto"
13001
13769
  };
13002
- asBoundaryOptionId("break:expansive");
13003
- asBoundaryOptionId("break:wave");
13004
- asBoundaryOptionId("break:wave-balanced");
13005
- asBoundaryOptionId("break:wave-gentle");
13006
- asBoundaryOptionId("break:wave-bold");
13007
- asBoundaryOptionId("break:wave-drift");
13008
- asBoundaryOptionId("break:angle-subtle");
13009
- asBoundaryOptionId("break:angle-balanced");
13010
- asBoundaryOptionId("break:angle-steep");
13011
13770
  asBoundaryOptionId("break:unknown");
13012
13771
  const pageDesignUserPinnedAppearanceChoiceSchema = z.object({
13013
13772
  kind: z.literal("user-pinned"),
@@ -13134,14 +13893,11 @@ function validateUniquePageDesignPins(intent, ctx) {
13134
13893
  label: "block Look pin"
13135
13894
  });
13136
13895
  addDuplicateStringIssues(ctx, {
13137
- values: intent.boundaryPins.map((pin) => boundaryKey(pin.previousBlockId, pin.nextBlockId)),
13896
+ values: intent.boundaryPins.map((pin) => makeBoundaryId(pin.previousBlockId, pin.nextBlockId)),
13138
13897
  path: ["boundaryPins"],
13139
13898
  label: "boundary pin"
13140
13899
  });
13141
13900
  }
13142
- function boundaryKey(previousBlockId, nextBlockId) {
13143
- return makeBoundaryId(previousBlockId, nextBlockId);
13144
- }
13145
13901
  //#endregion
13146
13902
  //#region ../theme-core/src/accordions/siteStyleDefaults.ts
13147
13903
  /**
@@ -14769,6 +15525,13 @@ z.object({
14769
15525
  fields: nonEmptyRuntimeStyleFieldNamesSchema,
14770
15526
  authority: styleAuthoritySchema
14771
15527
  }).strict();
15528
+ asPageFlowPresetId("flow:quiet"), noneBoundaryOption.id, asPageFlowPresetId("flow:balanced"), softBoundaryOption.id, asPageFlowPresetId("flow:expressive"), spaciousBoundaryOption.id;
15529
+ asPageFlowPresetId("generated-default");
15530
+ asSiteStyleId("site-style:south-west-twerk-school");
15531
+ asAppearancePresetId("hero-brand-scrim-fixed-frame");
15532
+ asLayoutVariantKey("classic");
15533
+ asLayoutVariantKey("micro");
15534
+ asBoundaryOptionId("break:wave");
14772
15535
  //#endregion
14773
15536
  //#region ../theme-core/src/site-styles/runtimeCompiler.ts
14774
15537
  function defineSectionForegroundRuntimeTokens(input) {
@@ -14792,7 +15555,7 @@ function defineComponentRuntimeRules(rules) {
14792
15555
  }
14793
15556
  /**
14794
15557
  * Default design rules translate semantic page-level choices into the current
14795
- * runtime's section background and transition style-group vocabulary.
15558
+ * runtime's section background vocabulary.
14796
15559
  */
14797
15560
  const defaultDesignRuntimeRules = defineDesignRuntimeRules({
14798
15561
  sectionSurfaces: {
@@ -14827,8 +15590,7 @@ const defaultDesignRuntimeRules = defineDesignRuntimeRules({
14827
15590
  color: "surface",
14828
15591
  opacity: .88
14829
15592
  }
14830
- },
14831
- transitionClassName: (transition, fromSurface, toSurface) => transition === "none" ? null : `site-style-transition-${transition}-from-${fromSurface}-to-${toSurface}`
15593
+ }
14832
15594
  });
14833
15595
  /**
14834
15596
  * Default component rules translate frame and item-surface semantics into the
@@ -16563,19 +17325,11 @@ const curatedSiteStyles = [
16563
17325
  })
16564
17326
  ];
16565
17327
  new Map(curatedSiteStyles.map((style) => [style.id, style]));
16566
- asPageFlowPresetId("generated-default");
16567
- asSiteStyleId("site-style:south-west-twerk-school");
16568
- asAppearancePresetId("hero-brand-scrim-fixed-frame");
16569
- asLayoutVariantKey("classic");
16570
- asLayoutVariantKey("micro");
16571
- asBoundaryOptionId("break:wave");
16572
- asPageFlowPresetId("flow:quiet"), noneBoundaryOption.id, asPageFlowPresetId("flow:balanced"), softBoundaryOption.id, asPageFlowPresetId("flow:expressive"), spaciousBoundaryOption.id;
16573
17328
  //#endregion
16574
17329
  //#region ../theme-core/src/site-styles/resolver.ts
16575
17330
  const blockDesignFallback = {
16576
17331
  sectionSurface: "base",
16577
17332
  contentFrame: plainFrame,
16578
- transitionAfter: "none",
16579
17333
  sectionHeight: "default",
16580
17334
  heroLegibility: "none",
16581
17335
  imageSurfaceTreatment: { kind: "none" },
@@ -16586,7 +17340,7 @@ const blockDesignFallback = {
16586
17340
  accordionIconTreatment: null,
16587
17341
  composition: null
16588
17342
  };
16589
- blockDesignFallback.sectionSurface, blockDesignFallback.contentFrame, blockDesignFallback.transitionAfter, blockDesignFallback.sectionHeight, blockDesignFallback.heroLegibility, blockDesignFallback.imageSurfaceTreatment, blockDesignFallback.imageSurfaceMotion, blockDesignFallback.tileTreatment, blockDesignFallback.eventListTreatment, blockDesignFallback.eyebrowTreatment, blockDesignFallback.accordionIconTreatment, blockDesignFallback.composition;
17343
+ blockDesignFallback.sectionSurface, blockDesignFallback.contentFrame, blockDesignFallback.sectionHeight, blockDesignFallback.heroLegibility, blockDesignFallback.imageSurfaceTreatment, blockDesignFallback.imageSurfaceMotion, blockDesignFallback.tileTreatment, blockDesignFallback.eventListTreatment, blockDesignFallback.eyebrowTreatment, blockDesignFallback.accordionIconTreatment, blockDesignFallback.composition;
16590
17344
  //#endregion
16591
17345
  //#region ../theme-core/src/site-styles/siteChromeBackgrounds.ts
16592
17346
  const siteChromeBackgroundColorTokens = toSiteChromeBackgroundColorTokens(backgroundAppearanceColorTokenNames);
@@ -17179,7 +17933,8 @@ const siteOptionSources = [
17179
17933
  "eventCategories",
17180
17934
  "eventSeries",
17181
17935
  "venues",
17182
- "staffMembers"
17936
+ "staffMembers",
17937
+ "appointmentServiceCategories"
17183
17938
  ];
17184
17939
  const mediaDeliverySchema = z.object({
17185
17940
  sizes: z.string().optional(),
@@ -28226,13 +28981,13 @@ const hours = stack({
28226
28981
  as: "p",
28227
28982
  className: "rb-caption rb-opacity-70"
28228
28983
  }, bind("module.timeZone"), when("module.timeZone"))], when("module.kind", { equals: "opening-hours" }));
28229
- const socials = inline({ className: "rb-flex rb-flex-wrap rb-gap-x-5 rb-gap-y-3" }, [link({
28984
+ const socials = inline({ className: "rb-footer-socials" }, [link({
28230
28985
  href: { $bind: { from: "social.href" } },
28231
28986
  target: "_blank",
28232
28987
  rel: "noreferrer noopener",
28233
28988
  "aria-label": { $bind: { from: "social.label" } },
28234
- className: "rb-nav-text transition-theme-standard"
28235
- }, [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" }));
28989
+ className: "rb-footer-social-link rb-nav-text transition-theme-standard"
28990
+ }, [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" }));
28236
28991
  const authoredCopy = richText({
28237
28992
  className: "rb-prose rb-prose-sm rb-max-w-none",
28238
28993
  style: textColorStyle("text/80")
@@ -29873,6 +30628,15 @@ const appointmentServicesBlockDefinition = {
29873
30628
  required: false,
29874
30629
  ui: { intent: "content" }
29875
30630
  },
30631
+ createSiteOptionSelectField({
30632
+ id: "categoryId",
30633
+ label: "Category",
30634
+ description: "Show one category (with its heading and intro), or leave it on All categories to show everything grouped.",
30635
+ required: false,
30636
+ multiple: false,
30637
+ optionSource: "appointmentServiceCategories",
30638
+ ui: { intent: "content" }
30639
+ }),
29876
30640
  sectionStylesField({
29877
30641
  id: "_sectionStyles",
29878
30642
  label: "Section styles",
@@ -29907,6 +30671,7 @@ const appointmentServicesBlockDefinition = {
29907
30671
  richText({ className: "rb-prose rb-max-w-none" }, bind("content.description"), when("content.description")),
29908
30672
  el("appointment-services", {
29909
30673
  sectionHeading: { $bind: { from: "content.heading" } },
30674
+ categoryId: { $bind: { from: "content.categoryId" } },
29910
30675
  services: { $bind: { from: "data.services" } },
29911
30676
  pathname: { $bind: { from: "$root.pathname" } },
29912
30677
  servicePathPrefix: { $bind: { from: "$root.appointmentServicePathPrefix" } }
@@ -37734,6 +38499,11 @@ const mailingListContentVersionIdSchema = z.string().transform((value, ctx) => {
37734
38499
  });
37735
38500
  return z.NEVER;
37736
38501
  });
38502
+ const mailingListSignupBlockSourceRefSchema = z.object({
38503
+ tag: z.literal("block_ref"),
38504
+ blockId: mailingListSignupBlockIdSchema,
38505
+ contentVersionId: mailingListContentVersionIdSchema
38506
+ });
37737
38507
  const signedMailingListSourceTokenSchema = z.string().trim().min(1).transform(parseRequiredMailingListSignedSourceToken);
37738
38508
  const newsletterSourceCommonSchema = z.object({
37739
38509
  siteId: z.string().optional(),
@@ -37748,7 +38518,15 @@ const newsletterSourceSchema = z.discriminatedUnion("source", [
37748
38518
  newsletterSourceCommonSchema.extend({
37749
38519
  source: z.literal("block"),
37750
38520
  blockId: z.string().nullable().optional(),
37751
- contentVersionId: z.string().nullable().optional()
38521
+ newsletterBlockSubmission: z.discriminatedUnion("tag", [
38522
+ z.object({
38523
+ tag: z.literal("ready"),
38524
+ sourceRef: mailingListSignupBlockSourceRefSchema
38525
+ }),
38526
+ z.object({ tag: z.literal("unpublished-form") }),
38527
+ z.object({ tag: z.literal("unpublished-settings") }),
38528
+ z.object({ tag: z.literal("unavailable") })
38529
+ ])
37752
38530
  }),
37753
38531
  newsletterSourceCommonSchema.extend({
37754
38532
  source: z.literal("signed-footer"),
@@ -37777,11 +38555,7 @@ const newsletterHydrationSchema = z.object({
37777
38555
  target: z.discriminatedUnion("tag", [
37778
38556
  z.object({
37779
38557
  tag: z.literal("block-source"),
37780
- sourceRef: z.object({
37781
- tag: z.literal("block_ref"),
37782
- blockId: mailingListSignupBlockIdSchema,
37783
- contentVersionId: mailingListContentVersionIdSchema
37784
- }).nullable()
38558
+ sourceRef: mailingListSignupBlockSourceRefSchema.nullable()
37785
38559
  }),
37786
38560
  z.object({
37787
38561
  tag: z.literal("signed-footer-source"),
@@ -37790,7 +38564,11 @@ const newsletterHydrationSchema = z.object({
37790
38564
  token: signedMailingListSourceTokenSchema
37791
38565
  })
37792
38566
  }),
37793
- z.object({ tag: z.literal("preview") })
38567
+ z.object({ tag: z.literal("preview") }),
38568
+ z.object({
38569
+ tag: z.literal("unpublished-preview"),
38570
+ reason: z.enum(["unpublished-form", "unpublished-settings"])
38571
+ })
37794
38572
  ]),
37795
38573
  setupRevision: z.number().int().positive().nullable(),
37796
38574
  choiceProvider: z.enum([
@@ -37859,16 +38637,21 @@ const newsletterFormBlockRuntime = defineProgressiveBlockRuntime({
37859
38637
  });
37860
38638
  function projectNewsletterFormHydrationTarget(source) {
37861
38639
  switch (source.source) {
37862
- case "block": {
37863
- const sourceRef = buildMailingListSignupBlockSourceRef(source.blockId, source.contentVersionId);
37864
- if (sourceRef?.tag === "block_ref") return {
38640
+ case "block": switch (source.newsletterBlockSubmission.tag) {
38641
+ case "unpublished-form":
38642
+ case "unpublished-settings": return {
38643
+ tag: "unpublished-preview",
38644
+ reason: source.newsletterBlockSubmission.tag
38645
+ };
38646
+ case "ready": return {
37865
38647
  tag: "block-source",
37866
- sourceRef
38648
+ sourceRef: source.newsletterBlockSubmission.sourceRef
37867
38649
  };
37868
- return {
38650
+ case "unavailable": return {
37869
38651
  tag: "block-source",
37870
38652
  sourceRef: null
37871
38653
  };
38654
+ default: return assertNever$3(source.newsletterBlockSubmission);
37872
38655
  }
37873
38656
  case "signed-footer": return {
37874
38657
  tag: "signed-footer-source",
@@ -40379,6 +41162,17 @@ function coerceToString(value) {
40379
41162
  return "";
40380
41163
  }
40381
41164
  /**
41165
+ * The appointment-services catalogue (issue 1403) pairs the services with the
41166
+ * site's ordered categories. Both are needed to group them, so that response
41167
+ * is passed through whole; any other `{ services }` wrapper is unwrapped.
41168
+ */
41169
+ function coerceServicesPayload(record) {
41170
+ return Array.isArray(record.services) && Array.isArray(record.categories) ? {
41171
+ services: record.services,
41172
+ categories: record.categories
41173
+ } : record.services;
41174
+ }
41175
+ /**
40382
41176
  * Extract data from API response.
40383
41177
  * Unwraps common response wrappers: { data }, { form }, { entries }, { services }, { teamMembers }
40384
41178
  *
@@ -40393,7 +41187,7 @@ function coercePayload(payload) {
40393
41187
  if ("data" in record && typeof record.data !== "function") return record.data;
40394
41188
  if ("form" in record && typeof record.form !== "function") return record.form;
40395
41189
  if ("entries" in record && typeof record.entries !== "function") return record.entries;
40396
- if ("services" in record && typeof record.services !== "function") return record.services;
41190
+ if ("services" in record && typeof record.services !== "function") return coerceServicesPayload(record);
40397
41191
  if ("teamMembers" in record && typeof record.teamMembers !== "function") return record.teamMembers;
40398
41192
  }
40399
41193
  return payload;
@@ -40913,6 +41707,46 @@ z.object({ acceptExtraSiteCharge: z.boolean().optional() });
40913
41707
  //#region ../surfaces/src/index.ts
40914
41708
  const SURFACE_IDS = ["core", "macadamia"];
40915
41709
  const DEFAULT_SURFACE_ID = "core";
41710
+ /**
41711
+ * Root hosts for each surface, keyed by deployment tier. The tier-keyed shape
41712
+ * makes it impossible to mis-order entries: callers like
41713
+ * `buildSurfaceAwareDashboardOriginForSurfaceId` look up by tier directly
41714
+ * rather than relying on positional alignment between arrays.
41715
+ */
41716
+ const SURFACE_ROOT_HOSTS = {
41717
+ core: {
41718
+ local: "localhost",
41719
+ prod: "riverbankcms.com"
41720
+ },
41721
+ macadamia: {
41722
+ local: "macadamia.localhost",
41723
+ prod: "macadamia.studio"
41724
+ }
41725
+ };
41726
+ const SURFACE_SITE_ROOT_HOSTS = {
41727
+ core: {
41728
+ local: "localhost",
41729
+ prod: "riverbanksites.com"
41730
+ },
41731
+ macadamia: {
41732
+ local: "macadamia.localhost",
41733
+ prod: "macadamia.studio"
41734
+ }
41735
+ };
41736
+ const SURFACE_SITE_ROOT_HOST_ALIASES = { core: { prod: ["preview.riverbanksites.com"] } };
41737
+ function surfaceHostTableValues(table) {
41738
+ return Object.values(table).flatMap((byTier) => Object.values(byTier).flat());
41739
+ }
41740
+ function siteSlugLabelUnderRoot(host, siteRootHost) {
41741
+ if (!host.endsWith(`.${siteRootHost}`)) return [];
41742
+ return host.slice(0, host.length - siteRootHost.length - 1).split(".").slice(-1);
41743
+ }
41744
+ function deriveSurfaceOwnedSiteSlugs() {
41745
+ const siteRootHosts = [...surfaceHostTableValues(SURFACE_SITE_ROOT_HOSTS), ...surfaceHostTableValues(SURFACE_SITE_ROOT_HOST_ALIASES)];
41746
+ const labels = [...surfaceHostTableValues(SURFACE_ROOT_HOSTS), ...siteRootHosts].flatMap((host) => siteRootHosts.flatMap((root) => siteSlugLabelUnderRoot(host, root)));
41747
+ return [...new Set(labels)].sort();
41748
+ }
41749
+ deriveSurfaceOwnedSiteSlugs();
40916
41750
  [...SURFACE_IDS.filter((surfaceId) => surfaceId !== DEFAULT_SURFACE_ID)];
40917
41751
  //#endregion
40918
41752
  //#region ../api/src/accountApi.ts
@@ -41295,7 +42129,12 @@ const appointmentSetupServiceDraftSchema = z.object({
41295
42129
  venue: appointmentSetupVenueChoiceSchema,
41296
42130
  timezone: z.string().trim().min(1).nullable(),
41297
42131
  payment: appointmentSetupPaymentDraftSchema,
41298
- assignment: appointmentSetupServiceAssignmentDraftSchema
42132
+ assignment: appointmentSetupServiceAssignmentDraftSchema,
42133
+ /**
42134
+ * The service's category, or null for "Other" (issue 1403). Omitted leaves
42135
+ * an existing service's category alone and puts a new one in "Other".
42136
+ */
42137
+ categoryId: z.string().uuid().nullable().optional()
41299
42138
  }).superRefine((service, ctx) => {
41300
42139
  if (service.payment.kind !== "free" && (service.priceAmount === null || service.priceAmount <= 0)) ctx.addIssue({
41301
42140
  code: "custom",
@@ -41536,6 +42375,7 @@ function parsePublicProductCategorySelector(value) {
41536
42375
  productCategoryEntryId: record.productCategoryEntryId
41537
42376
  };
41538
42377
  }
42378
+ z.enum(["public", "unlisted"], { error: "visibility must be 'public' or 'unlisted'" });
41539
42379
  //#endregion
41540
42380
  //#region ../api/src/bookingPaymentTermSchemas.ts
41541
42381
  const bookingDepositRefundPolicySchema = z.enum(["refundable", "non_refundable"]);
@@ -42006,21 +42846,42 @@ function resolveSiteCustomBlocks(site) {
42006
42846
  }
42007
42847
  //#endregion
42008
42848
  //#region src/rendering/helpers/pageRuntimeSupport.ts
42009
- function convertPageResponseBlock(block) {
42849
+ function collectMediaAssetSidecar(mediaAssets) {
42850
+ return Array.isArray(mediaAssets) && mediaAssets.length > 0 ? mediaAssets : void 0;
42851
+ }
42852
+ function readBlockContentId(value, name) {
42853
+ if (value === null || value === void 0) return null;
42854
+ if (typeof value === "string") return value;
42855
+ throw new Error(`Invalid ${name} in page: expected string or null`);
42856
+ }
42857
+ function readTransportedBlockIdentity(block, kind, stage) {
42858
+ return {
42859
+ draftContentId: readBlockContentId(block.draftContentId, "draft content id"),
42860
+ publishedPlacement: stage === "preview" ? readPublishedBlockPlacement(readBlockContentId(block.publishedContentId, "published content id"), sanitizeNullableSdkRuntimeBlockContent(kind, readNestedContentRecord(block.publishedContent))) : null
42861
+ };
42862
+ }
42863
+ function convertPageResponseBlock(block, stage) {
42010
42864
  if (!isRecord(block)) throw new Error("Invalid block format in page API response");
42865
+ const header = readTransportedBlockHeader(block);
42866
+ const admission = readInvalidBlockAdmission(block.admission);
42867
+ return {
42868
+ ...header,
42869
+ ...readTransportedBlockIdentity(block, header.kind, stage),
42870
+ content: sanitizeSdkRuntimeBlockContent(header.kind, readContentRecord(block.content) ?? {}),
42871
+ draftContent: sanitizeNullableSdkRuntimeBlockContent(header.kind, readNestedContentRecord(block.draftContent)),
42872
+ ...admission ? { admission } : {}
42873
+ };
42874
+ }
42875
+ function readTransportedBlockHeader(block) {
42011
42876
  if (typeof block.id !== "string" && block.id !== null) throw new Error(`Invalid block id in page: expected string or null, got ${typeof block.id}`);
42012
42877
  if (typeof block.kind !== "string") throw new Error(`Invalid block kind in page: expected string, got ${typeof block.kind}`);
42013
42878
  if (typeof block.purpose !== "string") throw new Error(`Invalid block purpose in page: expected string, got ${typeof block.purpose}`);
42014
42879
  if (block.contentVersionId !== void 0 && block.contentVersionId !== null && typeof block.contentVersionId !== "string") throw new Error(`Invalid content version id in page: expected string or null, got ${typeof block.contentVersionId}`);
42015
- const admission = readInvalidBlockAdmission(block.admission);
42016
42880
  return {
42017
42881
  id: block.id,
42018
42882
  ...block.contentVersionId !== void 0 ? { contentVersionId: block.contentVersionId } : {},
42019
42883
  kind: block.kind,
42020
- purpose: block.purpose,
42021
- content: sanitizeSdkRuntimeBlockContent(block.kind, readContentRecord(block.content) ?? {}),
42022
- draftContent: sanitizeNullableSdkRuntimeBlockContent(block.kind, readNestedContentRecord(block.draftContent)),
42023
- ...admission ? { admission } : {}
42884
+ purpose: block.purpose
42024
42885
  };
42025
42886
  }
42026
42887
  function readInvalidBlockAdmission(value) {
@@ -42033,7 +42894,7 @@ function buildPageOutline(input) {
42033
42894
  name: input.name,
42034
42895
  path: input.path ?? input.fallbackPath,
42035
42896
  purpose: input.purpose,
42036
- blocks: input.blocks.map(convertPageResponseBlock)
42897
+ blocks: input.blocks.map((block) => convertPageResponseBlock(block, input.previewStage))
42037
42898
  };
42038
42899
  }
42039
42900
  function buildRenderablePageOutline(input) {
@@ -42059,6 +42920,8 @@ function projectRenderablePageOutline(page) {
42059
42920
  function admitSdkRuntimePageBlock(block, customBlocks) {
42060
42921
  const base = {
42061
42922
  id: block.id,
42923
+ draftContentId: block.draftContentId,
42924
+ publishedPlacement: block.publishedPlacement,
42062
42925
  ...block.contentVersionId !== void 0 ? { contentVersionId: block.contentVersionId } : {},
42063
42926
  kind: block.kind,
42064
42927
  purpose: block.purpose,
@@ -42120,6 +42983,40 @@ function sanitizeNullableSdkRuntimeBlockContent(blockKind, content) {
42120
42983
  *
42121
42984
  * Use this in client components for dynamic page loading.
42122
42985
  */
42986
+ async function loadUsePageSuccess(input) {
42987
+ const { client, site, pageResponse, siteId, path, pageId, preview } = input;
42988
+ const pageData = pageResponse.page;
42989
+ const mediaAssets = collectMediaAssetSidecar(pageResponse.mediaAssets);
42990
+ const previewStage = preview ? "preview" : "published";
42991
+ const pageOutline = buildRenderablePageOutline({
42992
+ name: pageData.name,
42993
+ path: pageData.path ?? path,
42994
+ fallbackPath: path,
42995
+ purpose: pageData.purpose,
42996
+ blocks: pageData.blocks,
42997
+ previewStage,
42998
+ customBlocks: resolveSiteCustomBlocks(site)
42999
+ });
43000
+ const resolvedData = await prefetchBlockData(projectRenderablePageOutline(pageOutline), {
43001
+ siteId,
43002
+ pageId: pageId ?? pageData.id,
43003
+ previewStage
43004
+ }, client);
43005
+ return {
43006
+ loading: false,
43007
+ error: null,
43008
+ page: pageOutline,
43009
+ runtimeJoins: pageData.runtimeJoins,
43010
+ theme: requireSdkTheme(site.theme, siteId),
43011
+ siteId,
43012
+ resolvedData,
43013
+ dataContext: { previewStage },
43014
+ mailingList: site.mailingList,
43015
+ sdkConfig: site.sdkConfig ?? null,
43016
+ supabaseUrl: site.supabaseUrl,
43017
+ ...mediaAssets ? { mediaAssets } : {}
43018
+ };
43019
+ }
42123
43020
  /**
42124
43021
  * Client-side React hook to fetch all data needed for <Page> component.
42125
43022
  *
@@ -42210,36 +43107,17 @@ function usePage(params) {
42210
43107
  if (cancelled) return;
42211
43108
  if ("entry" in pageResponse) throw new Error("This path resolves to a content entry, not a page. Use useContent() instead, which handles both pages and entries. For entries, useContent() returns the raw entry data for custom rendering.");
42212
43109
  if ("pageSurface" in pageResponse) throw new Error("This path resolves to a page surface, not a page. Use useContent() instead, which handles pages, entries, and page surfaces.");
42213
- const { page: pageData } = pageResponse;
42214
- const canonicalPagePath = pageData.path ?? path;
42215
- const mediaAssets = Array.isArray(pageResponse.mediaAssets) && pageResponse.mediaAssets.length > 0 ? toMediaAssetSidecar(pageResponse.mediaAssets) : void 0;
42216
- const pageOutline = buildRenderablePageOutline({
42217
- name: pageData.name,
42218
- path: canonicalPagePath,
42219
- fallbackPath: path,
42220
- purpose: pageData.purpose,
42221
- blocks: pageData.blocks,
42222
- customBlocks: resolveSiteCustomBlocks(site)
42223
- });
42224
- const resolvedData = await prefetchBlockData(projectRenderablePageOutline(pageOutline), {
43110
+ const success = await loadUsePageSuccess({
43111
+ client,
43112
+ site,
43113
+ pageResponse,
42225
43114
  siteId,
42226
- pageId: pageId ?? pageData.id,
42227
- previewStage: preview ? "preview" : "published"
42228
- }, client);
42229
- if (cancelled) return;
42230
- setResult({
42231
- loading: false,
42232
- error: null,
42233
- page: pageOutline,
42234
- runtimeBoundaries: pageData.runtimeBoundaries,
42235
- theme: requireSdkTheme(site.theme, siteId),
42236
- siteId,
42237
- resolvedData,
42238
- mailingList: site.mailingList,
42239
- sdkConfig: site.sdkConfig ?? null,
42240
- supabaseUrl: site.supabaseUrl,
42241
- ...mediaAssets ? { mediaAssets } : {}
43115
+ path,
43116
+ pageId,
43117
+ preview
42242
43118
  });
43119
+ if (cancelled) return;
43120
+ setResult(success);
42243
43121
  } catch (error) {
42244
43122
  if (cancelled) return;
42245
43123
  setResult({
@@ -42266,9 +43144,6 @@ function usePage(params) {
42266
43144
  ]);
42267
43145
  return result;
42268
43146
  }
42269
- function toMediaAssetSidecar(mediaAssets) {
42270
- return mediaAssets ?? [];
42271
- }
42272
43147
  //#endregion
42273
43148
  //#region src/hooks/index.ts
42274
43149
  /**