@riverbankcms/sdk 0.139.0 → 0.140.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 (196) hide show
  1. package/README.md +1 -1
  2. package/dist/{PreviewEditorSidebar-BDeenhi3.mjs → PreviewEditorSidebar-CUyTzd5z.mjs} +4 -4
  3. package/dist/{PreviewEditorUI-DSRhgjF5.mjs → PreviewEditorUI-Agkw4v5i.mjs} +3 -3
  4. package/dist/{PreviewQueryProvider-D2K8GLUG.mjs → PreviewQueryProvider-CN0ewic5.mjs} +1 -1
  5. package/dist/{SdkPreviewModeRuntime-CL7wSnYu.mjs → SdkPreviewModeRuntime-DdbeAdS8.mjs} +22 -8
  6. package/dist/{SiteChromeCustomizeContext-BhDn-5ir.mjs → SiteChromeCustomizeContext-CqGOz-Kv.mjs} +2053 -1110
  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 +8 -3
  20. package/dist/_dts/api/src/endpoints.d.ts +93 -64
  21. package/dist/_dts/api/src/event-destination-policy.d.ts +2 -1
  22. package/dist/_dts/api/src/footerSettings.d.ts +9 -6
  23. package/dist/_dts/api/src/index.d.ts +5 -6
  24. package/dist/_dts/api/src/indexCoreTypes.d.ts +1 -1
  25. package/dist/_dts/api/src/indexExtendedTypes.d.ts +1 -1
  26. package/dist/_dts/api/src/mailingListIntegration.d.ts +8 -2
  27. package/dist/_dts/api/src/navigation/dashboardSettingsNav.d.ts +1 -1
  28. package/dist/_dts/api/src/navigation/types.d.ts +1 -1
  29. package/dist/_dts/api/src/onboarding/confirmationResend.d.ts +25 -0
  30. package/dist/_dts/api/src/onboarding/surfaceData.d.ts +32 -32
  31. package/dist/_dts/api/src/publicBookingAvailabilityEndpointDefinitions.d.ts +8 -0
  32. package/dist/_dts/api/src/publicExperience/commerceEndpoints.d.ts +1 -0
  33. package/dist/_dts/api/src/publicExperience/eventEndpoints.d.ts +11 -3
  34. package/dist/_dts/api/src/publicExperience/sharedTypes.d.ts +3 -29
  35. package/dist/_dts/api/src/publicOnboardingAttemptEndpointDefinitions.d.ts +65 -0
  36. package/dist/_dts/api/src/saveOutcome.d.ts +20 -0
  37. package/dist/_dts/api/src/sdkContracts.d.ts +3 -22
  38. package/dist/_dts/api/src/sdkPushContracts.d.ts +18 -0
  39. package/dist/_dts/api/src/sdkThemeWire.d.ts +44 -44
  40. package/dist/_dts/api/src/settings/permissions.d.ts +12 -0
  41. package/dist/_dts/api/src/siteManagementEndpoints.d.ts +9 -5
  42. package/dist/_dts/api/src/siteOnboarding.d.ts +2 -9
  43. package/dist/_dts/api/src/sitePlatformEndpoints.d.ts +2 -4
  44. package/dist/_dts/api/src/siteRuntimeEndpoints.d.ts +3 -1
  45. package/dist/_dts/api/src/siteSettings.d.ts +20 -7
  46. package/dist/_dts/api/src/types.d.ts +77 -77
  47. package/dist/_dts/api/src/wholeSeriesRuns.d.ts +2 -37
  48. package/dist/_dts/billing/src/membership/index.d.ts +3 -0
  49. package/dist/_dts/billing/src/plans/types.d.ts +3 -0
  50. package/dist/_dts/billing/src/site-arrangements.d.ts +14 -3
  51. package/dist/_dts/blocks/src/contracts/proof-block-islands.d.ts +16 -4
  52. package/dist/_dts/blocks/src/pageRenderAdmission.d.ts +2 -0
  53. package/dist/_dts/blocks/src/pageRendererContracts.d.ts +5 -0
  54. package/dist/_dts/blocks/src/portal/types.d.ts +2 -4
  55. package/dist/_dts/blocks/src/portal/waitlist-types.d.ts +35 -0
  56. package/dist/_dts/blocks/src/system/blocks/event-registration.d.ts +2 -0
  57. package/dist/_dts/blocks/src/system/blocks/events/shared/schemas.d.ts +42 -0
  58. package/dist/_dts/blocks/src/system/blocks/events/shared/types.d.ts +4 -0
  59. package/dist/_dts/blocks/src/system/data/index.d.ts +2 -2
  60. package/dist/_dts/blocks/src/system/data/prefetchBlockData.d.ts +2 -1
  61. package/dist/_dts/blocks/src/system/data/types.d.ts +9 -0
  62. package/dist/_dts/blocks/src/system/registry.d.ts +1 -0
  63. package/dist/_dts/blocks/src/system/runtime/api/client.d.ts +0 -28
  64. package/dist/_dts/blocks/src/system/runtime/api/index.d.ts +1 -1
  65. package/dist/_dts/blocks/src/system/runtime/api/types/events.d.ts +7 -3
  66. package/dist/_dts/blocks/src/system/runtime/api/types/portal.d.ts +1 -1
  67. package/dist/_dts/blocks/src/system/runtime/api/types/waitlist-claims.d.ts +7 -2
  68. package/dist/_dts/blocks/src/system/runtime/components/registry.client.d.ts +30 -6
  69. package/dist/_dts/blocks/src/system/runtime/components/runtime-backed-blocks.d.ts +15 -3
  70. package/dist/_dts/blocks/src/system/runtime/nodes/appointment-services.d.ts +43 -0
  71. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/EventRegistrationSurface.d.ts +1 -2
  72. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/TicketSelectionStep.d.ts +2 -0
  73. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/checkoutRecovery.d.ts +14 -0
  74. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/eventSourceRecovery.d.ts +56 -0
  75. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/types.d.ts +6 -8
  76. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/useCheckoutRecovery.d.ts +8 -0
  77. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/useEventRegistrationSubmit.d.ts +8 -7
  78. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/useEventRegistrationWizard.d.ts +10 -2
  79. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/useEventSourceRecovery.d.ts +18 -0
  80. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration.client.d.ts +1 -1
  81. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration.interactive.d.ts +24 -6
  82. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration.server.d.ts +4 -2
  83. package/dist/_dts/blocks/src/system/runtime/nodes/newsletter-form.interactive.d.ts +6 -0
  84. package/dist/_dts/blocks/src/system/runtime/nodes/newsletter-form.types.d.ts +1 -0
  85. package/dist/_dts/blocks/src/system/runtime/resolver.d.ts +1 -0
  86. package/dist/_dts/blocks/src/system/runtime/shared/components/index.d.ts +2 -6
  87. package/dist/_dts/blocks/src/system/runtime/shared/index.d.ts +2 -2
  88. package/dist/_dts/blocks/src/system/runtime/shared/useWaitlistClaim.d.ts +2 -0
  89. package/dist/_dts/commerce/src/purchase/event-registration-errors.d.ts +4 -0
  90. package/dist/_dts/commerce/src/purchase/orderItemMetadata.d.ts +27 -4
  91. package/dist/_dts/content-editor/src/controller/EntryControllerProvider.d.ts +2 -1
  92. package/dist/_dts/content-editor/src/hooks/useBlockAutosave.d.ts +3 -1
  93. package/dist/_dts/content-editor/src/useFooterComposerState.d.ts +3 -0
  94. package/dist/_dts/core/src/branded.d.ts +0 -8
  95. package/dist/_dts/core/src/index.d.ts +1 -0
  96. package/dist/_dts/core/src/mailing-list-setup-parser.d.ts +1 -1
  97. package/dist/_dts/core/src/mailing-list-setup.d.ts +14 -1
  98. package/dist/_dts/core/src/mailing-list-submission.d.ts +7 -27
  99. package/dist/_dts/core/src/participants.d.ts +2 -29
  100. package/dist/_dts/core/src/public-experience.d.ts +4 -0
  101. package/dist/_dts/core/src/public-profile.d.ts +27 -1
  102. package/dist/_dts/core/src/site-route-target.d.ts +9 -2
  103. package/dist/_dts/db/src/generated/supabase/database.types.d.ts +293 -606
  104. package/dist/_dts/editor-blocks/src/widgets/mailing-list-targeting/MailingListGlobalSettingsSummary.d.ts +10 -0
  105. package/dist/_dts/editor-blocks/src/widgets/mailing-list-targeting/MailingListTargetingField.d.ts +3 -2
  106. package/dist/_dts/editor-blocks/src/widgets/mailing-list-targeting/context.d.ts +3 -2
  107. package/dist/_dts/editor-blocks/src/widgets/mailing-list-targeting/loaders.d.ts +3 -2
  108. package/dist/_dts/editor-blocks/src/widgets/mailing-list-targeting/targetingState.d.ts +19 -0
  109. package/dist/_dts/sdk/src/public-api/contracts.d.ts +14 -20
  110. package/dist/_dts/sdk/src/rendering/blocks-page-renderer.d.ts +2 -0
  111. package/dist/_dts/sdk/src/rendering/components/pageShared.d.ts +2 -0
  112. package/dist/_dts/sdk/src/rendering/helpers/pageRuntimeSupport.d.ts +7 -1
  113. package/dist/_dts/sdk/src/rendering/helpers/templateContent.d.ts +1 -0
  114. package/dist/_dts/sdk/src/version.d.ts +1 -1
  115. package/dist/_dts/theme-core/src/accordions/types.d.ts +3 -3
  116. package/dist/_dts/theme-core/src/cards/types.d.ts +21 -21
  117. package/dist/_dts/theme-core/src/generated/containerResponsiveThemeCss.d.ts +1 -1
  118. package/dist/_dts/theme-core/src/header/interactionPalette.d.ts +8 -2
  119. package/dist/_dts/theme-core/src/header/legacyHeaderVariant.d.ts +2 -2
  120. package/dist/_dts/theme-core/src/inputs/types.d.ts +2 -2
  121. package/dist/_dts/theme-core/src/mock-themes/all.d.ts +54 -54
  122. package/dist/_dts/theme-core/src/runtime/buildThemeRuntimeFromBridge.d.ts +1 -4
  123. package/dist/_dts/theme-core/src/schema.d.ts +84 -84
  124. package/dist/_dts/theme-core/src/shared/componentStyles.d.ts +1 -1
  125. package/dist/_dts/theme-core/src/site-styles/backgroundAppearance.d.ts +2 -2
  126. package/dist/_dts/theme-core/src/surfaces/foregroundInteraction.d.ts +77 -0
  127. package/dist/_dts/theme-core/src/surfaces/index.d.ts +1 -0
  128. package/dist/_dts/theme-core/src/typography/generateTypographyCss.d.ts +2 -2
  129. package/dist/_dts/ui/src/lib/use-delayed-flag.d.ts +9 -0
  130. package/dist/_dts/ui/src/pending-button.d.ts +10 -0
  131. package/dist/client/{BookingConsentAgreement-CZvTDtsK.mjs → BookingConsentAgreement-CuKa82V4.mjs} +4 -4
  132. package/dist/client/{DiscountCodeDisclosure-D-DsLCMU.mjs → DiscountCodeDisclosure-BbYieKWB.mjs} +1 -1
  133. package/dist/client/{EventCombined.client-dWqgd5ZO.mjs → EventCombined.client-LTfR1Aby.mjs} +6 -6
  134. package/dist/client/{EventListing.client-BMRa9IYp.mjs → EventListing.client-DUHpYSuo.mjs} +2 -2
  135. package/dist/client/{LeafletStaticMap-D21W9kBZ.mjs → LeafletStaticMap-CHRupL6m.mjs} +1 -1
  136. package/dist/client/{accordion-FxF_ta47.mjs → accordion-6HiIFxNL.mjs} +1 -1
  137. package/dist/client/{bookingForm-YnwW4TGw.mjs → bookingForm-Dlmid43H.mjs} +7 -7
  138. package/dist/client/bookings.mjs +325 -140
  139. package/dist/client/{carousel-vng7fFT5.mjs → carousel-DmkZRRq_.mjs} +2 -2
  140. package/dist/client/{carousel.client-59G_WMr4.mjs → carousel.client-DQTjCVQT.mjs} +1 -1
  141. package/dist/client/{cart-DEPDsjNk.mjs → cart-CIC24330.mjs} +3 -3
  142. package/dist/client/{checkout-CZRWu9rW.mjs → checkout-D1Zw9imo.mjs} +3 -3
  143. package/dist/client/{checkoutUrls-BuseL0dw.mjs → checkoutUrls-FL6lRkrt.mjs} +1 -1
  144. package/dist/client/client.mjs +1717 -882
  145. package/dist/client/{colorStyles-CrxJrPjJ.mjs → colorStyles-3013aRAY.mjs} +3 -1
  146. package/dist/client/{context-DvU_WUmd.mjs → context-Cy1OayHx.mjs} +6 -19
  147. package/dist/client/{dates-wnPMiRl5.mjs → dates-aDcfoLHr.mjs} +2 -2
  148. package/dist/client/{eventCalendar-BA3Q5L15.mjs → eventCalendar-FQxMPAjf.mjs} +8 -8
  149. package/dist/client/{eventCombined-51wgR-1R.mjs → eventCombined-Dr3ac6Hb.mjs} +3 -3
  150. package/dist/client/{eventDetails-modaetpm.mjs → eventDetails-D-AzUHFQ.mjs} +4 -4
  151. package/dist/client/{eventListing-D8t2J3Kv.mjs → eventListing-B3XxBf3i.mjs} +3 -3
  152. package/dist/client/{eventRegistration-CYqtkCE_.mjs → eventRegistration-I6EaokFD.mjs} +500 -152
  153. package/dist/client/{form-CBKXN5In.mjs → form-BbWckVWY.mjs} +3 -3
  154. package/dist/client/{headerSection-DylDqNrs.mjs → headerSection-C9qU4Y7x.mjs} +2 -2
  155. package/dist/client/hooks.mjs +445 -180
  156. package/dist/client/{locationMap-CvWrG0vZ.mjs → locationMap-CLCShvlG.mjs} +3 -3
  157. package/dist/client/{media-BOHuueS5.mjs → media-DHpfFwd3.mjs} +1 -1
  158. package/dist/client/{newsletterForm-Btwk70zw.mjs → newsletterForm-Briukxzi.mjs} +130 -87
  159. package/dist/client/{pricing-Uzw-GQ6Y.mjs → pricing-Copadu-2.mjs} +1 -1
  160. package/dist/client/{productDetail-JLcUYKnd.mjs → productDetail-oujlRd-r.mjs} +3 -3
  161. package/dist/client/{productList-FM0cbUzj.mjs → productList-BRiIRUcd.mjs} +3 -3
  162. package/dist/client/{propsDecoder-DYzafZb2.mjs → propsDecoder-CB2KS_ko.mjs} +130 -24
  163. package/dist/client/rendering/client.mjs +911 -400
  164. package/dist/client/rendering/islands.mjs +19 -19
  165. package/dist/client/rendering.mjs +1696 -818
  166. package/dist/client/{scrollToBlock-CvXszexS.mjs → scrollToBlock-B1IS1_ua.mjs} +1 -1
  167. package/dist/client/{shop-BIcjvy5a.mjs → shop-Vn6yNFED.mjs} +6 -6
  168. package/dist/client/{shop-commerce-BZQsy7xw.mjs → shop-commerce-BVTqipYp.mjs} +7 -7
  169. package/dist/client/{shop-commerce-store-D5V7XAb5.mjs → shop-commerce-store-BVnJVy7v.mjs} +1 -1
  170. package/dist/client/{shopShared-DowkXevB.mjs → shopShared-COIeK77T.mjs} +4 -4
  171. package/dist/client/{useEventFilters-oMoTw_JE.mjs → useEventFilters-DzIUcS9n.mjs} +7 -7
  172. package/dist/preview-next/before-render.mjs +119 -64
  173. package/dist/preview-next/client/runtime.mjs +4 -4
  174. package/dist/preview-next/keepAlive.mjs +119 -64
  175. package/dist/preview-next/middleware.mjs +119 -64
  176. package/dist/{previewAuthStore-COUyAKaX.mjs → previewAuthStore-Gjb6r6vz.mjs} +119 -64
  177. package/dist/{sdk-runtime-D4k2LSGF.mjs → sdk-runtime-CnCLvZRv.mjs} +2 -2
  178. package/dist/{separator-UGtpag4Z.mjs → separator-DKDRJ1oH.mjs} +1 -1
  179. package/dist/server/components.mjs +787 -323
  180. package/dist/server/config-validation.mjs +328 -79
  181. package/dist/server/config.mjs +332 -83
  182. package/dist/server/data.mjs +441 -180
  183. package/dist/server/index.mjs +126 -66
  184. package/dist/server/next.mjs +1031 -595
  185. package/dist/server/page-converter.mjs +183 -74
  186. package/dist/server/prebuild.mjs +1 -1
  187. package/dist/server/rendering/server.mjs +1068 -592
  188. package/dist/server/rendering.mjs +802 -324
  189. package/dist/server/routing.mjs +506 -214
  190. package/dist/server/server.mjs +468 -244
  191. package/dist/server/theme-bridge.mjs +433 -100
  192. package/dist/server/theme.mjs +8 -2
  193. package/dist/styles/index.css +237 -43
  194. package/package.json +1 -1
  195. package/dist/_dts/blocks/src/system/runtime/shared/components/BookingOptionCompactRow.d.ts +0 -29
  196. 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) {
@@ -4309,29 +4351,6 @@ function contrastRatio(hex1, hex2) {
4309
4351
  return (hi + .05) / (lo + .05);
4310
4352
  }
4311
4353
  //#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
4354
  //#region ../theme-core/src/tokens/colorTokenParts.ts
4336
4355
  function parseOpacityPercent(source) {
4337
4356
  const trimmed = source.trim();
@@ -4369,6 +4388,141 @@ function parseColorTokenParts(source) {
4369
4388
  opacityPercent
4370
4389
  };
4371
4390
  }
4391
+ const defaultThemeTokens = {
4392
+ color: {
4393
+ "background/base": "#ffffff",
4394
+ "background/elevated": "#f5f5f5",
4395
+ "surface/base": "#ffffff",
4396
+ "surface/subtle": "#f9f9fb",
4397
+ "surface/inverted": "#111111",
4398
+ "content/primary": "#111111",
4399
+ "content/secondary": "#3f3f46",
4400
+ "accent/primary": "#2563eb",
4401
+ "accent/secondary": "#1d4ed8",
4402
+ "border/base": "#e5e7eb"
4403
+ },
4404
+ typography: {
4405
+ "display/hero": {
4406
+ fontSize: "clamp(48px, 8vw, 96px)",
4407
+ lineHeight: "1.05",
4408
+ fontWeight: "700"
4409
+ },
4410
+ "display/section": {
4411
+ fontSize: "clamp(40px, 6vw, 72px)",
4412
+ lineHeight: "1.1",
4413
+ fontWeight: "700"
4414
+ },
4415
+ "heading/large": {
4416
+ fontSize: "clamp(32px, 4vw, 48px)",
4417
+ lineHeight: "1.2",
4418
+ fontWeight: "600"
4419
+ },
4420
+ "heading/medium": {
4421
+ fontSize: "clamp(24px, 3vw, 32px)",
4422
+ lineHeight: "1.25",
4423
+ fontWeight: "600"
4424
+ },
4425
+ "heading/small": {
4426
+ fontSize: "20px",
4427
+ lineHeight: "1.3",
4428
+ fontWeight: "600"
4429
+ },
4430
+ "body/normal": {
4431
+ fontSize: "16px",
4432
+ lineHeight: "1.6",
4433
+ fontWeight: "400"
4434
+ },
4435
+ "body/small": {
4436
+ fontSize: "14px",
4437
+ lineHeight: "1.5",
4438
+ fontWeight: "400"
4439
+ },
4440
+ caption: {
4441
+ fontSize: "12px",
4442
+ lineHeight: "1.4",
4443
+ fontWeight: "500"
4444
+ }
4445
+ },
4446
+ spacing: {
4447
+ none: "0px",
4448
+ "3xs": "4px",
4449
+ "2xs": "8px",
4450
+ xs: "12px",
4451
+ sm: "16px",
4452
+ md: "24px",
4453
+ lg: "32px",
4454
+ xl: "40px",
4455
+ "2xl": "56px",
4456
+ "3xl": "72px"
4457
+ },
4458
+ radius: {
4459
+ none: "0px",
4460
+ xs: "2px",
4461
+ sm: "4px",
4462
+ md: "8px",
4463
+ lg: "12px",
4464
+ pill: "999px",
4465
+ full: "9999px"
4466
+ },
4467
+ shadow: {
4468
+ none: "none",
4469
+ soft: "0px 2px 8px rgba(15, 23, 42, 0.08)",
4470
+ medium: "0px 6px 18px rgba(15, 23, 42, 0.12)",
4471
+ strong: "0px 12px 36px rgba(15, 23, 42, 0.16)"
4472
+ },
4473
+ palette: {
4474
+ surface: "#ffffff",
4475
+ "neutral-50": "#f9fafb",
4476
+ "neutral-900": "#111827",
4477
+ primary: "#2563eb",
4478
+ "primary-50": "#eff6ff",
4479
+ "primary-500": "#2563eb",
4480
+ "primary-900": "#1d4ed8",
4481
+ secondary: "#9333ea",
4482
+ "secondary-50": "#f3e8ff",
4483
+ "secondary-500": "#9333ea",
4484
+ "secondary-900": "#4c1d95",
4485
+ accent: "#f97316",
4486
+ "accent-50": "#fff7ed",
4487
+ "accent-500": "#f97316",
4488
+ "accent-900": "#7c2d12"
4489
+ }
4490
+ };
4491
+ /**
4492
+ * Project the expanded semantic palette into the token buckets consumed by
4493
+ * runtime transforms. Keep this mapping shared by full themes and the
4494
+ * tokens-only hosted-booking runtime so the two paths cannot drift.
4495
+ */
4496
+ function buildThemeTokens(palette) {
4497
+ const tokens = cloneThemeTokens(defaultThemeTokens);
4498
+ const paletteStrings = {};
4499
+ for (const [key, value] of Object.entries(palette)) if (typeof value === "string" && value.trim().length > 0) paletteStrings[key] = value;
4500
+ tokens.palette = paletteStrings;
4501
+ const resolveColor = (...keys) => {
4502
+ for (const key of keys) {
4503
+ const value = paletteStrings[key];
4504
+ if (value) return value;
4505
+ }
4506
+ };
4507
+ const assignColor = (token, ...keys) => {
4508
+ const value = resolveColor(...keys);
4509
+ if (value) tokens.color[token] = value;
4510
+ };
4511
+ assignColor("background/base", "background", "surface", "primary-50");
4512
+ assignColor("background/elevated", "surface", "background");
4513
+ assignColor("surface/base", "surface", "background");
4514
+ assignColor("surface/subtle", "neutral-100", "surface", "background");
4515
+ assignColor("surface/inverted", "neutral-900", "text", "primary-900");
4516
+ assignColor("content/primary", "text", "body", "neutral-900");
4517
+ assignColor("content/secondary", "mutedText", "secondary", "neutral-600");
4518
+ assignColor("accent/primary", "primary", "accent");
4519
+ assignColor("accent/secondary", "accent", "secondary", "primary-400");
4520
+ assignColor("border/base", "border", "neutral-300");
4521
+ return tokens;
4522
+ }
4523
+ function cloneThemeTokens(source) {
4524
+ return JSON.parse(JSON.stringify(source));
4525
+ }
4372
4526
  //#endregion
4373
4527
  //#region ../theme-core/src/tokens/blockColorTokens.ts
4374
4528
  const blockColorTokenNames = [
@@ -4479,6 +4633,101 @@ function parseThemeColorToken(value) {
4479
4633
  }
4480
4634
  const themeColorTokenSchema = z$1.string().min(1).refine((value) => Boolean(isThemeColorToken(value)), "Expected a known Theme V2 color token");
4481
4635
  //#endregion
4636
+ //#region ../theme-core/src/tokens/resolver.ts
4637
+ /**
4638
+ * Resolves theme tokens to CSS variables
4639
+ *
4640
+ * This resolver ensures all button styles use theme tokens (not hardcoded colors)
4641
+ * so that changing the palette automatically updates all buttons.
4642
+ */
4643
+ var TokenResolver = class {
4644
+ constructor(theme) {
4645
+ this.theme = theme;
4646
+ }
4647
+ /**
4648
+ * Resolve a color token to a CSS variable reference wrapped in rgb()
4649
+ *
4650
+ * @param token - Token name (e.g., 'primary-500', 'white', 'text-900')
4651
+ * @returns CSS rgb() function with var reference (e.g., 'rgb(var(--tb-primary-500))')
4652
+ *
4653
+ * Note: CSS variables are stored as RGB channels (e.g., "37 99 235") following Tailwind convention,
4654
+ * so we must wrap them with rgb() to create a valid color value.
4655
+ *
4656
+ * @example
4657
+ * resolver.getColor('primary-500') // => 'rgb(var(--tb-primary-500))'
4658
+ * resolver.getColor('white') // => 'rgb(var(--tb-white))'
4659
+ */
4660
+ getColor(token) {
4661
+ if (!this.tokenExists(token)) console.warn(`[TokenResolver] Color token "${token}" not found in theme palette. Button may render incorrectly.`);
4662
+ return rgbColorValue(token);
4663
+ }
4664
+ /**
4665
+ * Adjust a color token's shade by a given amount
4666
+ *
4667
+ * @param token - Base token (e.g., 'primary-500')
4668
+ * @param amount - Shade adjustment (+100 = darker, -100 = lighter)
4669
+ * @returns Adjusted token name (e.g., 'primary-600')
4670
+ *
4671
+ * @example
4672
+ * resolver.adjustShade('primary-500', 100) // => 'primary-600' (darker)
4673
+ * resolver.adjustShade('primary-500', -100) // => 'primary-400' (lighter)
4674
+ */
4675
+ adjustShade(token, amount) {
4676
+ const parts = token.split("-");
4677
+ if (parts.length < 2) return `${token}-${Math.max(100, Math.min(900, 500 + amount))}`;
4678
+ const base = parts.slice(0, -1).join("-");
4679
+ const shade = parseInt(parts[parts.length - 1] ?? "", 10);
4680
+ if (isNaN(shade)) {
4681
+ console.warn(`[TokenResolver] Cannot adjust shade for non-shade token "${token}". Returning original token.`);
4682
+ return token;
4683
+ }
4684
+ return `${base}-${Math.max(100, Math.min(900, shade + amount))}`;
4685
+ }
4686
+ /**
4687
+ * Check if a token exists in the theme palette
4688
+ *
4689
+ * @param token - Token name to check
4690
+ * @returns True if token exists in theme
4691
+ */
4692
+ tokenExists(token) {
4693
+ if ([
4694
+ "white",
4695
+ "black",
4696
+ "transparent"
4697
+ ].includes(token)) return true;
4698
+ const parts = token.split("-");
4699
+ if (parts.length >= 2) {
4700
+ const lastPart = parts[parts.length - 1] ?? "";
4701
+ const shade = parseInt(lastPart, 10);
4702
+ if (!isNaN(shade) && shade >= 100 && shade <= 900 && shade % 100 === 0) return true;
4703
+ }
4704
+ return true;
4705
+ }
4706
+ };
4707
+ //#endregion
4708
+ //#region ../theme-core/src/palette/utils/onColor.ts
4709
+ const BACKGROUND_ROLE_NAMES = /* @__PURE__ */ new Set([
4710
+ "primary",
4711
+ "secondary",
4712
+ "accent",
4713
+ "success",
4714
+ "warning",
4715
+ "destructive",
4716
+ "info",
4717
+ "background",
4718
+ "surface",
4719
+ "surfaceAlt",
4720
+ "muted",
4721
+ "neutral"
4722
+ ]);
4723
+ function onColorTokenName(backgroundToken) {
4724
+ return `on${backgroundToken.split("-").filter((part) => part.length > 0).map((part) => part.charAt(0).toUpperCase() + part.slice(1)).join("")}`;
4725
+ }
4726
+ function isOnColorBackgroundCandidateToken(token) {
4727
+ const role = token.match(/^(.*?)(?:-\d{2,3})?$/)?.[1] ?? token;
4728
+ return BACKGROUND_ROLE_NAMES.has(role);
4729
+ }
4730
+ //#endregion
4482
4731
  //#region ../theme-core/src/palette/colors.ts
4483
4732
  const HEX_COLOR_REGEX = /^#[0-9a-f]{6}$/;
4484
4733
  const NORMALIZABLE_HEX_REGEX = /^#(?:[0-9a-f]{3}|[0-9a-f]{6})$/i;
@@ -6152,213 +6401,6 @@ function assertUniqueLayoutProfileKeys(profiles) {
6152
6401
  });
6153
6402
  if (duplicates.length > 0) throw new Error(`Duplicate block layout design profiles: ${duplicates.join(", ")}`);
6154
6403
  }
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
6404
  //#endregion
6363
6405
  //#region ../theme-core/src/site-styles/backgroundAppearance.ts
6364
6406
  const backgroundAppearanceQuickColorTokenNames = [
@@ -11980,8 +12022,14 @@ const headerInteractionPillPaletteValues = [
11980
12022
  "accent"
11981
12023
  ];
11982
12024
  /**
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).
12025
+ * "No pill": a colour change on hover rather than a filled background.
12026
+ *
12027
+ * The palette step writes nothing (#1318 Phase 4c decision 2), but on a
12028
+ * foreground-adaptive style that is not the end of the story: the hover colour
12029
+ * is derived from the resolved opening foreground at render time, paired with
12030
+ * the resting colour, so `quiet` resolves to a definite colour rather than to
12031
+ * whatever brand token the recipe happened to name. See
12032
+ * `applyOpeningForeground`.
11985
12033
  *
11986
12034
  * It exists because "a colour change on hover, no filled background" was not
11987
12035
  * expressible in the vocabulary, and it is what
@@ -27635,6 +27683,28 @@ const bookingRequirementConsentFieldSchema = z$1.object({
27635
27683
  const bookingConsentCarrierSchema = z$1.union([blockBookingConsentSchema, bookingRequirementConsentFieldSchema]);
27636
27684
  //#endregion
27637
27685
  //#region ../blocks/src/system/blocks/events/shared/schemas.ts
27686
+ const publicEventLoaderQuerySchemaShape = {
27687
+ limit: z$1.string().optional(),
27688
+ from: z$1.string().optional(),
27689
+ to: z$1.string().optional(),
27690
+ afterStartsAt: z$1.string().optional(),
27691
+ afterId: z$1.string().optional(),
27692
+ categoryIds: z$1.string().optional(),
27693
+ venueId: z$1.string().optional(),
27694
+ staffMemberId: z$1.string().optional(),
27695
+ eventSurface: z$1.string().optional(),
27696
+ eventPresets: z$1.string().optional(),
27697
+ scheduleScope: z$1.string().optional(),
27698
+ seriesId: z$1.string().optional(),
27699
+ seriesIds: z$1.string().optional(),
27700
+ runSeriesId: z$1.string().optional(),
27701
+ seriesSlug: z$1.string().optional(),
27702
+ includeOccurrenceId: z$1.string().optional(),
27703
+ readIntent: z$1.string().optional(),
27704
+ detailLevel: z$1.string().optional(),
27705
+ readProfile: z$1.string().optional()
27706
+ };
27707
+ z$1.object(publicEventLoaderQuerySchemaShape);
27638
27708
  const eventPresetSchema = z$1.enum([
27639
27709
  "event",
27640
27710
  "class",
@@ -31083,7 +31153,7 @@ const publicPricingSchema = z$1.object({
31083
31153
  singlePriceAmount: z$1.number().nullable(),
31084
31154
  slidingMinAmount: z$1.number().nullable(),
31085
31155
  slidingMaxAmount: z$1.number().nullable(),
31086
- options: z$1.array(publicPricingOptionSchema)
31156
+ options: z$1.array(publicPricingOptionSchema).readonly()
31087
31157
  });
31088
31158
  const publicAppointmentServiceSchema = z$1.object({
31089
31159
  id: z$1.string().min(1),
@@ -37742,6 +37812,44 @@ function toWholeSeriesRegistrationEvents(events) {
37742
37812
  return groupPublicEventsByRun(events).map(toWholeSeriesRegistrationEvent).filter((event) => event !== null);
37743
37813
  }
37744
37814
  //#endregion
37815
+ //#region ../blocks/src/system/runtime/nodes/event-registration/eventSourceRecovery.ts
37816
+ const { limit: _rawLimit, eventSurface: _rawEventSurface, scheduleScope: _rawScheduleScope, detailLevel: _rawDetailLevel, ...stringEventQueryShape } = publicEventLoaderQuerySchemaShape;
37817
+ const eventRecoveryRequestSchema = z$1.object({
37818
+ ...stringEventQueryShape,
37819
+ limit: z$1.coerce.number().int().positive().optional(),
37820
+ eventSurface: z$1.enum(eventSurfaceScopeValues).optional(),
37821
+ scheduleScope: z$1.enum(eventScheduleScopeValues).optional(),
37822
+ detailLevel: z$1.enum(["full", "listing"]).optional(),
37823
+ stage: z$1.enum(["preview", "published"]).optional()
37824
+ });
37825
+ function resolveEventRegistrationEventSource(input) {
37826
+ if (input.wholeSeriesRunEvents != null) return {
37827
+ kind: "loaded",
37828
+ events: input.wholeSeriesRunEvents
37829
+ };
37830
+ if (input.events != null) return {
37831
+ kind: "loaded",
37832
+ events: input.events
37833
+ };
37834
+ return {
37835
+ kind: "unresolved",
37836
+ request: parseEventLoaderRecoveryRequest(input.failures?.wholeSeriesRunEvents ?? input.failures?.events)
37837
+ };
37838
+ }
37839
+ const eventLoaderFailureSchema = z$1.object({
37840
+ endpoint: z$1.literal("listPublicEvents"),
37841
+ params: eventRecoveryRequestSchema.extend({ siteId: z$1.string().optional() })
37842
+ });
37843
+ function parseEventLoaderRecoveryRequest(value) {
37844
+ const parsed = eventLoaderFailureSchema.safeParse(value);
37845
+ if (!parsed.success) return null;
37846
+ const { siteId: _siteId, stage, ...params } = parsed.data.params;
37847
+ return {
37848
+ ...params,
37849
+ stage: stage ?? "published"
37850
+ };
37851
+ }
37852
+ //#endregion
37745
37853
  //#region ../blocks/src/system/runtime/nodes/event-registration.interactive.ts
37746
37854
  const EVENT_REGISTRATION_GENERIC_SHELL_STEP_LABELS = [
37747
37855
  "Date",
@@ -37759,8 +37867,6 @@ const eventRegistrationPublicEventSchema = z$1.preprocess(normalizeEventRegistra
37759
37867
  const eventRegistrationHydrationSchemaShape = {
37760
37868
  occurrenceContext: occurrenceContextSchema.optional(),
37761
37869
  subject: eventRegistrationPageSurfaceSubjectSchema.nullable().optional(),
37762
- events: z$1.array(eventRegistrationPublicEventSchema).nullable().optional(),
37763
- wholeSeriesRunEvents: z$1.array(eventRegistrationPublicEventSchema).nullable().optional(),
37764
37870
  maxTickets: z$1.string().optional(),
37765
37871
  showVenue: z$1.boolean().optional(),
37766
37872
  showCapacity: z$1.boolean().optional(),
@@ -37772,12 +37878,22 @@ const eventRegistrationHydrationSchemaShape = {
37772
37878
  sitePasses: publicPassProductCollectionSchema.nullable().optional(),
37773
37879
  siteMemberships: publicMembershipProductCollectionSchema.nullable().optional()
37774
37880
  };
37881
+ const eventRegistrationEventSourceSchema = z$1.discriminatedUnion("kind", [z$1.object({
37882
+ kind: z$1.literal("loaded"),
37883
+ events: z$1.array(eventRegistrationPublicEventSchema)
37884
+ }), z$1.object({
37885
+ kind: z$1.literal("unresolved"),
37886
+ request: eventRecoveryRequestSchema.nullable()
37887
+ })]);
37775
37888
  const eventRegistrationSourceSchema = z$1.object({
37776
37889
  siteId: z$1.string().optional(),
37777
37890
  apiBaseUrl: z$1.string().optional(),
37778
37891
  portalToken: z$1.string().nullable().optional(),
37779
37892
  previewToken: z$1.string().nullable().optional(),
37780
37893
  ...eventRegistrationHydrationSchemaShape,
37894
+ events: z$1.array(eventRegistrationPublicEventSchema).nullable().optional(),
37895
+ wholeSeriesRunEvents: z$1.array(eventRegistrationPublicEventSchema).nullable().optional(),
37896
+ eventLoaderFailures: z$1.record(z$1.string(), z$1.unknown()).nullable().optional(),
37781
37897
  className: z$1.string().nullable().optional(),
37782
37898
  buttonText: z$1.string().nullable().optional(),
37783
37899
  maxTickets: z$1.string().nullable().optional(),
@@ -37798,7 +37914,10 @@ const eventRegistrationDisplaySchema = z$1.discriminatedUnion("state", [z$1.obje
37798
37914
  titleText: z$1.string(),
37799
37915
  bodyText: z$1.string()
37800
37916
  })]);
37801
- const eventRegistrationHydrationSchema = z$1.object(eventRegistrationHydrationSchemaShape);
37917
+ const eventRegistrationHydrationSchema = z$1.object({
37918
+ ...eventRegistrationHydrationSchemaShape,
37919
+ eventSource: eventRegistrationEventSourceSchema
37920
+ });
37802
37921
  const eventRegistrationRenderSchema = z$1.object({
37803
37922
  display: eventRegistrationDisplaySchema,
37804
37923
  hydration: eventRegistrationHydrationSchema
@@ -37857,16 +37976,12 @@ function buildEventRegistrationShellStepLabels(source, scopedSourceEvents) {
37857
37976
  function toScopedEventRegistrationEvents(scopedSourceEvents) {
37858
37977
  return [...toRegistrationEvents(scopedSourceEvents), ...toWholeSeriesRegistrationEvents(scopedSourceEvents)];
37859
37978
  }
37860
- function scopeEventRegistrationSourceEvents(source) {
37861
- return resolveEventRegistrationScopedEvents(source.wholeSeriesRunEvents ?? source.events ?? [], {
37979
+ function scopeEventRegistrationSourceEvents(source, eventSource) {
37980
+ return resolveEventRegistrationScopedEvents(eventSource.kind === "loaded" ? eventSource.events : [], {
37862
37981
  occurrenceContext: source.occurrenceContext,
37863
37982
  subject: source.subject
37864
37983
  });
37865
37984
  }
37866
- function resolveLoadedEventRegistrationSourceEvents(source, scopedSourceEvents) {
37867
- if (source.events == null && source.wholeSeriesRunEvents == null) return null;
37868
- return [...scopedSourceEvents];
37869
- }
37870
37985
  /**
37871
37986
  * The one run this surface is registering for, when the scoped events describe
37872
37987
  * exactly one. More than one run means the visitor still has to choose.
@@ -37906,14 +38021,21 @@ const eventRegistrationBlockRuntime = defineClientOwnedBlockRuntime({
37906
38021
  render: createZodCodec(eventRegistrationRenderSchema)
37907
38022
  },
37908
38023
  buildRender: (source) => {
37909
- const scopedSourceEvents = scopeEventRegistrationSourceEvents(source);
37910
- const events = resolveLoadedEventRegistrationSourceEvents(source, scopedSourceEvents);
38024
+ const eventSource = resolveEventRegistrationEventSource({
38025
+ events: source.events,
38026
+ wholeSeriesRunEvents: source.wholeSeriesRunEvents,
38027
+ failures: source.eventLoaderFailures
38028
+ });
38029
+ const scopedSourceEvents = scopeEventRegistrationSourceEvents(source, eventSource);
37911
38030
  return {
37912
38031
  display: buildEventRegistrationDisplayFromScopedEvents(source, scopedSourceEvents),
37913
38032
  hydration: {
37914
38033
  occurrenceContext: source.occurrenceContext ?? null,
37915
38034
  subject: source.subject ?? null,
37916
- events,
38035
+ eventSource: eventSource.kind === "loaded" ? {
38036
+ ...eventSource,
38037
+ events: [...scopedSourceEvents]
38038
+ } : eventSource,
37917
38039
  maxTickets: source.maxTickets ?? void 0,
37918
38040
  showVenue: source.showVenue,
37919
38041
  showCapacity: source.showCapacity,
@@ -38103,6 +38225,7 @@ const eventRegistrationBlockDefinition = {
38103
38225
  } },
38104
38226
  events: { $bind: { from: "data.events" } },
38105
38227
  wholeSeriesRunEvents: { $bind: { from: "data.wholeSeriesRunEvents" } },
38228
+ loaderFailures: { $bind: { from: "$root.loaderFailures" } },
38106
38229
  sitePasses: { $bind: { from: "data.sitePasses" } },
38107
38230
  siteMemberships: { $bind: { from: "data.siteMemberships" } },
38108
38231
  stage: { $bind: {
@@ -40085,6 +40208,15 @@ const newsletterFieldSchema = z$1.object({
40085
40208
  placeholder: z$1.string().optional()
40086
40209
  });
40087
40210
  const mailingListSignupBlockIdSchema = z$1.string().trim().min(1).transform(parseRequiredMailingListSignupBlockId);
40211
+ const mailingListContentVersionIdSchema = z$1.string().transform((value, ctx) => {
40212
+ const parsed = parseMailingListContentVersionId(value);
40213
+ if (parsed) return parsed;
40214
+ ctx.addIssue({
40215
+ code: z$1.ZodIssueCode.custom,
40216
+ message: "Invalid mailing-list content version ID"
40217
+ });
40218
+ return z$1.NEVER;
40219
+ });
40088
40220
  const signedMailingListSourceTokenSchema = z$1.string().trim().min(1).transform(parseRequiredMailingListSignedSourceToken);
40089
40221
  const newsletterSourceCommonSchema = z$1.object({
40090
40222
  siteId: z$1.string().optional(),
@@ -40098,7 +40230,8 @@ const newsletterSourceCommonSchema = z$1.object({
40098
40230
  const newsletterSourceSchema = z$1.discriminatedUnion("source", [
40099
40231
  newsletterSourceCommonSchema.extend({
40100
40232
  source: z$1.literal("block"),
40101
- blockId: z$1.string().nullable().optional()
40233
+ blockId: z$1.string().nullable().optional(),
40234
+ contentVersionId: z$1.string().nullable().optional()
40102
40235
  }),
40103
40236
  newsletterSourceCommonSchema.extend({
40104
40237
  source: z$1.literal("signed-footer"),
@@ -40114,6 +40247,7 @@ const newsletterDisplaySchema = z$1.object({
40114
40247
  availability: z$1.enum(["ready", "unavailable"]),
40115
40248
  className: z$1.string().nullable(),
40116
40249
  buttonLabel: z$1.string(),
40250
+ successMessage: z$1.string(),
40117
40251
  buttonVariant: newsletterButtonVariantSchema,
40118
40252
  privacyNote: z$1.string().nullable(),
40119
40253
  fields: z$1.array(newsletterFieldSchema),
@@ -40128,7 +40262,8 @@ const newsletterHydrationSchema = z$1.object({
40128
40262
  tag: z$1.literal("block-source"),
40129
40263
  sourceRef: z$1.object({
40130
40264
  tag: z$1.literal("block_ref"),
40131
- blockId: mailingListSignupBlockIdSchema
40265
+ blockId: mailingListSignupBlockIdSchema,
40266
+ contentVersionId: mailingListContentVersionIdSchema
40132
40267
  }).nullable()
40133
40268
  }),
40134
40269
  z$1.object({
@@ -40167,6 +40302,7 @@ function buildNewsletterDisplay(source) {
40167
40302
  fields: { preset: "emailOnly" },
40168
40303
  includeOptionalPhone: false,
40169
40304
  buttonLabel: "Subscribe",
40305
+ successMessage: DEFAULT_MAILING_LIST_SUCCESS_MESSAGE,
40170
40306
  privacyNote: null
40171
40307
  };
40172
40308
  const targeting = source.targeting ?? { mode: "default" };
@@ -40176,6 +40312,7 @@ function buildNewsletterDisplay(source) {
40176
40312
  availability: runtimeTargetingIsAvailable(context, targeting, choices) ? "ready" : "unavailable",
40177
40313
  className: source.className ?? null,
40178
40314
  buttonLabel: form.buttonLabel,
40315
+ successMessage: form.successMessage,
40179
40316
  buttonVariant: source.buttonVariant ?? "primary",
40180
40317
  privacyNote: form.privacyNote,
40181
40318
  fields: getGlobalFormFields(form),
@@ -40206,7 +40343,7 @@ const newsletterFormBlockRuntime = defineProgressiveBlockRuntime({
40206
40343
  function projectNewsletterFormHydrationTarget(source) {
40207
40344
  switch (source.source) {
40208
40345
  case "block": {
40209
- const sourceRef = buildMailingListSignupBlockSourceRef(source.blockId);
40346
+ const sourceRef = buildMailingListSignupBlockSourceRef(source.blockId, source.contentVersionId);
40210
40347
  if (sourceRef?.tag === "block_ref") return {
40211
40348
  tag: "block-source",
40212
40349
  sourceRef
@@ -42620,9 +42757,10 @@ function cx(...classes) {
42620
42757
  * Server-safe placeholder for event registration.
42621
42758
  * Provides a static container for island hydration without importing client hooks.
42622
42759
  */
42623
- function EventRegistrationSSR({ blockId, subject, children, ...sourceProps }) {
42760
+ function EventRegistrationSSR({ blockId, subject, loaderFailures, children, ...sourceProps }) {
42624
42761
  const islandProps = buildEventRegistrationInteractiveIslandProps({
42625
42762
  ...sourceProps,
42763
+ eventLoaderFailures: blockId ? loaderFailures?.[blockId] : void 0,
42626
42764
  subject: normalizeEventRegistrationPageSurfaceSubject(subject)
42627
42765
  });
42628
42766
  const display = islandProps.render.display;
@@ -42955,7 +43093,7 @@ function NewsletterFormSSR(props) {
42955
43093
  className: clsx("newsletter-form-ssr", className),
42956
43094
  children: /* @__PURE__ */ jsx("p", {
42957
43095
  role: "status",
42958
- children: "Mailing-list signup is not available right now."
43096
+ children: "We can’t accept signups right now. Please try again later."
42959
43097
  })
42960
43098
  });
42961
43099
  const renderField = (field) => {
@@ -43001,14 +43139,18 @@ function NewsletterFormSSR(props) {
43001
43139
  children: [
43002
43140
  fields.map(renderField),
43003
43141
  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",
43142
+ className: "fb-fieldset newsletter-topics",
43143
+ children: [/* @__PURE__ */ jsx("legend", {
43144
+ className: "form-label",
43145
+ children: "What would you like to hear about?"
43146
+ }), display.choices.map((choice) => /* @__PURE__ */ jsxs("label", {
43147
+ className: "fb-inline form-label newsletter-topic-choice",
43007
43148
  children: [/* @__PURE__ */ jsx("input", {
43008
43149
  type: "checkbox",
43009
43150
  name: "mailingListChoice",
43010
- value: choice.id
43011
- }), choice.label]
43151
+ value: choice.id,
43152
+ className: "form-checkbox"
43153
+ }), /* @__PURE__ */ jsx("span", { children: choice.label })]
43012
43154
  }, choice.id))]
43013
43155
  }) : null,
43014
43156
  /* @__PURE__ */ jsx("div", {
@@ -43997,6 +44139,18 @@ function resolveChildren(nodes, context) {
43997
44139
  function isReactNode(value) {
43998
44140
  return value !== null && value !== void 0;
43999
44141
  }
44142
+ function resolveNodeMetadata(nodeType, context) {
44143
+ return {
44144
+ pathBase: context.pathBase,
44145
+ blockId: context.blockId,
44146
+ blockKind: context.blockKind,
44147
+ blockContent: context.blockContent,
44148
+ fragmentRegistry: context.fragmentRegistry,
44149
+ previewAuthoring: context.previewAuthoring,
44150
+ ...nodeType.toLowerCase() === "newsletter-form" ? { contentVersionId: context.contentVersionId } : {},
44151
+ ...nodeType === "media" && context.imageResolveContext ? { imageResolveContext: context.imageResolveContext } : {}
44152
+ };
44153
+ }
44000
44154
  /**
44001
44155
  * Resolves a node definition into a React element.
44002
44156
  * Handles conditionals ($when), scopes ($scopes), repeaters ($repeat), bindings ($bind), and children.
@@ -44032,13 +44186,7 @@ function resolveNode(node, context, indexFallback) {
44032
44186
  const elementProps = {
44033
44187
  ...props,
44034
44188
  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
44189
+ ...resolveNodeMetadata(node.type, context)
44042
44190
  };
44043
44191
  const element = React.createElement(component, elementProps, ...children);
44044
44192
  if (headingDecorationPlan.kind === "skip") return element;
@@ -48048,7 +48196,7 @@ function pageBlockPosition(index, blockCount) {
48048
48196
  //#endregion
48049
48197
  //#region ../blocks/src/pageRendererContracts.ts
48050
48198
  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 ?? {};
48199
+ const { siteId = null, pageId = null, pathname = null, bookingTimeZone, previewStage = "published", apiBaseUrl = null, portalToken = null, bookingOfferingPresets = [], mailingList = { tag: "not_configured" }, eventRegistrationOverlayEnabled = false, loaderFailures = {} } = dataContext ?? {};
48052
48200
  return {
48053
48201
  siteId,
48054
48202
  pageId,
@@ -48059,7 +48207,8 @@ function buildPageRendererRootRuntime(dataContext) {
48059
48207
  portalToken,
48060
48208
  bookingOfferingPresets,
48061
48209
  mailingList,
48062
- eventRegistrationOverlayEnabled
48210
+ eventRegistrationOverlayEnabled,
48211
+ loaderFailures
48063
48212
  };
48064
48213
  }
48065
48214
  //#endregion
@@ -57106,7 +57255,7 @@ function collectNestedPreviewFieldConstraintEntries(field, path) {
57106
57255
  }
57107
57256
  function makeDefaultBlockComponent(args) {
57108
57257
  const { manifest } = args;
57109
- return function DefaultBlockComponent({ content, data, registry, theme, themeConfig, transforms, viewModelOverrides, pathBase, blockId, blockKind, blockBindings, editableRouteMetadataFieldIds, fragmentRegistry, imageResolveContext, previewAuthoring }) {
57258
+ return function DefaultBlockComponent({ content, data, registry, theme, themeConfig, transforms, viewModelOverrides, pathBase, blockId, contentVersionId, blockKind, blockBindings, editableRouteMetadataFieldIds, fragmentRegistry, imageResolveContext, previewAuthoring }) {
57110
57259
  const perf = beginBlockRenderMeasurement();
57111
57260
  if (!theme) throw new Error("Block rendering requires theme tokens; none were provided to makeDefaultBlockComponent");
57112
57261
  if (!registry) throw new Error("Block rendering requires a component registry; none was provided");
@@ -57126,6 +57275,7 @@ function makeDefaultBlockComponent(args) {
57126
57275
  theme: withButtonSystem(theme, themeConfig),
57127
57276
  pathBase,
57128
57277
  blockId,
57278
+ contentVersionId,
57129
57279
  blockKind,
57130
57280
  blockContent: mergedContent,
57131
57281
  blockBindings,
@@ -57919,6 +58069,7 @@ function buildBlockOverrideProps(input) {
57919
58069
  ...blockSubjectProps(dataContext),
57920
58070
  imageResolveContext: input.imageResolveContext,
57921
58071
  blockId: block.id ?? null,
58072
+ contentVersionId: block.contentVersionId ?? null,
57922
58073
  blockKind: block.kind
57923
58074
  };
57924
58075
  }
@@ -58019,6 +58170,7 @@ function toPresentationPage(page) {
58019
58170
  id: block.id,
58020
58171
  kind: block.kind,
58021
58172
  purpose: block.purpose,
58173
+ ...block.contentVersionId ? { contentVersionId: block.contentVersionId } : {},
58022
58174
  ...block.bindings ? { bindings: block.bindings } : {}
58023
58175
  };
58024
58176
  return block.admission.kind === "renderable" ? {
@@ -68254,7 +68406,9 @@ const containerResponsiveThemeCss = `/*
68254
68406
  text-align: left;
68255
68407
  }
68256
68408
 
68257
- :where(.theme-scope) :where([data-block="customer-portal"]) .cp-login__subtitle {
68409
+ :where(.theme-scope)
68410
+ :where([data-block="customer-portal"])
68411
+ .cp-login__subtitle {
68258
68412
  color: var(--cp-muted);
68259
68413
  font-size: 0.9375rem;
68260
68414
  text-align: left;
@@ -68281,7 +68435,9 @@ const containerResponsiveThemeCss = `/*
68281
68435
  text-align: left;
68282
68436
  }
68283
68437
 
68284
- :where(.theme-scope) :where([data-block="customer-portal"]) .cp-login__reset-link {
68438
+ :where(.theme-scope)
68439
+ :where([data-block="customer-portal"])
68440
+ .cp-login__reset-link {
68285
68441
  appearance: none;
68286
68442
  background: none;
68287
68443
  border: 0;
@@ -68295,11 +68451,15 @@ const containerResponsiveThemeCss = `/*
68295
68451
  text-underline-offset: 0.15em;
68296
68452
  }
68297
68453
 
68298
- :where(.theme-scope) :where([data-block="customer-portal"]) .cp-login__reset-link:hover {
68454
+ :where(.theme-scope)
68455
+ :where([data-block="customer-portal"])
68456
+ .cp-login__reset-link:hover {
68299
68457
  color: var(--cp-text);
68300
68458
  }
68301
68459
 
68302
- :where(.theme-scope) :where([data-block="customer-portal"]) .cp-login__reset-link:focus-visible {
68460
+ :where(.theme-scope)
68461
+ :where([data-block="customer-portal"])
68462
+ .cp-login__reset-link:focus-visible {
68303
68463
  outline: 2px solid currentColor;
68304
68464
  outline-offset: 3px;
68305
68465
  }
@@ -68344,7 +68504,9 @@ const containerResponsiveThemeCss = `/*
68344
68504
  border-bottom: none;
68345
68505
  }
68346
68506
 
68347
- :where(.theme-scope) :where([data-block="customer-portal"]) .cp-header__welcome {
68507
+ :where(.theme-scope)
68508
+ :where([data-block="customer-portal"])
68509
+ .cp-header__welcome {
68348
68510
  font-size: 1.125rem;
68349
68511
  font-weight: 500;
68350
68512
  }
@@ -68360,8 +68522,14 @@ const containerResponsiveThemeCss = `/*
68360
68522
  }
68361
68523
 
68362
68524
  @keyframes cp-fade-in {
68363
- from { opacity: 0; transform: translateY(4px); }
68364
- to { opacity: 1; transform: translateY(0); }
68525
+ from {
68526
+ opacity: 0;
68527
+ transform: translateY(4px);
68528
+ }
68529
+ to {
68530
+ opacity: 1;
68531
+ transform: translateY(0);
68532
+ }
68365
68533
  }
68366
68534
 
68367
68535
  /* Empty state */
@@ -68450,6 +68618,77 @@ const containerResponsiveThemeCss = `/*
68450
68618
  margin-top: 1rem;
68451
68619
  }
68452
68620
 
68621
+ /* Event waitlists */
68622
+ :where(.theme-scope) :where([data-block="customer-portal"]) .cp-waitlist-list {
68623
+ display: grid;
68624
+ gap: 1rem;
68625
+ }
68626
+
68627
+ :where(.theme-scope)
68628
+ :where([data-block="customer-portal"])
68629
+ .cp-waitlists
68630
+ > .cp-alert {
68631
+ margin-bottom: 1rem;
68632
+ }
68633
+
68634
+ :where(.theme-scope) :where([data-block="customer-portal"]) .cp-waitlist-card {
68635
+ transition:
68636
+ border-color 180ms ease,
68637
+ box-shadow 180ms ease;
68638
+ }
68639
+
68640
+ :where(.theme-scope)
68641
+ :where([data-block="customer-portal"])
68642
+ .cp-waitlist-card--focused {
68643
+ border-color: var(--cp-primary);
68644
+ box-shadow: 0 0 0 3px color-mix(in srgb, var(--cp-primary) 22%, transparent);
68645
+ }
68646
+
68647
+ :where(.theme-scope)
68648
+ :where([data-block="customer-portal"])
68649
+ .cp-waitlist-card__summary,
68650
+ :where(.theme-scope)
68651
+ :where([data-block="customer-portal"])
68652
+ .cp-waitlist-card__position {
68653
+ font-weight: 600;
68654
+ }
68655
+
68656
+ :where(.theme-scope)
68657
+ :where([data-block="customer-portal"])
68658
+ .cp-waitlist-card
68659
+ .cp-card-body
68660
+ p {
68661
+ margin: 0.4rem 0;
68662
+ }
68663
+
68664
+ @container rb-site (max-width: 640px) {
68665
+ @scope ([data-rb-responsive-mode="container"]) to (:scope [data-rb-responsive-mode]) {
68666
+ :where(.theme-scope)
68667
+ :where([data-block="customer-portal"])
68668
+ .cp-waitlist-card
68669
+ .cp-card-header {
68670
+ flex-direction: column-reverse;
68671
+ }
68672
+
68673
+ :where(.theme-scope)
68674
+ :where([data-block="customer-portal"])
68675
+ .cp-waitlist-card
68676
+ .cp-card-actions {
68677
+ align-items: stretch;
68678
+ flex-direction: column;
68679
+ }
68680
+
68681
+ :where(.theme-scope)
68682
+ :where([data-block="customer-portal"])
68683
+ .cp-waitlist-card
68684
+ .cp-card-actions
68685
+ > * {
68686
+ justify-content: center;
68687
+ text-align: center;
68688
+ }
68689
+ }
68690
+ }
68691
+
68453
68692
  /* Badge */
68454
68693
  :where(.theme-scope) :where([data-block="customer-portal"]) .cp-badge {
68455
68694
  display: inline-flex;
@@ -68586,11 +68825,18 @@ const containerResponsiveThemeCss = `/*
68586
68825
  background: rgba(var(--tb-border), 0.2);
68587
68826
  }
68588
68827
 
68589
- :where(.theme-scope) :where([data-block="customer-portal"]) .cp-table tbody tr:last-child td {
68828
+ :where(.theme-scope)
68829
+ :where([data-block="customer-portal"])
68830
+ .cp-table
68831
+ tbody
68832
+ tr:last-child
68833
+ td {
68590
68834
  border-bottom: none;
68591
68835
  }
68592
68836
 
68593
- :where(.theme-scope) :where([data-block="customer-portal"]) :is(.cp-row--past, .cp-row--muted) {
68837
+ :where(.theme-scope)
68838
+ :where([data-block="customer-portal"])
68839
+ :is(.cp-row--past, .cp-row--muted) {
68594
68840
  opacity: 0.65;
68595
68841
  }
68596
68842
 
@@ -68603,7 +68849,9 @@ const containerResponsiveThemeCss = `/*
68603
68849
  line-height: 1.2;
68604
68850
  }
68605
68851
 
68606
- :where(.theme-scope) :where([data-block="customer-portal"]) .cp-row-title__badges {
68852
+ :where(.theme-scope)
68853
+ :where([data-block="customer-portal"])
68854
+ .cp-row-title__badges {
68607
68855
  margin-left: auto;
68608
68856
  display: flex;
68609
68857
  flex-wrap: wrap;
@@ -68611,7 +68859,9 @@ const containerResponsiveThemeCss = `/*
68611
68859
  gap: 0.375rem;
68612
68860
  }
68613
68861
 
68614
- :where(.theme-scope) :where([data-block="customer-portal"]) .cp-row-title__text {
68862
+ :where(.theme-scope)
68863
+ :where([data-block="customer-portal"])
68864
+ .cp-row-title__text {
68615
68865
  min-width: 0;
68616
68866
  }
68617
68867
 
@@ -68631,12 +68881,16 @@ const containerResponsiveThemeCss = `/*
68631
68881
  line-height: 1.35;
68632
68882
  }
68633
68883
 
68634
- :where(.theme-scope) :where([data-block="customer-portal"]) .cp-row-note--success {
68884
+ :where(.theme-scope)
68885
+ :where([data-block="customer-portal"])
68886
+ .cp-row-note--success {
68635
68887
  border-left-color: rgb(var(--tb-success));
68636
68888
  color: rgb(var(--tb-success));
68637
68889
  }
68638
68890
 
68639
- :where(.theme-scope) :where([data-block="customer-portal"]) .cp-row-note--error {
68891
+ :where(.theme-scope)
68892
+ :where([data-block="customer-portal"])
68893
+ .cp-row-note--error {
68640
68894
  border-left-color: rgb(var(--tb-destructive));
68641
68895
  color: rgb(var(--tb-destructive));
68642
68896
  }
@@ -68655,16 +68909,23 @@ const containerResponsiveThemeCss = `/*
68655
68909
  white-space: nowrap;
68656
68910
  }
68657
68911
 
68658
- :where(.theme-scope) :where([data-block="customer-portal"]) .cp-col-actions .btn-sm {
68912
+ :where(.theme-scope)
68913
+ :where([data-block="customer-portal"])
68914
+ .cp-col-actions
68915
+ .btn-sm {
68659
68916
  white-space: nowrap;
68660
68917
  }
68661
68918
 
68662
- :where(.theme-scope) :where([data-block="customer-portal"]) .cp-row-title__link {
68919
+ :where(.theme-scope)
68920
+ :where([data-block="customer-portal"])
68921
+ .cp-row-title__link {
68663
68922
  color: inherit;
68664
68923
  text-decoration: none;
68665
68924
  }
68666
68925
 
68667
- :where(.theme-scope) :where([data-block="customer-portal"]) .cp-row-title__link:hover {
68926
+ :where(.theme-scope)
68927
+ :where([data-block="customer-portal"])
68928
+ .cp-row-title__link:hover {
68668
68929
  text-decoration: underline;
68669
68930
  text-decoration-thickness: 2px;
68670
68931
  text-underline-offset: 2px;
@@ -68686,7 +68947,9 @@ const containerResponsiveThemeCss = `/*
68686
68947
  }
68687
68948
 
68688
68949
  /* Profile actions */
68689
- :where(.theme-scope) :where([data-block="customer-portal"]) .cp-profile__actions {
68950
+ :where(.theme-scope)
68951
+ :where([data-block="customer-portal"])
68952
+ .cp-profile__actions {
68690
68953
  display: flex;
68691
68954
  gap: 0.75rem;
68692
68955
  margin-top: 1rem;
@@ -68753,28 +69016,39 @@ const containerResponsiveThemeCss = `/*
68753
69016
  gap: 0.375rem;
68754
69017
  }
68755
69018
 
68756
- :where(.theme-scope) :where([data-block="customer-portal"]) .cp-guest-edit-row__index {
69019
+ :where(.theme-scope)
69020
+ :where([data-block="customer-portal"])
69021
+ .cp-guest-edit-row__index {
68757
69022
  font-size: 0.75rem;
68758
69023
  font-weight: 500;
68759
69024
  color: var(--cp-muted);
68760
69025
  }
68761
69026
 
68762
- :where(.theme-scope) :where([data-block="customer-portal"]) .cp-guest-edit-row__fields {
69027
+ :where(.theme-scope)
69028
+ :where([data-block="customer-portal"])
69029
+ .cp-guest-edit-row__fields {
68763
69030
  display: flex;
68764
69031
  gap: 0.5rem;
68765
69032
  }
68766
69033
 
68767
- :where(.theme-scope) :where([data-block="customer-portal"]) .cp-guest-edit-row__fields input {
69034
+ :where(.theme-scope)
69035
+ :where([data-block="customer-portal"])
69036
+ .cp-guest-edit-row__fields
69037
+ input {
68768
69038
  flex: 1;
68769
69039
  min-width: 0;
68770
69040
  }
68771
69041
 
68772
- :where(.theme-scope) :where([data-block="customer-portal"]) .cp-guest-edit-row__error {
69042
+ :where(.theme-scope)
69043
+ :where([data-block="customer-portal"])
69044
+ .cp-guest-edit-row__error {
68773
69045
  font-size: 0.75rem;
68774
69046
  color: var(--cp-error);
68775
69047
  }
68776
69048
 
68777
- :where(.theme-scope) :where([data-block="customer-portal"]) .cp-guests__actions {
69049
+ :where(.theme-scope)
69050
+ :where([data-block="customer-portal"])
69051
+ .cp-guests__actions {
68778
69052
  display: flex;
68779
69053
  gap: 0.5rem;
68780
69054
  margin-top: 0.5rem;
@@ -68788,13 +69062,18 @@ const containerResponsiveThemeCss = `/*
68788
69062
  }
68789
69063
 
68790
69064
  /* 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) {
69065
+ :where(.theme-scope)
69066
+ :where([data-block="customer-portal"])
69067
+ .cp-actions-list
69068
+ :where(.rb-tile) {
68792
69069
  --rb-event-tile-bg: rgb(var(--tb-background));
68793
69070
  --rb-event-tile-border: rgb(var(--tb-border));
68794
69071
  }
68795
69072
 
68796
69073
  /* Actions trigger: icon-only kebab button */
68797
- :where(.theme-scope) :where([data-block="customer-portal"]) .cp-actions-trigger.btn-sm {
69074
+ :where(.theme-scope)
69075
+ :where([data-block="customer-portal"])
69076
+ .cp-actions-trigger.btn-sm {
68798
69077
  padding: 0.35rem !important;
68799
69078
  line-height: 1 !important;
68800
69079
  min-width: 32px;
@@ -68818,17 +69097,24 @@ const containerResponsiveThemeCss = `/*
68818
69097
  gap: 0.25rem;
68819
69098
  }
68820
69099
 
68821
- :where(.theme-scope) :where([data-block="customer-portal"]) .cp-action-tile__title {
69100
+ :where(.theme-scope)
69101
+ :where([data-block="customer-portal"])
69102
+ .cp-action-tile__title {
68822
69103
  font-weight: 600;
68823
69104
  font-size: 0.9375rem;
68824
69105
  }
68825
69106
 
68826
- :where(.theme-scope) :where([data-block="customer-portal"]) .cp-action-tile__desc {
69107
+ :where(.theme-scope)
69108
+ :where([data-block="customer-portal"])
69109
+ .cp-action-tile__desc {
68827
69110
  font-size: 0.875rem;
68828
69111
  line-height: 1.35;
68829
69112
  }
68830
69113
 
68831
- :where(.theme-scope) :where([data-block="customer-portal"]) .cp-action-tile--danger .cp-action-tile__title {
69114
+ :where(.theme-scope)
69115
+ :where([data-block="customer-portal"])
69116
+ .cp-action-tile--danger
69117
+ .cp-action-tile__title {
68832
69118
  color: rgb(var(--tb-destructive));
68833
69119
  }
68834
69120
 
@@ -68850,7 +69136,9 @@ const containerResponsiveThemeCss = `/*
68850
69136
  text-decoration: underline;
68851
69137
  }
68852
69138
 
68853
- :where(.theme-scope) :where([data-block="customer-portal"]) .cp-btn--link:hover {
69139
+ :where(.theme-scope)
69140
+ :where([data-block="customer-portal"])
69141
+ .cp-btn--link:hover {
68854
69142
  color: var(--cp-primary-hover);
68855
69143
  }
68856
69144
 
@@ -68889,34 +69177,48 @@ const containerResponsiveThemeCss = `/*
68889
69177
  margin-top: 0.75rem;
68890
69178
  }
68891
69179
 
68892
- :where(.theme-scope) :where([data-block="customer-portal"]) .cp-cancel-confirm__title {
69180
+ :where(.theme-scope)
69181
+ :where([data-block="customer-portal"])
69182
+ .cp-cancel-confirm__title {
68893
69183
  font-weight: 600;
68894
69184
  margin-bottom: 0.5rem;
68895
69185
  }
68896
69186
 
68897
- :where(.theme-scope) :where([data-block="customer-portal"]) .cp-cancel-confirm__message {
69187
+ :where(.theme-scope)
69188
+ :where([data-block="customer-portal"])
69189
+ .cp-cancel-confirm__message {
68898
69190
  margin-bottom: 0.25rem;
68899
69191
  }
68900
69192
 
68901
- :where(.theme-scope) :where([data-block="customer-portal"]) .cp-cancel-confirm__warning {
69193
+ :where(.theme-scope)
69194
+ :where([data-block="customer-portal"])
69195
+ .cp-cancel-confirm__warning {
68902
69196
  margin-bottom: 0.75rem;
68903
69197
  }
68904
69198
 
68905
- :where(.theme-scope) :where([data-block="customer-portal"]) .cp-cancel-confirm__actions {
69199
+ :where(.theme-scope)
69200
+ :where([data-block="customer-portal"])
69201
+ .cp-cancel-confirm__actions {
68906
69202
  display: flex;
68907
69203
  gap: 0.75rem;
68908
69204
  }
68909
69205
 
68910
69206
  /* Membership actions */
68911
- :where(.theme-scope) :where([data-block="customer-portal"]) .cp-membership-actions {
69207
+ :where(.theme-scope)
69208
+ :where([data-block="customer-portal"])
69209
+ .cp-membership-actions {
68912
69210
  margin-top: 0.75rem;
68913
69211
  }
68914
69212
 
68915
- :where(.theme-scope) :where([data-block="customer-portal"]) .cp-section-actions {
69213
+ :where(.theme-scope)
69214
+ :where([data-block="customer-portal"])
69215
+ .cp-section-actions {
68916
69216
  margin-top: 1rem;
68917
69217
  }
68918
69218
 
68919
- :where(.theme-scope) :where([data-block="customer-portal"]) .cp-card-subtitle--spaced {
69219
+ :where(.theme-scope)
69220
+ :where([data-block="customer-portal"])
69221
+ .cp-card-subtitle--spaced {
68920
69222
  margin-top: 0.75rem;
68921
69223
  }
68922
69224
 
@@ -68940,9 +69242,18 @@ const containerResponsiveThemeCss = `/*
68940
69242
  display: none;
68941
69243
  }
68942
69244
 
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 {
69245
+ :where(.theme-scope)
69246
+ :where([data-block="customer-portal"])
69247
+ .cp-table
69248
+ :is(th, td).cp-col-guests,
69249
+ :where(.theme-scope)
69250
+ :where([data-block="customer-portal"])
69251
+ .cp-table
69252
+ :is(th, td).cp-col-tickets,
69253
+ :where(.theme-scope)
69254
+ :where([data-block="customer-portal"])
69255
+ .cp-table
69256
+ :is(th, td).cp-col-actions {
68946
69257
  display: none;
68947
69258
  }
68948
69259
 
@@ -68951,24 +69262,34 @@ const containerResponsiveThemeCss = `/*
68951
69262
  }
68952
69263
 
68953
69264
  /* Make the cell a positioning context for the kebab */
68954
- :where(.theme-scope) :where([data-block="customer-portal"]) .cp-row > td:first-child {
69265
+ :where(.theme-scope)
69266
+ :where([data-block="customer-portal"])
69267
+ .cp-row
69268
+ > td:first-child {
68955
69269
  position: relative;
68956
69270
  padding-right: 2.5rem;
68957
69271
  }
68958
69272
 
68959
69273
  /* Position kebab in top-right of the cell */
68960
- :where(.theme-scope) :where([data-block="customer-portal"]) .cp-row-mobile-actions {
69274
+ :where(.theme-scope)
69275
+ :where([data-block="customer-portal"])
69276
+ .cp-row-mobile-actions {
68961
69277
  position: absolute;
68962
69278
  top: 0.5rem;
68963
69279
  right: 0.5rem;
68964
69280
  margin-top: 0;
68965
69281
  }
68966
69282
 
68967
- :where(.theme-scope) :where([data-block="customer-portal"]) .cp-row-mobile-actions .btn-sm {
69283
+ :where(.theme-scope)
69284
+ :where([data-block="customer-portal"])
69285
+ .cp-row-mobile-actions
69286
+ .btn-sm {
68968
69287
  width: auto;
68969
69288
  }
68970
69289
 
68971
- :where(.theme-scope) :where([data-block="customer-portal"]) .cp-profile__edit {
69290
+ :where(.theme-scope)
69291
+ :where([data-block="customer-portal"])
69292
+ .cp-profile__edit {
68972
69293
  align-self: stretch;
68973
69294
  }
68974
69295
  }
@@ -69416,6 +69737,30 @@ const containerResponsiveThemeCss = `/*
69416
69737
  gap: 0.25rem;
69417
69738
  }
69418
69739
 
69740
+ /* Topic choices (visitor picks what to hear about). Same treatment as the
69741
+ form block's .fb-fieldset / .fb-inline, defined here because the newsletter
69742
+ form also renders inside contact-newsletter and the site footer. */
69743
+ :where(.theme-scope) .newsletter-topics {
69744
+ display: flex;
69745
+ flex-direction: column;
69746
+ gap: 0.5rem;
69747
+ border: none;
69748
+ padding: 0;
69749
+ margin: 0;
69750
+ min-width: 0;
69751
+ }
69752
+
69753
+ :where(.theme-scope) .newsletter-topics > legend {
69754
+ padding: 0;
69755
+ margin-bottom: 0.25rem;
69756
+ }
69757
+
69758
+ :where(.theme-scope) .newsletter-topic-choice {
69759
+ display: flex;
69760
+ align-items: center;
69761
+ gap: 0.5rem;
69762
+ }
69763
+
69419
69764
  /* Required indicator */
69420
69765
  :where(.theme-scope) .newsletter-required {
69421
69766
  color: rgb(var(--tb-primary));
@@ -69465,6 +69810,10 @@ const containerResponsiveThemeCss = `/*
69465
69810
  flex-shrink: 0;
69466
69811
  }
69467
69812
 
69813
+ :where(.theme-scope) .newsletter-inline .newsletter-topics {
69814
+ flex-basis: 100%;
69815
+ }
69816
+
69468
69817
  /* Mobile fallback for inline variant */
69469
69818
  @container rb-site (max-width: 640px) {
69470
69819
  @scope ([data-rb-responsive-mode="container"]) to (:scope [data-rb-responsive-mode]) {
@@ -71962,7 +72311,7 @@ function PageContent(props) {
71962
72311
  previewToken,
71963
72312
  resolvedData,
71964
72313
  bookingOfferingPresets: bookingOfferingPresets ?? [],
71965
- mailingList,
72314
+ mailingList: mailingList ?? dataContext?.mailingList,
71966
72315
  bookingTimeZone: resolveSdkBookingTimeZone(bookingTimeZone),
71967
72316
  routes: routeMap,
71968
72317
  pagesByIdentifier,
@@ -73813,9 +74162,11 @@ function convertPageResponseBlock(block) {
73813
74162
  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
74163
  if (typeof block.kind !== "string") throw new Error(`Invalid block kind in page: expected string, got ${typeof block.kind}`);
73815
74164
  if (typeof block.purpose !== "string") throw new Error(`Invalid block purpose in page: expected string, got ${typeof block.purpose}`);
74165
+ 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
74166
  const admission = readInvalidBlockAdmission(block.admission);
73817
74167
  return {
73818
74168
  id: block.id,
74169
+ ...block.contentVersionId !== void 0 ? { contentVersionId: block.contentVersionId } : {},
73819
74170
  kind: block.kind,
73820
74171
  purpose: block.purpose,
73821
74172
  content: sanitizeSdkRuntimeBlockContent(block.kind, readContentRecord(block.content) ?? {}),
@@ -73846,6 +74197,7 @@ function buildRenderablePageOutline(input) {
73846
74197
  function admitSdkRuntimePageBlock(block, customBlocks) {
73847
74198
  const base = {
73848
74199
  id: block.id,
74200
+ ...block.contentVersionId !== void 0 ? { contentVersionId: block.contentVersionId } : {},
73849
74201
  kind: block.kind,
73850
74202
  purpose: block.purpose,
73851
74203
  ...block.bindings ? { bindings: block.bindings } : {}
@@ -75591,6 +75943,14 @@ const PUBLIC_BOOKING_AVAILABILITY_ENDPOINT_DEFINITIONS = defineEndpointDefinitio
75591
75943
  auth: "public",
75592
75944
  responseKind: "json"
75593
75945
  },
75946
+ getPublicBookingServiceBySlug: {
75947
+ path: "/public/bookings/services/by-slug/{slug}",
75948
+ method: "GET",
75949
+ revalidate: publicReadFreshnessSeconds("getPublicBookingService"),
75950
+ tags: [TAG_TEMPLATES.publicBookingServices],
75951
+ auth: "public",
75952
+ responseKind: "json"
75953
+ },
75594
75954
  getPublicBookingResourcesReference: {
75595
75955
  path: "/public/bookings/resources/reference",
75596
75956
  method: "GET",
@@ -76143,16 +76503,110 @@ const PUBLIC_READ_ENDPOINT_DEFINITIONS = defineEndpointDefinitions({
76143
76503
  responseKind: "json"
76144
76504
  }
76145
76505
  });
76506
+ //#endregion
76507
+ //#region ../api/src/publicOnboardingAttemptEndpointDefinitions.ts
76508
+ /**
76509
+ * The anonymous onboarding attempt, addressed by its opaque resume token.
76510
+ *
76511
+ * Every route here is reached before there is an account, so none of them can
76512
+ * be scoped to a site or a user: the token is the whole credential. They are
76513
+ * kept together so that stays obvious.
76514
+ */
76515
+ const PUBLIC_ONBOARDING_ATTEMPT_ENDPOINT_DEFINITIONS = defineEndpointDefinitions({
76516
+ createPublicOnboardingAttempt: {
76517
+ path: "/public/onboarding/attempts",
76518
+ method: "POST",
76519
+ auth: "public",
76520
+ errors: [],
76521
+ responseKind: "json"
76522
+ },
76523
+ createPublicOnboardingLogoUploadUrl: {
76524
+ path: "/public/onboarding/attempts/{attemptToken}/logo-upload-url",
76525
+ method: "POST",
76526
+ auth: "public",
76527
+ errors: [],
76528
+ responseKind: "json"
76529
+ },
76530
+ uploadPublicOnboardingLogo: {
76531
+ path: "/public/onboarding/attempts/{attemptToken}/logo",
76532
+ method: "POST",
76533
+ auth: "public",
76534
+ errors: [],
76535
+ responseKind: "json"
76536
+ },
76537
+ getPublicOnboardingAttempt: {
76538
+ path: "/public/onboarding/attempts/{attemptToken}",
76539
+ method: "GET",
76540
+ auth: "public",
76541
+ errors: [],
76542
+ responseKind: "json"
76543
+ },
76544
+ getPublicOnboardingAttemptProgress: {
76545
+ path: "/public/onboarding/attempts/{attemptToken}/status",
76546
+ method: "GET",
76547
+ auth: "public",
76548
+ errors: [],
76549
+ responseKind: "json"
76550
+ },
76551
+ updatePublicOnboardingAttempt: {
76552
+ path: "/public/onboarding/attempts/{attemptToken}",
76553
+ method: "PATCH",
76554
+ auth: "public",
76555
+ errors: [],
76556
+ responseKind: "json"
76557
+ },
76558
+ runPublicOnboardingAttempt: {
76559
+ path: "/public/onboarding/attempts/{attemptToken}/run",
76560
+ method: "POST",
76561
+ auth: "public",
76562
+ errors: [],
76563
+ responseKind: "json"
76564
+ },
76565
+ resendPublicOnboardingAttemptConfirmation: {
76566
+ path: "/public/onboarding/attempts/{attemptToken}/resend-confirmation",
76567
+ method: "POST",
76568
+ auth: "public",
76569
+ errors: [],
76570
+ responseKind: "json"
76571
+ }
76572
+ });
76573
+ //#endregion
76574
+ //#region ../api/src/billingEndpointDefinitions.ts
76575
+ const BILLING_ENDPOINT_DEFINITIONS = defineEndpointDefinitions({
76576
+ adminChangePlan: {
76577
+ path: "/admin/billing/plan",
76578
+ method: "POST",
76579
+ tags: ["admin", "billing"],
76580
+ auth: "admin",
76581
+ responseKind: "json"
76582
+ },
76583
+ changePlan: {
76584
+ path: "/billing/plan/change",
76585
+ method: "POST",
76586
+ tags: ["billing"],
76587
+ auth: "user",
76588
+ responseKind: "json"
76589
+ },
76590
+ createBillingPortalSession: {
76591
+ path: "/billing/portal/session",
76592
+ method: "POST",
76593
+ tags: ["billing"],
76594
+ auth: "user",
76595
+ responseKind: "json"
76596
+ }
76597
+ });
76146
76598
  ({
76147
76599
  ...ACCOUNT_ENDPOINT_DEFINITIONS,
76600
+ ...PUBLIC_ONBOARDING_ATTEMPT_ENDPOINT_DEFINITIONS,
76148
76601
  ...PUBLIC_EVENT_ENDPOINT_DEFINITIONS,
76149
76602
  ...GIFTING_ENDPOINT_DEFINITIONS,
76150
- ...PUBLIC_READ_ENDPOINT_DEFINITIONS
76603
+ ...PUBLIC_READ_ENDPOINT_DEFINITIONS,
76604
+ ...BILLING_ENDPOINT_DEFINITIONS
76151
76605
  }), 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
76606
  ...NEWSLETTER_ENDPOINT_DEFINITIONS,
76153
76607
  ...APPOINTMENT_ENDPOINT_DEFINITIONS,
76154
76608
  ...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 };
76609
+ }, 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
76610
  z$1.object({ refreshToken: z$1.string().min(1).max(4096) }).strict();
76157
76611
  z$1.object({
76158
76612
  accessToken: z$1.string().min(1).max(4096),
@@ -76709,7 +77163,17 @@ const riverbankSiteConfigInputSchema = z$1.object({
76709
77163
  z$1.object({
76710
77164
  config: riverbankSiteConfigInputSchema,
76711
77165
  forceContentTypes: z$1.boolean().optional(),
76712
- mode: z$1.enum(["apply", "preview"]).optional()
77166
+ mode: z$1.enum(["apply", "preview"]).optional(),
77167
+ expectedMailingListProviderScope: z$1.unknown().transform((value, ctx) => {
77168
+ if (value === void 0) return void 0;
77169
+ const parsed = parseMailingListProviderScope(value);
77170
+ if (parsed.ok) return parsed.value;
77171
+ ctx.addIssue({
77172
+ code: "custom",
77173
+ message: "Invalid mailing-list provider scope"
77174
+ });
77175
+ return z$1.NEVER;
77176
+ }).optional()
76713
77177
  }).strict();
76714
77178
  //#endregion
76715
77179
  //#region ../api/src/sdkThemeWire.ts