@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
@@ -29,10 +29,12 @@ const unsafeAsApiKeyId = (id) => id;
29
29
  const unsafeAsEventOfferingId = (id) => id;
30
30
  const unsafeAsEventSeriesId = (id) => id;
31
31
  const unsafeAsUserId = (id) => id;
32
+ const unsafeAsContentVersionId = (id) => id;
32
33
  const parseSiteId = (value) => parseUuidBrand(value, unsafeAsSiteId);
33
34
  const parseApiKeyId = (value) => parseUuidBrand(value, unsafeAsApiKeyId);
34
35
  const parseEventOfferingId = (value) => parseUuidBrand(value, unsafeAsEventOfferingId);
35
36
  const parseUserId = (value) => parseUuidBrand(value, unsafeAsUserId);
37
+ const parseContentVersionId = (value) => parseUuidBrand(value, unsafeAsContentVersionId);
36
38
  const parseEventSeriesId = (value) => parseUuidBrand(value, unsafeAsEventSeriesId);
37
39
  //#endregion
38
40
  //#region ../core/src/assert-never.ts
@@ -266,7 +268,7 @@ function parseEventPageSurfaceDestinationMode(value) {
266
268
  return value === "cms-managed" || value === "system-managed" ? value : void 0;
267
269
  }
268
270
  function parseEventPageSurfaceSubject(value) {
269
- if (!isRecord$12(value)) return err({ kind: "notObject" });
271
+ if (!isRecord$13(value)) return err({ kind: "notObject" });
270
272
  switch (value.kind) {
271
273
  case "eventSeries": {
272
274
  const eventSeriesId = parseEventSeriesId(value.eventSeriesId);
@@ -321,7 +323,7 @@ function parseEventSeriesIdList(values) {
321
323
  }
322
324
  return ok(parsed);
323
325
  }
324
- function isRecord$12(value) {
326
+ function isRecord$13(value) {
325
327
  return typeof value === "object" && value !== null && !Array.isArray(value);
326
328
  }
327
329
  //#endregion
@@ -505,16 +507,47 @@ function parsePositiveInteger(value) {
505
507
  function parseNewsletterListId(value) {
506
508
  return parseTrimmedMatchingString(value, UUID_PATTERN);
507
509
  }
510
+ function parseMailchimpAccountId(value) {
511
+ return parseTrimmedMatchingString(value, OPAQUE_ID_PATTERN);
512
+ }
508
513
  function parseMailchimpAudienceId(value) {
509
514
  return parseTrimmedMatchingString(value, OPAQUE_ID_PATTERN);
510
515
  }
511
516
  function parseMailchimpInterestId(value) {
512
517
  return parseTrimmedMatchingString(value, OPAQUE_ID_PATTERN);
513
518
  }
519
+ function parseBrevoAccountId(value) {
520
+ return parseTrimmedMatchingString(value, OPAQUE_ID_PATTERN);
521
+ }
514
522
  function parseBrevoListId(value) {
515
523
  return parsePositiveInteger(value);
516
524
  }
517
525
  //#endregion
526
+ //#region ../core/src/mailing-list-setup.ts
527
+ function isRecord$12(value) {
528
+ return typeof value === "object" && value !== null && !Array.isArray(value);
529
+ }
530
+ const DEFAULT_MAILING_LIST_SUCCESS_MESSAGE = "Thanks — you're on the list.";
531
+ function parseMailingListProviderScope(value) {
532
+ if (!isRecord$12(value)) return err("invalid_mailing_list_provider_scope");
533
+ if (value.provider === "native") return ok({ provider: "native" });
534
+ if (value.provider === "brevo") {
535
+ const accountId = parseBrevoAccountId(value.accountId);
536
+ return accountId !== null ? ok({
537
+ provider: "brevo",
538
+ accountId
539
+ }) : err("invalid_mailing_list_provider_scope");
540
+ }
541
+ if (value.provider === "mailchimp") {
542
+ const accountId = parseMailchimpAccountId(value.accountId);
543
+ return accountId !== null ? ok({
544
+ provider: "mailchimp",
545
+ accountId
546
+ }) : err("invalid_mailing_list_provider_scope");
547
+ }
548
+ return err("invalid_mailing_list_provider_scope");
549
+ }
550
+ //#endregion
518
551
  //#region ../core/src/mailing-list-setup-parser.ts
519
552
  function parseMailingListGlobalForm(value) {
520
553
  if (!isRecord$11(value)) return formError("shape");
@@ -523,12 +556,15 @@ function parseMailingListGlobalForm(value) {
523
556
  if (typeof value.includeOptionalPhone !== "boolean") return formError("includeOptionalPhone");
524
557
  const buttonLabel = parseRequiredString(value.buttonLabel);
525
558
  if (buttonLabel === null) return formError("buttonLabel");
559
+ const successMessage = parseRequiredString(value.successMessage);
560
+ if (successMessage === null) return formError("successMessage");
526
561
  const privacyNote = parseOptionalString(value.privacyNote);
527
562
  if (privacyNote === void 0) return formError("privacyNote");
528
563
  return ok({
529
564
  fields,
530
565
  includeOptionalPhone: value.includeOptionalPhone,
531
566
  buttonLabel,
567
+ successMessage,
532
568
  privacyNote
533
569
  });
534
570
  }
@@ -858,11 +894,17 @@ function parseMailingListSignedSourceToken(value) {
858
894
  const parsed = typeof value === "string" ? value.trim() : "";
859
895
  return /^[A-Za-z0-9._~-]{16,1000}$/u.test(parsed) ? parsed : null;
860
896
  }
861
- function buildMailingListSignupBlockSourceRef(blockId) {
862
- const parsed = parseMailingListBlockId(blockId);
863
- return parsed !== null ? {
897
+ function parseMailingListContentVersionId(value) {
898
+ const parsed = parseContentVersionId(value);
899
+ return parsed.ok ? parsed.value : null;
900
+ }
901
+ function buildMailingListSignupBlockSourceRef(blockId, contentVersionId) {
902
+ const parsedBlockId = parseMailingListBlockId(blockId);
903
+ const parsedContentVersionId = parseMailingListContentVersionId(contentVersionId);
904
+ return parsedBlockId !== null && parsedContentVersionId !== null ? {
864
905
  tag: "block_ref",
865
- blockId: parsed
906
+ blockId: parsedBlockId,
907
+ contentVersionId: parsedContentVersionId
866
908
  } : null;
867
909
  }
868
910
  //#endregion
@@ -2445,7 +2487,7 @@ const BUTTON_CONTRAST_POLICY = {
2445
2487
  nonTextMinimumRatio: 3,
2446
2488
  gradientSamplesPerSegment: 20,
2447
2489
  alphaBackgrounds: "reject-without-known-surface",
2448
- disabled: "retain-full-colour-contract"
2490
+ disabled: "validated-colour-pair-with-muted-control-opacity"
2449
2491
  };
2450
2492
  function validateButtonSurfaceContrast(input) {
2451
2493
  const ratio = contrastRatio(input.buttonPaint, input.surfaceHex);
@@ -2971,59 +3013,108 @@ function interpolateHex(startHex, endHex, position) {
2971
3013
  const channel = (from, to) => Math.round(from + (to - from) * position).toString(16).padStart(2, "0");
2972
3014
  return `#${channel(start.r, end.r)}${channel(start.g, end.g)}${channel(start.b, end.b)}`;
2973
3015
  }
2974
- shadeBackgroundEffect({
2975
- id: "darken-background",
2976
- name: "Darken on Hover",
2977
- description: "Darkens the background color on hover",
2978
- label: "Darken Amount (shade step)",
2979
- shadeDirection: 1
2980
- });
2981
- shadeBackgroundEffect({
2982
- id: "lighten-background",
2983
- name: "Lighten on Hover",
2984
- description: "Lightens the background color on hover",
2985
- label: "Lighten Amount (shade step)",
2986
- shadeDirection: -1
2987
- });
2988
- function shadeBackgroundEffect(config) {
2989
- return {
2990
- id: config.id,
2991
- name: config.name,
2992
- description: config.description,
2993
- category: "background",
2994
- pseudoElement: "none",
2995
- applicableTo: ["button"],
2996
- customizableOption: {
2997
- name: "amount",
2998
- type: "select",
2999
- label: config.label,
3000
- default: 100,
3001
- options: [
3002
- 0,
3003
- 100,
3004
- 200,
3005
- 300,
3006
- 400,
3007
- 500,
3008
- 600,
3009
- 700,
3010
- 800,
3011
- 900
3012
- ]
3016
+ //#endregion
3017
+ //#region ../theme-core/src/tokens/tokens.ts
3018
+ const defaultThemeTokens = {
3019
+ color: {
3020
+ "background/base": "#ffffff",
3021
+ "background/elevated": "#f5f5f5",
3022
+ "surface/base": "#ffffff",
3023
+ "surface/subtle": "#f9f9fb",
3024
+ "surface/inverted": "#111111",
3025
+ "content/primary": "#111111",
3026
+ "content/secondary": "#3f3f46",
3027
+ "accent/primary": "#2563eb",
3028
+ "accent/secondary": "#1d4ed8",
3029
+ "border/base": "#e5e7eb"
3030
+ },
3031
+ typography: {
3032
+ "display/hero": {
3033
+ fontSize: "clamp(48px, 8vw, 96px)",
3034
+ lineHeight: "1.05",
3035
+ fontWeight: "700"
3013
3036
  },
3014
- isApplicable: (buttonConfig) => buttonConfig.background.type === "solid",
3015
- generateCSS: ({ themeId, variantId, options, tokens, buttonConfig }) => {
3016
- if (buttonConfig.background.type !== "solid") return "";
3017
- const amount = (options.amount || 100) * config.shadeDirection;
3018
- const baseToken = buttonConfig.background.colorToken ?? "primary-500";
3019
- return `
3020
- :where([data-theme-scope="${themeId}"]) .${variantId}:hover {
3021
- background-color: ${tokens.getColor(tokens.adjustShade(baseToken, amount))};
3022
- }
3023
- `;
3037
+ "display/section": {
3038
+ fontSize: "clamp(40px, 6vw, 72px)",
3039
+ lineHeight: "1.1",
3040
+ fontWeight: "700"
3041
+ },
3042
+ "heading/large": {
3043
+ fontSize: "clamp(32px, 4vw, 48px)",
3044
+ lineHeight: "1.2",
3045
+ fontWeight: "600"
3046
+ },
3047
+ "heading/medium": {
3048
+ fontSize: "clamp(24px, 3vw, 32px)",
3049
+ lineHeight: "1.25",
3050
+ fontWeight: "600"
3051
+ },
3052
+ "heading/small": {
3053
+ fontSize: "20px",
3054
+ lineHeight: "1.3",
3055
+ fontWeight: "600"
3056
+ },
3057
+ "body/normal": {
3058
+ fontSize: "16px",
3059
+ lineHeight: "1.6",
3060
+ fontWeight: "400"
3061
+ },
3062
+ "body/small": {
3063
+ fontSize: "14px",
3064
+ lineHeight: "1.5",
3065
+ fontWeight: "400"
3066
+ },
3067
+ caption: {
3068
+ fontSize: "12px",
3069
+ lineHeight: "1.4",
3070
+ fontWeight: "500"
3024
3071
  }
3025
- };
3026
- }
3072
+ },
3073
+ spacing: {
3074
+ none: "0px",
3075
+ "3xs": "4px",
3076
+ "2xs": "8px",
3077
+ xs: "12px",
3078
+ sm: "16px",
3079
+ md: "24px",
3080
+ lg: "32px",
3081
+ xl: "40px",
3082
+ "2xl": "56px",
3083
+ "3xl": "72px"
3084
+ },
3085
+ radius: {
3086
+ none: "0px",
3087
+ xs: "2px",
3088
+ sm: "4px",
3089
+ md: "8px",
3090
+ lg: "12px",
3091
+ pill: "999px",
3092
+ full: "9999px"
3093
+ },
3094
+ shadow: {
3095
+ none: "none",
3096
+ soft: "0px 2px 8px rgba(15, 23, 42, 0.08)",
3097
+ medium: "0px 6px 18px rgba(15, 23, 42, 0.12)",
3098
+ strong: "0px 12px 36px rgba(15, 23, 42, 0.16)"
3099
+ },
3100
+ palette: {
3101
+ surface: "#ffffff",
3102
+ "neutral-50": "#f9fafb",
3103
+ "neutral-900": "#111827",
3104
+ primary: "#2563eb",
3105
+ "primary-50": "#eff6ff",
3106
+ "primary-500": "#2563eb",
3107
+ "primary-900": "#1d4ed8",
3108
+ secondary: "#9333ea",
3109
+ "secondary-50": "#f3e8ff",
3110
+ "secondary-500": "#9333ea",
3111
+ "secondary-900": "#4c1d95",
3112
+ accent: "#f97316",
3113
+ "accent-50": "#fff7ed",
3114
+ "accent-500": "#f97316",
3115
+ "accent-900": "#7c2d12"
3116
+ }
3117
+ };
3027
3118
  //#endregion
3028
3119
  //#region ../theme-core/src/palette/utils/opaqueSurfaceColor.ts
3029
3120
  /** Resolve an opaque colour, compositing alpha against an explicit underlay. */
@@ -3308,6 +3399,59 @@ function mergeStyles(...styles) {
3308
3399
  }
3309
3400
  return Object.keys(merged).length ? merged : void 0;
3310
3401
  }
3402
+ shadeBackgroundEffect({
3403
+ id: "darken-background",
3404
+ name: "Darken on Hover",
3405
+ description: "Darkens the background color on hover",
3406
+ label: "Darken Amount (shade step)",
3407
+ shadeDirection: 1
3408
+ });
3409
+ shadeBackgroundEffect({
3410
+ id: "lighten-background",
3411
+ name: "Lighten on Hover",
3412
+ description: "Lightens the background color on hover",
3413
+ label: "Lighten Amount (shade step)",
3414
+ shadeDirection: -1
3415
+ });
3416
+ function shadeBackgroundEffect(config) {
3417
+ return {
3418
+ id: config.id,
3419
+ name: config.name,
3420
+ description: config.description,
3421
+ category: "background",
3422
+ pseudoElement: "none",
3423
+ applicableTo: ["button"],
3424
+ customizableOption: {
3425
+ name: "amount",
3426
+ type: "select",
3427
+ label: config.label,
3428
+ default: 100,
3429
+ options: [
3430
+ 0,
3431
+ 100,
3432
+ 200,
3433
+ 300,
3434
+ 400,
3435
+ 500,
3436
+ 600,
3437
+ 700,
3438
+ 800,
3439
+ 900
3440
+ ]
3441
+ },
3442
+ isApplicable: (buttonConfig) => buttonConfig.background.type === "solid",
3443
+ generateCSS: ({ themeId, variantId, options, tokens, buttonConfig }) => {
3444
+ if (buttonConfig.background.type !== "solid") return "";
3445
+ const amount = (options.amount || 100) * config.shadeDirection;
3446
+ const baseToken = buttonConfig.background.colorToken ?? "primary-500";
3447
+ return `
3448
+ :where([data-theme-scope="${themeId}"]) .${variantId}:hover {
3449
+ background-color: ${tokens.getColor(tokens.adjustShade(baseToken, amount))};
3450
+ }
3451
+ `;
3452
+ }
3453
+ };
3454
+ }
3311
3455
  //#endregion
3312
3456
  //#region ../theme-core/src/utils/tokenOrColor.ts
3313
3457
  /**
@@ -6730,8 +6874,14 @@ const headerInteractionPillPaletteValues = [
6730
6874
  "accent"
6731
6875
  ];
6732
6876
  /**
6733
- * "No pill": the nav link keeps whatever hover treatment its recipe compiled,
6734
- * and the palette step writes nothing at all (#1318 Phase 4c decision 2).
6877
+ * "No pill": a colour change on hover rather than a filled background.
6878
+ *
6879
+ * The palette step writes nothing (#1318 Phase 4c decision 2), but on a
6880
+ * foreground-adaptive style that is not the end of the story: the hover colour
6881
+ * is derived from the resolved opening foreground at render time, paired with
6882
+ * the resting colour, so `quiet` resolves to a definite colour rather than to
6883
+ * whatever brand token the recipe happened to name. See
6884
+ * `applyOpeningForeground`.
6735
6885
  *
6736
6886
  * It exists because "a colour change on hover, no filled background" was not
6737
6887
  * expressible in the vocabulary, and it is what
@@ -7723,6 +7873,28 @@ const bookingRequirementConsentFieldSchema = z.object({
7723
7873
  z.union([blockBookingConsentSchema, bookingRequirementConsentFieldSchema]);
7724
7874
  //#endregion
7725
7875
  //#region ../blocks/src/system/blocks/events/shared/schemas.ts
7876
+ const publicEventLoaderQuerySchemaShape = {
7877
+ limit: z.string().optional(),
7878
+ from: z.string().optional(),
7879
+ to: z.string().optional(),
7880
+ afterStartsAt: z.string().optional(),
7881
+ afterId: z.string().optional(),
7882
+ categoryIds: z.string().optional(),
7883
+ venueId: z.string().optional(),
7884
+ staffMemberId: z.string().optional(),
7885
+ eventSurface: z.string().optional(),
7886
+ eventPresets: z.string().optional(),
7887
+ scheduleScope: z.string().optional(),
7888
+ seriesId: z.string().optional(),
7889
+ seriesIds: z.string().optional(),
7890
+ runSeriesId: z.string().optional(),
7891
+ seriesSlug: z.string().optional(),
7892
+ includeOccurrenceId: z.string().optional(),
7893
+ readIntent: z.string().optional(),
7894
+ detailLevel: z.string().optional(),
7895
+ readProfile: z.string().optional()
7896
+ };
7897
+ z.object(publicEventLoaderQuerySchemaShape);
7726
7898
  const eventPresetSchema = z.enum([
7727
7899
  "event",
7728
7900
  "class",
@@ -8131,6 +8303,7 @@ const calendarWindowQuerySchema = z.object({
8131
8303
  eventSurface: z.enum(eventSurfaceScopeValues).optional(),
8132
8304
  eventPresets: z.string().optional(),
8133
8305
  scheduleScope: z.enum(eventScheduleScopeValues).optional(),
8306
+ seriesIds: z.string().optional(),
8134
8307
  categoryIds: z.string().optional(),
8135
8308
  venueId: z.string().transform(normalizeCalendarFilterId).optional(),
8136
8309
  staffMemberId: z.string().transform(normalizeCalendarFilterId).optional()
@@ -9565,6 +9738,14 @@ const PUBLIC_BOOKING_AVAILABILITY_ENDPOINT_DEFINITIONS = defineEndpointDefinitio
9565
9738
  auth: "public",
9566
9739
  responseKind: "json"
9567
9740
  },
9741
+ getPublicBookingServiceBySlug: {
9742
+ path: "/public/bookings/services/by-slug/{slug}",
9743
+ method: "GET",
9744
+ revalidate: publicReadFreshnessSeconds("getPublicBookingService"),
9745
+ tags: [TAG_TEMPLATES.publicBookingServices],
9746
+ auth: "public",
9747
+ responseKind: "json"
9748
+ },
9568
9749
  getPublicBookingResourcesReference: {
9569
9750
  path: "/public/bookings/resources/reference",
9570
9751
  method: "GET",
@@ -10117,16 +10298,110 @@ const PUBLIC_READ_ENDPOINT_DEFINITIONS = defineEndpointDefinitions({
10117
10298
  responseKind: "json"
10118
10299
  }
10119
10300
  });
10301
+ //#endregion
10302
+ //#region ../api/src/publicOnboardingAttemptEndpointDefinitions.ts
10303
+ /**
10304
+ * The anonymous onboarding attempt, addressed by its opaque resume token.
10305
+ *
10306
+ * Every route here is reached before there is an account, so none of them can
10307
+ * be scoped to a site or a user: the token is the whole credential. They are
10308
+ * kept together so that stays obvious.
10309
+ */
10310
+ const PUBLIC_ONBOARDING_ATTEMPT_ENDPOINT_DEFINITIONS = defineEndpointDefinitions({
10311
+ createPublicOnboardingAttempt: {
10312
+ path: "/public/onboarding/attempts",
10313
+ method: "POST",
10314
+ auth: "public",
10315
+ errors: [],
10316
+ responseKind: "json"
10317
+ },
10318
+ createPublicOnboardingLogoUploadUrl: {
10319
+ path: "/public/onboarding/attempts/{attemptToken}/logo-upload-url",
10320
+ method: "POST",
10321
+ auth: "public",
10322
+ errors: [],
10323
+ responseKind: "json"
10324
+ },
10325
+ uploadPublicOnboardingLogo: {
10326
+ path: "/public/onboarding/attempts/{attemptToken}/logo",
10327
+ method: "POST",
10328
+ auth: "public",
10329
+ errors: [],
10330
+ responseKind: "json"
10331
+ },
10332
+ getPublicOnboardingAttempt: {
10333
+ path: "/public/onboarding/attempts/{attemptToken}",
10334
+ method: "GET",
10335
+ auth: "public",
10336
+ errors: [],
10337
+ responseKind: "json"
10338
+ },
10339
+ getPublicOnboardingAttemptProgress: {
10340
+ path: "/public/onboarding/attempts/{attemptToken}/status",
10341
+ method: "GET",
10342
+ auth: "public",
10343
+ errors: [],
10344
+ responseKind: "json"
10345
+ },
10346
+ updatePublicOnboardingAttempt: {
10347
+ path: "/public/onboarding/attempts/{attemptToken}",
10348
+ method: "PATCH",
10349
+ auth: "public",
10350
+ errors: [],
10351
+ responseKind: "json"
10352
+ },
10353
+ runPublicOnboardingAttempt: {
10354
+ path: "/public/onboarding/attempts/{attemptToken}/run",
10355
+ method: "POST",
10356
+ auth: "public",
10357
+ errors: [],
10358
+ responseKind: "json"
10359
+ },
10360
+ resendPublicOnboardingAttemptConfirmation: {
10361
+ path: "/public/onboarding/attempts/{attemptToken}/resend-confirmation",
10362
+ method: "POST",
10363
+ auth: "public",
10364
+ errors: [],
10365
+ responseKind: "json"
10366
+ }
10367
+ });
10368
+ //#endregion
10369
+ //#region ../api/src/billingEndpointDefinitions.ts
10370
+ const BILLING_ENDPOINT_DEFINITIONS = defineEndpointDefinitions({
10371
+ adminChangePlan: {
10372
+ path: "/admin/billing/plan",
10373
+ method: "POST",
10374
+ tags: ["admin", "billing"],
10375
+ auth: "admin",
10376
+ responseKind: "json"
10377
+ },
10378
+ changePlan: {
10379
+ path: "/billing/plan/change",
10380
+ method: "POST",
10381
+ tags: ["billing"],
10382
+ auth: "user",
10383
+ responseKind: "json"
10384
+ },
10385
+ createBillingPortalSession: {
10386
+ path: "/billing/portal/session",
10387
+ method: "POST",
10388
+ tags: ["billing"],
10389
+ auth: "user",
10390
+ responseKind: "json"
10391
+ }
10392
+ });
10120
10393
  ({
10121
10394
  ...ACCOUNT_ENDPOINT_DEFINITIONS,
10395
+ ...PUBLIC_ONBOARDING_ATTEMPT_ENDPOINT_DEFINITIONS,
10122
10396
  ...PUBLIC_EVENT_ENDPOINT_DEFINITIONS,
10123
10397
  ...GIFTING_ENDPOINT_DEFINITIONS,
10124
- ...PUBLIC_READ_ENDPOINT_DEFINITIONS
10398
+ ...PUBLIC_READ_ENDPOINT_DEFINITIONS,
10399
+ ...BILLING_ENDPOINT_DEFINITIONS
10125
10400
  }), 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, {
10126
10401
  ...NEWSLETTER_ENDPOINT_DEFINITIONS,
10127
10402
  ...APPOINTMENT_ENDPOINT_DEFINITIONS,
10128
10403
  ...EVENT_SERIES_REGISTRATION_ENDPOINT_DEFINITIONS
10129
- }, 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 };
10404
+ }, 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 };
10130
10405
  z.object({ refreshToken: z.string().min(1).max(4096) }).strict();
10131
10406
  z.object({
10132
10407
  accessToken: z.string().min(1).max(4096),
@@ -12395,108 +12670,6 @@ function assertUniqueLayoutProfileKeys(profiles) {
12395
12670
  if (duplicates.length > 0) throw new Error(`Duplicate block layout design profiles: ${duplicates.join(", ")}`);
12396
12671
  }
12397
12672
  //#endregion
12398
- //#region ../theme-core/src/tokens/tokens.ts
12399
- const defaultThemeTokens = {
12400
- color: {
12401
- "background/base": "#ffffff",
12402
- "background/elevated": "#f5f5f5",
12403
- "surface/base": "#ffffff",
12404
- "surface/subtle": "#f9f9fb",
12405
- "surface/inverted": "#111111",
12406
- "content/primary": "#111111",
12407
- "content/secondary": "#3f3f46",
12408
- "accent/primary": "#2563eb",
12409
- "accent/secondary": "#1d4ed8",
12410
- "border/base": "#e5e7eb"
12411
- },
12412
- typography: {
12413
- "display/hero": {
12414
- fontSize: "clamp(48px, 8vw, 96px)",
12415
- lineHeight: "1.05",
12416
- fontWeight: "700"
12417
- },
12418
- "display/section": {
12419
- fontSize: "clamp(40px, 6vw, 72px)",
12420
- lineHeight: "1.1",
12421
- fontWeight: "700"
12422
- },
12423
- "heading/large": {
12424
- fontSize: "clamp(32px, 4vw, 48px)",
12425
- lineHeight: "1.2",
12426
- fontWeight: "600"
12427
- },
12428
- "heading/medium": {
12429
- fontSize: "clamp(24px, 3vw, 32px)",
12430
- lineHeight: "1.25",
12431
- fontWeight: "600"
12432
- },
12433
- "heading/small": {
12434
- fontSize: "20px",
12435
- lineHeight: "1.3",
12436
- fontWeight: "600"
12437
- },
12438
- "body/normal": {
12439
- fontSize: "16px",
12440
- lineHeight: "1.6",
12441
- fontWeight: "400"
12442
- },
12443
- "body/small": {
12444
- fontSize: "14px",
12445
- lineHeight: "1.5",
12446
- fontWeight: "400"
12447
- },
12448
- caption: {
12449
- fontSize: "12px",
12450
- lineHeight: "1.4",
12451
- fontWeight: "500"
12452
- }
12453
- },
12454
- spacing: {
12455
- none: "0px",
12456
- "3xs": "4px",
12457
- "2xs": "8px",
12458
- xs: "12px",
12459
- sm: "16px",
12460
- md: "24px",
12461
- lg: "32px",
12462
- xl: "40px",
12463
- "2xl": "56px",
12464
- "3xl": "72px"
12465
- },
12466
- radius: {
12467
- none: "0px",
12468
- xs: "2px",
12469
- sm: "4px",
12470
- md: "8px",
12471
- lg: "12px",
12472
- pill: "999px",
12473
- full: "9999px"
12474
- },
12475
- shadow: {
12476
- none: "none",
12477
- soft: "0px 2px 8px rgba(15, 23, 42, 0.08)",
12478
- medium: "0px 6px 18px rgba(15, 23, 42, 0.12)",
12479
- strong: "0px 12px 36px rgba(15, 23, 42, 0.16)"
12480
- },
12481
- palette: {
12482
- surface: "#ffffff",
12483
- "neutral-50": "#f9fafb",
12484
- "neutral-900": "#111827",
12485
- primary: "#2563eb",
12486
- "primary-50": "#eff6ff",
12487
- "primary-500": "#2563eb",
12488
- "primary-900": "#1d4ed8",
12489
- secondary: "#9333ea",
12490
- "secondary-50": "#f3e8ff",
12491
- "secondary-500": "#9333ea",
12492
- "secondary-900": "#4c1d95",
12493
- accent: "#f97316",
12494
- "accent-50": "#fff7ed",
12495
- "accent-500": "#f97316",
12496
- "accent-900": "#7c2d12"
12497
- }
12498
- };
12499
- //#endregion
12500
12673
  //#region ../theme-core/src/site-styles/backgroundAppearance.ts
12501
12674
  const backgroundAppearanceQuickColorTokenNames = [
12502
12675
  "background",
@@ -16808,6 +16981,7 @@ function isDisplayMediaKind(kind) {
16808
16981
  }
16809
16982
  const siteOptionSources = [
16810
16983
  "eventCategories",
16984
+ "eventSeries",
16811
16985
  "venues",
16812
16986
  "staffMembers"
16813
16987
  ];
@@ -27679,7 +27853,8 @@ const appointmentServicesBlockDefinition = {
27679
27853
  el("appointment-services", {
27680
27854
  sectionHeading: { $bind: { from: "content.heading" } },
27681
27855
  services: { $bind: { from: "data.services" } },
27682
- pathname: { $bind: { from: "$root.pathname" } }
27856
+ pathname: { $bind: { from: "$root.pathname" } },
27857
+ servicePathPrefix: { $bind: { from: "$root.appointmentServicePathPrefix" } }
27683
27858
  })
27684
27859
  ], { gap: "lg" })
27685
27860
  })]
@@ -28335,6 +28510,44 @@ function toWholeSeriesRegistrationEvents(events) {
28335
28510
  return groupPublicEventsByRun(events).map(toWholeSeriesRegistrationEvent).filter((event) => event !== null);
28336
28511
  }
28337
28512
  //#endregion
28513
+ //#region ../blocks/src/system/runtime/nodes/event-registration/eventSourceRecovery.ts
28514
+ const { limit: _rawLimit, eventSurface: _rawEventSurface, scheduleScope: _rawScheduleScope, detailLevel: _rawDetailLevel, ...stringEventQueryShape } = publicEventLoaderQuerySchemaShape;
28515
+ const eventRecoveryRequestSchema = z.object({
28516
+ ...stringEventQueryShape,
28517
+ limit: z.coerce.number().int().positive().optional(),
28518
+ eventSurface: z.enum(eventSurfaceScopeValues).optional(),
28519
+ scheduleScope: z.enum(eventScheduleScopeValues).optional(),
28520
+ detailLevel: z.enum(["full", "listing"]).optional(),
28521
+ stage: z.enum(["preview", "published"]).optional()
28522
+ });
28523
+ function resolveEventRegistrationEventSource(input) {
28524
+ if (input.wholeSeriesRunEvents != null) return {
28525
+ kind: "loaded",
28526
+ events: input.wholeSeriesRunEvents
28527
+ };
28528
+ if (input.events != null) return {
28529
+ kind: "loaded",
28530
+ events: input.events
28531
+ };
28532
+ return {
28533
+ kind: "unresolved",
28534
+ request: parseEventLoaderRecoveryRequest(input.failures?.wholeSeriesRunEvents ?? input.failures?.events)
28535
+ };
28536
+ }
28537
+ const eventLoaderFailureSchema = z.object({
28538
+ endpoint: z.literal("listPublicEvents"),
28539
+ params: eventRecoveryRequestSchema.extend({ siteId: z.string().optional() })
28540
+ });
28541
+ function parseEventLoaderRecoveryRequest(value) {
28542
+ const parsed = eventLoaderFailureSchema.safeParse(value);
28543
+ if (!parsed.success) return null;
28544
+ const { siteId: _siteId, stage, ...params } = parsed.data.params;
28545
+ return {
28546
+ ...params,
28547
+ stage: stage ?? "published"
28548
+ };
28549
+ }
28550
+ //#endregion
28338
28551
  //#region ../blocks/src/system/runtime/nodes/event-registration.interactive.ts
28339
28552
  const EVENT_REGISTRATION_GENERIC_SHELL_STEP_LABELS = [
28340
28553
  "Date",
@@ -28352,8 +28565,6 @@ const eventRegistrationPublicEventSchema = z.preprocess(normalizeEventRegistrati
28352
28565
  const eventRegistrationHydrationSchemaShape = {
28353
28566
  occurrenceContext: occurrenceContextSchema.optional(),
28354
28567
  subject: eventRegistrationPageSurfaceSubjectSchema.nullable().optional(),
28355
- events: z.array(eventRegistrationPublicEventSchema).nullable().optional(),
28356
- wholeSeriesRunEvents: z.array(eventRegistrationPublicEventSchema).nullable().optional(),
28357
28568
  maxTickets: z.string().optional(),
28358
28569
  showVenue: z.boolean().optional(),
28359
28570
  showCapacity: z.boolean().optional(),
@@ -28365,12 +28576,22 @@ const eventRegistrationHydrationSchemaShape = {
28365
28576
  sitePasses: publicPassProductCollectionSchema.nullable().optional(),
28366
28577
  siteMemberships: publicMembershipProductCollectionSchema.nullable().optional()
28367
28578
  };
28579
+ const eventRegistrationEventSourceSchema = z.discriminatedUnion("kind", [z.object({
28580
+ kind: z.literal("loaded"),
28581
+ events: z.array(eventRegistrationPublicEventSchema)
28582
+ }), z.object({
28583
+ kind: z.literal("unresolved"),
28584
+ request: eventRecoveryRequestSchema.nullable()
28585
+ })]);
28368
28586
  const eventRegistrationSourceSchema = z.object({
28369
28587
  siteId: z.string().optional(),
28370
28588
  apiBaseUrl: z.string().optional(),
28371
28589
  portalToken: z.string().nullable().optional(),
28372
28590
  previewToken: z.string().nullable().optional(),
28373
28591
  ...eventRegistrationHydrationSchemaShape,
28592
+ events: z.array(eventRegistrationPublicEventSchema).nullable().optional(),
28593
+ wholeSeriesRunEvents: z.array(eventRegistrationPublicEventSchema).nullable().optional(),
28594
+ eventLoaderFailures: z.record(z.string(), z.unknown()).nullable().optional(),
28374
28595
  className: z.string().nullable().optional(),
28375
28596
  buttonText: z.string().nullable().optional(),
28376
28597
  maxTickets: z.string().nullable().optional(),
@@ -28391,7 +28612,10 @@ const eventRegistrationDisplaySchema = z.discriminatedUnion("state", [z.object({
28391
28612
  titleText: z.string(),
28392
28613
  bodyText: z.string()
28393
28614
  })]);
28394
- const eventRegistrationHydrationSchema = z.object(eventRegistrationHydrationSchemaShape);
28615
+ const eventRegistrationHydrationSchema = z.object({
28616
+ ...eventRegistrationHydrationSchemaShape,
28617
+ eventSource: eventRegistrationEventSourceSchema
28618
+ });
28395
28619
  const eventRegistrationRenderSchema = z.object({
28396
28620
  display: eventRegistrationDisplaySchema,
28397
28621
  hydration: eventRegistrationHydrationSchema
@@ -28450,16 +28674,12 @@ function buildEventRegistrationShellStepLabels(source, scopedSourceEvents) {
28450
28674
  function toScopedEventRegistrationEvents(scopedSourceEvents) {
28451
28675
  return [...toRegistrationEvents(scopedSourceEvents), ...toWholeSeriesRegistrationEvents(scopedSourceEvents)];
28452
28676
  }
28453
- function scopeEventRegistrationSourceEvents(source) {
28454
- return resolveEventRegistrationScopedEvents(source.wholeSeriesRunEvents ?? source.events ?? [], {
28677
+ function scopeEventRegistrationSourceEvents(source, eventSource) {
28678
+ return resolveEventRegistrationScopedEvents(eventSource.kind === "loaded" ? eventSource.events : [], {
28455
28679
  occurrenceContext: source.occurrenceContext,
28456
28680
  subject: source.subject
28457
28681
  });
28458
28682
  }
28459
- function resolveLoadedEventRegistrationSourceEvents(source, scopedSourceEvents) {
28460
- if (source.events == null && source.wholeSeriesRunEvents == null) return null;
28461
- return [...scopedSourceEvents];
28462
- }
28463
28683
  /**
28464
28684
  * The one run this surface is registering for, when the scoped events describe
28465
28685
  * exactly one. More than one run means the visitor still has to choose.
@@ -28499,14 +28719,21 @@ const eventRegistrationBlockRuntime = defineClientOwnedBlockRuntime({
28499
28719
  render: createZodCodec(eventRegistrationRenderSchema)
28500
28720
  },
28501
28721
  buildRender: (source) => {
28502
- const scopedSourceEvents = scopeEventRegistrationSourceEvents(source);
28503
- const events = resolveLoadedEventRegistrationSourceEvents(source, scopedSourceEvents);
28722
+ const eventSource = resolveEventRegistrationEventSource({
28723
+ events: source.events,
28724
+ wholeSeriesRunEvents: source.wholeSeriesRunEvents,
28725
+ failures: source.eventLoaderFailures
28726
+ });
28727
+ const scopedSourceEvents = scopeEventRegistrationSourceEvents(source, eventSource);
28504
28728
  return {
28505
28729
  display: buildEventRegistrationDisplayFromScopedEvents(source, scopedSourceEvents),
28506
28730
  hydration: {
28507
28731
  occurrenceContext: source.occurrenceContext ?? null,
28508
28732
  subject: source.subject ?? null,
28509
- events,
28733
+ eventSource: eventSource.kind === "loaded" ? {
28734
+ ...eventSource,
28735
+ events: [...scopedSourceEvents]
28736
+ } : eventSource,
28510
28737
  maxTickets: source.maxTickets ?? void 0,
28511
28738
  showVenue: source.showVenue,
28512
28739
  showCapacity: source.showCapacity,
@@ -28682,6 +28909,7 @@ const eventRegistrationBlockDefinition = {
28682
28909
  } },
28683
28910
  events: { $bind: { from: "data.events" } },
28684
28911
  wholeSeriesRunEvents: { $bind: { from: "data.wholeSeriesRunEvents" } },
28912
+ loaderFailures: { $bind: { from: "$root.loaderFailures" } },
28685
28913
  sitePasses: { $bind: { from: "data.sitePasses" } },
28686
28914
  siteMemberships: { $bind: { from: "data.siteMemberships" } },
28687
28915
  stage: { $bind: {
@@ -29167,6 +29395,35 @@ const eventSpotlightBlockDefinition = {
29167
29395
  } }
29168
29396
  };
29169
29397
  //#endregion
29398
+ //#region ../blocks/src/system/blocks/events/shared/eventSelection.ts
29399
+ /** Invalid saved selections fail closed rather than widening discovery. */
29400
+ function resolveEventSelection(mode, value) {
29401
+ if (mode !== "selected") return { kind: "matching" };
29402
+ const candidates = Array.isArray(value) ? value : typeof value === "string" ? value.split(",").filter(Boolean) : [];
29403
+ const ids = [];
29404
+ for (const candidate of candidates) {
29405
+ if (typeof candidate !== "string") return {
29406
+ kind: "selected",
29407
+ seriesIds: []
29408
+ };
29409
+ const parsed = parseEventSeriesId(candidate.trim());
29410
+ if (!parsed.ok) return {
29411
+ kind: "selected",
29412
+ seriesIds: []
29413
+ };
29414
+ ids.push(parsed.value);
29415
+ }
29416
+ return {
29417
+ kind: "selected",
29418
+ seriesIds: [...new Set(ids)].sort()
29419
+ };
29420
+ }
29421
+ /** Undefined means discovery; an empty string is an explicitly empty selection. */
29422
+ function eventSeriesScopeCsv(value) {
29423
+ if (value == null) return void 0;
29424
+ return typeof value === "string" ? value : value.join(",");
29425
+ }
29426
+ //#endregion
29170
29427
  //#region ../blocks/src/system/runtime/nodes/events/shared/listingLayout.ts
29171
29428
  /**
29172
29429
  * Layout classes for event listing containers and cards. Presentation
@@ -29266,6 +29523,7 @@ const eventCollectionFilterSourceSchemaShape = {
29266
29523
  eventSurface: eventSurfaceScopeSchema$1.nullable().optional(),
29267
29524
  filterEventPresets: z.union([z.string(), z.array(z.string())]).nullable().optional(),
29268
29525
  scheduleScope: eventScheduleScopeSchema$1.nullable().optional(),
29526
+ seriesIds: z.union([z.string(), z.array(z.string())]).nullable().optional(),
29269
29527
  filterCategoryIds: z.union([z.string(), z.array(z.string())]).nullable().optional(),
29270
29528
  filterStaffMemberId: z.string().nullable().optional(),
29271
29529
  filterVenueId: z.string().nullable().optional()
@@ -29312,6 +29570,7 @@ const eventCollectionDisplaySchemaShape = {
29312
29570
  eventSurface: eventSurfaceScopeSchema$1,
29313
29571
  filterEventPresets: z.string().nullable(),
29314
29572
  scheduleScope: eventScheduleScopeSchema$1,
29573
+ seriesIds: z.string().nullable().optional(),
29315
29574
  filterCategoryIds: z.string().nullable(),
29316
29575
  filterStaffMemberId: z.string().nullable(),
29317
29576
  filterVenueId: z.string().nullable(),
@@ -29359,11 +29618,15 @@ function buildEventCollectionDisplay(source) {
29359
29618
  };
29360
29619
  }
29361
29620
  function buildEventCollectionFilterDisplay(source) {
29362
- return {
29363
- showFilters: source.showFilters ?? true,
29364
- showCategoryFilter: source.showCategoryFilter ?? "auto",
29365
- showVenueFilter: source.showVenueFilter ?? false,
29366
- showStaffFilter: source.showStaffFilter ?? true,
29621
+ const selected = source.seriesIds != null;
29622
+ const matchingFilters = selected ? {
29623
+ eventSurface: "all",
29624
+ filterEventPresets: null,
29625
+ scheduleScope: "any",
29626
+ filterCategoryIds: null,
29627
+ filterStaffMemberId: null,
29628
+ filterVenueId: null
29629
+ } : {
29367
29630
  eventSurface: normalizeEventSurfaceScope(source.eventSurface),
29368
29631
  filterEventPresets: normalizeEventSurfacePresetsCsv(source.filterEventPresets),
29369
29632
  scheduleScope: normalizeEventScheduleScope(source.scheduleScope),
@@ -29371,6 +29634,14 @@ function buildEventCollectionFilterDisplay(source) {
29371
29634
  filterStaffMemberId: normalizeEventStaffMemberId(source.filterStaffMemberId),
29372
29635
  filterVenueId: normalizeEventVenueId(source.filterVenueId)
29373
29636
  };
29637
+ return {
29638
+ seriesIds: eventSeriesScopeCsv(source.seriesIds),
29639
+ showFilters: selected ? false : source.showFilters ?? true,
29640
+ showCategoryFilter: source.showCategoryFilter ?? "auto",
29641
+ showVenueFilter: source.showVenueFilter ?? false,
29642
+ showStaffFilter: source.showStaffFilter ?? true,
29643
+ ...matchingFilters
29644
+ };
29374
29645
  }
29375
29646
  function buildEventCollectionPresentationDisplay(source) {
29376
29647
  return {
@@ -29385,14 +29656,15 @@ function buildEventCollectionPresentationDisplay(source) {
29385
29656
  }
29386
29657
  function buildEventCollectionHydration(source, now = /* @__PURE__ */ new Date()) {
29387
29658
  const timeZone = source.calendarWindow?.scope.timeZone ?? toBookingTimeZone(source.bookingTimeZone);
29659
+ const selected = source.seriesIds != null;
29388
29660
  return {
29389
29661
  calendarWindow: source.calendarWindow ?? void 0,
29390
29662
  siteId: source.siteId,
29391
29663
  stage: source.stage,
29392
29664
  prefetchedEvents: source.events != null,
29393
- eventSurface: normalizeEventSurfaceScope(source.eventSurface),
29394
- filterEventPresets: normalizeEventSurfacePresetsCsv(source.filterEventPresets),
29395
- scheduleScope: normalizeEventScheduleScope(source.scheduleScope),
29665
+ eventSurface: selected ? "all" : normalizeEventSurfaceScope(source.eventSurface),
29666
+ filterEventPresets: selected ? null : normalizeEventSurfacePresetsCsv(source.filterEventPresets),
29667
+ scheduleScope: selected ? "any" : normalizeEventScheduleScope(source.scheduleScope),
29396
29668
  calendarContext: {
29397
29669
  timeZone,
29398
29670
  initialToday: source.calendarWindow?.initialToday ?? getLocalScheduleDate(now, timeZone)
@@ -29458,6 +29730,7 @@ const eventListingHydrationSchema = z.object({
29458
29730
  eventSurface: eventSurfaceScopeSchema,
29459
29731
  filterEventPresets: z.string().nullable(),
29460
29732
  scheduleScope: eventScheduleScopeSchema,
29733
+ seriesIds: z.string().nullable().optional(),
29461
29734
  filterCategoryIds: z.string().nullable().optional(),
29462
29735
  filterStaffMemberId: z.string().nullable().optional(),
29463
29736
  filterVenueId: z.string().nullable().optional(),
@@ -29518,6 +29791,7 @@ const eventListingBlockRuntime = defineProgressiveBlockRuntime({
29518
29791
  eventSurface: normalizeEventSurfaceScope(source.eventSurface),
29519
29792
  filterEventPresets: normalizeEventSurfacePresetsCsv(source.filterEventPresets),
29520
29793
  scheduleScope: normalizeEventScheduleScope(source.scheduleScope),
29794
+ seriesIds: eventSeriesScopeCsv(source.seriesIds),
29521
29795
  filterCategoryIds: normalizeEventCategoryIdsCsv(source.filterCategoryIds),
29522
29796
  filterStaffMemberId: normalizeEventStaffMemberId(source.filterStaffMemberId),
29523
29797
  filterVenueId: normalizeEventVenueId(source.filterVenueId),
@@ -29891,6 +30165,65 @@ const eventListingBlockDefinition = {
29891
30165
  } }
29892
30166
  };
29893
30167
  //#endregion
30168
+ //#region ../blocks/src/system/blocks/events/eventSelectionFields.ts
30169
+ const eventSelectionFields = [{
30170
+ id: "eventSelection",
30171
+ type: "select",
30172
+ label: "Events to show",
30173
+ required: false,
30174
+ multiple: false,
30175
+ defaultValue: "matching",
30176
+ options: [{
30177
+ value: "matching",
30178
+ label: "All matching events"
30179
+ }, {
30180
+ value: "selected",
30181
+ label: "Selected events"
30182
+ }],
30183
+ ui: { intent: "behavior" }
30184
+ }, createSiteOptionSelectField({
30185
+ id: "selectedEventSeriesIds",
30186
+ label: "Selected events",
30187
+ description: "Show upcoming dates for these events. Other event filters do not apply.",
30188
+ required: false,
30189
+ multiple: true,
30190
+ defaultValue: [],
30191
+ optionSource: "eventSeries",
30192
+ ui: {
30193
+ intent: "behavior",
30194
+ searchThreshold: 1,
30195
+ visibleWhen: {
30196
+ field: "eventSelection",
30197
+ equals: "selected"
30198
+ }
30199
+ }
30200
+ })];
30201
+ function withEventSelectionVisibility(field) {
30202
+ if (![
30203
+ "eventSurface",
30204
+ "filterEventPresets",
30205
+ "scheduleScope",
30206
+ "filterCategoryIds",
30207
+ "filterStaffMemberId",
30208
+ "filterVenueId",
30209
+ "showFilters",
30210
+ "showCategoryFilter",
30211
+ "showVenueFilter",
30212
+ "showStaffFilter"
30213
+ ].includes(field.id)) return field;
30214
+ const visibleWhen = field.ui?.visibleWhen;
30215
+ return {
30216
+ ...field,
30217
+ ui: {
30218
+ ...field.ui,
30219
+ visibleWhen: { allOf: [{
30220
+ field: "eventSelection",
30221
+ notEquals: "selected"
30222
+ }, ...visibleWhen ? [visibleWhen] : []] }
30223
+ }
30224
+ };
30225
+ }
30226
+ //#endregion
29894
30227
  //#region ../blocks/src/system/runtime/nodes/events/EventCalendar.interactive.ts
29895
30228
  const eventCalendarSourceSchema = z.object({
29896
30229
  ...eventCollectionSourceSchemaShape,
@@ -29973,19 +30306,59 @@ const eventCalendarBlockRuntime = defineProgressiveBlockRuntime({
29973
30306
  //#region ../blocks/src/system/blocks/events/eventCalendarDataLoaders.ts
29974
30307
  const scopeParams = {
29975
30308
  siteId: { $bind: { from: "$root.siteId" } },
30309
+ seriesIds: { $bind: {
30310
+ from: "content",
30311
+ transforms: [{
30312
+ id: "events.calendarSelectionParam",
30313
+ options: { key: "seriesIds" }
30314
+ }]
30315
+ } },
29976
30316
  stage: { $bind: {
29977
30317
  from: "$root.previewStage",
29978
30318
  fallback: "published"
29979
30319
  } },
29980
- eventSurface: { $bind: { from: "content.eventSurface" } },
30320
+ eventSurface: { $bind: {
30321
+ from: "content",
30322
+ transforms: [{
30323
+ id: "events.calendarSelectionParam",
30324
+ options: { key: "eventSurface" }
30325
+ }, { id: "value.csv" }]
30326
+ } },
29981
30327
  eventPresets: { $bind: {
29982
- from: "content.filterEventPresets",
29983
- transforms: [{ id: "value.csv" }]
30328
+ from: "content",
30329
+ transforms: [{
30330
+ id: "events.calendarSelectionParam",
30331
+ options: { key: "filterEventPresets" }
30332
+ }, { id: "value.csv" }]
29984
30333
  } },
29985
- scheduleScope: { $bind: { from: "content.scheduleScope" } },
29986
- categoryIds: { $bind: { from: "content.filterCategoryIds" } },
29987
- staffMemberId: { $bind: { from: "content.filterStaffMemberId" } },
29988
- venueId: { $bind: { from: "content.filterVenueId" } }
30334
+ scheduleScope: { $bind: {
30335
+ from: "content",
30336
+ transforms: [{
30337
+ id: "events.calendarSelectionParam",
30338
+ options: { key: "scheduleScope" }
30339
+ }, { id: "value.csv" }]
30340
+ } },
30341
+ categoryIds: { $bind: {
30342
+ from: "content",
30343
+ transforms: [{
30344
+ id: "events.calendarSelectionParam",
30345
+ options: { key: "filterCategoryIds" }
30346
+ }, { id: "value.csv" }]
30347
+ } },
30348
+ staffMemberId: { $bind: {
30349
+ from: "content",
30350
+ transforms: [{
30351
+ id: "events.calendarSelectionParam",
30352
+ options: { key: "filterStaffMemberId" }
30353
+ }, { id: "value.csv" }]
30354
+ } },
30355
+ venueId: { $bind: {
30356
+ from: "content",
30357
+ transforms: [{
30358
+ id: "events.calendarSelectionParam",
30359
+ options: { key: "filterVenueId" }
30360
+ }, { id: "value.csv" }]
30361
+ } }
29989
30362
  };
29990
30363
  /** Combined renders two jobs; calendar-only variants never pay for the list seed. */
29991
30364
  const eventCalendarDataLoaders = {
@@ -30115,6 +30488,13 @@ const eventCalendarLayout = [styledSection({
30115
30488
  from: "content.defaultCalendarView",
30116
30489
  fallback: "month"
30117
30490
  } },
30491
+ seriesIds: { $bind: {
30492
+ from: "content",
30493
+ transforms: [{
30494
+ id: "events.calendarSelectionParam",
30495
+ options: { key: "seriesIds" }
30496
+ }]
30497
+ } },
30118
30498
  showFilters: { $bind: {
30119
30499
  from: "content.showFilters",
30120
30500
  fallback: true
@@ -30136,17 +30516,47 @@ const eventCalendarLayout = [styledSection({
30136
30516
  fallback: true
30137
30517
  } },
30138
30518
  eventSurface: { $bind: {
30139
- from: "content.eventSurface",
30140
- fallback: "all"
30519
+ from: "content",
30520
+ transforms: [{
30521
+ id: "events.calendarSelectionParam",
30522
+ options: { key: "eventSurface" }
30523
+ }]
30524
+ } },
30525
+ filterEventPresets: { $bind: {
30526
+ from: "content",
30527
+ transforms: [{
30528
+ id: "events.calendarSelectionParam",
30529
+ options: { key: "filterEventPresets" }
30530
+ }]
30141
30531
  } },
30142
- filterEventPresets: { $bind: { from: "content.filterEventPresets" } },
30143
30532
  scheduleScope: { $bind: {
30144
- from: "content.scheduleScope",
30145
- fallback: "any"
30533
+ from: "content",
30534
+ transforms: [{
30535
+ id: "events.calendarSelectionParam",
30536
+ options: { key: "scheduleScope" }
30537
+ }]
30538
+ } },
30539
+ filterCategoryIds: { $bind: {
30540
+ from: "content",
30541
+ transforms: [{
30542
+ id: "events.calendarSelectionParam",
30543
+ options: { key: "filterCategoryIds" }
30544
+ }]
30545
+ } },
30546
+ filterStaffMemberId: { $bind: {
30547
+ from: "content",
30548
+ transforms: [{
30549
+ id: "events.calendarSelectionParam",
30550
+ options: { key: "filterStaffMemberId" }
30551
+ }]
30552
+ } },
30553
+ filterVenueId: { $bind: {
30554
+ from: "content",
30555
+ transforms: [{
30556
+ id: "events.calendarSelectionParam",
30557
+ options: { key: "filterVenueId" }
30558
+ }]
30146
30559
  } },
30147
- filterCategoryIds: { $bind: { from: "content.filterCategoryIds" } },
30148
- filterStaffMemberId: { $bind: { from: "content.filterStaffMemberId" } },
30149
- filterVenueId: { $bind: { from: "content.filterVenueId" } },
30150
30560
  cardRole: { $bind: {
30151
30561
  from: "content._cardStyles.role",
30152
30562
  fallback: "default"
@@ -30650,6 +31060,7 @@ const eventCalendarAdditionalFields = [
30650
31060
  }
30651
31061
  }
30652
31062
  },
31063
+ ...eventSelectionFields,
30653
31064
  {
30654
31065
  id: "eventSurface",
30655
31066
  type: "select",
@@ -30859,7 +31270,7 @@ const eventCalendarBlockDefinition = {
30859
31270
  titleSource: "heading",
30860
31271
  description: "Display events with calendar, list, or combined views with filtering",
30861
31272
  skipSectionStyles: true,
30862
- additionalFields: eventCalendarAdditionalFields,
31273
+ additionalFields: eventCalendarAdditionalFields.map(withEventSelectionVisibility),
30863
31274
  styleTokens: {
30864
31275
  background: "surface",
30865
31276
  typography: "body",
@@ -35237,6 +35648,15 @@ const newsletterFieldSchema = z.object({
35237
35648
  placeholder: z.string().optional()
35238
35649
  });
35239
35650
  const mailingListSignupBlockIdSchema = z.string().trim().min(1).transform(parseRequiredMailingListSignupBlockId);
35651
+ const mailingListContentVersionIdSchema = z.string().transform((value, ctx) => {
35652
+ const parsed = parseMailingListContentVersionId(value);
35653
+ if (parsed) return parsed;
35654
+ ctx.addIssue({
35655
+ code: z.ZodIssueCode.custom,
35656
+ message: "Invalid mailing-list content version ID"
35657
+ });
35658
+ return z.NEVER;
35659
+ });
35240
35660
  const signedMailingListSourceTokenSchema = z.string().trim().min(1).transform(parseRequiredMailingListSignedSourceToken);
35241
35661
  const newsletterSourceCommonSchema = z.object({
35242
35662
  siteId: z.string().optional(),
@@ -35250,7 +35670,8 @@ const newsletterSourceCommonSchema = z.object({
35250
35670
  const newsletterSourceSchema = z.discriminatedUnion("source", [
35251
35671
  newsletterSourceCommonSchema.extend({
35252
35672
  source: z.literal("block"),
35253
- blockId: z.string().nullable().optional()
35673
+ blockId: z.string().nullable().optional(),
35674
+ contentVersionId: z.string().nullable().optional()
35254
35675
  }),
35255
35676
  newsletterSourceCommonSchema.extend({
35256
35677
  source: z.literal("signed-footer"),
@@ -35266,6 +35687,7 @@ const newsletterDisplaySchema = z.object({
35266
35687
  availability: z.enum(["ready", "unavailable"]),
35267
35688
  className: z.string().nullable(),
35268
35689
  buttonLabel: z.string(),
35690
+ successMessage: z.string(),
35269
35691
  buttonVariant: newsletterButtonVariantSchema,
35270
35692
  privacyNote: z.string().nullable(),
35271
35693
  fields: z.array(newsletterFieldSchema),
@@ -35280,7 +35702,8 @@ const newsletterHydrationSchema = z.object({
35280
35702
  tag: z.literal("block-source"),
35281
35703
  sourceRef: z.object({
35282
35704
  tag: z.literal("block_ref"),
35283
- blockId: mailingListSignupBlockIdSchema
35705
+ blockId: mailingListSignupBlockIdSchema,
35706
+ contentVersionId: mailingListContentVersionIdSchema
35284
35707
  }).nullable()
35285
35708
  }),
35286
35709
  z.object({
@@ -35319,6 +35742,7 @@ function buildNewsletterDisplay(source) {
35319
35742
  fields: { preset: "emailOnly" },
35320
35743
  includeOptionalPhone: false,
35321
35744
  buttonLabel: "Subscribe",
35745
+ successMessage: DEFAULT_MAILING_LIST_SUCCESS_MESSAGE,
35322
35746
  privacyNote: null
35323
35747
  };
35324
35748
  const targeting = source.targeting ?? { mode: "default" };
@@ -35328,6 +35752,7 @@ function buildNewsletterDisplay(source) {
35328
35752
  availability: runtimeTargetingIsAvailable(context, targeting, choices) ? "ready" : "unavailable",
35329
35753
  className: source.className ?? null,
35330
35754
  buttonLabel: form.buttonLabel,
35755
+ successMessage: form.successMessage,
35331
35756
  buttonVariant: source.buttonVariant ?? "primary",
35332
35757
  privacyNote: form.privacyNote,
35333
35758
  fields: getGlobalFormFields(form),
@@ -35358,7 +35783,7 @@ const newsletterFormBlockRuntime = defineProgressiveBlockRuntime({
35358
35783
  function projectNewsletterFormHydrationTarget(source) {
35359
35784
  switch (source.source) {
35360
35785
  case "block": {
35361
- const sourceRef = buildMailingListSignupBlockSourceRef(source.blockId);
35786
+ const sourceRef = buildMailingListSignupBlockSourceRef(source.blockId, source.contentVersionId);
35362
35787
  if (sourceRef?.tag === "block_ref") return {
35363
35788
  tag: "block-source",
35364
35789
  sourceRef
@@ -37490,6 +37915,26 @@ const linksTransforms = [{
37490
37915
  }
37491
37916
  }];
37492
37917
  const defaultTransforms = createTransformRegistry([
37918
+ {
37919
+ id: "events.calendarSelectionParam",
37920
+ kind: "formatter",
37921
+ summary: "Resolve selected events instead of discovery filters",
37922
+ schema: z.object({ key: z.enum([
37923
+ "seriesIds",
37924
+ "eventSurface",
37925
+ "filterEventPresets",
37926
+ "scheduleScope",
37927
+ "filterCategoryIds",
37928
+ "filterStaffMemberId",
37929
+ "filterVenueId"
37930
+ ]) }),
37931
+ run(value, { key }) {
37932
+ const content = asPartialObject(value) ?? {};
37933
+ const selection = resolveEventSelection(content.eventSelection, content.selectedEventSeriesIds);
37934
+ if (selection.kind === "selected") return key === "seriesIds" ? selection.seriesIds : void 0;
37935
+ return key === "seriesIds" ? void 0 : content[key];
37936
+ }
37937
+ },
37493
37938
  {
37494
37939
  id: "events.calendarReadEnabled",
37495
37940
  kind: "formatter",
@@ -37804,12 +38249,12 @@ function normalizeContent(block) {
37804
38249
  }
37805
38250
  /**
37806
38251
  * Normalize params for API calls.
37807
- * Converts all values to strings.
38252
+ * Converts supplied values to strings, preserving absent versus explicitly empty params.
37808
38253
  */
37809
38254
  function normalizeParams(input) {
37810
38255
  if (!input || typeof input !== "object") return {};
37811
38256
  const output = {};
37812
- for (const [key, value] of Object.entries(input)) output[key] = coerceToString(value);
38257
+ for (const [key, value] of Object.entries(input)) if (value !== void 0 && value !== null) output[key] = coerceToString(value);
37813
38258
  return output;
37814
38259
  }
37815
38260
  function isNonArrayObject(value) {
@@ -37873,6 +38318,14 @@ function coercePayload(payload) {
37873
38318
  * - Frontend: provide internal API client
37874
38319
  * - SDK: provide SDK client with endpoint mapping
37875
38320
  */
38321
+ function projectDataLoaders(loaders, shouldLoad, blockId, blockKind) {
38322
+ if (!shouldLoad) return [...loaders];
38323
+ return loaders.filter(({ key }) => shouldLoad({
38324
+ blockId,
38325
+ blockKind,
38326
+ loaderKey: key
38327
+ }));
38328
+ }
37876
38329
  function shouldSkipResolvedLoader(input) {
37877
38330
  if (input.loader.requiredParams?.some((param) => !input.params[param]?.trim())) return true;
37878
38331
  return Boolean(input.isValidEndpoint && !input.isValidEndpoint(input.endpoint));
@@ -37898,8 +38351,12 @@ function shouldSkipResolvedLoader(input) {
37898
38351
  * ```
37899
38352
  */
37900
38353
  async function prefetchBlockData$1(page, context, options) {
37901
- const { apiClient, isValidEndpoint, onError, getCustomBlockLoaders, getBlockDefinition: getBlockDefinition$1 = getBlockDefinition, resolveParamsBindings: resolveParamsBindings$1 = resolveParamsBindings } = options;
38354
+ return (await prefetchBlockDataWithFailures(page, context, options)).resolvedData;
38355
+ }
38356
+ async function prefetchBlockDataWithFailures(page, context, options) {
38357
+ const { apiClient, isValidEndpoint, onError, getCustomBlockLoaders, getBlockDefinition: getBlockDefinition$1 = getBlockDefinition, resolveParamsBindings: resolveParamsBindings$1 = resolveParamsBindings, shouldLoad } = options;
37902
38358
  const results = {};
38359
+ const loaderFailures = {};
37903
38360
  const tasks = [];
37904
38361
  for (const block of page.blocks) {
37905
38362
  const blockId = block.id;
@@ -37914,6 +38371,7 @@ async function prefetchBlockData$1(page, context, options) {
37914
38371
  loader
37915
38372
  })) : [];
37916
38373
  } else loaders = [];
38374
+ loaders = projectDataLoaders(loaders, shouldLoad, blockId, block.kind);
37917
38375
  if (loaders.length === 0) continue;
37918
38376
  const root = {
37919
38377
  ...context.root ?? {},
@@ -37947,6 +38405,11 @@ async function prefetchBlockData$1(page, context, options) {
37947
38405
  const blockResults = results[blockId] ?? (results[blockId] = {});
37948
38406
  blockResults[key] = data;
37949
38407
  } catch (error) {
38408
+ const blockFailures = loaderFailures[blockId] ?? (loaderFailures[blockId] = {});
38409
+ blockFailures[key] = {
38410
+ endpoint,
38411
+ params
38412
+ };
37950
38413
  if (onError) onError(error, {
37951
38414
  block: block.kind,
37952
38415
  loader: key
@@ -37956,7 +38419,10 @@ async function prefetchBlockData$1(page, context, options) {
37956
38419
  }
37957
38420
  }
37958
38421
  if (tasks.length > 0) await Promise.all(tasks);
37959
- return results;
38422
+ return {
38423
+ resolvedData: results,
38424
+ loaderFailures
38425
+ };
37960
38426
  }
37961
38427
  //#endregion
37962
38428
  //#region ../blocks/src/system/data/loaderEndpoints.ts
@@ -37984,8 +38450,8 @@ function toStringParams(value) {
37984
38450
  for (const [k, v] of Object.entries(value)) if (typeof v === "string") out[k] = v;
37985
38451
  return out;
37986
38452
  }
37987
- function stripEmptyStringValues(params) {
37988
- for (const [key, value] of Object.entries(params)) if (value === "") delete params[key];
38453
+ function stripEmptyStringValues(params, endpoint) {
38454
+ for (const [key, value] of Object.entries(params)) if (value === "" && !(key === "seriesIds" && (endpoint === "listPublicEvents" || endpoint === "listPublicEventCalendarWindow"))) delete params[key];
37989
38455
  }
37990
38456
  function ensureSiteId(params, context) {
37991
38457
  if (!params.siteId && typeof context.siteId === "string" && context.siteId) params.siteId = context.siteId;
@@ -37998,7 +38464,7 @@ function ensureSiteId(params, context) {
37998
38464
  */
37999
38465
  function normalizeLoaderParams(endpoint, params, context) {
38000
38466
  const out = toStringParams(params);
38001
- stripEmptyStringValues(out);
38467
+ stripEmptyStringValues(out, endpoint);
38002
38468
  if (endpoint === "getPublicFormById") {
38003
38469
  ensureSiteId(out, context);
38004
38470
  if (!out.formId && out.formSlug) {
@@ -38306,7 +38772,17 @@ const riverbankSiteConfigInputSchema = z.object({
38306
38772
  z.object({
38307
38773
  config: riverbankSiteConfigInputSchema,
38308
38774
  forceContentTypes: z.boolean().optional(),
38309
- mode: z.enum(["apply", "preview"]).optional()
38775
+ mode: z.enum(["apply", "preview"]).optional(),
38776
+ expectedMailingListProviderScope: z.unknown().transform((value, ctx) => {
38777
+ if (value === void 0) return void 0;
38778
+ const parsed = parseMailingListProviderScope(value);
38779
+ if (parsed.ok) return parsed.value;
38780
+ ctx.addIssue({
38781
+ code: "custom",
38782
+ message: "Invalid mailing-list provider scope"
38783
+ });
38784
+ return z.NEVER;
38785
+ }).optional()
38310
38786
  }).strict();
38311
38787
  //#endregion
38312
38788
  //#region ../api/src/sdkThemeWire.ts