@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
@@ -18,6 +18,64 @@ function defineEndpointDefinitions(definitions) {
18
18
  return definitions;
19
19
  }
20
20
  //#endregion
21
+ //#region ../api/src/apiEndpointTypes.ts
22
+ function allowedDemoMutationPolicy() {
23
+ return {
24
+ classification: "allowed",
25
+ publicMessage: ""
26
+ };
27
+ }
28
+ function blockedDemoMutationPolicy(classification, publicMessage) {
29
+ if (publicMessage.trim() === "") throw new Error(`Demo mutation policy ${classification} requires publicMessage.`);
30
+ return {
31
+ classification,
32
+ publicMessage
33
+ };
34
+ }
35
+ //#endregion
36
+ //#region ../api/src/demoMutationPolicies.ts
37
+ const DEMO_MUTATION_BLOCKED_HIDDEN = blockedDemoMutationPolicy("blocked-hidden", "This action is not available in demo sites.");
38
+ const DEMO_MUTATION_BLOCKED_DISABLED = blockedDemoMutationPolicy("blocked-disabled", "This setting is disabled in demo sites.");
39
+ blockedDemoMutationPolicy("internal-only", "This internal operation is not available in demo sites.");
40
+ const DEMO_MUTATION_ALLOWED = allowedDemoMutationPolicy();
41
+ //#endregion
42
+ //#region ../api/src/siteLifecycleEndpoints.ts
43
+ const SITE_LIFECYCLE_ENDPOINT_DEFINITIONS = defineEndpointDefinitions({
44
+ createSite: {
45
+ path: "/sites/manage",
46
+ method: "POST",
47
+ tags: ["site"],
48
+ auth: "user",
49
+ responseKind: "json",
50
+ errors: []
51
+ },
52
+ createSiteManual: {
53
+ path: "/sites/manual",
54
+ method: "POST",
55
+ tags: ["site"],
56
+ auth: "user",
57
+ responseKind: "json",
58
+ errors: []
59
+ },
60
+ updateSite: {
61
+ path: "/sites/manage",
62
+ method: "PUT",
63
+ tags: ["site"],
64
+ auth: "user",
65
+ responseKind: "json",
66
+ errors: []
67
+ },
68
+ deleteSite: {
69
+ path: "/sites/{siteId}",
70
+ method: "DELETE",
71
+ tags: ["site", "site-{siteId}"],
72
+ auth: "user",
73
+ responseKind: "json",
74
+ errors: [],
75
+ demoMutation: DEMO_MUTATION_BLOCKED_HIDDEN
76
+ }
77
+ });
78
+ //#endregion
21
79
  //#region ../api/src/publicNewsletterEndpointDefinitions.ts
22
80
  const PUBLIC_NEWSLETTER_ENDPOINT_DEFINITIONS = defineEndpointDefinitions({
23
81
  subscribeNewsletter: {
@@ -78,27 +136,6 @@ const PUBLIC_NEWSLETTER_ENDPOINT_DEFINITIONS = defineEndpointDefinitions({
78
136
  }
79
137
  });
80
138
  //#endregion
81
- //#region ../api/src/apiEndpointTypes.ts
82
- function allowedDemoMutationPolicy() {
83
- return {
84
- classification: "allowed",
85
- publicMessage: ""
86
- };
87
- }
88
- function blockedDemoMutationPolicy(classification, publicMessage) {
89
- if (publicMessage.trim() === "") throw new Error(`Demo mutation policy ${classification} requires publicMessage.`);
90
- return {
91
- classification,
92
- publicMessage
93
- };
94
- }
95
- //#endregion
96
- //#region ../api/src/demoMutationPolicies.ts
97
- const DEMO_MUTATION_BLOCKED_HIDDEN = blockedDemoMutationPolicy("blocked-hidden", "This action is not available in demo sites.");
98
- const DEMO_MUTATION_BLOCKED_DISABLED = blockedDemoMutationPolicy("blocked-disabled", "This setting is disabled in demo sites.");
99
- blockedDemoMutationPolicy("internal-only", "This internal operation is not available in demo sites.");
100
- const DEMO_MUTATION_ALLOWED = allowedDemoMutationPolicy();
101
- //#endregion
102
139
  //#region ../api/src/cache-tags.ts
103
140
  /**
104
141
  * Tag templates for endpoint definitions (support `{param}` placeholders).
@@ -1125,6 +1162,20 @@ const NEWSLETTER_ENDPOINT_DEFINITIONS = defineEndpointDefinitions({
1125
1162
  responseKind: "json",
1126
1163
  errors: ["auth:forbidden", "server:internal_error"]
1127
1164
  },
1165
+ setMailingListBookingOptIn: {
1166
+ path: "/sites/{siteId}/mailing-list/setup/booking-opt-in",
1167
+ method: "PUT",
1168
+ tags: [TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter],
1169
+ auth: "user",
1170
+ responseKind: "json",
1171
+ demoMutation: DEMO_MUTATION_BLOCKED_DISABLED,
1172
+ errors: [
1173
+ "auth:forbidden",
1174
+ "validation:invalid_input",
1175
+ "resource:conflict",
1176
+ "server:internal_error"
1177
+ ]
1178
+ },
1128
1179
  getMailingListAuthoringContext: {
1129
1180
  path: "/sites/{siteId}/mailing-list/authoring-context",
1130
1181
  method: "GET",
@@ -2250,17 +2301,35 @@ function parseMailingListRuntimeContext(value) {
2250
2301
  if (!isRecord$8(value)) return invalidRuntimeContext();
2251
2302
  if (value.tag === "not_configured") return ok({ tag: "not_configured" });
2252
2303
  if (value.tag !== "configured") return invalidRuntimeContext();
2304
+ return parseConfiguredRuntimeContext(value);
2305
+ }
2306
+ function parseConfiguredRuntimeContext(value) {
2253
2307
  const revision = parseMailingListSetupRevision(value.revision);
2254
2308
  const form = parseMailingListGlobalForm(value.form);
2255
2309
  const provider = parseRuntimeProvider(value.provider);
2256
- if (revision === null || !form.ok || provider === null) return invalidRuntimeContext();
2310
+ const bookingSignup = parseBookingSignupOffer(value.bookingSignup);
2311
+ if (revision === null || !form.ok || provider === null || bookingSignup === null) return invalidRuntimeContext();
2257
2312
  return ok({
2258
2313
  tag: "configured",
2259
2314
  revision,
2315
+ bookingSignup,
2260
2316
  form: form.value,
2261
2317
  provider
2262
2318
  });
2263
2319
  }
2320
+ function parseBookingSignupOffer(value) {
2321
+ if (value === void 0) return {
2322
+ tag: "unavailable",
2323
+ reason: "disabled"
2324
+ };
2325
+ if (!isRecord$8(value)) return null;
2326
+ if (value.tag === "offered") return { tag: "offered" };
2327
+ if (value.tag === "unavailable" && (value.reason === "disabled" || value.reason === "fields" || value.reason === "destination")) return {
2328
+ tag: "unavailable",
2329
+ reason: value.reason
2330
+ };
2331
+ return null;
2332
+ }
2264
2333
  function parseRuntimeProvider(value) {
2265
2334
  if (!isRecord$8(value)) return null;
2266
2335
  switch (value.provider) {
@@ -3750,6 +3819,54 @@ const BILLING_ENDPOINT_DEFINITIONS = defineEndpointDefinitions({
3750
3819
  }
3751
3820
  });
3752
3821
  //#endregion
3822
+ //#region ../api/src/bookingPeopleEndpointDefinitions.ts
3823
+ /**
3824
+ * People endpoints (#1356): the People list, its CSV export, and deleting a
3825
+ * person when nothing is attached to them.
3826
+ */
3827
+ const BOOKING_PEOPLE_ENDPOINT_DEFINITIONS = defineEndpointDefinitions({
3828
+ listPeople: {
3829
+ path: "/sites/{siteId}/bookings/people",
3830
+ method: "GET",
3831
+ tags: ["site-{siteId}", "customers-{siteId}"],
3832
+ auth: "user",
3833
+ responseKind: "json",
3834
+ errors: ["server:internal_error"]
3835
+ },
3836
+ exportPeopleCsv: {
3837
+ path: "/sites/{siteId}/bookings/people/export.csv",
3838
+ method: "GET",
3839
+ tags: ["site-{siteId}", "customers-{siteId}"],
3840
+ auth: "user",
3841
+ errors: [],
3842
+ responseKind: "blob"
3843
+ },
3844
+ checkPersonDeletion: {
3845
+ path: "/sites/{siteId}/bookings/people/{personId}/deletion-check",
3846
+ method: "GET",
3847
+ tags: ["site-{siteId}", "customers-{siteId}"],
3848
+ auth: "user",
3849
+ responseKind: "json",
3850
+ errors: [
3851
+ "auth:forbidden",
3852
+ "resource:not_found",
3853
+ "server:internal_error"
3854
+ ]
3855
+ },
3856
+ deletePerson: {
3857
+ path: "/sites/{siteId}/bookings/people/{personId}",
3858
+ method: "DELETE",
3859
+ tags: ["site-{siteId}", "customers-{siteId}"],
3860
+ auth: "user",
3861
+ responseKind: "json",
3862
+ errors: [
3863
+ "auth:forbidden",
3864
+ "resource:not_found",
3865
+ "server:internal_error"
3866
+ ]
3867
+ }
3868
+ });
3869
+ //#endregion
3753
3870
  //#region ../api/src/clientErrorReporting.ts
3754
3871
  const CLIENT_ERROR_REPORT_ENDPOINT_DEFINITIONS = defineEndpointDefinitions({ reportClientError: {
3755
3872
  path: "/client/error-report",
@@ -3785,6 +3902,7 @@ z.object({
3785
3902
  sourceLocation: z.string().max(CLIENT_ERROR_REPORT_LIMITS.sourceLocation).nullable()
3786
3903
  }).strict();
3787
3904
  ({
3905
+ ...SITE_LIFECYCLE_ENDPOINT_DEFINITIONS,
3788
3906
  ...CLIENT_ERROR_REPORT_ENDPOINT_DEFINITIONS,
3789
3907
  ...PUBLIC_NEWSLETTER_ENDPOINT_DEFINITIONS,
3790
3908
  ...ACCOUNT_ENDPOINT_DEFINITIONS,
@@ -3798,7 +3916,7 @@ z.object({
3798
3916
  ...NEWSLETTER_ENDPOINT_DEFINITIONS,
3799
3917
  ...APPOINTMENT_ENDPOINT_DEFINITIONS,
3800
3918
  ...EVENT_SERIES_REGISTRATION_ENDPOINT_DEFINITIONS
3801
- }, 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 };
3919
+ }, 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 };
3802
3920
  z.object({ refreshToken: z.string().min(1).max(4096) }).strict();
3803
3921
  z.object({
3804
3922
  accessToken: z.string().min(1).max(4096),
@@ -6299,13 +6417,16 @@ const SURFACE_FOREGROUND_CSS_VARS = {
6299
6417
  text: "--rb-surface-text-color",
6300
6418
  heading: "--rb-surface-heading-color",
6301
6419
  link: "--rb-surface-link-color",
6420
+ linkHover: "--rb-surface-link-hover-color",
6302
6421
  supporting: "--rb-surface-supporting-color"
6303
6422
  };
6304
6423
  const DEFAULT_SURFACE_TEXT_COLOR = "rgb(var(--tb-text, 17 24 39))";
6424
+ const DEFAULT_SURFACE_LINK_COLOR = "rgb(var(--tb-primary, var(--tb-text, 17 24 39)))";
6305
6425
  const DEFAULT_ROLE_FALLBACKS = {
6306
6426
  text: DEFAULT_SURFACE_TEXT_COLOR,
6307
6427
  heading: DEFAULT_SURFACE_TEXT_COLOR,
6308
- link: "rgb(var(--tb-primary, var(--tb-text, 17 24 39)))",
6428
+ link: DEFAULT_SURFACE_LINK_COLOR,
6429
+ linkHover: DEFAULT_SURFACE_LINK_COLOR,
6309
6430
  supporting: "rgb(var(--tb-mutedText, 100 116 139))"
6310
6431
  };
6311
6432
  function requireSurfaceColorValue(role, value) {
@@ -6315,10 +6436,12 @@ function requireSurfaceColorValue(role, value) {
6315
6436
  }
6316
6437
  function completeSurfaceForegrounds(input) {
6317
6438
  const text = requireSurfaceColorValue("text", input.text);
6439
+ const link = input.link === void 0 ? text : requireSurfaceColorValue("link", input.link);
6318
6440
  return {
6319
6441
  text,
6320
6442
  heading: input.heading === void 0 ? text : requireSurfaceColorValue("heading", input.heading),
6321
- link: input.link === void 0 ? text : requireSurfaceColorValue("link", input.link),
6443
+ link,
6444
+ linkHover: input.linkHover === void 0 ? link : requireSurfaceColorValue("linkHover", input.linkHover),
6322
6445
  supporting: input.supporting === void 0 ? text : requireSurfaceColorValue("supporting", input.supporting)
6323
6446
  };
6324
6447
  }
@@ -6326,6 +6449,7 @@ function surfaceForegroundValue(role, outsideProviderFallback = DEFAULT_ROLE_FAL
6326
6449
  const roleVariable = SURFACE_FOREGROUND_CSS_VARS[role];
6327
6450
  const fallback = requireSurfaceColorValue("fallback", outsideProviderFallback);
6328
6451
  if (role === "text") return `var(${roleVariable}, ${fallback})`;
6452
+ if (role === "linkHover") return `var(${roleVariable}, ${surfaceForegroundValue("link", fallback)})`;
6329
6453
  return `var(${roleVariable}, var(${SURFACE_FOREGROUND_CSS_VARS.text}, ${fallback}))`;
6330
6454
  }
6331
6455
  function surfaceForegroundValueWithOpacity(role, opacityPercent) {
@@ -6339,9 +6463,25 @@ function surfaceForegroundStyle(input) {
6339
6463
  [SURFACE_FOREGROUND_CSS_VARS.text]: foregrounds.text,
6340
6464
  [SURFACE_FOREGROUND_CSS_VARS.heading]: foregrounds.heading,
6341
6465
  [SURFACE_FOREGROUND_CSS_VARS.link]: foregrounds.link,
6342
- [SURFACE_FOREGROUND_CSS_VARS.supporting]: foregrounds.supporting
6466
+ [SURFACE_FOREGROUND_CSS_VARS.linkHover]: foregrounds.linkHover,
6467
+ [SURFACE_FOREGROUND_CSS_VARS.supporting]: foregrounds.supporting,
6468
+ "--rb-surface-link-hover-decoration": hoverDecoration(input)
6343
6469
  };
6344
6470
  }
6471
+ function surfaceForegroundInputFromResolved(foreground, color) {
6472
+ const { roles } = foreground;
6473
+ return {
6474
+ text: color(roles.text),
6475
+ heading: color(roles.heading),
6476
+ link: color(roles.link),
6477
+ linkHover: color(roles.linkHover),
6478
+ supporting: color(roles.supporting),
6479
+ hoverDecoration: foreground.hoverDecoration
6480
+ };
6481
+ }
6482
+ function hoverDecoration(input) {
6483
+ return input.hoverDecoration ?? "underline";
6484
+ }
6345
6485
  //#endregion
6346
6486
  //#region ../theme-core/src/buttons/constants.ts
6347
6487
  /**
@@ -7096,6 +7236,64 @@ function parseAlpha(source) {
7096
7236
  function isRgbChannel(value) {
7097
7237
  return Number.isFinite(value) && value >= 0 && value <= 255;
7098
7238
  }
7239
+ /**
7240
+ * Derive the hover foreground that belongs with a resolved resting foreground.
7241
+ *
7242
+ * A resting foreground is chosen to be legible against a known surface. A hover
7243
+ * state derived from it stays within a bounded distance of that colour, so it
7244
+ * inherits most of the resting colour's contrast margin instead of asserting
7245
+ * an unrelated brand colour that no one checked against the surface.
7246
+ *
7247
+ * That bounded-distance property is what lets this be used on a transparent
7248
+ * overlay header, where the backdrop is only partly knowable: the scrolled
7249
+ * state composites a 60% glass tint over arbitrary page content, so no
7250
+ * compile-time contrast proof is available there. Staying near a colour that
7251
+ * is already trusted in both states is a weaker claim than a contrast proof,
7252
+ * and it is one this function can actually keep.
7253
+ *
7254
+ * Returns `null` when the resting token is not a plain palette token — an
7255
+ * already-faded or raw value has no well-defined softening, and the caller
7256
+ * should leave hover alone rather than guess.
7257
+ */
7258
+ function deriveForegroundHoverToken(restingToken) {
7259
+ const parts = parseColorTokenParts(restingToken);
7260
+ if (parts.kind !== "token") return null;
7261
+ if (parts.opacityPercent !== null) return null;
7262
+ return parseThemeColorToken(`${parts.token}/85`);
7263
+ }
7264
+ /**
7265
+ * Prefer an authored hover that survives every measured backdrop, then a
7266
+ * checked softening of the resting colour. A null backdrop set represents a
7267
+ * trusted treatment: only an explicit authored hover may change the colour.
7268
+ * When neither option works, retain the resting colour and underline it.
7269
+ */
7270
+ function planForegroundHover(input) {
7271
+ const { restingToken, candidate, palette, backdrops } = input;
7272
+ if (candidate && candidate !== restingToken) {
7273
+ if (backdrops === null || survivesEveryBackdrop(candidate, palette, backdrops)) return {
7274
+ kind: "candidate",
7275
+ token: candidate,
7276
+ decoration: "initial"
7277
+ };
7278
+ }
7279
+ const softened = deriveForegroundHoverToken(restingToken);
7280
+ if (softened && backdrops && survivesEveryBackdrop(softened, palette, backdrops)) return {
7281
+ kind: "softened",
7282
+ token: softened,
7283
+ decoration: "initial"
7284
+ };
7285
+ return {
7286
+ kind: "resting",
7287
+ token: restingToken,
7288
+ decoration: "underline"
7289
+ };
7290
+ }
7291
+ function survivesEveryBackdrop(token, palette, backdrops) {
7292
+ return backdrops.length > 0 && backdrops.every((backdrop) => {
7293
+ const foreground = resolveOpaqueSurfaceHex(token, palette, backdrop);
7294
+ return foreground !== null && contrastRatio(foreground, backdrop) >= 4.5;
7295
+ });
7296
+ }
7099
7297
  //#endregion
7100
7298
  //#region ../theme-core/src/surfaces/resolveSurfaceForeground.ts
7101
7299
  const FALLBACK_TEXT_TOKENS = [
@@ -7142,12 +7340,16 @@ function resolveSurfaceForeground(background, palette, candidates = {}, options
7142
7340
  }
7143
7341
  function foregroundCandidates(background, overrides) {
7144
7342
  return {
7145
- text: overrides.text ?? background?.textColor ?? null,
7146
- heading: overrides.heading ?? background?.headingColor ?? null,
7147
- link: overrides.link ?? background?.linkColor ?? null,
7148
- supporting: overrides.supporting ?? background?.supportingColor ?? null
7343
+ text: candidateOrBackground(overrides.text, background?.textColor),
7344
+ heading: candidateOrBackground(overrides.heading, background?.headingColor),
7345
+ link: candidateOrBackground(overrides.link, background?.linkColor),
7346
+ linkHover: candidateOrBackground(overrides.linkHover),
7347
+ supporting: candidateOrBackground(overrides.supporting, background?.supportingColor)
7149
7348
  };
7150
7349
  }
7350
+ function candidateOrBackground(candidate, backgroundValue) {
7351
+ return candidate ?? backgroundValue ?? null;
7352
+ }
7151
7353
  function resolveDeterministicForeground(backgroundReference, candidates, palette, compositeBase) {
7152
7354
  const backgroundHex = resolveOpaqueSurfaceHex(backgroundReference, palette, compositeBase);
7153
7355
  if (!backgroundHex) return resolveTrustedTreatmentForeground(candidates, palette);
@@ -7159,29 +7361,51 @@ function resolveDeterministicForeground(backgroundReference, candidates, palette
7159
7361
  ...FALLBACK_TEXT_TOKENS
7160
7362
  ], backgroundHex, palette, derivedOnToken ? [derivedOnToken] : []);
7161
7363
  if (!text) return { kind: "unknown" };
7162
- return {
7163
- kind: "known",
7164
- roles: {
7165
- text,
7166
- heading: safeTokenOr(candidates.heading, text, backgroundHex, palette),
7167
- link: safeTokenOr(candidates.link, text, backgroundHex, palette),
7168
- supporting: safeTokenOr(candidates.supporting, text, backgroundHex, palette)
7169
- }
7170
- };
7364
+ return knownForeground({
7365
+ text,
7366
+ heading: safeTokenOr(candidates.heading, text, backgroundHex, palette),
7367
+ link: safeTokenOr(candidates.link, text, backgroundHex, palette),
7368
+ supporting: safeTokenOr(candidates.supporting, text, backgroundHex, palette)
7369
+ }, {
7370
+ kind: "measured",
7371
+ backdropHex: backgroundHex
7372
+ }, candidates.linkHover, palette);
7171
7373
  }
7172
7374
  function resolveTrustedTreatmentForeground(candidates, palette) {
7173
7375
  const text = canonicalToken(candidates.text, palette);
7174
7376
  if (!text) return { kind: "unknown" };
7377
+ return knownForeground({
7378
+ text,
7379
+ heading: canonicalToken(candidates.heading, palette) ?? text,
7380
+ link: canonicalToken(candidates.link, palette) ?? text,
7381
+ supporting: canonicalToken(candidates.supporting, palette) ?? text
7382
+ }, { kind: "trusted-treatment" }, candidates.linkHover, palette);
7383
+ }
7384
+ function knownForeground(roles, provenance, hoverCandidate, palette) {
7385
+ const hover = planForegroundHover({
7386
+ restingToken: roles.link,
7387
+ candidate: canonicalHoverToken(hoverCandidate, palette),
7388
+ palette,
7389
+ backdrops: provenance.kind === "measured" ? [provenance.backdropHex] : null
7390
+ });
7175
7391
  return {
7176
7392
  kind: "known",
7393
+ provenance,
7177
7394
  roles: {
7178
- text,
7179
- heading: canonicalToken(candidates.heading, palette) ?? text,
7180
- link: canonicalToken(candidates.link, palette) ?? text,
7181
- supporting: canonicalToken(candidates.supporting, palette) ?? text
7182
- }
7395
+ ...roles,
7396
+ linkHover: hover.token
7397
+ },
7398
+ hoverDecoration: hover.decoration
7183
7399
  };
7184
7400
  }
7401
+ function canonicalHoverToken(reference, palette) {
7402
+ const token = parseThemeColorToken(reference);
7403
+ if (token) {
7404
+ const parts = parseColorTokenParts(token);
7405
+ if (parts.kind === "token" && resolveConcreteColorHex(parts.token, palette)) return token;
7406
+ }
7407
+ return canonicalToken(reference, palette);
7408
+ }
7185
7409
  function safeTokenOr(candidate, fallback, backgroundHex, palette) {
7186
7410
  return firstSafeToken([candidate], backgroundHex, palette) ?? fallback;
7187
7411
  }
@@ -10121,6 +10345,43 @@ const effectCompositionSchema = z.object({
10121
10345
  /** Effects applied on focus */
10122
10346
  focus: z.array(effectApplicationSchema).optional()
10123
10347
  });
10348
+ const policiesById = {
10349
+ "darken-background": "other",
10350
+ "lighten-background": "other",
10351
+ "fade-background": "other",
10352
+ "opacity-reduce": "other",
10353
+ "animated-gradient": "other",
10354
+ "background-on-hover": "paired-hover",
10355
+ "background-on-hover-alpha": "paired-hover",
10356
+ "border-glow": "other",
10357
+ "drop-shadow": "other",
10358
+ "inner-shadow": "other",
10359
+ "neumorphic-shadow": "other",
10360
+ "outer-glow": "other",
10361
+ "retro-3d-shadow": "other",
10362
+ "scale-up": "other",
10363
+ "scale-down": "other",
10364
+ lift: "other",
10365
+ "press-down": "other",
10366
+ pop: "other",
10367
+ "aurora-glow": "other",
10368
+ "cosmic-stardust": "other",
10369
+ "gradient-border-fill": "other",
10370
+ "animated-gradient-border-fill": "other",
10371
+ "border-bottom-grow": "other",
10372
+ "gradient-text": "other",
10373
+ "text-color-change": "text-colour",
10374
+ "border-color-change": "other",
10375
+ "sketchy-border": "other",
10376
+ "pulse-animation": "other",
10377
+ "nav-underline": "underline",
10378
+ "nav-frosted-base": "other",
10379
+ "nav-frosted-hover": "other",
10380
+ "nav-frosted-active": "other"
10381
+ };
10382
+ function navEffectPolicy(effectId) {
10383
+ return policiesById[effectId] ?? null;
10384
+ }
10124
10385
  //#endregion
10125
10386
  //#region ../theme-core/src/navigation/types.ts
10126
10387
  /**
@@ -10209,6 +10470,16 @@ const navLinkStyleSchema = z.object({
10209
10470
  /** Composable effects */
10210
10471
  effects: effectCompositionSchema.optional()
10211
10472
  });
10473
+ function navLinkHoverColorCandidate(style) {
10474
+ const effect = style?.effects?.hover?.find((item) => navEffectPolicy(item.effectId) === "text-colour");
10475
+ return parseThemeColorToken(effect?.options?.hoverColorToken ?? style?.hoverColorToken);
10476
+ }
10477
+ function navLinkOwnsHoverForeground(style) {
10478
+ return style?.effects?.hover?.some((effect) => navEffectPolicy(effect.effectId) === "paired-hover") ?? false;
10479
+ }
10480
+ function navLinkOwnsUnderline(style) {
10481
+ return style?.effects?.hover?.some((effect) => navEffectPolicy(effect.effectId) === "underline") ?? false;
10482
+ }
10212
10483
  //#endregion
10213
10484
  //#region ../theme-core/src/customCss/validation.ts
10214
10485
  /**
@@ -16397,6 +16668,14 @@ const blockDesignFallback = {
16397
16668
  };
16398
16669
  blockDesignFallback.sectionSurface, blockDesignFallback.contentFrame, blockDesignFallback.sectionHeight, blockDesignFallback.heroLegibility, blockDesignFallback.imageSurfaceTreatment, blockDesignFallback.imageSurfaceMotion, blockDesignFallback.tileTreatment, blockDesignFallback.eventListTreatment, blockDesignFallback.eyebrowTreatment, blockDesignFallback.accordionIconTreatment, blockDesignFallback.composition;
16399
16670
  //#endregion
16671
+ //#region ../theme-core/src/header/rootPaint.ts
16672
+ /** The nav container takes precedence when a floating header also has one. */
16673
+ function headerRootPaint(header) {
16674
+ const navContainerType = header?.navContainer?.type ?? "none";
16675
+ if (navContainerType === "glass" || navContainerType === "pill") return "contained-nav";
16676
+ return header?.variant === "floating" ? "overlay" : "own-surface";
16677
+ }
16678
+ //#endregion
16400
16679
  //#region ../theme-core/src/site-styles/siteChromeBackgrounds.ts
16401
16680
  const siteChromeBackgroundColorTokens = toSiteChromeBackgroundColorTokens(backgroundAppearanceColorTokenNames);
16402
16681
  const quickSiteChromeBackgroundColorTokens = toSiteChromeBackgroundColorTokens(backgroundAppearanceQuickColorTokenNames);
@@ -16576,6 +16855,259 @@ z.object(headerPreferencesShape).omit({
16576
16855
  structure: true
16577
16856
  }).strict();
16578
16857
  //#endregion
16858
+ //#region ../theme-core/src/navigation/presets.ts
16859
+ /**
16860
+ * Built-in nav link style presets
16861
+ *
16862
+ * Each preset uses composable effects to achieve its look.
16863
+ */
16864
+ const NAV_LINK_PRESETS = {
16865
+ /**
16866
+ * Minimal - subtle color change on hover
16867
+ */
16868
+ minimal: {
16869
+ name: "Minimal",
16870
+ typography: "body",
16871
+ fontWeight: "medium",
16872
+ textTransform: "none",
16873
+ italic: false,
16874
+ colorToken: "text",
16875
+ hoverColorToken: "primary",
16876
+ padding: "none",
16877
+ borderRadius: "none",
16878
+ effects: { hover: [{
16879
+ effectId: "text-color-change",
16880
+ options: { hoverColorToken: "primary" }
16881
+ }] }
16882
+ },
16883
+ /**
16884
+ * Underline - static underline appears on hover
16885
+ */
16886
+ underline: {
16887
+ name: "Underline",
16888
+ typography: "body",
16889
+ fontWeight: "medium",
16890
+ textTransform: "none",
16891
+ italic: false,
16892
+ colorToken: "text",
16893
+ padding: "none",
16894
+ borderRadius: "none",
16895
+ effects: { hover: [{
16896
+ effectId: "nav-underline",
16897
+ options: { style: "static" }
16898
+ }] }
16899
+ },
16900
+ /**
16901
+ * Underline Grow - animated underline grows from center on hover
16902
+ */
16903
+ "underline-grow": {
16904
+ name: "Underline Grow",
16905
+ typography: "body",
16906
+ fontWeight: "medium",
16907
+ textTransform: "none",
16908
+ italic: false,
16909
+ colorToken: "text",
16910
+ padding: "none",
16911
+ borderRadius: "none",
16912
+ effects: { hover: [{
16913
+ effectId: "nav-underline",
16914
+ options: { style: "grow" }
16915
+ }] }
16916
+ },
16917
+ /**
16918
+ * Capsule - pill-shaped background on hover
16919
+ */
16920
+ capsule: {
16921
+ name: "Capsule",
16922
+ typography: "body",
16923
+ fontWeight: "medium",
16924
+ textTransform: "none",
16925
+ italic: false,
16926
+ colorToken: "text",
16927
+ padding: "compact",
16928
+ borderRadius: "full",
16929
+ effects: {
16930
+ hover: [{
16931
+ effectId: "background-on-hover-alpha",
16932
+ options: {
16933
+ colorToken: "primary",
16934
+ opacity: 10
16935
+ }
16936
+ }],
16937
+ active: [{
16938
+ effectId: "background-on-hover-alpha",
16939
+ options: {
16940
+ colorToken: "primary",
16941
+ opacity: 15
16942
+ }
16943
+ }]
16944
+ }
16945
+ },
16946
+ /**
16947
+ * Solid - solid background color on hover
16948
+ */
16949
+ solid: {
16950
+ name: "Solid",
16951
+ typography: "body",
16952
+ fontWeight: "medium",
16953
+ textTransform: "none",
16954
+ italic: false,
16955
+ colorToken: "text",
16956
+ padding: "compact",
16957
+ borderRadius: "none",
16958
+ effects: {
16959
+ hover: [{
16960
+ effectId: "background-on-hover",
16961
+ options: {
16962
+ colorToken: "primary",
16963
+ textColorToken: "primaryForeground"
16964
+ }
16965
+ }],
16966
+ active: [{
16967
+ effectId: "background-on-hover",
16968
+ options: {
16969
+ colorToken: "primary",
16970
+ textColorToken: "primaryForeground"
16971
+ }
16972
+ }]
16973
+ }
16974
+ },
16975
+ /**
16976
+ * Scale - gentle scale-up on hover
16977
+ */
16978
+ scale: {
16979
+ name: "Scale",
16980
+ typography: "body",
16981
+ fontWeight: "medium",
16982
+ textTransform: "none",
16983
+ italic: false,
16984
+ colorToken: "text",
16985
+ padding: "none",
16986
+ borderRadius: "none",
16987
+ effects: { hover: [{
16988
+ effectId: "scale-up",
16989
+ options: { scale: 1.05 }
16990
+ }] }
16991
+ },
16992
+ /**
16993
+ * Frosted - semi-transparent glass-like background
16994
+ */
16995
+ frosted: {
16996
+ name: "Frosted",
16997
+ typography: "body",
16998
+ fontWeight: "medium",
16999
+ textTransform: "none",
17000
+ italic: false,
17001
+ colorToken: "text",
17002
+ padding: "compact",
17003
+ borderRadius: "md",
17004
+ effects: {
17005
+ base: [{ effectId: "nav-frosted-base" }],
17006
+ hover: [{ effectId: "nav-frosted-hover" }],
17007
+ active: [{ effectId: "nav-frosted-active" }]
17008
+ }
17009
+ }
17010
+ };
17011
+ /**
17012
+ * Get a nav link style preset by ID
17013
+ */
17014
+ function getNavLinkPreset(presetId) {
17015
+ return NAV_LINK_PRESETS[presetId];
17016
+ }
17017
+ Object.keys(NAV_LINK_PRESETS);
17018
+ //#endregion
17019
+ //#region ../theme-core/src/header/legacyNavLinkStyle.ts
17020
+ function buildLegacyHeaderNavLinkStyle(header, contrastTreatment, navTextSize) {
17021
+ const navStyle = header.navStyle ?? "minimal";
17022
+ const basePreset = getNavLinkPreset(navStyle);
17023
+ if (!basePreset) return null;
17024
+ const style = {
17025
+ ...basePreset,
17026
+ fontWeight: header.navWeight ?? basePreset.fontWeight,
17027
+ colorToken: (header.navColor ?? header.textColor)?.trim() || basePreset.colorToken,
17028
+ ...contrastTreatment ? { contrastTreatment } : {},
17029
+ ...navTextSize ? { textSize: navTextSize } : {}
17030
+ };
17031
+ if (header.navWeight === "bold" && navStyle === "solid") style.textTransform = "uppercase";
17032
+ applyLegacyGlassTreatment(style, header, navStyle);
17033
+ return style;
17034
+ }
17035
+ function applyLegacyGlassTreatment(style, header, navStyle) {
17036
+ if (header.navContainer?.type !== "glass" || navStyle !== "minimal") return;
17037
+ style.borderRadius = "full";
17038
+ style.effects = {
17039
+ ...style.effects,
17040
+ hover: glassStateEffects(10),
17041
+ active: glassStateEffects(18)
17042
+ };
17043
+ }
17044
+ function glassStateEffects(opacity) {
17045
+ return [{
17046
+ effectId: "background-on-hover-alpha",
17047
+ options: {
17048
+ colorToken: "neutral-50",
17049
+ opacity
17050
+ }
17051
+ }, {
17052
+ effectId: "text-color-change",
17053
+ options: { hoverColorToken: "neutral-50" }
17054
+ }];
17055
+ }
17056
+ //#endregion
17057
+ //#region ../theme-core/src/header/openingForegroundProjection.ts
17058
+ function readOpeningForegroundProjection(header) {
17059
+ return header?.__runtimeOpeningForeground ?? null;
17060
+ }
17061
+ //#endregion
17062
+ //#region ../theme-core/src/header/effectiveNavLinkStyle.ts
17063
+ function effectiveHeaderNavLinkStyle(header, contrastTreatment = null, navTextSize = null) {
17064
+ if (!header) return null;
17065
+ if (!header.navLinkStyle) return buildLegacyHeaderNavLinkStyle(header, contrastTreatment, navTextSize);
17066
+ return {
17067
+ ...header.navLinkStyle,
17068
+ ...contrastTreatment ? { contrastTreatment } : {},
17069
+ ...navTextSize ? { textSize: navTextSize } : {}
17070
+ };
17071
+ }
17072
+ function headerForegroundCandidates(header) {
17073
+ if (!header) return {};
17074
+ const style = effectiveHeaderNavLinkStyle(header);
17075
+ return {
17076
+ text: header.textColor ?? header.background?.textColor,
17077
+ link: style?.colorToken ?? header.navColor ?? header.textColor,
17078
+ linkHover: navLinkHoverColorCandidate(style)
17079
+ };
17080
+ }
17081
+ function headerLeafTextColor(header) {
17082
+ if (!header) return "text";
17083
+ return header.textColor ?? header.navColor ?? header.background?.textColor ?? header.navLinkStyle?.colorToken ?? "text";
17084
+ }
17085
+ /** Transparent chrome must reset the whole contract on its own root. */
17086
+ function transparentHeaderForegroundInput(header, palette) {
17087
+ const projection = readOpeningForegroundProjection(header);
17088
+ if (projection?.kind === "known") return surfaceForegroundInputFromResolved(projection, rgbColorValue);
17089
+ return authoredTransparentHeaderForegroundInput(header, palette);
17090
+ }
17091
+ function authoredTransparentHeaderForegroundInput(header, palette) {
17092
+ const text = headerLeafTextColor(header);
17093
+ const style = effectiveHeaderNavLinkStyle(header);
17094
+ const link = style?.colorToken ?? text;
17095
+ const restingToken = parseThemeColorToken(link) ?? parseThemeColorToken("text");
17096
+ if (!restingToken) throw new Error("Built-in text colour token is invalid");
17097
+ const hover = planForegroundHover({
17098
+ restingToken,
17099
+ candidate: navLinkOwnsHoverForeground(style) ? null : navLinkHoverColorCandidate(style),
17100
+ palette,
17101
+ backdrops: null
17102
+ });
17103
+ return {
17104
+ text: rgbColorValue(text),
17105
+ link: rgbColorValue(link),
17106
+ linkHover: rgbColorValue(hover.token),
17107
+ hoverDecoration: navLinkOwnsUnderline(style) ? "initial" : hover.decoration
17108
+ };
17109
+ }
17110
+ //#endregion
16579
17111
  //#region ../theme-core/src/site-styles/pageDesignAuthority.ts
16580
17112
  const nonEmptyStringSchema = z.string().min(1);
16581
17113
  const blockContentVersionIdSchema = nonEmptyStringSchema.transform(asBlockContentVersionId);
@@ -16728,6 +17260,28 @@ z.object({
16728
17260
  motion: z.enum(themeTokenRecipeOptions.motion)
16729
17261
  });
16730
17262
  //#endregion
17263
+ //#region ../theme-core/src/footer/effectiveNavLinkStyle.ts
17264
+ function effectiveFooterNavLinkStyle(footer) {
17265
+ if (!footer) return null;
17266
+ if (footer.navLinkStyle) return footer.navLinkStyle;
17267
+ const basePreset = getNavLinkPreset(footer.navStyle ?? "minimal");
17268
+ if (!basePreset) return null;
17269
+ return {
17270
+ ...basePreset,
17271
+ fontWeight: footer.navWeight ?? basePreset.fontWeight,
17272
+ colorToken: footer.navColor?.trim() || basePreset.colorToken
17273
+ };
17274
+ }
17275
+ function footerForegroundCandidates(footer, proseHoverCandidate) {
17276
+ if (!footer) return {};
17277
+ const style = effectiveFooterNavLinkStyle(footer);
17278
+ return {
17279
+ text: footer.background?.textColor,
17280
+ link: style?.colorToken ?? footer.navColor ?? footer.background?.textColor,
17281
+ linkHover: navLinkOwnsHoverForeground(style) ? proseHoverCandidate : navLinkHoverColorCandidate(style)
17282
+ };
17283
+ }
17284
+ //#endregion
16731
17285
  //#region ../theme-core/src/siteChromeOverlayClearance.ts
16732
17286
  const SITE_CHROME_VISIBLE_HEADER_ATTR = "data-site-chrome-visible-header";
16733
17287
  //#endregion
@@ -19701,33 +20255,28 @@ function resolveBackgroundColorValue(value, context) {
19701
20255
  //#endregion
19702
20256
  //#region ../blocks/src/system/transforms/registry/_utils/surfaceForegroundStyles.ts
19703
20257
  const contextualButtonStylesCache = /* @__PURE__ */ new WeakMap();
19704
- function resolveHeaderLeafTextColor(header) {
19705
- return header?.textColor ?? header?.navColor ?? header?.background?.textColor ?? header?.navLinkStyle?.colorToken ?? "text";
19706
- }
19707
20258
  function resolveHeaderRootForeground(header, palette, isTransparent) {
19708
- if (isTransparent) return { kind: "unknown" };
20259
+ if (isTransparent) return readOpeningForegroundProjection(header) ?? { kind: "unknown" };
19709
20260
  const background = header?.background;
19710
20261
  return resolveSurfaceForeground(background ?? {
19711
20262
  type: "color",
19712
20263
  color: "surface"
19713
- }, palette, {
19714
- text: header?.textColor ?? background?.textColor,
19715
- link: header?.navLinkStyle?.colorToken ?? header?.navColor ?? header?.textColor
19716
- });
20264
+ }, palette, headerForegroundCandidates(header));
20265
+ }
20266
+ function resolveFooterRootForeground(footer, palette, proseHoverCandidate) {
20267
+ return resolveSurfaceForeground(footer?.background ?? {
20268
+ type: "color",
20269
+ color: "surface"
20270
+ }, palette, footerForegroundCandidates(footer, proseHoverCandidate), { compositeBase: "background" });
19717
20271
  }
19718
20272
  function resolveSurfaceForegroundStyles(value, context, options) {
19719
20273
  const input = parseBackgroundContent(value);
19720
- const foreground = input ? resolveSurfaceForeground(input, context.theme.palette, {}, { compositeBase: options?.fallbackToken }) : { kind: "unknown" };
20274
+ const foreground = input ? resolveSurfaceForeground(input, context.theme.palette, { linkHover: context.proseHoverCandidate }, { compositeBase: options?.fallbackToken }) : { kind: "unknown" };
19721
20275
  const buttonStyles = resolveContextualButtonStyles(input, foreground, context, options);
19722
20276
  if (foreground.kind === "unknown") return buttonStyles;
19723
20277
  return {
19724
20278
  ...buttonStyles,
19725
- ...surfaceForegroundStyle({
19726
- text: resolveBackgroundColorValue(foreground.roles.text, context),
19727
- heading: resolveBackgroundColorValue(foreground.roles.heading, context),
19728
- link: resolveBackgroundColorValue(foreground.roles.link, context),
19729
- supporting: resolveBackgroundColorValue(foreground.roles.supporting, context)
19730
- })
20279
+ ...surfaceForegroundStyle(surfaceForegroundInputFromResolved(foreground, (token) => resolveBackgroundColorValue(token, context)))
19731
20280
  };
19732
20281
  }
19733
20282
  function resolveContextualButtonStyles(background, foreground, context, options) {
@@ -25543,10 +26092,7 @@ function resolveBackgroundVisualStyles(backgroundColor, defaultToken = "surface"
25543
26092
  };
25544
26093
  }
25545
26094
  function resolveHeaderVisualStyles(header) {
25546
- const navContainerType = header?.navContainer?.type ?? "none";
25547
- const hasContainedNav = navContainerType === "glass" || navContainerType === "pill";
25548
- const hasOverlayVariant = header?.variant === "floating";
25549
- if (hasContainedNav || hasOverlayVariant) return {
26095
+ if (headerRootPaint(header) !== "own-surface") return {
25550
26096
  backgroundToken: "transparent",
25551
26097
  isTransparent: true
25552
26098
  };
@@ -25557,23 +26103,7 @@ function resolveHeaderVisualStyles(header) {
25557
26103
  }
25558
26104
  function resolvedForegroundStyle(foreground) {
25559
26105
  if (foreground.kind === "unknown") return void 0;
25560
- const { roles } = foreground;
25561
- return surfaceForegroundStyle({
25562
- text: rgbColorValue(roles.text),
25563
- heading: rgbColorValue(roles.heading),
25564
- link: rgbColorValue(roles.link),
25565
- supporting: rgbColorValue(roles.supporting)
25566
- });
25567
- }
25568
- function resolveFooterRootForeground(footer, palette) {
25569
- const background = footer?.background;
25570
- return resolveSurfaceForeground(background ?? {
25571
- type: "color",
25572
- color: "surface"
25573
- }, palette, {
25574
- text: background?.textColor,
25575
- link: footer?.navLinkStyle?.colorToken ?? footer?.navColor ?? background?.textColor
25576
- });
26106
+ return surfaceForegroundStyle(surfaceForegroundInputFromResolved(foreground, rgbColorValue));
25577
26107
  }
25578
26108
  function footerBottomBarBorderWidthStyle(width) {
25579
26109
  if (!width) return void 0;
@@ -25600,8 +26130,7 @@ const headerRootClassTransform = {
25600
26130
  const placement = planSiteChromePlacement(parseHeaderPositioning(content.positioning));
25601
26131
  const header = asPartialObject(value);
25602
26132
  const visuals = resolveHeaderVisualStyles(header);
25603
- const navContainerType = header?.navContainer?.type ?? "none";
25604
- const hasContainedNav = navContainerType === "glass" || navContainerType === "pill";
26133
+ const hasContainedNav = headerRootPaint(header) === "contained-nav";
25605
26134
  const backgroundClass = visuals.isTransparent || hasContainedNav ? "rb-bg-transparent" : null;
25606
26135
  const classes = [config.base, backgroundClass];
25607
26136
  if (!hasContainedNav) {
@@ -25644,7 +26173,7 @@ const headerRootStyleTransform = {
25644
26173
  run: (value, _options, context) => {
25645
26174
  const header = asPartialObject(value);
25646
26175
  const visuals = resolveHeaderVisualStyles(header);
25647
- return mergeStyles(resolvedForegroundStyle(resolveHeaderRootForeground(header, context.theme.palette, visuals.isTransparent)) ?? { color: rgbColorValue(resolveHeaderLeafTextColor(header)) }, borderColorStyle(header?.border?.colorToken ?? "border"));
26176
+ 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"));
25648
26177
  }
25649
26178
  };
25650
26179
  const headerSectionBackgroundTransform = {
@@ -25652,9 +26181,7 @@ const headerSectionBackgroundTransform = {
25652
26181
  kind: "string",
25653
26182
  summary: "Resolve the inner site-header section background token",
25654
26183
  run: (value) => {
25655
- const header = asPartialObject(value);
25656
- const navContainerType = header?.navContainer?.type ?? "none";
25657
- return header?.variant === "floating" || navContainerType === "glass" || navContainerType === "pill" ? "raw:transparent" : "background";
26184
+ return headerRootPaint(asPartialObject(value)) !== "own-surface" ? "raw:transparent" : "background";
25658
26185
  }
25659
26186
  };
25660
26187
  const footerRootStyleTransform = {
@@ -25672,7 +26199,7 @@ const footerRootStyleTransform = {
25672
26199
  styleParts.push(backgroundColorStyle(token));
25673
26200
  }
25674
26201
  }
25675
- styleParts.push(resolvedForegroundStyle(resolveFooterRootForeground(footer, context.theme.palette)));
26202
+ styleParts.push(resolvedForegroundStyle(resolveFooterRootForeground(footer, context.theme.palette, context.proseHoverCandidate)));
25676
26203
  styleParts.push(borderColorStyle("border"));
25677
26204
  return mergeStyles(...styleParts);
25678
26205
  }
@@ -25734,22 +26261,28 @@ const footerBottomBarStyleTransform = {
25734
26261
  run: (value, _options, context) => {
25735
26262
  const footer = asPartialObject(value);
25736
26263
  const bottomBar = footer?.bottomBar;
25737
- const styleParts = [];
25738
- const background = bottomBar?.background;
25739
- if (background?.type === "color") styleParts.push(backgroundColorStyle(background.color ?? "surface"));
25740
- styleParts.push(borderColorStyle(bottomBar?.borderTop?.colorToken ?? "border"), footerBottomBarBorderWidthStyle(bottomBar?.borderTop?.width));
25741
- const foreground = resolveSurfaceForeground(background?.type === "color" ? background : {
25742
- type: "color",
25743
- color: "transparent"
25744
- }, context.theme.palette, {
25745
- text: bottomBar?.textColor,
25746
- link: footer?.bottomTextLinkStyle?.colorToken ?? bottomBar?.textColor
25747
- });
25748
- if (background?.type === "color") styleParts.push(resolvedForegroundStyle(foreground));
25749
- else if (bottomBar?.textColor) styleParts.push(textColorStyle(bottomBar.textColor));
25750
- return mergeStyles(...styleParts);
26264
+ 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));
25751
26265
  }
25752
26266
  };
26267
+ function footerBottomBarForegroundStyle(footer, palette) {
26268
+ if (!footer?.bottomBar) return void 0;
26269
+ const bar = footer.bottomBar;
26270
+ if (bar.background?.type !== "color") return backgroundlessBottomBarForegroundStyle(footer);
26271
+ return resolvedForegroundStyle(resolveSurfaceForeground(bar.background, palette, {
26272
+ text: bar.textColor,
26273
+ link: footer.bottomTextLinkStyle?.colorToken ?? bar.textColor,
26274
+ linkHover: footer.bottomTextLinkStyle?.hoverColorToken
26275
+ }, { compositeBase: measuredFooterBackdrop(footer, palette) }));
26276
+ }
26277
+ function backgroundlessBottomBarForegroundStyle(footer) {
26278
+ if (footer.background?.contentOwner === "site-chrome-editor") return;
26279
+ const textColor = footer.bottomBar?.textColor;
26280
+ return textColor ? textColorStyle(textColor) : void 0;
26281
+ }
26282
+ function measuredFooterBackdrop(footer, palette) {
26283
+ const foreground = resolveFooterRootForeground(footer, palette);
26284
+ return foreground.kind === "known" && foreground.provenance.kind === "measured" ? foreground.provenance.backdropHex : null;
26285
+ }
25753
26286
  const footerSplitMainClassTransform = {
25754
26287
  id: "layout.footerSplitMainClass",
25755
26288
  kind: "string",
@@ -25845,7 +26378,7 @@ function chromeSurfaceTextToken(surface, theme, palette) {
25845
26378
  case "header-root": {
25846
26379
  const header = theme.header;
25847
26380
  const foreground = resolveHeaderRootForeground(header, palette, resolveHeaderVisualStyles(header).isTransparent);
25848
- return foreground.kind === "known" ? foreground.roles.text : resolveHeaderLeafTextColor(header);
26381
+ return foreground.kind === "known" ? foreground.roles.text : headerLeafTextColor(header);
25849
26382
  }
25850
26383
  case "header-mobile-panel": return theme.header?.dropdownStyle?.textColor ?? "text";
25851
26384
  case "footer-root": {
@@ -27932,7 +28465,9 @@ const bookingWizard = bookingForm(withApiBindings({
27932
28465
  } },
27933
28466
  formId: { $bind: { from: "content.formId" } },
27934
28467
  form: { $bind: { from: "data.form" } },
27935
- services: { $bind: { from: "data.services" } }
28468
+ services: { $bind: { from: "data.services" } },
28469
+ mailingList: { $bind: { from: "$root.mailingList" } },
28470
+ siteName: { $bind: { from: "$root.siteName" } }
27936
28471
  }));
27937
28472
  /** Both variants sit in the same section shell; only the inner layout differs. */
27938
28473
  function bookingSection(children) {
@@ -29434,7 +29969,13 @@ const eventRegistrationHydrationSchemaShape = {
29434
29969
  spamProtectionEnabled: z.boolean().optional(),
29435
29970
  supportEmail: z.string().optional(),
29436
29971
  sitePasses: publicPassProductCollectionSchema.nullable().optional(),
29437
- siteMemberships: publicMembershipProductCollectionSchema.nullable().optional()
29972
+ siteMemberships: publicMembershipProductCollectionSchema.nullable().optional(),
29973
+ mailingList: z.unknown().transform((value) => {
29974
+ if (value === void 0) return void 0;
29975
+ const parsed = parseMailingListRuntimeContext(value);
29976
+ return parsed.ok ? parsed.value : void 0;
29977
+ }),
29978
+ siteName: z.string().optional()
29438
29979
  };
29439
29980
  const eventRegistrationEventSourceSchema = z.discriminatedUnion("kind", [z.object({
29440
29981
  kind: z.literal("loaded"),
@@ -29606,7 +30147,9 @@ const eventRegistrationBlockRuntime = defineClientOwnedBlockRuntime({
29606
30147
  spamProtectionEnabled: source.spamProtectionEnabled,
29607
30148
  supportEmail: source.supportEmail,
29608
30149
  sitePasses: source.sitePasses ?? null,
29609
- siteMemberships: source.siteMemberships ?? null
30150
+ siteMemberships: source.siteMemberships ?? null,
30151
+ mailingList: source.mailingList,
30152
+ siteName: source.siteName
29610
30153
  }
29611
30154
  };
29612
30155
  }
@@ -29774,6 +30317,8 @@ const eventRegistrationBlockDefinition = {
29774
30317
  events: { $bind: { from: "data.events" } },
29775
30318
  wholeSeriesRunEvents: { $bind: { from: "data.wholeSeriesRunEvents" } },
29776
30319
  loaderFailures: { $bind: { from: "$root.loaderFailures" } },
30320
+ mailingList: { $bind: { from: "$root.mailingList" } },
30321
+ siteName: { $bind: { from: "$root.siteName" } },
29777
30322
  sitePasses: { $bind: { from: "data.sitePasses" } },
29778
30323
  siteMemberships: { $bind: { from: "data.siteMemberships" } },
29779
30324
  stage: { $bind: {
@@ -36657,65 +37202,67 @@ const editorialSplitLayout = styledSection({
36657
37202
  spacing: "comfortable",
36658
37203
  background: "surface"
36659
37204
  });
36660
- const newsletterSignupBlockDefinition = {
36661
- manifest: createBlockManifest({
36662
- id: "block.newsletter-signup",
36663
- title: "Newsletter Signup",
36664
- titleSource: "title",
36665
- description: "Newsletter subscription form with configurable field presets.",
36666
- category: "interactive",
36667
- contentSource: { kind: "inline" },
36668
- fragments: [{
36669
- fragment: newsletterCopyFragment,
36670
- fieldPriority: 0
36671
- }, {
36672
- fragment: newsletterFormFragment,
36673
- fieldPriority: 1
36674
- }],
36675
- layout: stackedLayout,
36676
- variants: {
36677
- stacked: stackedLayout,
36678
- inline: inlineLayout,
36679
- "editorial-split": editorialSplitLayout
36680
- },
36681
- defaultVariant: "stacked",
36682
- variantOptions: {
36683
- stacked: {
36684
- label: "Stacked",
36685
- description: "Vertical layout with fields stacked"
36686
- },
36687
- inline: {
36688
- label: "Inline",
36689
- description: "Horizontal layout (email + button side by side)"
36690
- },
36691
- "editorial-split": {
36692
- label: "Editorial split",
36693
- description: "Copy and form in balanced side-by-side columns, stacked on mobile."
36694
- }
36695
- },
36696
- styleTokens: {
36697
- background: "surface",
36698
- typography: "body",
36699
- spacing: "md"
37205
+ const newsletterSignupManifest = createBlockManifest({
37206
+ id: "block.newsletter-signup",
37207
+ title: "Newsletter Signup",
37208
+ titleSource: "title",
37209
+ description: "Newsletter subscription form with configurable field presets.",
37210
+ category: "interactive",
37211
+ contentSource: { kind: "inline" },
37212
+ fragments: [{
37213
+ fragment: newsletterCopyFragment,
37214
+ fieldPriority: 0
37215
+ }, {
37216
+ fragment: newsletterFormFragment,
37217
+ fieldPriority: 1
37218
+ }],
37219
+ layout: stackedLayout,
37220
+ variants: {
37221
+ stacked: stackedLayout,
37222
+ inline: inlineLayout,
37223
+ "editorial-split": editorialSplitLayout
37224
+ },
37225
+ defaultVariant: "stacked",
37226
+ variantOptions: {
37227
+ stacked: {
37228
+ label: "Stacked",
37229
+ description: "Vertical layout with fields stacked"
36700
37230
  },
36701
- behaviours: {
36702
- supportsThemeSwitching: true,
36703
- inlineEditing: false,
36704
- animation: false,
36705
- paletteHidden: false
37231
+ inline: {
37232
+ label: "Inline",
37233
+ description: "Horizontal layout (email + button side by side)"
36706
37234
  },
36707
- tags: [
36708
- "newsletter",
36709
- "signup",
36710
- "email",
36711
- "subscribe",
36712
- "subscription",
36713
- "mailchimp",
36714
- "marketing",
36715
- "lead-capture"
36716
- ],
36717
- icon: "Mail"
36718
- }),
37235
+ "editorial-split": {
37236
+ label: "Editorial split",
37237
+ description: "Copy and form in balanced side-by-side columns, stacked on mobile."
37238
+ }
37239
+ },
37240
+ styleTokens: {
37241
+ background: "surface",
37242
+ typography: "body",
37243
+ spacing: "md"
37244
+ },
37245
+ behaviours: {
37246
+ supportsThemeSwitching: true,
37247
+ inlineEditing: false,
37248
+ animation: false,
37249
+ paletteHidden: false
37250
+ },
37251
+ tags: [
37252
+ "newsletter",
37253
+ "signup",
37254
+ "email",
37255
+ "subscribe",
37256
+ "subscription",
37257
+ "mailchimp",
37258
+ "marketing",
37259
+ "lead-capture"
37260
+ ],
37261
+ icon: "Mail"
37262
+ });
37263
+ [...(newsletterSignupManifest.fields ?? []).map((field) => field.id)];
37264
+ const newsletterSignupBlockDefinition = {
37265
+ manifest: newsletterSignupManifest,
36719
37266
  runtime: newsletterFormBlockRuntime
36720
37267
  };
36721
37268
  //#endregion
@@ -38757,7 +39304,8 @@ const BOOKING_FORM_DATA_RESERVED_KEYS = /* @__PURE__ */ new Set([
38757
39304
  "discountCode",
38758
39305
  "selectedSlidingAmountInput",
38759
39306
  "selectedCollectionOptionKind",
38760
- "selectedAppointmentPackageId"
39307
+ "selectedAppointmentPackageId",
39308
+ "mailingListOptIn"
38761
39309
  ]);
38762
39310
  function isBookingFormDataReservedKey(value) {
38763
39311
  return BOOKING_FORM_DATA_RESERVED_KEYS.has(value);