@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
@@ -43,6 +43,75 @@ function parsePublicProductCategorySelector(value) {
43
43
  };
44
44
  }
45
45
  //#endregion
46
+ //#region ../api/src/defineEndpointDefinitions.ts
47
+ /**
48
+ * Validates extracted endpoint descriptors while preserving each literal path,
49
+ * method, and parameter contract for the typed URL builders.
50
+ */
51
+ function defineEndpointDefinitions(definitions) {
52
+ return definitions;
53
+ }
54
+ //#endregion
55
+ //#region ../api/src/publicNewsletterEndpointDefinitions.ts
56
+ const PUBLIC_NEWSLETTER_ENDPOINT_DEFINITIONS = defineEndpointDefinitions({
57
+ subscribeNewsletter: {
58
+ path: "/public/sites/{siteId}/newsletter/subscribe",
59
+ method: "POST",
60
+ tags: ["public-newsletter-{siteId}"],
61
+ auth: "public",
62
+ responseKind: "json"
63
+ },
64
+ confirmNewsletter: {
65
+ path: "/public/sites/{siteId}/newsletter/confirm/{token}",
66
+ method: "GET",
67
+ tags: ["public-newsletter-{siteId}"],
68
+ auth: "public",
69
+ responseKind: "text"
70
+ },
71
+ unsubscribeNewsletter: {
72
+ path: "/public/sites/{siteId}/newsletter/unsubscribe/{token}",
73
+ method: "GET",
74
+ tags: ["public-newsletter-{siteId}"],
75
+ auth: "public",
76
+ responseKind: "text"
77
+ },
78
+ unsubscribeNewsletterPost: {
79
+ path: "/public/sites/{siteId}/newsletter/unsubscribe/{token}",
80
+ method: "POST",
81
+ tags: ["public-newsletter-{siteId}"],
82
+ auth: "public",
83
+ responseKind: "text"
84
+ },
85
+ confirmNewsletterPost: {
86
+ path: "/public/sites/{siteId}/newsletter/confirm/{token}",
87
+ method: "POST",
88
+ tags: ["public-newsletter-{siteId}"],
89
+ auth: "public",
90
+ responseKind: "text"
91
+ },
92
+ getNewsletterPreferences: {
93
+ path: "/public/sites/{siteId}/newsletter/preferences/{token}",
94
+ method: "GET",
95
+ tags: ["public-newsletter-{siteId}"],
96
+ auth: "public",
97
+ responseKind: "text"
98
+ },
99
+ saveNewsletterPreferences: {
100
+ path: "/public/sites/{siteId}/newsletter/preferences/{token}",
101
+ method: "POST",
102
+ tags: ["public-newsletter-{siteId}"],
103
+ auth: "public",
104
+ responseKind: "text"
105
+ },
106
+ getNewsletterArchive: {
107
+ path: "/public/sites/{siteId}/newsletter/archive/{token}",
108
+ method: "GET",
109
+ tags: ["public-newsletter-{siteId}"],
110
+ auth: "public",
111
+ responseKind: "text"
112
+ }
113
+ });
114
+ //#endregion
46
115
  //#region ../api/src/apiEndpointTypes.ts
47
116
  function allowedDemoMutationPolicy() {
48
117
  return {
@@ -134,17 +203,85 @@ const SDK_ENTRY_READ_ENDPOINTS = {
134
203
  }
135
204
  };
136
205
  //#endregion
137
- //#region ../api/src/defineEndpointDefinitions.ts
138
- /**
139
- * Validates extracted endpoint descriptors while preserving each literal path,
140
- * method, and parameter contract for the typed URL builders.
141
- */
142
- function defineEndpointDefinitions(definitions) {
143
- return definitions;
144
- }
145
- //#endregion
146
206
  //#region ../api/src/appointmentEndpointDefinitions.ts
147
207
  const APPOINTMENT_ENDPOINT_DEFINITIONS = defineEndpointDefinitions({
208
+ ...defineEndpointDefinitions({
209
+ listGroupedAppointmentServices: {
210
+ path: "/sites/{siteId}/bookings/services/grouped",
211
+ method: "GET",
212
+ auth: "user",
213
+ responseKind: "json",
214
+ errors: ["server:internal_error"]
215
+ },
216
+ reorderAppointmentServices: {
217
+ path: "/sites/{siteId}/bookings/services/order",
218
+ method: "PUT",
219
+ auth: "user",
220
+ responseKind: "json",
221
+ errors: [
222
+ "validation:invalid_input",
223
+ "auth:forbidden",
224
+ "resource:not_found",
225
+ "resource:conflict",
226
+ "server:internal_error"
227
+ ]
228
+ },
229
+ listAppointmentServiceCategories: {
230
+ path: "/sites/{siteId}/bookings/service-categories",
231
+ method: "GET",
232
+ auth: "user",
233
+ responseKind: "json",
234
+ errors: ["server:internal_error"]
235
+ },
236
+ createAppointmentServiceCategory: {
237
+ path: "/sites/{siteId}/bookings/service-categories",
238
+ method: "POST",
239
+ auth: "user",
240
+ responseKind: "json",
241
+ errors: [
242
+ "validation:invalid_input",
243
+ "auth:forbidden",
244
+ "resource:conflict",
245
+ "server:internal_error"
246
+ ]
247
+ },
248
+ updateAppointmentServiceCategory: {
249
+ path: "/sites/{siteId}/bookings/service-categories/{categoryId}",
250
+ method: "PUT",
251
+ auth: "user",
252
+ responseKind: "json",
253
+ errors: [
254
+ "validation:invalid_input",
255
+ "auth:forbidden",
256
+ "resource:not_found",
257
+ "resource:conflict",
258
+ "server:internal_error"
259
+ ]
260
+ },
261
+ deleteAppointmentServiceCategory: {
262
+ path: "/sites/{siteId}/bookings/service-categories/{categoryId}",
263
+ method: "DELETE",
264
+ auth: "user",
265
+ responseKind: "json",
266
+ errors: [
267
+ "auth:forbidden",
268
+ "resource:not_found",
269
+ "server:internal_error"
270
+ ]
271
+ },
272
+ reorderAppointmentServiceCategories: {
273
+ path: "/sites/{siteId}/bookings/service-categories/order",
274
+ method: "PUT",
275
+ auth: "user",
276
+ responseKind: "json",
277
+ errors: [
278
+ "validation:invalid_input",
279
+ "auth:forbidden",
280
+ "resource:conflict",
281
+ "server:internal_error"
282
+ ]
283
+ }
284
+ }),
148
285
  listAppointmentResources: {
149
286
  path: "/sites/{siteId}/bookings/resources",
150
287
  method: "GET",
@@ -1292,39 +1429,6 @@ const NEWSLETTER_ENDPOINT_DEFINITIONS = defineEndpointDefinitions({
1292
1429
  auth: "user",
1293
1430
  responseKind: "json",
1294
1431
  demoMutation: DEMO_MUTATION_BLOCKED_HIDDEN
1295
- },
1296
- listNewsletterSendJobs: {
1297
- path: "/sites/{siteId}/newsletter/jobs",
1298
- method: "GET",
1299
- tags: [TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter],
1300
- auth: "user",
1301
- responseKind: "json"
1302
- },
1303
- retryNewsletterSendJob: {
1304
- path: "/sites/{siteId}/newsletter/jobs/{jobId}/retry",
1305
- method: "POST",
1306
- errors: [
1307
- "validation:invalid_input",
1308
- "resource:not_found",
1309
- "auth:forbidden",
1310
- "server:internal_error"
1311
- ],
1312
- tags: [TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter],
1313
- auth: "user",
1314
- responseKind: "json"
1315
- },
1316
- cancelNewsletterSendJob: {
1317
- path: "/sites/{siteId}/newsletter/jobs/{jobId}/cancel",
1318
- method: "POST",
1319
- errors: [
1320
- "validation:invalid_input",
1321
- "resource:not_found",
1322
- "auth:forbidden",
1323
- "server:internal_error"
1324
- ],
1325
- tags: [TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter],
1326
- auth: "user",
1327
- responseKind: "json"
1328
1432
  }
1329
1433
  });
1330
1434
  //#endregion
@@ -3403,6 +3507,7 @@ const BILLING_ENDPOINT_DEFINITIONS = defineEndpointDefinitions({
3403
3507
  }
3404
3508
  });
3405
3509
  const API_ENDPOINTS$1 = {
3510
+ ...PUBLIC_NEWSLETTER_ENDPOINT_DEFINITIONS,
3406
3511
  ...ACCOUNT_ENDPOINT_DEFINITIONS,
3407
3512
  ...PUBLIC_ONBOARDING_ATTEMPT_ENDPOINT_DEFINITIONS,
3408
3513
  ...PUBLIC_EVENT_ENDPOINT_DEFINITIONS,
@@ -6537,41 +6642,6 @@ const API_ENDPOINTS$1 = {
6537
6642
  "server:internal_error"
6538
6643
  ]
6539
6644
  },
6540
- subscribeNewsletter: {
6541
- path: "/public/sites/{siteId}/newsletter/subscribe",
6542
- method: "POST",
6543
- tags: ["public-newsletter-{siteId}"],
6544
- auth: "public",
6545
- responseKind: "json"
6546
- },
6547
- confirmNewsletter: {
6548
- path: "/public/sites/{siteId}/newsletter/confirm/{token}",
6549
- method: "GET",
6550
- tags: ["public-newsletter-{siteId}"],
6551
- auth: "public",
6552
- responseKind: "text"
6553
- },
6554
- unsubscribeNewsletter: {
6555
- path: "/public/sites/{siteId}/newsletter/unsubscribe/{token}",
6556
- method: "GET",
6557
- tags: ["public-newsletter-{siteId}"],
6558
- auth: "public",
6559
- responseKind: "text"
6560
- },
6561
- unsubscribeNewsletterPost: {
6562
- path: "/public/sites/{siteId}/newsletter/unsubscribe/{token}",
6563
- method: "POST",
6564
- tags: ["public-newsletter-{siteId}"],
6565
- auth: "public",
6566
- responseKind: "text"
6567
- },
6568
- getNewsletterArchive: {
6569
- path: "/public/sites/{siteId}/newsletter/archive/{token}",
6570
- method: "GET",
6571
- tags: ["public-newsletter-{siteId}"],
6572
- auth: "public",
6573
- responseKind: "text"
6574
- },
6575
6645
  listSiteContentTypes: {
6576
6646
  path: "/sites/{siteId}/content-types",
6577
6647
  method: "GET",
@@ -9539,7 +9609,7 @@ var SimpleCache = class {
9539
9609
  * 1. This constant
9540
9610
  * 2. The "version" field in package.json
9541
9611
  */
9542
- const SDK_VERSION = "0.143.0";
9612
+ const SDK_VERSION = "0.145.0";
9543
9613
  //#endregion
9544
9614
  //#region src/client/error.ts
9545
9615
  let _Symbol$for;
@@ -10606,6 +10676,8 @@ const buttonSystemSchema = z.strictObject({
10606
10676
  //#endregion
10607
10677
  //#region ../theme-core/src/palette/utils/colorConversion.ts
10608
10678
  const clamp01 = (x) => Math.max(0, Math.min(1, x));
10679
+ const mod = (a, n) => (a % n + n) % n;
10680
+ const deg = (x) => mod(x, 360);
10609
10681
  function hexToRgb(hex) {
10610
10682
  const h = hex.replace(/^#/, "");
10611
10683
  const m = h.length === 3 ? h.split("").map((c) => c + c).join("") : h;
@@ -10628,6 +10700,45 @@ function srgbToLinear(u) {
10628
10700
  function linearToSrgb(x) {
10629
10701
  return clamp01(x <= .0031308 ? 12.92 * x : 1.055 * Math.pow(x, 1 / 2.4) - .055) * 255;
10630
10702
  }
10703
+ function rgbToHsl(r, g, b) {
10704
+ const R = r / 255, G = g / 255, B = b / 255;
10705
+ const max = Math.max(R, G, B), min = Math.min(R, G, B);
10706
+ const d = max - min;
10707
+ let h = 0;
10708
+ if (d !== 0) {
10709
+ switch (max) {
10710
+ case R:
10711
+ h = (G - B) / d + (G < B ? 6 : 0);
10712
+ break;
10713
+ case G:
10714
+ h = (B - R) / d + 2;
10715
+ break;
10716
+ case B:
10717
+ h = (R - G) / d + 4;
10718
+ break;
10719
+ }
10720
+ h *= 60;
10721
+ }
10722
+ const l = (max + min) / 2;
10723
+ const s = d === 0 ? 0 : d / (1 - Math.abs(2 * l - 1));
10724
+ return {
10725
+ h,
10726
+ s,
10727
+ l
10728
+ };
10729
+ }
10730
+ function srgbToOklab(r, g, b) {
10731
+ const R = srgbToLinear(r), G = srgbToLinear(g), B = srgbToLinear(b);
10732
+ const l = .4122214708 * R + .5363325363 * G + .0514459929 * B;
10733
+ const m = .2119034982 * R + .6806995451 * G + .1073969566 * B;
10734
+ const s = .0883024619 * R + .2817188376 * G + .6299787005 * B;
10735
+ const l_ = Math.cbrt(l), m_ = Math.cbrt(m), s_ = Math.cbrt(s);
10736
+ return {
10737
+ L: .2104542553 * l_ + .793617785 * m_ - .0040720468 * s_,
10738
+ a: 1.9779984951 * l_ - 2.428592205 * m_ + .4505937099 * s_,
10739
+ b: .0259040371 * l_ + .7827717662 * m_ - .808675766 * s_
10740
+ };
10741
+ }
10631
10742
  function oklabToSrgb(L, a, b) {
10632
10743
  const l_ = Math.pow(L + .3963377774 * a + .2158037573 * b, 3);
10633
10744
  const m_ = Math.pow(L - .1055613458 * a - .0638541728 * b, 3);
@@ -10641,6 +10752,14 @@ function oklabToSrgb(L, a, b) {
10641
10752
  b: linearToSrgb(B)
10642
10753
  };
10643
10754
  }
10755
+ function oklabToOklch(L, a, b) {
10756
+ const C = Math.sqrt(a * a + b * b);
10757
+ return {
10758
+ L,
10759
+ C,
10760
+ h: C < 1e-7 ? 0 : deg(Math.atan2(b, a) * 180 / Math.PI)
10761
+ };
10762
+ }
10644
10763
  function oklchToOklab(L, C, h) {
10645
10764
  const hr = h * Math.PI / 180;
10646
10765
  return {
@@ -10649,6 +10768,27 @@ function oklchToOklab(L, C, h) {
10649
10768
  b: C * Math.sin(hr)
10650
10769
  };
10651
10770
  }
10771
+ function featuresFromHex(hex) {
10772
+ const { r, g, b } = hexToRgb(hex);
10773
+ const { h, s, l } = rgbToHsl(r, g, b);
10774
+ const { L, a, b: b2 } = srgbToOklab(r, g, b);
10775
+ const { L: okL, C: okC, h: okH } = oklabToOklch(L, a, b2);
10776
+ return {
10777
+ r,
10778
+ g,
10779
+ b,
10780
+ h,
10781
+ s,
10782
+ l,
10783
+ v: Math.max(r, g, b) / 255,
10784
+ Y: .2126 * srgbToLinear(r) + .7152 * srgbToLinear(g) + .0722 * srgbToLinear(b),
10785
+ chroma: s,
10786
+ okL,
10787
+ okC,
10788
+ okH,
10789
+ hex
10790
+ };
10791
+ }
10652
10792
  function relativeLuminance(r, g, b) {
10653
10793
  const R = srgbToLinear(r), G = srgbToLinear(g), B = srgbToLinear(b);
10654
10794
  return .2126 * R + .7152 * G + .0722 * B;
@@ -11698,6 +11838,36 @@ function normalizedReference(value) {
11698
11838
  return normalized.length > 0 ? normalized : null;
11699
11839
  }
11700
11840
  //#endregion
11841
+ //#region ../theme-core/src/surfaces/logoVariant.ts
11842
+ /** Concrete hex behind a plain, opaque palette token, or null otherwise. */
11843
+ function opaquePaletteHexForToken(expandedPalette, token) {
11844
+ if (!token) return null;
11845
+ const parts = parseColorTokenParts(token);
11846
+ if (parts.kind !== "token" || parts.opacityPercent !== null) return null;
11847
+ return expandedPalette[parts.token] ?? null;
11848
+ }
11849
+ /**
11850
+ * Tone of the surface a foreground token was resolved for.
11851
+ *
11852
+ * A token with opacity has no known underlay to composite against, and a raw
11853
+ * or unrecognised token has no palette hex, so both are `unknown` rather than
11854
+ * a guess.
11855
+ */
11856
+ function surfaceToneFromForegroundToken(expandedPalette, foregroundToken) {
11857
+ const hex = opaquePaletteHexForToken(expandedPalette, foregroundToken);
11858
+ if (!hex) return "unknown";
11859
+ return featuresFromHex(hex).Y >= .5 ? "dark" : "light";
11860
+ }
11861
+ /**
11862
+ * The logo to draw on a surface of the given tone. A missing variant falls
11863
+ * back to the other one, and an unknown tone uses the light-backgrounds logo,
11864
+ * which is what every site rendered before variants existed.
11865
+ */
11866
+ function selectLogoVariant(tone, variants) {
11867
+ const { forLightBackgrounds, forDarkBackgrounds } = variants;
11868
+ return tone === "dark" ? forDarkBackgrounds ?? forLightBackgrounds : forLightBackgrounds ?? forDarkBackgrounds;
11869
+ }
11870
+ //#endregion
11701
11871
  //#region ../theme-core/src/utils/colorStyles.ts
11702
11872
  const COLOR_VAR_PREFIX = "--tb-";
11703
11873
  function parseToken(source) {
@@ -11749,16 +11919,28 @@ function backgroundColorStyle(token) {
11749
11919
  return { backgroundColor: rgbColorValue(token) };
11750
11920
  }
11751
11921
  /**
11922
+ * Converts a text color token to a CSS color value that follows the enclosing
11923
+ * surface. The semantic text tokens (`text`, `heading`, `mutedText`) resolve
11924
+ * to the surface foreground variables, so text adapts when a section's
11925
+ * background changes; any other token is a fixed theme color.
11926
+ *
11927
+ * @param token - Theme color token
11928
+ * @returns CSS color value
11929
+ */
11930
+ function textColorValue(token) {
11931
+ const parsed = parseToken(token);
11932
+ const surfaceRole = parsed.raw ? null : surfaceRoleForTextToken(parsed.token);
11933
+ if (!surfaceRole) return rgbColorValue(token);
11934
+ return parsed.opacityPercent === void 0 ? surfaceForegroundValue(surfaceRole) : surfaceForegroundValueWithOpacity(surfaceRole, parsed.opacityPercent);
11935
+ }
11936
+ /**
11752
11937
  * Creates a text color style object from a theme token.
11753
11938
  *
11754
11939
  * @param token - Theme color token
11755
11940
  * @returns CSSProperties with color
11756
11941
  */
11757
11942
  function textColorStyle(token) {
11758
- const parsed = parseToken(token);
11759
- const surfaceRole = parsed.raw ? null : surfaceRoleForTextToken(parsed.token);
11760
- if (surfaceRole) return { color: parsed.opacityPercent === void 0 ? surfaceForegroundValue(surfaceRole) : surfaceForegroundValueWithOpacity(surfaceRole, parsed.opacityPercent) };
11761
- return { color: rgbColorValue(token) };
11943
+ return { color: textColorValue(token) };
11762
11944
  }
11763
11945
  /**
11764
11946
  * Creates a border color style object from a theme token.
@@ -14943,6 +15125,15 @@ function asSiteStyleId(value) {
14943
15125
  function asDesignSystemTemplateId(value) {
14944
15126
  return brandNonEmptyString(value, "DesignSystemTemplateId");
14945
15127
  }
15128
+ function toNonEmptyReadonlyArray(values) {
15129
+ const [first, ...rest] = values;
15130
+ return first === void 0 ? null : [first, ...rest];
15131
+ }
15132
+ function requireNonEmptyReadonlyArray(values, message = "Expected a non-empty array.") {
15133
+ const result = toNonEmptyReadonlyArray(values);
15134
+ if (!result) throw new Error(message);
15135
+ return result;
15136
+ }
14946
15137
  function makeBoundaryId(previousBlockId, nextBlockId) {
14947
15138
  return asDesignBoundaryId(`boundary:${encodeURIComponent(previousBlockId)}:${encodeURIComponent(nextBlockId)}`);
14948
15139
  }
@@ -15145,16 +15336,18 @@ const themeV2RuntimeStyleFieldNames = [
15145
15336
  "_frameStyles",
15146
15337
  "_sectionStyles",
15147
15338
  "_containerStyles",
15148
- "_cardStyles",
15149
- "_transitionStyles",
15150
- "styleGroup"
15339
+ "_cardStyles"
15151
15340
  ];
15152
15341
  const themeV2BlockSpecificRawStyleFieldNames = [
15153
15342
  "_contentCardStyles",
15154
15343
  "_heroLayoutStyles",
15155
15344
  "_textCardStyles"
15156
15345
  ];
15157
- const themeV2NormalEditorRawStyleFieldNames = [...themeV2RuntimeStyleFieldNames, ...themeV2BlockSpecificRawStyleFieldNames];
15346
+ const themeV2NormalEditorRawStyleFieldNames = [
15347
+ ...themeV2RuntimeStyleFieldNames,
15348
+ ...themeV2BlockSpecificRawStyleFieldNames,
15349
+ "styleGroup"
15350
+ ];
15158
15351
  new Set(themeV2NormalEditorRawStyleFieldNames);
15159
15352
  [...themeV2RuntimeStyleFieldNames, ...themeV2BlockSpecificRawStyleFieldNames];
15160
15353
  const pageDesignEditorBackgroundOverrideOwner = "page-design-editor";
@@ -16435,7 +16628,8 @@ const siteOptionSources = [
16435
16628
  "eventCategories",
16436
16629
  "eventSeries",
16437
16630
  "venues",
16438
- "staffMembers"
16631
+ "staffMembers",
16632
+ "appointmentServiceCategories"
16439
16633
  ];
16440
16634
  const mediaDeliverySchema = z.object({
16441
16635
  sizes: z.string().optional(),
@@ -19810,11 +20004,260 @@ function cardRoleFromLegacyVocabulary(value) {
19810
20004
  */
19811
20005
  const cardRoleWithLegacyAliasSchema = z.preprocess((value) => cardRoleFromLegacyVocabulary(value) ?? value, cardRoleSchema);
19812
20006
  //#endregion
19813
- //#region ../theme-core/src/site-styles/compilationPlan.ts
19814
- const defaultHeaderBrandPreferences = {
19815
- brandDisplay: "auto",
19816
- logoSize: "auto"
19817
- };
20007
+ //#region ../theme-core/src/site-styles/transitionCatalogue.ts
20008
+ /**
20009
+ * Family order for pickers. Entries below are listed family by family in this
20010
+ * same order, so the flat option list and the grouped families agree.
20011
+ */
20012
+ const transitionCatalogueFamilies = [
20013
+ {
20014
+ id: "gradient",
20015
+ label: "Gradient"
20016
+ },
20017
+ {
20018
+ id: "wave",
20019
+ label: "Wave"
20020
+ },
20021
+ {
20022
+ id: "angle",
20023
+ label: "Angle"
20024
+ }
20025
+ ];
20026
+ const mediumHeight = "6rem + 2px";
20027
+ const compactHeight = "4.5rem + 2px";
20028
+ const largeHeight = "7rem + 2px";
20029
+ /**
20030
+ * The single source of transition vocabulary. Order is significant: it is the
20031
+ * order of `boundaryOptions` (after `none`) and of each family's variants,
20032
+ * which persisted pins, page-flow presets and the editor picker all rely on.
20033
+ *
20034
+ * Shapes match what `generateLayoutCss` draws today. Structured
20035
+ * amplitude/frequency treatments (issue 826) extend this list later.
20036
+ */
20037
+ const transitionCatalogueEntries = defineExactCatalog()([
20038
+ {
20039
+ intent: "soft-fade-short",
20040
+ optionId: asBoundaryOptionId("break:soft"),
20041
+ family: "gradient",
20042
+ variantId: "soft",
20043
+ label: "Soft",
20044
+ variantLabel: "Soft",
20045
+ treatment: {
20046
+ kind: "soft-fade",
20047
+ height: "medium",
20048
+ curve: "soft"
20049
+ },
20050
+ size: "medium",
20051
+ heightExpression: mediumHeight,
20052
+ shape: { kind: "fade" }
20053
+ },
20054
+ {
20055
+ intent: "soft-fade-long",
20056
+ optionId: asBoundaryOptionId("break:spacious"),
20057
+ family: "gradient",
20058
+ variantId: "spacious",
20059
+ label: "Spacious",
20060
+ variantLabel: "Spacious",
20061
+ treatment: {
20062
+ kind: "soft-fade",
20063
+ height: "large",
20064
+ curve: "spacious"
20065
+ },
20066
+ size: "spacious",
20067
+ heightExpression: "10rem",
20068
+ shape: { kind: "fade" }
20069
+ },
20070
+ {
20071
+ intent: "soft-fade-expansive",
20072
+ optionId: asBoundaryOptionId("break:expansive"),
20073
+ family: "gradient",
20074
+ variantId: "expansive",
20075
+ label: "Expansive",
20076
+ variantLabel: "Expansive",
20077
+ treatment: {
20078
+ kind: "soft-fade",
20079
+ height: "expansive",
20080
+ curve: "expansive"
20081
+ },
20082
+ size: "expansive",
20083
+ heightExpression: "14rem",
20084
+ shape: { kind: "fade" }
20085
+ },
20086
+ {
20087
+ intent: "wave-edge-balanced",
20088
+ optionId: asBoundaryOptionId("break:wave-balanced"),
20089
+ family: "wave",
20090
+ variantId: "balanced",
20091
+ label: "Balanced wave",
20092
+ variantLabel: "Balanced",
20093
+ treatment: {
20094
+ kind: "wave-edge",
20095
+ height: "medium",
20096
+ amplitude: "balanced",
20097
+ rhythm: "double",
20098
+ symmetry: "symmetrical"
20099
+ },
20100
+ size: "medium",
20101
+ heightExpression: mediumHeight,
20102
+ shape: {
20103
+ kind: "wave",
20104
+ mask: "balanced"
20105
+ }
20106
+ },
20107
+ {
20108
+ intent: "wave-edge",
20109
+ optionId: asBoundaryOptionId("break:wave"),
20110
+ family: "wave",
20111
+ variantId: "classic",
20112
+ label: "Classic wave",
20113
+ variantLabel: "Classic",
20114
+ treatment: {
20115
+ kind: "wave-edge",
20116
+ height: "medium",
20117
+ amplitude: "balanced",
20118
+ rhythm: "double",
20119
+ symmetry: "asymmetrical"
20120
+ },
20121
+ size: "medium",
20122
+ heightExpression: mediumHeight,
20123
+ shape: {
20124
+ kind: "wave",
20125
+ mask: "classic"
20126
+ }
20127
+ },
20128
+ {
20129
+ intent: "wave-edge-gentle",
20130
+ optionId: asBoundaryOptionId("break:wave-gentle"),
20131
+ family: "wave",
20132
+ variantId: "gentle",
20133
+ label: "Gentle wave",
20134
+ variantLabel: "Gentle",
20135
+ treatment: {
20136
+ kind: "wave-edge",
20137
+ height: "compact",
20138
+ amplitude: "subtle",
20139
+ rhythm: "single",
20140
+ symmetry: "symmetrical"
20141
+ },
20142
+ size: "compact",
20143
+ heightExpression: compactHeight,
20144
+ shape: {
20145
+ kind: "wave",
20146
+ mask: "gentle"
20147
+ }
20148
+ },
20149
+ {
20150
+ intent: "wave-edge-bold",
20151
+ optionId: asBoundaryOptionId("break:wave-bold"),
20152
+ family: "wave",
20153
+ variantId: "bold",
20154
+ label: "Bold wave",
20155
+ variantLabel: "Bold",
20156
+ treatment: {
20157
+ kind: "wave-edge",
20158
+ height: "large",
20159
+ amplitude: "bold",
20160
+ rhythm: "double",
20161
+ symmetry: "symmetrical"
20162
+ },
20163
+ size: "large",
20164
+ heightExpression: largeHeight,
20165
+ shape: {
20166
+ kind: "wave",
20167
+ mask: "bold"
20168
+ }
20169
+ },
20170
+ {
20171
+ intent: "wave-edge-drift",
20172
+ optionId: asBoundaryOptionId("break:wave-drift"),
20173
+ family: "wave",
20174
+ variantId: "drift",
20175
+ label: "Drift wave",
20176
+ variantLabel: "Drift",
20177
+ treatment: {
20178
+ kind: "wave-edge",
20179
+ height: "medium",
20180
+ amplitude: "balanced",
20181
+ rhythm: "double",
20182
+ symmetry: "drift"
20183
+ },
20184
+ size: "medium",
20185
+ heightExpression: mediumHeight,
20186
+ shape: {
20187
+ kind: "wave",
20188
+ mask: "drift"
20189
+ }
20190
+ },
20191
+ {
20192
+ intent: "angle-edge-subtle",
20193
+ optionId: asBoundaryOptionId("break:angle-subtle"),
20194
+ family: "angle",
20195
+ variantId: "subtle",
20196
+ label: "Subtle angle",
20197
+ variantLabel: "Subtle",
20198
+ treatment: {
20199
+ kind: "angle-edge",
20200
+ height: "compact",
20201
+ slope: "subtle",
20202
+ direction: "forward"
20203
+ },
20204
+ size: "compact",
20205
+ heightExpression: compactHeight,
20206
+ shape: {
20207
+ kind: "angle",
20208
+ polygon: {
20209
+ startTopPercent: 34,
20210
+ endTopPercent: 18
20211
+ }
20212
+ }
20213
+ },
20214
+ {
20215
+ intent: "angle-edge",
20216
+ optionId: asBoundaryOptionId("break:angle-balanced"),
20217
+ family: "angle",
20218
+ variantId: "balanced",
20219
+ label: "Balanced angle",
20220
+ variantLabel: "Balanced",
20221
+ treatment: {
20222
+ kind: "angle-edge",
20223
+ height: "medium",
20224
+ slope: "balanced",
20225
+ direction: "forward"
20226
+ },
20227
+ size: "medium",
20228
+ heightExpression: mediumHeight,
20229
+ shape: {
20230
+ kind: "angle",
20231
+ polygon: {
20232
+ startTopPercent: 42,
20233
+ endTopPercent: 8
20234
+ }
20235
+ }
20236
+ },
20237
+ {
20238
+ intent: "angle-edge-steep",
20239
+ optionId: asBoundaryOptionId("break:angle-steep"),
20240
+ family: "angle",
20241
+ variantId: "steep",
20242
+ label: "Steep angle",
20243
+ variantLabel: "Steep",
20244
+ treatment: {
20245
+ kind: "angle-edge",
20246
+ height: "large",
20247
+ slope: "steep",
20248
+ direction: "forward"
20249
+ },
20250
+ size: "large",
20251
+ heightExpression: largeHeight,
20252
+ shape: {
20253
+ kind: "angle",
20254
+ polygon: {
20255
+ startTopPercent: 54,
20256
+ endTopPercent: 0
20257
+ }
20258
+ }
20259
+ }
20260
+ ]);
19818
20261
  //#endregion
19819
20262
  //#region ../theme-core/src/site-styles/sectionTransitions.ts
19820
20263
  function boundaryRuntimeMetrics(family, size, heightExpression) {
@@ -19825,42 +20268,106 @@ function boundaryRuntimeMetrics(family, size, heightExpression) {
19825
20268
  reserveCss: `calc((${heightExpression}) / 2)`
19826
20269
  };
19827
20270
  }
19828
- 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");
20271
+ new Map(transitionCatalogueEntries.map((entry) => [entry.intent, entry]));
20272
+ new Map(transitionCatalogueEntries.map((entry) => [entry.intent, boundaryRuntimeMetrics(entry.family, entry.size, entry.heightExpression)]));
20273
+ /**
20274
+ * The catalogue's compile-time coverage check guarantees an entry per
20275
+ * decorative intent, so a miss here is a broken invariant, not bad input.
20276
+ */
20277
+ function requireCatalogueValue(values, intent) {
20278
+ const value = values.get(intent);
20279
+ if (value === void 0) throw new Error(`Transition catalogue has no entry for ${intent}`);
20280
+ return value;
20281
+ }
19829
20282
  const noneBoundaryOption = {
19830
20283
  id: asBoundaryOptionId("break:none"),
19831
20284
  label: "None",
19832
20285
  transitionAfter: "none",
19833
20286
  treatment: { kind: "none" }
19834
20287
  };
19835
- const softBoundaryOption = {
19836
- id: asBoundaryOptionId("break:soft"),
19837
- label: "Soft",
19838
- transitionAfter: "soft-fade-short",
19839
- treatment: {
19840
- kind: "soft-fade",
19841
- height: "medium",
19842
- curve: "soft"
19843
- }
20288
+ const boundaryOptionByIntent = new Map(transitionCatalogueEntries.map((entry) => [entry.intent, {
20289
+ id: entry.optionId,
20290
+ label: entry.label,
20291
+ transitionAfter: entry.intent,
20292
+ treatment: entry.treatment
20293
+ }]));
20294
+ function boundaryOptionForTransitionIntent(intent) {
20295
+ return requireCatalogueValue(boundaryOptionByIntent, intent);
20296
+ }
20297
+ const softBoundaryOption = boundaryOptionForTransitionIntent("soft-fade-short");
20298
+ const spaciousBoundaryOption = boundaryOptionForTransitionIntent("soft-fade-long");
20299
+ boundaryOptionForTransitionIntent("soft-fade-expansive");
20300
+ boundaryOptionForTransitionIntent("wave-edge");
20301
+ boundaryOptionForTransitionIntent("wave-edge-balanced");
20302
+ boundaryOptionForTransitionIntent("wave-edge-gentle");
20303
+ boundaryOptionForTransitionIntent("wave-edge-bold");
20304
+ boundaryOptionForTransitionIntent("wave-edge-drift");
20305
+ boundaryOptionForTransitionIntent("angle-edge-subtle");
20306
+ boundaryOptionForTransitionIntent("angle-edge");
20307
+ boundaryOptionForTransitionIntent("angle-edge-steep");
20308
+ /**
20309
+ * Must remain non-empty; downstream code indexes `[0]` as the documented default.
20310
+ */
20311
+ const boundaryOptions = [noneBoundaryOption, ...transitionCatalogueEntries.map((entry) => boundaryOptionForTransitionIntent(entry.intent))];
20312
+ const noneTransitionVariant = {
20313
+ familyId: "none",
20314
+ variantId: "none",
20315
+ label: "None",
20316
+ boundaryOption: noneBoundaryOption
19844
20317
  };
19845
- const spaciousBoundaryOption = {
19846
- id: asBoundaryOptionId("break:spacious"),
19847
- label: "Spacious",
19848
- transitionAfter: "soft-fade-long",
19849
- treatment: {
19850
- kind: "soft-fade",
19851
- height: "large",
19852
- curve: "spacious"
19853
- }
20318
+ function transitionVariantForEntry(entry) {
20319
+ return {
20320
+ familyId: entry.family,
20321
+ variantId: entry.variantId,
20322
+ label: entry.variantLabel,
20323
+ boundaryOption: boundaryOptionForTransitionIntent(entry.intent)
20324
+ };
20325
+ }
20326
+ const sectionTransitionFamilies = [{
20327
+ id: "none",
20328
+ label: "None",
20329
+ variants: [noneTransitionVariant]
20330
+ }, ...transitionCatalogueFamilies.map((family) => ({
20331
+ id: family.id,
20332
+ label: family.label,
20333
+ variants: requireNonEmptyReadonlyArray(transitionCatalogueEntries.filter((entry) => entry.family === family.id).map(transitionVariantForEntry), `Transition family ${family.id} has no catalogue entries.`)
20334
+ }))];
20335
+ new Map(boundaryOptions.map((option) => [option.id, option]));
20336
+ new Map(boundaryOptions.map((option) => [stableTreatmentKey(option.treatment), option]));
20337
+ new Map(sectionTransitionFamilies.flatMap((family) => family.variants.map((variant) => [variant.boundaryOption.id, variant])));
20338
+ new Map(sectionTransitionFamilies.map((family) => [family.id, family]));
20339
+ function stableTreatmentKey(treatment) {
20340
+ switch (treatment.kind) {
20341
+ case "none": return "none";
20342
+ case "soft-fade": return `${treatment.kind}:${treatment.height}:${treatment.curve}`;
20343
+ case "wave-edge": return [
20344
+ treatment.kind,
20345
+ treatment.height,
20346
+ treatment.amplitude,
20347
+ treatment.rhythm,
20348
+ treatment.symmetry
20349
+ ].join(":");
20350
+ case "angle-edge": return [
20351
+ treatment.kind,
20352
+ treatment.height,
20353
+ treatment.slope,
20354
+ treatment.direction
20355
+ ].join(":");
20356
+ case "legacy-unsupported": return `${treatment.kind}:${treatment.boundaryOptionId}`;
20357
+ }
20358
+ }
20359
+ requireThemeColorToken$1("background");
20360
+ function requireThemeColorToken$1(value) {
20361
+ const token = parseThemeColorToken(value);
20362
+ if (!token) throw new Error(`Expected a theme color token. Received: ${value}`);
20363
+ return token;
20364
+ }
20365
+ //#endregion
20366
+ //#region ../theme-core/src/site-styles/compilationPlan.ts
20367
+ const defaultHeaderBrandPreferences = {
20368
+ brandDisplay: "auto",
20369
+ logoSize: "auto"
19854
20370
  };
19855
- asBoundaryOptionId("break:expansive");
19856
- asBoundaryOptionId("break:wave");
19857
- asBoundaryOptionId("break:wave-balanced");
19858
- asBoundaryOptionId("break:wave-gentle");
19859
- asBoundaryOptionId("break:wave-bold");
19860
- asBoundaryOptionId("break:wave-drift");
19861
- asBoundaryOptionId("break:angle-subtle");
19862
- asBoundaryOptionId("break:angle-balanced");
19863
- asBoundaryOptionId("break:angle-steep");
19864
20371
  asBoundaryOptionId("break:unknown");
19865
20372
  const pageDesignUserPinnedAppearanceChoiceSchema = z.object({
19866
20373
  kind: z.literal("user-pinned"),
@@ -19987,14 +20494,11 @@ function validateUniquePageDesignPins(intent, ctx) {
19987
20494
  label: "block Look pin"
19988
20495
  });
19989
20496
  addDuplicateStringIssues(ctx, {
19990
- values: intent.boundaryPins.map((pin) => boundaryKey(pin.previousBlockId, pin.nextBlockId)),
20497
+ values: intent.boundaryPins.map((pin) => makeBoundaryId(pin.previousBlockId, pin.nextBlockId)),
19991
20498
  path: ["boundaryPins"],
19992
20499
  label: "boundary pin"
19993
20500
  });
19994
20501
  }
19995
- function boundaryKey(previousBlockId, nextBlockId) {
19996
- return makeBoundaryId(previousBlockId, nextBlockId);
19997
- }
19998
20502
  //#endregion
19999
20503
  //#region ../theme-core/src/site-styles/styleTags.ts
20000
20504
  /**
@@ -22950,6 +23454,13 @@ z.object({
22950
23454
  fields: nonEmptyRuntimeStyleFieldNamesSchema,
22951
23455
  authority: styleAuthoritySchema
22952
23456
  }).strict();
23457
+ asPageFlowPresetId("flow:quiet"), noneBoundaryOption.id, asPageFlowPresetId("flow:balanced"), softBoundaryOption.id, asPageFlowPresetId("flow:expressive"), spaciousBoundaryOption.id;
23458
+ asPageFlowPresetId("generated-default");
23459
+ asSiteStyleId("site-style:south-west-twerk-school");
23460
+ asAppearancePresetId("hero-brand-scrim-fixed-frame");
23461
+ asLayoutVariantKey("classic");
23462
+ asLayoutVariantKey("micro");
23463
+ asBoundaryOptionId("break:wave");
22953
23464
  //#endregion
22954
23465
  //#region ../theme-core/src/site-styles/runtimeCompiler.ts
22955
23466
  function defineSectionForegroundRuntimeTokens(input) {
@@ -22973,7 +23484,7 @@ function defineComponentRuntimeRules(rules) {
22973
23484
  }
22974
23485
  /**
22975
23486
  * Default design rules translate semantic page-level choices into the current
22976
- * runtime's section background and transition style-group vocabulary.
23487
+ * runtime's section background vocabulary.
22977
23488
  */
22978
23489
  const defaultDesignRuntimeRules = defineDesignRuntimeRules({
22979
23490
  sectionSurfaces: {
@@ -23008,8 +23519,7 @@ const defaultDesignRuntimeRules = defineDesignRuntimeRules({
23008
23519
  color: "surface",
23009
23520
  opacity: .88
23010
23521
  }
23011
- },
23012
- transitionClassName: (transition, fromSurface, toSurface) => transition === "none" ? null : `site-style-transition-${transition}-from-${fromSurface}-to-${toSurface}`
23522
+ }
23013
23523
  });
23014
23524
  /**
23015
23525
  * Default component rules translate frame and item-surface semantics into the
@@ -24744,19 +25254,11 @@ const curatedSiteStyles = [
24744
25254
  })
24745
25255
  ];
24746
25256
  new Map(curatedSiteStyles.map((style) => [style.id, style]));
24747
- asPageFlowPresetId("generated-default");
24748
- asSiteStyleId("site-style:south-west-twerk-school");
24749
- asAppearancePresetId("hero-brand-scrim-fixed-frame");
24750
- asLayoutVariantKey("classic");
24751
- asLayoutVariantKey("micro");
24752
- asBoundaryOptionId("break:wave");
24753
- asPageFlowPresetId("flow:quiet"), noneBoundaryOption.id, asPageFlowPresetId("flow:balanced"), softBoundaryOption.id, asPageFlowPresetId("flow:expressive"), spaciousBoundaryOption.id;
24754
25257
  //#endregion
24755
25258
  //#region ../theme-core/src/site-styles/resolver.ts
24756
25259
  const blockDesignFallback = {
24757
25260
  sectionSurface: "base",
24758
25261
  contentFrame: plainFrame,
24759
- transitionAfter: "none",
24760
25262
  sectionHeight: "default",
24761
25263
  heroLegibility: "none",
24762
25264
  imageSurfaceTreatment: { kind: "none" },
@@ -24767,7 +25269,7 @@ const blockDesignFallback = {
24767
25269
  accordionIconTreatment: null,
24768
25270
  composition: null
24769
25271
  };
24770
- blockDesignFallback.sectionSurface, blockDesignFallback.contentFrame, blockDesignFallback.transitionAfter, blockDesignFallback.sectionHeight, blockDesignFallback.heroLegibility, blockDesignFallback.imageSurfaceTreatment, blockDesignFallback.imageSurfaceMotion, blockDesignFallback.tileTreatment, blockDesignFallback.eventListTreatment, blockDesignFallback.eyebrowTreatment, blockDesignFallback.accordionIconTreatment, blockDesignFallback.composition;
25272
+ blockDesignFallback.sectionSurface, blockDesignFallback.contentFrame, blockDesignFallback.sectionHeight, blockDesignFallback.heroLegibility, blockDesignFallback.imageSurfaceTreatment, blockDesignFallback.imageSurfaceMotion, blockDesignFallback.tileTreatment, blockDesignFallback.eventListTreatment, blockDesignFallback.eyebrowTreatment, blockDesignFallback.accordionIconTreatment, blockDesignFallback.composition;
24771
25273
  //#endregion
24772
25274
  //#region ../theme-core/src/site-styles/siteChromeBackgrounds.ts
24773
25275
  const siteChromeBackgroundColorTokens = toSiteChromeBackgroundColorTokens(backgroundAppearanceColorTokenNames);
@@ -26703,9 +27205,7 @@ function navRow(opts) {
26703
27205
  rel: { $bind: { from: `${childItemName}.rel` } },
26704
27206
  "data-active": { $bind: { from: `${childItemName}.active` } }
26705
27207
  }, [text({ as: "span" }, bind(`${childItemName}.label`))], repeat(`${itemName}.children`, childItemName));
26706
- const dropdown = el("div", { className: "nav-dropdown rb-relative" }, [button({
26707
- type: "button",
26708
- variantId: "",
27208
+ const dropdown = el("div", { className: "nav-dropdown rb-relative" }, [el("headerControl", {
26709
27209
  className: prependClassName("nav-dropdown-trigger", linkClassName),
26710
27210
  "aria-haspopup": "menu",
26711
27211
  "aria-expanded": "false",
@@ -26773,9 +27273,7 @@ function navColumn(opts) {
26773
27273
  const dropdown = el("div", {
26774
27274
  className: "nav-mobile-dropdown",
26775
27275
  "data-nav-mobile-dropdown": "true"
26776
- }, [button({
26777
- type: "button",
26778
- variantId: "",
27276
+ }, [el("headerControl", {
26779
27277
  className: triggerClassName,
26780
27278
  "aria-expanded": "false",
26781
27279
  "aria-controls": childrenId,
@@ -33124,6 +33622,49 @@ const layoutTransforms = [
33124
33622
  footerLogoMediaClassTransform,
33125
33623
  footerLogoTextVisibleTransform
33126
33624
  ];
33625
+ //#endregion
33626
+ //#region ../blocks/src/system/transforms/registry/chromeLogo.ts
33627
+ const chromeLogoSchema = z.object({ surface: z.enum([
33628
+ "header-root",
33629
+ "header-mobile-panel",
33630
+ "footer-root"
33631
+ ]) });
33632
+ /** The brand foreground shares the logo's surface; navigation may own a separate capsule. */
33633
+ function chromeSurfaceTextToken(surface, theme, palette) {
33634
+ switch (surface) {
33635
+ case "header-root": {
33636
+ const header = theme.header;
33637
+ const foreground = resolveHeaderRootForeground(header, palette, resolveHeaderVisualStyles(header).isTransparent);
33638
+ return foreground.kind === "known" ? foreground.roles.text : resolveHeaderLeafTextColor(header);
33639
+ }
33640
+ case "header-mobile-panel": return theme.header?.dropdownStyle?.textColor ?? "text";
33641
+ case "footer-root": {
33642
+ const foreground = resolveFooterRootForeground(theme.footer, palette);
33643
+ return foreground.kind === "known" ? foreground.roles.text : void 0;
33644
+ }
33645
+ }
33646
+ }
33647
+ function readChromeTheme(viewModel) {
33648
+ return asPartialObject(asPartialObject(viewModel?.["$root"])?.theme) ?? {};
33649
+ }
33650
+ function resolveChromeSurfaceTone(surface, context) {
33651
+ return surfaceToneFromForegroundToken(context.theme.palette, chromeSurfaceTextToken(surface, readChromeTheme(context.viewModel), context.theme.palette));
33652
+ }
33653
+ const chromeLogoTransforms = [{
33654
+ id: "layout.chromeLogo",
33655
+ kind: "formatter",
33656
+ summary: "Select the light- or dark-background site logo for a header or footer surface",
33657
+ schema: chromeLogoSchema,
33658
+ run: (value, options, context) => {
33659
+ const content = asPartialObject(value);
33660
+ const variants = asPartialObject(content?.logoVariants);
33661
+ if (!variants) return content?.logo ?? null;
33662
+ return selectLogoVariant(resolveChromeSurfaceTone(options.surface, context), {
33663
+ forLightBackgrounds: variants.forLightBackgrounds ?? null,
33664
+ forDarkBackgrounds: variants.forDarkBackgrounds ?? null
33665
+ });
33666
+ }
33667
+ }];
33127
33668
  const headerRuntimeTransforms = [{
33128
33669
  id: "layout.headerRuntimeContract",
33129
33670
  kind: "formatter",
@@ -33326,46 +33867,42 @@ const whenTransformed = (from, transformId, equals = true) => (node) => ({
33326
33867
  equals
33327
33868
  }
33328
33869
  });
33329
- const logoRow = link({
33870
+ /** Draw whichever site logo suits the surface this row sits on. */
33871
+ const bindChromeLogo = (surface) => bind("content", { transforms: [{
33872
+ id: "layout.chromeLogo",
33873
+ options: { surface }
33874
+ }] });
33875
+ /**
33876
+ * The brand link. The logo is chosen per surface because the open mobile menu
33877
+ * paints its own background, which may be the opposite tone to the header.
33878
+ */
33879
+ const createLogoRow = (surface) => link({
33330
33880
  href: "/",
33331
33881
  className: bindProp("$root.theme.header.logo", {
33332
33882
  transforms: pipe(tx("layout.headerLogoClass")),
33333
33883
  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"
33334
33884
  })
33335
- }, [
33336
- media({ className: bindProp("$root.theme.header.logo", {
33337
- transforms: pipe(tx("layout.headerLogoMediaClass", { base: "rb-header-logo-sm rb-w-auto rb-transition-all rb-duration-300" })),
33338
- fallback: "rb-header-logo-sm rb-w-auto rb-transition-all rb-duration-300"
33339
- }) }, when("content.logo"), bind("content.logo")),
33340
- stack({ className: "rb-contents" }, [media({ className: bindProp("$root.theme.header.logo", {
33341
- transforms: pipe(tx("layout.headerLogoMediaClass", { base: "rb-header-logo-sm rb-w-auto rb-transition-all rb-duration-300" })),
33342
- fallback: "rb-header-logo-sm rb-w-auto rb-transition-all rb-duration-300"
33343
- }) }, when("site.logo"), bind("site.logo"))], when("content.logo", { not: true })),
33344
- text({
33345
- as: "strong",
33346
- className: "header-logo-text rb-truncate"
33347
- }, whenTransformed("$root.theme.header.logo", "layout.headerLogoTextVisible"), bind("site.title", { fallback: "Your Site" }))
33348
- ]);
33885
+ }, [media({ className: bindProp("$root.theme.header.logo", {
33886
+ transforms: pipe(tx("layout.headerLogoMediaClass", { base: "rb-header-logo-sm rb-w-auto rb-transition-all rb-duration-300" })),
33887
+ fallback: "rb-header-logo-sm rb-w-auto rb-transition-all rb-duration-300"
33888
+ }) }, when("content.logo"), bindChromeLogo(surface)), text({
33889
+ as: "strong",
33890
+ className: "header-logo-text rb-truncate"
33891
+ }, whenTransformed("$root.theme.header.logo", "layout.headerLogoTextVisible"), bind("site.title", { fallback: "Your Site" }))]);
33892
+ const logoRow = createLogoRow("header-root");
33349
33893
  const centeredLogoRow = link({
33350
33894
  href: "/",
33351
33895
  className: bindProp("$root.theme.header.logo", {
33352
33896
  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" })),
33353
33897
  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"
33354
33898
  })
33355
- }, [
33356
- media({ className: bindProp("$root.theme.header.logo", {
33357
- transforms: pipe(tx("layout.headerLogoMediaClass", { base: "rb-header-logo-lg rb-w-auto rb-transition-all rb-duration-300" })),
33358
- fallback: "rb-header-logo-lg rb-w-auto rb-transition-all rb-duration-300"
33359
- }) }, when("content.logo"), bind("content.logo")),
33360
- stack({ className: "rb-contents" }, [media({ className: bindProp("$root.theme.header.logo", {
33361
- transforms: pipe(tx("layout.headerLogoMediaClass", { base: "rb-header-logo-lg rb-w-auto rb-transition-all rb-duration-300" })),
33362
- fallback: "rb-header-logo-lg rb-w-auto rb-transition-all rb-duration-300"
33363
- }) }, when("site.logo"), bind("site.logo"))], when("content.logo", { not: true })),
33364
- text({
33365
- as: "strong",
33366
- className: "header-logo-text"
33367
- }, whenTransformed("$root.theme.header.logo", "layout.headerLogoTextVisible"), bind("site.title", { fallback: "Your Site" }))
33368
- ]);
33899
+ }, [media({ className: bindProp("$root.theme.header.logo", {
33900
+ transforms: pipe(tx("layout.headerLogoMediaClass", { base: "rb-header-logo-lg rb-w-auto rb-transition-all rb-duration-300" })),
33901
+ fallback: "rb-header-logo-lg rb-w-auto rb-transition-all rb-duration-300"
33902
+ }) }, when("content.logo"), bindChromeLogo("header-root")), text({
33903
+ as: "strong",
33904
+ className: "header-logo-text"
33905
+ }, whenTransformed("$root.theme.header.logo", "layout.headerLogoTextVisible"), bind("site.title", { fallback: "Your Site" }))]);
33369
33906
  const createNavRow = (className, align = "end") => navRow({
33370
33907
  className: `${className} header-nav-row`,
33371
33908
  align,
@@ -33405,10 +33942,8 @@ const mobileToggleIcon = stack({
33405
33942
  }
33406
33943
  ]);
33407
33944
  const mobileToggleButton = {
33408
- type: "button",
33945
+ type: "headerControl",
33409
33946
  props: {
33410
- type: "button",
33411
- variantId: "",
33412
33947
  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`,
33413
33948
  "aria-label": "Open menu",
33414
33949
  "aria-expanded": "false",
@@ -33418,10 +33953,8 @@ const mobileToggleButton = {
33418
33953
  children: [mobileToggleIcon]
33419
33954
  };
33420
33955
  const mobileOverlayToggleButton = {
33421
- type: "button",
33956
+ type: "headerControl",
33422
33957
  props: {
33423
- type: "button",
33424
- variantId: "",
33425
33958
  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",
33426
33959
  "aria-label": "Open menu",
33427
33960
  "aria-expanded": "false",
@@ -33445,7 +33978,7 @@ const mobileOverlayHeader = inline({
33445
33978
  align: "center",
33446
33979
  justify: "between",
33447
33980
  style: borderColorStyle("border")
33448
- }, [logoRow, mobileOverlayToggleButton]);
33981
+ }, [createLogoRow("header-mobile-panel"), mobileOverlayToggleButton]);
33449
33982
  const mobileOverlayBody = stack({
33450
33983
  className: "rb-flex-1 rb-px-6 rb-py-6",
33451
33984
  gap: "md",
@@ -33632,7 +34165,10 @@ const brandLogo = link({
33632
34165
  options: { base: "rb-h-10 rb-w-auto" }
33633
34166
  }],
33634
34167
  fallback: "rb-h-10 rb-w-auto"
33635
- } } }, when("module.showLogo", { equals: true }), when("content.logo"), bind("content.logo")), text({
34168
+ } } }, when("module.showLogo", { equals: true }), when("content.logo"), bind("content", { transforms: [{
34169
+ id: "layout.chromeLogo",
34170
+ options: { surface: "footer-root" }
34171
+ }] })), text({
33636
34172
  as: "strong",
33637
34173
  className: "footer-logo-text rb-nav-text"
33638
34174
  }, when("module.showTitle", { equals: true }), bind("site.title", { fallback: "Your Site" }))], when("module.kind", { equals: "brand" }));
@@ -35325,6 +35861,15 @@ const appointmentServicesBlockDefinition = {
35325
35861
  required: false,
35326
35862
  ui: { intent: "content" }
35327
35863
  },
35864
+ createSiteOptionSelectField({
35865
+ id: "categoryId",
35866
+ label: "Category",
35867
+ description: "Show one category (with its heading and intro), or leave it on All categories to show everything grouped.",
35868
+ required: false,
35869
+ multiple: false,
35870
+ optionSource: "appointmentServiceCategories",
35871
+ ui: { intent: "content" }
35872
+ }),
35328
35873
  sectionStylesField({
35329
35874
  id: "_sectionStyles",
35330
35875
  label: "Section styles",
@@ -35359,6 +35904,7 @@ const appointmentServicesBlockDefinition = {
35359
35904
  richText({ className: "rb-prose rb-max-w-none" }, bind("content.description"), when("content.description")),
35360
35905
  el("appointment-services", {
35361
35906
  sectionHeading: { $bind: { from: "content.heading" } },
35907
+ categoryId: { $bind: { from: "content.categoryId" } },
35362
35908
  services: { $bind: { from: "data.services" } },
35363
35909
  pathname: { $bind: { from: "$root.pathname" } },
35364
35910
  servicePathPrefix: { $bind: { from: "$root.appointmentServicePathPrefix" } }
@@ -36271,6 +36817,12 @@ const occurrenceContextSchema = z.object({
36271
36817
  capacityOverride: z.number().nullable().optional(),
36272
36818
  overrides: z.record(z.string(), z.unknown()).nullable().optional()
36273
36819
  }).nullable();
36820
+ //#endregion
36821
+ //#region ../blocks/src/system/runtime/api/readAuthority.ts
36822
+ const browserReadAuthoritySchema = z.discriminatedUnion("kind", [z.object({ kind: z.literal("published") }).strict(), z.object({
36823
+ kind: z.literal("preview"),
36824
+ token: z.string().min(1)
36825
+ }).strict()]);
36274
36826
  const unsupportedEventRegistrationPageSurfaceSubjectSchema = z.object({
36275
36827
  kind: z.literal("unsupported"),
36276
36828
  reason: z.enum([
@@ -36381,6 +36933,33 @@ function normalizeEventCalendarDisplayMode$1(input) {
36381
36933
  if (isEventCalendarDisplayMode(input.variant)) return input.variant;
36382
36934
  return isEventCalendarDisplayMode(input.displayMode) ? input.displayMode : void 0;
36383
36935
  }
36936
+ /** One closed authority for the projections required by each rendered mode. */
36937
+ function resolveEventCalendarReadPlan(input) {
36938
+ const mode = normalizeEventCalendarDisplayMode$1(input) ?? "combined";
36939
+ switch (mode) {
36940
+ case "combined": return {
36941
+ mode,
36942
+ jobs: "both",
36943
+ readProfile: "listing-card"
36944
+ };
36945
+ case "list": return {
36946
+ mode,
36947
+ jobs: "list",
36948
+ readProfile: "listing-card"
36949
+ };
36950
+ case "calendar": return {
36951
+ mode,
36952
+ jobs: "calendar",
36953
+ readProfile: "listing-card"
36954
+ };
36955
+ case "timetable":
36956
+ case "week-board": return {
36957
+ mode,
36958
+ jobs: "calendar",
36959
+ readProfile: "timetable"
36960
+ };
36961
+ }
36962
+ }
36384
36963
  function isEventCalendarDefaultView(value) {
36385
36964
  return typeof value === "string" && eventCalendarDefaultViewValues.includes(value);
36386
36965
  }
@@ -36575,6 +37154,7 @@ const eventRegistrationSourceSchema = z.object({
36575
37154
  apiBaseUrl: z.string().optional(),
36576
37155
  portalToken: z.string().nullable().optional(),
36577
37156
  previewToken: z.string().nullable().optional(),
37157
+ readAuthority: browserReadAuthoritySchema.optional(),
36578
37158
  ...eventRegistrationHydrationSchemaShape,
36579
37159
  events: z.array(eventRegistrationPublicEventSchema).nullable().optional(),
36580
37160
  wholeSeriesRunEvents: z.array(eventRegistrationPublicEventSchema).nullable().optional(),
@@ -36612,6 +37192,7 @@ z.object({
36612
37192
  apiBaseUrl: z.string().optional(),
36613
37193
  portalToken: z.string().nullable().optional(),
36614
37194
  previewToken: z.string().nullable().optional(),
37195
+ readAuthority: browserReadAuthoritySchema.optional(),
36615
37196
  stage: previewStageSchema.optional()
36616
37197
  });
36617
37198
  function buildEventRegistrationDisplayFromScopedEvents(source, scopedSourceEvents) {
@@ -36870,6 +37451,7 @@ const eventRegistrationBlockDefinition = {
36870
37451
  text({ as: "h2" }, bind("content.heading"), when("content.heading")),
36871
37452
  richText({ className: "rb-prose rb-max-w-none" }, bind("content.description"), when("content.description")),
36872
37453
  eventRegistration(withApiBindings({
37454
+ readAuthority: { $bind: { from: "$root.readAuthority" } },
36873
37455
  occurrenceContext: { $bind: { from: "$root.occurrenceContext" } },
36874
37456
  subject: { $bind: { from: "$root.subject" } },
36875
37457
  portalToken: { $bind: {
@@ -37502,8 +38084,7 @@ function resolveEventListPaginationAction(input) {
37502
38084
  //#endregion
37503
38085
  //#region ../blocks/src/system/blocks/events/shared/calendarWindow.ts
37504
38086
  function resolveCalendarReadProfile(content) {
37505
- const mode = normalizeEventCalendarDisplayMode$1(content);
37506
- return mode === "timetable" || mode === "week-board" ? "timetable" : "listing-card";
38087
+ return resolveEventCalendarReadPlan(content).readProfile;
37507
38088
  }
37508
38089
  /** Runtime picker sentinels and bound loader IDs must describe the same query. */
37509
38090
  function normalizeCalendarFilterId(value) {
@@ -37613,6 +38194,7 @@ const eventCollectionSourceSchemaShape = {
37613
38194
  events: z.array(publicEventSchema).nullable().optional(),
37614
38195
  siteId: z.string(),
37615
38196
  apiBaseUrl: z.string().optional(),
38197
+ readAuthority: browserReadAuthoritySchema.optional(),
37616
38198
  stage: previewStageSchema.optional(),
37617
38199
  listLayout: eventLayoutSchema.optional(),
37618
38200
  listColumns: columnOptionSchema.optional(),
@@ -37665,7 +38247,6 @@ const eventCollectionDisplaySchemaShape = {
37665
38247
  const eventCollectionHydrationSchema = z.object({
37666
38248
  siteId: z.string(),
37667
38249
  calendarWindow: calendarWindowPageSchema.optional(),
37668
- stage: previewStageSchema.optional(),
37669
38250
  prefetchedEvents: z.boolean(),
37670
38251
  eventSurface: eventSurfaceScopeSchema$1,
37671
38252
  filterEventPresets: z.string().nullable(),
@@ -37740,7 +38321,6 @@ function buildEventCollectionHydration(source, now = /* @__PURE__ */ new Date())
37740
38321
  return {
37741
38322
  calendarWindow: source.calendarWindow ?? void 0,
37742
38323
  siteId: source.siteId,
37743
- stage: source.stage,
37744
38324
  prefetchedEvents: source.events != null,
37745
38325
  eventSurface: selected ? "all" : normalizeEventSurfaceScope(source.eventSurface),
37746
38326
  filterEventPresets: selected ? null : normalizeEventSurfacePresetsCsv(source.filterEventPresets),
@@ -37760,6 +38340,7 @@ const eventListingSourceSchema = z.object({
37760
38340
  events: z.array(publicEventSchema).nullable().optional(),
37761
38341
  siteId: z.string(),
37762
38342
  apiBaseUrl: z.string().optional(),
38343
+ readAuthority: browserReadAuthoritySchema.optional(),
37763
38344
  stage: previewStageSchema.optional(),
37764
38345
  layout: eventLayoutSchema.optional(),
37765
38346
  columns: columnOptionSchema.optional(),
@@ -37800,7 +38381,6 @@ const eventListingDisplaySchema = z.object({
37800
38381
  });
37801
38382
  const eventListingHydrationSchema = z.object({
37802
38383
  siteId: z.string(),
37803
- stage: previewStageSchema.optional(),
37804
38384
  eventsPerPage: eventPageSizeSchema,
37805
38385
  paginationAction: eventListPaginationActionSchema,
37806
38386
  showFilters: z.boolean(),
@@ -37823,6 +38403,7 @@ const eventListingRenderSchema = z.object({
37823
38403
  z.object({
37824
38404
  siteId: z.string(),
37825
38405
  apiBaseUrl: z.string().optional(),
38406
+ readAuthority: browserReadAuthoritySchema.optional(),
37826
38407
  stage: previewStageSchema.optional()
37827
38408
  });
37828
38409
  const eventListingBlockRuntime = defineProgressiveBlockRuntime({
@@ -37857,7 +38438,6 @@ const eventListingBlockRuntime = defineProgressiveBlockRuntime({
37857
38438
  },
37858
38439
  hydration: {
37859
38440
  siteId: source.siteId,
37860
- stage: source.stage,
37861
38441
  eventsPerPage: pageSize,
37862
38442
  paginationAction: resolveEventListPaginationAction({
37863
38443
  paginationMode: source.paginationMode,
@@ -38139,6 +38719,7 @@ const eventListingBlockDefinition = {
38139
38719
  rootType: "stack",
38140
38720
  rootProps: { gap: "lg" },
38141
38721
  children: [...eventSectionHeaderLayoutNodes(), el("event-listing", withApiBindings({
38722
+ readAuthority: { $bind: { from: "$root.readAuthority" } },
38142
38723
  events: { $bind: { from: "data.events" } },
38143
38724
  stage: { $bind: {
38144
38725
  from: "$root.previewStage",
@@ -38336,6 +38917,7 @@ const eventCalendarRenderSchema = z.object({
38336
38917
  z.object({
38337
38918
  siteId: z.string(),
38338
38919
  apiBaseUrl: z.string().optional(),
38920
+ readAuthority: browserReadAuthoritySchema.optional(),
38339
38921
  stage: previewStageSchema.optional()
38340
38922
  });
38341
38923
  /**
@@ -38357,7 +38939,7 @@ function buildEventCalendarDisplay(source) {
38357
38939
  listColumns: source.listColumns ?? source.columns
38358
38940
  }),
38359
38941
  kind: "event-calendar",
38360
- displayMode: normalizeEventCalendarDisplayMode$1(source) ?? "combined",
38942
+ displayMode: resolveEventCalendarReadPlan(source).mode,
38361
38943
  className: source.className ?? null,
38362
38944
  events: (source.events ?? []).slice().sort((left, right) => new Date(left.startsAt).getTime() - new Date(right.startsAt).getTime()),
38363
38945
  boardTitle: normalizeOptionalText(source.boardTitle),
@@ -38374,13 +38956,16 @@ const eventCalendarBlockRuntime = defineProgressiveBlockRuntime({
38374
38956
  source: createZodCodec(eventCalendarSourceSchema),
38375
38957
  render: createZodCodec(eventCalendarRenderSchema)
38376
38958
  },
38377
- buildRender: (source) => ({
38378
- display: buildEventCalendarDisplay(source.calendarWindow && (source.variant ?? source.displayMode ?? "combined") !== "combined" && (source.variant ?? source.displayMode) !== "list" ? {
38379
- ...source,
38380
- events: source.calendarWindow.events
38381
- } : source),
38382
- hydration: buildEventCollectionHydration(source)
38383
- })
38959
+ buildRender: (source) => {
38960
+ const plan = resolveEventCalendarReadPlan(source);
38961
+ return {
38962
+ display: buildEventCalendarDisplay(source.calendarWindow && plan.jobs === "calendar" ? {
38963
+ ...source,
38964
+ events: source.calendarWindow.events
38965
+ } : source),
38966
+ hydration: buildEventCollectionHydration(source)
38967
+ };
38968
+ }
38384
38969
  });
38385
38970
  //#endregion
38386
38971
  //#region ../blocks/src/system/blocks/events/eventCalendarDataLoaders.ts
@@ -38530,6 +39115,7 @@ const eventCalendarLayout = [styledSection({
38530
39115
  rootType: "stack",
38531
39116
  rootProps: { gap: "lg" },
38532
39117
  children: [...eventSectionHeaderLayoutNodes({ splitClassName: "event-section-head event-section-head--split" }), el("event-calendar", withApiBindings({
39118
+ readAuthority: { $bind: { from: "$root.readAuthority" } },
38533
39119
  events: { $bind: { from: "data.events" } },
38534
39120
  calendarWindow: { $bind: { from: "data.calendarWindow" } },
38535
39121
  stage: { $bind: {
@@ -42317,6 +42903,7 @@ const shopSourceSchema = z.object({
42317
42903
  products: z.array(publicProductSchema).nullable().optional(),
42318
42904
  siteId: z.string().optional(),
42319
42905
  apiBaseUrl: z.string().optional(),
42906
+ readAuthority: browserReadAuthoritySchema.optional(),
42320
42907
  stage: previewStageSchema.optional()
42321
42908
  });
42322
42909
  const productVariantOptionDisplaySchema = z.object({
@@ -42484,6 +43071,7 @@ function resolveShowPricePerCredit(source) {
42484
43071
  z.object({
42485
43072
  siteId: z.string().optional(),
42486
43073
  apiBaseUrl: z.string().optional(),
43074
+ readAuthority: browserReadAuthoritySchema.optional(),
42487
43075
  stage: previewStageSchema.optional()
42488
43076
  });
42489
43077
  const shopBlockRuntime = defineProgressiveBlockRuntime({
@@ -42824,6 +43412,7 @@ const shopBlockDefinition = {
42824
43412
  baseClass: "",
42825
43413
  spacing: "spacious",
42826
43414
  children: sectionContainer([shop(withApiBindings({
43415
+ readAuthority: { $bind: { from: "$root.readAuthority" } },
42827
43416
  mode: "passes-memberships",
42828
43417
  showPasses: { $bind: {
42829
43418
  from: "content.showPasses",
@@ -43022,6 +43611,7 @@ const productListBlockDefinition = {
43022
43611
  baseClass: "",
43023
43612
  spacing: "spacious",
43024
43613
  children: sectionContainer([productList(withApiBindings({
43614
+ readAuthority: { $bind: { from: "$root.readAuthority" } },
43025
43615
  mode: "product-list",
43026
43616
  heading: { $bind: {
43027
43617
  from: "content.heading",
@@ -43164,6 +43754,7 @@ const productDetailBlockDefinition = {
43164
43754
  baseClass: "",
43165
43755
  spacing: "spacious",
43166
43756
  children: sectionContainer([productDetail(withApiBindings({
43757
+ readAuthority: { $bind: { from: "$root.readAuthority" } },
43167
43758
  mode: "product-detail",
43168
43759
  heading: { $bind: {
43169
43760
  from: "content.heading",
@@ -43280,6 +43871,7 @@ const cartBlockDefinition = {
43280
43871
  baseClass: "",
43281
43872
  spacing: "spacious",
43282
43873
  children: sectionContainer([cart(withApiBindings({
43874
+ readAuthority: { $bind: { from: "$root.readAuthority" } },
43283
43875
  mode: "cart",
43284
43876
  heading: { $bind: {
43285
43877
  from: "content.heading",
@@ -43363,6 +43955,7 @@ const checkoutBlockDefinition = {
43363
43955
  baseClass: "",
43364
43956
  spacing: "spacious",
43365
43957
  children: sectionContainer([checkout(withApiBindings({
43958
+ readAuthority: { $bind: { from: "$root.readAuthority" } },
43366
43959
  mode: "checkout",
43367
43960
  heading: { $bind: {
43368
43961
  from: "content.heading",
@@ -46035,8 +46628,8 @@ const defaultTransforms = createTransformRegistry([
46035
46628
  summary: "Choose the read projection required by the calendar display mode",
46036
46629
  schema: z.object({ job: z.enum(["list", "calendar"]) }),
46037
46630
  run(value, options) {
46038
- const mode = normalizeEventCalendarDisplayMode$1(asPartialObject(value) ?? {}) ?? "combined";
46039
- return options.job === "calendar" ? mode !== "list" : mode === "list" || mode === "combined";
46631
+ const plan = resolveEventCalendarReadPlan(asPartialObject(value) ?? {});
46632
+ return plan.jobs === "both" || plan.jobs === options.job;
46040
46633
  }
46041
46634
  },
46042
46635
  {
@@ -46049,6 +46642,7 @@ const defaultTransforms = createTransformRegistry([
46049
46642
  },
46050
46643
  ...formattingTransforms,
46051
46644
  ...layoutTransforms,
46645
+ ...chromeLogoTransforms,
46052
46646
  ...uiTransforms,
46053
46647
  ...mediaTransforms,
46054
46648
  ...backgroundTransforms,
@@ -46381,6 +46975,17 @@ function coerceToString(value) {
46381
46975
  return "";
46382
46976
  }
46383
46977
  /**
46978
+ * The appointment-services catalogue (issue 1403) pairs the services with the
46979
+ * site's ordered categories. Both are needed to group them, so that response
46980
+ * is passed through whole; any other `{ services }` wrapper is unwrapped.
46981
+ */
46982
+ function coerceServicesPayload(record) {
46983
+ return Array.isArray(record.services) && Array.isArray(record.categories) ? {
46984
+ services: record.services,
46985
+ categories: record.categories
46986
+ } : record.services;
46987
+ }
46988
+ /**
46384
46989
  * Extract data from API response.
46385
46990
  * Unwraps common response wrappers: { data }, { form }, { entries }, { services }, { teamMembers }
46386
46991
  *
@@ -46395,7 +47000,7 @@ function coercePayload(payload) {
46395
47000
  if ("data" in record && typeof record.data !== "function") return record.data;
46396
47001
  if ("form" in record && typeof record.form !== "function") return record.form;
46397
47002
  if ("entries" in record && typeof record.entries !== "function") return record.entries;
46398
- if ("services" in record && typeof record.services !== "function") return record.services;
47003
+ if ("services" in record && typeof record.services !== "function") return coerceServicesPayload(record);
46399
47004
  if ("teamMembers" in record && typeof record.teamMembers !== "function") return record.teamMembers;
46400
47005
  }
46401
47006
  return payload;
@@ -47237,20 +47842,24 @@ function createPublicAppointmentReadOperations(deps) {
47237
47842
  //#region src/client/publicEventReadOperations.ts
47238
47843
  function createPublicEventReadOperations(deps) {
47239
47844
  async function resolveEventSubroute(params, kind) {
47240
- const { siteId, subject, segment, signal } = params;
47845
+ const { siteId, subject, segment, signal, preview = false } = params;
47241
47846
  if (!siteId || !segment) throw new Error(`${kind === "event-run" ? "resolveEventRun" : "resolveEventOccurrence"}() requires siteId, subject, and segment`);
47242
47847
  const subjectId = subject.kind === "eventOffering" ? subject.eventOfferingId : subject.eventSeriesId;
47243
- return deps.resilientFetchData("resolveEventSubroute", `${kind}:${siteId}:${subject.kind}:${subjectId}:${segment}`, (requestSignal) => deps.apiClient({
47848
+ return deps.resilientFetchData("resolveEventSubroute", `${kind}:${siteId}:${subject.kind}:${subjectId}:${segment}:${preview ? "preview" : "published"}`, (requestSignal) => deps.apiClient({
47244
47849
  endpoint: "resolveEventSubroute",
47245
47850
  params: {
47246
47851
  siteId,
47247
47852
  kind,
47248
47853
  subjectKind: subject.kind,
47249
47854
  subjectId,
47250
- segment
47855
+ segment,
47856
+ stage: preview ? "preview" : "published"
47251
47857
  },
47252
47858
  options: { signal: requestSignal }
47253
- }), { signal });
47859
+ }), {
47860
+ signal,
47861
+ preview
47862
+ });
47254
47863
  }
47255
47864
  return {
47256
47865
  async listPublicEventCalendarWindow({ signal, ...params }) {
@@ -47925,7 +48534,7 @@ function createRiverbankClientWithDeps(deps, config) {
47925
48534
  const result = await reader({
47926
48535
  cacheKey: plan.cacheKey,
47927
48536
  endpoint: plan.endpoint,
47928
- payloadSchemaVersion: 1
48537
+ payloadSchemaVersion: 2
47929
48538
  });
47930
48539
  if (result.kind === "miss") return {
47931
48540
  kind: "miss",
@@ -47974,7 +48583,7 @@ function createRiverbankClientWithDeps(deps, config) {
47974
48583
  siteId: plan.siteId ?? getRuntimePayloadSiteId(payload),
47975
48584
  freshTtlSec: plan.freshTtlSec,
47976
48585
  staleTtlSec: plan.staleTtlSec,
47977
- payloadSchemaVersion: 1,
48586
+ payloadSchemaVersion: 2,
47978
48587
  writeReason: "live_success"
47979
48588
  });
47980
48589
  } catch {}
@@ -49729,7 +50338,12 @@ const appointmentSetupServiceDraftSchema = z.object({
49729
50338
  venue: appointmentSetupVenueChoiceSchema,
49730
50339
  timezone: z.string().trim().min(1).nullable(),
49731
50340
  payment: appointmentSetupPaymentDraftSchema,
49732
- assignment: appointmentSetupServiceAssignmentDraftSchema
50341
+ assignment: appointmentSetupServiceAssignmentDraftSchema,
50342
+ /**
50343
+ * The service's category, or null for "Other" (issue 1403). Omitted leaves
50344
+ * an existing service's category alone and puts a new one in "Other".
50345
+ */
50346
+ categoryId: z.string().uuid().nullable().optional()
49733
50347
  }).superRefine((service, ctx) => {
49734
50348
  if (service.payment.kind !== "free" && (service.priceAmount === null || service.priceAmount <= 0)) ctx.addIssue({
49735
50349
  code: "custom",
@@ -50715,7 +51329,7 @@ async function loadPageWithDeps(deps, params) {
50715
51329
  });
50716
51330
  return {
50717
51331
  page: pageOutline,
50718
- runtimeBoundaries: pageData.runtimeBoundaries,
51332
+ runtimeJoins: pageData.runtimeJoins,
50719
51333
  theme: requireSdkTheme(support.theme, siteId),
50720
51334
  sdkConfig: support.sdkConfig,
50721
51335
  siteId,
@@ -51498,7 +52112,7 @@ async function loadContentFromContentResponseWithDeps(deps, params) {
51498
52112
  ogImageId: pageRecord.ogImageId ?? null
51499
52113
  },
51500
52114
  page: pageOutline,
51501
- runtimeBoundaries: pageData.runtimeBoundaries,
52115
+ runtimeJoins: pageData.runtimeJoins,
51502
52116
  theme: support.theme,
51503
52117
  siteId,
51504
52118
  ...support.customBlocks ? { customBlocks: support.customBlocks } : {},