@riverbankcms/sdk 0.146.0 → 0.147.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 (195) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/dist/{PreviewEditorSidebar-kg2r2Fyi.mjs → PreviewEditorSidebar-DtpB3_sS.mjs} +51 -33
  3. package/dist/{PreviewEditorUI-sWMLp5dT.mjs → PreviewEditorUI-DxTLgaHo.mjs} +3 -3
  4. package/dist/{PreviewQueryProvider-Cg51xq1w.mjs → PreviewQueryProvider-Dd4dxOiU.mjs} +1 -1
  5. package/dist/{SdkPreviewModeRuntime-h2ti3Hch.mjs → SdkPreviewModeRuntime-DMMNCngt.mjs} +39 -12
  6. package/dist/{SiteChromeCustomizeContext-DEACFH9m.mjs → SiteChromeCustomizeContext-DQXZXiqS.mjs} +2499 -1682
  7. package/dist/_dts/ai/src/contracts/proposals.d.ts +198 -0
  8. package/dist/_dts/ai/src/contracts/siteStyleProposalSchemas.d.ts +18 -0
  9. package/dist/_dts/api/src/accountApi.d.ts +5 -5
  10. package/dist/_dts/api/src/bookingConfig.d.ts +16 -0
  11. package/dist/_dts/api/src/bookingManagementEndpoints.d.ts +4 -13
  12. package/dist/_dts/api/src/bookingOperations.d.ts +2 -44
  13. package/dist/_dts/api/src/bookingPeople.d.ts +92 -0
  14. package/dist/_dts/api/src/bookingPeopleEndpointDefinitions.d.ts +38 -0
  15. package/dist/_dts/api/src/bookingRecords.d.ts +11 -49
  16. package/dist/_dts/api/src/bookingSettingsSections.d.ts +1 -1
  17. package/dist/_dts/api/src/bookings.d.ts +1 -0
  18. package/dist/_dts/api/src/endpoints.d.ts +587 -561
  19. package/dist/_dts/api/src/eventManagementContracts.d.ts +23 -8
  20. package/dist/_dts/api/src/eventManagementEndpointDefinitions.d.ts +1 -1
  21. package/dist/_dts/api/src/index.d.ts +3 -2
  22. package/dist/_dts/api/src/indexCoreTypes.d.ts +1 -1
  23. package/dist/_dts/api/src/launchReadiness.d.ts +1 -6
  24. package/dist/_dts/api/src/mailingListIntegration.d.ts +6 -0
  25. package/dist/_dts/api/src/navigation/dashboardBookingsNav.d.ts +1 -1
  26. package/dist/_dts/api/src/newsletterEndpointDefinitions.d.ts +15 -0
  27. package/dist/_dts/api/src/occurrenceScheduling.d.ts +19 -0
  28. package/dist/_dts/api/src/publicAppointmentBookingContracts.d.ts +48 -0
  29. package/dist/_dts/api/src/publicExperience/eventEndpoints.d.ts +7 -0
  30. package/dist/_dts/api/src/sdk-event-upsert.d.ts +15 -0
  31. package/dist/_dts/api/src/sdkCourseBooking.d.ts +4 -4
  32. package/dist/_dts/api/src/siteLifecycleEndpoints.d.ts +61 -0
  33. package/dist/_dts/api/src/siteManagementEndpoints.d.ts +5 -18
  34. package/dist/_dts/api/src/siteOnboarding.d.ts +2 -14
  35. package/dist/_dts/blocks/src/PageRenderer.d.ts +3 -4
  36. package/dist/_dts/blocks/src/contracts/proof-block-islands.d.ts +8 -0
  37. package/dist/_dts/blocks/src/index.d.ts +1 -1
  38. package/dist/_dts/blocks/src/pageRenderAdmission.d.ts +22 -4
  39. package/dist/_dts/blocks/src/pageRendererContracts.d.ts +2 -0
  40. package/dist/_dts/blocks/src/system/blocks/newsletter-signup.d.ts +4 -1
  41. package/dist/_dts/blocks/src/system/runtime/api/types/appointments.d.ts +4 -0
  42. package/dist/_dts/blocks/src/system/runtime/api/types/events.d.ts +12 -0
  43. package/dist/_dts/blocks/src/system/runtime/components/registry.client.d.ts +12 -0
  44. package/dist/_dts/blocks/src/system/runtime/components/runtime-backed-blocks.d.ts +6 -0
  45. package/dist/_dts/blocks/src/system/runtime/hooks/useHeadlessBookingFlow.d.ts +8 -0
  46. package/dist/_dts/blocks/src/system/runtime/hooks/useHeadlessEventRegistrationFlow.d.ts +2 -0
  47. package/dist/_dts/blocks/src/system/runtime/nodes/booking-form.completion.d.ts +9 -0
  48. package/dist/_dts/blocks/src/system/runtime/nodes/booking-form.headless.state.d.ts +9 -0
  49. package/dist/_dts/blocks/src/system/runtime/nodes/booking-form.interactive.d.ts +19 -0
  50. package/dist/_dts/blocks/src/system/runtime/nodes/booking-form.mailing-list-choice.d.ts +5 -0
  51. package/dist/_dts/blocks/src/system/runtime/nodes/booking-form.mailing-list-note.d.ts +3 -0
  52. package/dist/_dts/blocks/src/system/runtime/nodes/booking-form.mailing-list-state.d.ts +9 -0
  53. package/dist/_dts/blocks/src/system/runtime/nodes/booking-form.reserved-fields.d.ts +1 -1
  54. package/dist/_dts/blocks/src/system/runtime/nodes/booking-form.server.d.ts +1 -1
  55. package/dist/_dts/blocks/src/system/runtime/nodes/booking-form.state.d.ts +2 -0
  56. package/dist/_dts/blocks/src/system/runtime/nodes/booking-form.submit-handler.d.ts +8 -0
  57. package/dist/_dts/blocks/src/system/runtime/nodes/booking-form.submit-success.d.ts +9 -0
  58. package/dist/_dts/blocks/src/system/runtime/nodes/booking-runtime-sources.d.ts +3 -0
  59. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/AttendeeDetailsStep.d.ts +3 -0
  60. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/SuccessStep.d.ts +3 -0
  61. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/event-registration.headless.contract.d.ts +3 -0
  62. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/sessionStorage.d.ts +2 -0
  63. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/types.d.ts +6 -0
  64. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/useEventRegistrationSubmit.d.ts +3 -0
  65. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/useEventRegistrationWizard.d.ts +8 -0
  66. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration.interactive.d.ts +9 -0
  67. package/dist/_dts/blocks/src/system/runtime/nodes/newsletter-form.block-submission.d.ts +2 -4
  68. package/dist/_dts/blocks/src/system/runtime/resolver.d.ts +2 -0
  69. package/dist/_dts/blocks/src/system/runtime/shared/components/BookingMailingListNote.d.ts +6 -0
  70. package/dist/_dts/blocks/src/system/runtime/shared/mailingListSignupCopy.d.ts +6 -0
  71. package/dist/_dts/blocks/src/system/runtime/shared/types.d.ts +1 -0
  72. package/dist/_dts/blocks/src/system/transforms/registry/_utils/surfaceForegroundStyles.d.ts +3 -2
  73. package/dist/_dts/blocks/src/system/transforms/registry/core.d.ts +2 -0
  74. package/dist/_dts/blocks/src/system/transforms/registry/layout.d.ts +1 -3
  75. package/dist/_dts/core/src/index.d.ts +1 -1
  76. package/dist/_dts/core/src/mailing-list-runtime.d.ts +15 -0
  77. package/dist/_dts/core/src/mailing-list-setup.d.ts +2 -0
  78. package/dist/_dts/core/src/mailing-list-submission.d.ts +6 -0
  79. package/dist/_dts/core/src/navigation-portal-labels.d.ts +9 -0
  80. package/dist/_dts/core/src/participants.d.ts +0 -38
  81. package/dist/_dts/db/src/generated/supabase/database.types.d.ts +102 -22
  82. package/dist/_dts/editor-blocks/src/block-editor/actionPresentation.d.ts +1 -0
  83. package/dist/_dts/preview-next/src/client/blocks/EditablePageRenderer.d.ts +7 -1
  84. package/dist/_dts/preview-next/src/client/blocks/composer/types.d.ts +4 -3
  85. package/dist/_dts/sdk/src/rendering/blocks-page-renderer.d.ts +1 -0
  86. package/dist/_dts/sdk/src/rendering/components/pageShared.d.ts +1 -0
  87. package/dist/_dts/sdk/src/rendering/helpers/loadPage.d.ts +1 -1
  88. package/dist/_dts/sdk/src/rendering/helpers/pageRuntimeSupport.d.ts +2 -2
  89. package/dist/_dts/sdk/src/version.d.ts +1 -1
  90. package/dist/_dts/theme-core/src/buttons/effects/types.d.ts +1 -1
  91. package/dist/_dts/theme-core/src/footer/effectiveNavLinkStyle.d.ts +13 -0
  92. package/dist/_dts/theme-core/src/footer/index.d.ts +1 -0
  93. package/dist/_dts/theme-core/src/generated/containerResponsiveThemeCss.d.ts +1 -1
  94. package/dist/_dts/theme-core/src/header/effectiveNavLinkStyle.d.ts +17 -0
  95. package/dist/_dts/theme-core/src/header/generateHeaderLogoStyles.d.ts +15 -0
  96. package/dist/_dts/theme-core/src/header/generateHeaderNavLinkStyles.d.ts +4 -0
  97. package/dist/_dts/theme-core/src/header/index.d.ts +3 -0
  98. package/dist/_dts/theme-core/src/header/legacyNavLinkStyle.d.ts +1 -1
  99. package/dist/_dts/theme-core/src/header/openingForegroundProjection.d.ts +7 -0
  100. package/dist/_dts/theme-core/src/header/rootPaint.d.ts +4 -0
  101. package/dist/_dts/theme-core/src/navigation/effectPolicy.d.ts +38 -0
  102. package/dist/_dts/theme-core/src/navigation/generateNavLinkCSS.d.ts +4 -0
  103. package/dist/_dts/theme-core/src/navigation/types.d.ts +4 -0
  104. package/dist/_dts/theme-core/src/site-styles/accessibleSurfaces.d.ts +1 -1
  105. package/dist/_dts/theme-core/src/surfaces/foregroundContract.d.ts +7 -0
  106. package/dist/_dts/theme-core/src/surfaces/foregroundInteraction.d.ts +29 -22
  107. package/dist/_dts/theme-core/src/surfaces/foregroundRoles.d.ts +10 -2
  108. package/dist/_dts/theme-core/src/surfaces/resolveSurfaceForeground.d.ts +9 -0
  109. package/dist/_dts/theme-core/src/utils/cssDeclarations.d.ts +2 -0
  110. package/dist/_dts/ui/src/badge.d.ts +2 -1
  111. package/dist/_dts/ui/src/button.d.ts +1 -1
  112. package/dist/_dts/ui/src/combobox-keys.d.ts +23 -0
  113. package/dist/_dts/ui/src/combobox-rows.d.ts +34 -0
  114. package/dist/_dts/ui/src/combobox.d.ts +26 -1
  115. package/dist/_dts/ui/src/date-picker.d.ts +5 -8
  116. package/dist/_dts/ui/src/editor-item-card.d.ts +1 -0
  117. package/dist/_dts/ui/src/field-trigger.d.ts +39 -0
  118. package/dist/_dts/ui/src/fieldControl.d.ts +27 -0
  119. package/dist/_dts/ui/src/index.d.ts +4 -1
  120. package/dist/_dts/ui/src/native-select.d.ts +8 -0
  121. package/dist/_dts/ui/src/popover.d.ts +7 -1
  122. package/dist/_dts/ui/src/segmented-control.d.ts +4 -0
  123. package/dist/_dts/ui/src/surface.d.ts +1 -1
  124. package/dist/client/{BookingConsentAgreement-BQKL045f.mjs → BookingMailingListNote-1n4Ch_u_.mjs} +15 -4
  125. package/dist/client/{CheckboxChoice--W2n6yKs.mjs → CheckboxChoice-B33MqoUo.mjs} +1 -1
  126. package/dist/client/{DiscountCodeDisclosure-CsOtjFY7.mjs → DiscountCodeDisclosure-CKJtz0mY.mjs} +1 -1
  127. package/dist/client/{EventCombined.client-BdRjVbhH.mjs → EventCombined.client-C0pgma9y.mjs} +7 -7
  128. package/dist/client/{EventListing.client-DBxC6xOU.mjs → EventListing.client-4fhLOvHP.mjs} +2 -2
  129. package/dist/client/{LeafletStaticMap-mHEJKrTs.mjs → LeafletStaticMap-DScC4F3w.mjs} +1 -1
  130. package/dist/client/{scrollToBlock-BNgaEUpo.mjs → TerminalPanel-B5ZUsYhe.mjs} +77 -77
  131. package/dist/client/{ThemedButton-CE5KYT6z.mjs → ThemedButton-DoVIV1Ao.mjs} +2 -2
  132. package/dist/client/{accordion-BEQNSptH.mjs → accordion-CoT5g7zo.mjs} +1 -1
  133. package/dist/client/{bookingForm-AMr-s5vw.mjs → bookingForm-BWxB46xD.mjs} +226 -106
  134. package/dist/client/bookings.mjs +367 -188
  135. package/dist/client/{carousel-Bbt_QgJy.mjs → carousel-DtNYWFd3.mjs} +2 -2
  136. package/dist/client/{carousel.client-jahpU9Vz.mjs → carousel.client-A2lG-9od.mjs} +1 -1
  137. package/dist/client/{cart-CnWi30zJ.mjs → cart-z4qZih1Y.mjs} +3 -3
  138. package/dist/client/{checkout-f3nkWgd4.mjs → checkout-DpL7euFH.mjs} +3 -3
  139. package/dist/client/{checkoutUrls-CW3-78uu.mjs → checkoutUrls-BEfR7kVu.mjs} +1 -1
  140. package/dist/client/client.mjs +2125 -1420
  141. package/dist/client/{colorStyles-CuJBiS-1.mjs → colorStyles-j5U9v5JA.mjs} +5 -1
  142. package/dist/client/{context-Bc8T6pCe.mjs → context-C8TinPJc.mjs} +1 -1
  143. package/dist/client/{dates-DUsCEzLb.mjs → dates-vwwxTeB0.mjs} +2 -2
  144. package/dist/client/{eventCalendar-CKwgXui5.mjs → eventCalendar-DIbHfJXO.mjs} +10 -10
  145. package/dist/client/{eventCombined-CBAOSTGR.mjs → eventCombined-DoGMJ6cg.mjs} +4 -4
  146. package/dist/client/{eventDetails-Dh-_WiBD.mjs → eventDetails-BjN9v6a1.mjs} +4 -4
  147. package/dist/client/{eventListing-CA3frIH5.mjs → eventListing-DajjWgOv.mjs} +4 -4
  148. package/dist/client/{eventRegistration-BHtsgdcg.mjs → eventRegistration-DMq9gMA-.mjs} +109 -41
  149. package/dist/client/{form-C2h3YAcg.mjs → form-Qf6qTbos.mjs} +5 -5
  150. package/dist/client/{headerSection-lwMuMTH9.mjs → headerSection-D7qJrqFX.mjs} +3 -3
  151. package/dist/client/hooks.mjs +661 -116
  152. package/dist/client/{locationMap-DJ2bLODV.mjs → locationMap-CCF9-t_0.mjs} +4 -4
  153. package/dist/client/{FieldValidationMessage-AYanWFb-.mjs → mailingListSignupCopy-DZSHZrm6.mjs} +14 -1
  154. package/dist/client/{media-BtJ37tzS.mjs → media-CwBGetqC.mjs} +1 -1
  155. package/dist/client/{newsletterForm-8Pu5K32g.mjs → newsletterForm-DzCLSP4S.mjs} +6 -6
  156. package/dist/client/{pricing-HHx3IgBz.mjs → pricing-Cgxv2KLC.mjs} +1 -1
  157. package/dist/client/{productDetail-C_1odnAf.mjs → productDetail-ru9w5GHx.mjs} +3 -3
  158. package/dist/client/{productList-CtCv-Nmx.mjs → productList-zaapKSl-.mjs} +3 -3
  159. package/dist/client/{propsDecoder-Dcgsncxb.mjs → propsDecoder-CwvvNOHx.mjs} +52 -6
  160. package/dist/client/rendering/client.mjs +951 -369
  161. package/dist/client/rendering/islands.mjs +19 -19
  162. package/dist/client/rendering.mjs +2153 -1393
  163. package/dist/client/{routeIslandApiConfig-CWLP7wu3.mjs → routeIslandApiConfig-BwVFo0Y4.mjs} +1 -1
  164. package/dist/client/{shop-commerce-B88zmWWo.mjs → shop-commerce-De7gEnkA.mjs} +8 -8
  165. package/dist/client/{shop-commerce-store-DtSfkKuX.mjs → shop-commerce-store-B3MCxIBW.mjs} +1 -1
  166. package/dist/client/{shop-DQXrQ8kJ.mjs → shop-mktkXvbV.mjs} +7 -7
  167. package/dist/client/{shopShared-cuaONpkJ.mjs → shopShared-TqExh235.mjs} +5 -5
  168. package/dist/client/{useEventFilters-Bukew6Gb.mjs → useEventFilters-n_OjkIjX.mjs} +8 -8
  169. package/dist/preview-next/before-render.mjs +122 -50
  170. package/dist/preview-next/client/runtime.mjs +4 -4
  171. package/dist/preview-next/editor-base.css +53 -2
  172. package/dist/preview-next/editor-chrome.css +7 -4
  173. package/dist/preview-next/keepAlive.mjs +122 -50
  174. package/dist/preview-next/middleware.mjs +122 -50
  175. package/dist/{previewAuthStore-h5IgbSp4.mjs → previewAuthStore-C_EHQ5XA.mjs} +122 -50
  176. package/dist/{sdk-runtime-DTc1uIXn.mjs → sdk-runtime-BIkJg5y1.mjs} +2 -2
  177. package/dist/{separator-BpHS1KZK.mjs → separator-C9qDP95Z.mjs} +1 -1
  178. package/dist/server/components.mjs +25345 -24942
  179. package/dist/server/config-validation.mjs +711 -163
  180. package/dist/server/config.mjs +711 -163
  181. package/dist/server/data.mjs +709 -162
  182. package/dist/server/index.mjs +123 -51
  183. package/dist/server/navigation.mjs +13 -2
  184. package/dist/server/next.mjs +4538 -4169
  185. package/dist/server/page-converter.mjs +107 -64
  186. package/dist/server/prebuild.mjs +1 -1
  187. package/dist/server/rendering/server.mjs +2509 -2104
  188. package/dist/server/rendering.mjs +25526 -25104
  189. package/dist/server/routing.mjs +750 -289
  190. package/dist/server/server.mjs +671 -148
  191. package/dist/server/theme-bridge.mjs +66 -17
  192. package/dist/server/theme.mjs +5 -1
  193. package/dist/styles/index.css +32 -4
  194. package/package.json +1 -1
  195. package/dist/_dts/core/src/participant-identity.d.ts +0 -135
@@ -661,17 +661,35 @@ function parseMailingListRuntimeContext(value) {
661
661
  if (!isRecord$10(value)) return invalidRuntimeContext();
662
662
  if (value.tag === "not_configured") return ok({ tag: "not_configured" });
663
663
  if (value.tag !== "configured") return invalidRuntimeContext();
664
+ return parseConfiguredRuntimeContext(value);
665
+ }
666
+ function parseConfiguredRuntimeContext(value) {
664
667
  const revision = parseMailingListSetupRevision(value.revision);
665
668
  const form = parseMailingListGlobalForm(value.form);
666
669
  const provider = parseRuntimeProvider(value.provider);
667
- if (revision === null || !form.ok || provider === null) return invalidRuntimeContext();
670
+ const bookingSignup = parseBookingSignupOffer(value.bookingSignup);
671
+ if (revision === null || !form.ok || provider === null || bookingSignup === null) return invalidRuntimeContext();
668
672
  return ok({
669
673
  tag: "configured",
670
674
  revision,
675
+ bookingSignup,
671
676
  form: form.value,
672
677
  provider
673
678
  });
674
679
  }
680
+ function parseBookingSignupOffer(value) {
681
+ if (value === void 0) return {
682
+ tag: "unavailable",
683
+ reason: "disabled"
684
+ };
685
+ if (!isRecord$10(value)) return null;
686
+ if (value.tag === "offered") return { tag: "offered" };
687
+ if (value.tag === "unavailable" && (value.reason === "disabled" || value.reason === "fields" || value.reason === "destination")) return {
688
+ tag: "unavailable",
689
+ reason: value.reason
690
+ };
691
+ return null;
692
+ }
675
693
  function parseRuntimeProvider(value) {
676
694
  if (!isRecord$10(value)) return null;
677
695
  switch (value.provider) {
@@ -2347,13 +2365,16 @@ const SURFACE_FOREGROUND_CSS_VARS = {
2347
2365
  text: "--rb-surface-text-color",
2348
2366
  heading: "--rb-surface-heading-color",
2349
2367
  link: "--rb-surface-link-color",
2368
+ linkHover: "--rb-surface-link-hover-color",
2350
2369
  supporting: "--rb-surface-supporting-color"
2351
2370
  };
2352
2371
  const DEFAULT_SURFACE_TEXT_COLOR = "rgb(var(--tb-text, 17 24 39))";
2372
+ const DEFAULT_SURFACE_LINK_COLOR = "rgb(var(--tb-primary, var(--tb-text, 17 24 39)))";
2353
2373
  const DEFAULT_ROLE_FALLBACKS = {
2354
2374
  text: DEFAULT_SURFACE_TEXT_COLOR,
2355
2375
  heading: DEFAULT_SURFACE_TEXT_COLOR,
2356
- link: "rgb(var(--tb-primary, var(--tb-text, 17 24 39)))",
2376
+ link: DEFAULT_SURFACE_LINK_COLOR,
2377
+ linkHover: DEFAULT_SURFACE_LINK_COLOR,
2357
2378
  supporting: "rgb(var(--tb-mutedText, 100 116 139))"
2358
2379
  };
2359
2380
  function requireSurfaceColorValue(role, value) {
@@ -2363,10 +2384,12 @@ function requireSurfaceColorValue(role, value) {
2363
2384
  }
2364
2385
  function completeSurfaceForegrounds(input) {
2365
2386
  const text = requireSurfaceColorValue("text", input.text);
2387
+ const link = input.link === void 0 ? text : requireSurfaceColorValue("link", input.link);
2366
2388
  return {
2367
2389
  text,
2368
2390
  heading: input.heading === void 0 ? text : requireSurfaceColorValue("heading", input.heading),
2369
- link: input.link === void 0 ? text : requireSurfaceColorValue("link", input.link),
2391
+ link,
2392
+ linkHover: input.linkHover === void 0 ? link : requireSurfaceColorValue("linkHover", input.linkHover),
2370
2393
  supporting: input.supporting === void 0 ? text : requireSurfaceColorValue("supporting", input.supporting)
2371
2394
  };
2372
2395
  }
@@ -2374,6 +2397,7 @@ function surfaceForegroundValue(role, outsideProviderFallback = DEFAULT_ROLE_FAL
2374
2397
  const roleVariable = SURFACE_FOREGROUND_CSS_VARS[role];
2375
2398
  const fallback = requireSurfaceColorValue("fallback", outsideProviderFallback);
2376
2399
  if (role === "text") return `var(${roleVariable}, ${fallback})`;
2400
+ if (role === "linkHover") return `var(${roleVariable}, ${surfaceForegroundValue("link", fallback)})`;
2377
2401
  return `var(${roleVariable}, var(${SURFACE_FOREGROUND_CSS_VARS.text}, ${fallback}))`;
2378
2402
  }
2379
2403
  function surfaceForegroundValueWithOpacity(role, opacityPercent) {
@@ -2387,9 +2411,25 @@ function surfaceForegroundStyle(input) {
2387
2411
  [SURFACE_FOREGROUND_CSS_VARS.text]: foregrounds.text,
2388
2412
  [SURFACE_FOREGROUND_CSS_VARS.heading]: foregrounds.heading,
2389
2413
  [SURFACE_FOREGROUND_CSS_VARS.link]: foregrounds.link,
2390
- [SURFACE_FOREGROUND_CSS_VARS.supporting]: foregrounds.supporting
2414
+ [SURFACE_FOREGROUND_CSS_VARS.linkHover]: foregrounds.linkHover,
2415
+ [SURFACE_FOREGROUND_CSS_VARS.supporting]: foregrounds.supporting,
2416
+ "--rb-surface-link-hover-decoration": hoverDecoration(input)
2391
2417
  };
2392
2418
  }
2419
+ function surfaceForegroundInputFromResolved(foreground, color) {
2420
+ const { roles } = foreground;
2421
+ return {
2422
+ text: color(roles.text),
2423
+ heading: color(roles.heading),
2424
+ link: color(roles.link),
2425
+ linkHover: color(roles.linkHover),
2426
+ supporting: color(roles.supporting),
2427
+ hoverDecoration: foreground.hoverDecoration
2428
+ };
2429
+ }
2430
+ function hoverDecoration(input) {
2431
+ return input.hoverDecoration ?? "underline";
2432
+ }
2393
2433
  //#endregion
2394
2434
  //#region ../theme-core/src/buttons/constants.ts
2395
2435
  /**
@@ -3246,6 +3286,64 @@ function parseAlpha(source) {
3246
3286
  function isRgbChannel(value) {
3247
3287
  return Number.isFinite(value) && value >= 0 && value <= 255;
3248
3288
  }
3289
+ /**
3290
+ * Derive the hover foreground that belongs with a resolved resting foreground.
3291
+ *
3292
+ * A resting foreground is chosen to be legible against a known surface. A hover
3293
+ * state derived from it stays within a bounded distance of that colour, so it
3294
+ * inherits most of the resting colour's contrast margin instead of asserting
3295
+ * an unrelated brand colour that no one checked against the surface.
3296
+ *
3297
+ * That bounded-distance property is what lets this be used on a transparent
3298
+ * overlay header, where the backdrop is only partly knowable: the scrolled
3299
+ * state composites a 60% glass tint over arbitrary page content, so no
3300
+ * compile-time contrast proof is available there. Staying near a colour that
3301
+ * is already trusted in both states is a weaker claim than a contrast proof,
3302
+ * and it is one this function can actually keep.
3303
+ *
3304
+ * Returns `null` when the resting token is not a plain palette token — an
3305
+ * already-faded or raw value has no well-defined softening, and the caller
3306
+ * should leave hover alone rather than guess.
3307
+ */
3308
+ function deriveForegroundHoverToken(restingToken) {
3309
+ const parts = parseColorTokenParts(restingToken);
3310
+ if (parts.kind !== "token") return null;
3311
+ if (parts.opacityPercent !== null) return null;
3312
+ return parseThemeColorToken(`${parts.token}/85`);
3313
+ }
3314
+ /**
3315
+ * Prefer an authored hover that survives every measured backdrop, then a
3316
+ * checked softening of the resting colour. A null backdrop set represents a
3317
+ * trusted treatment: only an explicit authored hover may change the colour.
3318
+ * When neither option works, retain the resting colour and underline it.
3319
+ */
3320
+ function planForegroundHover(input) {
3321
+ const { restingToken, candidate, palette, backdrops } = input;
3322
+ if (candidate && candidate !== restingToken) {
3323
+ if (backdrops === null || survivesEveryBackdrop(candidate, palette, backdrops)) return {
3324
+ kind: "candidate",
3325
+ token: candidate,
3326
+ decoration: "initial"
3327
+ };
3328
+ }
3329
+ const softened = deriveForegroundHoverToken(restingToken);
3330
+ if (softened && backdrops && survivesEveryBackdrop(softened, palette, backdrops)) return {
3331
+ kind: "softened",
3332
+ token: softened,
3333
+ decoration: "initial"
3334
+ };
3335
+ return {
3336
+ kind: "resting",
3337
+ token: restingToken,
3338
+ decoration: "underline"
3339
+ };
3340
+ }
3341
+ function survivesEveryBackdrop(token, palette, backdrops) {
3342
+ return backdrops.length > 0 && backdrops.every((backdrop) => {
3343
+ const foreground = resolveOpaqueSurfaceHex(token, palette, backdrop);
3344
+ return foreground !== null && contrastRatio(foreground, backdrop) >= 4.5;
3345
+ });
3346
+ }
3249
3347
  //#endregion
3250
3348
  //#region ../theme-core/src/surfaces/resolveSurfaceForeground.ts
3251
3349
  const FALLBACK_TEXT_TOKENS = [
@@ -3292,12 +3390,16 @@ function resolveSurfaceForeground(background, palette, candidates = {}, options
3292
3390
  }
3293
3391
  function foregroundCandidates(background, overrides) {
3294
3392
  return {
3295
- text: overrides.text ?? background?.textColor ?? null,
3296
- heading: overrides.heading ?? background?.headingColor ?? null,
3297
- link: overrides.link ?? background?.linkColor ?? null,
3298
- supporting: overrides.supporting ?? background?.supportingColor ?? null
3393
+ text: candidateOrBackground(overrides.text, background?.textColor),
3394
+ heading: candidateOrBackground(overrides.heading, background?.headingColor),
3395
+ link: candidateOrBackground(overrides.link, background?.linkColor),
3396
+ linkHover: candidateOrBackground(overrides.linkHover),
3397
+ supporting: candidateOrBackground(overrides.supporting, background?.supportingColor)
3299
3398
  };
3300
3399
  }
3400
+ function candidateOrBackground(candidate, backgroundValue) {
3401
+ return candidate ?? backgroundValue ?? null;
3402
+ }
3301
3403
  function resolveDeterministicForeground(backgroundReference, candidates, palette, compositeBase) {
3302
3404
  const backgroundHex = resolveOpaqueSurfaceHex(backgroundReference, palette, compositeBase);
3303
3405
  if (!backgroundHex) return resolveTrustedTreatmentForeground(candidates, palette);
@@ -3309,29 +3411,51 @@ function resolveDeterministicForeground(backgroundReference, candidates, palette
3309
3411
  ...FALLBACK_TEXT_TOKENS
3310
3412
  ], backgroundHex, palette, derivedOnToken ? [derivedOnToken] : []);
3311
3413
  if (!text) return { kind: "unknown" };
3312
- return {
3313
- kind: "known",
3314
- roles: {
3315
- text,
3316
- heading: safeTokenOr(candidates.heading, text, backgroundHex, palette),
3317
- link: safeTokenOr(candidates.link, text, backgroundHex, palette),
3318
- supporting: safeTokenOr(candidates.supporting, text, backgroundHex, palette)
3319
- }
3320
- };
3414
+ return knownForeground({
3415
+ text,
3416
+ heading: safeTokenOr(candidates.heading, text, backgroundHex, palette),
3417
+ link: safeTokenOr(candidates.link, text, backgroundHex, palette),
3418
+ supporting: safeTokenOr(candidates.supporting, text, backgroundHex, palette)
3419
+ }, {
3420
+ kind: "measured",
3421
+ backdropHex: backgroundHex
3422
+ }, candidates.linkHover, palette);
3321
3423
  }
3322
3424
  function resolveTrustedTreatmentForeground(candidates, palette) {
3323
3425
  const text = canonicalToken(candidates.text, palette);
3324
3426
  if (!text) return { kind: "unknown" };
3427
+ return knownForeground({
3428
+ text,
3429
+ heading: canonicalToken(candidates.heading, palette) ?? text,
3430
+ link: canonicalToken(candidates.link, palette) ?? text,
3431
+ supporting: canonicalToken(candidates.supporting, palette) ?? text
3432
+ }, { kind: "trusted-treatment" }, candidates.linkHover, palette);
3433
+ }
3434
+ function knownForeground(roles, provenance, hoverCandidate, palette) {
3435
+ const hover = planForegroundHover({
3436
+ restingToken: roles.link,
3437
+ candidate: canonicalHoverToken(hoverCandidate, palette),
3438
+ palette,
3439
+ backdrops: provenance.kind === "measured" ? [provenance.backdropHex] : null
3440
+ });
3325
3441
  return {
3326
3442
  kind: "known",
3443
+ provenance,
3327
3444
  roles: {
3328
- text,
3329
- heading: canonicalToken(candidates.heading, palette) ?? text,
3330
- link: canonicalToken(candidates.link, palette) ?? text,
3331
- supporting: canonicalToken(candidates.supporting, palette) ?? text
3332
- }
3445
+ ...roles,
3446
+ linkHover: hover.token
3447
+ },
3448
+ hoverDecoration: hover.decoration
3333
3449
  };
3334
3450
  }
3451
+ function canonicalHoverToken(reference, palette) {
3452
+ const token = parseThemeColorToken(reference);
3453
+ if (token) {
3454
+ const parts = parseColorTokenParts(token);
3455
+ if (parts.kind === "token" && resolveConcreteColorHex(parts.token, palette)) return token;
3456
+ }
3457
+ return canonicalToken(reference, palette);
3458
+ }
3335
3459
  function safeTokenOr(candidate, fallback, backgroundHex, palette) {
3336
3460
  return firstSafeToken([candidate], backgroundHex, palette) ?? fallback;
3337
3461
  }
@@ -6271,6 +6395,43 @@ const effectCompositionSchema = z.object({
6271
6395
  /** Effects applied on focus */
6272
6396
  focus: z.array(effectApplicationSchema).optional()
6273
6397
  });
6398
+ const policiesById = {
6399
+ "darken-background": "other",
6400
+ "lighten-background": "other",
6401
+ "fade-background": "other",
6402
+ "opacity-reduce": "other",
6403
+ "animated-gradient": "other",
6404
+ "background-on-hover": "paired-hover",
6405
+ "background-on-hover-alpha": "paired-hover",
6406
+ "border-glow": "other",
6407
+ "drop-shadow": "other",
6408
+ "inner-shadow": "other",
6409
+ "neumorphic-shadow": "other",
6410
+ "outer-glow": "other",
6411
+ "retro-3d-shadow": "other",
6412
+ "scale-up": "other",
6413
+ "scale-down": "other",
6414
+ lift: "other",
6415
+ "press-down": "other",
6416
+ pop: "other",
6417
+ "aurora-glow": "other",
6418
+ "cosmic-stardust": "other",
6419
+ "gradient-border-fill": "other",
6420
+ "animated-gradient-border-fill": "other",
6421
+ "border-bottom-grow": "other",
6422
+ "gradient-text": "other",
6423
+ "text-color-change": "text-colour",
6424
+ "border-color-change": "other",
6425
+ "sketchy-border": "other",
6426
+ "pulse-animation": "other",
6427
+ "nav-underline": "underline",
6428
+ "nav-frosted-base": "other",
6429
+ "nav-frosted-hover": "other",
6430
+ "nav-frosted-active": "other"
6431
+ };
6432
+ function navEffectPolicy(effectId) {
6433
+ return policiesById[effectId] ?? null;
6434
+ }
6274
6435
  //#endregion
6275
6436
  //#region ../theme-core/src/navigation/types.ts
6276
6437
  /**
@@ -6359,6 +6520,16 @@ const navLinkStyleSchema = z.object({
6359
6520
  /** Composable effects */
6360
6521
  effects: effectCompositionSchema.optional()
6361
6522
  });
6523
+ function navLinkHoverColorCandidate(style) {
6524
+ const effect = style?.effects?.hover?.find((item) => navEffectPolicy(item.effectId) === "text-colour");
6525
+ return parseThemeColorToken(effect?.options?.hoverColorToken ?? style?.hoverColorToken);
6526
+ }
6527
+ function navLinkOwnsHoverForeground(style) {
6528
+ return style?.effects?.hover?.some((effect) => navEffectPolicy(effect.effectId) === "paired-hover") ?? false;
6529
+ }
6530
+ function navLinkOwnsUnderline(style) {
6531
+ return style?.effects?.hover?.some((effect) => navEffectPolicy(effect.effectId) === "underline") ?? false;
6532
+ }
6362
6533
  //#endregion
6363
6534
  //#region ../theme-core/src/customCss/validation.ts
6364
6535
  /**
@@ -8517,6 +8688,64 @@ function defineEndpointDefinitions(definitions) {
8517
8688
  return definitions;
8518
8689
  }
8519
8690
  //#endregion
8691
+ //#region ../api/src/apiEndpointTypes.ts
8692
+ function allowedDemoMutationPolicy() {
8693
+ return {
8694
+ classification: "allowed",
8695
+ publicMessage: ""
8696
+ };
8697
+ }
8698
+ function blockedDemoMutationPolicy(classification, publicMessage) {
8699
+ if (publicMessage.trim() === "") throw new Error(`Demo mutation policy ${classification} requires publicMessage.`);
8700
+ return {
8701
+ classification,
8702
+ publicMessage
8703
+ };
8704
+ }
8705
+ //#endregion
8706
+ //#region ../api/src/demoMutationPolicies.ts
8707
+ const DEMO_MUTATION_BLOCKED_HIDDEN = blockedDemoMutationPolicy("blocked-hidden", "This action is not available in demo sites.");
8708
+ const DEMO_MUTATION_BLOCKED_DISABLED = blockedDemoMutationPolicy("blocked-disabled", "This setting is disabled in demo sites.");
8709
+ blockedDemoMutationPolicy("internal-only", "This internal operation is not available in demo sites.");
8710
+ const DEMO_MUTATION_ALLOWED = allowedDemoMutationPolicy();
8711
+ //#endregion
8712
+ //#region ../api/src/siteLifecycleEndpoints.ts
8713
+ const SITE_LIFECYCLE_ENDPOINT_DEFINITIONS = defineEndpointDefinitions({
8714
+ createSite: {
8715
+ path: "/sites/manage",
8716
+ method: "POST",
8717
+ tags: ["site"],
8718
+ auth: "user",
8719
+ responseKind: "json",
8720
+ errors: []
8721
+ },
8722
+ createSiteManual: {
8723
+ path: "/sites/manual",
8724
+ method: "POST",
8725
+ tags: ["site"],
8726
+ auth: "user",
8727
+ responseKind: "json",
8728
+ errors: []
8729
+ },
8730
+ updateSite: {
8731
+ path: "/sites/manage",
8732
+ method: "PUT",
8733
+ tags: ["site"],
8734
+ auth: "user",
8735
+ responseKind: "json",
8736
+ errors: []
8737
+ },
8738
+ deleteSite: {
8739
+ path: "/sites/{siteId}",
8740
+ method: "DELETE",
8741
+ tags: ["site", "site-{siteId}"],
8742
+ auth: "user",
8743
+ responseKind: "json",
8744
+ errors: [],
8745
+ demoMutation: DEMO_MUTATION_BLOCKED_HIDDEN
8746
+ }
8747
+ });
8748
+ //#endregion
8520
8749
  //#region ../api/src/publicNewsletterEndpointDefinitions.ts
8521
8750
  const PUBLIC_NEWSLETTER_ENDPOINT_DEFINITIONS = defineEndpointDefinitions({
8522
8751
  subscribeNewsletter: {
@@ -8577,27 +8806,6 @@ const PUBLIC_NEWSLETTER_ENDPOINT_DEFINITIONS = defineEndpointDefinitions({
8577
8806
  }
8578
8807
  });
8579
8808
  //#endregion
8580
- //#region ../api/src/apiEndpointTypes.ts
8581
- function allowedDemoMutationPolicy() {
8582
- return {
8583
- classification: "allowed",
8584
- publicMessage: ""
8585
- };
8586
- }
8587
- function blockedDemoMutationPolicy(classification, publicMessage) {
8588
- if (publicMessage.trim() === "") throw new Error(`Demo mutation policy ${classification} requires publicMessage.`);
8589
- return {
8590
- classification,
8591
- publicMessage
8592
- };
8593
- }
8594
- //#endregion
8595
- //#region ../api/src/demoMutationPolicies.ts
8596
- const DEMO_MUTATION_BLOCKED_HIDDEN = blockedDemoMutationPolicy("blocked-hidden", "This action is not available in demo sites.");
8597
- const DEMO_MUTATION_BLOCKED_DISABLED = blockedDemoMutationPolicy("blocked-disabled", "This setting is disabled in demo sites.");
8598
- blockedDemoMutationPolicy("internal-only", "This internal operation is not available in demo sites.");
8599
- const DEMO_MUTATION_ALLOWED = allowedDemoMutationPolicy();
8600
- //#endregion
8601
8809
  //#region ../api/src/cache-tags.ts
8602
8810
  /**
8603
8811
  * Tag templates for endpoint definitions (support `{param}` placeholders).
@@ -9624,6 +9832,20 @@ const NEWSLETTER_ENDPOINT_DEFINITIONS = defineEndpointDefinitions({
9624
9832
  responseKind: "json",
9625
9833
  errors: ["auth:forbidden", "server:internal_error"]
9626
9834
  },
9835
+ setMailingListBookingOptIn: {
9836
+ path: "/sites/{siteId}/mailing-list/setup/booking-opt-in",
9837
+ method: "PUT",
9838
+ tags: [TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter],
9839
+ auth: "user",
9840
+ responseKind: "json",
9841
+ demoMutation: DEMO_MUTATION_BLOCKED_DISABLED,
9842
+ errors: [
9843
+ "auth:forbidden",
9844
+ "validation:invalid_input",
9845
+ "resource:conflict",
9846
+ "server:internal_error"
9847
+ ]
9848
+ },
9627
9849
  getMailingListAuthoringContext: {
9628
9850
  path: "/sites/{siteId}/mailing-list/authoring-context",
9629
9851
  method: "GET",
@@ -10948,6 +11170,54 @@ const BILLING_ENDPOINT_DEFINITIONS = defineEndpointDefinitions({
10948
11170
  }
10949
11171
  });
10950
11172
  //#endregion
11173
+ //#region ../api/src/bookingPeopleEndpointDefinitions.ts
11174
+ /**
11175
+ * People endpoints (#1356): the People list, its CSV export, and deleting a
11176
+ * person when nothing is attached to them.
11177
+ */
11178
+ const BOOKING_PEOPLE_ENDPOINT_DEFINITIONS = defineEndpointDefinitions({
11179
+ listPeople: {
11180
+ path: "/sites/{siteId}/bookings/people",
11181
+ method: "GET",
11182
+ tags: ["site-{siteId}", "customers-{siteId}"],
11183
+ auth: "user",
11184
+ responseKind: "json",
11185
+ errors: ["server:internal_error"]
11186
+ },
11187
+ exportPeopleCsv: {
11188
+ path: "/sites/{siteId}/bookings/people/export.csv",
11189
+ method: "GET",
11190
+ tags: ["site-{siteId}", "customers-{siteId}"],
11191
+ auth: "user",
11192
+ errors: [],
11193
+ responseKind: "blob"
11194
+ },
11195
+ checkPersonDeletion: {
11196
+ path: "/sites/{siteId}/bookings/people/{personId}/deletion-check",
11197
+ method: "GET",
11198
+ tags: ["site-{siteId}", "customers-{siteId}"],
11199
+ auth: "user",
11200
+ responseKind: "json",
11201
+ errors: [
11202
+ "auth:forbidden",
11203
+ "resource:not_found",
11204
+ "server:internal_error"
11205
+ ]
11206
+ },
11207
+ deletePerson: {
11208
+ path: "/sites/{siteId}/bookings/people/{personId}",
11209
+ method: "DELETE",
11210
+ tags: ["site-{siteId}", "customers-{siteId}"],
11211
+ auth: "user",
11212
+ responseKind: "json",
11213
+ errors: [
11214
+ "auth:forbidden",
11215
+ "resource:not_found",
11216
+ "server:internal_error"
11217
+ ]
11218
+ }
11219
+ });
11220
+ //#endregion
10951
11221
  //#region ../api/src/clientErrorReporting.ts
10952
11222
  const CLIENT_ERROR_REPORT_ENDPOINT_DEFINITIONS = defineEndpointDefinitions({ reportClientError: {
10953
11223
  path: "/client/error-report",
@@ -10983,6 +11253,7 @@ z.object({
10983
11253
  sourceLocation: z.string().max(CLIENT_ERROR_REPORT_LIMITS.sourceLocation).nullable()
10984
11254
  }).strict();
10985
11255
  ({
11256
+ ...SITE_LIFECYCLE_ENDPOINT_DEFINITIONS,
10986
11257
  ...CLIENT_ERROR_REPORT_ENDPOINT_DEFINITIONS,
10987
11258
  ...PUBLIC_NEWSLETTER_ENDPOINT_DEFINITIONS,
10988
11259
  ...ACCOUNT_ENDPOINT_DEFINITIONS,
@@ -10996,7 +11267,7 @@ z.object({
10996
11267
  ...NEWSLETTER_ENDPOINT_DEFINITIONS,
10997
11268
  ...APPOINTMENT_ENDPOINT_DEFINITIONS,
10998
11269
  ...EVENT_SERIES_REGISTRATION_ENDPOINT_DEFINITIONS
10999
- }, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteById, TAG_TEMPLATES.siteBySlug, TAG_TEMPLATES.siteByDomain, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteById, TAG_TEMPLATES.siteBySlug, TAG_TEMPLATES.siteByDomain, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.pageSurfaceById, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.pageSurfaceById, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.pageSurfaceById, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.pageSurfaceById, TAG_TEMPLATES.workflowRunById, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.routeById, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.site, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteNavigation, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteNavigation, TAG_TEMPLATES.navigationMenuById, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteNavigation, TAG_TEMPLATES.navigationMenuById, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteNavigation, TAG_TEMPLATES.navigationMenuById, TAG_TEMPLATES.navigationItemById, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteNavigation, TAG_TEMPLATES.navigationMenuById, TAG_TEMPLATES.navigationItemById, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteNavigation, TAG_TEMPLATES.navigationMenuById, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.publicEvents, TAG_TEMPLATES.publicBookingServices, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteTheme, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteTheme, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteTheme, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.pageSurfaceById, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.pageSurfaceById, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.pageSurfaceById, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.pageSurfaceById, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.pageById, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.pageById, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.pageById, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.pageById, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.pageById, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.pageById, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.pageById, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.pageById, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.pageById, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.siteRedirects, TAG_TEMPLATES.siteRouteOutcomes, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.siteRedirects, TAG_TEMPLATES.siteRouteOutcomes, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.siteForms, TAG_TEMPLATES.siteForms, TAG_TEMPLATES.siteForms, TAG_TEMPLATES.siteForms, TAG_TEMPLATES.siteForms, TAG_TEMPLATES.siteForms, TAG_TEMPLATES.formSubmissionsBySlug, TAG_TEMPLATES.siteForms, TAG_TEMPLATES.formSubmissionsBySlug, TAG_TEMPLATES.siteForms, TAG_TEMPLATES.formSubmissionsBySlug, TAG_TEMPLATES.siteForms, { ...PUBLIC_BOOKING_AVAILABILITY_ENDPOINT_DEFINITIONS }, TAG_TEMPLATES.publicEventFilters, TAG_TEMPLATES.publicEvents, TAG_TEMPLATES.publicShop, TAG_TEMPLATES.publicCheckout, TAG_TEMPLATES.siteRoutableContent, { ...PUBLIC_EVENT_CHECKOUT_ENDPOINT_DEFINITIONS }, TAG_TEMPLATES.publicEvents, TAG_TEMPLATES.publicEvents, { ...EVENT_MANAGEMENT_ENDPOINT_DEFINITIONS }, { ...SDK_MEDIA_ENDPOINT_DEFINITIONS }, { ...SDK_ENDPOINT_DEFINITIONS }, { ...SDK_PAGE_DESIGN_ENDPOINT_DEFINITIONS }, { ...SDK_EVENT_ENDPOINT_DEFINITIONS }, { ...SDK_ENTRY_READ_ENDPOINTS };
11270
+ }, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteById, TAG_TEMPLATES.siteBySlug, TAG_TEMPLATES.siteByDomain, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteById, TAG_TEMPLATES.siteBySlug, TAG_TEMPLATES.siteByDomain, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.pageSurfaceById, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.pageSurfaceById, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.pageSurfaceById, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.pageSurfaceById, TAG_TEMPLATES.workflowRunById, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.routeById, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.site, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteNavigation, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteNavigation, TAG_TEMPLATES.navigationMenuById, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteNavigation, TAG_TEMPLATES.navigationMenuById, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteNavigation, TAG_TEMPLATES.navigationMenuById, TAG_TEMPLATES.navigationItemById, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteNavigation, TAG_TEMPLATES.navigationMenuById, TAG_TEMPLATES.navigationItemById, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteNavigation, TAG_TEMPLATES.navigationMenuById, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.publicEvents, TAG_TEMPLATES.publicBookingServices, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteTheme, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteTheme, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteTheme, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.pageSurfaceById, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.pageSurfaceById, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.pageSurfaceById, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.pageSurfaceById, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.pageById, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.pageById, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.pageById, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.pageById, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.pageById, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.pageById, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.pageById, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.pageById, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.pageById, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.siteRedirects, TAG_TEMPLATES.siteRouteOutcomes, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.siteRedirects, TAG_TEMPLATES.siteRouteOutcomes, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.siteForms, TAG_TEMPLATES.siteForms, TAG_TEMPLATES.siteForms, TAG_TEMPLATES.siteForms, TAG_TEMPLATES.siteForms, TAG_TEMPLATES.siteForms, TAG_TEMPLATES.formSubmissionsBySlug, TAG_TEMPLATES.siteForms, TAG_TEMPLATES.formSubmissionsBySlug, TAG_TEMPLATES.siteForms, TAG_TEMPLATES.formSubmissionsBySlug, TAG_TEMPLATES.siteForms, { ...PUBLIC_BOOKING_AVAILABILITY_ENDPOINT_DEFINITIONS }, TAG_TEMPLATES.publicEventFilters, TAG_TEMPLATES.publicEvents, TAG_TEMPLATES.publicShop, TAG_TEMPLATES.publicCheckout, TAG_TEMPLATES.siteRoutableContent, { ...PUBLIC_EVENT_CHECKOUT_ENDPOINT_DEFINITIONS }, TAG_TEMPLATES.publicEvents, TAG_TEMPLATES.publicEvents, { ...EVENT_MANAGEMENT_ENDPOINT_DEFINITIONS }, { ...BOOKING_PEOPLE_ENDPOINT_DEFINITIONS }, { ...SDK_MEDIA_ENDPOINT_DEFINITIONS }, { ...SDK_ENDPOINT_DEFINITIONS }, { ...SDK_PAGE_DESIGN_ENDPOINT_DEFINITIONS }, { ...SDK_EVENT_ENDPOINT_DEFINITIONS }, { ...SDK_ENTRY_READ_ENDPOINTS };
11000
11271
  z.object({ refreshToken: z.string().min(1).max(4096) }).strict();
11001
11272
  z.object({
11002
11273
  accessToken: z.string().min(1).max(4096),
@@ -17285,6 +17556,14 @@ const blockDesignFallback = {
17285
17556
  };
17286
17557
  blockDesignFallback.sectionSurface, blockDesignFallback.contentFrame, blockDesignFallback.sectionHeight, blockDesignFallback.heroLegibility, blockDesignFallback.imageSurfaceTreatment, blockDesignFallback.imageSurfaceMotion, blockDesignFallback.tileTreatment, blockDesignFallback.eventListTreatment, blockDesignFallback.eyebrowTreatment, blockDesignFallback.accordionIconTreatment, blockDesignFallback.composition;
17287
17558
  //#endregion
17559
+ //#region ../theme-core/src/header/rootPaint.ts
17560
+ /** The nav container takes precedence when a floating header also has one. */
17561
+ function headerRootPaint(header) {
17562
+ const navContainerType = header?.navContainer?.type ?? "none";
17563
+ if (navContainerType === "glass" || navContainerType === "pill") return "contained-nav";
17564
+ return header?.variant === "floating" ? "overlay" : "own-surface";
17565
+ }
17566
+ //#endregion
17288
17567
  //#region ../theme-core/src/site-styles/siteChromeBackgrounds.ts
17289
17568
  const siteChromeBackgroundColorTokens = toSiteChromeBackgroundColorTokens(backgroundAppearanceColorTokenNames);
17290
17569
  const quickSiteChromeBackgroundColorTokens = toSiteChromeBackgroundColorTokens(backgroundAppearanceQuickColorTokenNames);
@@ -17464,6 +17743,259 @@ z.object(headerPreferencesShape).omit({
17464
17743
  structure: true
17465
17744
  }).strict();
17466
17745
  //#endregion
17746
+ //#region ../theme-core/src/navigation/presets.ts
17747
+ /**
17748
+ * Built-in nav link style presets
17749
+ *
17750
+ * Each preset uses composable effects to achieve its look.
17751
+ */
17752
+ const NAV_LINK_PRESETS = {
17753
+ /**
17754
+ * Minimal - subtle color change on hover
17755
+ */
17756
+ minimal: {
17757
+ name: "Minimal",
17758
+ typography: "body",
17759
+ fontWeight: "medium",
17760
+ textTransform: "none",
17761
+ italic: false,
17762
+ colorToken: "text",
17763
+ hoverColorToken: "primary",
17764
+ padding: "none",
17765
+ borderRadius: "none",
17766
+ effects: { hover: [{
17767
+ effectId: "text-color-change",
17768
+ options: { hoverColorToken: "primary" }
17769
+ }] }
17770
+ },
17771
+ /**
17772
+ * Underline - static underline appears on hover
17773
+ */
17774
+ underline: {
17775
+ name: "Underline",
17776
+ typography: "body",
17777
+ fontWeight: "medium",
17778
+ textTransform: "none",
17779
+ italic: false,
17780
+ colorToken: "text",
17781
+ padding: "none",
17782
+ borderRadius: "none",
17783
+ effects: { hover: [{
17784
+ effectId: "nav-underline",
17785
+ options: { style: "static" }
17786
+ }] }
17787
+ },
17788
+ /**
17789
+ * Underline Grow - animated underline grows from center on hover
17790
+ */
17791
+ "underline-grow": {
17792
+ name: "Underline Grow",
17793
+ typography: "body",
17794
+ fontWeight: "medium",
17795
+ textTransform: "none",
17796
+ italic: false,
17797
+ colorToken: "text",
17798
+ padding: "none",
17799
+ borderRadius: "none",
17800
+ effects: { hover: [{
17801
+ effectId: "nav-underline",
17802
+ options: { style: "grow" }
17803
+ }] }
17804
+ },
17805
+ /**
17806
+ * Capsule - pill-shaped background on hover
17807
+ */
17808
+ capsule: {
17809
+ name: "Capsule",
17810
+ typography: "body",
17811
+ fontWeight: "medium",
17812
+ textTransform: "none",
17813
+ italic: false,
17814
+ colorToken: "text",
17815
+ padding: "compact",
17816
+ borderRadius: "full",
17817
+ effects: {
17818
+ hover: [{
17819
+ effectId: "background-on-hover-alpha",
17820
+ options: {
17821
+ colorToken: "primary",
17822
+ opacity: 10
17823
+ }
17824
+ }],
17825
+ active: [{
17826
+ effectId: "background-on-hover-alpha",
17827
+ options: {
17828
+ colorToken: "primary",
17829
+ opacity: 15
17830
+ }
17831
+ }]
17832
+ }
17833
+ },
17834
+ /**
17835
+ * Solid - solid background color on hover
17836
+ */
17837
+ solid: {
17838
+ name: "Solid",
17839
+ typography: "body",
17840
+ fontWeight: "medium",
17841
+ textTransform: "none",
17842
+ italic: false,
17843
+ colorToken: "text",
17844
+ padding: "compact",
17845
+ borderRadius: "none",
17846
+ effects: {
17847
+ hover: [{
17848
+ effectId: "background-on-hover",
17849
+ options: {
17850
+ colorToken: "primary",
17851
+ textColorToken: "primaryForeground"
17852
+ }
17853
+ }],
17854
+ active: [{
17855
+ effectId: "background-on-hover",
17856
+ options: {
17857
+ colorToken: "primary",
17858
+ textColorToken: "primaryForeground"
17859
+ }
17860
+ }]
17861
+ }
17862
+ },
17863
+ /**
17864
+ * Scale - gentle scale-up on hover
17865
+ */
17866
+ scale: {
17867
+ name: "Scale",
17868
+ typography: "body",
17869
+ fontWeight: "medium",
17870
+ textTransform: "none",
17871
+ italic: false,
17872
+ colorToken: "text",
17873
+ padding: "none",
17874
+ borderRadius: "none",
17875
+ effects: { hover: [{
17876
+ effectId: "scale-up",
17877
+ options: { scale: 1.05 }
17878
+ }] }
17879
+ },
17880
+ /**
17881
+ * Frosted - semi-transparent glass-like background
17882
+ */
17883
+ frosted: {
17884
+ name: "Frosted",
17885
+ typography: "body",
17886
+ fontWeight: "medium",
17887
+ textTransform: "none",
17888
+ italic: false,
17889
+ colorToken: "text",
17890
+ padding: "compact",
17891
+ borderRadius: "md",
17892
+ effects: {
17893
+ base: [{ effectId: "nav-frosted-base" }],
17894
+ hover: [{ effectId: "nav-frosted-hover" }],
17895
+ active: [{ effectId: "nav-frosted-active" }]
17896
+ }
17897
+ }
17898
+ };
17899
+ /**
17900
+ * Get a nav link style preset by ID
17901
+ */
17902
+ function getNavLinkPreset(presetId) {
17903
+ return NAV_LINK_PRESETS[presetId];
17904
+ }
17905
+ Object.keys(NAV_LINK_PRESETS);
17906
+ //#endregion
17907
+ //#region ../theme-core/src/header/legacyNavLinkStyle.ts
17908
+ function buildLegacyHeaderNavLinkStyle(header, contrastTreatment, navTextSize) {
17909
+ const navStyle = header.navStyle ?? "minimal";
17910
+ const basePreset = getNavLinkPreset(navStyle);
17911
+ if (!basePreset) return null;
17912
+ const style = {
17913
+ ...basePreset,
17914
+ fontWeight: header.navWeight ?? basePreset.fontWeight,
17915
+ colorToken: (header.navColor ?? header.textColor)?.trim() || basePreset.colorToken,
17916
+ ...contrastTreatment ? { contrastTreatment } : {},
17917
+ ...navTextSize ? { textSize: navTextSize } : {}
17918
+ };
17919
+ if (header.navWeight === "bold" && navStyle === "solid") style.textTransform = "uppercase";
17920
+ applyLegacyGlassTreatment(style, header, navStyle);
17921
+ return style;
17922
+ }
17923
+ function applyLegacyGlassTreatment(style, header, navStyle) {
17924
+ if (header.navContainer?.type !== "glass" || navStyle !== "minimal") return;
17925
+ style.borderRadius = "full";
17926
+ style.effects = {
17927
+ ...style.effects,
17928
+ hover: glassStateEffects(10),
17929
+ active: glassStateEffects(18)
17930
+ };
17931
+ }
17932
+ function glassStateEffects(opacity) {
17933
+ return [{
17934
+ effectId: "background-on-hover-alpha",
17935
+ options: {
17936
+ colorToken: "neutral-50",
17937
+ opacity
17938
+ }
17939
+ }, {
17940
+ effectId: "text-color-change",
17941
+ options: { hoverColorToken: "neutral-50" }
17942
+ }];
17943
+ }
17944
+ //#endregion
17945
+ //#region ../theme-core/src/header/openingForegroundProjection.ts
17946
+ function readOpeningForegroundProjection(header) {
17947
+ return header?.__runtimeOpeningForeground ?? null;
17948
+ }
17949
+ //#endregion
17950
+ //#region ../theme-core/src/header/effectiveNavLinkStyle.ts
17951
+ function effectiveHeaderNavLinkStyle(header, contrastTreatment = null, navTextSize = null) {
17952
+ if (!header) return null;
17953
+ if (!header.navLinkStyle) return buildLegacyHeaderNavLinkStyle(header, contrastTreatment, navTextSize);
17954
+ return {
17955
+ ...header.navLinkStyle,
17956
+ ...contrastTreatment ? { contrastTreatment } : {},
17957
+ ...navTextSize ? { textSize: navTextSize } : {}
17958
+ };
17959
+ }
17960
+ function headerForegroundCandidates(header) {
17961
+ if (!header) return {};
17962
+ const style = effectiveHeaderNavLinkStyle(header);
17963
+ return {
17964
+ text: header.textColor ?? header.background?.textColor,
17965
+ link: style?.colorToken ?? header.navColor ?? header.textColor,
17966
+ linkHover: navLinkHoverColorCandidate(style)
17967
+ };
17968
+ }
17969
+ function headerLeafTextColor(header) {
17970
+ if (!header) return "text";
17971
+ return header.textColor ?? header.navColor ?? header.background?.textColor ?? header.navLinkStyle?.colorToken ?? "text";
17972
+ }
17973
+ /** Transparent chrome must reset the whole contract on its own root. */
17974
+ function transparentHeaderForegroundInput(header, palette) {
17975
+ const projection = readOpeningForegroundProjection(header);
17976
+ if (projection?.kind === "known") return surfaceForegroundInputFromResolved(projection, rgbColorValue);
17977
+ return authoredTransparentHeaderForegroundInput(header, palette);
17978
+ }
17979
+ function authoredTransparentHeaderForegroundInput(header, palette) {
17980
+ const text = headerLeafTextColor(header);
17981
+ const style = effectiveHeaderNavLinkStyle(header);
17982
+ const link = style?.colorToken ?? text;
17983
+ const restingToken = parseThemeColorToken(link) ?? parseThemeColorToken("text");
17984
+ if (!restingToken) throw new Error("Built-in text colour token is invalid");
17985
+ const hover = planForegroundHover({
17986
+ restingToken,
17987
+ candidate: navLinkOwnsHoverForeground(style) ? null : navLinkHoverColorCandidate(style),
17988
+ palette,
17989
+ backdrops: null
17990
+ });
17991
+ return {
17992
+ text: rgbColorValue(text),
17993
+ link: rgbColorValue(link),
17994
+ linkHover: rgbColorValue(hover.token),
17995
+ hoverDecoration: navLinkOwnsUnderline(style) ? "initial" : hover.decoration
17996
+ };
17997
+ }
17998
+ //#endregion
17467
17999
  //#region ../theme-core/src/site-styles/pageDesignAuthority.ts
17468
18000
  const nonEmptyStringSchema = z.string().min(1);
17469
18001
  const blockContentVersionIdSchema = nonEmptyStringSchema.transform(asBlockContentVersionId);
@@ -17616,6 +18148,28 @@ z.object({
17616
18148
  motion: z.enum(themeTokenRecipeOptions.motion)
17617
18149
  });
17618
18150
  //#endregion
18151
+ //#region ../theme-core/src/footer/effectiveNavLinkStyle.ts
18152
+ function effectiveFooterNavLinkStyle(footer) {
18153
+ if (!footer) return null;
18154
+ if (footer.navLinkStyle) return footer.navLinkStyle;
18155
+ const basePreset = getNavLinkPreset(footer.navStyle ?? "minimal");
18156
+ if (!basePreset) return null;
18157
+ return {
18158
+ ...basePreset,
18159
+ fontWeight: footer.navWeight ?? basePreset.fontWeight,
18160
+ colorToken: footer.navColor?.trim() || basePreset.colorToken
18161
+ };
18162
+ }
18163
+ function footerForegroundCandidates(footer, proseHoverCandidate) {
18164
+ if (!footer) return {};
18165
+ const style = effectiveFooterNavLinkStyle(footer);
18166
+ return {
18167
+ text: footer.background?.textColor,
18168
+ link: style?.colorToken ?? footer.navColor ?? footer.background?.textColor,
18169
+ linkHover: navLinkOwnsHoverForeground(style) ? proseHoverCandidate : navLinkHoverColorCandidate(style)
18170
+ };
18171
+ }
18172
+ //#endregion
17619
18173
  //#region ../theme-core/src/siteChromeOverlayClearance.ts
17620
18174
  const SITE_CHROME_VISIBLE_HEADER_ATTR = "data-site-chrome-visible-header";
17621
18175
  //#endregion
@@ -20389,33 +20943,28 @@ function resolveBackgroundColorValue(value, context) {
20389
20943
  //#endregion
20390
20944
  //#region ../blocks/src/system/transforms/registry/_utils/surfaceForegroundStyles.ts
20391
20945
  const contextualButtonStylesCache = /* @__PURE__ */ new WeakMap();
20392
- function resolveHeaderLeafTextColor(header) {
20393
- return header?.textColor ?? header?.navColor ?? header?.background?.textColor ?? header?.navLinkStyle?.colorToken ?? "text";
20394
- }
20395
20946
  function resolveHeaderRootForeground(header, palette, isTransparent) {
20396
- if (isTransparent) return { kind: "unknown" };
20947
+ if (isTransparent) return readOpeningForegroundProjection(header) ?? { kind: "unknown" };
20397
20948
  const background = header?.background;
20398
20949
  return resolveSurfaceForeground(background ?? {
20399
20950
  type: "color",
20400
20951
  color: "surface"
20401
- }, palette, {
20402
- text: header?.textColor ?? background?.textColor,
20403
- link: header?.navLinkStyle?.colorToken ?? header?.navColor ?? header?.textColor
20404
- });
20952
+ }, palette, headerForegroundCandidates(header));
20953
+ }
20954
+ function resolveFooterRootForeground(footer, palette, proseHoverCandidate) {
20955
+ return resolveSurfaceForeground(footer?.background ?? {
20956
+ type: "color",
20957
+ color: "surface"
20958
+ }, palette, footerForegroundCandidates(footer, proseHoverCandidate), { compositeBase: "background" });
20405
20959
  }
20406
20960
  function resolveSurfaceForegroundStyles(value, context, options) {
20407
20961
  const input = parseBackgroundContent(value);
20408
- const foreground = input ? resolveSurfaceForeground(input, context.theme.palette, {}, { compositeBase: options?.fallbackToken }) : { kind: "unknown" };
20962
+ const foreground = input ? resolveSurfaceForeground(input, context.theme.palette, { linkHover: context.proseHoverCandidate }, { compositeBase: options?.fallbackToken }) : { kind: "unknown" };
20409
20963
  const buttonStyles = resolveContextualButtonStyles(input, foreground, context, options);
20410
20964
  if (foreground.kind === "unknown") return buttonStyles;
20411
20965
  return {
20412
20966
  ...buttonStyles,
20413
- ...surfaceForegroundStyle({
20414
- text: resolveBackgroundColorValue(foreground.roles.text, context),
20415
- heading: resolveBackgroundColorValue(foreground.roles.heading, context),
20416
- link: resolveBackgroundColorValue(foreground.roles.link, context),
20417
- supporting: resolveBackgroundColorValue(foreground.roles.supporting, context)
20418
- })
20967
+ ...surfaceForegroundStyle(surfaceForegroundInputFromResolved(foreground, (token) => resolveBackgroundColorValue(token, context)))
20419
20968
  };
20420
20969
  }
20421
20970
  function resolveContextualButtonStyles(background, foreground, context, options) {
@@ -26231,10 +26780,7 @@ function resolveBackgroundVisualStyles(backgroundColor, defaultToken = "surface"
26231
26780
  };
26232
26781
  }
26233
26782
  function resolveHeaderVisualStyles(header) {
26234
- const navContainerType = header?.navContainer?.type ?? "none";
26235
- const hasContainedNav = navContainerType === "glass" || navContainerType === "pill";
26236
- const hasOverlayVariant = header?.variant === "floating";
26237
- if (hasContainedNav || hasOverlayVariant) return {
26783
+ if (headerRootPaint(header) !== "own-surface") return {
26238
26784
  backgroundToken: "transparent",
26239
26785
  isTransparent: true
26240
26786
  };
@@ -26245,23 +26791,7 @@ function resolveHeaderVisualStyles(header) {
26245
26791
  }
26246
26792
  function resolvedForegroundStyle(foreground) {
26247
26793
  if (foreground.kind === "unknown") return void 0;
26248
- const { roles } = foreground;
26249
- return surfaceForegroundStyle({
26250
- text: rgbColorValue(roles.text),
26251
- heading: rgbColorValue(roles.heading),
26252
- link: rgbColorValue(roles.link),
26253
- supporting: rgbColorValue(roles.supporting)
26254
- });
26255
- }
26256
- function resolveFooterRootForeground(footer, palette) {
26257
- const background = footer?.background;
26258
- return resolveSurfaceForeground(background ?? {
26259
- type: "color",
26260
- color: "surface"
26261
- }, palette, {
26262
- text: background?.textColor,
26263
- link: footer?.navLinkStyle?.colorToken ?? footer?.navColor ?? background?.textColor
26264
- });
26794
+ return surfaceForegroundStyle(surfaceForegroundInputFromResolved(foreground, rgbColorValue));
26265
26795
  }
26266
26796
  function footerBottomBarBorderWidthStyle(width) {
26267
26797
  if (!width) return void 0;
@@ -26288,8 +26818,7 @@ const headerRootClassTransform = {
26288
26818
  const placement = planSiteChromePlacement(parseHeaderPositioning(content.positioning));
26289
26819
  const header = asPartialObject(value);
26290
26820
  const visuals = resolveHeaderVisualStyles(header);
26291
- const navContainerType = header?.navContainer?.type ?? "none";
26292
- const hasContainedNav = navContainerType === "glass" || navContainerType === "pill";
26821
+ const hasContainedNav = headerRootPaint(header) === "contained-nav";
26293
26822
  const backgroundClass = visuals.isTransparent || hasContainedNav ? "rb-bg-transparent" : null;
26294
26823
  const classes = [config.base, backgroundClass];
26295
26824
  if (!hasContainedNav) {
@@ -26332,7 +26861,7 @@ const headerRootStyleTransform = {
26332
26861
  run: (value, _options, context) => {
26333
26862
  const header = asPartialObject(value);
26334
26863
  const visuals = resolveHeaderVisualStyles(header);
26335
- return mergeStyles(resolvedForegroundStyle(resolveHeaderRootForeground(header, context.theme.palette, visuals.isTransparent)) ?? { color: rgbColorValue(resolveHeaderLeafTextColor(header)) }, borderColorStyle(header?.border?.colorToken ?? "border"));
26864
+ return mergeStyles(resolvedForegroundStyle(resolveHeaderRootForeground(header, context.theme.palette, visuals.isTransparent)) ?? (visuals.isTransparent ? surfaceForegroundStyle(transparentHeaderForegroundInput(header, context.theme.palette)) : { color: rgbColorValue(headerLeafTextColor(header)) }), borderColorStyle(header?.border?.colorToken ?? "border"));
26336
26865
  }
26337
26866
  };
26338
26867
  const headerSectionBackgroundTransform = {
@@ -26340,9 +26869,7 @@ const headerSectionBackgroundTransform = {
26340
26869
  kind: "string",
26341
26870
  summary: "Resolve the inner site-header section background token",
26342
26871
  run: (value) => {
26343
- const header = asPartialObject(value);
26344
- const navContainerType = header?.navContainer?.type ?? "none";
26345
- return header?.variant === "floating" || navContainerType === "glass" || navContainerType === "pill" ? "raw:transparent" : "background";
26872
+ return headerRootPaint(asPartialObject(value)) !== "own-surface" ? "raw:transparent" : "background";
26346
26873
  }
26347
26874
  };
26348
26875
  const footerRootStyleTransform = {
@@ -26360,7 +26887,7 @@ const footerRootStyleTransform = {
26360
26887
  styleParts.push(backgroundColorStyle(token));
26361
26888
  }
26362
26889
  }
26363
- styleParts.push(resolvedForegroundStyle(resolveFooterRootForeground(footer, context.theme.palette)));
26890
+ styleParts.push(resolvedForegroundStyle(resolveFooterRootForeground(footer, context.theme.palette, context.proseHoverCandidate)));
26364
26891
  styleParts.push(borderColorStyle("border"));
26365
26892
  return mergeStyles(...styleParts);
26366
26893
  }
@@ -26422,22 +26949,28 @@ const footerBottomBarStyleTransform = {
26422
26949
  run: (value, _options, context) => {
26423
26950
  const footer = asPartialObject(value);
26424
26951
  const bottomBar = footer?.bottomBar;
26425
- const styleParts = [];
26426
- const background = bottomBar?.background;
26427
- if (background?.type === "color") styleParts.push(backgroundColorStyle(background.color ?? "surface"));
26428
- styleParts.push(borderColorStyle(bottomBar?.borderTop?.colorToken ?? "border"), footerBottomBarBorderWidthStyle(bottomBar?.borderTop?.width));
26429
- const foreground = resolveSurfaceForeground(background?.type === "color" ? background : {
26430
- type: "color",
26431
- color: "transparent"
26432
- }, context.theme.palette, {
26433
- text: bottomBar?.textColor,
26434
- link: footer?.bottomTextLinkStyle?.colorToken ?? bottomBar?.textColor
26435
- });
26436
- if (background?.type === "color") styleParts.push(resolvedForegroundStyle(foreground));
26437
- else if (bottomBar?.textColor) styleParts.push(textColorStyle(bottomBar.textColor));
26438
- return mergeStyles(...styleParts);
26952
+ return mergeStyles(bottomBar?.background?.type === "color" ? backgroundColorStyle(bottomBar.background.color ?? "surface") : void 0, borderColorStyle(bottomBar?.borderTop?.colorToken ?? "border"), footerBottomBarBorderWidthStyle(bottomBar?.borderTop?.width), footerBottomBarForegroundStyle(footer, context.theme.palette));
26439
26953
  }
26440
26954
  };
26955
+ function footerBottomBarForegroundStyle(footer, palette) {
26956
+ if (!footer?.bottomBar) return void 0;
26957
+ const bar = footer.bottomBar;
26958
+ if (bar.background?.type !== "color") return backgroundlessBottomBarForegroundStyle(footer);
26959
+ return resolvedForegroundStyle(resolveSurfaceForeground(bar.background, palette, {
26960
+ text: bar.textColor,
26961
+ link: footer.bottomTextLinkStyle?.colorToken ?? bar.textColor,
26962
+ linkHover: footer.bottomTextLinkStyle?.hoverColorToken
26963
+ }, { compositeBase: measuredFooterBackdrop(footer, palette) }));
26964
+ }
26965
+ function backgroundlessBottomBarForegroundStyle(footer) {
26966
+ if (footer.background?.contentOwner === "site-chrome-editor") return;
26967
+ const textColor = footer.bottomBar?.textColor;
26968
+ return textColor ? textColorStyle(textColor) : void 0;
26969
+ }
26970
+ function measuredFooterBackdrop(footer, palette) {
26971
+ const foreground = resolveFooterRootForeground(footer, palette);
26972
+ return foreground.kind === "known" && foreground.provenance.kind === "measured" ? foreground.provenance.backdropHex : null;
26973
+ }
26441
26974
  const footerSplitMainClassTransform = {
26442
26975
  id: "layout.footerSplitMainClass",
26443
26976
  kind: "string",
@@ -26533,7 +27066,7 @@ function chromeSurfaceTextToken(surface, theme, palette) {
26533
27066
  case "header-root": {
26534
27067
  const header = theme.header;
26535
27068
  const foreground = resolveHeaderRootForeground(header, palette, resolveHeaderVisualStyles(header).isTransparent);
26536
- return foreground.kind === "known" ? foreground.roles.text : resolveHeaderLeafTextColor(header);
27069
+ return foreground.kind === "known" ? foreground.roles.text : headerLeafTextColor(header);
26537
27070
  }
26538
27071
  case "header-mobile-panel": return theme.header?.dropdownStyle?.textColor ?? "text";
26539
27072
  case "footer-root": {
@@ -28612,7 +29145,9 @@ const bookingWizard = bookingForm(withApiBindings({
28612
29145
  } },
28613
29146
  formId: { $bind: { from: "content.formId" } },
28614
29147
  form: { $bind: { from: "data.form" } },
28615
- services: { $bind: { from: "data.services" } }
29148
+ services: { $bind: { from: "data.services" } },
29149
+ mailingList: { $bind: { from: "$root.mailingList" } },
29150
+ siteName: { $bind: { from: "$root.siteName" } }
28616
29151
  }));
28617
29152
  /** Both variants sit in the same section shell; only the inner layout differs. */
28618
29153
  function bookingSection(children) {
@@ -29528,7 +30063,13 @@ const eventRegistrationHydrationSchemaShape = {
29528
30063
  spamProtectionEnabled: z.boolean().optional(),
29529
30064
  supportEmail: z.string().optional(),
29530
30065
  sitePasses: publicPassProductCollectionSchema.nullable().optional(),
29531
- siteMemberships: publicMembershipProductCollectionSchema.nullable().optional()
30066
+ siteMemberships: publicMembershipProductCollectionSchema.nullable().optional(),
30067
+ mailingList: z.unknown().transform((value) => {
30068
+ if (value === void 0) return void 0;
30069
+ const parsed = parseMailingListRuntimeContext(value);
30070
+ return parsed.ok ? parsed.value : void 0;
30071
+ }),
30072
+ siteName: z.string().optional()
29532
30073
  };
29533
30074
  const eventRegistrationEventSourceSchema = z.discriminatedUnion("kind", [z.object({
29534
30075
  kind: z.literal("loaded"),
@@ -29700,7 +30241,9 @@ const eventRegistrationBlockRuntime = defineClientOwnedBlockRuntime({
29700
30241
  spamProtectionEnabled: source.spamProtectionEnabled,
29701
30242
  supportEmail: source.supportEmail,
29702
30243
  sitePasses: source.sitePasses ?? null,
29703
- siteMemberships: source.siteMemberships ?? null
30244
+ siteMemberships: source.siteMemberships ?? null,
30245
+ mailingList: source.mailingList,
30246
+ siteName: source.siteName
29704
30247
  }
29705
30248
  };
29706
30249
  }
@@ -29868,6 +30411,8 @@ const eventRegistrationBlockDefinition = {
29868
30411
  events: { $bind: { from: "data.events" } },
29869
30412
  wholeSeriesRunEvents: { $bind: { from: "data.wholeSeriesRunEvents" } },
29870
30413
  loaderFailures: { $bind: { from: "$root.loaderFailures" } },
30414
+ mailingList: { $bind: { from: "$root.mailingList" } },
30415
+ siteName: { $bind: { from: "$root.siteName" } },
29871
30416
  sitePasses: { $bind: { from: "data.sitePasses" } },
29872
30417
  siteMemberships: { $bind: { from: "data.siteMemberships" } },
29873
30418
  stage: { $bind: {
@@ -36884,65 +37429,67 @@ const editorialSplitLayout = styledSection({
36884
37429
  spacing: "comfortable",
36885
37430
  background: "surface"
36886
37431
  });
36887
- const newsletterSignupBlockDefinition = {
36888
- manifest: createBlockManifest({
36889
- id: "block.newsletter-signup",
36890
- title: "Newsletter Signup",
36891
- titleSource: "title",
36892
- description: "Newsletter subscription form with configurable field presets.",
36893
- category: "interactive",
36894
- contentSource: { kind: "inline" },
36895
- fragments: [{
36896
- fragment: newsletterCopyFragment,
36897
- fieldPriority: 0
36898
- }, {
36899
- fragment: newsletterFormFragment,
36900
- fieldPriority: 1
36901
- }],
36902
- layout: stackedLayout,
36903
- variants: {
36904
- stacked: stackedLayout,
36905
- inline: inlineLayout,
36906
- "editorial-split": editorialSplitLayout
36907
- },
36908
- defaultVariant: "stacked",
36909
- variantOptions: {
36910
- stacked: {
36911
- label: "Stacked",
36912
- description: "Vertical layout with fields stacked"
36913
- },
36914
- inline: {
36915
- label: "Inline",
36916
- description: "Horizontal layout (email + button side by side)"
36917
- },
36918
- "editorial-split": {
36919
- label: "Editorial split",
36920
- description: "Copy and form in balanced side-by-side columns, stacked on mobile."
36921
- }
36922
- },
36923
- styleTokens: {
36924
- background: "surface",
36925
- typography: "body",
36926
- spacing: "md"
37432
+ const newsletterSignupManifest = createBlockManifest({
37433
+ id: "block.newsletter-signup",
37434
+ title: "Newsletter Signup",
37435
+ titleSource: "title",
37436
+ description: "Newsletter subscription form with configurable field presets.",
37437
+ category: "interactive",
37438
+ contentSource: { kind: "inline" },
37439
+ fragments: [{
37440
+ fragment: newsletterCopyFragment,
37441
+ fieldPriority: 0
37442
+ }, {
37443
+ fragment: newsletterFormFragment,
37444
+ fieldPriority: 1
37445
+ }],
37446
+ layout: stackedLayout,
37447
+ variants: {
37448
+ stacked: stackedLayout,
37449
+ inline: inlineLayout,
37450
+ "editorial-split": editorialSplitLayout
37451
+ },
37452
+ defaultVariant: "stacked",
37453
+ variantOptions: {
37454
+ stacked: {
37455
+ label: "Stacked",
37456
+ description: "Vertical layout with fields stacked"
36927
37457
  },
36928
- behaviours: {
36929
- supportsThemeSwitching: true,
36930
- inlineEditing: false,
36931
- animation: false,
36932
- paletteHidden: false
37458
+ inline: {
37459
+ label: "Inline",
37460
+ description: "Horizontal layout (email + button side by side)"
36933
37461
  },
36934
- tags: [
36935
- "newsletter",
36936
- "signup",
36937
- "email",
36938
- "subscribe",
36939
- "subscription",
36940
- "mailchimp",
36941
- "marketing",
36942
- "lead-capture"
36943
- ],
36944
- icon: "Mail"
36945
- }),
37462
+ "editorial-split": {
37463
+ label: "Editorial split",
37464
+ description: "Copy and form in balanced side-by-side columns, stacked on mobile."
37465
+ }
37466
+ },
37467
+ styleTokens: {
37468
+ background: "surface",
37469
+ typography: "body",
37470
+ spacing: "md"
37471
+ },
37472
+ behaviours: {
37473
+ supportsThemeSwitching: true,
37474
+ inlineEditing: false,
37475
+ animation: false,
37476
+ paletteHidden: false
37477
+ },
37478
+ tags: [
37479
+ "newsletter",
37480
+ "signup",
37481
+ "email",
37482
+ "subscribe",
37483
+ "subscription",
37484
+ "mailchimp",
37485
+ "marketing",
37486
+ "lead-capture"
37487
+ ],
37488
+ icon: "Mail"
37489
+ });
37490
+ [...(newsletterSignupManifest.fields ?? []).map((field) => field.id)];
37491
+ const newsletterSignupBlockDefinition = {
37492
+ manifest: newsletterSignupManifest,
36946
37493
  runtime: newsletterFormBlockRuntime
36947
37494
  };
36948
37495
  //#endregion