@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
@@ -1356,10 +1356,12 @@ const unsafeAsApiKeyId = (id) => id;
1356
1356
  const unsafeAsEventOfferingId = (id) => id;
1357
1357
  const unsafeAsEventSeriesId = (id) => id;
1358
1358
  const unsafeAsUserId = (id) => id;
1359
+ const unsafeAsContentVersionId = (id) => id;
1359
1360
  const parseSiteId = (value) => parseUuidBrand(value, unsafeAsSiteId);
1360
1361
  const parseApiKeyId = (value) => parseUuidBrand(value, unsafeAsApiKeyId);
1361
1362
  const parseEventOfferingId = (value) => parseUuidBrand(value, unsafeAsEventOfferingId);
1362
1363
  const parseUserId = (value) => parseUuidBrand(value, unsafeAsUserId);
1364
+ const parseContentVersionId = (value) => parseUuidBrand(value, unsafeAsContentVersionId);
1363
1365
  const parseEventSeriesId = (value) => parseUuidBrand(value, unsafeAsEventSeriesId);
1364
1366
  //#endregion
1365
1367
  //#region ../core/src/assert-never.ts
@@ -1593,7 +1595,7 @@ function parseEventPageSurfaceDestinationMode(value) {
1593
1595
  return value === "cms-managed" || value === "system-managed" ? value : void 0;
1594
1596
  }
1595
1597
  function parseEventPageSurfaceSubject(value) {
1596
- if (!isRecord$17(value)) return err$1({ kind: "notObject" });
1598
+ if (!isRecord$18(value)) return err$1({ kind: "notObject" });
1597
1599
  switch (value.kind) {
1598
1600
  case "eventSeries": {
1599
1601
  const eventSeriesId = parseEventSeriesId(value.eventSeriesId);
@@ -1648,7 +1650,7 @@ function parseEventSeriesIdList(values) {
1648
1650
  }
1649
1651
  return ok$1(parsed);
1650
1652
  }
1651
- function isRecord$17(value) {
1653
+ function isRecord$18(value) {
1652
1654
  return typeof value === "object" && value !== null && !Array.isArray(value);
1653
1655
  }
1654
1656
  //#endregion
@@ -1832,16 +1834,47 @@ function parsePositiveInteger(value) {
1832
1834
  function parseNewsletterListId(value) {
1833
1835
  return parseTrimmedMatchingString(value, UUID_PATTERN);
1834
1836
  }
1837
+ function parseMailchimpAccountId(value) {
1838
+ return parseTrimmedMatchingString(value, OPAQUE_ID_PATTERN);
1839
+ }
1835
1840
  function parseMailchimpAudienceId(value) {
1836
1841
  return parseTrimmedMatchingString(value, OPAQUE_ID_PATTERN);
1837
1842
  }
1838
1843
  function parseMailchimpInterestId(value) {
1839
1844
  return parseTrimmedMatchingString(value, OPAQUE_ID_PATTERN);
1840
1845
  }
1846
+ function parseBrevoAccountId(value) {
1847
+ return parseTrimmedMatchingString(value, OPAQUE_ID_PATTERN);
1848
+ }
1841
1849
  function parseBrevoListId(value) {
1842
1850
  return parsePositiveInteger(value);
1843
1851
  }
1844
1852
  //#endregion
1853
+ //#region ../core/src/mailing-list-setup.ts
1854
+ function isRecord$17(value) {
1855
+ return typeof value === "object" && value !== null && !Array.isArray(value);
1856
+ }
1857
+ const DEFAULT_MAILING_LIST_SUCCESS_MESSAGE = "Thanks — you're on the list.";
1858
+ function parseMailingListProviderScope(value) {
1859
+ if (!isRecord$17(value)) return err$1("invalid_mailing_list_provider_scope");
1860
+ if (value.provider === "native") return ok$1({ provider: "native" });
1861
+ if (value.provider === "brevo") {
1862
+ const accountId = parseBrevoAccountId(value.accountId);
1863
+ return accountId !== null ? ok$1({
1864
+ provider: "brevo",
1865
+ accountId
1866
+ }) : err$1("invalid_mailing_list_provider_scope");
1867
+ }
1868
+ if (value.provider === "mailchimp") {
1869
+ const accountId = parseMailchimpAccountId(value.accountId);
1870
+ return accountId !== null ? ok$1({
1871
+ provider: "mailchimp",
1872
+ accountId
1873
+ }) : err$1("invalid_mailing_list_provider_scope");
1874
+ }
1875
+ return err$1("invalid_mailing_list_provider_scope");
1876
+ }
1877
+ //#endregion
1845
1878
  //#region ../core/src/mailing-list-setup-parser.ts
1846
1879
  function parseMailingListGlobalForm(value) {
1847
1880
  if (!isRecord$16(value)) return formError("shape");
@@ -1850,12 +1883,15 @@ function parseMailingListGlobalForm(value) {
1850
1883
  if (typeof value.includeOptionalPhone !== "boolean") return formError("includeOptionalPhone");
1851
1884
  const buttonLabel = parseRequiredString(value.buttonLabel);
1852
1885
  if (buttonLabel === null) return formError("buttonLabel");
1886
+ const successMessage = parseRequiredString(value.successMessage);
1887
+ if (successMessage === null) return formError("successMessage");
1853
1888
  const privacyNote = parseOptionalString(value.privacyNote);
1854
1889
  if (privacyNote === void 0) return formError("privacyNote");
1855
1890
  return ok$1({
1856
1891
  fields,
1857
1892
  includeOptionalPhone: value.includeOptionalPhone,
1858
1893
  buttonLabel,
1894
+ successMessage,
1859
1895
  privacyNote
1860
1896
  });
1861
1897
  }
@@ -2185,11 +2221,17 @@ function parseMailingListSignedSourceToken(value) {
2185
2221
  const parsed = typeof value === "string" ? value.trim() : "";
2186
2222
  return /^[A-Za-z0-9._~-]{16,1000}$/u.test(parsed) ? parsed : null;
2187
2223
  }
2188
- function buildMailingListSignupBlockSourceRef(blockId) {
2189
- const parsed = parseMailingListBlockId(blockId);
2190
- return parsed !== null ? {
2224
+ function parseMailingListContentVersionId(value) {
2225
+ const parsed = parseContentVersionId(value);
2226
+ return parsed.ok ? parsed.value : null;
2227
+ }
2228
+ function buildMailingListSignupBlockSourceRef(blockId, contentVersionId) {
2229
+ const parsedBlockId = parseMailingListBlockId(blockId);
2230
+ const parsedContentVersionId = parseMailingListContentVersionId(contentVersionId);
2231
+ return parsedBlockId !== null && parsedContentVersionId !== null ? {
2191
2232
  tag: "block_ref",
2192
- blockId: parsed
2233
+ blockId: parsedBlockId,
2234
+ contentVersionId: parsedContentVersionId
2193
2235
  } : null;
2194
2236
  }
2195
2237
  //#endregion
@@ -2697,6 +2739,14 @@ const PUBLIC_BOOKING_AVAILABILITY_ENDPOINT_DEFINITIONS = defineEndpointDefinitio
2697
2739
  auth: "public",
2698
2740
  responseKind: "json"
2699
2741
  },
2742
+ getPublicBookingServiceBySlug: {
2743
+ path: "/public/bookings/services/by-slug/{slug}",
2744
+ method: "GET",
2745
+ revalidate: publicReadFreshnessSeconds("getPublicBookingService"),
2746
+ tags: [TAG_TEMPLATES.publicBookingServices],
2747
+ auth: "public",
2748
+ responseKind: "json"
2749
+ },
2700
2750
  getPublicBookingResourcesReference: {
2701
2751
  path: "/public/bookings/resources/reference",
2702
2752
  method: "GET",
@@ -3249,11 +3299,105 @@ const PUBLIC_READ_ENDPOINT_DEFINITIONS = defineEndpointDefinitions({
3249
3299
  responseKind: "json"
3250
3300
  }
3251
3301
  });
3302
+ //#endregion
3303
+ //#region ../api/src/publicOnboardingAttemptEndpointDefinitions.ts
3304
+ /**
3305
+ * The anonymous onboarding attempt, addressed by its opaque resume token.
3306
+ *
3307
+ * Every route here is reached before there is an account, so none of them can
3308
+ * be scoped to a site or a user: the token is the whole credential. They are
3309
+ * kept together so that stays obvious.
3310
+ */
3311
+ const PUBLIC_ONBOARDING_ATTEMPT_ENDPOINT_DEFINITIONS = defineEndpointDefinitions({
3312
+ createPublicOnboardingAttempt: {
3313
+ path: "/public/onboarding/attempts",
3314
+ method: "POST",
3315
+ auth: "public",
3316
+ errors: [],
3317
+ responseKind: "json"
3318
+ },
3319
+ createPublicOnboardingLogoUploadUrl: {
3320
+ path: "/public/onboarding/attempts/{attemptToken}/logo-upload-url",
3321
+ method: "POST",
3322
+ auth: "public",
3323
+ errors: [],
3324
+ responseKind: "json"
3325
+ },
3326
+ uploadPublicOnboardingLogo: {
3327
+ path: "/public/onboarding/attempts/{attemptToken}/logo",
3328
+ method: "POST",
3329
+ auth: "public",
3330
+ errors: [],
3331
+ responseKind: "json"
3332
+ },
3333
+ getPublicOnboardingAttempt: {
3334
+ path: "/public/onboarding/attempts/{attemptToken}",
3335
+ method: "GET",
3336
+ auth: "public",
3337
+ errors: [],
3338
+ responseKind: "json"
3339
+ },
3340
+ getPublicOnboardingAttemptProgress: {
3341
+ path: "/public/onboarding/attempts/{attemptToken}/status",
3342
+ method: "GET",
3343
+ auth: "public",
3344
+ errors: [],
3345
+ responseKind: "json"
3346
+ },
3347
+ updatePublicOnboardingAttempt: {
3348
+ path: "/public/onboarding/attempts/{attemptToken}",
3349
+ method: "PATCH",
3350
+ auth: "public",
3351
+ errors: [],
3352
+ responseKind: "json"
3353
+ },
3354
+ runPublicOnboardingAttempt: {
3355
+ path: "/public/onboarding/attempts/{attemptToken}/run",
3356
+ method: "POST",
3357
+ auth: "public",
3358
+ errors: [],
3359
+ responseKind: "json"
3360
+ },
3361
+ resendPublicOnboardingAttemptConfirmation: {
3362
+ path: "/public/onboarding/attempts/{attemptToken}/resend-confirmation",
3363
+ method: "POST",
3364
+ auth: "public",
3365
+ errors: [],
3366
+ responseKind: "json"
3367
+ }
3368
+ });
3369
+ //#endregion
3370
+ //#region ../api/src/billingEndpointDefinitions.ts
3371
+ const BILLING_ENDPOINT_DEFINITIONS = defineEndpointDefinitions({
3372
+ adminChangePlan: {
3373
+ path: "/admin/billing/plan",
3374
+ method: "POST",
3375
+ tags: ["admin", "billing"],
3376
+ auth: "admin",
3377
+ responseKind: "json"
3378
+ },
3379
+ changePlan: {
3380
+ path: "/billing/plan/change",
3381
+ method: "POST",
3382
+ tags: ["billing"],
3383
+ auth: "user",
3384
+ responseKind: "json"
3385
+ },
3386
+ createBillingPortalSession: {
3387
+ path: "/billing/portal/session",
3388
+ method: "POST",
3389
+ tags: ["billing"],
3390
+ auth: "user",
3391
+ responseKind: "json"
3392
+ }
3393
+ });
3252
3394
  const API_ENDPOINTS$1 = {
3253
3395
  ...ACCOUNT_ENDPOINT_DEFINITIONS,
3396
+ ...PUBLIC_ONBOARDING_ATTEMPT_ENDPOINT_DEFINITIONS,
3254
3397
  ...PUBLIC_EVENT_ENDPOINT_DEFINITIONS,
3255
3398
  ...GIFTING_ENDPOINT_DEFINITIONS,
3256
3399
  ...PUBLIC_READ_ENDPOINT_DEFINITIONS,
3400
+ ...BILLING_ENDPOINT_DEFINITIONS,
3257
3401
  aiContentUpdateChat: {
3258
3402
  path: "/ai/content-update-chat",
3259
3403
  method: "POST",
@@ -3407,55 +3551,6 @@ const API_ENDPOINTS$1 = {
3407
3551
  errors: [],
3408
3552
  responseKind: "json"
3409
3553
  },
3410
- createPublicOnboardingAttempt: {
3411
- path: "/public/onboarding/attempts",
3412
- method: "POST",
3413
- auth: "public",
3414
- errors: [],
3415
- responseKind: "json"
3416
- },
3417
- createPublicOnboardingLogoUploadUrl: {
3418
- path: "/public/onboarding/attempts/{attemptToken}/logo-upload-url",
3419
- method: "POST",
3420
- auth: "public",
3421
- errors: [],
3422
- responseKind: "json"
3423
- },
3424
- uploadPublicOnboardingLogo: {
3425
- path: "/public/onboarding/attempts/{attemptToken}/logo",
3426
- method: "POST",
3427
- auth: "public",
3428
- errors: [],
3429
- responseKind: "json"
3430
- },
3431
- getPublicOnboardingAttempt: {
3432
- path: "/public/onboarding/attempts/{attemptToken}",
3433
- method: "GET",
3434
- auth: "public",
3435
- errors: [],
3436
- responseKind: "json"
3437
- },
3438
- getPublicOnboardingAttemptProgress: {
3439
- path: "/public/onboarding/attempts/{attemptToken}/status",
3440
- method: "GET",
3441
- auth: "public",
3442
- errors: [],
3443
- responseKind: "json"
3444
- },
3445
- updatePublicOnboardingAttempt: {
3446
- path: "/public/onboarding/attempts/{attemptToken}",
3447
- method: "PATCH",
3448
- auth: "public",
3449
- errors: [],
3450
- responseKind: "json"
3451
- },
3452
- runPublicOnboardingAttempt: {
3453
- path: "/public/onboarding/attempts/{attemptToken}/run",
3454
- method: "POST",
3455
- auth: "public",
3456
- errors: [],
3457
- responseKind: "json"
3458
- },
3459
3554
  aiSiteWizardSuggestGoals: {
3460
3555
  path: "/sites/{siteId}/ai/site-wizard/goals",
3461
3556
  method: "POST",
@@ -4971,20 +5066,6 @@ const API_ENDPOINTS$1 = {
4971
5066
  auth: "admin",
4972
5067
  responseKind: "json"
4973
5068
  },
4974
- adminChangePlan: {
4975
- path: "/admin/billing/plan",
4976
- method: "POST",
4977
- tags: ["admin", "billing"],
4978
- auth: "admin",
4979
- responseKind: "json"
4980
- },
4981
- changePlan: {
4982
- path: "/billing/plan/change",
4983
- method: "POST",
4984
- tags: ["billing"],
4985
- auth: "user",
4986
- responseKind: "json"
4987
- },
4988
5069
  mfaTotpEnroll: {
4989
5070
  path: "/auth/mfa/totp/enroll",
4990
5071
  method: "POST",
@@ -5333,7 +5414,12 @@ const API_ENDPOINTS$1 = {
5333
5414
  path: "/public/sites/{siteId}/sitemap",
5334
5415
  method: "GET",
5335
5416
  revalidate: 60,
5336
- tags: [TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.siteSettings],
5417
+ tags: [
5418
+ TAG_TEMPLATES.siteRoutableContent,
5419
+ TAG_TEMPLATES.siteSettings,
5420
+ TAG_TEMPLATES.publicEvents,
5421
+ TAG_TEMPLATES.publicBookingServices
5422
+ ],
5337
5423
  auth: "public",
5338
5424
  responseKind: "json"
5339
5425
  },
@@ -8652,6 +8738,17 @@ const API_ENDPOINTS$1 = {
8652
8738
  auth: "public",
8653
8739
  responseKind: "json"
8654
8740
  },
8741
+ portalCancelWaitlistEntry: {
8742
+ path: "/portal/waitlists/{entryId}/cancel",
8743
+ method: "POST",
8744
+ auth: "public",
8745
+ responseKind: "json",
8746
+ errors: [
8747
+ "resource:not_found",
8748
+ "resource:conflict",
8749
+ "server:internal_error"
8750
+ ]
8751
+ },
8655
8752
  portalGetEventGuests: {
8656
8753
  path: "/portal/events/{registrationId}/guests",
8657
8754
  method: "GET",
@@ -9468,7 +9565,7 @@ var SimpleCache = class {
9468
9565
  * 1. This constant
9469
9566
  * 2. The "version" field in package.json
9470
9567
  */
9471
- const SDK_VERSION = "0.139.0";
9568
+ const SDK_VERSION = "0.141.0";
9472
9569
  //#endregion
9473
9570
  //#region src/client/error.ts
9474
9571
  let _Symbol$for;
@@ -10802,7 +10899,7 @@ const BUTTON_CONTRAST_POLICY = {
10802
10899
  nonTextMinimumRatio: 3,
10803
10900
  gradientSamplesPerSegment: 20,
10804
10901
  alphaBackgrounds: "reject-without-known-surface",
10805
- disabled: "retain-full-colour-contract"
10902
+ disabled: "validated-colour-pair-with-muted-control-opacity"
10806
10903
  };
10807
10904
  function validateButtonSurfaceContrast(input) {
10808
10905
  const ratio = contrastRatio(input.buttonPaint, input.surfaceHex);
@@ -11328,59 +11425,108 @@ function interpolateHex(startHex, endHex, position) {
11328
11425
  const channel = (from, to) => Math.round(from + (to - from) * position).toString(16).padStart(2, "0");
11329
11426
  return `#${channel(start.r, end.r)}${channel(start.g, end.g)}${channel(start.b, end.b)}`;
11330
11427
  }
11331
- shadeBackgroundEffect({
11332
- id: "darken-background",
11333
- name: "Darken on Hover",
11334
- description: "Darkens the background color on hover",
11335
- label: "Darken Amount (shade step)",
11336
- shadeDirection: 1
11337
- });
11338
- shadeBackgroundEffect({
11339
- id: "lighten-background",
11340
- name: "Lighten on Hover",
11341
- description: "Lightens the background color on hover",
11342
- label: "Lighten Amount (shade step)",
11343
- shadeDirection: -1
11344
- });
11345
- function shadeBackgroundEffect(config) {
11346
- return {
11347
- id: config.id,
11348
- name: config.name,
11349
- description: config.description,
11350
- category: "background",
11351
- pseudoElement: "none",
11352
- applicableTo: ["button"],
11353
- customizableOption: {
11354
- name: "amount",
11355
- type: "select",
11356
- label: config.label,
11357
- default: 100,
11358
- options: [
11359
- 0,
11360
- 100,
11361
- 200,
11362
- 300,
11363
- 400,
11364
- 500,
11365
- 600,
11366
- 700,
11367
- 800,
11368
- 900
11369
- ]
11428
+ //#endregion
11429
+ //#region ../theme-core/src/tokens/tokens.ts
11430
+ const defaultThemeTokens = {
11431
+ color: {
11432
+ "background/base": "#ffffff",
11433
+ "background/elevated": "#f5f5f5",
11434
+ "surface/base": "#ffffff",
11435
+ "surface/subtle": "#f9f9fb",
11436
+ "surface/inverted": "#111111",
11437
+ "content/primary": "#111111",
11438
+ "content/secondary": "#3f3f46",
11439
+ "accent/primary": "#2563eb",
11440
+ "accent/secondary": "#1d4ed8",
11441
+ "border/base": "#e5e7eb"
11442
+ },
11443
+ typography: {
11444
+ "display/hero": {
11445
+ fontSize: "clamp(48px, 8vw, 96px)",
11446
+ lineHeight: "1.05",
11447
+ fontWeight: "700"
11370
11448
  },
11371
- isApplicable: (buttonConfig) => buttonConfig.background.type === "solid",
11372
- generateCSS: ({ themeId, variantId, options, tokens, buttonConfig }) => {
11373
- if (buttonConfig.background.type !== "solid") return "";
11374
- const amount = (options.amount || 100) * config.shadeDirection;
11375
- const baseToken = buttonConfig.background.colorToken ?? "primary-500";
11376
- return `
11377
- :where([data-theme-scope="${themeId}"]) .${variantId}:hover {
11378
- background-color: ${tokens.getColor(tokens.adjustShade(baseToken, amount))};
11379
- }
11380
- `;
11449
+ "display/section": {
11450
+ fontSize: "clamp(40px, 6vw, 72px)",
11451
+ lineHeight: "1.1",
11452
+ fontWeight: "700"
11453
+ },
11454
+ "heading/large": {
11455
+ fontSize: "clamp(32px, 4vw, 48px)",
11456
+ lineHeight: "1.2",
11457
+ fontWeight: "600"
11458
+ },
11459
+ "heading/medium": {
11460
+ fontSize: "clamp(24px, 3vw, 32px)",
11461
+ lineHeight: "1.25",
11462
+ fontWeight: "600"
11463
+ },
11464
+ "heading/small": {
11465
+ fontSize: "20px",
11466
+ lineHeight: "1.3",
11467
+ fontWeight: "600"
11468
+ },
11469
+ "body/normal": {
11470
+ fontSize: "16px",
11471
+ lineHeight: "1.6",
11472
+ fontWeight: "400"
11473
+ },
11474
+ "body/small": {
11475
+ fontSize: "14px",
11476
+ lineHeight: "1.5",
11477
+ fontWeight: "400"
11478
+ },
11479
+ caption: {
11480
+ fontSize: "12px",
11481
+ lineHeight: "1.4",
11482
+ fontWeight: "500"
11381
11483
  }
11382
- };
11383
- }
11484
+ },
11485
+ spacing: {
11486
+ none: "0px",
11487
+ "3xs": "4px",
11488
+ "2xs": "8px",
11489
+ xs: "12px",
11490
+ sm: "16px",
11491
+ md: "24px",
11492
+ lg: "32px",
11493
+ xl: "40px",
11494
+ "2xl": "56px",
11495
+ "3xl": "72px"
11496
+ },
11497
+ radius: {
11498
+ none: "0px",
11499
+ xs: "2px",
11500
+ sm: "4px",
11501
+ md: "8px",
11502
+ lg: "12px",
11503
+ pill: "999px",
11504
+ full: "9999px"
11505
+ },
11506
+ shadow: {
11507
+ none: "none",
11508
+ soft: "0px 2px 8px rgba(15, 23, 42, 0.08)",
11509
+ medium: "0px 6px 18px rgba(15, 23, 42, 0.12)",
11510
+ strong: "0px 12px 36px rgba(15, 23, 42, 0.16)"
11511
+ },
11512
+ palette: {
11513
+ surface: "#ffffff",
11514
+ "neutral-50": "#f9fafb",
11515
+ "neutral-900": "#111827",
11516
+ primary: "#2563eb",
11517
+ "primary-50": "#eff6ff",
11518
+ "primary-500": "#2563eb",
11519
+ "primary-900": "#1d4ed8",
11520
+ secondary: "#9333ea",
11521
+ "secondary-50": "#f3e8ff",
11522
+ "secondary-500": "#9333ea",
11523
+ "secondary-900": "#4c1d95",
11524
+ accent: "#f97316",
11525
+ "accent-50": "#fff7ed",
11526
+ "accent-500": "#f97316",
11527
+ "accent-900": "#7c2d12"
11528
+ }
11529
+ };
11384
11530
  //#endregion
11385
11531
  //#region ../theme-core/src/palette/utils/opaqueSurfaceColor.ts
11386
11532
  /** Resolve an opaque colour, compositing alpha against an explicit underlay. */
@@ -11665,6 +11811,59 @@ function mergeStyles(...styles) {
11665
11811
  }
11666
11812
  return Object.keys(merged).length ? merged : void 0;
11667
11813
  }
11814
+ shadeBackgroundEffect({
11815
+ id: "darken-background",
11816
+ name: "Darken on Hover",
11817
+ description: "Darkens the background color on hover",
11818
+ label: "Darken Amount (shade step)",
11819
+ shadeDirection: 1
11820
+ });
11821
+ shadeBackgroundEffect({
11822
+ id: "lighten-background",
11823
+ name: "Lighten on Hover",
11824
+ description: "Lightens the background color on hover",
11825
+ label: "Lighten Amount (shade step)",
11826
+ shadeDirection: -1
11827
+ });
11828
+ function shadeBackgroundEffect(config) {
11829
+ return {
11830
+ id: config.id,
11831
+ name: config.name,
11832
+ description: config.description,
11833
+ category: "background",
11834
+ pseudoElement: "none",
11835
+ applicableTo: ["button"],
11836
+ customizableOption: {
11837
+ name: "amount",
11838
+ type: "select",
11839
+ label: config.label,
11840
+ default: 100,
11841
+ options: [
11842
+ 0,
11843
+ 100,
11844
+ 200,
11845
+ 300,
11846
+ 400,
11847
+ 500,
11848
+ 600,
11849
+ 700,
11850
+ 800,
11851
+ 900
11852
+ ]
11853
+ },
11854
+ isApplicable: (buttonConfig) => buttonConfig.background.type === "solid",
11855
+ generateCSS: ({ themeId, variantId, options, tokens, buttonConfig }) => {
11856
+ if (buttonConfig.background.type !== "solid") return "";
11857
+ const amount = (options.amount || 100) * config.shadeDirection;
11858
+ const baseToken = buttonConfig.background.colorToken ?? "primary-500";
11859
+ return `
11860
+ :where([data-theme-scope="${themeId}"]) .${variantId}:hover {
11861
+ background-color: ${tokens.getColor(tokens.adjustShade(baseToken, amount))};
11862
+ }
11863
+ `;
11864
+ }
11865
+ };
11866
+ }
11668
11867
  //#endregion
11669
11868
  //#region ../theme-core/src/utils/tokenOrColor.ts
11670
11869
  /**
@@ -15087,8 +15286,14 @@ const headerInteractionPillPaletteValues = [
15087
15286
  "accent"
15088
15287
  ];
15089
15288
  /**
15090
- * "No pill": the nav link keeps whatever hover treatment its recipe compiled,
15091
- * and the palette step writes nothing at all (#1318 Phase 4c decision 2).
15289
+ * "No pill": a colour change on hover rather than a filled background.
15290
+ *
15291
+ * The palette step writes nothing (#1318 Phase 4c decision 2), but on a
15292
+ * foreground-adaptive style that is not the end of the story: the hover colour
15293
+ * is derived from the resolved opening foreground at render time, paired with
15294
+ * the resting colour, so `quiet` resolves to a definite colour rather than to
15295
+ * whatever brand token the recipe happened to name. See
15296
+ * `applyOpeningForeground`.
15092
15297
  *
15093
15298
  * It exists because "a colour change on hover, no filled background" was not
15094
15299
  * expressible in the vocabulary, and it is what
@@ -16252,6 +16457,7 @@ function isDisplayMediaKind(kind) {
16252
16457
  }
16253
16458
  const siteOptionSources = [
16254
16459
  "eventCategories",
16460
+ "eventSeries",
16255
16461
  "venues",
16256
16462
  "staffMembers"
16257
16463
  ];
@@ -19547,108 +19753,6 @@ function assertUniqueLayoutProfileKeys(profiles) {
19547
19753
  if (duplicates.length > 0) throw new Error(`Duplicate block layout design profiles: ${duplicates.join(", ")}`);
19548
19754
  }
19549
19755
  //#endregion
19550
- //#region ../theme-core/src/tokens/tokens.ts
19551
- const defaultThemeTokens = {
19552
- color: {
19553
- "background/base": "#ffffff",
19554
- "background/elevated": "#f5f5f5",
19555
- "surface/base": "#ffffff",
19556
- "surface/subtle": "#f9f9fb",
19557
- "surface/inverted": "#111111",
19558
- "content/primary": "#111111",
19559
- "content/secondary": "#3f3f46",
19560
- "accent/primary": "#2563eb",
19561
- "accent/secondary": "#1d4ed8",
19562
- "border/base": "#e5e7eb"
19563
- },
19564
- typography: {
19565
- "display/hero": {
19566
- fontSize: "clamp(48px, 8vw, 96px)",
19567
- lineHeight: "1.05",
19568
- fontWeight: "700"
19569
- },
19570
- "display/section": {
19571
- fontSize: "clamp(40px, 6vw, 72px)",
19572
- lineHeight: "1.1",
19573
- fontWeight: "700"
19574
- },
19575
- "heading/large": {
19576
- fontSize: "clamp(32px, 4vw, 48px)",
19577
- lineHeight: "1.2",
19578
- fontWeight: "600"
19579
- },
19580
- "heading/medium": {
19581
- fontSize: "clamp(24px, 3vw, 32px)",
19582
- lineHeight: "1.25",
19583
- fontWeight: "600"
19584
- },
19585
- "heading/small": {
19586
- fontSize: "20px",
19587
- lineHeight: "1.3",
19588
- fontWeight: "600"
19589
- },
19590
- "body/normal": {
19591
- fontSize: "16px",
19592
- lineHeight: "1.6",
19593
- fontWeight: "400"
19594
- },
19595
- "body/small": {
19596
- fontSize: "14px",
19597
- lineHeight: "1.5",
19598
- fontWeight: "400"
19599
- },
19600
- caption: {
19601
- fontSize: "12px",
19602
- lineHeight: "1.4",
19603
- fontWeight: "500"
19604
- }
19605
- },
19606
- spacing: {
19607
- none: "0px",
19608
- "3xs": "4px",
19609
- "2xs": "8px",
19610
- xs: "12px",
19611
- sm: "16px",
19612
- md: "24px",
19613
- lg: "32px",
19614
- xl: "40px",
19615
- "2xl": "56px",
19616
- "3xl": "72px"
19617
- },
19618
- radius: {
19619
- none: "0px",
19620
- xs: "2px",
19621
- sm: "4px",
19622
- md: "8px",
19623
- lg: "12px",
19624
- pill: "999px",
19625
- full: "9999px"
19626
- },
19627
- shadow: {
19628
- none: "none",
19629
- soft: "0px 2px 8px rgba(15, 23, 42, 0.08)",
19630
- medium: "0px 6px 18px rgba(15, 23, 42, 0.12)",
19631
- strong: "0px 12px 36px rgba(15, 23, 42, 0.16)"
19632
- },
19633
- palette: {
19634
- surface: "#ffffff",
19635
- "neutral-50": "#f9fafb",
19636
- "neutral-900": "#111827",
19637
- primary: "#2563eb",
19638
- "primary-50": "#eff6ff",
19639
- "primary-500": "#2563eb",
19640
- "primary-900": "#1d4ed8",
19641
- secondary: "#9333ea",
19642
- "secondary-50": "#f3e8ff",
19643
- "secondary-500": "#9333ea",
19644
- "secondary-900": "#4c1d95",
19645
- accent: "#f97316",
19646
- "accent-50": "#fff7ed",
19647
- "accent-500": "#f97316",
19648
- "accent-900": "#7c2d12"
19649
- }
19650
- };
19651
- //#endregion
19652
19756
  //#region ../theme-core/src/site-styles/backgroundAppearance.ts
19653
19757
  const backgroundAppearanceQuickColorTokenNames = [
19654
19758
  "background",
@@ -35280,7 +35384,8 @@ const appointmentServicesBlockDefinition = {
35280
35384
  el("appointment-services", {
35281
35385
  sectionHeading: { $bind: { from: "content.heading" } },
35282
35386
  services: { $bind: { from: "data.services" } },
35283
- pathname: { $bind: { from: "$root.pathname" } }
35387
+ pathname: { $bind: { from: "$root.pathname" } },
35388
+ servicePathPrefix: { $bind: { from: "$root.appointmentServicePathPrefix" } }
35284
35389
  })
35285
35390
  ], { gap: "lg" })
35286
35391
  })]
@@ -35583,6 +35688,28 @@ const bookingRequirementConsentFieldSchema = z.object({
35583
35688
  z.union([blockBookingConsentSchema, bookingRequirementConsentFieldSchema]);
35584
35689
  //#endregion
35585
35690
  //#region ../blocks/src/system/blocks/events/shared/schemas.ts
35691
+ const publicEventLoaderQuerySchemaShape = {
35692
+ limit: z.string().optional(),
35693
+ from: z.string().optional(),
35694
+ to: z.string().optional(),
35695
+ afterStartsAt: z.string().optional(),
35696
+ afterId: z.string().optional(),
35697
+ categoryIds: z.string().optional(),
35698
+ venueId: z.string().optional(),
35699
+ staffMemberId: z.string().optional(),
35700
+ eventSurface: z.string().optional(),
35701
+ eventPresets: z.string().optional(),
35702
+ scheduleScope: z.string().optional(),
35703
+ seriesId: z.string().optional(),
35704
+ seriesIds: z.string().optional(),
35705
+ runSeriesId: z.string().optional(),
35706
+ seriesSlug: z.string().optional(),
35707
+ includeOccurrenceId: z.string().optional(),
35708
+ readIntent: z.string().optional(),
35709
+ detailLevel: z.string().optional(),
35710
+ readProfile: z.string().optional()
35711
+ };
35712
+ z.object(publicEventLoaderQuerySchemaShape);
35586
35713
  const eventPresetSchema = z.enum([
35587
35714
  "event",
35588
35715
  "class",
@@ -36385,6 +36512,44 @@ function toWholeSeriesRegistrationEvents(events) {
36385
36512
  return groupPublicEventsByRun(events).map(toWholeSeriesRegistrationEvent).filter((event) => event !== null);
36386
36513
  }
36387
36514
  //#endregion
36515
+ //#region ../blocks/src/system/runtime/nodes/event-registration/eventSourceRecovery.ts
36516
+ const { limit: _rawLimit, eventSurface: _rawEventSurface, scheduleScope: _rawScheduleScope, detailLevel: _rawDetailLevel, ...stringEventQueryShape } = publicEventLoaderQuerySchemaShape;
36517
+ const eventRecoveryRequestSchema = z.object({
36518
+ ...stringEventQueryShape,
36519
+ limit: z.coerce.number().int().positive().optional(),
36520
+ eventSurface: z.enum(eventSurfaceScopeValues).optional(),
36521
+ scheduleScope: z.enum(eventScheduleScopeValues).optional(),
36522
+ detailLevel: z.enum(["full", "listing"]).optional(),
36523
+ stage: z.enum(["preview", "published"]).optional()
36524
+ });
36525
+ function resolveEventRegistrationEventSource(input) {
36526
+ if (input.wholeSeriesRunEvents != null) return {
36527
+ kind: "loaded",
36528
+ events: input.wholeSeriesRunEvents
36529
+ };
36530
+ if (input.events != null) return {
36531
+ kind: "loaded",
36532
+ events: input.events
36533
+ };
36534
+ return {
36535
+ kind: "unresolved",
36536
+ request: parseEventLoaderRecoveryRequest(input.failures?.wholeSeriesRunEvents ?? input.failures?.events)
36537
+ };
36538
+ }
36539
+ const eventLoaderFailureSchema = z.object({
36540
+ endpoint: z.literal("listPublicEvents"),
36541
+ params: eventRecoveryRequestSchema.extend({ siteId: z.string().optional() })
36542
+ });
36543
+ function parseEventLoaderRecoveryRequest(value) {
36544
+ const parsed = eventLoaderFailureSchema.safeParse(value);
36545
+ if (!parsed.success) return null;
36546
+ const { siteId: _siteId, stage, ...params } = parsed.data.params;
36547
+ return {
36548
+ ...params,
36549
+ stage: stage ?? "published"
36550
+ };
36551
+ }
36552
+ //#endregion
36388
36553
  //#region ../blocks/src/system/runtime/nodes/event-registration.interactive.ts
36389
36554
  const EVENT_REGISTRATION_GENERIC_SHELL_STEP_LABELS = [
36390
36555
  "Date",
@@ -36402,8 +36567,6 @@ const eventRegistrationPublicEventSchema = z.preprocess(normalizeEventRegistrati
36402
36567
  const eventRegistrationHydrationSchemaShape = {
36403
36568
  occurrenceContext: occurrenceContextSchema.optional(),
36404
36569
  subject: eventRegistrationPageSurfaceSubjectSchema.nullable().optional(),
36405
- events: z.array(eventRegistrationPublicEventSchema).nullable().optional(),
36406
- wholeSeriesRunEvents: z.array(eventRegistrationPublicEventSchema).nullable().optional(),
36407
36570
  maxTickets: z.string().optional(),
36408
36571
  showVenue: z.boolean().optional(),
36409
36572
  showCapacity: z.boolean().optional(),
@@ -36415,12 +36578,22 @@ const eventRegistrationHydrationSchemaShape = {
36415
36578
  sitePasses: publicPassProductCollectionSchema.nullable().optional(),
36416
36579
  siteMemberships: publicMembershipProductCollectionSchema.nullable().optional()
36417
36580
  };
36581
+ const eventRegistrationEventSourceSchema = z.discriminatedUnion("kind", [z.object({
36582
+ kind: z.literal("loaded"),
36583
+ events: z.array(eventRegistrationPublicEventSchema)
36584
+ }), z.object({
36585
+ kind: z.literal("unresolved"),
36586
+ request: eventRecoveryRequestSchema.nullable()
36587
+ })]);
36418
36588
  const eventRegistrationSourceSchema = z.object({
36419
36589
  siteId: z.string().optional(),
36420
36590
  apiBaseUrl: z.string().optional(),
36421
36591
  portalToken: z.string().nullable().optional(),
36422
36592
  previewToken: z.string().nullable().optional(),
36423
36593
  ...eventRegistrationHydrationSchemaShape,
36594
+ events: z.array(eventRegistrationPublicEventSchema).nullable().optional(),
36595
+ wholeSeriesRunEvents: z.array(eventRegistrationPublicEventSchema).nullable().optional(),
36596
+ eventLoaderFailures: z.record(z.string(), z.unknown()).nullable().optional(),
36424
36597
  className: z.string().nullable().optional(),
36425
36598
  buttonText: z.string().nullable().optional(),
36426
36599
  maxTickets: z.string().nullable().optional(),
@@ -36441,7 +36614,10 @@ const eventRegistrationDisplaySchema = z.discriminatedUnion("state", [z.object({
36441
36614
  titleText: z.string(),
36442
36615
  bodyText: z.string()
36443
36616
  })]);
36444
- const eventRegistrationHydrationSchema = z.object(eventRegistrationHydrationSchemaShape);
36617
+ const eventRegistrationHydrationSchema = z.object({
36618
+ ...eventRegistrationHydrationSchemaShape,
36619
+ eventSource: eventRegistrationEventSourceSchema
36620
+ });
36445
36621
  const eventRegistrationRenderSchema = z.object({
36446
36622
  display: eventRegistrationDisplaySchema,
36447
36623
  hydration: eventRegistrationHydrationSchema
@@ -36500,16 +36676,12 @@ function buildEventRegistrationShellStepLabels(source, scopedSourceEvents) {
36500
36676
  function toScopedEventRegistrationEvents(scopedSourceEvents) {
36501
36677
  return [...toRegistrationEvents(scopedSourceEvents), ...toWholeSeriesRegistrationEvents(scopedSourceEvents)];
36502
36678
  }
36503
- function scopeEventRegistrationSourceEvents(source) {
36504
- return resolveEventRegistrationScopedEvents(source.wholeSeriesRunEvents ?? source.events ?? [], {
36679
+ function scopeEventRegistrationSourceEvents(source, eventSource) {
36680
+ return resolveEventRegistrationScopedEvents(eventSource.kind === "loaded" ? eventSource.events : [], {
36505
36681
  occurrenceContext: source.occurrenceContext,
36506
36682
  subject: source.subject
36507
36683
  });
36508
36684
  }
36509
- function resolveLoadedEventRegistrationSourceEvents(source, scopedSourceEvents) {
36510
- if (source.events == null && source.wholeSeriesRunEvents == null) return null;
36511
- return [...scopedSourceEvents];
36512
- }
36513
36685
  /**
36514
36686
  * The one run this surface is registering for, when the scoped events describe
36515
36687
  * exactly one. More than one run means the visitor still has to choose.
@@ -36549,14 +36721,21 @@ const eventRegistrationBlockRuntime = defineClientOwnedBlockRuntime({
36549
36721
  render: createZodCodec(eventRegistrationRenderSchema)
36550
36722
  },
36551
36723
  buildRender: (source) => {
36552
- const scopedSourceEvents = scopeEventRegistrationSourceEvents(source);
36553
- const events = resolveLoadedEventRegistrationSourceEvents(source, scopedSourceEvents);
36724
+ const eventSource = resolveEventRegistrationEventSource({
36725
+ events: source.events,
36726
+ wholeSeriesRunEvents: source.wholeSeriesRunEvents,
36727
+ failures: source.eventLoaderFailures
36728
+ });
36729
+ const scopedSourceEvents = scopeEventRegistrationSourceEvents(source, eventSource);
36554
36730
  return {
36555
36731
  display: buildEventRegistrationDisplayFromScopedEvents(source, scopedSourceEvents),
36556
36732
  hydration: {
36557
36733
  occurrenceContext: source.occurrenceContext ?? null,
36558
36734
  subject: source.subject ?? null,
36559
- events,
36735
+ eventSource: eventSource.kind === "loaded" ? {
36736
+ ...eventSource,
36737
+ events: [...scopedSourceEvents]
36738
+ } : eventSource,
36560
36739
  maxTickets: source.maxTickets ?? void 0,
36561
36740
  showVenue: source.showVenue,
36562
36741
  showCapacity: source.showCapacity,
@@ -36732,6 +36911,7 @@ const eventRegistrationBlockDefinition = {
36732
36911
  } },
36733
36912
  events: { $bind: { from: "data.events" } },
36734
36913
  wholeSeriesRunEvents: { $bind: { from: "data.wholeSeriesRunEvents" } },
36914
+ loaderFailures: { $bind: { from: "$root.loaderFailures" } },
36735
36915
  sitePasses: { $bind: { from: "data.sitePasses" } },
36736
36916
  siteMemberships: { $bind: { from: "data.siteMemberships" } },
36737
36917
  stage: { $bind: {
@@ -37217,6 +37397,35 @@ const eventSpotlightBlockDefinition = {
37217
37397
  } }
37218
37398
  };
37219
37399
  //#endregion
37400
+ //#region ../blocks/src/system/blocks/events/shared/eventSelection.ts
37401
+ /** Invalid saved selections fail closed rather than widening discovery. */
37402
+ function resolveEventSelection(mode, value) {
37403
+ if (mode !== "selected") return { kind: "matching" };
37404
+ const candidates = Array.isArray(value) ? value : typeof value === "string" ? value.split(",").filter(Boolean) : [];
37405
+ const ids = [];
37406
+ for (const candidate of candidates) {
37407
+ if (typeof candidate !== "string") return {
37408
+ kind: "selected",
37409
+ seriesIds: []
37410
+ };
37411
+ const parsed = parseEventSeriesId(candidate.trim());
37412
+ if (!parsed.ok) return {
37413
+ kind: "selected",
37414
+ seriesIds: []
37415
+ };
37416
+ ids.push(parsed.value);
37417
+ }
37418
+ return {
37419
+ kind: "selected",
37420
+ seriesIds: [...new Set(ids)].sort()
37421
+ };
37422
+ }
37423
+ /** Undefined means discovery; an empty string is an explicitly empty selection. */
37424
+ function eventSeriesScopeCsv(value) {
37425
+ if (value == null) return void 0;
37426
+ return typeof value === "string" ? value : value.join(",");
37427
+ }
37428
+ //#endregion
37220
37429
  //#region ../blocks/src/system/runtime/nodes/events/shared/listingLayout.ts
37221
37430
  /**
37222
37431
  * Layout classes for event listing containers and cards. Presentation
@@ -37345,6 +37554,7 @@ const calendarWindowQuerySchema = z.object({
37345
37554
  eventSurface: z.enum(eventSurfaceScopeValues).optional(),
37346
37555
  eventPresets: z.string().optional(),
37347
37556
  scheduleScope: z.enum(eventScheduleScopeValues).optional(),
37557
+ seriesIds: z.string().optional(),
37348
37558
  categoryIds: z.string().optional(),
37349
37559
  venueId: z.string().transform(normalizeCalendarFilterId).optional(),
37350
37560
  staffMemberId: z.string().transform(normalizeCalendarFilterId).optional()
@@ -37407,6 +37617,7 @@ const eventCollectionFilterSourceSchemaShape = {
37407
37617
  eventSurface: eventSurfaceScopeSchema$1.nullable().optional(),
37408
37618
  filterEventPresets: z.union([z.string(), z.array(z.string())]).nullable().optional(),
37409
37619
  scheduleScope: eventScheduleScopeSchema$1.nullable().optional(),
37620
+ seriesIds: z.union([z.string(), z.array(z.string())]).nullable().optional(),
37410
37621
  filterCategoryIds: z.union([z.string(), z.array(z.string())]).nullable().optional(),
37411
37622
  filterStaffMemberId: z.string().nullable().optional(),
37412
37623
  filterVenueId: z.string().nullable().optional()
@@ -37453,6 +37664,7 @@ const eventCollectionDisplaySchemaShape = {
37453
37664
  eventSurface: eventSurfaceScopeSchema$1,
37454
37665
  filterEventPresets: z.string().nullable(),
37455
37666
  scheduleScope: eventScheduleScopeSchema$1,
37667
+ seriesIds: z.string().nullable().optional(),
37456
37668
  filterCategoryIds: z.string().nullable(),
37457
37669
  filterStaffMemberId: z.string().nullable(),
37458
37670
  filterVenueId: z.string().nullable(),
@@ -37500,11 +37712,15 @@ function buildEventCollectionDisplay(source) {
37500
37712
  };
37501
37713
  }
37502
37714
  function buildEventCollectionFilterDisplay(source) {
37503
- return {
37504
- showFilters: source.showFilters ?? true,
37505
- showCategoryFilter: source.showCategoryFilter ?? "auto",
37506
- showVenueFilter: source.showVenueFilter ?? false,
37507
- showStaffFilter: source.showStaffFilter ?? true,
37715
+ const selected = source.seriesIds != null;
37716
+ const matchingFilters = selected ? {
37717
+ eventSurface: "all",
37718
+ filterEventPresets: null,
37719
+ scheduleScope: "any",
37720
+ filterCategoryIds: null,
37721
+ filterStaffMemberId: null,
37722
+ filterVenueId: null
37723
+ } : {
37508
37724
  eventSurface: normalizeEventSurfaceScope(source.eventSurface),
37509
37725
  filterEventPresets: normalizeEventSurfacePresetsCsv(source.filterEventPresets),
37510
37726
  scheduleScope: normalizeEventScheduleScope(source.scheduleScope),
@@ -37512,6 +37728,14 @@ function buildEventCollectionFilterDisplay(source) {
37512
37728
  filterStaffMemberId: normalizeEventStaffMemberId(source.filterStaffMemberId),
37513
37729
  filterVenueId: normalizeEventVenueId(source.filterVenueId)
37514
37730
  };
37731
+ return {
37732
+ seriesIds: eventSeriesScopeCsv(source.seriesIds),
37733
+ showFilters: selected ? false : source.showFilters ?? true,
37734
+ showCategoryFilter: source.showCategoryFilter ?? "auto",
37735
+ showVenueFilter: source.showVenueFilter ?? false,
37736
+ showStaffFilter: source.showStaffFilter ?? true,
37737
+ ...matchingFilters
37738
+ };
37515
37739
  }
37516
37740
  function buildEventCollectionPresentationDisplay(source) {
37517
37741
  return {
@@ -37526,14 +37750,15 @@ function buildEventCollectionPresentationDisplay(source) {
37526
37750
  }
37527
37751
  function buildEventCollectionHydration(source, now = /* @__PURE__ */ new Date()) {
37528
37752
  const timeZone = source.calendarWindow?.scope.timeZone ?? toBookingTimeZone(source.bookingTimeZone);
37753
+ const selected = source.seriesIds != null;
37529
37754
  return {
37530
37755
  calendarWindow: source.calendarWindow ?? void 0,
37531
37756
  siteId: source.siteId,
37532
37757
  stage: source.stage,
37533
37758
  prefetchedEvents: source.events != null,
37534
- eventSurface: normalizeEventSurfaceScope(source.eventSurface),
37535
- filterEventPresets: normalizeEventSurfacePresetsCsv(source.filterEventPresets),
37536
- scheduleScope: normalizeEventScheduleScope(source.scheduleScope),
37759
+ eventSurface: selected ? "all" : normalizeEventSurfaceScope(source.eventSurface),
37760
+ filterEventPresets: selected ? null : normalizeEventSurfacePresetsCsv(source.filterEventPresets),
37761
+ scheduleScope: selected ? "any" : normalizeEventScheduleScope(source.scheduleScope),
37537
37762
  calendarContext: {
37538
37763
  timeZone,
37539
37764
  initialToday: source.calendarWindow?.initialToday ?? getLocalScheduleDate(now, timeZone)
@@ -37599,6 +37824,7 @@ const eventListingHydrationSchema = z.object({
37599
37824
  eventSurface: eventSurfaceScopeSchema,
37600
37825
  filterEventPresets: z.string().nullable(),
37601
37826
  scheduleScope: eventScheduleScopeSchema,
37827
+ seriesIds: z.string().nullable().optional(),
37602
37828
  filterCategoryIds: z.string().nullable().optional(),
37603
37829
  filterStaffMemberId: z.string().nullable().optional(),
37604
37830
  filterVenueId: z.string().nullable().optional(),
@@ -37659,6 +37885,7 @@ const eventListingBlockRuntime = defineProgressiveBlockRuntime({
37659
37885
  eventSurface: normalizeEventSurfaceScope(source.eventSurface),
37660
37886
  filterEventPresets: normalizeEventSurfacePresetsCsv(source.filterEventPresets),
37661
37887
  scheduleScope: normalizeEventScheduleScope(source.scheduleScope),
37888
+ seriesIds: eventSeriesScopeCsv(source.seriesIds),
37662
37889
  filterCategoryIds: normalizeEventCategoryIdsCsv(source.filterCategoryIds),
37663
37890
  filterStaffMemberId: normalizeEventStaffMemberId(source.filterStaffMemberId),
37664
37891
  filterVenueId: normalizeEventVenueId(source.filterVenueId),
@@ -38032,6 +38259,65 @@ const eventListingBlockDefinition = {
38032
38259
  } }
38033
38260
  };
38034
38261
  //#endregion
38262
+ //#region ../blocks/src/system/blocks/events/eventSelectionFields.ts
38263
+ const eventSelectionFields = [{
38264
+ id: "eventSelection",
38265
+ type: "select",
38266
+ label: "Events to show",
38267
+ required: false,
38268
+ multiple: false,
38269
+ defaultValue: "matching",
38270
+ options: [{
38271
+ value: "matching",
38272
+ label: "All matching events"
38273
+ }, {
38274
+ value: "selected",
38275
+ label: "Selected events"
38276
+ }],
38277
+ ui: { intent: "behavior" }
38278
+ }, createSiteOptionSelectField({
38279
+ id: "selectedEventSeriesIds",
38280
+ label: "Selected events",
38281
+ description: "Show upcoming dates for these events. Other event filters do not apply.",
38282
+ required: false,
38283
+ multiple: true,
38284
+ defaultValue: [],
38285
+ optionSource: "eventSeries",
38286
+ ui: {
38287
+ intent: "behavior",
38288
+ searchThreshold: 1,
38289
+ visibleWhen: {
38290
+ field: "eventSelection",
38291
+ equals: "selected"
38292
+ }
38293
+ }
38294
+ })];
38295
+ function withEventSelectionVisibility(field) {
38296
+ if (![
38297
+ "eventSurface",
38298
+ "filterEventPresets",
38299
+ "scheduleScope",
38300
+ "filterCategoryIds",
38301
+ "filterStaffMemberId",
38302
+ "filterVenueId",
38303
+ "showFilters",
38304
+ "showCategoryFilter",
38305
+ "showVenueFilter",
38306
+ "showStaffFilter"
38307
+ ].includes(field.id)) return field;
38308
+ const visibleWhen = field.ui?.visibleWhen;
38309
+ return {
38310
+ ...field,
38311
+ ui: {
38312
+ ...field.ui,
38313
+ visibleWhen: { allOf: [{
38314
+ field: "eventSelection",
38315
+ notEquals: "selected"
38316
+ }, ...visibleWhen ? [visibleWhen] : []] }
38317
+ }
38318
+ };
38319
+ }
38320
+ //#endregion
38035
38321
  //#region ../blocks/src/system/runtime/nodes/events/EventCalendar.interactive.ts
38036
38322
  const eventCalendarSourceSchema = z.object({
38037
38323
  ...eventCollectionSourceSchemaShape,
@@ -38114,19 +38400,59 @@ const eventCalendarBlockRuntime = defineProgressiveBlockRuntime({
38114
38400
  //#region ../blocks/src/system/blocks/events/eventCalendarDataLoaders.ts
38115
38401
  const scopeParams = {
38116
38402
  siteId: { $bind: { from: "$root.siteId" } },
38403
+ seriesIds: { $bind: {
38404
+ from: "content",
38405
+ transforms: [{
38406
+ id: "events.calendarSelectionParam",
38407
+ options: { key: "seriesIds" }
38408
+ }]
38409
+ } },
38117
38410
  stage: { $bind: {
38118
38411
  from: "$root.previewStage",
38119
38412
  fallback: "published"
38120
38413
  } },
38121
- eventSurface: { $bind: { from: "content.eventSurface" } },
38414
+ eventSurface: { $bind: {
38415
+ from: "content",
38416
+ transforms: [{
38417
+ id: "events.calendarSelectionParam",
38418
+ options: { key: "eventSurface" }
38419
+ }, { id: "value.csv" }]
38420
+ } },
38122
38421
  eventPresets: { $bind: {
38123
- from: "content.filterEventPresets",
38124
- transforms: [{ id: "value.csv" }]
38422
+ from: "content",
38423
+ transforms: [{
38424
+ id: "events.calendarSelectionParam",
38425
+ options: { key: "filterEventPresets" }
38426
+ }, { id: "value.csv" }]
38427
+ } },
38428
+ scheduleScope: { $bind: {
38429
+ from: "content",
38430
+ transforms: [{
38431
+ id: "events.calendarSelectionParam",
38432
+ options: { key: "scheduleScope" }
38433
+ }, { id: "value.csv" }]
38434
+ } },
38435
+ categoryIds: { $bind: {
38436
+ from: "content",
38437
+ transforms: [{
38438
+ id: "events.calendarSelectionParam",
38439
+ options: { key: "filterCategoryIds" }
38440
+ }, { id: "value.csv" }]
38125
38441
  } },
38126
- scheduleScope: { $bind: { from: "content.scheduleScope" } },
38127
- categoryIds: { $bind: { from: "content.filterCategoryIds" } },
38128
- staffMemberId: { $bind: { from: "content.filterStaffMemberId" } },
38129
- venueId: { $bind: { from: "content.filterVenueId" } }
38442
+ staffMemberId: { $bind: {
38443
+ from: "content",
38444
+ transforms: [{
38445
+ id: "events.calendarSelectionParam",
38446
+ options: { key: "filterStaffMemberId" }
38447
+ }, { id: "value.csv" }]
38448
+ } },
38449
+ venueId: { $bind: {
38450
+ from: "content",
38451
+ transforms: [{
38452
+ id: "events.calendarSelectionParam",
38453
+ options: { key: "filterVenueId" }
38454
+ }, { id: "value.csv" }]
38455
+ } }
38130
38456
  };
38131
38457
  /** Combined renders two jobs; calendar-only variants never pay for the list seed. */
38132
38458
  const eventCalendarDataLoaders = {
@@ -38256,6 +38582,13 @@ const eventCalendarLayout = [styledSection({
38256
38582
  from: "content.defaultCalendarView",
38257
38583
  fallback: "month"
38258
38584
  } },
38585
+ seriesIds: { $bind: {
38586
+ from: "content",
38587
+ transforms: [{
38588
+ id: "events.calendarSelectionParam",
38589
+ options: { key: "seriesIds" }
38590
+ }]
38591
+ } },
38259
38592
  showFilters: { $bind: {
38260
38593
  from: "content.showFilters",
38261
38594
  fallback: true
@@ -38277,17 +38610,47 @@ const eventCalendarLayout = [styledSection({
38277
38610
  fallback: true
38278
38611
  } },
38279
38612
  eventSurface: { $bind: {
38280
- from: "content.eventSurface",
38281
- fallback: "all"
38613
+ from: "content",
38614
+ transforms: [{
38615
+ id: "events.calendarSelectionParam",
38616
+ options: { key: "eventSurface" }
38617
+ }]
38618
+ } },
38619
+ filterEventPresets: { $bind: {
38620
+ from: "content",
38621
+ transforms: [{
38622
+ id: "events.calendarSelectionParam",
38623
+ options: { key: "filterEventPresets" }
38624
+ }]
38282
38625
  } },
38283
- filterEventPresets: { $bind: { from: "content.filterEventPresets" } },
38284
38626
  scheduleScope: { $bind: {
38285
- from: "content.scheduleScope",
38286
- fallback: "any"
38627
+ from: "content",
38628
+ transforms: [{
38629
+ id: "events.calendarSelectionParam",
38630
+ options: { key: "scheduleScope" }
38631
+ }]
38632
+ } },
38633
+ filterCategoryIds: { $bind: {
38634
+ from: "content",
38635
+ transforms: [{
38636
+ id: "events.calendarSelectionParam",
38637
+ options: { key: "filterCategoryIds" }
38638
+ }]
38639
+ } },
38640
+ filterStaffMemberId: { $bind: {
38641
+ from: "content",
38642
+ transforms: [{
38643
+ id: "events.calendarSelectionParam",
38644
+ options: { key: "filterStaffMemberId" }
38645
+ }]
38646
+ } },
38647
+ filterVenueId: { $bind: {
38648
+ from: "content",
38649
+ transforms: [{
38650
+ id: "events.calendarSelectionParam",
38651
+ options: { key: "filterVenueId" }
38652
+ }]
38287
38653
  } },
38288
- filterCategoryIds: { $bind: { from: "content.filterCategoryIds" } },
38289
- filterStaffMemberId: { $bind: { from: "content.filterStaffMemberId" } },
38290
- filterVenueId: { $bind: { from: "content.filterVenueId" } },
38291
38654
  cardRole: { $bind: {
38292
38655
  from: "content._cardStyles.role",
38293
38656
  fallback: "default"
@@ -38791,6 +39154,7 @@ const eventCalendarAdditionalFields = [
38791
39154
  }
38792
39155
  }
38793
39156
  },
39157
+ ...eventSelectionFields,
38794
39158
  {
38795
39159
  id: "eventSurface",
38796
39160
  type: "select",
@@ -39000,7 +39364,7 @@ const eventCalendarBlockDefinition = {
39000
39364
  titleSource: "heading",
39001
39365
  description: "Display events with calendar, list, or combined views with filtering",
39002
39366
  skipSectionStyles: true,
39003
- additionalFields: eventCalendarAdditionalFields,
39367
+ additionalFields: eventCalendarAdditionalFields.map(withEventSelectionVisibility),
39004
39368
  styleTokens: {
39005
39369
  background: "surface",
39006
39370
  typography: "body",
@@ -43378,6 +43742,15 @@ const newsletterFieldSchema = z.object({
43378
43742
  placeholder: z.string().optional()
43379
43743
  });
43380
43744
  const mailingListSignupBlockIdSchema = z.string().trim().min(1).transform(parseRequiredMailingListSignupBlockId);
43745
+ const mailingListContentVersionIdSchema = z.string().transform((value, ctx) => {
43746
+ const parsed = parseMailingListContentVersionId(value);
43747
+ if (parsed) return parsed;
43748
+ ctx.addIssue({
43749
+ code: z.ZodIssueCode.custom,
43750
+ message: "Invalid mailing-list content version ID"
43751
+ });
43752
+ return z.NEVER;
43753
+ });
43381
43754
  const signedMailingListSourceTokenSchema = z.string().trim().min(1).transform(parseRequiredMailingListSignedSourceToken);
43382
43755
  const newsletterSourceCommonSchema = z.object({
43383
43756
  siteId: z.string().optional(),
@@ -43391,7 +43764,8 @@ const newsletterSourceCommonSchema = z.object({
43391
43764
  const newsletterSourceSchema = z.discriminatedUnion("source", [
43392
43765
  newsletterSourceCommonSchema.extend({
43393
43766
  source: z.literal("block"),
43394
- blockId: z.string().nullable().optional()
43767
+ blockId: z.string().nullable().optional(),
43768
+ contentVersionId: z.string().nullable().optional()
43395
43769
  }),
43396
43770
  newsletterSourceCommonSchema.extend({
43397
43771
  source: z.literal("signed-footer"),
@@ -43407,6 +43781,7 @@ const newsletterDisplaySchema = z.object({
43407
43781
  availability: z.enum(["ready", "unavailable"]),
43408
43782
  className: z.string().nullable(),
43409
43783
  buttonLabel: z.string(),
43784
+ successMessage: z.string(),
43410
43785
  buttonVariant: newsletterButtonVariantSchema,
43411
43786
  privacyNote: z.string().nullable(),
43412
43787
  fields: z.array(newsletterFieldSchema),
@@ -43421,7 +43796,8 @@ const newsletterHydrationSchema = z.object({
43421
43796
  tag: z.literal("block-source"),
43422
43797
  sourceRef: z.object({
43423
43798
  tag: z.literal("block_ref"),
43424
- blockId: mailingListSignupBlockIdSchema
43799
+ blockId: mailingListSignupBlockIdSchema,
43800
+ contentVersionId: mailingListContentVersionIdSchema
43425
43801
  }).nullable()
43426
43802
  }),
43427
43803
  z.object({
@@ -43460,6 +43836,7 @@ function buildNewsletterDisplay(source) {
43460
43836
  fields: { preset: "emailOnly" },
43461
43837
  includeOptionalPhone: false,
43462
43838
  buttonLabel: "Subscribe",
43839
+ successMessage: DEFAULT_MAILING_LIST_SUCCESS_MESSAGE,
43463
43840
  privacyNote: null
43464
43841
  };
43465
43842
  const targeting = source.targeting ?? { mode: "default" };
@@ -43469,6 +43846,7 @@ function buildNewsletterDisplay(source) {
43469
43846
  availability: runtimeTargetingIsAvailable(context, targeting, choices) ? "ready" : "unavailable",
43470
43847
  className: source.className ?? null,
43471
43848
  buttonLabel: form.buttonLabel,
43849
+ successMessage: form.successMessage,
43472
43850
  buttonVariant: source.buttonVariant ?? "primary",
43473
43851
  privacyNote: form.privacyNote,
43474
43852
  fields: getGlobalFormFields(form),
@@ -43499,7 +43877,7 @@ const newsletterFormBlockRuntime = defineProgressiveBlockRuntime({
43499
43877
  function projectNewsletterFormHydrationTarget(source) {
43500
43878
  switch (source.source) {
43501
43879
  case "block": {
43502
- const sourceRef = buildMailingListSignupBlockSourceRef(source.blockId);
43880
+ const sourceRef = buildMailingListSignupBlockSourceRef(source.blockId, source.contentVersionId);
43503
43881
  if (sourceRef?.tag === "block_ref") return {
43504
43882
  tag: "block-source",
43505
43883
  sourceRef
@@ -45645,6 +46023,26 @@ const linksTransforms = [{
45645
46023
  }
45646
46024
  }];
45647
46025
  const defaultTransforms = createTransformRegistry([
46026
+ {
46027
+ id: "events.calendarSelectionParam",
46028
+ kind: "formatter",
46029
+ summary: "Resolve selected events instead of discovery filters",
46030
+ schema: z.object({ key: z.enum([
46031
+ "seriesIds",
46032
+ "eventSurface",
46033
+ "filterEventPresets",
46034
+ "scheduleScope",
46035
+ "filterCategoryIds",
46036
+ "filterStaffMemberId",
46037
+ "filterVenueId"
46038
+ ]) }),
46039
+ run(value, { key }) {
46040
+ const content = asPartialObject(value) ?? {};
46041
+ const selection = resolveEventSelection(content.eventSelection, content.selectedEventSeriesIds);
46042
+ if (selection.kind === "selected") return key === "seriesIds" ? selection.seriesIds : void 0;
46043
+ return key === "seriesIds" ? void 0 : content[key];
46044
+ }
46045
+ },
45648
46046
  {
45649
46047
  id: "events.calendarReadEnabled",
45650
46048
  kind: "formatter",
@@ -45959,12 +46357,12 @@ function normalizeContent(block) {
45959
46357
  }
45960
46358
  /**
45961
46359
  * Normalize params for API calls.
45962
- * Converts all values to strings.
46360
+ * Converts supplied values to strings, preserving absent versus explicitly empty params.
45963
46361
  */
45964
46362
  function normalizeParams(input) {
45965
46363
  if (!input || typeof input !== "object") return {};
45966
46364
  const output = {};
45967
- for (const [key, value] of Object.entries(input)) output[key] = coerceToString(value);
46365
+ for (const [key, value] of Object.entries(input)) if (value !== void 0 && value !== null) output[key] = coerceToString(value);
45968
46366
  return output;
45969
46367
  }
45970
46368
  function isNonArrayObject(value) {
@@ -46028,6 +46426,14 @@ function coercePayload(payload) {
46028
46426
  * - Frontend: provide internal API client
46029
46427
  * - SDK: provide SDK client with endpoint mapping
46030
46428
  */
46429
+ function projectDataLoaders(loaders, shouldLoad, blockId, blockKind) {
46430
+ if (!shouldLoad) return [...loaders];
46431
+ return loaders.filter(({ key }) => shouldLoad({
46432
+ blockId,
46433
+ blockKind,
46434
+ loaderKey: key
46435
+ }));
46436
+ }
46031
46437
  function shouldSkipResolvedLoader(input) {
46032
46438
  if (input.loader.requiredParams?.some((param) => !input.params[param]?.trim())) return true;
46033
46439
  return Boolean(input.isValidEndpoint && !input.isValidEndpoint(input.endpoint));
@@ -46053,8 +46459,12 @@ function shouldSkipResolvedLoader(input) {
46053
46459
  * ```
46054
46460
  */
46055
46461
  async function prefetchBlockData$1(page, context, options) {
46056
- const { apiClient, isValidEndpoint, onError, getCustomBlockLoaders, getBlockDefinition: getBlockDefinition$1 = getBlockDefinition, resolveParamsBindings: resolveParamsBindings$1 = resolveParamsBindings } = options;
46462
+ return (await prefetchBlockDataWithFailures(page, context, options)).resolvedData;
46463
+ }
46464
+ async function prefetchBlockDataWithFailures(page, context, options) {
46465
+ const { apiClient, isValidEndpoint, onError, getCustomBlockLoaders, getBlockDefinition: getBlockDefinition$1 = getBlockDefinition, resolveParamsBindings: resolveParamsBindings$1 = resolveParamsBindings, shouldLoad } = options;
46057
46466
  const results = {};
46467
+ const loaderFailures = {};
46058
46468
  const tasks = [];
46059
46469
  for (const block of page.blocks) {
46060
46470
  const blockId = block.id;
@@ -46069,6 +46479,7 @@ async function prefetchBlockData$1(page, context, options) {
46069
46479
  loader
46070
46480
  })) : [];
46071
46481
  } else loaders = [];
46482
+ loaders = projectDataLoaders(loaders, shouldLoad, blockId, block.kind);
46072
46483
  if (loaders.length === 0) continue;
46073
46484
  const root = {
46074
46485
  ...context.root ?? {},
@@ -46102,6 +46513,11 @@ async function prefetchBlockData$1(page, context, options) {
46102
46513
  const blockResults = results[blockId] ?? (results[blockId] = {});
46103
46514
  blockResults[key] = data;
46104
46515
  } catch (error) {
46516
+ const blockFailures = loaderFailures[blockId] ?? (loaderFailures[blockId] = {});
46517
+ blockFailures[key] = {
46518
+ endpoint,
46519
+ params
46520
+ };
46105
46521
  if (onError) onError(error, {
46106
46522
  block: block.kind,
46107
46523
  loader: key
@@ -46111,7 +46527,10 @@ async function prefetchBlockData$1(page, context, options) {
46111
46527
  }
46112
46528
  }
46113
46529
  if (tasks.length > 0) await Promise.all(tasks);
46114
- return results;
46530
+ return {
46531
+ resolvedData: results,
46532
+ loaderFailures
46533
+ };
46115
46534
  }
46116
46535
  //#endregion
46117
46536
  //#region ../blocks/src/system/data/loaderEndpoints.ts
@@ -46142,8 +46561,8 @@ function toStringParams(value) {
46142
46561
  for (const [k, v] of Object.entries(value)) if (typeof v === "string") out[k] = v;
46143
46562
  return out;
46144
46563
  }
46145
- function stripEmptyStringValues(params) {
46146
- for (const [key, value] of Object.entries(params)) if (value === "") delete params[key];
46564
+ function stripEmptyStringValues(params, endpoint) {
46565
+ for (const [key, value] of Object.entries(params)) if (value === "" && !(key === "seriesIds" && (endpoint === "listPublicEvents" || endpoint === "listPublicEventCalendarWindow"))) delete params[key];
46147
46566
  }
46148
46567
  function ensureSiteId(params, context) {
46149
46568
  if (!params.siteId && typeof context.siteId === "string" && context.siteId) params.siteId = context.siteId;
@@ -46156,7 +46575,7 @@ function ensureSiteId(params, context) {
46156
46575
  */
46157
46576
  function normalizeLoaderParams(endpoint, params, context) {
46158
46577
  const out = toStringParams(params);
46159
- stripEmptyStringValues(out);
46578
+ stripEmptyStringValues(out, endpoint);
46160
46579
  if (endpoint === "getPublicFormById") {
46161
46580
  ensureSiteId(out, context);
46162
46581
  if (!out.formId && out.formSlug) {
@@ -46405,7 +46824,12 @@ const API_ENDPOINTS = Object.freeze({
46405
46824
  path: "/public/sites/{siteId}/sitemap",
46406
46825
  method: "GET",
46407
46826
  revalidate: 60,
46408
- tags: ["riverbank:site:{siteId}:routable-content", "riverbank:site:{siteId}:settings"],
46827
+ tags: [
46828
+ "riverbank:site:{siteId}:routable-content",
46829
+ "riverbank:site:{siteId}:settings",
46830
+ "riverbank:site:{siteId}:public-events",
46831
+ "riverbank:site:{siteId}:public-booking-services"
46832
+ ],
46409
46833
  auth: "public",
46410
46834
  responseKind: "json"
46411
46835
  }
@@ -48893,7 +49317,17 @@ const riverbankSiteConfigInputSchema = z.object({
48893
49317
  z.object({
48894
49318
  config: riverbankSiteConfigInputSchema,
48895
49319
  forceContentTypes: z.boolean().optional(),
48896
- mode: z.enum(["apply", "preview"]).optional()
49320
+ mode: z.enum(["apply", "preview"]).optional(),
49321
+ expectedMailingListProviderScope: z.unknown().transform((value, ctx) => {
49322
+ if (value === void 0) return void 0;
49323
+ const parsed = parseMailingListProviderScope(value);
49324
+ if (parsed.ok) return parsed.value;
49325
+ ctx.addIssue({
49326
+ code: "custom",
49327
+ message: "Invalid mailing-list provider scope"
49328
+ });
49329
+ return z.NEVER;
49330
+ }).optional()
48897
49331
  }).strict();
48898
49332
  //#endregion
48899
49333
  //#region ../api/src/sdkThemeWire.ts
@@ -50073,9 +50507,11 @@ function convertPageResponseBlock(block) {
50073
50507
  if (typeof block.id !== "string" && block.id !== null) throw new Error(`Invalid block id in page: expected string or null, got ${typeof block.id}`);
50074
50508
  if (typeof block.kind !== "string") throw new Error(`Invalid block kind in page: expected string, got ${typeof block.kind}`);
50075
50509
  if (typeof block.purpose !== "string") throw new Error(`Invalid block purpose in page: expected string, got ${typeof block.purpose}`);
50510
+ 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}`);
50076
50511
  const admission = readInvalidBlockAdmission(block.admission);
50077
50512
  return {
50078
50513
  id: block.id,
50514
+ ...block.contentVersionId !== void 0 ? { contentVersionId: block.contentVersionId } : {},
50079
50515
  kind: block.kind,
50080
50516
  purpose: block.purpose,
50081
50517
  content: sanitizeSdkRuntimeBlockContent(block.kind, readContentRecord(block.content) ?? {}),
@@ -50108,6 +50544,7 @@ function projectRenderablePageOutline(page) {
50108
50544
  ...page,
50109
50545
  blocks: page.blocks.flatMap((block) => block.admission.kind === "renderable" ? [{
50110
50546
  id: block.id,
50547
+ ...block.contentVersionId !== void 0 ? { contentVersionId: block.contentVersionId } : {},
50111
50548
  kind: block.kind,
50112
50549
  purpose: block.purpose,
50113
50550
  content: block.admission.content,
@@ -50118,6 +50555,7 @@ function projectRenderablePageOutline(page) {
50118
50555
  function admitSdkRuntimePageBlock(block, customBlocks) {
50119
50556
  const base = {
50120
50557
  id: block.id,
50558
+ ...block.contentVersionId !== void 0 ? { contentVersionId: block.contentVersionId } : {},
50121
50559
  kind: block.kind,
50122
50560
  purpose: block.purpose,
50123
50561
  ...block.bindings ? { bindings: block.bindings } : {}
@@ -50754,6 +51192,7 @@ function readEntrySlotKey(block) {
50754
51192
  function admitEntrySlotBlock(block, customBlocks) {
50755
51193
  const base = {
50756
51194
  id: block.id ?? block.blockId ?? null,
51195
+ contentVersionId: block.contentVersionId,
50757
51196
  kind: block.kind,
50758
51197
  purpose: block.purpose,
50759
51198
  ...isRecord(block.bindings) ? { bindings: block.bindings } : {}