@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
@@ -3162,6 +3162,12 @@ function layoutServicesByCategory(categories, services, options) {
3162
3162
  other
3163
3163
  };
3164
3164
  }
3165
+ //#endregion
3166
+ //#region ../core/src/mailing-list-runtime.ts
3167
+ function resolveBookingSignupOffer(context, siteName) {
3168
+ const name = siteName?.trim() ?? "";
3169
+ return context?.tag === "configured" && context.bookingSignup.tag === "offered" ? { siteName: name.length > 0 ? name : "this site" } : null;
3170
+ }
3165
3171
  function sessionStartMs(session) {
3166
3172
  return Date.parse(session.startsAt);
3167
3173
  }
@@ -7943,6 +7949,7 @@ const publicEventLoaderQuerySchemaShape = {
7943
7949
  seriesSlug: z.string().optional(),
7944
7950
  includeOccurrenceId: z.string().optional(),
7945
7951
  readIntent: z.string().optional(),
7952
+ detailAdmission: z.string().optional(),
7946
7953
  detailLevel: z.string().optional(),
7947
7954
  readProfile: z.string().optional()
7948
7955
  };
@@ -8109,11 +8116,11 @@ const publicEventBookingAvailabilitySchema = z.discriminatedUnion("kind", [z.obj
8109
8116
  "series_archived",
8110
8117
  "parent_archived",
8111
8118
  "parent_inconsistent",
8112
- "not_public",
8113
8119
  "already_started",
8114
8120
  "enrollment_closed"
8115
8121
  ])
8116
8122
  })]);
8123
+ const publicEventBookingClosedDetailSchema = z.discriminatedUnion("kind", [z.object({ kind: z.literal("opensSoon") }), z.object({ kind: z.literal("paused") })]);
8117
8124
  const publicRunSessionSchema = z.object({
8118
8125
  occurrenceId: z.string(),
8119
8126
  startsAt: z.string(),
@@ -8158,6 +8165,7 @@ const publicEventBaseSchema = z.object({
8158
8165
  destination: publicEventDestinationSchema,
8159
8166
  requiresRegistration: z.boolean(),
8160
8167
  bookingAvailability: publicEventBookingAvailabilitySchema,
8168
+ bookingClosedDetail: publicEventBookingClosedDetailSchema.optional(),
8161
8169
  deliveryMode: z.enum([
8162
8170
  "in_person",
8163
8171
  "online",
@@ -9387,105 +9395,6 @@ function useBlockApi() {
9387
9395
  if (!client) throw new Error("useBlockApi must be used within a BlockApiProvider. Make sure your component is wrapped with <BlockApiProvider>.");
9388
9396
  return client;
9389
9397
  }
9390
- //#endregion
9391
- //#region ../blocks/src/system/runtime/shared/components/CheckIcon.tsx
9392
- function CheckIcon({ className, strokeWidth = 2 }) {
9393
- return /* @__PURE__ */ jsx("svg", {
9394
- fill: "none",
9395
- strokeLinecap: "round",
9396
- strokeLinejoin: "round",
9397
- strokeWidth,
9398
- viewBox: "0 0 24 24",
9399
- stroke: "currentColor",
9400
- className,
9401
- width: "1em",
9402
- height: "1em",
9403
- "aria-hidden": "true",
9404
- children: /* @__PURE__ */ jsx("path", { d: "M5 13l4 4L19 7" })
9405
- });
9406
- }
9407
- //#endregion
9408
- //#region ../blocks/src/system/runtime/shared/components/StateIcon.tsx
9409
- /**
9410
- * Circular icon wrapper for terminal state screens (success, error, waitlist, etc.).
9411
- *
9412
- * Layout is provided by shared `rb-state-icon` CSS; color variants are
9413
- * block-scoped by the owning registration surface.
9414
- */
9415
- function StateIcon({ variant, children }) {
9416
- return /* @__PURE__ */ jsx("div", {
9417
- className: `rb-state-icon rb-state-icon--${variant}`,
9418
- "aria-hidden": "true",
9419
- children
9420
- });
9421
- }
9422
- //#endregion
9423
- //#region ../blocks/src/system/runtime/shared/components/TerminalPanel.tsx
9424
- function joinClasses$1(...parts) {
9425
- return parts.filter((part) => typeof part === "string" && part.length > 0).join(" ");
9426
- }
9427
- function TerminalPanel({ tone, title, titleAs: Title = "h3", body, secondaryBody, icon, actions, className, titleClassName, bodyClassName, secondaryBodyClassName, iconClassName, actionsClassName, role, live }) {
9428
- const resolvedRole = role ?? (tone === "error" ? "alert" : "status");
9429
- const resolvedLive = live ?? (resolvedRole === "alert" ? "assertive" : "polite");
9430
- return /* @__PURE__ */ jsxs("div", {
9431
- className,
9432
- "data-terminal-panel": true,
9433
- "data-terminal-tone": tone,
9434
- role: resolvedRole,
9435
- "aria-live": resolvedLive === "off" ? void 0 : resolvedLive,
9436
- children: [
9437
- icon ? /* @__PURE__ */ jsx("div", {
9438
- className: joinClasses$1(iconClassName),
9439
- "data-terminal-icon": true,
9440
- children: icon
9441
- }) : null,
9442
- /* @__PURE__ */ jsx(Title, {
9443
- className: joinClasses$1(titleClassName),
9444
- "data-terminal-title": true,
9445
- children: title
9446
- }),
9447
- body ? /* @__PURE__ */ jsx("div", {
9448
- className: joinClasses$1(bodyClassName),
9449
- "data-terminal-body": true,
9450
- children: body
9451
- }) : null,
9452
- actions ? /* @__PURE__ */ jsx("div", {
9453
- className: joinClasses$1(actionsClassName),
9454
- "data-terminal-actions": true,
9455
- children: actions
9456
- }) : null,
9457
- secondaryBody ? /* @__PURE__ */ jsx("div", {
9458
- className: joinClasses$1(secondaryBodyClassName),
9459
- "data-terminal-secondary-body": true,
9460
- children: secondaryBody
9461
- }) : null
9462
- ]
9463
- });
9464
- }
9465
- //#endregion
9466
- //#region ../blocks/src/system/runtime/components/booking/SuccessMessage.tsx
9467
- const SuccessMessage = ({ message, resourceName, className }) => {
9468
- return /* @__PURE__ */ jsx(TerminalPanel, {
9469
- tone: "success",
9470
- title: "Booking confirmed",
9471
- icon: /* @__PURE__ */ jsx(StateIcon, {
9472
- variant: "success",
9473
- children: /* @__PURE__ */ jsx(CheckIcon, { strokeWidth: 3 })
9474
- }),
9475
- body: /* @__PURE__ */ jsx("p", {
9476
- className: "ab-text",
9477
- children: message
9478
- }),
9479
- secondaryBody: resourceName ? /* @__PURE__ */ jsxs("p", {
9480
- className: "ab-text rb-on-surface--muted",
9481
- children: ["Practitioner: ", resourceName]
9482
- }) : null,
9483
- className: ["ab-center", className ?? ""].join(" ").trim(),
9484
- titleClassName: "ab-terminal-title",
9485
- role: "alert",
9486
- live: "polite"
9487
- });
9488
- };
9489
9398
  new TextEncoder();
9490
9399
  //#endregion
9491
9400
  //#region ../altcha/src/index.ts
@@ -9569,7 +9478,8 @@ const BOOKING_FORM_DATA_RESERVED_KEY_VALUES = [
9569
9478
  "discountCode",
9570
9479
  "selectedSlidingAmountInput",
9571
9480
  "selectedCollectionOptionKind",
9572
- "selectedAppointmentPackageId"
9481
+ "selectedAppointmentPackageId",
9482
+ "mailingListOptIn"
9573
9483
  ];
9574
9484
  const BOOKING_FORM_DATA_RESERVED_KEYS = new Set(BOOKING_FORM_DATA_RESERVED_KEY_VALUES);
9575
9485
  //#endregion
@@ -9989,6 +9899,7 @@ function prepareBookingSubmission(input) {
9989
9899
  startAt: selectedSlot,
9990
9900
  endAt: endDate.toISOString(),
9991
9901
  customFields: collectBookingCustomFields(input.data),
9902
+ ...selectedMailingListOptIn(input.data),
9992
9903
  timezone: toBookingTimeZone(input.viewerTimeZone ?? null)
9993
9904
  };
9994
9905
  if (customerPassId) return {
@@ -10039,6 +9950,9 @@ function prepareBookingSubmission(input) {
10039
9950
  }
10040
9951
  };
10041
9952
  }
9953
+ function selectedMailingListOptIn(data) {
9954
+ return data.mailingListOptIn === true ? { mailingListOptIn: true } : {};
9955
+ }
10042
9956
  function formatBookingSubmissionPreparationError(error) {
10043
9957
  switch (error.tag) {
10044
9958
  case "missing-required-booking-information": return "Missing required booking information";
@@ -10619,6 +10533,7 @@ function useBookingSubmission(_siteId) {
10619
10533
  startAt: data.startAt,
10620
10534
  endAt: data.endAt,
10621
10535
  customFields: data.customFields,
10536
+ mailingListOptIn: data.mailingListOptIn,
10622
10537
  timezone: data.timezone,
10623
10538
  customerPassId: data.customerPassId
10624
10539
  }) : await api.submitBooking({
@@ -10628,6 +10543,7 @@ function useBookingSubmission(_siteId) {
10628
10543
  startAt: data.startAt,
10629
10544
  endAt: data.endAt,
10630
10545
  customFields: data.customFields,
10546
+ mailingListOptIn: data.mailingListOptIn,
10631
10547
  timezone: data.timezone,
10632
10548
  discountCode: data.discountCode,
10633
10549
  selectedSlidingAmount: data.selectedSlidingAmount,
@@ -10663,6 +10579,40 @@ function useBookingSubmission(_siteId) {
10663
10579
  };
10664
10580
  }
10665
10581
  //#endregion
10582
+ //#region ../blocks/src/system/runtime/nodes/booking-form.submit-success.ts
10583
+ function completeBookingSubmission(input) {
10584
+ const { data } = input;
10585
+ if (data.type === "checkout_redirect") {
10586
+ if (input.redirect === "auto" && typeof window !== "undefined") input.navigateToCheckout(data.checkoutUrl);
10587
+ return {
10588
+ ok: true,
10589
+ outcome: {
10590
+ kind: "checkout_redirect",
10591
+ checkoutUrl: data.checkoutUrl,
10592
+ sessionId: data.sessionId,
10593
+ ...data.mailingListSignupNote ? { mailingListSignupNote: data.mailingListSignupNote } : {}
10594
+ }
10595
+ };
10596
+ }
10597
+ input.dispatch({
10598
+ type: "feedback-set",
10599
+ feedback: {
10600
+ kind: "success",
10601
+ message: getBookingSuccessMessage(input.successMessage),
10602
+ resourceName: data.appointment.resourceName
10603
+ }
10604
+ });
10605
+ return {
10606
+ ok: true,
10607
+ outcome: {
10608
+ kind: "booked",
10609
+ appointmentId: data.appointment.id,
10610
+ resourceName: data.appointment.resourceName,
10611
+ ...data.mailingListSignupNote ? { mailingListSignupNote: data.mailingListSignupNote } : {}
10612
+ }
10613
+ };
10614
+ }
10615
+ //#endregion
10666
10616
  //#region ../blocks/src/system/runtime/api/types/discounts.ts
10667
10617
  function discountAvailabilityHasDiscounts(availability) {
10668
10618
  return availability.type !== "none";
@@ -11193,6 +11143,40 @@ function clearBookingFieldError(errors, fieldId) {
11193
11143
  };
11194
11144
  }
11195
11145
  //#endregion
11146
+ //#region ../blocks/src/system/runtime/nodes/booking-form.mailing-list-state.ts
11147
+ function bookingFormDataWithEligibleOptIn(data, eligible) {
11148
+ return {
11149
+ ...data,
11150
+ mailingListOptIn: eligible && data.mailingListOptIn === true
11151
+ };
11152
+ }
11153
+ function isBookingContactEvent(event) {
11154
+ return event.type === "field-updated" || event.type === "field-touched" || event.type === "mailing-list-opt-in-set";
11155
+ }
11156
+ function applyBookingContactEvent(state, event) {
11157
+ switch (event.type) {
11158
+ case "field-updated": return {
11159
+ ...state,
11160
+ fieldValues: {
11161
+ ...state.fieldValues,
11162
+ [event.fieldId]: event.value
11163
+ },
11164
+ validationErrors: clearBookingFieldError(clearBookingFormError(state.validationErrors), event.fieldId)
11165
+ };
11166
+ case "field-touched": return {
11167
+ ...state,
11168
+ touchedFields: {
11169
+ ...state.touchedFields,
11170
+ [event.fieldId]: true
11171
+ }
11172
+ };
11173
+ case "mailing-list-opt-in-set": return {
11174
+ ...state,
11175
+ mailingListOptIn: event.checked
11176
+ };
11177
+ }
11178
+ }
11179
+ //#endregion
11196
11180
  //#region ../blocks/src/system/runtime/nodes/booking-form.field-values.ts
11197
11181
  function collectInitialBookingFieldValues(initialData) {
11198
11182
  const values = {};
@@ -11218,6 +11202,7 @@ function createInitialBookingFlowReducerState(input) {
11218
11202
  selectedDate: toOptionalString(initialData.selectedDate),
11219
11203
  selectedSlot: null,
11220
11204
  fieldValues: collectInitialBookingFieldValues(initialData),
11205
+ mailingListOptIn: initialData.mailingListOptIn === true,
11221
11206
  touchedFields: {},
11222
11207
  attemptedStepIds: {},
11223
11208
  discountCode: toOptionalString(initialData.discountCode) ?? "",
@@ -11270,6 +11255,7 @@ function applyAvailabilitySelectionInvalidation(state, invalidation) {
11270
11255
  };
11271
11256
  }
11272
11257
  function bookingFlowReducer(state, event) {
11258
+ if (isBookingContactEvent(event)) return applyBookingContactEvent(state, event);
11273
11259
  switch (event.type) {
11274
11260
  case "service-selected": return applyBookingServiceSelection(state, event.serviceId);
11275
11261
  case "resource-selected": return {
@@ -11292,21 +11278,6 @@ function bookingFlowReducer(state, event) {
11292
11278
  feedback: clearAvailabilityFeedback(state.feedback),
11293
11279
  validationErrors: clearBookingFormError(state.validationErrors)
11294
11280
  };
11295
- case "field-updated": return {
11296
- ...state,
11297
- fieldValues: {
11298
- ...state.fieldValues,
11299
- [event.fieldId]: event.value
11300
- },
11301
- validationErrors: clearBookingFieldError(clearBookingFormError(state.validationErrors), event.fieldId)
11302
- };
11303
- case "field-touched": return {
11304
- ...state,
11305
- touchedFields: {
11306
- ...state.touchedFields,
11307
- [event.fieldId]: true
11308
- }
11309
- };
11310
11281
  case "step-advance-attempted": return state.attemptedStepIds[event.stepId] ? state : {
11311
11282
  ...state,
11312
11283
  attemptedStepIds: {
@@ -11444,6 +11415,7 @@ function deriveBookingSlotDisplayOptions(input) {
11444
11415
  function toBookingFormData(state) {
11445
11416
  return {
11446
11417
  ...state.fieldValues,
11418
+ mailingListOptIn: state.mailingListOptIn,
11447
11419
  serviceId: state.selectedServiceId,
11448
11420
  resourceId: state.selectedResourceId ?? state.selectedSlot?.resourceId,
11449
11421
  selectedDate: state.selectedDate,
@@ -11706,10 +11678,7 @@ function buildBookingSubmitPlan(input) {
11706
11678
  };
11707
11679
  const prepared = prepareBookingSubmission({
11708
11680
  formId: input.formId,
11709
- data: toBookingFormData({
11710
- ...input.state,
11711
- altchaSolution: input.altchaSolution ?? input.state.altchaSolution
11712
- }),
11681
+ data: bookingFormDataWithEligibleOptIn(toBookingFormData(input.state), Boolean(input.mailingListEligible)),
11713
11682
  services: input.services,
11714
11683
  defaultServiceId: input.defaultServiceId,
11715
11684
  defaultResourceId: input.defaultResourceId,
@@ -11964,6 +11933,8 @@ function useHeadlessBookingFlow(options) {
11964
11933
  const canLoadAppointmentPackages = Boolean(options.enableAppointmentPackages && hasPortalBearerAuth && selectedService && !selectedServiceSlidingScale && (selectedService.priceAmount ?? 0) > 0);
11965
11934
  const appointmentPackagesUnavailableReason = !options.enableAppointmentPackages ? "disabled" : !selectedService || selectedServiceSlidingScale || (selectedService.priceAmount ?? 0) <= 0 ? "missing-priced-service" : !hasPortalBearerAuth ? "missing-portal-auth" : null;
11966
11935
  const data = useMemo(() => toBookingFormData(state), [state]);
11936
+ const mailingList = resolveBookingSignupOffer(options.mailingList, options.siteName);
11937
+ const mailingListEligible = mailingList !== null;
11967
11938
  const availabilityDatesQuery = useMemo(() => buildBookingAvailabilityQuery({
11968
11939
  serviceId: selectedServiceId,
11969
11940
  resourceId: selectedResourceId,
@@ -12224,7 +12195,8 @@ function useHeadlessBookingFlow(options) {
12224
12195
  viewerTimeZone: latest.viewerTimeZone,
12225
12196
  redirect: submitOptions?.redirect ?? "manual",
12226
12197
  successUrl: submitOptions?.successUrl,
12227
- cancelUrl: submitOptions?.cancelUrl
12198
+ cancelUrl: submitOptions?.cancelUrl,
12199
+ mailingListEligible
12228
12200
  });
12229
12201
  if (!plan.ok) {
12230
12202
  dispatch({
@@ -12257,37 +12229,18 @@ function useHeadlessBookingFlow(options) {
12257
12229
  message: result.error
12258
12230
  };
12259
12231
  }
12260
- if (result.data.type === "checkout_redirect") {
12261
- if (plan.redirect === "auto" && typeof window !== "undefined") latest.navigateToCheckout(result.data.checkoutUrl);
12262
- return {
12263
- ok: true,
12264
- outcome: {
12265
- kind: "checkout_redirect",
12266
- checkoutUrl: result.data.checkoutUrl
12267
- }
12268
- };
12269
- }
12270
- dispatch({
12271
- type: "feedback-set",
12272
- feedback: {
12273
- kind: "success",
12274
- message: getBookingSuccessMessage(latest.successMessage),
12275
- resourceName: result.data.appointment.resourceName
12276
- }
12232
+ return completeBookingSubmission({
12233
+ data: result.data,
12234
+ redirect: plan.redirect,
12235
+ successMessage: latest.successMessage,
12236
+ navigateToCheckout: latest.navigateToCheckout,
12237
+ dispatch
12277
12238
  });
12278
- return {
12279
- ok: true,
12280
- outcome: {
12281
- kind: "booked",
12282
- appointmentId: result.data.appointment.id,
12283
- resourceName: result.data.appointment.resourceName
12284
- }
12285
- };
12286
12239
  } finally {
12287
12240
  submittingRef.current = false;
12288
12241
  dispatch({ type: "submission-finished" });
12289
12242
  }
12290
- }, [latestRef]);
12243
+ }, [latestRef, mailingListEligible]);
12291
12244
  const actions = useMemo(() => ({
12292
12245
  selectService: (serviceId) => dispatch({
12293
12246
  type: "service-selected",
@@ -12310,6 +12263,10 @@ function useHeadlessBookingFlow(options) {
12310
12263
  fieldId: unsafeAsBookingFieldId(fieldId),
12311
12264
  value
12312
12265
  }),
12266
+ setMailingListOptIn: (checked) => dispatch({
12267
+ type: "mailing-list-opt-in-set",
12268
+ checked
12269
+ }),
12313
12270
  markFieldTouched: (fieldId) => dispatch({
12314
12271
  type: "field-touched",
12315
12272
  fieldId: unsafeAsBookingFieldId(fieldId)
@@ -12468,6 +12425,8 @@ function useHeadlessBookingFlow(options) {
12468
12425
  appointmentPackages: appointmentPackagesModel
12469
12426
  };
12470
12427
  return {
12428
+ mailingList,
12429
+ mailingListOptIn: state.mailingListOptIn,
12471
12430
  status,
12472
12431
  view,
12473
12432
  steps: stepState.steps,
@@ -12932,7 +12891,7 @@ function ThemedButton({ variant, size, extraClassName, screenReaderSuffix, label
12932
12891
  }
12933
12892
  //#endregion
12934
12893
  //#region ../blocks/src/system/runtime/shared/components/FeedbackMessage.tsx
12935
- function joinClasses(...parts) {
12894
+ function joinClasses$1(...parts) {
12936
12895
  return parts.filter((part) => typeof part === "string" && part.length > 0).join(" ");
12937
12896
  }
12938
12897
  /**
@@ -12951,17 +12910,17 @@ function FeedbackMessage({ tone, treatment = "panel", children, className, id, t
12951
12910
  const shouldWrapBody = Boolean(title || bodyClassName) || treatment === "field-note";
12952
12911
  return /* @__PURE__ */ jsxs("div", {
12953
12912
  id,
12954
- className: joinClasses(className, treatmentClass(treatment)) || void 0,
12913
+ className: joinClasses$1(className, treatmentClass(treatment)) || void 0,
12955
12914
  "data-feedback-tone": tone,
12956
12915
  "data-feedback-treatment": treatment,
12957
12916
  role,
12958
12917
  "aria-live": resolvedLive === "off" ? void 0 : resolvedLive,
12959
12918
  children: [title ? /* @__PURE__ */ jsx("p", {
12960
- className: joinClasses(titleClassName),
12919
+ className: joinClasses$1(titleClassName),
12961
12920
  "data-feedback-title": true,
12962
12921
  children: title
12963
12922
  }) : null, shouldWrapBody ? /* @__PURE__ */ jsx("div", {
12964
- className: joinClasses(bodyClassName),
12923
+ className: joinClasses$1(bodyClassName),
12965
12924
  "data-feedback-body": true,
12966
12925
  children
12967
12926
  }) : children]
@@ -13143,6 +13102,23 @@ const TimeSlotSelector = ({ value, onChange, slots, isLoading, timezone, require
13143
13102
  });
13144
13103
  };
13145
13104
  //#endregion
13105
+ //#region ../blocks/src/system/runtime/shared/components/CheckIcon.tsx
13106
+ function CheckIcon({ className, strokeWidth = 2 }) {
13107
+ return /* @__PURE__ */ jsx("svg", {
13108
+ fill: "none",
13109
+ strokeLinecap: "round",
13110
+ strokeLinejoin: "round",
13111
+ strokeWidth,
13112
+ viewBox: "0 0 24 24",
13113
+ stroke: "currentColor",
13114
+ className,
13115
+ width: "1em",
13116
+ height: "1em",
13117
+ "aria-hidden": "true",
13118
+ children: /* @__PURE__ */ jsx("path", { d: "M5 13l4 4L19 7" })
13119
+ });
13120
+ }
13121
+ //#endregion
13146
13122
  //#region ../blocks/src/system/runtime/shared/components/StepIndicator.tsx
13147
13123
  /**
13148
13124
  * Shared step indicator component for registration wizards.
@@ -14106,6 +14082,45 @@ function BookingConsentAgreement({ agreement, showTitle = true, title, titleId }
14106
14082
  })] });
14107
14083
  }
14108
14084
  //#endregion
14085
+ //#region ../blocks/src/system/runtime/shared/components/CheckboxChoice.tsx
14086
+ /**
14087
+ * The customer-facing checkbox every block renders. Styling comes from the
14088
+ * theme's input CSS (`.form-check`, `.form-checkbox`), so it follows each
14089
+ * site's input colours, borders and corners.
14090
+ */
14091
+ function CheckboxChoice({ label, presentation = "row", className, ...inputProps }) {
14092
+ return /* @__PURE__ */ jsxs("label", {
14093
+ className: clsx("form-check", presentation === "tile" && "form-check--tile", className),
14094
+ children: [/* @__PURE__ */ jsx("input", {
14095
+ ...inputProps,
14096
+ type: "checkbox",
14097
+ className: "form-checkbox"
14098
+ }), /* @__PURE__ */ jsx("span", {
14099
+ className: "form-check-label",
14100
+ children: label
14101
+ })]
14102
+ });
14103
+ }
14104
+ //#endregion
14105
+ //#region ../blocks/src/system/runtime/nodes/booking-form.mailing-list-choice.tsx
14106
+ function BookingMailingListChoice({ booking }) {
14107
+ const id = React.useId();
14108
+ if (!booking.mailingList) return null;
14109
+ return /* @__PURE__ */ jsxs("div", {
14110
+ className: "rb-space-y-2",
14111
+ children: [/* @__PURE__ */ jsx(CheckboxChoice, {
14112
+ id,
14113
+ name: "mailingListOptIn",
14114
+ checked: booking.mailingListOptIn,
14115
+ onChange: (event) => booking.actions.setMailingListOptIn(event.target.checked),
14116
+ label: `Email me news and updates from ${booking.mailingList.siteName}.`
14117
+ }), /* @__PURE__ */ jsx("p", {
14118
+ className: "rb-caption status-muted",
14119
+ children: "Optional. You can unsubscribe at any time."
14120
+ })]
14121
+ });
14122
+ }
14123
+ //#endregion
14109
14124
  //#region ../blocks/src/system/runtime/nodes/booking-form.service-choices.tsx
14110
14125
  function optionCardClassName(isSelected) {
14111
14126
  return `rb-option-card${isSelected ? " rb-option-card--selected" : ""}`;
@@ -14585,12 +14600,17 @@ function PaymentOptionContent({ description, helperText, id, summaryRows, title
14585
14600
  });
14586
14601
  }
14587
14602
  function DefaultDynamicFields({ booking, fields }) {
14603
+ const lastContactIndex = fields.reduce((last, field, index) => [
14604
+ "name",
14605
+ "email",
14606
+ "phone"
14607
+ ].includes(field.id) ? index : last, -1);
14588
14608
  return /* @__PURE__ */ jsx("div", {
14589
14609
  className: "rb-space-y-6",
14590
- children: fields.map((field) => /* @__PURE__ */ jsx(DefaultDynamicField, {
14610
+ children: fields.map((field, index) => /* @__PURE__ */ jsxs(React.Fragment, { children: [/* @__PURE__ */ jsx(DefaultDynamicField, {
14591
14611
  booking,
14592
14612
  field
14593
- }, field.id))
14613
+ }), index === lastContactIndex && booking.mailingList ? /* @__PURE__ */ jsx(BookingMailingListChoice, { booking }) : null] }, field.id))
14594
14614
  });
14595
14615
  }
14596
14616
  function DefaultDynamicField({ booking, field }) {
@@ -14691,7 +14711,7 @@ function DefaultFieldInput({ describedBy, error, errorId, field, onBlur, onChang
14691
14711
  case "radio": return /* @__PURE__ */ jsx("div", {
14692
14712
  className: "rb-space-y-2",
14693
14713
  children: field.field.options?.map((option) => /* @__PURE__ */ jsxs("label", {
14694
- className: "rb-flex rb-items-center rb-gap-2 rb-cursor-pointer",
14714
+ className: "form-check",
14695
14715
  children: [/* @__PURE__ */ jsx("input", {
14696
14716
  type: "radio",
14697
14717
  name: field.id,
@@ -14703,7 +14723,7 @@ function DefaultFieldInput({ describedBy, error, errorId, field, onBlur, onChang
14703
14723
  ...validationProps,
14704
14724
  className: "form-radio"
14705
14725
  }), /* @__PURE__ */ jsx("span", {
14706
- className: "rb-caption",
14726
+ className: "form-check-label",
14707
14727
  children: option.label
14708
14728
  })]
14709
14729
  }, option.value))
@@ -14713,47 +14733,20 @@ function DefaultFieldInput({ describedBy, error, errorId, field, onBlur, onChang
14713
14733
  const checkedValues = toStringArray(value);
14714
14734
  return /* @__PURE__ */ jsx("div", {
14715
14735
  className: "rb-space-y-2",
14716
- children: field.field.options.map((option) => /* @__PURE__ */ jsxs("label", {
14717
- className: "rb-flex rb-items-center rb-gap-2 rb-cursor-pointer",
14718
- children: [/* @__PURE__ */ jsx("input", {
14719
- type: "checkbox",
14720
- name: field.id,
14721
- value: option.value,
14722
- checked: checkedValues.includes(option.value),
14723
- onChange: (event) => {
14724
- onChange(event.target.checked ? [...checkedValues, option.value] : checkedValues.filter((item) => item !== option.value));
14725
- },
14726
- onBlur,
14727
- ...validationProps,
14728
- className: "form-checkbox"
14729
- }), /* @__PURE__ */ jsx("span", {
14730
- className: "rb-caption",
14731
- children: option.label
14732
- })]
14736
+ children: field.field.options.map((option) => /* @__PURE__ */ jsx(CheckboxChoice, {
14737
+ name: field.id,
14738
+ value: option.value,
14739
+ checked: checkedValues.includes(option.value),
14740
+ onChange: (event) => {
14741
+ onChange(event.target.checked ? [...checkedValues, option.value] : checkedValues.filter((item) => item !== option.value));
14742
+ },
14743
+ onBlur,
14744
+ ...validationProps,
14745
+ label: option.label
14733
14746
  }, option.value))
14734
14747
  });
14735
14748
  }
14736
- return /* @__PURE__ */ jsxs("label", {
14737
- className: "rb-flex rb-items-center rb-gap-2 rb-cursor-pointer",
14738
- children: [/* @__PURE__ */ jsx("input", {
14739
- type: "checkbox",
14740
- id: field.inputId,
14741
- name: field.id,
14742
- checked: Boolean(value),
14743
- onChange: (event) => onChange(event.target.checked),
14744
- onBlur,
14745
- required: field.required,
14746
- ...validationProps,
14747
- className: "form-checkbox"
14748
- }), /* @__PURE__ */ jsx("span", {
14749
- className: "rb-caption",
14750
- children: field.field.placeholder || field.label
14751
- })]
14752
- });
14753
- case "booking_requirement_consent": return /* @__PURE__ */ jsxs("label", {
14754
- className: "rb-flex rb-items-start rb-gap-2 rb-cursor-pointer",
14755
- children: [/* @__PURE__ */ jsx("input", {
14756
- type: "checkbox",
14749
+ return /* @__PURE__ */ jsx(CheckboxChoice, {
14757
14750
  id: field.inputId,
14758
14751
  name: field.id,
14759
14752
  checked: Boolean(value),
@@ -14761,11 +14754,18 @@ function DefaultFieldInput({ describedBy, error, errorId, field, onBlur, onChang
14761
14754
  onBlur,
14762
14755
  required: field.required,
14763
14756
  ...validationProps,
14764
- className: "form-checkbox rb-mt-0.5"
14765
- }), /* @__PURE__ */ jsx("span", {
14766
- className: "rb-caption",
14767
- children: field.field.checkboxLabel
14768
- })]
14757
+ label: field.field.placeholder || field.label
14758
+ });
14759
+ case "booking_requirement_consent": return /* @__PURE__ */ jsx(CheckboxChoice, {
14760
+ id: field.inputId,
14761
+ name: field.id,
14762
+ checked: Boolean(value),
14763
+ onChange: (event) => onChange(event.target.checked),
14764
+ onBlur,
14765
+ required: field.required,
14766
+ ...validationProps,
14767
+ label: field.field.checkboxLabel,
14768
+ presentation: "tile"
14769
14769
  });
14770
14770
  case "number": return /* @__PURE__ */ jsx("input", {
14771
14771
  ...commonProps,
@@ -14946,9 +14946,169 @@ function consumeSearchParams(paramNames) {
14946
14946
  return values;
14947
14947
  }
14948
14948
  //#endregion
14949
+ //#region ../blocks/src/system/runtime/shared/components/StateIcon.tsx
14950
+ /**
14951
+ * Circular icon wrapper for terminal state screens (success, error, waitlist, etc.).
14952
+ *
14953
+ * Layout is provided by shared `rb-state-icon` CSS; color variants are
14954
+ * block-scoped by the owning registration surface.
14955
+ */
14956
+ function StateIcon({ variant, children }) {
14957
+ return /* @__PURE__ */ jsx("div", {
14958
+ className: `rb-state-icon rb-state-icon--${variant}`,
14959
+ "aria-hidden": "true",
14960
+ children
14961
+ });
14962
+ }
14963
+ //#endregion
14964
+ //#region ../blocks/src/system/runtime/shared/components/TerminalPanel.tsx
14965
+ function joinClasses(...parts) {
14966
+ return parts.filter((part) => typeof part === "string" && part.length > 0).join(" ");
14967
+ }
14968
+ function TerminalPanel({ tone, title, titleAs: Title = "h3", body, secondaryBody, icon, actions, className, titleClassName, bodyClassName, secondaryBodyClassName, iconClassName, actionsClassName, role, live }) {
14969
+ const resolvedRole = role ?? (tone === "error" ? "alert" : "status");
14970
+ const resolvedLive = live ?? (resolvedRole === "alert" ? "assertive" : "polite");
14971
+ return /* @__PURE__ */ jsxs("div", {
14972
+ className,
14973
+ "data-terminal-panel": true,
14974
+ "data-terminal-tone": tone,
14975
+ role: resolvedRole,
14976
+ "aria-live": resolvedLive === "off" ? void 0 : resolvedLive,
14977
+ children: [
14978
+ icon ? /* @__PURE__ */ jsx("div", {
14979
+ className: joinClasses(iconClassName),
14980
+ "data-terminal-icon": true,
14981
+ children: icon
14982
+ }) : null,
14983
+ /* @__PURE__ */ jsx(Title, {
14984
+ className: joinClasses(titleClassName),
14985
+ "data-terminal-title": true,
14986
+ children: title
14987
+ }),
14988
+ body ? /* @__PURE__ */ jsx("div", {
14989
+ className: joinClasses(bodyClassName),
14990
+ "data-terminal-body": true,
14991
+ children: body
14992
+ }) : null,
14993
+ actions ? /* @__PURE__ */ jsx("div", {
14994
+ className: joinClasses(actionsClassName),
14995
+ "data-terminal-actions": true,
14996
+ children: actions
14997
+ }) : null,
14998
+ secondaryBody ? /* @__PURE__ */ jsx("div", {
14999
+ className: joinClasses(secondaryBodyClassName),
15000
+ "data-terminal-secondary-body": true,
15001
+ children: secondaryBody
15002
+ }) : null
15003
+ ]
15004
+ });
15005
+ }
15006
+ //#endregion
15007
+ //#region ../blocks/src/system/runtime/components/booking/SuccessMessage.tsx
15008
+ const SuccessMessage = ({ message, resourceName, className }) => {
15009
+ return /* @__PURE__ */ jsx(TerminalPanel, {
15010
+ tone: "success",
15011
+ title: "Booking confirmed",
15012
+ icon: /* @__PURE__ */ jsx(StateIcon, {
15013
+ variant: "success",
15014
+ children: /* @__PURE__ */ jsx(CheckIcon, { strokeWidth: 3 })
15015
+ }),
15016
+ body: /* @__PURE__ */ jsx("p", {
15017
+ className: "ab-text",
15018
+ children: message
15019
+ }),
15020
+ secondaryBody: resourceName ? /* @__PURE__ */ jsxs("p", {
15021
+ className: "ab-text rb-on-surface--muted",
15022
+ children: ["Practitioner: ", resourceName]
15023
+ }) : null,
15024
+ className: ["ab-center", className ?? ""].join(" ").trim(),
15025
+ titleClassName: "ab-terminal-title",
15026
+ role: "alert",
15027
+ live: "polite"
15028
+ });
15029
+ };
15030
+ //#endregion
15031
+ //#region ../blocks/src/system/runtime/shared/mailingListSignupCopy.ts
15032
+ const MAILING_LIST_CONFIRMATION_MESSAGE = "Please check your inbox to confirm your signup.";
15033
+ function getBookingMailingListNoteCopy(note, context) {
15034
+ if (note === "confirmation_required") return {
15035
+ title: MAILING_LIST_CONFIRMATION_MESSAGE,
15036
+ detail: context === "booking" ? "This is separate from your booking confirmation." : null
15037
+ };
15038
+ return {
15039
+ title: "We couldn’t confirm your mailing-list signup.",
15040
+ detail: context === "booking" ? "This does not affect your booking." : null
15041
+ };
15042
+ }
15043
+ //#endregion
15044
+ //#region ../blocks/src/system/runtime/shared/components/BookingMailingListNote.tsx
15045
+ function BookingMailingListNote(props) {
15046
+ const copy = getBookingMailingListNoteCopy(props.note, props.context);
15047
+ return /* @__PURE__ */ jsxs("div", {
15048
+ role: "status",
15049
+ className: props.className,
15050
+ children: [/* @__PURE__ */ jsx("p", { children: copy.title }), copy.detail ? /* @__PURE__ */ jsx("p", { children: copy.detail }) : null]
15051
+ });
15052
+ }
15053
+ //#endregion
15054
+ //#region ../blocks/src/system/runtime/nodes/booking-form.mailing-list-note.ts
15055
+ function storageKey(sessionId) {
15056
+ return `riverbank:booking:mailing-list:${sessionId}`;
15057
+ }
15058
+ function saveAppointmentMailingListNote(sessionId, note) {
15059
+ if (!note) return;
15060
+ try {
15061
+ window.sessionStorage.setItem(storageKey(sessionId), note);
15062
+ } catch {}
15063
+ }
15064
+ function readAppointmentMailingListNote(sessionId) {
15065
+ try {
15066
+ const stored = window.sessionStorage.getItem(storageKey(sessionId));
15067
+ return stored === "confirmation_required" || stored === "not_confirmed" ? stored : null;
15068
+ } catch {
15069
+ return null;
15070
+ }
15071
+ }
15072
+ //#endregion
15073
+ //#region ../blocks/src/system/runtime/nodes/booking-form.completion.tsx
15074
+ function BookingFormCompletion({ resourceName, successMessage, redirectState, localNote }) {
15075
+ const note = redirectState.kind === "success" ? readAppointmentMailingListNote(redirectState.sessionId) : localNote;
15076
+ return /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx(SuccessMessage, {
15077
+ message: getBookingSuccessMessage(successMessage),
15078
+ resourceName
15079
+ }), note ? /* @__PURE__ */ jsx(BookingMailingListNote, {
15080
+ note,
15081
+ context: "booking",
15082
+ className: "rb-mt-4"
15083
+ }) : null] });
15084
+ }
15085
+ //#endregion
15086
+ //#region ../blocks/src/system/runtime/nodes/booking-form.submit-handler.ts
15087
+ function appendRebookFlag(url, enabled) {
15088
+ if (!enabled) return url;
15089
+ const nextUrl = new URL(url);
15090
+ nextUrl.searchParams.set("rebook", "1");
15091
+ return nextUrl.toString();
15092
+ }
15093
+ function createBookingFormSubmitHandler(input) {
15094
+ return async () => {
15095
+ const { successUrl, cancelUrl } = buildCheckoutReturnUrls("booking", input.bookingAnchorId);
15096
+ const result = await input.booking.actions.submit({
15097
+ redirect: "manual",
15098
+ successUrl: appendRebookFlag(successUrl, input.isPortalRebook),
15099
+ cancelUrl: appendRebookFlag(cancelUrl, input.isPortalRebook)
15100
+ });
15101
+ if (!result.ok) return;
15102
+ if (result.outcome.kind === "checkout_redirect") {
15103
+ saveAppointmentMailingListNote(result.outcome.sessionId, result.outcome.mailingListSignupNote);
15104
+ window.location.href = result.outcome.checkoutUrl;
15105
+ return;
15106
+ }
15107
+ input.setLocalMailingListNote(result.outcome.mailingListSignupNote ?? null);
15108
+ };
15109
+ }
15110
+ //#endregion
14949
15111
  //#region ../blocks/src/system/runtime/nodes/booking-form.client.tsx
14950
- const PORTAL_REBOOK_QUERY_PARAM = "rebook";
14951
- const PORTAL_REBOOK_QUERY_VALUE = "1";
14952
15112
  const REBOOK_COMPLETION_MODE_VERIFIED_CHECKOUT = "verified_checkout";
14953
15113
  const REBOOK_COMPLETION_MODE_BYPASSED = "bypassed";
14954
15114
  function getBookingRedirectLocationSnapshot() {
@@ -14961,12 +15121,6 @@ function getBookingRedirectLocationSnapshot() {
14961
15121
  hash: window.location.hash
14962
15122
  };
14963
15123
  }
14964
- function appendRebookFlag(url, enabled) {
14965
- if (!enabled) return url;
14966
- const nextUrl = new URL(url);
14967
- nextUrl.searchParams.set(PORTAL_REBOOK_QUERY_PARAM, PORTAL_REBOOK_QUERY_VALUE);
14968
- return nextUrl.toString();
14969
- }
14970
15124
  /**
14971
15125
  * Themed surface container for every booking view state (wizard, success,
14972
15126
  * verifying). Styled by the shared registration-surface layer.
@@ -14989,12 +15143,16 @@ const BookingFormClient$1 = ({ siteId: siteIdProp, render }) => {
14989
15143
  const isPortalRebook = render.hydration.rebookContext?.kind === "portal_rebook";
14990
15144
  const hasLoggedRebookCompletionRef = useRef(false);
14991
15145
  const [redirectState] = useState(() => getBookingRedirectStateFromLocation(getBookingRedirectLocationSnapshot()));
15146
+ const [localMailingListNote, setLocalMailingListNote] = useState(null);
14992
15147
  const showSpamProtection = render.hydration.spamProtectionEnabled ?? isSpamProtectionEnabled();
14993
15148
  const api = useBlockApi();
14994
15149
  const hasPortalAuth = api.config.auth.type === "bearer" || api.config.authOverrides?.portal?.type === "bearer";
15150
+ const formId = render.hydration.formId ?? form?.id ?? "booking-form";
14995
15151
  const booking = useHeadlessBookingFlow({
15152
+ mailingList: render.hydration.mailingList,
15153
+ siteName: render.hydration.siteName,
14996
15154
  siteId,
14997
- formId: render.hydration.formId ?? form?.id ?? "booking-form",
15155
+ formId,
14998
15156
  form,
14999
15157
  services,
15000
15158
  serviceCategories: render.hydration.serviceCategories,
@@ -15064,22 +15222,20 @@ const BookingFormClient$1 = ({ siteId: siteIdProp, render }) => {
15064
15222
  children: render.display.message ?? "Booking form not found. Please check your configuration."
15065
15223
  })
15066
15224
  });
15067
- const handleComplete = async () => {
15068
- const { successUrl, cancelUrl } = buildCheckoutReturnUrls("booking", bookingAnchorId);
15069
- const result = await booking.actions.submit({
15070
- redirect: "manual",
15071
- successUrl: appendRebookFlag(successUrl, isPortalRebook),
15072
- cancelUrl: appendRebookFlag(cancelUrl, isPortalRebook)
15073
- });
15074
- if (!result.ok) return;
15075
- if (result.outcome.kind === "checkout_redirect") window.location.href = result.outcome.checkoutUrl;
15076
- };
15225
+ const handleComplete = createBookingFormSubmitHandler({
15226
+ booking,
15227
+ bookingAnchorId,
15228
+ isPortalRebook,
15229
+ setLocalMailingListNote
15230
+ });
15077
15231
  if (viewState.kind === "success") return /* @__PURE__ */ jsx(BookingSurface, {
15078
15232
  id: bookingAnchorId,
15079
15233
  className: render.display.className,
15080
- children: /* @__PURE__ */ jsx(SuccessMessage, {
15081
- message: getBookingSuccessMessage(render.display.successMessage),
15082
- resourceName: viewState.resourceName
15234
+ children: /* @__PURE__ */ jsx(BookingFormCompletion, {
15235
+ successMessage: render.display.successMessage,
15236
+ resourceName: viewState.resourceName,
15237
+ redirectState,
15238
+ localNote: localMailingListNote
15083
15239
  })
15084
15240
  });
15085
15241
  if (viewState.kind === "verifying") return /* @__PURE__ */ jsx(BookingSurface, {
@@ -15188,7 +15344,8 @@ function createInitialRegistrationFormData() {
15188
15344
  email: "",
15189
15345
  phone: "",
15190
15346
  notes: "",
15191
- consentAccepted: false
15347
+ consentAccepted: false,
15348
+ mailingListOptIn: false
15192
15349
  };
15193
15350
  }
15194
15351
  function validateFormData(formData, requiresConsent = false) {
@@ -16312,7 +16469,10 @@ async function handleCheckoutReturn(options, deps, returnContextRef) {
16312
16469
  }
16313
16470
  const { checkoutAttemptId } = command;
16314
16471
  const pending = deps.getPendingRegistration(siteId, checkoutAttemptId);
16315
- returnContextRef.current = { checkoutAttemptId };
16472
+ returnContextRef.current = {
16473
+ checkoutAttemptId,
16474
+ mailingListSignupNote: pending?.mailingListSignupNote
16475
+ };
16316
16476
  if (pending) restorePendingPresentation(options, pending);
16317
16477
  options.setStep("verifying-payment");
16318
16478
  try {
@@ -16333,7 +16493,10 @@ function completeVerifiedRegistration(options, deps, returnContext) {
16333
16493
  const siteId = options.api.config.siteId;
16334
16494
  const checkoutAttemptId = returnContext?.checkoutAttemptId;
16335
16495
  if (siteId && checkoutAttemptId) deps.clearPendingRegistration(siteId, checkoutAttemptId);
16336
- options.setRegistrationResult({ status: "confirmed" });
16496
+ options.setRegistrationResult({
16497
+ status: "confirmed",
16498
+ mailingListSignupNote: returnContext?.mailingListSignupNote
16499
+ });
16337
16500
  options.setStep("success");
16338
16501
  }
16339
16502
  function useEventRegistrationStripeReturnWithDeps(options, deps) {
@@ -16406,6 +16569,9 @@ function registrationErrorPresentation(error) {
16406
16569
  }
16407
16570
  //#endregion
16408
16571
  //#region ../blocks/src/system/runtime/nodes/event-registration/useEventRegistrationSubmit.ts
16572
+ function wantsMailingListSignup(options) {
16573
+ return options.mailingListSignup !== null && options.formData.mailingListOptIn === true;
16574
+ }
16409
16575
  function createClientCommandId(cryptoSource = {
16410
16576
  randomUUID: globalThis.crypto.randomUUID?.bind(globalThis.crypto),
16411
16577
  getRandomValues: (bytes) => globalThis.crypto.getRandomValues(bytes)
@@ -16503,7 +16669,8 @@ async function completeRegistrationSubmission(options, deps, prepared, result, s
16503
16669
  case "paymentStatusRequired":
16504
16670
  options.setPaymentStatusRecovery({
16505
16671
  kind: "ready",
16506
- subject: result.subject
16672
+ subject: result.subject,
16673
+ mailingListSignupNote: result.mailingListSignupNote
16507
16674
  });
16508
16675
  options.setStep("payment-status");
16509
16676
  return {
@@ -16512,14 +16679,15 @@ async function completeRegistrationSubmission(options, deps, prepared, result, s
16512
16679
  };
16513
16680
  case "checkoutRequired":
16514
16681
  options.setPendingRegistrationReference(result.reference);
16515
- savePendingCheckout(options, deps, prepared, result.submissionId, result.reference);
16682
+ savePendingCheckout(options, deps, prepared, result.submissionId, result.reference, result.mailingListSignupNote);
16516
16683
  options.setStep("redirecting");
16517
16684
  return redirectToCheckout(result.checkoutUrl, submitOptions);
16518
16685
  case "waitlisted":
16519
16686
  options.setRegistrationResult({
16520
16687
  status: "waitlist",
16521
16688
  title: "Added to waitlist",
16522
- message: result.waitlist.message
16689
+ message: result.waitlist.message,
16690
+ mailingListSignupNote: result.mailingListSignupNote
16523
16691
  });
16524
16692
  break;
16525
16693
  case "bookingComplete":
@@ -16527,7 +16695,8 @@ async function completeRegistrationSubmission(options, deps, prepared, result, s
16527
16695
  options.setPendingRegistrationReference(result.reference);
16528
16696
  options.setRegistrationResult({
16529
16697
  status: "confirmed",
16530
- message: result.summary.paymentMethod === "pass" ? result.summary.message : void 0
16698
+ message: result.summary.paymentMethod === "pass" ? result.summary.message : void 0,
16699
+ mailingListSignupNote: result.mailingListSignupNote
16531
16700
  });
16532
16701
  break;
16533
16702
  }
@@ -16586,7 +16755,7 @@ function resolveSelectionSnapshot(method, passId, membershipId, bundleProductId,
16586
16755
  if (method === "free") return { method };
16587
16756
  throw new Error("Choose an available payment option.");
16588
16757
  }
16589
- function savePendingCheckout(options, deps, prepared, checkoutAttemptId, reference) {
16758
+ function savePendingCheckout(options, deps, prepared, checkoutAttemptId, reference, mailingListSignupNote) {
16590
16759
  const siteId = options.api.config.siteId;
16591
16760
  if (!siteId) return;
16592
16761
  deps.savePendingRegistration(siteId, checkoutAttemptId, {
@@ -16595,7 +16764,8 @@ function savePendingCheckout(options, deps, prepared, checkoutAttemptId, referen
16595
16764
  ticketSelections: prepared.ticketSelections,
16596
16765
  selectedEventId: options.registrationTarget?.selectedEventId ?? null,
16597
16766
  selectedAttendanceMode: options.selectedAttendanceMode,
16598
- paymentSelection: prepared.selectionSnapshot
16767
+ paymentSelection: prepared.selectionSnapshot,
16768
+ mailingListSignupNote
16599
16769
  });
16600
16770
  }
16601
16771
  function redirectToCheckout(checkoutUrl, submitOptions) {
@@ -16609,7 +16779,7 @@ function redirectToCheckout(checkoutUrl, submitOptions) {
16609
16779
  };
16610
16780
  }
16611
16781
  function registrationRequestIntentKey(request) {
16612
- const { registrationCommandId: _command, altchaSolution: _proof, checkout, ...intent } = request;
16782
+ const { registrationCommandId: _command, altchaSolution: _proof, mailingListOptIn: _marketingConsent, checkout, ...intent } = request;
16613
16783
  return JSON.stringify({
16614
16784
  ...intent,
16615
16785
  checkout: checkout ? {
@@ -16634,6 +16804,7 @@ function buildRegistrationRequest(options, prepared, method, passId, membershipI
16634
16804
  phone: options.formData.phone.trim() || void 0,
16635
16805
  notes: options.formData.notes.trim() || void 0,
16636
16806
  consentAccepted: options.formData.consentAccepted,
16807
+ mailingListOptIn: wantsMailingListSignup(options),
16637
16808
  altchaSolution: options.altchaSolution,
16638
16809
  paymentMethod: method,
16639
16810
  customerPassId: method === "pass" ? passId : void 0,
@@ -17627,13 +17798,17 @@ function isCheckableRecovery(state) {
17627
17798
  function assistanceRequired(recovery) {
17628
17799
  return {
17629
17800
  kind: "assistanceRequired",
17630
- subject: recovery.subject
17801
+ subject: recovery.subject,
17802
+ mailingListSignupNote: recovery.mailingListSignupNote
17631
17803
  };
17632
17804
  }
17633
17805
  function applyStatusOutcome(outcome, recovery, setters, setRecovery) {
17634
17806
  if (outcome.kind === "resolved") {
17635
17807
  setters.setPendingRegistrationReference(outcome.reference);
17636
- setters.setRegistrationResult({ status: "confirmed" });
17808
+ setters.setRegistrationResult({
17809
+ status: "confirmed",
17810
+ mailingListSignupNote: recovery.mailingListSignupNote
17811
+ });
17637
17812
  setRecovery(null);
17638
17813
  setters.setStep("success");
17639
17814
  return;
@@ -17762,6 +17937,7 @@ function useEventRegistrationWizardWithDeps(options, deps) {
17762
17937
  const paymentSelection = flowState.paymentSelection;
17763
17938
  const [selectedEvent, setSelectedEvent] = useState(preSelectedEvent ?? null);
17764
17939
  const [formData, setFormData] = useState(createInitialRegistrationFormData);
17940
+ const mailingListSignup = resolveBookingSignupOffer(options.mailingList, options.siteName);
17765
17941
  const [errors, setErrors] = useState({});
17766
17942
  const [guests, setGuests] = useState([]);
17767
17943
  const [guestErrors, setGuestErrors] = useState({});
@@ -18208,6 +18384,7 @@ function useEventRegistrationWizardWithDeps(options, deps) {
18208
18384
  ticketSelections,
18209
18385
  selectedSlidingAmount,
18210
18386
  formData,
18387
+ mailingListSignup,
18211
18388
  altchaSolution,
18212
18389
  requireGuestDetails,
18213
18390
  guests,
@@ -18304,6 +18481,7 @@ function useEventRegistrationWizardWithDeps(options, deps) {
18304
18481
  hasValidTicketSelection,
18305
18482
  eventRequiresPayment,
18306
18483
  formData,
18484
+ mailingListSignup,
18307
18485
  setFormData,
18308
18486
  errors,
18309
18487
  guests,
@@ -18515,7 +18693,8 @@ function useEventRegistrationControllerWithDeps(options, deps) {
18515
18693
  },
18516
18694
  attendee: {
18517
18695
  values: wizard.formData,
18518
- errors: wizard.errors
18696
+ errors: wizard.errors,
18697
+ mailingListSignup: wizard.mailingListSignup
18519
18698
  },
18520
18699
  guests: {
18521
18700
  required: wizard.requireGuestDetails,
@@ -18613,7 +18792,9 @@ function useEventRegistrationWizardControllerWithDeps(options, deps) {
18613
18792
  occurrenceContext: options.occurrenceContext ?? null,
18614
18793
  subject: options.subject ?? null,
18615
18794
  events: [...options.events ?? []],
18616
- maxTicketsNum
18795
+ maxTicketsNum,
18796
+ mailingList: options.mailingList,
18797
+ siteName: options.siteName
18617
18798
  }) };
18618
18799
  }
18619
18800
  function resolveExistingRegistrationState(wizard) {