@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
@@ -54,6 +54,75 @@ const footerModeSchema = z.enum([
54
54
  "none"
55
55
  ]);
56
56
  //#endregion
57
+ //#region ../api/src/defineEndpointDefinitions.ts
58
+ /**
59
+ * Validates extracted endpoint descriptors while preserving each literal path,
60
+ * method, and parameter contract for the typed URL builders.
61
+ */
62
+ function defineEndpointDefinitions(definitions) {
63
+ return definitions;
64
+ }
65
+ //#endregion
66
+ //#region ../api/src/publicNewsletterEndpointDefinitions.ts
67
+ const PUBLIC_NEWSLETTER_ENDPOINT_DEFINITIONS = defineEndpointDefinitions({
68
+ subscribeNewsletter: {
69
+ path: "/public/sites/{siteId}/newsletter/subscribe",
70
+ method: "POST",
71
+ tags: ["public-newsletter-{siteId}"],
72
+ auth: "public",
73
+ responseKind: "json"
74
+ },
75
+ confirmNewsletter: {
76
+ path: "/public/sites/{siteId}/newsletter/confirm/{token}",
77
+ method: "GET",
78
+ tags: ["public-newsletter-{siteId}"],
79
+ auth: "public",
80
+ responseKind: "text"
81
+ },
82
+ unsubscribeNewsletter: {
83
+ path: "/public/sites/{siteId}/newsletter/unsubscribe/{token}",
84
+ method: "GET",
85
+ tags: ["public-newsletter-{siteId}"],
86
+ auth: "public",
87
+ responseKind: "text"
88
+ },
89
+ unsubscribeNewsletterPost: {
90
+ path: "/public/sites/{siteId}/newsletter/unsubscribe/{token}",
91
+ method: "POST",
92
+ tags: ["public-newsletter-{siteId}"],
93
+ auth: "public",
94
+ responseKind: "text"
95
+ },
96
+ confirmNewsletterPost: {
97
+ path: "/public/sites/{siteId}/newsletter/confirm/{token}",
98
+ method: "POST",
99
+ tags: ["public-newsletter-{siteId}"],
100
+ auth: "public",
101
+ responseKind: "text"
102
+ },
103
+ getNewsletterPreferences: {
104
+ path: "/public/sites/{siteId}/newsletter/preferences/{token}",
105
+ method: "GET",
106
+ tags: ["public-newsletter-{siteId}"],
107
+ auth: "public",
108
+ responseKind: "text"
109
+ },
110
+ saveNewsletterPreferences: {
111
+ path: "/public/sites/{siteId}/newsletter/preferences/{token}",
112
+ method: "POST",
113
+ tags: ["public-newsletter-{siteId}"],
114
+ auth: "public",
115
+ responseKind: "text"
116
+ },
117
+ getNewsletterArchive: {
118
+ path: "/public/sites/{siteId}/newsletter/archive/{token}",
119
+ method: "GET",
120
+ tags: ["public-newsletter-{siteId}"],
121
+ auth: "public",
122
+ responseKind: "text"
123
+ }
124
+ });
125
+ //#endregion
57
126
  //#region ../api/src/apiEndpointTypes.ts
58
127
  function allowedDemoMutationPolicy() {
59
128
  return {
@@ -145,17 +214,85 @@ const SDK_ENTRY_READ_ENDPOINTS = {
145
214
  }
146
215
  };
147
216
  //#endregion
148
- //#region ../api/src/defineEndpointDefinitions.ts
149
- /**
150
- * Validates extracted endpoint descriptors while preserving each literal path,
151
- * method, and parameter contract for the typed URL builders.
152
- */
153
- function defineEndpointDefinitions(definitions) {
154
- return definitions;
155
- }
156
- //#endregion
157
217
  //#region ../api/src/appointmentEndpointDefinitions.ts
158
218
  const APPOINTMENT_ENDPOINT_DEFINITIONS = defineEndpointDefinitions({
219
+ ...defineEndpointDefinitions({
220
+ listGroupedAppointmentServices: {
221
+ path: "/sites/{siteId}/bookings/services/grouped",
222
+ method: "GET",
223
+ auth: "user",
224
+ responseKind: "json",
225
+ errors: ["server:internal_error"]
226
+ },
227
+ reorderAppointmentServices: {
228
+ path: "/sites/{siteId}/bookings/services/order",
229
+ method: "PUT",
230
+ auth: "user",
231
+ responseKind: "json",
232
+ errors: [
233
+ "validation:invalid_input",
234
+ "auth:forbidden",
235
+ "resource:not_found",
236
+ "resource:conflict",
237
+ "server:internal_error"
238
+ ]
239
+ },
240
+ listAppointmentServiceCategories: {
241
+ path: "/sites/{siteId}/bookings/service-categories",
242
+ method: "GET",
243
+ auth: "user",
244
+ responseKind: "json",
245
+ errors: ["server:internal_error"]
246
+ },
247
+ createAppointmentServiceCategory: {
248
+ path: "/sites/{siteId}/bookings/service-categories",
249
+ method: "POST",
250
+ auth: "user",
251
+ responseKind: "json",
252
+ errors: [
253
+ "validation:invalid_input",
254
+ "auth:forbidden",
255
+ "resource:conflict",
256
+ "server:internal_error"
257
+ ]
258
+ },
259
+ updateAppointmentServiceCategory: {
260
+ path: "/sites/{siteId}/bookings/service-categories/{categoryId}",
261
+ method: "PUT",
262
+ auth: "user",
263
+ responseKind: "json",
264
+ errors: [
265
+ "validation:invalid_input",
266
+ "auth:forbidden",
267
+ "resource:not_found",
268
+ "resource:conflict",
269
+ "server:internal_error"
270
+ ]
271
+ },
272
+ deleteAppointmentServiceCategory: {
273
+ path: "/sites/{siteId}/bookings/service-categories/{categoryId}",
274
+ method: "DELETE",
275
+ auth: "user",
276
+ responseKind: "json",
277
+ errors: [
278
+ "auth:forbidden",
279
+ "resource:not_found",
280
+ "server:internal_error"
281
+ ]
282
+ },
283
+ reorderAppointmentServiceCategories: {
284
+ path: "/sites/{siteId}/bookings/service-categories/order",
285
+ method: "PUT",
286
+ auth: "user",
287
+ responseKind: "json",
288
+ errors: [
289
+ "validation:invalid_input",
290
+ "auth:forbidden",
291
+ "resource:conflict",
292
+ "server:internal_error"
293
+ ]
294
+ }
295
+ }),
159
296
  listAppointmentResources: {
160
297
  path: "/sites/{siteId}/bookings/resources",
161
298
  method: "GET",
@@ -1303,39 +1440,6 @@ const NEWSLETTER_ENDPOINT_DEFINITIONS = defineEndpointDefinitions({
1303
1440
  auth: "user",
1304
1441
  responseKind: "json",
1305
1442
  demoMutation: DEMO_MUTATION_BLOCKED_HIDDEN
1306
- },
1307
- listNewsletterSendJobs: {
1308
- path: "/sites/{siteId}/newsletter/jobs",
1309
- method: "GET",
1310
- tags: [TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter],
1311
- auth: "user",
1312
- responseKind: "json"
1313
- },
1314
- retryNewsletterSendJob: {
1315
- path: "/sites/{siteId}/newsletter/jobs/{jobId}/retry",
1316
- method: "POST",
1317
- errors: [
1318
- "validation:invalid_input",
1319
- "resource:not_found",
1320
- "auth:forbidden",
1321
- "server:internal_error"
1322
- ],
1323
- tags: [TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter],
1324
- auth: "user",
1325
- responseKind: "json"
1326
- },
1327
- cancelNewsletterSendJob: {
1328
- path: "/sites/{siteId}/newsletter/jobs/{jobId}/cancel",
1329
- method: "POST",
1330
- errors: [
1331
- "validation:invalid_input",
1332
- "resource:not_found",
1333
- "auth:forbidden",
1334
- "server:internal_error"
1335
- ],
1336
- tags: [TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter],
1337
- auth: "user",
1338
- responseKind: "json"
1339
1443
  }
1340
1444
  });
1341
1445
  //#endregion
@@ -3443,6 +3547,7 @@ const BILLING_ENDPOINT_DEFINITIONS = defineEndpointDefinitions({
3443
3547
  }
3444
3548
  });
3445
3549
  ({
3550
+ ...PUBLIC_NEWSLETTER_ENDPOINT_DEFINITIONS,
3446
3551
  ...ACCOUNT_ENDPOINT_DEFINITIONS,
3447
3552
  ...PUBLIC_ONBOARDING_ATTEMPT_ENDPOINT_DEFINITIONS,
3448
3553
  ...PUBLIC_EVENT_ENDPOINT_DEFINITIONS,
@@ -3682,6 +3787,8 @@ z.discriminatedUnion("kind", navigationLinkInputSchemaOptions);
3682
3787
  //#endregion
3683
3788
  //#region ../theme-core/src/palette/utils/colorConversion.ts
3684
3789
  const clamp01 = (x) => Math.max(0, Math.min(1, x));
3790
+ const mod = (a, n) => (a % n + n) % n;
3791
+ const deg = (x) => mod(x, 360);
3685
3792
  function hexToRgb(hex) {
3686
3793
  const h = hex.replace(/^#/, "");
3687
3794
  const m = h.length === 3 ? h.split("").map((c) => c + c).join("") : h;
@@ -3704,6 +3811,45 @@ function srgbToLinear(u) {
3704
3811
  function linearToSrgb(x) {
3705
3812
  return clamp01(x <= .0031308 ? 12.92 * x : 1.055 * Math.pow(x, 1 / 2.4) - .055) * 255;
3706
3813
  }
3814
+ function rgbToHsl(r, g, b) {
3815
+ const R = r / 255, G = g / 255, B = b / 255;
3816
+ const max = Math.max(R, G, B), min = Math.min(R, G, B);
3817
+ const d = max - min;
3818
+ let h = 0;
3819
+ if (d !== 0) {
3820
+ switch (max) {
3821
+ case R:
3822
+ h = (G - B) / d + (G < B ? 6 : 0);
3823
+ break;
3824
+ case G:
3825
+ h = (B - R) / d + 2;
3826
+ break;
3827
+ case B:
3828
+ h = (R - G) / d + 4;
3829
+ break;
3830
+ }
3831
+ h *= 60;
3832
+ }
3833
+ const l = (max + min) / 2;
3834
+ const s = d === 0 ? 0 : d / (1 - Math.abs(2 * l - 1));
3835
+ return {
3836
+ h,
3837
+ s,
3838
+ l
3839
+ };
3840
+ }
3841
+ function srgbToOklab(r, g, b) {
3842
+ const R = srgbToLinear(r), G = srgbToLinear(g), B = srgbToLinear(b);
3843
+ const l = .4122214708 * R + .5363325363 * G + .0514459929 * B;
3844
+ const m = .2119034982 * R + .6806995451 * G + .1073969566 * B;
3845
+ const s = .0883024619 * R + .2817188376 * G + .6299787005 * B;
3846
+ const l_ = Math.cbrt(l), m_ = Math.cbrt(m), s_ = Math.cbrt(s);
3847
+ return {
3848
+ L: .2104542553 * l_ + .793617785 * m_ - .0040720468 * s_,
3849
+ a: 1.9779984951 * l_ - 2.428592205 * m_ + .4505937099 * s_,
3850
+ b: .0259040371 * l_ + .7827717662 * m_ - .808675766 * s_
3851
+ };
3852
+ }
3707
3853
  function oklabToSrgb(L, a, b) {
3708
3854
  const l_ = Math.pow(L + .3963377774 * a + .2158037573 * b, 3);
3709
3855
  const m_ = Math.pow(L - .1055613458 * a - .0638541728 * b, 3);
@@ -3717,6 +3863,14 @@ function oklabToSrgb(L, a, b) {
3717
3863
  b: linearToSrgb(B)
3718
3864
  };
3719
3865
  }
3866
+ function oklabToOklch(L, a, b) {
3867
+ const C = Math.sqrt(a * a + b * b);
3868
+ return {
3869
+ L,
3870
+ C,
3871
+ h: C < 1e-7 ? 0 : deg(Math.atan2(b, a) * 180 / Math.PI)
3872
+ };
3873
+ }
3720
3874
  function oklchToOklab(L, C, h) {
3721
3875
  const hr = h * Math.PI / 180;
3722
3876
  return {
@@ -3725,6 +3879,27 @@ function oklchToOklab(L, C, h) {
3725
3879
  b: C * Math.sin(hr)
3726
3880
  };
3727
3881
  }
3882
+ function featuresFromHex(hex) {
3883
+ const { r, g, b } = hexToRgb(hex);
3884
+ const { h, s, l } = rgbToHsl(r, g, b);
3885
+ const { L, a, b: b2 } = srgbToOklab(r, g, b);
3886
+ const { L: okL, C: okC, h: okH } = oklabToOklch(L, a, b2);
3887
+ return {
3888
+ r,
3889
+ g,
3890
+ b,
3891
+ h,
3892
+ s,
3893
+ l,
3894
+ v: Math.max(r, g, b) / 255,
3895
+ Y: .2126 * srgbToLinear(r) + .7152 * srgbToLinear(g) + .0722 * srgbToLinear(b),
3896
+ chroma: s,
3897
+ okL,
3898
+ okC,
3899
+ okH,
3900
+ hex
3901
+ };
3902
+ }
3728
3903
  function relativeLuminance(r, g, b) {
3729
3904
  const R = srgbToLinear(r), G = srgbToLinear(g), B = srgbToLinear(b);
3730
3905
  return .2126 * R + .7152 * G + .0722 * B;
@@ -6808,6 +6983,36 @@ function normalizedReference(value) {
6808
6983
  return normalized.length > 0 ? normalized : null;
6809
6984
  }
6810
6985
  //#endregion
6986
+ //#region ../theme-core/src/surfaces/logoVariant.ts
6987
+ /** Concrete hex behind a plain, opaque palette token, or null otherwise. */
6988
+ function opaquePaletteHexForToken(expandedPalette, token) {
6989
+ if (!token) return null;
6990
+ const parts = parseColorTokenParts(token);
6991
+ if (parts.kind !== "token" || parts.opacityPercent !== null) return null;
6992
+ return expandedPalette[parts.token] ?? null;
6993
+ }
6994
+ /**
6995
+ * Tone of the surface a foreground token was resolved for.
6996
+ *
6997
+ * A token with opacity has no known underlay to composite against, and a raw
6998
+ * or unrecognised token has no palette hex, so both are `unknown` rather than
6999
+ * a guess.
7000
+ */
7001
+ function surfaceToneFromForegroundToken(expandedPalette, foregroundToken) {
7002
+ const hex = opaquePaletteHexForToken(expandedPalette, foregroundToken);
7003
+ if (!hex) return "unknown";
7004
+ return featuresFromHex(hex).Y >= .5 ? "dark" : "light";
7005
+ }
7006
+ /**
7007
+ * The logo to draw on a surface of the given tone. A missing variant falls
7008
+ * back to the other one, and an unknown tone uses the light-backgrounds logo,
7009
+ * which is what every site rendered before variants existed.
7010
+ */
7011
+ function selectLogoVariant(tone, variants) {
7012
+ const { forLightBackgrounds, forDarkBackgrounds } = variants;
7013
+ return tone === "dark" ? forDarkBackgrounds ?? forLightBackgrounds : forLightBackgrounds ?? forDarkBackgrounds;
7014
+ }
7015
+ //#endregion
6811
7016
  //#region ../theme-core/src/utils/colorStyles.ts
6812
7017
  const COLOR_VAR_PREFIX = "--tb-";
6813
7018
  function parseToken(source) {
@@ -6859,16 +7064,28 @@ function backgroundColorStyle(token) {
6859
7064
  return { backgroundColor: rgbColorValue(token) };
6860
7065
  }
6861
7066
  /**
7067
+ * Converts a text color token to a CSS color value that follows the enclosing
7068
+ * surface. The semantic text tokens (`text`, `heading`, `mutedText`) resolve
7069
+ * to the surface foreground variables, so text adapts when a section's
7070
+ * background changes; any other token is a fixed theme color.
7071
+ *
7072
+ * @param token - Theme color token
7073
+ * @returns CSS color value
7074
+ */
7075
+ function textColorValue(token) {
7076
+ const parsed = parseToken(token);
7077
+ const surfaceRole = parsed.raw ? null : surfaceRoleForTextToken(parsed.token);
7078
+ if (!surfaceRole) return rgbColorValue(token);
7079
+ return parsed.opacityPercent === void 0 ? surfaceForegroundValue(surfaceRole) : surfaceForegroundValueWithOpacity(surfaceRole, parsed.opacityPercent);
7080
+ }
7081
+ /**
6862
7082
  * Creates a text color style object from a theme token.
6863
7083
  *
6864
7084
  * @param token - Theme color token
6865
7085
  * @returns CSSProperties with color
6866
7086
  */
6867
7087
  function textColorStyle(token) {
6868
- const parsed = parseToken(token);
6869
- const surfaceRole = parsed.raw ? null : surfaceRoleForTextToken(parsed.token);
6870
- if (surfaceRole) return { color: parsed.opacityPercent === void 0 ? surfaceForegroundValue(surfaceRole) : surfaceForegroundValueWithOpacity(surfaceRole, parsed.opacityPercent) };
6871
- return { color: rgbColorValue(token) };
7088
+ return { color: textColorValue(token) };
6872
7089
  }
6873
7090
  /**
6874
7091
  * Creates a border color style object from a theme token.
@@ -10053,6 +10270,15 @@ function asSiteStyleId(value) {
10053
10270
  function asDesignSystemTemplateId(value) {
10054
10271
  return brandNonEmptyString(value, "DesignSystemTemplateId");
10055
10272
  }
10273
+ function toNonEmptyReadonlyArray(values) {
10274
+ const [first, ...rest] = values;
10275
+ return first === void 0 ? null : [first, ...rest];
10276
+ }
10277
+ function requireNonEmptyReadonlyArray(values, message = "Expected a non-empty array.") {
10278
+ const result = toNonEmptyReadonlyArray(values);
10279
+ if (!result) throw new Error(message);
10280
+ return result;
10281
+ }
10056
10282
  function makeBoundaryId(previousBlockId, nextBlockId) {
10057
10283
  return asDesignBoundaryId(`boundary:${encodeURIComponent(previousBlockId)}:${encodeURIComponent(nextBlockId)}`);
10058
10284
  }
@@ -10255,16 +10481,18 @@ const themeV2RuntimeStyleFieldNames = [
10255
10481
  "_frameStyles",
10256
10482
  "_sectionStyles",
10257
10483
  "_containerStyles",
10258
- "_cardStyles",
10259
- "_transitionStyles",
10260
- "styleGroup"
10484
+ "_cardStyles"
10261
10485
  ];
10262
10486
  const themeV2BlockSpecificRawStyleFieldNames = [
10263
10487
  "_contentCardStyles",
10264
10488
  "_heroLayoutStyles",
10265
10489
  "_textCardStyles"
10266
10490
  ];
10267
- const themeV2NormalEditorRawStyleFieldNames = [...themeV2RuntimeStyleFieldNames, ...themeV2BlockSpecificRawStyleFieldNames];
10491
+ const themeV2NormalEditorRawStyleFieldNames = [
10492
+ ...themeV2RuntimeStyleFieldNames,
10493
+ ...themeV2BlockSpecificRawStyleFieldNames,
10494
+ "styleGroup"
10495
+ ];
10268
10496
  new Set(themeV2NormalEditorRawStyleFieldNames);
10269
10497
  [...themeV2RuntimeStyleFieldNames, ...themeV2BlockSpecificRawStyleFieldNames];
10270
10498
  const pageDesignEditorBackgroundOverrideOwner = "page-design-editor";
@@ -11990,11 +12218,260 @@ function cardRoleFromLegacyVocabulary(value) {
11990
12218
  */
11991
12219
  const cardRoleWithLegacyAliasSchema = z.preprocess((value) => cardRoleFromLegacyVocabulary(value) ?? value, cardRoleSchema);
11992
12220
  //#endregion
11993
- //#region ../theme-core/src/site-styles/compilationPlan.ts
11994
- const defaultHeaderBrandPreferences = {
11995
- brandDisplay: "auto",
11996
- logoSize: "auto"
11997
- };
12221
+ //#region ../theme-core/src/site-styles/transitionCatalogue.ts
12222
+ /**
12223
+ * Family order for pickers. Entries below are listed family by family in this
12224
+ * same order, so the flat option list and the grouped families agree.
12225
+ */
12226
+ const transitionCatalogueFamilies = [
12227
+ {
12228
+ id: "gradient",
12229
+ label: "Gradient"
12230
+ },
12231
+ {
12232
+ id: "wave",
12233
+ label: "Wave"
12234
+ },
12235
+ {
12236
+ id: "angle",
12237
+ label: "Angle"
12238
+ }
12239
+ ];
12240
+ const mediumHeight = "6rem + 2px";
12241
+ const compactHeight = "4.5rem + 2px";
12242
+ const largeHeight = "7rem + 2px";
12243
+ /**
12244
+ * The single source of transition vocabulary. Order is significant: it is the
12245
+ * order of `boundaryOptions` (after `none`) and of each family's variants,
12246
+ * which persisted pins, page-flow presets and the editor picker all rely on.
12247
+ *
12248
+ * Shapes match what `generateLayoutCss` draws today. Structured
12249
+ * amplitude/frequency treatments (issue 826) extend this list later.
12250
+ */
12251
+ const transitionCatalogueEntries = defineExactCatalog()([
12252
+ {
12253
+ intent: "soft-fade-short",
12254
+ optionId: asBoundaryOptionId("break:soft"),
12255
+ family: "gradient",
12256
+ variantId: "soft",
12257
+ label: "Soft",
12258
+ variantLabel: "Soft",
12259
+ treatment: {
12260
+ kind: "soft-fade",
12261
+ height: "medium",
12262
+ curve: "soft"
12263
+ },
12264
+ size: "medium",
12265
+ heightExpression: mediumHeight,
12266
+ shape: { kind: "fade" }
12267
+ },
12268
+ {
12269
+ intent: "soft-fade-long",
12270
+ optionId: asBoundaryOptionId("break:spacious"),
12271
+ family: "gradient",
12272
+ variantId: "spacious",
12273
+ label: "Spacious",
12274
+ variantLabel: "Spacious",
12275
+ treatment: {
12276
+ kind: "soft-fade",
12277
+ height: "large",
12278
+ curve: "spacious"
12279
+ },
12280
+ size: "spacious",
12281
+ heightExpression: "10rem",
12282
+ shape: { kind: "fade" }
12283
+ },
12284
+ {
12285
+ intent: "soft-fade-expansive",
12286
+ optionId: asBoundaryOptionId("break:expansive"),
12287
+ family: "gradient",
12288
+ variantId: "expansive",
12289
+ label: "Expansive",
12290
+ variantLabel: "Expansive",
12291
+ treatment: {
12292
+ kind: "soft-fade",
12293
+ height: "expansive",
12294
+ curve: "expansive"
12295
+ },
12296
+ size: "expansive",
12297
+ heightExpression: "14rem",
12298
+ shape: { kind: "fade" }
12299
+ },
12300
+ {
12301
+ intent: "wave-edge-balanced",
12302
+ optionId: asBoundaryOptionId("break:wave-balanced"),
12303
+ family: "wave",
12304
+ variantId: "balanced",
12305
+ label: "Balanced wave",
12306
+ variantLabel: "Balanced",
12307
+ treatment: {
12308
+ kind: "wave-edge",
12309
+ height: "medium",
12310
+ amplitude: "balanced",
12311
+ rhythm: "double",
12312
+ symmetry: "symmetrical"
12313
+ },
12314
+ size: "medium",
12315
+ heightExpression: mediumHeight,
12316
+ shape: {
12317
+ kind: "wave",
12318
+ mask: "balanced"
12319
+ }
12320
+ },
12321
+ {
12322
+ intent: "wave-edge",
12323
+ optionId: asBoundaryOptionId("break:wave"),
12324
+ family: "wave",
12325
+ variantId: "classic",
12326
+ label: "Classic wave",
12327
+ variantLabel: "Classic",
12328
+ treatment: {
12329
+ kind: "wave-edge",
12330
+ height: "medium",
12331
+ amplitude: "balanced",
12332
+ rhythm: "double",
12333
+ symmetry: "asymmetrical"
12334
+ },
12335
+ size: "medium",
12336
+ heightExpression: mediumHeight,
12337
+ shape: {
12338
+ kind: "wave",
12339
+ mask: "classic"
12340
+ }
12341
+ },
12342
+ {
12343
+ intent: "wave-edge-gentle",
12344
+ optionId: asBoundaryOptionId("break:wave-gentle"),
12345
+ family: "wave",
12346
+ variantId: "gentle",
12347
+ label: "Gentle wave",
12348
+ variantLabel: "Gentle",
12349
+ treatment: {
12350
+ kind: "wave-edge",
12351
+ height: "compact",
12352
+ amplitude: "subtle",
12353
+ rhythm: "single",
12354
+ symmetry: "symmetrical"
12355
+ },
12356
+ size: "compact",
12357
+ heightExpression: compactHeight,
12358
+ shape: {
12359
+ kind: "wave",
12360
+ mask: "gentle"
12361
+ }
12362
+ },
12363
+ {
12364
+ intent: "wave-edge-bold",
12365
+ optionId: asBoundaryOptionId("break:wave-bold"),
12366
+ family: "wave",
12367
+ variantId: "bold",
12368
+ label: "Bold wave",
12369
+ variantLabel: "Bold",
12370
+ treatment: {
12371
+ kind: "wave-edge",
12372
+ height: "large",
12373
+ amplitude: "bold",
12374
+ rhythm: "double",
12375
+ symmetry: "symmetrical"
12376
+ },
12377
+ size: "large",
12378
+ heightExpression: largeHeight,
12379
+ shape: {
12380
+ kind: "wave",
12381
+ mask: "bold"
12382
+ }
12383
+ },
12384
+ {
12385
+ intent: "wave-edge-drift",
12386
+ optionId: asBoundaryOptionId("break:wave-drift"),
12387
+ family: "wave",
12388
+ variantId: "drift",
12389
+ label: "Drift wave",
12390
+ variantLabel: "Drift",
12391
+ treatment: {
12392
+ kind: "wave-edge",
12393
+ height: "medium",
12394
+ amplitude: "balanced",
12395
+ rhythm: "double",
12396
+ symmetry: "drift"
12397
+ },
12398
+ size: "medium",
12399
+ heightExpression: mediumHeight,
12400
+ shape: {
12401
+ kind: "wave",
12402
+ mask: "drift"
12403
+ }
12404
+ },
12405
+ {
12406
+ intent: "angle-edge-subtle",
12407
+ optionId: asBoundaryOptionId("break:angle-subtle"),
12408
+ family: "angle",
12409
+ variantId: "subtle",
12410
+ label: "Subtle angle",
12411
+ variantLabel: "Subtle",
12412
+ treatment: {
12413
+ kind: "angle-edge",
12414
+ height: "compact",
12415
+ slope: "subtle",
12416
+ direction: "forward"
12417
+ },
12418
+ size: "compact",
12419
+ heightExpression: compactHeight,
12420
+ shape: {
12421
+ kind: "angle",
12422
+ polygon: {
12423
+ startTopPercent: 34,
12424
+ endTopPercent: 18
12425
+ }
12426
+ }
12427
+ },
12428
+ {
12429
+ intent: "angle-edge",
12430
+ optionId: asBoundaryOptionId("break:angle-balanced"),
12431
+ family: "angle",
12432
+ variantId: "balanced",
12433
+ label: "Balanced angle",
12434
+ variantLabel: "Balanced",
12435
+ treatment: {
12436
+ kind: "angle-edge",
12437
+ height: "medium",
12438
+ slope: "balanced",
12439
+ direction: "forward"
12440
+ },
12441
+ size: "medium",
12442
+ heightExpression: mediumHeight,
12443
+ shape: {
12444
+ kind: "angle",
12445
+ polygon: {
12446
+ startTopPercent: 42,
12447
+ endTopPercent: 8
12448
+ }
12449
+ }
12450
+ },
12451
+ {
12452
+ intent: "angle-edge-steep",
12453
+ optionId: asBoundaryOptionId("break:angle-steep"),
12454
+ family: "angle",
12455
+ variantId: "steep",
12456
+ label: "Steep angle",
12457
+ variantLabel: "Steep",
12458
+ treatment: {
12459
+ kind: "angle-edge",
12460
+ height: "large",
12461
+ slope: "steep",
12462
+ direction: "forward"
12463
+ },
12464
+ size: "large",
12465
+ heightExpression: largeHeight,
12466
+ shape: {
12467
+ kind: "angle",
12468
+ polygon: {
12469
+ startTopPercent: 54,
12470
+ endTopPercent: 0
12471
+ }
12472
+ }
12473
+ }
12474
+ ]);
11998
12475
  //#endregion
11999
12476
  //#region ../theme-core/src/site-styles/sectionTransitions.ts
12000
12477
  function boundaryRuntimeMetrics(family, size, heightExpression) {
@@ -12005,42 +12482,106 @@ function boundaryRuntimeMetrics(family, size, heightExpression) {
12005
12482
  reserveCss: `calc((${heightExpression}) / 2)`
12006
12483
  };
12007
12484
  }
12008
- 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");
12485
+ new Map(transitionCatalogueEntries.map((entry) => [entry.intent, entry]));
12486
+ new Map(transitionCatalogueEntries.map((entry) => [entry.intent, boundaryRuntimeMetrics(entry.family, entry.size, entry.heightExpression)]));
12487
+ /**
12488
+ * The catalogue's compile-time coverage check guarantees an entry per
12489
+ * decorative intent, so a miss here is a broken invariant, not bad input.
12490
+ */
12491
+ function requireCatalogueValue(values, intent) {
12492
+ const value = values.get(intent);
12493
+ if (value === void 0) throw new Error(`Transition catalogue has no entry for ${intent}`);
12494
+ return value;
12495
+ }
12009
12496
  const noneBoundaryOption = {
12010
12497
  id: asBoundaryOptionId("break:none"),
12011
12498
  label: "None",
12012
12499
  transitionAfter: "none",
12013
12500
  treatment: { kind: "none" }
12014
12501
  };
12015
- const softBoundaryOption = {
12016
- id: asBoundaryOptionId("break:soft"),
12017
- label: "Soft",
12018
- transitionAfter: "soft-fade-short",
12019
- treatment: {
12020
- kind: "soft-fade",
12021
- height: "medium",
12022
- curve: "soft"
12023
- }
12502
+ const boundaryOptionByIntent = new Map(transitionCatalogueEntries.map((entry) => [entry.intent, {
12503
+ id: entry.optionId,
12504
+ label: entry.label,
12505
+ transitionAfter: entry.intent,
12506
+ treatment: entry.treatment
12507
+ }]));
12508
+ function boundaryOptionForTransitionIntent(intent) {
12509
+ return requireCatalogueValue(boundaryOptionByIntent, intent);
12510
+ }
12511
+ const softBoundaryOption = boundaryOptionForTransitionIntent("soft-fade-short");
12512
+ const spaciousBoundaryOption = boundaryOptionForTransitionIntent("soft-fade-long");
12513
+ boundaryOptionForTransitionIntent("soft-fade-expansive");
12514
+ boundaryOptionForTransitionIntent("wave-edge");
12515
+ boundaryOptionForTransitionIntent("wave-edge-balanced");
12516
+ boundaryOptionForTransitionIntent("wave-edge-gentle");
12517
+ boundaryOptionForTransitionIntent("wave-edge-bold");
12518
+ boundaryOptionForTransitionIntent("wave-edge-drift");
12519
+ boundaryOptionForTransitionIntent("angle-edge-subtle");
12520
+ boundaryOptionForTransitionIntent("angle-edge");
12521
+ boundaryOptionForTransitionIntent("angle-edge-steep");
12522
+ /**
12523
+ * Must remain non-empty; downstream code indexes `[0]` as the documented default.
12524
+ */
12525
+ const boundaryOptions = [noneBoundaryOption, ...transitionCatalogueEntries.map((entry) => boundaryOptionForTransitionIntent(entry.intent))];
12526
+ const noneTransitionVariant = {
12527
+ familyId: "none",
12528
+ variantId: "none",
12529
+ label: "None",
12530
+ boundaryOption: noneBoundaryOption
12024
12531
  };
12025
- const spaciousBoundaryOption = {
12026
- id: asBoundaryOptionId("break:spacious"),
12027
- label: "Spacious",
12028
- transitionAfter: "soft-fade-long",
12029
- treatment: {
12030
- kind: "soft-fade",
12031
- height: "large",
12032
- curve: "spacious"
12033
- }
12532
+ function transitionVariantForEntry(entry) {
12533
+ return {
12534
+ familyId: entry.family,
12535
+ variantId: entry.variantId,
12536
+ label: entry.variantLabel,
12537
+ boundaryOption: boundaryOptionForTransitionIntent(entry.intent)
12538
+ };
12539
+ }
12540
+ const sectionTransitionFamilies = [{
12541
+ id: "none",
12542
+ label: "None",
12543
+ variants: [noneTransitionVariant]
12544
+ }, ...transitionCatalogueFamilies.map((family) => ({
12545
+ id: family.id,
12546
+ label: family.label,
12547
+ variants: requireNonEmptyReadonlyArray(transitionCatalogueEntries.filter((entry) => entry.family === family.id).map(transitionVariantForEntry), `Transition family ${family.id} has no catalogue entries.`)
12548
+ }))];
12549
+ new Map(boundaryOptions.map((option) => [option.id, option]));
12550
+ new Map(boundaryOptions.map((option) => [stableTreatmentKey(option.treatment), option]));
12551
+ new Map(sectionTransitionFamilies.flatMap((family) => family.variants.map((variant) => [variant.boundaryOption.id, variant])));
12552
+ new Map(sectionTransitionFamilies.map((family) => [family.id, family]));
12553
+ function stableTreatmentKey(treatment) {
12554
+ switch (treatment.kind) {
12555
+ case "none": return "none";
12556
+ case "soft-fade": return `${treatment.kind}:${treatment.height}:${treatment.curve}`;
12557
+ case "wave-edge": return [
12558
+ treatment.kind,
12559
+ treatment.height,
12560
+ treatment.amplitude,
12561
+ treatment.rhythm,
12562
+ treatment.symmetry
12563
+ ].join(":");
12564
+ case "angle-edge": return [
12565
+ treatment.kind,
12566
+ treatment.height,
12567
+ treatment.slope,
12568
+ treatment.direction
12569
+ ].join(":");
12570
+ case "legacy-unsupported": return `${treatment.kind}:${treatment.boundaryOptionId}`;
12571
+ }
12572
+ }
12573
+ requireThemeColorToken$1("background");
12574
+ function requireThemeColorToken$1(value) {
12575
+ const token = parseThemeColorToken(value);
12576
+ if (!token) throw new Error(`Expected a theme color token. Received: ${value}`);
12577
+ return token;
12578
+ }
12579
+ //#endregion
12580
+ //#region ../theme-core/src/site-styles/compilationPlan.ts
12581
+ const defaultHeaderBrandPreferences = {
12582
+ brandDisplay: "auto",
12583
+ logoSize: "auto"
12034
12584
  };
12035
- asBoundaryOptionId("break:expansive");
12036
- asBoundaryOptionId("break:wave");
12037
- asBoundaryOptionId("break:wave-balanced");
12038
- asBoundaryOptionId("break:wave-gentle");
12039
- asBoundaryOptionId("break:wave-bold");
12040
- asBoundaryOptionId("break:wave-drift");
12041
- asBoundaryOptionId("break:angle-subtle");
12042
- asBoundaryOptionId("break:angle-balanced");
12043
- asBoundaryOptionId("break:angle-steep");
12044
12585
  asBoundaryOptionId("break:unknown");
12045
12586
  const pageDesignUserPinnedAppearanceChoiceSchema = z.object({
12046
12587
  kind: z.literal("user-pinned"),
@@ -12167,14 +12708,11 @@ function validateUniquePageDesignPins(intent, ctx) {
12167
12708
  label: "block Look pin"
12168
12709
  });
12169
12710
  addDuplicateStringIssues(ctx, {
12170
- values: intent.boundaryPins.map((pin) => boundaryKey(pin.previousBlockId, pin.nextBlockId)),
12711
+ values: intent.boundaryPins.map((pin) => makeBoundaryId(pin.previousBlockId, pin.nextBlockId)),
12171
12712
  path: ["boundaryPins"],
12172
12713
  label: "boundary pin"
12173
12714
  });
12174
12715
  }
12175
- function boundaryKey(previousBlockId, nextBlockId) {
12176
- return makeBoundaryId(previousBlockId, nextBlockId);
12177
- }
12178
12716
  //#endregion
12179
12717
  //#region ../theme-core/src/accordions/siteStyleDefaults.ts
12180
12718
  /**
@@ -13802,6 +14340,13 @@ z.object({
13802
14340
  fields: nonEmptyRuntimeStyleFieldNamesSchema,
13803
14341
  authority: styleAuthoritySchema
13804
14342
  }).strict();
14343
+ asPageFlowPresetId("flow:quiet"), noneBoundaryOption.id, asPageFlowPresetId("flow:balanced"), softBoundaryOption.id, asPageFlowPresetId("flow:expressive"), spaciousBoundaryOption.id;
14344
+ asPageFlowPresetId("generated-default");
14345
+ asSiteStyleId("site-style:south-west-twerk-school");
14346
+ asAppearancePresetId("hero-brand-scrim-fixed-frame");
14347
+ asLayoutVariantKey("classic");
14348
+ asLayoutVariantKey("micro");
14349
+ asBoundaryOptionId("break:wave");
13805
14350
  //#endregion
13806
14351
  //#region ../theme-core/src/site-styles/runtimeCompiler.ts
13807
14352
  function defineSectionForegroundRuntimeTokens(input) {
@@ -13825,7 +14370,7 @@ function defineComponentRuntimeRules(rules) {
13825
14370
  }
13826
14371
  /**
13827
14372
  * Default design rules translate semantic page-level choices into the current
13828
- * runtime's section background and transition style-group vocabulary.
14373
+ * runtime's section background vocabulary.
13829
14374
  */
13830
14375
  const defaultDesignRuntimeRules = defineDesignRuntimeRules({
13831
14376
  sectionSurfaces: {
@@ -13860,8 +14405,7 @@ const defaultDesignRuntimeRules = defineDesignRuntimeRules({
13860
14405
  color: "surface",
13861
14406
  opacity: .88
13862
14407
  }
13863
- },
13864
- transitionClassName: (transition, fromSurface, toSurface) => transition === "none" ? null : `site-style-transition-${transition}-from-${fromSurface}-to-${toSurface}`
14408
+ }
13865
14409
  });
13866
14410
  /**
13867
14411
  * Default component rules translate frame and item-surface semantics into the
@@ -15596,19 +16140,11 @@ const curatedSiteStyles = [
15596
16140
  })
15597
16141
  ];
15598
16142
  new Map(curatedSiteStyles.map((style) => [style.id, style]));
15599
- asPageFlowPresetId("generated-default");
15600
- asSiteStyleId("site-style:south-west-twerk-school");
15601
- asAppearancePresetId("hero-brand-scrim-fixed-frame");
15602
- asLayoutVariantKey("classic");
15603
- asLayoutVariantKey("micro");
15604
- asBoundaryOptionId("break:wave");
15605
- asPageFlowPresetId("flow:quiet"), noneBoundaryOption.id, asPageFlowPresetId("flow:balanced"), softBoundaryOption.id, asPageFlowPresetId("flow:expressive"), spaciousBoundaryOption.id;
15606
16143
  //#endregion
15607
16144
  //#region ../theme-core/src/site-styles/resolver.ts
15608
16145
  const blockDesignFallback = {
15609
16146
  sectionSurface: "base",
15610
16147
  contentFrame: plainFrame,
15611
- transitionAfter: "none",
15612
16148
  sectionHeight: "default",
15613
16149
  heroLegibility: "none",
15614
16150
  imageSurfaceTreatment: { kind: "none" },
@@ -15619,7 +16155,7 @@ const blockDesignFallback = {
15619
16155
  accordionIconTreatment: null,
15620
16156
  composition: null
15621
16157
  };
15622
- blockDesignFallback.sectionSurface, blockDesignFallback.contentFrame, blockDesignFallback.transitionAfter, blockDesignFallback.sectionHeight, blockDesignFallback.heroLegibility, blockDesignFallback.imageSurfaceTreatment, blockDesignFallback.imageSurfaceMotion, blockDesignFallback.tileTreatment, blockDesignFallback.eventListTreatment, blockDesignFallback.eyebrowTreatment, blockDesignFallback.accordionIconTreatment, blockDesignFallback.composition;
16158
+ blockDesignFallback.sectionSurface, blockDesignFallback.contentFrame, blockDesignFallback.sectionHeight, blockDesignFallback.heroLegibility, blockDesignFallback.imageSurfaceTreatment, blockDesignFallback.imageSurfaceMotion, blockDesignFallback.tileTreatment, blockDesignFallback.eventListTreatment, blockDesignFallback.eyebrowTreatment, blockDesignFallback.accordionIconTreatment, blockDesignFallback.composition;
15623
16159
  //#endregion
15624
16160
  //#region ../theme-core/src/site-styles/siteChromeBackgrounds.ts
15625
16161
  const siteChromeBackgroundColorTokens = toSiteChromeBackgroundColorTokens(backgroundAppearanceColorTokenNames);
@@ -16431,7 +16967,8 @@ const siteOptionSources = [
16431
16967
  "eventCategories",
16432
16968
  "eventSeries",
16433
16969
  "venues",
16434
- "staffMembers"
16970
+ "staffMembers",
16971
+ "appointmentServiceCategories"
16435
16972
  ];
16436
16973
  const mediaDeliverySchema = z.object({
16437
16974
  sizes: z.string().optional(),
@@ -18680,9 +19217,7 @@ function navRow(opts) {
18680
19217
  rel: { $bind: { from: `${childItemName}.rel` } },
18681
19218
  "data-active": { $bind: { from: `${childItemName}.active` } }
18682
19219
  }, [text({ as: "span" }, bind(`${childItemName}.label`))], repeat(`${itemName}.children`, childItemName));
18683
- const dropdown = el("div", { className: "nav-dropdown rb-relative" }, [button({
18684
- type: "button",
18685
- variantId: "",
19220
+ const dropdown = el("div", { className: "nav-dropdown rb-relative" }, [el("headerControl", {
18686
19221
  className: prependClassName("nav-dropdown-trigger", linkClassName),
18687
19222
  "aria-haspopup": "menu",
18688
19223
  "aria-expanded": "false",
@@ -18750,9 +19285,7 @@ function navColumn(opts) {
18750
19285
  const dropdown = el("div", {
18751
19286
  className: "nav-mobile-dropdown",
18752
19287
  "data-nav-mobile-dropdown": "true"
18753
- }, [button({
18754
- type: "button",
18755
- variantId: "",
19288
+ }, [el("headerControl", {
18756
19289
  className: triggerClassName,
18757
19290
  "aria-expanded": "false",
18758
19291
  "aria-controls": childrenId,
@@ -25059,6 +25592,49 @@ const layoutTransforms = [
25059
25592
  footerLogoMediaClassTransform,
25060
25593
  footerLogoTextVisibleTransform
25061
25594
  ];
25595
+ //#endregion
25596
+ //#region ../blocks/src/system/transforms/registry/chromeLogo.ts
25597
+ const chromeLogoSchema = z.object({ surface: z.enum([
25598
+ "header-root",
25599
+ "header-mobile-panel",
25600
+ "footer-root"
25601
+ ]) });
25602
+ /** The brand foreground shares the logo's surface; navigation may own a separate capsule. */
25603
+ function chromeSurfaceTextToken(surface, theme, palette) {
25604
+ switch (surface) {
25605
+ case "header-root": {
25606
+ const header = theme.header;
25607
+ const foreground = resolveHeaderRootForeground(header, palette, resolveHeaderVisualStyles(header).isTransparent);
25608
+ return foreground.kind === "known" ? foreground.roles.text : resolveHeaderLeafTextColor(header);
25609
+ }
25610
+ case "header-mobile-panel": return theme.header?.dropdownStyle?.textColor ?? "text";
25611
+ case "footer-root": {
25612
+ const foreground = resolveFooterRootForeground(theme.footer, palette);
25613
+ return foreground.kind === "known" ? foreground.roles.text : void 0;
25614
+ }
25615
+ }
25616
+ }
25617
+ function readChromeTheme(viewModel) {
25618
+ return asPartialObject(asPartialObject(viewModel?.["$root"])?.theme) ?? {};
25619
+ }
25620
+ function resolveChromeSurfaceTone(surface, context) {
25621
+ return surfaceToneFromForegroundToken(context.theme.palette, chromeSurfaceTextToken(surface, readChromeTheme(context.viewModel), context.theme.palette));
25622
+ }
25623
+ const chromeLogoTransforms = [{
25624
+ id: "layout.chromeLogo",
25625
+ kind: "formatter",
25626
+ summary: "Select the light- or dark-background site logo for a header or footer surface",
25627
+ schema: chromeLogoSchema,
25628
+ run: (value, options, context) => {
25629
+ const content = asPartialObject(value);
25630
+ const variants = asPartialObject(content?.logoVariants);
25631
+ if (!variants) return content?.logo ?? null;
25632
+ return selectLogoVariant(resolveChromeSurfaceTone(options.surface, context), {
25633
+ forLightBackgrounds: variants.forLightBackgrounds ?? null,
25634
+ forDarkBackgrounds: variants.forDarkBackgrounds ?? null
25635
+ });
25636
+ }
25637
+ }];
25062
25638
  const headerRuntimeTransforms = [{
25063
25639
  id: "layout.headerRuntimeContract",
25064
25640
  kind: "formatter",
@@ -25266,46 +25842,42 @@ const whenTransformed = (from, transformId, equals = true) => (node) => ({
25266
25842
  equals
25267
25843
  }
25268
25844
  });
25269
- const logoRow = link({
25845
+ /** Draw whichever site logo suits the surface this row sits on. */
25846
+ const bindChromeLogo = (surface) => bind("content", { transforms: [{
25847
+ id: "layout.chromeLogo",
25848
+ options: { surface }
25849
+ }] });
25850
+ /**
25851
+ * The brand link. The logo is chosen per surface because the open mobile menu
25852
+ * paints its own background, which may be the opposite tone to the header.
25853
+ */
25854
+ const createLogoRow = (surface) => link({
25270
25855
  href: "/",
25271
25856
  className: bindProp("$root.theme.header.logo", {
25272
25857
  transforms: pipe(tx("layout.headerLogoClass")),
25273
25858
  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"
25274
25859
  })
25275
- }, [
25276
- media({ className: bindProp("$root.theme.header.logo", {
25277
- transforms: pipe(tx("layout.headerLogoMediaClass", { base: "rb-header-logo-sm rb-w-auto rb-transition-all rb-duration-300" })),
25278
- fallback: "rb-header-logo-sm rb-w-auto rb-transition-all rb-duration-300"
25279
- }) }, when("content.logo"), bind("content.logo")),
25280
- stack({ className: "rb-contents" }, [media({ className: bindProp("$root.theme.header.logo", {
25281
- transforms: pipe(tx("layout.headerLogoMediaClass", { base: "rb-header-logo-sm rb-w-auto rb-transition-all rb-duration-300" })),
25282
- fallback: "rb-header-logo-sm rb-w-auto rb-transition-all rb-duration-300"
25283
- }) }, when("site.logo"), bind("site.logo"))], when("content.logo", { not: true })),
25284
- text({
25285
- as: "strong",
25286
- className: "header-logo-text rb-truncate"
25287
- }, whenTransformed("$root.theme.header.logo", "layout.headerLogoTextVisible"), bind("site.title", { fallback: "Your Site" }))
25288
- ]);
25860
+ }, [media({ className: bindProp("$root.theme.header.logo", {
25861
+ transforms: pipe(tx("layout.headerLogoMediaClass", { base: "rb-header-logo-sm rb-w-auto rb-transition-all rb-duration-300" })),
25862
+ fallback: "rb-header-logo-sm rb-w-auto rb-transition-all rb-duration-300"
25863
+ }) }, when("content.logo"), bindChromeLogo(surface)), text({
25864
+ as: "strong",
25865
+ className: "header-logo-text rb-truncate"
25866
+ }, whenTransformed("$root.theme.header.logo", "layout.headerLogoTextVisible"), bind("site.title", { fallback: "Your Site" }))]);
25867
+ const logoRow = createLogoRow("header-root");
25289
25868
  const centeredLogoRow = link({
25290
25869
  href: "/",
25291
25870
  className: bindProp("$root.theme.header.logo", {
25292
25871
  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" })),
25293
25872
  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"
25294
25873
  })
25295
- }, [
25296
- media({ className: bindProp("$root.theme.header.logo", {
25297
- transforms: pipe(tx("layout.headerLogoMediaClass", { base: "rb-header-logo-lg rb-w-auto rb-transition-all rb-duration-300" })),
25298
- fallback: "rb-header-logo-lg rb-w-auto rb-transition-all rb-duration-300"
25299
- }) }, when("content.logo"), bind("content.logo")),
25300
- stack({ className: "rb-contents" }, [media({ className: bindProp("$root.theme.header.logo", {
25301
- transforms: pipe(tx("layout.headerLogoMediaClass", { base: "rb-header-logo-lg rb-w-auto rb-transition-all rb-duration-300" })),
25302
- fallback: "rb-header-logo-lg rb-w-auto rb-transition-all rb-duration-300"
25303
- }) }, when("site.logo"), bind("site.logo"))], when("content.logo", { not: true })),
25304
- text({
25305
- as: "strong",
25306
- className: "header-logo-text"
25307
- }, whenTransformed("$root.theme.header.logo", "layout.headerLogoTextVisible"), bind("site.title", { fallback: "Your Site" }))
25308
- ]);
25874
+ }, [media({ className: bindProp("$root.theme.header.logo", {
25875
+ transforms: pipe(tx("layout.headerLogoMediaClass", { base: "rb-header-logo-lg rb-w-auto rb-transition-all rb-duration-300" })),
25876
+ fallback: "rb-header-logo-lg rb-w-auto rb-transition-all rb-duration-300"
25877
+ }) }, when("content.logo"), bindChromeLogo("header-root")), text({
25878
+ as: "strong",
25879
+ className: "header-logo-text"
25880
+ }, whenTransformed("$root.theme.header.logo", "layout.headerLogoTextVisible"), bind("site.title", { fallback: "Your Site" }))]);
25309
25881
  const createNavRow = (className, align = "end") => navRow({
25310
25882
  className: `${className} header-nav-row`,
25311
25883
  align,
@@ -25345,10 +25917,8 @@ const mobileToggleIcon = stack({
25345
25917
  }
25346
25918
  ]);
25347
25919
  const mobileToggleButton = {
25348
- type: "button",
25920
+ type: "headerControl",
25349
25921
  props: {
25350
- type: "button",
25351
- variantId: "",
25352
25922
  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`,
25353
25923
  "aria-label": "Open menu",
25354
25924
  "aria-expanded": "false",
@@ -25358,10 +25928,8 @@ const mobileToggleButton = {
25358
25928
  children: [mobileToggleIcon]
25359
25929
  };
25360
25930
  const mobileOverlayToggleButton = {
25361
- type: "button",
25931
+ type: "headerControl",
25362
25932
  props: {
25363
- type: "button",
25364
- variantId: "",
25365
25933
  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",
25366
25934
  "aria-label": "Open menu",
25367
25935
  "aria-expanded": "false",
@@ -25385,7 +25953,7 @@ const mobileOverlayHeader = inline({
25385
25953
  align: "center",
25386
25954
  justify: "between",
25387
25955
  style: borderColorStyle("border")
25388
- }, [logoRow, mobileOverlayToggleButton]);
25956
+ }, [createLogoRow("header-mobile-panel"), mobileOverlayToggleButton]);
25389
25957
  const mobileOverlayBody = stack({
25390
25958
  className: "rb-flex-1 rb-px-6 rb-py-6",
25391
25959
  gap: "md",
@@ -25572,7 +26140,10 @@ const brandLogo = link({
25572
26140
  options: { base: "rb-h-10 rb-w-auto" }
25573
26141
  }],
25574
26142
  fallback: "rb-h-10 rb-w-auto"
25575
- } } }, when("module.showLogo", { equals: true }), when("content.logo"), bind("content.logo")), text({
26143
+ } } }, when("module.showLogo", { equals: true }), when("content.logo"), bind("content", { transforms: [{
26144
+ id: "layout.chromeLogo",
26145
+ options: { surface: "footer-root" }
26146
+ }] })), text({
25576
26147
  as: "strong",
25577
26148
  className: "footer-logo-text rb-nav-text"
25578
26149
  }, when("module.showTitle", { equals: true }), bind("site.title", { fallback: "Your Site" }))], when("module.kind", { equals: "brand" }));
@@ -27265,6 +27836,15 @@ const appointmentServicesBlockDefinition = {
27265
27836
  required: false,
27266
27837
  ui: { intent: "content" }
27267
27838
  },
27839
+ createSiteOptionSelectField({
27840
+ id: "categoryId",
27841
+ label: "Category",
27842
+ description: "Show one category (with its heading and intro), or leave it on All categories to show everything grouped.",
27843
+ required: false,
27844
+ multiple: false,
27845
+ optionSource: "appointmentServiceCategories",
27846
+ ui: { intent: "content" }
27847
+ }),
27268
27848
  sectionStylesField({
27269
27849
  id: "_sectionStyles",
27270
27850
  label: "Section styles",
@@ -27299,6 +27879,7 @@ const appointmentServicesBlockDefinition = {
27299
27879
  richText({ className: "rb-prose rb-max-w-none" }, bind("content.description"), when("content.description")),
27300
27880
  el("appointment-services", {
27301
27881
  sectionHeading: { $bind: { from: "content.heading" } },
27882
+ categoryId: { $bind: { from: "content.categoryId" } },
27302
27883
  services: { $bind: { from: "data.services" } },
27303
27884
  pathname: { $bind: { from: "$root.pathname" } },
27304
27885
  servicePathPrefix: { $bind: { from: "$root.appointmentServicePathPrefix" } }
@@ -28288,6 +28869,12 @@ const occurrenceContextSchema = z.object({
28288
28869
  capacityOverride: z.number().nullable().optional(),
28289
28870
  overrides: z.record(z.string(), z.unknown()).nullable().optional()
28290
28871
  }).nullable();
28872
+ //#endregion
28873
+ //#region ../blocks/src/system/runtime/api/readAuthority.ts
28874
+ const browserReadAuthoritySchema = z.discriminatedUnion("kind", [z.object({ kind: z.literal("published") }).strict(), z.object({
28875
+ kind: z.literal("preview"),
28876
+ token: z.string().min(1)
28877
+ }).strict()]);
28291
28878
  const unsupportedEventRegistrationPageSurfaceSubjectSchema = z.object({
28292
28879
  kind: z.literal("unsupported"),
28293
28880
  reason: z.enum([
@@ -28398,6 +28985,33 @@ function normalizeEventCalendarDisplayMode$1(input) {
28398
28985
  if (isEventCalendarDisplayMode(input.variant)) return input.variant;
28399
28986
  return isEventCalendarDisplayMode(input.displayMode) ? input.displayMode : void 0;
28400
28987
  }
28988
+ /** One closed authority for the projections required by each rendered mode. */
28989
+ function resolveEventCalendarReadPlan(input) {
28990
+ const mode = normalizeEventCalendarDisplayMode$1(input) ?? "combined";
28991
+ switch (mode) {
28992
+ case "combined": return {
28993
+ mode,
28994
+ jobs: "both",
28995
+ readProfile: "listing-card"
28996
+ };
28997
+ case "list": return {
28998
+ mode,
28999
+ jobs: "list",
29000
+ readProfile: "listing-card"
29001
+ };
29002
+ case "calendar": return {
29003
+ mode,
29004
+ jobs: "calendar",
29005
+ readProfile: "listing-card"
29006
+ };
29007
+ case "timetable":
29008
+ case "week-board": return {
29009
+ mode,
29010
+ jobs: "calendar",
29011
+ readProfile: "timetable"
29012
+ };
29013
+ }
29014
+ }
28401
29015
  function isEventCalendarDefaultView(value) {
28402
29016
  return typeof value === "string" && eventCalendarDefaultViewValues.includes(value);
28403
29017
  }
@@ -28592,6 +29206,7 @@ const eventRegistrationSourceSchema = z.object({
28592
29206
  apiBaseUrl: z.string().optional(),
28593
29207
  portalToken: z.string().nullable().optional(),
28594
29208
  previewToken: z.string().nullable().optional(),
29209
+ readAuthority: browserReadAuthoritySchema.optional(),
28595
29210
  ...eventRegistrationHydrationSchemaShape,
28596
29211
  events: z.array(eventRegistrationPublicEventSchema).nullable().optional(),
28597
29212
  wholeSeriesRunEvents: z.array(eventRegistrationPublicEventSchema).nullable().optional(),
@@ -28629,6 +29244,7 @@ z.object({
28629
29244
  apiBaseUrl: z.string().optional(),
28630
29245
  portalToken: z.string().nullable().optional(),
28631
29246
  previewToken: z.string().nullable().optional(),
29247
+ readAuthority: browserReadAuthoritySchema.optional(),
28632
29248
  stage: previewStageSchema.optional()
28633
29249
  });
28634
29250
  function buildEventRegistrationDisplayFromScopedEvents(source, scopedSourceEvents) {
@@ -28887,6 +29503,7 @@ const eventRegistrationBlockDefinition = {
28887
29503
  text({ as: "h2" }, bind("content.heading"), when("content.heading")),
28888
29504
  richText({ className: "rb-prose rb-max-w-none" }, bind("content.description"), when("content.description")),
28889
29505
  eventRegistration(withApiBindings({
29506
+ readAuthority: { $bind: { from: "$root.readAuthority" } },
28890
29507
  occurrenceContext: { $bind: { from: "$root.occurrenceContext" } },
28891
29508
  subject: { $bind: { from: "$root.subject" } },
28892
29509
  portalToken: { $bind: {
@@ -29519,8 +30136,7 @@ function resolveEventListPaginationAction(input) {
29519
30136
  //#endregion
29520
30137
  //#region ../blocks/src/system/blocks/events/shared/calendarWindow.ts
29521
30138
  function resolveCalendarReadProfile(content) {
29522
- const mode = normalizeEventCalendarDisplayMode$1(content);
29523
- return mode === "timetable" || mode === "week-board" ? "timetable" : "listing-card";
30139
+ return resolveEventCalendarReadPlan(content).readProfile;
29524
30140
  }
29525
30141
  /** Runtime picker sentinels and bound loader IDs must describe the same query. */
29526
30142
  function normalizeCalendarFilterId(value) {
@@ -29630,6 +30246,7 @@ const eventCollectionSourceSchemaShape = {
29630
30246
  events: z.array(publicEventSchema).nullable().optional(),
29631
30247
  siteId: z.string(),
29632
30248
  apiBaseUrl: z.string().optional(),
30249
+ readAuthority: browserReadAuthoritySchema.optional(),
29633
30250
  stage: previewStageSchema.optional(),
29634
30251
  listLayout: eventLayoutSchema.optional(),
29635
30252
  listColumns: columnOptionSchema.optional(),
@@ -29682,7 +30299,6 @@ const eventCollectionDisplaySchemaShape = {
29682
30299
  const eventCollectionHydrationSchema = z.object({
29683
30300
  siteId: z.string(),
29684
30301
  calendarWindow: calendarWindowPageSchema.optional(),
29685
- stage: previewStageSchema.optional(),
29686
30302
  prefetchedEvents: z.boolean(),
29687
30303
  eventSurface: eventSurfaceScopeSchema$1,
29688
30304
  filterEventPresets: z.string().nullable(),
@@ -29757,7 +30373,6 @@ function buildEventCollectionHydration(source, now = /* @__PURE__ */ new Date())
29757
30373
  return {
29758
30374
  calendarWindow: source.calendarWindow ?? void 0,
29759
30375
  siteId: source.siteId,
29760
- stage: source.stage,
29761
30376
  prefetchedEvents: source.events != null,
29762
30377
  eventSurface: selected ? "all" : normalizeEventSurfaceScope(source.eventSurface),
29763
30378
  filterEventPresets: selected ? null : normalizeEventSurfacePresetsCsv(source.filterEventPresets),
@@ -29777,6 +30392,7 @@ const eventListingSourceSchema = z.object({
29777
30392
  events: z.array(publicEventSchema).nullable().optional(),
29778
30393
  siteId: z.string(),
29779
30394
  apiBaseUrl: z.string().optional(),
30395
+ readAuthority: browserReadAuthoritySchema.optional(),
29780
30396
  stage: previewStageSchema.optional(),
29781
30397
  layout: eventLayoutSchema.optional(),
29782
30398
  columns: columnOptionSchema.optional(),
@@ -29817,7 +30433,6 @@ const eventListingDisplaySchema = z.object({
29817
30433
  });
29818
30434
  const eventListingHydrationSchema = z.object({
29819
30435
  siteId: z.string(),
29820
- stage: previewStageSchema.optional(),
29821
30436
  eventsPerPage: eventPageSizeSchema,
29822
30437
  paginationAction: eventListPaginationActionSchema,
29823
30438
  showFilters: z.boolean(),
@@ -29840,6 +30455,7 @@ const eventListingRenderSchema = z.object({
29840
30455
  z.object({
29841
30456
  siteId: z.string(),
29842
30457
  apiBaseUrl: z.string().optional(),
30458
+ readAuthority: browserReadAuthoritySchema.optional(),
29843
30459
  stage: previewStageSchema.optional()
29844
30460
  });
29845
30461
  const eventListingBlockRuntime = defineProgressiveBlockRuntime({
@@ -29874,7 +30490,6 @@ const eventListingBlockRuntime = defineProgressiveBlockRuntime({
29874
30490
  },
29875
30491
  hydration: {
29876
30492
  siteId: source.siteId,
29877
- stage: source.stage,
29878
30493
  eventsPerPage: pageSize,
29879
30494
  paginationAction: resolveEventListPaginationAction({
29880
30495
  paginationMode: source.paginationMode,
@@ -30156,6 +30771,7 @@ const eventListingBlockDefinition = {
30156
30771
  rootType: "stack",
30157
30772
  rootProps: { gap: "lg" },
30158
30773
  children: [...eventSectionHeaderLayoutNodes(), el("event-listing", withApiBindings({
30774
+ readAuthority: { $bind: { from: "$root.readAuthority" } },
30159
30775
  events: { $bind: { from: "data.events" } },
30160
30776
  stage: { $bind: {
30161
30777
  from: "$root.previewStage",
@@ -30353,6 +30969,7 @@ const eventCalendarRenderSchema = z.object({
30353
30969
  z.object({
30354
30970
  siteId: z.string(),
30355
30971
  apiBaseUrl: z.string().optional(),
30972
+ readAuthority: browserReadAuthoritySchema.optional(),
30356
30973
  stage: previewStageSchema.optional()
30357
30974
  });
30358
30975
  /**
@@ -30374,7 +30991,7 @@ function buildEventCalendarDisplay(source) {
30374
30991
  listColumns: source.listColumns ?? source.columns
30375
30992
  }),
30376
30993
  kind: "event-calendar",
30377
- displayMode: normalizeEventCalendarDisplayMode$1(source) ?? "combined",
30994
+ displayMode: resolveEventCalendarReadPlan(source).mode,
30378
30995
  className: source.className ?? null,
30379
30996
  events: (source.events ?? []).slice().sort((left, right) => new Date(left.startsAt).getTime() - new Date(right.startsAt).getTime()),
30380
30997
  boardTitle: normalizeOptionalText(source.boardTitle),
@@ -30391,13 +31008,16 @@ const eventCalendarBlockRuntime = defineProgressiveBlockRuntime({
30391
31008
  source: createZodCodec(eventCalendarSourceSchema),
30392
31009
  render: createZodCodec(eventCalendarRenderSchema)
30393
31010
  },
30394
- buildRender: (source) => ({
30395
- display: buildEventCalendarDisplay(source.calendarWindow && (source.variant ?? source.displayMode ?? "combined") !== "combined" && (source.variant ?? source.displayMode) !== "list" ? {
30396
- ...source,
30397
- events: source.calendarWindow.events
30398
- } : source),
30399
- hydration: buildEventCollectionHydration(source)
30400
- })
31011
+ buildRender: (source) => {
31012
+ const plan = resolveEventCalendarReadPlan(source);
31013
+ return {
31014
+ display: buildEventCalendarDisplay(source.calendarWindow && plan.jobs === "calendar" ? {
31015
+ ...source,
31016
+ events: source.calendarWindow.events
31017
+ } : source),
31018
+ hydration: buildEventCollectionHydration(source)
31019
+ };
31020
+ }
30401
31021
  });
30402
31022
  //#endregion
30403
31023
  //#region ../blocks/src/system/blocks/events/eventCalendarDataLoaders.ts
@@ -30547,6 +31167,7 @@ const eventCalendarLayout = [styledSection({
30547
31167
  rootType: "stack",
30548
31168
  rootProps: { gap: "lg" },
30549
31169
  children: [...eventSectionHeaderLayoutNodes({ splitClassName: "event-section-head event-section-head--split" }), el("event-calendar", withApiBindings({
31170
+ readAuthority: { $bind: { from: "$root.readAuthority" } },
30550
31171
  events: { $bind: { from: "data.events" } },
30551
31172
  calendarWindow: { $bind: { from: "data.calendarWindow" } },
30552
31173
  stage: { $bind: {
@@ -34110,6 +34731,7 @@ const shopSourceSchema = z.object({
34110
34731
  products: z.array(publicProductSchema).nullable().optional(),
34111
34732
  siteId: z.string().optional(),
34112
34733
  apiBaseUrl: z.string().optional(),
34734
+ readAuthority: browserReadAuthoritySchema.optional(),
34113
34735
  stage: previewStageSchema.optional()
34114
34736
  });
34115
34737
  const productVariantOptionDisplaySchema = z.object({
@@ -34277,6 +34899,7 @@ function resolveShowPricePerCredit(source) {
34277
34899
  z.object({
34278
34900
  siteId: z.string().optional(),
34279
34901
  apiBaseUrl: z.string().optional(),
34902
+ readAuthority: browserReadAuthoritySchema.optional(),
34280
34903
  stage: previewStageSchema.optional()
34281
34904
  });
34282
34905
  const shopBlockRuntime = defineProgressiveBlockRuntime({
@@ -34617,6 +35240,7 @@ const shopBlockDefinition = {
34617
35240
  baseClass: "",
34618
35241
  spacing: "spacious",
34619
35242
  children: sectionContainer([shop(withApiBindings({
35243
+ readAuthority: { $bind: { from: "$root.readAuthority" } },
34620
35244
  mode: "passes-memberships",
34621
35245
  showPasses: { $bind: {
34622
35246
  from: "content.showPasses",
@@ -34815,6 +35439,7 @@ const productListBlockDefinition = {
34815
35439
  baseClass: "",
34816
35440
  spacing: "spacious",
34817
35441
  children: sectionContainer([productList(withApiBindings({
35442
+ readAuthority: { $bind: { from: "$root.readAuthority" } },
34818
35443
  mode: "product-list",
34819
35444
  heading: { $bind: {
34820
35445
  from: "content.heading",
@@ -34957,6 +35582,7 @@ const productDetailBlockDefinition = {
34957
35582
  baseClass: "",
34958
35583
  spacing: "spacious",
34959
35584
  children: sectionContainer([productDetail(withApiBindings({
35585
+ readAuthority: { $bind: { from: "$root.readAuthority" } },
34960
35586
  mode: "product-detail",
34961
35587
  heading: { $bind: {
34962
35588
  from: "content.heading",
@@ -35073,6 +35699,7 @@ const cartBlockDefinition = {
35073
35699
  baseClass: "",
35074
35700
  spacing: "spacious",
35075
35701
  children: sectionContainer([cart(withApiBindings({
35702
+ readAuthority: { $bind: { from: "$root.readAuthority" } },
35076
35703
  mode: "cart",
35077
35704
  heading: { $bind: {
35078
35705
  from: "content.heading",
@@ -35156,6 +35783,7 @@ const checkoutBlockDefinition = {
35156
35783
  baseClass: "",
35157
35784
  spacing: "spacious",
35158
35785
  children: sectionContainer([checkout(withApiBindings({
35786
+ readAuthority: { $bind: { from: "$root.readAuthority" } },
35159
35787
  mode: "checkout",
35160
35788
  heading: { $bind: {
35161
35789
  from: "content.heading",
@@ -37816,8 +38444,8 @@ const builtinTransformDefinitions = [
37816
38444
  summary: "Choose the read projection required by the calendar display mode",
37817
38445
  schema: z.object({ job: z.enum(["list", "calendar"]) }),
37818
38446
  run(value, options) {
37819
- const mode = normalizeEventCalendarDisplayMode$1(asPartialObject(value) ?? {}) ?? "combined";
37820
- return options.job === "calendar" ? mode !== "list" : mode === "list" || mode === "combined";
38447
+ const plan = resolveEventCalendarReadPlan(asPartialObject(value) ?? {});
38448
+ return plan.jobs === "both" || plan.jobs === options.job;
37821
38449
  }
37822
38450
  },
37823
38451
  {
@@ -37830,6 +38458,7 @@ const builtinTransformDefinitions = [
37830
38458
  },
37831
38459
  ...formattingTransforms,
37832
38460
  ...layoutTransforms,
38461
+ ...chromeLogoTransforms,
37833
38462
  ...uiTransforms,
37834
38463
  ...mediaTransforms,
37835
38464
  ...backgroundTransforms,
@@ -38598,7 +39227,12 @@ const appointmentSetupServiceDraftSchema = z.object({
38598
39227
  venue: appointmentSetupVenueChoiceSchema,
38599
39228
  timezone: z.string().trim().min(1).nullable(),
38600
39229
  payment: appointmentSetupPaymentDraftSchema,
38601
- assignment: appointmentSetupServiceAssignmentDraftSchema
39230
+ assignment: appointmentSetupServiceAssignmentDraftSchema,
39231
+ /**
39232
+ * The service's category, or null for "Other" (issue 1403). Omitted leaves
39233
+ * an existing service's category alone and puts a new one in "Other".
39234
+ */
39235
+ categoryId: z.string().uuid().nullable().optional()
38602
39236
  }).superRefine((service, ctx) => {
38603
39237
  if (service.payment.kind !== "free" && (service.priceAmount === null || service.priceAmount <= 0)) ctx.addIssue({
38604
39238
  code: "custom",