@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
@@ -2257,6 +2257,8 @@ const buttonSystemSchema = z.strictObject({
2257
2257
  //#endregion
2258
2258
  //#region ../theme-core/src/palette/utils/colorConversion.ts
2259
2259
  const clamp01 = (x) => Math.max(0, Math.min(1, x));
2260
+ const mod = (a, n) => (a % n + n) % n;
2261
+ const deg = (x) => mod(x, 360);
2260
2262
  function hexToRgb(hex) {
2261
2263
  const h = hex.replace(/^#/, "");
2262
2264
  const m = h.length === 3 ? h.split("").map((c) => c + c).join("") : h;
@@ -2279,6 +2281,45 @@ function srgbToLinear(u) {
2279
2281
  function linearToSrgb(x) {
2280
2282
  return clamp01(x <= .0031308 ? 12.92 * x : 1.055 * Math.pow(x, 1 / 2.4) - .055) * 255;
2281
2283
  }
2284
+ function rgbToHsl(r, g, b) {
2285
+ const R = r / 255, G = g / 255, B = b / 255;
2286
+ const max = Math.max(R, G, B), min = Math.min(R, G, B);
2287
+ const d = max - min;
2288
+ let h = 0;
2289
+ if (d !== 0) {
2290
+ switch (max) {
2291
+ case R:
2292
+ h = (G - B) / d + (G < B ? 6 : 0);
2293
+ break;
2294
+ case G:
2295
+ h = (B - R) / d + 2;
2296
+ break;
2297
+ case B:
2298
+ h = (R - G) / d + 4;
2299
+ break;
2300
+ }
2301
+ h *= 60;
2302
+ }
2303
+ const l = (max + min) / 2;
2304
+ const s = d === 0 ? 0 : d / (1 - Math.abs(2 * l - 1));
2305
+ return {
2306
+ h,
2307
+ s,
2308
+ l
2309
+ };
2310
+ }
2311
+ function srgbToOklab(r, g, b) {
2312
+ const R = srgbToLinear(r), G = srgbToLinear(g), B = srgbToLinear(b);
2313
+ const l = .4122214708 * R + .5363325363 * G + .0514459929 * B;
2314
+ const m = .2119034982 * R + .6806995451 * G + .1073969566 * B;
2315
+ const s = .0883024619 * R + .2817188376 * G + .6299787005 * B;
2316
+ const l_ = Math.cbrt(l), m_ = Math.cbrt(m), s_ = Math.cbrt(s);
2317
+ return {
2318
+ L: .2104542553 * l_ + .793617785 * m_ - .0040720468 * s_,
2319
+ a: 1.9779984951 * l_ - 2.428592205 * m_ + .4505937099 * s_,
2320
+ b: .0259040371 * l_ + .7827717662 * m_ - .808675766 * s_
2321
+ };
2322
+ }
2282
2323
  function oklabToSrgb(L, a, b) {
2283
2324
  const l_ = Math.pow(L + .3963377774 * a + .2158037573 * b, 3);
2284
2325
  const m_ = Math.pow(L - .1055613458 * a - .0638541728 * b, 3);
@@ -2292,6 +2333,14 @@ function oklabToSrgb(L, a, b) {
2292
2333
  b: linearToSrgb(B)
2293
2334
  };
2294
2335
  }
2336
+ function oklabToOklch(L, a, b) {
2337
+ const C = Math.sqrt(a * a + b * b);
2338
+ return {
2339
+ L,
2340
+ C,
2341
+ h: C < 1e-7 ? 0 : deg(Math.atan2(b, a) * 180 / Math.PI)
2342
+ };
2343
+ }
2295
2344
  function oklchToOklab(L, C, h) {
2296
2345
  const hr = h * Math.PI / 180;
2297
2346
  return {
@@ -2300,6 +2349,27 @@ function oklchToOklab(L, C, h) {
2300
2349
  b: C * Math.sin(hr)
2301
2350
  };
2302
2351
  }
2352
+ function featuresFromHex(hex) {
2353
+ const { r, g, b } = hexToRgb(hex);
2354
+ const { h, s, l } = rgbToHsl(r, g, b);
2355
+ const { L, a, b: b2 } = srgbToOklab(r, g, b);
2356
+ const { L: okL, C: okC, h: okH } = oklabToOklch(L, a, b2);
2357
+ return {
2358
+ r,
2359
+ g,
2360
+ b,
2361
+ h,
2362
+ s,
2363
+ l,
2364
+ v: Math.max(r, g, b) / 255,
2365
+ Y: .2126 * srgbToLinear(r) + .7152 * srgbToLinear(g) + .0722 * srgbToLinear(b),
2366
+ chroma: s,
2367
+ okL,
2368
+ okC,
2369
+ okH,
2370
+ hex
2371
+ };
2372
+ }
2303
2373
  function relativeLuminance(r, g, b) {
2304
2374
  const R = srgbToLinear(r), G = srgbToLinear(g), B = srgbToLinear(b);
2305
2375
  return .2126 * R + .7152 * G + .0722 * B;
@@ -3349,6 +3419,36 @@ function normalizedReference(value) {
3349
3419
  return normalized.length > 0 ? normalized : null;
3350
3420
  }
3351
3421
  //#endregion
3422
+ //#region ../theme-core/src/surfaces/logoVariant.ts
3423
+ /** Concrete hex behind a plain, opaque palette token, or null otherwise. */
3424
+ function opaquePaletteHexForToken(expandedPalette, token) {
3425
+ if (!token) return null;
3426
+ const parts = parseColorTokenParts(token);
3427
+ if (parts.kind !== "token" || parts.opacityPercent !== null) return null;
3428
+ return expandedPalette[parts.token] ?? null;
3429
+ }
3430
+ /**
3431
+ * Tone of the surface a foreground token was resolved for.
3432
+ *
3433
+ * A token with opacity has no known underlay to composite against, and a raw
3434
+ * or unrecognised token has no palette hex, so both are `unknown` rather than
3435
+ * a guess.
3436
+ */
3437
+ function surfaceToneFromForegroundToken(expandedPalette, foregroundToken) {
3438
+ const hex = opaquePaletteHexForToken(expandedPalette, foregroundToken);
3439
+ if (!hex) return "unknown";
3440
+ return featuresFromHex(hex).Y >= .5 ? "dark" : "light";
3441
+ }
3442
+ /**
3443
+ * The logo to draw on a surface of the given tone. A missing variant falls
3444
+ * back to the other one, and an unknown tone uses the light-backgrounds logo,
3445
+ * which is what every site rendered before variants existed.
3446
+ */
3447
+ function selectLogoVariant(tone, variants) {
3448
+ const { forLightBackgrounds, forDarkBackgrounds } = variants;
3449
+ return tone === "dark" ? forDarkBackgrounds ?? forLightBackgrounds : forLightBackgrounds ?? forDarkBackgrounds;
3450
+ }
3451
+ //#endregion
3352
3452
  //#region ../theme-core/src/utils/colorStyles.ts
3353
3453
  const COLOR_VAR_PREFIX = "--tb-";
3354
3454
  function parseToken(source) {
@@ -3400,16 +3500,28 @@ function backgroundColorStyle(token) {
3400
3500
  return { backgroundColor: rgbColorValue(token) };
3401
3501
  }
3402
3502
  /**
3503
+ * Converts a text color token to a CSS color value that follows the enclosing
3504
+ * surface. The semantic text tokens (`text`, `heading`, `mutedText`) resolve
3505
+ * to the surface foreground variables, so text adapts when a section's
3506
+ * background changes; any other token is a fixed theme color.
3507
+ *
3508
+ * @param token - Theme color token
3509
+ * @returns CSS color value
3510
+ */
3511
+ function textColorValue(token) {
3512
+ const parsed = parseToken(token);
3513
+ const surfaceRole = parsed.raw ? null : surfaceRoleForTextToken(parsed.token);
3514
+ if (!surfaceRole) return rgbColorValue(token);
3515
+ return parsed.opacityPercent === void 0 ? surfaceForegroundValue(surfaceRole) : surfaceForegroundValueWithOpacity(surfaceRole, parsed.opacityPercent);
3516
+ }
3517
+ /**
3403
3518
  * Creates a text color style object from a theme token.
3404
3519
  *
3405
3520
  * @param token - Theme color token
3406
3521
  * @returns CSSProperties with color
3407
3522
  */
3408
3523
  function textColorStyle(token) {
3409
- const parsed = parseToken(token);
3410
- const surfaceRole = parsed.raw ? null : surfaceRoleForTextToken(parsed.token);
3411
- if (surfaceRole) return { color: parsed.opacityPercent === void 0 ? surfaceForegroundValue(surfaceRole) : surfaceForegroundValueWithOpacity(surfaceRole, parsed.opacityPercent) };
3412
- return { color: rgbColorValue(token) };
3524
+ return { color: textColorValue(token) };
3413
3525
  }
3414
3526
  /**
3415
3527
  * Creates a border color style object from a theme token.
@@ -6593,6 +6705,15 @@ function asSiteStyleId(value) {
6593
6705
  function asDesignSystemTemplateId(value) {
6594
6706
  return brandNonEmptyString(value, "DesignSystemTemplateId");
6595
6707
  }
6708
+ function toNonEmptyReadonlyArray(values) {
6709
+ const [first, ...rest] = values;
6710
+ return first === void 0 ? null : [first, ...rest];
6711
+ }
6712
+ function requireNonEmptyReadonlyArray(values, message = "Expected a non-empty array.") {
6713
+ const result = toNonEmptyReadonlyArray(values);
6714
+ if (!result) throw new Error(message);
6715
+ return result;
6716
+ }
6596
6717
  function makeBoundaryId(previousBlockId, nextBlockId) {
6597
6718
  return asDesignBoundaryId(`boundary:${encodeURIComponent(previousBlockId)}:${encodeURIComponent(nextBlockId)}`);
6598
6719
  }
@@ -6795,16 +6916,18 @@ const themeV2RuntimeStyleFieldNames = [
6795
6916
  "_frameStyles",
6796
6917
  "_sectionStyles",
6797
6918
  "_containerStyles",
6798
- "_cardStyles",
6799
- "_transitionStyles",
6800
- "styleGroup"
6919
+ "_cardStyles"
6801
6920
  ];
6802
6921
  const themeV2BlockSpecificRawStyleFieldNames = [
6803
6922
  "_contentCardStyles",
6804
6923
  "_heroLayoutStyles",
6805
6924
  "_textCardStyles"
6806
6925
  ];
6807
- const themeV2NormalEditorRawStyleFieldNames = [...themeV2RuntimeStyleFieldNames, ...themeV2BlockSpecificRawStyleFieldNames];
6926
+ const themeV2NormalEditorRawStyleFieldNames = [
6927
+ ...themeV2RuntimeStyleFieldNames,
6928
+ ...themeV2BlockSpecificRawStyleFieldNames,
6929
+ "styleGroup"
6930
+ ];
6808
6931
  new Set(themeV2NormalEditorRawStyleFieldNames);
6809
6932
  [...themeV2RuntimeStyleFieldNames, ...themeV2BlockSpecificRawStyleFieldNames];
6810
6933
  const pageDesignEditorBackgroundOverrideOwner = "page-design-editor";
@@ -8313,6 +8436,33 @@ function normalizeEventCalendarDisplayMode$1(input) {
8313
8436
  if (isEventCalendarDisplayMode(input.variant)) return input.variant;
8314
8437
  return isEventCalendarDisplayMode(input.displayMode) ? input.displayMode : void 0;
8315
8438
  }
8439
+ /** One closed authority for the projections required by each rendered mode. */
8440
+ function resolveEventCalendarReadPlan(input) {
8441
+ const mode = normalizeEventCalendarDisplayMode$1(input) ?? "combined";
8442
+ switch (mode) {
8443
+ case "combined": return {
8444
+ mode,
8445
+ jobs: "both",
8446
+ readProfile: "listing-card"
8447
+ };
8448
+ case "list": return {
8449
+ mode,
8450
+ jobs: "list",
8451
+ readProfile: "listing-card"
8452
+ };
8453
+ case "calendar": return {
8454
+ mode,
8455
+ jobs: "calendar",
8456
+ readProfile: "listing-card"
8457
+ };
8458
+ case "timetable":
8459
+ case "week-board": return {
8460
+ mode,
8461
+ jobs: "calendar",
8462
+ readProfile: "timetable"
8463
+ };
8464
+ }
8465
+ }
8316
8466
  function isEventCalendarDefaultView(value) {
8317
8467
  return typeof value === "string" && eventCalendarDefaultViewValues.includes(value);
8318
8468
  }
@@ -8322,8 +8472,7 @@ function isEventCalendarListLayout(value) {
8322
8472
  //#endregion
8323
8473
  //#region ../blocks/src/system/blocks/events/shared/calendarWindow.ts
8324
8474
  function resolveCalendarReadProfile(content) {
8325
- const mode = normalizeEventCalendarDisplayMode$1(content);
8326
- return mode === "timetable" || mode === "week-board" ? "timetable" : "listing-card";
8475
+ return resolveEventCalendarReadPlan(content).readProfile;
8327
8476
  }
8328
8477
  /** Runtime picker sentinels and bound loader IDs must describe the same query. */
8329
8478
  function normalizeCalendarFilterId(value) {
@@ -8412,6 +8561,75 @@ const calendarWindowPageSchema = z.discriminatedUnion("kind", [z.object({
8412
8561
  nextCursor: calendarSourceCursorSchema
8413
8562
  })]);
8414
8563
  //#endregion
8564
+ //#region ../api/src/defineEndpointDefinitions.ts
8565
+ /**
8566
+ * Validates extracted endpoint descriptors while preserving each literal path,
8567
+ * method, and parameter contract for the typed URL builders.
8568
+ */
8569
+ function defineEndpointDefinitions(definitions) {
8570
+ return definitions;
8571
+ }
8572
+ //#endregion
8573
+ //#region ../api/src/publicNewsletterEndpointDefinitions.ts
8574
+ const PUBLIC_NEWSLETTER_ENDPOINT_DEFINITIONS = defineEndpointDefinitions({
8575
+ subscribeNewsletter: {
8576
+ path: "/public/sites/{siteId}/newsletter/subscribe",
8577
+ method: "POST",
8578
+ tags: ["public-newsletter-{siteId}"],
8579
+ auth: "public",
8580
+ responseKind: "json"
8581
+ },
8582
+ confirmNewsletter: {
8583
+ path: "/public/sites/{siteId}/newsletter/confirm/{token}",
8584
+ method: "GET",
8585
+ tags: ["public-newsletter-{siteId}"],
8586
+ auth: "public",
8587
+ responseKind: "text"
8588
+ },
8589
+ unsubscribeNewsletter: {
8590
+ path: "/public/sites/{siteId}/newsletter/unsubscribe/{token}",
8591
+ method: "GET",
8592
+ tags: ["public-newsletter-{siteId}"],
8593
+ auth: "public",
8594
+ responseKind: "text"
8595
+ },
8596
+ unsubscribeNewsletterPost: {
8597
+ path: "/public/sites/{siteId}/newsletter/unsubscribe/{token}",
8598
+ method: "POST",
8599
+ tags: ["public-newsletter-{siteId}"],
8600
+ auth: "public",
8601
+ responseKind: "text"
8602
+ },
8603
+ confirmNewsletterPost: {
8604
+ path: "/public/sites/{siteId}/newsletter/confirm/{token}",
8605
+ method: "POST",
8606
+ tags: ["public-newsletter-{siteId}"],
8607
+ auth: "public",
8608
+ responseKind: "text"
8609
+ },
8610
+ getNewsletterPreferences: {
8611
+ path: "/public/sites/{siteId}/newsletter/preferences/{token}",
8612
+ method: "GET",
8613
+ tags: ["public-newsletter-{siteId}"],
8614
+ auth: "public",
8615
+ responseKind: "text"
8616
+ },
8617
+ saveNewsletterPreferences: {
8618
+ path: "/public/sites/{siteId}/newsletter/preferences/{token}",
8619
+ method: "POST",
8620
+ tags: ["public-newsletter-{siteId}"],
8621
+ auth: "public",
8622
+ responseKind: "text"
8623
+ },
8624
+ getNewsletterArchive: {
8625
+ path: "/public/sites/{siteId}/newsletter/archive/{token}",
8626
+ method: "GET",
8627
+ tags: ["public-newsletter-{siteId}"],
8628
+ auth: "public",
8629
+ responseKind: "text"
8630
+ }
8631
+ });
8632
+ //#endregion
8415
8633
  //#region ../api/src/apiEndpointTypes.ts
8416
8634
  function allowedDemoMutationPolicy() {
8417
8635
  return {
@@ -8503,17 +8721,85 @@ const SDK_ENTRY_READ_ENDPOINTS = {
8503
8721
  }
8504
8722
  };
8505
8723
  //#endregion
8506
- //#region ../api/src/defineEndpointDefinitions.ts
8507
- /**
8508
- * Validates extracted endpoint descriptors while preserving each literal path,
8509
- * method, and parameter contract for the typed URL builders.
8510
- */
8511
- function defineEndpointDefinitions(definitions) {
8512
- return definitions;
8513
- }
8514
- //#endregion
8515
8724
  //#region ../api/src/appointmentEndpointDefinitions.ts
8516
8725
  const APPOINTMENT_ENDPOINT_DEFINITIONS = defineEndpointDefinitions({
8726
+ ...defineEndpointDefinitions({
8727
+ listGroupedAppointmentServices: {
8728
+ path: "/sites/{siteId}/bookings/services/grouped",
8729
+ method: "GET",
8730
+ auth: "user",
8731
+ responseKind: "json",
8732
+ errors: ["server:internal_error"]
8733
+ },
8734
+ reorderAppointmentServices: {
8735
+ path: "/sites/{siteId}/bookings/services/order",
8736
+ method: "PUT",
8737
+ auth: "user",
8738
+ responseKind: "json",
8739
+ errors: [
8740
+ "validation:invalid_input",
8741
+ "auth:forbidden",
8742
+ "resource:not_found",
8743
+ "resource:conflict",
8744
+ "server:internal_error"
8745
+ ]
8746
+ },
8747
+ listAppointmentServiceCategories: {
8748
+ path: "/sites/{siteId}/bookings/service-categories",
8749
+ method: "GET",
8750
+ auth: "user",
8751
+ responseKind: "json",
8752
+ errors: ["server:internal_error"]
8753
+ },
8754
+ createAppointmentServiceCategory: {
8755
+ path: "/sites/{siteId}/bookings/service-categories",
8756
+ method: "POST",
8757
+ auth: "user",
8758
+ responseKind: "json",
8759
+ errors: [
8760
+ "validation:invalid_input",
8761
+ "auth:forbidden",
8762
+ "resource:conflict",
8763
+ "server:internal_error"
8764
+ ]
8765
+ },
8766
+ updateAppointmentServiceCategory: {
8767
+ path: "/sites/{siteId}/bookings/service-categories/{categoryId}",
8768
+ method: "PUT",
8769
+ auth: "user",
8770
+ responseKind: "json",
8771
+ errors: [
8772
+ "validation:invalid_input",
8773
+ "auth:forbidden",
8774
+ "resource:not_found",
8775
+ "resource:conflict",
8776
+ "server:internal_error"
8777
+ ]
8778
+ },
8779
+ deleteAppointmentServiceCategory: {
8780
+ path: "/sites/{siteId}/bookings/service-categories/{categoryId}",
8781
+ method: "DELETE",
8782
+ auth: "user",
8783
+ responseKind: "json",
8784
+ errors: [
8785
+ "auth:forbidden",
8786
+ "resource:not_found",
8787
+ "server:internal_error"
8788
+ ]
8789
+ },
8790
+ reorderAppointmentServiceCategories: {
8791
+ path: "/sites/{siteId}/bookings/service-categories/order",
8792
+ method: "PUT",
8793
+ auth: "user",
8794
+ responseKind: "json",
8795
+ errors: [
8796
+ "validation:invalid_input",
8797
+ "auth:forbidden",
8798
+ "resource:conflict",
8799
+ "server:internal_error"
8800
+ ]
8801
+ }
8802
+ }),
8517
8803
  listAppointmentResources: {
8518
8804
  path: "/sites/{siteId}/bookings/resources",
8519
8805
  method: "GET",
@@ -9661,39 +9947,6 @@ const NEWSLETTER_ENDPOINT_DEFINITIONS = defineEndpointDefinitions({
9661
9947
  auth: "user",
9662
9948
  responseKind: "json",
9663
9949
  demoMutation: DEMO_MUTATION_BLOCKED_HIDDEN
9664
- },
9665
- listNewsletterSendJobs: {
9666
- path: "/sites/{siteId}/newsletter/jobs",
9667
- method: "GET",
9668
- tags: [TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter],
9669
- auth: "user",
9670
- responseKind: "json"
9671
- },
9672
- retryNewsletterSendJob: {
9673
- path: "/sites/{siteId}/newsletter/jobs/{jobId}/retry",
9674
- method: "POST",
9675
- errors: [
9676
- "validation:invalid_input",
9677
- "resource:not_found",
9678
- "auth:forbidden",
9679
- "server:internal_error"
9680
- ],
9681
- tags: [TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter],
9682
- auth: "user",
9683
- responseKind: "json"
9684
- },
9685
- cancelNewsletterSendJob: {
9686
- path: "/sites/{siteId}/newsletter/jobs/{jobId}/cancel",
9687
- method: "POST",
9688
- errors: [
9689
- "validation:invalid_input",
9690
- "resource:not_found",
9691
- "auth:forbidden",
9692
- "server:internal_error"
9693
- ],
9694
- tags: [TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter],
9695
- auth: "user",
9696
- responseKind: "json"
9697
9950
  }
9698
9951
  });
9699
9952
  //#endregion
@@ -10459,6 +10712,7 @@ const BILLING_ENDPOINT_DEFINITIONS = defineEndpointDefinitions({
10459
10712
  }
10460
10713
  });
10461
10714
  ({
10715
+ ...PUBLIC_NEWSLETTER_ENDPOINT_DEFINITIONS,
10462
10716
  ...ACCOUNT_ENDPOINT_DEFINITIONS,
10463
10717
  ...PUBLIC_ONBOARDING_ATTEMPT_ENDPOINT_DEFINITIONS,
10464
10718
  ...PUBLIC_EVENT_ENDPOINT_DEFINITIONS,
@@ -12819,11 +13073,260 @@ function cardRoleFromLegacyVocabulary(value) {
12819
13073
  */
12820
13074
  const cardRoleWithLegacyAliasSchema = z.preprocess((value) => cardRoleFromLegacyVocabulary(value) ?? value, cardRoleSchema);
12821
13075
  //#endregion
12822
- //#region ../theme-core/src/site-styles/compilationPlan.ts
12823
- const defaultHeaderBrandPreferences = {
12824
- brandDisplay: "auto",
12825
- logoSize: "auto"
12826
- };
13076
+ //#region ../theme-core/src/site-styles/transitionCatalogue.ts
13077
+ /**
13078
+ * Family order for pickers. Entries below are listed family by family in this
13079
+ * same order, so the flat option list and the grouped families agree.
13080
+ */
13081
+ const transitionCatalogueFamilies = [
13082
+ {
13083
+ id: "gradient",
13084
+ label: "Gradient"
13085
+ },
13086
+ {
13087
+ id: "wave",
13088
+ label: "Wave"
13089
+ },
13090
+ {
13091
+ id: "angle",
13092
+ label: "Angle"
13093
+ }
13094
+ ];
13095
+ const mediumHeight = "6rem + 2px";
13096
+ const compactHeight = "4.5rem + 2px";
13097
+ const largeHeight = "7rem + 2px";
13098
+ /**
13099
+ * The single source of transition vocabulary. Order is significant: it is the
13100
+ * order of `boundaryOptions` (after `none`) and of each family's variants,
13101
+ * which persisted pins, page-flow presets and the editor picker all rely on.
13102
+ *
13103
+ * Shapes match what `generateLayoutCss` draws today. Structured
13104
+ * amplitude/frequency treatments (issue 826) extend this list later.
13105
+ */
13106
+ const transitionCatalogueEntries = defineExactCatalog()([
13107
+ {
13108
+ intent: "soft-fade-short",
13109
+ optionId: asBoundaryOptionId("break:soft"),
13110
+ family: "gradient",
13111
+ variantId: "soft",
13112
+ label: "Soft",
13113
+ variantLabel: "Soft",
13114
+ treatment: {
13115
+ kind: "soft-fade",
13116
+ height: "medium",
13117
+ curve: "soft"
13118
+ },
13119
+ size: "medium",
13120
+ heightExpression: mediumHeight,
13121
+ shape: { kind: "fade" }
13122
+ },
13123
+ {
13124
+ intent: "soft-fade-long",
13125
+ optionId: asBoundaryOptionId("break:spacious"),
13126
+ family: "gradient",
13127
+ variantId: "spacious",
13128
+ label: "Spacious",
13129
+ variantLabel: "Spacious",
13130
+ treatment: {
13131
+ kind: "soft-fade",
13132
+ height: "large",
13133
+ curve: "spacious"
13134
+ },
13135
+ size: "spacious",
13136
+ heightExpression: "10rem",
13137
+ shape: { kind: "fade" }
13138
+ },
13139
+ {
13140
+ intent: "soft-fade-expansive",
13141
+ optionId: asBoundaryOptionId("break:expansive"),
13142
+ family: "gradient",
13143
+ variantId: "expansive",
13144
+ label: "Expansive",
13145
+ variantLabel: "Expansive",
13146
+ treatment: {
13147
+ kind: "soft-fade",
13148
+ height: "expansive",
13149
+ curve: "expansive"
13150
+ },
13151
+ size: "expansive",
13152
+ heightExpression: "14rem",
13153
+ shape: { kind: "fade" }
13154
+ },
13155
+ {
13156
+ intent: "wave-edge-balanced",
13157
+ optionId: asBoundaryOptionId("break:wave-balanced"),
13158
+ family: "wave",
13159
+ variantId: "balanced",
13160
+ label: "Balanced wave",
13161
+ variantLabel: "Balanced",
13162
+ treatment: {
13163
+ kind: "wave-edge",
13164
+ height: "medium",
13165
+ amplitude: "balanced",
13166
+ rhythm: "double",
13167
+ symmetry: "symmetrical"
13168
+ },
13169
+ size: "medium",
13170
+ heightExpression: mediumHeight,
13171
+ shape: {
13172
+ kind: "wave",
13173
+ mask: "balanced"
13174
+ }
13175
+ },
13176
+ {
13177
+ intent: "wave-edge",
13178
+ optionId: asBoundaryOptionId("break:wave"),
13179
+ family: "wave",
13180
+ variantId: "classic",
13181
+ label: "Classic wave",
13182
+ variantLabel: "Classic",
13183
+ treatment: {
13184
+ kind: "wave-edge",
13185
+ height: "medium",
13186
+ amplitude: "balanced",
13187
+ rhythm: "double",
13188
+ symmetry: "asymmetrical"
13189
+ },
13190
+ size: "medium",
13191
+ heightExpression: mediumHeight,
13192
+ shape: {
13193
+ kind: "wave",
13194
+ mask: "classic"
13195
+ }
13196
+ },
13197
+ {
13198
+ intent: "wave-edge-gentle",
13199
+ optionId: asBoundaryOptionId("break:wave-gentle"),
13200
+ family: "wave",
13201
+ variantId: "gentle",
13202
+ label: "Gentle wave",
13203
+ variantLabel: "Gentle",
13204
+ treatment: {
13205
+ kind: "wave-edge",
13206
+ height: "compact",
13207
+ amplitude: "subtle",
13208
+ rhythm: "single",
13209
+ symmetry: "symmetrical"
13210
+ },
13211
+ size: "compact",
13212
+ heightExpression: compactHeight,
13213
+ shape: {
13214
+ kind: "wave",
13215
+ mask: "gentle"
13216
+ }
13217
+ },
13218
+ {
13219
+ intent: "wave-edge-bold",
13220
+ optionId: asBoundaryOptionId("break:wave-bold"),
13221
+ family: "wave",
13222
+ variantId: "bold",
13223
+ label: "Bold wave",
13224
+ variantLabel: "Bold",
13225
+ treatment: {
13226
+ kind: "wave-edge",
13227
+ height: "large",
13228
+ amplitude: "bold",
13229
+ rhythm: "double",
13230
+ symmetry: "symmetrical"
13231
+ },
13232
+ size: "large",
13233
+ heightExpression: largeHeight,
13234
+ shape: {
13235
+ kind: "wave",
13236
+ mask: "bold"
13237
+ }
13238
+ },
13239
+ {
13240
+ intent: "wave-edge-drift",
13241
+ optionId: asBoundaryOptionId("break:wave-drift"),
13242
+ family: "wave",
13243
+ variantId: "drift",
13244
+ label: "Drift wave",
13245
+ variantLabel: "Drift",
13246
+ treatment: {
13247
+ kind: "wave-edge",
13248
+ height: "medium",
13249
+ amplitude: "balanced",
13250
+ rhythm: "double",
13251
+ symmetry: "drift"
13252
+ },
13253
+ size: "medium",
13254
+ heightExpression: mediumHeight,
13255
+ shape: {
13256
+ kind: "wave",
13257
+ mask: "drift"
13258
+ }
13259
+ },
13260
+ {
13261
+ intent: "angle-edge-subtle",
13262
+ optionId: asBoundaryOptionId("break:angle-subtle"),
13263
+ family: "angle",
13264
+ variantId: "subtle",
13265
+ label: "Subtle angle",
13266
+ variantLabel: "Subtle",
13267
+ treatment: {
13268
+ kind: "angle-edge",
13269
+ height: "compact",
13270
+ slope: "subtle",
13271
+ direction: "forward"
13272
+ },
13273
+ size: "compact",
13274
+ heightExpression: compactHeight,
13275
+ shape: {
13276
+ kind: "angle",
13277
+ polygon: {
13278
+ startTopPercent: 34,
13279
+ endTopPercent: 18
13280
+ }
13281
+ }
13282
+ },
13283
+ {
13284
+ intent: "angle-edge",
13285
+ optionId: asBoundaryOptionId("break:angle-balanced"),
13286
+ family: "angle",
13287
+ variantId: "balanced",
13288
+ label: "Balanced angle",
13289
+ variantLabel: "Balanced",
13290
+ treatment: {
13291
+ kind: "angle-edge",
13292
+ height: "medium",
13293
+ slope: "balanced",
13294
+ direction: "forward"
13295
+ },
13296
+ size: "medium",
13297
+ heightExpression: mediumHeight,
13298
+ shape: {
13299
+ kind: "angle",
13300
+ polygon: {
13301
+ startTopPercent: 42,
13302
+ endTopPercent: 8
13303
+ }
13304
+ }
13305
+ },
13306
+ {
13307
+ intent: "angle-edge-steep",
13308
+ optionId: asBoundaryOptionId("break:angle-steep"),
13309
+ family: "angle",
13310
+ variantId: "steep",
13311
+ label: "Steep angle",
13312
+ variantLabel: "Steep",
13313
+ treatment: {
13314
+ kind: "angle-edge",
13315
+ height: "large",
13316
+ slope: "steep",
13317
+ direction: "forward"
13318
+ },
13319
+ size: "large",
13320
+ heightExpression: largeHeight,
13321
+ shape: {
13322
+ kind: "angle",
13323
+ polygon: {
13324
+ startTopPercent: 54,
13325
+ endTopPercent: 0
13326
+ }
13327
+ }
13328
+ }
13329
+ ]);
12827
13330
  //#endregion
12828
13331
  //#region ../theme-core/src/site-styles/sectionTransitions.ts
12829
13332
  function boundaryRuntimeMetrics(family, size, heightExpression) {
@@ -12834,42 +13337,106 @@ function boundaryRuntimeMetrics(family, size, heightExpression) {
12834
13337
  reserveCss: `calc((${heightExpression}) / 2)`
12835
13338
  };
12836
13339
  }
12837
- 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");
13340
+ new Map(transitionCatalogueEntries.map((entry) => [entry.intent, entry]));
13341
+ new Map(transitionCatalogueEntries.map((entry) => [entry.intent, boundaryRuntimeMetrics(entry.family, entry.size, entry.heightExpression)]));
13342
+ /**
13343
+ * The catalogue's compile-time coverage check guarantees an entry per
13344
+ * decorative intent, so a miss here is a broken invariant, not bad input.
13345
+ */
13346
+ function requireCatalogueValue(values, intent) {
13347
+ const value = values.get(intent);
13348
+ if (value === void 0) throw new Error(`Transition catalogue has no entry for ${intent}`);
13349
+ return value;
13350
+ }
12838
13351
  const noneBoundaryOption = {
12839
13352
  id: asBoundaryOptionId("break:none"),
12840
13353
  label: "None",
12841
13354
  transitionAfter: "none",
12842
13355
  treatment: { kind: "none" }
12843
13356
  };
12844
- const softBoundaryOption = {
12845
- id: asBoundaryOptionId("break:soft"),
12846
- label: "Soft",
12847
- transitionAfter: "soft-fade-short",
12848
- treatment: {
12849
- kind: "soft-fade",
12850
- height: "medium",
12851
- curve: "soft"
12852
- }
13357
+ const boundaryOptionByIntent = new Map(transitionCatalogueEntries.map((entry) => [entry.intent, {
13358
+ id: entry.optionId,
13359
+ label: entry.label,
13360
+ transitionAfter: entry.intent,
13361
+ treatment: entry.treatment
13362
+ }]));
13363
+ function boundaryOptionForTransitionIntent(intent) {
13364
+ return requireCatalogueValue(boundaryOptionByIntent, intent);
13365
+ }
13366
+ const softBoundaryOption = boundaryOptionForTransitionIntent("soft-fade-short");
13367
+ const spaciousBoundaryOption = boundaryOptionForTransitionIntent("soft-fade-long");
13368
+ boundaryOptionForTransitionIntent("soft-fade-expansive");
13369
+ boundaryOptionForTransitionIntent("wave-edge");
13370
+ boundaryOptionForTransitionIntent("wave-edge-balanced");
13371
+ boundaryOptionForTransitionIntent("wave-edge-gentle");
13372
+ boundaryOptionForTransitionIntent("wave-edge-bold");
13373
+ boundaryOptionForTransitionIntent("wave-edge-drift");
13374
+ boundaryOptionForTransitionIntent("angle-edge-subtle");
13375
+ boundaryOptionForTransitionIntent("angle-edge");
13376
+ boundaryOptionForTransitionIntent("angle-edge-steep");
13377
+ /**
13378
+ * Must remain non-empty; downstream code indexes `[0]` as the documented default.
13379
+ */
13380
+ const boundaryOptions = [noneBoundaryOption, ...transitionCatalogueEntries.map((entry) => boundaryOptionForTransitionIntent(entry.intent))];
13381
+ const noneTransitionVariant = {
13382
+ familyId: "none",
13383
+ variantId: "none",
13384
+ label: "None",
13385
+ boundaryOption: noneBoundaryOption
12853
13386
  };
12854
- const spaciousBoundaryOption = {
12855
- id: asBoundaryOptionId("break:spacious"),
12856
- label: "Spacious",
12857
- transitionAfter: "soft-fade-long",
12858
- treatment: {
12859
- kind: "soft-fade",
12860
- height: "large",
12861
- curve: "spacious"
12862
- }
13387
+ function transitionVariantForEntry(entry) {
13388
+ return {
13389
+ familyId: entry.family,
13390
+ variantId: entry.variantId,
13391
+ label: entry.variantLabel,
13392
+ boundaryOption: boundaryOptionForTransitionIntent(entry.intent)
13393
+ };
13394
+ }
13395
+ const sectionTransitionFamilies = [{
13396
+ id: "none",
13397
+ label: "None",
13398
+ variants: [noneTransitionVariant]
13399
+ }, ...transitionCatalogueFamilies.map((family) => ({
13400
+ id: family.id,
13401
+ label: family.label,
13402
+ variants: requireNonEmptyReadonlyArray(transitionCatalogueEntries.filter((entry) => entry.family === family.id).map(transitionVariantForEntry), `Transition family ${family.id} has no catalogue entries.`)
13403
+ }))];
13404
+ new Map(boundaryOptions.map((option) => [option.id, option]));
13405
+ new Map(boundaryOptions.map((option) => [stableTreatmentKey(option.treatment), option]));
13406
+ new Map(sectionTransitionFamilies.flatMap((family) => family.variants.map((variant) => [variant.boundaryOption.id, variant])));
13407
+ new Map(sectionTransitionFamilies.map((family) => [family.id, family]));
13408
+ function stableTreatmentKey(treatment) {
13409
+ switch (treatment.kind) {
13410
+ case "none": return "none";
13411
+ case "soft-fade": return `${treatment.kind}:${treatment.height}:${treatment.curve}`;
13412
+ case "wave-edge": return [
13413
+ treatment.kind,
13414
+ treatment.height,
13415
+ treatment.amplitude,
13416
+ treatment.rhythm,
13417
+ treatment.symmetry
13418
+ ].join(":");
13419
+ case "angle-edge": return [
13420
+ treatment.kind,
13421
+ treatment.height,
13422
+ treatment.slope,
13423
+ treatment.direction
13424
+ ].join(":");
13425
+ case "legacy-unsupported": return `${treatment.kind}:${treatment.boundaryOptionId}`;
13426
+ }
13427
+ }
13428
+ requireThemeColorToken$1("background");
13429
+ function requireThemeColorToken$1(value) {
13430
+ const token = parseThemeColorToken(value);
13431
+ if (!token) throw new Error(`Expected a theme color token. Received: ${value}`);
13432
+ return token;
13433
+ }
13434
+ //#endregion
13435
+ //#region ../theme-core/src/site-styles/compilationPlan.ts
13436
+ const defaultHeaderBrandPreferences = {
13437
+ brandDisplay: "auto",
13438
+ logoSize: "auto"
12863
13439
  };
12864
- asBoundaryOptionId("break:expansive");
12865
- asBoundaryOptionId("break:wave");
12866
- asBoundaryOptionId("break:wave-balanced");
12867
- asBoundaryOptionId("break:wave-gentle");
12868
- asBoundaryOptionId("break:wave-bold");
12869
- asBoundaryOptionId("break:wave-drift");
12870
- asBoundaryOptionId("break:angle-subtle");
12871
- asBoundaryOptionId("break:angle-balanced");
12872
- asBoundaryOptionId("break:angle-steep");
12873
13440
  asBoundaryOptionId("break:unknown");
12874
13441
  const pageDesignUserPinnedAppearanceChoiceSchema = z.object({
12875
13442
  kind: z.literal("user-pinned"),
@@ -12996,14 +13563,11 @@ function validateUniquePageDesignPins(intent, ctx) {
12996
13563
  label: "block Look pin"
12997
13564
  });
12998
13565
  addDuplicateStringIssues(ctx, {
12999
- values: intent.boundaryPins.map((pin) => boundaryKey(pin.previousBlockId, pin.nextBlockId)),
13566
+ values: intent.boundaryPins.map((pin) => makeBoundaryId(pin.previousBlockId, pin.nextBlockId)),
13000
13567
  path: ["boundaryPins"],
13001
13568
  label: "boundary pin"
13002
13569
  });
13003
13570
  }
13004
- function boundaryKey(previousBlockId, nextBlockId) {
13005
- return makeBoundaryId(previousBlockId, nextBlockId);
13006
- }
13007
13571
  //#endregion
13008
13572
  //#region ../theme-core/src/accordions/siteStyleDefaults.ts
13009
13573
  /**
@@ -14631,6 +15195,13 @@ z.object({
14631
15195
  fields: nonEmptyRuntimeStyleFieldNamesSchema,
14632
15196
  authority: styleAuthoritySchema
14633
15197
  }).strict();
15198
+ asPageFlowPresetId("flow:quiet"), noneBoundaryOption.id, asPageFlowPresetId("flow:balanced"), softBoundaryOption.id, asPageFlowPresetId("flow:expressive"), spaciousBoundaryOption.id;
15199
+ asPageFlowPresetId("generated-default");
15200
+ asSiteStyleId("site-style:south-west-twerk-school");
15201
+ asAppearancePresetId("hero-brand-scrim-fixed-frame");
15202
+ asLayoutVariantKey("classic");
15203
+ asLayoutVariantKey("micro");
15204
+ asBoundaryOptionId("break:wave");
14634
15205
  //#endregion
14635
15206
  //#region ../theme-core/src/site-styles/runtimeCompiler.ts
14636
15207
  function defineSectionForegroundRuntimeTokens(input) {
@@ -14654,7 +15225,7 @@ function defineComponentRuntimeRules(rules) {
14654
15225
  }
14655
15226
  /**
14656
15227
  * Default design rules translate semantic page-level choices into the current
14657
- * runtime's section background and transition style-group vocabulary.
15228
+ * runtime's section background vocabulary.
14658
15229
  */
14659
15230
  const defaultDesignRuntimeRules = defineDesignRuntimeRules({
14660
15231
  sectionSurfaces: {
@@ -14689,8 +15260,7 @@ const defaultDesignRuntimeRules = defineDesignRuntimeRules({
14689
15260
  color: "surface",
14690
15261
  opacity: .88
14691
15262
  }
14692
- },
14693
- transitionClassName: (transition, fromSurface, toSurface) => transition === "none" ? null : `site-style-transition-${transition}-from-${fromSurface}-to-${toSurface}`
15263
+ }
14694
15264
  });
14695
15265
  /**
14696
15266
  * Default component rules translate frame and item-surface semantics into the
@@ -16425,19 +16995,11 @@ const curatedSiteStyles = [
16425
16995
  })
16426
16996
  ];
16427
16997
  new Map(curatedSiteStyles.map((style) => [style.id, style]));
16428
- asPageFlowPresetId("generated-default");
16429
- asSiteStyleId("site-style:south-west-twerk-school");
16430
- asAppearancePresetId("hero-brand-scrim-fixed-frame");
16431
- asLayoutVariantKey("classic");
16432
- asLayoutVariantKey("micro");
16433
- asBoundaryOptionId("break:wave");
16434
- asPageFlowPresetId("flow:quiet"), noneBoundaryOption.id, asPageFlowPresetId("flow:balanced"), softBoundaryOption.id, asPageFlowPresetId("flow:expressive"), spaciousBoundaryOption.id;
16435
16998
  //#endregion
16436
16999
  //#region ../theme-core/src/site-styles/resolver.ts
16437
17000
  const blockDesignFallback = {
16438
17001
  sectionSurface: "base",
16439
17002
  contentFrame: plainFrame,
16440
- transitionAfter: "none",
16441
17003
  sectionHeight: "default",
16442
17004
  heroLegibility: "none",
16443
17005
  imageSurfaceTreatment: { kind: "none" },
@@ -16448,7 +17010,7 @@ const blockDesignFallback = {
16448
17010
  accordionIconTreatment: null,
16449
17011
  composition: null
16450
17012
  };
16451
- blockDesignFallback.sectionSurface, blockDesignFallback.contentFrame, blockDesignFallback.transitionAfter, blockDesignFallback.sectionHeight, blockDesignFallback.heroLegibility, blockDesignFallback.imageSurfaceTreatment, blockDesignFallback.imageSurfaceMotion, blockDesignFallback.tileTreatment, blockDesignFallback.eventListTreatment, blockDesignFallback.eyebrowTreatment, blockDesignFallback.accordionIconTreatment, blockDesignFallback.composition;
17013
+ blockDesignFallback.sectionSurface, blockDesignFallback.contentFrame, blockDesignFallback.sectionHeight, blockDesignFallback.heroLegibility, blockDesignFallback.imageSurfaceTreatment, blockDesignFallback.imageSurfaceMotion, blockDesignFallback.tileTreatment, blockDesignFallback.eventListTreatment, blockDesignFallback.eyebrowTreatment, blockDesignFallback.accordionIconTreatment, blockDesignFallback.composition;
16452
17014
  //#endregion
16453
17015
  //#region ../theme-core/src/site-styles/siteChromeBackgrounds.ts
16454
17016
  const siteChromeBackgroundColorTokens = toSiteChromeBackgroundColorTokens(backgroundAppearanceColorTokenNames);
@@ -17041,7 +17603,8 @@ const siteOptionSources = [
17041
17603
  "eventCategories",
17042
17604
  "eventSeries",
17043
17605
  "venues",
17044
- "staffMembers"
17606
+ "staffMembers",
17607
+ "appointmentServiceCategories"
17045
17608
  ];
17046
17609
  const mediaDeliverySchema = z.object({
17047
17610
  sizes: z.string().optional(),
@@ -21119,9 +21682,7 @@ function navRow(opts) {
21119
21682
  rel: { $bind: { from: `${childItemName}.rel` } },
21120
21683
  "data-active": { $bind: { from: `${childItemName}.active` } }
21121
21684
  }, [text({ as: "span" }, bind(`${childItemName}.label`))], repeat(`${itemName}.children`, childItemName));
21122
- const dropdown = el("div", { className: "nav-dropdown rb-relative" }, [button({
21123
- type: "button",
21124
- variantId: "",
21685
+ const dropdown = el("div", { className: "nav-dropdown rb-relative" }, [el("headerControl", {
21125
21686
  className: prependClassName("nav-dropdown-trigger", linkClassName),
21126
21687
  "aria-haspopup": "menu",
21127
21688
  "aria-expanded": "false",
@@ -21189,9 +21750,7 @@ function navColumn(opts) {
21189
21750
  const dropdown = el("div", {
21190
21751
  className: "nav-mobile-dropdown",
21191
21752
  "data-nav-mobile-dropdown": "true"
21192
- }, [button({
21193
- type: "button",
21194
- variantId: "",
21753
+ }, [el("headerControl", {
21195
21754
  className: triggerClassName,
21196
21755
  "aria-expanded": "false",
21197
21756
  "aria-controls": childrenId,
@@ -27503,6 +28062,49 @@ const layoutTransforms = [
27503
28062
  footerLogoMediaClassTransform,
27504
28063
  footerLogoTextVisibleTransform
27505
28064
  ];
28065
+ //#endregion
28066
+ //#region ../blocks/src/system/transforms/registry/chromeLogo.ts
28067
+ const chromeLogoSchema = z.object({ surface: z.enum([
28068
+ "header-root",
28069
+ "header-mobile-panel",
28070
+ "footer-root"
28071
+ ]) });
28072
+ /** The brand foreground shares the logo's surface; navigation may own a separate capsule. */
28073
+ function chromeSurfaceTextToken(surface, theme, palette) {
28074
+ switch (surface) {
28075
+ case "header-root": {
28076
+ const header = theme.header;
28077
+ const foreground = resolveHeaderRootForeground(header, palette, resolveHeaderVisualStyles(header).isTransparent);
28078
+ return foreground.kind === "known" ? foreground.roles.text : resolveHeaderLeafTextColor(header);
28079
+ }
28080
+ case "header-mobile-panel": return theme.header?.dropdownStyle?.textColor ?? "text";
28081
+ case "footer-root": {
28082
+ const foreground = resolveFooterRootForeground(theme.footer, palette);
28083
+ return foreground.kind === "known" ? foreground.roles.text : void 0;
28084
+ }
28085
+ }
28086
+ }
28087
+ function readChromeTheme(viewModel) {
28088
+ return asPartialObject(asPartialObject(viewModel?.["$root"])?.theme) ?? {};
28089
+ }
28090
+ function resolveChromeSurfaceTone(surface, context) {
28091
+ return surfaceToneFromForegroundToken(context.theme.palette, chromeSurfaceTextToken(surface, readChromeTheme(context.viewModel), context.theme.palette));
28092
+ }
28093
+ const chromeLogoTransforms = [{
28094
+ id: "layout.chromeLogo",
28095
+ kind: "formatter",
28096
+ summary: "Select the light- or dark-background site logo for a header or footer surface",
28097
+ schema: chromeLogoSchema,
28098
+ run: (value, options, context) => {
28099
+ const content = asPartialObject(value);
28100
+ const variants = asPartialObject(content?.logoVariants);
28101
+ if (!variants) return content?.logo ?? null;
28102
+ return selectLogoVariant(resolveChromeSurfaceTone(options.surface, context), {
28103
+ forLightBackgrounds: variants.forLightBackgrounds ?? null,
28104
+ forDarkBackgrounds: variants.forDarkBackgrounds ?? null
28105
+ });
28106
+ }
28107
+ }];
27506
28108
  const headerRuntimeTransforms = [{
27507
28109
  id: "layout.headerRuntimeContract",
27508
28110
  kind: "formatter",
@@ -27702,46 +28304,42 @@ const whenTransformed = (from, transformId, equals = true) => (node) => ({
27702
28304
  equals
27703
28305
  }
27704
28306
  });
27705
- const logoRow = link({
28307
+ /** Draw whichever site logo suits the surface this row sits on. */
28308
+ const bindChromeLogo = (surface) => bind("content", { transforms: [{
28309
+ id: "layout.chromeLogo",
28310
+ options: { surface }
28311
+ }] });
28312
+ /**
28313
+ * The brand link. The logo is chosen per surface because the open mobile menu
28314
+ * paints its own background, which may be the opposite tone to the header.
28315
+ */
28316
+ const createLogoRow = (surface) => link({
27706
28317
  href: "/",
27707
28318
  className: bindProp("$root.theme.header.logo", {
27708
28319
  transforms: pipe(tx("layout.headerLogoClass")),
27709
28320
  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"
27710
28321
  })
27711
- }, [
27712
- media({ className: bindProp("$root.theme.header.logo", {
27713
- transforms: pipe(tx("layout.headerLogoMediaClass", { base: "rb-header-logo-sm rb-w-auto rb-transition-all rb-duration-300" })),
27714
- fallback: "rb-header-logo-sm rb-w-auto rb-transition-all rb-duration-300"
27715
- }) }, when("content.logo"), bind("content.logo")),
27716
- stack({ className: "rb-contents" }, [media({ className: bindProp("$root.theme.header.logo", {
27717
- transforms: pipe(tx("layout.headerLogoMediaClass", { base: "rb-header-logo-sm rb-w-auto rb-transition-all rb-duration-300" })),
27718
- fallback: "rb-header-logo-sm rb-w-auto rb-transition-all rb-duration-300"
27719
- }) }, when("site.logo"), bind("site.logo"))], when("content.logo", { not: true })),
27720
- text({
27721
- as: "strong",
27722
- className: "header-logo-text rb-truncate"
27723
- }, whenTransformed("$root.theme.header.logo", "layout.headerLogoTextVisible"), bind("site.title", { fallback: "Your Site" }))
27724
- ]);
28322
+ }, [media({ className: bindProp("$root.theme.header.logo", {
28323
+ transforms: pipe(tx("layout.headerLogoMediaClass", { base: "rb-header-logo-sm rb-w-auto rb-transition-all rb-duration-300" })),
28324
+ fallback: "rb-header-logo-sm rb-w-auto rb-transition-all rb-duration-300"
28325
+ }) }, when("content.logo"), bindChromeLogo(surface)), text({
28326
+ as: "strong",
28327
+ className: "header-logo-text rb-truncate"
28328
+ }, whenTransformed("$root.theme.header.logo", "layout.headerLogoTextVisible"), bind("site.title", { fallback: "Your Site" }))]);
28329
+ const logoRow = createLogoRow("header-root");
27725
28330
  const centeredLogoRow = link({
27726
28331
  href: "/",
27727
28332
  className: bindProp("$root.theme.header.logo", {
27728
28333
  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" })),
27729
28334
  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"
27730
28335
  })
27731
- }, [
27732
- media({ className: bindProp("$root.theme.header.logo", {
27733
- transforms: pipe(tx("layout.headerLogoMediaClass", { base: "rb-header-logo-lg rb-w-auto rb-transition-all rb-duration-300" })),
27734
- fallback: "rb-header-logo-lg rb-w-auto rb-transition-all rb-duration-300"
27735
- }) }, when("content.logo"), bind("content.logo")),
27736
- stack({ className: "rb-contents" }, [media({ className: bindProp("$root.theme.header.logo", {
27737
- transforms: pipe(tx("layout.headerLogoMediaClass", { base: "rb-header-logo-lg rb-w-auto rb-transition-all rb-duration-300" })),
27738
- fallback: "rb-header-logo-lg rb-w-auto rb-transition-all rb-duration-300"
27739
- }) }, when("site.logo"), bind("site.logo"))], when("content.logo", { not: true })),
27740
- text({
27741
- as: "strong",
27742
- className: "header-logo-text"
27743
- }, whenTransformed("$root.theme.header.logo", "layout.headerLogoTextVisible"), bind("site.title", { fallback: "Your Site" }))
27744
- ]);
28336
+ }, [media({ className: bindProp("$root.theme.header.logo", {
28337
+ transforms: pipe(tx("layout.headerLogoMediaClass", { base: "rb-header-logo-lg rb-w-auto rb-transition-all rb-duration-300" })),
28338
+ fallback: "rb-header-logo-lg rb-w-auto rb-transition-all rb-duration-300"
28339
+ }) }, when("content.logo"), bindChromeLogo("header-root")), text({
28340
+ as: "strong",
28341
+ className: "header-logo-text"
28342
+ }, whenTransformed("$root.theme.header.logo", "layout.headerLogoTextVisible"), bind("site.title", { fallback: "Your Site" }))]);
27745
28343
  const createNavRow = (className, align = "end") => navRow({
27746
28344
  className: `${className} header-nav-row`,
27747
28345
  align,
@@ -27781,10 +28379,8 @@ const mobileToggleIcon = stack({
27781
28379
  }
27782
28380
  ]);
27783
28381
  const mobileToggleButton = {
27784
- type: "button",
28382
+ type: "headerControl",
27785
28383
  props: {
27786
- type: "button",
27787
- variantId: "",
27788
28384
  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`,
27789
28385
  "aria-label": "Open menu",
27790
28386
  "aria-expanded": "false",
@@ -27794,10 +28390,8 @@ const mobileToggleButton = {
27794
28390
  children: [mobileToggleIcon]
27795
28391
  };
27796
28392
  const mobileOverlayToggleButton = {
27797
- type: "button",
28393
+ type: "headerControl",
27798
28394
  props: {
27799
- type: "button",
27800
- variantId: "",
27801
28395
  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",
27802
28396
  "aria-label": "Open menu",
27803
28397
  "aria-expanded": "false",
@@ -27821,7 +28415,7 @@ const mobileOverlayHeader = inline({
27821
28415
  align: "center",
27822
28416
  justify: "between",
27823
28417
  style: borderColorStyle("border")
27824
- }, [logoRow, mobileOverlayToggleButton]);
28418
+ }, [createLogoRow("header-mobile-panel"), mobileOverlayToggleButton]);
27825
28419
  const mobileOverlayBody = stack({
27826
28420
  className: "rb-flex-1 rb-px-6 rb-py-6",
27827
28421
  gap: "md",
@@ -28008,7 +28602,10 @@ const brandLogo = link({
28008
28602
  options: { base: "rb-h-10 rb-w-auto" }
28009
28603
  }],
28010
28604
  fallback: "rb-h-10 rb-w-auto"
28011
- } } }, when("module.showLogo", { equals: true }), when("content.logo"), bind("content.logo")), text({
28605
+ } } }, when("module.showLogo", { equals: true }), when("content.logo"), bind("content", { transforms: [{
28606
+ id: "layout.chromeLogo",
28607
+ options: { surface: "footer-root" }
28608
+ }] })), text({
28012
28609
  as: "strong",
28013
28610
  className: "footer-logo-text rb-nav-text"
28014
28611
  }, when("module.showTitle", { equals: true }), bind("site.title", { fallback: "Your Site" }))], when("module.kind", { equals: "brand" }));
@@ -29701,6 +30298,15 @@ const appointmentServicesBlockDefinition = {
29701
30298
  required: false,
29702
30299
  ui: { intent: "content" }
29703
30300
  },
30301
+ createSiteOptionSelectField({
30302
+ id: "categoryId",
30303
+ label: "Category",
30304
+ description: "Show one category (with its heading and intro), or leave it on All categories to show everything grouped.",
30305
+ required: false,
30306
+ multiple: false,
30307
+ optionSource: "appointmentServiceCategories",
30308
+ ui: { intent: "content" }
30309
+ }),
29704
30310
  sectionStylesField({
29705
30311
  id: "_sectionStyles",
29706
30312
  label: "Section styles",
@@ -29735,6 +30341,7 @@ const appointmentServicesBlockDefinition = {
29735
30341
  richText({ className: "rb-prose rb-max-w-none" }, bind("content.description"), when("content.description")),
29736
30342
  el("appointment-services", {
29737
30343
  sectionHeading: { $bind: { from: "content.heading" } },
30344
+ categoryId: { $bind: { from: "content.categoryId" } },
29738
30345
  services: { $bind: { from: "data.services" } },
29739
30346
  pathname: { $bind: { from: "$root.pathname" } },
29740
30347
  servicePathPrefix: { $bind: { from: "$root.appointmentServicePathPrefix" } }
@@ -30209,6 +30816,12 @@ const occurrenceContextSchema = z.object({
30209
30816
  capacityOverride: z.number().nullable().optional(),
30210
30817
  overrides: z.record(z.string(), z.unknown()).nullable().optional()
30211
30818
  }).nullable();
30819
+ //#endregion
30820
+ //#region ../blocks/src/system/runtime/api/readAuthority.ts
30821
+ const browserReadAuthoritySchema = z.discriminatedUnion("kind", [z.object({ kind: z.literal("published") }).strict(), z.object({
30822
+ kind: z.literal("preview"),
30823
+ token: z.string().min(1)
30824
+ }).strict()]);
30212
30825
  const unsupportedEventRegistrationPageSurfaceSubjectSchema = z.object({
30213
30826
  kind: z.literal("unsupported"),
30214
30827
  reason: z.enum([
@@ -30471,6 +31084,7 @@ const eventRegistrationSourceSchema = z.object({
30471
31084
  apiBaseUrl: z.string().optional(),
30472
31085
  portalToken: z.string().nullable().optional(),
30473
31086
  previewToken: z.string().nullable().optional(),
31087
+ readAuthority: browserReadAuthoritySchema.optional(),
30474
31088
  ...eventRegistrationHydrationSchemaShape,
30475
31089
  events: z.array(eventRegistrationPublicEventSchema).nullable().optional(),
30476
31090
  wholeSeriesRunEvents: z.array(eventRegistrationPublicEventSchema).nullable().optional(),
@@ -30508,6 +31122,7 @@ z.object({
30508
31122
  apiBaseUrl: z.string().optional(),
30509
31123
  portalToken: z.string().nullable().optional(),
30510
31124
  previewToken: z.string().nullable().optional(),
31125
+ readAuthority: browserReadAuthoritySchema.optional(),
30511
31126
  stage: previewStageSchema.optional()
30512
31127
  });
30513
31128
  function buildEventRegistrationDisplayFromScopedEvents(source, scopedSourceEvents) {
@@ -30766,6 +31381,7 @@ const eventRegistrationBlockDefinition = {
30766
31381
  text({ as: "h2" }, bind("content.heading"), when("content.heading")),
30767
31382
  richText({ className: "rb-prose rb-max-w-none" }, bind("content.description"), when("content.description")),
30768
31383
  eventRegistration(withApiBindings({
31384
+ readAuthority: { $bind: { from: "$root.readAuthority" } },
30769
31385
  occurrenceContext: { $bind: { from: "$root.occurrenceContext" } },
30770
31386
  subject: { $bind: { from: "$root.subject" } },
30771
31387
  portalToken: { $bind: {
@@ -31417,6 +32033,7 @@ const eventCollectionSourceSchemaShape = {
31417
32033
  events: z.array(publicEventSchema).nullable().optional(),
31418
32034
  siteId: z.string(),
31419
32035
  apiBaseUrl: z.string().optional(),
32036
+ readAuthority: browserReadAuthoritySchema.optional(),
31420
32037
  stage: previewStageSchema.optional(),
31421
32038
  listLayout: eventLayoutSchema.optional(),
31422
32039
  listColumns: columnOptionSchema.optional(),
@@ -31469,7 +32086,6 @@ const eventCollectionDisplaySchemaShape = {
31469
32086
  const eventCollectionHydrationSchema = z.object({
31470
32087
  siteId: z.string(),
31471
32088
  calendarWindow: calendarWindowPageSchema.optional(),
31472
- stage: previewStageSchema.optional(),
31473
32089
  prefetchedEvents: z.boolean(),
31474
32090
  eventSurface: eventSurfaceScopeSchema$1,
31475
32091
  filterEventPresets: z.string().nullable(),
@@ -31544,7 +32160,6 @@ function buildEventCollectionHydration(source, now = /* @__PURE__ */ new Date())
31544
32160
  return {
31545
32161
  calendarWindow: source.calendarWindow ?? void 0,
31546
32162
  siteId: source.siteId,
31547
- stage: source.stage,
31548
32163
  prefetchedEvents: source.events != null,
31549
32164
  eventSurface: selected ? "all" : normalizeEventSurfaceScope(source.eventSurface),
31550
32165
  filterEventPresets: selected ? null : normalizeEventSurfacePresetsCsv(source.filterEventPresets),
@@ -31564,6 +32179,7 @@ const eventListingSourceSchema = z.object({
31564
32179
  events: z.array(publicEventSchema).nullable().optional(),
31565
32180
  siteId: z.string(),
31566
32181
  apiBaseUrl: z.string().optional(),
32182
+ readAuthority: browserReadAuthoritySchema.optional(),
31567
32183
  stage: previewStageSchema.optional(),
31568
32184
  layout: eventLayoutSchema.optional(),
31569
32185
  columns: columnOptionSchema.optional(),
@@ -31604,7 +32220,6 @@ const eventListingDisplaySchema = z.object({
31604
32220
  });
31605
32221
  const eventListingHydrationSchema = z.object({
31606
32222
  siteId: z.string(),
31607
- stage: previewStageSchema.optional(),
31608
32223
  eventsPerPage: eventPageSizeSchema,
31609
32224
  paginationAction: eventListPaginationActionSchema,
31610
32225
  showFilters: z.boolean(),
@@ -31627,6 +32242,7 @@ const eventListingRenderSchema = z.object({
31627
32242
  z.object({
31628
32243
  siteId: z.string(),
31629
32244
  apiBaseUrl: z.string().optional(),
32245
+ readAuthority: browserReadAuthoritySchema.optional(),
31630
32246
  stage: previewStageSchema.optional()
31631
32247
  });
31632
32248
  const eventListingBlockRuntime = defineProgressiveBlockRuntime({
@@ -31661,7 +32277,6 @@ const eventListingBlockRuntime = defineProgressiveBlockRuntime({
31661
32277
  },
31662
32278
  hydration: {
31663
32279
  siteId: source.siteId,
31664
- stage: source.stage,
31665
32280
  eventsPerPage: pageSize,
31666
32281
  paginationAction: resolveEventListPaginationAction({
31667
32282
  paginationMode: source.paginationMode,
@@ -31943,6 +32558,7 @@ const eventListingBlockDefinition = {
31943
32558
  rootType: "stack",
31944
32559
  rootProps: { gap: "lg" },
31945
32560
  children: [...eventSectionHeaderLayoutNodes(), el("event-listing", withApiBindings({
32561
+ readAuthority: { $bind: { from: "$root.readAuthority" } },
31946
32562
  events: { $bind: { from: "data.events" } },
31947
32563
  stage: { $bind: {
31948
32564
  from: "$root.previewStage",
@@ -32140,6 +32756,7 @@ const eventCalendarRenderSchema = z.object({
32140
32756
  z.object({
32141
32757
  siteId: z.string(),
32142
32758
  apiBaseUrl: z.string().optional(),
32759
+ readAuthority: browserReadAuthoritySchema.optional(),
32143
32760
  stage: previewStageSchema.optional()
32144
32761
  });
32145
32762
  /**
@@ -32161,7 +32778,7 @@ function buildEventCalendarDisplay(source) {
32161
32778
  listColumns: source.listColumns ?? source.columns
32162
32779
  }),
32163
32780
  kind: "event-calendar",
32164
- displayMode: normalizeEventCalendarDisplayMode$1(source) ?? "combined",
32781
+ displayMode: resolveEventCalendarReadPlan(source).mode,
32165
32782
  className: source.className ?? null,
32166
32783
  events: (source.events ?? []).slice().sort((left, right) => new Date(left.startsAt).getTime() - new Date(right.startsAt).getTime()),
32167
32784
  boardTitle: normalizeOptionalText(source.boardTitle),
@@ -32178,13 +32795,16 @@ const eventCalendarBlockRuntime = defineProgressiveBlockRuntime({
32178
32795
  source: createZodCodec(eventCalendarSourceSchema),
32179
32796
  render: createZodCodec(eventCalendarRenderSchema)
32180
32797
  },
32181
- buildRender: (source) => ({
32182
- display: buildEventCalendarDisplay(source.calendarWindow && (source.variant ?? source.displayMode ?? "combined") !== "combined" && (source.variant ?? source.displayMode) !== "list" ? {
32183
- ...source,
32184
- events: source.calendarWindow.events
32185
- } : source),
32186
- hydration: buildEventCollectionHydration(source)
32187
- })
32798
+ buildRender: (source) => {
32799
+ const plan = resolveEventCalendarReadPlan(source);
32800
+ return {
32801
+ display: buildEventCalendarDisplay(source.calendarWindow && plan.jobs === "calendar" ? {
32802
+ ...source,
32803
+ events: source.calendarWindow.events
32804
+ } : source),
32805
+ hydration: buildEventCollectionHydration(source)
32806
+ };
32807
+ }
32188
32808
  });
32189
32809
  //#endregion
32190
32810
  //#region ../blocks/src/system/blocks/events/eventCalendarDataLoaders.ts
@@ -32334,6 +32954,7 @@ const eventCalendarLayout = [styledSection({
32334
32954
  rootType: "stack",
32335
32955
  rootProps: { gap: "lg" },
32336
32956
  children: [...eventSectionHeaderLayoutNodes({ splitClassName: "event-section-head event-section-head--split" }), el("event-calendar", withApiBindings({
32957
+ readAuthority: { $bind: { from: "$root.readAuthority" } },
32337
32958
  events: { $bind: { from: "data.events" } },
32338
32959
  calendarWindow: { $bind: { from: "data.calendarWindow" } },
32339
32960
  stage: { $bind: {
@@ -36121,6 +36742,7 @@ const shopSourceSchema = z.object({
36121
36742
  products: z.array(publicProductSchema).nullable().optional(),
36122
36743
  siteId: z.string().optional(),
36123
36744
  apiBaseUrl: z.string().optional(),
36745
+ readAuthority: browserReadAuthoritySchema.optional(),
36124
36746
  stage: previewStageSchema.optional()
36125
36747
  });
36126
36748
  const productVariantOptionDisplaySchema = z.object({
@@ -36288,6 +36910,7 @@ function resolveShowPricePerCredit(source) {
36288
36910
  z.object({
36289
36911
  siteId: z.string().optional(),
36290
36912
  apiBaseUrl: z.string().optional(),
36913
+ readAuthority: browserReadAuthoritySchema.optional(),
36291
36914
  stage: previewStageSchema.optional()
36292
36915
  });
36293
36916
  const shopBlockRuntime = defineProgressiveBlockRuntime({
@@ -36628,6 +37251,7 @@ const shopBlockDefinition = {
36628
37251
  baseClass: "",
36629
37252
  spacing: "spacious",
36630
37253
  children: sectionContainer([shop(withApiBindings({
37254
+ readAuthority: { $bind: { from: "$root.readAuthority" } },
36631
37255
  mode: "passes-memberships",
36632
37256
  showPasses: { $bind: {
36633
37257
  from: "content.showPasses",
@@ -36826,6 +37450,7 @@ const productListBlockDefinition = {
36826
37450
  baseClass: "",
36827
37451
  spacing: "spacious",
36828
37452
  children: sectionContainer([productList(withApiBindings({
37453
+ readAuthority: { $bind: { from: "$root.readAuthority" } },
36829
37454
  mode: "product-list",
36830
37455
  heading: { $bind: {
36831
37456
  from: "content.heading",
@@ -36968,6 +37593,7 @@ const productDetailBlockDefinition = {
36968
37593
  baseClass: "",
36969
37594
  spacing: "spacious",
36970
37595
  children: sectionContainer([productDetail(withApiBindings({
37596
+ readAuthority: { $bind: { from: "$root.readAuthority" } },
36971
37597
  mode: "product-detail",
36972
37598
  heading: { $bind: {
36973
37599
  from: "content.heading",
@@ -37084,6 +37710,7 @@ const cartBlockDefinition = {
37084
37710
  baseClass: "",
37085
37711
  spacing: "spacious",
37086
37712
  children: sectionContainer([cart(withApiBindings({
37713
+ readAuthority: { $bind: { from: "$root.readAuthority" } },
37087
37714
  mode: "cart",
37088
37715
  heading: { $bind: {
37089
37716
  from: "content.heading",
@@ -37167,6 +37794,7 @@ const checkoutBlockDefinition = {
37167
37794
  baseClass: "",
37168
37795
  spacing: "spacious",
37169
37796
  children: sectionContainer([checkout(withApiBindings({
37797
+ readAuthority: { $bind: { from: "$root.readAuthority" } },
37170
37798
  mode: "checkout",
37171
37799
  heading: { $bind: {
37172
37800
  from: "content.heading",
@@ -39839,8 +40467,8 @@ const defaultTransforms = createTransformRegistry([
39839
40467
  summary: "Choose the read projection required by the calendar display mode",
39840
40468
  schema: z.object({ job: z.enum(["list", "calendar"]) }),
39841
40469
  run(value, options) {
39842
- const mode = normalizeEventCalendarDisplayMode$1(asPartialObject(value) ?? {}) ?? "combined";
39843
- return options.job === "calendar" ? mode !== "list" : mode === "list" || mode === "combined";
40470
+ const plan = resolveEventCalendarReadPlan(asPartialObject(value) ?? {});
40471
+ return plan.jobs === "both" || plan.jobs === options.job;
39844
40472
  }
39845
40473
  },
39846
40474
  {
@@ -39853,6 +40481,7 @@ const defaultTransforms = createTransformRegistry([
39853
40481
  },
39854
40482
  ...formattingTransforms,
39855
40483
  ...layoutTransforms,
40484
+ ...chromeLogoTransforms,
39856
40485
  ...uiTransforms,
39857
40486
  ...mediaTransforms,
39858
40487
  ...backgroundTransforms,
@@ -40185,6 +40814,17 @@ function coerceToString(value) {
40185
40814
  return "";
40186
40815
  }
40187
40816
  /**
40817
+ * The appointment-services catalogue (issue 1403) pairs the services with the
40818
+ * site's ordered categories. Both are needed to group them, so that response
40819
+ * is passed through whole; any other `{ services }` wrapper is unwrapped.
40820
+ */
40821
+ function coerceServicesPayload(record) {
40822
+ return Array.isArray(record.services) && Array.isArray(record.categories) ? {
40823
+ services: record.services,
40824
+ categories: record.categories
40825
+ } : record.services;
40826
+ }
40827
+ /**
40188
40828
  * Extract data from API response.
40189
40829
  * Unwraps common response wrappers: { data }, { form }, { entries }, { services }, { teamMembers }
40190
40830
  *
@@ -40199,7 +40839,7 @@ function coercePayload(payload) {
40199
40839
  if ("data" in record && typeof record.data !== "function") return record.data;
40200
40840
  if ("form" in record && typeof record.form !== "function") return record.form;
40201
40841
  if ("entries" in record && typeof record.entries !== "function") return record.entries;
40202
- if ("services" in record && typeof record.services !== "function") return record.services;
40842
+ if ("services" in record && typeof record.services !== "function") return coerceServicesPayload(record);
40203
40843
  if ("teamMembers" in record && typeof record.teamMembers !== "function") return record.teamMembers;
40204
40844
  }
40205
40845
  return payload;
@@ -41101,7 +41741,12 @@ const appointmentSetupServiceDraftSchema = z.object({
41101
41741
  venue: appointmentSetupVenueChoiceSchema,
41102
41742
  timezone: z.string().trim().min(1).nullable(),
41103
41743
  payment: appointmentSetupPaymentDraftSchema,
41104
- assignment: appointmentSetupServiceAssignmentDraftSchema
41744
+ assignment: appointmentSetupServiceAssignmentDraftSchema,
41745
+ /**
41746
+ * The service's category, or null for "Other" (issue 1403). Omitted leaves
41747
+ * an existing service's category alone and puts a new one in "Other".
41748
+ */
41749
+ categoryId: z.string().uuid().nullable().optional()
41105
41750
  }).superRefine((service, ctx) => {
41106
41751
  if (service.payment.kind !== "free" && (service.priceAmount === null || service.priceAmount <= 0)) ctx.addIssue({
41107
41752
  code: "custom",
@@ -42037,7 +42682,7 @@ function usePage(params) {
42037
42682
  loading: false,
42038
42683
  error: null,
42039
42684
  page: pageOutline,
42040
- runtimeBoundaries: pageData.runtimeBoundaries,
42685
+ runtimeJoins: pageData.runtimeJoins,
42041
42686
  theme: requireSdkTheme(site.theme, siteId),
42042
42687
  siteId,
42043
42688
  resolvedData,