@riverbankcms/sdk 0.145.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 (254) hide show
  1. package/CHANGELOG.md +29 -0
  2. package/dist/{PreviewEditorSidebar-O-V6Pl5a.mjs → PreviewEditorSidebar-DtpB3_sS.mjs} +51 -33
  3. package/dist/{PreviewEditorUI-1UlX_9cw.mjs → PreviewEditorUI-DxTLgaHo.mjs} +3 -3
  4. package/dist/{PreviewQueryProvider-BxGwdOCV.mjs → PreviewQueryProvider-Dd4dxOiU.mjs} +1 -1
  5. package/dist/{SdkPreviewModeRuntime-DYbA_4iv.mjs → SdkPreviewModeRuntime-DMMNCngt.mjs} +311 -186
  6. package/dist/{SiteChromeCustomizeContext-CNTKQ9nx.mjs → SiteChromeCustomizeContext-DQXZXiqS.mjs} +3808 -2395
  7. package/dist/_dts/ai/src/contracts/proposals.d.ts +1122 -0
  8. package/dist/_dts/ai/src/contracts/siteStyleProposalSchemas.d.ts +102 -0
  9. package/dist/_dts/api/src/accountApi.d.ts +5 -5
  10. package/dist/_dts/api/src/bookingConfig.d.ts +24 -1
  11. package/dist/_dts/api/src/bookingManagementEndpoints.d.ts +11 -26
  12. package/dist/_dts/api/src/bookingManagementEventEndpointTypes.d.ts +45 -1
  13. package/dist/_dts/api/src/bookingOperations.d.ts +2 -44
  14. package/dist/_dts/api/src/bookingPeople.d.ts +92 -0
  15. package/dist/_dts/api/src/bookingPeopleEndpointDefinitions.d.ts +38 -0
  16. package/dist/_dts/api/src/bookingRecords.d.ts +11 -49
  17. package/dist/_dts/api/src/bookingSettingsSections.d.ts +1 -1
  18. package/dist/_dts/api/src/bookings.d.ts +1 -0
  19. package/dist/_dts/api/src/clientErrorReporting.d.ts +50 -0
  20. package/dist/_dts/api/src/communications.d.ts +20 -4
  21. package/dist/_dts/api/src/contentRuntime.d.ts +3 -7
  22. package/dist/_dts/api/src/endpoints.d.ts +816 -655
  23. package/dist/_dts/api/src/event-visibility.d.ts +20 -0
  24. package/dist/_dts/api/src/eventManagementContracts.d.ts +72 -4
  25. package/dist/_dts/api/src/eventManagementEndpointDefinitions.d.ts +24 -0
  26. package/dist/_dts/api/src/eventPageWords.d.ts +19 -0
  27. package/dist/_dts/api/src/eventSeriesRegistrationEndpointDefinitions.d.ts +14 -0
  28. package/dist/_dts/api/src/index.d.ts +9 -2
  29. package/dist/_dts/api/src/indexCoreTypes.d.ts +1 -1
  30. package/dist/_dts/api/src/indexExtendedTypes.d.ts +1 -1
  31. package/dist/_dts/api/src/launchReadiness.d.ts +19 -6
  32. package/dist/_dts/api/src/launchRequirementPriority.d.ts +3 -0
  33. package/dist/_dts/api/src/mailingListIntegration.d.ts +6 -0
  34. package/dist/_dts/api/src/navigation/dashboardBookingsNav.d.ts +1 -1
  35. package/dist/_dts/api/src/newsletterCampaignCommandEndpoints.d.ts +13 -0
  36. package/dist/_dts/api/src/newsletterEndpointDefinitions.d.ts +57 -0
  37. package/dist/_dts/api/src/occurrenceScheduling.d.ts +29 -0
  38. package/dist/_dts/api/src/pageSurfaceEndpoints.d.ts +44 -0
  39. package/dist/_dts/api/src/participantMessaging.d.ts +11 -1
  40. package/dist/_dts/api/src/publicAppointmentBookingContracts.d.ts +48 -0
  41. package/dist/_dts/api/src/publicExperience/eventEndpoints.d.ts +7 -0
  42. package/dist/_dts/api/src/sdk-event-upsert.d.ts +55 -1
  43. package/dist/_dts/api/src/sdkContracts.d.ts +3 -42
  44. package/dist/_dts/api/src/sdkCourseBooking.d.ts +30 -0
  45. package/dist/_dts/api/src/sdkEventEndpointDefinitions.d.ts +76 -0
  46. package/dist/_dts/api/src/sdkEventLifecycle.d.ts +37 -0
  47. package/dist/_dts/api/src/sdkManagedEventContracts.d.ts +18 -0
  48. package/dist/_dts/api/src/sdkPageDesign.d.ts +388 -0
  49. package/dist/_dts/api/src/sdkPageDesignEndpointDefinitions.d.ts +22 -0
  50. package/dist/_dts/api/src/sdkPullEventContracts.d.ts +46 -0
  51. package/dist/_dts/api/src/siteAddressEndpoints.d.ts +29 -0
  52. package/dist/_dts/api/src/siteLifecycleEndpoints.d.ts +61 -0
  53. package/dist/_dts/api/src/siteManagementEndpointDefinitions.d.ts +49 -0
  54. package/dist/_dts/api/src/siteManagementEndpoints.d.ts +6 -49
  55. package/dist/_dts/api/src/siteOnboarding.d.ts +72 -18
  56. package/dist/_dts/api/src/sitePlatformEndpoints.d.ts +1 -1
  57. package/dist/_dts/api/src/types.d.ts +7 -1
  58. package/dist/_dts/api/src/wholeSeriesRuns.d.ts +14 -0
  59. package/dist/_dts/blocks/src/PageRenderer.d.ts +3 -4
  60. package/dist/_dts/blocks/src/contracts/proof-block-islands.d.ts +8 -0
  61. package/dist/_dts/blocks/src/index.d.ts +2 -0
  62. package/dist/_dts/blocks/src/pageRenderAdmission.d.ts +29 -1
  63. package/dist/_dts/blocks/src/pageRendererContracts.d.ts +5 -1
  64. package/dist/_dts/blocks/src/system/blocks/events/shared/schemas.d.ts +27 -5
  65. package/dist/_dts/blocks/src/system/blocks/events/shared/types.d.ts +14 -1
  66. package/dist/_dts/blocks/src/system/blocks/newsletter-signup.d.ts +4 -1
  67. package/dist/_dts/blocks/src/system/icons/social.d.ts +1 -1
  68. package/dist/_dts/blocks/src/system/registry.d.ts +1 -1
  69. package/dist/_dts/blocks/src/system/runtime/api/types/appointments.d.ts +4 -0
  70. package/dist/_dts/blocks/src/system/runtime/api/types/events.d.ts +12 -0
  71. package/dist/_dts/blocks/src/system/runtime/components/registry.client.d.ts +12 -0
  72. package/dist/_dts/blocks/src/system/runtime/components/runtime-backed-blocks.d.ts +6 -0
  73. package/dist/_dts/blocks/src/system/runtime/hooks/useHeadlessBookingFlow.d.ts +8 -0
  74. package/dist/_dts/blocks/src/system/runtime/hooks/useHeadlessEventRegistrationFlow.d.ts +2 -0
  75. package/dist/_dts/blocks/src/system/runtime/nodes/booking-form.completion.d.ts +9 -0
  76. package/dist/_dts/blocks/src/system/runtime/nodes/booking-form.headless.state.d.ts +9 -0
  77. package/dist/_dts/blocks/src/system/runtime/nodes/booking-form.interactive.d.ts +19 -0
  78. package/dist/_dts/blocks/src/system/runtime/nodes/booking-form.mailing-list-choice.d.ts +5 -0
  79. package/dist/_dts/blocks/src/system/runtime/nodes/booking-form.mailing-list-note.d.ts +3 -0
  80. package/dist/_dts/blocks/src/system/runtime/nodes/booking-form.mailing-list-state.d.ts +9 -0
  81. package/dist/_dts/blocks/src/system/runtime/nodes/booking-form.reserved-fields.d.ts +1 -1
  82. package/dist/_dts/blocks/src/system/runtime/nodes/booking-form.server.d.ts +1 -1
  83. package/dist/_dts/blocks/src/system/runtime/nodes/booking-form.state.d.ts +2 -0
  84. package/dist/_dts/blocks/src/system/runtime/nodes/booking-form.submit-handler.d.ts +8 -0
  85. package/dist/_dts/blocks/src/system/runtime/nodes/booking-form.submit-success.d.ts +9 -0
  86. package/dist/_dts/blocks/src/system/runtime/nodes/booking-runtime-sources.d.ts +3 -0
  87. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/AttendeeDetailsStep.d.ts +3 -0
  88. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/SuccessStep.d.ts +3 -0
  89. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/event-registration.headless.contract.d.ts +3 -0
  90. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/eventSourceRecovery.d.ts +1 -0
  91. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/sessionStorage.d.ts +2 -0
  92. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/types.d.ts +6 -0
  93. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/useEventRegistrationSubmit.d.ts +3 -0
  94. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/useEventRegistrationWizard.d.ts +8 -0
  95. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration.interactive.d.ts +9 -0
  96. package/dist/_dts/blocks/src/system/runtime/nodes/events/shared/eventCollectionContract.d.ts +20 -4
  97. package/dist/_dts/blocks/src/system/runtime/nodes/form.fields.d.ts +5 -0
  98. package/dist/_dts/blocks/src/system/runtime/nodes/newsletter-form.block-submission.d.ts +34 -0
  99. package/dist/_dts/blocks/src/system/runtime/nodes/newsletter-form.client.d.ts +1 -1
  100. package/dist/_dts/blocks/src/system/runtime/nodes/newsletter-form.interactive.d.ts +6 -1
  101. package/dist/_dts/blocks/src/system/runtime/nodes/newsletter-form.parts.d.ts +46 -0
  102. package/dist/_dts/blocks/src/system/runtime/nodes/newsletter-form.types.d.ts +2 -1
  103. package/dist/_dts/blocks/src/system/runtime/resolver.d.ts +4 -1
  104. package/dist/_dts/blocks/src/system/runtime/shared/components/BookingMailingListNote.d.ts +6 -0
  105. package/dist/_dts/blocks/src/system/runtime/shared/components/CheckboxChoice.d.ts +18 -0
  106. package/dist/_dts/blocks/src/system/runtime/shared/components/index.d.ts +1 -0
  107. package/dist/_dts/blocks/src/system/runtime/shared/mailingListSignupCopy.d.ts +6 -0
  108. package/dist/_dts/blocks/src/system/runtime/shared/types.d.ts +1 -0
  109. package/dist/_dts/blocks/src/system/transforms/registry/_utils/surfaceForegroundStyles.d.ts +3 -2
  110. package/dist/_dts/blocks/src/system/transforms/registry/core.d.ts +2 -0
  111. package/dist/_dts/blocks/src/system/transforms/registry/layout.d.ts +1 -3
  112. package/dist/_dts/content-editor/src/index.d.ts +1 -0
  113. package/dist/_dts/content-editor/src/primitives/previewEditableOutline.d.ts +2 -0
  114. package/dist/_dts/content-editor/src/ui/editorBlockEquality.d.ts +3 -0
  115. package/dist/_dts/content-editor/src/ui/editorSnapshot.d.ts +3 -5
  116. package/dist/_dts/core/src/block-content-identity.d.ts +5 -0
  117. package/dist/_dts/core/src/editor-state.d.ts +2 -7
  118. package/dist/_dts/core/src/index.d.ts +2 -1
  119. package/dist/_dts/core/src/mailing-list-runtime.d.ts +15 -0
  120. package/dist/_dts/core/src/mailing-list-setup.d.ts +2 -0
  121. package/dist/_dts/core/src/mailing-list-submission.d.ts +9 -1
  122. package/dist/_dts/core/src/navigation-portal-labels.d.ts +9 -0
  123. package/dist/_dts/core/src/participants.d.ts +0 -38
  124. package/dist/_dts/core/src/public-event-booking-availability.d.ts +20 -1
  125. package/dist/_dts/core/src/public-profile.d.ts +3 -1
  126. package/dist/_dts/db/src/generated/supabase/database.types.d.ts +151 -24
  127. package/dist/_dts/editor-blocks/src/BlockEditor.d.ts +3 -0
  128. package/dist/_dts/editor-blocks/src/block-editor/EmptyState.d.ts +13 -1
  129. package/dist/_dts/editor-blocks/src/block-editor/actionPresentation.d.ts +1 -0
  130. package/dist/_dts/editor-blocks/src/block-editor/types.d.ts +2 -8
  131. package/dist/_dts/editor-blocks/src/index.d.ts +1 -0
  132. package/dist/_dts/preview-next/src/client/blocks/EditablePageRenderer.d.ts +7 -1
  133. package/dist/_dts/preview-next/src/client/blocks/composer/types.d.ts +5 -5
  134. package/dist/_dts/preview-next/src/client/preview/PreviewEntryControllerProvider.d.ts +1 -2
  135. package/dist/_dts/sdk/src/next/renderSdkContent.d.ts +0 -1
  136. package/dist/_dts/sdk/src/rendering/blocks-page-renderer.d.ts +3 -2
  137. package/dist/_dts/sdk/src/rendering/components/pageShared.d.ts +3 -2
  138. package/dist/_dts/sdk/src/rendering/helpers/loadContent.d.ts +6 -1
  139. package/dist/_dts/sdk/src/rendering/helpers/loadPage.d.ts +5 -2
  140. package/dist/_dts/sdk/src/rendering/helpers/pageRuntimeSupport.d.ts +6 -1
  141. package/dist/_dts/sdk/src/rendering/helpers/templateContent.d.ts +2 -0
  142. package/dist/_dts/sdk/src/rendering/hooks/useContent.d.ts +5 -1
  143. package/dist/_dts/sdk/src/rendering/hooks/usePage.d.ts +5 -1
  144. package/dist/_dts/sdk/src/version.d.ts +1 -1
  145. package/dist/_dts/surfaces/src/index.d.ts +9 -0
  146. package/dist/_dts/theme-core/src/buttons/effects/types.d.ts +1 -1
  147. package/dist/_dts/theme-core/src/footer/effectiveNavLinkStyle.d.ts +13 -0
  148. package/dist/_dts/theme-core/src/footer/index.d.ts +1 -0
  149. package/dist/_dts/theme-core/src/generated/containerResponsiveThemeCss.d.ts +1 -1
  150. package/dist/_dts/theme-core/src/header/effectiveNavLinkStyle.d.ts +17 -0
  151. package/dist/_dts/theme-core/src/header/generateHeaderLogoStyles.d.ts +15 -0
  152. package/dist/_dts/theme-core/src/header/generateHeaderNavLinkStyles.d.ts +4 -0
  153. package/dist/_dts/theme-core/src/header/index.d.ts +3 -0
  154. package/dist/_dts/theme-core/src/header/legacyNavLinkStyle.d.ts +1 -1
  155. package/dist/_dts/theme-core/src/header/openingForegroundProjection.d.ts +7 -0
  156. package/dist/_dts/theme-core/src/header/rootPaint.d.ts +4 -0
  157. package/dist/_dts/theme-core/src/inputs/checkable.d.ts +42 -0
  158. package/dist/_dts/theme-core/src/inputs/inputGroup.d.ts +19 -0
  159. package/dist/_dts/theme-core/src/navigation/effectPolicy.d.ts +38 -0
  160. package/dist/_dts/theme-core/src/navigation/generateNavLinkCSS.d.ts +4 -0
  161. package/dist/_dts/theme-core/src/navigation/types.d.ts +4 -0
  162. package/dist/_dts/theme-core/src/site-styles/accessibleSurfaces.d.ts +1 -1
  163. package/dist/_dts/theme-core/src/surfaces/foregroundContract.d.ts +7 -0
  164. package/dist/_dts/theme-core/src/surfaces/foregroundInteraction.d.ts +29 -22
  165. package/dist/_dts/theme-core/src/surfaces/foregroundRoles.d.ts +10 -2
  166. package/dist/_dts/theme-core/src/surfaces/resolveSurfaceForeground.d.ts +9 -0
  167. package/dist/_dts/theme-core/src/utils/cssDeclarations.d.ts +2 -0
  168. package/dist/_dts/ui/src/badge.d.ts +2 -1
  169. package/dist/_dts/ui/src/button.d.ts +1 -1
  170. package/dist/_dts/ui/src/combobox-keys.d.ts +23 -0
  171. package/dist/_dts/ui/src/combobox-rows.d.ts +34 -0
  172. package/dist/_dts/ui/src/combobox.d.ts +26 -1
  173. package/dist/_dts/ui/src/date-picker.d.ts +5 -8
  174. package/dist/_dts/ui/src/editor-item-card.d.ts +1 -0
  175. package/dist/_dts/ui/src/field-trigger.d.ts +39 -0
  176. package/dist/_dts/ui/src/fieldControl.d.ts +27 -0
  177. package/dist/_dts/ui/src/index.d.ts +4 -1
  178. package/dist/_dts/ui/src/native-select.d.ts +8 -0
  179. package/dist/_dts/ui/src/navigation-tabs.d.ts +2 -1
  180. package/dist/_dts/ui/src/popover.d.ts +7 -1
  181. package/dist/_dts/ui/src/segmented-control.d.ts +4 -0
  182. package/dist/_dts/ui/src/surface.d.ts +1 -1
  183. package/dist/client/{BookingConsentAgreement-DlVOmpW4.mjs → BookingMailingListNote-1n4Ch_u_.mjs} +15 -4
  184. package/dist/client/CheckboxChoice-B33MqoUo.mjs +24 -0
  185. package/dist/client/{DiscountCodeDisclosure-T9q623PQ.mjs → DiscountCodeDisclosure-CKJtz0mY.mjs} +1 -1
  186. package/dist/client/{EventCombined.client-DnsUeONl.mjs → EventCombined.client-C0pgma9y.mjs} +7 -7
  187. package/dist/client/{EventListing.client-CNBFqJS4.mjs → EventListing.client-4fhLOvHP.mjs} +2 -2
  188. package/dist/client/{LeafletStaticMap-C7higg52.mjs → LeafletStaticMap-DScC4F3w.mjs} +1 -1
  189. package/dist/client/{scrollToBlock-CWs8EIdo.mjs → TerminalPanel-B5ZUsYhe.mjs} +77 -77
  190. package/dist/client/{ThemedButton-LAJTNrS8.mjs → ThemedButton-DoVIV1Ao.mjs} +2 -2
  191. package/dist/client/{accordion-BcNF9TjX.mjs → accordion-CoT5g7zo.mjs} +1 -1
  192. package/dist/client/{bookingForm-BUaQ3S03.mjs → bookingForm-BWxB46xD.mjs} +251 -150
  193. package/dist/client/bookings.mjs +415 -234
  194. package/dist/client/{carousel-CTdF6e0V.mjs → carousel-DtNYWFd3.mjs} +2 -2
  195. package/dist/client/{carousel.client-jahpU9Vz.mjs → carousel.client-A2lG-9od.mjs} +1 -1
  196. package/dist/client/{cart-pGtyf_XU.mjs → cart-z4qZih1Y.mjs} +3 -3
  197. package/dist/client/{checkout-Da9WSn7Y.mjs → checkout-DpL7euFH.mjs} +3 -3
  198. package/dist/client/{checkoutUrls-CW3-78uu.mjs → checkoutUrls-BEfR7kVu.mjs} +1 -1
  199. package/dist/client/client.mjs +3721 -2220
  200. package/dist/client/{colorStyles-CuJBiS-1.mjs → colorStyles-j5U9v5JA.mjs} +5 -1
  201. package/dist/client/{context-BFeY_Wbm.mjs → context-C8TinPJc.mjs} +1 -1
  202. package/dist/client/{dates-BhwVSxDg.mjs → dates-vwwxTeB0.mjs} +2 -3
  203. package/dist/client/{eventCalendar-BAtdnR4s.mjs → eventCalendar-DIbHfJXO.mjs} +10 -10
  204. package/dist/client/{eventCombined-RksA3tRC.mjs → eventCombined-DoGMJ6cg.mjs} +4 -4
  205. package/dist/client/{eventDetails-BB9hB4wR.mjs → eventDetails-BjN9v6a1.mjs} +4 -4
  206. package/dist/client/{eventListing-BpJBkviM.mjs → eventListing-DajjWgOv.mjs} +4 -4
  207. package/dist/client/{eventRegistration-B18jFq_o.mjs → eventRegistration-DMq9gMA-.mjs} +121 -54
  208. package/dist/client/{form-Dodt8Y8t.mjs → form-Qf6qTbos.mjs} +136 -105
  209. package/dist/client/{headerSection-B0qj9ttg.mjs → headerSection-D7qJrqFX.mjs} +3 -3
  210. package/dist/client/hooks.mjs +1148 -179
  211. package/dist/client/{locationMap-gn-iMk7a.mjs → locationMap-CCF9-t_0.mjs} +4 -4
  212. package/dist/client/{FieldValidationMessage-AYanWFb-.mjs → mailingListSignupCopy-DZSHZrm6.mjs} +14 -1
  213. package/dist/client/{media-BtJ37tzS.mjs → media-CwBGetqC.mjs} +1 -1
  214. package/dist/client/{newsletterForm-oByLdFkr.mjs → newsletterForm-DzCLSP4S.mjs} +206 -104
  215. package/dist/client/{pricing-BOU0_Hai.mjs → pricing-Cgxv2KLC.mjs} +1 -1
  216. package/dist/client/{productDetail-D9v1zH2j.mjs → productDetail-ru9w5GHx.mjs} +3 -3
  217. package/dist/client/{productList-D-mItx1n.mjs → productList-zaapKSl-.mjs} +3 -3
  218. package/dist/client/{propsDecoder-C3TP_z4x.mjs → propsDecoder-CwvvNOHx.mjs} +91 -28
  219. package/dist/client/rendering/client.mjs +1441 -826
  220. package/dist/client/rendering/islands.mjs +19 -19
  221. package/dist/client/rendering.mjs +3652 -2005
  222. package/dist/client/{routeIslandApiConfig-DzN1W0sq.mjs → routeIslandApiConfig-BwVFo0Y4.mjs} +1 -1
  223. package/dist/client/{shop-commerce-gklw_hLF.mjs → shop-commerce-De7gEnkA.mjs} +8 -8
  224. package/dist/client/{shop-commerce-store-Sf1eyTaZ.mjs → shop-commerce-store-B3MCxIBW.mjs} +1 -1
  225. package/dist/client/{shop-Dufw7N7o.mjs → shop-mktkXvbV.mjs} +7 -7
  226. package/dist/client/{shopShared-B5nyA41S.mjs → shopShared-TqExh235.mjs} +5 -5
  227. package/dist/client/{useEventFilters-CLL829vy.mjs → useEventFilters-n_OjkIjX.mjs} +8 -8
  228. package/dist/preview-next/before-render.mjs +490 -153
  229. package/dist/preview-next/client/runtime.mjs +4 -4
  230. package/dist/preview-next/editor-base.css +64 -2
  231. package/dist/preview-next/editor-chrome.css +7 -4
  232. package/dist/preview-next/keepAlive.mjs +450 -153
  233. package/dist/preview-next/middleware.mjs +451 -153
  234. package/dist/{previewAuthStore-BxAFlu-j.mjs → previewAuthStore-C_EHQ5XA.mjs} +475 -153
  235. package/dist/{sdk-runtime-D0uZFev7.mjs → sdk-runtime-BIkJg5y1.mjs} +2 -2
  236. package/dist/{separator-EvdCAn4V.mjs → separator-C9qDP95Z.mjs} +1 -1
  237. package/dist/server/components.mjs +4957 -3509
  238. package/dist/server/config-validation.mjs +1115 -189
  239. package/dist/server/config.mjs +1115 -189
  240. package/dist/server/data.mjs +1113 -188
  241. package/dist/server/index.mjs +492 -154
  242. package/dist/server/navigation.mjs +13 -2
  243. package/dist/server/next.mjs +4798 -3462
  244. package/dist/server/page-converter.mjs +143 -89
  245. package/dist/server/prebuild.mjs +1 -1
  246. package/dist/server/rendering/server.mjs +3862 -2414
  247. package/dist/server/rendering.mjs +5648 -4154
  248. package/dist/server/routing.mjs +1223 -329
  249. package/dist/server/server.mjs +1172 -314
  250. package/dist/server/theme-bridge.mjs +533 -128
  251. package/dist/server/theme.mjs +5 -1
  252. package/dist/styles/index.css +218 -69
  253. package/package.json +1 -1
  254. 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).
@@ -1003,6 +1040,13 @@ const EVENT_SERIES_REGISTRATION_ENDPOINT_DEFINITIONS = defineEndpointDefinitions
1003
1040
  errors: [],
1004
1041
  responseKind: "blob"
1005
1042
  },
1043
+ exportEventOfferingRegistrationsCsv: {
1044
+ path: "/sites/{siteId}/bookings/event-offerings/{eventOfferingId}/registrations/export.csv",
1045
+ method: "GET",
1046
+ auth: "user",
1047
+ errors: [],
1048
+ responseKind: "blob"
1049
+ },
1006
1050
  updateEventSeriesRegistration: {
1007
1051
  path: "/sites/{siteId}/bookings/event-series/{seriesId}/registrations/{registrationId}",
1008
1052
  method: "PATCH",
@@ -1013,6 +1057,19 @@ const EVENT_SERIES_REGISTRATION_ENDPOINT_DEFINITIONS = defineEndpointDefinitions
1013
1057
  "resource:not_found",
1014
1058
  "server:internal_error"
1015
1059
  ]
1060
+ },
1061
+ saveEventSeriesRegistrationAnswers: {
1062
+ path: "/sites/{siteId}/bookings/event-series/{seriesId}/registrations/{registrationId}/answers",
1063
+ method: "PUT",
1064
+ auth: "user",
1065
+ responseKind: "json",
1066
+ errors: [
1067
+ "validation:invalid_input",
1068
+ "auth:forbidden",
1069
+ "resource:not_found",
1070
+ "resource:conflict",
1071
+ "server:internal_error"
1072
+ ]
1016
1073
  }
1017
1074
  });
1018
1075
  //#endregion
@@ -1150,6 +1207,20 @@ const NEWSLETTER_ENDPOINT_DEFINITIONS = defineEndpointDefinitions({
1150
1207
  responseKind: "json",
1151
1208
  errors: ["auth:forbidden", "server:internal_error"]
1152
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
+ },
1153
1224
  getMailingListAuthoringContext: {
1154
1225
  path: "/sites/{siteId}/mailing-list/authoring-context",
1155
1226
  method: "GET",
@@ -1433,6 +1504,30 @@ const NEWSLETTER_ENDPOINT_DEFINITIONS = defineEndpointDefinitions({
1433
1504
  responseKind: "json",
1434
1505
  demoMutation: DEMO_MUTATION_BLOCKED_HIDDEN
1435
1506
  },
1507
+ scheduleNewsletterCampaign: {
1508
+ path: "/sites/{siteId}/newsletter/campaigns/{campaignId}/schedule",
1509
+ method: "POST",
1510
+ tags: [TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter],
1511
+ auth: "user",
1512
+ responseKind: "json",
1513
+ demoMutation: DEMO_MUTATION_BLOCKED_HIDDEN
1514
+ },
1515
+ unscheduleNewsletterCampaign: {
1516
+ path: "/sites/{siteId}/newsletter/campaigns/{campaignId}/unschedule",
1517
+ method: "POST",
1518
+ tags: [TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter],
1519
+ auth: "user",
1520
+ responseKind: "json",
1521
+ demoMutation: DEMO_MUTATION_BLOCKED_HIDDEN
1522
+ },
1523
+ stopNewsletterCampaign: {
1524
+ path: "/sites/{siteId}/newsletter/campaigns/{campaignId}/stop",
1525
+ method: "POST",
1526
+ tags: [TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter],
1527
+ auth: "user",
1528
+ responseKind: "json",
1529
+ demoMutation: DEMO_MUTATION_BLOCKED_HIDDEN
1530
+ },
1436
1531
  testSendNewsletterCampaign: {
1437
1532
  path: "/sites/{siteId}/newsletter/campaigns/{campaignId}/test-send",
1438
1533
  method: "POST",
@@ -1443,6 +1538,154 @@ const NEWSLETTER_ENDPOINT_DEFINITIONS = defineEndpointDefinitions({
1443
1538
  }
1444
1539
  });
1445
1540
  //#endregion
1541
+ //#region ../api/src/sdkEventEndpointDefinitions.ts
1542
+ /**
1543
+ * The SDK's Event graph: the Events themselves and the occurrences of one run.
1544
+ * Extracted from `endpoints.ts` so this family can be read, and added to, on
1545
+ * its own. New entries here must declare `errors`; the
1546
+ * require-api-endpoint-errors lint enforces that here as in endpoints.ts.
1547
+ */
1548
+ const SDK_EVENT_ENDPOINT_DEFINITIONS = defineEndpointDefinitions({
1549
+ sdkListEvents: {
1550
+ path: "/sdk/{siteId}/events",
1551
+ method: "GET",
1552
+ auth: "service",
1553
+ responseKind: "json"
1554
+ },
1555
+ sdkUpsertEvent: {
1556
+ path: "/sdk/{siteId}/events",
1557
+ method: "POST",
1558
+ auth: "service",
1559
+ responseKind: "json",
1560
+ errors: [
1561
+ "validation:invalid_input",
1562
+ "resource:not_found",
1563
+ "resource:conflict",
1564
+ "billing:plan_limit_exceeded",
1565
+ "server:internal_error"
1566
+ ]
1567
+ },
1568
+ sdkGetEvent: {
1569
+ path: "/sdk/{siteId}/events/{identifier}",
1570
+ method: "GET",
1571
+ auth: "service",
1572
+ responseKind: "json"
1573
+ },
1574
+ sdkDeleteEvent: {
1575
+ path: "/sdk/{siteId}/events/{identifier}",
1576
+ method: "DELETE",
1577
+ auth: "service",
1578
+ responseKind: "json",
1579
+ errors: [
1580
+ "resource:not_found",
1581
+ "resource:conflict",
1582
+ "server:internal_error"
1583
+ ]
1584
+ },
1585
+ sdkTakeEventOffline: {
1586
+ path: "/sdk/{siteId}/events/{identifier}/lifecycle",
1587
+ method: "POST",
1588
+ auth: "service",
1589
+ responseKind: "json",
1590
+ errors: [
1591
+ "resource:not_found",
1592
+ "validation:invalid_input",
1593
+ "resource:conflict",
1594
+ "server:internal_error"
1595
+ ]
1596
+ },
1597
+ sdkListEventOccurrences: {
1598
+ path: "/sdk/{siteId}/events/{identifier}/runs/{runIdentifier}/occurrences",
1599
+ method: "GET",
1600
+ auth: "service",
1601
+ responseKind: "json",
1602
+ errors: [
1603
+ "resource:not_found",
1604
+ "validation:invalid_input",
1605
+ "server:internal_error"
1606
+ ]
1607
+ },
1608
+ sdkAddEventOccurrence: {
1609
+ path: "/sdk/{siteId}/events/{identifier}/runs/{runIdentifier}/occurrences",
1610
+ method: "POST",
1611
+ auth: "service",
1612
+ responseKind: "json",
1613
+ errors: [
1614
+ "resource:not_found",
1615
+ "validation:invalid_input",
1616
+ "resource:conflict",
1617
+ "server:internal_error"
1618
+ ]
1619
+ },
1620
+ sdkUpdateEventOccurrence: {
1621
+ path: "/sdk/{siteId}/events/{identifier}/runs/{runIdentifier}/occurrences/{occurrenceId}",
1622
+ method: "PATCH",
1623
+ auth: "service",
1624
+ responseKind: "json",
1625
+ errors: [
1626
+ "resource:not_found",
1627
+ "validation:invalid_input",
1628
+ "resource:conflict",
1629
+ "server:internal_error"
1630
+ ]
1631
+ },
1632
+ sdkCancelEventOccurrence: {
1633
+ path: "/sdk/{siteId}/events/{identifier}/runs/{runIdentifier}/occurrences/{occurrenceId}/cancel",
1634
+ method: "POST",
1635
+ auth: "service",
1636
+ responseKind: "json",
1637
+ errors: [
1638
+ "resource:not_found",
1639
+ "resource:conflict",
1640
+ "server:internal_error"
1641
+ ]
1642
+ },
1643
+ sdkDeleteEventOccurrence: {
1644
+ path: "/sdk/{siteId}/events/{identifier}/runs/{runIdentifier}/occurrences/{occurrenceId}",
1645
+ method: "DELETE",
1646
+ auth: "service",
1647
+ responseKind: "json",
1648
+ errors: [
1649
+ "resource:not_found",
1650
+ "resource:conflict",
1651
+ "server:internal_error"
1652
+ ]
1653
+ }
1654
+ });
1655
+ //#endregion
1656
+ //#region ../api/src/sdkPageDesignEndpointDefinitions.ts
1657
+ /**
1658
+ * SDK management endpoints for a page's draft design (issue 1497), spread into
1659
+ * `ENDPOINT_DEFINITIONS` like the other endpoint-definition modules. New
1660
+ * entries here must declare `errors`, which the require-api-endpoint-errors
1661
+ * lint enforces.
1662
+ */
1663
+ const SDK_PAGE_DESIGN_ENDPOINT_DEFINITIONS = defineEndpointDefinitions({
1664
+ sdkGetPageDesign: {
1665
+ path: "/sdk/{siteId}/pages/{identifier}/design",
1666
+ method: "GET",
1667
+ auth: "service",
1668
+ responseKind: "json",
1669
+ errors: [
1670
+ "resource:not_found",
1671
+ "validation:invalid_input",
1672
+ "server:internal_error"
1673
+ ]
1674
+ },
1675
+ sdkSavePageDesign: {
1676
+ path: "/sdk/{siteId}/pages/{identifier}/design",
1677
+ method: "POST",
1678
+ auth: "service",
1679
+ responseKind: "json",
1680
+ errors: [
1681
+ "resource:not_found",
1682
+ "validation:invalid_input",
1683
+ "resource:conflict",
1684
+ "server:internal_error"
1685
+ ]
1686
+ }
1687
+ });
1688
+ //#endregion
1446
1689
  //#region ../core/src/result.ts
1447
1690
  function ok(value) {
1448
1691
  return {
@@ -2135,17 +2378,35 @@ function parseMailingListRuntimeContext(value) {
2135
2378
  if (!isRecord$8(value)) return invalidRuntimeContext();
2136
2379
  if (value.tag === "not_configured") return ok({ tag: "not_configured" });
2137
2380
  if (value.tag !== "configured") return invalidRuntimeContext();
2381
+ return parseConfiguredRuntimeContext(value);
2382
+ }
2383
+ function parseConfiguredRuntimeContext(value) {
2138
2384
  const revision = parseMailingListSetupRevision(value.revision);
2139
2385
  const form = parseMailingListGlobalForm(value.form);
2140
2386
  const provider = parseRuntimeProvider(value.provider);
2141
- 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();
2142
2389
  return ok({
2143
2390
  tag: "configured",
2144
2391
  revision,
2392
+ bookingSignup,
2145
2393
  form: form.value,
2146
2394
  provider
2147
2395
  });
2148
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
+ }
2149
2410
  function parseRuntimeProvider(value) {
2150
2411
  if (!isRecord$8(value)) return null;
2151
2412
  switch (value.provider) {
@@ -2372,15 +2633,6 @@ function parseMailingListContentVersionId(value) {
2372
2633
  const parsed = parseContentVersionId(value);
2373
2634
  return parsed.ok ? parsed.value : null;
2374
2635
  }
2375
- function buildMailingListSignupBlockSourceRef(blockId, contentVersionId) {
2376
- const parsedBlockId = parseMailingListBlockId(blockId);
2377
- const parsedContentVersionId = parseMailingListContentVersionId(contentVersionId);
2378
- return parsedBlockId !== null && parsedContentVersionId !== null ? {
2379
- tag: "block_ref",
2380
- blockId: parsedBlockId,
2381
- contentVersionId: parsedContentVersionId
2382
- } : null;
2383
- }
2384
2636
  //#endregion
2385
2637
  //#region ../core/src/secret.ts
2386
2638
  /**
@@ -3029,6 +3281,45 @@ const SITE_API_KEY_ENDPOINT_DEFINITIONS = defineEndpointDefinitions({
3029
3281
  }
3030
3282
  });
3031
3283
  //#endregion
3284
+ //#region ../api/src/siteManagementEndpointDefinitions.ts
3285
+ const SITE_MANAGEMENT_ENDPOINT_DEFINITIONS = defineEndpointDefinitions({
3286
+ createSite: {
3287
+ path: "/sites/manage",
3288
+ method: "POST",
3289
+ tags: ["site"],
3290
+ auth: "user",
3291
+ responseKind: "json"
3292
+ },
3293
+ updateSite: {
3294
+ path: "/sites/manage",
3295
+ method: "PUT",
3296
+ tags: ["site"],
3297
+ auth: "user",
3298
+ responseKind: "json"
3299
+ },
3300
+ changeSiteAddress: {
3301
+ path: "/sites/{siteId}/address",
3302
+ method: "PUT",
3303
+ auth: "user",
3304
+ responseKind: "json",
3305
+ demoMutation: DEMO_MUTATION_BLOCKED_DISABLED
3306
+ },
3307
+ getSiteAddressAvailability: {
3308
+ path: "/sites/{siteId}/address/availability",
3309
+ method: "GET",
3310
+ auth: "user",
3311
+ responseKind: "json"
3312
+ },
3313
+ deleteSite: {
3314
+ path: "/sites/{siteId}",
3315
+ method: "DELETE",
3316
+ tags: ["site", "site-{siteId}"],
3317
+ auth: "user",
3318
+ responseKind: "json",
3319
+ demoMutation: DEMO_MUTATION_BLOCKED_HIDDEN
3320
+ }
3321
+ });
3322
+ //#endregion
3032
3323
  //#region ../api/src/eventManagementEndpointDefinitions.ts
3033
3324
  const EVENT_MANAGEMENT_ENDPOINT_DEFINITIONS = defineEndpointDefinitions({
3034
3325
  listEvents: {
@@ -3076,6 +3367,28 @@ const EVENT_MANAGEMENT_ENDPOINT_DEFINITIONS = defineEndpointDefinitions({
3076
3367
  "server:internal_error"
3077
3368
  ]
3078
3369
  },
3370
+ /**
3371
+ * The web address of an event's own page. A course page belongs to the
3372
+ * event itself, so its address is written here rather than through a run.
3373
+ */
3374
+ updateEventAddress: {
3375
+ path: "/sites/{siteId}/bookings/events/{eventId}/address",
3376
+ method: "PATCH",
3377
+ tags: [
3378
+ "site-{siteId}",
3379
+ "event-series-{siteId}",
3380
+ TAG_TEMPLATES.siteRoutableContent,
3381
+ TAG_TEMPLATES.siteRedirects
3382
+ ],
3383
+ auth: "user",
3384
+ responseKind: "json",
3385
+ errors: [
3386
+ "validation:invalid_input",
3387
+ "resource:not_found",
3388
+ "resource:conflict",
3389
+ "server:internal_error"
3390
+ ]
3391
+ },
3079
3392
  createWholeSeriesRun: {
3080
3393
  path: "/sites/{siteId}/bookings/events/{eventId}/runs",
3081
3394
  method: "POST",
@@ -3102,6 +3415,20 @@ const EVENT_MANAGEMENT_ENDPOINT_DEFINITIONS = defineEndpointDefinitions({
3102
3415
  "server:internal_error"
3103
3416
  ]
3104
3417
  },
3418
+ updateCourseBookingSettings: {
3419
+ path: "/sites/{siteId}/bookings/events/{eventId}/booking-settings",
3420
+ method: "PATCH",
3421
+ tags: ["site-{siteId}", "event-series-{siteId}"],
3422
+ auth: "user",
3423
+ responseKind: "json",
3424
+ errors: [
3425
+ "validation:invalid_input",
3426
+ "auth:forbidden",
3427
+ "resource:not_found",
3428
+ "resource:conflict",
3429
+ "server:internal_error"
3430
+ ]
3431
+ },
3105
3432
  cancelWholeSeriesRun: {
3106
3433
  path: "/sites/{siteId}/bookings/events/{eventId}/runs/{runId}/cancellation",
3107
3434
  method: "POST",
@@ -3114,6 +3441,28 @@ const EVENT_MANAGEMENT_ENDPOINT_DEFINITIONS = defineEndpointDefinitions({
3114
3441
  "resource:conflict",
3115
3442
  "server:internal_error"
3116
3443
  ]
3444
+ },
3445
+ /**
3446
+ * The Content tab's one write: the short introduction, image and
3447
+ * description of an event's page, published without its layout.
3448
+ */
3449
+ saveEventPageWords: {
3450
+ path: "/sites/{siteId}/page-surfaces/{pageSurfaceId}/words",
3451
+ method: "PUT",
3452
+ tags: [
3453
+ TAG_TEMPLATES.siteCollection,
3454
+ TAG_TEMPLATES.siteRoutableContent,
3455
+ TAG_TEMPLATES.pageSurfaceById
3456
+ ],
3457
+ auth: "user",
3458
+ responseKind: "json",
3459
+ errors: [
3460
+ "auth:forbidden",
3461
+ "validation:invalid_input",
3462
+ "resource:not_found",
3463
+ "resource:conflict",
3464
+ "server:internal_error"
3465
+ ]
3117
3466
  }
3118
3467
  });
3119
3468
  //#endregion
@@ -3546,19 +3895,105 @@ const BILLING_ENDPOINT_DEFINITIONS = defineEndpointDefinitions({
3546
3895
  responseKind: "json"
3547
3896
  }
3548
3897
  });
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
3947
+ //#region ../api/src/clientErrorReporting.ts
3948
+ const CLIENT_ERROR_REPORT_ENDPOINT_DEFINITIONS = defineEndpointDefinitions({ reportClientError: {
3949
+ path: "/client/error-report",
3950
+ method: "POST",
3951
+ auth: "user",
3952
+ errors: [],
3953
+ responseKind: "json"
3954
+ } });
3955
+ const CLIENT_ERROR_REPORT_LIMITS = {
3956
+ pathname: 1024,
3957
+ name: 120,
3958
+ message: 2e3,
3959
+ stack: 8e3,
3960
+ digest: 128,
3961
+ componentStack: 8e3,
3962
+ sourceLocation: 1024
3963
+ };
3964
+ const clientErrorEventSchema = z.enum([
3965
+ "dashboard:route-error",
3966
+ "dashboard:app-error",
3967
+ "client:error-boundary",
3968
+ "client:window-error",
3969
+ "client:unhandled-rejection"
3970
+ ]);
3971
+ z.object({
3972
+ event: clientErrorEventSchema,
3973
+ pathname: z.string().startsWith("/").max(CLIENT_ERROR_REPORT_LIMITS.pathname),
3974
+ name: z.string().max(CLIENT_ERROR_REPORT_LIMITS.name),
3975
+ message: z.string().max(CLIENT_ERROR_REPORT_LIMITS.message),
3976
+ stack: z.string().max(CLIENT_ERROR_REPORT_LIMITS.stack).nullable(),
3977
+ digest: z.string().max(CLIENT_ERROR_REPORT_LIMITS.digest).nullable(),
3978
+ componentStack: z.string().max(CLIENT_ERROR_REPORT_LIMITS.componentStack).nullable(),
3979
+ sourceLocation: z.string().max(CLIENT_ERROR_REPORT_LIMITS.sourceLocation).nullable()
3980
+ }).strict();
3549
3981
  ({
3982
+ ...SITE_LIFECYCLE_ENDPOINT_DEFINITIONS,
3983
+ ...CLIENT_ERROR_REPORT_ENDPOINT_DEFINITIONS,
3550
3984
  ...PUBLIC_NEWSLETTER_ENDPOINT_DEFINITIONS,
3551
3985
  ...ACCOUNT_ENDPOINT_DEFINITIONS,
3552
3986
  ...PUBLIC_ONBOARDING_ATTEMPT_ENDPOINT_DEFINITIONS,
3553
3987
  ...PUBLIC_EVENT_ENDPOINT_DEFINITIONS,
3554
3988
  ...GIFTING_ENDPOINT_DEFINITIONS,
3555
3989
  ...PUBLIC_READ_ENDPOINT_DEFINITIONS,
3556
- ...BILLING_ENDPOINT_DEFINITIONS
3990
+ ...BILLING_ENDPOINT_DEFINITIONS,
3991
+ ...SITE_MANAGEMENT_ENDPOINT_DEFINITIONS
3557
3992
  }), TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteTheme, TAG_TEMPLATES.siteCollection, { ...SITE_API_KEY_ENDPOINT_DEFINITIONS }, TAG_TEMPLATES.site, TAG_TEMPLATES.siteBookingSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteBookingSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteEmailSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteEmailSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteEmailSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteEmailSettings, {
3558
3993
  ...NEWSLETTER_ENDPOINT_DEFINITIONS,
3559
3994
  ...APPOINTMENT_ENDPOINT_DEFINITIONS,
3560
3995
  ...EVENT_SERIES_REGISTRATION_ENDPOINT_DEFINITIONS
3561
- }, 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_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 };
3562
3997
  z.object({ refreshToken: z.string().min(1).max(4096) }).strict();
3563
3998
  z.object({
3564
3999
  accessToken: z.string().min(1).max(4096),
@@ -6059,13 +6494,16 @@ const SURFACE_FOREGROUND_CSS_VARS = {
6059
6494
  text: "--rb-surface-text-color",
6060
6495
  heading: "--rb-surface-heading-color",
6061
6496
  link: "--rb-surface-link-color",
6497
+ linkHover: "--rb-surface-link-hover-color",
6062
6498
  supporting: "--rb-surface-supporting-color"
6063
6499
  };
6064
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)))";
6065
6502
  const DEFAULT_ROLE_FALLBACKS = {
6066
6503
  text: DEFAULT_SURFACE_TEXT_COLOR,
6067
6504
  heading: DEFAULT_SURFACE_TEXT_COLOR,
6068
- link: "rgb(var(--tb-primary, var(--tb-text, 17 24 39)))",
6505
+ link: DEFAULT_SURFACE_LINK_COLOR,
6506
+ linkHover: DEFAULT_SURFACE_LINK_COLOR,
6069
6507
  supporting: "rgb(var(--tb-mutedText, 100 116 139))"
6070
6508
  };
6071
6509
  function requireSurfaceColorValue(role, value) {
@@ -6075,10 +6513,12 @@ function requireSurfaceColorValue(role, value) {
6075
6513
  }
6076
6514
  function completeSurfaceForegrounds(input) {
6077
6515
  const text = requireSurfaceColorValue("text", input.text);
6516
+ const link = input.link === void 0 ? text : requireSurfaceColorValue("link", input.link);
6078
6517
  return {
6079
6518
  text,
6080
6519
  heading: input.heading === void 0 ? text : requireSurfaceColorValue("heading", input.heading),
6081
- link: input.link === void 0 ? text : requireSurfaceColorValue("link", input.link),
6520
+ link,
6521
+ linkHover: input.linkHover === void 0 ? link : requireSurfaceColorValue("linkHover", input.linkHover),
6082
6522
  supporting: input.supporting === void 0 ? text : requireSurfaceColorValue("supporting", input.supporting)
6083
6523
  };
6084
6524
  }
@@ -6086,6 +6526,7 @@ function surfaceForegroundValue(role, outsideProviderFallback = DEFAULT_ROLE_FAL
6086
6526
  const roleVariable = SURFACE_FOREGROUND_CSS_VARS[role];
6087
6527
  const fallback = requireSurfaceColorValue("fallback", outsideProviderFallback);
6088
6528
  if (role === "text") return `var(${roleVariable}, ${fallback})`;
6529
+ if (role === "linkHover") return `var(${roleVariable}, ${surfaceForegroundValue("link", fallback)})`;
6089
6530
  return `var(${roleVariable}, var(${SURFACE_FOREGROUND_CSS_VARS.text}, ${fallback}))`;
6090
6531
  }
6091
6532
  function surfaceForegroundValueWithOpacity(role, opacityPercent) {
@@ -6099,9 +6540,25 @@ function surfaceForegroundStyle(input) {
6099
6540
  [SURFACE_FOREGROUND_CSS_VARS.text]: foregrounds.text,
6100
6541
  [SURFACE_FOREGROUND_CSS_VARS.heading]: foregrounds.heading,
6101
6542
  [SURFACE_FOREGROUND_CSS_VARS.link]: foregrounds.link,
6102
- [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)
6103
6546
  };
6104
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
+ }
6105
6562
  //#endregion
6106
6563
  //#region ../theme-core/src/buttons/constants.ts
6107
6564
  /**
@@ -6856,6 +7313,64 @@ function parseAlpha(source) {
6856
7313
  function isRgbChannel(value) {
6857
7314
  return Number.isFinite(value) && value >= 0 && value <= 255;
6858
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
+ }
6859
7374
  //#endregion
6860
7375
  //#region ../theme-core/src/surfaces/resolveSurfaceForeground.ts
6861
7376
  const FALLBACK_TEXT_TOKENS = [
@@ -6902,12 +7417,16 @@ function resolveSurfaceForeground(background, palette, candidates = {}, options
6902
7417
  }
6903
7418
  function foregroundCandidates(background, overrides) {
6904
7419
  return {
6905
- text: overrides.text ?? background?.textColor ?? null,
6906
- heading: overrides.heading ?? background?.headingColor ?? null,
6907
- link: overrides.link ?? background?.linkColor ?? null,
6908
- 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)
6909
7425
  };
6910
7426
  }
7427
+ function candidateOrBackground(candidate, backgroundValue) {
7428
+ return candidate ?? backgroundValue ?? null;
7429
+ }
6911
7430
  function resolveDeterministicForeground(backgroundReference, candidates, palette, compositeBase) {
6912
7431
  const backgroundHex = resolveOpaqueSurfaceHex(backgroundReference, palette, compositeBase);
6913
7432
  if (!backgroundHex) return resolveTrustedTreatmentForeground(candidates, palette);
@@ -6919,29 +7438,51 @@ function resolveDeterministicForeground(backgroundReference, candidates, palette
6919
7438
  ...FALLBACK_TEXT_TOKENS
6920
7439
  ], backgroundHex, palette, derivedOnToken ? [derivedOnToken] : []);
6921
7440
  if (!text) return { kind: "unknown" };
6922
- return {
6923
- kind: "known",
6924
- roles: {
6925
- text,
6926
- heading: safeTokenOr(candidates.heading, text, backgroundHex, palette),
6927
- link: safeTokenOr(candidates.link, text, backgroundHex, palette),
6928
- supporting: safeTokenOr(candidates.supporting, text, backgroundHex, palette)
6929
- }
6930
- };
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);
6931
7450
  }
6932
7451
  function resolveTrustedTreatmentForeground(candidates, palette) {
6933
7452
  const text = canonicalToken(candidates.text, palette);
6934
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
+ });
6935
7468
  return {
6936
7469
  kind: "known",
7470
+ provenance,
6937
7471
  roles: {
6938
- text,
6939
- heading: canonicalToken(candidates.heading, palette) ?? text,
6940
- link: canonicalToken(candidates.link, palette) ?? text,
6941
- supporting: canonicalToken(candidates.supporting, palette) ?? text
6942
- }
7472
+ ...roles,
7473
+ linkHover: hover.token
7474
+ },
7475
+ hoverDecoration: hover.decoration
6943
7476
  };
6944
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
+ }
6945
7486
  function safeTokenOr(candidate, fallback, backgroundHex, palette) {
6946
7487
  return firstSafeToken([candidate], backgroundHex, palette) ?? fallback;
6947
7488
  }
@@ -9881,6 +10422,43 @@ const effectCompositionSchema = z.object({
9881
10422
  /** Effects applied on focus */
9882
10423
  focus: z.array(effectApplicationSchema).optional()
9883
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
+ }
9884
10462
  //#endregion
9885
10463
  //#region ../theme-core/src/navigation/types.ts
9886
10464
  /**
@@ -9969,6 +10547,16 @@ const navLinkStyleSchema = z.object({
9969
10547
  /** Composable effects */
9970
10548
  effects: effectCompositionSchema.optional()
9971
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
+ }
9972
10560
  //#endregion
9973
10561
  //#region ../theme-core/src/customCss/validation.ts
9974
10562
  /**
@@ -16157,6 +16745,14 @@ const blockDesignFallback = {
16157
16745
  };
16158
16746
  blockDesignFallback.sectionSurface, blockDesignFallback.contentFrame, blockDesignFallback.sectionHeight, blockDesignFallback.heroLegibility, blockDesignFallback.imageSurfaceTreatment, blockDesignFallback.imageSurfaceMotion, blockDesignFallback.tileTreatment, blockDesignFallback.eventListTreatment, blockDesignFallback.eyebrowTreatment, blockDesignFallback.accordionIconTreatment, blockDesignFallback.composition;
16159
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
16160
16756
  //#region ../theme-core/src/site-styles/siteChromeBackgrounds.ts
16161
16757
  const siteChromeBackgroundColorTokens = toSiteChromeBackgroundColorTokens(backgroundAppearanceColorTokenNames);
16162
16758
  const quickSiteChromeBackgroundColorTokens = toSiteChromeBackgroundColorTokens(backgroundAppearanceQuickColorTokenNames);
@@ -16336,6 +16932,259 @@ z.object(headerPreferencesShape).omit({
16336
16932
  structure: true
16337
16933
  }).strict();
16338
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
16339
17188
  //#region ../theme-core/src/site-styles/pageDesignAuthority.ts
16340
17189
  const nonEmptyStringSchema = z.string().min(1);
16341
17190
  const blockContentVersionIdSchema = nonEmptyStringSchema.transform(asBlockContentVersionId);
@@ -16488,6 +17337,28 @@ z.object({
16488
17337
  motion: z.enum(themeTokenRecipeOptions.motion)
16489
17338
  });
16490
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
16491
17362
  //#region ../theme-core/src/siteChromeOverlayClearance.ts
16492
17363
  const SITE_CHROME_VISIBLE_HEADER_ATTR = "data-site-chrome-visible-header";
16493
17364
  //#endregion
@@ -19461,33 +20332,28 @@ function resolveBackgroundColorValue(value, context) {
19461
20332
  //#endregion
19462
20333
  //#region ../blocks/src/system/transforms/registry/_utils/surfaceForegroundStyles.ts
19463
20334
  const contextualButtonStylesCache = /* @__PURE__ */ new WeakMap();
19464
- function resolveHeaderLeafTextColor(header) {
19465
- return header?.textColor ?? header?.navColor ?? header?.background?.textColor ?? header?.navLinkStyle?.colorToken ?? "text";
19466
- }
19467
20335
  function resolveHeaderRootForeground(header, palette, isTransparent) {
19468
- if (isTransparent) return { kind: "unknown" };
20336
+ if (isTransparent) return readOpeningForegroundProjection(header) ?? { kind: "unknown" };
19469
20337
  const background = header?.background;
19470
20338
  return resolveSurfaceForeground(background ?? {
19471
20339
  type: "color",
19472
20340
  color: "surface"
19473
- }, palette, {
19474
- text: header?.textColor ?? background?.textColor,
19475
- link: header?.navLinkStyle?.colorToken ?? header?.navColor ?? header?.textColor
19476
- });
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" });
19477
20348
  }
19478
20349
  function resolveSurfaceForegroundStyles(value, context, options) {
19479
20350
  const input = parseBackgroundContent(value);
19480
- 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" };
19481
20352
  const buttonStyles = resolveContextualButtonStyles(input, foreground, context, options);
19482
20353
  if (foreground.kind === "unknown") return buttonStyles;
19483
20354
  return {
19484
20355
  ...buttonStyles,
19485
- ...surfaceForegroundStyle({
19486
- text: resolveBackgroundColorValue(foreground.roles.text, context),
19487
- heading: resolveBackgroundColorValue(foreground.roles.heading, context),
19488
- link: resolveBackgroundColorValue(foreground.roles.link, context),
19489
- supporting: resolveBackgroundColorValue(foreground.roles.supporting, context)
19490
- })
20356
+ ...surfaceForegroundStyle(surfaceForegroundInputFromResolved(foreground, (token) => resolveBackgroundColorValue(token, context)))
19491
20357
  };
19492
20358
  }
19493
20359
  function resolveContextualButtonStyles(background, foreground, context, options) {
@@ -25303,10 +26169,7 @@ function resolveBackgroundVisualStyles(backgroundColor, defaultToken = "surface"
25303
26169
  };
25304
26170
  }
25305
26171
  function resolveHeaderVisualStyles(header) {
25306
- const navContainerType = header?.navContainer?.type ?? "none";
25307
- const hasContainedNav = navContainerType === "glass" || navContainerType === "pill";
25308
- const hasOverlayVariant = header?.variant === "floating";
25309
- if (hasContainedNav || hasOverlayVariant) return {
26172
+ if (headerRootPaint(header) !== "own-surface") return {
25310
26173
  backgroundToken: "transparent",
25311
26174
  isTransparent: true
25312
26175
  };
@@ -25317,23 +26180,7 @@ function resolveHeaderVisualStyles(header) {
25317
26180
  }
25318
26181
  function resolvedForegroundStyle(foreground) {
25319
26182
  if (foreground.kind === "unknown") return void 0;
25320
- const { roles } = foreground;
25321
- return surfaceForegroundStyle({
25322
- text: rgbColorValue(roles.text),
25323
- heading: rgbColorValue(roles.heading),
25324
- link: rgbColorValue(roles.link),
25325
- supporting: rgbColorValue(roles.supporting)
25326
- });
25327
- }
25328
- function resolveFooterRootForeground(footer, palette) {
25329
- const background = footer?.background;
25330
- return resolveSurfaceForeground(background ?? {
25331
- type: "color",
25332
- color: "surface"
25333
- }, palette, {
25334
- text: background?.textColor,
25335
- link: footer?.navLinkStyle?.colorToken ?? footer?.navColor ?? background?.textColor
25336
- });
26183
+ return surfaceForegroundStyle(surfaceForegroundInputFromResolved(foreground, rgbColorValue));
25337
26184
  }
25338
26185
  function footerBottomBarBorderWidthStyle(width) {
25339
26186
  if (!width) return void 0;
@@ -25360,8 +26207,7 @@ const headerRootClassTransform = {
25360
26207
  const placement = planSiteChromePlacement(parseHeaderPositioning(content.positioning));
25361
26208
  const header = asPartialObject(value);
25362
26209
  const visuals = resolveHeaderVisualStyles(header);
25363
- const navContainerType = header?.navContainer?.type ?? "none";
25364
- const hasContainedNav = navContainerType === "glass" || navContainerType === "pill";
26210
+ const hasContainedNav = headerRootPaint(header) === "contained-nav";
25365
26211
  const backgroundClass = visuals.isTransparent || hasContainedNav ? "rb-bg-transparent" : null;
25366
26212
  const classes = [config.base, backgroundClass];
25367
26213
  if (!hasContainedNav) {
@@ -25404,7 +26250,7 @@ const headerRootStyleTransform = {
25404
26250
  run: (value, _options, context) => {
25405
26251
  const header = asPartialObject(value);
25406
26252
  const visuals = resolveHeaderVisualStyles(header);
25407
- 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"));
25408
26254
  }
25409
26255
  };
25410
26256
  const headerSectionBackgroundTransform = {
@@ -25412,9 +26258,7 @@ const headerSectionBackgroundTransform = {
25412
26258
  kind: "string",
25413
26259
  summary: "Resolve the inner site-header section background token",
25414
26260
  run: (value) => {
25415
- const header = asPartialObject(value);
25416
- const navContainerType = header?.navContainer?.type ?? "none";
25417
- return header?.variant === "floating" || navContainerType === "glass" || navContainerType === "pill" ? "raw:transparent" : "background";
26261
+ return headerRootPaint(asPartialObject(value)) !== "own-surface" ? "raw:transparent" : "background";
25418
26262
  }
25419
26263
  };
25420
26264
  const footerRootStyleTransform = {
@@ -25432,7 +26276,7 @@ const footerRootStyleTransform = {
25432
26276
  styleParts.push(backgroundColorStyle(token));
25433
26277
  }
25434
26278
  }
25435
- styleParts.push(resolvedForegroundStyle(resolveFooterRootForeground(footer, context.theme.palette)));
26279
+ styleParts.push(resolvedForegroundStyle(resolveFooterRootForeground(footer, context.theme.palette, context.proseHoverCandidate)));
25436
26280
  styleParts.push(borderColorStyle("border"));
25437
26281
  return mergeStyles(...styleParts);
25438
26282
  }
@@ -25494,22 +26338,28 @@ const footerBottomBarStyleTransform = {
25494
26338
  run: (value, _options, context) => {
25495
26339
  const footer = asPartialObject(value);
25496
26340
  const bottomBar = footer?.bottomBar;
25497
- const styleParts = [];
25498
- const background = bottomBar?.background;
25499
- if (background?.type === "color") styleParts.push(backgroundColorStyle(background.color ?? "surface"));
25500
- styleParts.push(borderColorStyle(bottomBar?.borderTop?.colorToken ?? "border"), footerBottomBarBorderWidthStyle(bottomBar?.borderTop?.width));
25501
- const foreground = resolveSurfaceForeground(background?.type === "color" ? background : {
25502
- type: "color",
25503
- color: "transparent"
25504
- }, context.theme.palette, {
25505
- text: bottomBar?.textColor,
25506
- link: footer?.bottomTextLinkStyle?.colorToken ?? bottomBar?.textColor
25507
- });
25508
- if (background?.type === "color") styleParts.push(resolvedForegroundStyle(foreground));
25509
- else if (bottomBar?.textColor) styleParts.push(textColorStyle(bottomBar.textColor));
25510
- 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));
25511
26342
  }
25512
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
+ }
25513
26363
  const footerSplitMainClassTransform = {
25514
26364
  id: "layout.footerSplitMainClass",
25515
26365
  kind: "string",
@@ -25605,7 +26455,7 @@ function chromeSurfaceTextToken(surface, theme, palette) {
25605
26455
  case "header-root": {
25606
26456
  const header = theme.header;
25607
26457
  const foreground = resolveHeaderRootForeground(header, palette, resolveHeaderVisualStyles(header).isTransparent);
25608
- return foreground.kind === "known" ? foreground.roles.text : resolveHeaderLeafTextColor(header);
26458
+ return foreground.kind === "known" ? foreground.roles.text : headerLeafTextColor(header);
25609
26459
  }
25610
26460
  case "header-mobile-panel": return theme.header?.dropdownStyle?.textColor ?? "text";
25611
26461
  case "footer-root": {
@@ -26189,13 +27039,13 @@ const hours = stack({
26189
27039
  as: "p",
26190
27040
  className: "rb-caption rb-opacity-70"
26191
27041
  }, bind("module.timeZone"), when("module.timeZone"))], when("module.kind", { equals: "opening-hours" }));
26192
- const socials = inline({ className: "rb-flex rb-flex-wrap rb-gap-x-5 rb-gap-y-3" }, [link({
27042
+ const socials = inline({ className: "rb-footer-socials" }, [link({
26193
27043
  href: { $bind: { from: "social.href" } },
26194
27044
  target: "_blank",
26195
27045
  rel: "noreferrer noopener",
26196
27046
  "aria-label": { $bind: { from: "social.label" } },
26197
- className: "rb-nav-text transition-theme-standard"
26198
- }, [icon({ className: "rb-h-5 rb-w-5" }, bind("social.icon"), when("social.icon")), text({ as: "span" }, bind("social.label"), when("social.icon", { equals: null }))], repeat("module.socialLinks", "social"))], when("module.kind", { equals: "social-links" }));
27047
+ className: "rb-footer-social-link rb-nav-text transition-theme-standard"
27048
+ }, [icon({ className: "rb-footer-social-icon" }, bind("social.icon"), when("social.icon")), text({ as: "span" }, bind("social.label"), when("social.icon", { equals: null }))], repeat("module.socialLinks", "social"))], when("module.kind", { equals: "social-links" }));
26199
27049
  const authoredCopy = richText({
26200
27050
  className: "rb-prose rb-prose-sm rb-max-w-none",
26201
27051
  style: textColorStyle("text/80")
@@ -27692,7 +28542,9 @@ const bookingWizard = bookingForm(withApiBindings({
27692
28542
  } },
27693
28543
  formId: { $bind: { from: "content.formId" } },
27694
28544
  form: { $bind: { from: "data.form" } },
27695
- services: { $bind: { from: "data.services" } }
28545
+ services: { $bind: { from: "data.services" } },
28546
+ mailingList: { $bind: { from: "$root.mailingList" } },
28547
+ siteName: { $bind: { from: "$root.siteName" } }
27696
28548
  }));
27697
28549
  /** Both variants sit in the same section shell; only the inner layout differs. */
27698
28550
  function bookingSection(children) {
@@ -28280,6 +29132,7 @@ const publicEventLoaderQuerySchemaShape = {
28280
29132
  seriesSlug: z.string().optional(),
28281
29133
  includeOccurrenceId: z.string().optional(),
28282
29134
  readIntent: z.string().optional(),
29135
+ detailAdmission: z.string().optional(),
28283
29136
  detailLevel: z.string().optional(),
28284
29137
  readProfile: z.string().optional()
28285
29138
  };
@@ -28446,11 +29299,11 @@ const publicEventBookingAvailabilitySchema = z.discriminatedUnion("kind", [z.obj
28446
29299
  "series_archived",
28447
29300
  "parent_archived",
28448
29301
  "parent_inconsistent",
28449
- "not_public",
28450
29302
  "already_started",
28451
29303
  "enrollment_closed"
28452
29304
  ])
28453
29305
  })]);
29306
+ const publicEventBookingClosedDetailSchema = z.discriminatedUnion("kind", [z.object({ kind: z.literal("opensSoon") }), z.object({ kind: z.literal("paused") })]);
28454
29307
  const publicRunSessionSchema = z.object({
28455
29308
  occurrenceId: z.string(),
28456
29309
  startsAt: z.string(),
@@ -28495,6 +29348,7 @@ const publicEventBaseSchema = z.object({
28495
29348
  destination: publicEventDestinationSchema,
28496
29349
  requiresRegistration: z.boolean(),
28497
29350
  bookingAvailability: publicEventBookingAvailabilitySchema,
29351
+ bookingClosedDetail: publicEventBookingClosedDetailSchema.optional(),
28498
29352
  deliveryMode: z.enum([
28499
29353
  "in_person",
28500
29354
  "online",
@@ -29192,7 +30046,13 @@ const eventRegistrationHydrationSchemaShape = {
29192
30046
  spamProtectionEnabled: z.boolean().optional(),
29193
30047
  supportEmail: z.string().optional(),
29194
30048
  sitePasses: publicPassProductCollectionSchema.nullable().optional(),
29195
- 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()
29196
30056
  };
29197
30057
  const eventRegistrationEventSourceSchema = z.discriminatedUnion("kind", [z.object({
29198
30058
  kind: z.literal("loaded"),
@@ -29364,7 +30224,9 @@ const eventRegistrationBlockRuntime = defineClientOwnedBlockRuntime({
29364
30224
  spamProtectionEnabled: source.spamProtectionEnabled,
29365
30225
  supportEmail: source.supportEmail,
29366
30226
  sitePasses: source.sitePasses ?? null,
29367
- siteMemberships: source.siteMemberships ?? null
30227
+ siteMemberships: source.siteMemberships ?? null,
30228
+ mailingList: source.mailingList,
30229
+ siteName: source.siteName
29368
30230
  }
29369
30231
  };
29370
30232
  }
@@ -29532,6 +30394,8 @@ const eventRegistrationBlockDefinition = {
29532
30394
  events: { $bind: { from: "data.events" } },
29533
30395
  wholeSeriesRunEvents: { $bind: { from: "data.wholeSeriesRunEvents" } },
29534
30396
  loaderFailures: { $bind: { from: "$root.loaderFailures" } },
30397
+ mailingList: { $bind: { from: "$root.mailingList" } },
30398
+ siteName: { $bind: { from: "$root.siteName" } },
29535
30399
  sitePasses: { $bind: { from: "data.sitePasses" } },
29536
30400
  siteMemberships: { $bind: { from: "data.siteMemberships" } },
29537
30401
  stage: { $bind: {
@@ -36158,6 +37022,11 @@ const mailingListContentVersionIdSchema = z.string().transform((value, ctx) => {
36158
37022
  });
36159
37023
  return z.NEVER;
36160
37024
  });
37025
+ const mailingListSignupBlockSourceRefSchema = z.object({
37026
+ tag: z.literal("block_ref"),
37027
+ blockId: mailingListSignupBlockIdSchema,
37028
+ contentVersionId: mailingListContentVersionIdSchema
37029
+ });
36161
37030
  const signedMailingListSourceTokenSchema = z.string().trim().min(1).transform(parseRequiredMailingListSignedSourceToken);
36162
37031
  const newsletterSourceCommonSchema = z.object({
36163
37032
  siteId: z.string().optional(),
@@ -36172,7 +37041,15 @@ const newsletterSourceSchema = z.discriminatedUnion("source", [
36172
37041
  newsletterSourceCommonSchema.extend({
36173
37042
  source: z.literal("block"),
36174
37043
  blockId: z.string().nullable().optional(),
36175
- contentVersionId: z.string().nullable().optional()
37044
+ newsletterBlockSubmission: z.discriminatedUnion("tag", [
37045
+ z.object({
37046
+ tag: z.literal("ready"),
37047
+ sourceRef: mailingListSignupBlockSourceRefSchema
37048
+ }),
37049
+ z.object({ tag: z.literal("unpublished-form") }),
37050
+ z.object({ tag: z.literal("unpublished-settings") }),
37051
+ z.object({ tag: z.literal("unavailable") })
37052
+ ])
36176
37053
  }),
36177
37054
  newsletterSourceCommonSchema.extend({
36178
37055
  source: z.literal("signed-footer"),
@@ -36201,11 +37078,7 @@ const newsletterHydrationSchema = z.object({
36201
37078
  target: z.discriminatedUnion("tag", [
36202
37079
  z.object({
36203
37080
  tag: z.literal("block-source"),
36204
- sourceRef: z.object({
36205
- tag: z.literal("block_ref"),
36206
- blockId: mailingListSignupBlockIdSchema,
36207
- contentVersionId: mailingListContentVersionIdSchema
36208
- }).nullable()
37081
+ sourceRef: mailingListSignupBlockSourceRefSchema.nullable()
36209
37082
  }),
36210
37083
  z.object({
36211
37084
  tag: z.literal("signed-footer-source"),
@@ -36214,7 +37087,11 @@ const newsletterHydrationSchema = z.object({
36214
37087
  token: signedMailingListSourceTokenSchema
36215
37088
  })
36216
37089
  }),
36217
- z.object({ tag: z.literal("preview") })
37090
+ z.object({ tag: z.literal("preview") }),
37091
+ z.object({
37092
+ tag: z.literal("unpublished-preview"),
37093
+ reason: z.enum(["unpublished-form", "unpublished-settings"])
37094
+ })
36218
37095
  ]),
36219
37096
  setupRevision: z.number().int().positive().nullable(),
36220
37097
  choiceProvider: z.enum([
@@ -36283,16 +37160,21 @@ const newsletterFormBlockRuntime = defineProgressiveBlockRuntime({
36283
37160
  });
36284
37161
  function projectNewsletterFormHydrationTarget(source) {
36285
37162
  switch (source.source) {
36286
- case "block": {
36287
- const sourceRef = buildMailingListSignupBlockSourceRef(source.blockId, source.contentVersionId);
36288
- if (sourceRef?.tag === "block_ref") return {
37163
+ case "block": switch (source.newsletterBlockSubmission.tag) {
37164
+ case "unpublished-form":
37165
+ case "unpublished-settings": return {
37166
+ tag: "unpublished-preview",
37167
+ reason: source.newsletterBlockSubmission.tag
37168
+ };
37169
+ case "ready": return {
36289
37170
  tag: "block-source",
36290
- sourceRef
37171
+ sourceRef: source.newsletterBlockSubmission.sourceRef
36291
37172
  };
36292
- return {
37173
+ case "unavailable": return {
36293
37174
  tag: "block-source",
36294
37175
  sourceRef: null
36295
37176
  };
37177
+ default: return assertNever$2(source.newsletterBlockSubmission);
36296
37178
  }
36297
37179
  case "signed-footer": return {
36298
37180
  tag: "signed-footer-source",
@@ -36397,65 +37279,67 @@ const editorialSplitLayout = styledSection({
36397
37279
  spacing: "comfortable",
36398
37280
  background: "surface"
36399
37281
  });
36400
- const newsletterSignupBlockDefinition = {
36401
- manifest: createBlockManifest({
36402
- id: "block.newsletter-signup",
36403
- title: "Newsletter Signup",
36404
- titleSource: "title",
36405
- description: "Newsletter subscription form with configurable field presets.",
36406
- category: "interactive",
36407
- contentSource: { kind: "inline" },
36408
- fragments: [{
36409
- fragment: newsletterCopyFragment,
36410
- fieldPriority: 0
36411
- }, {
36412
- fragment: newsletterFormFragment,
36413
- fieldPriority: 1
36414
- }],
36415
- layout: stackedLayout,
36416
- variants: {
36417
- stacked: stackedLayout,
36418
- inline: inlineLayout,
36419
- "editorial-split": editorialSplitLayout
36420
- },
36421
- defaultVariant: "stacked",
36422
- variantOptions: {
36423
- stacked: {
36424
- label: "Stacked",
36425
- description: "Vertical layout with fields stacked"
36426
- },
36427
- inline: {
36428
- label: "Inline",
36429
- description: "Horizontal layout (email + button side by side)"
36430
- },
36431
- "editorial-split": {
36432
- label: "Editorial split",
36433
- description: "Copy and form in balanced side-by-side columns, stacked on mobile."
36434
- }
36435
- },
36436
- styleTokens: {
36437
- background: "surface",
36438
- typography: "body",
36439
- 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"
36440
37307
  },
36441
- behaviours: {
36442
- supportsThemeSwitching: true,
36443
- inlineEditing: false,
36444
- animation: false,
36445
- paletteHidden: false
37308
+ inline: {
37309
+ label: "Inline",
37310
+ description: "Horizontal layout (email + button side by side)"
36446
37311
  },
36447
- tags: [
36448
- "newsletter",
36449
- "signup",
36450
- "email",
36451
- "subscribe",
36452
- "subscription",
36453
- "mailchimp",
36454
- "marketing",
36455
- "lead-capture"
36456
- ],
36457
- icon: "Mail"
36458
- }),
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,
36459
37343
  runtime: newsletterFormBlockRuntime
36460
37344
  };
36461
37345
  //#endregion
@@ -38497,7 +39381,8 @@ const BOOKING_FORM_DATA_RESERVED_KEYS = /* @__PURE__ */ new Set([
38497
39381
  "discountCode",
38498
39382
  "selectedSlidingAmountInput",
38499
39383
  "selectedCollectionOptionKind",
38500
- "selectedAppointmentPackageId"
39384
+ "selectedAppointmentPackageId",
39385
+ "mailingListOptIn"
38501
39386
  ]);
38502
39387
  function isBookingFormDataReservedKey(value) {
38503
39388
  return BOOKING_FORM_DATA_RESERVED_KEYS.has(value);
@@ -38845,6 +39730,46 @@ z.object({ acceptExtraSiteCharge: z.boolean().optional() });
38845
39730
  //#region ../surfaces/src/index.ts
38846
39731
  const SURFACE_IDS = ["core", "macadamia"];
38847
39732
  const DEFAULT_SURFACE_ID = "core";
39733
+ /**
39734
+ * Root hosts for each surface, keyed by deployment tier. The tier-keyed shape
39735
+ * makes it impossible to mis-order entries: callers like
39736
+ * `buildSurfaceAwareDashboardOriginForSurfaceId` look up by tier directly
39737
+ * rather than relying on positional alignment between arrays.
39738
+ */
39739
+ const SURFACE_ROOT_HOSTS = {
39740
+ core: {
39741
+ local: "localhost",
39742
+ prod: "riverbankcms.com"
39743
+ },
39744
+ macadamia: {
39745
+ local: "macadamia.localhost",
39746
+ prod: "macadamia.studio"
39747
+ }
39748
+ };
39749
+ const SURFACE_SITE_ROOT_HOSTS = {
39750
+ core: {
39751
+ local: "localhost",
39752
+ prod: "riverbanksites.com"
39753
+ },
39754
+ macadamia: {
39755
+ local: "macadamia.localhost",
39756
+ prod: "macadamia.studio"
39757
+ }
39758
+ };
39759
+ const SURFACE_SITE_ROOT_HOST_ALIASES = { core: { prod: ["preview.riverbanksites.com"] } };
39760
+ function surfaceHostTableValues(table) {
39761
+ return Object.values(table).flatMap((byTier) => Object.values(byTier).flat());
39762
+ }
39763
+ function siteSlugLabelUnderRoot(host, siteRootHost) {
39764
+ if (!host.endsWith(`.${siteRootHost}`)) return [];
39765
+ return host.slice(0, host.length - siteRootHost.length - 1).split(".").slice(-1);
39766
+ }
39767
+ function deriveSurfaceOwnedSiteSlugs() {
39768
+ const siteRootHosts = [...surfaceHostTableValues(SURFACE_SITE_ROOT_HOSTS), ...surfaceHostTableValues(SURFACE_SITE_ROOT_HOST_ALIASES)];
39769
+ const labels = [...surfaceHostTableValues(SURFACE_ROOT_HOSTS), ...siteRootHosts].flatMap((host) => siteRootHosts.flatMap((root) => siteSlugLabelUnderRoot(host, root)));
39770
+ return [...new Set(labels)].sort();
39771
+ }
39772
+ deriveSurfaceOwnedSiteSlugs();
38848
39773
  [...SURFACE_IDS.filter((surfaceId) => surfaceId !== DEFAULT_SURFACE_ID)];
38849
39774
  //#endregion
38850
39775
  //#region ../api/src/accountApi.ts
@@ -39446,6 +40371,7 @@ function collectText(node) {
39446
40371
  if (node.type === "text") return node.text ?? "";
39447
40372
  return (node.content ?? []).map(collectText).join("");
39448
40373
  }
40374
+ z.enum(["public", "unlisted"], { error: "visibility must be 'public' or 'unlisted'" });
39449
40375
  //#endregion
39450
40376
  //#region ../api/src/bookingPaymentTermSchemas.ts
39451
40377
  const bookingDepositRefundPolicySchema = z.enum(["refundable", "non_refundable"]);