@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
@@ -68,11 +68,11 @@ var UnsafePathSegmentError = class extends Error {
68
68
  function assertSafePathSegments(segments) {
69
69
  for (const segment of segments) if (typeof segment === "string" && UNSAFE_PATH_SEGMENTS.has(segment)) throw new UnsafePathSegmentError(segment);
70
70
  }
71
- function isRecord$40(value) {
71
+ function isRecord$41(value) {
72
72
  return typeof value === "object" && value !== null && !Array.isArray(value);
73
73
  }
74
74
  function isPathContainer(value) {
75
- return Array.isArray(value) || isRecord$40(value);
75
+ return Array.isArray(value) || isRecord$41(value);
76
76
  }
77
77
  function getContainerValue(container, segment) {
78
78
  if (typeof segment === "number") return Array.isArray(container) ? container[segment] : void 0;
@@ -1124,10 +1124,12 @@ const unsafeAsStorageBucketName = (value) => value;
1124
1124
  const unsafeAsStoragePath = (value) => value;
1125
1125
  const unsafeAsPositiveByteCount = (value) => value;
1126
1126
  const unsafeAsUserId = (id) => id;
1127
+ const unsafeAsContentVersionId = (id) => id;
1127
1128
  const parseSiteId = (value) => parseUuidBrand$1(value, unsafeAsSiteId);
1128
1129
  const parseApiKeyId = (value) => parseUuidBrand$1(value, unsafeAsApiKeyId);
1129
1130
  const parseEventOfferingId = (value) => parseUuidBrand$1(value, unsafeAsEventOfferingId);
1130
1131
  const parseUserId = (value) => parseUuidBrand$1(value, unsafeAsUserId);
1132
+ const parseContentVersionId = (value) => parseUuidBrand$1(value, unsafeAsContentVersionId);
1131
1133
  const parseEventSeriesId = (value) => parseUuidBrand$1(value, unsafeAsEventSeriesId);
1132
1134
  //#endregion
1133
1135
  //#region ../core/src/assert-never.ts
@@ -1400,7 +1402,7 @@ function parseEventPageSurfaceDestinationMode(value) {
1400
1402
  return value === "cms-managed" || value === "system-managed" ? value : void 0;
1401
1403
  }
1402
1404
  function parseEventPageSurfaceSubject(value) {
1403
- if (!isRecord$39(value)) return err$3({ kind: "notObject" });
1405
+ if (!isRecord$40(value)) return err$3({ kind: "notObject" });
1404
1406
  switch (value.kind) {
1405
1407
  case "eventSeries": {
1406
1408
  const eventSeriesId = parseEventSeriesId(value.eventSeriesId);
@@ -1455,7 +1457,7 @@ function parseEventSeriesIdList(values) {
1455
1457
  }
1456
1458
  return ok$3(parsed);
1457
1459
  }
1458
- function isRecord$39(value) {
1460
+ function isRecord$40(value) {
1459
1461
  return typeof value === "object" && value !== null && !Array.isArray(value);
1460
1462
  }
1461
1463
  //#endregion
@@ -1699,7 +1701,7 @@ function toLocationCoordinates(value) {
1699
1701
  }
1700
1702
  //#endregion
1701
1703
  //#region ../core/src/rich-text.ts
1702
- function isRecord$37(value) {
1704
+ function isRecord$38(value) {
1703
1705
  return typeof value === "object" && value !== null && !Array.isArray(value);
1704
1706
  }
1705
1707
  function hasOnlyKeys(value, allowed) {
@@ -1718,10 +1720,10 @@ function isDenseArrayOf(value, predicate) {
1718
1720
  return true;
1719
1721
  }
1720
1722
  function isTipTapMark(value) {
1721
- return isRecord$37(value) && hasOnlyKeys(value, markKeys) && typeof value.type === "string" && value.type.length > 0 && (value.attrs === void 0 || isRecord$37(value.attrs));
1723
+ return isRecord$38(value) && hasOnlyKeys(value, markKeys) && typeof value.type === "string" && value.type.length > 0 && (value.attrs === void 0 || isRecord$38(value.attrs));
1722
1724
  }
1723
1725
  function isTipTapNode(value) {
1724
- if (!isRecord$37(value) || !hasOnlyKeys(value, nodeKeys) || typeof value.type !== "string" || value.type.length === 0 || value.type === "doc" || value.attrs !== void 0 && !isRecord$37(value.attrs) || value.marks !== void 0 && (!Array.isArray(value.marks) || !isDenseArrayOf(value.marks, isTipTapMark)) || value.content !== void 0 && (!Array.isArray(value.content) || !isDenseArrayOf(value.content, isTipTapNode))) return false;
1726
+ if (!isRecord$38(value) || !hasOnlyKeys(value, nodeKeys) || typeof value.type !== "string" || value.type.length === 0 || value.type === "doc" || value.attrs !== void 0 && !isRecord$38(value.attrs) || value.marks !== void 0 && (!Array.isArray(value.marks) || !isDenseArrayOf(value.marks, isTipTapMark)) || value.content !== void 0 && (!Array.isArray(value.content) || !isDenseArrayOf(value.content, isTipTapNode))) return false;
1725
1727
  if (value.type === "text") return typeof value.text === "string" && value.text.length > 0 && value.content === void 0;
1726
1728
  return value.text === void 0;
1727
1729
  }
@@ -1740,22 +1742,28 @@ function parsePositiveInteger(value) {
1740
1742
  function parseNewsletterListId(value) {
1741
1743
  return parseTrimmedMatchingString(value, UUID_PATTERN$2);
1742
1744
  }
1745
+ function parseMailchimpAccountId(value) {
1746
+ return parseTrimmedMatchingString(value, OPAQUE_ID_PATTERN);
1747
+ }
1743
1748
  function parseMailchimpAudienceId$1(value) {
1744
1749
  return parseTrimmedMatchingString(value, OPAQUE_ID_PATTERN);
1745
1750
  }
1746
1751
  function parseMailchimpInterestId(value) {
1747
1752
  return parseTrimmedMatchingString(value, OPAQUE_ID_PATTERN);
1748
1753
  }
1754
+ function parseBrevoAccountId(value) {
1755
+ return parseTrimmedMatchingString(value, OPAQUE_ID_PATTERN);
1756
+ }
1749
1757
  function parseBrevoListId(value) {
1750
1758
  return parsePositiveInteger(value);
1751
1759
  }
1752
1760
  //#endregion
1753
1761
  //#region ../core/src/mailing-list-targeting-parser.ts
1754
1762
  function parseMailingListPlacementTargeting(value) {
1755
- if (!isRecord$36(value)) return targetingError("shape");
1763
+ if (!isRecord$37(value)) return targetingError("shape");
1756
1764
  if (value.mode === "default") return ok$3({ mode: "default" });
1757
1765
  if (value.mode !== "custom") return targetingError("mode");
1758
- if (!isRecord$36(value.selection)) return targetingError("selection");
1766
+ if (!isRecord$37(value.selection)) return targetingError("selection");
1759
1767
  switch (value.provider) {
1760
1768
  case "native": return parseNativeTargeting(value.selection);
1761
1769
  case "brevo": return parseBrevoTargeting(value.selection);
@@ -1859,7 +1867,7 @@ function parseUniqueIds(value, parseId) {
1859
1867
  }
1860
1868
  return ok$3(parsed);
1861
1869
  }
1862
- function isRecord$36(value) {
1870
+ function isRecord$37(value) {
1863
1871
  return typeof value === "object" && value !== null && !Array.isArray(value);
1864
1872
  }
1865
1873
  function targetingError(field) {
@@ -1881,6 +1889,31 @@ new Map([
1881
1889
  "legal"
1882
1890
  ].map((kind, index) => [kind, index]));
1883
1891
  //#endregion
1892
+ //#region ../core/src/mailing-list-setup.ts
1893
+ function isRecord$34(value) {
1894
+ return typeof value === "object" && value !== null && !Array.isArray(value);
1895
+ }
1896
+ const DEFAULT_MAILING_LIST_SUCCESS_MESSAGE = "Thanks — you're on the list.";
1897
+ function parseMailingListProviderScope(value) {
1898
+ if (!isRecord$34(value)) return err$3("invalid_mailing_list_provider_scope");
1899
+ if (value.provider === "native") return ok$3({ provider: "native" });
1900
+ if (value.provider === "brevo") {
1901
+ const accountId = parseBrevoAccountId(value.accountId);
1902
+ return accountId !== null ? ok$3({
1903
+ provider: "brevo",
1904
+ accountId
1905
+ }) : err$3("invalid_mailing_list_provider_scope");
1906
+ }
1907
+ if (value.provider === "mailchimp") {
1908
+ const accountId = parseMailchimpAccountId(value.accountId);
1909
+ return accountId !== null ? ok$3({
1910
+ provider: "mailchimp",
1911
+ accountId
1912
+ }) : err$3("invalid_mailing_list_provider_scope");
1913
+ }
1914
+ return err$3("invalid_mailing_list_provider_scope");
1915
+ }
1916
+ //#endregion
1884
1917
  //#region ../core/src/mailing-list-setup-parser.ts
1885
1918
  function parseMailingListGlobalForm(value) {
1886
1919
  if (!isRecord$33(value)) return formError("shape");
@@ -1889,12 +1922,15 @@ function parseMailingListGlobalForm(value) {
1889
1922
  if (typeof value.includeOptionalPhone !== "boolean") return formError("includeOptionalPhone");
1890
1923
  const buttonLabel = parseRequiredString(value.buttonLabel);
1891
1924
  if (buttonLabel === null) return formError("buttonLabel");
1925
+ const successMessage = parseRequiredString(value.successMessage);
1926
+ if (successMessage === null) return formError("successMessage");
1892
1927
  const privacyNote = parseOptionalString(value.privacyNote);
1893
1928
  if (privacyNote === void 0) return formError("privacyNote");
1894
1929
  return ok$3({
1895
1930
  fields,
1896
1931
  includeOptionalPhone: value.includeOptionalPhone,
1897
1932
  buttonLabel,
1933
+ successMessage,
1898
1934
  privacyNote
1899
1935
  });
1900
1936
  }
@@ -2101,11 +2137,17 @@ function parseMailingListSignedSourceToken(value) {
2101
2137
  const parsed = typeof value === "string" ? value.trim() : "";
2102
2138
  return /^[A-Za-z0-9._~-]{16,1000}$/u.test(parsed) ? parsed : null;
2103
2139
  }
2104
- function buildMailingListSignupBlockSourceRef(blockId) {
2105
- const parsed = parseMailingListBlockId(blockId);
2106
- return parsed !== null ? {
2140
+ function parseMailingListContentVersionId(value) {
2141
+ const parsed = parseContentVersionId(value);
2142
+ return parsed.ok ? parsed.value : null;
2143
+ }
2144
+ function buildMailingListSignupBlockSourceRef(blockId, contentVersionId) {
2145
+ const parsedBlockId = parseMailingListBlockId(blockId);
2146
+ const parsedContentVersionId = parseMailingListContentVersionId(contentVersionId);
2147
+ return parsedBlockId !== null && parsedContentVersionId !== null ? {
2107
2148
  tag: "block_ref",
2108
- blockId: parsed
2149
+ blockId: parsedBlockId,
2150
+ contentVersionId: parsedContentVersionId
2109
2151
  } : null;
2110
2152
  }
2111
2153
  function sortStableJsonValue(value) {
@@ -5338,6 +5380,440 @@ function themeButtonClassName(spec) {
5338
5380
  spec.extraClassName
5339
5381
  ].filter(Boolean).join(" ");
5340
5382
  }
5383
+ const defaultThemeTokens = {
5384
+ color: {
5385
+ "background/base": "#ffffff",
5386
+ "background/elevated": "#f5f5f5",
5387
+ "surface/base": "#ffffff",
5388
+ "surface/subtle": "#f9f9fb",
5389
+ "surface/inverted": "#111111",
5390
+ "content/primary": "#111111",
5391
+ "content/secondary": "#3f3f46",
5392
+ "accent/primary": "#2563eb",
5393
+ "accent/secondary": "#1d4ed8",
5394
+ "border/base": "#e5e7eb"
5395
+ },
5396
+ typography: {
5397
+ "display/hero": {
5398
+ fontSize: "clamp(48px, 8vw, 96px)",
5399
+ lineHeight: "1.05",
5400
+ fontWeight: "700"
5401
+ },
5402
+ "display/section": {
5403
+ fontSize: "clamp(40px, 6vw, 72px)",
5404
+ lineHeight: "1.1",
5405
+ fontWeight: "700"
5406
+ },
5407
+ "heading/large": {
5408
+ fontSize: "clamp(32px, 4vw, 48px)",
5409
+ lineHeight: "1.2",
5410
+ fontWeight: "600"
5411
+ },
5412
+ "heading/medium": {
5413
+ fontSize: "clamp(24px, 3vw, 32px)",
5414
+ lineHeight: "1.25",
5415
+ fontWeight: "600"
5416
+ },
5417
+ "heading/small": {
5418
+ fontSize: "20px",
5419
+ lineHeight: "1.3",
5420
+ fontWeight: "600"
5421
+ },
5422
+ "body/normal": {
5423
+ fontSize: "16px",
5424
+ lineHeight: "1.6",
5425
+ fontWeight: "400"
5426
+ },
5427
+ "body/small": {
5428
+ fontSize: "14px",
5429
+ lineHeight: "1.5",
5430
+ fontWeight: "400"
5431
+ },
5432
+ caption: {
5433
+ fontSize: "12px",
5434
+ lineHeight: "1.4",
5435
+ fontWeight: "500"
5436
+ }
5437
+ },
5438
+ spacing: {
5439
+ none: "0px",
5440
+ "3xs": "4px",
5441
+ "2xs": "8px",
5442
+ xs: "12px",
5443
+ sm: "16px",
5444
+ md: "24px",
5445
+ lg: "32px",
5446
+ xl: "40px",
5447
+ "2xl": "56px",
5448
+ "3xl": "72px"
5449
+ },
5450
+ radius: {
5451
+ none: "0px",
5452
+ xs: "2px",
5453
+ sm: "4px",
5454
+ md: "8px",
5455
+ lg: "12px",
5456
+ pill: "999px",
5457
+ full: "9999px"
5458
+ },
5459
+ shadow: {
5460
+ none: "none",
5461
+ soft: "0px 2px 8px rgba(15, 23, 42, 0.08)",
5462
+ medium: "0px 6px 18px rgba(15, 23, 42, 0.12)",
5463
+ strong: "0px 12px 36px rgba(15, 23, 42, 0.16)"
5464
+ },
5465
+ palette: {
5466
+ surface: "#ffffff",
5467
+ "neutral-50": "#f9fafb",
5468
+ "neutral-900": "#111827",
5469
+ primary: "#2563eb",
5470
+ "primary-50": "#eff6ff",
5471
+ "primary-500": "#2563eb",
5472
+ "primary-900": "#1d4ed8",
5473
+ secondary: "#9333ea",
5474
+ "secondary-50": "#f3e8ff",
5475
+ "secondary-500": "#9333ea",
5476
+ "secondary-900": "#4c1d95",
5477
+ accent: "#f97316",
5478
+ "accent-50": "#fff7ed",
5479
+ "accent-500": "#f97316",
5480
+ "accent-900": "#7c2d12"
5481
+ }
5482
+ };
5483
+ /**
5484
+ * Project the expanded semantic palette into the token buckets consumed by
5485
+ * runtime transforms. Keep this mapping shared by full themes and the
5486
+ * tokens-only hosted-booking runtime so the two paths cannot drift.
5487
+ */
5488
+ function buildThemeTokens(palette) {
5489
+ const tokens = cloneThemeTokens(defaultThemeTokens);
5490
+ const paletteStrings = {};
5491
+ for (const [key, value] of Object.entries(palette)) if (typeof value === "string" && value.trim().length > 0) paletteStrings[key] = value;
5492
+ tokens.palette = paletteStrings;
5493
+ const resolveColor = (...keys) => {
5494
+ for (const key of keys) {
5495
+ const value = paletteStrings[key];
5496
+ if (value) return value;
5497
+ }
5498
+ };
5499
+ const assignColor = (token, ...keys) => {
5500
+ const value = resolveColor(...keys);
5501
+ if (value) tokens.color[token] = value;
5502
+ };
5503
+ assignColor("background/base", "background", "surface", "primary-50");
5504
+ assignColor("background/elevated", "surface", "background");
5505
+ assignColor("surface/base", "surface", "background");
5506
+ assignColor("surface/subtle", "neutral-100", "surface", "background");
5507
+ assignColor("surface/inverted", "neutral-900", "text", "primary-900");
5508
+ assignColor("content/primary", "text", "body", "neutral-900");
5509
+ assignColor("content/secondary", "mutedText", "secondary", "neutral-600");
5510
+ assignColor("accent/primary", "primary", "accent");
5511
+ assignColor("accent/secondary", "accent", "secondary", "primary-400");
5512
+ assignColor("border/base", "border", "neutral-300");
5513
+ return tokens;
5514
+ }
5515
+ function cloneThemeTokens(source) {
5516
+ return JSON.parse(JSON.stringify(source));
5517
+ }
5518
+ //#endregion
5519
+ //#region ../theme-core/src/palette/utils/opaqueSurfaceColor.ts
5520
+ /** Resolve an opaque colour, compositing alpha against an explicit underlay. */
5521
+ function resolveOpaqueSurfaceHex(reference, palette, underlayReference) {
5522
+ const opaque = resolveConcreteColorHex(reference, palette);
5523
+ if (opaque) return opaque;
5524
+ if (!underlayReference) return null;
5525
+ const underlayHex = resolveConcreteColorHex(underlayReference, palette);
5526
+ if (!underlayHex) return null;
5527
+ const parts = parseColorTokenParts(reference);
5528
+ if (parts.kind === "token" && parts.opacityPercent !== null) {
5529
+ const foregroundHex = normalizePaletteHex(palette[parts.token] ?? "");
5530
+ return foregroundHex ? compositeHex(foregroundHex, underlayHex, parts.opacityPercent / 100) : null;
5531
+ }
5532
+ const rgba = parseRgba(parts.kind === "raw" ? parts.value : reference);
5533
+ return rgba ? compositeHex(rgbToHex$1(rgba.r, rgba.g, rgba.b), underlayHex, rgba.alpha) : null;
5534
+ }
5535
+ /** Resolve a colour reference only when it is already fully opaque. */
5536
+ function resolveConcreteColorHex(reference, palette) {
5537
+ const literalHex = normalizePaletteHex(reference);
5538
+ if (literalHex) return literalHex;
5539
+ const parts = parseColorTokenParts(reference);
5540
+ if (parts.kind === "token") {
5541
+ if (parts.opacityPercent !== null) return null;
5542
+ return normalizePaletteHex(palette[parts.token] ?? "");
5543
+ }
5544
+ const literal = parts.kind === "raw" ? parts.value : reference;
5545
+ if (literal.toLowerCase() === "black") return "#000000";
5546
+ if (literal.toLowerCase() === "white") return "#ffffff";
5547
+ return normalizePaletteHex(literal);
5548
+ }
5549
+ function compositeHex(foregroundHex, underlayHex, alpha) {
5550
+ const foreground = hexToRgb$1(foregroundHex);
5551
+ const underlay = hexToRgb$1(underlayHex);
5552
+ const channel = (foregroundValue, underlayValue) => Math.round(foregroundValue * alpha + underlayValue * (1 - alpha));
5553
+ return rgbToHex$1(channel(foreground.r, underlay.r), channel(foreground.g, underlay.g), channel(foreground.b, underlay.b));
5554
+ }
5555
+ function parseRgba(value) {
5556
+ const match = value.trim().match(/^rgba?\(\s*([\d.]+)(?:\s*,\s*|\s+)([\d.]+)(?:\s*,\s*|\s+)([\d.]+)(?:\s*(?:,|\/)\s*([\d.]+%?))?\s*\)$/i);
5557
+ if (!match) return null;
5558
+ const [, rSource, gSource, bSource] = match;
5559
+ if (!rSource || !gSource || !bSource) return null;
5560
+ const r = Number(rSource);
5561
+ const g = Number(gSource);
5562
+ const b = Number(bSource);
5563
+ const alpha = parseAlpha(match[4]);
5564
+ if (alpha === null || !isRgbChannel(r) || !isRgbChannel(g) || !isRgbChannel(b)) return null;
5565
+ return {
5566
+ r,
5567
+ g,
5568
+ b,
5569
+ alpha
5570
+ };
5571
+ }
5572
+ function parseAlpha(source) {
5573
+ if (!source) return 1;
5574
+ const value = source.endsWith("%") ? Number(source.slice(0, -1)) / 100 : Number(source);
5575
+ return Number.isFinite(value) && value >= 0 && value <= 1 ? value : null;
5576
+ }
5577
+ function isRgbChannel(value) {
5578
+ return Number.isFinite(value) && value >= 0 && value <= 255;
5579
+ }
5580
+ //#endregion
5581
+ //#region ../theme-core/src/surfaces/resolveSurfaceForeground.ts
5582
+ const FALLBACK_TEXT_TOKENS = [
5583
+ "text",
5584
+ "primaryForeground",
5585
+ "secondaryForeground",
5586
+ "accentForeground",
5587
+ "neutral-950",
5588
+ "neutral-50"
5589
+ ];
5590
+ const CANONICAL_EQUIVALENT_TOKEN_ORDER = [
5591
+ "text",
5592
+ "primaryForeground",
5593
+ "secondaryForeground",
5594
+ "accentForeground",
5595
+ "onPrimary",
5596
+ "onSecondary",
5597
+ "onAccent",
5598
+ "onSurface",
5599
+ "neutral-950",
5600
+ "neutral-50"
5601
+ ];
5602
+ /**
5603
+ * Resolve the complete foreground contract for an effective page/section or
5604
+ * site-chrome background.
5605
+ *
5606
+ * Deterministic colour backgrounds are validated at ordinary-text WCAG AA.
5607
+ * Existing image/video/gradient treatments are trusted only when they already
5608
+ * carry a usable foreground token; this function deliberately does not claim
5609
+ * pixel-level contrast proof for media.
5610
+ */
5611
+ function resolveSurfaceForeground(background, palette, candidates = {}, options = {}) {
5612
+ const authored = foregroundCandidates(background, candidates);
5613
+ if (background === null) return resolveDeterministicForeground("background", {
5614
+ ...authored,
5615
+ text: authored.text ?? "text"
5616
+ }, palette);
5617
+ if (background.type === "color") {
5618
+ const backgroundReference = normalizedReference(background.color);
5619
+ if (!backgroundReference || backgroundReference === "transparent") return { kind: "unknown" };
5620
+ return resolveDeterministicForeground(backgroundReference, authored, palette, options.compositeBase);
5621
+ }
5622
+ return resolveTrustedTreatmentForeground(authored, palette);
5623
+ }
5624
+ function foregroundCandidates(background, overrides) {
5625
+ return {
5626
+ text: overrides.text ?? background?.textColor ?? null,
5627
+ heading: overrides.heading ?? background?.headingColor ?? null,
5628
+ link: overrides.link ?? background?.linkColor ?? null,
5629
+ supporting: overrides.supporting ?? background?.supportingColor ?? null
5630
+ };
5631
+ }
5632
+ function resolveDeterministicForeground(backgroundReference, candidates, palette, compositeBase) {
5633
+ const backgroundHex = resolveOpaqueSurfaceHex(backgroundReference, palette, compositeBase);
5634
+ if (!backgroundHex) return resolveTrustedTreatmentForeground(candidates, palette);
5635
+ const backgroundToken = paletteToken(backgroundReference);
5636
+ const derivedOnToken = backgroundToken ? onColorTokenName(backgroundToken) : null;
5637
+ const text = firstSafeToken([
5638
+ candidates.text,
5639
+ derivedOnToken,
5640
+ ...FALLBACK_TEXT_TOKENS
5641
+ ], backgroundHex, palette, derivedOnToken ? [derivedOnToken] : []);
5642
+ if (!text) return { kind: "unknown" };
5643
+ return {
5644
+ kind: "known",
5645
+ roles: {
5646
+ text,
5647
+ heading: safeTokenOr(candidates.heading, text, backgroundHex, palette),
5648
+ link: safeTokenOr(candidates.link, text, backgroundHex, palette),
5649
+ supporting: safeTokenOr(candidates.supporting, text, backgroundHex, palette)
5650
+ }
5651
+ };
5652
+ }
5653
+ function resolveTrustedTreatmentForeground(candidates, palette) {
5654
+ const text = canonicalToken(candidates.text, palette);
5655
+ if (!text) return { kind: "unknown" };
5656
+ return {
5657
+ kind: "known",
5658
+ roles: {
5659
+ text,
5660
+ heading: canonicalToken(candidates.heading, palette) ?? text,
5661
+ link: canonicalToken(candidates.link, palette) ?? text,
5662
+ supporting: canonicalToken(candidates.supporting, palette) ?? text
5663
+ }
5664
+ };
5665
+ }
5666
+ function safeTokenOr(candidate, fallback, backgroundHex, palette) {
5667
+ return firstSafeToken([candidate], backgroundHex, palette) ?? fallback;
5668
+ }
5669
+ function firstSafeToken(candidates, backgroundHex, palette, preferredEquivalentTokens = []) {
5670
+ const seen = /* @__PURE__ */ new Set();
5671
+ for (const candidate of candidates) {
5672
+ const token = canonicalToken(candidate, palette, preferredEquivalentTokens);
5673
+ if (!token || seen.has(token)) continue;
5674
+ seen.add(token);
5675
+ const foregroundHex = resolveConcreteColorHex(token, palette);
5676
+ if (foregroundHex && contrastRatio(backgroundHex, foregroundHex) >= 4.5) return token;
5677
+ }
5678
+ return null;
5679
+ }
5680
+ function canonicalToken(reference, palette, preferredEquivalentTokens = []) {
5681
+ const normalized = normalizedReference(reference);
5682
+ if (!normalized || normalized === "transparent") return null;
5683
+ const direct = parseThemeColorToken(normalized);
5684
+ if (direct && resolveConcreteColorHex(direct, palette)) return direct;
5685
+ const referenceHex = resolveConcreteColorHex(normalized, palette);
5686
+ if (!referenceHex) return null;
5687
+ const equivalent = [
5688
+ ...preferredEquivalentTokens,
5689
+ ...CANONICAL_EQUIVALENT_TOKEN_ORDER,
5690
+ ...Object.keys(palette).sort()
5691
+ ].find((token) => {
5692
+ const parsed = parseThemeColorToken(token);
5693
+ return parsed !== null && resolveConcreteColorHex(parsed, palette)?.toLowerCase() === referenceHex.toLowerCase();
5694
+ });
5695
+ return equivalent ? parseThemeColorToken(equivalent) : null;
5696
+ }
5697
+ function paletteToken(reference) {
5698
+ const parts = parseColorTokenParts(reference);
5699
+ return parts.kind === "token" && parts.opacityPercent === null ? parts.token : null;
5700
+ }
5701
+ function normalizedReference(value) {
5702
+ if (typeof value !== "string") return null;
5703
+ const normalized = value.trim();
5704
+ return normalized.length > 0 ? normalized : null;
5705
+ }
5706
+ //#endregion
5707
+ //#region ../theme-core/src/utils/colorStyles.ts
5708
+ const COLOR_VAR_PREFIX = "--tb-";
5709
+ function parseToken(source) {
5710
+ const parts = parseColorTokenParts(source);
5711
+ if (parts.kind === "raw") return {
5712
+ token: source,
5713
+ raw: parts.value
5714
+ };
5715
+ if (parts.kind === "invalid") return { token: source };
5716
+ return {
5717
+ token: parts.token,
5718
+ opacityPercent: parts.opacityPercent === null ? void 0 : parts.opacityPercent
5719
+ };
5720
+ }
5721
+ const SURFACE_TEXT_ROLE_BY_TOKEN = {
5722
+ text: "text",
5723
+ heading: "heading",
5724
+ mutedText: "supporting"
5725
+ };
5726
+ function surfaceRoleForTextToken(token) {
5727
+ return Object.prototype.hasOwnProperty.call(SURFACE_TEXT_ROLE_BY_TOKEN, token) ? SURFACE_TEXT_ROLE_BY_TOKEN[token] : null;
5728
+ }
5729
+ /**
5730
+ * Converts a theme color token to a CSS rgb value.
5731
+ * This is the primary function for applying theme colors to CSS properties.
5732
+ *
5733
+ * @param token - Theme color token (semantic, with opacity, or raw)
5734
+ * @returns CSS color value (rgb with optional alpha, or raw CSS value)
5735
+ *
5736
+ * @example
5737
+ * rgbColorValue('primary') // => 'rgb(var(--tb-primary))'
5738
+ * rgbColorValue('surface/95') // => 'rgb(var(--tb-surface) / 0.95)'
5739
+ * rgbColorValue('raw:transparent') // => 'transparent'
5740
+ */
5741
+ function rgbColorValue(token) {
5742
+ const { token: baseToken, opacityPercent, raw } = parseToken(token);
5743
+ if (raw) return raw;
5744
+ const cssVar = `${COLOR_VAR_PREFIX}${baseToken}`;
5745
+ if (opacityPercent === void 0) return `rgb(var(${cssVar}))`;
5746
+ return `rgb(var(${cssVar}) / ${opacityPercent / 100})`;
5747
+ }
5748
+ /**
5749
+ * Converts a theme color token to a CSS variable reference.
5750
+ * Note: This returns the base variable without rgb() wrapper, ignoring opacity.
5751
+ *
5752
+ * @param token - Theme color token
5753
+ * @returns CSS variable reference
5754
+ *
5755
+ * @example
5756
+ * cssVarValue('primary') // => 'var(--tb-primary)'
5757
+ * cssVarValue('surface/95') // => 'var(--tb-surface)' (opacity ignored)
5758
+ */
5759
+ function cssVarValue(token) {
5760
+ const { token: baseToken } = parseToken(token);
5761
+ return `var(${COLOR_VAR_PREFIX}${baseToken})`;
5762
+ }
5763
+ /**
5764
+ * Creates a backgroundColor style object from a theme token.
5765
+ *
5766
+ * @param token - Theme color token
5767
+ * @returns CSSProperties with backgroundColor
5768
+ */
5769
+ function backgroundColorStyle(token) {
5770
+ return { backgroundColor: rgbColorValue(token) };
5771
+ }
5772
+ /**
5773
+ * Creates a text color style object from a theme token.
5774
+ *
5775
+ * @param token - Theme color token
5776
+ * @returns CSSProperties with color
5777
+ */
5778
+ function textColorStyle(token) {
5779
+ const parsed = parseToken(token);
5780
+ const surfaceRole = parsed.raw ? null : surfaceRoleForTextToken(parsed.token);
5781
+ if (surfaceRole) return { color: parsed.opacityPercent === void 0 ? surfaceForegroundValue(surfaceRole) : surfaceForegroundValueWithOpacity(surfaceRole, parsed.opacityPercent) };
5782
+ return { color: rgbColorValue(token) };
5783
+ }
5784
+ /**
5785
+ * Creates a border color style object from a theme token.
5786
+ *
5787
+ * @param token - Theme color token
5788
+ * @returns CSSProperties with borderColor
5789
+ */
5790
+ function borderColorStyle(token) {
5791
+ return { borderColor: rgbColorValue(token) };
5792
+ }
5793
+ /**
5794
+ * Merges multiple CSSProperties objects into a single object.
5795
+ * Later styles override earlier ones. Undefined values are filtered out.
5796
+ * Returns undefined if the merged result is empty.
5797
+ *
5798
+ * @param styles - Variable number of CSSProperties objects (can be undefined)
5799
+ * @returns Merged CSSProperties object, or undefined if empty
5800
+ *
5801
+ * @example
5802
+ * mergeStyles(
5803
+ * backgroundColorStyle('surface'),
5804
+ * textColorStyle('text'),
5805
+ * borderColorStyle('border')
5806
+ * )
5807
+ * // => { backgroundColor: '...', color: '...', borderColor: '...' }
5808
+ */
5809
+ function mergeStyles(...styles) {
5810
+ const merged = {};
5811
+ for (const style of styles) {
5812
+ if (!style) continue;
5813
+ Object.assign(merged, style);
5814
+ }
5815
+ return Object.keys(merged).length ? merged : void 0;
5816
+ }
5341
5817
  //#endregion
5342
5818
  //#region ../theme-core/src/tokens/resolver.ts
5343
5819
  /**
@@ -5365,7 +5841,7 @@ var TokenResolver = class {
5365
5841
  */
5366
5842
  getColor(token) {
5367
5843
  if (!this.tokenExists(token)) console.warn(`[TokenResolver] Color token "${token}" not found in theme palette. Button may render incorrectly.`);
5368
- return `rgb(var(--tb-${token}))`;
5844
+ return rgbColorValue(token);
5369
5845
  }
5370
5846
  /**
5371
5847
  * Adjust a color token's shade by a given amount
@@ -6837,305 +7313,6 @@ function affordanceIconMaskUrl(iconId) {
6837
7313
  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, " ")}`;
6838
7314
  }
6839
7315
  //#endregion
6840
- //#region ../theme-core/src/palette/utils/opaqueSurfaceColor.ts
6841
- /** Resolve an opaque colour, compositing alpha against an explicit underlay. */
6842
- function resolveOpaqueSurfaceHex(reference, palette, underlayReference) {
6843
- const opaque = resolveConcreteColorHex(reference, palette);
6844
- if (opaque) return opaque;
6845
- if (!underlayReference) return null;
6846
- const underlayHex = resolveConcreteColorHex(underlayReference, palette);
6847
- if (!underlayHex) return null;
6848
- const parts = parseColorTokenParts(reference);
6849
- if (parts.kind === "token" && parts.opacityPercent !== null) {
6850
- const foregroundHex = normalizePaletteHex(palette[parts.token] ?? "");
6851
- return foregroundHex ? compositeHex(foregroundHex, underlayHex, parts.opacityPercent / 100) : null;
6852
- }
6853
- const rgba = parseRgba(parts.kind === "raw" ? parts.value : reference);
6854
- return rgba ? compositeHex(rgbToHex$1(rgba.r, rgba.g, rgba.b), underlayHex, rgba.alpha) : null;
6855
- }
6856
- /** Resolve a colour reference only when it is already fully opaque. */
6857
- function resolveConcreteColorHex(reference, palette) {
6858
- const literalHex = normalizePaletteHex(reference);
6859
- if (literalHex) return literalHex;
6860
- const parts = parseColorTokenParts(reference);
6861
- if (parts.kind === "token") {
6862
- if (parts.opacityPercent !== null) return null;
6863
- return normalizePaletteHex(palette[parts.token] ?? "");
6864
- }
6865
- const literal = parts.kind === "raw" ? parts.value : reference;
6866
- if (literal.toLowerCase() === "black") return "#000000";
6867
- if (literal.toLowerCase() === "white") return "#ffffff";
6868
- return normalizePaletteHex(literal);
6869
- }
6870
- function compositeHex(foregroundHex, underlayHex, alpha) {
6871
- const foreground = hexToRgb$1(foregroundHex);
6872
- const underlay = hexToRgb$1(underlayHex);
6873
- const channel = (foregroundValue, underlayValue) => Math.round(foregroundValue * alpha + underlayValue * (1 - alpha));
6874
- return rgbToHex$1(channel(foreground.r, underlay.r), channel(foreground.g, underlay.g), channel(foreground.b, underlay.b));
6875
- }
6876
- function parseRgba(value) {
6877
- const match = value.trim().match(/^rgba?\(\s*([\d.]+)(?:\s*,\s*|\s+)([\d.]+)(?:\s*,\s*|\s+)([\d.]+)(?:\s*(?:,|\/)\s*([\d.]+%?))?\s*\)$/i);
6878
- if (!match) return null;
6879
- const [, rSource, gSource, bSource] = match;
6880
- if (!rSource || !gSource || !bSource) return null;
6881
- const r = Number(rSource);
6882
- const g = Number(gSource);
6883
- const b = Number(bSource);
6884
- const alpha = parseAlpha(match[4]);
6885
- if (alpha === null || !isRgbChannel(r) || !isRgbChannel(g) || !isRgbChannel(b)) return null;
6886
- return {
6887
- r,
6888
- g,
6889
- b,
6890
- alpha
6891
- };
6892
- }
6893
- function parseAlpha(source) {
6894
- if (!source) return 1;
6895
- const value = source.endsWith("%") ? Number(source.slice(0, -1)) / 100 : Number(source);
6896
- return Number.isFinite(value) && value >= 0 && value <= 1 ? value : null;
6897
- }
6898
- function isRgbChannel(value) {
6899
- return Number.isFinite(value) && value >= 0 && value <= 255;
6900
- }
6901
- //#endregion
6902
- //#region ../theme-core/src/surfaces/resolveSurfaceForeground.ts
6903
- const FALLBACK_TEXT_TOKENS = [
6904
- "text",
6905
- "primaryForeground",
6906
- "secondaryForeground",
6907
- "accentForeground",
6908
- "neutral-950",
6909
- "neutral-50"
6910
- ];
6911
- const CANONICAL_EQUIVALENT_TOKEN_ORDER = [
6912
- "text",
6913
- "primaryForeground",
6914
- "secondaryForeground",
6915
- "accentForeground",
6916
- "onPrimary",
6917
- "onSecondary",
6918
- "onAccent",
6919
- "onSurface",
6920
- "neutral-950",
6921
- "neutral-50"
6922
- ];
6923
- /**
6924
- * Resolve the complete foreground contract for an effective page/section or
6925
- * site-chrome background.
6926
- *
6927
- * Deterministic colour backgrounds are validated at ordinary-text WCAG AA.
6928
- * Existing image/video/gradient treatments are trusted only when they already
6929
- * carry a usable foreground token; this function deliberately does not claim
6930
- * pixel-level contrast proof for media.
6931
- */
6932
- function resolveSurfaceForeground(background, palette, candidates = {}, options = {}) {
6933
- const authored = foregroundCandidates(background, candidates);
6934
- if (background === null) return resolveDeterministicForeground("background", {
6935
- ...authored,
6936
- text: authored.text ?? "text"
6937
- }, palette);
6938
- if (background.type === "color") {
6939
- const backgroundReference = normalizedReference(background.color);
6940
- if (!backgroundReference || backgroundReference === "transparent") return { kind: "unknown" };
6941
- return resolveDeterministicForeground(backgroundReference, authored, palette, options.compositeBase);
6942
- }
6943
- return resolveTrustedTreatmentForeground(authored, palette);
6944
- }
6945
- function foregroundCandidates(background, overrides) {
6946
- return {
6947
- text: overrides.text ?? background?.textColor ?? null,
6948
- heading: overrides.heading ?? background?.headingColor ?? null,
6949
- link: overrides.link ?? background?.linkColor ?? null,
6950
- supporting: overrides.supporting ?? background?.supportingColor ?? null
6951
- };
6952
- }
6953
- function resolveDeterministicForeground(backgroundReference, candidates, palette, compositeBase) {
6954
- const backgroundHex = resolveOpaqueSurfaceHex(backgroundReference, palette, compositeBase);
6955
- if (!backgroundHex) return resolveTrustedTreatmentForeground(candidates, palette);
6956
- const backgroundToken = paletteToken(backgroundReference);
6957
- const derivedOnToken = backgroundToken ? onColorTokenName(backgroundToken) : null;
6958
- const text = firstSafeToken([
6959
- candidates.text,
6960
- derivedOnToken,
6961
- ...FALLBACK_TEXT_TOKENS
6962
- ], backgroundHex, palette, derivedOnToken ? [derivedOnToken] : []);
6963
- if (!text) return { kind: "unknown" };
6964
- return {
6965
- kind: "known",
6966
- roles: {
6967
- text,
6968
- heading: safeTokenOr(candidates.heading, text, backgroundHex, palette),
6969
- link: safeTokenOr(candidates.link, text, backgroundHex, palette),
6970
- supporting: safeTokenOr(candidates.supporting, text, backgroundHex, palette)
6971
- }
6972
- };
6973
- }
6974
- function resolveTrustedTreatmentForeground(candidates, palette) {
6975
- const text = canonicalToken(candidates.text, palette);
6976
- if (!text) return { kind: "unknown" };
6977
- return {
6978
- kind: "known",
6979
- roles: {
6980
- text,
6981
- heading: canonicalToken(candidates.heading, palette) ?? text,
6982
- link: canonicalToken(candidates.link, palette) ?? text,
6983
- supporting: canonicalToken(candidates.supporting, palette) ?? text
6984
- }
6985
- };
6986
- }
6987
- function safeTokenOr(candidate, fallback, backgroundHex, palette) {
6988
- return firstSafeToken([candidate], backgroundHex, palette) ?? fallback;
6989
- }
6990
- function firstSafeToken(candidates, backgroundHex, palette, preferredEquivalentTokens = []) {
6991
- const seen = /* @__PURE__ */ new Set();
6992
- for (const candidate of candidates) {
6993
- const token = canonicalToken(candidate, palette, preferredEquivalentTokens);
6994
- if (!token || seen.has(token)) continue;
6995
- seen.add(token);
6996
- const foregroundHex = resolveConcreteColorHex(token, palette);
6997
- if (foregroundHex && contrastRatio(backgroundHex, foregroundHex) >= 4.5) return token;
6998
- }
6999
- return null;
7000
- }
7001
- function canonicalToken(reference, palette, preferredEquivalentTokens = []) {
7002
- const normalized = normalizedReference(reference);
7003
- if (!normalized || normalized === "transparent") return null;
7004
- const direct = parseThemeColorToken(normalized);
7005
- if (direct && resolveConcreteColorHex(direct, palette)) return direct;
7006
- const referenceHex = resolveConcreteColorHex(normalized, palette);
7007
- if (!referenceHex) return null;
7008
- const equivalent = [
7009
- ...preferredEquivalentTokens,
7010
- ...CANONICAL_EQUIVALENT_TOKEN_ORDER,
7011
- ...Object.keys(palette).sort()
7012
- ].find((token) => {
7013
- const parsed = parseThemeColorToken(token);
7014
- return parsed !== null && resolveConcreteColorHex(parsed, palette)?.toLowerCase() === referenceHex.toLowerCase();
7015
- });
7016
- return equivalent ? parseThemeColorToken(equivalent) : null;
7017
- }
7018
- function paletteToken(reference) {
7019
- const parts = parseColorTokenParts(reference);
7020
- return parts.kind === "token" && parts.opacityPercent === null ? parts.token : null;
7021
- }
7022
- function normalizedReference(value) {
7023
- if (typeof value !== "string") return null;
7024
- const normalized = value.trim();
7025
- return normalized.length > 0 ? normalized : null;
7026
- }
7027
- //#endregion
7028
- //#region ../theme-core/src/utils/colorStyles.ts
7029
- const COLOR_VAR_PREFIX = "--tb-";
7030
- function parseToken(source) {
7031
- const parts = parseColorTokenParts(source);
7032
- if (parts.kind === "raw") return {
7033
- token: source,
7034
- raw: parts.value
7035
- };
7036
- if (parts.kind === "invalid") return { token: source };
7037
- return {
7038
- token: parts.token,
7039
- opacityPercent: parts.opacityPercent === null ? void 0 : parts.opacityPercent
7040
- };
7041
- }
7042
- const SURFACE_TEXT_ROLE_BY_TOKEN = {
7043
- text: "text",
7044
- heading: "heading",
7045
- mutedText: "supporting"
7046
- };
7047
- function surfaceRoleForTextToken(token) {
7048
- return Object.prototype.hasOwnProperty.call(SURFACE_TEXT_ROLE_BY_TOKEN, token) ? SURFACE_TEXT_ROLE_BY_TOKEN[token] : null;
7049
- }
7050
- /**
7051
- * Converts a theme color token to a CSS rgb value.
7052
- * This is the primary function for applying theme colors to CSS properties.
7053
- *
7054
- * @param token - Theme color token (semantic, with opacity, or raw)
7055
- * @returns CSS color value (rgb with optional alpha, or raw CSS value)
7056
- *
7057
- * @example
7058
- * rgbColorValue('primary') // => 'rgb(var(--tb-primary))'
7059
- * rgbColorValue('surface/95') // => 'rgb(var(--tb-surface) / 0.95)'
7060
- * rgbColorValue('raw:transparent') // => 'transparent'
7061
- */
7062
- function rgbColorValue(token) {
7063
- const { token: baseToken, opacityPercent, raw } = parseToken(token);
7064
- if (raw) return raw;
7065
- const cssVar = `${COLOR_VAR_PREFIX}${baseToken}`;
7066
- if (opacityPercent === void 0) return `rgb(var(${cssVar}))`;
7067
- return `rgb(var(${cssVar}) / ${opacityPercent / 100})`;
7068
- }
7069
- /**
7070
- * Converts a theme color token to a CSS variable reference.
7071
- * Note: This returns the base variable without rgb() wrapper, ignoring opacity.
7072
- *
7073
- * @param token - Theme color token
7074
- * @returns CSS variable reference
7075
- *
7076
- * @example
7077
- * cssVarValue('primary') // => 'var(--tb-primary)'
7078
- * cssVarValue('surface/95') // => 'var(--tb-surface)' (opacity ignored)
7079
- */
7080
- function cssVarValue(token) {
7081
- const { token: baseToken } = parseToken(token);
7082
- return `var(${COLOR_VAR_PREFIX}${baseToken})`;
7083
- }
7084
- /**
7085
- * Creates a backgroundColor style object from a theme token.
7086
- *
7087
- * @param token - Theme color token
7088
- * @returns CSSProperties with backgroundColor
7089
- */
7090
- function backgroundColorStyle(token) {
7091
- return { backgroundColor: rgbColorValue(token) };
7092
- }
7093
- /**
7094
- * Creates a text color style object from a theme token.
7095
- *
7096
- * @param token - Theme color token
7097
- * @returns CSSProperties with color
7098
- */
7099
- function textColorStyle(token) {
7100
- const parsed = parseToken(token);
7101
- const surfaceRole = parsed.raw ? null : surfaceRoleForTextToken(parsed.token);
7102
- if (surfaceRole) return { color: parsed.opacityPercent === void 0 ? surfaceForegroundValue(surfaceRole) : surfaceForegroundValueWithOpacity(surfaceRole, parsed.opacityPercent) };
7103
- return { color: rgbColorValue(token) };
7104
- }
7105
- /**
7106
- * Creates a border color style object from a theme token.
7107
- *
7108
- * @param token - Theme color token
7109
- * @returns CSSProperties with borderColor
7110
- */
7111
- function borderColorStyle(token) {
7112
- return { borderColor: rgbColorValue(token) };
7113
- }
7114
- /**
7115
- * Merges multiple CSSProperties objects into a single object.
7116
- * Later styles override earlier ones. Undefined values are filtered out.
7117
- * Returns undefined if the merged result is empty.
7118
- *
7119
- * @param styles - Variable number of CSSProperties objects (can be undefined)
7120
- * @returns Merged CSSProperties object, or undefined if empty
7121
- *
7122
- * @example
7123
- * mergeStyles(
7124
- * backgroundColorStyle('surface'),
7125
- * textColorStyle('text'),
7126
- * borderColorStyle('border')
7127
- * )
7128
- * // => { backgroundColor: '...', color: '...', borderColor: '...' }
7129
- */
7130
- function mergeStyles(...styles) {
7131
- const merged = {};
7132
- for (const style of styles) {
7133
- if (!style) continue;
7134
- Object.assign(merged, style);
7135
- }
7136
- return Object.keys(merged).length ? merged : void 0;
7137
- }
7138
- //#endregion
7139
7316
  //#region ../theme-core/src/utils/tokenOrColor.ts
7140
7317
  /**
7141
7318
  * Runtime color-reference fields intentionally accept any string, including
@@ -11833,8 +12010,14 @@ const headerInteractionPillPaletteValues = [
11833
12010
  "accent"
11834
12011
  ];
11835
12012
  /**
11836
- * "No pill": the nav link keeps whatever hover treatment its recipe compiled,
11837
- * and the palette step writes nothing at all (#1318 Phase 4c decision 2).
12013
+ * "No pill": a colour change on hover rather than a filled background.
12014
+ *
12015
+ * The palette step writes nothing (#1318 Phase 4c decision 2), but on a
12016
+ * foreground-adaptive style that is not the end of the story: the hover colour
12017
+ * is derived from the resolved opening foreground at render time, paired with
12018
+ * the resting colour, so `quiet` resolves to a definite colour rather than to
12019
+ * whatever brand token the recipe happened to name. See
12020
+ * `applyOpeningForeground`.
11838
12021
  *
11839
12022
  * It exists because "a colour change on hover, no filled background" was not
11840
12023
  * expressible in the vocabulary, and it is what
@@ -12858,6 +13041,28 @@ const bookingRequirementConsentFieldSchema = z$1.object({
12858
13041
  const bookingConsentCarrierSchema = z$1.union([blockBookingConsentSchema, bookingRequirementConsentFieldSchema]);
12859
13042
  //#endregion
12860
13043
  //#region ../blocks/src/system/blocks/events/shared/schemas.ts
13044
+ const publicEventLoaderQuerySchemaShape = {
13045
+ limit: z$1.string().optional(),
13046
+ from: z$1.string().optional(),
13047
+ to: z$1.string().optional(),
13048
+ afterStartsAt: z$1.string().optional(),
13049
+ afterId: z$1.string().optional(),
13050
+ categoryIds: z$1.string().optional(),
13051
+ venueId: z$1.string().optional(),
13052
+ staffMemberId: z$1.string().optional(),
13053
+ eventSurface: z$1.string().optional(),
13054
+ eventPresets: z$1.string().optional(),
13055
+ scheduleScope: z$1.string().optional(),
13056
+ seriesId: z$1.string().optional(),
13057
+ seriesIds: z$1.string().optional(),
13058
+ runSeriesId: z$1.string().optional(),
13059
+ seriesSlug: z$1.string().optional(),
13060
+ includeOccurrenceId: z$1.string().optional(),
13061
+ readIntent: z$1.string().optional(),
13062
+ detailLevel: z$1.string().optional(),
13063
+ readProfile: z$1.string().optional()
13064
+ };
13065
+ z$1.object(publicEventLoaderQuerySchemaShape);
12861
13066
  const eventPresetSchema = z$1.enum([
12862
13067
  "event",
12863
13068
  "class",
@@ -15245,141 +15450,6 @@ function assertUniqueLayoutProfileKeys(profiles) {
15245
15450
  });
15246
15451
  if (duplicates.length > 0) throw new Error(`Duplicate block layout design profiles: ${duplicates.join(", ")}`);
15247
15452
  }
15248
- const defaultThemeTokens = {
15249
- color: {
15250
- "background/base": "#ffffff",
15251
- "background/elevated": "#f5f5f5",
15252
- "surface/base": "#ffffff",
15253
- "surface/subtle": "#f9f9fb",
15254
- "surface/inverted": "#111111",
15255
- "content/primary": "#111111",
15256
- "content/secondary": "#3f3f46",
15257
- "accent/primary": "#2563eb",
15258
- "accent/secondary": "#1d4ed8",
15259
- "border/base": "#e5e7eb"
15260
- },
15261
- typography: {
15262
- "display/hero": {
15263
- fontSize: "clamp(48px, 8vw, 96px)",
15264
- lineHeight: "1.05",
15265
- fontWeight: "700"
15266
- },
15267
- "display/section": {
15268
- fontSize: "clamp(40px, 6vw, 72px)",
15269
- lineHeight: "1.1",
15270
- fontWeight: "700"
15271
- },
15272
- "heading/large": {
15273
- fontSize: "clamp(32px, 4vw, 48px)",
15274
- lineHeight: "1.2",
15275
- fontWeight: "600"
15276
- },
15277
- "heading/medium": {
15278
- fontSize: "clamp(24px, 3vw, 32px)",
15279
- lineHeight: "1.25",
15280
- fontWeight: "600"
15281
- },
15282
- "heading/small": {
15283
- fontSize: "20px",
15284
- lineHeight: "1.3",
15285
- fontWeight: "600"
15286
- },
15287
- "body/normal": {
15288
- fontSize: "16px",
15289
- lineHeight: "1.6",
15290
- fontWeight: "400"
15291
- },
15292
- "body/small": {
15293
- fontSize: "14px",
15294
- lineHeight: "1.5",
15295
- fontWeight: "400"
15296
- },
15297
- caption: {
15298
- fontSize: "12px",
15299
- lineHeight: "1.4",
15300
- fontWeight: "500"
15301
- }
15302
- },
15303
- spacing: {
15304
- none: "0px",
15305
- "3xs": "4px",
15306
- "2xs": "8px",
15307
- xs: "12px",
15308
- sm: "16px",
15309
- md: "24px",
15310
- lg: "32px",
15311
- xl: "40px",
15312
- "2xl": "56px",
15313
- "3xl": "72px"
15314
- },
15315
- radius: {
15316
- none: "0px",
15317
- xs: "2px",
15318
- sm: "4px",
15319
- md: "8px",
15320
- lg: "12px",
15321
- pill: "999px",
15322
- full: "9999px"
15323
- },
15324
- shadow: {
15325
- none: "none",
15326
- soft: "0px 2px 8px rgba(15, 23, 42, 0.08)",
15327
- medium: "0px 6px 18px rgba(15, 23, 42, 0.12)",
15328
- strong: "0px 12px 36px rgba(15, 23, 42, 0.16)"
15329
- },
15330
- palette: {
15331
- surface: "#ffffff",
15332
- "neutral-50": "#f9fafb",
15333
- "neutral-900": "#111827",
15334
- primary: "#2563eb",
15335
- "primary-50": "#eff6ff",
15336
- "primary-500": "#2563eb",
15337
- "primary-900": "#1d4ed8",
15338
- secondary: "#9333ea",
15339
- "secondary-50": "#f3e8ff",
15340
- "secondary-500": "#9333ea",
15341
- "secondary-900": "#4c1d95",
15342
- accent: "#f97316",
15343
- "accent-50": "#fff7ed",
15344
- "accent-500": "#f97316",
15345
- "accent-900": "#7c2d12"
15346
- }
15347
- };
15348
- /**
15349
- * Project the expanded semantic palette into the token buckets consumed by
15350
- * runtime transforms. Keep this mapping shared by full themes and the
15351
- * tokens-only hosted-booking runtime so the two paths cannot drift.
15352
- */
15353
- function buildThemeTokens(palette) {
15354
- const tokens = cloneThemeTokens(defaultThemeTokens);
15355
- const paletteStrings = {};
15356
- for (const [key, value] of Object.entries(palette)) if (typeof value === "string" && value.trim().length > 0) paletteStrings[key] = value;
15357
- tokens.palette = paletteStrings;
15358
- const resolveColor = (...keys) => {
15359
- for (const key of keys) {
15360
- const value = paletteStrings[key];
15361
- if (value) return value;
15362
- }
15363
- };
15364
- const assignColor = (token, ...keys) => {
15365
- const value = resolveColor(...keys);
15366
- if (value) tokens.color[token] = value;
15367
- };
15368
- assignColor("background/base", "background", "surface", "primary-50");
15369
- assignColor("background/elevated", "surface", "background");
15370
- assignColor("surface/base", "surface", "background");
15371
- assignColor("surface/subtle", "neutral-100", "surface", "background");
15372
- assignColor("surface/inverted", "neutral-900", "text", "primary-900");
15373
- assignColor("content/primary", "text", "body", "neutral-900");
15374
- assignColor("content/secondary", "mutedText", "secondary", "neutral-600");
15375
- assignColor("accent/primary", "primary", "accent");
15376
- assignColor("accent/secondary", "accent", "secondary", "primary-400");
15377
- assignColor("border/base", "border", "neutral-300");
15378
- return tokens;
15379
- }
15380
- function cloneThemeTokens(source) {
15381
- return JSON.parse(JSON.stringify(source));
15382
- }
15383
15453
  //#endregion
15384
15454
  //#region ../theme-core/src/site-styles/backgroundAppearance.ts
15385
15455
  const backgroundAppearanceQuickColorTokenNames = [
@@ -31033,6 +31103,44 @@ function toWholeSeriesRegistrationEvents(events) {
31033
31103
  return groupPublicEventsByRun(events).map(toWholeSeriesRegistrationEvent).filter((event) => event !== null);
31034
31104
  }
31035
31105
  //#endregion
31106
+ //#region ../blocks/src/system/runtime/nodes/event-registration/eventSourceRecovery.ts
31107
+ const { limit: _rawLimit, eventSurface: _rawEventSurface, scheduleScope: _rawScheduleScope, detailLevel: _rawDetailLevel, ...stringEventQueryShape } = publicEventLoaderQuerySchemaShape;
31108
+ const eventRecoveryRequestSchema = z$1.object({
31109
+ ...stringEventQueryShape,
31110
+ limit: z$1.coerce.number().int().positive().optional(),
31111
+ eventSurface: z$1.enum(eventSurfaceScopeValues).optional(),
31112
+ scheduleScope: z$1.enum(eventScheduleScopeValues).optional(),
31113
+ detailLevel: z$1.enum(["full", "listing"]).optional(),
31114
+ stage: z$1.enum(["preview", "published"]).optional()
31115
+ });
31116
+ function resolveEventRegistrationEventSource(input) {
31117
+ if (input.wholeSeriesRunEvents != null) return {
31118
+ kind: "loaded",
31119
+ events: input.wholeSeriesRunEvents
31120
+ };
31121
+ if (input.events != null) return {
31122
+ kind: "loaded",
31123
+ events: input.events
31124
+ };
31125
+ return {
31126
+ kind: "unresolved",
31127
+ request: parseEventLoaderRecoveryRequest(input.failures?.wholeSeriesRunEvents ?? input.failures?.events)
31128
+ };
31129
+ }
31130
+ const eventLoaderFailureSchema = z$1.object({
31131
+ endpoint: z$1.literal("listPublicEvents"),
31132
+ params: eventRecoveryRequestSchema.extend({ siteId: z$1.string().optional() })
31133
+ });
31134
+ function parseEventLoaderRecoveryRequest(value) {
31135
+ const parsed = eventLoaderFailureSchema.safeParse(value);
31136
+ if (!parsed.success) return null;
31137
+ const { siteId: _siteId, stage, ...params } = parsed.data.params;
31138
+ return {
31139
+ ...params,
31140
+ stage: stage ?? "published"
31141
+ };
31142
+ }
31143
+ //#endregion
31036
31144
  //#region ../blocks/src/system/runtime/nodes/event-registration.interactive.ts
31037
31145
  const EVENT_REGISTRATION_GENERIC_SHELL_STEP_LABELS = [
31038
31146
  "Date",
@@ -31050,8 +31158,6 @@ const eventRegistrationPublicEventSchema = z$1.preprocess(normalizeEventRegistra
31050
31158
  const eventRegistrationHydrationSchemaShape = {
31051
31159
  occurrenceContext: occurrenceContextSchema.optional(),
31052
31160
  subject: eventRegistrationPageSurfaceSubjectSchema.nullable().optional(),
31053
- events: z$1.array(eventRegistrationPublicEventSchema).nullable().optional(),
31054
- wholeSeriesRunEvents: z$1.array(eventRegistrationPublicEventSchema).nullable().optional(),
31055
31161
  maxTickets: z$1.string().optional(),
31056
31162
  showVenue: z$1.boolean().optional(),
31057
31163
  showCapacity: z$1.boolean().optional(),
@@ -31063,12 +31169,22 @@ const eventRegistrationHydrationSchemaShape = {
31063
31169
  sitePasses: publicPassProductCollectionSchema.nullable().optional(),
31064
31170
  siteMemberships: publicMembershipProductCollectionSchema.nullable().optional()
31065
31171
  };
31172
+ const eventRegistrationEventSourceSchema = z$1.discriminatedUnion("kind", [z$1.object({
31173
+ kind: z$1.literal("loaded"),
31174
+ events: z$1.array(eventRegistrationPublicEventSchema)
31175
+ }), z$1.object({
31176
+ kind: z$1.literal("unresolved"),
31177
+ request: eventRecoveryRequestSchema.nullable()
31178
+ })]);
31066
31179
  const eventRegistrationSourceSchema = z$1.object({
31067
31180
  siteId: z$1.string().optional(),
31068
31181
  apiBaseUrl: z$1.string().optional(),
31069
31182
  portalToken: z$1.string().nullable().optional(),
31070
31183
  previewToken: z$1.string().nullable().optional(),
31071
31184
  ...eventRegistrationHydrationSchemaShape,
31185
+ events: z$1.array(eventRegistrationPublicEventSchema).nullable().optional(),
31186
+ wholeSeriesRunEvents: z$1.array(eventRegistrationPublicEventSchema).nullable().optional(),
31187
+ eventLoaderFailures: z$1.record(z$1.string(), z$1.unknown()).nullable().optional(),
31072
31188
  className: z$1.string().nullable().optional(),
31073
31189
  buttonText: z$1.string().nullable().optional(),
31074
31190
  maxTickets: z$1.string().nullable().optional(),
@@ -31089,7 +31205,10 @@ const eventRegistrationDisplaySchema = z$1.discriminatedUnion("state", [z$1.obje
31089
31205
  titleText: z$1.string(),
31090
31206
  bodyText: z$1.string()
31091
31207
  })]);
31092
- const eventRegistrationHydrationSchema = z$1.object(eventRegistrationHydrationSchemaShape);
31208
+ const eventRegistrationHydrationSchema = z$1.object({
31209
+ ...eventRegistrationHydrationSchemaShape,
31210
+ eventSource: eventRegistrationEventSourceSchema
31211
+ });
31093
31212
  const eventRegistrationRenderSchema = z$1.object({
31094
31213
  display: eventRegistrationDisplaySchema,
31095
31214
  hydration: eventRegistrationHydrationSchema
@@ -31148,16 +31267,12 @@ function buildEventRegistrationShellStepLabels(source, scopedSourceEvents) {
31148
31267
  function toScopedEventRegistrationEvents(scopedSourceEvents) {
31149
31268
  return [...toRegistrationEvents(scopedSourceEvents), ...toWholeSeriesRegistrationEvents(scopedSourceEvents)];
31150
31269
  }
31151
- function scopeEventRegistrationSourceEvents(source) {
31152
- return resolveEventRegistrationScopedEvents(source.wholeSeriesRunEvents ?? source.events ?? [], {
31270
+ function scopeEventRegistrationSourceEvents(source, eventSource) {
31271
+ return resolveEventRegistrationScopedEvents(eventSource.kind === "loaded" ? eventSource.events : [], {
31153
31272
  occurrenceContext: source.occurrenceContext,
31154
31273
  subject: source.subject
31155
31274
  });
31156
31275
  }
31157
- function resolveLoadedEventRegistrationSourceEvents(source, scopedSourceEvents) {
31158
- if (source.events == null && source.wholeSeriesRunEvents == null) return null;
31159
- return [...scopedSourceEvents];
31160
- }
31161
31276
  /**
31162
31277
  * The one run this surface is registering for, when the scoped events describe
31163
31278
  * exactly one. More than one run means the visitor still has to choose.
@@ -31197,14 +31312,21 @@ const eventRegistrationBlockRuntime = defineClientOwnedBlockRuntime({
31197
31312
  render: createZodCodec(eventRegistrationRenderSchema)
31198
31313
  },
31199
31314
  buildRender: (source) => {
31200
- const scopedSourceEvents = scopeEventRegistrationSourceEvents(source);
31201
- const events = resolveLoadedEventRegistrationSourceEvents(source, scopedSourceEvents);
31315
+ const eventSource = resolveEventRegistrationEventSource({
31316
+ events: source.events,
31317
+ wholeSeriesRunEvents: source.wholeSeriesRunEvents,
31318
+ failures: source.eventLoaderFailures
31319
+ });
31320
+ const scopedSourceEvents = scopeEventRegistrationSourceEvents(source, eventSource);
31202
31321
  return {
31203
31322
  display: buildEventRegistrationDisplayFromScopedEvents(source, scopedSourceEvents),
31204
31323
  hydration: {
31205
31324
  occurrenceContext: source.occurrenceContext ?? null,
31206
31325
  subject: source.subject ?? null,
31207
- events,
31326
+ eventSource: eventSource.kind === "loaded" ? {
31327
+ ...eventSource,
31328
+ events: [...scopedSourceEvents]
31329
+ } : eventSource,
31208
31330
  maxTickets: source.maxTickets ?? void 0,
31209
31331
  showVenue: source.showVenue,
31210
31332
  showCapacity: source.showCapacity,
@@ -31599,6 +31721,15 @@ const newsletterFieldSchema = z$1.object({
31599
31721
  placeholder: z$1.string().optional()
31600
31722
  });
31601
31723
  const mailingListSignupBlockIdSchema = z$1.string().trim().min(1).transform(parseRequiredMailingListSignupBlockId);
31724
+ const mailingListContentVersionIdSchema = z$1.string().transform((value, ctx) => {
31725
+ const parsed = parseMailingListContentVersionId(value);
31726
+ if (parsed) return parsed;
31727
+ ctx.addIssue({
31728
+ code: z$1.ZodIssueCode.custom,
31729
+ message: "Invalid mailing-list content version ID"
31730
+ });
31731
+ return z$1.NEVER;
31732
+ });
31602
31733
  const signedMailingListSourceTokenSchema = z$1.string().trim().min(1).transform(parseRequiredMailingListSignedSourceToken);
31603
31734
  const newsletterSourceCommonSchema = z$1.object({
31604
31735
  siteId: z$1.string().optional(),
@@ -31612,7 +31743,8 @@ const newsletterSourceCommonSchema = z$1.object({
31612
31743
  const newsletterSourceSchema = z$1.discriminatedUnion("source", [
31613
31744
  newsletterSourceCommonSchema.extend({
31614
31745
  source: z$1.literal("block"),
31615
- blockId: z$1.string().nullable().optional()
31746
+ blockId: z$1.string().nullable().optional(),
31747
+ contentVersionId: z$1.string().nullable().optional()
31616
31748
  }),
31617
31749
  newsletterSourceCommonSchema.extend({
31618
31750
  source: z$1.literal("signed-footer"),
@@ -31628,6 +31760,7 @@ const newsletterDisplaySchema = z$1.object({
31628
31760
  availability: z$1.enum(["ready", "unavailable"]),
31629
31761
  className: z$1.string().nullable(),
31630
31762
  buttonLabel: z$1.string(),
31763
+ successMessage: z$1.string(),
31631
31764
  buttonVariant: newsletterButtonVariantSchema,
31632
31765
  privacyNote: z$1.string().nullable(),
31633
31766
  fields: z$1.array(newsletterFieldSchema),
@@ -31642,7 +31775,8 @@ const newsletterHydrationSchema = z$1.object({
31642
31775
  tag: z$1.literal("block-source"),
31643
31776
  sourceRef: z$1.object({
31644
31777
  tag: z$1.literal("block_ref"),
31645
- blockId: mailingListSignupBlockIdSchema
31778
+ blockId: mailingListSignupBlockIdSchema,
31779
+ contentVersionId: mailingListContentVersionIdSchema
31646
31780
  }).nullable()
31647
31781
  }),
31648
31782
  z$1.object({
@@ -31681,6 +31815,7 @@ function buildNewsletterDisplay(source) {
31681
31815
  fields: { preset: "emailOnly" },
31682
31816
  includeOptionalPhone: false,
31683
31817
  buttonLabel: "Subscribe",
31818
+ successMessage: DEFAULT_MAILING_LIST_SUCCESS_MESSAGE,
31684
31819
  privacyNote: null
31685
31820
  };
31686
31821
  const targeting = source.targeting ?? { mode: "default" };
@@ -31690,6 +31825,7 @@ function buildNewsletterDisplay(source) {
31690
31825
  availability: runtimeTargetingIsAvailable(context, targeting, choices) ? "ready" : "unavailable",
31691
31826
  className: source.className ?? null,
31692
31827
  buttonLabel: form.buttonLabel,
31828
+ successMessage: form.successMessage,
31693
31829
  buttonVariant: source.buttonVariant ?? "primary",
31694
31830
  privacyNote: form.privacyNote,
31695
31831
  fields: getGlobalFormFields(form),
@@ -31720,7 +31856,7 @@ const newsletterFormBlockRuntime = defineProgressiveBlockRuntime({
31720
31856
  function projectNewsletterFormHydrationTarget(source) {
31721
31857
  switch (source.source) {
31722
31858
  case "block": {
31723
- const sourceRef = buildMailingListSignupBlockSourceRef(source.blockId);
31859
+ const sourceRef = buildMailingListSignupBlockSourceRef(source.blockId, source.contentVersionId);
31724
31860
  if (sourceRef?.tag === "block_ref") return {
31725
31861
  tag: "block-source",
31726
31862
  sourceRef
@@ -33977,6 +34113,14 @@ const PUBLIC_BOOKING_AVAILABILITY_ENDPOINT_DEFINITIONS = defineEndpointDefinitio
33977
34113
  auth: "public",
33978
34114
  responseKind: "json"
33979
34115
  },
34116
+ getPublicBookingServiceBySlug: {
34117
+ path: "/public/bookings/services/by-slug/{slug}",
34118
+ method: "GET",
34119
+ revalidate: publicReadFreshnessSeconds("getPublicBookingService"),
34120
+ tags: [TAG_TEMPLATES.publicBookingServices],
34121
+ auth: "public",
34122
+ responseKind: "json"
34123
+ },
33980
34124
  getPublicBookingResourcesReference: {
33981
34125
  path: "/public/bookings/resources/reference",
33982
34126
  method: "GET",
@@ -34529,11 +34673,105 @@ const PUBLIC_READ_ENDPOINT_DEFINITIONS = defineEndpointDefinitions({
34529
34673
  responseKind: "json"
34530
34674
  }
34531
34675
  });
34676
+ //#endregion
34677
+ //#region ../api/src/publicOnboardingAttemptEndpointDefinitions.ts
34678
+ /**
34679
+ * The anonymous onboarding attempt, addressed by its opaque resume token.
34680
+ *
34681
+ * Every route here is reached before there is an account, so none of them can
34682
+ * be scoped to a site or a user: the token is the whole credential. They are
34683
+ * kept together so that stays obvious.
34684
+ */
34685
+ const PUBLIC_ONBOARDING_ATTEMPT_ENDPOINT_DEFINITIONS = defineEndpointDefinitions({
34686
+ createPublicOnboardingAttempt: {
34687
+ path: "/public/onboarding/attempts",
34688
+ method: "POST",
34689
+ auth: "public",
34690
+ errors: [],
34691
+ responseKind: "json"
34692
+ },
34693
+ createPublicOnboardingLogoUploadUrl: {
34694
+ path: "/public/onboarding/attempts/{attemptToken}/logo-upload-url",
34695
+ method: "POST",
34696
+ auth: "public",
34697
+ errors: [],
34698
+ responseKind: "json"
34699
+ },
34700
+ uploadPublicOnboardingLogo: {
34701
+ path: "/public/onboarding/attempts/{attemptToken}/logo",
34702
+ method: "POST",
34703
+ auth: "public",
34704
+ errors: [],
34705
+ responseKind: "json"
34706
+ },
34707
+ getPublicOnboardingAttempt: {
34708
+ path: "/public/onboarding/attempts/{attemptToken}",
34709
+ method: "GET",
34710
+ auth: "public",
34711
+ errors: [],
34712
+ responseKind: "json"
34713
+ },
34714
+ getPublicOnboardingAttemptProgress: {
34715
+ path: "/public/onboarding/attempts/{attemptToken}/status",
34716
+ method: "GET",
34717
+ auth: "public",
34718
+ errors: [],
34719
+ responseKind: "json"
34720
+ },
34721
+ updatePublicOnboardingAttempt: {
34722
+ path: "/public/onboarding/attempts/{attemptToken}",
34723
+ method: "PATCH",
34724
+ auth: "public",
34725
+ errors: [],
34726
+ responseKind: "json"
34727
+ },
34728
+ runPublicOnboardingAttempt: {
34729
+ path: "/public/onboarding/attempts/{attemptToken}/run",
34730
+ method: "POST",
34731
+ auth: "public",
34732
+ errors: [],
34733
+ responseKind: "json"
34734
+ },
34735
+ resendPublicOnboardingAttemptConfirmation: {
34736
+ path: "/public/onboarding/attempts/{attemptToken}/resend-confirmation",
34737
+ method: "POST",
34738
+ auth: "public",
34739
+ errors: [],
34740
+ responseKind: "json"
34741
+ }
34742
+ });
34743
+ //#endregion
34744
+ //#region ../api/src/billingEndpointDefinitions.ts
34745
+ const BILLING_ENDPOINT_DEFINITIONS = defineEndpointDefinitions({
34746
+ adminChangePlan: {
34747
+ path: "/admin/billing/plan",
34748
+ method: "POST",
34749
+ tags: ["admin", "billing"],
34750
+ auth: "admin",
34751
+ responseKind: "json"
34752
+ },
34753
+ changePlan: {
34754
+ path: "/billing/plan/change",
34755
+ method: "POST",
34756
+ tags: ["billing"],
34757
+ auth: "user",
34758
+ responseKind: "json"
34759
+ },
34760
+ createBillingPortalSession: {
34761
+ path: "/billing/portal/session",
34762
+ method: "POST",
34763
+ tags: ["billing"],
34764
+ auth: "user",
34765
+ responseKind: "json"
34766
+ }
34767
+ });
34532
34768
  const API_ENDPOINTS$1 = {
34533
34769
  ...ACCOUNT_ENDPOINT_DEFINITIONS,
34770
+ ...PUBLIC_ONBOARDING_ATTEMPT_ENDPOINT_DEFINITIONS,
34534
34771
  ...PUBLIC_EVENT_ENDPOINT_DEFINITIONS,
34535
34772
  ...GIFTING_ENDPOINT_DEFINITIONS,
34536
34773
  ...PUBLIC_READ_ENDPOINT_DEFINITIONS,
34774
+ ...BILLING_ENDPOINT_DEFINITIONS,
34537
34775
  aiContentUpdateChat: {
34538
34776
  path: "/ai/content-update-chat",
34539
34777
  method: "POST",
@@ -34687,55 +34925,6 @@ const API_ENDPOINTS$1 = {
34687
34925
  errors: [],
34688
34926
  responseKind: "json"
34689
34927
  },
34690
- createPublicOnboardingAttempt: {
34691
- path: "/public/onboarding/attempts",
34692
- method: "POST",
34693
- auth: "public",
34694
- errors: [],
34695
- responseKind: "json"
34696
- },
34697
- createPublicOnboardingLogoUploadUrl: {
34698
- path: "/public/onboarding/attempts/{attemptToken}/logo-upload-url",
34699
- method: "POST",
34700
- auth: "public",
34701
- errors: [],
34702
- responseKind: "json"
34703
- },
34704
- uploadPublicOnboardingLogo: {
34705
- path: "/public/onboarding/attempts/{attemptToken}/logo",
34706
- method: "POST",
34707
- auth: "public",
34708
- errors: [],
34709
- responseKind: "json"
34710
- },
34711
- getPublicOnboardingAttempt: {
34712
- path: "/public/onboarding/attempts/{attemptToken}",
34713
- method: "GET",
34714
- auth: "public",
34715
- errors: [],
34716
- responseKind: "json"
34717
- },
34718
- getPublicOnboardingAttemptProgress: {
34719
- path: "/public/onboarding/attempts/{attemptToken}/status",
34720
- method: "GET",
34721
- auth: "public",
34722
- errors: [],
34723
- responseKind: "json"
34724
- },
34725
- updatePublicOnboardingAttempt: {
34726
- path: "/public/onboarding/attempts/{attemptToken}",
34727
- method: "PATCH",
34728
- auth: "public",
34729
- errors: [],
34730
- responseKind: "json"
34731
- },
34732
- runPublicOnboardingAttempt: {
34733
- path: "/public/onboarding/attempts/{attemptToken}/run",
34734
- method: "POST",
34735
- auth: "public",
34736
- errors: [],
34737
- responseKind: "json"
34738
- },
34739
34928
  aiSiteWizardSuggestGoals: {
34740
34929
  path: "/sites/{siteId}/ai/site-wizard/goals",
34741
34930
  method: "POST",
@@ -36251,20 +36440,6 @@ const API_ENDPOINTS$1 = {
36251
36440
  auth: "admin",
36252
36441
  responseKind: "json"
36253
36442
  },
36254
- adminChangePlan: {
36255
- path: "/admin/billing/plan",
36256
- method: "POST",
36257
- tags: ["admin", "billing"],
36258
- auth: "admin",
36259
- responseKind: "json"
36260
- },
36261
- changePlan: {
36262
- path: "/billing/plan/change",
36263
- method: "POST",
36264
- tags: ["billing"],
36265
- auth: "user",
36266
- responseKind: "json"
36267
- },
36268
36443
  mfaTotpEnroll: {
36269
36444
  path: "/auth/mfa/totp/enroll",
36270
36445
  method: "POST",
@@ -36613,7 +36788,12 @@ const API_ENDPOINTS$1 = {
36613
36788
  path: "/public/sites/{siteId}/sitemap",
36614
36789
  method: "GET",
36615
36790
  revalidate: 60,
36616
- tags: [TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.siteSettings],
36791
+ tags: [
36792
+ TAG_TEMPLATES.siteRoutableContent,
36793
+ TAG_TEMPLATES.siteSettings,
36794
+ TAG_TEMPLATES.publicEvents,
36795
+ TAG_TEMPLATES.publicBookingServices
36796
+ ],
36617
36797
  auth: "public",
36618
36798
  responseKind: "json"
36619
36799
  },
@@ -39932,6 +40112,17 @@ const API_ENDPOINTS$1 = {
39932
40112
  auth: "public",
39933
40113
  responseKind: "json"
39934
40114
  },
40115
+ portalCancelWaitlistEntry: {
40116
+ path: "/portal/waitlists/{entryId}/cancel",
40117
+ method: "POST",
40118
+ auth: "public",
40119
+ responseKind: "json",
40120
+ errors: [
40121
+ "resource:not_found",
40122
+ "resource:conflict",
40123
+ "server:internal_error"
40124
+ ]
40125
+ },
39935
40126
  portalGetEventGuests: {
39936
40127
  path: "/portal/events/{registrationId}/guests",
39937
40128
  method: "GET",
@@ -44894,7 +45085,7 @@ const publicPricingSchema = z$1.object({
44894
45085
  singlePriceAmount: z$1.number().nullable(),
44895
45086
  slidingMinAmount: z$1.number().nullable(),
44896
45087
  slidingMaxAmount: z$1.number().nullable(),
44897
- options: z$1.array(publicPricingOptionSchema)
45088
+ options: z$1.array(publicPricingOptionSchema).readonly()
44898
45089
  });
44899
45090
  const publicAppointmentServiceSchema = z$1.object({
44900
45091
  id: z$1.string().min(1),
@@ -47744,6 +47935,7 @@ const eventRegistrationBlockDefinition = {
47744
47935
  } },
47745
47936
  events: { $bind: { from: "data.events" } },
47746
47937
  wholeSeriesRunEvents: { $bind: { from: "data.wholeSeriesRunEvents" } },
47938
+ loaderFailures: { $bind: { from: "$root.loaderFailures" } },
47747
47939
  sitePasses: { $bind: { from: "data.sitePasses" } },
47748
47940
  siteMemberships: { $bind: { from: "data.siteMemberships" } },
47749
47941
  stage: { $bind: {
@@ -51555,9 +51747,10 @@ function cx(...classes) {
51555
51747
  * Server-safe placeholder for event registration.
51556
51748
  * Provides a static container for island hydration without importing client hooks.
51557
51749
  */
51558
- function EventRegistrationSSR({ blockId, subject, children, ...sourceProps }) {
51750
+ function EventRegistrationSSR({ blockId, subject, loaderFailures, children, ...sourceProps }) {
51559
51751
  const islandProps = buildEventRegistrationInteractiveIslandProps({
51560
51752
  ...sourceProps,
51753
+ eventLoaderFailures: blockId ? loaderFailures?.[blockId] : void 0,
51561
51754
  subject: normalizeEventRegistrationPageSurfaceSubject(subject)
51562
51755
  });
51563
51756
  const display = islandProps.render.display;
@@ -51890,7 +52083,7 @@ function NewsletterFormSSR(props) {
51890
52083
  className: clsx("newsletter-form-ssr", className),
51891
52084
  children: /* @__PURE__ */ jsx("p", {
51892
52085
  role: "status",
51893
- children: "Mailing-list signup is not available right now."
52086
+ children: "We can’t accept signups right now. Please try again later."
51894
52087
  })
51895
52088
  });
51896
52089
  const renderField = (field) => {
@@ -51936,14 +52129,18 @@ function NewsletterFormSSR(props) {
51936
52129
  children: [
51937
52130
  fields.map(renderField),
51938
52131
  islandProps.render.hydration.choicePresentation === "visitor_choice" ? /* @__PURE__ */ jsxs("fieldset", {
51939
- className: "newsletter-topics",
51940
- children: [/* @__PURE__ */ jsx("legend", { children: "What would you like to hear about?" }), display.choices.map((choice) => /* @__PURE__ */ jsxs("label", {
51941
- className: "newsletter-topic-choice",
52132
+ className: "fb-fieldset newsletter-topics",
52133
+ children: [/* @__PURE__ */ jsx("legend", {
52134
+ className: "form-label",
52135
+ children: "What would you like to hear about?"
52136
+ }), display.choices.map((choice) => /* @__PURE__ */ jsxs("label", {
52137
+ className: "fb-inline form-label newsletter-topic-choice",
51942
52138
  children: [/* @__PURE__ */ jsx("input", {
51943
52139
  type: "checkbox",
51944
52140
  name: "mailingListChoice",
51945
- value: choice.id
51946
- }), choice.label]
52141
+ value: choice.id,
52142
+ className: "form-checkbox"
52143
+ }), /* @__PURE__ */ jsx("span", { children: choice.label })]
51947
52144
  }, choice.id))]
51948
52145
  }) : null,
51949
52146
  /* @__PURE__ */ jsx("div", {
@@ -52932,6 +53129,18 @@ function resolveChildren(nodes, context) {
52932
53129
  function isReactNode(value) {
52933
53130
  return value !== null && value !== void 0;
52934
53131
  }
53132
+ function resolveNodeMetadata(nodeType, context) {
53133
+ return {
53134
+ pathBase: context.pathBase,
53135
+ blockId: context.blockId,
53136
+ blockKind: context.blockKind,
53137
+ blockContent: context.blockContent,
53138
+ fragmentRegistry: context.fragmentRegistry,
53139
+ previewAuthoring: context.previewAuthoring,
53140
+ ...nodeType.toLowerCase() === "newsletter-form" ? { contentVersionId: context.contentVersionId } : {},
53141
+ ...nodeType === "media" && context.imageResolveContext ? { imageResolveContext: context.imageResolveContext } : {}
53142
+ };
53143
+ }
52935
53144
  /**
52936
53145
  * Resolves a node definition into a React element.
52937
53146
  * Handles conditionals ($when), scopes ($scopes), repeaters ($repeat), bindings ($bind), and children.
@@ -52967,13 +53176,7 @@ function resolveNode(node, context, indexFallback) {
52967
53176
  const elementProps = {
52968
53177
  ...props,
52969
53178
  key: node.key ?? indexFallback,
52970
- pathBase: context.pathBase,
52971
- blockId: context.blockId,
52972
- blockKind: context.blockKind,
52973
- blockContent: context.blockContent,
52974
- ...node.type === "media" && context.imageResolveContext ? { imageResolveContext: context.imageResolveContext } : {},
52975
- fragmentRegistry: context.fragmentRegistry,
52976
- previewAuthoring: context.previewAuthoring
53179
+ ...resolveNodeMetadata(node.type, context)
52977
53180
  };
52978
53181
  const element = React.createElement(component, elementProps, ...children);
52979
53182
  if (headingDecorationPlan.kind === "skip") return element;
@@ -56983,7 +57186,7 @@ function pageBlockPosition(index, blockCount) {
56983
57186
  //#endregion
56984
57187
  //#region ../blocks/src/pageRendererContracts.ts
56985
57188
  function buildPageRendererRootRuntime(dataContext) {
56986
- const { siteId = null, pageId = null, pathname = null, bookingTimeZone, previewStage = "published", apiBaseUrl = null, portalToken = null, bookingOfferingPresets = [], mailingList = { tag: "not_configured" }, eventRegistrationOverlayEnabled = false } = dataContext ?? {};
57189
+ const { siteId = null, pageId = null, pathname = null, bookingTimeZone, previewStage = "published", apiBaseUrl = null, portalToken = null, bookingOfferingPresets = [], mailingList = { tag: "not_configured" }, eventRegistrationOverlayEnabled = false, loaderFailures = {} } = dataContext ?? {};
56987
57190
  return {
56988
57191
  siteId,
56989
57192
  pageId,
@@ -56994,7 +57197,8 @@ function buildPageRendererRootRuntime(dataContext) {
56994
57197
  portalToken,
56995
57198
  bookingOfferingPresets,
56996
57199
  mailingList,
56997
- eventRegistrationOverlayEnabled
57200
+ eventRegistrationOverlayEnabled,
57201
+ loaderFailures
56998
57202
  };
56999
57203
  }
57000
57204
  //#endregion
@@ -65953,7 +66157,7 @@ function collectNestedPreviewFieldConstraintEntries(field, path) {
65953
66157
  }
65954
66158
  function makeDefaultBlockComponent(args) {
65955
66159
  const { manifest } = args;
65956
- return function DefaultBlockComponent({ content, data, registry, theme, themeConfig, transforms, viewModelOverrides, pathBase, blockId, blockKind, blockBindings, editableRouteMetadataFieldIds, fragmentRegistry, imageResolveContext, previewAuthoring }) {
66160
+ return function DefaultBlockComponent({ content, data, registry, theme, themeConfig, transforms, viewModelOverrides, pathBase, blockId, contentVersionId, blockKind, blockBindings, editableRouteMetadataFieldIds, fragmentRegistry, imageResolveContext, previewAuthoring }) {
65957
66161
  const perf = beginBlockRenderMeasurement();
65958
66162
  if (!theme) throw new Error("Block rendering requires theme tokens; none were provided to makeDefaultBlockComponent");
65959
66163
  if (!registry) throw new Error("Block rendering requires a component registry; none was provided");
@@ -65973,6 +66177,7 @@ function makeDefaultBlockComponent(args) {
65973
66177
  theme: withButtonSystem(theme, themeConfig),
65974
66178
  pathBase,
65975
66179
  blockId,
66180
+ contentVersionId,
65976
66181
  blockKind,
65977
66182
  blockContent: mergedContent,
65978
66183
  blockBindings,
@@ -66727,6 +66932,7 @@ function buildBlockOverrideProps(input) {
66727
66932
  ...blockSubjectProps(dataContext),
66728
66933
  imageResolveContext: input.imageResolveContext,
66729
66934
  blockId: block.id ?? null,
66935
+ contentVersionId: block.contentVersionId ?? null,
66730
66936
  blockKind: block.kind
66731
66937
  };
66732
66938
  }
@@ -66827,6 +67033,7 @@ function toPresentationPage(page) {
66827
67033
  id: block.id,
66828
67034
  kind: block.kind,
66829
67035
  purpose: block.purpose,
67036
+ ...block.contentVersionId ? { contentVersionId: block.contentVersionId } : {},
66830
67037
  ...block.bindings ? { bindings: block.bindings } : {}
66831
67038
  };
66832
67039
  return block.admission.kind === "renderable" ? {
@@ -78110,7 +78317,9 @@ const containerResponsiveThemeCss = `/*
78110
78317
  text-align: left;
78111
78318
  }
78112
78319
 
78113
- :where(.theme-scope) :where([data-block="customer-portal"]) .cp-login__subtitle {
78320
+ :where(.theme-scope)
78321
+ :where([data-block="customer-portal"])
78322
+ .cp-login__subtitle {
78114
78323
  color: var(--cp-muted);
78115
78324
  font-size: 0.9375rem;
78116
78325
  text-align: left;
@@ -78137,7 +78346,9 @@ const containerResponsiveThemeCss = `/*
78137
78346
  text-align: left;
78138
78347
  }
78139
78348
 
78140
- :where(.theme-scope) :where([data-block="customer-portal"]) .cp-login__reset-link {
78349
+ :where(.theme-scope)
78350
+ :where([data-block="customer-portal"])
78351
+ .cp-login__reset-link {
78141
78352
  appearance: none;
78142
78353
  background: none;
78143
78354
  border: 0;
@@ -78151,11 +78362,15 @@ const containerResponsiveThemeCss = `/*
78151
78362
  text-underline-offset: 0.15em;
78152
78363
  }
78153
78364
 
78154
- :where(.theme-scope) :where([data-block="customer-portal"]) .cp-login__reset-link:hover {
78365
+ :where(.theme-scope)
78366
+ :where([data-block="customer-portal"])
78367
+ .cp-login__reset-link:hover {
78155
78368
  color: var(--cp-text);
78156
78369
  }
78157
78370
 
78158
- :where(.theme-scope) :where([data-block="customer-portal"]) .cp-login__reset-link:focus-visible {
78371
+ :where(.theme-scope)
78372
+ :where([data-block="customer-portal"])
78373
+ .cp-login__reset-link:focus-visible {
78159
78374
  outline: 2px solid currentColor;
78160
78375
  outline-offset: 3px;
78161
78376
  }
@@ -78200,7 +78415,9 @@ const containerResponsiveThemeCss = `/*
78200
78415
  border-bottom: none;
78201
78416
  }
78202
78417
 
78203
- :where(.theme-scope) :where([data-block="customer-portal"]) .cp-header__welcome {
78418
+ :where(.theme-scope)
78419
+ :where([data-block="customer-portal"])
78420
+ .cp-header__welcome {
78204
78421
  font-size: 1.125rem;
78205
78422
  font-weight: 500;
78206
78423
  }
@@ -78216,8 +78433,14 @@ const containerResponsiveThemeCss = `/*
78216
78433
  }
78217
78434
 
78218
78435
  @keyframes cp-fade-in {
78219
- from { opacity: 0; transform: translateY(4px); }
78220
- to { opacity: 1; transform: translateY(0); }
78436
+ from {
78437
+ opacity: 0;
78438
+ transform: translateY(4px);
78439
+ }
78440
+ to {
78441
+ opacity: 1;
78442
+ transform: translateY(0);
78443
+ }
78221
78444
  }
78222
78445
 
78223
78446
  /* Empty state */
@@ -78306,6 +78529,77 @@ const containerResponsiveThemeCss = `/*
78306
78529
  margin-top: 1rem;
78307
78530
  }
78308
78531
 
78532
+ /* Event waitlists */
78533
+ :where(.theme-scope) :where([data-block="customer-portal"]) .cp-waitlist-list {
78534
+ display: grid;
78535
+ gap: 1rem;
78536
+ }
78537
+
78538
+ :where(.theme-scope)
78539
+ :where([data-block="customer-portal"])
78540
+ .cp-waitlists
78541
+ > .cp-alert {
78542
+ margin-bottom: 1rem;
78543
+ }
78544
+
78545
+ :where(.theme-scope) :where([data-block="customer-portal"]) .cp-waitlist-card {
78546
+ transition:
78547
+ border-color 180ms ease,
78548
+ box-shadow 180ms ease;
78549
+ }
78550
+
78551
+ :where(.theme-scope)
78552
+ :where([data-block="customer-portal"])
78553
+ .cp-waitlist-card--focused {
78554
+ border-color: var(--cp-primary);
78555
+ box-shadow: 0 0 0 3px color-mix(in srgb, var(--cp-primary) 22%, transparent);
78556
+ }
78557
+
78558
+ :where(.theme-scope)
78559
+ :where([data-block="customer-portal"])
78560
+ .cp-waitlist-card__summary,
78561
+ :where(.theme-scope)
78562
+ :where([data-block="customer-portal"])
78563
+ .cp-waitlist-card__position {
78564
+ font-weight: 600;
78565
+ }
78566
+
78567
+ :where(.theme-scope)
78568
+ :where([data-block="customer-portal"])
78569
+ .cp-waitlist-card
78570
+ .cp-card-body
78571
+ p {
78572
+ margin: 0.4rem 0;
78573
+ }
78574
+
78575
+ @container rb-site (max-width: 640px) {
78576
+ @scope ([data-rb-responsive-mode="container"]) to (:scope [data-rb-responsive-mode]) {
78577
+ :where(.theme-scope)
78578
+ :where([data-block="customer-portal"])
78579
+ .cp-waitlist-card
78580
+ .cp-card-header {
78581
+ flex-direction: column-reverse;
78582
+ }
78583
+
78584
+ :where(.theme-scope)
78585
+ :where([data-block="customer-portal"])
78586
+ .cp-waitlist-card
78587
+ .cp-card-actions {
78588
+ align-items: stretch;
78589
+ flex-direction: column;
78590
+ }
78591
+
78592
+ :where(.theme-scope)
78593
+ :where([data-block="customer-portal"])
78594
+ .cp-waitlist-card
78595
+ .cp-card-actions
78596
+ > * {
78597
+ justify-content: center;
78598
+ text-align: center;
78599
+ }
78600
+ }
78601
+ }
78602
+
78309
78603
  /* Badge */
78310
78604
  :where(.theme-scope) :where([data-block="customer-portal"]) .cp-badge {
78311
78605
  display: inline-flex;
@@ -78442,11 +78736,18 @@ const containerResponsiveThemeCss = `/*
78442
78736
  background: rgba(var(--tb-border), 0.2);
78443
78737
  }
78444
78738
 
78445
- :where(.theme-scope) :where([data-block="customer-portal"]) .cp-table tbody tr:last-child td {
78739
+ :where(.theme-scope)
78740
+ :where([data-block="customer-portal"])
78741
+ .cp-table
78742
+ tbody
78743
+ tr:last-child
78744
+ td {
78446
78745
  border-bottom: none;
78447
78746
  }
78448
78747
 
78449
- :where(.theme-scope) :where([data-block="customer-portal"]) :is(.cp-row--past, .cp-row--muted) {
78748
+ :where(.theme-scope)
78749
+ :where([data-block="customer-portal"])
78750
+ :is(.cp-row--past, .cp-row--muted) {
78450
78751
  opacity: 0.65;
78451
78752
  }
78452
78753
 
@@ -78459,7 +78760,9 @@ const containerResponsiveThemeCss = `/*
78459
78760
  line-height: 1.2;
78460
78761
  }
78461
78762
 
78462
- :where(.theme-scope) :where([data-block="customer-portal"]) .cp-row-title__badges {
78763
+ :where(.theme-scope)
78764
+ :where([data-block="customer-portal"])
78765
+ .cp-row-title__badges {
78463
78766
  margin-left: auto;
78464
78767
  display: flex;
78465
78768
  flex-wrap: wrap;
@@ -78467,7 +78770,9 @@ const containerResponsiveThemeCss = `/*
78467
78770
  gap: 0.375rem;
78468
78771
  }
78469
78772
 
78470
- :where(.theme-scope) :where([data-block="customer-portal"]) .cp-row-title__text {
78773
+ :where(.theme-scope)
78774
+ :where([data-block="customer-portal"])
78775
+ .cp-row-title__text {
78471
78776
  min-width: 0;
78472
78777
  }
78473
78778
 
@@ -78487,12 +78792,16 @@ const containerResponsiveThemeCss = `/*
78487
78792
  line-height: 1.35;
78488
78793
  }
78489
78794
 
78490
- :where(.theme-scope) :where([data-block="customer-portal"]) .cp-row-note--success {
78795
+ :where(.theme-scope)
78796
+ :where([data-block="customer-portal"])
78797
+ .cp-row-note--success {
78491
78798
  border-left-color: rgb(var(--tb-success));
78492
78799
  color: rgb(var(--tb-success));
78493
78800
  }
78494
78801
 
78495
- :where(.theme-scope) :where([data-block="customer-portal"]) .cp-row-note--error {
78802
+ :where(.theme-scope)
78803
+ :where([data-block="customer-portal"])
78804
+ .cp-row-note--error {
78496
78805
  border-left-color: rgb(var(--tb-destructive));
78497
78806
  color: rgb(var(--tb-destructive));
78498
78807
  }
@@ -78511,16 +78820,23 @@ const containerResponsiveThemeCss = `/*
78511
78820
  white-space: nowrap;
78512
78821
  }
78513
78822
 
78514
- :where(.theme-scope) :where([data-block="customer-portal"]) .cp-col-actions .btn-sm {
78823
+ :where(.theme-scope)
78824
+ :where([data-block="customer-portal"])
78825
+ .cp-col-actions
78826
+ .btn-sm {
78515
78827
  white-space: nowrap;
78516
78828
  }
78517
78829
 
78518
- :where(.theme-scope) :where([data-block="customer-portal"]) .cp-row-title__link {
78830
+ :where(.theme-scope)
78831
+ :where([data-block="customer-portal"])
78832
+ .cp-row-title__link {
78519
78833
  color: inherit;
78520
78834
  text-decoration: none;
78521
78835
  }
78522
78836
 
78523
- :where(.theme-scope) :where([data-block="customer-portal"]) .cp-row-title__link:hover {
78837
+ :where(.theme-scope)
78838
+ :where([data-block="customer-portal"])
78839
+ .cp-row-title__link:hover {
78524
78840
  text-decoration: underline;
78525
78841
  text-decoration-thickness: 2px;
78526
78842
  text-underline-offset: 2px;
@@ -78542,7 +78858,9 @@ const containerResponsiveThemeCss = `/*
78542
78858
  }
78543
78859
 
78544
78860
  /* Profile actions */
78545
- :where(.theme-scope) :where([data-block="customer-portal"]) .cp-profile__actions {
78861
+ :where(.theme-scope)
78862
+ :where([data-block="customer-portal"])
78863
+ .cp-profile__actions {
78546
78864
  display: flex;
78547
78865
  gap: 0.75rem;
78548
78866
  margin-top: 1rem;
@@ -78609,28 +78927,39 @@ const containerResponsiveThemeCss = `/*
78609
78927
  gap: 0.375rem;
78610
78928
  }
78611
78929
 
78612
- :where(.theme-scope) :where([data-block="customer-portal"]) .cp-guest-edit-row__index {
78930
+ :where(.theme-scope)
78931
+ :where([data-block="customer-portal"])
78932
+ .cp-guest-edit-row__index {
78613
78933
  font-size: 0.75rem;
78614
78934
  font-weight: 500;
78615
78935
  color: var(--cp-muted);
78616
78936
  }
78617
78937
 
78618
- :where(.theme-scope) :where([data-block="customer-portal"]) .cp-guest-edit-row__fields {
78938
+ :where(.theme-scope)
78939
+ :where([data-block="customer-portal"])
78940
+ .cp-guest-edit-row__fields {
78619
78941
  display: flex;
78620
78942
  gap: 0.5rem;
78621
78943
  }
78622
78944
 
78623
- :where(.theme-scope) :where([data-block="customer-portal"]) .cp-guest-edit-row__fields input {
78945
+ :where(.theme-scope)
78946
+ :where([data-block="customer-portal"])
78947
+ .cp-guest-edit-row__fields
78948
+ input {
78624
78949
  flex: 1;
78625
78950
  min-width: 0;
78626
78951
  }
78627
78952
 
78628
- :where(.theme-scope) :where([data-block="customer-portal"]) .cp-guest-edit-row__error {
78953
+ :where(.theme-scope)
78954
+ :where([data-block="customer-portal"])
78955
+ .cp-guest-edit-row__error {
78629
78956
  font-size: 0.75rem;
78630
78957
  color: var(--cp-error);
78631
78958
  }
78632
78959
 
78633
- :where(.theme-scope) :where([data-block="customer-portal"]) .cp-guests__actions {
78960
+ :where(.theme-scope)
78961
+ :where([data-block="customer-portal"])
78962
+ .cp-guests__actions {
78634
78963
  display: flex;
78635
78964
  gap: 0.5rem;
78636
78965
  margin-top: 0.5rem;
@@ -78644,13 +78973,18 @@ const containerResponsiveThemeCss = `/*
78644
78973
  }
78645
78974
 
78646
78975
  /* In the actions modal, tiles sit on a surface modal, so use "background" for contrast. */
78647
- :where(.theme-scope) :where([data-block="customer-portal"]) .cp-actions-list :where(.rb-tile) {
78976
+ :where(.theme-scope)
78977
+ :where([data-block="customer-portal"])
78978
+ .cp-actions-list
78979
+ :where(.rb-tile) {
78648
78980
  --rb-event-tile-bg: rgb(var(--tb-background));
78649
78981
  --rb-event-tile-border: rgb(var(--tb-border));
78650
78982
  }
78651
78983
 
78652
78984
  /* Actions trigger: icon-only kebab button */
78653
- :where(.theme-scope) :where([data-block="customer-portal"]) .cp-actions-trigger.btn-sm {
78985
+ :where(.theme-scope)
78986
+ :where([data-block="customer-portal"])
78987
+ .cp-actions-trigger.btn-sm {
78654
78988
  padding: 0.35rem !important;
78655
78989
  line-height: 1 !important;
78656
78990
  min-width: 32px;
@@ -78674,17 +79008,24 @@ const containerResponsiveThemeCss = `/*
78674
79008
  gap: 0.25rem;
78675
79009
  }
78676
79010
 
78677
- :where(.theme-scope) :where([data-block="customer-portal"]) .cp-action-tile__title {
79011
+ :where(.theme-scope)
79012
+ :where([data-block="customer-portal"])
79013
+ .cp-action-tile__title {
78678
79014
  font-weight: 600;
78679
79015
  font-size: 0.9375rem;
78680
79016
  }
78681
79017
 
78682
- :where(.theme-scope) :where([data-block="customer-portal"]) .cp-action-tile__desc {
79018
+ :where(.theme-scope)
79019
+ :where([data-block="customer-portal"])
79020
+ .cp-action-tile__desc {
78683
79021
  font-size: 0.875rem;
78684
79022
  line-height: 1.35;
78685
79023
  }
78686
79024
 
78687
- :where(.theme-scope) :where([data-block="customer-portal"]) .cp-action-tile--danger .cp-action-tile__title {
79025
+ :where(.theme-scope)
79026
+ :where([data-block="customer-portal"])
79027
+ .cp-action-tile--danger
79028
+ .cp-action-tile__title {
78688
79029
  color: rgb(var(--tb-destructive));
78689
79030
  }
78690
79031
 
@@ -78706,7 +79047,9 @@ const containerResponsiveThemeCss = `/*
78706
79047
  text-decoration: underline;
78707
79048
  }
78708
79049
 
78709
- :where(.theme-scope) :where([data-block="customer-portal"]) .cp-btn--link:hover {
79050
+ :where(.theme-scope)
79051
+ :where([data-block="customer-portal"])
79052
+ .cp-btn--link:hover {
78710
79053
  color: var(--cp-primary-hover);
78711
79054
  }
78712
79055
 
@@ -78745,34 +79088,48 @@ const containerResponsiveThemeCss = `/*
78745
79088
  margin-top: 0.75rem;
78746
79089
  }
78747
79090
 
78748
- :where(.theme-scope) :where([data-block="customer-portal"]) .cp-cancel-confirm__title {
79091
+ :where(.theme-scope)
79092
+ :where([data-block="customer-portal"])
79093
+ .cp-cancel-confirm__title {
78749
79094
  font-weight: 600;
78750
79095
  margin-bottom: 0.5rem;
78751
79096
  }
78752
79097
 
78753
- :where(.theme-scope) :where([data-block="customer-portal"]) .cp-cancel-confirm__message {
79098
+ :where(.theme-scope)
79099
+ :where([data-block="customer-portal"])
79100
+ .cp-cancel-confirm__message {
78754
79101
  margin-bottom: 0.25rem;
78755
79102
  }
78756
79103
 
78757
- :where(.theme-scope) :where([data-block="customer-portal"]) .cp-cancel-confirm__warning {
79104
+ :where(.theme-scope)
79105
+ :where([data-block="customer-portal"])
79106
+ .cp-cancel-confirm__warning {
78758
79107
  margin-bottom: 0.75rem;
78759
79108
  }
78760
79109
 
78761
- :where(.theme-scope) :where([data-block="customer-portal"]) .cp-cancel-confirm__actions {
79110
+ :where(.theme-scope)
79111
+ :where([data-block="customer-portal"])
79112
+ .cp-cancel-confirm__actions {
78762
79113
  display: flex;
78763
79114
  gap: 0.75rem;
78764
79115
  }
78765
79116
 
78766
79117
  /* Membership actions */
78767
- :where(.theme-scope) :where([data-block="customer-portal"]) .cp-membership-actions {
79118
+ :where(.theme-scope)
79119
+ :where([data-block="customer-portal"])
79120
+ .cp-membership-actions {
78768
79121
  margin-top: 0.75rem;
78769
79122
  }
78770
79123
 
78771
- :where(.theme-scope) :where([data-block="customer-portal"]) .cp-section-actions {
79124
+ :where(.theme-scope)
79125
+ :where([data-block="customer-portal"])
79126
+ .cp-section-actions {
78772
79127
  margin-top: 1rem;
78773
79128
  }
78774
79129
 
78775
- :where(.theme-scope) :where([data-block="customer-portal"]) .cp-card-subtitle--spaced {
79130
+ :where(.theme-scope)
79131
+ :where([data-block="customer-portal"])
79132
+ .cp-card-subtitle--spaced {
78776
79133
  margin-top: 0.75rem;
78777
79134
  }
78778
79135
 
@@ -78796,9 +79153,18 @@ const containerResponsiveThemeCss = `/*
78796
79153
  display: none;
78797
79154
  }
78798
79155
 
78799
- :where(.theme-scope) :where([data-block="customer-portal"]) .cp-table :is(th, td).cp-col-guests,
78800
- :where(.theme-scope) :where([data-block="customer-portal"]) .cp-table :is(th, td).cp-col-tickets,
78801
- :where(.theme-scope) :where([data-block="customer-portal"]) .cp-table :is(th, td).cp-col-actions {
79156
+ :where(.theme-scope)
79157
+ :where([data-block="customer-portal"])
79158
+ .cp-table
79159
+ :is(th, td).cp-col-guests,
79160
+ :where(.theme-scope)
79161
+ :where([data-block="customer-portal"])
79162
+ .cp-table
79163
+ :is(th, td).cp-col-tickets,
79164
+ :where(.theme-scope)
79165
+ :where([data-block="customer-portal"])
79166
+ .cp-table
79167
+ :is(th, td).cp-col-actions {
78802
79168
  display: none;
78803
79169
  }
78804
79170
 
@@ -78807,24 +79173,34 @@ const containerResponsiveThemeCss = `/*
78807
79173
  }
78808
79174
 
78809
79175
  /* Make the cell a positioning context for the kebab */
78810
- :where(.theme-scope) :where([data-block="customer-portal"]) .cp-row > td:first-child {
79176
+ :where(.theme-scope)
79177
+ :where([data-block="customer-portal"])
79178
+ .cp-row
79179
+ > td:first-child {
78811
79180
  position: relative;
78812
79181
  padding-right: 2.5rem;
78813
79182
  }
78814
79183
 
78815
79184
  /* Position kebab in top-right of the cell */
78816
- :where(.theme-scope) :where([data-block="customer-portal"]) .cp-row-mobile-actions {
79185
+ :where(.theme-scope)
79186
+ :where([data-block="customer-portal"])
79187
+ .cp-row-mobile-actions {
78817
79188
  position: absolute;
78818
79189
  top: 0.5rem;
78819
79190
  right: 0.5rem;
78820
79191
  margin-top: 0;
78821
79192
  }
78822
79193
 
78823
- :where(.theme-scope) :where([data-block="customer-portal"]) .cp-row-mobile-actions .btn-sm {
79194
+ :where(.theme-scope)
79195
+ :where([data-block="customer-portal"])
79196
+ .cp-row-mobile-actions
79197
+ .btn-sm {
78824
79198
  width: auto;
78825
79199
  }
78826
79200
 
78827
- :where(.theme-scope) :where([data-block="customer-portal"]) .cp-profile__edit {
79201
+ :where(.theme-scope)
79202
+ :where([data-block="customer-portal"])
79203
+ .cp-profile__edit {
78828
79204
  align-self: stretch;
78829
79205
  }
78830
79206
  }
@@ -79272,6 +79648,30 @@ const containerResponsiveThemeCss = `/*
79272
79648
  gap: 0.25rem;
79273
79649
  }
79274
79650
 
79651
+ /* Topic choices (visitor picks what to hear about). Same treatment as the
79652
+ form block's .fb-fieldset / .fb-inline, defined here because the newsletter
79653
+ form also renders inside contact-newsletter and the site footer. */
79654
+ :where(.theme-scope) .newsletter-topics {
79655
+ display: flex;
79656
+ flex-direction: column;
79657
+ gap: 0.5rem;
79658
+ border: none;
79659
+ padding: 0;
79660
+ margin: 0;
79661
+ min-width: 0;
79662
+ }
79663
+
79664
+ :where(.theme-scope) .newsletter-topics > legend {
79665
+ padding: 0;
79666
+ margin-bottom: 0.25rem;
79667
+ }
79668
+
79669
+ :where(.theme-scope) .newsletter-topic-choice {
79670
+ display: flex;
79671
+ align-items: center;
79672
+ gap: 0.5rem;
79673
+ }
79674
+
79275
79675
  /* Required indicator */
79276
79676
  :where(.theme-scope) .newsletter-required {
79277
79677
  color: rgb(var(--tb-primary));
@@ -79321,6 +79721,10 @@ const containerResponsiveThemeCss = `/*
79321
79721
  flex-shrink: 0;
79322
79722
  }
79323
79723
 
79724
+ :where(.theme-scope) .newsletter-inline .newsletter-topics {
79725
+ flex-basis: 100%;
79726
+ }
79727
+
79324
79728
  /* Mobile fallback for inline variant */
79325
79729
  @container rb-site (max-width: 640px) {
79326
79730
  @scope ([data-rb-responsive-mode="container"]) to (:scope [data-rb-responsive-mode]) {
@@ -81833,8 +82237,12 @@ function shouldSkipResolvedLoader(input) {
81833
82237
  * ```
81834
82238
  */
81835
82239
  async function prefetchBlockData$1(page, context, options) {
82240
+ return (await prefetchBlockDataWithFailures(page, context, options)).resolvedData;
82241
+ }
82242
+ async function prefetchBlockDataWithFailures(page, context, options) {
81836
82243
  const { apiClient, isValidEndpoint, onError, getCustomBlockLoaders, getBlockDefinition: getBlockDefinition$1 = getBlockDefinition, resolveParamsBindings: resolveParamsBindings$1 = resolveParamsBindings } = options;
81837
82244
  const results = {};
82245
+ const loaderFailures = {};
81838
82246
  const tasks = [];
81839
82247
  for (const block of page.blocks) {
81840
82248
  const blockId = block.id;
@@ -81882,6 +82290,11 @@ async function prefetchBlockData$1(page, context, options) {
81882
82290
  const blockResults = results[blockId] ?? (results[blockId] = {});
81883
82291
  blockResults[key] = data;
81884
82292
  } catch (error) {
82293
+ const blockFailures = loaderFailures[blockId] ?? (loaderFailures[blockId] = {});
82294
+ blockFailures[key] = {
82295
+ endpoint,
82296
+ params
82297
+ };
81885
82298
  if (onError) onError(error, {
81886
82299
  block: block.kind,
81887
82300
  loader: key
@@ -81891,7 +82304,10 @@ async function prefetchBlockData$1(page, context, options) {
81891
82304
  }
81892
82305
  }
81893
82306
  if (tasks.length > 0) await Promise.all(tasks);
81894
- return results;
82307
+ return {
82308
+ resolvedData: results,
82309
+ loaderFailures
82310
+ };
81895
82311
  }
81896
82312
  //#endregion
81897
82313
  //#region ../blocks/src/system/data/loaderEndpoints.ts
@@ -82302,7 +82718,17 @@ const riverbankSiteConfigInputSchema = z$1.object({
82302
82718
  z$1.object({
82303
82719
  config: riverbankSiteConfigInputSchema,
82304
82720
  forceContentTypes: z$1.boolean().optional(),
82305
- mode: z$1.enum(["apply", "preview"]).optional()
82721
+ mode: z$1.enum(["apply", "preview"]).optional(),
82722
+ expectedMailingListProviderScope: z$1.unknown().transform((value, ctx) => {
82723
+ if (value === void 0) return void 0;
82724
+ const parsed = parseMailingListProviderScope(value);
82725
+ if (parsed.ok) return parsed.value;
82726
+ ctx.addIssue({
82727
+ code: "custom",
82728
+ message: "Invalid mailing-list provider scope"
82729
+ });
82730
+ return z$1.NEVER;
82731
+ }).optional()
82306
82732
  }).strict();
82307
82733
  //#endregion
82308
82734
  //#region ../api/src/sdkThemeWire.ts
@@ -84055,9 +84481,11 @@ function convertPageResponseBlock(block) {
84055
84481
  if (typeof block.id !== "string" && block.id !== null) throw new Error(`Invalid block id in page: expected string or null, got ${typeof block.id}`);
84056
84482
  if (typeof block.kind !== "string") throw new Error(`Invalid block kind in page: expected string, got ${typeof block.kind}`);
84057
84483
  if (typeof block.purpose !== "string") throw new Error(`Invalid block purpose in page: expected string, got ${typeof block.purpose}`);
84484
+ 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}`);
84058
84485
  const admission = readInvalidBlockAdmission(block.admission);
84059
84486
  return {
84060
84487
  id: block.id,
84488
+ ...block.contentVersionId !== void 0 ? { contentVersionId: block.contentVersionId } : {},
84061
84489
  kind: block.kind,
84062
84490
  purpose: block.purpose,
84063
84491
  content: sanitizeSdkRuntimeBlockContent(block.kind, readContentRecord(block.content) ?? {}),
@@ -84090,6 +84518,7 @@ function projectRenderablePageOutline(page) {
84090
84518
  ...page,
84091
84519
  blocks: page.blocks.flatMap((block) => block.admission.kind === "renderable" ? [{
84092
84520
  id: block.id,
84521
+ ...block.contentVersionId !== void 0 ? { contentVersionId: block.contentVersionId } : {},
84093
84522
  kind: block.kind,
84094
84523
  purpose: block.purpose,
84095
84524
  content: block.admission.content,
@@ -84100,6 +84529,7 @@ function projectRenderablePageOutline(page) {
84100
84529
  function admitSdkRuntimePageBlock(block, customBlocks) {
84101
84530
  const base = {
84102
84531
  id: block.id,
84532
+ ...block.contentVersionId !== void 0 ? { contentVersionId: block.contentVersionId } : {},
84103
84533
  kind: block.kind,
84104
84534
  purpose: block.purpose,
84105
84535
  ...block.bindings ? { bindings: block.bindings } : {}
@@ -86760,6 +87190,7 @@ function readEntrySlotKey(block) {
86760
87190
  function admitEntrySlotBlock(block, customBlocks) {
86761
87191
  const base = {
86762
87192
  id: block.id ?? block.blockId ?? null,
87193
+ contentVersionId: block.contentVersionId,
86763
87194
  kind: block.kind,
86764
87195
  purpose: block.purpose,
86765
87196
  ...isRecord$1(block.bindings) ? { bindings: block.bindings } : {}
@@ -87273,7 +87704,7 @@ function PageContent(props) {
87273
87704
  previewToken,
87274
87705
  resolvedData,
87275
87706
  bookingOfferingPresets: bookingOfferingPresets ?? [],
87276
- mailingList,
87707
+ mailingList: mailingList ?? dataContext?.mailingList,
87277
87708
  bookingTimeZone: resolveSdkBookingTimeZone(bookingTimeZone),
87278
87709
  routes: routeMap,
87279
87710
  pagesByIdentifier,
@@ -88478,7 +88909,7 @@ var CircuitOpenError = class extends Error {
88478
88909
  * 1. This constant
88479
88910
  * 2. The "version" field in package.json
88480
88911
  */
88481
- const SDK_VERSION = "0.139.0";
88912
+ const SDK_VERSION = "0.140.0";
88482
88913
  //#endregion
88483
88914
  //#region src/next/content-load-failure.ts
88484
88915
  const SdkContentLoadError = RiverbankContentLoadError;
@@ -89440,7 +89871,12 @@ const API_ENDPOINTS = Object.freeze({
89440
89871
  path: "/public/sites/{siteId}/sitemap",
89441
89872
  method: "GET",
89442
89873
  revalidate: 60,
89443
- tags: ["riverbank:site:{siteId}:routable-content", "riverbank:site:{siteId}:settings"],
89874
+ tags: [
89875
+ "riverbank:site:{siteId}:routable-content",
89876
+ "riverbank:site:{siteId}:settings",
89877
+ "riverbank:site:{siteId}:public-events",
89878
+ "riverbank:site:{siteId}:public-booking-services"
89879
+ ],
89444
89880
  auth: "public",
89445
89881
  responseKind: "json"
89446
89882
  }