@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
@@ -18,6 +18,64 @@ function defineEndpointDefinitions(definitions) {
18
18
  return definitions;
19
19
  }
20
20
  //#endregion
21
+ //#region ../api/src/apiEndpointTypes.ts
22
+ function allowedDemoMutationPolicy() {
23
+ return {
24
+ classification: "allowed",
25
+ publicMessage: ""
26
+ };
27
+ }
28
+ function blockedDemoMutationPolicy(classification, publicMessage) {
29
+ if (publicMessage.trim() === "") throw new Error(`Demo mutation policy ${classification} requires publicMessage.`);
30
+ return {
31
+ classification,
32
+ publicMessage
33
+ };
34
+ }
35
+ //#endregion
36
+ //#region ../api/src/demoMutationPolicies.ts
37
+ const DEMO_MUTATION_BLOCKED_HIDDEN = blockedDemoMutationPolicy("blocked-hidden", "This action is not available in demo sites.");
38
+ const DEMO_MUTATION_BLOCKED_DISABLED = blockedDemoMutationPolicy("blocked-disabled", "This setting is disabled in demo sites.");
39
+ blockedDemoMutationPolicy("internal-only", "This internal operation is not available in demo sites.");
40
+ const DEMO_MUTATION_ALLOWED = allowedDemoMutationPolicy();
41
+ //#endregion
42
+ //#region ../api/src/siteLifecycleEndpoints.ts
43
+ const SITE_LIFECYCLE_ENDPOINT_DEFINITIONS = defineEndpointDefinitions({
44
+ createSite: {
45
+ path: "/sites/manage",
46
+ method: "POST",
47
+ tags: ["site"],
48
+ auth: "user",
49
+ responseKind: "json",
50
+ errors: []
51
+ },
52
+ createSiteManual: {
53
+ path: "/sites/manual",
54
+ method: "POST",
55
+ tags: ["site"],
56
+ auth: "user",
57
+ responseKind: "json",
58
+ errors: []
59
+ },
60
+ updateSite: {
61
+ path: "/sites/manage",
62
+ method: "PUT",
63
+ tags: ["site"],
64
+ auth: "user",
65
+ responseKind: "json",
66
+ errors: []
67
+ },
68
+ deleteSite: {
69
+ path: "/sites/{siteId}",
70
+ method: "DELETE",
71
+ tags: ["site", "site-{siteId}"],
72
+ auth: "user",
73
+ responseKind: "json",
74
+ errors: [],
75
+ demoMutation: DEMO_MUTATION_BLOCKED_HIDDEN
76
+ }
77
+ });
78
+ //#endregion
21
79
  //#region ../api/src/publicNewsletterEndpointDefinitions.ts
22
80
  const PUBLIC_NEWSLETTER_ENDPOINT_DEFINITIONS = defineEndpointDefinitions({
23
81
  subscribeNewsletter: {
@@ -78,27 +136,6 @@ const PUBLIC_NEWSLETTER_ENDPOINT_DEFINITIONS = defineEndpointDefinitions({
78
136
  }
79
137
  });
80
138
  //#endregion
81
- //#region ../api/src/apiEndpointTypes.ts
82
- function allowedDemoMutationPolicy() {
83
- return {
84
- classification: "allowed",
85
- publicMessage: ""
86
- };
87
- }
88
- function blockedDemoMutationPolicy(classification, publicMessage) {
89
- if (publicMessage.trim() === "") throw new Error(`Demo mutation policy ${classification} requires publicMessage.`);
90
- return {
91
- classification,
92
- publicMessage
93
- };
94
- }
95
- //#endregion
96
- //#region ../api/src/demoMutationPolicies.ts
97
- const DEMO_MUTATION_BLOCKED_HIDDEN = blockedDemoMutationPolicy("blocked-hidden", "This action is not available in demo sites.");
98
- const DEMO_MUTATION_BLOCKED_DISABLED = blockedDemoMutationPolicy("blocked-disabled", "This setting is disabled in demo sites.");
99
- blockedDemoMutationPolicy("internal-only", "This internal operation is not available in demo sites.");
100
- const DEMO_MUTATION_ALLOWED = allowedDemoMutationPolicy();
101
- //#endregion
102
139
  //#region ../api/src/cache-tags.ts
103
140
  /**
104
141
  * Tag templates for endpoint definitions (support `{param}` placeholders).
@@ -958,6 +995,13 @@ const EVENT_SERIES_REGISTRATION_ENDPOINT_DEFINITIONS = defineEndpointDefinitions
958
995
  errors: [],
959
996
  responseKind: "blob"
960
997
  },
998
+ exportEventOfferingRegistrationsCsv: {
999
+ path: "/sites/{siteId}/bookings/event-offerings/{eventOfferingId}/registrations/export.csv",
1000
+ method: "GET",
1001
+ auth: "user",
1002
+ errors: [],
1003
+ responseKind: "blob"
1004
+ },
961
1005
  updateEventSeriesRegistration: {
962
1006
  path: "/sites/{siteId}/bookings/event-series/{seriesId}/registrations/{registrationId}",
963
1007
  method: "PATCH",
@@ -968,6 +1012,19 @@ const EVENT_SERIES_REGISTRATION_ENDPOINT_DEFINITIONS = defineEndpointDefinitions
968
1012
  "resource:not_found",
969
1013
  "server:internal_error"
970
1014
  ]
1015
+ },
1016
+ saveEventSeriesRegistrationAnswers: {
1017
+ path: "/sites/{siteId}/bookings/event-series/{seriesId}/registrations/{registrationId}/answers",
1018
+ method: "PUT",
1019
+ auth: "user",
1020
+ responseKind: "json",
1021
+ errors: [
1022
+ "validation:invalid_input",
1023
+ "auth:forbidden",
1024
+ "resource:not_found",
1025
+ "resource:conflict",
1026
+ "server:internal_error"
1027
+ ]
971
1028
  }
972
1029
  });
973
1030
  //#endregion
@@ -1105,6 +1162,20 @@ const NEWSLETTER_ENDPOINT_DEFINITIONS = defineEndpointDefinitions({
1105
1162
  responseKind: "json",
1106
1163
  errors: ["auth:forbidden", "server:internal_error"]
1107
1164
  },
1165
+ setMailingListBookingOptIn: {
1166
+ path: "/sites/{siteId}/mailing-list/setup/booking-opt-in",
1167
+ method: "PUT",
1168
+ tags: [TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter],
1169
+ auth: "user",
1170
+ responseKind: "json",
1171
+ demoMutation: DEMO_MUTATION_BLOCKED_DISABLED,
1172
+ errors: [
1173
+ "auth:forbidden",
1174
+ "validation:invalid_input",
1175
+ "resource:conflict",
1176
+ "server:internal_error"
1177
+ ]
1178
+ },
1108
1179
  getMailingListAuthoringContext: {
1109
1180
  path: "/sites/{siteId}/mailing-list/authoring-context",
1110
1181
  method: "GET",
@@ -1388,6 +1459,30 @@ const NEWSLETTER_ENDPOINT_DEFINITIONS = defineEndpointDefinitions({
1388
1459
  responseKind: "json",
1389
1460
  demoMutation: DEMO_MUTATION_BLOCKED_HIDDEN
1390
1461
  },
1462
+ scheduleNewsletterCampaign: {
1463
+ path: "/sites/{siteId}/newsletter/campaigns/{campaignId}/schedule",
1464
+ method: "POST",
1465
+ tags: [TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter],
1466
+ auth: "user",
1467
+ responseKind: "json",
1468
+ demoMutation: DEMO_MUTATION_BLOCKED_HIDDEN
1469
+ },
1470
+ unscheduleNewsletterCampaign: {
1471
+ path: "/sites/{siteId}/newsletter/campaigns/{campaignId}/unschedule",
1472
+ method: "POST",
1473
+ tags: [TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter],
1474
+ auth: "user",
1475
+ responseKind: "json",
1476
+ demoMutation: DEMO_MUTATION_BLOCKED_HIDDEN
1477
+ },
1478
+ stopNewsletterCampaign: {
1479
+ path: "/sites/{siteId}/newsletter/campaigns/{campaignId}/stop",
1480
+ method: "POST",
1481
+ tags: [TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter],
1482
+ auth: "user",
1483
+ responseKind: "json",
1484
+ demoMutation: DEMO_MUTATION_BLOCKED_HIDDEN
1485
+ },
1391
1486
  testSendNewsletterCampaign: {
1392
1487
  path: "/sites/{siteId}/newsletter/campaigns/{campaignId}/test-send",
1393
1488
  method: "POST",
@@ -1398,6 +1493,154 @@ const NEWSLETTER_ENDPOINT_DEFINITIONS = defineEndpointDefinitions({
1398
1493
  }
1399
1494
  });
1400
1495
  //#endregion
1496
+ //#region ../api/src/sdkEventEndpointDefinitions.ts
1497
+ /**
1498
+ * The SDK's Event graph: the Events themselves and the occurrences of one run.
1499
+ * Extracted from `endpoints.ts` so this family can be read, and added to, on
1500
+ * its own. New entries here must declare `errors`; the
1501
+ * require-api-endpoint-errors lint enforces that here as in endpoints.ts.
1502
+ */
1503
+ const SDK_EVENT_ENDPOINT_DEFINITIONS = defineEndpointDefinitions({
1504
+ sdkListEvents: {
1505
+ path: "/sdk/{siteId}/events",
1506
+ method: "GET",
1507
+ auth: "service",
1508
+ responseKind: "json"
1509
+ },
1510
+ sdkUpsertEvent: {
1511
+ path: "/sdk/{siteId}/events",
1512
+ method: "POST",
1513
+ auth: "service",
1514
+ responseKind: "json",
1515
+ errors: [
1516
+ "validation:invalid_input",
1517
+ "resource:not_found",
1518
+ "resource:conflict",
1519
+ "billing:plan_limit_exceeded",
1520
+ "server:internal_error"
1521
+ ]
1522
+ },
1523
+ sdkGetEvent: {
1524
+ path: "/sdk/{siteId}/events/{identifier}",
1525
+ method: "GET",
1526
+ auth: "service",
1527
+ responseKind: "json"
1528
+ },
1529
+ sdkDeleteEvent: {
1530
+ path: "/sdk/{siteId}/events/{identifier}",
1531
+ method: "DELETE",
1532
+ auth: "service",
1533
+ responseKind: "json",
1534
+ errors: [
1535
+ "resource:not_found",
1536
+ "resource:conflict",
1537
+ "server:internal_error"
1538
+ ]
1539
+ },
1540
+ sdkTakeEventOffline: {
1541
+ path: "/sdk/{siteId}/events/{identifier}/lifecycle",
1542
+ method: "POST",
1543
+ auth: "service",
1544
+ responseKind: "json",
1545
+ errors: [
1546
+ "resource:not_found",
1547
+ "validation:invalid_input",
1548
+ "resource:conflict",
1549
+ "server:internal_error"
1550
+ ]
1551
+ },
1552
+ sdkListEventOccurrences: {
1553
+ path: "/sdk/{siteId}/events/{identifier}/runs/{runIdentifier}/occurrences",
1554
+ method: "GET",
1555
+ auth: "service",
1556
+ responseKind: "json",
1557
+ errors: [
1558
+ "resource:not_found",
1559
+ "validation:invalid_input",
1560
+ "server:internal_error"
1561
+ ]
1562
+ },
1563
+ sdkAddEventOccurrence: {
1564
+ path: "/sdk/{siteId}/events/{identifier}/runs/{runIdentifier}/occurrences",
1565
+ method: "POST",
1566
+ auth: "service",
1567
+ responseKind: "json",
1568
+ errors: [
1569
+ "resource:not_found",
1570
+ "validation:invalid_input",
1571
+ "resource:conflict",
1572
+ "server:internal_error"
1573
+ ]
1574
+ },
1575
+ sdkUpdateEventOccurrence: {
1576
+ path: "/sdk/{siteId}/events/{identifier}/runs/{runIdentifier}/occurrences/{occurrenceId}",
1577
+ method: "PATCH",
1578
+ auth: "service",
1579
+ responseKind: "json",
1580
+ errors: [
1581
+ "resource:not_found",
1582
+ "validation:invalid_input",
1583
+ "resource:conflict",
1584
+ "server:internal_error"
1585
+ ]
1586
+ },
1587
+ sdkCancelEventOccurrence: {
1588
+ path: "/sdk/{siteId}/events/{identifier}/runs/{runIdentifier}/occurrences/{occurrenceId}/cancel",
1589
+ method: "POST",
1590
+ auth: "service",
1591
+ responseKind: "json",
1592
+ errors: [
1593
+ "resource:not_found",
1594
+ "resource:conflict",
1595
+ "server:internal_error"
1596
+ ]
1597
+ },
1598
+ sdkDeleteEventOccurrence: {
1599
+ path: "/sdk/{siteId}/events/{identifier}/runs/{runIdentifier}/occurrences/{occurrenceId}",
1600
+ method: "DELETE",
1601
+ auth: "service",
1602
+ responseKind: "json",
1603
+ errors: [
1604
+ "resource:not_found",
1605
+ "resource:conflict",
1606
+ "server:internal_error"
1607
+ ]
1608
+ }
1609
+ });
1610
+ //#endregion
1611
+ //#region ../api/src/sdkPageDesignEndpointDefinitions.ts
1612
+ /**
1613
+ * SDK management endpoints for a page's draft design (issue 1497), spread into
1614
+ * `ENDPOINT_DEFINITIONS` like the other endpoint-definition modules. New
1615
+ * entries here must declare `errors`, which the require-api-endpoint-errors
1616
+ * lint enforces.
1617
+ */
1618
+ const SDK_PAGE_DESIGN_ENDPOINT_DEFINITIONS = defineEndpointDefinitions({
1619
+ sdkGetPageDesign: {
1620
+ path: "/sdk/{siteId}/pages/{identifier}/design",
1621
+ method: "GET",
1622
+ auth: "service",
1623
+ responseKind: "json",
1624
+ errors: [
1625
+ "resource:not_found",
1626
+ "validation:invalid_input",
1627
+ "server:internal_error"
1628
+ ]
1629
+ },
1630
+ sdkSavePageDesign: {
1631
+ path: "/sdk/{siteId}/pages/{identifier}/design",
1632
+ method: "POST",
1633
+ auth: "service",
1634
+ responseKind: "json",
1635
+ errors: [
1636
+ "resource:not_found",
1637
+ "validation:invalid_input",
1638
+ "resource:conflict",
1639
+ "server:internal_error"
1640
+ ]
1641
+ }
1642
+ });
1643
+ //#endregion
1401
1644
  //#region ../core/src/result.ts
1402
1645
  function ok(value) {
1403
1646
  return {
@@ -2058,17 +2301,35 @@ function parseMailingListRuntimeContext(value) {
2058
2301
  if (!isRecord$8(value)) return invalidRuntimeContext();
2059
2302
  if (value.tag === "not_configured") return ok({ tag: "not_configured" });
2060
2303
  if (value.tag !== "configured") return invalidRuntimeContext();
2304
+ return parseConfiguredRuntimeContext(value);
2305
+ }
2306
+ function parseConfiguredRuntimeContext(value) {
2061
2307
  const revision = parseMailingListSetupRevision(value.revision);
2062
2308
  const form = parseMailingListGlobalForm(value.form);
2063
2309
  const provider = parseRuntimeProvider(value.provider);
2064
- if (revision === null || !form.ok || provider === null) return invalidRuntimeContext();
2310
+ const bookingSignup = parseBookingSignupOffer(value.bookingSignup);
2311
+ if (revision === null || !form.ok || provider === null || bookingSignup === null) return invalidRuntimeContext();
2065
2312
  return ok({
2066
2313
  tag: "configured",
2067
2314
  revision,
2315
+ bookingSignup,
2068
2316
  form: form.value,
2069
2317
  provider
2070
2318
  });
2071
2319
  }
2320
+ function parseBookingSignupOffer(value) {
2321
+ if (value === void 0) return {
2322
+ tag: "unavailable",
2323
+ reason: "disabled"
2324
+ };
2325
+ if (!isRecord$8(value)) return null;
2326
+ if (value.tag === "offered") return { tag: "offered" };
2327
+ if (value.tag === "unavailable" && (value.reason === "disabled" || value.reason === "fields" || value.reason === "destination")) return {
2328
+ tag: "unavailable",
2329
+ reason: value.reason
2330
+ };
2331
+ return null;
2332
+ }
2072
2333
  function parseRuntimeProvider(value) {
2073
2334
  if (!isRecord$8(value)) return null;
2074
2335
  switch (value.provider) {
@@ -2295,15 +2556,6 @@ function parseMailingListContentVersionId(value) {
2295
2556
  const parsed = parseContentVersionId(value);
2296
2557
  return parsed.ok ? parsed.value : null;
2297
2558
  }
2298
- function buildMailingListSignupBlockSourceRef(blockId, contentVersionId) {
2299
- const parsedBlockId = parseMailingListBlockId(blockId);
2300
- const parsedContentVersionId = parseMailingListContentVersionId(contentVersionId);
2301
- return parsedBlockId !== null && parsedContentVersionId !== null ? {
2302
- tag: "block_ref",
2303
- blockId: parsedBlockId,
2304
- contentVersionId: parsedContentVersionId
2305
- } : null;
2306
- }
2307
2559
  //#endregion
2308
2560
  //#region ../core/src/secret.ts
2309
2561
  /**
@@ -2952,6 +3204,45 @@ const SITE_API_KEY_ENDPOINT_DEFINITIONS = defineEndpointDefinitions({
2952
3204
  }
2953
3205
  });
2954
3206
  //#endregion
3207
+ //#region ../api/src/siteManagementEndpointDefinitions.ts
3208
+ const SITE_MANAGEMENT_ENDPOINT_DEFINITIONS = defineEndpointDefinitions({
3209
+ createSite: {
3210
+ path: "/sites/manage",
3211
+ method: "POST",
3212
+ tags: ["site"],
3213
+ auth: "user",
3214
+ responseKind: "json"
3215
+ },
3216
+ updateSite: {
3217
+ path: "/sites/manage",
3218
+ method: "PUT",
3219
+ tags: ["site"],
3220
+ auth: "user",
3221
+ responseKind: "json"
3222
+ },
3223
+ changeSiteAddress: {
3224
+ path: "/sites/{siteId}/address",
3225
+ method: "PUT",
3226
+ auth: "user",
3227
+ responseKind: "json",
3228
+ demoMutation: DEMO_MUTATION_BLOCKED_DISABLED
3229
+ },
3230
+ getSiteAddressAvailability: {
3231
+ path: "/sites/{siteId}/address/availability",
3232
+ method: "GET",
3233
+ auth: "user",
3234
+ responseKind: "json"
3235
+ },
3236
+ deleteSite: {
3237
+ path: "/sites/{siteId}",
3238
+ method: "DELETE",
3239
+ tags: ["site", "site-{siteId}"],
3240
+ auth: "user",
3241
+ responseKind: "json",
3242
+ demoMutation: DEMO_MUTATION_BLOCKED_HIDDEN
3243
+ }
3244
+ });
3245
+ //#endregion
2955
3246
  //#region ../api/src/eventManagementEndpointDefinitions.ts
2956
3247
  const EVENT_MANAGEMENT_ENDPOINT_DEFINITIONS = defineEndpointDefinitions({
2957
3248
  listEvents: {
@@ -2999,6 +3290,28 @@ const EVENT_MANAGEMENT_ENDPOINT_DEFINITIONS = defineEndpointDefinitions({
2999
3290
  "server:internal_error"
3000
3291
  ]
3001
3292
  },
3293
+ /**
3294
+ * The web address of an event's own page. A course page belongs to the
3295
+ * event itself, so its address is written here rather than through a run.
3296
+ */
3297
+ updateEventAddress: {
3298
+ path: "/sites/{siteId}/bookings/events/{eventId}/address",
3299
+ method: "PATCH",
3300
+ tags: [
3301
+ "site-{siteId}",
3302
+ "event-series-{siteId}",
3303
+ TAG_TEMPLATES.siteRoutableContent,
3304
+ TAG_TEMPLATES.siteRedirects
3305
+ ],
3306
+ auth: "user",
3307
+ responseKind: "json",
3308
+ errors: [
3309
+ "validation:invalid_input",
3310
+ "resource:not_found",
3311
+ "resource:conflict",
3312
+ "server:internal_error"
3313
+ ]
3314
+ },
3002
3315
  createWholeSeriesRun: {
3003
3316
  path: "/sites/{siteId}/bookings/events/{eventId}/runs",
3004
3317
  method: "POST",
@@ -3025,6 +3338,20 @@ const EVENT_MANAGEMENT_ENDPOINT_DEFINITIONS = defineEndpointDefinitions({
3025
3338
  "server:internal_error"
3026
3339
  ]
3027
3340
  },
3341
+ updateCourseBookingSettings: {
3342
+ path: "/sites/{siteId}/bookings/events/{eventId}/booking-settings",
3343
+ method: "PATCH",
3344
+ tags: ["site-{siteId}", "event-series-{siteId}"],
3345
+ auth: "user",
3346
+ responseKind: "json",
3347
+ errors: [
3348
+ "validation:invalid_input",
3349
+ "auth:forbidden",
3350
+ "resource:not_found",
3351
+ "resource:conflict",
3352
+ "server:internal_error"
3353
+ ]
3354
+ },
3028
3355
  cancelWholeSeriesRun: {
3029
3356
  path: "/sites/{siteId}/bookings/events/{eventId}/runs/{runId}/cancellation",
3030
3357
  method: "POST",
@@ -3037,6 +3364,28 @@ const EVENT_MANAGEMENT_ENDPOINT_DEFINITIONS = defineEndpointDefinitions({
3037
3364
  "resource:conflict",
3038
3365
  "server:internal_error"
3039
3366
  ]
3367
+ },
3368
+ /**
3369
+ * The Content tab's one write: the short introduction, image and
3370
+ * description of an event's page, published without its layout.
3371
+ */
3372
+ saveEventPageWords: {
3373
+ path: "/sites/{siteId}/page-surfaces/{pageSurfaceId}/words",
3374
+ method: "PUT",
3375
+ tags: [
3376
+ TAG_TEMPLATES.siteCollection,
3377
+ TAG_TEMPLATES.siteRoutableContent,
3378
+ TAG_TEMPLATES.pageSurfaceById
3379
+ ],
3380
+ auth: "user",
3381
+ responseKind: "json",
3382
+ errors: [
3383
+ "auth:forbidden",
3384
+ "validation:invalid_input",
3385
+ "resource:not_found",
3386
+ "resource:conflict",
3387
+ "server:internal_error"
3388
+ ]
3040
3389
  }
3041
3390
  });
3042
3391
  //#endregion
@@ -3469,19 +3818,105 @@ const BILLING_ENDPOINT_DEFINITIONS = defineEndpointDefinitions({
3469
3818
  responseKind: "json"
3470
3819
  }
3471
3820
  });
3821
+ //#endregion
3822
+ //#region ../api/src/bookingPeopleEndpointDefinitions.ts
3823
+ /**
3824
+ * People endpoints (#1356): the People list, its CSV export, and deleting a
3825
+ * person when nothing is attached to them.
3826
+ */
3827
+ const BOOKING_PEOPLE_ENDPOINT_DEFINITIONS = defineEndpointDefinitions({
3828
+ listPeople: {
3829
+ path: "/sites/{siteId}/bookings/people",
3830
+ method: "GET",
3831
+ tags: ["site-{siteId}", "customers-{siteId}"],
3832
+ auth: "user",
3833
+ responseKind: "json",
3834
+ errors: ["server:internal_error"]
3835
+ },
3836
+ exportPeopleCsv: {
3837
+ path: "/sites/{siteId}/bookings/people/export.csv",
3838
+ method: "GET",
3839
+ tags: ["site-{siteId}", "customers-{siteId}"],
3840
+ auth: "user",
3841
+ errors: [],
3842
+ responseKind: "blob"
3843
+ },
3844
+ checkPersonDeletion: {
3845
+ path: "/sites/{siteId}/bookings/people/{personId}/deletion-check",
3846
+ method: "GET",
3847
+ tags: ["site-{siteId}", "customers-{siteId}"],
3848
+ auth: "user",
3849
+ responseKind: "json",
3850
+ errors: [
3851
+ "auth:forbidden",
3852
+ "resource:not_found",
3853
+ "server:internal_error"
3854
+ ]
3855
+ },
3856
+ deletePerson: {
3857
+ path: "/sites/{siteId}/bookings/people/{personId}",
3858
+ method: "DELETE",
3859
+ tags: ["site-{siteId}", "customers-{siteId}"],
3860
+ auth: "user",
3861
+ responseKind: "json",
3862
+ errors: [
3863
+ "auth:forbidden",
3864
+ "resource:not_found",
3865
+ "server:internal_error"
3866
+ ]
3867
+ }
3868
+ });
3869
+ //#endregion
3870
+ //#region ../api/src/clientErrorReporting.ts
3871
+ const CLIENT_ERROR_REPORT_ENDPOINT_DEFINITIONS = defineEndpointDefinitions({ reportClientError: {
3872
+ path: "/client/error-report",
3873
+ method: "POST",
3874
+ auth: "user",
3875
+ errors: [],
3876
+ responseKind: "json"
3877
+ } });
3878
+ const CLIENT_ERROR_REPORT_LIMITS = {
3879
+ pathname: 1024,
3880
+ name: 120,
3881
+ message: 2e3,
3882
+ stack: 8e3,
3883
+ digest: 128,
3884
+ componentStack: 8e3,
3885
+ sourceLocation: 1024
3886
+ };
3887
+ const clientErrorEventSchema = z.enum([
3888
+ "dashboard:route-error",
3889
+ "dashboard:app-error",
3890
+ "client:error-boundary",
3891
+ "client:window-error",
3892
+ "client:unhandled-rejection"
3893
+ ]);
3894
+ z.object({
3895
+ event: clientErrorEventSchema,
3896
+ pathname: z.string().startsWith("/").max(CLIENT_ERROR_REPORT_LIMITS.pathname),
3897
+ name: z.string().max(CLIENT_ERROR_REPORT_LIMITS.name),
3898
+ message: z.string().max(CLIENT_ERROR_REPORT_LIMITS.message),
3899
+ stack: z.string().max(CLIENT_ERROR_REPORT_LIMITS.stack).nullable(),
3900
+ digest: z.string().max(CLIENT_ERROR_REPORT_LIMITS.digest).nullable(),
3901
+ componentStack: z.string().max(CLIENT_ERROR_REPORT_LIMITS.componentStack).nullable(),
3902
+ sourceLocation: z.string().max(CLIENT_ERROR_REPORT_LIMITS.sourceLocation).nullable()
3903
+ }).strict();
3472
3904
  ({
3905
+ ...SITE_LIFECYCLE_ENDPOINT_DEFINITIONS,
3906
+ ...CLIENT_ERROR_REPORT_ENDPOINT_DEFINITIONS,
3473
3907
  ...PUBLIC_NEWSLETTER_ENDPOINT_DEFINITIONS,
3474
3908
  ...ACCOUNT_ENDPOINT_DEFINITIONS,
3475
3909
  ...PUBLIC_ONBOARDING_ATTEMPT_ENDPOINT_DEFINITIONS,
3476
3910
  ...PUBLIC_EVENT_ENDPOINT_DEFINITIONS,
3477
3911
  ...GIFTING_ENDPOINT_DEFINITIONS,
3478
3912
  ...PUBLIC_READ_ENDPOINT_DEFINITIONS,
3479
- ...BILLING_ENDPOINT_DEFINITIONS
3913
+ ...BILLING_ENDPOINT_DEFINITIONS,
3914
+ ...SITE_MANAGEMENT_ENDPOINT_DEFINITIONS
3480
3915
  }), 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, {
3481
3916
  ...NEWSLETTER_ENDPOINT_DEFINITIONS,
3482
3917
  ...APPOINTMENT_ENDPOINT_DEFINITIONS,
3483
3918
  ...EVENT_SERIES_REGISTRATION_ENDPOINT_DEFINITIONS
3484
- }, 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 };
3919
+ }, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteById, TAG_TEMPLATES.siteBySlug, TAG_TEMPLATES.siteByDomain, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteById, TAG_TEMPLATES.siteBySlug, TAG_TEMPLATES.siteByDomain, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.pageSurfaceById, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.pageSurfaceById, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.pageSurfaceById, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.pageSurfaceById, TAG_TEMPLATES.workflowRunById, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.routeById, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.site, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.site, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteNavigation, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteNavigation, TAG_TEMPLATES.navigationMenuById, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteNavigation, TAG_TEMPLATES.navigationMenuById, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteNavigation, TAG_TEMPLATES.navigationMenuById, TAG_TEMPLATES.navigationItemById, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteNavigation, TAG_TEMPLATES.navigationMenuById, TAG_TEMPLATES.navigationItemById, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteNavigation, TAG_TEMPLATES.navigationMenuById, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.siteSettings, TAG_TEMPLATES.publicEvents, TAG_TEMPLATES.publicBookingServices, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteTheme, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteTheme, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.siteTheme, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.pageSurfaceById, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.pageSurfaceById, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.pageSurfaceById, TAG_TEMPLATES.siteCollection, TAG_TEMPLATES.pageSurfaceById, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.pageById, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.pageById, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.pageById, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.pageById, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.pageById, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.pageById, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.pageById, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.pageById, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.pageById, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.siteRedirects, TAG_TEMPLATES.siteRouteOutcomes, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.siteRedirects, TAG_TEMPLATES.siteRouteOutcomes, TAG_TEMPLATES.siteRoutableContent, TAG_TEMPLATES.siteForms, TAG_TEMPLATES.siteForms, TAG_TEMPLATES.siteForms, TAG_TEMPLATES.siteForms, TAG_TEMPLATES.siteForms, TAG_TEMPLATES.siteForms, TAG_TEMPLATES.formSubmissionsBySlug, TAG_TEMPLATES.siteForms, TAG_TEMPLATES.formSubmissionsBySlug, TAG_TEMPLATES.siteForms, TAG_TEMPLATES.formSubmissionsBySlug, TAG_TEMPLATES.siteForms, { ...PUBLIC_BOOKING_AVAILABILITY_ENDPOINT_DEFINITIONS }, TAG_TEMPLATES.publicEventFilters, TAG_TEMPLATES.publicEvents, TAG_TEMPLATES.publicShop, TAG_TEMPLATES.publicCheckout, TAG_TEMPLATES.siteRoutableContent, { ...PUBLIC_EVENT_CHECKOUT_ENDPOINT_DEFINITIONS }, TAG_TEMPLATES.publicEvents, TAG_TEMPLATES.publicEvents, { ...EVENT_MANAGEMENT_ENDPOINT_DEFINITIONS }, { ...BOOKING_PEOPLE_ENDPOINT_DEFINITIONS }, { ...SDK_MEDIA_ENDPOINT_DEFINITIONS }, { ...SDK_ENDPOINT_DEFINITIONS }, { ...SDK_PAGE_DESIGN_ENDPOINT_DEFINITIONS }, { ...SDK_EVENT_ENDPOINT_DEFINITIONS }, { ...SDK_ENTRY_READ_ENDPOINTS };
3485
3920
  z.object({ refreshToken: z.string().min(1).max(4096) }).strict();
3486
3921
  z.object({
3487
3922
  accessToken: z.string().min(1).max(4096),
@@ -5982,13 +6417,16 @@ const SURFACE_FOREGROUND_CSS_VARS = {
5982
6417
  text: "--rb-surface-text-color",
5983
6418
  heading: "--rb-surface-heading-color",
5984
6419
  link: "--rb-surface-link-color",
6420
+ linkHover: "--rb-surface-link-hover-color",
5985
6421
  supporting: "--rb-surface-supporting-color"
5986
6422
  };
5987
6423
  const DEFAULT_SURFACE_TEXT_COLOR = "rgb(var(--tb-text, 17 24 39))";
6424
+ const DEFAULT_SURFACE_LINK_COLOR = "rgb(var(--tb-primary, var(--tb-text, 17 24 39)))";
5988
6425
  const DEFAULT_ROLE_FALLBACKS = {
5989
6426
  text: DEFAULT_SURFACE_TEXT_COLOR,
5990
6427
  heading: DEFAULT_SURFACE_TEXT_COLOR,
5991
- link: "rgb(var(--tb-primary, var(--tb-text, 17 24 39)))",
6428
+ link: DEFAULT_SURFACE_LINK_COLOR,
6429
+ linkHover: DEFAULT_SURFACE_LINK_COLOR,
5992
6430
  supporting: "rgb(var(--tb-mutedText, 100 116 139))"
5993
6431
  };
5994
6432
  function requireSurfaceColorValue(role, value) {
@@ -5998,10 +6436,12 @@ function requireSurfaceColorValue(role, value) {
5998
6436
  }
5999
6437
  function completeSurfaceForegrounds(input) {
6000
6438
  const text = requireSurfaceColorValue("text", input.text);
6439
+ const link = input.link === void 0 ? text : requireSurfaceColorValue("link", input.link);
6001
6440
  return {
6002
6441
  text,
6003
6442
  heading: input.heading === void 0 ? text : requireSurfaceColorValue("heading", input.heading),
6004
- link: input.link === void 0 ? text : requireSurfaceColorValue("link", input.link),
6443
+ link,
6444
+ linkHover: input.linkHover === void 0 ? link : requireSurfaceColorValue("linkHover", input.linkHover),
6005
6445
  supporting: input.supporting === void 0 ? text : requireSurfaceColorValue("supporting", input.supporting)
6006
6446
  };
6007
6447
  }
@@ -6009,6 +6449,7 @@ function surfaceForegroundValue(role, outsideProviderFallback = DEFAULT_ROLE_FAL
6009
6449
  const roleVariable = SURFACE_FOREGROUND_CSS_VARS[role];
6010
6450
  const fallback = requireSurfaceColorValue("fallback", outsideProviderFallback);
6011
6451
  if (role === "text") return `var(${roleVariable}, ${fallback})`;
6452
+ if (role === "linkHover") return `var(${roleVariable}, ${surfaceForegroundValue("link", fallback)})`;
6012
6453
  return `var(${roleVariable}, var(${SURFACE_FOREGROUND_CSS_VARS.text}, ${fallback}))`;
6013
6454
  }
6014
6455
  function surfaceForegroundValueWithOpacity(role, opacityPercent) {
@@ -6022,9 +6463,25 @@ function surfaceForegroundStyle(input) {
6022
6463
  [SURFACE_FOREGROUND_CSS_VARS.text]: foregrounds.text,
6023
6464
  [SURFACE_FOREGROUND_CSS_VARS.heading]: foregrounds.heading,
6024
6465
  [SURFACE_FOREGROUND_CSS_VARS.link]: foregrounds.link,
6025
- [SURFACE_FOREGROUND_CSS_VARS.supporting]: foregrounds.supporting
6466
+ [SURFACE_FOREGROUND_CSS_VARS.linkHover]: foregrounds.linkHover,
6467
+ [SURFACE_FOREGROUND_CSS_VARS.supporting]: foregrounds.supporting,
6468
+ "--rb-surface-link-hover-decoration": hoverDecoration(input)
6026
6469
  };
6027
6470
  }
6471
+ function surfaceForegroundInputFromResolved(foreground, color) {
6472
+ const { roles } = foreground;
6473
+ return {
6474
+ text: color(roles.text),
6475
+ heading: color(roles.heading),
6476
+ link: color(roles.link),
6477
+ linkHover: color(roles.linkHover),
6478
+ supporting: color(roles.supporting),
6479
+ hoverDecoration: foreground.hoverDecoration
6480
+ };
6481
+ }
6482
+ function hoverDecoration(input) {
6483
+ return input.hoverDecoration ?? "underline";
6484
+ }
6028
6485
  //#endregion
6029
6486
  //#region ../theme-core/src/buttons/constants.ts
6030
6487
  /**
@@ -6779,6 +7236,64 @@ function parseAlpha(source) {
6779
7236
  function isRgbChannel(value) {
6780
7237
  return Number.isFinite(value) && value >= 0 && value <= 255;
6781
7238
  }
7239
+ /**
7240
+ * Derive the hover foreground that belongs with a resolved resting foreground.
7241
+ *
7242
+ * A resting foreground is chosen to be legible against a known surface. A hover
7243
+ * state derived from it stays within a bounded distance of that colour, so it
7244
+ * inherits most of the resting colour's contrast margin instead of asserting
7245
+ * an unrelated brand colour that no one checked against the surface.
7246
+ *
7247
+ * That bounded-distance property is what lets this be used on a transparent
7248
+ * overlay header, where the backdrop is only partly knowable: the scrolled
7249
+ * state composites a 60% glass tint over arbitrary page content, so no
7250
+ * compile-time contrast proof is available there. Staying near a colour that
7251
+ * is already trusted in both states is a weaker claim than a contrast proof,
7252
+ * and it is one this function can actually keep.
7253
+ *
7254
+ * Returns `null` when the resting token is not a plain palette token — an
7255
+ * already-faded or raw value has no well-defined softening, and the caller
7256
+ * should leave hover alone rather than guess.
7257
+ */
7258
+ function deriveForegroundHoverToken(restingToken) {
7259
+ const parts = parseColorTokenParts(restingToken);
7260
+ if (parts.kind !== "token") return null;
7261
+ if (parts.opacityPercent !== null) return null;
7262
+ return parseThemeColorToken(`${parts.token}/85`);
7263
+ }
7264
+ /**
7265
+ * Prefer an authored hover that survives every measured backdrop, then a
7266
+ * checked softening of the resting colour. A null backdrop set represents a
7267
+ * trusted treatment: only an explicit authored hover may change the colour.
7268
+ * When neither option works, retain the resting colour and underline it.
7269
+ */
7270
+ function planForegroundHover(input) {
7271
+ const { restingToken, candidate, palette, backdrops } = input;
7272
+ if (candidate && candidate !== restingToken) {
7273
+ if (backdrops === null || survivesEveryBackdrop(candidate, palette, backdrops)) return {
7274
+ kind: "candidate",
7275
+ token: candidate,
7276
+ decoration: "initial"
7277
+ };
7278
+ }
7279
+ const softened = deriveForegroundHoverToken(restingToken);
7280
+ if (softened && backdrops && survivesEveryBackdrop(softened, palette, backdrops)) return {
7281
+ kind: "softened",
7282
+ token: softened,
7283
+ decoration: "initial"
7284
+ };
7285
+ return {
7286
+ kind: "resting",
7287
+ token: restingToken,
7288
+ decoration: "underline"
7289
+ };
7290
+ }
7291
+ function survivesEveryBackdrop(token, palette, backdrops) {
7292
+ return backdrops.length > 0 && backdrops.every((backdrop) => {
7293
+ const foreground = resolveOpaqueSurfaceHex(token, palette, backdrop);
7294
+ return foreground !== null && contrastRatio(foreground, backdrop) >= 4.5;
7295
+ });
7296
+ }
6782
7297
  //#endregion
6783
7298
  //#region ../theme-core/src/surfaces/resolveSurfaceForeground.ts
6784
7299
  const FALLBACK_TEXT_TOKENS = [
@@ -6825,12 +7340,16 @@ function resolveSurfaceForeground(background, palette, candidates = {}, options
6825
7340
  }
6826
7341
  function foregroundCandidates(background, overrides) {
6827
7342
  return {
6828
- text: overrides.text ?? background?.textColor ?? null,
6829
- heading: overrides.heading ?? background?.headingColor ?? null,
6830
- link: overrides.link ?? background?.linkColor ?? null,
6831
- supporting: overrides.supporting ?? background?.supportingColor ?? null
7343
+ text: candidateOrBackground(overrides.text, background?.textColor),
7344
+ heading: candidateOrBackground(overrides.heading, background?.headingColor),
7345
+ link: candidateOrBackground(overrides.link, background?.linkColor),
7346
+ linkHover: candidateOrBackground(overrides.linkHover),
7347
+ supporting: candidateOrBackground(overrides.supporting, background?.supportingColor)
6832
7348
  };
6833
7349
  }
7350
+ function candidateOrBackground(candidate, backgroundValue) {
7351
+ return candidate ?? backgroundValue ?? null;
7352
+ }
6834
7353
  function resolveDeterministicForeground(backgroundReference, candidates, palette, compositeBase) {
6835
7354
  const backgroundHex = resolveOpaqueSurfaceHex(backgroundReference, palette, compositeBase);
6836
7355
  if (!backgroundHex) return resolveTrustedTreatmentForeground(candidates, palette);
@@ -6842,29 +7361,51 @@ function resolveDeterministicForeground(backgroundReference, candidates, palette
6842
7361
  ...FALLBACK_TEXT_TOKENS
6843
7362
  ], backgroundHex, palette, derivedOnToken ? [derivedOnToken] : []);
6844
7363
  if (!text) return { kind: "unknown" };
6845
- return {
6846
- kind: "known",
6847
- roles: {
6848
- text,
6849
- heading: safeTokenOr(candidates.heading, text, backgroundHex, palette),
6850
- link: safeTokenOr(candidates.link, text, backgroundHex, palette),
6851
- supporting: safeTokenOr(candidates.supporting, text, backgroundHex, palette)
6852
- }
6853
- };
7364
+ return knownForeground({
7365
+ text,
7366
+ heading: safeTokenOr(candidates.heading, text, backgroundHex, palette),
7367
+ link: safeTokenOr(candidates.link, text, backgroundHex, palette),
7368
+ supporting: safeTokenOr(candidates.supporting, text, backgroundHex, palette)
7369
+ }, {
7370
+ kind: "measured",
7371
+ backdropHex: backgroundHex
7372
+ }, candidates.linkHover, palette);
6854
7373
  }
6855
7374
  function resolveTrustedTreatmentForeground(candidates, palette) {
6856
7375
  const text = canonicalToken(candidates.text, palette);
6857
7376
  if (!text) return { kind: "unknown" };
7377
+ return knownForeground({
7378
+ text,
7379
+ heading: canonicalToken(candidates.heading, palette) ?? text,
7380
+ link: canonicalToken(candidates.link, palette) ?? text,
7381
+ supporting: canonicalToken(candidates.supporting, palette) ?? text
7382
+ }, { kind: "trusted-treatment" }, candidates.linkHover, palette);
7383
+ }
7384
+ function knownForeground(roles, provenance, hoverCandidate, palette) {
7385
+ const hover = planForegroundHover({
7386
+ restingToken: roles.link,
7387
+ candidate: canonicalHoverToken(hoverCandidate, palette),
7388
+ palette,
7389
+ backdrops: provenance.kind === "measured" ? [provenance.backdropHex] : null
7390
+ });
6858
7391
  return {
6859
7392
  kind: "known",
7393
+ provenance,
6860
7394
  roles: {
6861
- text,
6862
- heading: canonicalToken(candidates.heading, palette) ?? text,
6863
- link: canonicalToken(candidates.link, palette) ?? text,
6864
- supporting: canonicalToken(candidates.supporting, palette) ?? text
6865
- }
7395
+ ...roles,
7396
+ linkHover: hover.token
7397
+ },
7398
+ hoverDecoration: hover.decoration
6866
7399
  };
6867
7400
  }
7401
+ function canonicalHoverToken(reference, palette) {
7402
+ const token = parseThemeColorToken(reference);
7403
+ if (token) {
7404
+ const parts = parseColorTokenParts(token);
7405
+ if (parts.kind === "token" && resolveConcreteColorHex(parts.token, palette)) return token;
7406
+ }
7407
+ return canonicalToken(reference, palette);
7408
+ }
6868
7409
  function safeTokenOr(candidate, fallback, backgroundHex, palette) {
6869
7410
  return firstSafeToken([candidate], backgroundHex, palette) ?? fallback;
6870
7411
  }
@@ -9804,6 +10345,43 @@ const effectCompositionSchema = z.object({
9804
10345
  /** Effects applied on focus */
9805
10346
  focus: z.array(effectApplicationSchema).optional()
9806
10347
  });
10348
+ const policiesById = {
10349
+ "darken-background": "other",
10350
+ "lighten-background": "other",
10351
+ "fade-background": "other",
10352
+ "opacity-reduce": "other",
10353
+ "animated-gradient": "other",
10354
+ "background-on-hover": "paired-hover",
10355
+ "background-on-hover-alpha": "paired-hover",
10356
+ "border-glow": "other",
10357
+ "drop-shadow": "other",
10358
+ "inner-shadow": "other",
10359
+ "neumorphic-shadow": "other",
10360
+ "outer-glow": "other",
10361
+ "retro-3d-shadow": "other",
10362
+ "scale-up": "other",
10363
+ "scale-down": "other",
10364
+ lift: "other",
10365
+ "press-down": "other",
10366
+ pop: "other",
10367
+ "aurora-glow": "other",
10368
+ "cosmic-stardust": "other",
10369
+ "gradient-border-fill": "other",
10370
+ "animated-gradient-border-fill": "other",
10371
+ "border-bottom-grow": "other",
10372
+ "gradient-text": "other",
10373
+ "text-color-change": "text-colour",
10374
+ "border-color-change": "other",
10375
+ "sketchy-border": "other",
10376
+ "pulse-animation": "other",
10377
+ "nav-underline": "underline",
10378
+ "nav-frosted-base": "other",
10379
+ "nav-frosted-hover": "other",
10380
+ "nav-frosted-active": "other"
10381
+ };
10382
+ function navEffectPolicy(effectId) {
10383
+ return policiesById[effectId] ?? null;
10384
+ }
9807
10385
  //#endregion
9808
10386
  //#region ../theme-core/src/navigation/types.ts
9809
10387
  /**
@@ -9892,6 +10470,16 @@ const navLinkStyleSchema = z.object({
9892
10470
  /** Composable effects */
9893
10471
  effects: effectCompositionSchema.optional()
9894
10472
  });
10473
+ function navLinkHoverColorCandidate(style) {
10474
+ const effect = style?.effects?.hover?.find((item) => navEffectPolicy(item.effectId) === "text-colour");
10475
+ return parseThemeColorToken(effect?.options?.hoverColorToken ?? style?.hoverColorToken);
10476
+ }
10477
+ function navLinkOwnsHoverForeground(style) {
10478
+ return style?.effects?.hover?.some((effect) => navEffectPolicy(effect.effectId) === "paired-hover") ?? false;
10479
+ }
10480
+ function navLinkOwnsUnderline(style) {
10481
+ return style?.effects?.hover?.some((effect) => navEffectPolicy(effect.effectId) === "underline") ?? false;
10482
+ }
9895
10483
  //#endregion
9896
10484
  //#region ../theme-core/src/customCss/validation.ts
9897
10485
  /**
@@ -16080,6 +16668,14 @@ const blockDesignFallback = {
16080
16668
  };
16081
16669
  blockDesignFallback.sectionSurface, blockDesignFallback.contentFrame, blockDesignFallback.sectionHeight, blockDesignFallback.heroLegibility, blockDesignFallback.imageSurfaceTreatment, blockDesignFallback.imageSurfaceMotion, blockDesignFallback.tileTreatment, blockDesignFallback.eventListTreatment, blockDesignFallback.eyebrowTreatment, blockDesignFallback.accordionIconTreatment, blockDesignFallback.composition;
16082
16670
  //#endregion
16671
+ //#region ../theme-core/src/header/rootPaint.ts
16672
+ /** The nav container takes precedence when a floating header also has one. */
16673
+ function headerRootPaint(header) {
16674
+ const navContainerType = header?.navContainer?.type ?? "none";
16675
+ if (navContainerType === "glass" || navContainerType === "pill") return "contained-nav";
16676
+ return header?.variant === "floating" ? "overlay" : "own-surface";
16677
+ }
16678
+ //#endregion
16083
16679
  //#region ../theme-core/src/site-styles/siteChromeBackgrounds.ts
16084
16680
  const siteChromeBackgroundColorTokens = toSiteChromeBackgroundColorTokens(backgroundAppearanceColorTokenNames);
16085
16681
  const quickSiteChromeBackgroundColorTokens = toSiteChromeBackgroundColorTokens(backgroundAppearanceQuickColorTokenNames);
@@ -16259,6 +16855,259 @@ z.object(headerPreferencesShape).omit({
16259
16855
  structure: true
16260
16856
  }).strict();
16261
16857
  //#endregion
16858
+ //#region ../theme-core/src/navigation/presets.ts
16859
+ /**
16860
+ * Built-in nav link style presets
16861
+ *
16862
+ * Each preset uses composable effects to achieve its look.
16863
+ */
16864
+ const NAV_LINK_PRESETS = {
16865
+ /**
16866
+ * Minimal - subtle color change on hover
16867
+ */
16868
+ minimal: {
16869
+ name: "Minimal",
16870
+ typography: "body",
16871
+ fontWeight: "medium",
16872
+ textTransform: "none",
16873
+ italic: false,
16874
+ colorToken: "text",
16875
+ hoverColorToken: "primary",
16876
+ padding: "none",
16877
+ borderRadius: "none",
16878
+ effects: { hover: [{
16879
+ effectId: "text-color-change",
16880
+ options: { hoverColorToken: "primary" }
16881
+ }] }
16882
+ },
16883
+ /**
16884
+ * Underline - static underline appears on hover
16885
+ */
16886
+ underline: {
16887
+ name: "Underline",
16888
+ typography: "body",
16889
+ fontWeight: "medium",
16890
+ textTransform: "none",
16891
+ italic: false,
16892
+ colorToken: "text",
16893
+ padding: "none",
16894
+ borderRadius: "none",
16895
+ effects: { hover: [{
16896
+ effectId: "nav-underline",
16897
+ options: { style: "static" }
16898
+ }] }
16899
+ },
16900
+ /**
16901
+ * Underline Grow - animated underline grows from center on hover
16902
+ */
16903
+ "underline-grow": {
16904
+ name: "Underline Grow",
16905
+ typography: "body",
16906
+ fontWeight: "medium",
16907
+ textTransform: "none",
16908
+ italic: false,
16909
+ colorToken: "text",
16910
+ padding: "none",
16911
+ borderRadius: "none",
16912
+ effects: { hover: [{
16913
+ effectId: "nav-underline",
16914
+ options: { style: "grow" }
16915
+ }] }
16916
+ },
16917
+ /**
16918
+ * Capsule - pill-shaped background on hover
16919
+ */
16920
+ capsule: {
16921
+ name: "Capsule",
16922
+ typography: "body",
16923
+ fontWeight: "medium",
16924
+ textTransform: "none",
16925
+ italic: false,
16926
+ colorToken: "text",
16927
+ padding: "compact",
16928
+ borderRadius: "full",
16929
+ effects: {
16930
+ hover: [{
16931
+ effectId: "background-on-hover-alpha",
16932
+ options: {
16933
+ colorToken: "primary",
16934
+ opacity: 10
16935
+ }
16936
+ }],
16937
+ active: [{
16938
+ effectId: "background-on-hover-alpha",
16939
+ options: {
16940
+ colorToken: "primary",
16941
+ opacity: 15
16942
+ }
16943
+ }]
16944
+ }
16945
+ },
16946
+ /**
16947
+ * Solid - solid background color on hover
16948
+ */
16949
+ solid: {
16950
+ name: "Solid",
16951
+ typography: "body",
16952
+ fontWeight: "medium",
16953
+ textTransform: "none",
16954
+ italic: false,
16955
+ colorToken: "text",
16956
+ padding: "compact",
16957
+ borderRadius: "none",
16958
+ effects: {
16959
+ hover: [{
16960
+ effectId: "background-on-hover",
16961
+ options: {
16962
+ colorToken: "primary",
16963
+ textColorToken: "primaryForeground"
16964
+ }
16965
+ }],
16966
+ active: [{
16967
+ effectId: "background-on-hover",
16968
+ options: {
16969
+ colorToken: "primary",
16970
+ textColorToken: "primaryForeground"
16971
+ }
16972
+ }]
16973
+ }
16974
+ },
16975
+ /**
16976
+ * Scale - gentle scale-up on hover
16977
+ */
16978
+ scale: {
16979
+ name: "Scale",
16980
+ typography: "body",
16981
+ fontWeight: "medium",
16982
+ textTransform: "none",
16983
+ italic: false,
16984
+ colorToken: "text",
16985
+ padding: "none",
16986
+ borderRadius: "none",
16987
+ effects: { hover: [{
16988
+ effectId: "scale-up",
16989
+ options: { scale: 1.05 }
16990
+ }] }
16991
+ },
16992
+ /**
16993
+ * Frosted - semi-transparent glass-like background
16994
+ */
16995
+ frosted: {
16996
+ name: "Frosted",
16997
+ typography: "body",
16998
+ fontWeight: "medium",
16999
+ textTransform: "none",
17000
+ italic: false,
17001
+ colorToken: "text",
17002
+ padding: "compact",
17003
+ borderRadius: "md",
17004
+ effects: {
17005
+ base: [{ effectId: "nav-frosted-base" }],
17006
+ hover: [{ effectId: "nav-frosted-hover" }],
17007
+ active: [{ effectId: "nav-frosted-active" }]
17008
+ }
17009
+ }
17010
+ };
17011
+ /**
17012
+ * Get a nav link style preset by ID
17013
+ */
17014
+ function getNavLinkPreset(presetId) {
17015
+ return NAV_LINK_PRESETS[presetId];
17016
+ }
17017
+ Object.keys(NAV_LINK_PRESETS);
17018
+ //#endregion
17019
+ //#region ../theme-core/src/header/legacyNavLinkStyle.ts
17020
+ function buildLegacyHeaderNavLinkStyle(header, contrastTreatment, navTextSize) {
17021
+ const navStyle = header.navStyle ?? "minimal";
17022
+ const basePreset = getNavLinkPreset(navStyle);
17023
+ if (!basePreset) return null;
17024
+ const style = {
17025
+ ...basePreset,
17026
+ fontWeight: header.navWeight ?? basePreset.fontWeight,
17027
+ colorToken: (header.navColor ?? header.textColor)?.trim() || basePreset.colorToken,
17028
+ ...contrastTreatment ? { contrastTreatment } : {},
17029
+ ...navTextSize ? { textSize: navTextSize } : {}
17030
+ };
17031
+ if (header.navWeight === "bold" && navStyle === "solid") style.textTransform = "uppercase";
17032
+ applyLegacyGlassTreatment(style, header, navStyle);
17033
+ return style;
17034
+ }
17035
+ function applyLegacyGlassTreatment(style, header, navStyle) {
17036
+ if (header.navContainer?.type !== "glass" || navStyle !== "minimal") return;
17037
+ style.borderRadius = "full";
17038
+ style.effects = {
17039
+ ...style.effects,
17040
+ hover: glassStateEffects(10),
17041
+ active: glassStateEffects(18)
17042
+ };
17043
+ }
17044
+ function glassStateEffects(opacity) {
17045
+ return [{
17046
+ effectId: "background-on-hover-alpha",
17047
+ options: {
17048
+ colorToken: "neutral-50",
17049
+ opacity
17050
+ }
17051
+ }, {
17052
+ effectId: "text-color-change",
17053
+ options: { hoverColorToken: "neutral-50" }
17054
+ }];
17055
+ }
17056
+ //#endregion
17057
+ //#region ../theme-core/src/header/openingForegroundProjection.ts
17058
+ function readOpeningForegroundProjection(header) {
17059
+ return header?.__runtimeOpeningForeground ?? null;
17060
+ }
17061
+ //#endregion
17062
+ //#region ../theme-core/src/header/effectiveNavLinkStyle.ts
17063
+ function effectiveHeaderNavLinkStyle(header, contrastTreatment = null, navTextSize = null) {
17064
+ if (!header) return null;
17065
+ if (!header.navLinkStyle) return buildLegacyHeaderNavLinkStyle(header, contrastTreatment, navTextSize);
17066
+ return {
17067
+ ...header.navLinkStyle,
17068
+ ...contrastTreatment ? { contrastTreatment } : {},
17069
+ ...navTextSize ? { textSize: navTextSize } : {}
17070
+ };
17071
+ }
17072
+ function headerForegroundCandidates(header) {
17073
+ if (!header) return {};
17074
+ const style = effectiveHeaderNavLinkStyle(header);
17075
+ return {
17076
+ text: header.textColor ?? header.background?.textColor,
17077
+ link: style?.colorToken ?? header.navColor ?? header.textColor,
17078
+ linkHover: navLinkHoverColorCandidate(style)
17079
+ };
17080
+ }
17081
+ function headerLeafTextColor(header) {
17082
+ if (!header) return "text";
17083
+ return header.textColor ?? header.navColor ?? header.background?.textColor ?? header.navLinkStyle?.colorToken ?? "text";
17084
+ }
17085
+ /** Transparent chrome must reset the whole contract on its own root. */
17086
+ function transparentHeaderForegroundInput(header, palette) {
17087
+ const projection = readOpeningForegroundProjection(header);
17088
+ if (projection?.kind === "known") return surfaceForegroundInputFromResolved(projection, rgbColorValue);
17089
+ return authoredTransparentHeaderForegroundInput(header, palette);
17090
+ }
17091
+ function authoredTransparentHeaderForegroundInput(header, palette) {
17092
+ const text = headerLeafTextColor(header);
17093
+ const style = effectiveHeaderNavLinkStyle(header);
17094
+ const link = style?.colorToken ?? text;
17095
+ const restingToken = parseThemeColorToken(link) ?? parseThemeColorToken("text");
17096
+ if (!restingToken) throw new Error("Built-in text colour token is invalid");
17097
+ const hover = planForegroundHover({
17098
+ restingToken,
17099
+ candidate: navLinkOwnsHoverForeground(style) ? null : navLinkHoverColorCandidate(style),
17100
+ palette,
17101
+ backdrops: null
17102
+ });
17103
+ return {
17104
+ text: rgbColorValue(text),
17105
+ link: rgbColorValue(link),
17106
+ linkHover: rgbColorValue(hover.token),
17107
+ hoverDecoration: navLinkOwnsUnderline(style) ? "initial" : hover.decoration
17108
+ };
17109
+ }
17110
+ //#endregion
16262
17111
  //#region ../theme-core/src/site-styles/pageDesignAuthority.ts
16263
17112
  const nonEmptyStringSchema = z.string().min(1);
16264
17113
  const blockContentVersionIdSchema = nonEmptyStringSchema.transform(asBlockContentVersionId);
@@ -16411,6 +17260,28 @@ z.object({
16411
17260
  motion: z.enum(themeTokenRecipeOptions.motion)
16412
17261
  });
16413
17262
  //#endregion
17263
+ //#region ../theme-core/src/footer/effectiveNavLinkStyle.ts
17264
+ function effectiveFooterNavLinkStyle(footer) {
17265
+ if (!footer) return null;
17266
+ if (footer.navLinkStyle) return footer.navLinkStyle;
17267
+ const basePreset = getNavLinkPreset(footer.navStyle ?? "minimal");
17268
+ if (!basePreset) return null;
17269
+ return {
17270
+ ...basePreset,
17271
+ fontWeight: footer.navWeight ?? basePreset.fontWeight,
17272
+ colorToken: footer.navColor?.trim() || basePreset.colorToken
17273
+ };
17274
+ }
17275
+ function footerForegroundCandidates(footer, proseHoverCandidate) {
17276
+ if (!footer) return {};
17277
+ const style = effectiveFooterNavLinkStyle(footer);
17278
+ return {
17279
+ text: footer.background?.textColor,
17280
+ link: style?.colorToken ?? footer.navColor ?? footer.background?.textColor,
17281
+ linkHover: navLinkOwnsHoverForeground(style) ? proseHoverCandidate : navLinkHoverColorCandidate(style)
17282
+ };
17283
+ }
17284
+ //#endregion
16414
17285
  //#region ../theme-core/src/siteChromeOverlayClearance.ts
16415
17286
  const SITE_CHROME_VISIBLE_HEADER_ATTR = "data-site-chrome-visible-header";
16416
17287
  //#endregion
@@ -19384,33 +20255,28 @@ function resolveBackgroundColorValue(value, context) {
19384
20255
  //#endregion
19385
20256
  //#region ../blocks/src/system/transforms/registry/_utils/surfaceForegroundStyles.ts
19386
20257
  const contextualButtonStylesCache = /* @__PURE__ */ new WeakMap();
19387
- function resolveHeaderLeafTextColor(header) {
19388
- return header?.textColor ?? header?.navColor ?? header?.background?.textColor ?? header?.navLinkStyle?.colorToken ?? "text";
19389
- }
19390
20258
  function resolveHeaderRootForeground(header, palette, isTransparent) {
19391
- if (isTransparent) return { kind: "unknown" };
20259
+ if (isTransparent) return readOpeningForegroundProjection(header) ?? { kind: "unknown" };
19392
20260
  const background = header?.background;
19393
20261
  return resolveSurfaceForeground(background ?? {
19394
20262
  type: "color",
19395
20263
  color: "surface"
19396
- }, palette, {
19397
- text: header?.textColor ?? background?.textColor,
19398
- link: header?.navLinkStyle?.colorToken ?? header?.navColor ?? header?.textColor
19399
- });
20264
+ }, palette, headerForegroundCandidates(header));
20265
+ }
20266
+ function resolveFooterRootForeground(footer, palette, proseHoverCandidate) {
20267
+ return resolveSurfaceForeground(footer?.background ?? {
20268
+ type: "color",
20269
+ color: "surface"
20270
+ }, palette, footerForegroundCandidates(footer, proseHoverCandidate), { compositeBase: "background" });
19400
20271
  }
19401
20272
  function resolveSurfaceForegroundStyles(value, context, options) {
19402
20273
  const input = parseBackgroundContent(value);
19403
- const foreground = input ? resolveSurfaceForeground(input, context.theme.palette, {}, { compositeBase: options?.fallbackToken }) : { kind: "unknown" };
20274
+ const foreground = input ? resolveSurfaceForeground(input, context.theme.palette, { linkHover: context.proseHoverCandidate }, { compositeBase: options?.fallbackToken }) : { kind: "unknown" };
19404
20275
  const buttonStyles = resolveContextualButtonStyles(input, foreground, context, options);
19405
20276
  if (foreground.kind === "unknown") return buttonStyles;
19406
20277
  return {
19407
20278
  ...buttonStyles,
19408
- ...surfaceForegroundStyle({
19409
- text: resolveBackgroundColorValue(foreground.roles.text, context),
19410
- heading: resolveBackgroundColorValue(foreground.roles.heading, context),
19411
- link: resolveBackgroundColorValue(foreground.roles.link, context),
19412
- supporting: resolveBackgroundColorValue(foreground.roles.supporting, context)
19413
- })
20279
+ ...surfaceForegroundStyle(surfaceForegroundInputFromResolved(foreground, (token) => resolveBackgroundColorValue(token, context)))
19414
20280
  };
19415
20281
  }
19416
20282
  function resolveContextualButtonStyles(background, foreground, context, options) {
@@ -25226,10 +26092,7 @@ function resolveBackgroundVisualStyles(backgroundColor, defaultToken = "surface"
25226
26092
  };
25227
26093
  }
25228
26094
  function resolveHeaderVisualStyles(header) {
25229
- const navContainerType = header?.navContainer?.type ?? "none";
25230
- const hasContainedNav = navContainerType === "glass" || navContainerType === "pill";
25231
- const hasOverlayVariant = header?.variant === "floating";
25232
- if (hasContainedNav || hasOverlayVariant) return {
26095
+ if (headerRootPaint(header) !== "own-surface") return {
25233
26096
  backgroundToken: "transparent",
25234
26097
  isTransparent: true
25235
26098
  };
@@ -25240,23 +26103,7 @@ function resolveHeaderVisualStyles(header) {
25240
26103
  }
25241
26104
  function resolvedForegroundStyle(foreground) {
25242
26105
  if (foreground.kind === "unknown") return void 0;
25243
- const { roles } = foreground;
25244
- return surfaceForegroundStyle({
25245
- text: rgbColorValue(roles.text),
25246
- heading: rgbColorValue(roles.heading),
25247
- link: rgbColorValue(roles.link),
25248
- supporting: rgbColorValue(roles.supporting)
25249
- });
25250
- }
25251
- function resolveFooterRootForeground(footer, palette) {
25252
- const background = footer?.background;
25253
- return resolveSurfaceForeground(background ?? {
25254
- type: "color",
25255
- color: "surface"
25256
- }, palette, {
25257
- text: background?.textColor,
25258
- link: footer?.navLinkStyle?.colorToken ?? footer?.navColor ?? background?.textColor
25259
- });
26106
+ return surfaceForegroundStyle(surfaceForegroundInputFromResolved(foreground, rgbColorValue));
25260
26107
  }
25261
26108
  function footerBottomBarBorderWidthStyle(width) {
25262
26109
  if (!width) return void 0;
@@ -25283,8 +26130,7 @@ const headerRootClassTransform = {
25283
26130
  const placement = planSiteChromePlacement(parseHeaderPositioning(content.positioning));
25284
26131
  const header = asPartialObject(value);
25285
26132
  const visuals = resolveHeaderVisualStyles(header);
25286
- const navContainerType = header?.navContainer?.type ?? "none";
25287
- const hasContainedNav = navContainerType === "glass" || navContainerType === "pill";
26133
+ const hasContainedNav = headerRootPaint(header) === "contained-nav";
25288
26134
  const backgroundClass = visuals.isTransparent || hasContainedNav ? "rb-bg-transparent" : null;
25289
26135
  const classes = [config.base, backgroundClass];
25290
26136
  if (!hasContainedNav) {
@@ -25327,7 +26173,7 @@ const headerRootStyleTransform = {
25327
26173
  run: (value, _options, context) => {
25328
26174
  const header = asPartialObject(value);
25329
26175
  const visuals = resolveHeaderVisualStyles(header);
25330
- return mergeStyles(resolvedForegroundStyle(resolveHeaderRootForeground(header, context.theme.palette, visuals.isTransparent)) ?? { color: rgbColorValue(resolveHeaderLeafTextColor(header)) }, borderColorStyle(header?.border?.colorToken ?? "border"));
26176
+ return mergeStyles(resolvedForegroundStyle(resolveHeaderRootForeground(header, context.theme.palette, visuals.isTransparent)) ?? (visuals.isTransparent ? surfaceForegroundStyle(transparentHeaderForegroundInput(header, context.theme.palette)) : { color: rgbColorValue(headerLeafTextColor(header)) }), borderColorStyle(header?.border?.colorToken ?? "border"));
25331
26177
  }
25332
26178
  };
25333
26179
  const headerSectionBackgroundTransform = {
@@ -25335,9 +26181,7 @@ const headerSectionBackgroundTransform = {
25335
26181
  kind: "string",
25336
26182
  summary: "Resolve the inner site-header section background token",
25337
26183
  run: (value) => {
25338
- const header = asPartialObject(value);
25339
- const navContainerType = header?.navContainer?.type ?? "none";
25340
- return header?.variant === "floating" || navContainerType === "glass" || navContainerType === "pill" ? "raw:transparent" : "background";
26184
+ return headerRootPaint(asPartialObject(value)) !== "own-surface" ? "raw:transparent" : "background";
25341
26185
  }
25342
26186
  };
25343
26187
  const footerRootStyleTransform = {
@@ -25355,7 +26199,7 @@ const footerRootStyleTransform = {
25355
26199
  styleParts.push(backgroundColorStyle(token));
25356
26200
  }
25357
26201
  }
25358
- styleParts.push(resolvedForegroundStyle(resolveFooterRootForeground(footer, context.theme.palette)));
26202
+ styleParts.push(resolvedForegroundStyle(resolveFooterRootForeground(footer, context.theme.palette, context.proseHoverCandidate)));
25359
26203
  styleParts.push(borderColorStyle("border"));
25360
26204
  return mergeStyles(...styleParts);
25361
26205
  }
@@ -25417,22 +26261,28 @@ const footerBottomBarStyleTransform = {
25417
26261
  run: (value, _options, context) => {
25418
26262
  const footer = asPartialObject(value);
25419
26263
  const bottomBar = footer?.bottomBar;
25420
- const styleParts = [];
25421
- const background = bottomBar?.background;
25422
- if (background?.type === "color") styleParts.push(backgroundColorStyle(background.color ?? "surface"));
25423
- styleParts.push(borderColorStyle(bottomBar?.borderTop?.colorToken ?? "border"), footerBottomBarBorderWidthStyle(bottomBar?.borderTop?.width));
25424
- const foreground = resolveSurfaceForeground(background?.type === "color" ? background : {
25425
- type: "color",
25426
- color: "transparent"
25427
- }, context.theme.palette, {
25428
- text: bottomBar?.textColor,
25429
- link: footer?.bottomTextLinkStyle?.colorToken ?? bottomBar?.textColor
25430
- });
25431
- if (background?.type === "color") styleParts.push(resolvedForegroundStyle(foreground));
25432
- else if (bottomBar?.textColor) styleParts.push(textColorStyle(bottomBar.textColor));
25433
- return mergeStyles(...styleParts);
26264
+ return mergeStyles(bottomBar?.background?.type === "color" ? backgroundColorStyle(bottomBar.background.color ?? "surface") : void 0, borderColorStyle(bottomBar?.borderTop?.colorToken ?? "border"), footerBottomBarBorderWidthStyle(bottomBar?.borderTop?.width), footerBottomBarForegroundStyle(footer, context.theme.palette));
25434
26265
  }
25435
26266
  };
26267
+ function footerBottomBarForegroundStyle(footer, palette) {
26268
+ if (!footer?.bottomBar) return void 0;
26269
+ const bar = footer.bottomBar;
26270
+ if (bar.background?.type !== "color") return backgroundlessBottomBarForegroundStyle(footer);
26271
+ return resolvedForegroundStyle(resolveSurfaceForeground(bar.background, palette, {
26272
+ text: bar.textColor,
26273
+ link: footer.bottomTextLinkStyle?.colorToken ?? bar.textColor,
26274
+ linkHover: footer.bottomTextLinkStyle?.hoverColorToken
26275
+ }, { compositeBase: measuredFooterBackdrop(footer, palette) }));
26276
+ }
26277
+ function backgroundlessBottomBarForegroundStyle(footer) {
26278
+ if (footer.background?.contentOwner === "site-chrome-editor") return;
26279
+ const textColor = footer.bottomBar?.textColor;
26280
+ return textColor ? textColorStyle(textColor) : void 0;
26281
+ }
26282
+ function measuredFooterBackdrop(footer, palette) {
26283
+ const foreground = resolveFooterRootForeground(footer, palette);
26284
+ return foreground.kind === "known" && foreground.provenance.kind === "measured" ? foreground.provenance.backdropHex : null;
26285
+ }
25436
26286
  const footerSplitMainClassTransform = {
25437
26287
  id: "layout.footerSplitMainClass",
25438
26288
  kind: "string",
@@ -25528,7 +26378,7 @@ function chromeSurfaceTextToken(surface, theme, palette) {
25528
26378
  case "header-root": {
25529
26379
  const header = theme.header;
25530
26380
  const foreground = resolveHeaderRootForeground(header, palette, resolveHeaderVisualStyles(header).isTransparent);
25531
- return foreground.kind === "known" ? foreground.roles.text : resolveHeaderLeafTextColor(header);
26381
+ return foreground.kind === "known" ? foreground.roles.text : headerLeafTextColor(header);
25532
26382
  }
25533
26383
  case "header-mobile-panel": return theme.header?.dropdownStyle?.textColor ?? "text";
25534
26384
  case "footer-root": {
@@ -26112,13 +26962,13 @@ const hours = stack({
26112
26962
  as: "p",
26113
26963
  className: "rb-caption rb-opacity-70"
26114
26964
  }, bind("module.timeZone"), when("module.timeZone"))], when("module.kind", { equals: "opening-hours" }));
26115
- const socials = inline({ className: "rb-flex rb-flex-wrap rb-gap-x-5 rb-gap-y-3" }, [link({
26965
+ const socials = inline({ className: "rb-footer-socials" }, [link({
26116
26966
  href: { $bind: { from: "social.href" } },
26117
26967
  target: "_blank",
26118
26968
  rel: "noreferrer noopener",
26119
26969
  "aria-label": { $bind: { from: "social.label" } },
26120
- className: "rb-nav-text transition-theme-standard"
26121
- }, [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" }));
26970
+ className: "rb-footer-social-link rb-nav-text transition-theme-standard"
26971
+ }, [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" }));
26122
26972
  const authoredCopy = richText({
26123
26973
  className: "rb-prose rb-prose-sm rb-max-w-none",
26124
26974
  style: textColorStyle("text/80")
@@ -27615,7 +28465,9 @@ const bookingWizard = bookingForm(withApiBindings({
27615
28465
  } },
27616
28466
  formId: { $bind: { from: "content.formId" } },
27617
28467
  form: { $bind: { from: "data.form" } },
27618
- services: { $bind: { from: "data.services" } }
28468
+ services: { $bind: { from: "data.services" } },
28469
+ mailingList: { $bind: { from: "$root.mailingList" } },
28470
+ siteName: { $bind: { from: "$root.siteName" } }
27619
28471
  }));
27620
28472
  /** Both variants sit in the same section shell; only the inner layout differs. */
27621
28473
  function bookingSection(children) {
@@ -28203,6 +29055,7 @@ const publicEventLoaderQuerySchemaShape = {
28203
29055
  seriesSlug: z.string().optional(),
28204
29056
  includeOccurrenceId: z.string().optional(),
28205
29057
  readIntent: z.string().optional(),
29058
+ detailAdmission: z.string().optional(),
28206
29059
  detailLevel: z.string().optional(),
28207
29060
  readProfile: z.string().optional()
28208
29061
  };
@@ -28369,11 +29222,11 @@ const publicEventBookingAvailabilitySchema = z.discriminatedUnion("kind", [z.obj
28369
29222
  "series_archived",
28370
29223
  "parent_archived",
28371
29224
  "parent_inconsistent",
28372
- "not_public",
28373
29225
  "already_started",
28374
29226
  "enrollment_closed"
28375
29227
  ])
28376
29228
  })]);
29229
+ const publicEventBookingClosedDetailSchema = z.discriminatedUnion("kind", [z.object({ kind: z.literal("opensSoon") }), z.object({ kind: z.literal("paused") })]);
28377
29230
  const publicRunSessionSchema = z.object({
28378
29231
  occurrenceId: z.string(),
28379
29232
  startsAt: z.string(),
@@ -28418,6 +29271,7 @@ const publicEventBaseSchema = z.object({
28418
29271
  destination: publicEventDestinationSchema,
28419
29272
  requiresRegistration: z.boolean(),
28420
29273
  bookingAvailability: publicEventBookingAvailabilitySchema,
29274
+ bookingClosedDetail: publicEventBookingClosedDetailSchema.optional(),
28421
29275
  deliveryMode: z.enum([
28422
29276
  "in_person",
28423
29277
  "online",
@@ -29115,7 +29969,13 @@ const eventRegistrationHydrationSchemaShape = {
29115
29969
  spamProtectionEnabled: z.boolean().optional(),
29116
29970
  supportEmail: z.string().optional(),
29117
29971
  sitePasses: publicPassProductCollectionSchema.nullable().optional(),
29118
- siteMemberships: publicMembershipProductCollectionSchema.nullable().optional()
29972
+ siteMemberships: publicMembershipProductCollectionSchema.nullable().optional(),
29973
+ mailingList: z.unknown().transform((value) => {
29974
+ if (value === void 0) return void 0;
29975
+ const parsed = parseMailingListRuntimeContext(value);
29976
+ return parsed.ok ? parsed.value : void 0;
29977
+ }),
29978
+ siteName: z.string().optional()
29119
29979
  };
29120
29980
  const eventRegistrationEventSourceSchema = z.discriminatedUnion("kind", [z.object({
29121
29981
  kind: z.literal("loaded"),
@@ -29287,7 +30147,9 @@ const eventRegistrationBlockRuntime = defineClientOwnedBlockRuntime({
29287
30147
  spamProtectionEnabled: source.spamProtectionEnabled,
29288
30148
  supportEmail: source.supportEmail,
29289
30149
  sitePasses: source.sitePasses ?? null,
29290
- siteMemberships: source.siteMemberships ?? null
30150
+ siteMemberships: source.siteMemberships ?? null,
30151
+ mailingList: source.mailingList,
30152
+ siteName: source.siteName
29291
30153
  }
29292
30154
  };
29293
30155
  }
@@ -29455,6 +30317,8 @@ const eventRegistrationBlockDefinition = {
29455
30317
  events: { $bind: { from: "data.events" } },
29456
30318
  wholeSeriesRunEvents: { $bind: { from: "data.wholeSeriesRunEvents" } },
29457
30319
  loaderFailures: { $bind: { from: "$root.loaderFailures" } },
30320
+ mailingList: { $bind: { from: "$root.mailingList" } },
30321
+ siteName: { $bind: { from: "$root.siteName" } },
29458
30322
  sitePasses: { $bind: { from: "data.sitePasses" } },
29459
30323
  siteMemberships: { $bind: { from: "data.siteMemberships" } },
29460
30324
  stage: { $bind: {
@@ -36081,6 +36945,11 @@ const mailingListContentVersionIdSchema = z.string().transform((value, ctx) => {
36081
36945
  });
36082
36946
  return z.NEVER;
36083
36947
  });
36948
+ const mailingListSignupBlockSourceRefSchema = z.object({
36949
+ tag: z.literal("block_ref"),
36950
+ blockId: mailingListSignupBlockIdSchema,
36951
+ contentVersionId: mailingListContentVersionIdSchema
36952
+ });
36084
36953
  const signedMailingListSourceTokenSchema = z.string().trim().min(1).transform(parseRequiredMailingListSignedSourceToken);
36085
36954
  const newsletterSourceCommonSchema = z.object({
36086
36955
  siteId: z.string().optional(),
@@ -36095,7 +36964,15 @@ const newsletterSourceSchema = z.discriminatedUnion("source", [
36095
36964
  newsletterSourceCommonSchema.extend({
36096
36965
  source: z.literal("block"),
36097
36966
  blockId: z.string().nullable().optional(),
36098
- contentVersionId: z.string().nullable().optional()
36967
+ newsletterBlockSubmission: z.discriminatedUnion("tag", [
36968
+ z.object({
36969
+ tag: z.literal("ready"),
36970
+ sourceRef: mailingListSignupBlockSourceRefSchema
36971
+ }),
36972
+ z.object({ tag: z.literal("unpublished-form") }),
36973
+ z.object({ tag: z.literal("unpublished-settings") }),
36974
+ z.object({ tag: z.literal("unavailable") })
36975
+ ])
36099
36976
  }),
36100
36977
  newsletterSourceCommonSchema.extend({
36101
36978
  source: z.literal("signed-footer"),
@@ -36124,11 +37001,7 @@ const newsletterHydrationSchema = z.object({
36124
37001
  target: z.discriminatedUnion("tag", [
36125
37002
  z.object({
36126
37003
  tag: z.literal("block-source"),
36127
- sourceRef: z.object({
36128
- tag: z.literal("block_ref"),
36129
- blockId: mailingListSignupBlockIdSchema,
36130
- contentVersionId: mailingListContentVersionIdSchema
36131
- }).nullable()
37004
+ sourceRef: mailingListSignupBlockSourceRefSchema.nullable()
36132
37005
  }),
36133
37006
  z.object({
36134
37007
  tag: z.literal("signed-footer-source"),
@@ -36137,7 +37010,11 @@ const newsletterHydrationSchema = z.object({
36137
37010
  token: signedMailingListSourceTokenSchema
36138
37011
  })
36139
37012
  }),
36140
- z.object({ tag: z.literal("preview") })
37013
+ z.object({ tag: z.literal("preview") }),
37014
+ z.object({
37015
+ tag: z.literal("unpublished-preview"),
37016
+ reason: z.enum(["unpublished-form", "unpublished-settings"])
37017
+ })
36141
37018
  ]),
36142
37019
  setupRevision: z.number().int().positive().nullable(),
36143
37020
  choiceProvider: z.enum([
@@ -36206,16 +37083,21 @@ const newsletterFormBlockRuntime = defineProgressiveBlockRuntime({
36206
37083
  });
36207
37084
  function projectNewsletterFormHydrationTarget(source) {
36208
37085
  switch (source.source) {
36209
- case "block": {
36210
- const sourceRef = buildMailingListSignupBlockSourceRef(source.blockId, source.contentVersionId);
36211
- if (sourceRef?.tag === "block_ref") return {
37086
+ case "block": switch (source.newsletterBlockSubmission.tag) {
37087
+ case "unpublished-form":
37088
+ case "unpublished-settings": return {
37089
+ tag: "unpublished-preview",
37090
+ reason: source.newsletterBlockSubmission.tag
37091
+ };
37092
+ case "ready": return {
36212
37093
  tag: "block-source",
36213
- sourceRef
37094
+ sourceRef: source.newsletterBlockSubmission.sourceRef
36214
37095
  };
36215
- return {
37096
+ case "unavailable": return {
36216
37097
  tag: "block-source",
36217
37098
  sourceRef: null
36218
37099
  };
37100
+ default: return assertNever$2(source.newsletterBlockSubmission);
36219
37101
  }
36220
37102
  case "signed-footer": return {
36221
37103
  tag: "signed-footer-source",
@@ -36320,65 +37202,67 @@ const editorialSplitLayout = styledSection({
36320
37202
  spacing: "comfortable",
36321
37203
  background: "surface"
36322
37204
  });
36323
- const newsletterSignupBlockDefinition = {
36324
- manifest: createBlockManifest({
36325
- id: "block.newsletter-signup",
36326
- title: "Newsletter Signup",
36327
- titleSource: "title",
36328
- description: "Newsletter subscription form with configurable field presets.",
36329
- category: "interactive",
36330
- contentSource: { kind: "inline" },
36331
- fragments: [{
36332
- fragment: newsletterCopyFragment,
36333
- fieldPriority: 0
36334
- }, {
36335
- fragment: newsletterFormFragment,
36336
- fieldPriority: 1
36337
- }],
36338
- layout: stackedLayout,
36339
- variants: {
36340
- stacked: stackedLayout,
36341
- inline: inlineLayout,
36342
- "editorial-split": editorialSplitLayout
36343
- },
36344
- defaultVariant: "stacked",
36345
- variantOptions: {
36346
- stacked: {
36347
- label: "Stacked",
36348
- description: "Vertical layout with fields stacked"
36349
- },
36350
- inline: {
36351
- label: "Inline",
36352
- description: "Horizontal layout (email + button side by side)"
36353
- },
36354
- "editorial-split": {
36355
- label: "Editorial split",
36356
- description: "Copy and form in balanced side-by-side columns, stacked on mobile."
36357
- }
36358
- },
36359
- styleTokens: {
36360
- background: "surface",
36361
- typography: "body",
36362
- spacing: "md"
37205
+ const newsletterSignupManifest = createBlockManifest({
37206
+ id: "block.newsletter-signup",
37207
+ title: "Newsletter Signup",
37208
+ titleSource: "title",
37209
+ description: "Newsletter subscription form with configurable field presets.",
37210
+ category: "interactive",
37211
+ contentSource: { kind: "inline" },
37212
+ fragments: [{
37213
+ fragment: newsletterCopyFragment,
37214
+ fieldPriority: 0
37215
+ }, {
37216
+ fragment: newsletterFormFragment,
37217
+ fieldPriority: 1
37218
+ }],
37219
+ layout: stackedLayout,
37220
+ variants: {
37221
+ stacked: stackedLayout,
37222
+ inline: inlineLayout,
37223
+ "editorial-split": editorialSplitLayout
37224
+ },
37225
+ defaultVariant: "stacked",
37226
+ variantOptions: {
37227
+ stacked: {
37228
+ label: "Stacked",
37229
+ description: "Vertical layout with fields stacked"
36363
37230
  },
36364
- behaviours: {
36365
- supportsThemeSwitching: true,
36366
- inlineEditing: false,
36367
- animation: false,
36368
- paletteHidden: false
37231
+ inline: {
37232
+ label: "Inline",
37233
+ description: "Horizontal layout (email + button side by side)"
36369
37234
  },
36370
- tags: [
36371
- "newsletter",
36372
- "signup",
36373
- "email",
36374
- "subscribe",
36375
- "subscription",
36376
- "mailchimp",
36377
- "marketing",
36378
- "lead-capture"
36379
- ],
36380
- icon: "Mail"
36381
- }),
37235
+ "editorial-split": {
37236
+ label: "Editorial split",
37237
+ description: "Copy and form in balanced side-by-side columns, stacked on mobile."
37238
+ }
37239
+ },
37240
+ styleTokens: {
37241
+ background: "surface",
37242
+ typography: "body",
37243
+ spacing: "md"
37244
+ },
37245
+ behaviours: {
37246
+ supportsThemeSwitching: true,
37247
+ inlineEditing: false,
37248
+ animation: false,
37249
+ paletteHidden: false
37250
+ },
37251
+ tags: [
37252
+ "newsletter",
37253
+ "signup",
37254
+ "email",
37255
+ "subscribe",
37256
+ "subscription",
37257
+ "mailchimp",
37258
+ "marketing",
37259
+ "lead-capture"
37260
+ ],
37261
+ icon: "Mail"
37262
+ });
37263
+ [...(newsletterSignupManifest.fields ?? []).map((field) => field.id)];
37264
+ const newsletterSignupBlockDefinition = {
37265
+ manifest: newsletterSignupManifest,
36382
37266
  runtime: newsletterFormBlockRuntime
36383
37267
  };
36384
37268
  //#endregion
@@ -38420,7 +39304,8 @@ const BOOKING_FORM_DATA_RESERVED_KEYS = /* @__PURE__ */ new Set([
38420
39304
  "discountCode",
38421
39305
  "selectedSlidingAmountInput",
38422
39306
  "selectedCollectionOptionKind",
38423
- "selectedAppointmentPackageId"
39307
+ "selectedAppointmentPackageId",
39308
+ "mailingListOptIn"
38424
39309
  ]);
38425
39310
  function isBookingFormDataReservedKey(value) {
38426
39311
  return BOOKING_FORM_DATA_RESERVED_KEYS.has(value);
@@ -38768,6 +39653,46 @@ z.object({ acceptExtraSiteCharge: z.boolean().optional() });
38768
39653
  //#region ../surfaces/src/index.ts
38769
39654
  const SURFACE_IDS = ["core", "macadamia"];
38770
39655
  const DEFAULT_SURFACE_ID = "core";
39656
+ /**
39657
+ * Root hosts for each surface, keyed by deployment tier. The tier-keyed shape
39658
+ * makes it impossible to mis-order entries: callers like
39659
+ * `buildSurfaceAwareDashboardOriginForSurfaceId` look up by tier directly
39660
+ * rather than relying on positional alignment between arrays.
39661
+ */
39662
+ const SURFACE_ROOT_HOSTS = {
39663
+ core: {
39664
+ local: "localhost",
39665
+ prod: "riverbankcms.com"
39666
+ },
39667
+ macadamia: {
39668
+ local: "macadamia.localhost",
39669
+ prod: "macadamia.studio"
39670
+ }
39671
+ };
39672
+ const SURFACE_SITE_ROOT_HOSTS = {
39673
+ core: {
39674
+ local: "localhost",
39675
+ prod: "riverbanksites.com"
39676
+ },
39677
+ macadamia: {
39678
+ local: "macadamia.localhost",
39679
+ prod: "macadamia.studio"
39680
+ }
39681
+ };
39682
+ const SURFACE_SITE_ROOT_HOST_ALIASES = { core: { prod: ["preview.riverbanksites.com"] } };
39683
+ function surfaceHostTableValues(table) {
39684
+ return Object.values(table).flatMap((byTier) => Object.values(byTier).flat());
39685
+ }
39686
+ function siteSlugLabelUnderRoot(host, siteRootHost) {
39687
+ if (!host.endsWith(`.${siteRootHost}`)) return [];
39688
+ return host.slice(0, host.length - siteRootHost.length - 1).split(".").slice(-1);
39689
+ }
39690
+ function deriveSurfaceOwnedSiteSlugs() {
39691
+ const siteRootHosts = [...surfaceHostTableValues(SURFACE_SITE_ROOT_HOSTS), ...surfaceHostTableValues(SURFACE_SITE_ROOT_HOST_ALIASES)];
39692
+ const labels = [...surfaceHostTableValues(SURFACE_ROOT_HOSTS), ...siteRootHosts].flatMap((host) => siteRootHosts.flatMap((root) => siteSlugLabelUnderRoot(host, root)));
39693
+ return [...new Set(labels)].sort();
39694
+ }
39695
+ deriveSurfaceOwnedSiteSlugs();
38771
39696
  [...SURFACE_IDS.filter((surfaceId) => surfaceId !== DEFAULT_SURFACE_ID)];
38772
39697
  //#endregion
38773
39698
  //#region ../api/src/accountApi.ts
@@ -39369,6 +40294,7 @@ function collectText(node) {
39369
40294
  if (node.type === "text") return node.text ?? "";
39370
40295
  return (node.content ?? []).map(collectText).join("");
39371
40296
  }
40297
+ z.enum(["public", "unlisted"], { error: "visibility must be 'public' or 'unlisted'" });
39372
40298
  //#endregion
39373
40299
  //#region ../api/src/bookingPaymentTermSchemas.ts
39374
40300
  const bookingDepositRefundPolicySchema = z.enum(["refundable", "non_refundable"]);