@riverbankcms/sdk 0.143.0 → 0.145.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/dist/{PreviewEditorSidebar-DROGfMKi.mjs → PreviewEditorSidebar-O-V6Pl5a.mjs} +20 -26
  2. package/dist/{PreviewEditorUI-BaRjhFu-.mjs → PreviewEditorUI-1UlX_9cw.mjs} +3 -3
  3. package/dist/{PreviewQueryProvider-BCYICImX.mjs → PreviewQueryProvider-BxGwdOCV.mjs} +1 -1
  4. package/dist/{SdkPreviewModeRuntime-OIABYLES.mjs → SdkPreviewModeRuntime-DYbA_4iv.mjs} +431 -351
  5. package/dist/{SiteChromeCustomizeContext-ohjTvZbc.mjs → SiteChromeCustomizeContext-CNTKQ9nx.mjs} +3989 -2769
  6. package/dist/_dts/ai/src/contracts/proposals.d.ts +4719 -66
  7. package/dist/_dts/ai/src/contracts/siteStyleProposalSchemas.d.ts +429 -6
  8. package/dist/_dts/api/src/appointmentEndpointDefinitions.d.ts +49 -0
  9. package/dist/_dts/api/src/appointmentServiceCategoryEndpoints.d.ts +75 -0
  10. package/dist/_dts/api/src/appointmentServiceContracts.d.ts +80 -0
  11. package/dist/_dts/api/src/appointmentSetup.d.ts +8 -1
  12. package/dist/_dts/api/src/billing.d.ts +1 -1
  13. package/dist/_dts/api/src/billingEndpointTypes.d.ts +8 -2
  14. package/dist/_dts/api/src/bookingConfig.d.ts +3 -1
  15. package/dist/_dts/api/src/bookingManagementEndpoints.d.ts +2 -12
  16. package/dist/_dts/api/src/communications.d.ts +14 -22
  17. package/dist/_dts/api/src/contentRuntime.d.ts +2 -0
  18. package/dist/_dts/api/src/endpoints.d.ts +105 -58
  19. package/dist/_dts/api/src/index.d.ts +1 -1
  20. package/dist/_dts/api/src/indexExtendedTypes.d.ts +1 -1
  21. package/dist/_dts/api/src/launchReadiness.d.ts +2 -0
  22. package/dist/_dts/api/src/navigation/dashboardBookingsNav.d.ts +4 -4
  23. package/dist/_dts/api/src/newsletterEndpointDefinitions.d.ts +0 -23
  24. package/dist/_dts/api/src/onboarding/confirmationResend.d.ts +3 -0
  25. package/dist/_dts/api/src/publicBookingService.d.ts +35 -1
  26. package/dist/_dts/api/src/publicExperience/eventEndpoints.d.ts +1 -0
  27. package/dist/_dts/api/src/publicExperience/newsletterEndpoints.d.ts +13 -0
  28. package/dist/_dts/api/src/publicNewsletterEndpointDefinitions.d.ts +58 -0
  29. package/dist/_dts/api/src/schemas/admin-observability-logs.d.ts +3 -3
  30. package/dist/_dts/api/src/sdkContracts.d.ts +1 -1
  31. package/dist/_dts/api/src/sdkSettingsContracts.d.ts +8 -0
  32. package/dist/_dts/api/src/siteManagementEndpoints.d.ts +2 -6
  33. package/dist/_dts/api/src/sitePlatformEndpoints.d.ts +2 -8
  34. package/dist/_dts/api/src/siteSettings.d.ts +17 -7
  35. package/dist/_dts/api/src/types.d.ts +2 -1
  36. package/dist/_dts/billing/src/membership/index.d.ts +3 -0
  37. package/dist/_dts/block-form/src/backend/types.d.ts +14 -0
  38. package/dist/_dts/block-form/src/client/index.d.ts +1 -0
  39. package/dist/_dts/block-form/src/context/RepeaterHostActionsContext.d.ts +30 -0
  40. package/dist/_dts/block-form/src/context/index.d.ts +1 -0
  41. package/dist/_dts/block-form/src/index.d.ts +1 -0
  42. package/dist/_dts/block-form/src/widgets/RepeaterField/components/RepeaterList.d.ts +4 -1
  43. package/dist/_dts/block-form/src/widgets/RepeaterField/components/RepeaterRow.d.ts +5 -2
  44. package/dist/_dts/block-form/src/widgets/RepeaterField/components/RepeaterRowActions.d.ts +11 -1
  45. package/dist/_dts/block-form/src/widgets/RepeaterField/hooks/index.d.ts +1 -0
  46. package/dist/_dts/block-form/src/widgets/RepeaterField/hooks/useEmptyStateFocusAfterRemoval.d.ts +8 -0
  47. package/dist/_dts/block-form/src/widgets/RepeaterField/utils/buildSummary.d.ts +15 -1
  48. package/dist/_dts/block-form/src/widgets/RepeaterField/utils/repeaterRowActionsDomain.d.ts +5 -2
  49. package/dist/_dts/blocks/src/PageRenderer.d.ts +4 -4
  50. package/dist/_dts/blocks/src/bindings/index.d.ts +2 -2
  51. package/dist/_dts/blocks/src/contracts/proof-block-islands.d.ts +58 -10
  52. package/dist/_dts/blocks/src/index.d.ts +1 -1
  53. package/dist/_dts/blocks/src/pageRenderJoins.d.ts +68 -0
  54. package/dist/_dts/blocks/src/pageRenderPlan.d.ts +8 -27
  55. package/dist/_dts/blocks/src/pageRenderPreparation.d.ts +7 -4
  56. package/dist/_dts/blocks/src/pageRendererBoundaries.d.ts +40 -23
  57. package/dist/_dts/blocks/src/pageRendererContracts.d.ts +3 -0
  58. package/dist/_dts/blocks/src/server.d.ts +1 -1
  59. package/dist/_dts/blocks/src/system/blocks/appointment-services.d.ts +2 -0
  60. package/dist/_dts/blocks/src/system/blocks/events/eventSelectionFields.d.ts +2 -2
  61. package/dist/_dts/blocks/src/system/blocks/events/shared/calendarWindow.d.ts +1 -1
  62. package/dist/_dts/blocks/src/system/blocks/location-map.d.ts +2 -2
  63. package/dist/_dts/blocks/src/system/blocks/media-text.d.ts +47 -47
  64. package/dist/_dts/blocks/src/system/constants/events.d.ts +10 -0
  65. package/dist/_dts/blocks/src/system/manifest/schema.d.ts +29 -3
  66. package/dist/_dts/blocks/src/system/runtime/api/client.d.ts +5 -0
  67. package/dist/_dts/blocks/src/system/runtime/api/context.d.ts +3 -3
  68. package/dist/_dts/blocks/src/system/runtime/api/endpoints.d.ts +10 -0
  69. package/dist/_dts/blocks/src/system/runtime/api/index.d.ts +3 -2
  70. package/dist/_dts/blocks/src/system/runtime/api/readAuthority.d.ts +11 -0
  71. package/dist/_dts/blocks/src/system/runtime/api/types/core.d.ts +9 -0
  72. package/dist/_dts/blocks/src/system/runtime/components/registry.client.d.ts +7 -13
  73. package/dist/_dts/blocks/src/system/runtime/components/runtime-backed-blocks.d.ts +3 -6
  74. package/dist/_dts/blocks/src/system/runtime/hooks/useCalendarEvents.d.ts +9 -4
  75. package/dist/_dts/blocks/src/system/runtime/hooks/useCalendarEvents.state.d.ts +0 -1
  76. package/dist/_dts/blocks/src/system/runtime/hooks/useEventPagination.d.ts +1 -3
  77. package/dist/_dts/blocks/src/system/runtime/hooks/useHeadlessBookingFlow.d.ts +8 -1
  78. package/dist/_dts/blocks/src/system/runtime/nodes/appointment-services.d.ts +22 -2
  79. package/dist/_dts/blocks/src/system/runtime/nodes/basic.d.ts +7 -24
  80. package/dist/_dts/blocks/src/system/runtime/nodes/booking-form.headless.state.d.ts +3 -1
  81. package/dist/_dts/blocks/src/system/runtime/nodes/booking-form.interactive.d.ts +57 -2
  82. package/dist/_dts/blocks/src/system/runtime/nodes/booking-form.service-categories.d.ts +29 -0
  83. package/dist/_dts/blocks/src/system/runtime/nodes/booking-form.service-choices.d.ts +13 -0
  84. package/dist/_dts/blocks/src/system/runtime/nodes/booking-form.state.d.ts +3 -3
  85. package/dist/_dts/blocks/src/system/runtime/nodes/booking-runtime-sources.d.ts +13 -1
  86. package/dist/_dts/blocks/src/system/runtime/nodes/cart.server.d.ts +1 -0
  87. package/dist/_dts/blocks/src/system/runtime/nodes/checkout.server.d.ts +1 -0
  88. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/EventRegistrationBookingLayer.d.ts +2 -1
  89. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/EventRegistrationSurface.d.ts +2 -1
  90. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/EventRegistrationWizardActions.d.ts +2 -1
  91. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/event-registration.headless.contract.d.ts +2 -0
  92. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/event-registration.headless.override.d.ts +2 -1
  93. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/eventSourceRecovery.d.ts +1 -1
  94. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/useEventRegistrationWizard.d.ts +2 -2
  95. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration.interactive.d.ts +8 -0
  96. package/dist/_dts/blocks/src/system/runtime/nodes/events/EventCalendar.interactive.d.ts +4 -5
  97. package/dist/_dts/blocks/src/system/runtime/nodes/events/EventCombined.client.d.ts +7 -2
  98. package/dist/_dts/blocks/src/system/runtime/nodes/events/EventCombined.interactive.d.ts +7 -5
  99. package/dist/_dts/blocks/src/system/runtime/nodes/events/EventListing.interactive.d.ts +5 -6
  100. package/dist/_dts/blocks/src/system/runtime/nodes/events/shared/eventCollectionContract.d.ts +6 -4
  101. package/dist/_dts/blocks/src/system/runtime/nodes/header-control.d.ts +10 -0
  102. package/dist/_dts/blocks/src/system/runtime/nodes/layout.d.ts +6 -21
  103. package/dist/_dts/blocks/src/system/runtime/nodes/newsletter-form.submission.d.ts +20 -1
  104. package/dist/_dts/blocks/src/system/runtime/nodes/product-detail.server.d.ts +1 -0
  105. package/dist/_dts/blocks/src/system/runtime/nodes/product-list.server.d.ts +1 -0
  106. package/dist/_dts/blocks/src/system/runtime/nodes/shop.interactive.d.ts +13 -0
  107. package/dist/_dts/blocks/src/system/runtime/nodes/shop.server.d.ts +1 -0
  108. package/dist/_dts/blocks/src/system/runtime/shared/components/ThemedButton.d.ts +58 -0
  109. package/dist/_dts/blocks/src/system/runtime/shared/components/index.d.ts +2 -0
  110. package/dist/_dts/blocks/src/system/transforms/registry/chromeLogo.d.ts +23 -0
  111. package/dist/_dts/blocks/src/system/transforms/registry/index.d.ts +2 -1
  112. package/dist/_dts/blocks/src/system/transforms/registry/layout.d.ts +3 -1
  113. package/dist/_dts/blocks/src/system/transforms/typed.d.ts +4 -1
  114. package/dist/_dts/content-editor/src/ui/editorSnapshot.d.ts +2 -0
  115. package/dist/_dts/content-model/src/content-types/schema.d.ts +1 -1
  116. package/dist/_dts/core/src/appointment-service-categories.d.ts +108 -0
  117. package/dist/_dts/core/src/editor-state.d.ts +6 -0
  118. package/dist/_dts/core/src/event-catalogue.d.ts +27 -0
  119. package/dist/_dts/core/src/event-preset-vocabulary.d.ts +7 -0
  120. package/dist/_dts/core/src/index.d.ts +3 -0
  121. package/dist/_dts/core/src/public-profile.d.ts +9 -0
  122. package/dist/_dts/db/src/generated/supabase/database.types.d.ts +676 -241
  123. package/dist/_dts/db/src/schemas/forms.d.ts +286 -2
  124. package/dist/_dts/editor-blocks/src/block-editor/{BlockCardHeader.d.ts → BlockCardFrame.d.ts} +11 -3
  125. package/dist/_dts/editor-blocks/src/block-editor/types.d.ts +6 -0
  126. package/dist/_dts/editor-blocks/src/widgets/site-option-picker/loaders.d.ts +16 -1
  127. package/dist/_dts/editor-blocks/src/widgets/site-option-picker/types.d.ts +13 -0
  128. package/dist/_dts/editor-blocks/src/widgets/site-option-picker/utils.d.ts +29 -0
  129. package/dist/_dts/logger/src/console.d.ts +3 -0
  130. package/dist/_dts/preview-next/src/client/blocks/BoundaryControl.d.ts +7 -2
  131. package/dist/_dts/preview-next/src/client/blocks/composer/mergeDrafts.d.ts +1 -1
  132. package/dist/_dts/preview-next/src/client/blocks/composer/types.d.ts +1 -0
  133. package/dist/_dts/preview-next/src/client/blocks/previewProjection/applyPreviewProjections.d.ts +1 -3
  134. package/dist/_dts/preview-next/src/client/blocks/previewProjection/runtimeContentDecoration.d.ts +2 -2
  135. package/dist/_dts/preview-next/src/client/blocks/previewProjection/types.d.ts +2 -2
  136. package/dist/_dts/preview-next/src/client/preview/PreviewEntryControllerProvider.d.ts +1 -0
  137. package/dist/_dts/sdk/src/client/publicEventReadOperations.d.ts +1 -0
  138. package/dist/_dts/sdk/src/client/runtimeCacheKeys.d.ts +8 -0
  139. package/dist/_dts/sdk/src/client/types.d.ts +4 -1
  140. package/dist/_dts/sdk/src/contracts/index.d.ts +1 -1
  141. package/dist/_dts/sdk/src/contracts/page.d.ts +7 -2
  142. package/dist/_dts/sdk/src/contracts/system-block-content.d.ts +5 -0
  143. package/dist/_dts/sdk/src/manifest/passes/pass1-fields.d.ts +2 -2
  144. package/dist/_dts/sdk/src/navigation/index.d.ts +27 -0
  145. package/dist/_dts/sdk/src/public-api/contracts.d.ts +21 -15
  146. package/dist/_dts/sdk/src/rendering/blocks-page-renderer.d.ts +3 -2
  147. package/dist/_dts/sdk/src/rendering/client.d.ts +1 -0
  148. package/dist/_dts/sdk/src/rendering/components/Block.shared.d.ts +1 -0
  149. package/dist/_dts/sdk/src/rendering/components/Layout.d.ts +7 -1
  150. package/dist/_dts/sdk/src/rendering/components/pageShared.d.ts +4 -2
  151. package/dist/_dts/sdk/src/rendering/helpers/loadContent.d.ts +1 -1
  152. package/dist/_dts/sdk/src/rendering/hooks/useContent.d.ts +1 -1
  153. package/dist/_dts/sdk/src/rendering/islands/enhancers/routeIslandApiConfig.d.ts +3 -2
  154. package/dist/_dts/sdk/src/rendering/islands/enhancers/shopShared.d.ts +2 -0
  155. package/dist/_dts/sdk/src/rendering/overrides.d.ts +1 -0
  156. package/dist/_dts/sdk/src/version.d.ts +1 -1
  157. package/dist/_dts/surfaces/src/index.d.ts +1 -0
  158. package/dist/_dts/theme-core/src/buttons/affordanceSuppression.d.ts +1 -1
  159. package/dist/_dts/theme-core/src/buttons/classNames.d.ts +3 -13
  160. package/dist/_dts/theme-core/src/customCss/index.d.ts +1 -1
  161. package/dist/_dts/theme-core/src/customCss/patch.d.ts +0 -5
  162. package/dist/_dts/theme-core/src/generated/containerResponsiveThemeCss.d.ts +1 -1
  163. package/dist/_dts/theme-core/src/layout/boundaryCss.d.ts +3 -0
  164. package/dist/_dts/theme-core/src/site-styles/compositionBudget.d.ts +8 -0
  165. package/dist/_dts/theme-core/src/site-styles/contentTemplateRuntimeCompiler.d.ts +3 -2
  166. package/dist/_dts/theme-core/src/site-styles/designState.d.ts +1 -3
  167. package/dist/_dts/theme-core/src/site-styles/generatedDesignPipeline.d.ts +3 -0
  168. package/dist/_dts/theme-core/src/site-styles/index.d.ts +3 -0
  169. package/dist/_dts/theme-core/src/site-styles/joinTreatment.d.ts +132 -0
  170. package/dist/_dts/theme-core/src/site-styles/pageDesignEditorBoundaries.d.ts +31 -0
  171. package/dist/_dts/theme-core/src/site-styles/pageDesignEditorModel.d.ts +33 -29
  172. package/dist/_dts/theme-core/src/site-styles/pageDesignIntent.d.ts +4 -4
  173. package/dist/_dts/theme-core/src/site-styles/pageFlowPresets.d.ts +36 -0
  174. package/dist/_dts/theme-core/src/site-styles/previewCompiler.d.ts +4 -10
  175. package/dist/_dts/theme-core/src/site-styles/rawStyleFields.d.ts +17 -4
  176. package/dist/_dts/theme-core/src/site-styles/runtimeCompiler.d.ts +20 -74
  177. package/dist/_dts/theme-core/src/site-styles/sectionBoundaryComposition.d.ts +95 -0
  178. package/dist/_dts/theme-core/src/site-styles/sectionTransitions.d.ts +80 -518
  179. package/dist/_dts/theme-core/src/site-styles/siteStyleBlockPolicies.d.ts +9 -4
  180. package/dist/_dts/theme-core/src/site-styles/transitionCatalogue.d.ts +320 -0
  181. package/dist/_dts/theme-core/src/site-styles/types.d.ts +3 -18
  182. package/dist/_dts/theme-core/src/surfaces/index.d.ts +1 -0
  183. package/dist/_dts/theme-core/src/surfaces/logoVariant.d.ts +26 -0
  184. package/dist/_dts/theme-core/src/utils/colorStyles.d.ts +10 -0
  185. package/dist/_dts/ui/src/editor-item-card.d.ts +116 -0
  186. package/dist/_dts/ui/src/index.d.ts +1 -0
  187. package/dist/client/{BookingConsentAgreement-BoCtvzzu.mjs → BookingConsentAgreement-DlVOmpW4.mjs} +4 -55
  188. package/dist/client/{DiscountCodeDisclosure-B5S30nZk.mjs → DiscountCodeDisclosure-T9q623PQ.mjs} +27 -17
  189. package/dist/client/{EventCombined.client-CeZ2-zSt.mjs → EventCombined.client-DnsUeONl.mjs} +54 -46
  190. package/dist/client/{EventListing.client-DJN3j8B3.mjs → EventListing.client-CNBFqJS4.mjs} +3 -4
  191. package/dist/client/{LeafletStaticMap-RjtGzDQT.mjs → LeafletStaticMap-C7higg52.mjs} +1 -1
  192. package/dist/client/ThemedButton-LAJTNrS8.mjs +412 -0
  193. package/dist/client/{accordion-DOmnDoyg.mjs → accordion-BcNF9TjX.mjs} +1 -1
  194. package/dist/client/{bookingForm-C0vk7pgS.mjs → bookingForm-BUaQ3S03.mjs} +161 -75
  195. package/dist/client/bookings.mjs +392 -182
  196. package/dist/client/{carousel-BZJ7pno3.mjs → carousel-CTdF6e0V.mjs} +2 -2
  197. package/dist/client/{carousel.client-DQTjCVQT.mjs → carousel.client-jahpU9Vz.mjs} +1 -1
  198. package/dist/client/{cart-CaeVAHJl.mjs → cart-pGtyf_XU.mjs} +3 -3
  199. package/dist/client/{checkout-7wmoNDtG.mjs → checkout-Da9WSn7Y.mjs} +3 -3
  200. package/dist/client/{checkoutUrls-FL6lRkrt.mjs → checkoutUrls-CW3-78uu.mjs} +1 -1
  201. package/dist/client/client.mjs +3819 -2717
  202. package/dist/client/{colorStyles-3013aRAY.mjs → colorStyles-CuJBiS-1.mjs} +16 -4
  203. package/dist/client/{context-BOimxE3U.mjs → context-BFeY_Wbm.mjs} +24 -8
  204. package/dist/client/{dates-BnzVksi4.mjs → dates-BhwVSxDg.mjs} +2 -2
  205. package/dist/client/{eventCalendar-l-fpaslC.mjs → eventCalendar-BAtdnR4s.mjs} +39 -50
  206. package/dist/client/{eventCombined-DGGvssK6.mjs → eventCombined-RksA3tRC.mjs} +5 -4
  207. package/dist/client/{eventDetails-DRiCm_hL.mjs → eventDetails-BB9hB4wR.mjs} +4 -4
  208. package/dist/client/{eventListing-dph8loYX.mjs → eventListing-BpJBkviM.mjs} +5 -4
  209. package/dist/client/{eventRegistration-ClBohmbY.mjs → eventRegistration-B18jFq_o.mjs} +83 -68
  210. package/dist/client/{form-BLVVAnd3.mjs → form-Dodt8Y8t.mjs} +9 -10
  211. package/dist/client/{headerSection-DHy4C8Ix.mjs → headerSection-B0qj9ttg.mjs} +23 -30
  212. package/dist/client/hooks.mjs +807 -162
  213. package/dist/client/{locationMap-6HuS28ck.mjs → locationMap-gn-iMk7a.mjs} +9 -10
  214. package/dist/client/{media-DHpfFwd3.mjs → media-BtJ37tzS.mjs} +1 -1
  215. package/dist/client/{newsletterForm-xOdcOhZP.mjs → newsletterForm-oByLdFkr.mjs} +31 -11
  216. package/dist/client/{pricing-ChinRYFt.mjs → pricing-BOU0_Hai.mjs} +1 -1
  217. package/dist/client/{productDetail-0chA5gbK.mjs → productDetail-D9v1zH2j.mjs} +3 -3
  218. package/dist/client/{productList-OoINA0h1.mjs → productList-D-mItx1n.mjs} +3 -3
  219. package/dist/client/{propsDecoder-CIZ-hbIG.mjs → propsDecoder-C3TP_z4x.mjs} +158 -61
  220. package/dist/client/rendering/client.mjs +2785 -2000
  221. package/dist/client/rendering/islands.mjs +19 -19
  222. package/dist/client/rendering.mjs +3855 -2694
  223. package/dist/client/{routeIslandApiConfig-UNsfPcYq.mjs → routeIslandApiConfig-DzN1W0sq.mjs} +8 -1
  224. package/dist/client/{scrollToBlock-BPZl0gPZ.mjs → scrollToBlock-CWs8EIdo.mjs} +1 -1
  225. package/dist/client/{shop-CLJFqNIq.mjs → shop-Dufw7N7o.mjs} +45 -58
  226. package/dist/client/{shop-commerce-PpANg5wB.mjs → shop-commerce-gklw_hLF.mjs} +42 -55
  227. package/dist/client/{shop-commerce-store-TA_Kz2ku.mjs → shop-commerce-store-Sf1eyTaZ.mjs} +1 -1
  228. package/dist/client/{shopShared-DzcFcA5g.mjs → shopShared-B5nyA41S.mjs} +6 -5
  229. package/dist/client/{useEventFilters-CFU21QZo.mjs → useEventFilters-CLL829vy.mjs} +66 -355
  230. package/dist/preview-next/before-render.mjs +147 -77
  231. package/dist/preview-next/client/runtime.mjs +4 -4
  232. package/dist/preview-next/editor-chrome.css +8 -0
  233. package/dist/preview-next/keepAlive.mjs +147 -77
  234. package/dist/preview-next/middleware.mjs +147 -77
  235. package/dist/{previewAuthStore-JA6-I_sL.mjs → previewAuthStore-BxAFlu-j.mjs} +147 -77
  236. package/dist/{sdk-runtime-CDKl0Fr7.mjs → sdk-runtime-D0uZFev7.mjs} +2 -2
  237. package/dist/{separator-BTp96X32.mjs → separator-EvdCAn4V.mjs} +1 -1
  238. package/dist/server/components.mjs +2548 -1607
  239. package/dist/server/config-validation.mjs +794 -160
  240. package/dist/server/config.mjs +794 -160
  241. package/dist/server/data.mjs +806 -161
  242. package/dist/server/index.mjs +167 -85
  243. package/dist/server/navigation.mjs +28 -1
  244. package/dist/server/next.mjs +14930 -14036
  245. package/dist/server/page-converter.mjs +494 -113
  246. package/dist/server/prebuild.mjs +1 -1
  247. package/dist/server/rendering/server.mjs +2537 -1590
  248. package/dist/server/rendering.mjs +2571 -1618
  249. package/dist/server/routing.mjs +918 -200
  250. package/dist/server/server.mjs +819 -205
  251. package/dist/server/theme-bridge.mjs +1232 -28
  252. package/dist/server/theme.mjs +6 -4
  253. package/dist/styles/index.css +6 -0
  254. package/package.json +2 -1
@@ -2220,6 +2220,8 @@ const buttonSystemSchema = z.strictObject({
2220
2220
  //#endregion
2221
2221
  //#region ../theme-core/src/palette/utils/colorConversion.ts
2222
2222
  const clamp01 = (x) => Math.max(0, Math.min(1, x));
2223
+ const mod = (a, n) => (a % n + n) % n;
2224
+ const deg = (x) => mod(x, 360);
2223
2225
  function hexToRgb(hex) {
2224
2226
  const h = hex.replace(/^#/, "");
2225
2227
  const m = h.length === 3 ? h.split("").map((c) => c + c).join("") : h;
@@ -2242,6 +2244,45 @@ function srgbToLinear(u) {
2242
2244
  function linearToSrgb(x) {
2243
2245
  return clamp01(x <= .0031308 ? 12.92 * x : 1.055 * Math.pow(x, 1 / 2.4) - .055) * 255;
2244
2246
  }
2247
+ function rgbToHsl(r, g, b) {
2248
+ const R = r / 255, G = g / 255, B = b / 255;
2249
+ const max = Math.max(R, G, B), min = Math.min(R, G, B);
2250
+ const d = max - min;
2251
+ let h = 0;
2252
+ if (d !== 0) {
2253
+ switch (max) {
2254
+ case R:
2255
+ h = (G - B) / d + (G < B ? 6 : 0);
2256
+ break;
2257
+ case G:
2258
+ h = (B - R) / d + 2;
2259
+ break;
2260
+ case B:
2261
+ h = (R - G) / d + 4;
2262
+ break;
2263
+ }
2264
+ h *= 60;
2265
+ }
2266
+ const l = (max + min) / 2;
2267
+ const s = d === 0 ? 0 : d / (1 - Math.abs(2 * l - 1));
2268
+ return {
2269
+ h,
2270
+ s,
2271
+ l
2272
+ };
2273
+ }
2274
+ function srgbToOklab(r, g, b) {
2275
+ const R = srgbToLinear(r), G = srgbToLinear(g), B = srgbToLinear(b);
2276
+ const l = .4122214708 * R + .5363325363 * G + .0514459929 * B;
2277
+ const m = .2119034982 * R + .6806995451 * G + .1073969566 * B;
2278
+ const s = .0883024619 * R + .2817188376 * G + .6299787005 * B;
2279
+ const l_ = Math.cbrt(l), m_ = Math.cbrt(m), s_ = Math.cbrt(s);
2280
+ return {
2281
+ L: .2104542553 * l_ + .793617785 * m_ - .0040720468 * s_,
2282
+ a: 1.9779984951 * l_ - 2.428592205 * m_ + .4505937099 * s_,
2283
+ b: .0259040371 * l_ + .7827717662 * m_ - .808675766 * s_
2284
+ };
2285
+ }
2245
2286
  function oklabToSrgb(L, a, b) {
2246
2287
  const l_ = Math.pow(L + .3963377774 * a + .2158037573 * b, 3);
2247
2288
  const m_ = Math.pow(L - .1055613458 * a - .0638541728 * b, 3);
@@ -2255,6 +2296,14 @@ function oklabToSrgb(L, a, b) {
2255
2296
  b: linearToSrgb(B)
2256
2297
  };
2257
2298
  }
2299
+ function oklabToOklch(L, a, b) {
2300
+ const C = Math.sqrt(a * a + b * b);
2301
+ return {
2302
+ L,
2303
+ C,
2304
+ h: C < 1e-7 ? 0 : deg(Math.atan2(b, a) * 180 / Math.PI)
2305
+ };
2306
+ }
2258
2307
  function oklchToOklab(L, C, h) {
2259
2308
  const hr = h * Math.PI / 180;
2260
2309
  return {
@@ -2263,6 +2312,27 @@ function oklchToOklab(L, C, h) {
2263
2312
  b: C * Math.sin(hr)
2264
2313
  };
2265
2314
  }
2315
+ function featuresFromHex(hex) {
2316
+ const { r, g, b } = hexToRgb(hex);
2317
+ const { h, s, l } = rgbToHsl(r, g, b);
2318
+ const { L, a, b: b2 } = srgbToOklab(r, g, b);
2319
+ const { L: okL, C: okC, h: okH } = oklabToOklch(L, a, b2);
2320
+ return {
2321
+ r,
2322
+ g,
2323
+ b,
2324
+ h,
2325
+ s,
2326
+ l,
2327
+ v: Math.max(r, g, b) / 255,
2328
+ Y: .2126 * srgbToLinear(r) + .7152 * srgbToLinear(g) + .0722 * srgbToLinear(b),
2329
+ chroma: s,
2330
+ okL,
2331
+ okC,
2332
+ okH,
2333
+ hex
2334
+ };
2335
+ }
2266
2336
  function relativeLuminance(r, g, b) {
2267
2337
  const R = srgbToLinear(r), G = srgbToLinear(g), B = srgbToLinear(b);
2268
2338
  return .2126 * R + .7152 * G + .0722 * B;
@@ -3312,6 +3382,36 @@ function normalizedReference(value) {
3312
3382
  return normalized.length > 0 ? normalized : null;
3313
3383
  }
3314
3384
  //#endregion
3385
+ //#region ../theme-core/src/surfaces/logoVariant.ts
3386
+ /** Concrete hex behind a plain, opaque palette token, or null otherwise. */
3387
+ function opaquePaletteHexForToken(expandedPalette, token) {
3388
+ if (!token) return null;
3389
+ const parts = parseColorTokenParts(token);
3390
+ if (parts.kind !== "token" || parts.opacityPercent !== null) return null;
3391
+ return expandedPalette[parts.token] ?? null;
3392
+ }
3393
+ /**
3394
+ * Tone of the surface a foreground token was resolved for.
3395
+ *
3396
+ * A token with opacity has no known underlay to composite against, and a raw
3397
+ * or unrecognised token has no palette hex, so both are `unknown` rather than
3398
+ * a guess.
3399
+ */
3400
+ function surfaceToneFromForegroundToken(expandedPalette, foregroundToken) {
3401
+ const hex = opaquePaletteHexForToken(expandedPalette, foregroundToken);
3402
+ if (!hex) return "unknown";
3403
+ return featuresFromHex(hex).Y >= .5 ? "dark" : "light";
3404
+ }
3405
+ /**
3406
+ * The logo to draw on a surface of the given tone. A missing variant falls
3407
+ * back to the other one, and an unknown tone uses the light-backgrounds logo,
3408
+ * which is what every site rendered before variants existed.
3409
+ */
3410
+ function selectLogoVariant(tone, variants) {
3411
+ const { forLightBackgrounds, forDarkBackgrounds } = variants;
3412
+ return tone === "dark" ? forDarkBackgrounds ?? forLightBackgrounds : forLightBackgrounds ?? forDarkBackgrounds;
3413
+ }
3414
+ //#endregion
3315
3415
  //#region ../theme-core/src/utils/colorStyles.ts
3316
3416
  const COLOR_VAR_PREFIX = "--tb-";
3317
3417
  function parseToken(source) {
@@ -3363,16 +3463,28 @@ function backgroundColorStyle(token) {
3363
3463
  return { backgroundColor: rgbColorValue(token) };
3364
3464
  }
3365
3465
  /**
3466
+ * Converts a text color token to a CSS color value that follows the enclosing
3467
+ * surface. The semantic text tokens (`text`, `heading`, `mutedText`) resolve
3468
+ * to the surface foreground variables, so text adapts when a section's
3469
+ * background changes; any other token is a fixed theme color.
3470
+ *
3471
+ * @param token - Theme color token
3472
+ * @returns CSS color value
3473
+ */
3474
+ function textColorValue(token) {
3475
+ const parsed = parseToken(token);
3476
+ const surfaceRole = parsed.raw ? null : surfaceRoleForTextToken(parsed.token);
3477
+ if (!surfaceRole) return rgbColorValue(token);
3478
+ return parsed.opacityPercent === void 0 ? surfaceForegroundValue(surfaceRole) : surfaceForegroundValueWithOpacity(surfaceRole, parsed.opacityPercent);
3479
+ }
3480
+ /**
3366
3481
  * Creates a text color style object from a theme token.
3367
3482
  *
3368
3483
  * @param token - Theme color token
3369
3484
  * @returns CSSProperties with color
3370
3485
  */
3371
3486
  function textColorStyle(token) {
3372
- const parsed = parseToken(token);
3373
- const surfaceRole = parsed.raw ? null : surfaceRoleForTextToken(parsed.token);
3374
- if (surfaceRole) return { color: parsed.opacityPercent === void 0 ? surfaceForegroundValue(surfaceRole) : surfaceForegroundValueWithOpacity(surfaceRole, parsed.opacityPercent) };
3375
- return { color: rgbColorValue(token) };
3487
+ return { color: textColorValue(token) };
3376
3488
  }
3377
3489
  /**
3378
3490
  * Creates a border color style object from a theme token.
@@ -6557,6 +6669,15 @@ function asSiteStyleId(value) {
6557
6669
  function asDesignSystemTemplateId(value) {
6558
6670
  return brandNonEmptyString(value, "DesignSystemTemplateId");
6559
6671
  }
6672
+ function toNonEmptyReadonlyArray(values) {
6673
+ const [first, ...rest] = values;
6674
+ return first === void 0 ? null : [first, ...rest];
6675
+ }
6676
+ function requireNonEmptyReadonlyArray(values, message = "Expected a non-empty array.") {
6677
+ const result = toNonEmptyReadonlyArray(values);
6678
+ if (!result) throw new Error(message);
6679
+ return result;
6680
+ }
6560
6681
  function makeBoundaryId(previousBlockId, nextBlockId) {
6561
6682
  return asDesignBoundaryId(`boundary:${encodeURIComponent(previousBlockId)}:${encodeURIComponent(nextBlockId)}`);
6562
6683
  }
@@ -6759,16 +6880,18 @@ const themeV2RuntimeStyleFieldNames = [
6759
6880
  "_frameStyles",
6760
6881
  "_sectionStyles",
6761
6882
  "_containerStyles",
6762
- "_cardStyles",
6763
- "_transitionStyles",
6764
- "styleGroup"
6883
+ "_cardStyles"
6765
6884
  ];
6766
6885
  const themeV2BlockSpecificRawStyleFieldNames = [
6767
6886
  "_contentCardStyles",
6768
6887
  "_heroLayoutStyles",
6769
6888
  "_textCardStyles"
6770
6889
  ];
6771
- const themeV2NormalEditorRawStyleFieldNames = [...themeV2RuntimeStyleFieldNames, ...themeV2BlockSpecificRawStyleFieldNames];
6890
+ const themeV2NormalEditorRawStyleFieldNames = [
6891
+ ...themeV2RuntimeStyleFieldNames,
6892
+ ...themeV2BlockSpecificRawStyleFieldNames,
6893
+ "styleGroup"
6894
+ ];
6772
6895
  new Set(themeV2NormalEditorRawStyleFieldNames);
6773
6896
  [...themeV2RuntimeStyleFieldNames, ...themeV2BlockSpecificRawStyleFieldNames];
6774
6897
  const pageDesignEditorBackgroundOverrideOwner = "page-design-editor";
@@ -8267,6 +8390,33 @@ function normalizeEventCalendarDisplayMode$1(input) {
8267
8390
  if (isEventCalendarDisplayMode(input.variant)) return input.variant;
8268
8391
  return isEventCalendarDisplayMode(input.displayMode) ? input.displayMode : void 0;
8269
8392
  }
8393
+ /** One closed authority for the projections required by each rendered mode. */
8394
+ function resolveEventCalendarReadPlan(input) {
8395
+ const mode = normalizeEventCalendarDisplayMode$1(input) ?? "combined";
8396
+ switch (mode) {
8397
+ case "combined": return {
8398
+ mode,
8399
+ jobs: "both",
8400
+ readProfile: "listing-card"
8401
+ };
8402
+ case "list": return {
8403
+ mode,
8404
+ jobs: "list",
8405
+ readProfile: "listing-card"
8406
+ };
8407
+ case "calendar": return {
8408
+ mode,
8409
+ jobs: "calendar",
8410
+ readProfile: "listing-card"
8411
+ };
8412
+ case "timetable":
8413
+ case "week-board": return {
8414
+ mode,
8415
+ jobs: "calendar",
8416
+ readProfile: "timetable"
8417
+ };
8418
+ }
8419
+ }
8270
8420
  function isEventCalendarDefaultView(value) {
8271
8421
  return typeof value === "string" && eventCalendarDefaultViewValues.includes(value);
8272
8422
  }
@@ -8276,8 +8426,7 @@ function isEventCalendarListLayout(value) {
8276
8426
  //#endregion
8277
8427
  //#region ../blocks/src/system/blocks/events/shared/calendarWindow.ts
8278
8428
  function resolveCalendarReadProfile(content) {
8279
- const mode = normalizeEventCalendarDisplayMode$1(content);
8280
- return mode === "timetable" || mode === "week-board" ? "timetable" : "listing-card";
8429
+ return resolveEventCalendarReadPlan(content).readProfile;
8281
8430
  }
8282
8431
  /** Runtime picker sentinels and bound loader IDs must describe the same query. */
8283
8432
  function normalizeCalendarFilterId(value) {
@@ -8366,6 +8515,75 @@ const calendarWindowPageSchema = z.discriminatedUnion("kind", [z.object({
8366
8515
  nextCursor: calendarSourceCursorSchema
8367
8516
  })]);
8368
8517
  //#endregion
8518
+ //#region ../api/src/defineEndpointDefinitions.ts
8519
+ /**
8520
+ * Validates extracted endpoint descriptors while preserving each literal path,
8521
+ * method, and parameter contract for the typed URL builders.
8522
+ */
8523
+ function defineEndpointDefinitions(definitions) {
8524
+ return definitions;
8525
+ }
8526
+ //#endregion
8527
+ //#region ../api/src/publicNewsletterEndpointDefinitions.ts
8528
+ const PUBLIC_NEWSLETTER_ENDPOINT_DEFINITIONS = defineEndpointDefinitions({
8529
+ subscribeNewsletter: {
8530
+ path: "/public/sites/{siteId}/newsletter/subscribe",
8531
+ method: "POST",
8532
+ tags: ["public-newsletter-{siteId}"],
8533
+ auth: "public",
8534
+ responseKind: "json"
8535
+ },
8536
+ confirmNewsletter: {
8537
+ path: "/public/sites/{siteId}/newsletter/confirm/{token}",
8538
+ method: "GET",
8539
+ tags: ["public-newsletter-{siteId}"],
8540
+ auth: "public",
8541
+ responseKind: "text"
8542
+ },
8543
+ unsubscribeNewsletter: {
8544
+ path: "/public/sites/{siteId}/newsletter/unsubscribe/{token}",
8545
+ method: "GET",
8546
+ tags: ["public-newsletter-{siteId}"],
8547
+ auth: "public",
8548
+ responseKind: "text"
8549
+ },
8550
+ unsubscribeNewsletterPost: {
8551
+ path: "/public/sites/{siteId}/newsletter/unsubscribe/{token}",
8552
+ method: "POST",
8553
+ tags: ["public-newsletter-{siteId}"],
8554
+ auth: "public",
8555
+ responseKind: "text"
8556
+ },
8557
+ confirmNewsletterPost: {
8558
+ path: "/public/sites/{siteId}/newsletter/confirm/{token}",
8559
+ method: "POST",
8560
+ tags: ["public-newsletter-{siteId}"],
8561
+ auth: "public",
8562
+ responseKind: "text"
8563
+ },
8564
+ getNewsletterPreferences: {
8565
+ path: "/public/sites/{siteId}/newsletter/preferences/{token}",
8566
+ method: "GET",
8567
+ tags: ["public-newsletter-{siteId}"],
8568
+ auth: "public",
8569
+ responseKind: "text"
8570
+ },
8571
+ saveNewsletterPreferences: {
8572
+ path: "/public/sites/{siteId}/newsletter/preferences/{token}",
8573
+ method: "POST",
8574
+ tags: ["public-newsletter-{siteId}"],
8575
+ auth: "public",
8576
+ responseKind: "text"
8577
+ },
8578
+ getNewsletterArchive: {
8579
+ path: "/public/sites/{siteId}/newsletter/archive/{token}",
8580
+ method: "GET",
8581
+ tags: ["public-newsletter-{siteId}"],
8582
+ auth: "public",
8583
+ responseKind: "text"
8584
+ }
8585
+ });
8586
+ //#endregion
8369
8587
  //#region ../api/src/apiEndpointTypes.ts
8370
8588
  function allowedDemoMutationPolicy() {
8371
8589
  return {
@@ -8457,17 +8675,85 @@ const SDK_ENTRY_READ_ENDPOINTS = {
8457
8675
  }
8458
8676
  };
8459
8677
  //#endregion
8460
- //#region ../api/src/defineEndpointDefinitions.ts
8461
- /**
8462
- * Validates extracted endpoint descriptors while preserving each literal path,
8463
- * method, and parameter contract for the typed URL builders.
8464
- */
8465
- function defineEndpointDefinitions(definitions) {
8466
- return definitions;
8467
- }
8468
- //#endregion
8469
8678
  //#region ../api/src/appointmentEndpointDefinitions.ts
8470
8679
  const APPOINTMENT_ENDPOINT_DEFINITIONS = defineEndpointDefinitions({
8680
+ ...defineEndpointDefinitions({
8681
+ listGroupedAppointmentServices: {
8682
+ path: "/sites/{siteId}/bookings/services/grouped",
8683
+ method: "GET",
8684
+ auth: "user",
8685
+ responseKind: "json",
8686
+ errors: ["server:internal_error"]
8687
+ },
8688
+ reorderAppointmentServices: {
8689
+ path: "/sites/{siteId}/bookings/services/order",
8690
+ method: "PUT",
8691
+ auth: "user",
8692
+ responseKind: "json",
8693
+ errors: [
8694
+ "validation:invalid_input",
8695
+ "auth:forbidden",
8696
+ "resource:not_found",
8697
+ "resource:conflict",
8698
+ "server:internal_error"
8699
+ ]
8700
+ },
8701
+ listAppointmentServiceCategories: {
8702
+ path: "/sites/{siteId}/bookings/service-categories",
8703
+ method: "GET",
8704
+ auth: "user",
8705
+ responseKind: "json",
8706
+ errors: ["server:internal_error"]
8707
+ },
8708
+ createAppointmentServiceCategory: {
8709
+ path: "/sites/{siteId}/bookings/service-categories",
8710
+ method: "POST",
8711
+ auth: "user",
8712
+ responseKind: "json",
8713
+ errors: [
8714
+ "validation:invalid_input",
8715
+ "auth:forbidden",
8716
+ "resource:conflict",
8717
+ "server:internal_error"
8718
+ ]
8719
+ },
8720
+ updateAppointmentServiceCategory: {
8721
+ path: "/sites/{siteId}/bookings/service-categories/{categoryId}",
8722
+ method: "PUT",
8723
+ auth: "user",
8724
+ responseKind: "json",
8725
+ errors: [
8726
+ "validation:invalid_input",
8727
+ "auth:forbidden",
8728
+ "resource:not_found",
8729
+ "resource:conflict",
8730
+ "server:internal_error"
8731
+ ]
8732
+ },
8733
+ deleteAppointmentServiceCategory: {
8734
+ path: "/sites/{siteId}/bookings/service-categories/{categoryId}",
8735
+ method: "DELETE",
8736
+ auth: "user",
8737
+ responseKind: "json",
8738
+ errors: [
8739
+ "auth:forbidden",
8740
+ "resource:not_found",
8741
+ "server:internal_error"
8742
+ ]
8743
+ },
8744
+ reorderAppointmentServiceCategories: {
8745
+ path: "/sites/{siteId}/bookings/service-categories/order",
8746
+ method: "PUT",
8747
+ auth: "user",
8748
+ responseKind: "json",
8749
+ errors: [
8750
+ "validation:invalid_input",
8751
+ "auth:forbidden",
8752
+ "resource:conflict",
8753
+ "server:internal_error"
8754
+ ]
8755
+ }
8756
+ }),
8471
8757
  listAppointmentResources: {
8472
8758
  path: "/sites/{siteId}/bookings/resources",
8473
8759
  method: "GET",
@@ -9615,39 +9901,6 @@ const NEWSLETTER_ENDPOINT_DEFINITIONS = defineEndpointDefinitions({
9615
9901
  auth: "user",
9616
9902
  responseKind: "json",
9617
9903
  demoMutation: DEMO_MUTATION_BLOCKED_HIDDEN
9618
- },
9619
- listNewsletterSendJobs: {
9620
- path: "/sites/{siteId}/newsletter/jobs",
9621
- method: "GET",
9622
- tags: [TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter],
9623
- auth: "user",
9624
- responseKind: "json"
9625
- },
9626
- retryNewsletterSendJob: {
9627
- path: "/sites/{siteId}/newsletter/jobs/{jobId}/retry",
9628
- method: "POST",
9629
- errors: [
9630
- "validation:invalid_input",
9631
- "resource:not_found",
9632
- "auth:forbidden",
9633
- "server:internal_error"
9634
- ],
9635
- tags: [TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter],
9636
- auth: "user",
9637
- responseKind: "json"
9638
- },
9639
- cancelNewsletterSendJob: {
9640
- path: "/sites/{siteId}/newsletter/jobs/{jobId}/cancel",
9641
- method: "POST",
9642
- errors: [
9643
- "validation:invalid_input",
9644
- "resource:not_found",
9645
- "auth:forbidden",
9646
- "server:internal_error"
9647
- ],
9648
- tags: [TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter],
9649
- auth: "user",
9650
- responseKind: "json"
9651
9904
  }
9652
9905
  });
9653
9906
  //#endregion
@@ -10413,6 +10666,7 @@ const BILLING_ENDPOINT_DEFINITIONS = defineEndpointDefinitions({
10413
10666
  }
10414
10667
  });
10415
10668
  ({
10669
+ ...PUBLIC_NEWSLETTER_ENDPOINT_DEFINITIONS,
10416
10670
  ...ACCOUNT_ENDPOINT_DEFINITIONS,
10417
10671
  ...PUBLIC_ONBOARDING_ATTEMPT_ENDPOINT_DEFINITIONS,
10418
10672
  ...PUBLIC_EVENT_ENDPOINT_DEFINITIONS,
@@ -12773,11 +13027,260 @@ function cardRoleFromLegacyVocabulary(value) {
12773
13027
  */
12774
13028
  const cardRoleWithLegacyAliasSchema = z.preprocess((value) => cardRoleFromLegacyVocabulary(value) ?? value, cardRoleSchema);
12775
13029
  //#endregion
12776
- //#region ../theme-core/src/site-styles/compilationPlan.ts
12777
- const defaultHeaderBrandPreferences = {
12778
- brandDisplay: "auto",
12779
- logoSize: "auto"
12780
- };
13030
+ //#region ../theme-core/src/site-styles/transitionCatalogue.ts
13031
+ /**
13032
+ * Family order for pickers. Entries below are listed family by family in this
13033
+ * same order, so the flat option list and the grouped families agree.
13034
+ */
13035
+ const transitionCatalogueFamilies = [
13036
+ {
13037
+ id: "gradient",
13038
+ label: "Gradient"
13039
+ },
13040
+ {
13041
+ id: "wave",
13042
+ label: "Wave"
13043
+ },
13044
+ {
13045
+ id: "angle",
13046
+ label: "Angle"
13047
+ }
13048
+ ];
13049
+ const mediumHeight = "6rem + 2px";
13050
+ const compactHeight = "4.5rem + 2px";
13051
+ const largeHeight = "7rem + 2px";
13052
+ /**
13053
+ * The single source of transition vocabulary. Order is significant: it is the
13054
+ * order of `boundaryOptions` (after `none`) and of each family's variants,
13055
+ * which persisted pins, page-flow presets and the editor picker all rely on.
13056
+ *
13057
+ * Shapes match what `generateLayoutCss` draws today. Structured
13058
+ * amplitude/frequency treatments (issue 826) extend this list later.
13059
+ */
13060
+ const transitionCatalogueEntries = defineExactCatalog()([
13061
+ {
13062
+ intent: "soft-fade-short",
13063
+ optionId: asBoundaryOptionId("break:soft"),
13064
+ family: "gradient",
13065
+ variantId: "soft",
13066
+ label: "Soft",
13067
+ variantLabel: "Soft",
13068
+ treatment: {
13069
+ kind: "soft-fade",
13070
+ height: "medium",
13071
+ curve: "soft"
13072
+ },
13073
+ size: "medium",
13074
+ heightExpression: mediumHeight,
13075
+ shape: { kind: "fade" }
13076
+ },
13077
+ {
13078
+ intent: "soft-fade-long",
13079
+ optionId: asBoundaryOptionId("break:spacious"),
13080
+ family: "gradient",
13081
+ variantId: "spacious",
13082
+ label: "Spacious",
13083
+ variantLabel: "Spacious",
13084
+ treatment: {
13085
+ kind: "soft-fade",
13086
+ height: "large",
13087
+ curve: "spacious"
13088
+ },
13089
+ size: "spacious",
13090
+ heightExpression: "10rem",
13091
+ shape: { kind: "fade" }
13092
+ },
13093
+ {
13094
+ intent: "soft-fade-expansive",
13095
+ optionId: asBoundaryOptionId("break:expansive"),
13096
+ family: "gradient",
13097
+ variantId: "expansive",
13098
+ label: "Expansive",
13099
+ variantLabel: "Expansive",
13100
+ treatment: {
13101
+ kind: "soft-fade",
13102
+ height: "expansive",
13103
+ curve: "expansive"
13104
+ },
13105
+ size: "expansive",
13106
+ heightExpression: "14rem",
13107
+ shape: { kind: "fade" }
13108
+ },
13109
+ {
13110
+ intent: "wave-edge-balanced",
13111
+ optionId: asBoundaryOptionId("break:wave-balanced"),
13112
+ family: "wave",
13113
+ variantId: "balanced",
13114
+ label: "Balanced wave",
13115
+ variantLabel: "Balanced",
13116
+ treatment: {
13117
+ kind: "wave-edge",
13118
+ height: "medium",
13119
+ amplitude: "balanced",
13120
+ rhythm: "double",
13121
+ symmetry: "symmetrical"
13122
+ },
13123
+ size: "medium",
13124
+ heightExpression: mediumHeight,
13125
+ shape: {
13126
+ kind: "wave",
13127
+ mask: "balanced"
13128
+ }
13129
+ },
13130
+ {
13131
+ intent: "wave-edge",
13132
+ optionId: asBoundaryOptionId("break:wave"),
13133
+ family: "wave",
13134
+ variantId: "classic",
13135
+ label: "Classic wave",
13136
+ variantLabel: "Classic",
13137
+ treatment: {
13138
+ kind: "wave-edge",
13139
+ height: "medium",
13140
+ amplitude: "balanced",
13141
+ rhythm: "double",
13142
+ symmetry: "asymmetrical"
13143
+ },
13144
+ size: "medium",
13145
+ heightExpression: mediumHeight,
13146
+ shape: {
13147
+ kind: "wave",
13148
+ mask: "classic"
13149
+ }
13150
+ },
13151
+ {
13152
+ intent: "wave-edge-gentle",
13153
+ optionId: asBoundaryOptionId("break:wave-gentle"),
13154
+ family: "wave",
13155
+ variantId: "gentle",
13156
+ label: "Gentle wave",
13157
+ variantLabel: "Gentle",
13158
+ treatment: {
13159
+ kind: "wave-edge",
13160
+ height: "compact",
13161
+ amplitude: "subtle",
13162
+ rhythm: "single",
13163
+ symmetry: "symmetrical"
13164
+ },
13165
+ size: "compact",
13166
+ heightExpression: compactHeight,
13167
+ shape: {
13168
+ kind: "wave",
13169
+ mask: "gentle"
13170
+ }
13171
+ },
13172
+ {
13173
+ intent: "wave-edge-bold",
13174
+ optionId: asBoundaryOptionId("break:wave-bold"),
13175
+ family: "wave",
13176
+ variantId: "bold",
13177
+ label: "Bold wave",
13178
+ variantLabel: "Bold",
13179
+ treatment: {
13180
+ kind: "wave-edge",
13181
+ height: "large",
13182
+ amplitude: "bold",
13183
+ rhythm: "double",
13184
+ symmetry: "symmetrical"
13185
+ },
13186
+ size: "large",
13187
+ heightExpression: largeHeight,
13188
+ shape: {
13189
+ kind: "wave",
13190
+ mask: "bold"
13191
+ }
13192
+ },
13193
+ {
13194
+ intent: "wave-edge-drift",
13195
+ optionId: asBoundaryOptionId("break:wave-drift"),
13196
+ family: "wave",
13197
+ variantId: "drift",
13198
+ label: "Drift wave",
13199
+ variantLabel: "Drift",
13200
+ treatment: {
13201
+ kind: "wave-edge",
13202
+ height: "medium",
13203
+ amplitude: "balanced",
13204
+ rhythm: "double",
13205
+ symmetry: "drift"
13206
+ },
13207
+ size: "medium",
13208
+ heightExpression: mediumHeight,
13209
+ shape: {
13210
+ kind: "wave",
13211
+ mask: "drift"
13212
+ }
13213
+ },
13214
+ {
13215
+ intent: "angle-edge-subtle",
13216
+ optionId: asBoundaryOptionId("break:angle-subtle"),
13217
+ family: "angle",
13218
+ variantId: "subtle",
13219
+ label: "Subtle angle",
13220
+ variantLabel: "Subtle",
13221
+ treatment: {
13222
+ kind: "angle-edge",
13223
+ height: "compact",
13224
+ slope: "subtle",
13225
+ direction: "forward"
13226
+ },
13227
+ size: "compact",
13228
+ heightExpression: compactHeight,
13229
+ shape: {
13230
+ kind: "angle",
13231
+ polygon: {
13232
+ startTopPercent: 34,
13233
+ endTopPercent: 18
13234
+ }
13235
+ }
13236
+ },
13237
+ {
13238
+ intent: "angle-edge",
13239
+ optionId: asBoundaryOptionId("break:angle-balanced"),
13240
+ family: "angle",
13241
+ variantId: "balanced",
13242
+ label: "Balanced angle",
13243
+ variantLabel: "Balanced",
13244
+ treatment: {
13245
+ kind: "angle-edge",
13246
+ height: "medium",
13247
+ slope: "balanced",
13248
+ direction: "forward"
13249
+ },
13250
+ size: "medium",
13251
+ heightExpression: mediumHeight,
13252
+ shape: {
13253
+ kind: "angle",
13254
+ polygon: {
13255
+ startTopPercent: 42,
13256
+ endTopPercent: 8
13257
+ }
13258
+ }
13259
+ },
13260
+ {
13261
+ intent: "angle-edge-steep",
13262
+ optionId: asBoundaryOptionId("break:angle-steep"),
13263
+ family: "angle",
13264
+ variantId: "steep",
13265
+ label: "Steep angle",
13266
+ variantLabel: "Steep",
13267
+ treatment: {
13268
+ kind: "angle-edge",
13269
+ height: "large",
13270
+ slope: "steep",
13271
+ direction: "forward"
13272
+ },
13273
+ size: "large",
13274
+ heightExpression: largeHeight,
13275
+ shape: {
13276
+ kind: "angle",
13277
+ polygon: {
13278
+ startTopPercent: 54,
13279
+ endTopPercent: 0
13280
+ }
13281
+ }
13282
+ }
13283
+ ]);
12781
13284
  //#endregion
12782
13285
  //#region ../theme-core/src/site-styles/sectionTransitions.ts
12783
13286
  function boundaryRuntimeMetrics(family, size, heightExpression) {
@@ -12788,42 +13291,106 @@ function boundaryRuntimeMetrics(family, size, heightExpression) {
12788
13291
  reserveCss: `calc((${heightExpression}) / 2)`
12789
13292
  };
12790
13293
  }
12791
- boundaryRuntimeMetrics("gradient", "medium", "6rem + 2px"), boundaryRuntimeMetrics("gradient", "spacious", "10rem"), boundaryRuntimeMetrics("gradient", "expansive", "14rem"), boundaryRuntimeMetrics("wave", "medium", "6rem + 2px"), boundaryRuntimeMetrics("wave", "medium", "6rem + 2px"), boundaryRuntimeMetrics("wave", "compact", "4.5rem + 2px"), boundaryRuntimeMetrics("wave", "large", "7rem + 2px"), boundaryRuntimeMetrics("wave", "medium", "6rem + 2px"), boundaryRuntimeMetrics("angle", "medium", "6rem + 2px"), boundaryRuntimeMetrics("angle", "compact", "4.5rem + 2px"), boundaryRuntimeMetrics("angle", "large", "7rem + 2px");
13294
+ new Map(transitionCatalogueEntries.map((entry) => [entry.intent, entry]));
13295
+ new Map(transitionCatalogueEntries.map((entry) => [entry.intent, boundaryRuntimeMetrics(entry.family, entry.size, entry.heightExpression)]));
13296
+ /**
13297
+ * The catalogue's compile-time coverage check guarantees an entry per
13298
+ * decorative intent, so a miss here is a broken invariant, not bad input.
13299
+ */
13300
+ function requireCatalogueValue(values, intent) {
13301
+ const value = values.get(intent);
13302
+ if (value === void 0) throw new Error(`Transition catalogue has no entry for ${intent}`);
13303
+ return value;
13304
+ }
12792
13305
  const noneBoundaryOption = {
12793
13306
  id: asBoundaryOptionId("break:none"),
12794
13307
  label: "None",
12795
13308
  transitionAfter: "none",
12796
13309
  treatment: { kind: "none" }
12797
13310
  };
12798
- const softBoundaryOption = {
12799
- id: asBoundaryOptionId("break:soft"),
12800
- label: "Soft",
12801
- transitionAfter: "soft-fade-short",
12802
- treatment: {
12803
- kind: "soft-fade",
12804
- height: "medium",
12805
- curve: "soft"
12806
- }
13311
+ const boundaryOptionByIntent = new Map(transitionCatalogueEntries.map((entry) => [entry.intent, {
13312
+ id: entry.optionId,
13313
+ label: entry.label,
13314
+ transitionAfter: entry.intent,
13315
+ treatment: entry.treatment
13316
+ }]));
13317
+ function boundaryOptionForTransitionIntent(intent) {
13318
+ return requireCatalogueValue(boundaryOptionByIntent, intent);
13319
+ }
13320
+ const softBoundaryOption = boundaryOptionForTransitionIntent("soft-fade-short");
13321
+ const spaciousBoundaryOption = boundaryOptionForTransitionIntent("soft-fade-long");
13322
+ boundaryOptionForTransitionIntent("soft-fade-expansive");
13323
+ boundaryOptionForTransitionIntent("wave-edge");
13324
+ boundaryOptionForTransitionIntent("wave-edge-balanced");
13325
+ boundaryOptionForTransitionIntent("wave-edge-gentle");
13326
+ boundaryOptionForTransitionIntent("wave-edge-bold");
13327
+ boundaryOptionForTransitionIntent("wave-edge-drift");
13328
+ boundaryOptionForTransitionIntent("angle-edge-subtle");
13329
+ boundaryOptionForTransitionIntent("angle-edge");
13330
+ boundaryOptionForTransitionIntent("angle-edge-steep");
13331
+ /**
13332
+ * Must remain non-empty; downstream code indexes `[0]` as the documented default.
13333
+ */
13334
+ const boundaryOptions = [noneBoundaryOption, ...transitionCatalogueEntries.map((entry) => boundaryOptionForTransitionIntent(entry.intent))];
13335
+ const noneTransitionVariant = {
13336
+ familyId: "none",
13337
+ variantId: "none",
13338
+ label: "None",
13339
+ boundaryOption: noneBoundaryOption
12807
13340
  };
12808
- const spaciousBoundaryOption = {
12809
- id: asBoundaryOptionId("break:spacious"),
12810
- label: "Spacious",
12811
- transitionAfter: "soft-fade-long",
12812
- treatment: {
12813
- kind: "soft-fade",
12814
- height: "large",
12815
- curve: "spacious"
12816
- }
13341
+ function transitionVariantForEntry(entry) {
13342
+ return {
13343
+ familyId: entry.family,
13344
+ variantId: entry.variantId,
13345
+ label: entry.variantLabel,
13346
+ boundaryOption: boundaryOptionForTransitionIntent(entry.intent)
13347
+ };
13348
+ }
13349
+ const sectionTransitionFamilies = [{
13350
+ id: "none",
13351
+ label: "None",
13352
+ variants: [noneTransitionVariant]
13353
+ }, ...transitionCatalogueFamilies.map((family) => ({
13354
+ id: family.id,
13355
+ label: family.label,
13356
+ variants: requireNonEmptyReadonlyArray(transitionCatalogueEntries.filter((entry) => entry.family === family.id).map(transitionVariantForEntry), `Transition family ${family.id} has no catalogue entries.`)
13357
+ }))];
13358
+ new Map(boundaryOptions.map((option) => [option.id, option]));
13359
+ new Map(boundaryOptions.map((option) => [stableTreatmentKey(option.treatment), option]));
13360
+ new Map(sectionTransitionFamilies.flatMap((family) => family.variants.map((variant) => [variant.boundaryOption.id, variant])));
13361
+ new Map(sectionTransitionFamilies.map((family) => [family.id, family]));
13362
+ function stableTreatmentKey(treatment) {
13363
+ switch (treatment.kind) {
13364
+ case "none": return "none";
13365
+ case "soft-fade": return `${treatment.kind}:${treatment.height}:${treatment.curve}`;
13366
+ case "wave-edge": return [
13367
+ treatment.kind,
13368
+ treatment.height,
13369
+ treatment.amplitude,
13370
+ treatment.rhythm,
13371
+ treatment.symmetry
13372
+ ].join(":");
13373
+ case "angle-edge": return [
13374
+ treatment.kind,
13375
+ treatment.height,
13376
+ treatment.slope,
13377
+ treatment.direction
13378
+ ].join(":");
13379
+ case "legacy-unsupported": return `${treatment.kind}:${treatment.boundaryOptionId}`;
13380
+ }
13381
+ }
13382
+ requireThemeColorToken$1("background");
13383
+ function requireThemeColorToken$1(value) {
13384
+ const token = parseThemeColorToken(value);
13385
+ if (!token) throw new Error(`Expected a theme color token. Received: ${value}`);
13386
+ return token;
13387
+ }
13388
+ //#endregion
13389
+ //#region ../theme-core/src/site-styles/compilationPlan.ts
13390
+ const defaultHeaderBrandPreferences = {
13391
+ brandDisplay: "auto",
13392
+ logoSize: "auto"
12817
13393
  };
12818
- asBoundaryOptionId("break:expansive");
12819
- asBoundaryOptionId("break:wave");
12820
- asBoundaryOptionId("break:wave-balanced");
12821
- asBoundaryOptionId("break:wave-gentle");
12822
- asBoundaryOptionId("break:wave-bold");
12823
- asBoundaryOptionId("break:wave-drift");
12824
- asBoundaryOptionId("break:angle-subtle");
12825
- asBoundaryOptionId("break:angle-balanced");
12826
- asBoundaryOptionId("break:angle-steep");
12827
13394
  asBoundaryOptionId("break:unknown");
12828
13395
  const pageDesignUserPinnedAppearanceChoiceSchema = z.object({
12829
13396
  kind: z.literal("user-pinned"),
@@ -12950,14 +13517,11 @@ function validateUniquePageDesignPins(intent, ctx) {
12950
13517
  label: "block Look pin"
12951
13518
  });
12952
13519
  addDuplicateStringIssues(ctx, {
12953
- values: intent.boundaryPins.map((pin) => boundaryKey(pin.previousBlockId, pin.nextBlockId)),
13520
+ values: intent.boundaryPins.map((pin) => makeBoundaryId(pin.previousBlockId, pin.nextBlockId)),
12954
13521
  path: ["boundaryPins"],
12955
13522
  label: "boundary pin"
12956
13523
  });
12957
13524
  }
12958
- function boundaryKey(previousBlockId, nextBlockId) {
12959
- return makeBoundaryId(previousBlockId, nextBlockId);
12960
- }
12961
13525
  //#endregion
12962
13526
  //#region ../theme-core/src/accordions/siteStyleDefaults.ts
12963
13527
  /**
@@ -14585,6 +15149,13 @@ z.object({
14585
15149
  fields: nonEmptyRuntimeStyleFieldNamesSchema,
14586
15150
  authority: styleAuthoritySchema
14587
15151
  }).strict();
15152
+ asPageFlowPresetId("flow:quiet"), noneBoundaryOption.id, asPageFlowPresetId("flow:balanced"), softBoundaryOption.id, asPageFlowPresetId("flow:expressive"), spaciousBoundaryOption.id;
15153
+ asPageFlowPresetId("generated-default");
15154
+ asSiteStyleId("site-style:south-west-twerk-school");
15155
+ asAppearancePresetId("hero-brand-scrim-fixed-frame");
15156
+ asLayoutVariantKey("classic");
15157
+ asLayoutVariantKey("micro");
15158
+ asBoundaryOptionId("break:wave");
14588
15159
  //#endregion
14589
15160
  //#region ../theme-core/src/site-styles/runtimeCompiler.ts
14590
15161
  function defineSectionForegroundRuntimeTokens(input) {
@@ -14608,7 +15179,7 @@ function defineComponentRuntimeRules(rules) {
14608
15179
  }
14609
15180
  /**
14610
15181
  * Default design rules translate semantic page-level choices into the current
14611
- * runtime's section background and transition style-group vocabulary.
15182
+ * runtime's section background vocabulary.
14612
15183
  */
14613
15184
  const defaultDesignRuntimeRules = defineDesignRuntimeRules({
14614
15185
  sectionSurfaces: {
@@ -14643,8 +15214,7 @@ const defaultDesignRuntimeRules = defineDesignRuntimeRules({
14643
15214
  color: "surface",
14644
15215
  opacity: .88
14645
15216
  }
14646
- },
14647
- transitionClassName: (transition, fromSurface, toSurface) => transition === "none" ? null : `site-style-transition-${transition}-from-${fromSurface}-to-${toSurface}`
15217
+ }
14648
15218
  });
14649
15219
  /**
14650
15220
  * Default component rules translate frame and item-surface semantics into the
@@ -16379,19 +16949,11 @@ const curatedSiteStyles = [
16379
16949
  })
16380
16950
  ];
16381
16951
  new Map(curatedSiteStyles.map((style) => [style.id, style]));
16382
- asPageFlowPresetId("generated-default");
16383
- asSiteStyleId("site-style:south-west-twerk-school");
16384
- asAppearancePresetId("hero-brand-scrim-fixed-frame");
16385
- asLayoutVariantKey("classic");
16386
- asLayoutVariantKey("micro");
16387
- asBoundaryOptionId("break:wave");
16388
- asPageFlowPresetId("flow:quiet"), noneBoundaryOption.id, asPageFlowPresetId("flow:balanced"), softBoundaryOption.id, asPageFlowPresetId("flow:expressive"), spaciousBoundaryOption.id;
16389
16952
  //#endregion
16390
16953
  //#region ../theme-core/src/site-styles/resolver.ts
16391
16954
  const blockDesignFallback = {
16392
16955
  sectionSurface: "base",
16393
16956
  contentFrame: plainFrame,
16394
- transitionAfter: "none",
16395
16957
  sectionHeight: "default",
16396
16958
  heroLegibility: "none",
16397
16959
  imageSurfaceTreatment: { kind: "none" },
@@ -16402,7 +16964,7 @@ const blockDesignFallback = {
16402
16964
  accordionIconTreatment: null,
16403
16965
  composition: null
16404
16966
  };
16405
- blockDesignFallback.sectionSurface, blockDesignFallback.contentFrame, blockDesignFallback.transitionAfter, blockDesignFallback.sectionHeight, blockDesignFallback.heroLegibility, blockDesignFallback.imageSurfaceTreatment, blockDesignFallback.imageSurfaceMotion, blockDesignFallback.tileTreatment, blockDesignFallback.eventListTreatment, blockDesignFallback.eyebrowTreatment, blockDesignFallback.accordionIconTreatment, blockDesignFallback.composition;
16967
+ blockDesignFallback.sectionSurface, blockDesignFallback.contentFrame, blockDesignFallback.sectionHeight, blockDesignFallback.heroLegibility, blockDesignFallback.imageSurfaceTreatment, blockDesignFallback.imageSurfaceMotion, blockDesignFallback.tileTreatment, blockDesignFallback.eventListTreatment, blockDesignFallback.eyebrowTreatment, blockDesignFallback.accordionIconTreatment, blockDesignFallback.composition;
16406
16968
  //#endregion
16407
16969
  //#region ../theme-core/src/site-styles/siteChromeBackgrounds.ts
16408
16970
  const siteChromeBackgroundColorTokens = toSiteChromeBackgroundColorTokens(backgroundAppearanceColorTokenNames);
@@ -17005,7 +17567,8 @@ const siteOptionSources = [
17005
17567
  "eventCategories",
17006
17568
  "eventSeries",
17007
17569
  "venues",
17008
- "staffMembers"
17570
+ "staffMembers",
17571
+ "appointmentServiceCategories"
17009
17572
  ];
17010
17573
  const mediaDeliverySchema = z.object({
17011
17574
  sizes: z.string().optional(),
@@ -19254,9 +19817,7 @@ function navRow(opts) {
19254
19817
  rel: { $bind: { from: `${childItemName}.rel` } },
19255
19818
  "data-active": { $bind: { from: `${childItemName}.active` } }
19256
19819
  }, [text({ as: "span" }, bind(`${childItemName}.label`))], repeat(`${itemName}.children`, childItemName));
19257
- const dropdown = el("div", { className: "nav-dropdown rb-relative" }, [button({
19258
- type: "button",
19259
- variantId: "",
19820
+ const dropdown = el("div", { className: "nav-dropdown rb-relative" }, [el("headerControl", {
19260
19821
  className: prependClassName("nav-dropdown-trigger", linkClassName),
19261
19822
  "aria-haspopup": "menu",
19262
19823
  "aria-expanded": "false",
@@ -19324,9 +19885,7 @@ function navColumn(opts) {
19324
19885
  const dropdown = el("div", {
19325
19886
  className: "nav-mobile-dropdown",
19326
19887
  "data-nav-mobile-dropdown": "true"
19327
- }, [button({
19328
- type: "button",
19329
- variantId: "",
19888
+ }, [el("headerControl", {
19330
19889
  className: triggerClassName,
19331
19890
  "aria-expanded": "false",
19332
19891
  "aria-controls": childrenId,
@@ -25642,6 +26201,49 @@ const layoutTransforms = [
25642
26201
  footerLogoMediaClassTransform,
25643
26202
  footerLogoTextVisibleTransform
25644
26203
  ];
26204
+ //#endregion
26205
+ //#region ../blocks/src/system/transforms/registry/chromeLogo.ts
26206
+ const chromeLogoSchema = z.object({ surface: z.enum([
26207
+ "header-root",
26208
+ "header-mobile-panel",
26209
+ "footer-root"
26210
+ ]) });
26211
+ /** The brand foreground shares the logo's surface; navigation may own a separate capsule. */
26212
+ function chromeSurfaceTextToken(surface, theme, palette) {
26213
+ switch (surface) {
26214
+ case "header-root": {
26215
+ const header = theme.header;
26216
+ const foreground = resolveHeaderRootForeground(header, palette, resolveHeaderVisualStyles(header).isTransparent);
26217
+ return foreground.kind === "known" ? foreground.roles.text : resolveHeaderLeafTextColor(header);
26218
+ }
26219
+ case "header-mobile-panel": return theme.header?.dropdownStyle?.textColor ?? "text";
26220
+ case "footer-root": {
26221
+ const foreground = resolveFooterRootForeground(theme.footer, palette);
26222
+ return foreground.kind === "known" ? foreground.roles.text : void 0;
26223
+ }
26224
+ }
26225
+ }
26226
+ function readChromeTheme(viewModel) {
26227
+ return asPartialObject(asPartialObject(viewModel?.["$root"])?.theme) ?? {};
26228
+ }
26229
+ function resolveChromeSurfaceTone(surface, context) {
26230
+ return surfaceToneFromForegroundToken(context.theme.palette, chromeSurfaceTextToken(surface, readChromeTheme(context.viewModel), context.theme.palette));
26231
+ }
26232
+ const chromeLogoTransforms = [{
26233
+ id: "layout.chromeLogo",
26234
+ kind: "formatter",
26235
+ summary: "Select the light- or dark-background site logo for a header or footer surface",
26236
+ schema: chromeLogoSchema,
26237
+ run: (value, options, context) => {
26238
+ const content = asPartialObject(value);
26239
+ const variants = asPartialObject(content?.logoVariants);
26240
+ if (!variants) return content?.logo ?? null;
26241
+ return selectLogoVariant(resolveChromeSurfaceTone(options.surface, context), {
26242
+ forLightBackgrounds: variants.forLightBackgrounds ?? null,
26243
+ forDarkBackgrounds: variants.forDarkBackgrounds ?? null
26244
+ });
26245
+ }
26246
+ }];
25645
26247
  const headerRuntimeTransforms = [{
25646
26248
  id: "layout.headerRuntimeContract",
25647
26249
  kind: "formatter",
@@ -25841,46 +26443,42 @@ const whenTransformed = (from, transformId, equals = true) => (node) => ({
25841
26443
  equals
25842
26444
  }
25843
26445
  });
25844
- const logoRow = link({
26446
+ /** Draw whichever site logo suits the surface this row sits on. */
26447
+ const bindChromeLogo = (surface) => bind("content", { transforms: [{
26448
+ id: "layout.chromeLogo",
26449
+ options: { surface }
26450
+ }] });
26451
+ /**
26452
+ * The brand link. The logo is chosen per surface because the open mobile menu
26453
+ * paints its own background, which may be the opposite tone to the header.
26454
+ */
26455
+ const createLogoRow = (surface) => link({
25845
26456
  href: "/",
25846
26457
  className: bindProp("$root.theme.header.logo", {
25847
26458
  transforms: pipe(tx("layout.headerLogoClass")),
25848
26459
  fallback: "header-logo rb-flex rb-min-w-0 rb-items-center rb-gap-3 rb-no-underline rb-transition-opacity rb-hover-opacity-80"
25849
26460
  })
25850
- }, [
25851
- media({ className: bindProp("$root.theme.header.logo", {
25852
- transforms: pipe(tx("layout.headerLogoMediaClass", { base: "rb-header-logo-sm rb-w-auto rb-transition-all rb-duration-300" })),
25853
- fallback: "rb-header-logo-sm rb-w-auto rb-transition-all rb-duration-300"
25854
- }) }, when("content.logo"), bind("content.logo")),
25855
- stack({ className: "rb-contents" }, [media({ className: bindProp("$root.theme.header.logo", {
25856
- transforms: pipe(tx("layout.headerLogoMediaClass", { base: "rb-header-logo-sm rb-w-auto rb-transition-all rb-duration-300" })),
25857
- fallback: "rb-header-logo-sm rb-w-auto rb-transition-all rb-duration-300"
25858
- }) }, when("site.logo"), bind("site.logo"))], when("content.logo", { not: true })),
25859
- text({
25860
- as: "strong",
25861
- className: "header-logo-text rb-truncate"
25862
- }, whenTransformed("$root.theme.header.logo", "layout.headerLogoTextVisible"), bind("site.title", { fallback: "Your Site" }))
25863
- ]);
26461
+ }, [media({ className: bindProp("$root.theme.header.logo", {
26462
+ transforms: pipe(tx("layout.headerLogoMediaClass", { base: "rb-header-logo-sm rb-w-auto rb-transition-all rb-duration-300" })),
26463
+ fallback: "rb-header-logo-sm rb-w-auto rb-transition-all rb-duration-300"
26464
+ }) }, when("content.logo"), bindChromeLogo(surface)), text({
26465
+ as: "strong",
26466
+ className: "header-logo-text rb-truncate"
26467
+ }, whenTransformed("$root.theme.header.logo", "layout.headerLogoTextVisible"), bind("site.title", { fallback: "Your Site" }))]);
26468
+ const logoRow = createLogoRow("header-root");
25864
26469
  const centeredLogoRow = link({
25865
26470
  href: "/",
25866
26471
  className: bindProp("$root.theme.header.logo", {
25867
26472
  transforms: pipe(tx("layout.headerLogoClass", { base: "header-logo rb-flex rb-items-center rb-justify-center rb-gap-3 rb-text-center rb-no-underline rb-transition-opacity rb-hover-opacity-80" })),
25868
26473
  fallback: "header-logo rb-flex rb-items-center rb-justify-center rb-gap-3 rb-text-center rb-no-underline rb-transition-opacity rb-hover-opacity-80"
25869
26474
  })
25870
- }, [
25871
- media({ className: bindProp("$root.theme.header.logo", {
25872
- transforms: pipe(tx("layout.headerLogoMediaClass", { base: "rb-header-logo-lg rb-w-auto rb-transition-all rb-duration-300" })),
25873
- fallback: "rb-header-logo-lg rb-w-auto rb-transition-all rb-duration-300"
25874
- }) }, when("content.logo"), bind("content.logo")),
25875
- stack({ className: "rb-contents" }, [media({ className: bindProp("$root.theme.header.logo", {
25876
- transforms: pipe(tx("layout.headerLogoMediaClass", { base: "rb-header-logo-lg rb-w-auto rb-transition-all rb-duration-300" })),
25877
- fallback: "rb-header-logo-lg rb-w-auto rb-transition-all rb-duration-300"
25878
- }) }, when("site.logo"), bind("site.logo"))], when("content.logo", { not: true })),
25879
- text({
25880
- as: "strong",
25881
- className: "header-logo-text"
25882
- }, whenTransformed("$root.theme.header.logo", "layout.headerLogoTextVisible"), bind("site.title", { fallback: "Your Site" }))
25883
- ]);
26475
+ }, [media({ className: bindProp("$root.theme.header.logo", {
26476
+ transforms: pipe(tx("layout.headerLogoMediaClass", { base: "rb-header-logo-lg rb-w-auto rb-transition-all rb-duration-300" })),
26477
+ fallback: "rb-header-logo-lg rb-w-auto rb-transition-all rb-duration-300"
26478
+ }) }, when("content.logo"), bindChromeLogo("header-root")), text({
26479
+ as: "strong",
26480
+ className: "header-logo-text"
26481
+ }, whenTransformed("$root.theme.header.logo", "layout.headerLogoTextVisible"), bind("site.title", { fallback: "Your Site" }))]);
25884
26482
  const createNavRow = (className, align = "end") => navRow({
25885
26483
  className: `${className} header-nav-row`,
25886
26484
  align,
@@ -25920,10 +26518,8 @@ const mobileToggleIcon = stack({
25920
26518
  }
25921
26519
  ]);
25922
26520
  const mobileToggleButton = {
25923
- type: "button",
26521
+ type: "headerControl",
25924
26522
  props: {
25925
- type: "button",
25926
- variantId: "",
25927
26523
  className: `nav-mobile-toggle ${mobileOnlyDisplay("inline-flex")} rb-h-10 rb-w-10 rb-items-center rb-justify-center rb-rounded-md transition-theme-standard`,
25928
26524
  "aria-label": "Open menu",
25929
26525
  "aria-expanded": "false",
@@ -25933,10 +26529,8 @@ const mobileToggleButton = {
25933
26529
  children: [mobileToggleIcon]
25934
26530
  };
25935
26531
  const mobileOverlayToggleButton = {
25936
- type: "button",
26532
+ type: "headerControl",
25937
26533
  props: {
25938
- type: "button",
25939
- variantId: "",
25940
26534
  className: "nav-mobile-toggle rb-inline-flex rb-h-10 rb-w-10 rb-items-center rb-justify-center rb-rounded-md transition-theme-standard",
25941
26535
  "aria-label": "Open menu",
25942
26536
  "aria-expanded": "false",
@@ -25960,7 +26554,7 @@ const mobileOverlayHeader = inline({
25960
26554
  align: "center",
25961
26555
  justify: "between",
25962
26556
  style: borderColorStyle("border")
25963
- }, [logoRow, mobileOverlayToggleButton]);
26557
+ }, [createLogoRow("header-mobile-panel"), mobileOverlayToggleButton]);
25964
26558
  const mobileOverlayBody = stack({
25965
26559
  className: "rb-flex-1 rb-px-6 rb-py-6",
25966
26560
  gap: "md",
@@ -26147,7 +26741,10 @@ const brandLogo = link({
26147
26741
  options: { base: "rb-h-10 rb-w-auto" }
26148
26742
  }],
26149
26743
  fallback: "rb-h-10 rb-w-auto"
26150
- } } }, when("module.showLogo", { equals: true }), when("content.logo"), bind("content.logo")), text({
26744
+ } } }, when("module.showLogo", { equals: true }), when("content.logo"), bind("content", { transforms: [{
26745
+ id: "layout.chromeLogo",
26746
+ options: { surface: "footer-root" }
26747
+ }] })), text({
26151
26748
  as: "strong",
26152
26749
  className: "footer-logo-text rb-nav-text"
26153
26750
  }, when("module.showTitle", { equals: true }), bind("site.title", { fallback: "Your Site" }))], when("module.kind", { equals: "brand" }));
@@ -27840,6 +28437,15 @@ const appointmentServicesBlockDefinition = {
27840
28437
  required: false,
27841
28438
  ui: { intent: "content" }
27842
28439
  },
28440
+ createSiteOptionSelectField({
28441
+ id: "categoryId",
28442
+ label: "Category",
28443
+ description: "Show one category (with its heading and intro), or leave it on All categories to show everything grouped.",
28444
+ required: false,
28445
+ multiple: false,
28446
+ optionSource: "appointmentServiceCategories",
28447
+ ui: { intent: "content" }
28448
+ }),
27843
28449
  sectionStylesField({
27844
28450
  id: "_sectionStyles",
27845
28451
  label: "Section styles",
@@ -27874,6 +28480,7 @@ const appointmentServicesBlockDefinition = {
27874
28480
  richText({ className: "rb-prose rb-max-w-none" }, bind("content.description"), when("content.description")),
27875
28481
  el("appointment-services", {
27876
28482
  sectionHeading: { $bind: { from: "content.heading" } },
28483
+ categoryId: { $bind: { from: "content.categoryId" } },
27877
28484
  services: { $bind: { from: "data.services" } },
27878
28485
  pathname: { $bind: { from: "$root.pathname" } },
27879
28486
  servicePathPrefix: { $bind: { from: "$root.appointmentServicePathPrefix" } }
@@ -28348,6 +28955,12 @@ const occurrenceContextSchema = z.object({
28348
28955
  capacityOverride: z.number().nullable().optional(),
28349
28956
  overrides: z.record(z.string(), z.unknown()).nullable().optional()
28350
28957
  }).nullable();
28958
+ //#endregion
28959
+ //#region ../blocks/src/system/runtime/api/readAuthority.ts
28960
+ const browserReadAuthoritySchema = z.discriminatedUnion("kind", [z.object({ kind: z.literal("published") }).strict(), z.object({
28961
+ kind: z.literal("preview"),
28962
+ token: z.string().min(1)
28963
+ }).strict()]);
28351
28964
  const unsupportedEventRegistrationPageSurfaceSubjectSchema = z.object({
28352
28965
  kind: z.literal("unsupported"),
28353
28966
  reason: z.enum([
@@ -28610,6 +29223,7 @@ const eventRegistrationSourceSchema = z.object({
28610
29223
  apiBaseUrl: z.string().optional(),
28611
29224
  portalToken: z.string().nullable().optional(),
28612
29225
  previewToken: z.string().nullable().optional(),
29226
+ readAuthority: browserReadAuthoritySchema.optional(),
28613
29227
  ...eventRegistrationHydrationSchemaShape,
28614
29228
  events: z.array(eventRegistrationPublicEventSchema).nullable().optional(),
28615
29229
  wholeSeriesRunEvents: z.array(eventRegistrationPublicEventSchema).nullable().optional(),
@@ -28647,6 +29261,7 @@ z.object({
28647
29261
  apiBaseUrl: z.string().optional(),
28648
29262
  portalToken: z.string().nullable().optional(),
28649
29263
  previewToken: z.string().nullable().optional(),
29264
+ readAuthority: browserReadAuthoritySchema.optional(),
28650
29265
  stage: previewStageSchema.optional()
28651
29266
  });
28652
29267
  function buildEventRegistrationDisplayFromScopedEvents(source, scopedSourceEvents) {
@@ -28905,6 +29520,7 @@ const eventRegistrationBlockDefinition = {
28905
29520
  text({ as: "h2" }, bind("content.heading"), when("content.heading")),
28906
29521
  richText({ className: "rb-prose rb-max-w-none" }, bind("content.description"), when("content.description")),
28907
29522
  eventRegistration(withApiBindings({
29523
+ readAuthority: { $bind: { from: "$root.readAuthority" } },
28908
29524
  occurrenceContext: { $bind: { from: "$root.occurrenceContext" } },
28909
29525
  subject: { $bind: { from: "$root.subject" } },
28910
29526
  portalToken: { $bind: {
@@ -29556,6 +30172,7 @@ const eventCollectionSourceSchemaShape = {
29556
30172
  events: z.array(publicEventSchema).nullable().optional(),
29557
30173
  siteId: z.string(),
29558
30174
  apiBaseUrl: z.string().optional(),
30175
+ readAuthority: browserReadAuthoritySchema.optional(),
29559
30176
  stage: previewStageSchema.optional(),
29560
30177
  listLayout: eventLayoutSchema.optional(),
29561
30178
  listColumns: columnOptionSchema.optional(),
@@ -29608,7 +30225,6 @@ const eventCollectionDisplaySchemaShape = {
29608
30225
  const eventCollectionHydrationSchema = z.object({
29609
30226
  siteId: z.string(),
29610
30227
  calendarWindow: calendarWindowPageSchema.optional(),
29611
- stage: previewStageSchema.optional(),
29612
30228
  prefetchedEvents: z.boolean(),
29613
30229
  eventSurface: eventSurfaceScopeSchema$1,
29614
30230
  filterEventPresets: z.string().nullable(),
@@ -29683,7 +30299,6 @@ function buildEventCollectionHydration(source, now = /* @__PURE__ */ new Date())
29683
30299
  return {
29684
30300
  calendarWindow: source.calendarWindow ?? void 0,
29685
30301
  siteId: source.siteId,
29686
- stage: source.stage,
29687
30302
  prefetchedEvents: source.events != null,
29688
30303
  eventSurface: selected ? "all" : normalizeEventSurfaceScope(source.eventSurface),
29689
30304
  filterEventPresets: selected ? null : normalizeEventSurfacePresetsCsv(source.filterEventPresets),
@@ -29703,6 +30318,7 @@ const eventListingSourceSchema = z.object({
29703
30318
  events: z.array(publicEventSchema).nullable().optional(),
29704
30319
  siteId: z.string(),
29705
30320
  apiBaseUrl: z.string().optional(),
30321
+ readAuthority: browserReadAuthoritySchema.optional(),
29706
30322
  stage: previewStageSchema.optional(),
29707
30323
  layout: eventLayoutSchema.optional(),
29708
30324
  columns: columnOptionSchema.optional(),
@@ -29743,7 +30359,6 @@ const eventListingDisplaySchema = z.object({
29743
30359
  });
29744
30360
  const eventListingHydrationSchema = z.object({
29745
30361
  siteId: z.string(),
29746
- stage: previewStageSchema.optional(),
29747
30362
  eventsPerPage: eventPageSizeSchema,
29748
30363
  paginationAction: eventListPaginationActionSchema,
29749
30364
  showFilters: z.boolean(),
@@ -29766,6 +30381,7 @@ const eventListingRenderSchema = z.object({
29766
30381
  z.object({
29767
30382
  siteId: z.string(),
29768
30383
  apiBaseUrl: z.string().optional(),
30384
+ readAuthority: browserReadAuthoritySchema.optional(),
29769
30385
  stage: previewStageSchema.optional()
29770
30386
  });
29771
30387
  const eventListingBlockRuntime = defineProgressiveBlockRuntime({
@@ -29800,7 +30416,6 @@ const eventListingBlockRuntime = defineProgressiveBlockRuntime({
29800
30416
  },
29801
30417
  hydration: {
29802
30418
  siteId: source.siteId,
29803
- stage: source.stage,
29804
30419
  eventsPerPage: pageSize,
29805
30420
  paginationAction: resolveEventListPaginationAction({
29806
30421
  paginationMode: source.paginationMode,
@@ -30082,6 +30697,7 @@ const eventListingBlockDefinition = {
30082
30697
  rootType: "stack",
30083
30698
  rootProps: { gap: "lg" },
30084
30699
  children: [...eventSectionHeaderLayoutNodes(), el("event-listing", withApiBindings({
30700
+ readAuthority: { $bind: { from: "$root.readAuthority" } },
30085
30701
  events: { $bind: { from: "data.events" } },
30086
30702
  stage: { $bind: {
30087
30703
  from: "$root.previewStage",
@@ -30279,6 +30895,7 @@ const eventCalendarRenderSchema = z.object({
30279
30895
  z.object({
30280
30896
  siteId: z.string(),
30281
30897
  apiBaseUrl: z.string().optional(),
30898
+ readAuthority: browserReadAuthoritySchema.optional(),
30282
30899
  stage: previewStageSchema.optional()
30283
30900
  });
30284
30901
  /**
@@ -30300,7 +30917,7 @@ function buildEventCalendarDisplay(source) {
30300
30917
  listColumns: source.listColumns ?? source.columns
30301
30918
  }),
30302
30919
  kind: "event-calendar",
30303
- displayMode: normalizeEventCalendarDisplayMode$1(source) ?? "combined",
30920
+ displayMode: resolveEventCalendarReadPlan(source).mode,
30304
30921
  className: source.className ?? null,
30305
30922
  events: (source.events ?? []).slice().sort((left, right) => new Date(left.startsAt).getTime() - new Date(right.startsAt).getTime()),
30306
30923
  boardTitle: normalizeOptionalText(source.boardTitle),
@@ -30317,13 +30934,16 @@ const eventCalendarBlockRuntime = defineProgressiveBlockRuntime({
30317
30934
  source: createZodCodec(eventCalendarSourceSchema),
30318
30935
  render: createZodCodec(eventCalendarRenderSchema)
30319
30936
  },
30320
- buildRender: (source) => ({
30321
- display: buildEventCalendarDisplay(source.calendarWindow && (source.variant ?? source.displayMode ?? "combined") !== "combined" && (source.variant ?? source.displayMode) !== "list" ? {
30322
- ...source,
30323
- events: source.calendarWindow.events
30324
- } : source),
30325
- hydration: buildEventCollectionHydration(source)
30326
- })
30937
+ buildRender: (source) => {
30938
+ const plan = resolveEventCalendarReadPlan(source);
30939
+ return {
30940
+ display: buildEventCalendarDisplay(source.calendarWindow && plan.jobs === "calendar" ? {
30941
+ ...source,
30942
+ events: source.calendarWindow.events
30943
+ } : source),
30944
+ hydration: buildEventCollectionHydration(source)
30945
+ };
30946
+ }
30327
30947
  });
30328
30948
  //#endregion
30329
30949
  //#region ../blocks/src/system/blocks/events/eventCalendarDataLoaders.ts
@@ -30473,6 +31093,7 @@ const eventCalendarLayout = [styledSection({
30473
31093
  rootType: "stack",
30474
31094
  rootProps: { gap: "lg" },
30475
31095
  children: [...eventSectionHeaderLayoutNodes({ splitClassName: "event-section-head event-section-head--split" }), el("event-calendar", withApiBindings({
31096
+ readAuthority: { $bind: { from: "$root.readAuthority" } },
30476
31097
  events: { $bind: { from: "data.events" } },
30477
31098
  calendarWindow: { $bind: { from: "data.calendarWindow" } },
30478
31099
  stage: { $bind: {
@@ -34260,6 +34881,7 @@ const shopSourceSchema = z.object({
34260
34881
  products: z.array(publicProductSchema).nullable().optional(),
34261
34882
  siteId: z.string().optional(),
34262
34883
  apiBaseUrl: z.string().optional(),
34884
+ readAuthority: browserReadAuthoritySchema.optional(),
34263
34885
  stage: previewStageSchema.optional()
34264
34886
  });
34265
34887
  const productVariantOptionDisplaySchema = z.object({
@@ -34427,6 +35049,7 @@ function resolveShowPricePerCredit(source) {
34427
35049
  z.object({
34428
35050
  siteId: z.string().optional(),
34429
35051
  apiBaseUrl: z.string().optional(),
35052
+ readAuthority: browserReadAuthoritySchema.optional(),
34430
35053
  stage: previewStageSchema.optional()
34431
35054
  });
34432
35055
  const shopBlockRuntime = defineProgressiveBlockRuntime({
@@ -34767,6 +35390,7 @@ const shopBlockDefinition = {
34767
35390
  baseClass: "",
34768
35391
  spacing: "spacious",
34769
35392
  children: sectionContainer([shop(withApiBindings({
35393
+ readAuthority: { $bind: { from: "$root.readAuthority" } },
34770
35394
  mode: "passes-memberships",
34771
35395
  showPasses: { $bind: {
34772
35396
  from: "content.showPasses",
@@ -34965,6 +35589,7 @@ const productListBlockDefinition = {
34965
35589
  baseClass: "",
34966
35590
  spacing: "spacious",
34967
35591
  children: sectionContainer([productList(withApiBindings({
35592
+ readAuthority: { $bind: { from: "$root.readAuthority" } },
34968
35593
  mode: "product-list",
34969
35594
  heading: { $bind: {
34970
35595
  from: "content.heading",
@@ -35107,6 +35732,7 @@ const productDetailBlockDefinition = {
35107
35732
  baseClass: "",
35108
35733
  spacing: "spacious",
35109
35734
  children: sectionContainer([productDetail(withApiBindings({
35735
+ readAuthority: { $bind: { from: "$root.readAuthority" } },
35110
35736
  mode: "product-detail",
35111
35737
  heading: { $bind: {
35112
35738
  from: "content.heading",
@@ -35223,6 +35849,7 @@ const cartBlockDefinition = {
35223
35849
  baseClass: "",
35224
35850
  spacing: "spacious",
35225
35851
  children: sectionContainer([cart(withApiBindings({
35852
+ readAuthority: { $bind: { from: "$root.readAuthority" } },
35226
35853
  mode: "cart",
35227
35854
  heading: { $bind: {
35228
35855
  from: "content.heading",
@@ -35306,6 +35933,7 @@ const checkoutBlockDefinition = {
35306
35933
  baseClass: "",
35307
35934
  spacing: "spacious",
35308
35935
  children: sectionContainer([checkout(withApiBindings({
35936
+ readAuthority: { $bind: { from: "$root.readAuthority" } },
35309
35937
  mode: "checkout",
35310
35938
  heading: { $bind: {
35311
35939
  from: "content.heading",
@@ -37964,8 +38592,8 @@ const defaultTransforms = createTransformRegistry([
37964
38592
  summary: "Choose the read projection required by the calendar display mode",
37965
38593
  schema: z.object({ job: z.enum(["list", "calendar"]) }),
37966
38594
  run(value, options) {
37967
- const mode = normalizeEventCalendarDisplayMode$1(asPartialObject(value) ?? {}) ?? "combined";
37968
- return options.job === "calendar" ? mode !== "list" : mode === "list" || mode === "combined";
38595
+ const plan = resolveEventCalendarReadPlan(asPartialObject(value) ?? {});
38596
+ return plan.jobs === "both" || plan.jobs === options.job;
37969
38597
  }
37970
38598
  },
37971
38599
  {
@@ -37978,6 +38606,7 @@ const defaultTransforms = createTransformRegistry([
37978
38606
  },
37979
38607
  ...formattingTransforms,
37980
38608
  ...layoutTransforms,
38609
+ ...chromeLogoTransforms,
37981
38610
  ...uiTransforms,
37982
38611
  ...mediaTransforms,
37983
38612
  ...backgroundTransforms,
@@ -38310,6 +38939,17 @@ function coerceToString(value) {
38310
38939
  return "";
38311
38940
  }
38312
38941
  /**
38942
+ * The appointment-services catalogue (issue 1403) pairs the services with the
38943
+ * site's ordered categories. Both are needed to group them, so that response
38944
+ * is passed through whole; any other `{ services }` wrapper is unwrapped.
38945
+ */
38946
+ function coerceServicesPayload(record) {
38947
+ return Array.isArray(record.services) && Array.isArray(record.categories) ? {
38948
+ services: record.services,
38949
+ categories: record.categories
38950
+ } : record.services;
38951
+ }
38952
+ /**
38313
38953
  * Extract data from API response.
38314
38954
  * Unwraps common response wrappers: { data }, { form }, { entries }, { services }, { teamMembers }
38315
38955
  *
@@ -38324,7 +38964,7 @@ function coercePayload(payload) {
38324
38964
  if ("data" in record && typeof record.data !== "function") return record.data;
38325
38965
  if ("form" in record && typeof record.form !== "function") return record.form;
38326
38966
  if ("entries" in record && typeof record.entries !== "function") return record.entries;
38327
- if ("services" in record && typeof record.services !== "function") return record.services;
38967
+ if ("services" in record && typeof record.services !== "function") return coerceServicesPayload(record);
38328
38968
  if ("teamMembers" in record && typeof record.teamMembers !== "function") return record.teamMembers;
38329
38969
  }
38330
38970
  return payload;
@@ -39226,7 +39866,12 @@ const appointmentSetupServiceDraftSchema = z.object({
39226
39866
  venue: appointmentSetupVenueChoiceSchema,
39227
39867
  timezone: z.string().trim().min(1).nullable(),
39228
39868
  payment: appointmentSetupPaymentDraftSchema,
39229
- assignment: appointmentSetupServiceAssignmentDraftSchema
39869
+ assignment: appointmentSetupServiceAssignmentDraftSchema,
39870
+ /**
39871
+ * The service's category, or null for "Other" (issue 1403). Omitted leaves
39872
+ * an existing service's category alone and puts a new one in "Other".
39873
+ */
39874
+ categoryId: z.string().uuid().nullable().optional()
39230
39875
  }).superRefine((service, ctx) => {
39231
39876
  if (service.payment.kind !== "free" && (service.priceAmount === null || service.priceAmount <= 0)) ctx.addIssue({
39232
39877
  code: "custom",