@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
@@ -36,10 +36,12 @@ const unsafeAsStorageBucketName = (value) => value;
36
36
  const unsafeAsStoragePath = (value) => value;
37
37
  const unsafeAsPositiveByteCount = (value) => value;
38
38
  const unsafeAsUserId = (id) => id;
39
+ const unsafeAsContentVersionId = (id) => id;
39
40
  const parseSiteId = (value) => parseUuidBrand$1(value, unsafeAsSiteId);
40
41
  const parseApiKeyId = (value) => parseUuidBrand$1(value, unsafeAsApiKeyId);
41
42
  const parseEventOfferingId = (value) => parseUuidBrand$1(value, unsafeAsEventOfferingId);
42
43
  const parseUserId = (value) => parseUuidBrand$1(value, unsafeAsUserId);
44
+ const parseContentVersionId = (value) => parseUuidBrand$1(value, unsafeAsContentVersionId);
43
45
  const parseEventSeriesId = (value) => parseUuidBrand$1(value, unsafeAsEventSeriesId);
44
46
  //#endregion
45
47
  //#region ../core/src/assert-never.ts
@@ -312,7 +314,7 @@ function parseEventPageSurfaceDestinationMode(value) {
312
314
  return value === "cms-managed" || value === "system-managed" ? value : void 0;
313
315
  }
314
316
  function parseEventPageSurfaceSubject(value) {
315
- if (!isRecord$39(value)) return err$3({ kind: "notObject" });
317
+ if (!isRecord$40(value)) return err$3({ kind: "notObject" });
316
318
  switch (value.kind) {
317
319
  case "eventSeries": {
318
320
  const eventSeriesId = parseEventSeriesId(value.eventSeriesId);
@@ -367,7 +369,7 @@ function parseEventSeriesIdList(values) {
367
369
  }
368
370
  return ok$3(parsed);
369
371
  }
370
- function isRecord$39(value) {
372
+ function isRecord$40(value) {
371
373
  return typeof value === "object" && value !== null && !Array.isArray(value);
372
374
  }
373
375
  //#endregion
@@ -611,7 +613,7 @@ function toLocationCoordinates(value) {
611
613
  }
612
614
  //#endregion
613
615
  //#region ../core/src/rich-text.ts
614
- function isRecord$37(value) {
616
+ function isRecord$38(value) {
615
617
  return typeof value === "object" && value !== null && !Array.isArray(value);
616
618
  }
617
619
  function hasOnlyKeys(value, allowed) {
@@ -630,10 +632,10 @@ function isDenseArrayOf(value, predicate) {
630
632
  return true;
631
633
  }
632
634
  function isTipTapMark(value) {
633
- return isRecord$37(value) && hasOnlyKeys(value, markKeys) && typeof value.type === "string" && value.type.length > 0 && (value.attrs === void 0 || isRecord$37(value.attrs));
635
+ return isRecord$38(value) && hasOnlyKeys(value, markKeys) && typeof value.type === "string" && value.type.length > 0 && (value.attrs === void 0 || isRecord$38(value.attrs));
634
636
  }
635
637
  function isTipTapNode(value) {
636
- if (!isRecord$37(value) || !hasOnlyKeys(value, nodeKeys) || typeof value.type !== "string" || value.type.length === 0 || value.type === "doc" || value.attrs !== void 0 && !isRecord$37(value.attrs) || value.marks !== void 0 && (!Array.isArray(value.marks) || !isDenseArrayOf(value.marks, isTipTapMark)) || value.content !== void 0 && (!Array.isArray(value.content) || !isDenseArrayOf(value.content, isTipTapNode))) return false;
638
+ if (!isRecord$38(value) || !hasOnlyKeys(value, nodeKeys) || typeof value.type !== "string" || value.type.length === 0 || value.type === "doc" || value.attrs !== void 0 && !isRecord$38(value.attrs) || value.marks !== void 0 && (!Array.isArray(value.marks) || !isDenseArrayOf(value.marks, isTipTapMark)) || value.content !== void 0 && (!Array.isArray(value.content) || !isDenseArrayOf(value.content, isTipTapNode))) return false;
637
639
  if (value.type === "text") return typeof value.text === "string" && value.text.length > 0 && value.content === void 0;
638
640
  return value.text === void 0;
639
641
  }
@@ -652,22 +654,28 @@ function parsePositiveInteger(value) {
652
654
  function parseNewsletterListId(value) {
653
655
  return parseTrimmedMatchingString(value, UUID_PATTERN$2);
654
656
  }
657
+ function parseMailchimpAccountId(value) {
658
+ return parseTrimmedMatchingString(value, OPAQUE_ID_PATTERN);
659
+ }
655
660
  function parseMailchimpAudienceId$1(value) {
656
661
  return parseTrimmedMatchingString(value, OPAQUE_ID_PATTERN);
657
662
  }
658
663
  function parseMailchimpInterestId(value) {
659
664
  return parseTrimmedMatchingString(value, OPAQUE_ID_PATTERN);
660
665
  }
666
+ function parseBrevoAccountId(value) {
667
+ return parseTrimmedMatchingString(value, OPAQUE_ID_PATTERN);
668
+ }
661
669
  function parseBrevoListId(value) {
662
670
  return parsePositiveInteger(value);
663
671
  }
664
672
  //#endregion
665
673
  //#region ../core/src/mailing-list-targeting-parser.ts
666
674
  function parseMailingListPlacementTargeting(value) {
667
- if (!isRecord$36(value)) return targetingError("shape");
675
+ if (!isRecord$37(value)) return targetingError("shape");
668
676
  if (value.mode === "default") return ok$3({ mode: "default" });
669
677
  if (value.mode !== "custom") return targetingError("mode");
670
- if (!isRecord$36(value.selection)) return targetingError("selection");
678
+ if (!isRecord$37(value.selection)) return targetingError("selection");
671
679
  switch (value.provider) {
672
680
  case "native": return parseNativeTargeting(value.selection);
673
681
  case "brevo": return parseBrevoTargeting(value.selection);
@@ -771,7 +779,7 @@ function parseUniqueIds(value, parseId) {
771
779
  }
772
780
  return ok$3(parsed);
773
781
  }
774
- function isRecord$36(value) {
782
+ function isRecord$37(value) {
775
783
  return typeof value === "object" && value !== null && !Array.isArray(value);
776
784
  }
777
785
  function targetingError(field) {
@@ -793,6 +801,31 @@ new Map([
793
801
  "legal"
794
802
  ].map((kind, index) => [kind, index]));
795
803
  //#endregion
804
+ //#region ../core/src/mailing-list-setup.ts
805
+ function isRecord$34(value) {
806
+ return typeof value === "object" && value !== null && !Array.isArray(value);
807
+ }
808
+ const DEFAULT_MAILING_LIST_SUCCESS_MESSAGE = "Thanks — you're on the list.";
809
+ function parseMailingListProviderScope(value) {
810
+ if (!isRecord$34(value)) return err$3("invalid_mailing_list_provider_scope");
811
+ if (value.provider === "native") return ok$3({ provider: "native" });
812
+ if (value.provider === "brevo") {
813
+ const accountId = parseBrevoAccountId(value.accountId);
814
+ return accountId !== null ? ok$3({
815
+ provider: "brevo",
816
+ accountId
817
+ }) : err$3("invalid_mailing_list_provider_scope");
818
+ }
819
+ if (value.provider === "mailchimp") {
820
+ const accountId = parseMailchimpAccountId(value.accountId);
821
+ return accountId !== null ? ok$3({
822
+ provider: "mailchimp",
823
+ accountId
824
+ }) : err$3("invalid_mailing_list_provider_scope");
825
+ }
826
+ return err$3("invalid_mailing_list_provider_scope");
827
+ }
828
+ //#endregion
796
829
  //#region ../core/src/mailing-list-setup-parser.ts
797
830
  function parseMailingListGlobalForm(value) {
798
831
  if (!isRecord$33(value)) return formError("shape");
@@ -801,12 +834,15 @@ function parseMailingListGlobalForm(value) {
801
834
  if (typeof value.includeOptionalPhone !== "boolean") return formError("includeOptionalPhone");
802
835
  const buttonLabel = parseRequiredString(value.buttonLabel);
803
836
  if (buttonLabel === null) return formError("buttonLabel");
837
+ const successMessage = parseRequiredString(value.successMessage);
838
+ if (successMessage === null) return formError("successMessage");
804
839
  const privacyNote = parseOptionalString(value.privacyNote);
805
840
  if (privacyNote === void 0) return formError("privacyNote");
806
841
  return ok$3({
807
842
  fields,
808
843
  includeOptionalPhone: value.includeOptionalPhone,
809
844
  buttonLabel,
845
+ successMessage,
810
846
  privacyNote
811
847
  });
812
848
  }
@@ -1013,11 +1049,17 @@ function parseMailingListSignedSourceToken(value) {
1013
1049
  const parsed = typeof value === "string" ? value.trim() : "";
1014
1050
  return /^[A-Za-z0-9._~-]{16,1000}$/u.test(parsed) ? parsed : null;
1015
1051
  }
1016
- function buildMailingListSignupBlockSourceRef(blockId) {
1017
- const parsed = parseMailingListBlockId(blockId);
1018
- return parsed !== null ? {
1052
+ function parseMailingListContentVersionId(value) {
1053
+ const parsed = parseContentVersionId(value);
1054
+ return parsed.ok ? parsed.value : null;
1055
+ }
1056
+ function buildMailingListSignupBlockSourceRef(blockId, contentVersionId) {
1057
+ const parsedBlockId = parseMailingListBlockId(blockId);
1058
+ const parsedContentVersionId = parseMailingListContentVersionId(contentVersionId);
1059
+ return parsedBlockId !== null && parsedContentVersionId !== null ? {
1019
1060
  tag: "block_ref",
1020
- blockId: parsed
1061
+ blockId: parsedBlockId,
1062
+ contentVersionId: parsedContentVersionId
1021
1063
  } : null;
1022
1064
  }
1023
1065
  function sortStableJsonValue(value) {
@@ -2419,6 +2461,7 @@ function isDisplayMediaKind$2(kind) {
2419
2461
  }
2420
2462
  const siteOptionSources = [
2421
2463
  "eventCategories",
2464
+ "eventSeries",
2422
2465
  "venues",
2423
2466
  "staffMembers"
2424
2467
  ];
@@ -4309,29 +4352,6 @@ function contrastRatio(hex1, hex2) {
4309
4352
  return (hi + .05) / (lo + .05);
4310
4353
  }
4311
4354
  //#endregion
4312
- //#region ../theme-core/src/palette/utils/onColor.ts
4313
- const BACKGROUND_ROLE_NAMES = /* @__PURE__ */ new Set([
4314
- "primary",
4315
- "secondary",
4316
- "accent",
4317
- "success",
4318
- "warning",
4319
- "destructive",
4320
- "info",
4321
- "background",
4322
- "surface",
4323
- "surfaceAlt",
4324
- "muted",
4325
- "neutral"
4326
- ]);
4327
- function onColorTokenName(backgroundToken) {
4328
- return `on${backgroundToken.split("-").filter((part) => part.length > 0).map((part) => part.charAt(0).toUpperCase() + part.slice(1)).join("")}`;
4329
- }
4330
- function isOnColorBackgroundCandidateToken(token) {
4331
- const role = token.match(/^(.*?)(?:-\d{2,3})?$/)?.[1] ?? token;
4332
- return BACKGROUND_ROLE_NAMES.has(role);
4333
- }
4334
- //#endregion
4335
4355
  //#region ../theme-core/src/tokens/colorTokenParts.ts
4336
4356
  function parseOpacityPercent(source) {
4337
4357
  const trimmed = source.trim();
@@ -4369,6 +4389,141 @@ function parseColorTokenParts(source) {
4369
4389
  opacityPercent
4370
4390
  };
4371
4391
  }
4392
+ const defaultThemeTokens = {
4393
+ color: {
4394
+ "background/base": "#ffffff",
4395
+ "background/elevated": "#f5f5f5",
4396
+ "surface/base": "#ffffff",
4397
+ "surface/subtle": "#f9f9fb",
4398
+ "surface/inverted": "#111111",
4399
+ "content/primary": "#111111",
4400
+ "content/secondary": "#3f3f46",
4401
+ "accent/primary": "#2563eb",
4402
+ "accent/secondary": "#1d4ed8",
4403
+ "border/base": "#e5e7eb"
4404
+ },
4405
+ typography: {
4406
+ "display/hero": {
4407
+ fontSize: "clamp(48px, 8vw, 96px)",
4408
+ lineHeight: "1.05",
4409
+ fontWeight: "700"
4410
+ },
4411
+ "display/section": {
4412
+ fontSize: "clamp(40px, 6vw, 72px)",
4413
+ lineHeight: "1.1",
4414
+ fontWeight: "700"
4415
+ },
4416
+ "heading/large": {
4417
+ fontSize: "clamp(32px, 4vw, 48px)",
4418
+ lineHeight: "1.2",
4419
+ fontWeight: "600"
4420
+ },
4421
+ "heading/medium": {
4422
+ fontSize: "clamp(24px, 3vw, 32px)",
4423
+ lineHeight: "1.25",
4424
+ fontWeight: "600"
4425
+ },
4426
+ "heading/small": {
4427
+ fontSize: "20px",
4428
+ lineHeight: "1.3",
4429
+ fontWeight: "600"
4430
+ },
4431
+ "body/normal": {
4432
+ fontSize: "16px",
4433
+ lineHeight: "1.6",
4434
+ fontWeight: "400"
4435
+ },
4436
+ "body/small": {
4437
+ fontSize: "14px",
4438
+ lineHeight: "1.5",
4439
+ fontWeight: "400"
4440
+ },
4441
+ caption: {
4442
+ fontSize: "12px",
4443
+ lineHeight: "1.4",
4444
+ fontWeight: "500"
4445
+ }
4446
+ },
4447
+ spacing: {
4448
+ none: "0px",
4449
+ "3xs": "4px",
4450
+ "2xs": "8px",
4451
+ xs: "12px",
4452
+ sm: "16px",
4453
+ md: "24px",
4454
+ lg: "32px",
4455
+ xl: "40px",
4456
+ "2xl": "56px",
4457
+ "3xl": "72px"
4458
+ },
4459
+ radius: {
4460
+ none: "0px",
4461
+ xs: "2px",
4462
+ sm: "4px",
4463
+ md: "8px",
4464
+ lg: "12px",
4465
+ pill: "999px",
4466
+ full: "9999px"
4467
+ },
4468
+ shadow: {
4469
+ none: "none",
4470
+ soft: "0px 2px 8px rgba(15, 23, 42, 0.08)",
4471
+ medium: "0px 6px 18px rgba(15, 23, 42, 0.12)",
4472
+ strong: "0px 12px 36px rgba(15, 23, 42, 0.16)"
4473
+ },
4474
+ palette: {
4475
+ surface: "#ffffff",
4476
+ "neutral-50": "#f9fafb",
4477
+ "neutral-900": "#111827",
4478
+ primary: "#2563eb",
4479
+ "primary-50": "#eff6ff",
4480
+ "primary-500": "#2563eb",
4481
+ "primary-900": "#1d4ed8",
4482
+ secondary: "#9333ea",
4483
+ "secondary-50": "#f3e8ff",
4484
+ "secondary-500": "#9333ea",
4485
+ "secondary-900": "#4c1d95",
4486
+ accent: "#f97316",
4487
+ "accent-50": "#fff7ed",
4488
+ "accent-500": "#f97316",
4489
+ "accent-900": "#7c2d12"
4490
+ }
4491
+ };
4492
+ /**
4493
+ * Project the expanded semantic palette into the token buckets consumed by
4494
+ * runtime transforms. Keep this mapping shared by full themes and the
4495
+ * tokens-only hosted-booking runtime so the two paths cannot drift.
4496
+ */
4497
+ function buildThemeTokens(palette) {
4498
+ const tokens = cloneThemeTokens(defaultThemeTokens);
4499
+ const paletteStrings = {};
4500
+ for (const [key, value] of Object.entries(palette)) if (typeof value === "string" && value.trim().length > 0) paletteStrings[key] = value;
4501
+ tokens.palette = paletteStrings;
4502
+ const resolveColor = (...keys) => {
4503
+ for (const key of keys) {
4504
+ const value = paletteStrings[key];
4505
+ if (value) return value;
4506
+ }
4507
+ };
4508
+ const assignColor = (token, ...keys) => {
4509
+ const value = resolveColor(...keys);
4510
+ if (value) tokens.color[token] = value;
4511
+ };
4512
+ assignColor("background/base", "background", "surface", "primary-50");
4513
+ assignColor("background/elevated", "surface", "background");
4514
+ assignColor("surface/base", "surface", "background");
4515
+ assignColor("surface/subtle", "neutral-100", "surface", "background");
4516
+ assignColor("surface/inverted", "neutral-900", "text", "primary-900");
4517
+ assignColor("content/primary", "text", "body", "neutral-900");
4518
+ assignColor("content/secondary", "mutedText", "secondary", "neutral-600");
4519
+ assignColor("accent/primary", "primary", "accent");
4520
+ assignColor("accent/secondary", "accent", "secondary", "primary-400");
4521
+ assignColor("border/base", "border", "neutral-300");
4522
+ return tokens;
4523
+ }
4524
+ function cloneThemeTokens(source) {
4525
+ return JSON.parse(JSON.stringify(source));
4526
+ }
4372
4527
  //#endregion
4373
4528
  //#region ../theme-core/src/tokens/blockColorTokens.ts
4374
4529
  const blockColorTokenNames = [
@@ -4479,6 +4634,101 @@ function parseThemeColorToken(value) {
4479
4634
  }
4480
4635
  const themeColorTokenSchema = z$1.string().min(1).refine((value) => Boolean(isThemeColorToken(value)), "Expected a known Theme V2 color token");
4481
4636
  //#endregion
4637
+ //#region ../theme-core/src/tokens/resolver.ts
4638
+ /**
4639
+ * Resolves theme tokens to CSS variables
4640
+ *
4641
+ * This resolver ensures all button styles use theme tokens (not hardcoded colors)
4642
+ * so that changing the palette automatically updates all buttons.
4643
+ */
4644
+ var TokenResolver = class {
4645
+ constructor(theme) {
4646
+ this.theme = theme;
4647
+ }
4648
+ /**
4649
+ * Resolve a color token to a CSS variable reference wrapped in rgb()
4650
+ *
4651
+ * @param token - Token name (e.g., 'primary-500', 'white', 'text-900')
4652
+ * @returns CSS rgb() function with var reference (e.g., 'rgb(var(--tb-primary-500))')
4653
+ *
4654
+ * Note: CSS variables are stored as RGB channels (e.g., "37 99 235") following Tailwind convention,
4655
+ * so we must wrap them with rgb() to create a valid color value.
4656
+ *
4657
+ * @example
4658
+ * resolver.getColor('primary-500') // => 'rgb(var(--tb-primary-500))'
4659
+ * resolver.getColor('white') // => 'rgb(var(--tb-white))'
4660
+ */
4661
+ getColor(token) {
4662
+ if (!this.tokenExists(token)) console.warn(`[TokenResolver] Color token "${token}" not found in theme palette. Button may render incorrectly.`);
4663
+ return rgbColorValue(token);
4664
+ }
4665
+ /**
4666
+ * Adjust a color token's shade by a given amount
4667
+ *
4668
+ * @param token - Base token (e.g., 'primary-500')
4669
+ * @param amount - Shade adjustment (+100 = darker, -100 = lighter)
4670
+ * @returns Adjusted token name (e.g., 'primary-600')
4671
+ *
4672
+ * @example
4673
+ * resolver.adjustShade('primary-500', 100) // => 'primary-600' (darker)
4674
+ * resolver.adjustShade('primary-500', -100) // => 'primary-400' (lighter)
4675
+ */
4676
+ adjustShade(token, amount) {
4677
+ const parts = token.split("-");
4678
+ if (parts.length < 2) return `${token}-${Math.max(100, Math.min(900, 500 + amount))}`;
4679
+ const base = parts.slice(0, -1).join("-");
4680
+ const shade = parseInt(parts[parts.length - 1] ?? "", 10);
4681
+ if (isNaN(shade)) {
4682
+ console.warn(`[TokenResolver] Cannot adjust shade for non-shade token "${token}". Returning original token.`);
4683
+ return token;
4684
+ }
4685
+ return `${base}-${Math.max(100, Math.min(900, shade + amount))}`;
4686
+ }
4687
+ /**
4688
+ * Check if a token exists in the theme palette
4689
+ *
4690
+ * @param token - Token name to check
4691
+ * @returns True if token exists in theme
4692
+ */
4693
+ tokenExists(token) {
4694
+ if ([
4695
+ "white",
4696
+ "black",
4697
+ "transparent"
4698
+ ].includes(token)) return true;
4699
+ const parts = token.split("-");
4700
+ if (parts.length >= 2) {
4701
+ const lastPart = parts[parts.length - 1] ?? "";
4702
+ const shade = parseInt(lastPart, 10);
4703
+ if (!isNaN(shade) && shade >= 100 && shade <= 900 && shade % 100 === 0) return true;
4704
+ }
4705
+ return true;
4706
+ }
4707
+ };
4708
+ //#endregion
4709
+ //#region ../theme-core/src/palette/utils/onColor.ts
4710
+ const BACKGROUND_ROLE_NAMES = /* @__PURE__ */ new Set([
4711
+ "primary",
4712
+ "secondary",
4713
+ "accent",
4714
+ "success",
4715
+ "warning",
4716
+ "destructive",
4717
+ "info",
4718
+ "background",
4719
+ "surface",
4720
+ "surfaceAlt",
4721
+ "muted",
4722
+ "neutral"
4723
+ ]);
4724
+ function onColorTokenName(backgroundToken) {
4725
+ return `on${backgroundToken.split("-").filter((part) => part.length > 0).map((part) => part.charAt(0).toUpperCase() + part.slice(1)).join("")}`;
4726
+ }
4727
+ function isOnColorBackgroundCandidateToken(token) {
4728
+ const role = token.match(/^(.*?)(?:-\d{2,3})?$/)?.[1] ?? token;
4729
+ return BACKGROUND_ROLE_NAMES.has(role);
4730
+ }
4731
+ //#endregion
4482
4732
  //#region ../theme-core/src/palette/colors.ts
4483
4733
  const HEX_COLOR_REGEX = /^#[0-9a-f]{6}$/;
4484
4734
  const NORMALIZABLE_HEX_REGEX = /^#(?:[0-9a-f]{3}|[0-9a-f]{6})$/i;
@@ -6152,213 +6402,6 @@ function assertUniqueLayoutProfileKeys(profiles) {
6152
6402
  });
6153
6403
  if (duplicates.length > 0) throw new Error(`Duplicate block layout design profiles: ${duplicates.join(", ")}`);
6154
6404
  }
6155
- const defaultThemeTokens = {
6156
- color: {
6157
- "background/base": "#ffffff",
6158
- "background/elevated": "#f5f5f5",
6159
- "surface/base": "#ffffff",
6160
- "surface/subtle": "#f9f9fb",
6161
- "surface/inverted": "#111111",
6162
- "content/primary": "#111111",
6163
- "content/secondary": "#3f3f46",
6164
- "accent/primary": "#2563eb",
6165
- "accent/secondary": "#1d4ed8",
6166
- "border/base": "#e5e7eb"
6167
- },
6168
- typography: {
6169
- "display/hero": {
6170
- fontSize: "clamp(48px, 8vw, 96px)",
6171
- lineHeight: "1.05",
6172
- fontWeight: "700"
6173
- },
6174
- "display/section": {
6175
- fontSize: "clamp(40px, 6vw, 72px)",
6176
- lineHeight: "1.1",
6177
- fontWeight: "700"
6178
- },
6179
- "heading/large": {
6180
- fontSize: "clamp(32px, 4vw, 48px)",
6181
- lineHeight: "1.2",
6182
- fontWeight: "600"
6183
- },
6184
- "heading/medium": {
6185
- fontSize: "clamp(24px, 3vw, 32px)",
6186
- lineHeight: "1.25",
6187
- fontWeight: "600"
6188
- },
6189
- "heading/small": {
6190
- fontSize: "20px",
6191
- lineHeight: "1.3",
6192
- fontWeight: "600"
6193
- },
6194
- "body/normal": {
6195
- fontSize: "16px",
6196
- lineHeight: "1.6",
6197
- fontWeight: "400"
6198
- },
6199
- "body/small": {
6200
- fontSize: "14px",
6201
- lineHeight: "1.5",
6202
- fontWeight: "400"
6203
- },
6204
- caption: {
6205
- fontSize: "12px",
6206
- lineHeight: "1.4",
6207
- fontWeight: "500"
6208
- }
6209
- },
6210
- spacing: {
6211
- none: "0px",
6212
- "3xs": "4px",
6213
- "2xs": "8px",
6214
- xs: "12px",
6215
- sm: "16px",
6216
- md: "24px",
6217
- lg: "32px",
6218
- xl: "40px",
6219
- "2xl": "56px",
6220
- "3xl": "72px"
6221
- },
6222
- radius: {
6223
- none: "0px",
6224
- xs: "2px",
6225
- sm: "4px",
6226
- md: "8px",
6227
- lg: "12px",
6228
- pill: "999px",
6229
- full: "9999px"
6230
- },
6231
- shadow: {
6232
- none: "none",
6233
- soft: "0px 2px 8px rgba(15, 23, 42, 0.08)",
6234
- medium: "0px 6px 18px rgba(15, 23, 42, 0.12)",
6235
- strong: "0px 12px 36px rgba(15, 23, 42, 0.16)"
6236
- },
6237
- palette: {
6238
- surface: "#ffffff",
6239
- "neutral-50": "#f9fafb",
6240
- "neutral-900": "#111827",
6241
- primary: "#2563eb",
6242
- "primary-50": "#eff6ff",
6243
- "primary-500": "#2563eb",
6244
- "primary-900": "#1d4ed8",
6245
- secondary: "#9333ea",
6246
- "secondary-50": "#f3e8ff",
6247
- "secondary-500": "#9333ea",
6248
- "secondary-900": "#4c1d95",
6249
- accent: "#f97316",
6250
- "accent-50": "#fff7ed",
6251
- "accent-500": "#f97316",
6252
- "accent-900": "#7c2d12"
6253
- }
6254
- };
6255
- /**
6256
- * Project the expanded semantic palette into the token buckets consumed by
6257
- * runtime transforms. Keep this mapping shared by full themes and the
6258
- * tokens-only hosted-booking runtime so the two paths cannot drift.
6259
- */
6260
- function buildThemeTokens(palette) {
6261
- const tokens = cloneThemeTokens(defaultThemeTokens);
6262
- const paletteStrings = {};
6263
- for (const [key, value] of Object.entries(palette)) if (typeof value === "string" && value.trim().length > 0) paletteStrings[key] = value;
6264
- tokens.palette = paletteStrings;
6265
- const resolveColor = (...keys) => {
6266
- for (const key of keys) {
6267
- const value = paletteStrings[key];
6268
- if (value) return value;
6269
- }
6270
- };
6271
- const assignColor = (token, ...keys) => {
6272
- const value = resolveColor(...keys);
6273
- if (value) tokens.color[token] = value;
6274
- };
6275
- assignColor("background/base", "background", "surface", "primary-50");
6276
- assignColor("background/elevated", "surface", "background");
6277
- assignColor("surface/base", "surface", "background");
6278
- assignColor("surface/subtle", "neutral-100", "surface", "background");
6279
- assignColor("surface/inverted", "neutral-900", "text", "primary-900");
6280
- assignColor("content/primary", "text", "body", "neutral-900");
6281
- assignColor("content/secondary", "mutedText", "secondary", "neutral-600");
6282
- assignColor("accent/primary", "primary", "accent");
6283
- assignColor("accent/secondary", "accent", "secondary", "primary-400");
6284
- assignColor("border/base", "border", "neutral-300");
6285
- return tokens;
6286
- }
6287
- function cloneThemeTokens(source) {
6288
- return JSON.parse(JSON.stringify(source));
6289
- }
6290
- //#endregion
6291
- //#region ../theme-core/src/tokens/resolver.ts
6292
- /**
6293
- * Resolves theme tokens to CSS variables
6294
- *
6295
- * This resolver ensures all button styles use theme tokens (not hardcoded colors)
6296
- * so that changing the palette automatically updates all buttons.
6297
- */
6298
- var TokenResolver = class {
6299
- constructor(theme) {
6300
- this.theme = theme;
6301
- }
6302
- /**
6303
- * Resolve a color token to a CSS variable reference wrapped in rgb()
6304
- *
6305
- * @param token - Token name (e.g., 'primary-500', 'white', 'text-900')
6306
- * @returns CSS rgb() function with var reference (e.g., 'rgb(var(--tb-primary-500))')
6307
- *
6308
- * Note: CSS variables are stored as RGB channels (e.g., "37 99 235") following Tailwind convention,
6309
- * so we must wrap them with rgb() to create a valid color value.
6310
- *
6311
- * @example
6312
- * resolver.getColor('primary-500') // => 'rgb(var(--tb-primary-500))'
6313
- * resolver.getColor('white') // => 'rgb(var(--tb-white))'
6314
- */
6315
- getColor(token) {
6316
- if (!this.tokenExists(token)) console.warn(`[TokenResolver] Color token "${token}" not found in theme palette. Button may render incorrectly.`);
6317
- return `rgb(var(--tb-${token}))`;
6318
- }
6319
- /**
6320
- * Adjust a color token's shade by a given amount
6321
- *
6322
- * @param token - Base token (e.g., 'primary-500')
6323
- * @param amount - Shade adjustment (+100 = darker, -100 = lighter)
6324
- * @returns Adjusted token name (e.g., 'primary-600')
6325
- *
6326
- * @example
6327
- * resolver.adjustShade('primary-500', 100) // => 'primary-600' (darker)
6328
- * resolver.adjustShade('primary-500', -100) // => 'primary-400' (lighter)
6329
- */
6330
- adjustShade(token, amount) {
6331
- const parts = token.split("-");
6332
- if (parts.length < 2) return `${token}-${Math.max(100, Math.min(900, 500 + amount))}`;
6333
- const base = parts.slice(0, -1).join("-");
6334
- const shade = parseInt(parts[parts.length - 1] ?? "", 10);
6335
- if (isNaN(shade)) {
6336
- console.warn(`[TokenResolver] Cannot adjust shade for non-shade token "${token}". Returning original token.`);
6337
- return token;
6338
- }
6339
- return `${base}-${Math.max(100, Math.min(900, shade + amount))}`;
6340
- }
6341
- /**
6342
- * Check if a token exists in the theme palette
6343
- *
6344
- * @param token - Token name to check
6345
- * @returns True if token exists in theme
6346
- */
6347
- tokenExists(token) {
6348
- if ([
6349
- "white",
6350
- "black",
6351
- "transparent"
6352
- ].includes(token)) return true;
6353
- const parts = token.split("-");
6354
- if (parts.length >= 2) {
6355
- const lastPart = parts[parts.length - 1] ?? "";
6356
- const shade = parseInt(lastPart, 10);
6357
- if (!isNaN(shade) && shade >= 100 && shade <= 900 && shade % 100 === 0) return true;
6358
- }
6359
- return true;
6360
- }
6361
- };
6362
6405
  //#endregion
6363
6406
  //#region ../theme-core/src/site-styles/backgroundAppearance.ts
6364
6407
  const backgroundAppearanceQuickColorTokenNames = [
@@ -7144,14 +7187,12 @@ function generateVariantCSS(variant, themeId, cardClasses, tokens, theme) {
7144
7187
  const shadowValue = generateShadowValue$1(shadow);
7145
7188
  rules.push(`box-shadow: ${shadowValue}`);
7146
7189
  }
7147
- rules.push(`display: flex`);
7148
- rules.push(`flex-direction: column`);
7149
- rules.push(`position: relative`);
7150
- rules.push(`overflow: visible`);
7190
+ const structureSelector = cardClasses.map((cardClass) => `:where([data-theme-scope="${themeId}"]) :where(.${cardClass})`).join(",\n");
7151
7191
  const mediaRadius = MEDIA_CORNER_MAP[corners];
7152
7192
  const mediaRules = [`border-top-left-radius: ${mediaRadius}`, `border-top-right-radius: ${mediaRadius}`];
7153
7193
  const contentRules = [`padding: ${resolveContentPadding(variant)}`];
7154
7194
  return [
7195
+ `${structureSelector} {\n display: flex;\n flex-direction: column;\n position: relative;\n overflow: visible;\n}`,
7155
7196
  `${containerSelector} {\n ${rules.join(";\n ")};\n}`,
7156
7197
  ...cardDecorationPseudoRules(containerSelectors, variant.decorations, resolveColor),
7157
7198
  `${fallbackBackgroundSelector} {\n background: transparent;\n}`,
@@ -11980,8 +12021,14 @@ const headerInteractionPillPaletteValues = [
11980
12021
  "accent"
11981
12022
  ];
11982
12023
  /**
11983
- * "No pill": the nav link keeps whatever hover treatment its recipe compiled,
11984
- * and the palette step writes nothing at all (#1318 Phase 4c decision 2).
12024
+ * "No pill": a colour change on hover rather than a filled background.
12025
+ *
12026
+ * The palette step writes nothing (#1318 Phase 4c decision 2), but on a
12027
+ * foreground-adaptive style that is not the end of the story: the hover colour
12028
+ * is derived from the resolved opening foreground at render time, paired with
12029
+ * the resting colour, so `quiet` resolves to a definite colour rather than to
12030
+ * whatever brand token the recipe happened to name. See
12031
+ * `applyOpeningForeground`.
11985
12032
  *
11986
12033
  * It exists because "a colour change on hover, no filled background" was not
11987
12034
  * expressible in the vocabulary, and it is what
@@ -13176,7 +13223,7 @@ const BUTTON_CONTRAST_POLICY = {
13176
13223
  nonTextMinimumRatio: 3,
13177
13224
  gradientSamplesPerSegment: 20,
13178
13225
  alphaBackgrounds: "reject-without-known-surface",
13179
- disabled: "retain-full-colour-contract"
13226
+ disabled: "validated-colour-pair-with-muted-control-opacity"
13180
13227
  };
13181
13228
  function formatButtonColourContractError(error) {
13182
13229
  switch (error.tag) {
@@ -13764,6 +13811,25 @@ function parseThemeForPersistence(value) {
13764
13811
  };
13765
13812
  }
13766
13813
  //#endregion
13814
+ //#region ../theme-core/src/buttons/affordanceSuppression.ts
13815
+ /**
13816
+ * Internal: the opt-out the generated affordance rule is written against.
13817
+ *
13818
+ * A button style may declare a trailing `affordance`, which the theme renders as
13819
+ * a CSS `::after` on every button of that variant. An authored button that
13820
+ * renders its own trailing icon must not also receive the theme's, or it shows
13821
+ * two.
13822
+ *
13823
+ * Deliberately not exported from `./index`. This used to be public, and two
13824
+ * block components reached past the theme to draw arrows of their own — one of
13825
+ * them doubling up on the styles that declare an affordance, both of them
13826
+ * overriding the twelve styles that deliberately declare none. Whether a button
13827
+ * carries a trailing affordance is the style's decision; the only caller that
13828
+ * legitimately opts out is the authored-button renderer, which reaches it
13829
+ * through `themeButtonClassNameWithTrailingIcon`.
13830
+ */
13831
+ const AFFORDANCE_SUPPRESS_CLASS = "rb-affordance-off";
13832
+ //#endregion
13767
13833
  //#region ../theme-core/src/buttons/classNames.ts
13768
13834
  /**
13769
13835
  * Parse content/runtime variant identifiers into the closed theme-button class
@@ -13796,6 +13862,27 @@ function themeButtonClassName(spec) {
13796
13862
  spec.extraClassName
13797
13863
  ].filter(Boolean).join(" ");
13798
13864
  }
13865
+ /**
13866
+ * Button classes for an authored button that renders its own trailing icon.
13867
+ *
13868
+ * A separate function rather than a flag on `themeButtonClassName`, because
13869
+ * there is exactly one caller and it should stay visible in a diff. The name
13870
+ * states what the caller knows to be true of its own markup — that it renders a
13871
+ * trailing icon — rather than what the theme does about it. The consequence is
13872
+ * the theme's to decide and to change; a caller naming the consequence would be
13873
+ * asserting a policy it does not own, and would quietly become a lie the moment
13874
+ * that policy moved.
13875
+ *
13876
+ * Do not reach for this to remove an arrow you simply do not want. A trailing
13877
+ * affordance is declared by the button style, and a block overriding that is the
13878
+ * defect this replaced.
13879
+ */
13880
+ function themeButtonClassNameWithTrailingIcon(spec) {
13881
+ return themeButtonClassName({
13882
+ ...spec,
13883
+ extraClassName: [spec.extraClassName, AFFORDANCE_SUPPRESS_CLASS].filter(Boolean).join(" ")
13884
+ });
13885
+ }
13799
13886
  //#endregion
13800
13887
  //#region ../theme-core/src/interactive/generateBaseCSS.ts
13801
13888
  /**
@@ -15708,26 +15795,19 @@ function resolvedButtonFocusDeclarations(indicator, role) {
15708
15795
  ] : [["outline", value("outline", `3px solid ${indicator.colorCss}`)], ["outline-offset", value("outline-offset", "3px")]];
15709
15796
  }
15710
15797
  /**
15711
- * Disabled buttons retain their validated colour pair and add a non-layout
15712
- * visual affordance. `currentColor` keeps the cue inside the same contrast
15713
- * relationship, while retaining pointer events lets the not-allowed cursor
15714
- * remain observable.
15798
+ * Disabled buttons are deliberately muted as unavailable controls. Native
15799
+ * disabled controls are exempt from active-control contrast requirements;
15800
+ * opacity distinguishes the state without introducing a focus-like outline.
15801
+ * Retaining pointer events lets the not-allowed cursor remain observable.
15715
15802
  */
15716
15803
  const RESOLVED_BUTTON_DISABLED_DECLARATIONS = [
15717
15804
  ["cursor", "not-allowed"],
15718
15805
  ["transform", "none"],
15719
15806
  ["box-shadow", "none"],
15720
- ["outline", "2px dashed currentColor"],
15721
- ["outline-offset", "-4px"]
15807
+ ["opacity", "0.55"]
15722
15808
  ];
15723
15809
  //#endregion
15724
15810
  //#region ../theme-core/src/buttons/generateButtonCss.ts
15725
- /**
15726
- * Class the `button` runtime node adds when it renders its own trailing icon,
15727
- * so a node-level icon suppresses the theme's CSS `::after` affordance.
15728
- * Shared so generator and renderer can't drift.
15729
- */
15730
- const AFFORDANCE_SUPPRESS_CLASS = "rb-affordance-off";
15731
15811
  const BUTTON_SIZE_NAMES = buttonSizeNameSchema.options;
15732
15812
  /**
15733
15813
  * Letter spacing token → CSS value.
@@ -27635,6 +27715,28 @@ const bookingRequirementConsentFieldSchema = z$1.object({
27635
27715
  const bookingConsentCarrierSchema = z$1.union([blockBookingConsentSchema, bookingRequirementConsentFieldSchema]);
27636
27716
  //#endregion
27637
27717
  //#region ../blocks/src/system/blocks/events/shared/schemas.ts
27718
+ const publicEventLoaderQuerySchemaShape = {
27719
+ limit: z$1.string().optional(),
27720
+ from: z$1.string().optional(),
27721
+ to: z$1.string().optional(),
27722
+ afterStartsAt: z$1.string().optional(),
27723
+ afterId: z$1.string().optional(),
27724
+ categoryIds: z$1.string().optional(),
27725
+ venueId: z$1.string().optional(),
27726
+ staffMemberId: z$1.string().optional(),
27727
+ eventSurface: z$1.string().optional(),
27728
+ eventPresets: z$1.string().optional(),
27729
+ scheduleScope: z$1.string().optional(),
27730
+ seriesId: z$1.string().optional(),
27731
+ seriesIds: z$1.string().optional(),
27732
+ runSeriesId: z$1.string().optional(),
27733
+ seriesSlug: z$1.string().optional(),
27734
+ includeOccurrenceId: z$1.string().optional(),
27735
+ readIntent: z$1.string().optional(),
27736
+ detailLevel: z$1.string().optional(),
27737
+ readProfile: z$1.string().optional()
27738
+ };
27739
+ z$1.object(publicEventLoaderQuerySchemaShape);
27638
27740
  const eventPresetSchema = z$1.enum([
27639
27741
  "event",
27640
27742
  "class",
@@ -28001,6 +28103,7 @@ z$1.object({
28001
28103
  eventSurface: z$1.enum(eventSurfaceScopeValues).optional(),
28002
28104
  eventPresets: z$1.string().optional(),
28003
28105
  scheduleScope: z$1.enum(eventScheduleScopeValues).optional(),
28106
+ seriesIds: z$1.string().optional(),
28004
28107
  categoryIds: z$1.string().optional(),
28005
28108
  venueId: z$1.string().transform(normalizeCalendarFilterId).optional(),
28006
28109
  staffMemberId: z$1.string().transform(normalizeCalendarFilterId).optional()
@@ -28051,7 +28154,56 @@ const calendarWindowPageSchema = z$1.discriminatedUnion("kind", [z$1.object({
28051
28154
  kind: z$1.literal("partial"),
28052
28155
  nextCursor: calendarSourceCursorSchema
28053
28156
  })]);
28157
+ //#endregion
28158
+ //#region ../blocks/src/system/blocks/events/shared/eventSelection.ts
28159
+ /** Invalid saved selections fail closed rather than widening discovery. */
28160
+ function resolveEventSelection(mode, value) {
28161
+ if (mode !== "selected") return { kind: "matching" };
28162
+ const candidates = Array.isArray(value) ? value : typeof value === "string" ? value.split(",").filter(Boolean) : [];
28163
+ const ids = [];
28164
+ for (const candidate of candidates) {
28165
+ if (typeof candidate !== "string") return {
28166
+ kind: "selected",
28167
+ seriesIds: []
28168
+ };
28169
+ const parsed = parseEventSeriesId(candidate.trim());
28170
+ if (!parsed.ok) return {
28171
+ kind: "selected",
28172
+ seriesIds: []
28173
+ };
28174
+ ids.push(parsed.value);
28175
+ }
28176
+ return {
28177
+ kind: "selected",
28178
+ seriesIds: [...new Set(ids)].sort()
28179
+ };
28180
+ }
28181
+ /** Undefined means discovery; an empty string is an explicitly empty selection. */
28182
+ function eventSeriesScopeCsv(value) {
28183
+ if (value == null) return void 0;
28184
+ return typeof value === "string" ? value : value.join(",");
28185
+ }
28054
28186
  const defaultTransforms = createTransformRegistry([
28187
+ {
28188
+ id: "events.calendarSelectionParam",
28189
+ kind: "formatter",
28190
+ summary: "Resolve selected events instead of discovery filters",
28191
+ schema: z$1.object({ key: z$1.enum([
28192
+ "seriesIds",
28193
+ "eventSurface",
28194
+ "filterEventPresets",
28195
+ "scheduleScope",
28196
+ "filterCategoryIds",
28197
+ "filterStaffMemberId",
28198
+ "filterVenueId"
28199
+ ]) }),
28200
+ run(value, { key }) {
28201
+ const content = asPartialObject(value) ?? {};
28202
+ const selection = resolveEventSelection(content.eventSelection, content.selectedEventSeriesIds);
28203
+ if (selection.kind === "selected") return key === "seriesIds" ? selection.seriesIds : void 0;
28204
+ return key === "seriesIds" ? void 0 : content[key];
28205
+ }
28206
+ },
28055
28207
  {
28056
28208
  id: "events.calendarReadEnabled",
28057
28209
  kind: "formatter",
@@ -29805,17 +29957,16 @@ const ButtonNode = ({ value, children, href, variantId = "primary", size = "md",
29805
29957
  if (process.env.NODE_ENV === "development") console.warn("[ButtonNode] Missing href for link-required button");
29806
29958
  return null;
29807
29959
  }
29808
- const extraClassName = affordanceIcon ? [className, AFFORDANCE_SUPPRESS_CLASS].filter(Boolean).join(" ") : className;
29809
29960
  const resolvedVariantId = parseThemeButtonVariantId(variantId);
29810
29961
  if (variantId && !resolvedVariantId) {
29811
29962
  console.error("[ButtonNode] Invalid button variant", { variantId });
29812
29963
  return null;
29813
29964
  }
29814
- const combinedClassName = resolvedVariantId ? themeButtonClassName({
29965
+ const combinedClassName = resolvedVariantId ? (affordanceIcon ? themeButtonClassNameWithTrailingIcon : themeButtonClassName)({
29815
29966
  variant: resolvedVariantId,
29816
29967
  size,
29817
- extraClassName
29818
- }) : extraClassName;
29968
+ extraClassName: className
29969
+ }) : className;
29819
29970
  if (resolvedHref) return /* @__PURE__ */ jsxs("a", {
29820
29971
  href: resolvedHref,
29821
29972
  target,
@@ -31083,10 +31234,11 @@ const publicPricingSchema = z$1.object({
31083
31234
  singlePriceAmount: z$1.number().nullable(),
31084
31235
  slidingMinAmount: z$1.number().nullable(),
31085
31236
  slidingMaxAmount: z$1.number().nullable(),
31086
- options: z$1.array(publicPricingOptionSchema)
31237
+ options: z$1.array(publicPricingOptionSchema).readonly()
31087
31238
  });
31088
31239
  const publicAppointmentServiceSchema = z$1.object({
31089
31240
  id: z$1.string().min(1),
31241
+ slug: z$1.string().min(1).optional(),
31090
31242
  title: z$1.string(),
31091
31243
  description: z$1.string().nullable().optional(),
31092
31244
  durationMinutes: z$1.number().int().positive(),
@@ -31163,7 +31315,7 @@ function formatAmountOrFree(amount, currency) {
31163
31315
  currency
31164
31316
  }, { decimals: "auto" });
31165
31317
  }
31166
- function buildRows(services, pathname) {
31318
+ function buildRows(services, pathname, servicePathPrefix) {
31167
31319
  return services.map((service) => ({
31168
31320
  id: service.id,
31169
31321
  title: service.title,
@@ -31174,7 +31326,8 @@ function buildRows(services, pathname) {
31174
31326
  href: resolveDedicatedBookingHref(pathname, {
31175
31327
  kind: "appointment_service",
31176
31328
  serviceId: service.id
31177
- })
31329
+ }),
31330
+ detailsHref: servicePathPrefix && service.slug ? `${servicePathPrefix.replace(/\/$/, "")}/${encodeURIComponent(service.slug)}` : null
31178
31331
  }));
31179
31332
  }
31180
31333
  function buildAppointmentServicesView(input) {
@@ -31193,13 +31346,14 @@ function buildAppointmentServicesView(input) {
31193
31346
  };
31194
31347
  return {
31195
31348
  kind: "items",
31196
- rows: buildRows(parsed.services, input.pathname)
31349
+ rows: buildRows(parsed.services, input.pathname, input.servicePathPrefix ?? null)
31197
31350
  };
31198
31351
  }
31199
- function AppointmentServicesNode({ sectionHeading, services, pathname, className }) {
31352
+ function AppointmentServicesNode({ sectionHeading, services, pathname, servicePathPrefix, className }) {
31200
31353
  const view = buildAppointmentServicesView({
31201
31354
  services,
31202
- pathname: typeof pathname === "string" ? pathname : void 0
31355
+ pathname: typeof pathname === "string" ? pathname : void 0,
31356
+ servicePathPrefix: typeof servicePathPrefix === "string" ? servicePathPrefix : null
31203
31357
  });
31204
31358
  const rootClassName = `appointment-services ${className ?? ""}`.trim();
31205
31359
  const RowTitle = sectionHeading ? "h3" : "h2";
@@ -31230,7 +31384,10 @@ function AppointmentServicesNode({ sectionHeading, services, pathname, className
31230
31384
  children: [
31231
31385
  /* @__PURE__ */ jsx(RowTitle, {
31232
31386
  className: "appointment-services-row-title rb-text-lg rb-font-medium rb-leading-tight",
31233
- children: row.title
31387
+ children: row.detailsHref ? /* @__PURE__ */ jsx("a", {
31388
+ href: row.detailsHref,
31389
+ children: row.title
31390
+ }) : row.title
31234
31391
  }),
31235
31392
  row.description ? /* @__PURE__ */ jsx("p", {
31236
31393
  className: "appointment-services-row-description rb-text-sm rb-leading-6 status-muted",
@@ -33737,12 +33894,12 @@ const EventCompactRow = ({ event, buttonVariant = "primary", buttonText }) => {
33737
33894
  }), cta.hidden ? /* @__PURE__ */ jsx("span", {
33738
33895
  className: "event-compact-row-status",
33739
33896
  children: cta.label
33740
- }) : /* @__PURE__ */ jsxs("a", {
33897
+ }) : /* @__PURE__ */ jsx("a", {
33741
33898
  href: cta.href,
33742
33899
  target: cta.external ? "_blank" : void 0,
33743
33900
  rel: cta.external ? "noopener noreferrer" : void 0,
33744
33901
  className: `${buttonClass} event-compact-row-cta`,
33745
- children: [/* @__PURE__ */ jsx("span", { children: cta.label }), /* @__PURE__ */ jsx(ArrowRightIcon, { "aria-hidden": "true" })]
33902
+ children: /* @__PURE__ */ jsx("span", { children: cta.label })
33746
33903
  })]
33747
33904
  })]
33748
33905
  })]
@@ -34835,6 +34992,7 @@ const eventCollectionFilterSourceSchemaShape = {
34835
34992
  eventSurface: eventSurfaceScopeSchema$1.nullable().optional(),
34836
34993
  filterEventPresets: z$1.union([z$1.string(), z$1.array(z$1.string())]).nullable().optional(),
34837
34994
  scheduleScope: eventScheduleScopeSchema$1.nullable().optional(),
34995
+ seriesIds: z$1.union([z$1.string(), z$1.array(z$1.string())]).nullable().optional(),
34838
34996
  filterCategoryIds: z$1.union([z$1.string(), z$1.array(z$1.string())]).nullable().optional(),
34839
34997
  filterStaffMemberId: z$1.string().nullable().optional(),
34840
34998
  filterVenueId: z$1.string().nullable().optional()
@@ -34881,6 +35039,7 @@ const eventCollectionDisplaySchemaShape = {
34881
35039
  eventSurface: eventSurfaceScopeSchema$1,
34882
35040
  filterEventPresets: z$1.string().nullable(),
34883
35041
  scheduleScope: eventScheduleScopeSchema$1,
35042
+ seriesIds: z$1.string().nullable().optional(),
34884
35043
  filterCategoryIds: z$1.string().nullable(),
34885
35044
  filterStaffMemberId: z$1.string().nullable(),
34886
35045
  filterVenueId: z$1.string().nullable(),
@@ -34928,11 +35087,15 @@ function buildEventCollectionDisplay(source) {
34928
35087
  };
34929
35088
  }
34930
35089
  function buildEventCollectionFilterDisplay(source) {
34931
- return {
34932
- showFilters: source.showFilters ?? true,
34933
- showCategoryFilter: source.showCategoryFilter ?? "auto",
34934
- showVenueFilter: source.showVenueFilter ?? false,
34935
- showStaffFilter: source.showStaffFilter ?? true,
35090
+ const selected = source.seriesIds != null;
35091
+ const matchingFilters = selected ? {
35092
+ eventSurface: "all",
35093
+ filterEventPresets: null,
35094
+ scheduleScope: "any",
35095
+ filterCategoryIds: null,
35096
+ filterStaffMemberId: null,
35097
+ filterVenueId: null
35098
+ } : {
34936
35099
  eventSurface: normalizeEventSurfaceScope(source.eventSurface),
34937
35100
  filterEventPresets: normalizeEventSurfacePresetsCsv(source.filterEventPresets),
34938
35101
  scheduleScope: normalizeEventScheduleScope(source.scheduleScope),
@@ -34940,6 +35103,14 @@ function buildEventCollectionFilterDisplay(source) {
34940
35103
  filterStaffMemberId: normalizeEventStaffMemberId(source.filterStaffMemberId),
34941
35104
  filterVenueId: normalizeEventVenueId(source.filterVenueId)
34942
35105
  };
35106
+ return {
35107
+ seriesIds: eventSeriesScopeCsv(source.seriesIds),
35108
+ showFilters: selected ? false : source.showFilters ?? true,
35109
+ showCategoryFilter: source.showCategoryFilter ?? "auto",
35110
+ showVenueFilter: source.showVenueFilter ?? false,
35111
+ showStaffFilter: source.showStaffFilter ?? true,
35112
+ ...matchingFilters
35113
+ };
34943
35114
  }
34944
35115
  function buildEventCollectionPresentationDisplay(source) {
34945
35116
  return {
@@ -34954,14 +35125,15 @@ function buildEventCollectionPresentationDisplay(source) {
34954
35125
  }
34955
35126
  function buildEventCollectionHydration(source, now = /* @__PURE__ */ new Date()) {
34956
35127
  const timeZone = source.calendarWindow?.scope.timeZone ?? toBookingTimeZone(source.bookingTimeZone);
35128
+ const selected = source.seriesIds != null;
34957
35129
  return {
34958
35130
  calendarWindow: source.calendarWindow ?? void 0,
34959
35131
  siteId: source.siteId,
34960
35132
  stage: source.stage,
34961
35133
  prefetchedEvents: source.events != null,
34962
- eventSurface: normalizeEventSurfaceScope(source.eventSurface),
34963
- filterEventPresets: normalizeEventSurfacePresetsCsv(source.filterEventPresets),
34964
- scheduleScope: normalizeEventScheduleScope(source.scheduleScope),
35134
+ eventSurface: selected ? "all" : normalizeEventSurfaceScope(source.eventSurface),
35135
+ filterEventPresets: selected ? null : normalizeEventSurfacePresetsCsv(source.filterEventPresets),
35136
+ scheduleScope: selected ? "any" : normalizeEventScheduleScope(source.scheduleScope),
34965
35137
  calendarContext: {
34966
35138
  timeZone,
34967
35139
  initialToday: source.calendarWindow?.initialToday ?? getLocalScheduleDate(now, timeZone)
@@ -35531,13 +35703,10 @@ function OfferingsPreviewContent(props) {
35531
35703
  }),
35532
35704
  groupCta ? /* @__PURE__ */ jsx("footer", {
35533
35705
  className: "offerings-preview-card-footer rb-mt-auto rb-flex",
35534
- children: /* @__PURE__ */ jsxs("a", {
35706
+ children: /* @__PURE__ */ jsx("a", {
35535
35707
  className: groupLinkClass,
35536
35708
  href: groupCta.href,
35537
- children: [/* @__PURE__ */ jsx("span", { children: groupCta.label }), /* @__PURE__ */ jsx(ArrowRightIcon, {
35538
- "aria-hidden": "true",
35539
- className: "offerings-preview-link-icon rb-h-4 rb-w-4"
35540
- })]
35709
+ children: /* @__PURE__ */ jsx("span", { children: groupCta.label })
35541
35710
  })
35542
35711
  }) : null
35543
35712
  ]
@@ -37742,6 +37911,44 @@ function toWholeSeriesRegistrationEvents(events) {
37742
37911
  return groupPublicEventsByRun(events).map(toWholeSeriesRegistrationEvent).filter((event) => event !== null);
37743
37912
  }
37744
37913
  //#endregion
37914
+ //#region ../blocks/src/system/runtime/nodes/event-registration/eventSourceRecovery.ts
37915
+ const { limit: _rawLimit, eventSurface: _rawEventSurface, scheduleScope: _rawScheduleScope, detailLevel: _rawDetailLevel, ...stringEventQueryShape } = publicEventLoaderQuerySchemaShape;
37916
+ const eventRecoveryRequestSchema = z$1.object({
37917
+ ...stringEventQueryShape,
37918
+ limit: z$1.coerce.number().int().positive().optional(),
37919
+ eventSurface: z$1.enum(eventSurfaceScopeValues).optional(),
37920
+ scheduleScope: z$1.enum(eventScheduleScopeValues).optional(),
37921
+ detailLevel: z$1.enum(["full", "listing"]).optional(),
37922
+ stage: z$1.enum(["preview", "published"]).optional()
37923
+ });
37924
+ function resolveEventRegistrationEventSource(input) {
37925
+ if (input.wholeSeriesRunEvents != null) return {
37926
+ kind: "loaded",
37927
+ events: input.wholeSeriesRunEvents
37928
+ };
37929
+ if (input.events != null) return {
37930
+ kind: "loaded",
37931
+ events: input.events
37932
+ };
37933
+ return {
37934
+ kind: "unresolved",
37935
+ request: parseEventLoaderRecoveryRequest(input.failures?.wholeSeriesRunEvents ?? input.failures?.events)
37936
+ };
37937
+ }
37938
+ const eventLoaderFailureSchema = z$1.object({
37939
+ endpoint: z$1.literal("listPublicEvents"),
37940
+ params: eventRecoveryRequestSchema.extend({ siteId: z$1.string().optional() })
37941
+ });
37942
+ function parseEventLoaderRecoveryRequest(value) {
37943
+ const parsed = eventLoaderFailureSchema.safeParse(value);
37944
+ if (!parsed.success) return null;
37945
+ const { siteId: _siteId, stage, ...params } = parsed.data.params;
37946
+ return {
37947
+ ...params,
37948
+ stage: stage ?? "published"
37949
+ };
37950
+ }
37951
+ //#endregion
37745
37952
  //#region ../blocks/src/system/runtime/nodes/event-registration.interactive.ts
37746
37953
  const EVENT_REGISTRATION_GENERIC_SHELL_STEP_LABELS = [
37747
37954
  "Date",
@@ -37759,8 +37966,6 @@ const eventRegistrationPublicEventSchema = z$1.preprocess(normalizeEventRegistra
37759
37966
  const eventRegistrationHydrationSchemaShape = {
37760
37967
  occurrenceContext: occurrenceContextSchema.optional(),
37761
37968
  subject: eventRegistrationPageSurfaceSubjectSchema.nullable().optional(),
37762
- events: z$1.array(eventRegistrationPublicEventSchema).nullable().optional(),
37763
- wholeSeriesRunEvents: z$1.array(eventRegistrationPublicEventSchema).nullable().optional(),
37764
37969
  maxTickets: z$1.string().optional(),
37765
37970
  showVenue: z$1.boolean().optional(),
37766
37971
  showCapacity: z$1.boolean().optional(),
@@ -37772,12 +37977,22 @@ const eventRegistrationHydrationSchemaShape = {
37772
37977
  sitePasses: publicPassProductCollectionSchema.nullable().optional(),
37773
37978
  siteMemberships: publicMembershipProductCollectionSchema.nullable().optional()
37774
37979
  };
37980
+ const eventRegistrationEventSourceSchema = z$1.discriminatedUnion("kind", [z$1.object({
37981
+ kind: z$1.literal("loaded"),
37982
+ events: z$1.array(eventRegistrationPublicEventSchema)
37983
+ }), z$1.object({
37984
+ kind: z$1.literal("unresolved"),
37985
+ request: eventRecoveryRequestSchema.nullable()
37986
+ })]);
37775
37987
  const eventRegistrationSourceSchema = z$1.object({
37776
37988
  siteId: z$1.string().optional(),
37777
37989
  apiBaseUrl: z$1.string().optional(),
37778
37990
  portalToken: z$1.string().nullable().optional(),
37779
37991
  previewToken: z$1.string().nullable().optional(),
37780
37992
  ...eventRegistrationHydrationSchemaShape,
37993
+ events: z$1.array(eventRegistrationPublicEventSchema).nullable().optional(),
37994
+ wholeSeriesRunEvents: z$1.array(eventRegistrationPublicEventSchema).nullable().optional(),
37995
+ eventLoaderFailures: z$1.record(z$1.string(), z$1.unknown()).nullable().optional(),
37781
37996
  className: z$1.string().nullable().optional(),
37782
37997
  buttonText: z$1.string().nullable().optional(),
37783
37998
  maxTickets: z$1.string().nullable().optional(),
@@ -37798,7 +38013,10 @@ const eventRegistrationDisplaySchema = z$1.discriminatedUnion("state", [z$1.obje
37798
38013
  titleText: z$1.string(),
37799
38014
  bodyText: z$1.string()
37800
38015
  })]);
37801
- const eventRegistrationHydrationSchema = z$1.object(eventRegistrationHydrationSchemaShape);
38016
+ const eventRegistrationHydrationSchema = z$1.object({
38017
+ ...eventRegistrationHydrationSchemaShape,
38018
+ eventSource: eventRegistrationEventSourceSchema
38019
+ });
37802
38020
  const eventRegistrationRenderSchema = z$1.object({
37803
38021
  display: eventRegistrationDisplaySchema,
37804
38022
  hydration: eventRegistrationHydrationSchema
@@ -37857,16 +38075,12 @@ function buildEventRegistrationShellStepLabels(source, scopedSourceEvents) {
37857
38075
  function toScopedEventRegistrationEvents(scopedSourceEvents) {
37858
38076
  return [...toRegistrationEvents(scopedSourceEvents), ...toWholeSeriesRegistrationEvents(scopedSourceEvents)];
37859
38077
  }
37860
- function scopeEventRegistrationSourceEvents(source) {
37861
- return resolveEventRegistrationScopedEvents(source.wholeSeriesRunEvents ?? source.events ?? [], {
38078
+ function scopeEventRegistrationSourceEvents(source, eventSource) {
38079
+ return resolveEventRegistrationScopedEvents(eventSource.kind === "loaded" ? eventSource.events : [], {
37862
38080
  occurrenceContext: source.occurrenceContext,
37863
38081
  subject: source.subject
37864
38082
  });
37865
38083
  }
37866
- function resolveLoadedEventRegistrationSourceEvents(source, scopedSourceEvents) {
37867
- if (source.events == null && source.wholeSeriesRunEvents == null) return null;
37868
- return [...scopedSourceEvents];
37869
- }
37870
38084
  /**
37871
38085
  * The one run this surface is registering for, when the scoped events describe
37872
38086
  * exactly one. More than one run means the visitor still has to choose.
@@ -37906,14 +38120,21 @@ const eventRegistrationBlockRuntime = defineClientOwnedBlockRuntime({
37906
38120
  render: createZodCodec(eventRegistrationRenderSchema)
37907
38121
  },
37908
38122
  buildRender: (source) => {
37909
- const scopedSourceEvents = scopeEventRegistrationSourceEvents(source);
37910
- const events = resolveLoadedEventRegistrationSourceEvents(source, scopedSourceEvents);
38123
+ const eventSource = resolveEventRegistrationEventSource({
38124
+ events: source.events,
38125
+ wholeSeriesRunEvents: source.wholeSeriesRunEvents,
38126
+ failures: source.eventLoaderFailures
38127
+ });
38128
+ const scopedSourceEvents = scopeEventRegistrationSourceEvents(source, eventSource);
37911
38129
  return {
37912
38130
  display: buildEventRegistrationDisplayFromScopedEvents(source, scopedSourceEvents),
37913
38131
  hydration: {
37914
38132
  occurrenceContext: source.occurrenceContext ?? null,
37915
38133
  subject: source.subject ?? null,
37916
- events,
38134
+ eventSource: eventSource.kind === "loaded" ? {
38135
+ ...eventSource,
38136
+ events: [...scopedSourceEvents]
38137
+ } : eventSource,
37917
38138
  maxTickets: source.maxTickets ?? void 0,
37918
38139
  showVenue: source.showVenue,
37919
38140
  showCapacity: source.showCapacity,
@@ -38103,6 +38324,7 @@ const eventRegistrationBlockDefinition = {
38103
38324
  } },
38104
38325
  events: { $bind: { from: "data.events" } },
38105
38326
  wholeSeriesRunEvents: { $bind: { from: "data.wholeSeriesRunEvents" } },
38327
+ loaderFailures: { $bind: { from: "$root.loaderFailures" } },
38106
38328
  sitePasses: { $bind: { from: "data.sitePasses" } },
38107
38329
  siteMemberships: { $bind: { from: "data.siteMemberships" } },
38108
38330
  stage: { $bind: {
@@ -38429,6 +38651,65 @@ const formBlockDefinition = {
38429
38651
  runtime: formBlockRuntime
38430
38652
  };
38431
38653
  //#endregion
38654
+ //#region ../blocks/src/system/blocks/events/eventSelectionFields.ts
38655
+ const eventSelectionFields = [{
38656
+ id: "eventSelection",
38657
+ type: "select",
38658
+ label: "Events to show",
38659
+ required: false,
38660
+ multiple: false,
38661
+ defaultValue: "matching",
38662
+ options: [{
38663
+ value: "matching",
38664
+ label: "All matching events"
38665
+ }, {
38666
+ value: "selected",
38667
+ label: "Selected events"
38668
+ }],
38669
+ ui: { intent: "behavior" }
38670
+ }, createSiteOptionSelectField({
38671
+ id: "selectedEventSeriesIds",
38672
+ label: "Selected events",
38673
+ description: "Show upcoming dates for these events. Other event filters do not apply.",
38674
+ required: false,
38675
+ multiple: true,
38676
+ defaultValue: [],
38677
+ optionSource: "eventSeries",
38678
+ ui: {
38679
+ intent: "behavior",
38680
+ searchThreshold: 1,
38681
+ visibleWhen: {
38682
+ field: "eventSelection",
38683
+ equals: "selected"
38684
+ }
38685
+ }
38686
+ })];
38687
+ function withEventSelectionVisibility(field) {
38688
+ if (![
38689
+ "eventSurface",
38690
+ "filterEventPresets",
38691
+ "scheduleScope",
38692
+ "filterCategoryIds",
38693
+ "filterStaffMemberId",
38694
+ "filterVenueId",
38695
+ "showFilters",
38696
+ "showCategoryFilter",
38697
+ "showVenueFilter",
38698
+ "showStaffFilter"
38699
+ ].includes(field.id)) return field;
38700
+ const visibleWhen = field.ui?.visibleWhen;
38701
+ return {
38702
+ ...field,
38703
+ ui: {
38704
+ ...field.ui,
38705
+ visibleWhen: { allOf: [{
38706
+ field: "eventSelection",
38707
+ notEquals: "selected"
38708
+ }, ...visibleWhen ? [visibleWhen] : []] }
38709
+ }
38710
+ };
38711
+ }
38712
+ //#endregion
38432
38713
  //#region ../blocks/src/system/runtime/nodes/events/EventCalendar.interactive.ts
38433
38714
  const eventCalendarSourceSchema = z$1.object({
38434
38715
  ...eventCollectionSourceSchemaShape,
@@ -38526,19 +38807,59 @@ function buildEventCalendarInteractiveIslandProps(props) {
38526
38807
  //#region ../blocks/src/system/blocks/events/eventCalendarDataLoaders.ts
38527
38808
  const scopeParams = {
38528
38809
  siteId: { $bind: { from: "$root.siteId" } },
38810
+ seriesIds: { $bind: {
38811
+ from: "content",
38812
+ transforms: [{
38813
+ id: "events.calendarSelectionParam",
38814
+ options: { key: "seriesIds" }
38815
+ }]
38816
+ } },
38529
38817
  stage: { $bind: {
38530
38818
  from: "$root.previewStage",
38531
38819
  fallback: "published"
38532
38820
  } },
38533
- eventSurface: { $bind: { from: "content.eventSurface" } },
38821
+ eventSurface: { $bind: {
38822
+ from: "content",
38823
+ transforms: [{
38824
+ id: "events.calendarSelectionParam",
38825
+ options: { key: "eventSurface" }
38826
+ }, { id: "value.csv" }]
38827
+ } },
38534
38828
  eventPresets: { $bind: {
38535
- from: "content.filterEventPresets",
38536
- transforms: [{ id: "value.csv" }]
38829
+ from: "content",
38830
+ transforms: [{
38831
+ id: "events.calendarSelectionParam",
38832
+ options: { key: "filterEventPresets" }
38833
+ }, { id: "value.csv" }]
38834
+ } },
38835
+ scheduleScope: { $bind: {
38836
+ from: "content",
38837
+ transforms: [{
38838
+ id: "events.calendarSelectionParam",
38839
+ options: { key: "scheduleScope" }
38840
+ }, { id: "value.csv" }]
38841
+ } },
38842
+ categoryIds: { $bind: {
38843
+ from: "content",
38844
+ transforms: [{
38845
+ id: "events.calendarSelectionParam",
38846
+ options: { key: "filterCategoryIds" }
38847
+ }, { id: "value.csv" }]
38848
+ } },
38849
+ staffMemberId: { $bind: {
38850
+ from: "content",
38851
+ transforms: [{
38852
+ id: "events.calendarSelectionParam",
38853
+ options: { key: "filterStaffMemberId" }
38854
+ }, { id: "value.csv" }]
38537
38855
  } },
38538
- scheduleScope: { $bind: { from: "content.scheduleScope" } },
38539
- categoryIds: { $bind: { from: "content.filterCategoryIds" } },
38540
- staffMemberId: { $bind: { from: "content.filterStaffMemberId" } },
38541
- venueId: { $bind: { from: "content.filterVenueId" } }
38856
+ venueId: { $bind: {
38857
+ from: "content",
38858
+ transforms: [{
38859
+ id: "events.calendarSelectionParam",
38860
+ options: { key: "filterVenueId" }
38861
+ }, { id: "value.csv" }]
38862
+ } }
38542
38863
  };
38543
38864
  /** Combined renders two jobs; calendar-only variants never pay for the list seed. */
38544
38865
  const eventCalendarDataLoaders = {
@@ -38668,6 +38989,13 @@ const eventCalendarLayout = [styledSection({
38668
38989
  from: "content.defaultCalendarView",
38669
38990
  fallback: "month"
38670
38991
  } },
38992
+ seriesIds: { $bind: {
38993
+ from: "content",
38994
+ transforms: [{
38995
+ id: "events.calendarSelectionParam",
38996
+ options: { key: "seriesIds" }
38997
+ }]
38998
+ } },
38671
38999
  showFilters: { $bind: {
38672
39000
  from: "content.showFilters",
38673
39001
  fallback: true
@@ -38689,17 +39017,47 @@ const eventCalendarLayout = [styledSection({
38689
39017
  fallback: true
38690
39018
  } },
38691
39019
  eventSurface: { $bind: {
38692
- from: "content.eventSurface",
38693
- fallback: "all"
39020
+ from: "content",
39021
+ transforms: [{
39022
+ id: "events.calendarSelectionParam",
39023
+ options: { key: "eventSurface" }
39024
+ }]
39025
+ } },
39026
+ filterEventPresets: { $bind: {
39027
+ from: "content",
39028
+ transforms: [{
39029
+ id: "events.calendarSelectionParam",
39030
+ options: { key: "filterEventPresets" }
39031
+ }]
38694
39032
  } },
38695
- filterEventPresets: { $bind: { from: "content.filterEventPresets" } },
38696
39033
  scheduleScope: { $bind: {
38697
- from: "content.scheduleScope",
38698
- fallback: "any"
39034
+ from: "content",
39035
+ transforms: [{
39036
+ id: "events.calendarSelectionParam",
39037
+ options: { key: "scheduleScope" }
39038
+ }]
39039
+ } },
39040
+ filterCategoryIds: { $bind: {
39041
+ from: "content",
39042
+ transforms: [{
39043
+ id: "events.calendarSelectionParam",
39044
+ options: { key: "filterCategoryIds" }
39045
+ }]
39046
+ } },
39047
+ filterStaffMemberId: { $bind: {
39048
+ from: "content",
39049
+ transforms: [{
39050
+ id: "events.calendarSelectionParam",
39051
+ options: { key: "filterStaffMemberId" }
39052
+ }]
39053
+ } },
39054
+ filterVenueId: { $bind: {
39055
+ from: "content",
39056
+ transforms: [{
39057
+ id: "events.calendarSelectionParam",
39058
+ options: { key: "filterVenueId" }
39059
+ }]
38699
39060
  } },
38700
- filterCategoryIds: { $bind: { from: "content.filterCategoryIds" } },
38701
- filterStaffMemberId: { $bind: { from: "content.filterStaffMemberId" } },
38702
- filterVenueId: { $bind: { from: "content.filterVenueId" } },
38703
39061
  cardRole: { $bind: {
38704
39062
  from: "content._cardStyles.role",
38705
39063
  fallback: "default"
@@ -39203,6 +39561,7 @@ const eventCalendarAdditionalFields = [
39203
39561
  }
39204
39562
  }
39205
39563
  },
39564
+ ...eventSelectionFields,
39206
39565
  {
39207
39566
  id: "eventSurface",
39208
39567
  type: "select",
@@ -39412,7 +39771,7 @@ const eventCalendarBlockDefinition = {
39412
39771
  titleSource: "heading",
39413
39772
  description: "Display events with calendar, list, or combined views with filtering",
39414
39773
  skipSectionStyles: true,
39415
- additionalFields: eventCalendarAdditionalFields,
39774
+ additionalFields: eventCalendarAdditionalFields.map(withEventSelectionVisibility),
39416
39775
  styleTokens: {
39417
39776
  background: "surface",
39418
39777
  typography: "body",
@@ -39521,6 +39880,7 @@ const eventListingHydrationSchema = z$1.object({
39521
39880
  eventSurface: eventSurfaceScopeSchema,
39522
39881
  filterEventPresets: z$1.string().nullable(),
39523
39882
  scheduleScope: eventScheduleScopeSchema,
39883
+ seriesIds: z$1.string().nullable().optional(),
39524
39884
  filterCategoryIds: z$1.string().nullable().optional(),
39525
39885
  filterStaffMemberId: z$1.string().nullable().optional(),
39526
39886
  filterVenueId: z$1.string().nullable().optional(),
@@ -39581,6 +39941,7 @@ const eventListingBlockRuntime = defineProgressiveBlockRuntime({
39581
39941
  eventSurface: normalizeEventSurfaceScope(source.eventSurface),
39582
39942
  filterEventPresets: normalizeEventSurfacePresetsCsv(source.filterEventPresets),
39583
39943
  scheduleScope: normalizeEventScheduleScope(source.scheduleScope),
39944
+ seriesIds: eventSeriesScopeCsv(source.seriesIds),
39584
39945
  filterCategoryIds: normalizeEventCategoryIdsCsv(source.filterCategoryIds),
39585
39946
  filterStaffMemberId: normalizeEventStaffMemberId(source.filterStaffMemberId),
39586
39947
  filterVenueId: normalizeEventVenueId(source.filterVenueId),
@@ -40085,6 +40446,15 @@ const newsletterFieldSchema = z$1.object({
40085
40446
  placeholder: z$1.string().optional()
40086
40447
  });
40087
40448
  const mailingListSignupBlockIdSchema = z$1.string().trim().min(1).transform(parseRequiredMailingListSignupBlockId);
40449
+ const mailingListContentVersionIdSchema = z$1.string().transform((value, ctx) => {
40450
+ const parsed = parseMailingListContentVersionId(value);
40451
+ if (parsed) return parsed;
40452
+ ctx.addIssue({
40453
+ code: z$1.ZodIssueCode.custom,
40454
+ message: "Invalid mailing-list content version ID"
40455
+ });
40456
+ return z$1.NEVER;
40457
+ });
40088
40458
  const signedMailingListSourceTokenSchema = z$1.string().trim().min(1).transform(parseRequiredMailingListSignedSourceToken);
40089
40459
  const newsletterSourceCommonSchema = z$1.object({
40090
40460
  siteId: z$1.string().optional(),
@@ -40098,7 +40468,8 @@ const newsletterSourceCommonSchema = z$1.object({
40098
40468
  const newsletterSourceSchema = z$1.discriminatedUnion("source", [
40099
40469
  newsletterSourceCommonSchema.extend({
40100
40470
  source: z$1.literal("block"),
40101
- blockId: z$1.string().nullable().optional()
40471
+ blockId: z$1.string().nullable().optional(),
40472
+ contentVersionId: z$1.string().nullable().optional()
40102
40473
  }),
40103
40474
  newsletterSourceCommonSchema.extend({
40104
40475
  source: z$1.literal("signed-footer"),
@@ -40114,6 +40485,7 @@ const newsletterDisplaySchema = z$1.object({
40114
40485
  availability: z$1.enum(["ready", "unavailable"]),
40115
40486
  className: z$1.string().nullable(),
40116
40487
  buttonLabel: z$1.string(),
40488
+ successMessage: z$1.string(),
40117
40489
  buttonVariant: newsletterButtonVariantSchema,
40118
40490
  privacyNote: z$1.string().nullable(),
40119
40491
  fields: z$1.array(newsletterFieldSchema),
@@ -40128,7 +40500,8 @@ const newsletterHydrationSchema = z$1.object({
40128
40500
  tag: z$1.literal("block-source"),
40129
40501
  sourceRef: z$1.object({
40130
40502
  tag: z$1.literal("block_ref"),
40131
- blockId: mailingListSignupBlockIdSchema
40503
+ blockId: mailingListSignupBlockIdSchema,
40504
+ contentVersionId: mailingListContentVersionIdSchema
40132
40505
  }).nullable()
40133
40506
  }),
40134
40507
  z$1.object({
@@ -40167,6 +40540,7 @@ function buildNewsletterDisplay(source) {
40167
40540
  fields: { preset: "emailOnly" },
40168
40541
  includeOptionalPhone: false,
40169
40542
  buttonLabel: "Subscribe",
40543
+ successMessage: DEFAULT_MAILING_LIST_SUCCESS_MESSAGE,
40170
40544
  privacyNote: null
40171
40545
  };
40172
40546
  const targeting = source.targeting ?? { mode: "default" };
@@ -40176,6 +40550,7 @@ function buildNewsletterDisplay(source) {
40176
40550
  availability: runtimeTargetingIsAvailable(context, targeting, choices) ? "ready" : "unavailable",
40177
40551
  className: source.className ?? null,
40178
40552
  buttonLabel: form.buttonLabel,
40553
+ successMessage: form.successMessage,
40179
40554
  buttonVariant: source.buttonVariant ?? "primary",
40180
40555
  privacyNote: form.privacyNote,
40181
40556
  fields: getGlobalFormFields(form),
@@ -40206,7 +40581,7 @@ const newsletterFormBlockRuntime = defineProgressiveBlockRuntime({
40206
40581
  function projectNewsletterFormHydrationTarget(source) {
40207
40582
  switch (source.source) {
40208
40583
  case "block": {
40209
- const sourceRef = buildMailingListSignupBlockSourceRef(source.blockId);
40584
+ const sourceRef = buildMailingListSignupBlockSourceRef(source.blockId, source.contentVersionId);
40210
40585
  if (sourceRef?.tag === "block_ref") return {
40211
40586
  tag: "block-source",
40212
40587
  sourceRef
@@ -42620,9 +42995,10 @@ function cx(...classes) {
42620
42995
  * Server-safe placeholder for event registration.
42621
42996
  * Provides a static container for island hydration without importing client hooks.
42622
42997
  */
42623
- function EventRegistrationSSR({ blockId, subject, children, ...sourceProps }) {
42998
+ function EventRegistrationSSR({ blockId, subject, loaderFailures, children, ...sourceProps }) {
42624
42999
  const islandProps = buildEventRegistrationInteractiveIslandProps({
42625
43000
  ...sourceProps,
43001
+ eventLoaderFailures: blockId ? loaderFailures?.[blockId] : void 0,
42626
43002
  subject: normalizeEventRegistrationPageSurfaceSubject(subject)
42627
43003
  });
42628
43004
  const display = islandProps.render.display;
@@ -42955,7 +43331,7 @@ function NewsletterFormSSR(props) {
42955
43331
  className: clsx("newsletter-form-ssr", className),
42956
43332
  children: /* @__PURE__ */ jsx("p", {
42957
43333
  role: "status",
42958
- children: "Mailing-list signup is not available right now."
43334
+ children: "We can’t accept signups right now. Please try again later."
42959
43335
  })
42960
43336
  });
42961
43337
  const renderField = (field) => {
@@ -43001,14 +43377,18 @@ function NewsletterFormSSR(props) {
43001
43377
  children: [
43002
43378
  fields.map(renderField),
43003
43379
  islandProps.render.hydration.choicePresentation === "visitor_choice" ? /* @__PURE__ */ jsxs("fieldset", {
43004
- className: "newsletter-topics",
43005
- children: [/* @__PURE__ */ jsx("legend", { children: "What would you like to hear about?" }), display.choices.map((choice) => /* @__PURE__ */ jsxs("label", {
43006
- className: "newsletter-topic-choice",
43380
+ className: "fb-fieldset newsletter-topics",
43381
+ children: [/* @__PURE__ */ jsx("legend", {
43382
+ className: "form-label",
43383
+ children: "What would you like to hear about?"
43384
+ }), display.choices.map((choice) => /* @__PURE__ */ jsxs("label", {
43385
+ className: "fb-inline form-label newsletter-topic-choice",
43007
43386
  children: [/* @__PURE__ */ jsx("input", {
43008
43387
  type: "checkbox",
43009
43388
  name: "mailingListChoice",
43010
- value: choice.id
43011
- }), choice.label]
43389
+ value: choice.id,
43390
+ className: "form-checkbox"
43391
+ }), /* @__PURE__ */ jsx("span", { children: choice.label })]
43012
43392
  }, choice.id))]
43013
43393
  }) : null,
43014
43394
  /* @__PURE__ */ jsx("div", {
@@ -43997,6 +44377,18 @@ function resolveChildren(nodes, context) {
43997
44377
  function isReactNode(value) {
43998
44378
  return value !== null && value !== void 0;
43999
44379
  }
44380
+ function resolveNodeMetadata(nodeType, context) {
44381
+ return {
44382
+ pathBase: context.pathBase,
44383
+ blockId: context.blockId,
44384
+ blockKind: context.blockKind,
44385
+ blockContent: context.blockContent,
44386
+ fragmentRegistry: context.fragmentRegistry,
44387
+ previewAuthoring: context.previewAuthoring,
44388
+ ...nodeType.toLowerCase() === "newsletter-form" ? { contentVersionId: context.contentVersionId } : {},
44389
+ ...nodeType === "media" && context.imageResolveContext ? { imageResolveContext: context.imageResolveContext } : {}
44390
+ };
44391
+ }
44000
44392
  /**
44001
44393
  * Resolves a node definition into a React element.
44002
44394
  * Handles conditionals ($when), scopes ($scopes), repeaters ($repeat), bindings ($bind), and children.
@@ -44032,13 +44424,7 @@ function resolveNode(node, context, indexFallback) {
44032
44424
  const elementProps = {
44033
44425
  ...props,
44034
44426
  key: node.key ?? indexFallback,
44035
- pathBase: context.pathBase,
44036
- blockId: context.blockId,
44037
- blockKind: context.blockKind,
44038
- blockContent: context.blockContent,
44039
- ...node.type === "media" && context.imageResolveContext ? { imageResolveContext: context.imageResolveContext } : {},
44040
- fragmentRegistry: context.fragmentRegistry,
44041
- previewAuthoring: context.previewAuthoring
44427
+ ...resolveNodeMetadata(node.type, context)
44042
44428
  };
44043
44429
  const element = React.createElement(component, elementProps, ...children);
44044
44430
  if (headingDecorationPlan.kind === "skip") return element;
@@ -44913,9 +45299,56 @@ function generateNavLinkCSS(options) {
44913
45299
  if (baseRules.length > 0) cssChunks.unshift(`\n${selector} {\n ${baseRules.join("\n ")}\n}\n`);
44914
45300
  if (hoverRules.length > 0) cssChunks.push(`\n${hoverSelector} {\n ${hoverRules.join("\n ")}\n}\n`);
44915
45301
  if (activeRules.length > 0) cssChunks.push(`\n${activeSelector} {\n ${activeRules.join("\n ")}\n}\n`);
45302
+ cssChunks.push(navLinkFocusVisibleCss(selector, style, theme, tokens));
44916
45303
  cssChunks.push(generateInteractiveChildInheritanceCSS(selector));
44917
45304
  return cssChunks.join("");
44918
45305
  }
45306
+ /**
45307
+ * Keyboard focus indicator for nav links, in the header, the footer and header
45308
+ * dropdown menus — the three surfaces `generateNavLinkCSS` serves.
45309
+ *
45310
+ * Emitted unconditionally rather than as an effect, because focus visibility is
45311
+ * a floor rather than a style choice. Only the interaction-palette pill ever
45312
+ * wrote an `effects.focus` group, so every other nav — every `quiet` palette,
45313
+ * every footer, every dropdown — previously fell back to whatever outline the
45314
+ * browser drew.
45315
+ *
45316
+ * The outline takes the link's own resolved colour, so on a header that adapts
45317
+ * to the section it floats over it moves with the adaptation instead of
45318
+ * asserting a brand colour against an unknown backdrop.
45319
+ *
45320
+ * Where the style asks for `soft-glow`, the same halo goes on the outline. That
45321
+ * treatment exists because the theme has already conceded the resolved colour
45322
+ * alone is not reliable over an unpredictable backdrop — a hero photograph with
45323
+ * mixed luminance. Without it the text would stay legible by its halo while the
45324
+ * focus ring, which is the part with a contrast requirement of its own, would
45325
+ * not.
45326
+ *
45327
+ * A style that also paints a focus pill keeps it: this adds an outline around
45328
+ * that pill rather than replacing it.
45329
+ */
45330
+ function navLinkFocusVisibleCss(selector, style, theme, tokens) {
45331
+ const color = tokens.getColor(style.colorToken);
45332
+ const halo = buildTextContrastShadow({
45333
+ theme,
45334
+ colorToken: style.colorToken,
45335
+ treatment: style.contrastTreatment
45336
+ });
45337
+ return `
45338
+ ${selector}:focus-visible {
45339
+ outline: 2px solid ${color};
45340
+ outline-offset: ${focusOutlineOffset(selector)};${halo ? `\n box-shadow: ${halo};` : ""}
45341
+ }
45342
+ `;
45343
+ }
45344
+ /**
45345
+ * Dropdown items are full-width inside a panel with no horizontal padding, so
45346
+ * an outset outline would paint over and past the panel's own border. Keeping
45347
+ * it flush is the only way it reads as belonging to the item.
45348
+ */
45349
+ function focusOutlineOffset(selector) {
45350
+ return selector.includes("nav-dropdown-link") ? "-2px" : "3px";
45351
+ }
44919
45352
  function buildTextContrastShadow(input) {
44920
45353
  if (input.treatment !== "soft-glow") return null;
44921
45354
  return isLikelyLightColorToken(input.theme, input.colorToken) ? "0 1px 3px rgb(0 0 0 / 0.55), 0 0 18px rgb(0 0 0 / 0.38)" : "0 1px 3px rgb(255 255 255 / 0.72), 0 0 18px rgb(255 255 255 / 0.5)";
@@ -48048,7 +48481,7 @@ function pageBlockPosition(index, blockCount) {
48048
48481
  //#endregion
48049
48482
  //#region ../blocks/src/pageRendererContracts.ts
48050
48483
  function buildPageRendererRootRuntime(dataContext) {
48051
- const { siteId = null, pageId = null, pathname = null, bookingTimeZone, previewStage = "published", apiBaseUrl = null, portalToken = null, bookingOfferingPresets = [], mailingList = { tag: "not_configured" }, eventRegistrationOverlayEnabled = false } = dataContext ?? {};
48484
+ const { siteId = null, pageId = null, pathname = null, bookingTimeZone, previewStage = "published", apiBaseUrl = null, portalToken = null, bookingOfferingPresets = [], appointmentServicePathPrefix = null, mailingList = { tag: "not_configured" }, eventRegistrationOverlayEnabled = false, loaderFailures = {} } = dataContext ?? {};
48052
48485
  return {
48053
48486
  siteId,
48054
48487
  pageId,
@@ -48058,8 +48491,10 @@ function buildPageRendererRootRuntime(dataContext) {
48058
48491
  apiBaseUrl,
48059
48492
  portalToken,
48060
48493
  bookingOfferingPresets,
48494
+ appointmentServicePathPrefix,
48061
48495
  mailingList,
48062
- eventRegistrationOverlayEnabled
48496
+ eventRegistrationOverlayEnabled,
48497
+ loaderFailures
48063
48498
  };
48064
48499
  }
48065
48500
  //#endregion
@@ -52799,7 +53234,8 @@ const appointmentServicesBlockDefinition = {
52799
53234
  el("appointment-services", {
52800
53235
  sectionHeading: { $bind: { from: "content.heading" } },
52801
53236
  services: { $bind: { from: "data.services" } },
52802
- pathname: { $bind: { from: "$root.pathname" } }
53237
+ pathname: { $bind: { from: "$root.pathname" } },
53238
+ servicePathPrefix: { $bind: { from: "$root.appointmentServicePathPrefix" } }
52803
53239
  })
52804
53240
  ], { gap: "lg" })
52805
53241
  })]
@@ -57106,7 +57542,7 @@ function collectNestedPreviewFieldConstraintEntries(field, path) {
57106
57542
  }
57107
57543
  function makeDefaultBlockComponent(args) {
57108
57544
  const { manifest } = args;
57109
- return function DefaultBlockComponent({ content, data, registry, theme, themeConfig, transforms, viewModelOverrides, pathBase, blockId, blockKind, blockBindings, editableRouteMetadataFieldIds, fragmentRegistry, imageResolveContext, previewAuthoring }) {
57545
+ return function DefaultBlockComponent({ content, data, registry, theme, themeConfig, transforms, viewModelOverrides, pathBase, blockId, contentVersionId, blockKind, blockBindings, editableRouteMetadataFieldIds, fragmentRegistry, imageResolveContext, previewAuthoring }) {
57110
57546
  const perf = beginBlockRenderMeasurement();
57111
57547
  if (!theme) throw new Error("Block rendering requires theme tokens; none were provided to makeDefaultBlockComponent");
57112
57548
  if (!registry) throw new Error("Block rendering requires a component registry; none was provided");
@@ -57126,6 +57562,7 @@ function makeDefaultBlockComponent(args) {
57126
57562
  theme: withButtonSystem(theme, themeConfig),
57127
57563
  pathBase,
57128
57564
  blockId,
57565
+ contentVersionId,
57129
57566
  blockKind,
57130
57567
  blockContent: mergedContent,
57131
57568
  blockBindings,
@@ -57919,6 +58356,7 @@ function buildBlockOverrideProps(input) {
57919
58356
  ...blockSubjectProps(dataContext),
57920
58357
  imageResolveContext: input.imageResolveContext,
57921
58358
  blockId: block.id ?? null,
58359
+ contentVersionId: block.contentVersionId ?? null,
57922
58360
  blockKind: block.kind
57923
58361
  };
57924
58362
  }
@@ -58019,6 +58457,7 @@ function toPresentationPage(page) {
58019
58457
  id: block.id,
58020
58458
  kind: block.kind,
58021
58459
  purpose: block.purpose,
58460
+ ...block.contentVersionId ? { contentVersionId: block.contentVersionId } : {},
58022
58461
  ...block.bindings ? { bindings: block.bindings } : {}
58023
58462
  };
58024
58463
  return block.admission.kind === "renderable" ? {
@@ -59249,10 +59688,19 @@ const containerResponsiveThemeCss = `/*
59249
59688
  padding-top: 2.5rem;
59250
59689
  padding-bottom: 2.5rem;
59251
59690
  }
59691
+ /* Clearance for a surface that is not an authored block page.
59692
+ An authored page gets this through its opening block's container (see the
59693
+ overlay-clearance rule in styles.css). A reserved surface or a system
59694
+ destination page has no such block, so it consumes the same variable here.
59695
+ Marked with one class rather than per-surface selectors, because the last
59696
+ two additions to this family were both missed and shipped overlapping. */
59252
59697
  :where(.theme-scope)
59253
59698
  [data-site-document-layout-mode="header-overlay"]
59254
- [data-rb-reserved-surface].rb-reserved-surface-main {
59255
- padding-top: calc(var(--rb-reserved-surface-header-offset, 5.5rem) + 2.5rem);
59699
+ .rb-overlay-clearance-surface {
59700
+ padding-top: calc(
59701
+ var(--site-overlay-header-clearance, 5.5rem) +
59702
+ var(--site-overlay-opening-content-extra-pad, clamp(1rem, 2vw, 1.75rem))
59703
+ );
59256
59704
  }
59257
59705
  .rb-preview-editor-offset {
59258
59706
  padding-bottom: calc(
@@ -68254,7 +68702,9 @@ const containerResponsiveThemeCss = `/*
68254
68702
  text-align: left;
68255
68703
  }
68256
68704
 
68257
- :where(.theme-scope) :where([data-block="customer-portal"]) .cp-login__subtitle {
68705
+ :where(.theme-scope)
68706
+ :where([data-block="customer-portal"])
68707
+ .cp-login__subtitle {
68258
68708
  color: var(--cp-muted);
68259
68709
  font-size: 0.9375rem;
68260
68710
  text-align: left;
@@ -68281,7 +68731,9 @@ const containerResponsiveThemeCss = `/*
68281
68731
  text-align: left;
68282
68732
  }
68283
68733
 
68284
- :where(.theme-scope) :where([data-block="customer-portal"]) .cp-login__reset-link {
68734
+ :where(.theme-scope)
68735
+ :where([data-block="customer-portal"])
68736
+ .cp-login__reset-link {
68285
68737
  appearance: none;
68286
68738
  background: none;
68287
68739
  border: 0;
@@ -68295,11 +68747,15 @@ const containerResponsiveThemeCss = `/*
68295
68747
  text-underline-offset: 0.15em;
68296
68748
  }
68297
68749
 
68298
- :where(.theme-scope) :where([data-block="customer-portal"]) .cp-login__reset-link:hover {
68750
+ :where(.theme-scope)
68751
+ :where([data-block="customer-portal"])
68752
+ .cp-login__reset-link:hover {
68299
68753
  color: var(--cp-text);
68300
68754
  }
68301
68755
 
68302
- :where(.theme-scope) :where([data-block="customer-portal"]) .cp-login__reset-link:focus-visible {
68756
+ :where(.theme-scope)
68757
+ :where([data-block="customer-portal"])
68758
+ .cp-login__reset-link:focus-visible {
68303
68759
  outline: 2px solid currentColor;
68304
68760
  outline-offset: 3px;
68305
68761
  }
@@ -68344,7 +68800,9 @@ const containerResponsiveThemeCss = `/*
68344
68800
  border-bottom: none;
68345
68801
  }
68346
68802
 
68347
- :where(.theme-scope) :where([data-block="customer-portal"]) .cp-header__welcome {
68803
+ :where(.theme-scope)
68804
+ :where([data-block="customer-portal"])
68805
+ .cp-header__welcome {
68348
68806
  font-size: 1.125rem;
68349
68807
  font-weight: 500;
68350
68808
  }
@@ -68360,8 +68818,14 @@ const containerResponsiveThemeCss = `/*
68360
68818
  }
68361
68819
 
68362
68820
  @keyframes cp-fade-in {
68363
- from { opacity: 0; transform: translateY(4px); }
68364
- to { opacity: 1; transform: translateY(0); }
68821
+ from {
68822
+ opacity: 0;
68823
+ transform: translateY(4px);
68824
+ }
68825
+ to {
68826
+ opacity: 1;
68827
+ transform: translateY(0);
68828
+ }
68365
68829
  }
68366
68830
 
68367
68831
  /* Empty state */
@@ -68450,6 +68914,77 @@ const containerResponsiveThemeCss = `/*
68450
68914
  margin-top: 1rem;
68451
68915
  }
68452
68916
 
68917
+ /* Event waitlists */
68918
+ :where(.theme-scope) :where([data-block="customer-portal"]) .cp-waitlist-list {
68919
+ display: grid;
68920
+ gap: 1rem;
68921
+ }
68922
+
68923
+ :where(.theme-scope)
68924
+ :where([data-block="customer-portal"])
68925
+ .cp-waitlists
68926
+ > .cp-alert {
68927
+ margin-bottom: 1rem;
68928
+ }
68929
+
68930
+ :where(.theme-scope) :where([data-block="customer-portal"]) .cp-waitlist-card {
68931
+ transition:
68932
+ border-color 180ms ease,
68933
+ box-shadow 180ms ease;
68934
+ }
68935
+
68936
+ :where(.theme-scope)
68937
+ :where([data-block="customer-portal"])
68938
+ .cp-waitlist-card--focused {
68939
+ border-color: var(--cp-primary);
68940
+ box-shadow: 0 0 0 3px color-mix(in srgb, var(--cp-primary) 22%, transparent);
68941
+ }
68942
+
68943
+ :where(.theme-scope)
68944
+ :where([data-block="customer-portal"])
68945
+ .cp-waitlist-card__summary,
68946
+ :where(.theme-scope)
68947
+ :where([data-block="customer-portal"])
68948
+ .cp-waitlist-card__position {
68949
+ font-weight: 600;
68950
+ }
68951
+
68952
+ :where(.theme-scope)
68953
+ :where([data-block="customer-portal"])
68954
+ .cp-waitlist-card
68955
+ .cp-card-body
68956
+ p {
68957
+ margin: 0.4rem 0;
68958
+ }
68959
+
68960
+ @container rb-site (max-width: 640px) {
68961
+ @scope ([data-rb-responsive-mode="container"]) to (:scope [data-rb-responsive-mode]) {
68962
+ :where(.theme-scope)
68963
+ :where([data-block="customer-portal"])
68964
+ .cp-waitlist-card
68965
+ .cp-card-header {
68966
+ flex-direction: column-reverse;
68967
+ }
68968
+
68969
+ :where(.theme-scope)
68970
+ :where([data-block="customer-portal"])
68971
+ .cp-waitlist-card
68972
+ .cp-card-actions {
68973
+ align-items: stretch;
68974
+ flex-direction: column;
68975
+ }
68976
+
68977
+ :where(.theme-scope)
68978
+ :where([data-block="customer-portal"])
68979
+ .cp-waitlist-card
68980
+ .cp-card-actions
68981
+ > * {
68982
+ justify-content: center;
68983
+ text-align: center;
68984
+ }
68985
+ }
68986
+ }
68987
+
68453
68988
  /* Badge */
68454
68989
  :where(.theme-scope) :where([data-block="customer-portal"]) .cp-badge {
68455
68990
  display: inline-flex;
@@ -68586,11 +69121,18 @@ const containerResponsiveThemeCss = `/*
68586
69121
  background: rgba(var(--tb-border), 0.2);
68587
69122
  }
68588
69123
 
68589
- :where(.theme-scope) :where([data-block="customer-portal"]) .cp-table tbody tr:last-child td {
69124
+ :where(.theme-scope)
69125
+ :where([data-block="customer-portal"])
69126
+ .cp-table
69127
+ tbody
69128
+ tr:last-child
69129
+ td {
68590
69130
  border-bottom: none;
68591
69131
  }
68592
69132
 
68593
- :where(.theme-scope) :where([data-block="customer-portal"]) :is(.cp-row--past, .cp-row--muted) {
69133
+ :where(.theme-scope)
69134
+ :where([data-block="customer-portal"])
69135
+ :is(.cp-row--past, .cp-row--muted) {
68594
69136
  opacity: 0.65;
68595
69137
  }
68596
69138
 
@@ -68603,7 +69145,9 @@ const containerResponsiveThemeCss = `/*
68603
69145
  line-height: 1.2;
68604
69146
  }
68605
69147
 
68606
- :where(.theme-scope) :where([data-block="customer-portal"]) .cp-row-title__badges {
69148
+ :where(.theme-scope)
69149
+ :where([data-block="customer-portal"])
69150
+ .cp-row-title__badges {
68607
69151
  margin-left: auto;
68608
69152
  display: flex;
68609
69153
  flex-wrap: wrap;
@@ -68611,7 +69155,9 @@ const containerResponsiveThemeCss = `/*
68611
69155
  gap: 0.375rem;
68612
69156
  }
68613
69157
 
68614
- :where(.theme-scope) :where([data-block="customer-portal"]) .cp-row-title__text {
69158
+ :where(.theme-scope)
69159
+ :where([data-block="customer-portal"])
69160
+ .cp-row-title__text {
68615
69161
  min-width: 0;
68616
69162
  }
68617
69163
 
@@ -68631,12 +69177,16 @@ const containerResponsiveThemeCss = `/*
68631
69177
  line-height: 1.35;
68632
69178
  }
68633
69179
 
68634
- :where(.theme-scope) :where([data-block="customer-portal"]) .cp-row-note--success {
69180
+ :where(.theme-scope)
69181
+ :where([data-block="customer-portal"])
69182
+ .cp-row-note--success {
68635
69183
  border-left-color: rgb(var(--tb-success));
68636
69184
  color: rgb(var(--tb-success));
68637
69185
  }
68638
69186
 
68639
- :where(.theme-scope) :where([data-block="customer-portal"]) .cp-row-note--error {
69187
+ :where(.theme-scope)
69188
+ :where([data-block="customer-portal"])
69189
+ .cp-row-note--error {
68640
69190
  border-left-color: rgb(var(--tb-destructive));
68641
69191
  color: rgb(var(--tb-destructive));
68642
69192
  }
@@ -68655,16 +69205,23 @@ const containerResponsiveThemeCss = `/*
68655
69205
  white-space: nowrap;
68656
69206
  }
68657
69207
 
68658
- :where(.theme-scope) :where([data-block="customer-portal"]) .cp-col-actions .btn-sm {
69208
+ :where(.theme-scope)
69209
+ :where([data-block="customer-portal"])
69210
+ .cp-col-actions
69211
+ .btn-sm {
68659
69212
  white-space: nowrap;
68660
69213
  }
68661
69214
 
68662
- :where(.theme-scope) :where([data-block="customer-portal"]) .cp-row-title__link {
69215
+ :where(.theme-scope)
69216
+ :where([data-block="customer-portal"])
69217
+ .cp-row-title__link {
68663
69218
  color: inherit;
68664
69219
  text-decoration: none;
68665
69220
  }
68666
69221
 
68667
- :where(.theme-scope) :where([data-block="customer-portal"]) .cp-row-title__link:hover {
69222
+ :where(.theme-scope)
69223
+ :where([data-block="customer-portal"])
69224
+ .cp-row-title__link:hover {
68668
69225
  text-decoration: underline;
68669
69226
  text-decoration-thickness: 2px;
68670
69227
  text-underline-offset: 2px;
@@ -68686,7 +69243,9 @@ const containerResponsiveThemeCss = `/*
68686
69243
  }
68687
69244
 
68688
69245
  /* Profile actions */
68689
- :where(.theme-scope) :where([data-block="customer-portal"]) .cp-profile__actions {
69246
+ :where(.theme-scope)
69247
+ :where([data-block="customer-portal"])
69248
+ .cp-profile__actions {
68690
69249
  display: flex;
68691
69250
  gap: 0.75rem;
68692
69251
  margin-top: 1rem;
@@ -68753,28 +69312,39 @@ const containerResponsiveThemeCss = `/*
68753
69312
  gap: 0.375rem;
68754
69313
  }
68755
69314
 
68756
- :where(.theme-scope) :where([data-block="customer-portal"]) .cp-guest-edit-row__index {
69315
+ :where(.theme-scope)
69316
+ :where([data-block="customer-portal"])
69317
+ .cp-guest-edit-row__index {
68757
69318
  font-size: 0.75rem;
68758
69319
  font-weight: 500;
68759
69320
  color: var(--cp-muted);
68760
69321
  }
68761
69322
 
68762
- :where(.theme-scope) :where([data-block="customer-portal"]) .cp-guest-edit-row__fields {
69323
+ :where(.theme-scope)
69324
+ :where([data-block="customer-portal"])
69325
+ .cp-guest-edit-row__fields {
68763
69326
  display: flex;
68764
69327
  gap: 0.5rem;
68765
69328
  }
68766
69329
 
68767
- :where(.theme-scope) :where([data-block="customer-portal"]) .cp-guest-edit-row__fields input {
69330
+ :where(.theme-scope)
69331
+ :where([data-block="customer-portal"])
69332
+ .cp-guest-edit-row__fields
69333
+ input {
68768
69334
  flex: 1;
68769
69335
  min-width: 0;
68770
69336
  }
68771
69337
 
68772
- :where(.theme-scope) :where([data-block="customer-portal"]) .cp-guest-edit-row__error {
69338
+ :where(.theme-scope)
69339
+ :where([data-block="customer-portal"])
69340
+ .cp-guest-edit-row__error {
68773
69341
  font-size: 0.75rem;
68774
69342
  color: var(--cp-error);
68775
69343
  }
68776
69344
 
68777
- :where(.theme-scope) :where([data-block="customer-portal"]) .cp-guests__actions {
69345
+ :where(.theme-scope)
69346
+ :where([data-block="customer-portal"])
69347
+ .cp-guests__actions {
68778
69348
  display: flex;
68779
69349
  gap: 0.5rem;
68780
69350
  margin-top: 0.5rem;
@@ -68788,13 +69358,18 @@ const containerResponsiveThemeCss = `/*
68788
69358
  }
68789
69359
 
68790
69360
  /* In the actions modal, tiles sit on a surface modal, so use "background" for contrast. */
68791
- :where(.theme-scope) :where([data-block="customer-portal"]) .cp-actions-list :where(.rb-tile) {
69361
+ :where(.theme-scope)
69362
+ :where([data-block="customer-portal"])
69363
+ .cp-actions-list
69364
+ :where(.rb-tile) {
68792
69365
  --rb-event-tile-bg: rgb(var(--tb-background));
68793
69366
  --rb-event-tile-border: rgb(var(--tb-border));
68794
69367
  }
68795
69368
 
68796
69369
  /* Actions trigger: icon-only kebab button */
68797
- :where(.theme-scope) :where([data-block="customer-portal"]) .cp-actions-trigger.btn-sm {
69370
+ :where(.theme-scope)
69371
+ :where([data-block="customer-portal"])
69372
+ .cp-actions-trigger.btn-sm {
68798
69373
  padding: 0.35rem !important;
68799
69374
  line-height: 1 !important;
68800
69375
  min-width: 32px;
@@ -68818,17 +69393,24 @@ const containerResponsiveThemeCss = `/*
68818
69393
  gap: 0.25rem;
68819
69394
  }
68820
69395
 
68821
- :where(.theme-scope) :where([data-block="customer-portal"]) .cp-action-tile__title {
69396
+ :where(.theme-scope)
69397
+ :where([data-block="customer-portal"])
69398
+ .cp-action-tile__title {
68822
69399
  font-weight: 600;
68823
69400
  font-size: 0.9375rem;
68824
69401
  }
68825
69402
 
68826
- :where(.theme-scope) :where([data-block="customer-portal"]) .cp-action-tile__desc {
69403
+ :where(.theme-scope)
69404
+ :where([data-block="customer-portal"])
69405
+ .cp-action-tile__desc {
68827
69406
  font-size: 0.875rem;
68828
69407
  line-height: 1.35;
68829
69408
  }
68830
69409
 
68831
- :where(.theme-scope) :where([data-block="customer-portal"]) .cp-action-tile--danger .cp-action-tile__title {
69410
+ :where(.theme-scope)
69411
+ :where([data-block="customer-portal"])
69412
+ .cp-action-tile--danger
69413
+ .cp-action-tile__title {
68832
69414
  color: rgb(var(--tb-destructive));
68833
69415
  }
68834
69416
 
@@ -68850,7 +69432,9 @@ const containerResponsiveThemeCss = `/*
68850
69432
  text-decoration: underline;
68851
69433
  }
68852
69434
 
68853
- :where(.theme-scope) :where([data-block="customer-portal"]) .cp-btn--link:hover {
69435
+ :where(.theme-scope)
69436
+ :where([data-block="customer-portal"])
69437
+ .cp-btn--link:hover {
68854
69438
  color: var(--cp-primary-hover);
68855
69439
  }
68856
69440
 
@@ -68889,34 +69473,48 @@ const containerResponsiveThemeCss = `/*
68889
69473
  margin-top: 0.75rem;
68890
69474
  }
68891
69475
 
68892
- :where(.theme-scope) :where([data-block="customer-portal"]) .cp-cancel-confirm__title {
69476
+ :where(.theme-scope)
69477
+ :where([data-block="customer-portal"])
69478
+ .cp-cancel-confirm__title {
68893
69479
  font-weight: 600;
68894
69480
  margin-bottom: 0.5rem;
68895
69481
  }
68896
69482
 
68897
- :where(.theme-scope) :where([data-block="customer-portal"]) .cp-cancel-confirm__message {
69483
+ :where(.theme-scope)
69484
+ :where([data-block="customer-portal"])
69485
+ .cp-cancel-confirm__message {
68898
69486
  margin-bottom: 0.25rem;
68899
69487
  }
68900
69488
 
68901
- :where(.theme-scope) :where([data-block="customer-portal"]) .cp-cancel-confirm__warning {
69489
+ :where(.theme-scope)
69490
+ :where([data-block="customer-portal"])
69491
+ .cp-cancel-confirm__warning {
68902
69492
  margin-bottom: 0.75rem;
68903
69493
  }
68904
69494
 
68905
- :where(.theme-scope) :where([data-block="customer-portal"]) .cp-cancel-confirm__actions {
69495
+ :where(.theme-scope)
69496
+ :where([data-block="customer-portal"])
69497
+ .cp-cancel-confirm__actions {
68906
69498
  display: flex;
68907
69499
  gap: 0.75rem;
68908
69500
  }
68909
69501
 
68910
69502
  /* Membership actions */
68911
- :where(.theme-scope) :where([data-block="customer-portal"]) .cp-membership-actions {
69503
+ :where(.theme-scope)
69504
+ :where([data-block="customer-portal"])
69505
+ .cp-membership-actions {
68912
69506
  margin-top: 0.75rem;
68913
69507
  }
68914
69508
 
68915
- :where(.theme-scope) :where([data-block="customer-portal"]) .cp-section-actions {
69509
+ :where(.theme-scope)
69510
+ :where([data-block="customer-portal"])
69511
+ .cp-section-actions {
68916
69512
  margin-top: 1rem;
68917
69513
  }
68918
69514
 
68919
- :where(.theme-scope) :where([data-block="customer-portal"]) .cp-card-subtitle--spaced {
69515
+ :where(.theme-scope)
69516
+ :where([data-block="customer-portal"])
69517
+ .cp-card-subtitle--spaced {
68920
69518
  margin-top: 0.75rem;
68921
69519
  }
68922
69520
 
@@ -68940,9 +69538,18 @@ const containerResponsiveThemeCss = `/*
68940
69538
  display: none;
68941
69539
  }
68942
69540
 
68943
- :where(.theme-scope) :where([data-block="customer-portal"]) .cp-table :is(th, td).cp-col-guests,
68944
- :where(.theme-scope) :where([data-block="customer-portal"]) .cp-table :is(th, td).cp-col-tickets,
68945
- :where(.theme-scope) :where([data-block="customer-portal"]) .cp-table :is(th, td).cp-col-actions {
69541
+ :where(.theme-scope)
69542
+ :where([data-block="customer-portal"])
69543
+ .cp-table
69544
+ :is(th, td).cp-col-guests,
69545
+ :where(.theme-scope)
69546
+ :where([data-block="customer-portal"])
69547
+ .cp-table
69548
+ :is(th, td).cp-col-tickets,
69549
+ :where(.theme-scope)
69550
+ :where([data-block="customer-portal"])
69551
+ .cp-table
69552
+ :is(th, td).cp-col-actions {
68946
69553
  display: none;
68947
69554
  }
68948
69555
 
@@ -68951,24 +69558,34 @@ const containerResponsiveThemeCss = `/*
68951
69558
  }
68952
69559
 
68953
69560
  /* Make the cell a positioning context for the kebab */
68954
- :where(.theme-scope) :where([data-block="customer-portal"]) .cp-row > td:first-child {
69561
+ :where(.theme-scope)
69562
+ :where([data-block="customer-portal"])
69563
+ .cp-row
69564
+ > td:first-child {
68955
69565
  position: relative;
68956
69566
  padding-right: 2.5rem;
68957
69567
  }
68958
69568
 
68959
69569
  /* Position kebab in top-right of the cell */
68960
- :where(.theme-scope) :where([data-block="customer-portal"]) .cp-row-mobile-actions {
69570
+ :where(.theme-scope)
69571
+ :where([data-block="customer-portal"])
69572
+ .cp-row-mobile-actions {
68961
69573
  position: absolute;
68962
69574
  top: 0.5rem;
68963
69575
  right: 0.5rem;
68964
69576
  margin-top: 0;
68965
69577
  }
68966
69578
 
68967
- :where(.theme-scope) :where([data-block="customer-portal"]) .cp-row-mobile-actions .btn-sm {
69579
+ :where(.theme-scope)
69580
+ :where([data-block="customer-portal"])
69581
+ .cp-row-mobile-actions
69582
+ .btn-sm {
68968
69583
  width: auto;
68969
69584
  }
68970
69585
 
68971
- :where(.theme-scope) :where([data-block="customer-portal"]) .cp-profile__edit {
69586
+ :where(.theme-scope)
69587
+ :where([data-block="customer-portal"])
69588
+ .cp-profile__edit {
68972
69589
  align-self: stretch;
68973
69590
  }
68974
69591
  }
@@ -69416,6 +70033,47 @@ const containerResponsiveThemeCss = `/*
69416
70033
  gap: 0.25rem;
69417
70034
  }
69418
70035
 
70036
+ /* Topic choices (visitor picks what to hear about). Same treatment as the
70037
+ form block's .fb-fieldset / .fb-inline, defined here because the newsletter
70038
+ form also renders inside contact-newsletter and the site footer. */
70039
+ :where(.theme-scope) .newsletter-topics {
70040
+ display: flex;
70041
+ flex-direction: column;
70042
+ gap: 0.5rem;
70043
+ border: none;
70044
+ padding: 0;
70045
+ margin: 0;
70046
+ min-width: 0;
70047
+ }
70048
+
70049
+ :where(.theme-scope) .newsletter-topics > legend {
70050
+ padding: 0;
70051
+ margin-bottom: 0.25rem;
70052
+ }
70053
+
70054
+ :where(.theme-scope) .newsletter-topic-choice {
70055
+ display: flex;
70056
+ align-items: center;
70057
+ gap: 0.5rem;
70058
+ }
70059
+
70060
+ /* Error panel and field notes. The form block scopes these to its own
70061
+ data-block, so the newsletter form (which also renders in the footer)
70062
+ needs its own copy of the treatment. */
70063
+ :where(.theme-scope) .newsletter-form .fb-error:not([data-field-validation-message]) {
70064
+ background-color: var(--fb-error-bg);
70065
+ color: var(--fb-error-text);
70066
+ border: 1px solid var(--fb-error-border);
70067
+ border-radius: var(--rb-block-radius);
70068
+ padding: 1rem;
70069
+ font-size: 0.875rem;
70070
+ }
70071
+
70072
+ :where(.theme-scope) .newsletter-form [data-field-validation-message] {
70073
+ font-size: 0.875rem;
70074
+ color: var(--fb-error-text);
70075
+ }
70076
+
69419
70077
  /* Required indicator */
69420
70078
  :where(.theme-scope) .newsletter-required {
69421
70079
  color: rgb(var(--tb-primary));
@@ -69465,6 +70123,10 @@ const containerResponsiveThemeCss = `/*
69465
70123
  flex-shrink: 0;
69466
70124
  }
69467
70125
 
70126
+ :where(.theme-scope) .newsletter-inline .newsletter-topics {
70127
+ flex-basis: 100%;
70128
+ }
70129
+
69468
70130
  /* Mobile fallback for inline variant */
69469
70131
  @container rb-site (max-width: 640px) {
69470
70132
  @scope ([data-rb-responsive-mode="container"]) to (:scope [data-rb-responsive-mode]) {
@@ -71780,6 +72442,15 @@ z$1.object({
71780
72442
  }).optional(),
71781
72443
  overrides: z$1.record(z$1.string(), z$1.string()).optional()
71782
72444
  }).passthrough();
72445
+ z$1.object({
72446
+ palette: paletteColorsSchema,
72447
+ paletteMode: paletteModeSchema,
72448
+ typography: z$1.object({
72449
+ headingFamily: z$1.string().trim().min(1),
72450
+ bodyFamily: z$1.string().trim().min(1)
72451
+ }).strict(),
72452
+ corners
72453
+ }).strict();
71783
72454
  //#endregion
71784
72455
  //#region src/rendering/blocks-theme-runtime.ts
71785
72456
  function parseBlocksTheme(theme) {
@@ -71962,7 +72633,7 @@ function PageContent(props) {
71962
72633
  previewToken,
71963
72634
  resolvedData,
71964
72635
  bookingOfferingPresets: bookingOfferingPresets ?? [],
71965
- mailingList,
72636
+ mailingList: mailingList ?? dataContext?.mailingList,
71966
72637
  bookingTimeZone: resolveSdkBookingTimeZone(bookingTimeZone),
71967
72638
  routes: routeMap,
71968
72639
  pagesByIdentifier,
@@ -73813,9 +74484,11 @@ function convertPageResponseBlock(block) {
73813
74484
  if (typeof block.id !== "string" && block.id !== null) throw new Error(`Invalid block id in page: expected string or null, got ${typeof block.id}`);
73814
74485
  if (typeof block.kind !== "string") throw new Error(`Invalid block kind in page: expected string, got ${typeof block.kind}`);
73815
74486
  if (typeof block.purpose !== "string") throw new Error(`Invalid block purpose in page: expected string, got ${typeof block.purpose}`);
74487
+ 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}`);
73816
74488
  const admission = readInvalidBlockAdmission(block.admission);
73817
74489
  return {
73818
74490
  id: block.id,
74491
+ ...block.contentVersionId !== void 0 ? { contentVersionId: block.contentVersionId } : {},
73819
74492
  kind: block.kind,
73820
74493
  purpose: block.purpose,
73821
74494
  content: sanitizeSdkRuntimeBlockContent(block.kind, readContentRecord(block.content) ?? {}),
@@ -73846,6 +74519,7 @@ function buildRenderablePageOutline(input) {
73846
74519
  function admitSdkRuntimePageBlock(block, customBlocks) {
73847
74520
  const base = {
73848
74521
  id: block.id,
74522
+ ...block.contentVersionId !== void 0 ? { contentVersionId: block.contentVersionId } : {},
73849
74523
  kind: block.kind,
73850
74524
  purpose: block.purpose,
73851
74525
  ...block.bindings ? { bindings: block.bindings } : {}
@@ -75591,6 +76265,14 @@ const PUBLIC_BOOKING_AVAILABILITY_ENDPOINT_DEFINITIONS = defineEndpointDefinitio
75591
76265
  auth: "public",
75592
76266
  responseKind: "json"
75593
76267
  },
76268
+ getPublicBookingServiceBySlug: {
76269
+ path: "/public/bookings/services/by-slug/{slug}",
76270
+ method: "GET",
76271
+ revalidate: publicReadFreshnessSeconds("getPublicBookingService"),
76272
+ tags: [TAG_TEMPLATES.publicBookingServices],
76273
+ auth: "public",
76274
+ responseKind: "json"
76275
+ },
75594
76276
  getPublicBookingResourcesReference: {
75595
76277
  path: "/public/bookings/resources/reference",
75596
76278
  method: "GET",
@@ -76143,16 +76825,110 @@ const PUBLIC_READ_ENDPOINT_DEFINITIONS = defineEndpointDefinitions({
76143
76825
  responseKind: "json"
76144
76826
  }
76145
76827
  });
76828
+ //#endregion
76829
+ //#region ../api/src/publicOnboardingAttemptEndpointDefinitions.ts
76830
+ /**
76831
+ * The anonymous onboarding attempt, addressed by its opaque resume token.
76832
+ *
76833
+ * Every route here is reached before there is an account, so none of them can
76834
+ * be scoped to a site or a user: the token is the whole credential. They are
76835
+ * kept together so that stays obvious.
76836
+ */
76837
+ const PUBLIC_ONBOARDING_ATTEMPT_ENDPOINT_DEFINITIONS = defineEndpointDefinitions({
76838
+ createPublicOnboardingAttempt: {
76839
+ path: "/public/onboarding/attempts",
76840
+ method: "POST",
76841
+ auth: "public",
76842
+ errors: [],
76843
+ responseKind: "json"
76844
+ },
76845
+ createPublicOnboardingLogoUploadUrl: {
76846
+ path: "/public/onboarding/attempts/{attemptToken}/logo-upload-url",
76847
+ method: "POST",
76848
+ auth: "public",
76849
+ errors: [],
76850
+ responseKind: "json"
76851
+ },
76852
+ uploadPublicOnboardingLogo: {
76853
+ path: "/public/onboarding/attempts/{attemptToken}/logo",
76854
+ method: "POST",
76855
+ auth: "public",
76856
+ errors: [],
76857
+ responseKind: "json"
76858
+ },
76859
+ getPublicOnboardingAttempt: {
76860
+ path: "/public/onboarding/attempts/{attemptToken}",
76861
+ method: "GET",
76862
+ auth: "public",
76863
+ errors: [],
76864
+ responseKind: "json"
76865
+ },
76866
+ getPublicOnboardingAttemptProgress: {
76867
+ path: "/public/onboarding/attempts/{attemptToken}/status",
76868
+ method: "GET",
76869
+ auth: "public",
76870
+ errors: [],
76871
+ responseKind: "json"
76872
+ },
76873
+ updatePublicOnboardingAttempt: {
76874
+ path: "/public/onboarding/attempts/{attemptToken}",
76875
+ method: "PATCH",
76876
+ auth: "public",
76877
+ errors: [],
76878
+ responseKind: "json"
76879
+ },
76880
+ runPublicOnboardingAttempt: {
76881
+ path: "/public/onboarding/attempts/{attemptToken}/run",
76882
+ method: "POST",
76883
+ auth: "public",
76884
+ errors: [],
76885
+ responseKind: "json"
76886
+ },
76887
+ resendPublicOnboardingAttemptConfirmation: {
76888
+ path: "/public/onboarding/attempts/{attemptToken}/resend-confirmation",
76889
+ method: "POST",
76890
+ auth: "public",
76891
+ errors: [],
76892
+ responseKind: "json"
76893
+ }
76894
+ });
76895
+ //#endregion
76896
+ //#region ../api/src/billingEndpointDefinitions.ts
76897
+ const BILLING_ENDPOINT_DEFINITIONS = defineEndpointDefinitions({
76898
+ adminChangePlan: {
76899
+ path: "/admin/billing/plan",
76900
+ method: "POST",
76901
+ tags: ["admin", "billing"],
76902
+ auth: "admin",
76903
+ responseKind: "json"
76904
+ },
76905
+ changePlan: {
76906
+ path: "/billing/plan/change",
76907
+ method: "POST",
76908
+ tags: ["billing"],
76909
+ auth: "user",
76910
+ responseKind: "json"
76911
+ },
76912
+ createBillingPortalSession: {
76913
+ path: "/billing/portal/session",
76914
+ method: "POST",
76915
+ tags: ["billing"],
76916
+ auth: "user",
76917
+ responseKind: "json"
76918
+ }
76919
+ });
76146
76920
  ({
76147
76921
  ...ACCOUNT_ENDPOINT_DEFINITIONS,
76922
+ ...PUBLIC_ONBOARDING_ATTEMPT_ENDPOINT_DEFINITIONS,
76148
76923
  ...PUBLIC_EVENT_ENDPOINT_DEFINITIONS,
76149
76924
  ...GIFTING_ENDPOINT_DEFINITIONS,
76150
- ...PUBLIC_READ_ENDPOINT_DEFINITIONS
76925
+ ...PUBLIC_READ_ENDPOINT_DEFINITIONS,
76926
+ ...BILLING_ENDPOINT_DEFINITIONS
76151
76927
  }), 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, {
76152
76928
  ...NEWSLETTER_ENDPOINT_DEFINITIONS,
76153
76929
  ...APPOINTMENT_ENDPOINT_DEFINITIONS,
76154
76930
  ...EVENT_SERIES_REGISTRATION_ENDPOINT_DEFINITIONS
76155
- }, 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 };
76931
+ }, 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 };
76156
76932
  z$1.object({ refreshToken: z$1.string().min(1).max(4096) }).strict();
76157
76933
  z$1.object({
76158
76934
  accessToken: z$1.string().min(1).max(4096),
@@ -76709,7 +77485,17 @@ const riverbankSiteConfigInputSchema = z$1.object({
76709
77485
  z$1.object({
76710
77486
  config: riverbankSiteConfigInputSchema,
76711
77487
  forceContentTypes: z$1.boolean().optional(),
76712
- mode: z$1.enum(["apply", "preview"]).optional()
77488
+ mode: z$1.enum(["apply", "preview"]).optional(),
77489
+ expectedMailingListProviderScope: z$1.unknown().transform((value, ctx) => {
77490
+ if (value === void 0) return void 0;
77491
+ const parsed = parseMailingListProviderScope(value);
77492
+ if (parsed.ok) return parsed.value;
77493
+ ctx.addIssue({
77494
+ code: "custom",
77495
+ message: "Invalid mailing-list provider scope"
77496
+ });
77497
+ return z$1.NEVER;
77498
+ }).optional()
76713
77499
  }).strict();
76714
77500
  //#endregion
76715
77501
  //#region ../api/src/sdkThemeWire.ts