@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
@@ -63,6 +63,64 @@ function defineEndpointDefinitions(definitions) {
63
63
  return definitions;
64
64
  }
65
65
  //#endregion
66
+ //#region ../api/src/apiEndpointTypes.ts
67
+ function allowedDemoMutationPolicy() {
68
+ return {
69
+ classification: "allowed",
70
+ publicMessage: ""
71
+ };
72
+ }
73
+ function blockedDemoMutationPolicy(classification, publicMessage) {
74
+ if (publicMessage.trim() === "") throw new Error(`Demo mutation policy ${classification} requires publicMessage.`);
75
+ return {
76
+ classification,
77
+ publicMessage
78
+ };
79
+ }
80
+ //#endregion
81
+ //#region ../api/src/demoMutationPolicies.ts
82
+ const DEMO_MUTATION_BLOCKED_HIDDEN = blockedDemoMutationPolicy("blocked-hidden", "This action is not available in demo sites.");
83
+ const DEMO_MUTATION_BLOCKED_DISABLED = blockedDemoMutationPolicy("blocked-disabled", "This setting is disabled in demo sites.");
84
+ blockedDemoMutationPolicy("internal-only", "This internal operation is not available in demo sites.");
85
+ const DEMO_MUTATION_ALLOWED = allowedDemoMutationPolicy();
86
+ //#endregion
87
+ //#region ../api/src/siteLifecycleEndpoints.ts
88
+ const SITE_LIFECYCLE_ENDPOINT_DEFINITIONS = defineEndpointDefinitions({
89
+ createSite: {
90
+ path: "/sites/manage",
91
+ method: "POST",
92
+ tags: ["site"],
93
+ auth: "user",
94
+ responseKind: "json",
95
+ errors: []
96
+ },
97
+ createSiteManual: {
98
+ path: "/sites/manual",
99
+ method: "POST",
100
+ tags: ["site"],
101
+ auth: "user",
102
+ responseKind: "json",
103
+ errors: []
104
+ },
105
+ updateSite: {
106
+ path: "/sites/manage",
107
+ method: "PUT",
108
+ tags: ["site"],
109
+ auth: "user",
110
+ responseKind: "json",
111
+ errors: []
112
+ },
113
+ deleteSite: {
114
+ path: "/sites/{siteId}",
115
+ method: "DELETE",
116
+ tags: ["site", "site-{siteId}"],
117
+ auth: "user",
118
+ responseKind: "json",
119
+ errors: [],
120
+ demoMutation: DEMO_MUTATION_BLOCKED_HIDDEN
121
+ }
122
+ });
123
+ //#endregion
66
124
  //#region ../api/src/publicNewsletterEndpointDefinitions.ts
67
125
  const PUBLIC_NEWSLETTER_ENDPOINT_DEFINITIONS = defineEndpointDefinitions({
68
126
  subscribeNewsletter: {
@@ -123,27 +181,6 @@ const PUBLIC_NEWSLETTER_ENDPOINT_DEFINITIONS = defineEndpointDefinitions({
123
181
  }
124
182
  });
125
183
  //#endregion
126
- //#region ../api/src/apiEndpointTypes.ts
127
- function allowedDemoMutationPolicy() {
128
- return {
129
- classification: "allowed",
130
- publicMessage: ""
131
- };
132
- }
133
- function blockedDemoMutationPolicy(classification, publicMessage) {
134
- if (publicMessage.trim() === "") throw new Error(`Demo mutation policy ${classification} requires publicMessage.`);
135
- return {
136
- classification,
137
- publicMessage
138
- };
139
- }
140
- //#endregion
141
- //#region ../api/src/demoMutationPolicies.ts
142
- const DEMO_MUTATION_BLOCKED_HIDDEN = blockedDemoMutationPolicy("blocked-hidden", "This action is not available in demo sites.");
143
- const DEMO_MUTATION_BLOCKED_DISABLED = blockedDemoMutationPolicy("blocked-disabled", "This setting is disabled in demo sites.");
144
- blockedDemoMutationPolicy("internal-only", "This internal operation is not available in demo sites.");
145
- const DEMO_MUTATION_ALLOWED = allowedDemoMutationPolicy();
146
- //#endregion
147
184
  //#region ../api/src/cache-tags.ts
148
185
  /**
149
186
  * Tag templates for endpoint definitions (support `{param}` placeholders).
@@ -1170,6 +1207,20 @@ const NEWSLETTER_ENDPOINT_DEFINITIONS = defineEndpointDefinitions({
1170
1207
  responseKind: "json",
1171
1208
  errors: ["auth:forbidden", "server:internal_error"]
1172
1209
  },
1210
+ setMailingListBookingOptIn: {
1211
+ path: "/sites/{siteId}/mailing-list/setup/booking-opt-in",
1212
+ method: "PUT",
1213
+ tags: [TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter],
1214
+ auth: "user",
1215
+ responseKind: "json",
1216
+ demoMutation: DEMO_MUTATION_BLOCKED_DISABLED,
1217
+ errors: [
1218
+ "auth:forbidden",
1219
+ "validation:invalid_input",
1220
+ "resource:conflict",
1221
+ "server:internal_error"
1222
+ ]
1223
+ },
1173
1224
  getMailingListAuthoringContext: {
1174
1225
  path: "/sites/{siteId}/mailing-list/authoring-context",
1175
1226
  method: "GET",
@@ -2327,17 +2378,35 @@ function parseMailingListRuntimeContext(value) {
2327
2378
  if (!isRecord$8(value)) return invalidRuntimeContext();
2328
2379
  if (value.tag === "not_configured") return ok({ tag: "not_configured" });
2329
2380
  if (value.tag !== "configured") return invalidRuntimeContext();
2381
+ return parseConfiguredRuntimeContext(value);
2382
+ }
2383
+ function parseConfiguredRuntimeContext(value) {
2330
2384
  const revision = parseMailingListSetupRevision(value.revision);
2331
2385
  const form = parseMailingListGlobalForm(value.form);
2332
2386
  const provider = parseRuntimeProvider(value.provider);
2333
- if (revision === null || !form.ok || provider === null) return invalidRuntimeContext();
2387
+ const bookingSignup = parseBookingSignupOffer(value.bookingSignup);
2388
+ if (revision === null || !form.ok || provider === null || bookingSignup === null) return invalidRuntimeContext();
2334
2389
  return ok({
2335
2390
  tag: "configured",
2336
2391
  revision,
2392
+ bookingSignup,
2337
2393
  form: form.value,
2338
2394
  provider
2339
2395
  });
2340
2396
  }
2397
+ function parseBookingSignupOffer(value) {
2398
+ if (value === void 0) return {
2399
+ tag: "unavailable",
2400
+ reason: "disabled"
2401
+ };
2402
+ if (!isRecord$8(value)) return null;
2403
+ if (value.tag === "offered") return { tag: "offered" };
2404
+ if (value.tag === "unavailable" && (value.reason === "disabled" || value.reason === "fields" || value.reason === "destination")) return {
2405
+ tag: "unavailable",
2406
+ reason: value.reason
2407
+ };
2408
+ return null;
2409
+ }
2341
2410
  function parseRuntimeProvider(value) {
2342
2411
  if (!isRecord$8(value)) return null;
2343
2412
  switch (value.provider) {
@@ -3827,6 +3896,54 @@ const BILLING_ENDPOINT_DEFINITIONS = defineEndpointDefinitions({
3827
3896
  }
3828
3897
  });
3829
3898
  //#endregion
3899
+ //#region ../api/src/bookingPeopleEndpointDefinitions.ts
3900
+ /**
3901
+ * People endpoints (#1356): the People list, its CSV export, and deleting a
3902
+ * person when nothing is attached to them.
3903
+ */
3904
+ const BOOKING_PEOPLE_ENDPOINT_DEFINITIONS = defineEndpointDefinitions({
3905
+ listPeople: {
3906
+ path: "/sites/{siteId}/bookings/people",
3907
+ method: "GET",
3908
+ tags: ["site-{siteId}", "customers-{siteId}"],
3909
+ auth: "user",
3910
+ responseKind: "json",
3911
+ errors: ["server:internal_error"]
3912
+ },
3913
+ exportPeopleCsv: {
3914
+ path: "/sites/{siteId}/bookings/people/export.csv",
3915
+ method: "GET",
3916
+ tags: ["site-{siteId}", "customers-{siteId}"],
3917
+ auth: "user",
3918
+ errors: [],
3919
+ responseKind: "blob"
3920
+ },
3921
+ checkPersonDeletion: {
3922
+ path: "/sites/{siteId}/bookings/people/{personId}/deletion-check",
3923
+ method: "GET",
3924
+ tags: ["site-{siteId}", "customers-{siteId}"],
3925
+ auth: "user",
3926
+ responseKind: "json",
3927
+ errors: [
3928
+ "auth:forbidden",
3929
+ "resource:not_found",
3930
+ "server:internal_error"
3931
+ ]
3932
+ },
3933
+ deletePerson: {
3934
+ path: "/sites/{siteId}/bookings/people/{personId}",
3935
+ method: "DELETE",
3936
+ tags: ["site-{siteId}", "customers-{siteId}"],
3937
+ auth: "user",
3938
+ responseKind: "json",
3939
+ errors: [
3940
+ "auth:forbidden",
3941
+ "resource:not_found",
3942
+ "server:internal_error"
3943
+ ]
3944
+ }
3945
+ });
3946
+ //#endregion
3830
3947
  //#region ../api/src/clientErrorReporting.ts
3831
3948
  const CLIENT_ERROR_REPORT_ENDPOINT_DEFINITIONS = defineEndpointDefinitions({ reportClientError: {
3832
3949
  path: "/client/error-report",
@@ -3862,6 +3979,7 @@ z.object({
3862
3979
  sourceLocation: z.string().max(CLIENT_ERROR_REPORT_LIMITS.sourceLocation).nullable()
3863
3980
  }).strict();
3864
3981
  ({
3982
+ ...SITE_LIFECYCLE_ENDPOINT_DEFINITIONS,
3865
3983
  ...CLIENT_ERROR_REPORT_ENDPOINT_DEFINITIONS,
3866
3984
  ...PUBLIC_NEWSLETTER_ENDPOINT_DEFINITIONS,
3867
3985
  ...ACCOUNT_ENDPOINT_DEFINITIONS,
@@ -3875,7 +3993,7 @@ z.object({
3875
3993
  ...NEWSLETTER_ENDPOINT_DEFINITIONS,
3876
3994
  ...APPOINTMENT_ENDPOINT_DEFINITIONS,
3877
3995
  ...EVENT_SERIES_REGISTRATION_ENDPOINT_DEFINITIONS
3878
- }, 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 };
3996
+ }, 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 };
3879
3997
  z.object({ refreshToken: z.string().min(1).max(4096) }).strict();
3880
3998
  z.object({
3881
3999
  accessToken: z.string().min(1).max(4096),
@@ -6376,13 +6494,16 @@ const SURFACE_FOREGROUND_CSS_VARS = {
6376
6494
  text: "--rb-surface-text-color",
6377
6495
  heading: "--rb-surface-heading-color",
6378
6496
  link: "--rb-surface-link-color",
6497
+ linkHover: "--rb-surface-link-hover-color",
6379
6498
  supporting: "--rb-surface-supporting-color"
6380
6499
  };
6381
6500
  const DEFAULT_SURFACE_TEXT_COLOR = "rgb(var(--tb-text, 17 24 39))";
6501
+ const DEFAULT_SURFACE_LINK_COLOR = "rgb(var(--tb-primary, var(--tb-text, 17 24 39)))";
6382
6502
  const DEFAULT_ROLE_FALLBACKS = {
6383
6503
  text: DEFAULT_SURFACE_TEXT_COLOR,
6384
6504
  heading: DEFAULT_SURFACE_TEXT_COLOR,
6385
- link: "rgb(var(--tb-primary, var(--tb-text, 17 24 39)))",
6505
+ link: DEFAULT_SURFACE_LINK_COLOR,
6506
+ linkHover: DEFAULT_SURFACE_LINK_COLOR,
6386
6507
  supporting: "rgb(var(--tb-mutedText, 100 116 139))"
6387
6508
  };
6388
6509
  function requireSurfaceColorValue(role, value) {
@@ -6392,10 +6513,12 @@ function requireSurfaceColorValue(role, value) {
6392
6513
  }
6393
6514
  function completeSurfaceForegrounds(input) {
6394
6515
  const text = requireSurfaceColorValue("text", input.text);
6516
+ const link = input.link === void 0 ? text : requireSurfaceColorValue("link", input.link);
6395
6517
  return {
6396
6518
  text,
6397
6519
  heading: input.heading === void 0 ? text : requireSurfaceColorValue("heading", input.heading),
6398
- link: input.link === void 0 ? text : requireSurfaceColorValue("link", input.link),
6520
+ link,
6521
+ linkHover: input.linkHover === void 0 ? link : requireSurfaceColorValue("linkHover", input.linkHover),
6399
6522
  supporting: input.supporting === void 0 ? text : requireSurfaceColorValue("supporting", input.supporting)
6400
6523
  };
6401
6524
  }
@@ -6403,6 +6526,7 @@ function surfaceForegroundValue(role, outsideProviderFallback = DEFAULT_ROLE_FAL
6403
6526
  const roleVariable = SURFACE_FOREGROUND_CSS_VARS[role];
6404
6527
  const fallback = requireSurfaceColorValue("fallback", outsideProviderFallback);
6405
6528
  if (role === "text") return `var(${roleVariable}, ${fallback})`;
6529
+ if (role === "linkHover") return `var(${roleVariable}, ${surfaceForegroundValue("link", fallback)})`;
6406
6530
  return `var(${roleVariable}, var(${SURFACE_FOREGROUND_CSS_VARS.text}, ${fallback}))`;
6407
6531
  }
6408
6532
  function surfaceForegroundValueWithOpacity(role, opacityPercent) {
@@ -6416,9 +6540,25 @@ function surfaceForegroundStyle(input) {
6416
6540
  [SURFACE_FOREGROUND_CSS_VARS.text]: foregrounds.text,
6417
6541
  [SURFACE_FOREGROUND_CSS_VARS.heading]: foregrounds.heading,
6418
6542
  [SURFACE_FOREGROUND_CSS_VARS.link]: foregrounds.link,
6419
- [SURFACE_FOREGROUND_CSS_VARS.supporting]: foregrounds.supporting
6543
+ [SURFACE_FOREGROUND_CSS_VARS.linkHover]: foregrounds.linkHover,
6544
+ [SURFACE_FOREGROUND_CSS_VARS.supporting]: foregrounds.supporting,
6545
+ "--rb-surface-link-hover-decoration": hoverDecoration(input)
6420
6546
  };
6421
6547
  }
6548
+ function surfaceForegroundInputFromResolved(foreground, color) {
6549
+ const { roles } = foreground;
6550
+ return {
6551
+ text: color(roles.text),
6552
+ heading: color(roles.heading),
6553
+ link: color(roles.link),
6554
+ linkHover: color(roles.linkHover),
6555
+ supporting: color(roles.supporting),
6556
+ hoverDecoration: foreground.hoverDecoration
6557
+ };
6558
+ }
6559
+ function hoverDecoration(input) {
6560
+ return input.hoverDecoration ?? "underline";
6561
+ }
6422
6562
  //#endregion
6423
6563
  //#region ../theme-core/src/buttons/constants.ts
6424
6564
  /**
@@ -7173,6 +7313,64 @@ function parseAlpha(source) {
7173
7313
  function isRgbChannel(value) {
7174
7314
  return Number.isFinite(value) && value >= 0 && value <= 255;
7175
7315
  }
7316
+ /**
7317
+ * Derive the hover foreground that belongs with a resolved resting foreground.
7318
+ *
7319
+ * A resting foreground is chosen to be legible against a known surface. A hover
7320
+ * state derived from it stays within a bounded distance of that colour, so it
7321
+ * inherits most of the resting colour's contrast margin instead of asserting
7322
+ * an unrelated brand colour that no one checked against the surface.
7323
+ *
7324
+ * That bounded-distance property is what lets this be used on a transparent
7325
+ * overlay header, where the backdrop is only partly knowable: the scrolled
7326
+ * state composites a 60% glass tint over arbitrary page content, so no
7327
+ * compile-time contrast proof is available there. Staying near a colour that
7328
+ * is already trusted in both states is a weaker claim than a contrast proof,
7329
+ * and it is one this function can actually keep.
7330
+ *
7331
+ * Returns `null` when the resting token is not a plain palette token — an
7332
+ * already-faded or raw value has no well-defined softening, and the caller
7333
+ * should leave hover alone rather than guess.
7334
+ */
7335
+ function deriveForegroundHoverToken(restingToken) {
7336
+ const parts = parseColorTokenParts(restingToken);
7337
+ if (parts.kind !== "token") return null;
7338
+ if (parts.opacityPercent !== null) return null;
7339
+ return parseThemeColorToken(`${parts.token}/85`);
7340
+ }
7341
+ /**
7342
+ * Prefer an authored hover that survives every measured backdrop, then a
7343
+ * checked softening of the resting colour. A null backdrop set represents a
7344
+ * trusted treatment: only an explicit authored hover may change the colour.
7345
+ * When neither option works, retain the resting colour and underline it.
7346
+ */
7347
+ function planForegroundHover(input) {
7348
+ const { restingToken, candidate, palette, backdrops } = input;
7349
+ if (candidate && candidate !== restingToken) {
7350
+ if (backdrops === null || survivesEveryBackdrop(candidate, palette, backdrops)) return {
7351
+ kind: "candidate",
7352
+ token: candidate,
7353
+ decoration: "initial"
7354
+ };
7355
+ }
7356
+ const softened = deriveForegroundHoverToken(restingToken);
7357
+ if (softened && backdrops && survivesEveryBackdrop(softened, palette, backdrops)) return {
7358
+ kind: "softened",
7359
+ token: softened,
7360
+ decoration: "initial"
7361
+ };
7362
+ return {
7363
+ kind: "resting",
7364
+ token: restingToken,
7365
+ decoration: "underline"
7366
+ };
7367
+ }
7368
+ function survivesEveryBackdrop(token, palette, backdrops) {
7369
+ return backdrops.length > 0 && backdrops.every((backdrop) => {
7370
+ const foreground = resolveOpaqueSurfaceHex(token, palette, backdrop);
7371
+ return foreground !== null && contrastRatio(foreground, backdrop) >= 4.5;
7372
+ });
7373
+ }
7176
7374
  //#endregion
7177
7375
  //#region ../theme-core/src/surfaces/resolveSurfaceForeground.ts
7178
7376
  const FALLBACK_TEXT_TOKENS = [
@@ -7219,12 +7417,16 @@ function resolveSurfaceForeground(background, palette, candidates = {}, options
7219
7417
  }
7220
7418
  function foregroundCandidates(background, overrides) {
7221
7419
  return {
7222
- text: overrides.text ?? background?.textColor ?? null,
7223
- heading: overrides.heading ?? background?.headingColor ?? null,
7224
- link: overrides.link ?? background?.linkColor ?? null,
7225
- supporting: overrides.supporting ?? background?.supportingColor ?? null
7420
+ text: candidateOrBackground(overrides.text, background?.textColor),
7421
+ heading: candidateOrBackground(overrides.heading, background?.headingColor),
7422
+ link: candidateOrBackground(overrides.link, background?.linkColor),
7423
+ linkHover: candidateOrBackground(overrides.linkHover),
7424
+ supporting: candidateOrBackground(overrides.supporting, background?.supportingColor)
7226
7425
  };
7227
7426
  }
7427
+ function candidateOrBackground(candidate, backgroundValue) {
7428
+ return candidate ?? backgroundValue ?? null;
7429
+ }
7228
7430
  function resolveDeterministicForeground(backgroundReference, candidates, palette, compositeBase) {
7229
7431
  const backgroundHex = resolveOpaqueSurfaceHex(backgroundReference, palette, compositeBase);
7230
7432
  if (!backgroundHex) return resolveTrustedTreatmentForeground(candidates, palette);
@@ -7236,29 +7438,51 @@ function resolveDeterministicForeground(backgroundReference, candidates, palette
7236
7438
  ...FALLBACK_TEXT_TOKENS
7237
7439
  ], backgroundHex, palette, derivedOnToken ? [derivedOnToken] : []);
7238
7440
  if (!text) return { kind: "unknown" };
7239
- return {
7240
- kind: "known",
7241
- roles: {
7242
- text,
7243
- heading: safeTokenOr(candidates.heading, text, backgroundHex, palette),
7244
- link: safeTokenOr(candidates.link, text, backgroundHex, palette),
7245
- supporting: safeTokenOr(candidates.supporting, text, backgroundHex, palette)
7246
- }
7247
- };
7441
+ return knownForeground({
7442
+ text,
7443
+ heading: safeTokenOr(candidates.heading, text, backgroundHex, palette),
7444
+ link: safeTokenOr(candidates.link, text, backgroundHex, palette),
7445
+ supporting: safeTokenOr(candidates.supporting, text, backgroundHex, palette)
7446
+ }, {
7447
+ kind: "measured",
7448
+ backdropHex: backgroundHex
7449
+ }, candidates.linkHover, palette);
7248
7450
  }
7249
7451
  function resolveTrustedTreatmentForeground(candidates, palette) {
7250
7452
  const text = canonicalToken(candidates.text, palette);
7251
7453
  if (!text) return { kind: "unknown" };
7454
+ return knownForeground({
7455
+ text,
7456
+ heading: canonicalToken(candidates.heading, palette) ?? text,
7457
+ link: canonicalToken(candidates.link, palette) ?? text,
7458
+ supporting: canonicalToken(candidates.supporting, palette) ?? text
7459
+ }, { kind: "trusted-treatment" }, candidates.linkHover, palette);
7460
+ }
7461
+ function knownForeground(roles, provenance, hoverCandidate, palette) {
7462
+ const hover = planForegroundHover({
7463
+ restingToken: roles.link,
7464
+ candidate: canonicalHoverToken(hoverCandidate, palette),
7465
+ palette,
7466
+ backdrops: provenance.kind === "measured" ? [provenance.backdropHex] : null
7467
+ });
7252
7468
  return {
7253
7469
  kind: "known",
7470
+ provenance,
7254
7471
  roles: {
7255
- text,
7256
- heading: canonicalToken(candidates.heading, palette) ?? text,
7257
- link: canonicalToken(candidates.link, palette) ?? text,
7258
- supporting: canonicalToken(candidates.supporting, palette) ?? text
7259
- }
7472
+ ...roles,
7473
+ linkHover: hover.token
7474
+ },
7475
+ hoverDecoration: hover.decoration
7260
7476
  };
7261
7477
  }
7478
+ function canonicalHoverToken(reference, palette) {
7479
+ const token = parseThemeColorToken(reference);
7480
+ if (token) {
7481
+ const parts = parseColorTokenParts(token);
7482
+ if (parts.kind === "token" && resolveConcreteColorHex(parts.token, palette)) return token;
7483
+ }
7484
+ return canonicalToken(reference, palette);
7485
+ }
7262
7486
  function safeTokenOr(candidate, fallback, backgroundHex, palette) {
7263
7487
  return firstSafeToken([candidate], backgroundHex, palette) ?? fallback;
7264
7488
  }
@@ -10198,6 +10422,43 @@ const effectCompositionSchema = z.object({
10198
10422
  /** Effects applied on focus */
10199
10423
  focus: z.array(effectApplicationSchema).optional()
10200
10424
  });
10425
+ const policiesById = {
10426
+ "darken-background": "other",
10427
+ "lighten-background": "other",
10428
+ "fade-background": "other",
10429
+ "opacity-reduce": "other",
10430
+ "animated-gradient": "other",
10431
+ "background-on-hover": "paired-hover",
10432
+ "background-on-hover-alpha": "paired-hover",
10433
+ "border-glow": "other",
10434
+ "drop-shadow": "other",
10435
+ "inner-shadow": "other",
10436
+ "neumorphic-shadow": "other",
10437
+ "outer-glow": "other",
10438
+ "retro-3d-shadow": "other",
10439
+ "scale-up": "other",
10440
+ "scale-down": "other",
10441
+ lift: "other",
10442
+ "press-down": "other",
10443
+ pop: "other",
10444
+ "aurora-glow": "other",
10445
+ "cosmic-stardust": "other",
10446
+ "gradient-border-fill": "other",
10447
+ "animated-gradient-border-fill": "other",
10448
+ "border-bottom-grow": "other",
10449
+ "gradient-text": "other",
10450
+ "text-color-change": "text-colour",
10451
+ "border-color-change": "other",
10452
+ "sketchy-border": "other",
10453
+ "pulse-animation": "other",
10454
+ "nav-underline": "underline",
10455
+ "nav-frosted-base": "other",
10456
+ "nav-frosted-hover": "other",
10457
+ "nav-frosted-active": "other"
10458
+ };
10459
+ function navEffectPolicy(effectId) {
10460
+ return policiesById[effectId] ?? null;
10461
+ }
10201
10462
  //#endregion
10202
10463
  //#region ../theme-core/src/navigation/types.ts
10203
10464
  /**
@@ -10286,6 +10547,16 @@ const navLinkStyleSchema = z.object({
10286
10547
  /** Composable effects */
10287
10548
  effects: effectCompositionSchema.optional()
10288
10549
  });
10550
+ function navLinkHoverColorCandidate(style) {
10551
+ const effect = style?.effects?.hover?.find((item) => navEffectPolicy(item.effectId) === "text-colour");
10552
+ return parseThemeColorToken(effect?.options?.hoverColorToken ?? style?.hoverColorToken);
10553
+ }
10554
+ function navLinkOwnsHoverForeground(style) {
10555
+ return style?.effects?.hover?.some((effect) => navEffectPolicy(effect.effectId) === "paired-hover") ?? false;
10556
+ }
10557
+ function navLinkOwnsUnderline(style) {
10558
+ return style?.effects?.hover?.some((effect) => navEffectPolicy(effect.effectId) === "underline") ?? false;
10559
+ }
10289
10560
  //#endregion
10290
10561
  //#region ../theme-core/src/customCss/validation.ts
10291
10562
  /**
@@ -16474,6 +16745,14 @@ const blockDesignFallback = {
16474
16745
  };
16475
16746
  blockDesignFallback.sectionSurface, blockDesignFallback.contentFrame, blockDesignFallback.sectionHeight, blockDesignFallback.heroLegibility, blockDesignFallback.imageSurfaceTreatment, blockDesignFallback.imageSurfaceMotion, blockDesignFallback.tileTreatment, blockDesignFallback.eventListTreatment, blockDesignFallback.eyebrowTreatment, blockDesignFallback.accordionIconTreatment, blockDesignFallback.composition;
16476
16747
  //#endregion
16748
+ //#region ../theme-core/src/header/rootPaint.ts
16749
+ /** The nav container takes precedence when a floating header also has one. */
16750
+ function headerRootPaint(header) {
16751
+ const navContainerType = header?.navContainer?.type ?? "none";
16752
+ if (navContainerType === "glass" || navContainerType === "pill") return "contained-nav";
16753
+ return header?.variant === "floating" ? "overlay" : "own-surface";
16754
+ }
16755
+ //#endregion
16477
16756
  //#region ../theme-core/src/site-styles/siteChromeBackgrounds.ts
16478
16757
  const siteChromeBackgroundColorTokens = toSiteChromeBackgroundColorTokens(backgroundAppearanceColorTokenNames);
16479
16758
  const quickSiteChromeBackgroundColorTokens = toSiteChromeBackgroundColorTokens(backgroundAppearanceQuickColorTokenNames);
@@ -16653,6 +16932,259 @@ z.object(headerPreferencesShape).omit({
16653
16932
  structure: true
16654
16933
  }).strict();
16655
16934
  //#endregion
16935
+ //#region ../theme-core/src/navigation/presets.ts
16936
+ /**
16937
+ * Built-in nav link style presets
16938
+ *
16939
+ * Each preset uses composable effects to achieve its look.
16940
+ */
16941
+ const NAV_LINK_PRESETS = {
16942
+ /**
16943
+ * Minimal - subtle color change on hover
16944
+ */
16945
+ minimal: {
16946
+ name: "Minimal",
16947
+ typography: "body",
16948
+ fontWeight: "medium",
16949
+ textTransform: "none",
16950
+ italic: false,
16951
+ colorToken: "text",
16952
+ hoverColorToken: "primary",
16953
+ padding: "none",
16954
+ borderRadius: "none",
16955
+ effects: { hover: [{
16956
+ effectId: "text-color-change",
16957
+ options: { hoverColorToken: "primary" }
16958
+ }] }
16959
+ },
16960
+ /**
16961
+ * Underline - static underline appears on hover
16962
+ */
16963
+ underline: {
16964
+ name: "Underline",
16965
+ typography: "body",
16966
+ fontWeight: "medium",
16967
+ textTransform: "none",
16968
+ italic: false,
16969
+ colorToken: "text",
16970
+ padding: "none",
16971
+ borderRadius: "none",
16972
+ effects: { hover: [{
16973
+ effectId: "nav-underline",
16974
+ options: { style: "static" }
16975
+ }] }
16976
+ },
16977
+ /**
16978
+ * Underline Grow - animated underline grows from center on hover
16979
+ */
16980
+ "underline-grow": {
16981
+ name: "Underline Grow",
16982
+ typography: "body",
16983
+ fontWeight: "medium",
16984
+ textTransform: "none",
16985
+ italic: false,
16986
+ colorToken: "text",
16987
+ padding: "none",
16988
+ borderRadius: "none",
16989
+ effects: { hover: [{
16990
+ effectId: "nav-underline",
16991
+ options: { style: "grow" }
16992
+ }] }
16993
+ },
16994
+ /**
16995
+ * Capsule - pill-shaped background on hover
16996
+ */
16997
+ capsule: {
16998
+ name: "Capsule",
16999
+ typography: "body",
17000
+ fontWeight: "medium",
17001
+ textTransform: "none",
17002
+ italic: false,
17003
+ colorToken: "text",
17004
+ padding: "compact",
17005
+ borderRadius: "full",
17006
+ effects: {
17007
+ hover: [{
17008
+ effectId: "background-on-hover-alpha",
17009
+ options: {
17010
+ colorToken: "primary",
17011
+ opacity: 10
17012
+ }
17013
+ }],
17014
+ active: [{
17015
+ effectId: "background-on-hover-alpha",
17016
+ options: {
17017
+ colorToken: "primary",
17018
+ opacity: 15
17019
+ }
17020
+ }]
17021
+ }
17022
+ },
17023
+ /**
17024
+ * Solid - solid background color on hover
17025
+ */
17026
+ solid: {
17027
+ name: "Solid",
17028
+ typography: "body",
17029
+ fontWeight: "medium",
17030
+ textTransform: "none",
17031
+ italic: false,
17032
+ colorToken: "text",
17033
+ padding: "compact",
17034
+ borderRadius: "none",
17035
+ effects: {
17036
+ hover: [{
17037
+ effectId: "background-on-hover",
17038
+ options: {
17039
+ colorToken: "primary",
17040
+ textColorToken: "primaryForeground"
17041
+ }
17042
+ }],
17043
+ active: [{
17044
+ effectId: "background-on-hover",
17045
+ options: {
17046
+ colorToken: "primary",
17047
+ textColorToken: "primaryForeground"
17048
+ }
17049
+ }]
17050
+ }
17051
+ },
17052
+ /**
17053
+ * Scale - gentle scale-up on hover
17054
+ */
17055
+ scale: {
17056
+ name: "Scale",
17057
+ typography: "body",
17058
+ fontWeight: "medium",
17059
+ textTransform: "none",
17060
+ italic: false,
17061
+ colorToken: "text",
17062
+ padding: "none",
17063
+ borderRadius: "none",
17064
+ effects: { hover: [{
17065
+ effectId: "scale-up",
17066
+ options: { scale: 1.05 }
17067
+ }] }
17068
+ },
17069
+ /**
17070
+ * Frosted - semi-transparent glass-like background
17071
+ */
17072
+ frosted: {
17073
+ name: "Frosted",
17074
+ typography: "body",
17075
+ fontWeight: "medium",
17076
+ textTransform: "none",
17077
+ italic: false,
17078
+ colorToken: "text",
17079
+ padding: "compact",
17080
+ borderRadius: "md",
17081
+ effects: {
17082
+ base: [{ effectId: "nav-frosted-base" }],
17083
+ hover: [{ effectId: "nav-frosted-hover" }],
17084
+ active: [{ effectId: "nav-frosted-active" }]
17085
+ }
17086
+ }
17087
+ };
17088
+ /**
17089
+ * Get a nav link style preset by ID
17090
+ */
17091
+ function getNavLinkPreset(presetId) {
17092
+ return NAV_LINK_PRESETS[presetId];
17093
+ }
17094
+ Object.keys(NAV_LINK_PRESETS);
17095
+ //#endregion
17096
+ //#region ../theme-core/src/header/legacyNavLinkStyle.ts
17097
+ function buildLegacyHeaderNavLinkStyle(header, contrastTreatment, navTextSize) {
17098
+ const navStyle = header.navStyle ?? "minimal";
17099
+ const basePreset = getNavLinkPreset(navStyle);
17100
+ if (!basePreset) return null;
17101
+ const style = {
17102
+ ...basePreset,
17103
+ fontWeight: header.navWeight ?? basePreset.fontWeight,
17104
+ colorToken: (header.navColor ?? header.textColor)?.trim() || basePreset.colorToken,
17105
+ ...contrastTreatment ? { contrastTreatment } : {},
17106
+ ...navTextSize ? { textSize: navTextSize } : {}
17107
+ };
17108
+ if (header.navWeight === "bold" && navStyle === "solid") style.textTransform = "uppercase";
17109
+ applyLegacyGlassTreatment(style, header, navStyle);
17110
+ return style;
17111
+ }
17112
+ function applyLegacyGlassTreatment(style, header, navStyle) {
17113
+ if (header.navContainer?.type !== "glass" || navStyle !== "minimal") return;
17114
+ style.borderRadius = "full";
17115
+ style.effects = {
17116
+ ...style.effects,
17117
+ hover: glassStateEffects(10),
17118
+ active: glassStateEffects(18)
17119
+ };
17120
+ }
17121
+ function glassStateEffects(opacity) {
17122
+ return [{
17123
+ effectId: "background-on-hover-alpha",
17124
+ options: {
17125
+ colorToken: "neutral-50",
17126
+ opacity
17127
+ }
17128
+ }, {
17129
+ effectId: "text-color-change",
17130
+ options: { hoverColorToken: "neutral-50" }
17131
+ }];
17132
+ }
17133
+ //#endregion
17134
+ //#region ../theme-core/src/header/openingForegroundProjection.ts
17135
+ function readOpeningForegroundProjection(header) {
17136
+ return header?.__runtimeOpeningForeground ?? null;
17137
+ }
17138
+ //#endregion
17139
+ //#region ../theme-core/src/header/effectiveNavLinkStyle.ts
17140
+ function effectiveHeaderNavLinkStyle(header, contrastTreatment = null, navTextSize = null) {
17141
+ if (!header) return null;
17142
+ if (!header.navLinkStyle) return buildLegacyHeaderNavLinkStyle(header, contrastTreatment, navTextSize);
17143
+ return {
17144
+ ...header.navLinkStyle,
17145
+ ...contrastTreatment ? { contrastTreatment } : {},
17146
+ ...navTextSize ? { textSize: navTextSize } : {}
17147
+ };
17148
+ }
17149
+ function headerForegroundCandidates(header) {
17150
+ if (!header) return {};
17151
+ const style = effectiveHeaderNavLinkStyle(header);
17152
+ return {
17153
+ text: header.textColor ?? header.background?.textColor,
17154
+ link: style?.colorToken ?? header.navColor ?? header.textColor,
17155
+ linkHover: navLinkHoverColorCandidate(style)
17156
+ };
17157
+ }
17158
+ function headerLeafTextColor(header) {
17159
+ if (!header) return "text";
17160
+ return header.textColor ?? header.navColor ?? header.background?.textColor ?? header.navLinkStyle?.colorToken ?? "text";
17161
+ }
17162
+ /** Transparent chrome must reset the whole contract on its own root. */
17163
+ function transparentHeaderForegroundInput(header, palette) {
17164
+ const projection = readOpeningForegroundProjection(header);
17165
+ if (projection?.kind === "known") return surfaceForegroundInputFromResolved(projection, rgbColorValue);
17166
+ return authoredTransparentHeaderForegroundInput(header, palette);
17167
+ }
17168
+ function authoredTransparentHeaderForegroundInput(header, palette) {
17169
+ const text = headerLeafTextColor(header);
17170
+ const style = effectiveHeaderNavLinkStyle(header);
17171
+ const link = style?.colorToken ?? text;
17172
+ const restingToken = parseThemeColorToken(link) ?? parseThemeColorToken("text");
17173
+ if (!restingToken) throw new Error("Built-in text colour token is invalid");
17174
+ const hover = planForegroundHover({
17175
+ restingToken,
17176
+ candidate: navLinkOwnsHoverForeground(style) ? null : navLinkHoverColorCandidate(style),
17177
+ palette,
17178
+ backdrops: null
17179
+ });
17180
+ return {
17181
+ text: rgbColorValue(text),
17182
+ link: rgbColorValue(link),
17183
+ linkHover: rgbColorValue(hover.token),
17184
+ hoverDecoration: navLinkOwnsUnderline(style) ? "initial" : hover.decoration
17185
+ };
17186
+ }
17187
+ //#endregion
16656
17188
  //#region ../theme-core/src/site-styles/pageDesignAuthority.ts
16657
17189
  const nonEmptyStringSchema = z.string().min(1);
16658
17190
  const blockContentVersionIdSchema = nonEmptyStringSchema.transform(asBlockContentVersionId);
@@ -16805,6 +17337,28 @@ z.object({
16805
17337
  motion: z.enum(themeTokenRecipeOptions.motion)
16806
17338
  });
16807
17339
  //#endregion
17340
+ //#region ../theme-core/src/footer/effectiveNavLinkStyle.ts
17341
+ function effectiveFooterNavLinkStyle(footer) {
17342
+ if (!footer) return null;
17343
+ if (footer.navLinkStyle) return footer.navLinkStyle;
17344
+ const basePreset = getNavLinkPreset(footer.navStyle ?? "minimal");
17345
+ if (!basePreset) return null;
17346
+ return {
17347
+ ...basePreset,
17348
+ fontWeight: footer.navWeight ?? basePreset.fontWeight,
17349
+ colorToken: footer.navColor?.trim() || basePreset.colorToken
17350
+ };
17351
+ }
17352
+ function footerForegroundCandidates(footer, proseHoverCandidate) {
17353
+ if (!footer) return {};
17354
+ const style = effectiveFooterNavLinkStyle(footer);
17355
+ return {
17356
+ text: footer.background?.textColor,
17357
+ link: style?.colorToken ?? footer.navColor ?? footer.background?.textColor,
17358
+ linkHover: navLinkOwnsHoverForeground(style) ? proseHoverCandidate : navLinkHoverColorCandidate(style)
17359
+ };
17360
+ }
17361
+ //#endregion
16808
17362
  //#region ../theme-core/src/siteChromeOverlayClearance.ts
16809
17363
  const SITE_CHROME_VISIBLE_HEADER_ATTR = "data-site-chrome-visible-header";
16810
17364
  //#endregion
@@ -19778,33 +20332,28 @@ function resolveBackgroundColorValue(value, context) {
19778
20332
  //#endregion
19779
20333
  //#region ../blocks/src/system/transforms/registry/_utils/surfaceForegroundStyles.ts
19780
20334
  const contextualButtonStylesCache = /* @__PURE__ */ new WeakMap();
19781
- function resolveHeaderLeafTextColor(header) {
19782
- return header?.textColor ?? header?.navColor ?? header?.background?.textColor ?? header?.navLinkStyle?.colorToken ?? "text";
19783
- }
19784
20335
  function resolveHeaderRootForeground(header, palette, isTransparent) {
19785
- if (isTransparent) return { kind: "unknown" };
20336
+ if (isTransparent) return readOpeningForegroundProjection(header) ?? { kind: "unknown" };
19786
20337
  const background = header?.background;
19787
20338
  return resolveSurfaceForeground(background ?? {
19788
20339
  type: "color",
19789
20340
  color: "surface"
19790
- }, palette, {
19791
- text: header?.textColor ?? background?.textColor,
19792
- link: header?.navLinkStyle?.colorToken ?? header?.navColor ?? header?.textColor
19793
- });
20341
+ }, palette, headerForegroundCandidates(header));
20342
+ }
20343
+ function resolveFooterRootForeground(footer, palette, proseHoverCandidate) {
20344
+ return resolveSurfaceForeground(footer?.background ?? {
20345
+ type: "color",
20346
+ color: "surface"
20347
+ }, palette, footerForegroundCandidates(footer, proseHoverCandidate), { compositeBase: "background" });
19794
20348
  }
19795
20349
  function resolveSurfaceForegroundStyles(value, context, options) {
19796
20350
  const input = parseBackgroundContent(value);
19797
- const foreground = input ? resolveSurfaceForeground(input, context.theme.palette, {}, { compositeBase: options?.fallbackToken }) : { kind: "unknown" };
20351
+ const foreground = input ? resolveSurfaceForeground(input, context.theme.palette, { linkHover: context.proseHoverCandidate }, { compositeBase: options?.fallbackToken }) : { kind: "unknown" };
19798
20352
  const buttonStyles = resolveContextualButtonStyles(input, foreground, context, options);
19799
20353
  if (foreground.kind === "unknown") return buttonStyles;
19800
20354
  return {
19801
20355
  ...buttonStyles,
19802
- ...surfaceForegroundStyle({
19803
- text: resolveBackgroundColorValue(foreground.roles.text, context),
19804
- heading: resolveBackgroundColorValue(foreground.roles.heading, context),
19805
- link: resolveBackgroundColorValue(foreground.roles.link, context),
19806
- supporting: resolveBackgroundColorValue(foreground.roles.supporting, context)
19807
- })
20356
+ ...surfaceForegroundStyle(surfaceForegroundInputFromResolved(foreground, (token) => resolveBackgroundColorValue(token, context)))
19808
20357
  };
19809
20358
  }
19810
20359
  function resolveContextualButtonStyles(background, foreground, context, options) {
@@ -25620,10 +26169,7 @@ function resolveBackgroundVisualStyles(backgroundColor, defaultToken = "surface"
25620
26169
  };
25621
26170
  }
25622
26171
  function resolveHeaderVisualStyles(header) {
25623
- const navContainerType = header?.navContainer?.type ?? "none";
25624
- const hasContainedNav = navContainerType === "glass" || navContainerType === "pill";
25625
- const hasOverlayVariant = header?.variant === "floating";
25626
- if (hasContainedNav || hasOverlayVariant) return {
26172
+ if (headerRootPaint(header) !== "own-surface") return {
25627
26173
  backgroundToken: "transparent",
25628
26174
  isTransparent: true
25629
26175
  };
@@ -25634,23 +26180,7 @@ function resolveHeaderVisualStyles(header) {
25634
26180
  }
25635
26181
  function resolvedForegroundStyle(foreground) {
25636
26182
  if (foreground.kind === "unknown") return void 0;
25637
- const { roles } = foreground;
25638
- return surfaceForegroundStyle({
25639
- text: rgbColorValue(roles.text),
25640
- heading: rgbColorValue(roles.heading),
25641
- link: rgbColorValue(roles.link),
25642
- supporting: rgbColorValue(roles.supporting)
25643
- });
25644
- }
25645
- function resolveFooterRootForeground(footer, palette) {
25646
- const background = footer?.background;
25647
- return resolveSurfaceForeground(background ?? {
25648
- type: "color",
25649
- color: "surface"
25650
- }, palette, {
25651
- text: background?.textColor,
25652
- link: footer?.navLinkStyle?.colorToken ?? footer?.navColor ?? background?.textColor
25653
- });
26183
+ return surfaceForegroundStyle(surfaceForegroundInputFromResolved(foreground, rgbColorValue));
25654
26184
  }
25655
26185
  function footerBottomBarBorderWidthStyle(width) {
25656
26186
  if (!width) return void 0;
@@ -25677,8 +26207,7 @@ const headerRootClassTransform = {
25677
26207
  const placement = planSiteChromePlacement(parseHeaderPositioning(content.positioning));
25678
26208
  const header = asPartialObject(value);
25679
26209
  const visuals = resolveHeaderVisualStyles(header);
25680
- const navContainerType = header?.navContainer?.type ?? "none";
25681
- const hasContainedNav = navContainerType === "glass" || navContainerType === "pill";
26210
+ const hasContainedNav = headerRootPaint(header) === "contained-nav";
25682
26211
  const backgroundClass = visuals.isTransparent || hasContainedNav ? "rb-bg-transparent" : null;
25683
26212
  const classes = [config.base, backgroundClass];
25684
26213
  if (!hasContainedNav) {
@@ -25721,7 +26250,7 @@ const headerRootStyleTransform = {
25721
26250
  run: (value, _options, context) => {
25722
26251
  const header = asPartialObject(value);
25723
26252
  const visuals = resolveHeaderVisualStyles(header);
25724
- return mergeStyles(resolvedForegroundStyle(resolveHeaderRootForeground(header, context.theme.palette, visuals.isTransparent)) ?? { color: rgbColorValue(resolveHeaderLeafTextColor(header)) }, borderColorStyle(header?.border?.colorToken ?? "border"));
26253
+ 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"));
25725
26254
  }
25726
26255
  };
25727
26256
  const headerSectionBackgroundTransform = {
@@ -25729,9 +26258,7 @@ const headerSectionBackgroundTransform = {
25729
26258
  kind: "string",
25730
26259
  summary: "Resolve the inner site-header section background token",
25731
26260
  run: (value) => {
25732
- const header = asPartialObject(value);
25733
- const navContainerType = header?.navContainer?.type ?? "none";
25734
- return header?.variant === "floating" || navContainerType === "glass" || navContainerType === "pill" ? "raw:transparent" : "background";
26261
+ return headerRootPaint(asPartialObject(value)) !== "own-surface" ? "raw:transparent" : "background";
25735
26262
  }
25736
26263
  };
25737
26264
  const footerRootStyleTransform = {
@@ -25749,7 +26276,7 @@ const footerRootStyleTransform = {
25749
26276
  styleParts.push(backgroundColorStyle(token));
25750
26277
  }
25751
26278
  }
25752
- styleParts.push(resolvedForegroundStyle(resolveFooterRootForeground(footer, context.theme.palette)));
26279
+ styleParts.push(resolvedForegroundStyle(resolveFooterRootForeground(footer, context.theme.palette, context.proseHoverCandidate)));
25753
26280
  styleParts.push(borderColorStyle("border"));
25754
26281
  return mergeStyles(...styleParts);
25755
26282
  }
@@ -25811,22 +26338,28 @@ const footerBottomBarStyleTransform = {
25811
26338
  run: (value, _options, context) => {
25812
26339
  const footer = asPartialObject(value);
25813
26340
  const bottomBar = footer?.bottomBar;
25814
- const styleParts = [];
25815
- const background = bottomBar?.background;
25816
- if (background?.type === "color") styleParts.push(backgroundColorStyle(background.color ?? "surface"));
25817
- styleParts.push(borderColorStyle(bottomBar?.borderTop?.colorToken ?? "border"), footerBottomBarBorderWidthStyle(bottomBar?.borderTop?.width));
25818
- const foreground = resolveSurfaceForeground(background?.type === "color" ? background : {
25819
- type: "color",
25820
- color: "transparent"
25821
- }, context.theme.palette, {
25822
- text: bottomBar?.textColor,
25823
- link: footer?.bottomTextLinkStyle?.colorToken ?? bottomBar?.textColor
25824
- });
25825
- if (background?.type === "color") styleParts.push(resolvedForegroundStyle(foreground));
25826
- else if (bottomBar?.textColor) styleParts.push(textColorStyle(bottomBar.textColor));
25827
- return mergeStyles(...styleParts);
26341
+ 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));
25828
26342
  }
25829
26343
  };
26344
+ function footerBottomBarForegroundStyle(footer, palette) {
26345
+ if (!footer?.bottomBar) return void 0;
26346
+ const bar = footer.bottomBar;
26347
+ if (bar.background?.type !== "color") return backgroundlessBottomBarForegroundStyle(footer);
26348
+ return resolvedForegroundStyle(resolveSurfaceForeground(bar.background, palette, {
26349
+ text: bar.textColor,
26350
+ link: footer.bottomTextLinkStyle?.colorToken ?? bar.textColor,
26351
+ linkHover: footer.bottomTextLinkStyle?.hoverColorToken
26352
+ }, { compositeBase: measuredFooterBackdrop(footer, palette) }));
26353
+ }
26354
+ function backgroundlessBottomBarForegroundStyle(footer) {
26355
+ if (footer.background?.contentOwner === "site-chrome-editor") return;
26356
+ const textColor = footer.bottomBar?.textColor;
26357
+ return textColor ? textColorStyle(textColor) : void 0;
26358
+ }
26359
+ function measuredFooterBackdrop(footer, palette) {
26360
+ const foreground = resolveFooterRootForeground(footer, palette);
26361
+ return foreground.kind === "known" && foreground.provenance.kind === "measured" ? foreground.provenance.backdropHex : null;
26362
+ }
25830
26363
  const footerSplitMainClassTransform = {
25831
26364
  id: "layout.footerSplitMainClass",
25832
26365
  kind: "string",
@@ -25922,7 +26455,7 @@ function chromeSurfaceTextToken(surface, theme, palette) {
25922
26455
  case "header-root": {
25923
26456
  const header = theme.header;
25924
26457
  const foreground = resolveHeaderRootForeground(header, palette, resolveHeaderVisualStyles(header).isTransparent);
25925
- return foreground.kind === "known" ? foreground.roles.text : resolveHeaderLeafTextColor(header);
26458
+ return foreground.kind === "known" ? foreground.roles.text : headerLeafTextColor(header);
25926
26459
  }
25927
26460
  case "header-mobile-panel": return theme.header?.dropdownStyle?.textColor ?? "text";
25928
26461
  case "footer-root": {
@@ -28009,7 +28542,9 @@ const bookingWizard = bookingForm(withApiBindings({
28009
28542
  } },
28010
28543
  formId: { $bind: { from: "content.formId" } },
28011
28544
  form: { $bind: { from: "data.form" } },
28012
- services: { $bind: { from: "data.services" } }
28545
+ services: { $bind: { from: "data.services" } },
28546
+ mailingList: { $bind: { from: "$root.mailingList" } },
28547
+ siteName: { $bind: { from: "$root.siteName" } }
28013
28548
  }));
28014
28549
  /** Both variants sit in the same section shell; only the inner layout differs. */
28015
28550
  function bookingSection(children) {
@@ -29511,7 +30046,13 @@ const eventRegistrationHydrationSchemaShape = {
29511
30046
  spamProtectionEnabled: z.boolean().optional(),
29512
30047
  supportEmail: z.string().optional(),
29513
30048
  sitePasses: publicPassProductCollectionSchema.nullable().optional(),
29514
- siteMemberships: publicMembershipProductCollectionSchema.nullable().optional()
30049
+ siteMemberships: publicMembershipProductCollectionSchema.nullable().optional(),
30050
+ mailingList: z.unknown().transform((value) => {
30051
+ if (value === void 0) return void 0;
30052
+ const parsed = parseMailingListRuntimeContext(value);
30053
+ return parsed.ok ? parsed.value : void 0;
30054
+ }),
30055
+ siteName: z.string().optional()
29515
30056
  };
29516
30057
  const eventRegistrationEventSourceSchema = z.discriminatedUnion("kind", [z.object({
29517
30058
  kind: z.literal("loaded"),
@@ -29683,7 +30224,9 @@ const eventRegistrationBlockRuntime = defineClientOwnedBlockRuntime({
29683
30224
  spamProtectionEnabled: source.spamProtectionEnabled,
29684
30225
  supportEmail: source.supportEmail,
29685
30226
  sitePasses: source.sitePasses ?? null,
29686
- siteMemberships: source.siteMemberships ?? null
30227
+ siteMemberships: source.siteMemberships ?? null,
30228
+ mailingList: source.mailingList,
30229
+ siteName: source.siteName
29687
30230
  }
29688
30231
  };
29689
30232
  }
@@ -29851,6 +30394,8 @@ const eventRegistrationBlockDefinition = {
29851
30394
  events: { $bind: { from: "data.events" } },
29852
30395
  wholeSeriesRunEvents: { $bind: { from: "data.wholeSeriesRunEvents" } },
29853
30396
  loaderFailures: { $bind: { from: "$root.loaderFailures" } },
30397
+ mailingList: { $bind: { from: "$root.mailingList" } },
30398
+ siteName: { $bind: { from: "$root.siteName" } },
29854
30399
  sitePasses: { $bind: { from: "data.sitePasses" } },
29855
30400
  siteMemberships: { $bind: { from: "data.siteMemberships" } },
29856
30401
  stage: { $bind: {
@@ -36734,65 +37279,67 @@ const editorialSplitLayout = styledSection({
36734
37279
  spacing: "comfortable",
36735
37280
  background: "surface"
36736
37281
  });
36737
- const newsletterSignupBlockDefinition = {
36738
- manifest: createBlockManifest({
36739
- id: "block.newsletter-signup",
36740
- title: "Newsletter Signup",
36741
- titleSource: "title",
36742
- description: "Newsletter subscription form with configurable field presets.",
36743
- category: "interactive",
36744
- contentSource: { kind: "inline" },
36745
- fragments: [{
36746
- fragment: newsletterCopyFragment,
36747
- fieldPriority: 0
36748
- }, {
36749
- fragment: newsletterFormFragment,
36750
- fieldPriority: 1
36751
- }],
36752
- layout: stackedLayout,
36753
- variants: {
36754
- stacked: stackedLayout,
36755
- inline: inlineLayout,
36756
- "editorial-split": editorialSplitLayout
36757
- },
36758
- defaultVariant: "stacked",
36759
- variantOptions: {
36760
- stacked: {
36761
- label: "Stacked",
36762
- description: "Vertical layout with fields stacked"
36763
- },
36764
- inline: {
36765
- label: "Inline",
36766
- description: "Horizontal layout (email + button side by side)"
36767
- },
36768
- "editorial-split": {
36769
- label: "Editorial split",
36770
- description: "Copy and form in balanced side-by-side columns, stacked on mobile."
36771
- }
36772
- },
36773
- styleTokens: {
36774
- background: "surface",
36775
- typography: "body",
36776
- spacing: "md"
37282
+ const newsletterSignupManifest = createBlockManifest({
37283
+ id: "block.newsletter-signup",
37284
+ title: "Newsletter Signup",
37285
+ titleSource: "title",
37286
+ description: "Newsletter subscription form with configurable field presets.",
37287
+ category: "interactive",
37288
+ contentSource: { kind: "inline" },
37289
+ fragments: [{
37290
+ fragment: newsletterCopyFragment,
37291
+ fieldPriority: 0
37292
+ }, {
37293
+ fragment: newsletterFormFragment,
37294
+ fieldPriority: 1
37295
+ }],
37296
+ layout: stackedLayout,
37297
+ variants: {
37298
+ stacked: stackedLayout,
37299
+ inline: inlineLayout,
37300
+ "editorial-split": editorialSplitLayout
37301
+ },
37302
+ defaultVariant: "stacked",
37303
+ variantOptions: {
37304
+ stacked: {
37305
+ label: "Stacked",
37306
+ description: "Vertical layout with fields stacked"
36777
37307
  },
36778
- behaviours: {
36779
- supportsThemeSwitching: true,
36780
- inlineEditing: false,
36781
- animation: false,
36782
- paletteHidden: false
37308
+ inline: {
37309
+ label: "Inline",
37310
+ description: "Horizontal layout (email + button side by side)"
36783
37311
  },
36784
- tags: [
36785
- "newsletter",
36786
- "signup",
36787
- "email",
36788
- "subscribe",
36789
- "subscription",
36790
- "mailchimp",
36791
- "marketing",
36792
- "lead-capture"
36793
- ],
36794
- icon: "Mail"
36795
- }),
37312
+ "editorial-split": {
37313
+ label: "Editorial split",
37314
+ description: "Copy and form in balanced side-by-side columns, stacked on mobile."
37315
+ }
37316
+ },
37317
+ styleTokens: {
37318
+ background: "surface",
37319
+ typography: "body",
37320
+ spacing: "md"
37321
+ },
37322
+ behaviours: {
37323
+ supportsThemeSwitching: true,
37324
+ inlineEditing: false,
37325
+ animation: false,
37326
+ paletteHidden: false
37327
+ },
37328
+ tags: [
37329
+ "newsletter",
37330
+ "signup",
37331
+ "email",
37332
+ "subscribe",
37333
+ "subscription",
37334
+ "mailchimp",
37335
+ "marketing",
37336
+ "lead-capture"
37337
+ ],
37338
+ icon: "Mail"
37339
+ });
37340
+ [...(newsletterSignupManifest.fields ?? []).map((field) => field.id)];
37341
+ const newsletterSignupBlockDefinition = {
37342
+ manifest: newsletterSignupManifest,
36796
37343
  runtime: newsletterFormBlockRuntime
36797
37344
  };
36798
37345
  //#endregion
@@ -38834,7 +39381,8 @@ const BOOKING_FORM_DATA_RESERVED_KEYS = /* @__PURE__ */ new Set([
38834
39381
  "discountCode",
38835
39382
  "selectedSlidingAmountInput",
38836
39383
  "selectedCollectionOptionKind",
38837
- "selectedAppointmentPackageId"
39384
+ "selectedAppointmentPackageId",
39385
+ "mailingListOptIn"
38838
39386
  ]);
38839
39387
  function isBookingFormDataReservedKey(value) {
38840
39388
  return BOOKING_FORM_DATA_RESERVED_KEYS.has(value);