@riverbankcms/sdk 0.139.0 → 0.141.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 (232) hide show
  1. package/README.md +1 -1
  2. package/dist/{PreviewEditorSidebar-BDeenhi3.mjs → PreviewEditorSidebar-Q-fy9GYw.mjs} +4 -4
  3. package/dist/{PreviewEditorUI-DSRhgjF5.mjs → PreviewEditorUI-LYGzgk85.mjs} +3 -3
  4. package/dist/{PreviewQueryProvider-D2K8GLUG.mjs → PreviewQueryProvider-CN0ewic5.mjs} +1 -1
  5. package/dist/{SdkPreviewModeRuntime-CL7wSnYu.mjs → SdkPreviewModeRuntime-CoPYI5Jq.mjs} +90 -50
  6. package/dist/{SiteChromeCustomizeContext-BhDn-5ir.mjs → SiteChromeCustomizeContext-D8LePX8x.mjs} +2731 -1303
  7. package/dist/_dts/ai/src/contracts/proposals.d.ts +165 -165
  8. package/dist/_dts/ai/src/contracts/siteStyleProposalSchemas.d.ts +212 -212
  9. package/dist/_dts/api/src/accessAdmin.d.ts +74 -104
  10. package/dist/_dts/api/src/aiEndpoints.d.ts +5 -1
  11. package/dist/_dts/api/src/authSubmission.d.ts +46 -0
  12. package/dist/_dts/api/src/billing.d.ts +8 -4
  13. package/dist/_dts/api/src/billingEndpointDefinitions.d.ts +23 -0
  14. package/dist/_dts/api/src/billingEndpointTypes.d.ts +26 -0
  15. package/dist/_dts/api/src/blocks.d.ts +2 -0
  16. package/dist/_dts/api/src/bookingRecords.d.ts +1 -2
  17. package/dist/_dts/api/src/commercePortalEndpoints.d.ts +8 -1
  18. package/dist/_dts/api/src/communications.d.ts +0 -1
  19. package/dist/_dts/api/src/contentRuntime.d.ts +17 -31
  20. package/dist/_dts/api/src/domainConnection.d.ts +4 -0
  21. package/dist/_dts/api/src/endpoints.d.ts +93 -64
  22. package/dist/_dts/api/src/event-destination-policy.d.ts +2 -1
  23. package/dist/_dts/api/src/footerCompositionContracts.d.ts +25 -0
  24. package/dist/_dts/api/src/footerSettings.d.ts +9 -6
  25. package/dist/_dts/api/src/index.d.ts +6 -7
  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 +1 -0
  29. package/dist/_dts/api/src/mailingListIntegration.d.ts +8 -2
  30. package/dist/_dts/api/src/navigation/dashboardSettingsNav.d.ts +1 -1
  31. package/dist/_dts/api/src/navigation/dashboardSiteNav.d.ts +2 -1
  32. package/dist/_dts/api/src/navigation/types.d.ts +1 -1
  33. package/dist/_dts/api/src/onboarding/confirmationResend.d.ts +25 -0
  34. package/dist/_dts/api/src/onboarding/surfaceData.d.ts +32 -32
  35. package/dist/_dts/api/src/publicBookingAvailabilityEndpointDefinitions.d.ts +8 -0
  36. package/dist/_dts/api/src/publicExperience/commerceEndpoints.d.ts +1 -0
  37. package/dist/_dts/api/src/publicExperience/eventEndpoints.d.ts +11 -3
  38. package/dist/_dts/api/src/publicExperience/sharedTypes.d.ts +3 -29
  39. package/dist/_dts/api/src/publicOnboardingAttemptEndpointDefinitions.d.ts +65 -0
  40. package/dist/_dts/api/src/saveOutcome.d.ts +20 -0
  41. package/dist/_dts/api/src/sdkContracts.d.ts +3 -22
  42. package/dist/_dts/api/src/sdkPushContracts.d.ts +18 -0
  43. package/dist/_dts/api/src/sdkThemeWire.d.ts +44 -44
  44. package/dist/_dts/api/src/settings/permissions.d.ts +12 -0
  45. package/dist/_dts/api/src/siteManagementEndpoints.d.ts +10 -29
  46. package/dist/_dts/api/src/siteOnboarding.d.ts +9 -9
  47. package/dist/_dts/api/src/sitePlatformEndpoints.d.ts +2 -4
  48. package/dist/_dts/api/src/siteRuntimeEndpoints.d.ts +3 -1
  49. package/dist/_dts/api/src/siteSettings.d.ts +20 -7
  50. package/dist/_dts/api/src/types.d.ts +77 -77
  51. package/dist/_dts/api/src/wholeSeriesRuns.d.ts +2 -37
  52. package/dist/_dts/billing/src/membership/index.d.ts +3 -0
  53. package/dist/_dts/billing/src/plans/types.d.ts +3 -0
  54. package/dist/_dts/billing/src/site-arrangements.d.ts +23 -3
  55. package/dist/_dts/blocks/src/contracts/proof-block-islands.d.ts +20 -4
  56. package/dist/_dts/blocks/src/pageRenderAdmission.d.ts +2 -0
  57. package/dist/_dts/blocks/src/pageRendererContracts.d.ts +7 -0
  58. package/dist/_dts/blocks/src/portal/types.d.ts +2 -4
  59. package/dist/_dts/blocks/src/portal/waitlist-types.d.ts +35 -0
  60. package/dist/_dts/blocks/src/system/blocks/event-registration.d.ts +2 -0
  61. package/dist/_dts/blocks/src/system/blocks/events/event-calendar.d.ts +2 -0
  62. package/dist/_dts/blocks/src/system/blocks/events/eventSelectionFields.d.ts +122 -0
  63. package/dist/_dts/blocks/src/system/blocks/events/shared/calendarWindow.d.ts +2 -1
  64. package/dist/_dts/blocks/src/system/blocks/events/shared/eventSelection.d.ts +11 -0
  65. package/dist/_dts/blocks/src/system/blocks/events/shared/schemas.d.ts +42 -0
  66. package/dist/_dts/blocks/src/system/blocks/events/shared/types.d.ts +4 -0
  67. package/dist/_dts/blocks/src/system/blocks/location-map.d.ts +2 -2
  68. package/dist/_dts/blocks/src/system/blocks/media-text.d.ts +47 -47
  69. package/dist/_dts/blocks/src/system/data/index.d.ts +2 -2
  70. package/dist/_dts/blocks/src/system/data/prefetchBlockData.d.ts +7 -1
  71. package/dist/_dts/blocks/src/system/data/types.d.ts +9 -0
  72. package/dist/_dts/blocks/src/system/data/utils.d.ts +1 -1
  73. package/dist/_dts/blocks/src/system/manifest/schema.d.ts +27 -1
  74. package/dist/_dts/blocks/src/system/registry.d.ts +1 -0
  75. package/dist/_dts/blocks/src/system/runtime/api/client.d.ts +0 -28
  76. package/dist/_dts/blocks/src/system/runtime/api/index.d.ts +1 -1
  77. package/dist/_dts/blocks/src/system/runtime/api/types/events.d.ts +7 -3
  78. package/dist/_dts/blocks/src/system/runtime/api/types/portal.d.ts +1 -1
  79. package/dist/_dts/blocks/src/system/runtime/api/types/waitlist-claims.d.ts +7 -2
  80. package/dist/_dts/blocks/src/system/runtime/components/registry.client.d.ts +42 -186
  81. package/dist/_dts/blocks/src/system/runtime/components/runtime-backed-blocks.d.ts +21 -93
  82. package/dist/_dts/blocks/src/system/runtime/hooks/useEventFilters.d.ts +2 -1
  83. package/dist/_dts/blocks/src/system/runtime/nodes/appointment-services.d.ts +48 -1
  84. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/EventRegistrationSurface.d.ts +1 -2
  85. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/TicketSelectionStep.d.ts +2 -0
  86. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/checkoutRecovery.d.ts +14 -0
  87. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/eventSourceRecovery.d.ts +56 -0
  88. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/hooks.d.ts +4 -0
  89. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/hooks.state.d.ts +5 -0
  90. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/types.d.ts +6 -8
  91. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/useCheckoutRecovery.d.ts +8 -0
  92. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/useDiscountCodeUi.d.ts +3 -0
  93. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/useDiscountCodeUi.state.d.ts +10 -3
  94. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/useEventCheckoutHandoffRestore.d.ts +9 -0
  95. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/useEventRegistrationSubmit.d.ts +8 -7
  96. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/useEventRegistrationWizard.d.ts +14 -7
  97. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/useEventSourceRecovery.d.ts +18 -0
  98. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/useSettledCommerceView.d.ts +37 -0
  99. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration.client.d.ts +1 -1
  100. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration.interactive.d.ts +24 -6
  101. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration.server.d.ts +4 -2
  102. package/dist/_dts/blocks/src/system/runtime/nodes/events/EventCombined.client.d.ts +4 -3
  103. package/dist/_dts/blocks/src/system/runtime/nodes/events/EventCombined.interactive.d.ts +3 -0
  104. package/dist/_dts/blocks/src/system/runtime/nodes/events/EventListing.interactive.d.ts +11 -101
  105. package/dist/_dts/blocks/src/system/runtime/nodes/events/shared/eventCollectionContract.d.ts +7 -2
  106. package/dist/_dts/blocks/src/system/runtime/nodes/events/shared/listOptions.d.ts +2 -0
  107. package/dist/_dts/blocks/src/system/runtime/nodes/newsletter-form.interactive.d.ts +6 -0
  108. package/dist/_dts/blocks/src/system/runtime/nodes/newsletter-form.types.d.ts +1 -0
  109. package/dist/_dts/blocks/src/system/runtime/resolver.d.ts +1 -0
  110. package/dist/_dts/blocks/src/system/runtime/shared/components/index.d.ts +2 -6
  111. package/dist/_dts/blocks/src/system/runtime/shared/index.d.ts +2 -2
  112. package/dist/_dts/blocks/src/system/runtime/shared/useWaitlistClaim.d.ts +2 -0
  113. package/dist/_dts/blocks/src/system/transforms/registry/eventCalendar.d.ts +12 -0
  114. package/dist/_dts/commerce/src/purchase/bookingInstalmentSchedule.d.ts +4 -0
  115. package/dist/_dts/commerce/src/purchase/event-registration-errors.d.ts +4 -0
  116. package/dist/_dts/commerce/src/purchase/orderItemMetadata.d.ts +27 -4
  117. package/dist/_dts/content-editor/src/controller/EntryControllerProvider.d.ts +2 -1
  118. package/dist/_dts/content-editor/src/hooks/useBlockAutosave.d.ts +3 -1
  119. package/dist/_dts/content-editor/src/useFooterComposerState.d.ts +3 -0
  120. package/dist/_dts/core/src/branded.d.ts +0 -8
  121. package/dist/_dts/core/src/index.d.ts +1 -0
  122. package/dist/_dts/core/src/mailing-list-setup-parser.d.ts +1 -1
  123. package/dist/_dts/core/src/mailing-list-setup.d.ts +14 -1
  124. package/dist/_dts/core/src/mailing-list-submission.d.ts +7 -27
  125. package/dist/_dts/core/src/participants.d.ts +2 -29
  126. package/dist/_dts/core/src/public-experience.d.ts +4 -0
  127. package/dist/_dts/core/src/public-profile.d.ts +27 -1
  128. package/dist/_dts/core/src/site-route-target.d.ts +9 -2
  129. package/dist/_dts/db/src/generated/supabase/database.types.d.ts +296 -606
  130. package/dist/_dts/editor-blocks/src/widgets/mailing-list-targeting/MailingListGlobalSettingsSummary.d.ts +10 -0
  131. package/dist/_dts/editor-blocks/src/widgets/mailing-list-targeting/MailingListTargetingField.d.ts +3 -2
  132. package/dist/_dts/editor-blocks/src/widgets/mailing-list-targeting/context.d.ts +3 -2
  133. package/dist/_dts/editor-blocks/src/widgets/mailing-list-targeting/loaders.d.ts +3 -2
  134. package/dist/_dts/editor-blocks/src/widgets/mailing-list-targeting/targetingState.d.ts +19 -0
  135. package/dist/_dts/editor-blocks/src/widgets/site-option-picker/loaders.d.ts +27 -1
  136. package/dist/_dts/sdk/src/public-api/contracts.d.ts +14 -20
  137. package/dist/_dts/sdk/src/rendering/blocks-page-renderer.d.ts +2 -0
  138. package/dist/_dts/sdk/src/rendering/components/pageShared.d.ts +2 -0
  139. package/dist/_dts/sdk/src/rendering/helpers/pageRuntimeSupport.d.ts +7 -1
  140. package/dist/_dts/sdk/src/rendering/helpers/templateContent.d.ts +1 -0
  141. package/dist/_dts/sdk/src/version.d.ts +1 -1
  142. package/dist/_dts/theme-core/src/ThemeFontLoader.d.ts +17 -1
  143. package/dist/_dts/theme-core/src/accordions/types.d.ts +3 -3
  144. package/dist/_dts/theme-core/src/buttons/affordanceSuppression.d.ts +17 -0
  145. package/dist/_dts/theme-core/src/buttons/buttonColourContract.d.ts +1 -1
  146. package/dist/_dts/theme-core/src/buttons/classNames.d.ts +16 -0
  147. package/dist/_dts/theme-core/src/buttons/generateButtonCss.d.ts +0 -6
  148. package/dist/_dts/theme-core/src/buttons/resolvedButtonCss.d.ts +4 -4
  149. package/dist/_dts/theme-core/src/cards/types.d.ts +21 -21
  150. package/dist/_dts/theme-core/src/generated/containerResponsiveThemeCss.d.ts +1 -1
  151. package/dist/_dts/theme-core/src/header/interactionPalette.d.ts +8 -2
  152. package/dist/_dts/theme-core/src/header/legacyHeaderVariant.d.ts +2 -2
  153. package/dist/_dts/theme-core/src/hosted-booking-appearance.d.ts +54 -12
  154. package/dist/_dts/theme-core/src/index.d.ts +1 -1
  155. package/dist/_dts/theme-core/src/inputs/types.d.ts +2 -2
  156. package/dist/_dts/theme-core/src/mock-themes/all.d.ts +54 -54
  157. package/dist/_dts/theme-core/src/runtime/buildThemeRuntimeFromBridge.d.ts +1 -4
  158. package/dist/_dts/theme-core/src/schema.d.ts +84 -84
  159. package/dist/_dts/theme-core/src/shared/componentStyles.d.ts +1 -1
  160. package/dist/_dts/theme-core/src/site-styles/backgroundAppearance.d.ts +2 -2
  161. package/dist/_dts/theme-core/src/surfaces/foregroundInteraction.d.ts +77 -0
  162. package/dist/_dts/theme-core/src/surfaces/index.d.ts +1 -0
  163. package/dist/_dts/theme-core/src/typography/generateTypographyCss.d.ts +2 -2
  164. package/dist/_dts/ui/src/lib/use-delayed-flag.d.ts +9 -0
  165. package/dist/_dts/ui/src/pending-button.d.ts +10 -0
  166. package/dist/client/{BookingConsentAgreement-CZvTDtsK.mjs → BookingConsentAgreement-xJeYNdnb.mjs} +4 -4
  167. package/dist/client/{DiscountCodeDisclosure-D-DsLCMU.mjs → DiscountCodeDisclosure-DdT6uzl9.mjs} +1 -1
  168. package/dist/client/{EventCombined.client-dWqgd5ZO.mjs → EventCombined.client-Cp28uYuM.mjs} +12 -16
  169. package/dist/client/{EventListing.client-BMRa9IYp.mjs → EventListing.client-CD6AJsMr.mjs} +4 -17
  170. package/dist/client/{LeafletStaticMap-D21W9kBZ.mjs → LeafletStaticMap-DBsAi9-e.mjs} +1 -1
  171. package/dist/client/{accordion-FxF_ta47.mjs → accordion-6dwbOKYR.mjs} +1 -1
  172. package/dist/client/{bookingForm-YnwW4TGw.mjs → bookingForm-CZE9_qPQ.mjs} +7 -7
  173. package/dist/client/bookings.mjs +500 -233
  174. package/dist/client/{carousel-vng7fFT5.mjs → carousel-7VHGQARz.mjs} +2 -2
  175. package/dist/client/{carousel.client-59G_WMr4.mjs → carousel.client-DQTjCVQT.mjs} +1 -1
  176. package/dist/client/{cart-DEPDsjNk.mjs → cart-Qg_mvQhh.mjs} +3 -3
  177. package/dist/client/{checkout-CZRWu9rW.mjs → checkout-D84rpgdr.mjs} +3 -3
  178. package/dist/client/{checkoutUrls-BuseL0dw.mjs → checkoutUrls-FL6lRkrt.mjs} +1 -1
  179. package/dist/client/client.mjs +2315 -1017
  180. package/dist/client/{colorStyles-CrxJrPjJ.mjs → colorStyles-3013aRAY.mjs} +3 -1
  181. package/dist/client/{context-DvU_WUmd.mjs → context-Ctp3T0Wr.mjs} +6 -19
  182. package/dist/client/{dates-wnPMiRl5.mjs → dates-DJKFcI_N.mjs} +2 -2
  183. package/dist/client/{eventCalendar-BA3Q5L15.mjs → eventCalendar-CK31z3vs.mjs} +12 -8
  184. package/dist/client/{eventCombined-51wgR-1R.mjs → eventCombined-DiXd-ewn.mjs} +3 -3
  185. package/dist/client/{eventDetails-modaetpm.mjs → eventDetails-CTRgt2DK.mjs} +4 -4
  186. package/dist/client/{eventListing-D8t2J3Kv.mjs → eventListing-Dy9vi_j_.mjs} +3 -3
  187. package/dist/client/{eventRegistration-CYqtkCE_.mjs → eventRegistration-CnalYMr2.mjs} +618 -177
  188. package/dist/client/{form-CBKXN5In.mjs → form-eUiMveTT.mjs} +3 -3
  189. package/dist/client/{headerSection-DylDqNrs.mjs → headerSection-Dy9kQpB1.mjs} +2 -2
  190. package/dist/client/hooks.mjs +692 -212
  191. package/dist/client/{locationMap-CvWrG0vZ.mjs → locationMap-DalCmWU0.mjs} +3 -3
  192. package/dist/client/{media-BOHuueS5.mjs → media-DHpfFwd3.mjs} +1 -1
  193. package/dist/client/{newsletterForm-Btwk70zw.mjs → newsletterForm-SDDPvhS0.mjs} +150 -94
  194. package/dist/client/{pricing-Uzw-GQ6Y.mjs → pricing-OcMz4SnX.mjs} +1 -1
  195. package/dist/client/{productDetail-JLcUYKnd.mjs → productDetail-BQrgHElM.mjs} +3 -3
  196. package/dist/client/{productList-FM0cbUzj.mjs → productList-OnPn_UJj.mjs} +3 -3
  197. package/dist/client/{propsDecoder-DYzafZb2.mjs → propsDecoder-zBdsnS-N.mjs} +168 -32
  198. package/dist/client/rendering/client.mjs +1355 -519
  199. package/dist/client/rendering/islands.mjs +19 -19
  200. package/dist/client/rendering.mjs +2294 -953
  201. package/dist/client/{scrollToBlock-CvXszexS.mjs → scrollToBlock-BNM4Ob2Y.mjs} +28 -11
  202. package/dist/client/{shop-BIcjvy5a.mjs → shop-Bv1fPTwQ.mjs} +6 -6
  203. package/dist/client/{shop-commerce-BZQsy7xw.mjs → shop-commerce-D4KNGaW8.mjs} +7 -7
  204. package/dist/client/{shop-commerce-store-D5V7XAb5.mjs → shop-commerce-store-2N5EV0Rc.mjs} +1 -1
  205. package/dist/client/{shopShared-DowkXevB.mjs → shopShared-DvJGdHTV.mjs} +4 -4
  206. package/dist/client/{useEventFilters-oMoTw_JE.mjs → useEventFilters-BBBvGDHQ.mjs} +19 -13
  207. package/dist/preview-next/before-render.mjs +119 -64
  208. package/dist/preview-next/client/runtime.mjs +4 -4
  209. package/dist/preview-next/editor-chrome.css +4 -8
  210. package/dist/preview-next/keepAlive.mjs +119 -64
  211. package/dist/preview-next/middleware.mjs +119 -64
  212. package/dist/{previewAuthStore-COUyAKaX.mjs → previewAuthStore-Gjb6r6vz.mjs} +119 -64
  213. package/dist/{sdk-runtime-D4k2LSGF.mjs → sdk-runtime-Defnbfzw.mjs} +2 -2
  214. package/dist/{separator-UGtpag4Z.mjs → separator-CZXO3Sb0.mjs} +1 -1
  215. package/dist/server/components.mjs +1170 -384
  216. package/dist/server/config-validation.mjs +560 -105
  217. package/dist/server/config.mjs +564 -109
  218. package/dist/server/data.mjs +688 -212
  219. package/dist/server/index.mjs +126 -66
  220. package/dist/server/next.mjs +1429 -662
  221. package/dist/server/page-converter.mjs +372 -99
  222. package/dist/server/prebuild.mjs +1 -1
  223. package/dist/server/rendering/server.mjs +1624 -817
  224. package/dist/server/rendering.mjs +1200 -391
  225. package/dist/server/routing.mjs +767 -247
  226. package/dist/server/server.mjs +715 -276
  227. package/dist/server/theme-bridge.mjs +475 -110
  228. package/dist/server/theme.mjs +9 -3
  229. package/dist/styles/index.css +265 -45
  230. package/package.json +1 -1
  231. package/dist/_dts/blocks/src/system/runtime/shared/components/BookingOptionCompactRow.d.ts +0 -29
  232. package/dist/_dts/blocks/src/system/runtime/shared/components/BookingOptionList.d.ts +0 -13
@@ -30,10 +30,12 @@ const unsafeAsApiKeyId = (id) => id;
30
30
  const unsafeAsEventOfferingId = (id) => id;
31
31
  const unsafeAsEventSeriesId = (id) => id;
32
32
  const unsafeAsUserId = (id) => id;
33
+ const unsafeAsContentVersionId = (id) => id;
33
34
  const parseSiteId = (value) => parseUuidBrand(value, unsafeAsSiteId);
34
35
  const parseApiKeyId = (value) => parseUuidBrand(value, unsafeAsApiKeyId);
35
36
  const parseEventOfferingId = (value) => parseUuidBrand(value, unsafeAsEventOfferingId);
36
37
  const parseUserId = (value) => parseUuidBrand(value, unsafeAsUserId);
38
+ const parseContentVersionId = (value) => parseUuidBrand(value, unsafeAsContentVersionId);
37
39
  const parseEventSeriesId = (value) => parseUuidBrand(value, unsafeAsEventSeriesId);
38
40
  //#endregion
39
41
  //#region ../core/src/assert-never.ts
@@ -267,7 +269,7 @@ function parseEventPageSurfaceDestinationMode(value) {
267
269
  return value === "cms-managed" || value === "system-managed" ? value : void 0;
268
270
  }
269
271
  function parseEventPageSurfaceSubject(value) {
270
- if (!isRecord$15(value)) return err({ kind: "notObject" });
272
+ if (!isRecord$16(value)) return err({ kind: "notObject" });
271
273
  switch (value.kind) {
272
274
  case "eventSeries": {
273
275
  const eventSeriesId = parseEventSeriesId(value.eventSeriesId);
@@ -322,7 +324,7 @@ function parseEventSeriesIdList(values) {
322
324
  }
323
325
  return ok(parsed);
324
326
  }
325
- function isRecord$15(value) {
327
+ function isRecord$16(value) {
326
328
  return typeof value === "object" && value !== null && !Array.isArray(value);
327
329
  }
328
330
  //#endregion
@@ -506,16 +508,47 @@ function parsePositiveInteger(value) {
506
508
  function parseNewsletterListId(value) {
507
509
  return parseTrimmedMatchingString(value, UUID_PATTERN);
508
510
  }
511
+ function parseMailchimpAccountId(value) {
512
+ return parseTrimmedMatchingString(value, OPAQUE_ID_PATTERN);
513
+ }
509
514
  function parseMailchimpAudienceId(value) {
510
515
  return parseTrimmedMatchingString(value, OPAQUE_ID_PATTERN);
511
516
  }
512
517
  function parseMailchimpInterestId(value) {
513
518
  return parseTrimmedMatchingString(value, OPAQUE_ID_PATTERN);
514
519
  }
520
+ function parseBrevoAccountId(value) {
521
+ return parseTrimmedMatchingString(value, OPAQUE_ID_PATTERN);
522
+ }
515
523
  function parseBrevoListId(value) {
516
524
  return parsePositiveInteger(value);
517
525
  }
518
526
  //#endregion
527
+ //#region ../core/src/mailing-list-setup.ts
528
+ function isRecord$15(value) {
529
+ return typeof value === "object" && value !== null && !Array.isArray(value);
530
+ }
531
+ const DEFAULT_MAILING_LIST_SUCCESS_MESSAGE = "Thanks — you're on the list.";
532
+ function parseMailingListProviderScope(value) {
533
+ if (!isRecord$15(value)) return err("invalid_mailing_list_provider_scope");
534
+ if (value.provider === "native") return ok({ provider: "native" });
535
+ if (value.provider === "brevo") {
536
+ const accountId = parseBrevoAccountId(value.accountId);
537
+ return accountId !== null ? ok({
538
+ provider: "brevo",
539
+ accountId
540
+ }) : err("invalid_mailing_list_provider_scope");
541
+ }
542
+ if (value.provider === "mailchimp") {
543
+ const accountId = parseMailchimpAccountId(value.accountId);
544
+ return accountId !== null ? ok({
545
+ provider: "mailchimp",
546
+ accountId
547
+ }) : err("invalid_mailing_list_provider_scope");
548
+ }
549
+ return err("invalid_mailing_list_provider_scope");
550
+ }
551
+ //#endregion
519
552
  //#region ../core/src/mailing-list-setup-parser.ts
520
553
  function parseMailingListGlobalForm(value) {
521
554
  if (!isRecord$14(value)) return formError("shape");
@@ -524,12 +557,15 @@ function parseMailingListGlobalForm(value) {
524
557
  if (typeof value.includeOptionalPhone !== "boolean") return formError("includeOptionalPhone");
525
558
  const buttonLabel = parseRequiredString(value.buttonLabel);
526
559
  if (buttonLabel === null) return formError("buttonLabel");
560
+ const successMessage = parseRequiredString(value.successMessage);
561
+ if (successMessage === null) return formError("successMessage");
527
562
  const privacyNote = parseOptionalString(value.privacyNote);
528
563
  if (privacyNote === void 0) return formError("privacyNote");
529
564
  return ok({
530
565
  fields,
531
566
  includeOptionalPhone: value.includeOptionalPhone,
532
567
  buttonLabel,
568
+ successMessage,
533
569
  privacyNote
534
570
  });
535
571
  }
@@ -859,11 +895,17 @@ function parseMailingListSignedSourceToken(value) {
859
895
  const parsed = typeof value === "string" ? value.trim() : "";
860
896
  return /^[A-Za-z0-9._~-]{16,1000}$/u.test(parsed) ? parsed : null;
861
897
  }
862
- function buildMailingListSignupBlockSourceRef(blockId) {
863
- const parsed = parseMailingListBlockId(blockId);
864
- return parsed !== null ? {
898
+ function parseMailingListContentVersionId(value) {
899
+ const parsed = parseContentVersionId(value);
900
+ return parsed.ok ? parsed.value : null;
901
+ }
902
+ function buildMailingListSignupBlockSourceRef(blockId, contentVersionId) {
903
+ const parsedBlockId = parseMailingListBlockId(blockId);
904
+ const parsedContentVersionId = parseMailingListContentVersionId(contentVersionId);
905
+ return parsedBlockId !== null && parsedContentVersionId !== null ? {
865
906
  tag: "block_ref",
866
- blockId: parsed
907
+ blockId: parsedBlockId,
908
+ contentVersionId: parsedContentVersionId
867
909
  } : null;
868
910
  }
869
911
  //#endregion
@@ -2482,7 +2524,7 @@ const BUTTON_CONTRAST_POLICY = {
2482
2524
  nonTextMinimumRatio: 3,
2483
2525
  gradientSamplesPerSegment: 20,
2484
2526
  alphaBackgrounds: "reject-without-known-surface",
2485
- disabled: "retain-full-colour-contract"
2527
+ disabled: "validated-colour-pair-with-muted-control-opacity"
2486
2528
  };
2487
2529
  function validateButtonSurfaceContrast(input) {
2488
2530
  const ratio = contrastRatio(input.buttonPaint, input.surfaceHex);
@@ -3008,59 +3050,108 @@ function interpolateHex(startHex, endHex, position) {
3008
3050
  const channel = (from, to) => Math.round(from + (to - from) * position).toString(16).padStart(2, "0");
3009
3051
  return `#${channel(start.r, end.r)}${channel(start.g, end.g)}${channel(start.b, end.b)}`;
3010
3052
  }
3011
- shadeBackgroundEffect({
3012
- id: "darken-background",
3013
- name: "Darken on Hover",
3014
- description: "Darkens the background color on hover",
3015
- label: "Darken Amount (shade step)",
3016
- shadeDirection: 1
3017
- });
3018
- shadeBackgroundEffect({
3019
- id: "lighten-background",
3020
- name: "Lighten on Hover",
3021
- description: "Lightens the background color on hover",
3022
- label: "Lighten Amount (shade step)",
3023
- shadeDirection: -1
3024
- });
3025
- function shadeBackgroundEffect(config) {
3026
- return {
3027
- id: config.id,
3028
- name: config.name,
3029
- description: config.description,
3030
- category: "background",
3031
- pseudoElement: "none",
3032
- applicableTo: ["button"],
3033
- customizableOption: {
3034
- name: "amount",
3035
- type: "select",
3036
- label: config.label,
3037
- default: 100,
3038
- options: [
3039
- 0,
3040
- 100,
3041
- 200,
3042
- 300,
3043
- 400,
3044
- 500,
3045
- 600,
3046
- 700,
3047
- 800,
3048
- 900
3049
- ]
3053
+ //#endregion
3054
+ //#region ../theme-core/src/tokens/tokens.ts
3055
+ const defaultThemeTokens = {
3056
+ color: {
3057
+ "background/base": "#ffffff",
3058
+ "background/elevated": "#f5f5f5",
3059
+ "surface/base": "#ffffff",
3060
+ "surface/subtle": "#f9f9fb",
3061
+ "surface/inverted": "#111111",
3062
+ "content/primary": "#111111",
3063
+ "content/secondary": "#3f3f46",
3064
+ "accent/primary": "#2563eb",
3065
+ "accent/secondary": "#1d4ed8",
3066
+ "border/base": "#e5e7eb"
3067
+ },
3068
+ typography: {
3069
+ "display/hero": {
3070
+ fontSize: "clamp(48px, 8vw, 96px)",
3071
+ lineHeight: "1.05",
3072
+ fontWeight: "700"
3050
3073
  },
3051
- isApplicable: (buttonConfig) => buttonConfig.background.type === "solid",
3052
- generateCSS: ({ themeId, variantId, options, tokens, buttonConfig }) => {
3053
- if (buttonConfig.background.type !== "solid") return "";
3054
- const amount = (options.amount || 100) * config.shadeDirection;
3055
- const baseToken = buttonConfig.background.colorToken ?? "primary-500";
3056
- return `
3057
- :where([data-theme-scope="${themeId}"]) .${variantId}:hover {
3058
- background-color: ${tokens.getColor(tokens.adjustShade(baseToken, amount))};
3059
- }
3060
- `;
3074
+ "display/section": {
3075
+ fontSize: "clamp(40px, 6vw, 72px)",
3076
+ lineHeight: "1.1",
3077
+ fontWeight: "700"
3078
+ },
3079
+ "heading/large": {
3080
+ fontSize: "clamp(32px, 4vw, 48px)",
3081
+ lineHeight: "1.2",
3082
+ fontWeight: "600"
3083
+ },
3084
+ "heading/medium": {
3085
+ fontSize: "clamp(24px, 3vw, 32px)",
3086
+ lineHeight: "1.25",
3087
+ fontWeight: "600"
3088
+ },
3089
+ "heading/small": {
3090
+ fontSize: "20px",
3091
+ lineHeight: "1.3",
3092
+ fontWeight: "600"
3093
+ },
3094
+ "body/normal": {
3095
+ fontSize: "16px",
3096
+ lineHeight: "1.6",
3097
+ fontWeight: "400"
3098
+ },
3099
+ "body/small": {
3100
+ fontSize: "14px",
3101
+ lineHeight: "1.5",
3102
+ fontWeight: "400"
3103
+ },
3104
+ caption: {
3105
+ fontSize: "12px",
3106
+ lineHeight: "1.4",
3107
+ fontWeight: "500"
3061
3108
  }
3062
- };
3063
- }
3109
+ },
3110
+ spacing: {
3111
+ none: "0px",
3112
+ "3xs": "4px",
3113
+ "2xs": "8px",
3114
+ xs: "12px",
3115
+ sm: "16px",
3116
+ md: "24px",
3117
+ lg: "32px",
3118
+ xl: "40px",
3119
+ "2xl": "56px",
3120
+ "3xl": "72px"
3121
+ },
3122
+ radius: {
3123
+ none: "0px",
3124
+ xs: "2px",
3125
+ sm: "4px",
3126
+ md: "8px",
3127
+ lg: "12px",
3128
+ pill: "999px",
3129
+ full: "9999px"
3130
+ },
3131
+ shadow: {
3132
+ none: "none",
3133
+ soft: "0px 2px 8px rgba(15, 23, 42, 0.08)",
3134
+ medium: "0px 6px 18px rgba(15, 23, 42, 0.12)",
3135
+ strong: "0px 12px 36px rgba(15, 23, 42, 0.16)"
3136
+ },
3137
+ palette: {
3138
+ surface: "#ffffff",
3139
+ "neutral-50": "#f9fafb",
3140
+ "neutral-900": "#111827",
3141
+ primary: "#2563eb",
3142
+ "primary-50": "#eff6ff",
3143
+ "primary-500": "#2563eb",
3144
+ "primary-900": "#1d4ed8",
3145
+ secondary: "#9333ea",
3146
+ "secondary-50": "#f3e8ff",
3147
+ "secondary-500": "#9333ea",
3148
+ "secondary-900": "#4c1d95",
3149
+ accent: "#f97316",
3150
+ "accent-50": "#fff7ed",
3151
+ "accent-500": "#f97316",
3152
+ "accent-900": "#7c2d12"
3153
+ }
3154
+ };
3064
3155
  //#endregion
3065
3156
  //#region ../theme-core/src/palette/utils/opaqueSurfaceColor.ts
3066
3157
  /** Resolve an opaque colour, compositing alpha against an explicit underlay. */
@@ -3345,6 +3436,59 @@ function mergeStyles(...styles) {
3345
3436
  }
3346
3437
  return Object.keys(merged).length ? merged : void 0;
3347
3438
  }
3439
+ shadeBackgroundEffect({
3440
+ id: "darken-background",
3441
+ name: "Darken on Hover",
3442
+ description: "Darkens the background color on hover",
3443
+ label: "Darken Amount (shade step)",
3444
+ shadeDirection: 1
3445
+ });
3446
+ shadeBackgroundEffect({
3447
+ id: "lighten-background",
3448
+ name: "Lighten on Hover",
3449
+ description: "Lightens the background color on hover",
3450
+ label: "Lighten Amount (shade step)",
3451
+ shadeDirection: -1
3452
+ });
3453
+ function shadeBackgroundEffect(config) {
3454
+ return {
3455
+ id: config.id,
3456
+ name: config.name,
3457
+ description: config.description,
3458
+ category: "background",
3459
+ pseudoElement: "none",
3460
+ applicableTo: ["button"],
3461
+ customizableOption: {
3462
+ name: "amount",
3463
+ type: "select",
3464
+ label: config.label,
3465
+ default: 100,
3466
+ options: [
3467
+ 0,
3468
+ 100,
3469
+ 200,
3470
+ 300,
3471
+ 400,
3472
+ 500,
3473
+ 600,
3474
+ 700,
3475
+ 800,
3476
+ 900
3477
+ ]
3478
+ },
3479
+ isApplicable: (buttonConfig) => buttonConfig.background.type === "solid",
3480
+ generateCSS: ({ themeId, variantId, options, tokens, buttonConfig }) => {
3481
+ if (buttonConfig.background.type !== "solid") return "";
3482
+ const amount = (options.amount || 100) * config.shadeDirection;
3483
+ const baseToken = buttonConfig.background.colorToken ?? "primary-500";
3484
+ return `
3485
+ :where([data-theme-scope="${themeId}"]) .${variantId}:hover {
3486
+ background-color: ${tokens.getColor(tokens.adjustShade(baseToken, amount))};
3487
+ }
3488
+ `;
3489
+ }
3490
+ };
3491
+ }
3348
3492
  //#endregion
3349
3493
  //#region ../theme-core/src/utils/tokenOrColor.ts
3350
3494
  /**
@@ -6766,8 +6910,14 @@ const headerInteractionPillPaletteValues = [
6766
6910
  "accent"
6767
6911
  ];
6768
6912
  /**
6769
- * "No pill": the nav link keeps whatever hover treatment its recipe compiled,
6770
- * and the palette step writes nothing at all (#1318 Phase 4c decision 2).
6913
+ * "No pill": a colour change on hover rather than a filled background.
6914
+ *
6915
+ * The palette step writes nothing (#1318 Phase 4c decision 2), but on a
6916
+ * foreground-adaptive style that is not the end of the story: the hover colour
6917
+ * is derived from the resolved opening foreground at render time, paired with
6918
+ * the resting colour, so `quiet` resolves to a definite colour rather than to
6919
+ * whatever brand token the recipe happened to name. See
6920
+ * `applyOpeningForeground`.
6771
6921
  *
6772
6922
  * It exists because "a colour change on hover, no filled background" was not
6773
6923
  * expressible in the vocabulary, and it is what
@@ -7769,6 +7919,28 @@ const bookingRequirementConsentFieldSchema = z.object({
7769
7919
  z.union([blockBookingConsentSchema, bookingRequirementConsentFieldSchema]);
7770
7920
  //#endregion
7771
7921
  //#region ../blocks/src/system/blocks/events/shared/schemas.ts
7922
+ const publicEventLoaderQuerySchemaShape = {
7923
+ limit: z.string().optional(),
7924
+ from: z.string().optional(),
7925
+ to: z.string().optional(),
7926
+ afterStartsAt: z.string().optional(),
7927
+ afterId: z.string().optional(),
7928
+ categoryIds: z.string().optional(),
7929
+ venueId: z.string().optional(),
7930
+ staffMemberId: z.string().optional(),
7931
+ eventSurface: z.string().optional(),
7932
+ eventPresets: z.string().optional(),
7933
+ scheduleScope: z.string().optional(),
7934
+ seriesId: z.string().optional(),
7935
+ seriesIds: z.string().optional(),
7936
+ runSeriesId: z.string().optional(),
7937
+ seriesSlug: z.string().optional(),
7938
+ includeOccurrenceId: z.string().optional(),
7939
+ readIntent: z.string().optional(),
7940
+ detailLevel: z.string().optional(),
7941
+ readProfile: z.string().optional()
7942
+ };
7943
+ z.object(publicEventLoaderQuerySchemaShape);
7772
7944
  const eventPresetSchema = z.enum([
7773
7945
  "event",
7774
7946
  "class",
@@ -8177,6 +8349,7 @@ const calendarWindowQuerySchema = z.object({
8177
8349
  eventSurface: z.enum(eventSurfaceScopeValues).optional(),
8178
8350
  eventPresets: z.string().optional(),
8179
8351
  scheduleScope: z.enum(eventScheduleScopeValues).optional(),
8352
+ seriesIds: z.string().optional(),
8180
8353
  categoryIds: z.string().optional(),
8181
8354
  venueId: z.string().transform(normalizeCalendarFilterId).optional(),
8182
8355
  staffMemberId: z.string().transform(normalizeCalendarFilterId).optional()
@@ -9611,6 +9784,14 @@ const PUBLIC_BOOKING_AVAILABILITY_ENDPOINT_DEFINITIONS = defineEndpointDefinitio
9611
9784
  auth: "public",
9612
9785
  responseKind: "json"
9613
9786
  },
9787
+ getPublicBookingServiceBySlug: {
9788
+ path: "/public/bookings/services/by-slug/{slug}",
9789
+ method: "GET",
9790
+ revalidate: publicReadFreshnessSeconds("getPublicBookingService"),
9791
+ tags: [TAG_TEMPLATES.publicBookingServices],
9792
+ auth: "public",
9793
+ responseKind: "json"
9794
+ },
9614
9795
  getPublicBookingResourcesReference: {
9615
9796
  path: "/public/bookings/resources/reference",
9616
9797
  method: "GET",
@@ -10163,16 +10344,110 @@ const PUBLIC_READ_ENDPOINT_DEFINITIONS = defineEndpointDefinitions({
10163
10344
  responseKind: "json"
10164
10345
  }
10165
10346
  });
10347
+ //#endregion
10348
+ //#region ../api/src/publicOnboardingAttemptEndpointDefinitions.ts
10349
+ /**
10350
+ * The anonymous onboarding attempt, addressed by its opaque resume token.
10351
+ *
10352
+ * Every route here is reached before there is an account, so none of them can
10353
+ * be scoped to a site or a user: the token is the whole credential. They are
10354
+ * kept together so that stays obvious.
10355
+ */
10356
+ const PUBLIC_ONBOARDING_ATTEMPT_ENDPOINT_DEFINITIONS = defineEndpointDefinitions({
10357
+ createPublicOnboardingAttempt: {
10358
+ path: "/public/onboarding/attempts",
10359
+ method: "POST",
10360
+ auth: "public",
10361
+ errors: [],
10362
+ responseKind: "json"
10363
+ },
10364
+ createPublicOnboardingLogoUploadUrl: {
10365
+ path: "/public/onboarding/attempts/{attemptToken}/logo-upload-url",
10366
+ method: "POST",
10367
+ auth: "public",
10368
+ errors: [],
10369
+ responseKind: "json"
10370
+ },
10371
+ uploadPublicOnboardingLogo: {
10372
+ path: "/public/onboarding/attempts/{attemptToken}/logo",
10373
+ method: "POST",
10374
+ auth: "public",
10375
+ errors: [],
10376
+ responseKind: "json"
10377
+ },
10378
+ getPublicOnboardingAttempt: {
10379
+ path: "/public/onboarding/attempts/{attemptToken}",
10380
+ method: "GET",
10381
+ auth: "public",
10382
+ errors: [],
10383
+ responseKind: "json"
10384
+ },
10385
+ getPublicOnboardingAttemptProgress: {
10386
+ path: "/public/onboarding/attempts/{attemptToken}/status",
10387
+ method: "GET",
10388
+ auth: "public",
10389
+ errors: [],
10390
+ responseKind: "json"
10391
+ },
10392
+ updatePublicOnboardingAttempt: {
10393
+ path: "/public/onboarding/attempts/{attemptToken}",
10394
+ method: "PATCH",
10395
+ auth: "public",
10396
+ errors: [],
10397
+ responseKind: "json"
10398
+ },
10399
+ runPublicOnboardingAttempt: {
10400
+ path: "/public/onboarding/attempts/{attemptToken}/run",
10401
+ method: "POST",
10402
+ auth: "public",
10403
+ errors: [],
10404
+ responseKind: "json"
10405
+ },
10406
+ resendPublicOnboardingAttemptConfirmation: {
10407
+ path: "/public/onboarding/attempts/{attemptToken}/resend-confirmation",
10408
+ method: "POST",
10409
+ auth: "public",
10410
+ errors: [],
10411
+ responseKind: "json"
10412
+ }
10413
+ });
10414
+ //#endregion
10415
+ //#region ../api/src/billingEndpointDefinitions.ts
10416
+ const BILLING_ENDPOINT_DEFINITIONS = defineEndpointDefinitions({
10417
+ adminChangePlan: {
10418
+ path: "/admin/billing/plan",
10419
+ method: "POST",
10420
+ tags: ["admin", "billing"],
10421
+ auth: "admin",
10422
+ responseKind: "json"
10423
+ },
10424
+ changePlan: {
10425
+ path: "/billing/plan/change",
10426
+ method: "POST",
10427
+ tags: ["billing"],
10428
+ auth: "user",
10429
+ responseKind: "json"
10430
+ },
10431
+ createBillingPortalSession: {
10432
+ path: "/billing/portal/session",
10433
+ method: "POST",
10434
+ tags: ["billing"],
10435
+ auth: "user",
10436
+ responseKind: "json"
10437
+ }
10438
+ });
10166
10439
  ({
10167
10440
  ...ACCOUNT_ENDPOINT_DEFINITIONS,
10441
+ ...PUBLIC_ONBOARDING_ATTEMPT_ENDPOINT_DEFINITIONS,
10168
10442
  ...PUBLIC_EVENT_ENDPOINT_DEFINITIONS,
10169
10443
  ...GIFTING_ENDPOINT_DEFINITIONS,
10170
- ...PUBLIC_READ_ENDPOINT_DEFINITIONS
10444
+ ...PUBLIC_READ_ENDPOINT_DEFINITIONS,
10445
+ ...BILLING_ENDPOINT_DEFINITIONS
10171
10446
  }), 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, {
10172
10447
  ...NEWSLETTER_ENDPOINT_DEFINITIONS,
10173
10448
  ...APPOINTMENT_ENDPOINT_DEFINITIONS,
10174
10449
  ...EVENT_SERIES_REGISTRATION_ENDPOINT_DEFINITIONS
10175
- }, 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.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 };
10450
+ }, 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 };
10176
10451
  z.object({ refreshToken: z.string().min(1).max(4096) }).strict();
10177
10452
  z.object({
10178
10453
  accessToken: z.string().min(1).max(4096),
@@ -12441,108 +12716,6 @@ function assertUniqueLayoutProfileKeys(profiles) {
12441
12716
  if (duplicates.length > 0) throw new Error(`Duplicate block layout design profiles: ${duplicates.join(", ")}`);
12442
12717
  }
12443
12718
  //#endregion
12444
- //#region ../theme-core/src/tokens/tokens.ts
12445
- const defaultThemeTokens = {
12446
- color: {
12447
- "background/base": "#ffffff",
12448
- "background/elevated": "#f5f5f5",
12449
- "surface/base": "#ffffff",
12450
- "surface/subtle": "#f9f9fb",
12451
- "surface/inverted": "#111111",
12452
- "content/primary": "#111111",
12453
- "content/secondary": "#3f3f46",
12454
- "accent/primary": "#2563eb",
12455
- "accent/secondary": "#1d4ed8",
12456
- "border/base": "#e5e7eb"
12457
- },
12458
- typography: {
12459
- "display/hero": {
12460
- fontSize: "clamp(48px, 8vw, 96px)",
12461
- lineHeight: "1.05",
12462
- fontWeight: "700"
12463
- },
12464
- "display/section": {
12465
- fontSize: "clamp(40px, 6vw, 72px)",
12466
- lineHeight: "1.1",
12467
- fontWeight: "700"
12468
- },
12469
- "heading/large": {
12470
- fontSize: "clamp(32px, 4vw, 48px)",
12471
- lineHeight: "1.2",
12472
- fontWeight: "600"
12473
- },
12474
- "heading/medium": {
12475
- fontSize: "clamp(24px, 3vw, 32px)",
12476
- lineHeight: "1.25",
12477
- fontWeight: "600"
12478
- },
12479
- "heading/small": {
12480
- fontSize: "20px",
12481
- lineHeight: "1.3",
12482
- fontWeight: "600"
12483
- },
12484
- "body/normal": {
12485
- fontSize: "16px",
12486
- lineHeight: "1.6",
12487
- fontWeight: "400"
12488
- },
12489
- "body/small": {
12490
- fontSize: "14px",
12491
- lineHeight: "1.5",
12492
- fontWeight: "400"
12493
- },
12494
- caption: {
12495
- fontSize: "12px",
12496
- lineHeight: "1.4",
12497
- fontWeight: "500"
12498
- }
12499
- },
12500
- spacing: {
12501
- none: "0px",
12502
- "3xs": "4px",
12503
- "2xs": "8px",
12504
- xs: "12px",
12505
- sm: "16px",
12506
- md: "24px",
12507
- lg: "32px",
12508
- xl: "40px",
12509
- "2xl": "56px",
12510
- "3xl": "72px"
12511
- },
12512
- radius: {
12513
- none: "0px",
12514
- xs: "2px",
12515
- sm: "4px",
12516
- md: "8px",
12517
- lg: "12px",
12518
- pill: "999px",
12519
- full: "9999px"
12520
- },
12521
- shadow: {
12522
- none: "none",
12523
- soft: "0px 2px 8px rgba(15, 23, 42, 0.08)",
12524
- medium: "0px 6px 18px rgba(15, 23, 42, 0.12)",
12525
- strong: "0px 12px 36px rgba(15, 23, 42, 0.16)"
12526
- },
12527
- palette: {
12528
- surface: "#ffffff",
12529
- "neutral-50": "#f9fafb",
12530
- "neutral-900": "#111827",
12531
- primary: "#2563eb",
12532
- "primary-50": "#eff6ff",
12533
- "primary-500": "#2563eb",
12534
- "primary-900": "#1d4ed8",
12535
- secondary: "#9333ea",
12536
- "secondary-50": "#f3e8ff",
12537
- "secondary-500": "#9333ea",
12538
- "secondary-900": "#4c1d95",
12539
- accent: "#f97316",
12540
- "accent-50": "#fff7ed",
12541
- "accent-500": "#f97316",
12542
- "accent-900": "#7c2d12"
12543
- }
12544
- };
12545
- //#endregion
12546
12719
  //#region ../theme-core/src/site-styles/backgroundAppearance.ts
12547
12720
  const backgroundAppearanceQuickColorTokenNames = [
12548
12721
  "background",
@@ -16844,6 +17017,7 @@ function isDisplayMediaKind(kind) {
16844
17017
  }
16845
17018
  const siteOptionSources = [
16846
17019
  "eventCategories",
17020
+ "eventSeries",
16847
17021
  "venues",
16848
17022
  "staffMembers"
16849
17023
  ];
@@ -29540,7 +29714,8 @@ const appointmentServicesBlockDefinition = {
29540
29714
  el("appointment-services", {
29541
29715
  sectionHeading: { $bind: { from: "content.heading" } },
29542
29716
  services: { $bind: { from: "data.services" } },
29543
- pathname: { $bind: { from: "$root.pathname" } }
29717
+ pathname: { $bind: { from: "$root.pathname" } },
29718
+ servicePathPrefix: { $bind: { from: "$root.appointmentServicePathPrefix" } }
29544
29719
  })
29545
29720
  ], { gap: "lg" })
29546
29721
  })]
@@ -30196,6 +30371,44 @@ function toWholeSeriesRegistrationEvents(events) {
30196
30371
  return groupPublicEventsByRun(events).map(toWholeSeriesRegistrationEvent).filter((event) => event !== null);
30197
30372
  }
30198
30373
  //#endregion
30374
+ //#region ../blocks/src/system/runtime/nodes/event-registration/eventSourceRecovery.ts
30375
+ const { limit: _rawLimit, eventSurface: _rawEventSurface, scheduleScope: _rawScheduleScope, detailLevel: _rawDetailLevel, ...stringEventQueryShape } = publicEventLoaderQuerySchemaShape;
30376
+ const eventRecoveryRequestSchema = z.object({
30377
+ ...stringEventQueryShape,
30378
+ limit: z.coerce.number().int().positive().optional(),
30379
+ eventSurface: z.enum(eventSurfaceScopeValues).optional(),
30380
+ scheduleScope: z.enum(eventScheduleScopeValues).optional(),
30381
+ detailLevel: z.enum(["full", "listing"]).optional(),
30382
+ stage: z.enum(["preview", "published"]).optional()
30383
+ });
30384
+ function resolveEventRegistrationEventSource(input) {
30385
+ if (input.wholeSeriesRunEvents != null) return {
30386
+ kind: "loaded",
30387
+ events: input.wholeSeriesRunEvents
30388
+ };
30389
+ if (input.events != null) return {
30390
+ kind: "loaded",
30391
+ events: input.events
30392
+ };
30393
+ return {
30394
+ kind: "unresolved",
30395
+ request: parseEventLoaderRecoveryRequest(input.failures?.wholeSeriesRunEvents ?? input.failures?.events)
30396
+ };
30397
+ }
30398
+ const eventLoaderFailureSchema = z.object({
30399
+ endpoint: z.literal("listPublicEvents"),
30400
+ params: eventRecoveryRequestSchema.extend({ siteId: z.string().optional() })
30401
+ });
30402
+ function parseEventLoaderRecoveryRequest(value) {
30403
+ const parsed = eventLoaderFailureSchema.safeParse(value);
30404
+ if (!parsed.success) return null;
30405
+ const { siteId: _siteId, stage, ...params } = parsed.data.params;
30406
+ return {
30407
+ ...params,
30408
+ stage: stage ?? "published"
30409
+ };
30410
+ }
30411
+ //#endregion
30199
30412
  //#region ../blocks/src/system/runtime/nodes/event-registration.interactive.ts
30200
30413
  const EVENT_REGISTRATION_GENERIC_SHELL_STEP_LABELS = [
30201
30414
  "Date",
@@ -30213,8 +30426,6 @@ const eventRegistrationPublicEventSchema = z.preprocess(normalizeEventRegistrati
30213
30426
  const eventRegistrationHydrationSchemaShape = {
30214
30427
  occurrenceContext: occurrenceContextSchema.optional(),
30215
30428
  subject: eventRegistrationPageSurfaceSubjectSchema.nullable().optional(),
30216
- events: z.array(eventRegistrationPublicEventSchema).nullable().optional(),
30217
- wholeSeriesRunEvents: z.array(eventRegistrationPublicEventSchema).nullable().optional(),
30218
30429
  maxTickets: z.string().optional(),
30219
30430
  showVenue: z.boolean().optional(),
30220
30431
  showCapacity: z.boolean().optional(),
@@ -30226,12 +30437,22 @@ const eventRegistrationHydrationSchemaShape = {
30226
30437
  sitePasses: publicPassProductCollectionSchema.nullable().optional(),
30227
30438
  siteMemberships: publicMembershipProductCollectionSchema.nullable().optional()
30228
30439
  };
30440
+ const eventRegistrationEventSourceSchema = z.discriminatedUnion("kind", [z.object({
30441
+ kind: z.literal("loaded"),
30442
+ events: z.array(eventRegistrationPublicEventSchema)
30443
+ }), z.object({
30444
+ kind: z.literal("unresolved"),
30445
+ request: eventRecoveryRequestSchema.nullable()
30446
+ })]);
30229
30447
  const eventRegistrationSourceSchema = z.object({
30230
30448
  siteId: z.string().optional(),
30231
30449
  apiBaseUrl: z.string().optional(),
30232
30450
  portalToken: z.string().nullable().optional(),
30233
30451
  previewToken: z.string().nullable().optional(),
30234
30452
  ...eventRegistrationHydrationSchemaShape,
30453
+ events: z.array(eventRegistrationPublicEventSchema).nullable().optional(),
30454
+ wholeSeriesRunEvents: z.array(eventRegistrationPublicEventSchema).nullable().optional(),
30455
+ eventLoaderFailures: z.record(z.string(), z.unknown()).nullable().optional(),
30235
30456
  className: z.string().nullable().optional(),
30236
30457
  buttonText: z.string().nullable().optional(),
30237
30458
  maxTickets: z.string().nullable().optional(),
@@ -30252,7 +30473,10 @@ const eventRegistrationDisplaySchema = z.discriminatedUnion("state", [z.object({
30252
30473
  titleText: z.string(),
30253
30474
  bodyText: z.string()
30254
30475
  })]);
30255
- const eventRegistrationHydrationSchema = z.object(eventRegistrationHydrationSchemaShape);
30476
+ const eventRegistrationHydrationSchema = z.object({
30477
+ ...eventRegistrationHydrationSchemaShape,
30478
+ eventSource: eventRegistrationEventSourceSchema
30479
+ });
30256
30480
  const eventRegistrationRenderSchema = z.object({
30257
30481
  display: eventRegistrationDisplaySchema,
30258
30482
  hydration: eventRegistrationHydrationSchema
@@ -30311,16 +30535,12 @@ function buildEventRegistrationShellStepLabels(source, scopedSourceEvents) {
30311
30535
  function toScopedEventRegistrationEvents(scopedSourceEvents) {
30312
30536
  return [...toRegistrationEvents(scopedSourceEvents), ...toWholeSeriesRegistrationEvents(scopedSourceEvents)];
30313
30537
  }
30314
- function scopeEventRegistrationSourceEvents(source) {
30315
- return resolveEventRegistrationScopedEvents(source.wholeSeriesRunEvents ?? source.events ?? [], {
30538
+ function scopeEventRegistrationSourceEvents(source, eventSource) {
30539
+ return resolveEventRegistrationScopedEvents(eventSource.kind === "loaded" ? eventSource.events : [], {
30316
30540
  occurrenceContext: source.occurrenceContext,
30317
30541
  subject: source.subject
30318
30542
  });
30319
30543
  }
30320
- function resolveLoadedEventRegistrationSourceEvents(source, scopedSourceEvents) {
30321
- if (source.events == null && source.wholeSeriesRunEvents == null) return null;
30322
- return [...scopedSourceEvents];
30323
- }
30324
30544
  /**
30325
30545
  * The one run this surface is registering for, when the scoped events describe
30326
30546
  * exactly one. More than one run means the visitor still has to choose.
@@ -30360,14 +30580,21 @@ const eventRegistrationBlockRuntime = defineClientOwnedBlockRuntime({
30360
30580
  render: createZodCodec(eventRegistrationRenderSchema)
30361
30581
  },
30362
30582
  buildRender: (source) => {
30363
- const scopedSourceEvents = scopeEventRegistrationSourceEvents(source);
30364
- const events = resolveLoadedEventRegistrationSourceEvents(source, scopedSourceEvents);
30583
+ const eventSource = resolveEventRegistrationEventSource({
30584
+ events: source.events,
30585
+ wholeSeriesRunEvents: source.wholeSeriesRunEvents,
30586
+ failures: source.eventLoaderFailures
30587
+ });
30588
+ const scopedSourceEvents = scopeEventRegistrationSourceEvents(source, eventSource);
30365
30589
  return {
30366
30590
  display: buildEventRegistrationDisplayFromScopedEvents(source, scopedSourceEvents),
30367
30591
  hydration: {
30368
30592
  occurrenceContext: source.occurrenceContext ?? null,
30369
30593
  subject: source.subject ?? null,
30370
- events,
30594
+ eventSource: eventSource.kind === "loaded" ? {
30595
+ ...eventSource,
30596
+ events: [...scopedSourceEvents]
30597
+ } : eventSource,
30371
30598
  maxTickets: source.maxTickets ?? void 0,
30372
30599
  showVenue: source.showVenue,
30373
30600
  showCapacity: source.showCapacity,
@@ -30543,6 +30770,7 @@ const eventRegistrationBlockDefinition = {
30543
30770
  } },
30544
30771
  events: { $bind: { from: "data.events" } },
30545
30772
  wholeSeriesRunEvents: { $bind: { from: "data.wholeSeriesRunEvents" } },
30773
+ loaderFailures: { $bind: { from: "$root.loaderFailures" } },
30546
30774
  sitePasses: { $bind: { from: "data.sitePasses" } },
30547
30775
  siteMemberships: { $bind: { from: "data.siteMemberships" } },
30548
30776
  stage: { $bind: {
@@ -31028,6 +31256,35 @@ const eventSpotlightBlockDefinition = {
31028
31256
  } }
31029
31257
  };
31030
31258
  //#endregion
31259
+ //#region ../blocks/src/system/blocks/events/shared/eventSelection.ts
31260
+ /** Invalid saved selections fail closed rather than widening discovery. */
31261
+ function resolveEventSelection(mode, value) {
31262
+ if (mode !== "selected") return { kind: "matching" };
31263
+ const candidates = Array.isArray(value) ? value : typeof value === "string" ? value.split(",").filter(Boolean) : [];
31264
+ const ids = [];
31265
+ for (const candidate of candidates) {
31266
+ if (typeof candidate !== "string") return {
31267
+ kind: "selected",
31268
+ seriesIds: []
31269
+ };
31270
+ const parsed = parseEventSeriesId(candidate.trim());
31271
+ if (!parsed.ok) return {
31272
+ kind: "selected",
31273
+ seriesIds: []
31274
+ };
31275
+ ids.push(parsed.value);
31276
+ }
31277
+ return {
31278
+ kind: "selected",
31279
+ seriesIds: [...new Set(ids)].sort()
31280
+ };
31281
+ }
31282
+ /** Undefined means discovery; an empty string is an explicitly empty selection. */
31283
+ function eventSeriesScopeCsv(value) {
31284
+ if (value == null) return void 0;
31285
+ return typeof value === "string" ? value : value.join(",");
31286
+ }
31287
+ //#endregion
31031
31288
  //#region ../blocks/src/system/runtime/nodes/events/shared/listingLayout.ts
31032
31289
  /**
31033
31290
  * Layout classes for event listing containers and cards. Presentation
@@ -31127,6 +31384,7 @@ const eventCollectionFilterSourceSchemaShape = {
31127
31384
  eventSurface: eventSurfaceScopeSchema$1.nullable().optional(),
31128
31385
  filterEventPresets: z.union([z.string(), z.array(z.string())]).nullable().optional(),
31129
31386
  scheduleScope: eventScheduleScopeSchema$1.nullable().optional(),
31387
+ seriesIds: z.union([z.string(), z.array(z.string())]).nullable().optional(),
31130
31388
  filterCategoryIds: z.union([z.string(), z.array(z.string())]).nullable().optional(),
31131
31389
  filterStaffMemberId: z.string().nullable().optional(),
31132
31390
  filterVenueId: z.string().nullable().optional()
@@ -31173,6 +31431,7 @@ const eventCollectionDisplaySchemaShape = {
31173
31431
  eventSurface: eventSurfaceScopeSchema$1,
31174
31432
  filterEventPresets: z.string().nullable(),
31175
31433
  scheduleScope: eventScheduleScopeSchema$1,
31434
+ seriesIds: z.string().nullable().optional(),
31176
31435
  filterCategoryIds: z.string().nullable(),
31177
31436
  filterStaffMemberId: z.string().nullable(),
31178
31437
  filterVenueId: z.string().nullable(),
@@ -31220,11 +31479,15 @@ function buildEventCollectionDisplay(source) {
31220
31479
  };
31221
31480
  }
31222
31481
  function buildEventCollectionFilterDisplay(source) {
31223
- return {
31224
- showFilters: source.showFilters ?? true,
31225
- showCategoryFilter: source.showCategoryFilter ?? "auto",
31226
- showVenueFilter: source.showVenueFilter ?? false,
31227
- showStaffFilter: source.showStaffFilter ?? true,
31482
+ const selected = source.seriesIds != null;
31483
+ const matchingFilters = selected ? {
31484
+ eventSurface: "all",
31485
+ filterEventPresets: null,
31486
+ scheduleScope: "any",
31487
+ filterCategoryIds: null,
31488
+ filterStaffMemberId: null,
31489
+ filterVenueId: null
31490
+ } : {
31228
31491
  eventSurface: normalizeEventSurfaceScope(source.eventSurface),
31229
31492
  filterEventPresets: normalizeEventSurfacePresetsCsv(source.filterEventPresets),
31230
31493
  scheduleScope: normalizeEventScheduleScope(source.scheduleScope),
@@ -31232,6 +31495,14 @@ function buildEventCollectionFilterDisplay(source) {
31232
31495
  filterStaffMemberId: normalizeEventStaffMemberId(source.filterStaffMemberId),
31233
31496
  filterVenueId: normalizeEventVenueId(source.filterVenueId)
31234
31497
  };
31498
+ return {
31499
+ seriesIds: eventSeriesScopeCsv(source.seriesIds),
31500
+ showFilters: selected ? false : source.showFilters ?? true,
31501
+ showCategoryFilter: source.showCategoryFilter ?? "auto",
31502
+ showVenueFilter: source.showVenueFilter ?? false,
31503
+ showStaffFilter: source.showStaffFilter ?? true,
31504
+ ...matchingFilters
31505
+ };
31235
31506
  }
31236
31507
  function buildEventCollectionPresentationDisplay(source) {
31237
31508
  return {
@@ -31246,14 +31517,15 @@ function buildEventCollectionPresentationDisplay(source) {
31246
31517
  }
31247
31518
  function buildEventCollectionHydration(source, now = /* @__PURE__ */ new Date()) {
31248
31519
  const timeZone = source.calendarWindow?.scope.timeZone ?? toBookingTimeZone(source.bookingTimeZone);
31520
+ const selected = source.seriesIds != null;
31249
31521
  return {
31250
31522
  calendarWindow: source.calendarWindow ?? void 0,
31251
31523
  siteId: source.siteId,
31252
31524
  stage: source.stage,
31253
31525
  prefetchedEvents: source.events != null,
31254
- eventSurface: normalizeEventSurfaceScope(source.eventSurface),
31255
- filterEventPresets: normalizeEventSurfacePresetsCsv(source.filterEventPresets),
31256
- scheduleScope: normalizeEventScheduleScope(source.scheduleScope),
31526
+ eventSurface: selected ? "all" : normalizeEventSurfaceScope(source.eventSurface),
31527
+ filterEventPresets: selected ? null : normalizeEventSurfacePresetsCsv(source.filterEventPresets),
31528
+ scheduleScope: selected ? "any" : normalizeEventScheduleScope(source.scheduleScope),
31257
31529
  calendarContext: {
31258
31530
  timeZone,
31259
31531
  initialToday: source.calendarWindow?.initialToday ?? getLocalScheduleDate(now, timeZone)
@@ -31319,6 +31591,7 @@ const eventListingHydrationSchema = z.object({
31319
31591
  eventSurface: eventSurfaceScopeSchema,
31320
31592
  filterEventPresets: z.string().nullable(),
31321
31593
  scheduleScope: eventScheduleScopeSchema,
31594
+ seriesIds: z.string().nullable().optional(),
31322
31595
  filterCategoryIds: z.string().nullable().optional(),
31323
31596
  filterStaffMemberId: z.string().nullable().optional(),
31324
31597
  filterVenueId: z.string().nullable().optional(),
@@ -31379,6 +31652,7 @@ const eventListingBlockRuntime = defineProgressiveBlockRuntime({
31379
31652
  eventSurface: normalizeEventSurfaceScope(source.eventSurface),
31380
31653
  filterEventPresets: normalizeEventSurfacePresetsCsv(source.filterEventPresets),
31381
31654
  scheduleScope: normalizeEventScheduleScope(source.scheduleScope),
31655
+ seriesIds: eventSeriesScopeCsv(source.seriesIds),
31382
31656
  filterCategoryIds: normalizeEventCategoryIdsCsv(source.filterCategoryIds),
31383
31657
  filterStaffMemberId: normalizeEventStaffMemberId(source.filterStaffMemberId),
31384
31658
  filterVenueId: normalizeEventVenueId(source.filterVenueId),
@@ -31752,6 +32026,65 @@ const eventListingBlockDefinition = {
31752
32026
  } }
31753
32027
  };
31754
32028
  //#endregion
32029
+ //#region ../blocks/src/system/blocks/events/eventSelectionFields.ts
32030
+ const eventSelectionFields = [{
32031
+ id: "eventSelection",
32032
+ type: "select",
32033
+ label: "Events to show",
32034
+ required: false,
32035
+ multiple: false,
32036
+ defaultValue: "matching",
32037
+ options: [{
32038
+ value: "matching",
32039
+ label: "All matching events"
32040
+ }, {
32041
+ value: "selected",
32042
+ label: "Selected events"
32043
+ }],
32044
+ ui: { intent: "behavior" }
32045
+ }, createSiteOptionSelectField({
32046
+ id: "selectedEventSeriesIds",
32047
+ label: "Selected events",
32048
+ description: "Show upcoming dates for these events. Other event filters do not apply.",
32049
+ required: false,
32050
+ multiple: true,
32051
+ defaultValue: [],
32052
+ optionSource: "eventSeries",
32053
+ ui: {
32054
+ intent: "behavior",
32055
+ searchThreshold: 1,
32056
+ visibleWhen: {
32057
+ field: "eventSelection",
32058
+ equals: "selected"
32059
+ }
32060
+ }
32061
+ })];
32062
+ function withEventSelectionVisibility(field) {
32063
+ if (![
32064
+ "eventSurface",
32065
+ "filterEventPresets",
32066
+ "scheduleScope",
32067
+ "filterCategoryIds",
32068
+ "filterStaffMemberId",
32069
+ "filterVenueId",
32070
+ "showFilters",
32071
+ "showCategoryFilter",
32072
+ "showVenueFilter",
32073
+ "showStaffFilter"
32074
+ ].includes(field.id)) return field;
32075
+ const visibleWhen = field.ui?.visibleWhen;
32076
+ return {
32077
+ ...field,
32078
+ ui: {
32079
+ ...field.ui,
32080
+ visibleWhen: { allOf: [{
32081
+ field: "eventSelection",
32082
+ notEquals: "selected"
32083
+ }, ...visibleWhen ? [visibleWhen] : []] }
32084
+ }
32085
+ };
32086
+ }
32087
+ //#endregion
31755
32088
  //#region ../blocks/src/system/runtime/nodes/events/EventCalendar.interactive.ts
31756
32089
  const eventCalendarSourceSchema = z.object({
31757
32090
  ...eventCollectionSourceSchemaShape,
@@ -31834,19 +32167,59 @@ const eventCalendarBlockRuntime = defineProgressiveBlockRuntime({
31834
32167
  //#region ../blocks/src/system/blocks/events/eventCalendarDataLoaders.ts
31835
32168
  const scopeParams = {
31836
32169
  siteId: { $bind: { from: "$root.siteId" } },
32170
+ seriesIds: { $bind: {
32171
+ from: "content",
32172
+ transforms: [{
32173
+ id: "events.calendarSelectionParam",
32174
+ options: { key: "seriesIds" }
32175
+ }]
32176
+ } },
31837
32177
  stage: { $bind: {
31838
32178
  from: "$root.previewStage",
31839
32179
  fallback: "published"
31840
32180
  } },
31841
- eventSurface: { $bind: { from: "content.eventSurface" } },
32181
+ eventSurface: { $bind: {
32182
+ from: "content",
32183
+ transforms: [{
32184
+ id: "events.calendarSelectionParam",
32185
+ options: { key: "eventSurface" }
32186
+ }, { id: "value.csv" }]
32187
+ } },
31842
32188
  eventPresets: { $bind: {
31843
- from: "content.filterEventPresets",
31844
- transforms: [{ id: "value.csv" }]
32189
+ from: "content",
32190
+ transforms: [{
32191
+ id: "events.calendarSelectionParam",
32192
+ options: { key: "filterEventPresets" }
32193
+ }, { id: "value.csv" }]
31845
32194
  } },
31846
- scheduleScope: { $bind: { from: "content.scheduleScope" } },
31847
- categoryIds: { $bind: { from: "content.filterCategoryIds" } },
31848
- staffMemberId: { $bind: { from: "content.filterStaffMemberId" } },
31849
- venueId: { $bind: { from: "content.filterVenueId" } }
32195
+ scheduleScope: { $bind: {
32196
+ from: "content",
32197
+ transforms: [{
32198
+ id: "events.calendarSelectionParam",
32199
+ options: { key: "scheduleScope" }
32200
+ }, { id: "value.csv" }]
32201
+ } },
32202
+ categoryIds: { $bind: {
32203
+ from: "content",
32204
+ transforms: [{
32205
+ id: "events.calendarSelectionParam",
32206
+ options: { key: "filterCategoryIds" }
32207
+ }, { id: "value.csv" }]
32208
+ } },
32209
+ staffMemberId: { $bind: {
32210
+ from: "content",
32211
+ transforms: [{
32212
+ id: "events.calendarSelectionParam",
32213
+ options: { key: "filterStaffMemberId" }
32214
+ }, { id: "value.csv" }]
32215
+ } },
32216
+ venueId: { $bind: {
32217
+ from: "content",
32218
+ transforms: [{
32219
+ id: "events.calendarSelectionParam",
32220
+ options: { key: "filterVenueId" }
32221
+ }, { id: "value.csv" }]
32222
+ } }
31850
32223
  };
31851
32224
  /** Combined renders two jobs; calendar-only variants never pay for the list seed. */
31852
32225
  const eventCalendarDataLoaders = {
@@ -31976,6 +32349,13 @@ const eventCalendarLayout = [styledSection({
31976
32349
  from: "content.defaultCalendarView",
31977
32350
  fallback: "month"
31978
32351
  } },
32352
+ seriesIds: { $bind: {
32353
+ from: "content",
32354
+ transforms: [{
32355
+ id: "events.calendarSelectionParam",
32356
+ options: { key: "seriesIds" }
32357
+ }]
32358
+ } },
31979
32359
  showFilters: { $bind: {
31980
32360
  from: "content.showFilters",
31981
32361
  fallback: true
@@ -31997,17 +32377,47 @@ const eventCalendarLayout = [styledSection({
31997
32377
  fallback: true
31998
32378
  } },
31999
32379
  eventSurface: { $bind: {
32000
- from: "content.eventSurface",
32001
- fallback: "all"
32380
+ from: "content",
32381
+ transforms: [{
32382
+ id: "events.calendarSelectionParam",
32383
+ options: { key: "eventSurface" }
32384
+ }]
32385
+ } },
32386
+ filterEventPresets: { $bind: {
32387
+ from: "content",
32388
+ transforms: [{
32389
+ id: "events.calendarSelectionParam",
32390
+ options: { key: "filterEventPresets" }
32391
+ }]
32002
32392
  } },
32003
- filterEventPresets: { $bind: { from: "content.filterEventPresets" } },
32004
32393
  scheduleScope: { $bind: {
32005
- from: "content.scheduleScope",
32006
- fallback: "any"
32394
+ from: "content",
32395
+ transforms: [{
32396
+ id: "events.calendarSelectionParam",
32397
+ options: { key: "scheduleScope" }
32398
+ }]
32399
+ } },
32400
+ filterCategoryIds: { $bind: {
32401
+ from: "content",
32402
+ transforms: [{
32403
+ id: "events.calendarSelectionParam",
32404
+ options: { key: "filterCategoryIds" }
32405
+ }]
32406
+ } },
32407
+ filterStaffMemberId: { $bind: {
32408
+ from: "content",
32409
+ transforms: [{
32410
+ id: "events.calendarSelectionParam",
32411
+ options: { key: "filterStaffMemberId" }
32412
+ }]
32413
+ } },
32414
+ filterVenueId: { $bind: {
32415
+ from: "content",
32416
+ transforms: [{
32417
+ id: "events.calendarSelectionParam",
32418
+ options: { key: "filterVenueId" }
32419
+ }]
32007
32420
  } },
32008
- filterCategoryIds: { $bind: { from: "content.filterCategoryIds" } },
32009
- filterStaffMemberId: { $bind: { from: "content.filterStaffMemberId" } },
32010
- filterVenueId: { $bind: { from: "content.filterVenueId" } },
32011
32421
  cardRole: { $bind: {
32012
32422
  from: "content._cardStyles.role",
32013
32423
  fallback: "default"
@@ -32511,6 +32921,7 @@ const eventCalendarAdditionalFields = [
32511
32921
  }
32512
32922
  }
32513
32923
  },
32924
+ ...eventSelectionFields,
32514
32925
  {
32515
32926
  id: "eventSurface",
32516
32927
  type: "select",
@@ -32720,7 +33131,7 @@ const eventCalendarBlockDefinition = {
32720
33131
  titleSource: "heading",
32721
33132
  description: "Display events with calendar, list, or combined views with filtering",
32722
33133
  skipSectionStyles: true,
32723
- additionalFields: eventCalendarAdditionalFields,
33134
+ additionalFields: eventCalendarAdditionalFields.map(withEventSelectionVisibility),
32724
33135
  styleTokens: {
32725
33136
  background: "surface",
32726
33137
  typography: "body",
@@ -37098,6 +37509,15 @@ const newsletterFieldSchema = z.object({
37098
37509
  placeholder: z.string().optional()
37099
37510
  });
37100
37511
  const mailingListSignupBlockIdSchema = z.string().trim().min(1).transform(parseRequiredMailingListSignupBlockId);
37512
+ const mailingListContentVersionIdSchema = z.string().transform((value, ctx) => {
37513
+ const parsed = parseMailingListContentVersionId(value);
37514
+ if (parsed) return parsed;
37515
+ ctx.addIssue({
37516
+ code: z.ZodIssueCode.custom,
37517
+ message: "Invalid mailing-list content version ID"
37518
+ });
37519
+ return z.NEVER;
37520
+ });
37101
37521
  const signedMailingListSourceTokenSchema = z.string().trim().min(1).transform(parseRequiredMailingListSignedSourceToken);
37102
37522
  const newsletterSourceCommonSchema = z.object({
37103
37523
  siteId: z.string().optional(),
@@ -37111,7 +37531,8 @@ const newsletterSourceCommonSchema = z.object({
37111
37531
  const newsletterSourceSchema = z.discriminatedUnion("source", [
37112
37532
  newsletterSourceCommonSchema.extend({
37113
37533
  source: z.literal("block"),
37114
- blockId: z.string().nullable().optional()
37534
+ blockId: z.string().nullable().optional(),
37535
+ contentVersionId: z.string().nullable().optional()
37115
37536
  }),
37116
37537
  newsletterSourceCommonSchema.extend({
37117
37538
  source: z.literal("signed-footer"),
@@ -37127,6 +37548,7 @@ const newsletterDisplaySchema = z.object({
37127
37548
  availability: z.enum(["ready", "unavailable"]),
37128
37549
  className: z.string().nullable(),
37129
37550
  buttonLabel: z.string(),
37551
+ successMessage: z.string(),
37130
37552
  buttonVariant: newsletterButtonVariantSchema,
37131
37553
  privacyNote: z.string().nullable(),
37132
37554
  fields: z.array(newsletterFieldSchema),
@@ -37141,7 +37563,8 @@ const newsletterHydrationSchema = z.object({
37141
37563
  tag: z.literal("block-source"),
37142
37564
  sourceRef: z.object({
37143
37565
  tag: z.literal("block_ref"),
37144
- blockId: mailingListSignupBlockIdSchema
37566
+ blockId: mailingListSignupBlockIdSchema,
37567
+ contentVersionId: mailingListContentVersionIdSchema
37145
37568
  }).nullable()
37146
37569
  }),
37147
37570
  z.object({
@@ -37180,6 +37603,7 @@ function buildNewsletterDisplay(source) {
37180
37603
  fields: { preset: "emailOnly" },
37181
37604
  includeOptionalPhone: false,
37182
37605
  buttonLabel: "Subscribe",
37606
+ successMessage: DEFAULT_MAILING_LIST_SUCCESS_MESSAGE,
37183
37607
  privacyNote: null
37184
37608
  };
37185
37609
  const targeting = source.targeting ?? { mode: "default" };
@@ -37189,6 +37613,7 @@ function buildNewsletterDisplay(source) {
37189
37613
  availability: runtimeTargetingIsAvailable(context, targeting, choices) ? "ready" : "unavailable",
37190
37614
  className: source.className ?? null,
37191
37615
  buttonLabel: form.buttonLabel,
37616
+ successMessage: form.successMessage,
37192
37617
  buttonVariant: source.buttonVariant ?? "primary",
37193
37618
  privacyNote: form.privacyNote,
37194
37619
  fields: getGlobalFormFields(form),
@@ -37219,7 +37644,7 @@ const newsletterFormBlockRuntime = defineProgressiveBlockRuntime({
37219
37644
  function projectNewsletterFormHydrationTarget(source) {
37220
37645
  switch (source.source) {
37221
37646
  case "block": {
37222
- const sourceRef = buildMailingListSignupBlockSourceRef(source.blockId);
37647
+ const sourceRef = buildMailingListSignupBlockSourceRef(source.blockId, source.contentVersionId);
37223
37648
  if (sourceRef?.tag === "block_ref") return {
37224
37649
  tag: "block-source",
37225
37650
  sourceRef
@@ -39365,6 +39790,26 @@ const linksTransforms = [{
39365
39790
  }
39366
39791
  }];
39367
39792
  const defaultTransforms = createTransformRegistry([
39793
+ {
39794
+ id: "events.calendarSelectionParam",
39795
+ kind: "formatter",
39796
+ summary: "Resolve selected events instead of discovery filters",
39797
+ schema: z.object({ key: z.enum([
39798
+ "seriesIds",
39799
+ "eventSurface",
39800
+ "filterEventPresets",
39801
+ "scheduleScope",
39802
+ "filterCategoryIds",
39803
+ "filterStaffMemberId",
39804
+ "filterVenueId"
39805
+ ]) }),
39806
+ run(value, { key }) {
39807
+ const content = asPartialObject(value) ?? {};
39808
+ const selection = resolveEventSelection(content.eventSelection, content.selectedEventSeriesIds);
39809
+ if (selection.kind === "selected") return key === "seriesIds" ? selection.seriesIds : void 0;
39810
+ return key === "seriesIds" ? void 0 : content[key];
39811
+ }
39812
+ },
39368
39813
  {
39369
39814
  id: "events.calendarReadEnabled",
39370
39815
  kind: "formatter",
@@ -39679,12 +40124,12 @@ function normalizeContent(block) {
39679
40124
  }
39680
40125
  /**
39681
40126
  * Normalize params for API calls.
39682
- * Converts all values to strings.
40127
+ * Converts supplied values to strings, preserving absent versus explicitly empty params.
39683
40128
  */
39684
40129
  function normalizeParams(input) {
39685
40130
  if (!input || typeof input !== "object") return {};
39686
40131
  const output = {};
39687
- for (const [key, value] of Object.entries(input)) output[key] = coerceToString(value);
40132
+ for (const [key, value] of Object.entries(input)) if (value !== void 0 && value !== null) output[key] = coerceToString(value);
39688
40133
  return output;
39689
40134
  }
39690
40135
  function isNonArrayObject(value) {
@@ -39748,6 +40193,14 @@ function coercePayload(payload) {
39748
40193
  * - Frontend: provide internal API client
39749
40194
  * - SDK: provide SDK client with endpoint mapping
39750
40195
  */
40196
+ function projectDataLoaders(loaders, shouldLoad, blockId, blockKind) {
40197
+ if (!shouldLoad) return [...loaders];
40198
+ return loaders.filter(({ key }) => shouldLoad({
40199
+ blockId,
40200
+ blockKind,
40201
+ loaderKey: key
40202
+ }));
40203
+ }
39751
40204
  function shouldSkipResolvedLoader(input) {
39752
40205
  if (input.loader.requiredParams?.some((param) => !input.params[param]?.trim())) return true;
39753
40206
  return Boolean(input.isValidEndpoint && !input.isValidEndpoint(input.endpoint));
@@ -39773,8 +40226,12 @@ function shouldSkipResolvedLoader(input) {
39773
40226
  * ```
39774
40227
  */
39775
40228
  async function prefetchBlockData$1(page, context, options) {
39776
- const { apiClient, isValidEndpoint, onError, getCustomBlockLoaders, getBlockDefinition: getBlockDefinition$1 = getBlockDefinition, resolveParamsBindings: resolveParamsBindings$1 = resolveParamsBindings } = options;
40229
+ return (await prefetchBlockDataWithFailures(page, context, options)).resolvedData;
40230
+ }
40231
+ async function prefetchBlockDataWithFailures(page, context, options) {
40232
+ const { apiClient, isValidEndpoint, onError, getCustomBlockLoaders, getBlockDefinition: getBlockDefinition$1 = getBlockDefinition, resolveParamsBindings: resolveParamsBindings$1 = resolveParamsBindings, shouldLoad } = options;
39777
40233
  const results = {};
40234
+ const loaderFailures = {};
39778
40235
  const tasks = [];
39779
40236
  for (const block of page.blocks) {
39780
40237
  const blockId = block.id;
@@ -39789,6 +40246,7 @@ async function prefetchBlockData$1(page, context, options) {
39789
40246
  loader
39790
40247
  })) : [];
39791
40248
  } else loaders = [];
40249
+ loaders = projectDataLoaders(loaders, shouldLoad, blockId, block.kind);
39792
40250
  if (loaders.length === 0) continue;
39793
40251
  const root = {
39794
40252
  ...context.root ?? {},
@@ -39822,6 +40280,11 @@ async function prefetchBlockData$1(page, context, options) {
39822
40280
  const blockResults = results[blockId] ?? (results[blockId] = {});
39823
40281
  blockResults[key] = data;
39824
40282
  } catch (error) {
40283
+ const blockFailures = loaderFailures[blockId] ?? (loaderFailures[blockId] = {});
40284
+ blockFailures[key] = {
40285
+ endpoint,
40286
+ params
40287
+ };
39825
40288
  if (onError) onError(error, {
39826
40289
  block: block.kind,
39827
40290
  loader: key
@@ -39831,7 +40294,10 @@ async function prefetchBlockData$1(page, context, options) {
39831
40294
  }
39832
40295
  }
39833
40296
  if (tasks.length > 0) await Promise.all(tasks);
39834
- return results;
40297
+ return {
40298
+ resolvedData: results,
40299
+ loaderFailures
40300
+ };
39835
40301
  }
39836
40302
  //#endregion
39837
40303
  //#region ../blocks/src/system/data/loaderEndpoints.ts
@@ -39859,8 +40325,8 @@ function toStringParams(value) {
39859
40325
  for (const [k, v] of Object.entries(value)) if (typeof v === "string") out[k] = v;
39860
40326
  return out;
39861
40327
  }
39862
- function stripEmptyStringValues(params) {
39863
- for (const [key, value] of Object.entries(params)) if (value === "") delete params[key];
40328
+ function stripEmptyStringValues(params, endpoint) {
40329
+ for (const [key, value] of Object.entries(params)) if (value === "" && !(key === "seriesIds" && (endpoint === "listPublicEvents" || endpoint === "listPublicEventCalendarWindow"))) delete params[key];
39864
40330
  }
39865
40331
  function ensureSiteId(params, context) {
39866
40332
  if (!params.siteId && typeof context.siteId === "string" && context.siteId) params.siteId = context.siteId;
@@ -39873,7 +40339,7 @@ function ensureSiteId(params, context) {
39873
40339
  */
39874
40340
  function normalizeLoaderParams(endpoint, params, context) {
39875
40341
  const out = toStringParams(params);
39876
- stripEmptyStringValues(out);
40342
+ stripEmptyStringValues(out, endpoint);
39877
40343
  if (endpoint === "getPublicFormById") {
39878
40344
  ensureSiteId(out, context);
39879
40345
  if (!out.formId && out.formSlug) {
@@ -40181,7 +40647,17 @@ const riverbankSiteConfigInputSchema = z.object({
40181
40647
  z.object({
40182
40648
  config: riverbankSiteConfigInputSchema,
40183
40649
  forceContentTypes: z.boolean().optional(),
40184
- mode: z.enum(["apply", "preview"]).optional()
40650
+ mode: z.enum(["apply", "preview"]).optional(),
40651
+ expectedMailingListProviderScope: z.unknown().transform((value, ctx) => {
40652
+ if (value === void 0) return void 0;
40653
+ const parsed = parseMailingListProviderScope(value);
40654
+ if (parsed.ok) return parsed.value;
40655
+ ctx.addIssue({
40656
+ code: "custom",
40657
+ message: "Invalid mailing-list provider scope"
40658
+ });
40659
+ return z.NEVER;
40660
+ }).optional()
40185
40661
  }).strict();
40186
40662
  //#endregion
40187
40663
  //#region ../api/src/sdkThemeWire.ts
@@ -41315,9 +41791,11 @@ function convertPageResponseBlock(block) {
41315
41791
  if (typeof block.id !== "string" && block.id !== null) throw new Error(`Invalid block id in page: expected string or null, got ${typeof block.id}`);
41316
41792
  if (typeof block.kind !== "string") throw new Error(`Invalid block kind in page: expected string, got ${typeof block.kind}`);
41317
41793
  if (typeof block.purpose !== "string") throw new Error(`Invalid block purpose in page: expected string, got ${typeof block.purpose}`);
41794
+ 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}`);
41318
41795
  const admission = readInvalidBlockAdmission(block.admission);
41319
41796
  return {
41320
41797
  id: block.id,
41798
+ ...block.contentVersionId !== void 0 ? { contentVersionId: block.contentVersionId } : {},
41321
41799
  kind: block.kind,
41322
41800
  purpose: block.purpose,
41323
41801
  content: sanitizeSdkRuntimeBlockContent(block.kind, readContentRecord(block.content) ?? {}),
@@ -41350,6 +41828,7 @@ function projectRenderablePageOutline(page) {
41350
41828
  ...page,
41351
41829
  blocks: page.blocks.flatMap((block) => block.admission.kind === "renderable" ? [{
41352
41830
  id: block.id,
41831
+ ...block.contentVersionId !== void 0 ? { contentVersionId: block.contentVersionId } : {},
41353
41832
  kind: block.kind,
41354
41833
  purpose: block.purpose,
41355
41834
  content: block.admission.content,
@@ -41360,6 +41839,7 @@ function projectRenderablePageOutline(page) {
41360
41839
  function admitSdkRuntimePageBlock(block, customBlocks) {
41361
41840
  const base = {
41362
41841
  id: block.id,
41842
+ ...block.contentVersionId !== void 0 ? { contentVersionId: block.contentVersionId } : {},
41363
41843
  kind: block.kind,
41364
41844
  purpose: block.purpose,
41365
41845
  ...block.bindings ? { bindings: block.bindings } : {}