@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
@@ -662,17 +662,35 @@ function parseMailingListRuntimeContext(value) {
662
662
  if (!isRecord$13(value)) return invalidRuntimeContext();
663
663
  if (value.tag === "not_configured") return ok({ tag: "not_configured" });
664
664
  if (value.tag !== "configured") return invalidRuntimeContext();
665
+ return parseConfiguredRuntimeContext(value);
666
+ }
667
+ function parseConfiguredRuntimeContext(value) {
665
668
  const revision = parseMailingListSetupRevision(value.revision);
666
669
  const form = parseMailingListGlobalForm(value.form);
667
670
  const provider = parseRuntimeProvider(value.provider);
668
- if (revision === null || !form.ok || provider === null) return invalidRuntimeContext();
671
+ const bookingSignup = parseBookingSignupOffer(value.bookingSignup);
672
+ if (revision === null || !form.ok || provider === null || bookingSignup === null) return invalidRuntimeContext();
669
673
  return ok({
670
674
  tag: "configured",
671
675
  revision,
676
+ bookingSignup,
672
677
  form: form.value,
673
678
  provider
674
679
  });
675
680
  }
681
+ function parseBookingSignupOffer(value) {
682
+ if (value === void 0) return {
683
+ tag: "unavailable",
684
+ reason: "disabled"
685
+ };
686
+ if (!isRecord$13(value)) return null;
687
+ if (value.tag === "offered") return { tag: "offered" };
688
+ if (value.tag === "unavailable" && (value.reason === "disabled" || value.reason === "fields" || value.reason === "destination")) return {
689
+ tag: "unavailable",
690
+ reason: value.reason
691
+ };
692
+ return null;
693
+ }
676
694
  function parseRuntimeProvider(value) {
677
695
  if (!isRecord$13(value)) return null;
678
696
  switch (value.provider) {
@@ -2384,13 +2402,16 @@ const SURFACE_FOREGROUND_CSS_VARS = {
2384
2402
  text: "--rb-surface-text-color",
2385
2403
  heading: "--rb-surface-heading-color",
2386
2404
  link: "--rb-surface-link-color",
2405
+ linkHover: "--rb-surface-link-hover-color",
2387
2406
  supporting: "--rb-surface-supporting-color"
2388
2407
  };
2389
2408
  const DEFAULT_SURFACE_TEXT_COLOR = "rgb(var(--tb-text, 17 24 39))";
2409
+ const DEFAULT_SURFACE_LINK_COLOR = "rgb(var(--tb-primary, var(--tb-text, 17 24 39)))";
2390
2410
  const DEFAULT_ROLE_FALLBACKS = {
2391
2411
  text: DEFAULT_SURFACE_TEXT_COLOR,
2392
2412
  heading: DEFAULT_SURFACE_TEXT_COLOR,
2393
- link: "rgb(var(--tb-primary, var(--tb-text, 17 24 39)))",
2413
+ link: DEFAULT_SURFACE_LINK_COLOR,
2414
+ linkHover: DEFAULT_SURFACE_LINK_COLOR,
2394
2415
  supporting: "rgb(var(--tb-mutedText, 100 116 139))"
2395
2416
  };
2396
2417
  function requireSurfaceColorValue(role, value) {
@@ -2400,10 +2421,12 @@ function requireSurfaceColorValue(role, value) {
2400
2421
  }
2401
2422
  function completeSurfaceForegrounds(input) {
2402
2423
  const text = requireSurfaceColorValue("text", input.text);
2424
+ const link = input.link === void 0 ? text : requireSurfaceColorValue("link", input.link);
2403
2425
  return {
2404
2426
  text,
2405
2427
  heading: input.heading === void 0 ? text : requireSurfaceColorValue("heading", input.heading),
2406
- link: input.link === void 0 ? text : requireSurfaceColorValue("link", input.link),
2428
+ link,
2429
+ linkHover: input.linkHover === void 0 ? link : requireSurfaceColorValue("linkHover", input.linkHover),
2407
2430
  supporting: input.supporting === void 0 ? text : requireSurfaceColorValue("supporting", input.supporting)
2408
2431
  };
2409
2432
  }
@@ -2411,6 +2434,7 @@ function surfaceForegroundValue(role, outsideProviderFallback = DEFAULT_ROLE_FAL
2411
2434
  const roleVariable = SURFACE_FOREGROUND_CSS_VARS[role];
2412
2435
  const fallback = requireSurfaceColorValue("fallback", outsideProviderFallback);
2413
2436
  if (role === "text") return `var(${roleVariable}, ${fallback})`;
2437
+ if (role === "linkHover") return `var(${roleVariable}, ${surfaceForegroundValue("link", fallback)})`;
2414
2438
  return `var(${roleVariable}, var(${SURFACE_FOREGROUND_CSS_VARS.text}, ${fallback}))`;
2415
2439
  }
2416
2440
  function surfaceForegroundValueWithOpacity(role, opacityPercent) {
@@ -2424,9 +2448,25 @@ function surfaceForegroundStyle(input) {
2424
2448
  [SURFACE_FOREGROUND_CSS_VARS.text]: foregrounds.text,
2425
2449
  [SURFACE_FOREGROUND_CSS_VARS.heading]: foregrounds.heading,
2426
2450
  [SURFACE_FOREGROUND_CSS_VARS.link]: foregrounds.link,
2427
- [SURFACE_FOREGROUND_CSS_VARS.supporting]: foregrounds.supporting
2451
+ [SURFACE_FOREGROUND_CSS_VARS.linkHover]: foregrounds.linkHover,
2452
+ [SURFACE_FOREGROUND_CSS_VARS.supporting]: foregrounds.supporting,
2453
+ "--rb-surface-link-hover-decoration": hoverDecoration(input)
2454
+ };
2455
+ }
2456
+ function surfaceForegroundInputFromResolved(foreground, color) {
2457
+ const { roles } = foreground;
2458
+ return {
2459
+ text: color(roles.text),
2460
+ heading: color(roles.heading),
2461
+ link: color(roles.link),
2462
+ linkHover: color(roles.linkHover),
2463
+ supporting: color(roles.supporting),
2464
+ hoverDecoration: foreground.hoverDecoration
2428
2465
  };
2429
2466
  }
2467
+ function hoverDecoration(input) {
2468
+ return input.hoverDecoration ?? "underline";
2469
+ }
2430
2470
  //#endregion
2431
2471
  //#region ../theme-core/src/buttons/constants.ts
2432
2472
  /**
@@ -3283,6 +3323,64 @@ function parseAlpha(source) {
3283
3323
  function isRgbChannel(value) {
3284
3324
  return Number.isFinite(value) && value >= 0 && value <= 255;
3285
3325
  }
3326
+ /**
3327
+ * Derive the hover foreground that belongs with a resolved resting foreground.
3328
+ *
3329
+ * A resting foreground is chosen to be legible against a known surface. A hover
3330
+ * state derived from it stays within a bounded distance of that colour, so it
3331
+ * inherits most of the resting colour's contrast margin instead of asserting
3332
+ * an unrelated brand colour that no one checked against the surface.
3333
+ *
3334
+ * That bounded-distance property is what lets this be used on a transparent
3335
+ * overlay header, where the backdrop is only partly knowable: the scrolled
3336
+ * state composites a 60% glass tint over arbitrary page content, so no
3337
+ * compile-time contrast proof is available there. Staying near a colour that
3338
+ * is already trusted in both states is a weaker claim than a contrast proof,
3339
+ * and it is one this function can actually keep.
3340
+ *
3341
+ * Returns `null` when the resting token is not a plain palette token — an
3342
+ * already-faded or raw value has no well-defined softening, and the caller
3343
+ * should leave hover alone rather than guess.
3344
+ */
3345
+ function deriveForegroundHoverToken(restingToken) {
3346
+ const parts = parseColorTokenParts(restingToken);
3347
+ if (parts.kind !== "token") return null;
3348
+ if (parts.opacityPercent !== null) return null;
3349
+ return parseThemeColorToken(`${parts.token}/85`);
3350
+ }
3351
+ /**
3352
+ * Prefer an authored hover that survives every measured backdrop, then a
3353
+ * checked softening of the resting colour. A null backdrop set represents a
3354
+ * trusted treatment: only an explicit authored hover may change the colour.
3355
+ * When neither option works, retain the resting colour and underline it.
3356
+ */
3357
+ function planForegroundHover(input) {
3358
+ const { restingToken, candidate, palette, backdrops } = input;
3359
+ if (candidate && candidate !== restingToken) {
3360
+ if (backdrops === null || survivesEveryBackdrop(candidate, palette, backdrops)) return {
3361
+ kind: "candidate",
3362
+ token: candidate,
3363
+ decoration: "initial"
3364
+ };
3365
+ }
3366
+ const softened = deriveForegroundHoverToken(restingToken);
3367
+ if (softened && backdrops && survivesEveryBackdrop(softened, palette, backdrops)) return {
3368
+ kind: "softened",
3369
+ token: softened,
3370
+ decoration: "initial"
3371
+ };
3372
+ return {
3373
+ kind: "resting",
3374
+ token: restingToken,
3375
+ decoration: "underline"
3376
+ };
3377
+ }
3378
+ function survivesEveryBackdrop(token, palette, backdrops) {
3379
+ return backdrops.length > 0 && backdrops.every((backdrop) => {
3380
+ const foreground = resolveOpaqueSurfaceHex(token, palette, backdrop);
3381
+ return foreground !== null && contrastRatio(foreground, backdrop) >= 4.5;
3382
+ });
3383
+ }
3286
3384
  //#endregion
3287
3385
  //#region ../theme-core/src/surfaces/resolveSurfaceForeground.ts
3288
3386
  const FALLBACK_TEXT_TOKENS = [
@@ -3329,12 +3427,16 @@ function resolveSurfaceForeground(background, palette, candidates = {}, options
3329
3427
  }
3330
3428
  function foregroundCandidates(background, overrides) {
3331
3429
  return {
3332
- text: overrides.text ?? background?.textColor ?? null,
3333
- heading: overrides.heading ?? background?.headingColor ?? null,
3334
- link: overrides.link ?? background?.linkColor ?? null,
3335
- supporting: overrides.supporting ?? background?.supportingColor ?? null
3430
+ text: candidateOrBackground(overrides.text, background?.textColor),
3431
+ heading: candidateOrBackground(overrides.heading, background?.headingColor),
3432
+ link: candidateOrBackground(overrides.link, background?.linkColor),
3433
+ linkHover: candidateOrBackground(overrides.linkHover),
3434
+ supporting: candidateOrBackground(overrides.supporting, background?.supportingColor)
3336
3435
  };
3337
3436
  }
3437
+ function candidateOrBackground(candidate, backgroundValue) {
3438
+ return candidate ?? backgroundValue ?? null;
3439
+ }
3338
3440
  function resolveDeterministicForeground(backgroundReference, candidates, palette, compositeBase) {
3339
3441
  const backgroundHex = resolveOpaqueSurfaceHex(backgroundReference, palette, compositeBase);
3340
3442
  if (!backgroundHex) return resolveTrustedTreatmentForeground(candidates, palette);
@@ -3346,29 +3448,51 @@ function resolveDeterministicForeground(backgroundReference, candidates, palette
3346
3448
  ...FALLBACK_TEXT_TOKENS
3347
3449
  ], backgroundHex, palette, derivedOnToken ? [derivedOnToken] : []);
3348
3450
  if (!text) return { kind: "unknown" };
3349
- return {
3350
- kind: "known",
3351
- roles: {
3352
- text,
3353
- heading: safeTokenOr(candidates.heading, text, backgroundHex, palette),
3354
- link: safeTokenOr(candidates.link, text, backgroundHex, palette),
3355
- supporting: safeTokenOr(candidates.supporting, text, backgroundHex, palette)
3356
- }
3357
- };
3451
+ return knownForeground({
3452
+ text,
3453
+ heading: safeTokenOr(candidates.heading, text, backgroundHex, palette),
3454
+ link: safeTokenOr(candidates.link, text, backgroundHex, palette),
3455
+ supporting: safeTokenOr(candidates.supporting, text, backgroundHex, palette)
3456
+ }, {
3457
+ kind: "measured",
3458
+ backdropHex: backgroundHex
3459
+ }, candidates.linkHover, palette);
3358
3460
  }
3359
3461
  function resolveTrustedTreatmentForeground(candidates, palette) {
3360
3462
  const text = canonicalToken(candidates.text, palette);
3361
3463
  if (!text) return { kind: "unknown" };
3464
+ return knownForeground({
3465
+ text,
3466
+ heading: canonicalToken(candidates.heading, palette) ?? text,
3467
+ link: canonicalToken(candidates.link, palette) ?? text,
3468
+ supporting: canonicalToken(candidates.supporting, palette) ?? text
3469
+ }, { kind: "trusted-treatment" }, candidates.linkHover, palette);
3470
+ }
3471
+ function knownForeground(roles, provenance, hoverCandidate, palette) {
3472
+ const hover = planForegroundHover({
3473
+ restingToken: roles.link,
3474
+ candidate: canonicalHoverToken(hoverCandidate, palette),
3475
+ palette,
3476
+ backdrops: provenance.kind === "measured" ? [provenance.backdropHex] : null
3477
+ });
3362
3478
  return {
3363
3479
  kind: "known",
3480
+ provenance,
3364
3481
  roles: {
3365
- text,
3366
- heading: canonicalToken(candidates.heading, palette) ?? text,
3367
- link: canonicalToken(candidates.link, palette) ?? text,
3368
- supporting: canonicalToken(candidates.supporting, palette) ?? text
3369
- }
3482
+ ...roles,
3483
+ linkHover: hover.token
3484
+ },
3485
+ hoverDecoration: hover.decoration
3370
3486
  };
3371
3487
  }
3488
+ function canonicalHoverToken(reference, palette) {
3489
+ const token = parseThemeColorToken(reference);
3490
+ if (token) {
3491
+ const parts = parseColorTokenParts(token);
3492
+ if (parts.kind === "token" && resolveConcreteColorHex(parts.token, palette)) return token;
3493
+ }
3494
+ return canonicalToken(reference, palette);
3495
+ }
3372
3496
  function safeTokenOr(candidate, fallback, backgroundHex, palette) {
3373
3497
  return firstSafeToken([candidate], backgroundHex, palette) ?? fallback;
3374
3498
  }
@@ -6307,6 +6431,43 @@ const effectCompositionSchema = z.object({
6307
6431
  /** Effects applied on focus */
6308
6432
  focus: z.array(effectApplicationSchema).optional()
6309
6433
  });
6434
+ const policiesById = {
6435
+ "darken-background": "other",
6436
+ "lighten-background": "other",
6437
+ "fade-background": "other",
6438
+ "opacity-reduce": "other",
6439
+ "animated-gradient": "other",
6440
+ "background-on-hover": "paired-hover",
6441
+ "background-on-hover-alpha": "paired-hover",
6442
+ "border-glow": "other",
6443
+ "drop-shadow": "other",
6444
+ "inner-shadow": "other",
6445
+ "neumorphic-shadow": "other",
6446
+ "outer-glow": "other",
6447
+ "retro-3d-shadow": "other",
6448
+ "scale-up": "other",
6449
+ "scale-down": "other",
6450
+ lift: "other",
6451
+ "press-down": "other",
6452
+ pop: "other",
6453
+ "aurora-glow": "other",
6454
+ "cosmic-stardust": "other",
6455
+ "gradient-border-fill": "other",
6456
+ "animated-gradient-border-fill": "other",
6457
+ "border-bottom-grow": "other",
6458
+ "gradient-text": "other",
6459
+ "text-color-change": "text-colour",
6460
+ "border-color-change": "other",
6461
+ "sketchy-border": "other",
6462
+ "pulse-animation": "other",
6463
+ "nav-underline": "underline",
6464
+ "nav-frosted-base": "other",
6465
+ "nav-frosted-hover": "other",
6466
+ "nav-frosted-active": "other"
6467
+ };
6468
+ function navEffectPolicy(effectId) {
6469
+ return policiesById[effectId] ?? null;
6470
+ }
6310
6471
  //#endregion
6311
6472
  //#region ../theme-core/src/navigation/types.ts
6312
6473
  /**
@@ -6395,6 +6556,16 @@ const navLinkStyleSchema = z.object({
6395
6556
  /** Composable effects */
6396
6557
  effects: effectCompositionSchema.optional()
6397
6558
  });
6559
+ function navLinkHoverColorCandidate(style) {
6560
+ const effect = style?.effects?.hover?.find((item) => navEffectPolicy(item.effectId) === "text-colour");
6561
+ return parseThemeColorToken(effect?.options?.hoverColorToken ?? style?.hoverColorToken);
6562
+ }
6563
+ function navLinkOwnsHoverForeground(style) {
6564
+ return style?.effects?.hover?.some((effect) => navEffectPolicy(effect.effectId) === "paired-hover") ?? false;
6565
+ }
6566
+ function navLinkOwnsUnderline(style) {
6567
+ return style?.effects?.hover?.some((effect) => navEffectPolicy(effect.effectId) === "underline") ?? false;
6568
+ }
6398
6569
  //#endregion
6399
6570
  //#region ../theme-core/src/customCss/validation.ts
6400
6571
  /**
@@ -8563,6 +8734,64 @@ function defineEndpointDefinitions(definitions) {
8563
8734
  return definitions;
8564
8735
  }
8565
8736
  //#endregion
8737
+ //#region ../api/src/apiEndpointTypes.ts
8738
+ function allowedDemoMutationPolicy() {
8739
+ return {
8740
+ classification: "allowed",
8741
+ publicMessage: ""
8742
+ };
8743
+ }
8744
+ function blockedDemoMutationPolicy(classification, publicMessage) {
8745
+ if (publicMessage.trim() === "") throw new Error(`Demo mutation policy ${classification} requires publicMessage.`);
8746
+ return {
8747
+ classification,
8748
+ publicMessage
8749
+ };
8750
+ }
8751
+ //#endregion
8752
+ //#region ../api/src/demoMutationPolicies.ts
8753
+ const DEMO_MUTATION_BLOCKED_HIDDEN = blockedDemoMutationPolicy("blocked-hidden", "This action is not available in demo sites.");
8754
+ const DEMO_MUTATION_BLOCKED_DISABLED = blockedDemoMutationPolicy("blocked-disabled", "This setting is disabled in demo sites.");
8755
+ blockedDemoMutationPolicy("internal-only", "This internal operation is not available in demo sites.");
8756
+ const DEMO_MUTATION_ALLOWED = allowedDemoMutationPolicy();
8757
+ //#endregion
8758
+ //#region ../api/src/siteLifecycleEndpoints.ts
8759
+ const SITE_LIFECYCLE_ENDPOINT_DEFINITIONS = defineEndpointDefinitions({
8760
+ createSite: {
8761
+ path: "/sites/manage",
8762
+ method: "POST",
8763
+ tags: ["site"],
8764
+ auth: "user",
8765
+ responseKind: "json",
8766
+ errors: []
8767
+ },
8768
+ createSiteManual: {
8769
+ path: "/sites/manual",
8770
+ method: "POST",
8771
+ tags: ["site"],
8772
+ auth: "user",
8773
+ responseKind: "json",
8774
+ errors: []
8775
+ },
8776
+ updateSite: {
8777
+ path: "/sites/manage",
8778
+ method: "PUT",
8779
+ tags: ["site"],
8780
+ auth: "user",
8781
+ responseKind: "json",
8782
+ errors: []
8783
+ },
8784
+ deleteSite: {
8785
+ path: "/sites/{siteId}",
8786
+ method: "DELETE",
8787
+ tags: ["site", "site-{siteId}"],
8788
+ auth: "user",
8789
+ responseKind: "json",
8790
+ errors: [],
8791
+ demoMutation: DEMO_MUTATION_BLOCKED_HIDDEN
8792
+ }
8793
+ });
8794
+ //#endregion
8566
8795
  //#region ../api/src/publicNewsletterEndpointDefinitions.ts
8567
8796
  const PUBLIC_NEWSLETTER_ENDPOINT_DEFINITIONS = defineEndpointDefinitions({
8568
8797
  subscribeNewsletter: {
@@ -8623,27 +8852,6 @@ const PUBLIC_NEWSLETTER_ENDPOINT_DEFINITIONS = defineEndpointDefinitions({
8623
8852
  }
8624
8853
  });
8625
8854
  //#endregion
8626
- //#region ../api/src/apiEndpointTypes.ts
8627
- function allowedDemoMutationPolicy() {
8628
- return {
8629
- classification: "allowed",
8630
- publicMessage: ""
8631
- };
8632
- }
8633
- function blockedDemoMutationPolicy(classification, publicMessage) {
8634
- if (publicMessage.trim() === "") throw new Error(`Demo mutation policy ${classification} requires publicMessage.`);
8635
- return {
8636
- classification,
8637
- publicMessage
8638
- };
8639
- }
8640
- //#endregion
8641
- //#region ../api/src/demoMutationPolicies.ts
8642
- const DEMO_MUTATION_BLOCKED_HIDDEN = blockedDemoMutationPolicy("blocked-hidden", "This action is not available in demo sites.");
8643
- const DEMO_MUTATION_BLOCKED_DISABLED = blockedDemoMutationPolicy("blocked-disabled", "This setting is disabled in demo sites.");
8644
- blockedDemoMutationPolicy("internal-only", "This internal operation is not available in demo sites.");
8645
- const DEMO_MUTATION_ALLOWED = allowedDemoMutationPolicy();
8646
- //#endregion
8647
8855
  //#region ../api/src/cache-tags.ts
8648
8856
  /**
8649
8857
  * Tag templates for endpoint definitions (support `{param}` placeholders).
@@ -9670,6 +9878,20 @@ const NEWSLETTER_ENDPOINT_DEFINITIONS = defineEndpointDefinitions({
9670
9878
  responseKind: "json",
9671
9879
  errors: ["auth:forbidden", "server:internal_error"]
9672
9880
  },
9881
+ setMailingListBookingOptIn: {
9882
+ path: "/sites/{siteId}/mailing-list/setup/booking-opt-in",
9883
+ method: "PUT",
9884
+ tags: [TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter],
9885
+ auth: "user",
9886
+ responseKind: "json",
9887
+ demoMutation: DEMO_MUTATION_BLOCKED_DISABLED,
9888
+ errors: [
9889
+ "auth:forbidden",
9890
+ "validation:invalid_input",
9891
+ "resource:conflict",
9892
+ "server:internal_error"
9893
+ ]
9894
+ },
9673
9895
  getMailingListAuthoringContext: {
9674
9896
  path: "/sites/{siteId}/mailing-list/authoring-context",
9675
9897
  method: "GET",
@@ -10994,6 +11216,54 @@ const BILLING_ENDPOINT_DEFINITIONS = defineEndpointDefinitions({
10994
11216
  }
10995
11217
  });
10996
11218
  //#endregion
11219
+ //#region ../api/src/bookingPeopleEndpointDefinitions.ts
11220
+ /**
11221
+ * People endpoints (#1356): the People list, its CSV export, and deleting a
11222
+ * person when nothing is attached to them.
11223
+ */
11224
+ const BOOKING_PEOPLE_ENDPOINT_DEFINITIONS = defineEndpointDefinitions({
11225
+ listPeople: {
11226
+ path: "/sites/{siteId}/bookings/people",
11227
+ method: "GET",
11228
+ tags: ["site-{siteId}", "customers-{siteId}"],
11229
+ auth: "user",
11230
+ responseKind: "json",
11231
+ errors: ["server:internal_error"]
11232
+ },
11233
+ exportPeopleCsv: {
11234
+ path: "/sites/{siteId}/bookings/people/export.csv",
11235
+ method: "GET",
11236
+ tags: ["site-{siteId}", "customers-{siteId}"],
11237
+ auth: "user",
11238
+ errors: [],
11239
+ responseKind: "blob"
11240
+ },
11241
+ checkPersonDeletion: {
11242
+ path: "/sites/{siteId}/bookings/people/{personId}/deletion-check",
11243
+ method: "GET",
11244
+ tags: ["site-{siteId}", "customers-{siteId}"],
11245
+ auth: "user",
11246
+ responseKind: "json",
11247
+ errors: [
11248
+ "auth:forbidden",
11249
+ "resource:not_found",
11250
+ "server:internal_error"
11251
+ ]
11252
+ },
11253
+ deletePerson: {
11254
+ path: "/sites/{siteId}/bookings/people/{personId}",
11255
+ method: "DELETE",
11256
+ tags: ["site-{siteId}", "customers-{siteId}"],
11257
+ auth: "user",
11258
+ responseKind: "json",
11259
+ errors: [
11260
+ "auth:forbidden",
11261
+ "resource:not_found",
11262
+ "server:internal_error"
11263
+ ]
11264
+ }
11265
+ });
11266
+ //#endregion
10997
11267
  //#region ../api/src/clientErrorReporting.ts
10998
11268
  const CLIENT_ERROR_REPORT_ENDPOINT_DEFINITIONS = defineEndpointDefinitions({ reportClientError: {
10999
11269
  path: "/client/error-report",
@@ -11029,6 +11299,7 @@ z.object({
11029
11299
  sourceLocation: z.string().max(CLIENT_ERROR_REPORT_LIMITS.sourceLocation).nullable()
11030
11300
  }).strict();
11031
11301
  ({
11302
+ ...SITE_LIFECYCLE_ENDPOINT_DEFINITIONS,
11032
11303
  ...CLIENT_ERROR_REPORT_ENDPOINT_DEFINITIONS,
11033
11304
  ...PUBLIC_NEWSLETTER_ENDPOINT_DEFINITIONS,
11034
11305
  ...ACCOUNT_ENDPOINT_DEFINITIONS,
@@ -11042,7 +11313,7 @@ z.object({
11042
11313
  ...NEWSLETTER_ENDPOINT_DEFINITIONS,
11043
11314
  ...APPOINTMENT_ENDPOINT_DEFINITIONS,
11044
11315
  ...EVENT_SERIES_REGISTRATION_ENDPOINT_DEFINITIONS
11045
- }, 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 };
11316
+ }, 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 };
11046
11317
  z.object({ refreshToken: z.string().min(1).max(4096) }).strict();
11047
11318
  z.object({
11048
11319
  accessToken: z.string().min(1).max(4096),
@@ -11273,7 +11544,11 @@ z.discriminatedUnion("kind", navigationLinkInputSchemaOptions);
11273
11544
  /** Pair a published version with the content it authorises at the render boundary. */
11274
11545
  function readPublishedBlockPlacement(id, content) {
11275
11546
  if (id == null && content == null) return null;
11276
- if (id == null || content == null) throw new Error("Published block placement requires both an ID and content");
11547
+ if (id == null || content == null) return {
11548
+ kind: "incomplete",
11549
+ id: id ?? null,
11550
+ content: content ?? null
11551
+ };
11277
11552
  return {
11278
11553
  id,
11279
11554
  content
@@ -17342,6 +17617,14 @@ const blockDesignFallback = {
17342
17617
  };
17343
17618
  blockDesignFallback.sectionSurface, blockDesignFallback.contentFrame, blockDesignFallback.sectionHeight, blockDesignFallback.heroLegibility, blockDesignFallback.imageSurfaceTreatment, blockDesignFallback.imageSurfaceMotion, blockDesignFallback.tileTreatment, blockDesignFallback.eventListTreatment, blockDesignFallback.eyebrowTreatment, blockDesignFallback.accordionIconTreatment, blockDesignFallback.composition;
17344
17619
  //#endregion
17620
+ //#region ../theme-core/src/header/rootPaint.ts
17621
+ /** The nav container takes precedence when a floating header also has one. */
17622
+ function headerRootPaint(header) {
17623
+ const navContainerType = header?.navContainer?.type ?? "none";
17624
+ if (navContainerType === "glass" || navContainerType === "pill") return "contained-nav";
17625
+ return header?.variant === "floating" ? "overlay" : "own-surface";
17626
+ }
17627
+ //#endregion
17345
17628
  //#region ../theme-core/src/site-styles/siteChromeBackgrounds.ts
17346
17629
  const siteChromeBackgroundColorTokens = toSiteChromeBackgroundColorTokens(backgroundAppearanceColorTokenNames);
17347
17630
  const quickSiteChromeBackgroundColorTokens = toSiteChromeBackgroundColorTokens(backgroundAppearanceQuickColorTokenNames);
@@ -17521,6 +17804,259 @@ z.object(headerPreferencesShape).omit({
17521
17804
  structure: true
17522
17805
  }).strict();
17523
17806
  //#endregion
17807
+ //#region ../theme-core/src/navigation/presets.ts
17808
+ /**
17809
+ * Built-in nav link style presets
17810
+ *
17811
+ * Each preset uses composable effects to achieve its look.
17812
+ */
17813
+ const NAV_LINK_PRESETS = {
17814
+ /**
17815
+ * Minimal - subtle color change on hover
17816
+ */
17817
+ minimal: {
17818
+ name: "Minimal",
17819
+ typography: "body",
17820
+ fontWeight: "medium",
17821
+ textTransform: "none",
17822
+ italic: false,
17823
+ colorToken: "text",
17824
+ hoverColorToken: "primary",
17825
+ padding: "none",
17826
+ borderRadius: "none",
17827
+ effects: { hover: [{
17828
+ effectId: "text-color-change",
17829
+ options: { hoverColorToken: "primary" }
17830
+ }] }
17831
+ },
17832
+ /**
17833
+ * Underline - static underline appears on hover
17834
+ */
17835
+ underline: {
17836
+ name: "Underline",
17837
+ typography: "body",
17838
+ fontWeight: "medium",
17839
+ textTransform: "none",
17840
+ italic: false,
17841
+ colorToken: "text",
17842
+ padding: "none",
17843
+ borderRadius: "none",
17844
+ effects: { hover: [{
17845
+ effectId: "nav-underline",
17846
+ options: { style: "static" }
17847
+ }] }
17848
+ },
17849
+ /**
17850
+ * Underline Grow - animated underline grows from center on hover
17851
+ */
17852
+ "underline-grow": {
17853
+ name: "Underline Grow",
17854
+ typography: "body",
17855
+ fontWeight: "medium",
17856
+ textTransform: "none",
17857
+ italic: false,
17858
+ colorToken: "text",
17859
+ padding: "none",
17860
+ borderRadius: "none",
17861
+ effects: { hover: [{
17862
+ effectId: "nav-underline",
17863
+ options: { style: "grow" }
17864
+ }] }
17865
+ },
17866
+ /**
17867
+ * Capsule - pill-shaped background on hover
17868
+ */
17869
+ capsule: {
17870
+ name: "Capsule",
17871
+ typography: "body",
17872
+ fontWeight: "medium",
17873
+ textTransform: "none",
17874
+ italic: false,
17875
+ colorToken: "text",
17876
+ padding: "compact",
17877
+ borderRadius: "full",
17878
+ effects: {
17879
+ hover: [{
17880
+ effectId: "background-on-hover-alpha",
17881
+ options: {
17882
+ colorToken: "primary",
17883
+ opacity: 10
17884
+ }
17885
+ }],
17886
+ active: [{
17887
+ effectId: "background-on-hover-alpha",
17888
+ options: {
17889
+ colorToken: "primary",
17890
+ opacity: 15
17891
+ }
17892
+ }]
17893
+ }
17894
+ },
17895
+ /**
17896
+ * Solid - solid background color on hover
17897
+ */
17898
+ solid: {
17899
+ name: "Solid",
17900
+ typography: "body",
17901
+ fontWeight: "medium",
17902
+ textTransform: "none",
17903
+ italic: false,
17904
+ colorToken: "text",
17905
+ padding: "compact",
17906
+ borderRadius: "none",
17907
+ effects: {
17908
+ hover: [{
17909
+ effectId: "background-on-hover",
17910
+ options: {
17911
+ colorToken: "primary",
17912
+ textColorToken: "primaryForeground"
17913
+ }
17914
+ }],
17915
+ active: [{
17916
+ effectId: "background-on-hover",
17917
+ options: {
17918
+ colorToken: "primary",
17919
+ textColorToken: "primaryForeground"
17920
+ }
17921
+ }]
17922
+ }
17923
+ },
17924
+ /**
17925
+ * Scale - gentle scale-up on hover
17926
+ */
17927
+ scale: {
17928
+ name: "Scale",
17929
+ typography: "body",
17930
+ fontWeight: "medium",
17931
+ textTransform: "none",
17932
+ italic: false,
17933
+ colorToken: "text",
17934
+ padding: "none",
17935
+ borderRadius: "none",
17936
+ effects: { hover: [{
17937
+ effectId: "scale-up",
17938
+ options: { scale: 1.05 }
17939
+ }] }
17940
+ },
17941
+ /**
17942
+ * Frosted - semi-transparent glass-like background
17943
+ */
17944
+ frosted: {
17945
+ name: "Frosted",
17946
+ typography: "body",
17947
+ fontWeight: "medium",
17948
+ textTransform: "none",
17949
+ italic: false,
17950
+ colorToken: "text",
17951
+ padding: "compact",
17952
+ borderRadius: "md",
17953
+ effects: {
17954
+ base: [{ effectId: "nav-frosted-base" }],
17955
+ hover: [{ effectId: "nav-frosted-hover" }],
17956
+ active: [{ effectId: "nav-frosted-active" }]
17957
+ }
17958
+ }
17959
+ };
17960
+ /**
17961
+ * Get a nav link style preset by ID
17962
+ */
17963
+ function getNavLinkPreset(presetId) {
17964
+ return NAV_LINK_PRESETS[presetId];
17965
+ }
17966
+ Object.keys(NAV_LINK_PRESETS);
17967
+ //#endregion
17968
+ //#region ../theme-core/src/header/legacyNavLinkStyle.ts
17969
+ function buildLegacyHeaderNavLinkStyle(header, contrastTreatment, navTextSize) {
17970
+ const navStyle = header.navStyle ?? "minimal";
17971
+ const basePreset = getNavLinkPreset(navStyle);
17972
+ if (!basePreset) return null;
17973
+ const style = {
17974
+ ...basePreset,
17975
+ fontWeight: header.navWeight ?? basePreset.fontWeight,
17976
+ colorToken: (header.navColor ?? header.textColor)?.trim() || basePreset.colorToken,
17977
+ ...contrastTreatment ? { contrastTreatment } : {},
17978
+ ...navTextSize ? { textSize: navTextSize } : {}
17979
+ };
17980
+ if (header.navWeight === "bold" && navStyle === "solid") style.textTransform = "uppercase";
17981
+ applyLegacyGlassTreatment(style, header, navStyle);
17982
+ return style;
17983
+ }
17984
+ function applyLegacyGlassTreatment(style, header, navStyle) {
17985
+ if (header.navContainer?.type !== "glass" || navStyle !== "minimal") return;
17986
+ style.borderRadius = "full";
17987
+ style.effects = {
17988
+ ...style.effects,
17989
+ hover: glassStateEffects(10),
17990
+ active: glassStateEffects(18)
17991
+ };
17992
+ }
17993
+ function glassStateEffects(opacity) {
17994
+ return [{
17995
+ effectId: "background-on-hover-alpha",
17996
+ options: {
17997
+ colorToken: "neutral-50",
17998
+ opacity
17999
+ }
18000
+ }, {
18001
+ effectId: "text-color-change",
18002
+ options: { hoverColorToken: "neutral-50" }
18003
+ }];
18004
+ }
18005
+ //#endregion
18006
+ //#region ../theme-core/src/header/openingForegroundProjection.ts
18007
+ function readOpeningForegroundProjection(header) {
18008
+ return header?.__runtimeOpeningForeground ?? null;
18009
+ }
18010
+ //#endregion
18011
+ //#region ../theme-core/src/header/effectiveNavLinkStyle.ts
18012
+ function effectiveHeaderNavLinkStyle(header, contrastTreatment = null, navTextSize = null) {
18013
+ if (!header) return null;
18014
+ if (!header.navLinkStyle) return buildLegacyHeaderNavLinkStyle(header, contrastTreatment, navTextSize);
18015
+ return {
18016
+ ...header.navLinkStyle,
18017
+ ...contrastTreatment ? { contrastTreatment } : {},
18018
+ ...navTextSize ? { textSize: navTextSize } : {}
18019
+ };
18020
+ }
18021
+ function headerForegroundCandidates(header) {
18022
+ if (!header) return {};
18023
+ const style = effectiveHeaderNavLinkStyle(header);
18024
+ return {
18025
+ text: header.textColor ?? header.background?.textColor,
18026
+ link: style?.colorToken ?? header.navColor ?? header.textColor,
18027
+ linkHover: navLinkHoverColorCandidate(style)
18028
+ };
18029
+ }
18030
+ function headerLeafTextColor(header) {
18031
+ if (!header) return "text";
18032
+ return header.textColor ?? header.navColor ?? header.background?.textColor ?? header.navLinkStyle?.colorToken ?? "text";
18033
+ }
18034
+ /** Transparent chrome must reset the whole contract on its own root. */
18035
+ function transparentHeaderForegroundInput(header, palette) {
18036
+ const projection = readOpeningForegroundProjection(header);
18037
+ if (projection?.kind === "known") return surfaceForegroundInputFromResolved(projection, rgbColorValue);
18038
+ return authoredTransparentHeaderForegroundInput(header, palette);
18039
+ }
18040
+ function authoredTransparentHeaderForegroundInput(header, palette) {
18041
+ const text = headerLeafTextColor(header);
18042
+ const style = effectiveHeaderNavLinkStyle(header);
18043
+ const link = style?.colorToken ?? text;
18044
+ const restingToken = parseThemeColorToken(link) ?? parseThemeColorToken("text");
18045
+ if (!restingToken) throw new Error("Built-in text colour token is invalid");
18046
+ const hover = planForegroundHover({
18047
+ restingToken,
18048
+ candidate: navLinkOwnsHoverForeground(style) ? null : navLinkHoverColorCandidate(style),
18049
+ palette,
18050
+ backdrops: null
18051
+ });
18052
+ return {
18053
+ text: rgbColorValue(text),
18054
+ link: rgbColorValue(link),
18055
+ linkHover: rgbColorValue(hover.token),
18056
+ hoverDecoration: navLinkOwnsUnderline(style) ? "initial" : hover.decoration
18057
+ };
18058
+ }
18059
+ //#endregion
17524
18060
  //#region ../theme-core/src/site-styles/pageDesignAuthority.ts
17525
18061
  const nonEmptyStringSchema = z.string().min(1);
17526
18062
  const blockContentVersionIdSchema = nonEmptyStringSchema.transform(asBlockContentVersionId);
@@ -17673,6 +18209,28 @@ z.object({
17673
18209
  motion: z.enum(themeTokenRecipeOptions.motion)
17674
18210
  });
17675
18211
  //#endregion
18212
+ //#region ../theme-core/src/footer/effectiveNavLinkStyle.ts
18213
+ function effectiveFooterNavLinkStyle(footer) {
18214
+ if (!footer) return null;
18215
+ if (footer.navLinkStyle) return footer.navLinkStyle;
18216
+ const basePreset = getNavLinkPreset(footer.navStyle ?? "minimal");
18217
+ if (!basePreset) return null;
18218
+ return {
18219
+ ...basePreset,
18220
+ fontWeight: footer.navWeight ?? basePreset.fontWeight,
18221
+ colorToken: footer.navColor?.trim() || basePreset.colorToken
18222
+ };
18223
+ }
18224
+ function footerForegroundCandidates(footer, proseHoverCandidate) {
18225
+ if (!footer) return {};
18226
+ const style = effectiveFooterNavLinkStyle(footer);
18227
+ return {
18228
+ text: footer.background?.textColor,
18229
+ link: style?.colorToken ?? footer.navColor ?? footer.background?.textColor,
18230
+ linkHover: navLinkOwnsHoverForeground(style) ? proseHoverCandidate : navLinkHoverColorCandidate(style)
18231
+ };
18232
+ }
18233
+ //#endregion
17676
18234
  //#region ../theme-core/src/siteChromeOverlayClearance.ts
17677
18235
  const SITE_CHROME_VISIBLE_HEADER_ATTR = "data-site-chrome-visible-header";
17678
18236
  //#endregion
@@ -22265,33 +22823,28 @@ function resolveBackgroundColorValue(value, context) {
22265
22823
  //#endregion
22266
22824
  //#region ../blocks/src/system/transforms/registry/_utils/surfaceForegroundStyles.ts
22267
22825
  const contextualButtonStylesCache = /* @__PURE__ */ new WeakMap();
22268
- function resolveHeaderLeafTextColor(header) {
22269
- return header?.textColor ?? header?.navColor ?? header?.background?.textColor ?? header?.navLinkStyle?.colorToken ?? "text";
22270
- }
22271
22826
  function resolveHeaderRootForeground(header, palette, isTransparent) {
22272
- if (isTransparent) return { kind: "unknown" };
22827
+ if (isTransparent) return readOpeningForegroundProjection(header) ?? { kind: "unknown" };
22273
22828
  const background = header?.background;
22274
22829
  return resolveSurfaceForeground(background ?? {
22275
22830
  type: "color",
22276
22831
  color: "surface"
22277
- }, palette, {
22278
- text: header?.textColor ?? background?.textColor,
22279
- link: header?.navLinkStyle?.colorToken ?? header?.navColor ?? header?.textColor
22280
- });
22832
+ }, palette, headerForegroundCandidates(header));
22833
+ }
22834
+ function resolveFooterRootForeground(footer, palette, proseHoverCandidate) {
22835
+ return resolveSurfaceForeground(footer?.background ?? {
22836
+ type: "color",
22837
+ color: "surface"
22838
+ }, palette, footerForegroundCandidates(footer, proseHoverCandidate), { compositeBase: "background" });
22281
22839
  }
22282
22840
  function resolveSurfaceForegroundStyles(value, context, options) {
22283
22841
  const input = parseBackgroundContent(value);
22284
- const foreground = input ? resolveSurfaceForeground(input, context.theme.palette, {}, { compositeBase: options?.fallbackToken }) : { kind: "unknown" };
22842
+ const foreground = input ? resolveSurfaceForeground(input, context.theme.palette, { linkHover: context.proseHoverCandidate }, { compositeBase: options?.fallbackToken }) : { kind: "unknown" };
22285
22843
  const buttonStyles = resolveContextualButtonStyles(input, foreground, context, options);
22286
22844
  if (foreground.kind === "unknown") return buttonStyles;
22287
22845
  return {
22288
22846
  ...buttonStyles,
22289
- ...surfaceForegroundStyle({
22290
- text: resolveBackgroundColorValue(foreground.roles.text, context),
22291
- heading: resolveBackgroundColorValue(foreground.roles.heading, context),
22292
- link: resolveBackgroundColorValue(foreground.roles.link, context),
22293
- supporting: resolveBackgroundColorValue(foreground.roles.supporting, context)
22294
- })
22847
+ ...surfaceForegroundStyle(surfaceForegroundInputFromResolved(foreground, (token) => resolveBackgroundColorValue(token, context)))
22295
22848
  };
22296
22849
  }
22297
22850
  function resolveContextualButtonStyles(background, foreground, context, options) {
@@ -28103,10 +28656,7 @@ function resolveBackgroundVisualStyles(backgroundColor, defaultToken = "surface"
28103
28656
  };
28104
28657
  }
28105
28658
  function resolveHeaderVisualStyles(header) {
28106
- const navContainerType = header?.navContainer?.type ?? "none";
28107
- const hasContainedNav = navContainerType === "glass" || navContainerType === "pill";
28108
- const hasOverlayVariant = header?.variant === "floating";
28109
- if (hasContainedNav || hasOverlayVariant) return {
28659
+ if (headerRootPaint(header) !== "own-surface") return {
28110
28660
  backgroundToken: "transparent",
28111
28661
  isTransparent: true
28112
28662
  };
@@ -28117,23 +28667,7 @@ function resolveHeaderVisualStyles(header) {
28117
28667
  }
28118
28668
  function resolvedForegroundStyle(foreground) {
28119
28669
  if (foreground.kind === "unknown") return void 0;
28120
- const { roles } = foreground;
28121
- return surfaceForegroundStyle({
28122
- text: rgbColorValue(roles.text),
28123
- heading: rgbColorValue(roles.heading),
28124
- link: rgbColorValue(roles.link),
28125
- supporting: rgbColorValue(roles.supporting)
28126
- });
28127
- }
28128
- function resolveFooterRootForeground(footer, palette) {
28129
- const background = footer?.background;
28130
- return resolveSurfaceForeground(background ?? {
28131
- type: "color",
28132
- color: "surface"
28133
- }, palette, {
28134
- text: background?.textColor,
28135
- link: footer?.navLinkStyle?.colorToken ?? footer?.navColor ?? background?.textColor
28136
- });
28670
+ return surfaceForegroundStyle(surfaceForegroundInputFromResolved(foreground, rgbColorValue));
28137
28671
  }
28138
28672
  function footerBottomBarBorderWidthStyle(width) {
28139
28673
  if (!width) return void 0;
@@ -28160,8 +28694,7 @@ const headerRootClassTransform = {
28160
28694
  const placement = planSiteChromePlacement(parseHeaderPositioning(content.positioning));
28161
28695
  const header = asPartialObject(value);
28162
28696
  const visuals = resolveHeaderVisualStyles(header);
28163
- const navContainerType = header?.navContainer?.type ?? "none";
28164
- const hasContainedNav = navContainerType === "glass" || navContainerType === "pill";
28697
+ const hasContainedNav = headerRootPaint(header) === "contained-nav";
28165
28698
  const backgroundClass = visuals.isTransparent || hasContainedNav ? "rb-bg-transparent" : null;
28166
28699
  const classes = [config.base, backgroundClass];
28167
28700
  if (!hasContainedNav) {
@@ -28204,7 +28737,7 @@ const headerRootStyleTransform = {
28204
28737
  run: (value, _options, context) => {
28205
28738
  const header = asPartialObject(value);
28206
28739
  const visuals = resolveHeaderVisualStyles(header);
28207
- return mergeStyles(resolvedForegroundStyle(resolveHeaderRootForeground(header, context.theme.palette, visuals.isTransparent)) ?? { color: rgbColorValue(resolveHeaderLeafTextColor(header)) }, borderColorStyle(header?.border?.colorToken ?? "border"));
28740
+ 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"));
28208
28741
  }
28209
28742
  };
28210
28743
  const headerSectionBackgroundTransform = {
@@ -28212,9 +28745,7 @@ const headerSectionBackgroundTransform = {
28212
28745
  kind: "string",
28213
28746
  summary: "Resolve the inner site-header section background token",
28214
28747
  run: (value) => {
28215
- const header = asPartialObject(value);
28216
- const navContainerType = header?.navContainer?.type ?? "none";
28217
- return header?.variant === "floating" || navContainerType === "glass" || navContainerType === "pill" ? "raw:transparent" : "background";
28748
+ return headerRootPaint(asPartialObject(value)) !== "own-surface" ? "raw:transparent" : "background";
28218
28749
  }
28219
28750
  };
28220
28751
  const footerRootStyleTransform = {
@@ -28232,7 +28763,7 @@ const footerRootStyleTransform = {
28232
28763
  styleParts.push(backgroundColorStyle(token));
28233
28764
  }
28234
28765
  }
28235
- styleParts.push(resolvedForegroundStyle(resolveFooterRootForeground(footer, context.theme.palette)));
28766
+ styleParts.push(resolvedForegroundStyle(resolveFooterRootForeground(footer, context.theme.palette, context.proseHoverCandidate)));
28236
28767
  styleParts.push(borderColorStyle("border"));
28237
28768
  return mergeStyles(...styleParts);
28238
28769
  }
@@ -28294,22 +28825,28 @@ const footerBottomBarStyleTransform = {
28294
28825
  run: (value, _options, context) => {
28295
28826
  const footer = asPartialObject(value);
28296
28827
  const bottomBar = footer?.bottomBar;
28297
- const styleParts = [];
28298
- const background = bottomBar?.background;
28299
- if (background?.type === "color") styleParts.push(backgroundColorStyle(background.color ?? "surface"));
28300
- styleParts.push(borderColorStyle(bottomBar?.borderTop?.colorToken ?? "border"), footerBottomBarBorderWidthStyle(bottomBar?.borderTop?.width));
28301
- const foreground = resolveSurfaceForeground(background?.type === "color" ? background : {
28302
- type: "color",
28303
- color: "transparent"
28304
- }, context.theme.palette, {
28305
- text: bottomBar?.textColor,
28306
- link: footer?.bottomTextLinkStyle?.colorToken ?? bottomBar?.textColor
28307
- });
28308
- if (background?.type === "color") styleParts.push(resolvedForegroundStyle(foreground));
28309
- else if (bottomBar?.textColor) styleParts.push(textColorStyle(bottomBar.textColor));
28310
- return mergeStyles(...styleParts);
28828
+ 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));
28311
28829
  }
28312
28830
  };
28831
+ function footerBottomBarForegroundStyle(footer, palette) {
28832
+ if (!footer?.bottomBar) return void 0;
28833
+ const bar = footer.bottomBar;
28834
+ if (bar.background?.type !== "color") return backgroundlessBottomBarForegroundStyle(footer);
28835
+ return resolvedForegroundStyle(resolveSurfaceForeground(bar.background, palette, {
28836
+ text: bar.textColor,
28837
+ link: footer.bottomTextLinkStyle?.colorToken ?? bar.textColor,
28838
+ linkHover: footer.bottomTextLinkStyle?.hoverColorToken
28839
+ }, { compositeBase: measuredFooterBackdrop(footer, palette) }));
28840
+ }
28841
+ function backgroundlessBottomBarForegroundStyle(footer) {
28842
+ if (footer.background?.contentOwner === "site-chrome-editor") return;
28843
+ const textColor = footer.bottomBar?.textColor;
28844
+ return textColor ? textColorStyle(textColor) : void 0;
28845
+ }
28846
+ function measuredFooterBackdrop(footer, palette) {
28847
+ const foreground = resolveFooterRootForeground(footer, palette);
28848
+ return foreground.kind === "known" && foreground.provenance.kind === "measured" ? foreground.provenance.backdropHex : null;
28849
+ }
28313
28850
  const footerSplitMainClassTransform = {
28314
28851
  id: "layout.footerSplitMainClass",
28315
28852
  kind: "string",
@@ -28405,7 +28942,7 @@ function chromeSurfaceTextToken(surface, theme, palette) {
28405
28942
  case "header-root": {
28406
28943
  const header = theme.header;
28407
28944
  const foreground = resolveHeaderRootForeground(header, palette, resolveHeaderVisualStyles(header).isTransparent);
28408
- return foreground.kind === "known" ? foreground.roles.text : resolveHeaderLeafTextColor(header);
28945
+ return foreground.kind === "known" ? foreground.roles.text : headerLeafTextColor(header);
28409
28946
  }
28410
28947
  case "header-mobile-panel": return theme.header?.dropdownStyle?.textColor ?? "text";
28411
28948
  case "footer-root": {
@@ -30484,7 +31021,9 @@ const bookingWizard = bookingForm(withApiBindings({
30484
31021
  } },
30485
31022
  formId: { $bind: { from: "content.formId" } },
30486
31023
  form: { $bind: { from: "data.form" } },
30487
- services: { $bind: { from: "data.services" } }
31024
+ services: { $bind: { from: "data.services" } },
31025
+ mailingList: { $bind: { from: "$root.mailingList" } },
31026
+ siteName: { $bind: { from: "$root.siteName" } }
30488
31027
  }));
30489
31028
  /** Both variants sit in the same section shell; only the inner layout differs. */
30490
31029
  function bookingSection(children) {
@@ -31400,7 +31939,13 @@ const eventRegistrationHydrationSchemaShape = {
31400
31939
  spamProtectionEnabled: z.boolean().optional(),
31401
31940
  supportEmail: z.string().optional(),
31402
31941
  sitePasses: publicPassProductCollectionSchema.nullable().optional(),
31403
- siteMemberships: publicMembershipProductCollectionSchema.nullable().optional()
31942
+ siteMemberships: publicMembershipProductCollectionSchema.nullable().optional(),
31943
+ mailingList: z.unknown().transform((value) => {
31944
+ if (value === void 0) return void 0;
31945
+ const parsed = parseMailingListRuntimeContext(value);
31946
+ return parsed.ok ? parsed.value : void 0;
31947
+ }),
31948
+ siteName: z.string().optional()
31404
31949
  };
31405
31950
  const eventRegistrationEventSourceSchema = z.discriminatedUnion("kind", [z.object({
31406
31951
  kind: z.literal("loaded"),
@@ -31572,7 +32117,9 @@ const eventRegistrationBlockRuntime = defineClientOwnedBlockRuntime({
31572
32117
  spamProtectionEnabled: source.spamProtectionEnabled,
31573
32118
  supportEmail: source.supportEmail,
31574
32119
  sitePasses: source.sitePasses ?? null,
31575
- siteMemberships: source.siteMemberships ?? null
32120
+ siteMemberships: source.siteMemberships ?? null,
32121
+ mailingList: source.mailingList,
32122
+ siteName: source.siteName
31576
32123
  }
31577
32124
  };
31578
32125
  }
@@ -31740,6 +32287,8 @@ const eventRegistrationBlockDefinition = {
31740
32287
  events: { $bind: { from: "data.events" } },
31741
32288
  wholeSeriesRunEvents: { $bind: { from: "data.wholeSeriesRunEvents" } },
31742
32289
  loaderFailures: { $bind: { from: "$root.loaderFailures" } },
32290
+ mailingList: { $bind: { from: "$root.mailingList" } },
32291
+ siteName: { $bind: { from: "$root.siteName" } },
31743
32292
  sitePasses: { $bind: { from: "data.sitePasses" } },
31744
32293
  siteMemberships: { $bind: { from: "data.siteMemberships" } },
31745
32294
  stage: { $bind: {
@@ -38814,18 +39363,11 @@ const newsletterSignupManifest = createBlockManifest({
38814
39363
  ],
38815
39364
  icon: "Mail"
38816
39365
  });
39366
+ const newsletterPublicFieldIds = [...(newsletterSignupManifest.fields ?? []).map((field) => field.id), "_containerStyles"];
38817
39367
  function sanitizeNewsletterSignupPublicContent(content) {
38818
39368
  if (typeof content !== "object" || content === null || Array.isArray(content)) return content;
38819
39369
  const value = content;
38820
- return {
38821
- title: value.title,
38822
- subtitle: value.subtitle,
38823
- targeting: value.targeting,
38824
- buttonVariant: value.buttonVariant,
38825
- mailingListSource: value.mailingListSource,
38826
- mailingListSourceToken: value.mailingListSourceToken,
38827
- _sectionStyles: value._sectionStyles
38828
- };
39370
+ return Object.fromEntries(newsletterPublicFieldIds.map((id) => [id, value[id]]));
38829
39371
  }
38830
39372
  const newsletterSignupBlockDefinition = {
38831
39373
  manifest: newsletterSignupManifest,
@@ -43099,7 +43641,10 @@ function usePage(params) {
43099
43641
  let cancelled = false;
43100
43642
  async function fetchPage() {
43101
43643
  try {
43102
- const [site, pageResponse] = await Promise.all([client.getSite({ id: siteId }), client.getPage({
43644
+ const [site, pageResponse] = await Promise.all([client.getSite({
43645
+ id: siteId,
43646
+ currentPath: path
43647
+ }), client.getPage({
43103
43648
  siteId,
43104
43649
  path,
43105
43650
  preview