@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
@@ -33,10 +33,12 @@ const unsafeAsMediaAssetId = (id) => id;
33
33
  const unsafeAsStorageBucketName = (value) => value;
34
34
  const unsafeAsStoragePath = (value) => value;
35
35
  const unsafeAsUserId = (id) => id;
36
+ const unsafeAsContentVersionId = (id) => id;
36
37
  const parseSiteId = (value) => parseUuidBrand(value, unsafeAsSiteId);
37
38
  const parseApiKeyId = (value) => parseUuidBrand(value, unsafeAsApiKeyId);
38
39
  const parseEventOfferingId = (value) => parseUuidBrand(value, unsafeAsEventOfferingId);
39
40
  const parseUserId = (value) => parseUuidBrand(value, unsafeAsUserId);
41
+ const parseContentVersionId = (value) => parseUuidBrand(value, unsafeAsContentVersionId);
40
42
  const parseEventSeriesId = (value) => parseUuidBrand(value, unsafeAsEventSeriesId);
41
43
  //#endregion
42
44
  //#region ../core/src/assert-never.ts
@@ -313,7 +315,7 @@ function parseEventPageSurfaceDestinationMode(value) {
313
315
  return value === "cms-managed" || value === "system-managed" ? value : void 0;
314
316
  }
315
317
  function parseEventPageSurfaceSubject(value) {
316
- if (!isRecord$20(value)) return err({ kind: "notObject" });
318
+ if (!isRecord$21(value)) return err({ kind: "notObject" });
317
319
  switch (value.kind) {
318
320
  case "eventSeries": {
319
321
  const eventSeriesId = parseEventSeriesId(value.eventSeriesId);
@@ -368,7 +370,7 @@ function parseEventSeriesIdList(values) {
368
370
  }
369
371
  return ok$1(parsed);
370
372
  }
371
- function isRecord$20(value) {
373
+ function isRecord$21(value) {
372
374
  return typeof value === "object" && value !== null && !Array.isArray(value);
373
375
  }
374
376
  //#endregion
@@ -625,16 +627,47 @@ function parsePositiveInteger(value) {
625
627
  function parseNewsletterListId(value) {
626
628
  return parseTrimmedMatchingString(value, UUID_PATTERN);
627
629
  }
630
+ function parseMailchimpAccountId(value) {
631
+ return parseTrimmedMatchingString(value, OPAQUE_ID_PATTERN);
632
+ }
628
633
  function parseMailchimpAudienceId(value) {
629
634
  return parseTrimmedMatchingString(value, OPAQUE_ID_PATTERN);
630
635
  }
631
636
  function parseMailchimpInterestId(value) {
632
637
  return parseTrimmedMatchingString(value, OPAQUE_ID_PATTERN);
633
638
  }
639
+ function parseBrevoAccountId(value) {
640
+ return parseTrimmedMatchingString(value, OPAQUE_ID_PATTERN);
641
+ }
634
642
  function parseBrevoListId(value) {
635
643
  return parsePositiveInteger(value);
636
644
  }
637
645
  //#endregion
646
+ //#region ../core/src/mailing-list-setup.ts
647
+ function isRecord$20(value) {
648
+ return typeof value === "object" && value !== null && !Array.isArray(value);
649
+ }
650
+ const DEFAULT_MAILING_LIST_SUCCESS_MESSAGE = "Thanks — you're on the list.";
651
+ function parseMailingListProviderScope(value) {
652
+ if (!isRecord$20(value)) return err("invalid_mailing_list_provider_scope");
653
+ if (value.provider === "native") return ok$1({ provider: "native" });
654
+ if (value.provider === "brevo") {
655
+ const accountId = parseBrevoAccountId(value.accountId);
656
+ return accountId !== null ? ok$1({
657
+ provider: "brevo",
658
+ accountId
659
+ }) : err("invalid_mailing_list_provider_scope");
660
+ }
661
+ if (value.provider === "mailchimp") {
662
+ const accountId = parseMailchimpAccountId(value.accountId);
663
+ return accountId !== null ? ok$1({
664
+ provider: "mailchimp",
665
+ accountId
666
+ }) : err("invalid_mailing_list_provider_scope");
667
+ }
668
+ return err("invalid_mailing_list_provider_scope");
669
+ }
670
+ //#endregion
638
671
  //#region ../core/src/mailing-list-setup-parser.ts
639
672
  function parseMailingListGlobalForm(value) {
640
673
  if (!isRecord$19(value)) return formError("shape");
@@ -643,12 +676,15 @@ function parseMailingListGlobalForm(value) {
643
676
  if (typeof value.includeOptionalPhone !== "boolean") return formError("includeOptionalPhone");
644
677
  const buttonLabel = parseRequiredString(value.buttonLabel);
645
678
  if (buttonLabel === null) return formError("buttonLabel");
679
+ const successMessage = parseRequiredString(value.successMessage);
680
+ if (successMessage === null) return formError("successMessage");
646
681
  const privacyNote = parseOptionalString(value.privacyNote);
647
682
  if (privacyNote === void 0) return formError("privacyNote");
648
683
  return ok$1({
649
684
  fields,
650
685
  includeOptionalPhone: value.includeOptionalPhone,
651
686
  buttonLabel,
687
+ successMessage,
652
688
  privacyNote
653
689
  });
654
690
  }
@@ -978,11 +1014,17 @@ function parseMailingListSignedSourceToken(value) {
978
1014
  const parsed = typeof value === "string" ? value.trim() : "";
979
1015
  return /^[A-Za-z0-9._~-]{16,1000}$/u.test(parsed) ? parsed : null;
980
1016
  }
981
- function buildMailingListSignupBlockSourceRef(blockId) {
982
- const parsed = parseMailingListBlockId(blockId);
983
- return parsed !== null ? {
1017
+ function parseMailingListContentVersionId(value) {
1018
+ const parsed = parseContentVersionId(value);
1019
+ return parsed.ok ? parsed.value : null;
1020
+ }
1021
+ function buildMailingListSignupBlockSourceRef(blockId, contentVersionId) {
1022
+ const parsedBlockId = parseMailingListBlockId(blockId);
1023
+ const parsedContentVersionId = parseMailingListContentVersionId(contentVersionId);
1024
+ return parsedBlockId !== null && parsedContentVersionId !== null ? {
984
1025
  tag: "block_ref",
985
- blockId: parsed
1026
+ blockId: parsedBlockId,
1027
+ contentVersionId: parsedContentVersionId
986
1028
  } : null;
987
1029
  }
988
1030
  //#endregion
@@ -5286,6 +5328,509 @@ function parseThemeColorToken(value) {
5286
5328
  }
5287
5329
  const themeColorTokenSchema = z.string().min(1).refine((value) => Boolean(isThemeColorToken(value)), "Expected a known Theme V2 color token");
5288
5330
  //#endregion
5331
+ //#region ../theme-core/src/surfaces/foregroundRoles.ts
5332
+ const SURFACE_FOREGROUND_ROLES = [
5333
+ "text",
5334
+ "heading",
5335
+ "link",
5336
+ "supporting"
5337
+ ];
5338
+ //#endregion
5339
+ //#region ../theme-core/src/surfaces/foregroundContract.ts
5340
+ const SURFACE_FOREGROUND_CSS_VARS = {
5341
+ text: "--rb-surface-text-color",
5342
+ heading: "--rb-surface-heading-color",
5343
+ link: "--rb-surface-link-color",
5344
+ supporting: "--rb-surface-supporting-color"
5345
+ };
5346
+ const DEFAULT_SURFACE_TEXT_COLOR = "rgb(var(--tb-text, 17 24 39))";
5347
+ const DEFAULT_ROLE_FALLBACKS = {
5348
+ text: DEFAULT_SURFACE_TEXT_COLOR,
5349
+ heading: DEFAULT_SURFACE_TEXT_COLOR,
5350
+ link: "rgb(var(--tb-primary, var(--tb-text, 17 24 39)))",
5351
+ supporting: "rgb(var(--tb-mutedText, 100 116 139))"
5352
+ };
5353
+ function requireSurfaceColorValue(role, value) {
5354
+ const normalized = value.trim();
5355
+ if (normalized.length === 0) throw new RangeError(`Surface foreground ${role} must be a non-empty CSS color.`);
5356
+ return normalized;
5357
+ }
5358
+ function completeSurfaceForegrounds(input) {
5359
+ const text = requireSurfaceColorValue("text", input.text);
5360
+ return {
5361
+ text,
5362
+ heading: input.heading === void 0 ? text : requireSurfaceColorValue("heading", input.heading),
5363
+ link: input.link === void 0 ? text : requireSurfaceColorValue("link", input.link),
5364
+ supporting: input.supporting === void 0 ? text : requireSurfaceColorValue("supporting", input.supporting)
5365
+ };
5366
+ }
5367
+ function surfaceForegroundValue(role, outsideProviderFallback = DEFAULT_ROLE_FALLBACKS[role]) {
5368
+ const roleVariable = SURFACE_FOREGROUND_CSS_VARS[role];
5369
+ const fallback = requireSurfaceColorValue("fallback", outsideProviderFallback);
5370
+ if (role === "text") return `var(${roleVariable}, ${fallback})`;
5371
+ return `var(${roleVariable}, var(${SURFACE_FOREGROUND_CSS_VARS.text}, ${fallback}))`;
5372
+ }
5373
+ function surfaceForegroundValueWithOpacity(role, opacityPercent) {
5374
+ if (!Number.isFinite(opacityPercent) || opacityPercent < 0 || opacityPercent > 100) throw new RangeError("Surface foreground opacity must be between 0 and 100.");
5375
+ return `color-mix(in srgb, ${surfaceForegroundValue(role)} ${opacityPercent}%, transparent)`;
5376
+ }
5377
+ function surfaceForegroundStyle(input) {
5378
+ const foregrounds = completeSurfaceForegrounds(input);
5379
+ return {
5380
+ color: foregrounds.text,
5381
+ [SURFACE_FOREGROUND_CSS_VARS.text]: foregrounds.text,
5382
+ [SURFACE_FOREGROUND_CSS_VARS.heading]: foregrounds.heading,
5383
+ [SURFACE_FOREGROUND_CSS_VARS.link]: foregrounds.link,
5384
+ [SURFACE_FOREGROUND_CSS_VARS.supporting]: foregrounds.supporting
5385
+ };
5386
+ }
5387
+ function surfaceForegroundDeclarations(input) {
5388
+ const foregrounds = completeSurfaceForegrounds(input);
5389
+ return [`color: ${foregrounds.text}`, ...SURFACE_FOREGROUND_ROLES.map((role) => `${SURFACE_FOREGROUND_CSS_VARS[role]}: ${foregrounds[role]}`)];
5390
+ }
5391
+ //#endregion
5392
+ //#region ../theme-core/src/palette/colors.ts
5393
+ const HEX_COLOR_REGEX = /^#[0-9a-f]{6}$/;
5394
+ const NORMALIZABLE_HEX_REGEX = /^#(?:[0-9a-f]{3}|[0-9a-f]{6})$/i;
5395
+ const THEME_PALETTE_COLOR_ORDER = [
5396
+ "primary",
5397
+ "secondary",
5398
+ "accent",
5399
+ "success",
5400
+ "warning",
5401
+ "destructive",
5402
+ "background",
5403
+ "surface",
5404
+ "surfaceAlt",
5405
+ "muted",
5406
+ "text",
5407
+ "primaryForeground",
5408
+ "border"
5409
+ ];
5410
+ const hexColorSchema = z.string().regex(HEX_COLOR_REGEX, "Hex must be #RRGGBB (lowercase)").transform((value) => value);
5411
+ const paletteModeSchema = z.enum(["light", "dark"]);
5412
+ const PALETTE_VALUE_KEY_PREFIX = "palette-value:v1|";
5413
+ z.string().regex(/^[0-9a-f]{64}$/, "Palette hash must be a lowercase SHA-256 value").transform((value) => value);
5414
+ const paletteColorsSchema = z.object({
5415
+ primary: hexColorSchema,
5416
+ primaryForeground: hexColorSchema,
5417
+ secondary: hexColorSchema,
5418
+ accent: hexColorSchema,
5419
+ success: hexColorSchema,
5420
+ warning: hexColorSchema,
5421
+ destructive: hexColorSchema,
5422
+ background: hexColorSchema,
5423
+ surface: hexColorSchema,
5424
+ surfaceAlt: hexColorSchema,
5425
+ muted: hexColorSchema,
5426
+ text: hexColorSchema,
5427
+ border: hexColorSchema
5428
+ }).strict().transform((value) => value);
5429
+ function normalizePaletteHex(value) {
5430
+ if (!NORMALIZABLE_HEX_REGEX.test(value)) return null;
5431
+ const normalized = value.toLowerCase();
5432
+ if (normalized.length === 7) return normalized;
5433
+ const triplet = normalized.slice(1);
5434
+ const red = triplet.charAt(0);
5435
+ const green = triplet.charAt(1);
5436
+ const blue = triplet.charAt(2);
5437
+ return `#${red}${red}${green}${green}${blue}${blue}`;
5438
+ }
5439
+ function paletteColorsFromEntries(entries) {
5440
+ const values = {};
5441
+ for (const entry of entries) {
5442
+ const parsedRole = paletteTokenNameSchema.safeParse(entry.name);
5443
+ if (!parsedRole.success) return {
5444
+ ok: false,
5445
+ error: {
5446
+ kind: "unknown-role",
5447
+ role: entry.name
5448
+ }
5449
+ };
5450
+ const role = parsedRole.data;
5451
+ if (values[role] !== void 0) return {
5452
+ ok: false,
5453
+ error: {
5454
+ kind: "duplicate-role",
5455
+ role
5456
+ }
5457
+ };
5458
+ const hex = normalizePaletteHex(entry.hex);
5459
+ if (!hex) return {
5460
+ ok: false,
5461
+ error: {
5462
+ kind: "invalid-color",
5463
+ role,
5464
+ value: entry.hex
5465
+ }
5466
+ };
5467
+ values[role] = hex;
5468
+ }
5469
+ const missing = PALETTE_TOKEN_NAMES.filter((role) => values[role] === void 0);
5470
+ if (missing.length > 0) return {
5471
+ ok: false,
5472
+ error: {
5473
+ kind: "missing-roles",
5474
+ roles: missing
5475
+ }
5476
+ };
5477
+ return {
5478
+ ok: true,
5479
+ colors: paletteColorsSchema.parse(values)
5480
+ };
5481
+ }
5482
+ function requirePaletteColorsFromEntries(entries) {
5483
+ const result = paletteColorsFromEntries(entries);
5484
+ if (result.ok) return result.colors;
5485
+ throw new Error(`Invalid complete palette: ${result.error.kind}`);
5486
+ }
5487
+ function paletteColorEntries(colors) {
5488
+ return THEME_PALETTE_COLOR_ORDER.map((name) => ({
5489
+ name,
5490
+ hex: colors[name]
5491
+ }));
5492
+ }
5493
+ function paletteColorFingerprint(colors) {
5494
+ return PALETTE_TOKEN_NAMES.map((name) => `${name}:${colors[name]}`).join("|");
5495
+ }
5496
+ function canonicalPaletteHashInput(colors, mode) {
5497
+ return `${mode}|${paletteColorFingerprint(colors)}`;
5498
+ }
5499
+ /**
5500
+ * Stable curated-catalogue identity. Do not reorder roles: the order comes
5501
+ * from PALETTE_TOKEN_NAMES through canonicalPaletteHashInput.
5502
+ */
5503
+ function paletteValueKey(colors, mode) {
5504
+ return `${PALETTE_VALUE_KEY_PREFIX}${canonicalPaletteHashInput(colors, mode)}`;
5505
+ }
5506
+ /** Parses only the exact v1 canonical form emitted by paletteValueKey. */
5507
+ function parsePaletteValueKey(value) {
5508
+ if (typeof value !== "string" || !value.startsWith(PALETTE_VALUE_KEY_PREFIX)) return null;
5509
+ const [rawMode, ...rawRoles] = value.slice(17).split("|");
5510
+ const mode = paletteModeSchema.safeParse(rawMode);
5511
+ if (!mode.success || rawRoles.length !== PALETTE_TOKEN_NAMES.length) return null;
5512
+ const colors = paletteColorsFromEntries(rawRoles.map((roleValue) => {
5513
+ const separator = roleValue.indexOf(":");
5514
+ return separator === -1 ? {
5515
+ name: "",
5516
+ hex: ""
5517
+ } : {
5518
+ name: roleValue.slice(0, separator),
5519
+ hex: roleValue.slice(separator + 1)
5520
+ };
5521
+ }));
5522
+ if (!colors.ok || paletteValueKey(colors.colors, mode.data) !== value) return null;
5523
+ return value;
5524
+ }
5525
+ const paletteValueKeySchema = z.string().transform((value, ctx) => {
5526
+ const parsed = parsePaletteValueKey(value);
5527
+ if (parsed) return parsed;
5528
+ ctx.addIssue({
5529
+ code: "custom",
5530
+ message: "Invalid canonical palette value key"
5531
+ });
5532
+ return z.NEVER;
5533
+ });
5534
+ //#endregion
5535
+ //#region ../theme-core/src/palette/utils/opaqueSurfaceColor.ts
5536
+ /** Resolve an opaque colour, compositing alpha against an explicit underlay. */
5537
+ function resolveOpaqueSurfaceHex(reference, palette, underlayReference) {
5538
+ const opaque = resolveConcreteColorHex(reference, palette);
5539
+ if (opaque) return opaque;
5540
+ if (!underlayReference) return null;
5541
+ const underlayHex = resolveConcreteColorHex(underlayReference, palette);
5542
+ if (!underlayHex) return null;
5543
+ const parts = parseColorTokenParts(reference);
5544
+ if (parts.kind === "token" && parts.opacityPercent !== null) {
5545
+ const foregroundHex = normalizePaletteHex(palette[parts.token] ?? "");
5546
+ return foregroundHex ? compositeHex(foregroundHex, underlayHex, parts.opacityPercent / 100) : null;
5547
+ }
5548
+ const rgba = parseRgba(parts.kind === "raw" ? parts.value : reference);
5549
+ return rgba ? compositeHex(rgbToHex(rgba.r, rgba.g, rgba.b), underlayHex, rgba.alpha) : null;
5550
+ }
5551
+ /** Resolve a colour reference only when it is already fully opaque. */
5552
+ function resolveConcreteColorHex(reference, palette) {
5553
+ const literalHex = normalizePaletteHex(reference);
5554
+ if (literalHex) return literalHex;
5555
+ const parts = parseColorTokenParts(reference);
5556
+ if (parts.kind === "token") {
5557
+ if (parts.opacityPercent !== null) return null;
5558
+ return normalizePaletteHex(palette[parts.token] ?? "");
5559
+ }
5560
+ const literal = parts.kind === "raw" ? parts.value : reference;
5561
+ if (literal.toLowerCase() === "black") return "#000000";
5562
+ if (literal.toLowerCase() === "white") return "#ffffff";
5563
+ return normalizePaletteHex(literal);
5564
+ }
5565
+ function compositeHex(foregroundHex, underlayHex, alpha) {
5566
+ const foreground = hexToRgb(foregroundHex);
5567
+ const underlay = hexToRgb(underlayHex);
5568
+ const channel = (foregroundValue, underlayValue) => Math.round(foregroundValue * alpha + underlayValue * (1 - alpha));
5569
+ return rgbToHex(channel(foreground.r, underlay.r), channel(foreground.g, underlay.g), channel(foreground.b, underlay.b));
5570
+ }
5571
+ function parseRgba(value) {
5572
+ const match = value.trim().match(/^rgba?\(\s*([\d.]+)(?:\s*,\s*|\s+)([\d.]+)(?:\s*,\s*|\s+)([\d.]+)(?:\s*(?:,|\/)\s*([\d.]+%?))?\s*\)$/i);
5573
+ if (!match) return null;
5574
+ const [, rSource, gSource, bSource] = match;
5575
+ if (!rSource || !gSource || !bSource) return null;
5576
+ const r = Number(rSource);
5577
+ const g = Number(gSource);
5578
+ const b = Number(bSource);
5579
+ const alpha = parseAlpha(match[4]);
5580
+ if (alpha === null || !isRgbChannel(r) || !isRgbChannel(g) || !isRgbChannel(b)) return null;
5581
+ return {
5582
+ r,
5583
+ g,
5584
+ b,
5585
+ alpha
5586
+ };
5587
+ }
5588
+ function parseAlpha(source) {
5589
+ if (!source) return 1;
5590
+ const value = source.endsWith("%") ? Number(source.slice(0, -1)) / 100 : Number(source);
5591
+ return Number.isFinite(value) && value >= 0 && value <= 1 ? value : null;
5592
+ }
5593
+ function isRgbChannel(value) {
5594
+ return Number.isFinite(value) && value >= 0 && value <= 255;
5595
+ }
5596
+ //#endregion
5597
+ //#region ../theme-core/src/surfaces/resolveSurfaceForeground.ts
5598
+ const FALLBACK_TEXT_TOKENS = [
5599
+ "text",
5600
+ "primaryForeground",
5601
+ "secondaryForeground",
5602
+ "accentForeground",
5603
+ "neutral-950",
5604
+ "neutral-50"
5605
+ ];
5606
+ const CANONICAL_EQUIVALENT_TOKEN_ORDER = [
5607
+ "text",
5608
+ "primaryForeground",
5609
+ "secondaryForeground",
5610
+ "accentForeground",
5611
+ "onPrimary",
5612
+ "onSecondary",
5613
+ "onAccent",
5614
+ "onSurface",
5615
+ "neutral-950",
5616
+ "neutral-50"
5617
+ ];
5618
+ /**
5619
+ * Resolve the complete foreground contract for an effective page/section or
5620
+ * site-chrome background.
5621
+ *
5622
+ * Deterministic colour backgrounds are validated at ordinary-text WCAG AA.
5623
+ * Existing image/video/gradient treatments are trusted only when they already
5624
+ * carry a usable foreground token; this function deliberately does not claim
5625
+ * pixel-level contrast proof for media.
5626
+ */
5627
+ function resolveSurfaceForeground(background, palette, candidates = {}, options = {}) {
5628
+ const authored = foregroundCandidates(background, candidates);
5629
+ if (background === null) return resolveDeterministicForeground("background", {
5630
+ ...authored,
5631
+ text: authored.text ?? "text"
5632
+ }, palette);
5633
+ if (background.type === "color") {
5634
+ const backgroundReference = normalizedReference(background.color);
5635
+ if (!backgroundReference || backgroundReference === "transparent") return { kind: "unknown" };
5636
+ return resolveDeterministicForeground(backgroundReference, authored, palette, options.compositeBase);
5637
+ }
5638
+ return resolveTrustedTreatmentForeground(authored, palette);
5639
+ }
5640
+ function foregroundCandidates(background, overrides) {
5641
+ return {
5642
+ text: overrides.text ?? background?.textColor ?? null,
5643
+ heading: overrides.heading ?? background?.headingColor ?? null,
5644
+ link: overrides.link ?? background?.linkColor ?? null,
5645
+ supporting: overrides.supporting ?? background?.supportingColor ?? null
5646
+ };
5647
+ }
5648
+ function resolveDeterministicForeground(backgroundReference, candidates, palette, compositeBase) {
5649
+ const backgroundHex = resolveOpaqueSurfaceHex(backgroundReference, palette, compositeBase);
5650
+ if (!backgroundHex) return resolveTrustedTreatmentForeground(candidates, palette);
5651
+ const backgroundToken = paletteToken(backgroundReference);
5652
+ const derivedOnToken = backgroundToken ? onColorTokenName(backgroundToken) : null;
5653
+ const text = firstSafeToken([
5654
+ candidates.text,
5655
+ derivedOnToken,
5656
+ ...FALLBACK_TEXT_TOKENS
5657
+ ], backgroundHex, palette, derivedOnToken ? [derivedOnToken] : []);
5658
+ if (!text) return { kind: "unknown" };
5659
+ return {
5660
+ kind: "known",
5661
+ roles: {
5662
+ text,
5663
+ heading: safeTokenOr(candidates.heading, text, backgroundHex, palette),
5664
+ link: safeTokenOr(candidates.link, text, backgroundHex, palette),
5665
+ supporting: safeTokenOr(candidates.supporting, text, backgroundHex, palette)
5666
+ }
5667
+ };
5668
+ }
5669
+ function resolveTrustedTreatmentForeground(candidates, palette) {
5670
+ const text = canonicalToken(candidates.text, palette);
5671
+ if (!text) return { kind: "unknown" };
5672
+ return {
5673
+ kind: "known",
5674
+ roles: {
5675
+ text,
5676
+ heading: canonicalToken(candidates.heading, palette) ?? text,
5677
+ link: canonicalToken(candidates.link, palette) ?? text,
5678
+ supporting: canonicalToken(candidates.supporting, palette) ?? text
5679
+ }
5680
+ };
5681
+ }
5682
+ function safeTokenOr(candidate, fallback, backgroundHex, palette) {
5683
+ return firstSafeToken([candidate], backgroundHex, palette) ?? fallback;
5684
+ }
5685
+ function firstSafeToken(candidates, backgroundHex, palette, preferredEquivalentTokens = []) {
5686
+ const seen = /* @__PURE__ */ new Set();
5687
+ for (const candidate of candidates) {
5688
+ const token = canonicalToken(candidate, palette, preferredEquivalentTokens);
5689
+ if (!token || seen.has(token)) continue;
5690
+ seen.add(token);
5691
+ const foregroundHex = resolveConcreteColorHex(token, palette);
5692
+ if (foregroundHex && contrastRatio(backgroundHex, foregroundHex) >= 4.5) return token;
5693
+ }
5694
+ return null;
5695
+ }
5696
+ function canonicalToken(reference, palette, preferredEquivalentTokens = []) {
5697
+ const normalized = normalizedReference(reference);
5698
+ if (!normalized || normalized === "transparent") return null;
5699
+ const direct = parseThemeColorToken(normalized);
5700
+ if (direct && resolveConcreteColorHex(direct, palette)) return direct;
5701
+ const referenceHex = resolveConcreteColorHex(normalized, palette);
5702
+ if (!referenceHex) return null;
5703
+ const equivalent = [
5704
+ ...preferredEquivalentTokens,
5705
+ ...CANONICAL_EQUIVALENT_TOKEN_ORDER,
5706
+ ...Object.keys(palette).sort()
5707
+ ].find((token) => {
5708
+ const parsed = parseThemeColorToken(token);
5709
+ return parsed !== null && resolveConcreteColorHex(parsed, palette)?.toLowerCase() === referenceHex.toLowerCase();
5710
+ });
5711
+ return equivalent ? parseThemeColorToken(equivalent) : null;
5712
+ }
5713
+ function paletteToken(reference) {
5714
+ const parts = parseColorTokenParts(reference);
5715
+ return parts.kind === "token" && parts.opacityPercent === null ? parts.token : null;
5716
+ }
5717
+ function normalizedReference(value) {
5718
+ if (typeof value !== "string") return null;
5719
+ const normalized = value.trim();
5720
+ return normalized.length > 0 ? normalized : null;
5721
+ }
5722
+ //#endregion
5723
+ //#region ../theme-core/src/utils/colorStyles.ts
5724
+ const COLOR_VAR_PREFIX = "--tb-";
5725
+ function parseToken(source) {
5726
+ const parts = parseColorTokenParts(source);
5727
+ if (parts.kind === "raw") return {
5728
+ token: source,
5729
+ raw: parts.value
5730
+ };
5731
+ if (parts.kind === "invalid") return { token: source };
5732
+ return {
5733
+ token: parts.token,
5734
+ opacityPercent: parts.opacityPercent === null ? void 0 : parts.opacityPercent
5735
+ };
5736
+ }
5737
+ const SURFACE_TEXT_ROLE_BY_TOKEN = {
5738
+ text: "text",
5739
+ heading: "heading",
5740
+ mutedText: "supporting"
5741
+ };
5742
+ function surfaceRoleForTextToken(token) {
5743
+ return Object.prototype.hasOwnProperty.call(SURFACE_TEXT_ROLE_BY_TOKEN, token) ? SURFACE_TEXT_ROLE_BY_TOKEN[token] : null;
5744
+ }
5745
+ /**
5746
+ * Converts a theme color token to a CSS rgb value.
5747
+ * This is the primary function for applying theme colors to CSS properties.
5748
+ *
5749
+ * @param token - Theme color token (semantic, with opacity, or raw)
5750
+ * @returns CSS color value (rgb with optional alpha, or raw CSS value)
5751
+ *
5752
+ * @example
5753
+ * rgbColorValue('primary') // => 'rgb(var(--tb-primary))'
5754
+ * rgbColorValue('surface/95') // => 'rgb(var(--tb-surface) / 0.95)'
5755
+ * rgbColorValue('raw:transparent') // => 'transparent'
5756
+ */
5757
+ function rgbColorValue(token) {
5758
+ const { token: baseToken, opacityPercent, raw } = parseToken(token);
5759
+ if (raw) return raw;
5760
+ const cssVar = `${COLOR_VAR_PREFIX}${baseToken}`;
5761
+ if (opacityPercent === void 0) return `rgb(var(${cssVar}))`;
5762
+ return `rgb(var(${cssVar}) / ${opacityPercent / 100})`;
5763
+ }
5764
+ /**
5765
+ * Converts a theme color token to a CSS variable reference.
5766
+ * Note: This returns the base variable without rgb() wrapper, ignoring opacity.
5767
+ *
5768
+ * @param token - Theme color token
5769
+ * @returns CSS variable reference
5770
+ *
5771
+ * @example
5772
+ * cssVarValue('primary') // => 'var(--tb-primary)'
5773
+ * cssVarValue('surface/95') // => 'var(--tb-surface)' (opacity ignored)
5774
+ */
5775
+ function cssVarValue(token) {
5776
+ const { token: baseToken } = parseToken(token);
5777
+ return `var(${COLOR_VAR_PREFIX}${baseToken})`;
5778
+ }
5779
+ /**
5780
+ * Creates a backgroundColor style object from a theme token.
5781
+ *
5782
+ * @param token - Theme color token
5783
+ * @returns CSSProperties with backgroundColor
5784
+ */
5785
+ function backgroundColorStyle(token) {
5786
+ return { backgroundColor: rgbColorValue(token) };
5787
+ }
5788
+ /**
5789
+ * Creates a text color style object from a theme token.
5790
+ *
5791
+ * @param token - Theme color token
5792
+ * @returns CSSProperties with color
5793
+ */
5794
+ function textColorStyle(token) {
5795
+ const parsed = parseToken(token);
5796
+ const surfaceRole = parsed.raw ? null : surfaceRoleForTextToken(parsed.token);
5797
+ if (surfaceRole) return { color: parsed.opacityPercent === void 0 ? surfaceForegroundValue(surfaceRole) : surfaceForegroundValueWithOpacity(surfaceRole, parsed.opacityPercent) };
5798
+ return { color: rgbColorValue(token) };
5799
+ }
5800
+ /**
5801
+ * Creates a border color style object from a theme token.
5802
+ *
5803
+ * @param token - Theme color token
5804
+ * @returns CSSProperties with borderColor
5805
+ */
5806
+ function borderColorStyle(token) {
5807
+ return { borderColor: rgbColorValue(token) };
5808
+ }
5809
+ /**
5810
+ * Merges multiple CSSProperties objects into a single object.
5811
+ * Later styles override earlier ones. Undefined values are filtered out.
5812
+ * Returns undefined if the merged result is empty.
5813
+ *
5814
+ * @param styles - Variable number of CSSProperties objects (can be undefined)
5815
+ * @returns Merged CSSProperties object, or undefined if empty
5816
+ *
5817
+ * @example
5818
+ * mergeStyles(
5819
+ * backgroundColorStyle('surface'),
5820
+ * textColorStyle('text'),
5821
+ * borderColorStyle('border')
5822
+ * )
5823
+ * // => { backgroundColor: '...', color: '...', borderColor: '...' }
5824
+ */
5825
+ function mergeStyles(...styles) {
5826
+ const merged = {};
5827
+ for (const style of styles) {
5828
+ if (!style) continue;
5829
+ Object.assign(merged, style);
5830
+ }
5831
+ return Object.keys(merged).length ? merged : void 0;
5832
+ }
5833
+ //#endregion
5289
5834
  //#region ../theme-core/src/tokens/resolver.ts
5290
5835
  /**
5291
5836
  * Resolves theme tokens to CSS variables
@@ -5312,7 +5857,7 @@ var TokenResolver = class {
5312
5857
  */
5313
5858
  getColor(token) {
5314
5859
  if (!this.tokenExists(token)) console.warn(`[TokenResolver] Color token "${token}" not found in theme palette. Button may render incorrectly.`);
5315
- return `rgb(var(--tb-${token}))`;
5860
+ return rgbColorValue(token);
5316
5861
  }
5317
5862
  /**
5318
5863
  * Adjust a color token's shade by a given amount
@@ -6018,398 +6563,6 @@ function resolveCardRole(theme, cardSystem, role) {
6018
6563
  }
6019
6564
  }
6020
6565
  //#endregion
6021
- //#region ../theme-core/src/surfaces/foregroundRoles.ts
6022
- const SURFACE_FOREGROUND_ROLES = [
6023
- "text",
6024
- "heading",
6025
- "link",
6026
- "supporting"
6027
- ];
6028
- //#endregion
6029
- //#region ../theme-core/src/surfaces/foregroundContract.ts
6030
- const SURFACE_FOREGROUND_CSS_VARS = {
6031
- text: "--rb-surface-text-color",
6032
- heading: "--rb-surface-heading-color",
6033
- link: "--rb-surface-link-color",
6034
- supporting: "--rb-surface-supporting-color"
6035
- };
6036
- const DEFAULT_SURFACE_TEXT_COLOR = "rgb(var(--tb-text, 17 24 39))";
6037
- const DEFAULT_ROLE_FALLBACKS = {
6038
- text: DEFAULT_SURFACE_TEXT_COLOR,
6039
- heading: DEFAULT_SURFACE_TEXT_COLOR,
6040
- link: "rgb(var(--tb-primary, var(--tb-text, 17 24 39)))",
6041
- supporting: "rgb(var(--tb-mutedText, 100 116 139))"
6042
- };
6043
- function requireSurfaceColorValue(role, value) {
6044
- const normalized = value.trim();
6045
- if (normalized.length === 0) throw new RangeError(`Surface foreground ${role} must be a non-empty CSS color.`);
6046
- return normalized;
6047
- }
6048
- function completeSurfaceForegrounds(input) {
6049
- const text = requireSurfaceColorValue("text", input.text);
6050
- return {
6051
- text,
6052
- heading: input.heading === void 0 ? text : requireSurfaceColorValue("heading", input.heading),
6053
- link: input.link === void 0 ? text : requireSurfaceColorValue("link", input.link),
6054
- supporting: input.supporting === void 0 ? text : requireSurfaceColorValue("supporting", input.supporting)
6055
- };
6056
- }
6057
- function surfaceForegroundValue(role, outsideProviderFallback = DEFAULT_ROLE_FALLBACKS[role]) {
6058
- const roleVariable = SURFACE_FOREGROUND_CSS_VARS[role];
6059
- const fallback = requireSurfaceColorValue("fallback", outsideProviderFallback);
6060
- if (role === "text") return `var(${roleVariable}, ${fallback})`;
6061
- return `var(${roleVariable}, var(${SURFACE_FOREGROUND_CSS_VARS.text}, ${fallback}))`;
6062
- }
6063
- function surfaceForegroundValueWithOpacity(role, opacityPercent) {
6064
- if (!Number.isFinite(opacityPercent) || opacityPercent < 0 || opacityPercent > 100) throw new RangeError("Surface foreground opacity must be between 0 and 100.");
6065
- return `color-mix(in srgb, ${surfaceForegroundValue(role)} ${opacityPercent}%, transparent)`;
6066
- }
6067
- function surfaceForegroundStyle(input) {
6068
- const foregrounds = completeSurfaceForegrounds(input);
6069
- return {
6070
- color: foregrounds.text,
6071
- [SURFACE_FOREGROUND_CSS_VARS.text]: foregrounds.text,
6072
- [SURFACE_FOREGROUND_CSS_VARS.heading]: foregrounds.heading,
6073
- [SURFACE_FOREGROUND_CSS_VARS.link]: foregrounds.link,
6074
- [SURFACE_FOREGROUND_CSS_VARS.supporting]: foregrounds.supporting
6075
- };
6076
- }
6077
- function surfaceForegroundDeclarations(input) {
6078
- const foregrounds = completeSurfaceForegrounds(input);
6079
- return [`color: ${foregrounds.text}`, ...SURFACE_FOREGROUND_ROLES.map((role) => `${SURFACE_FOREGROUND_CSS_VARS[role]}: ${foregrounds[role]}`)];
6080
- }
6081
- //#endregion
6082
- //#region ../theme-core/src/palette/colors.ts
6083
- const HEX_COLOR_REGEX = /^#[0-9a-f]{6}$/;
6084
- const NORMALIZABLE_HEX_REGEX = /^#(?:[0-9a-f]{3}|[0-9a-f]{6})$/i;
6085
- const THEME_PALETTE_COLOR_ORDER = [
6086
- "primary",
6087
- "secondary",
6088
- "accent",
6089
- "success",
6090
- "warning",
6091
- "destructive",
6092
- "background",
6093
- "surface",
6094
- "surfaceAlt",
6095
- "muted",
6096
- "text",
6097
- "primaryForeground",
6098
- "border"
6099
- ];
6100
- const hexColorSchema = z.string().regex(HEX_COLOR_REGEX, "Hex must be #RRGGBB (lowercase)").transform((value) => value);
6101
- const paletteModeSchema = z.enum(["light", "dark"]);
6102
- const PALETTE_VALUE_KEY_PREFIX = "palette-value:v1|";
6103
- z.string().regex(/^[0-9a-f]{64}$/, "Palette hash must be a lowercase SHA-256 value").transform((value) => value);
6104
- const paletteColorsSchema = z.object({
6105
- primary: hexColorSchema,
6106
- primaryForeground: hexColorSchema,
6107
- secondary: hexColorSchema,
6108
- accent: hexColorSchema,
6109
- success: hexColorSchema,
6110
- warning: hexColorSchema,
6111
- destructive: hexColorSchema,
6112
- background: hexColorSchema,
6113
- surface: hexColorSchema,
6114
- surfaceAlt: hexColorSchema,
6115
- muted: hexColorSchema,
6116
- text: hexColorSchema,
6117
- border: hexColorSchema
6118
- }).strict().transform((value) => value);
6119
- function normalizePaletteHex(value) {
6120
- if (!NORMALIZABLE_HEX_REGEX.test(value)) return null;
6121
- const normalized = value.toLowerCase();
6122
- if (normalized.length === 7) return normalized;
6123
- const triplet = normalized.slice(1);
6124
- const red = triplet.charAt(0);
6125
- const green = triplet.charAt(1);
6126
- const blue = triplet.charAt(2);
6127
- return `#${red}${red}${green}${green}${blue}${blue}`;
6128
- }
6129
- function paletteColorsFromEntries(entries) {
6130
- const values = {};
6131
- for (const entry of entries) {
6132
- const parsedRole = paletteTokenNameSchema.safeParse(entry.name);
6133
- if (!parsedRole.success) return {
6134
- ok: false,
6135
- error: {
6136
- kind: "unknown-role",
6137
- role: entry.name
6138
- }
6139
- };
6140
- const role = parsedRole.data;
6141
- if (values[role] !== void 0) return {
6142
- ok: false,
6143
- error: {
6144
- kind: "duplicate-role",
6145
- role
6146
- }
6147
- };
6148
- const hex = normalizePaletteHex(entry.hex);
6149
- if (!hex) return {
6150
- ok: false,
6151
- error: {
6152
- kind: "invalid-color",
6153
- role,
6154
- value: entry.hex
6155
- }
6156
- };
6157
- values[role] = hex;
6158
- }
6159
- const missing = PALETTE_TOKEN_NAMES.filter((role) => values[role] === void 0);
6160
- if (missing.length > 0) return {
6161
- ok: false,
6162
- error: {
6163
- kind: "missing-roles",
6164
- roles: missing
6165
- }
6166
- };
6167
- return {
6168
- ok: true,
6169
- colors: paletteColorsSchema.parse(values)
6170
- };
6171
- }
6172
- function requirePaletteColorsFromEntries(entries) {
6173
- const result = paletteColorsFromEntries(entries);
6174
- if (result.ok) return result.colors;
6175
- throw new Error(`Invalid complete palette: ${result.error.kind}`);
6176
- }
6177
- function paletteColorEntries(colors) {
6178
- return THEME_PALETTE_COLOR_ORDER.map((name) => ({
6179
- name,
6180
- hex: colors[name]
6181
- }));
6182
- }
6183
- function paletteColorFingerprint(colors) {
6184
- return PALETTE_TOKEN_NAMES.map((name) => `${name}:${colors[name]}`).join("|");
6185
- }
6186
- function canonicalPaletteHashInput(colors, mode) {
6187
- return `${mode}|${paletteColorFingerprint(colors)}`;
6188
- }
6189
- /**
6190
- * Stable curated-catalogue identity. Do not reorder roles: the order comes
6191
- * from PALETTE_TOKEN_NAMES through canonicalPaletteHashInput.
6192
- */
6193
- function paletteValueKey(colors, mode) {
6194
- return `${PALETTE_VALUE_KEY_PREFIX}${canonicalPaletteHashInput(colors, mode)}`;
6195
- }
6196
- /** Parses only the exact v1 canonical form emitted by paletteValueKey. */
6197
- function parsePaletteValueKey(value) {
6198
- if (typeof value !== "string" || !value.startsWith(PALETTE_VALUE_KEY_PREFIX)) return null;
6199
- const [rawMode, ...rawRoles] = value.slice(17).split("|");
6200
- const mode = paletteModeSchema.safeParse(rawMode);
6201
- if (!mode.success || rawRoles.length !== PALETTE_TOKEN_NAMES.length) return null;
6202
- const colors = paletteColorsFromEntries(rawRoles.map((roleValue) => {
6203
- const separator = roleValue.indexOf(":");
6204
- return separator === -1 ? {
6205
- name: "",
6206
- hex: ""
6207
- } : {
6208
- name: roleValue.slice(0, separator),
6209
- hex: roleValue.slice(separator + 1)
6210
- };
6211
- }));
6212
- if (!colors.ok || paletteValueKey(colors.colors, mode.data) !== value) return null;
6213
- return value;
6214
- }
6215
- const paletteValueKeySchema = z.string().transform((value, ctx) => {
6216
- const parsed = parsePaletteValueKey(value);
6217
- if (parsed) return parsed;
6218
- ctx.addIssue({
6219
- code: "custom",
6220
- message: "Invalid canonical palette value key"
6221
- });
6222
- return z.NEVER;
6223
- });
6224
- //#endregion
6225
- //#region ../theme-core/src/palette/utils/opaqueSurfaceColor.ts
6226
- /** Resolve an opaque colour, compositing alpha against an explicit underlay. */
6227
- function resolveOpaqueSurfaceHex(reference, palette, underlayReference) {
6228
- const opaque = resolveConcreteColorHex(reference, palette);
6229
- if (opaque) return opaque;
6230
- if (!underlayReference) return null;
6231
- const underlayHex = resolveConcreteColorHex(underlayReference, palette);
6232
- if (!underlayHex) return null;
6233
- const parts = parseColorTokenParts(reference);
6234
- if (parts.kind === "token" && parts.opacityPercent !== null) {
6235
- const foregroundHex = normalizePaletteHex(palette[parts.token] ?? "");
6236
- return foregroundHex ? compositeHex(foregroundHex, underlayHex, parts.opacityPercent / 100) : null;
6237
- }
6238
- const rgba = parseRgba(parts.kind === "raw" ? parts.value : reference);
6239
- return rgba ? compositeHex(rgbToHex(rgba.r, rgba.g, rgba.b), underlayHex, rgba.alpha) : null;
6240
- }
6241
- /** Resolve a colour reference only when it is already fully opaque. */
6242
- function resolveConcreteColorHex(reference, palette) {
6243
- const literalHex = normalizePaletteHex(reference);
6244
- if (literalHex) return literalHex;
6245
- const parts = parseColorTokenParts(reference);
6246
- if (parts.kind === "token") {
6247
- if (parts.opacityPercent !== null) return null;
6248
- return normalizePaletteHex(palette[parts.token] ?? "");
6249
- }
6250
- const literal = parts.kind === "raw" ? parts.value : reference;
6251
- if (literal.toLowerCase() === "black") return "#000000";
6252
- if (literal.toLowerCase() === "white") return "#ffffff";
6253
- return normalizePaletteHex(literal);
6254
- }
6255
- function compositeHex(foregroundHex, underlayHex, alpha) {
6256
- const foreground = hexToRgb(foregroundHex);
6257
- const underlay = hexToRgb(underlayHex);
6258
- const channel = (foregroundValue, underlayValue) => Math.round(foregroundValue * alpha + underlayValue * (1 - alpha));
6259
- return rgbToHex(channel(foreground.r, underlay.r), channel(foreground.g, underlay.g), channel(foreground.b, underlay.b));
6260
- }
6261
- function parseRgba(value) {
6262
- const match = value.trim().match(/^rgba?\(\s*([\d.]+)(?:\s*,\s*|\s+)([\d.]+)(?:\s*,\s*|\s+)([\d.]+)(?:\s*(?:,|\/)\s*([\d.]+%?))?\s*\)$/i);
6263
- if (!match) return null;
6264
- const [, rSource, gSource, bSource] = match;
6265
- if (!rSource || !gSource || !bSource) return null;
6266
- const r = Number(rSource);
6267
- const g = Number(gSource);
6268
- const b = Number(bSource);
6269
- const alpha = parseAlpha(match[4]);
6270
- if (alpha === null || !isRgbChannel(r) || !isRgbChannel(g) || !isRgbChannel(b)) return null;
6271
- return {
6272
- r,
6273
- g,
6274
- b,
6275
- alpha
6276
- };
6277
- }
6278
- function parseAlpha(source) {
6279
- if (!source) return 1;
6280
- const value = source.endsWith("%") ? Number(source.slice(0, -1)) / 100 : Number(source);
6281
- return Number.isFinite(value) && value >= 0 && value <= 1 ? value : null;
6282
- }
6283
- function isRgbChannel(value) {
6284
- return Number.isFinite(value) && value >= 0 && value <= 255;
6285
- }
6286
- //#endregion
6287
- //#region ../theme-core/src/surfaces/resolveSurfaceForeground.ts
6288
- const FALLBACK_TEXT_TOKENS = [
6289
- "text",
6290
- "primaryForeground",
6291
- "secondaryForeground",
6292
- "accentForeground",
6293
- "neutral-950",
6294
- "neutral-50"
6295
- ];
6296
- const CANONICAL_EQUIVALENT_TOKEN_ORDER = [
6297
- "text",
6298
- "primaryForeground",
6299
- "secondaryForeground",
6300
- "accentForeground",
6301
- "onPrimary",
6302
- "onSecondary",
6303
- "onAccent",
6304
- "onSurface",
6305
- "neutral-950",
6306
- "neutral-50"
6307
- ];
6308
- /**
6309
- * Resolve the complete foreground contract for an effective page/section or
6310
- * site-chrome background.
6311
- *
6312
- * Deterministic colour backgrounds are validated at ordinary-text WCAG AA.
6313
- * Existing image/video/gradient treatments are trusted only when they already
6314
- * carry a usable foreground token; this function deliberately does not claim
6315
- * pixel-level contrast proof for media.
6316
- */
6317
- function resolveSurfaceForeground(background, palette, candidates = {}, options = {}) {
6318
- const authored = foregroundCandidates(background, candidates);
6319
- if (background === null) return resolveDeterministicForeground("background", {
6320
- ...authored,
6321
- text: authored.text ?? "text"
6322
- }, palette);
6323
- if (background.type === "color") {
6324
- const backgroundReference = normalizedReference(background.color);
6325
- if (!backgroundReference || backgroundReference === "transparent") return { kind: "unknown" };
6326
- return resolveDeterministicForeground(backgroundReference, authored, palette, options.compositeBase);
6327
- }
6328
- return resolveTrustedTreatmentForeground(authored, palette);
6329
- }
6330
- function foregroundCandidates(background, overrides) {
6331
- return {
6332
- text: overrides.text ?? background?.textColor ?? null,
6333
- heading: overrides.heading ?? background?.headingColor ?? null,
6334
- link: overrides.link ?? background?.linkColor ?? null,
6335
- supporting: overrides.supporting ?? background?.supportingColor ?? null
6336
- };
6337
- }
6338
- function resolveDeterministicForeground(backgroundReference, candidates, palette, compositeBase) {
6339
- const backgroundHex = resolveOpaqueSurfaceHex(backgroundReference, palette, compositeBase);
6340
- if (!backgroundHex) return resolveTrustedTreatmentForeground(candidates, palette);
6341
- const backgroundToken = paletteToken(backgroundReference);
6342
- const derivedOnToken = backgroundToken ? onColorTokenName(backgroundToken) : null;
6343
- const text = firstSafeToken([
6344
- candidates.text,
6345
- derivedOnToken,
6346
- ...FALLBACK_TEXT_TOKENS
6347
- ], backgroundHex, palette, derivedOnToken ? [derivedOnToken] : []);
6348
- if (!text) return { kind: "unknown" };
6349
- return {
6350
- kind: "known",
6351
- roles: {
6352
- text,
6353
- heading: safeTokenOr(candidates.heading, text, backgroundHex, palette),
6354
- link: safeTokenOr(candidates.link, text, backgroundHex, palette),
6355
- supporting: safeTokenOr(candidates.supporting, text, backgroundHex, palette)
6356
- }
6357
- };
6358
- }
6359
- function resolveTrustedTreatmentForeground(candidates, palette) {
6360
- const text = canonicalToken(candidates.text, palette);
6361
- if (!text) return { kind: "unknown" };
6362
- return {
6363
- kind: "known",
6364
- roles: {
6365
- text,
6366
- heading: canonicalToken(candidates.heading, palette) ?? text,
6367
- link: canonicalToken(candidates.link, palette) ?? text,
6368
- supporting: canonicalToken(candidates.supporting, palette) ?? text
6369
- }
6370
- };
6371
- }
6372
- function safeTokenOr(candidate, fallback, backgroundHex, palette) {
6373
- return firstSafeToken([candidate], backgroundHex, palette) ?? fallback;
6374
- }
6375
- function firstSafeToken(candidates, backgroundHex, palette, preferredEquivalentTokens = []) {
6376
- const seen = /* @__PURE__ */ new Set();
6377
- for (const candidate of candidates) {
6378
- const token = canonicalToken(candidate, palette, preferredEquivalentTokens);
6379
- if (!token || seen.has(token)) continue;
6380
- seen.add(token);
6381
- const foregroundHex = resolveConcreteColorHex(token, palette);
6382
- if (foregroundHex && contrastRatio(backgroundHex, foregroundHex) >= 4.5) return token;
6383
- }
6384
- return null;
6385
- }
6386
- function canonicalToken(reference, palette, preferredEquivalentTokens = []) {
6387
- const normalized = normalizedReference(reference);
6388
- if (!normalized || normalized === "transparent") return null;
6389
- const direct = parseThemeColorToken(normalized);
6390
- if (direct && resolveConcreteColorHex(direct, palette)) return direct;
6391
- const referenceHex = resolveConcreteColorHex(normalized, palette);
6392
- if (!referenceHex) return null;
6393
- const equivalent = [
6394
- ...preferredEquivalentTokens,
6395
- ...CANONICAL_EQUIVALENT_TOKEN_ORDER,
6396
- ...Object.keys(palette).sort()
6397
- ].find((token) => {
6398
- const parsed = parseThemeColorToken(token);
6399
- return parsed !== null && resolveConcreteColorHex(parsed, palette)?.toLowerCase() === referenceHex.toLowerCase();
6400
- });
6401
- return equivalent ? parseThemeColorToken(equivalent) : null;
6402
- }
6403
- function paletteToken(reference) {
6404
- const parts = parseColorTokenParts(reference);
6405
- return parts.kind === "token" && parts.opacityPercent === null ? parts.token : null;
6406
- }
6407
- function normalizedReference(value) {
6408
- if (typeof value !== "string") return null;
6409
- const normalized = value.trim();
6410
- return normalized.length > 0 ? normalized : null;
6411
- }
6412
- //#endregion
6413
6566
  //#region ../theme-core/src/cards/generateCardCss.ts
6414
6567
  const PER_CORNER_RADIUS_MAP = {
6415
6568
  square: "0",
@@ -11378,8 +11531,14 @@ const headerInteractionPillPaletteValues = [
11378
11531
  "accent"
11379
11532
  ];
11380
11533
  /**
11381
- * "No pill": the nav link keeps whatever hover treatment its recipe compiled,
11382
- * and the palette step writes nothing at all (#1318 Phase 4c decision 2).
11534
+ * "No pill": a colour change on hover rather than a filled background.
11535
+ *
11536
+ * The palette step writes nothing (#1318 Phase 4c decision 2), but on a
11537
+ * foreground-adaptive style that is not the end of the story: the hover colour
11538
+ * is derived from the resolved opening foreground at render time, paired with
11539
+ * the resting colour, so `quiet` resolves to a definite colour rather than to
11540
+ * whatever brand token the recipe happened to name. See
11541
+ * `applyOpeningForeground`.
11383
11542
  *
11384
11543
  * It exists because "a colour change on hover, no filled background" was not
11385
11544
  * expressible in the vocabulary, and it is what
@@ -14588,117 +14747,6 @@ function affordanceIconMaskUrl(iconId) {
14588
14747
  return `data:image/svg+xml,${`<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'>${paths.map((d) => `<path d='${d}'/>`).join("")}</svg>`.replace(/"/g, "'").replace(/#/g, "%23").replace(/</g, "%3C").replace(/>/g, "%3E").replace(/\s+/g, " ")}`;
14589
14748
  }
14590
14749
  //#endregion
14591
- //#region ../theme-core/src/utils/colorStyles.ts
14592
- const COLOR_VAR_PREFIX = "--tb-";
14593
- function parseToken(source) {
14594
- const parts = parseColorTokenParts(source);
14595
- if (parts.kind === "raw") return {
14596
- token: source,
14597
- raw: parts.value
14598
- };
14599
- if (parts.kind === "invalid") return { token: source };
14600
- return {
14601
- token: parts.token,
14602
- opacityPercent: parts.opacityPercent === null ? void 0 : parts.opacityPercent
14603
- };
14604
- }
14605
- const SURFACE_TEXT_ROLE_BY_TOKEN = {
14606
- text: "text",
14607
- heading: "heading",
14608
- mutedText: "supporting"
14609
- };
14610
- function surfaceRoleForTextToken(token) {
14611
- return Object.prototype.hasOwnProperty.call(SURFACE_TEXT_ROLE_BY_TOKEN, token) ? SURFACE_TEXT_ROLE_BY_TOKEN[token] : null;
14612
- }
14613
- /**
14614
- * Converts a theme color token to a CSS rgb value.
14615
- * This is the primary function for applying theme colors to CSS properties.
14616
- *
14617
- * @param token - Theme color token (semantic, with opacity, or raw)
14618
- * @returns CSS color value (rgb with optional alpha, or raw CSS value)
14619
- *
14620
- * @example
14621
- * rgbColorValue('primary') // => 'rgb(var(--tb-primary))'
14622
- * rgbColorValue('surface/95') // => 'rgb(var(--tb-surface) / 0.95)'
14623
- * rgbColorValue('raw:transparent') // => 'transparent'
14624
- */
14625
- function rgbColorValue(token) {
14626
- const { token: baseToken, opacityPercent, raw } = parseToken(token);
14627
- if (raw) return raw;
14628
- const cssVar = `${COLOR_VAR_PREFIX}${baseToken}`;
14629
- if (opacityPercent === void 0) return `rgb(var(${cssVar}))`;
14630
- return `rgb(var(${cssVar}) / ${opacityPercent / 100})`;
14631
- }
14632
- /**
14633
- * Converts a theme color token to a CSS variable reference.
14634
- * Note: This returns the base variable without rgb() wrapper, ignoring opacity.
14635
- *
14636
- * @param token - Theme color token
14637
- * @returns CSS variable reference
14638
- *
14639
- * @example
14640
- * cssVarValue('primary') // => 'var(--tb-primary)'
14641
- * cssVarValue('surface/95') // => 'var(--tb-surface)' (opacity ignored)
14642
- */
14643
- function cssVarValue(token) {
14644
- const { token: baseToken } = parseToken(token);
14645
- return `var(${COLOR_VAR_PREFIX}${baseToken})`;
14646
- }
14647
- /**
14648
- * Creates a backgroundColor style object from a theme token.
14649
- *
14650
- * @param token - Theme color token
14651
- * @returns CSSProperties with backgroundColor
14652
- */
14653
- function backgroundColorStyle(token) {
14654
- return { backgroundColor: rgbColorValue(token) };
14655
- }
14656
- /**
14657
- * Creates a text color style object from a theme token.
14658
- *
14659
- * @param token - Theme color token
14660
- * @returns CSSProperties with color
14661
- */
14662
- function textColorStyle(token) {
14663
- const parsed = parseToken(token);
14664
- const surfaceRole = parsed.raw ? null : surfaceRoleForTextToken(parsed.token);
14665
- if (surfaceRole) return { color: parsed.opacityPercent === void 0 ? surfaceForegroundValue(surfaceRole) : surfaceForegroundValueWithOpacity(surfaceRole, parsed.opacityPercent) };
14666
- return { color: rgbColorValue(token) };
14667
- }
14668
- /**
14669
- * Creates a border color style object from a theme token.
14670
- *
14671
- * @param token - Theme color token
14672
- * @returns CSSProperties with borderColor
14673
- */
14674
- function borderColorStyle(token) {
14675
- return { borderColor: rgbColorValue(token) };
14676
- }
14677
- /**
14678
- * Merges multiple CSSProperties objects into a single object.
14679
- * Later styles override earlier ones. Undefined values are filtered out.
14680
- * Returns undefined if the merged result is empty.
14681
- *
14682
- * @param styles - Variable number of CSSProperties objects (can be undefined)
14683
- * @returns Merged CSSProperties object, or undefined if empty
14684
- *
14685
- * @example
14686
- * mergeStyles(
14687
- * backgroundColorStyle('surface'),
14688
- * textColorStyle('text'),
14689
- * borderColorStyle('border')
14690
- * )
14691
- * // => { backgroundColor: '...', color: '...', borderColor: '...' }
14692
- */
14693
- function mergeStyles(...styles) {
14694
- const merged = {};
14695
- for (const style of styles) {
14696
- if (!style) continue;
14697
- Object.assign(merged, style);
14698
- }
14699
- return Object.keys(merged).length ? merged : void 0;
14700
- }
14701
- //#endregion
14702
14750
  //#region ../theme-core/src/utils/tokenOrColor.ts
14703
14751
  /**
14704
14752
  * Runtime color-reference fields intentionally accept any string, including
@@ -26896,6 +26944,28 @@ const bookingRequirementConsentFieldSchema = z.object({
26896
26944
  const bookingConsentCarrierSchema = z.union([blockBookingConsentSchema, bookingRequirementConsentFieldSchema]);
26897
26945
  //#endregion
26898
26946
  //#region ../blocks/src/system/blocks/events/shared/schemas.ts
26947
+ const publicEventLoaderQuerySchemaShape = {
26948
+ limit: z.string().optional(),
26949
+ from: z.string().optional(),
26950
+ to: z.string().optional(),
26951
+ afterStartsAt: z.string().optional(),
26952
+ afterId: z.string().optional(),
26953
+ categoryIds: z.string().optional(),
26954
+ venueId: z.string().optional(),
26955
+ staffMemberId: z.string().optional(),
26956
+ eventSurface: z.string().optional(),
26957
+ eventPresets: z.string().optional(),
26958
+ scheduleScope: z.string().optional(),
26959
+ seriesId: z.string().optional(),
26960
+ seriesIds: z.string().optional(),
26961
+ runSeriesId: z.string().optional(),
26962
+ seriesSlug: z.string().optional(),
26963
+ includeOccurrenceId: z.string().optional(),
26964
+ readIntent: z.string().optional(),
26965
+ detailLevel: z.string().optional(),
26966
+ readProfile: z.string().optional()
26967
+ };
26968
+ z.object(publicEventLoaderQuerySchemaShape);
26899
26969
  const eventPresetSchema = z.enum([
26900
26970
  "event",
26901
26971
  "class",
@@ -30337,7 +30407,7 @@ const publicPricingSchema = z.object({
30337
30407
  singlePriceAmount: z.number().nullable(),
30338
30408
  slidingMinAmount: z.number().nullable(),
30339
30409
  slidingMaxAmount: z.number().nullable(),
30340
- options: z.array(publicPricingOptionSchema)
30410
+ options: z.array(publicPricingOptionSchema).readonly()
30341
30411
  });
30342
30412
  const publicAppointmentServiceSchema = z.object({
30343
30413
  id: z.string().min(1),
@@ -36971,6 +37041,44 @@ function toWholeSeriesRegistrationEvents(events) {
36971
37041
  return groupPublicEventsByRun(events).map(toWholeSeriesRegistrationEvent).filter((event) => event !== null);
36972
37042
  }
36973
37043
  //#endregion
37044
+ //#region ../blocks/src/system/runtime/nodes/event-registration/eventSourceRecovery.ts
37045
+ const { limit: _rawLimit, eventSurface: _rawEventSurface, scheduleScope: _rawScheduleScope, detailLevel: _rawDetailLevel, ...stringEventQueryShape } = publicEventLoaderQuerySchemaShape;
37046
+ const eventRecoveryRequestSchema = z.object({
37047
+ ...stringEventQueryShape,
37048
+ limit: z.coerce.number().int().positive().optional(),
37049
+ eventSurface: z.enum(eventSurfaceScopeValues).optional(),
37050
+ scheduleScope: z.enum(eventScheduleScopeValues).optional(),
37051
+ detailLevel: z.enum(["full", "listing"]).optional(),
37052
+ stage: z.enum(["preview", "published"]).optional()
37053
+ });
37054
+ function resolveEventRegistrationEventSource(input) {
37055
+ if (input.wholeSeriesRunEvents != null) return {
37056
+ kind: "loaded",
37057
+ events: input.wholeSeriesRunEvents
37058
+ };
37059
+ if (input.events != null) return {
37060
+ kind: "loaded",
37061
+ events: input.events
37062
+ };
37063
+ return {
37064
+ kind: "unresolved",
37065
+ request: parseEventLoaderRecoveryRequest(input.failures?.wholeSeriesRunEvents ?? input.failures?.events)
37066
+ };
37067
+ }
37068
+ const eventLoaderFailureSchema = z.object({
37069
+ endpoint: z.literal("listPublicEvents"),
37070
+ params: eventRecoveryRequestSchema.extend({ siteId: z.string().optional() })
37071
+ });
37072
+ function parseEventLoaderRecoveryRequest(value) {
37073
+ const parsed = eventLoaderFailureSchema.safeParse(value);
37074
+ if (!parsed.success) return null;
37075
+ const { siteId: _siteId, stage, ...params } = parsed.data.params;
37076
+ return {
37077
+ ...params,
37078
+ stage: stage ?? "published"
37079
+ };
37080
+ }
37081
+ //#endregion
36974
37082
  //#region ../blocks/src/system/runtime/nodes/event-registration.interactive.ts
36975
37083
  const EVENT_REGISTRATION_GENERIC_SHELL_STEP_LABELS = [
36976
37084
  "Date",
@@ -36988,8 +37096,6 @@ const eventRegistrationPublicEventSchema = z.preprocess(normalizeEventRegistrati
36988
37096
  const eventRegistrationHydrationSchemaShape = {
36989
37097
  occurrenceContext: occurrenceContextSchema.optional(),
36990
37098
  subject: eventRegistrationPageSurfaceSubjectSchema.nullable().optional(),
36991
- events: z.array(eventRegistrationPublicEventSchema).nullable().optional(),
36992
- wholeSeriesRunEvents: z.array(eventRegistrationPublicEventSchema).nullable().optional(),
36993
37099
  maxTickets: z.string().optional(),
36994
37100
  showVenue: z.boolean().optional(),
36995
37101
  showCapacity: z.boolean().optional(),
@@ -37001,12 +37107,22 @@ const eventRegistrationHydrationSchemaShape = {
37001
37107
  sitePasses: publicPassProductCollectionSchema.nullable().optional(),
37002
37108
  siteMemberships: publicMembershipProductCollectionSchema.nullable().optional()
37003
37109
  };
37110
+ const eventRegistrationEventSourceSchema = z.discriminatedUnion("kind", [z.object({
37111
+ kind: z.literal("loaded"),
37112
+ events: z.array(eventRegistrationPublicEventSchema)
37113
+ }), z.object({
37114
+ kind: z.literal("unresolved"),
37115
+ request: eventRecoveryRequestSchema.nullable()
37116
+ })]);
37004
37117
  const eventRegistrationSourceSchema = z.object({
37005
37118
  siteId: z.string().optional(),
37006
37119
  apiBaseUrl: z.string().optional(),
37007
37120
  portalToken: z.string().nullable().optional(),
37008
37121
  previewToken: z.string().nullable().optional(),
37009
37122
  ...eventRegistrationHydrationSchemaShape,
37123
+ events: z.array(eventRegistrationPublicEventSchema).nullable().optional(),
37124
+ wholeSeriesRunEvents: z.array(eventRegistrationPublicEventSchema).nullable().optional(),
37125
+ eventLoaderFailures: z.record(z.string(), z.unknown()).nullable().optional(),
37010
37126
  className: z.string().nullable().optional(),
37011
37127
  buttonText: z.string().nullable().optional(),
37012
37128
  maxTickets: z.string().nullable().optional(),
@@ -37027,7 +37143,10 @@ const eventRegistrationDisplaySchema = z.discriminatedUnion("state", [z.object({
37027
37143
  titleText: z.string(),
37028
37144
  bodyText: z.string()
37029
37145
  })]);
37030
- const eventRegistrationHydrationSchema = z.object(eventRegistrationHydrationSchemaShape);
37146
+ const eventRegistrationHydrationSchema = z.object({
37147
+ ...eventRegistrationHydrationSchemaShape,
37148
+ eventSource: eventRegistrationEventSourceSchema
37149
+ });
37031
37150
  const eventRegistrationRenderSchema = z.object({
37032
37151
  display: eventRegistrationDisplaySchema,
37033
37152
  hydration: eventRegistrationHydrationSchema
@@ -37086,16 +37205,12 @@ function buildEventRegistrationShellStepLabels(source, scopedSourceEvents) {
37086
37205
  function toScopedEventRegistrationEvents(scopedSourceEvents) {
37087
37206
  return [...toRegistrationEvents(scopedSourceEvents), ...toWholeSeriesRegistrationEvents(scopedSourceEvents)];
37088
37207
  }
37089
- function scopeEventRegistrationSourceEvents(source) {
37090
- return resolveEventRegistrationScopedEvents(source.wholeSeriesRunEvents ?? source.events ?? [], {
37208
+ function scopeEventRegistrationSourceEvents(source, eventSource) {
37209
+ return resolveEventRegistrationScopedEvents(eventSource.kind === "loaded" ? eventSource.events : [], {
37091
37210
  occurrenceContext: source.occurrenceContext,
37092
37211
  subject: source.subject
37093
37212
  });
37094
37213
  }
37095
- function resolveLoadedEventRegistrationSourceEvents(source, scopedSourceEvents) {
37096
- if (source.events == null && source.wholeSeriesRunEvents == null) return null;
37097
- return [...scopedSourceEvents];
37098
- }
37099
37214
  /**
37100
37215
  * The one run this surface is registering for, when the scoped events describe
37101
37216
  * exactly one. More than one run means the visitor still has to choose.
@@ -37135,14 +37250,21 @@ const eventRegistrationBlockRuntime = defineClientOwnedBlockRuntime({
37135
37250
  render: createZodCodec(eventRegistrationRenderSchema)
37136
37251
  },
37137
37252
  buildRender: (source) => {
37138
- const scopedSourceEvents = scopeEventRegistrationSourceEvents(source);
37139
- const events = resolveLoadedEventRegistrationSourceEvents(source, scopedSourceEvents);
37253
+ const eventSource = resolveEventRegistrationEventSource({
37254
+ events: source.events,
37255
+ wholeSeriesRunEvents: source.wholeSeriesRunEvents,
37256
+ failures: source.eventLoaderFailures
37257
+ });
37258
+ const scopedSourceEvents = scopeEventRegistrationSourceEvents(source, eventSource);
37140
37259
  return {
37141
37260
  display: buildEventRegistrationDisplayFromScopedEvents(source, scopedSourceEvents),
37142
37261
  hydration: {
37143
37262
  occurrenceContext: source.occurrenceContext ?? null,
37144
37263
  subject: source.subject ?? null,
37145
- events,
37264
+ eventSource: eventSource.kind === "loaded" ? {
37265
+ ...eventSource,
37266
+ events: [...scopedSourceEvents]
37267
+ } : eventSource,
37146
37268
  maxTickets: source.maxTickets ?? void 0,
37147
37269
  showVenue: source.showVenue,
37148
37270
  showCapacity: source.showCapacity,
@@ -37332,6 +37454,7 @@ const eventRegistrationBlockDefinition = {
37332
37454
  } },
37333
37455
  events: { $bind: { from: "data.events" } },
37334
37456
  wholeSeriesRunEvents: { $bind: { from: "data.wholeSeriesRunEvents" } },
37457
+ loaderFailures: { $bind: { from: "$root.loaderFailures" } },
37335
37458
  sitePasses: { $bind: { from: "data.sitePasses" } },
37336
37459
  siteMemberships: { $bind: { from: "data.siteMemberships" } },
37337
37460
  stage: { $bind: {
@@ -39314,6 +39437,15 @@ const newsletterFieldSchema = z.object({
39314
39437
  placeholder: z.string().optional()
39315
39438
  });
39316
39439
  const mailingListSignupBlockIdSchema = z.string().trim().min(1).transform(parseRequiredMailingListSignupBlockId);
39440
+ const mailingListContentVersionIdSchema = z.string().transform((value, ctx) => {
39441
+ const parsed = parseMailingListContentVersionId(value);
39442
+ if (parsed) return parsed;
39443
+ ctx.addIssue({
39444
+ code: z.ZodIssueCode.custom,
39445
+ message: "Invalid mailing-list content version ID"
39446
+ });
39447
+ return z.NEVER;
39448
+ });
39317
39449
  const signedMailingListSourceTokenSchema = z.string().trim().min(1).transform(parseRequiredMailingListSignedSourceToken);
39318
39450
  const newsletterSourceCommonSchema = z.object({
39319
39451
  siteId: z.string().optional(),
@@ -39327,7 +39459,8 @@ const newsletterSourceCommonSchema = z.object({
39327
39459
  const newsletterSourceSchema = z.discriminatedUnion("source", [
39328
39460
  newsletterSourceCommonSchema.extend({
39329
39461
  source: z.literal("block"),
39330
- blockId: z.string().nullable().optional()
39462
+ blockId: z.string().nullable().optional(),
39463
+ contentVersionId: z.string().nullable().optional()
39331
39464
  }),
39332
39465
  newsletterSourceCommonSchema.extend({
39333
39466
  source: z.literal("signed-footer"),
@@ -39343,6 +39476,7 @@ const newsletterDisplaySchema = z.object({
39343
39476
  availability: z.enum(["ready", "unavailable"]),
39344
39477
  className: z.string().nullable(),
39345
39478
  buttonLabel: z.string(),
39479
+ successMessage: z.string(),
39346
39480
  buttonVariant: newsletterButtonVariantSchema,
39347
39481
  privacyNote: z.string().nullable(),
39348
39482
  fields: z.array(newsletterFieldSchema),
@@ -39357,7 +39491,8 @@ const newsletterHydrationSchema = z.object({
39357
39491
  tag: z.literal("block-source"),
39358
39492
  sourceRef: z.object({
39359
39493
  tag: z.literal("block_ref"),
39360
- blockId: mailingListSignupBlockIdSchema
39494
+ blockId: mailingListSignupBlockIdSchema,
39495
+ contentVersionId: mailingListContentVersionIdSchema
39361
39496
  }).nullable()
39362
39497
  }),
39363
39498
  z.object({
@@ -39396,6 +39531,7 @@ function buildNewsletterDisplay(source) {
39396
39531
  fields: { preset: "emailOnly" },
39397
39532
  includeOptionalPhone: false,
39398
39533
  buttonLabel: "Subscribe",
39534
+ successMessage: DEFAULT_MAILING_LIST_SUCCESS_MESSAGE,
39399
39535
  privacyNote: null
39400
39536
  };
39401
39537
  const targeting = source.targeting ?? { mode: "default" };
@@ -39405,6 +39541,7 @@ function buildNewsletterDisplay(source) {
39405
39541
  availability: runtimeTargetingIsAvailable(context, targeting, choices) ? "ready" : "unavailable",
39406
39542
  className: source.className ?? null,
39407
39543
  buttonLabel: form.buttonLabel,
39544
+ successMessage: form.successMessage,
39408
39545
  buttonVariant: source.buttonVariant ?? "primary",
39409
39546
  privacyNote: form.privacyNote,
39410
39547
  fields: getGlobalFormFields(form),
@@ -39435,7 +39572,7 @@ const newsletterFormBlockRuntime = defineProgressiveBlockRuntime({
39435
39572
  function projectNewsletterFormHydrationTarget(source) {
39436
39573
  switch (source.source) {
39437
39574
  case "block": {
39438
- const sourceRef = buildMailingListSignupBlockSourceRef(source.blockId);
39575
+ const sourceRef = buildMailingListSignupBlockSourceRef(source.blockId, source.contentVersionId);
39439
39576
  if (sourceRef?.tag === "block_ref") return {
39440
39577
  tag: "block-source",
39441
39578
  sourceRef
@@ -41860,9 +41997,10 @@ function cx(...classes) {
41860
41997
  * Server-safe placeholder for event registration.
41861
41998
  * Provides a static container for island hydration without importing client hooks.
41862
41999
  */
41863
- function EventRegistrationSSR({ blockId, subject, children, ...sourceProps }) {
42000
+ function EventRegistrationSSR({ blockId, subject, loaderFailures, children, ...sourceProps }) {
41864
42001
  const islandProps = buildEventRegistrationInteractiveIslandProps({
41865
42002
  ...sourceProps,
42003
+ eventLoaderFailures: blockId ? loaderFailures?.[blockId] : void 0,
41866
42004
  subject: normalizeEventRegistrationPageSurfaceSubject(subject)
41867
42005
  });
41868
42006
  const display = islandProps.render.display;
@@ -42195,7 +42333,7 @@ function NewsletterFormSSR(props) {
42195
42333
  className: clsx("newsletter-form-ssr", className),
42196
42334
  children: /* @__PURE__ */ jsx("p", {
42197
42335
  role: "status",
42198
- children: "Mailing-list signup is not available right now."
42336
+ children: "We can’t accept signups right now. Please try again later."
42199
42337
  })
42200
42338
  });
42201
42339
  const renderField = (field) => {
@@ -42241,14 +42379,18 @@ function NewsletterFormSSR(props) {
42241
42379
  children: [
42242
42380
  fields.map(renderField),
42243
42381
  islandProps.render.hydration.choicePresentation === "visitor_choice" ? /* @__PURE__ */ jsxs("fieldset", {
42244
- className: "newsletter-topics",
42245
- children: [/* @__PURE__ */ jsx("legend", { children: "What would you like to hear about?" }), display.choices.map((choice) => /* @__PURE__ */ jsxs("label", {
42246
- className: "newsletter-topic-choice",
42382
+ className: "fb-fieldset newsletter-topics",
42383
+ children: [/* @__PURE__ */ jsx("legend", {
42384
+ className: "form-label",
42385
+ children: "What would you like to hear about?"
42386
+ }), display.choices.map((choice) => /* @__PURE__ */ jsxs("label", {
42387
+ className: "fb-inline form-label newsletter-topic-choice",
42247
42388
  children: [/* @__PURE__ */ jsx("input", {
42248
42389
  type: "checkbox",
42249
42390
  name: "mailingListChoice",
42250
- value: choice.id
42251
- }), choice.label]
42391
+ value: choice.id,
42392
+ className: "form-checkbox"
42393
+ }), /* @__PURE__ */ jsx("span", { children: choice.label })]
42252
42394
  }, choice.id))]
42253
42395
  }) : null,
42254
42396
  /* @__PURE__ */ jsx("div", {
@@ -43237,6 +43379,18 @@ function resolveChildren(nodes, context) {
43237
43379
  function isReactNode(value) {
43238
43380
  return value !== null && value !== void 0;
43239
43381
  }
43382
+ function resolveNodeMetadata(nodeType, context) {
43383
+ return {
43384
+ pathBase: context.pathBase,
43385
+ blockId: context.blockId,
43386
+ blockKind: context.blockKind,
43387
+ blockContent: context.blockContent,
43388
+ fragmentRegistry: context.fragmentRegistry,
43389
+ previewAuthoring: context.previewAuthoring,
43390
+ ...nodeType.toLowerCase() === "newsletter-form" ? { contentVersionId: context.contentVersionId } : {},
43391
+ ...nodeType === "media" && context.imageResolveContext ? { imageResolveContext: context.imageResolveContext } : {}
43392
+ };
43393
+ }
43240
43394
  /**
43241
43395
  * Resolves a node definition into a React element.
43242
43396
  * Handles conditionals ($when), scopes ($scopes), repeaters ($repeat), bindings ($bind), and children.
@@ -43272,13 +43426,7 @@ function resolveNode(node, context, indexFallback) {
43272
43426
  const elementProps = {
43273
43427
  ...props,
43274
43428
  key: node.key ?? indexFallback,
43275
- pathBase: context.pathBase,
43276
- blockId: context.blockId,
43277
- blockKind: context.blockKind,
43278
- blockContent: context.blockContent,
43279
- ...node.type === "media" && context.imageResolveContext ? { imageResolveContext: context.imageResolveContext } : {},
43280
- fragmentRegistry: context.fragmentRegistry,
43281
- previewAuthoring: context.previewAuthoring
43429
+ ...resolveNodeMetadata(node.type, context)
43282
43430
  };
43283
43431
  const element = React.createElement(component, elementProps, ...children);
43284
43432
  if (headingDecorationPlan.kind === "skip") return element;
@@ -47288,7 +47436,7 @@ function pageBlockPosition(index, blockCount) {
47288
47436
  //#endregion
47289
47437
  //#region ../blocks/src/pageRendererContracts.ts
47290
47438
  function buildPageRendererRootRuntime(dataContext) {
47291
- const { siteId = null, pageId = null, pathname = null, bookingTimeZone, previewStage = "published", apiBaseUrl = null, portalToken = null, bookingOfferingPresets = [], mailingList = { tag: "not_configured" }, eventRegistrationOverlayEnabled = false } = dataContext ?? {};
47439
+ const { siteId = null, pageId = null, pathname = null, bookingTimeZone, previewStage = "published", apiBaseUrl = null, portalToken = null, bookingOfferingPresets = [], mailingList = { tag: "not_configured" }, eventRegistrationOverlayEnabled = false, loaderFailures = {} } = dataContext ?? {};
47292
47440
  return {
47293
47441
  siteId,
47294
47442
  pageId,
@@ -47299,7 +47447,8 @@ function buildPageRendererRootRuntime(dataContext) {
47299
47447
  portalToken,
47300
47448
  bookingOfferingPresets,
47301
47449
  mailingList,
47302
- eventRegistrationOverlayEnabled
47450
+ eventRegistrationOverlayEnabled,
47451
+ loaderFailures
47303
47452
  };
47304
47453
  }
47305
47454
  //#endregion
@@ -56543,7 +56692,7 @@ function collectNestedPreviewFieldConstraintEntries(field, path) {
56543
56692
  }
56544
56693
  function makeDefaultBlockComponent(args) {
56545
56694
  const { manifest } = args;
56546
- return function DefaultBlockComponent({ content, data, registry, theme, themeConfig, transforms, viewModelOverrides, pathBase, blockId, blockKind, blockBindings, editableRouteMetadataFieldIds, fragmentRegistry, imageResolveContext, previewAuthoring }) {
56695
+ return function DefaultBlockComponent({ content, data, registry, theme, themeConfig, transforms, viewModelOverrides, pathBase, blockId, contentVersionId, blockKind, blockBindings, editableRouteMetadataFieldIds, fragmentRegistry, imageResolveContext, previewAuthoring }) {
56547
56696
  const perf = beginBlockRenderMeasurement();
56548
56697
  if (!theme) throw new Error("Block rendering requires theme tokens; none were provided to makeDefaultBlockComponent");
56549
56698
  if (!registry) throw new Error("Block rendering requires a component registry; none was provided");
@@ -56563,6 +56712,7 @@ function makeDefaultBlockComponent(args) {
56563
56712
  theme: withButtonSystem(theme, themeConfig),
56564
56713
  pathBase,
56565
56714
  blockId,
56715
+ contentVersionId,
56566
56716
  blockKind,
56567
56717
  blockContent: mergedContent,
56568
56718
  blockBindings,
@@ -57271,6 +57421,7 @@ function buildBlockOverrideProps(input) {
57271
57421
  ...blockSubjectProps(dataContext),
57272
57422
  imageResolveContext: input.imageResolveContext,
57273
57423
  blockId: block.id ?? null,
57424
+ contentVersionId: block.contentVersionId ?? null,
57274
57425
  blockKind: block.kind
57275
57426
  };
57276
57427
  }
@@ -57371,6 +57522,7 @@ function toPresentationPage(page) {
57371
57522
  id: block.id,
57372
57523
  kind: block.kind,
57373
57524
  purpose: block.purpose,
57525
+ ...block.contentVersionId ? { contentVersionId: block.contentVersionId } : {},
57374
57526
  ...block.bindings ? { bindings: block.bindings } : {}
57375
57527
  };
57376
57528
  return block.admission.kind === "renderable" ? {
@@ -67643,7 +67795,9 @@ const containerResponsiveThemeCss = `/*
67643
67795
  text-align: left;
67644
67796
  }
67645
67797
 
67646
- :where(.theme-scope) :where([data-block="customer-portal"]) .cp-login__subtitle {
67798
+ :where(.theme-scope)
67799
+ :where([data-block="customer-portal"])
67800
+ .cp-login__subtitle {
67647
67801
  color: var(--cp-muted);
67648
67802
  font-size: 0.9375rem;
67649
67803
  text-align: left;
@@ -67670,7 +67824,9 @@ const containerResponsiveThemeCss = `/*
67670
67824
  text-align: left;
67671
67825
  }
67672
67826
 
67673
- :where(.theme-scope) :where([data-block="customer-portal"]) .cp-login__reset-link {
67827
+ :where(.theme-scope)
67828
+ :where([data-block="customer-portal"])
67829
+ .cp-login__reset-link {
67674
67830
  appearance: none;
67675
67831
  background: none;
67676
67832
  border: 0;
@@ -67684,11 +67840,15 @@ const containerResponsiveThemeCss = `/*
67684
67840
  text-underline-offset: 0.15em;
67685
67841
  }
67686
67842
 
67687
- :where(.theme-scope) :where([data-block="customer-portal"]) .cp-login__reset-link:hover {
67843
+ :where(.theme-scope)
67844
+ :where([data-block="customer-portal"])
67845
+ .cp-login__reset-link:hover {
67688
67846
  color: var(--cp-text);
67689
67847
  }
67690
67848
 
67691
- :where(.theme-scope) :where([data-block="customer-portal"]) .cp-login__reset-link:focus-visible {
67849
+ :where(.theme-scope)
67850
+ :where([data-block="customer-portal"])
67851
+ .cp-login__reset-link:focus-visible {
67692
67852
  outline: 2px solid currentColor;
67693
67853
  outline-offset: 3px;
67694
67854
  }
@@ -67733,7 +67893,9 @@ const containerResponsiveThemeCss = `/*
67733
67893
  border-bottom: none;
67734
67894
  }
67735
67895
 
67736
- :where(.theme-scope) :where([data-block="customer-portal"]) .cp-header__welcome {
67896
+ :where(.theme-scope)
67897
+ :where([data-block="customer-portal"])
67898
+ .cp-header__welcome {
67737
67899
  font-size: 1.125rem;
67738
67900
  font-weight: 500;
67739
67901
  }
@@ -67749,8 +67911,14 @@ const containerResponsiveThemeCss = `/*
67749
67911
  }
67750
67912
 
67751
67913
  @keyframes cp-fade-in {
67752
- from { opacity: 0; transform: translateY(4px); }
67753
- to { opacity: 1; transform: translateY(0); }
67914
+ from {
67915
+ opacity: 0;
67916
+ transform: translateY(4px);
67917
+ }
67918
+ to {
67919
+ opacity: 1;
67920
+ transform: translateY(0);
67921
+ }
67754
67922
  }
67755
67923
 
67756
67924
  /* Empty state */
@@ -67839,6 +68007,77 @@ const containerResponsiveThemeCss = `/*
67839
68007
  margin-top: 1rem;
67840
68008
  }
67841
68009
 
68010
+ /* Event waitlists */
68011
+ :where(.theme-scope) :where([data-block="customer-portal"]) .cp-waitlist-list {
68012
+ display: grid;
68013
+ gap: 1rem;
68014
+ }
68015
+
68016
+ :where(.theme-scope)
68017
+ :where([data-block="customer-portal"])
68018
+ .cp-waitlists
68019
+ > .cp-alert {
68020
+ margin-bottom: 1rem;
68021
+ }
68022
+
68023
+ :where(.theme-scope) :where([data-block="customer-portal"]) .cp-waitlist-card {
68024
+ transition:
68025
+ border-color 180ms ease,
68026
+ box-shadow 180ms ease;
68027
+ }
68028
+
68029
+ :where(.theme-scope)
68030
+ :where([data-block="customer-portal"])
68031
+ .cp-waitlist-card--focused {
68032
+ border-color: var(--cp-primary);
68033
+ box-shadow: 0 0 0 3px color-mix(in srgb, var(--cp-primary) 22%, transparent);
68034
+ }
68035
+
68036
+ :where(.theme-scope)
68037
+ :where([data-block="customer-portal"])
68038
+ .cp-waitlist-card__summary,
68039
+ :where(.theme-scope)
68040
+ :where([data-block="customer-portal"])
68041
+ .cp-waitlist-card__position {
68042
+ font-weight: 600;
68043
+ }
68044
+
68045
+ :where(.theme-scope)
68046
+ :where([data-block="customer-portal"])
68047
+ .cp-waitlist-card
68048
+ .cp-card-body
68049
+ p {
68050
+ margin: 0.4rem 0;
68051
+ }
68052
+
68053
+ @container rb-site (max-width: 640px) {
68054
+ @scope ([data-rb-responsive-mode="container"]) to (:scope [data-rb-responsive-mode]) {
68055
+ :where(.theme-scope)
68056
+ :where([data-block="customer-portal"])
68057
+ .cp-waitlist-card
68058
+ .cp-card-header {
68059
+ flex-direction: column-reverse;
68060
+ }
68061
+
68062
+ :where(.theme-scope)
68063
+ :where([data-block="customer-portal"])
68064
+ .cp-waitlist-card
68065
+ .cp-card-actions {
68066
+ align-items: stretch;
68067
+ flex-direction: column;
68068
+ }
68069
+
68070
+ :where(.theme-scope)
68071
+ :where([data-block="customer-portal"])
68072
+ .cp-waitlist-card
68073
+ .cp-card-actions
68074
+ > * {
68075
+ justify-content: center;
68076
+ text-align: center;
68077
+ }
68078
+ }
68079
+ }
68080
+
67842
68081
  /* Badge */
67843
68082
  :where(.theme-scope) :where([data-block="customer-portal"]) .cp-badge {
67844
68083
  display: inline-flex;
@@ -67975,11 +68214,18 @@ const containerResponsiveThemeCss = `/*
67975
68214
  background: rgba(var(--tb-border), 0.2);
67976
68215
  }
67977
68216
 
67978
- :where(.theme-scope) :where([data-block="customer-portal"]) .cp-table tbody tr:last-child td {
68217
+ :where(.theme-scope)
68218
+ :where([data-block="customer-portal"])
68219
+ .cp-table
68220
+ tbody
68221
+ tr:last-child
68222
+ td {
67979
68223
  border-bottom: none;
67980
68224
  }
67981
68225
 
67982
- :where(.theme-scope) :where([data-block="customer-portal"]) :is(.cp-row--past, .cp-row--muted) {
68226
+ :where(.theme-scope)
68227
+ :where([data-block="customer-portal"])
68228
+ :is(.cp-row--past, .cp-row--muted) {
67983
68229
  opacity: 0.65;
67984
68230
  }
67985
68231
 
@@ -67992,7 +68238,9 @@ const containerResponsiveThemeCss = `/*
67992
68238
  line-height: 1.2;
67993
68239
  }
67994
68240
 
67995
- :where(.theme-scope) :where([data-block="customer-portal"]) .cp-row-title__badges {
68241
+ :where(.theme-scope)
68242
+ :where([data-block="customer-portal"])
68243
+ .cp-row-title__badges {
67996
68244
  margin-left: auto;
67997
68245
  display: flex;
67998
68246
  flex-wrap: wrap;
@@ -68000,7 +68248,9 @@ const containerResponsiveThemeCss = `/*
68000
68248
  gap: 0.375rem;
68001
68249
  }
68002
68250
 
68003
- :where(.theme-scope) :where([data-block="customer-portal"]) .cp-row-title__text {
68251
+ :where(.theme-scope)
68252
+ :where([data-block="customer-portal"])
68253
+ .cp-row-title__text {
68004
68254
  min-width: 0;
68005
68255
  }
68006
68256
 
@@ -68020,12 +68270,16 @@ const containerResponsiveThemeCss = `/*
68020
68270
  line-height: 1.35;
68021
68271
  }
68022
68272
 
68023
- :where(.theme-scope) :where([data-block="customer-portal"]) .cp-row-note--success {
68273
+ :where(.theme-scope)
68274
+ :where([data-block="customer-portal"])
68275
+ .cp-row-note--success {
68024
68276
  border-left-color: rgb(var(--tb-success));
68025
68277
  color: rgb(var(--tb-success));
68026
68278
  }
68027
68279
 
68028
- :where(.theme-scope) :where([data-block="customer-portal"]) .cp-row-note--error {
68280
+ :where(.theme-scope)
68281
+ :where([data-block="customer-portal"])
68282
+ .cp-row-note--error {
68029
68283
  border-left-color: rgb(var(--tb-destructive));
68030
68284
  color: rgb(var(--tb-destructive));
68031
68285
  }
@@ -68044,16 +68298,23 @@ const containerResponsiveThemeCss = `/*
68044
68298
  white-space: nowrap;
68045
68299
  }
68046
68300
 
68047
- :where(.theme-scope) :where([data-block="customer-portal"]) .cp-col-actions .btn-sm {
68301
+ :where(.theme-scope)
68302
+ :where([data-block="customer-portal"])
68303
+ .cp-col-actions
68304
+ .btn-sm {
68048
68305
  white-space: nowrap;
68049
68306
  }
68050
68307
 
68051
- :where(.theme-scope) :where([data-block="customer-portal"]) .cp-row-title__link {
68308
+ :where(.theme-scope)
68309
+ :where([data-block="customer-portal"])
68310
+ .cp-row-title__link {
68052
68311
  color: inherit;
68053
68312
  text-decoration: none;
68054
68313
  }
68055
68314
 
68056
- :where(.theme-scope) :where([data-block="customer-portal"]) .cp-row-title__link:hover {
68315
+ :where(.theme-scope)
68316
+ :where([data-block="customer-portal"])
68317
+ .cp-row-title__link:hover {
68057
68318
  text-decoration: underline;
68058
68319
  text-decoration-thickness: 2px;
68059
68320
  text-underline-offset: 2px;
@@ -68075,7 +68336,9 @@ const containerResponsiveThemeCss = `/*
68075
68336
  }
68076
68337
 
68077
68338
  /* Profile actions */
68078
- :where(.theme-scope) :where([data-block="customer-portal"]) .cp-profile__actions {
68339
+ :where(.theme-scope)
68340
+ :where([data-block="customer-portal"])
68341
+ .cp-profile__actions {
68079
68342
  display: flex;
68080
68343
  gap: 0.75rem;
68081
68344
  margin-top: 1rem;
@@ -68142,28 +68405,39 @@ const containerResponsiveThemeCss = `/*
68142
68405
  gap: 0.375rem;
68143
68406
  }
68144
68407
 
68145
- :where(.theme-scope) :where([data-block="customer-portal"]) .cp-guest-edit-row__index {
68408
+ :where(.theme-scope)
68409
+ :where([data-block="customer-portal"])
68410
+ .cp-guest-edit-row__index {
68146
68411
  font-size: 0.75rem;
68147
68412
  font-weight: 500;
68148
68413
  color: var(--cp-muted);
68149
68414
  }
68150
68415
 
68151
- :where(.theme-scope) :where([data-block="customer-portal"]) .cp-guest-edit-row__fields {
68416
+ :where(.theme-scope)
68417
+ :where([data-block="customer-portal"])
68418
+ .cp-guest-edit-row__fields {
68152
68419
  display: flex;
68153
68420
  gap: 0.5rem;
68154
68421
  }
68155
68422
 
68156
- :where(.theme-scope) :where([data-block="customer-portal"]) .cp-guest-edit-row__fields input {
68423
+ :where(.theme-scope)
68424
+ :where([data-block="customer-portal"])
68425
+ .cp-guest-edit-row__fields
68426
+ input {
68157
68427
  flex: 1;
68158
68428
  min-width: 0;
68159
68429
  }
68160
68430
 
68161
- :where(.theme-scope) :where([data-block="customer-portal"]) .cp-guest-edit-row__error {
68431
+ :where(.theme-scope)
68432
+ :where([data-block="customer-portal"])
68433
+ .cp-guest-edit-row__error {
68162
68434
  font-size: 0.75rem;
68163
68435
  color: var(--cp-error);
68164
68436
  }
68165
68437
 
68166
- :where(.theme-scope) :where([data-block="customer-portal"]) .cp-guests__actions {
68438
+ :where(.theme-scope)
68439
+ :where([data-block="customer-portal"])
68440
+ .cp-guests__actions {
68167
68441
  display: flex;
68168
68442
  gap: 0.5rem;
68169
68443
  margin-top: 0.5rem;
@@ -68177,13 +68451,18 @@ const containerResponsiveThemeCss = `/*
68177
68451
  }
68178
68452
 
68179
68453
  /* In the actions modal, tiles sit on a surface modal, so use "background" for contrast. */
68180
- :where(.theme-scope) :where([data-block="customer-portal"]) .cp-actions-list :where(.rb-tile) {
68454
+ :where(.theme-scope)
68455
+ :where([data-block="customer-portal"])
68456
+ .cp-actions-list
68457
+ :where(.rb-tile) {
68181
68458
  --rb-event-tile-bg: rgb(var(--tb-background));
68182
68459
  --rb-event-tile-border: rgb(var(--tb-border));
68183
68460
  }
68184
68461
 
68185
68462
  /* Actions trigger: icon-only kebab button */
68186
- :where(.theme-scope) :where([data-block="customer-portal"]) .cp-actions-trigger.btn-sm {
68463
+ :where(.theme-scope)
68464
+ :where([data-block="customer-portal"])
68465
+ .cp-actions-trigger.btn-sm {
68187
68466
  padding: 0.35rem !important;
68188
68467
  line-height: 1 !important;
68189
68468
  min-width: 32px;
@@ -68207,17 +68486,24 @@ const containerResponsiveThemeCss = `/*
68207
68486
  gap: 0.25rem;
68208
68487
  }
68209
68488
 
68210
- :where(.theme-scope) :where([data-block="customer-portal"]) .cp-action-tile__title {
68489
+ :where(.theme-scope)
68490
+ :where([data-block="customer-portal"])
68491
+ .cp-action-tile__title {
68211
68492
  font-weight: 600;
68212
68493
  font-size: 0.9375rem;
68213
68494
  }
68214
68495
 
68215
- :where(.theme-scope) :where([data-block="customer-portal"]) .cp-action-tile__desc {
68496
+ :where(.theme-scope)
68497
+ :where([data-block="customer-portal"])
68498
+ .cp-action-tile__desc {
68216
68499
  font-size: 0.875rem;
68217
68500
  line-height: 1.35;
68218
68501
  }
68219
68502
 
68220
- :where(.theme-scope) :where([data-block="customer-portal"]) .cp-action-tile--danger .cp-action-tile__title {
68503
+ :where(.theme-scope)
68504
+ :where([data-block="customer-portal"])
68505
+ .cp-action-tile--danger
68506
+ .cp-action-tile__title {
68221
68507
  color: rgb(var(--tb-destructive));
68222
68508
  }
68223
68509
 
@@ -68239,7 +68525,9 @@ const containerResponsiveThemeCss = `/*
68239
68525
  text-decoration: underline;
68240
68526
  }
68241
68527
 
68242
- :where(.theme-scope) :where([data-block="customer-portal"]) .cp-btn--link:hover {
68528
+ :where(.theme-scope)
68529
+ :where([data-block="customer-portal"])
68530
+ .cp-btn--link:hover {
68243
68531
  color: var(--cp-primary-hover);
68244
68532
  }
68245
68533
 
@@ -68278,34 +68566,48 @@ const containerResponsiveThemeCss = `/*
68278
68566
  margin-top: 0.75rem;
68279
68567
  }
68280
68568
 
68281
- :where(.theme-scope) :where([data-block="customer-portal"]) .cp-cancel-confirm__title {
68569
+ :where(.theme-scope)
68570
+ :where([data-block="customer-portal"])
68571
+ .cp-cancel-confirm__title {
68282
68572
  font-weight: 600;
68283
68573
  margin-bottom: 0.5rem;
68284
68574
  }
68285
68575
 
68286
- :where(.theme-scope) :where([data-block="customer-portal"]) .cp-cancel-confirm__message {
68576
+ :where(.theme-scope)
68577
+ :where([data-block="customer-portal"])
68578
+ .cp-cancel-confirm__message {
68287
68579
  margin-bottom: 0.25rem;
68288
68580
  }
68289
68581
 
68290
- :where(.theme-scope) :where([data-block="customer-portal"]) .cp-cancel-confirm__warning {
68582
+ :where(.theme-scope)
68583
+ :where([data-block="customer-portal"])
68584
+ .cp-cancel-confirm__warning {
68291
68585
  margin-bottom: 0.75rem;
68292
68586
  }
68293
68587
 
68294
- :where(.theme-scope) :where([data-block="customer-portal"]) .cp-cancel-confirm__actions {
68588
+ :where(.theme-scope)
68589
+ :where([data-block="customer-portal"])
68590
+ .cp-cancel-confirm__actions {
68295
68591
  display: flex;
68296
68592
  gap: 0.75rem;
68297
68593
  }
68298
68594
 
68299
68595
  /* Membership actions */
68300
- :where(.theme-scope) :where([data-block="customer-portal"]) .cp-membership-actions {
68596
+ :where(.theme-scope)
68597
+ :where([data-block="customer-portal"])
68598
+ .cp-membership-actions {
68301
68599
  margin-top: 0.75rem;
68302
68600
  }
68303
68601
 
68304
- :where(.theme-scope) :where([data-block="customer-portal"]) .cp-section-actions {
68602
+ :where(.theme-scope)
68603
+ :where([data-block="customer-portal"])
68604
+ .cp-section-actions {
68305
68605
  margin-top: 1rem;
68306
68606
  }
68307
68607
 
68308
- :where(.theme-scope) :where([data-block="customer-portal"]) .cp-card-subtitle--spaced {
68608
+ :where(.theme-scope)
68609
+ :where([data-block="customer-portal"])
68610
+ .cp-card-subtitle--spaced {
68309
68611
  margin-top: 0.75rem;
68310
68612
  }
68311
68613
 
@@ -68329,9 +68631,18 @@ const containerResponsiveThemeCss = `/*
68329
68631
  display: none;
68330
68632
  }
68331
68633
 
68332
- :where(.theme-scope) :where([data-block="customer-portal"]) .cp-table :is(th, td).cp-col-guests,
68333
- :where(.theme-scope) :where([data-block="customer-portal"]) .cp-table :is(th, td).cp-col-tickets,
68334
- :where(.theme-scope) :where([data-block="customer-portal"]) .cp-table :is(th, td).cp-col-actions {
68634
+ :where(.theme-scope)
68635
+ :where([data-block="customer-portal"])
68636
+ .cp-table
68637
+ :is(th, td).cp-col-guests,
68638
+ :where(.theme-scope)
68639
+ :where([data-block="customer-portal"])
68640
+ .cp-table
68641
+ :is(th, td).cp-col-tickets,
68642
+ :where(.theme-scope)
68643
+ :where([data-block="customer-portal"])
68644
+ .cp-table
68645
+ :is(th, td).cp-col-actions {
68335
68646
  display: none;
68336
68647
  }
68337
68648
 
@@ -68340,24 +68651,34 @@ const containerResponsiveThemeCss = `/*
68340
68651
  }
68341
68652
 
68342
68653
  /* Make the cell a positioning context for the kebab */
68343
- :where(.theme-scope) :where([data-block="customer-portal"]) .cp-row > td:first-child {
68654
+ :where(.theme-scope)
68655
+ :where([data-block="customer-portal"])
68656
+ .cp-row
68657
+ > td:first-child {
68344
68658
  position: relative;
68345
68659
  padding-right: 2.5rem;
68346
68660
  }
68347
68661
 
68348
68662
  /* Position kebab in top-right of the cell */
68349
- :where(.theme-scope) :where([data-block="customer-portal"]) .cp-row-mobile-actions {
68663
+ :where(.theme-scope)
68664
+ :where([data-block="customer-portal"])
68665
+ .cp-row-mobile-actions {
68350
68666
  position: absolute;
68351
68667
  top: 0.5rem;
68352
68668
  right: 0.5rem;
68353
68669
  margin-top: 0;
68354
68670
  }
68355
68671
 
68356
- :where(.theme-scope) :where([data-block="customer-portal"]) .cp-row-mobile-actions .btn-sm {
68672
+ :where(.theme-scope)
68673
+ :where([data-block="customer-portal"])
68674
+ .cp-row-mobile-actions
68675
+ .btn-sm {
68357
68676
  width: auto;
68358
68677
  }
68359
68678
 
68360
- :where(.theme-scope) :where([data-block="customer-portal"]) .cp-profile__edit {
68679
+ :where(.theme-scope)
68680
+ :where([data-block="customer-portal"])
68681
+ .cp-profile__edit {
68361
68682
  align-self: stretch;
68362
68683
  }
68363
68684
  }
@@ -68805,6 +69126,30 @@ const containerResponsiveThemeCss = `/*
68805
69126
  gap: 0.25rem;
68806
69127
  }
68807
69128
 
69129
+ /* Topic choices (visitor picks what to hear about). Same treatment as the
69130
+ form block's .fb-fieldset / .fb-inline, defined here because the newsletter
69131
+ form also renders inside contact-newsletter and the site footer. */
69132
+ :where(.theme-scope) .newsletter-topics {
69133
+ display: flex;
69134
+ flex-direction: column;
69135
+ gap: 0.5rem;
69136
+ border: none;
69137
+ padding: 0;
69138
+ margin: 0;
69139
+ min-width: 0;
69140
+ }
69141
+
69142
+ :where(.theme-scope) .newsletter-topics > legend {
69143
+ padding: 0;
69144
+ margin-bottom: 0.25rem;
69145
+ }
69146
+
69147
+ :where(.theme-scope) .newsletter-topic-choice {
69148
+ display: flex;
69149
+ align-items: center;
69150
+ gap: 0.5rem;
69151
+ }
69152
+
68808
69153
  /* Required indicator */
68809
69154
  :where(.theme-scope) .newsletter-required {
68810
69155
  color: rgb(var(--tb-primary));
@@ -68854,6 +69199,10 @@ const containerResponsiveThemeCss = `/*
68854
69199
  flex-shrink: 0;
68855
69200
  }
68856
69201
 
69202
+ :where(.theme-scope) .newsletter-inline .newsletter-topics {
69203
+ flex-basis: 100%;
69204
+ }
69205
+
68857
69206
  /* Mobile fallback for inline variant */
68858
69207
  @container rb-site (max-width: 640px) {
68859
69208
  @scope ([data-rb-responsive-mode="container"]) to (:scope [data-rb-responsive-mode]) {
@@ -71312,7 +71661,7 @@ function PageContent(props) {
71312
71661
  previewToken,
71313
71662
  resolvedData,
71314
71663
  bookingOfferingPresets: bookingOfferingPresets ?? [],
71315
- mailingList,
71664
+ mailingList: mailingList ?? dataContext?.mailingList,
71316
71665
  bookingTimeZone: resolveSdkBookingTimeZone(bookingTimeZone),
71317
71666
  routes: routeMap,
71318
71667
  pagesByIdentifier,
@@ -72067,8 +72416,12 @@ function shouldSkipResolvedLoader(input) {
72067
72416
  * ```
72068
72417
  */
72069
72418
  async function prefetchBlockData$1(page, context, options) {
72419
+ return (await prefetchBlockDataWithFailures(page, context, options)).resolvedData;
72420
+ }
72421
+ async function prefetchBlockDataWithFailures(page, context, options) {
72070
72422
  const { apiClient, isValidEndpoint, onError, getCustomBlockLoaders, getBlockDefinition: getBlockDefinition$1 = getBlockDefinition, resolveParamsBindings: resolveParamsBindings$1 = resolveParamsBindings } = options;
72071
72423
  const results = {};
72424
+ const loaderFailures = {};
72072
72425
  const tasks = [];
72073
72426
  for (const block of page.blocks) {
72074
72427
  const blockId = block.id;
@@ -72116,6 +72469,11 @@ async function prefetchBlockData$1(page, context, options) {
72116
72469
  const blockResults = results[blockId] ?? (results[blockId] = {});
72117
72470
  blockResults[key] = data;
72118
72471
  } catch (error) {
72472
+ const blockFailures = loaderFailures[blockId] ?? (loaderFailures[blockId] = {});
72473
+ blockFailures[key] = {
72474
+ endpoint,
72475
+ params
72476
+ };
72119
72477
  if (onError) onError(error, {
72120
72478
  block: block.kind,
72121
72479
  loader: key
@@ -72125,7 +72483,10 @@ async function prefetchBlockData$1(page, context, options) {
72125
72483
  }
72126
72484
  }
72127
72485
  if (tasks.length > 0) await Promise.all(tasks);
72128
- return results;
72486
+ return {
72487
+ resolvedData: results,
72488
+ loaderFailures
72489
+ };
72129
72490
  }
72130
72491
  //#endregion
72131
72492
  //#region ../blocks/src/system/data/loaderEndpoints.ts
@@ -72233,9 +72594,11 @@ function convertPageResponseBlock(block) {
72233
72594
  if (typeof block.id !== "string" && block.id !== null) throw new Error(`Invalid block id in page: expected string or null, got ${typeof block.id}`);
72234
72595
  if (typeof block.kind !== "string") throw new Error(`Invalid block kind in page: expected string, got ${typeof block.kind}`);
72235
72596
  if (typeof block.purpose !== "string") throw new Error(`Invalid block purpose in page: expected string, got ${typeof block.purpose}`);
72597
+ 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}`);
72236
72598
  const admission = readInvalidBlockAdmission(block.admission);
72237
72599
  return {
72238
72600
  id: block.id,
72601
+ ...block.contentVersionId !== void 0 ? { contentVersionId: block.contentVersionId } : {},
72239
72602
  kind: block.kind,
72240
72603
  purpose: block.purpose,
72241
72604
  content: sanitizeSdkRuntimeBlockContent(block.kind, readContentRecord(block.content) ?? {}),
@@ -72266,6 +72629,7 @@ function buildRenderablePageOutline(input) {
72266
72629
  function admitSdkRuntimePageBlock(block, customBlocks) {
72267
72630
  const base = {
72268
72631
  id: block.id,
72632
+ ...block.contentVersionId !== void 0 ? { contentVersionId: block.contentVersionId } : {},
72269
72633
  kind: block.kind,
72270
72634
  purpose: block.purpose,
72271
72635
  ...block.bindings ? { bindings: block.bindings } : {}
@@ -73944,6 +74308,14 @@ const PUBLIC_BOOKING_AVAILABILITY_ENDPOINT_DEFINITIONS = defineEndpointDefinitio
73944
74308
  auth: "public",
73945
74309
  responseKind: "json"
73946
74310
  },
74311
+ getPublicBookingServiceBySlug: {
74312
+ path: "/public/bookings/services/by-slug/{slug}",
74313
+ method: "GET",
74314
+ revalidate: publicReadFreshnessSeconds("getPublicBookingService"),
74315
+ tags: [TAG_TEMPLATES.publicBookingServices],
74316
+ auth: "public",
74317
+ responseKind: "json"
74318
+ },
73947
74319
  getPublicBookingResourcesReference: {
73948
74320
  path: "/public/bookings/resources/reference",
73949
74321
  method: "GET",
@@ -74496,16 +74868,110 @@ const PUBLIC_READ_ENDPOINT_DEFINITIONS = defineEndpointDefinitions({
74496
74868
  responseKind: "json"
74497
74869
  }
74498
74870
  });
74871
+ //#endregion
74872
+ //#region ../api/src/publicOnboardingAttemptEndpointDefinitions.ts
74873
+ /**
74874
+ * The anonymous onboarding attempt, addressed by its opaque resume token.
74875
+ *
74876
+ * Every route here is reached before there is an account, so none of them can
74877
+ * be scoped to a site or a user: the token is the whole credential. They are
74878
+ * kept together so that stays obvious.
74879
+ */
74880
+ const PUBLIC_ONBOARDING_ATTEMPT_ENDPOINT_DEFINITIONS = defineEndpointDefinitions({
74881
+ createPublicOnboardingAttempt: {
74882
+ path: "/public/onboarding/attempts",
74883
+ method: "POST",
74884
+ auth: "public",
74885
+ errors: [],
74886
+ responseKind: "json"
74887
+ },
74888
+ createPublicOnboardingLogoUploadUrl: {
74889
+ path: "/public/onboarding/attempts/{attemptToken}/logo-upload-url",
74890
+ method: "POST",
74891
+ auth: "public",
74892
+ errors: [],
74893
+ responseKind: "json"
74894
+ },
74895
+ uploadPublicOnboardingLogo: {
74896
+ path: "/public/onboarding/attempts/{attemptToken}/logo",
74897
+ method: "POST",
74898
+ auth: "public",
74899
+ errors: [],
74900
+ responseKind: "json"
74901
+ },
74902
+ getPublicOnboardingAttempt: {
74903
+ path: "/public/onboarding/attempts/{attemptToken}",
74904
+ method: "GET",
74905
+ auth: "public",
74906
+ errors: [],
74907
+ responseKind: "json"
74908
+ },
74909
+ getPublicOnboardingAttemptProgress: {
74910
+ path: "/public/onboarding/attempts/{attemptToken}/status",
74911
+ method: "GET",
74912
+ auth: "public",
74913
+ errors: [],
74914
+ responseKind: "json"
74915
+ },
74916
+ updatePublicOnboardingAttempt: {
74917
+ path: "/public/onboarding/attempts/{attemptToken}",
74918
+ method: "PATCH",
74919
+ auth: "public",
74920
+ errors: [],
74921
+ responseKind: "json"
74922
+ },
74923
+ runPublicOnboardingAttempt: {
74924
+ path: "/public/onboarding/attempts/{attemptToken}/run",
74925
+ method: "POST",
74926
+ auth: "public",
74927
+ errors: [],
74928
+ responseKind: "json"
74929
+ },
74930
+ resendPublicOnboardingAttemptConfirmation: {
74931
+ path: "/public/onboarding/attempts/{attemptToken}/resend-confirmation",
74932
+ method: "POST",
74933
+ auth: "public",
74934
+ errors: [],
74935
+ responseKind: "json"
74936
+ }
74937
+ });
74938
+ //#endregion
74939
+ //#region ../api/src/billingEndpointDefinitions.ts
74940
+ const BILLING_ENDPOINT_DEFINITIONS = defineEndpointDefinitions({
74941
+ adminChangePlan: {
74942
+ path: "/admin/billing/plan",
74943
+ method: "POST",
74944
+ tags: ["admin", "billing"],
74945
+ auth: "admin",
74946
+ responseKind: "json"
74947
+ },
74948
+ changePlan: {
74949
+ path: "/billing/plan/change",
74950
+ method: "POST",
74951
+ tags: ["billing"],
74952
+ auth: "user",
74953
+ responseKind: "json"
74954
+ },
74955
+ createBillingPortalSession: {
74956
+ path: "/billing/portal/session",
74957
+ method: "POST",
74958
+ tags: ["billing"],
74959
+ auth: "user",
74960
+ responseKind: "json"
74961
+ }
74962
+ });
74499
74963
  ({
74500
74964
  ...ACCOUNT_ENDPOINT_DEFINITIONS,
74965
+ ...PUBLIC_ONBOARDING_ATTEMPT_ENDPOINT_DEFINITIONS,
74501
74966
  ...PUBLIC_EVENT_ENDPOINT_DEFINITIONS,
74502
74967
  ...GIFTING_ENDPOINT_DEFINITIONS,
74503
- ...PUBLIC_READ_ENDPOINT_DEFINITIONS
74968
+ ...PUBLIC_READ_ENDPOINT_DEFINITIONS,
74969
+ ...BILLING_ENDPOINT_DEFINITIONS
74504
74970
  }), 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, {
74505
74971
  ...NEWSLETTER_ENDPOINT_DEFINITIONS,
74506
74972
  ...APPOINTMENT_ENDPOINT_DEFINITIONS,
74507
74973
  ...EVENT_SERIES_REGISTRATION_ENDPOINT_DEFINITIONS
74508
- }, 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 };
74974
+ }, 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 };
74509
74975
  z.object({ refreshToken: z.string().min(1).max(4096) }).strict();
74510
74976
  z.object({
74511
74977
  accessToken: z.string().min(1).max(4096),
@@ -74933,7 +75399,17 @@ const riverbankSiteConfigInputSchema = z.object({
74933
75399
  z.object({
74934
75400
  config: riverbankSiteConfigInputSchema,
74935
75401
  forceContentTypes: z.boolean().optional(),
74936
- mode: z.enum(["apply", "preview"]).optional()
75402
+ mode: z.enum(["apply", "preview"]).optional(),
75403
+ expectedMailingListProviderScope: z.unknown().transform((value, ctx) => {
75404
+ if (value === void 0) return void 0;
75405
+ const parsed = parseMailingListProviderScope(value);
75406
+ if (parsed.ok) return parsed.value;
75407
+ ctx.addIssue({
75408
+ code: "custom",
75409
+ message: "Invalid mailing-list provider scope"
75410
+ });
75411
+ return z.NEVER;
75412
+ }).optional()
74937
75413
  }).strict();
74938
75414
  //#endregion
74939
75415
  //#region ../api/src/sdkThemeWire.ts