@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
@@ -9,6 +9,75 @@ const footerModeSchema = z.enum([
9
9
  "none"
10
10
  ]);
11
11
  //#endregion
12
+ //#region ../api/src/defineEndpointDefinitions.ts
13
+ /**
14
+ * Validates extracted endpoint descriptors while preserving each literal path,
15
+ * method, and parameter contract for the typed URL builders.
16
+ */
17
+ function defineEndpointDefinitions(definitions) {
18
+ return definitions;
19
+ }
20
+ //#endregion
21
+ //#region ../api/src/publicNewsletterEndpointDefinitions.ts
22
+ const PUBLIC_NEWSLETTER_ENDPOINT_DEFINITIONS = defineEndpointDefinitions({
23
+ subscribeNewsletter: {
24
+ path: "/public/sites/{siteId}/newsletter/subscribe",
25
+ method: "POST",
26
+ tags: ["public-newsletter-{siteId}"],
27
+ auth: "public",
28
+ responseKind: "json"
29
+ },
30
+ confirmNewsletter: {
31
+ path: "/public/sites/{siteId}/newsletter/confirm/{token}",
32
+ method: "GET",
33
+ tags: ["public-newsletter-{siteId}"],
34
+ auth: "public",
35
+ responseKind: "text"
36
+ },
37
+ unsubscribeNewsletter: {
38
+ path: "/public/sites/{siteId}/newsletter/unsubscribe/{token}",
39
+ method: "GET",
40
+ tags: ["public-newsletter-{siteId}"],
41
+ auth: "public",
42
+ responseKind: "text"
43
+ },
44
+ unsubscribeNewsletterPost: {
45
+ path: "/public/sites/{siteId}/newsletter/unsubscribe/{token}",
46
+ method: "POST",
47
+ tags: ["public-newsletter-{siteId}"],
48
+ auth: "public",
49
+ responseKind: "text"
50
+ },
51
+ confirmNewsletterPost: {
52
+ path: "/public/sites/{siteId}/newsletter/confirm/{token}",
53
+ method: "POST",
54
+ tags: ["public-newsletter-{siteId}"],
55
+ auth: "public",
56
+ responseKind: "text"
57
+ },
58
+ getNewsletterPreferences: {
59
+ path: "/public/sites/{siteId}/newsletter/preferences/{token}",
60
+ method: "GET",
61
+ tags: ["public-newsletter-{siteId}"],
62
+ auth: "public",
63
+ responseKind: "text"
64
+ },
65
+ saveNewsletterPreferences: {
66
+ path: "/public/sites/{siteId}/newsletter/preferences/{token}",
67
+ method: "POST",
68
+ tags: ["public-newsletter-{siteId}"],
69
+ auth: "public",
70
+ responseKind: "text"
71
+ },
72
+ getNewsletterArchive: {
73
+ path: "/public/sites/{siteId}/newsletter/archive/{token}",
74
+ method: "GET",
75
+ tags: ["public-newsletter-{siteId}"],
76
+ auth: "public",
77
+ responseKind: "text"
78
+ }
79
+ });
80
+ //#endregion
12
81
  //#region ../api/src/apiEndpointTypes.ts
13
82
  function allowedDemoMutationPolicy() {
14
83
  return {
@@ -100,17 +169,85 @@ const SDK_ENTRY_READ_ENDPOINTS = {
100
169
  }
101
170
  };
102
171
  //#endregion
103
- //#region ../api/src/defineEndpointDefinitions.ts
104
- /**
105
- * Validates extracted endpoint descriptors while preserving each literal path,
106
- * method, and parameter contract for the typed URL builders.
107
- */
108
- function defineEndpointDefinitions(definitions) {
109
- return definitions;
110
- }
111
- //#endregion
112
172
  //#region ../api/src/appointmentEndpointDefinitions.ts
113
173
  const APPOINTMENT_ENDPOINT_DEFINITIONS = defineEndpointDefinitions({
174
+ ...defineEndpointDefinitions({
175
+ listGroupedAppointmentServices: {
176
+ path: "/sites/{siteId}/bookings/services/grouped",
177
+ method: "GET",
178
+ auth: "user",
179
+ responseKind: "json",
180
+ errors: ["server:internal_error"]
181
+ },
182
+ reorderAppointmentServices: {
183
+ path: "/sites/{siteId}/bookings/services/order",
184
+ method: "PUT",
185
+ auth: "user",
186
+ responseKind: "json",
187
+ errors: [
188
+ "validation:invalid_input",
189
+ "auth:forbidden",
190
+ "resource:not_found",
191
+ "resource:conflict",
192
+ "server:internal_error"
193
+ ]
194
+ },
195
+ listAppointmentServiceCategories: {
196
+ path: "/sites/{siteId}/bookings/service-categories",
197
+ method: "GET",
198
+ auth: "user",
199
+ responseKind: "json",
200
+ errors: ["server:internal_error"]
201
+ },
202
+ createAppointmentServiceCategory: {
203
+ path: "/sites/{siteId}/bookings/service-categories",
204
+ method: "POST",
205
+ auth: "user",
206
+ responseKind: "json",
207
+ errors: [
208
+ "validation:invalid_input",
209
+ "auth:forbidden",
210
+ "resource:conflict",
211
+ "server:internal_error"
212
+ ]
213
+ },
214
+ updateAppointmentServiceCategory: {
215
+ path: "/sites/{siteId}/bookings/service-categories/{categoryId}",
216
+ method: "PUT",
217
+ auth: "user",
218
+ responseKind: "json",
219
+ errors: [
220
+ "validation:invalid_input",
221
+ "auth:forbidden",
222
+ "resource:not_found",
223
+ "resource:conflict",
224
+ "server:internal_error"
225
+ ]
226
+ },
227
+ deleteAppointmentServiceCategory: {
228
+ path: "/sites/{siteId}/bookings/service-categories/{categoryId}",
229
+ method: "DELETE",
230
+ auth: "user",
231
+ responseKind: "json",
232
+ errors: [
233
+ "auth:forbidden",
234
+ "resource:not_found",
235
+ "server:internal_error"
236
+ ]
237
+ },
238
+ reorderAppointmentServiceCategories: {
239
+ path: "/sites/{siteId}/bookings/service-categories/order",
240
+ method: "PUT",
241
+ auth: "user",
242
+ responseKind: "json",
243
+ errors: [
244
+ "validation:invalid_input",
245
+ "auth:forbidden",
246
+ "resource:conflict",
247
+ "server:internal_error"
248
+ ]
249
+ }
250
+ }),
114
251
  listAppointmentResources: {
115
252
  path: "/sites/{siteId}/bookings/resources",
116
253
  method: "GET",
@@ -1258,39 +1395,6 @@ const NEWSLETTER_ENDPOINT_DEFINITIONS = defineEndpointDefinitions({
1258
1395
  auth: "user",
1259
1396
  responseKind: "json",
1260
1397
  demoMutation: DEMO_MUTATION_BLOCKED_HIDDEN
1261
- },
1262
- listNewsletterSendJobs: {
1263
- path: "/sites/{siteId}/newsletter/jobs",
1264
- method: "GET",
1265
- tags: [TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter],
1266
- auth: "user",
1267
- responseKind: "json"
1268
- },
1269
- retryNewsletterSendJob: {
1270
- path: "/sites/{siteId}/newsletter/jobs/{jobId}/retry",
1271
- method: "POST",
1272
- errors: [
1273
- "validation:invalid_input",
1274
- "resource:not_found",
1275
- "auth:forbidden",
1276
- "server:internal_error"
1277
- ],
1278
- tags: [TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter],
1279
- auth: "user",
1280
- responseKind: "json"
1281
- },
1282
- cancelNewsletterSendJob: {
1283
- path: "/sites/{siteId}/newsletter/jobs/{jobId}/cancel",
1284
- method: "POST",
1285
- errors: [
1286
- "validation:invalid_input",
1287
- "resource:not_found",
1288
- "auth:forbidden",
1289
- "server:internal_error"
1290
- ],
1291
- tags: [TAG_TEMPLATES.site, TAG_TEMPLATES.siteNewsletter],
1292
- auth: "user",
1293
- responseKind: "json"
1294
1398
  }
1295
1399
  });
1296
1400
  //#endregion
@@ -3366,6 +3470,7 @@ const BILLING_ENDPOINT_DEFINITIONS = defineEndpointDefinitions({
3366
3470
  }
3367
3471
  });
3368
3472
  ({
3473
+ ...PUBLIC_NEWSLETTER_ENDPOINT_DEFINITIONS,
3369
3474
  ...ACCOUNT_ENDPOINT_DEFINITIONS,
3370
3475
  ...PUBLIC_ONBOARDING_ATTEMPT_ENDPOINT_DEFINITIONS,
3371
3476
  ...PUBLIC_EVENT_ENDPOINT_DEFINITIONS,
@@ -3605,6 +3710,8 @@ z.discriminatedUnion("kind", navigationLinkInputSchemaOptions);
3605
3710
  //#endregion
3606
3711
  //#region ../theme-core/src/palette/utils/colorConversion.ts
3607
3712
  const clamp01 = (x) => Math.max(0, Math.min(1, x));
3713
+ const mod = (a, n) => (a % n + n) % n;
3714
+ const deg = (x) => mod(x, 360);
3608
3715
  function hexToRgb(hex) {
3609
3716
  const h = hex.replace(/^#/, "");
3610
3717
  const m = h.length === 3 ? h.split("").map((c) => c + c).join("") : h;
@@ -3627,6 +3734,45 @@ function srgbToLinear(u) {
3627
3734
  function linearToSrgb(x) {
3628
3735
  return clamp01(x <= .0031308 ? 12.92 * x : 1.055 * Math.pow(x, 1 / 2.4) - .055) * 255;
3629
3736
  }
3737
+ function rgbToHsl(r, g, b) {
3738
+ const R = r / 255, G = g / 255, B = b / 255;
3739
+ const max = Math.max(R, G, B), min = Math.min(R, G, B);
3740
+ const d = max - min;
3741
+ let h = 0;
3742
+ if (d !== 0) {
3743
+ switch (max) {
3744
+ case R:
3745
+ h = (G - B) / d + (G < B ? 6 : 0);
3746
+ break;
3747
+ case G:
3748
+ h = (B - R) / d + 2;
3749
+ break;
3750
+ case B:
3751
+ h = (R - G) / d + 4;
3752
+ break;
3753
+ }
3754
+ h *= 60;
3755
+ }
3756
+ const l = (max + min) / 2;
3757
+ const s = d === 0 ? 0 : d / (1 - Math.abs(2 * l - 1));
3758
+ return {
3759
+ h,
3760
+ s,
3761
+ l
3762
+ };
3763
+ }
3764
+ function srgbToOklab(r, g, b) {
3765
+ const R = srgbToLinear(r), G = srgbToLinear(g), B = srgbToLinear(b);
3766
+ const l = .4122214708 * R + .5363325363 * G + .0514459929 * B;
3767
+ const m = .2119034982 * R + .6806995451 * G + .1073969566 * B;
3768
+ const s = .0883024619 * R + .2817188376 * G + .6299787005 * B;
3769
+ const l_ = Math.cbrt(l), m_ = Math.cbrt(m), s_ = Math.cbrt(s);
3770
+ return {
3771
+ L: .2104542553 * l_ + .793617785 * m_ - .0040720468 * s_,
3772
+ a: 1.9779984951 * l_ - 2.428592205 * m_ + .4505937099 * s_,
3773
+ b: .0259040371 * l_ + .7827717662 * m_ - .808675766 * s_
3774
+ };
3775
+ }
3630
3776
  function oklabToSrgb(L, a, b) {
3631
3777
  const l_ = Math.pow(L + .3963377774 * a + .2158037573 * b, 3);
3632
3778
  const m_ = Math.pow(L - .1055613458 * a - .0638541728 * b, 3);
@@ -3640,6 +3786,14 @@ function oklabToSrgb(L, a, b) {
3640
3786
  b: linearToSrgb(B)
3641
3787
  };
3642
3788
  }
3789
+ function oklabToOklch(L, a, b) {
3790
+ const C = Math.sqrt(a * a + b * b);
3791
+ return {
3792
+ L,
3793
+ C,
3794
+ h: C < 1e-7 ? 0 : deg(Math.atan2(b, a) * 180 / Math.PI)
3795
+ };
3796
+ }
3643
3797
  function oklchToOklab(L, C, h) {
3644
3798
  const hr = h * Math.PI / 180;
3645
3799
  return {
@@ -3648,6 +3802,27 @@ function oklchToOklab(L, C, h) {
3648
3802
  b: C * Math.sin(hr)
3649
3803
  };
3650
3804
  }
3805
+ function featuresFromHex(hex) {
3806
+ const { r, g, b } = hexToRgb(hex);
3807
+ const { h, s, l } = rgbToHsl(r, g, b);
3808
+ const { L, a, b: b2 } = srgbToOklab(r, g, b);
3809
+ const { L: okL, C: okC, h: okH } = oklabToOklch(L, a, b2);
3810
+ return {
3811
+ r,
3812
+ g,
3813
+ b,
3814
+ h,
3815
+ s,
3816
+ l,
3817
+ v: Math.max(r, g, b) / 255,
3818
+ Y: .2126 * srgbToLinear(r) + .7152 * srgbToLinear(g) + .0722 * srgbToLinear(b),
3819
+ chroma: s,
3820
+ okL,
3821
+ okC,
3822
+ okH,
3823
+ hex
3824
+ };
3825
+ }
3651
3826
  function relativeLuminance(r, g, b) {
3652
3827
  const R = srgbToLinear(r), G = srgbToLinear(g), B = srgbToLinear(b);
3653
3828
  return .2126 * R + .7152 * G + .0722 * B;
@@ -6731,6 +6906,36 @@ function normalizedReference(value) {
6731
6906
  return normalized.length > 0 ? normalized : null;
6732
6907
  }
6733
6908
  //#endregion
6909
+ //#region ../theme-core/src/surfaces/logoVariant.ts
6910
+ /** Concrete hex behind a plain, opaque palette token, or null otherwise. */
6911
+ function opaquePaletteHexForToken(expandedPalette, token) {
6912
+ if (!token) return null;
6913
+ const parts = parseColorTokenParts(token);
6914
+ if (parts.kind !== "token" || parts.opacityPercent !== null) return null;
6915
+ return expandedPalette[parts.token] ?? null;
6916
+ }
6917
+ /**
6918
+ * Tone of the surface a foreground token was resolved for.
6919
+ *
6920
+ * A token with opacity has no known underlay to composite against, and a raw
6921
+ * or unrecognised token has no palette hex, so both are `unknown` rather than
6922
+ * a guess.
6923
+ */
6924
+ function surfaceToneFromForegroundToken(expandedPalette, foregroundToken) {
6925
+ const hex = opaquePaletteHexForToken(expandedPalette, foregroundToken);
6926
+ if (!hex) return "unknown";
6927
+ return featuresFromHex(hex).Y >= .5 ? "dark" : "light";
6928
+ }
6929
+ /**
6930
+ * The logo to draw on a surface of the given tone. A missing variant falls
6931
+ * back to the other one, and an unknown tone uses the light-backgrounds logo,
6932
+ * which is what every site rendered before variants existed.
6933
+ */
6934
+ function selectLogoVariant(tone, variants) {
6935
+ const { forLightBackgrounds, forDarkBackgrounds } = variants;
6936
+ return tone === "dark" ? forDarkBackgrounds ?? forLightBackgrounds : forLightBackgrounds ?? forDarkBackgrounds;
6937
+ }
6938
+ //#endregion
6734
6939
  //#region ../theme-core/src/utils/colorStyles.ts
6735
6940
  const COLOR_VAR_PREFIX = "--tb-";
6736
6941
  function parseToken(source) {
@@ -6782,16 +6987,28 @@ function backgroundColorStyle(token) {
6782
6987
  return { backgroundColor: rgbColorValue(token) };
6783
6988
  }
6784
6989
  /**
6990
+ * Converts a text color token to a CSS color value that follows the enclosing
6991
+ * surface. The semantic text tokens (`text`, `heading`, `mutedText`) resolve
6992
+ * to the surface foreground variables, so text adapts when a section's
6993
+ * background changes; any other token is a fixed theme color.
6994
+ *
6995
+ * @param token - Theme color token
6996
+ * @returns CSS color value
6997
+ */
6998
+ function textColorValue(token) {
6999
+ const parsed = parseToken(token);
7000
+ const surfaceRole = parsed.raw ? null : surfaceRoleForTextToken(parsed.token);
7001
+ if (!surfaceRole) return rgbColorValue(token);
7002
+ return parsed.opacityPercent === void 0 ? surfaceForegroundValue(surfaceRole) : surfaceForegroundValueWithOpacity(surfaceRole, parsed.opacityPercent);
7003
+ }
7004
+ /**
6785
7005
  * Creates a text color style object from a theme token.
6786
7006
  *
6787
7007
  * @param token - Theme color token
6788
7008
  * @returns CSSProperties with color
6789
7009
  */
6790
7010
  function textColorStyle(token) {
6791
- const parsed = parseToken(token);
6792
- const surfaceRole = parsed.raw ? null : surfaceRoleForTextToken(parsed.token);
6793
- if (surfaceRole) return { color: parsed.opacityPercent === void 0 ? surfaceForegroundValue(surfaceRole) : surfaceForegroundValueWithOpacity(surfaceRole, parsed.opacityPercent) };
6794
- return { color: rgbColorValue(token) };
7011
+ return { color: textColorValue(token) };
6795
7012
  }
6796
7013
  /**
6797
7014
  * Creates a border color style object from a theme token.
@@ -9976,6 +10193,15 @@ function asSiteStyleId(value) {
9976
10193
  function asDesignSystemTemplateId(value) {
9977
10194
  return brandNonEmptyString(value, "DesignSystemTemplateId");
9978
10195
  }
10196
+ function toNonEmptyReadonlyArray(values) {
10197
+ const [first, ...rest] = values;
10198
+ return first === void 0 ? null : [first, ...rest];
10199
+ }
10200
+ function requireNonEmptyReadonlyArray(values, message = "Expected a non-empty array.") {
10201
+ const result = toNonEmptyReadonlyArray(values);
10202
+ if (!result) throw new Error(message);
10203
+ return result;
10204
+ }
9979
10205
  function makeBoundaryId(previousBlockId, nextBlockId) {
9980
10206
  return asDesignBoundaryId(`boundary:${encodeURIComponent(previousBlockId)}:${encodeURIComponent(nextBlockId)}`);
9981
10207
  }
@@ -10178,16 +10404,18 @@ const themeV2RuntimeStyleFieldNames = [
10178
10404
  "_frameStyles",
10179
10405
  "_sectionStyles",
10180
10406
  "_containerStyles",
10181
- "_cardStyles",
10182
- "_transitionStyles",
10183
- "styleGroup"
10407
+ "_cardStyles"
10184
10408
  ];
10185
10409
  const themeV2BlockSpecificRawStyleFieldNames = [
10186
10410
  "_contentCardStyles",
10187
10411
  "_heroLayoutStyles",
10188
10412
  "_textCardStyles"
10189
10413
  ];
10190
- const themeV2NormalEditorRawStyleFieldNames = [...themeV2RuntimeStyleFieldNames, ...themeV2BlockSpecificRawStyleFieldNames];
10414
+ const themeV2NormalEditorRawStyleFieldNames = [
10415
+ ...themeV2RuntimeStyleFieldNames,
10416
+ ...themeV2BlockSpecificRawStyleFieldNames,
10417
+ "styleGroup"
10418
+ ];
10191
10419
  new Set(themeV2NormalEditorRawStyleFieldNames);
10192
10420
  [...themeV2RuntimeStyleFieldNames, ...themeV2BlockSpecificRawStyleFieldNames];
10193
10421
  const pageDesignEditorBackgroundOverrideOwner = "page-design-editor";
@@ -11913,11 +12141,260 @@ function cardRoleFromLegacyVocabulary(value) {
11913
12141
  */
11914
12142
  const cardRoleWithLegacyAliasSchema = z.preprocess((value) => cardRoleFromLegacyVocabulary(value) ?? value, cardRoleSchema);
11915
12143
  //#endregion
11916
- //#region ../theme-core/src/site-styles/compilationPlan.ts
11917
- const defaultHeaderBrandPreferences = {
11918
- brandDisplay: "auto",
11919
- logoSize: "auto"
11920
- };
12144
+ //#region ../theme-core/src/site-styles/transitionCatalogue.ts
12145
+ /**
12146
+ * Family order for pickers. Entries below are listed family by family in this
12147
+ * same order, so the flat option list and the grouped families agree.
12148
+ */
12149
+ const transitionCatalogueFamilies = [
12150
+ {
12151
+ id: "gradient",
12152
+ label: "Gradient"
12153
+ },
12154
+ {
12155
+ id: "wave",
12156
+ label: "Wave"
12157
+ },
12158
+ {
12159
+ id: "angle",
12160
+ label: "Angle"
12161
+ }
12162
+ ];
12163
+ const mediumHeight = "6rem + 2px";
12164
+ const compactHeight = "4.5rem + 2px";
12165
+ const largeHeight = "7rem + 2px";
12166
+ /**
12167
+ * The single source of transition vocabulary. Order is significant: it is the
12168
+ * order of `boundaryOptions` (after `none`) and of each family's variants,
12169
+ * which persisted pins, page-flow presets and the editor picker all rely on.
12170
+ *
12171
+ * Shapes match what `generateLayoutCss` draws today. Structured
12172
+ * amplitude/frequency treatments (issue 826) extend this list later.
12173
+ */
12174
+ const transitionCatalogueEntries = defineExactCatalog()([
12175
+ {
12176
+ intent: "soft-fade-short",
12177
+ optionId: asBoundaryOptionId("break:soft"),
12178
+ family: "gradient",
12179
+ variantId: "soft",
12180
+ label: "Soft",
12181
+ variantLabel: "Soft",
12182
+ treatment: {
12183
+ kind: "soft-fade",
12184
+ height: "medium",
12185
+ curve: "soft"
12186
+ },
12187
+ size: "medium",
12188
+ heightExpression: mediumHeight,
12189
+ shape: { kind: "fade" }
12190
+ },
12191
+ {
12192
+ intent: "soft-fade-long",
12193
+ optionId: asBoundaryOptionId("break:spacious"),
12194
+ family: "gradient",
12195
+ variantId: "spacious",
12196
+ label: "Spacious",
12197
+ variantLabel: "Spacious",
12198
+ treatment: {
12199
+ kind: "soft-fade",
12200
+ height: "large",
12201
+ curve: "spacious"
12202
+ },
12203
+ size: "spacious",
12204
+ heightExpression: "10rem",
12205
+ shape: { kind: "fade" }
12206
+ },
12207
+ {
12208
+ intent: "soft-fade-expansive",
12209
+ optionId: asBoundaryOptionId("break:expansive"),
12210
+ family: "gradient",
12211
+ variantId: "expansive",
12212
+ label: "Expansive",
12213
+ variantLabel: "Expansive",
12214
+ treatment: {
12215
+ kind: "soft-fade",
12216
+ height: "expansive",
12217
+ curve: "expansive"
12218
+ },
12219
+ size: "expansive",
12220
+ heightExpression: "14rem",
12221
+ shape: { kind: "fade" }
12222
+ },
12223
+ {
12224
+ intent: "wave-edge-balanced",
12225
+ optionId: asBoundaryOptionId("break:wave-balanced"),
12226
+ family: "wave",
12227
+ variantId: "balanced",
12228
+ label: "Balanced wave",
12229
+ variantLabel: "Balanced",
12230
+ treatment: {
12231
+ kind: "wave-edge",
12232
+ height: "medium",
12233
+ amplitude: "balanced",
12234
+ rhythm: "double",
12235
+ symmetry: "symmetrical"
12236
+ },
12237
+ size: "medium",
12238
+ heightExpression: mediumHeight,
12239
+ shape: {
12240
+ kind: "wave",
12241
+ mask: "balanced"
12242
+ }
12243
+ },
12244
+ {
12245
+ intent: "wave-edge",
12246
+ optionId: asBoundaryOptionId("break:wave"),
12247
+ family: "wave",
12248
+ variantId: "classic",
12249
+ label: "Classic wave",
12250
+ variantLabel: "Classic",
12251
+ treatment: {
12252
+ kind: "wave-edge",
12253
+ height: "medium",
12254
+ amplitude: "balanced",
12255
+ rhythm: "double",
12256
+ symmetry: "asymmetrical"
12257
+ },
12258
+ size: "medium",
12259
+ heightExpression: mediumHeight,
12260
+ shape: {
12261
+ kind: "wave",
12262
+ mask: "classic"
12263
+ }
12264
+ },
12265
+ {
12266
+ intent: "wave-edge-gentle",
12267
+ optionId: asBoundaryOptionId("break:wave-gentle"),
12268
+ family: "wave",
12269
+ variantId: "gentle",
12270
+ label: "Gentle wave",
12271
+ variantLabel: "Gentle",
12272
+ treatment: {
12273
+ kind: "wave-edge",
12274
+ height: "compact",
12275
+ amplitude: "subtle",
12276
+ rhythm: "single",
12277
+ symmetry: "symmetrical"
12278
+ },
12279
+ size: "compact",
12280
+ heightExpression: compactHeight,
12281
+ shape: {
12282
+ kind: "wave",
12283
+ mask: "gentle"
12284
+ }
12285
+ },
12286
+ {
12287
+ intent: "wave-edge-bold",
12288
+ optionId: asBoundaryOptionId("break:wave-bold"),
12289
+ family: "wave",
12290
+ variantId: "bold",
12291
+ label: "Bold wave",
12292
+ variantLabel: "Bold",
12293
+ treatment: {
12294
+ kind: "wave-edge",
12295
+ height: "large",
12296
+ amplitude: "bold",
12297
+ rhythm: "double",
12298
+ symmetry: "symmetrical"
12299
+ },
12300
+ size: "large",
12301
+ heightExpression: largeHeight,
12302
+ shape: {
12303
+ kind: "wave",
12304
+ mask: "bold"
12305
+ }
12306
+ },
12307
+ {
12308
+ intent: "wave-edge-drift",
12309
+ optionId: asBoundaryOptionId("break:wave-drift"),
12310
+ family: "wave",
12311
+ variantId: "drift",
12312
+ label: "Drift wave",
12313
+ variantLabel: "Drift",
12314
+ treatment: {
12315
+ kind: "wave-edge",
12316
+ height: "medium",
12317
+ amplitude: "balanced",
12318
+ rhythm: "double",
12319
+ symmetry: "drift"
12320
+ },
12321
+ size: "medium",
12322
+ heightExpression: mediumHeight,
12323
+ shape: {
12324
+ kind: "wave",
12325
+ mask: "drift"
12326
+ }
12327
+ },
12328
+ {
12329
+ intent: "angle-edge-subtle",
12330
+ optionId: asBoundaryOptionId("break:angle-subtle"),
12331
+ family: "angle",
12332
+ variantId: "subtle",
12333
+ label: "Subtle angle",
12334
+ variantLabel: "Subtle",
12335
+ treatment: {
12336
+ kind: "angle-edge",
12337
+ height: "compact",
12338
+ slope: "subtle",
12339
+ direction: "forward"
12340
+ },
12341
+ size: "compact",
12342
+ heightExpression: compactHeight,
12343
+ shape: {
12344
+ kind: "angle",
12345
+ polygon: {
12346
+ startTopPercent: 34,
12347
+ endTopPercent: 18
12348
+ }
12349
+ }
12350
+ },
12351
+ {
12352
+ intent: "angle-edge",
12353
+ optionId: asBoundaryOptionId("break:angle-balanced"),
12354
+ family: "angle",
12355
+ variantId: "balanced",
12356
+ label: "Balanced angle",
12357
+ variantLabel: "Balanced",
12358
+ treatment: {
12359
+ kind: "angle-edge",
12360
+ height: "medium",
12361
+ slope: "balanced",
12362
+ direction: "forward"
12363
+ },
12364
+ size: "medium",
12365
+ heightExpression: mediumHeight,
12366
+ shape: {
12367
+ kind: "angle",
12368
+ polygon: {
12369
+ startTopPercent: 42,
12370
+ endTopPercent: 8
12371
+ }
12372
+ }
12373
+ },
12374
+ {
12375
+ intent: "angle-edge-steep",
12376
+ optionId: asBoundaryOptionId("break:angle-steep"),
12377
+ family: "angle",
12378
+ variantId: "steep",
12379
+ label: "Steep angle",
12380
+ variantLabel: "Steep",
12381
+ treatment: {
12382
+ kind: "angle-edge",
12383
+ height: "large",
12384
+ slope: "steep",
12385
+ direction: "forward"
12386
+ },
12387
+ size: "large",
12388
+ heightExpression: largeHeight,
12389
+ shape: {
12390
+ kind: "angle",
12391
+ polygon: {
12392
+ startTopPercent: 54,
12393
+ endTopPercent: 0
12394
+ }
12395
+ }
12396
+ }
12397
+ ]);
11921
12398
  //#endregion
11922
12399
  //#region ../theme-core/src/site-styles/sectionTransitions.ts
11923
12400
  function boundaryRuntimeMetrics(family, size, heightExpression) {
@@ -11928,42 +12405,106 @@ function boundaryRuntimeMetrics(family, size, heightExpression) {
11928
12405
  reserveCss: `calc((${heightExpression}) / 2)`
11929
12406
  };
11930
12407
  }
11931
- 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");
12408
+ new Map(transitionCatalogueEntries.map((entry) => [entry.intent, entry]));
12409
+ new Map(transitionCatalogueEntries.map((entry) => [entry.intent, boundaryRuntimeMetrics(entry.family, entry.size, entry.heightExpression)]));
12410
+ /**
12411
+ * The catalogue's compile-time coverage check guarantees an entry per
12412
+ * decorative intent, so a miss here is a broken invariant, not bad input.
12413
+ */
12414
+ function requireCatalogueValue(values, intent) {
12415
+ const value = values.get(intent);
12416
+ if (value === void 0) throw new Error(`Transition catalogue has no entry for ${intent}`);
12417
+ return value;
12418
+ }
11932
12419
  const noneBoundaryOption = {
11933
12420
  id: asBoundaryOptionId("break:none"),
11934
12421
  label: "None",
11935
12422
  transitionAfter: "none",
11936
12423
  treatment: { kind: "none" }
11937
12424
  };
11938
- const softBoundaryOption = {
11939
- id: asBoundaryOptionId("break:soft"),
11940
- label: "Soft",
11941
- transitionAfter: "soft-fade-short",
11942
- treatment: {
11943
- kind: "soft-fade",
11944
- height: "medium",
11945
- curve: "soft"
11946
- }
12425
+ const boundaryOptionByIntent = new Map(transitionCatalogueEntries.map((entry) => [entry.intent, {
12426
+ id: entry.optionId,
12427
+ label: entry.label,
12428
+ transitionAfter: entry.intent,
12429
+ treatment: entry.treatment
12430
+ }]));
12431
+ function boundaryOptionForTransitionIntent(intent) {
12432
+ return requireCatalogueValue(boundaryOptionByIntent, intent);
12433
+ }
12434
+ const softBoundaryOption = boundaryOptionForTransitionIntent("soft-fade-short");
12435
+ const spaciousBoundaryOption = boundaryOptionForTransitionIntent("soft-fade-long");
12436
+ boundaryOptionForTransitionIntent("soft-fade-expansive");
12437
+ boundaryOptionForTransitionIntent("wave-edge");
12438
+ boundaryOptionForTransitionIntent("wave-edge-balanced");
12439
+ boundaryOptionForTransitionIntent("wave-edge-gentle");
12440
+ boundaryOptionForTransitionIntent("wave-edge-bold");
12441
+ boundaryOptionForTransitionIntent("wave-edge-drift");
12442
+ boundaryOptionForTransitionIntent("angle-edge-subtle");
12443
+ boundaryOptionForTransitionIntent("angle-edge");
12444
+ boundaryOptionForTransitionIntent("angle-edge-steep");
12445
+ /**
12446
+ * Must remain non-empty; downstream code indexes `[0]` as the documented default.
12447
+ */
12448
+ const boundaryOptions = [noneBoundaryOption, ...transitionCatalogueEntries.map((entry) => boundaryOptionForTransitionIntent(entry.intent))];
12449
+ const noneTransitionVariant = {
12450
+ familyId: "none",
12451
+ variantId: "none",
12452
+ label: "None",
12453
+ boundaryOption: noneBoundaryOption
11947
12454
  };
11948
- const spaciousBoundaryOption = {
11949
- id: asBoundaryOptionId("break:spacious"),
11950
- label: "Spacious",
11951
- transitionAfter: "soft-fade-long",
11952
- treatment: {
11953
- kind: "soft-fade",
11954
- height: "large",
11955
- curve: "spacious"
11956
- }
12455
+ function transitionVariantForEntry(entry) {
12456
+ return {
12457
+ familyId: entry.family,
12458
+ variantId: entry.variantId,
12459
+ label: entry.variantLabel,
12460
+ boundaryOption: boundaryOptionForTransitionIntent(entry.intent)
12461
+ };
12462
+ }
12463
+ const sectionTransitionFamilies = [{
12464
+ id: "none",
12465
+ label: "None",
12466
+ variants: [noneTransitionVariant]
12467
+ }, ...transitionCatalogueFamilies.map((family) => ({
12468
+ id: family.id,
12469
+ label: family.label,
12470
+ variants: requireNonEmptyReadonlyArray(transitionCatalogueEntries.filter((entry) => entry.family === family.id).map(transitionVariantForEntry), `Transition family ${family.id} has no catalogue entries.`)
12471
+ }))];
12472
+ new Map(boundaryOptions.map((option) => [option.id, option]));
12473
+ new Map(boundaryOptions.map((option) => [stableTreatmentKey(option.treatment), option]));
12474
+ new Map(sectionTransitionFamilies.flatMap((family) => family.variants.map((variant) => [variant.boundaryOption.id, variant])));
12475
+ new Map(sectionTransitionFamilies.map((family) => [family.id, family]));
12476
+ function stableTreatmentKey(treatment) {
12477
+ switch (treatment.kind) {
12478
+ case "none": return "none";
12479
+ case "soft-fade": return `${treatment.kind}:${treatment.height}:${treatment.curve}`;
12480
+ case "wave-edge": return [
12481
+ treatment.kind,
12482
+ treatment.height,
12483
+ treatment.amplitude,
12484
+ treatment.rhythm,
12485
+ treatment.symmetry
12486
+ ].join(":");
12487
+ case "angle-edge": return [
12488
+ treatment.kind,
12489
+ treatment.height,
12490
+ treatment.slope,
12491
+ treatment.direction
12492
+ ].join(":");
12493
+ case "legacy-unsupported": return `${treatment.kind}:${treatment.boundaryOptionId}`;
12494
+ }
12495
+ }
12496
+ requireThemeColorToken$1("background");
12497
+ function requireThemeColorToken$1(value) {
12498
+ const token = parseThemeColorToken(value);
12499
+ if (!token) throw new Error(`Expected a theme color token. Received: ${value}`);
12500
+ return token;
12501
+ }
12502
+ //#endregion
12503
+ //#region ../theme-core/src/site-styles/compilationPlan.ts
12504
+ const defaultHeaderBrandPreferences = {
12505
+ brandDisplay: "auto",
12506
+ logoSize: "auto"
11957
12507
  };
11958
- asBoundaryOptionId("break:expansive");
11959
- asBoundaryOptionId("break:wave");
11960
- asBoundaryOptionId("break:wave-balanced");
11961
- asBoundaryOptionId("break:wave-gentle");
11962
- asBoundaryOptionId("break:wave-bold");
11963
- asBoundaryOptionId("break:wave-drift");
11964
- asBoundaryOptionId("break:angle-subtle");
11965
- asBoundaryOptionId("break:angle-balanced");
11966
- asBoundaryOptionId("break:angle-steep");
11967
12508
  asBoundaryOptionId("break:unknown");
11968
12509
  const pageDesignUserPinnedAppearanceChoiceSchema = z.object({
11969
12510
  kind: z.literal("user-pinned"),
@@ -12090,14 +12631,11 @@ function validateUniquePageDesignPins(intent, ctx) {
12090
12631
  label: "block Look pin"
12091
12632
  });
12092
12633
  addDuplicateStringIssues(ctx, {
12093
- values: intent.boundaryPins.map((pin) => boundaryKey(pin.previousBlockId, pin.nextBlockId)),
12634
+ values: intent.boundaryPins.map((pin) => makeBoundaryId(pin.previousBlockId, pin.nextBlockId)),
12094
12635
  path: ["boundaryPins"],
12095
12636
  label: "boundary pin"
12096
12637
  });
12097
12638
  }
12098
- function boundaryKey(previousBlockId, nextBlockId) {
12099
- return makeBoundaryId(previousBlockId, nextBlockId);
12100
- }
12101
12639
  //#endregion
12102
12640
  //#region ../theme-core/src/accordions/siteStyleDefaults.ts
12103
12641
  /**
@@ -13725,6 +14263,13 @@ z.object({
13725
14263
  fields: nonEmptyRuntimeStyleFieldNamesSchema,
13726
14264
  authority: styleAuthoritySchema
13727
14265
  }).strict();
14266
+ asPageFlowPresetId("flow:quiet"), noneBoundaryOption.id, asPageFlowPresetId("flow:balanced"), softBoundaryOption.id, asPageFlowPresetId("flow:expressive"), spaciousBoundaryOption.id;
14267
+ asPageFlowPresetId("generated-default");
14268
+ asSiteStyleId("site-style:south-west-twerk-school");
14269
+ asAppearancePresetId("hero-brand-scrim-fixed-frame");
14270
+ asLayoutVariantKey("classic");
14271
+ asLayoutVariantKey("micro");
14272
+ asBoundaryOptionId("break:wave");
13728
14273
  //#endregion
13729
14274
  //#region ../theme-core/src/site-styles/runtimeCompiler.ts
13730
14275
  function defineSectionForegroundRuntimeTokens(input) {
@@ -13748,7 +14293,7 @@ function defineComponentRuntimeRules(rules) {
13748
14293
  }
13749
14294
  /**
13750
14295
  * Default design rules translate semantic page-level choices into the current
13751
- * runtime's section background and transition style-group vocabulary.
14296
+ * runtime's section background vocabulary.
13752
14297
  */
13753
14298
  const defaultDesignRuntimeRules = defineDesignRuntimeRules({
13754
14299
  sectionSurfaces: {
@@ -13783,8 +14328,7 @@ const defaultDesignRuntimeRules = defineDesignRuntimeRules({
13783
14328
  color: "surface",
13784
14329
  opacity: .88
13785
14330
  }
13786
- },
13787
- transitionClassName: (transition, fromSurface, toSurface) => transition === "none" ? null : `site-style-transition-${transition}-from-${fromSurface}-to-${toSurface}`
14331
+ }
13788
14332
  });
13789
14333
  /**
13790
14334
  * Default component rules translate frame and item-surface semantics into the
@@ -15519,19 +16063,11 @@ const curatedSiteStyles = [
15519
16063
  })
15520
16064
  ];
15521
16065
  new Map(curatedSiteStyles.map((style) => [style.id, style]));
15522
- asPageFlowPresetId("generated-default");
15523
- asSiteStyleId("site-style:south-west-twerk-school");
15524
- asAppearancePresetId("hero-brand-scrim-fixed-frame");
15525
- asLayoutVariantKey("classic");
15526
- asLayoutVariantKey("micro");
15527
- asBoundaryOptionId("break:wave");
15528
- asPageFlowPresetId("flow:quiet"), noneBoundaryOption.id, asPageFlowPresetId("flow:balanced"), softBoundaryOption.id, asPageFlowPresetId("flow:expressive"), spaciousBoundaryOption.id;
15529
16066
  //#endregion
15530
16067
  //#region ../theme-core/src/site-styles/resolver.ts
15531
16068
  const blockDesignFallback = {
15532
16069
  sectionSurface: "base",
15533
16070
  contentFrame: plainFrame,
15534
- transitionAfter: "none",
15535
16071
  sectionHeight: "default",
15536
16072
  heroLegibility: "none",
15537
16073
  imageSurfaceTreatment: { kind: "none" },
@@ -15542,7 +16078,7 @@ const blockDesignFallback = {
15542
16078
  accordionIconTreatment: null,
15543
16079
  composition: null
15544
16080
  };
15545
- blockDesignFallback.sectionSurface, blockDesignFallback.contentFrame, blockDesignFallback.transitionAfter, blockDesignFallback.sectionHeight, blockDesignFallback.heroLegibility, blockDesignFallback.imageSurfaceTreatment, blockDesignFallback.imageSurfaceMotion, blockDesignFallback.tileTreatment, blockDesignFallback.eventListTreatment, blockDesignFallback.eyebrowTreatment, blockDesignFallback.accordionIconTreatment, blockDesignFallback.composition;
16081
+ blockDesignFallback.sectionSurface, blockDesignFallback.contentFrame, blockDesignFallback.sectionHeight, blockDesignFallback.heroLegibility, blockDesignFallback.imageSurfaceTreatment, blockDesignFallback.imageSurfaceMotion, blockDesignFallback.tileTreatment, blockDesignFallback.eventListTreatment, blockDesignFallback.eyebrowTreatment, blockDesignFallback.accordionIconTreatment, blockDesignFallback.composition;
15546
16082
  //#endregion
15547
16083
  //#region ../theme-core/src/site-styles/siteChromeBackgrounds.ts
15548
16084
  const siteChromeBackgroundColorTokens = toSiteChromeBackgroundColorTokens(backgroundAppearanceColorTokenNames);
@@ -16354,7 +16890,8 @@ const siteOptionSources = [
16354
16890
  "eventCategories",
16355
16891
  "eventSeries",
16356
16892
  "venues",
16357
- "staffMembers"
16893
+ "staffMembers",
16894
+ "appointmentServiceCategories"
16358
16895
  ];
16359
16896
  const mediaDeliverySchema = z.object({
16360
16897
  sizes: z.string().optional(),
@@ -18603,9 +19140,7 @@ function navRow(opts) {
18603
19140
  rel: { $bind: { from: `${childItemName}.rel` } },
18604
19141
  "data-active": { $bind: { from: `${childItemName}.active` } }
18605
19142
  }, [text({ as: "span" }, bind(`${childItemName}.label`))], repeat(`${itemName}.children`, childItemName));
18606
- const dropdown = el("div", { className: "nav-dropdown rb-relative" }, [button({
18607
- type: "button",
18608
- variantId: "",
19143
+ const dropdown = el("div", { className: "nav-dropdown rb-relative" }, [el("headerControl", {
18609
19144
  className: prependClassName("nav-dropdown-trigger", linkClassName),
18610
19145
  "aria-haspopup": "menu",
18611
19146
  "aria-expanded": "false",
@@ -18673,9 +19208,7 @@ function navColumn(opts) {
18673
19208
  const dropdown = el("div", {
18674
19209
  className: "nav-mobile-dropdown",
18675
19210
  "data-nav-mobile-dropdown": "true"
18676
- }, [button({
18677
- type: "button",
18678
- variantId: "",
19211
+ }, [el("headerControl", {
18679
19212
  className: triggerClassName,
18680
19213
  "aria-expanded": "false",
18681
19214
  "aria-controls": childrenId,
@@ -24982,6 +25515,49 @@ const layoutTransforms = [
24982
25515
  footerLogoMediaClassTransform,
24983
25516
  footerLogoTextVisibleTransform
24984
25517
  ];
25518
+ //#endregion
25519
+ //#region ../blocks/src/system/transforms/registry/chromeLogo.ts
25520
+ const chromeLogoSchema = z.object({ surface: z.enum([
25521
+ "header-root",
25522
+ "header-mobile-panel",
25523
+ "footer-root"
25524
+ ]) });
25525
+ /** The brand foreground shares the logo's surface; navigation may own a separate capsule. */
25526
+ function chromeSurfaceTextToken(surface, theme, palette) {
25527
+ switch (surface) {
25528
+ case "header-root": {
25529
+ const header = theme.header;
25530
+ const foreground = resolveHeaderRootForeground(header, palette, resolveHeaderVisualStyles(header).isTransparent);
25531
+ return foreground.kind === "known" ? foreground.roles.text : resolveHeaderLeafTextColor(header);
25532
+ }
25533
+ case "header-mobile-panel": return theme.header?.dropdownStyle?.textColor ?? "text";
25534
+ case "footer-root": {
25535
+ const foreground = resolveFooterRootForeground(theme.footer, palette);
25536
+ return foreground.kind === "known" ? foreground.roles.text : void 0;
25537
+ }
25538
+ }
25539
+ }
25540
+ function readChromeTheme(viewModel) {
25541
+ return asPartialObject(asPartialObject(viewModel?.["$root"])?.theme) ?? {};
25542
+ }
25543
+ function resolveChromeSurfaceTone(surface, context) {
25544
+ return surfaceToneFromForegroundToken(context.theme.palette, chromeSurfaceTextToken(surface, readChromeTheme(context.viewModel), context.theme.palette));
25545
+ }
25546
+ const chromeLogoTransforms = [{
25547
+ id: "layout.chromeLogo",
25548
+ kind: "formatter",
25549
+ summary: "Select the light- or dark-background site logo for a header or footer surface",
25550
+ schema: chromeLogoSchema,
25551
+ run: (value, options, context) => {
25552
+ const content = asPartialObject(value);
25553
+ const variants = asPartialObject(content?.logoVariants);
25554
+ if (!variants) return content?.logo ?? null;
25555
+ return selectLogoVariant(resolveChromeSurfaceTone(options.surface, context), {
25556
+ forLightBackgrounds: variants.forLightBackgrounds ?? null,
25557
+ forDarkBackgrounds: variants.forDarkBackgrounds ?? null
25558
+ });
25559
+ }
25560
+ }];
24985
25561
  const headerRuntimeTransforms = [{
24986
25562
  id: "layout.headerRuntimeContract",
24987
25563
  kind: "formatter",
@@ -25189,46 +25765,42 @@ const whenTransformed = (from, transformId, equals = true) => (node) => ({
25189
25765
  equals
25190
25766
  }
25191
25767
  });
25192
- const logoRow = link({
25768
+ /** Draw whichever site logo suits the surface this row sits on. */
25769
+ const bindChromeLogo = (surface) => bind("content", { transforms: [{
25770
+ id: "layout.chromeLogo",
25771
+ options: { surface }
25772
+ }] });
25773
+ /**
25774
+ * The brand link. The logo is chosen per surface because the open mobile menu
25775
+ * paints its own background, which may be the opposite tone to the header.
25776
+ */
25777
+ const createLogoRow = (surface) => link({
25193
25778
  href: "/",
25194
25779
  className: bindProp("$root.theme.header.logo", {
25195
25780
  transforms: pipe(tx("layout.headerLogoClass")),
25196
25781
  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"
25197
25782
  })
25198
- }, [
25199
- media({ className: bindProp("$root.theme.header.logo", {
25200
- transforms: pipe(tx("layout.headerLogoMediaClass", { base: "rb-header-logo-sm rb-w-auto rb-transition-all rb-duration-300" })),
25201
- fallback: "rb-header-logo-sm rb-w-auto rb-transition-all rb-duration-300"
25202
- }) }, when("content.logo"), bind("content.logo")),
25203
- stack({ className: "rb-contents" }, [media({ className: bindProp("$root.theme.header.logo", {
25204
- transforms: pipe(tx("layout.headerLogoMediaClass", { base: "rb-header-logo-sm rb-w-auto rb-transition-all rb-duration-300" })),
25205
- fallback: "rb-header-logo-sm rb-w-auto rb-transition-all rb-duration-300"
25206
- }) }, when("site.logo"), bind("site.logo"))], when("content.logo", { not: true })),
25207
- text({
25208
- as: "strong",
25209
- className: "header-logo-text rb-truncate"
25210
- }, whenTransformed("$root.theme.header.logo", "layout.headerLogoTextVisible"), bind("site.title", { fallback: "Your Site" }))
25211
- ]);
25783
+ }, [media({ className: bindProp("$root.theme.header.logo", {
25784
+ transforms: pipe(tx("layout.headerLogoMediaClass", { base: "rb-header-logo-sm rb-w-auto rb-transition-all rb-duration-300" })),
25785
+ fallback: "rb-header-logo-sm rb-w-auto rb-transition-all rb-duration-300"
25786
+ }) }, when("content.logo"), bindChromeLogo(surface)), text({
25787
+ as: "strong",
25788
+ className: "header-logo-text rb-truncate"
25789
+ }, whenTransformed("$root.theme.header.logo", "layout.headerLogoTextVisible"), bind("site.title", { fallback: "Your Site" }))]);
25790
+ const logoRow = createLogoRow("header-root");
25212
25791
  const centeredLogoRow = link({
25213
25792
  href: "/",
25214
25793
  className: bindProp("$root.theme.header.logo", {
25215
25794
  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" })),
25216
25795
  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"
25217
25796
  })
25218
- }, [
25219
- media({ className: bindProp("$root.theme.header.logo", {
25220
- transforms: pipe(tx("layout.headerLogoMediaClass", { base: "rb-header-logo-lg rb-w-auto rb-transition-all rb-duration-300" })),
25221
- fallback: "rb-header-logo-lg rb-w-auto rb-transition-all rb-duration-300"
25222
- }) }, when("content.logo"), bind("content.logo")),
25223
- stack({ className: "rb-contents" }, [media({ className: bindProp("$root.theme.header.logo", {
25224
- transforms: pipe(tx("layout.headerLogoMediaClass", { base: "rb-header-logo-lg rb-w-auto rb-transition-all rb-duration-300" })),
25225
- fallback: "rb-header-logo-lg rb-w-auto rb-transition-all rb-duration-300"
25226
- }) }, when("site.logo"), bind("site.logo"))], when("content.logo", { not: true })),
25227
- text({
25228
- as: "strong",
25229
- className: "header-logo-text"
25230
- }, whenTransformed("$root.theme.header.logo", "layout.headerLogoTextVisible"), bind("site.title", { fallback: "Your Site" }))
25231
- ]);
25797
+ }, [media({ className: bindProp("$root.theme.header.logo", {
25798
+ transforms: pipe(tx("layout.headerLogoMediaClass", { base: "rb-header-logo-lg rb-w-auto rb-transition-all rb-duration-300" })),
25799
+ fallback: "rb-header-logo-lg rb-w-auto rb-transition-all rb-duration-300"
25800
+ }) }, when("content.logo"), bindChromeLogo("header-root")), text({
25801
+ as: "strong",
25802
+ className: "header-logo-text"
25803
+ }, whenTransformed("$root.theme.header.logo", "layout.headerLogoTextVisible"), bind("site.title", { fallback: "Your Site" }))]);
25232
25804
  const createNavRow = (className, align = "end") => navRow({
25233
25805
  className: `${className} header-nav-row`,
25234
25806
  align,
@@ -25268,10 +25840,8 @@ const mobileToggleIcon = stack({
25268
25840
  }
25269
25841
  ]);
25270
25842
  const mobileToggleButton = {
25271
- type: "button",
25843
+ type: "headerControl",
25272
25844
  props: {
25273
- type: "button",
25274
- variantId: "",
25275
25845
  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`,
25276
25846
  "aria-label": "Open menu",
25277
25847
  "aria-expanded": "false",
@@ -25281,10 +25851,8 @@ const mobileToggleButton = {
25281
25851
  children: [mobileToggleIcon]
25282
25852
  };
25283
25853
  const mobileOverlayToggleButton = {
25284
- type: "button",
25854
+ type: "headerControl",
25285
25855
  props: {
25286
- type: "button",
25287
- variantId: "",
25288
25856
  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",
25289
25857
  "aria-label": "Open menu",
25290
25858
  "aria-expanded": "false",
@@ -25308,7 +25876,7 @@ const mobileOverlayHeader = inline({
25308
25876
  align: "center",
25309
25877
  justify: "between",
25310
25878
  style: borderColorStyle("border")
25311
- }, [logoRow, mobileOverlayToggleButton]);
25879
+ }, [createLogoRow("header-mobile-panel"), mobileOverlayToggleButton]);
25312
25880
  const mobileOverlayBody = stack({
25313
25881
  className: "rb-flex-1 rb-px-6 rb-py-6",
25314
25882
  gap: "md",
@@ -25495,7 +26063,10 @@ const brandLogo = link({
25495
26063
  options: { base: "rb-h-10 rb-w-auto" }
25496
26064
  }],
25497
26065
  fallback: "rb-h-10 rb-w-auto"
25498
- } } }, when("module.showLogo", { equals: true }), when("content.logo"), bind("content.logo")), text({
26066
+ } } }, when("module.showLogo", { equals: true }), when("content.logo"), bind("content", { transforms: [{
26067
+ id: "layout.chromeLogo",
26068
+ options: { surface: "footer-root" }
26069
+ }] })), text({
25499
26070
  as: "strong",
25500
26071
  className: "footer-logo-text rb-nav-text"
25501
26072
  }, when("module.showTitle", { equals: true }), bind("site.title", { fallback: "Your Site" }))], when("module.kind", { equals: "brand" }));
@@ -27188,6 +27759,15 @@ const appointmentServicesBlockDefinition = {
27188
27759
  required: false,
27189
27760
  ui: { intent: "content" }
27190
27761
  },
27762
+ createSiteOptionSelectField({
27763
+ id: "categoryId",
27764
+ label: "Category",
27765
+ description: "Show one category (with its heading and intro), or leave it on All categories to show everything grouped.",
27766
+ required: false,
27767
+ multiple: false,
27768
+ optionSource: "appointmentServiceCategories",
27769
+ ui: { intent: "content" }
27770
+ }),
27191
27771
  sectionStylesField({
27192
27772
  id: "_sectionStyles",
27193
27773
  label: "Section styles",
@@ -27222,6 +27802,7 @@ const appointmentServicesBlockDefinition = {
27222
27802
  richText({ className: "rb-prose rb-max-w-none" }, bind("content.description"), when("content.description")),
27223
27803
  el("appointment-services", {
27224
27804
  sectionHeading: { $bind: { from: "content.heading" } },
27805
+ categoryId: { $bind: { from: "content.categoryId" } },
27225
27806
  services: { $bind: { from: "data.services" } },
27226
27807
  pathname: { $bind: { from: "$root.pathname" } },
27227
27808
  servicePathPrefix: { $bind: { from: "$root.appointmentServicePathPrefix" } }
@@ -28211,6 +28792,12 @@ const occurrenceContextSchema = z.object({
28211
28792
  capacityOverride: z.number().nullable().optional(),
28212
28793
  overrides: z.record(z.string(), z.unknown()).nullable().optional()
28213
28794
  }).nullable();
28795
+ //#endregion
28796
+ //#region ../blocks/src/system/runtime/api/readAuthority.ts
28797
+ const browserReadAuthoritySchema = z.discriminatedUnion("kind", [z.object({ kind: z.literal("published") }).strict(), z.object({
28798
+ kind: z.literal("preview"),
28799
+ token: z.string().min(1)
28800
+ }).strict()]);
28214
28801
  const unsupportedEventRegistrationPageSurfaceSubjectSchema = z.object({
28215
28802
  kind: z.literal("unsupported"),
28216
28803
  reason: z.enum([
@@ -28321,6 +28908,33 @@ function normalizeEventCalendarDisplayMode$1(input) {
28321
28908
  if (isEventCalendarDisplayMode(input.variant)) return input.variant;
28322
28909
  return isEventCalendarDisplayMode(input.displayMode) ? input.displayMode : void 0;
28323
28910
  }
28911
+ /** One closed authority for the projections required by each rendered mode. */
28912
+ function resolveEventCalendarReadPlan(input) {
28913
+ const mode = normalizeEventCalendarDisplayMode$1(input) ?? "combined";
28914
+ switch (mode) {
28915
+ case "combined": return {
28916
+ mode,
28917
+ jobs: "both",
28918
+ readProfile: "listing-card"
28919
+ };
28920
+ case "list": return {
28921
+ mode,
28922
+ jobs: "list",
28923
+ readProfile: "listing-card"
28924
+ };
28925
+ case "calendar": return {
28926
+ mode,
28927
+ jobs: "calendar",
28928
+ readProfile: "listing-card"
28929
+ };
28930
+ case "timetable":
28931
+ case "week-board": return {
28932
+ mode,
28933
+ jobs: "calendar",
28934
+ readProfile: "timetable"
28935
+ };
28936
+ }
28937
+ }
28324
28938
  function isEventCalendarDefaultView(value) {
28325
28939
  return typeof value === "string" && eventCalendarDefaultViewValues.includes(value);
28326
28940
  }
@@ -28515,6 +29129,7 @@ const eventRegistrationSourceSchema = z.object({
28515
29129
  apiBaseUrl: z.string().optional(),
28516
29130
  portalToken: z.string().nullable().optional(),
28517
29131
  previewToken: z.string().nullable().optional(),
29132
+ readAuthority: browserReadAuthoritySchema.optional(),
28518
29133
  ...eventRegistrationHydrationSchemaShape,
28519
29134
  events: z.array(eventRegistrationPublicEventSchema).nullable().optional(),
28520
29135
  wholeSeriesRunEvents: z.array(eventRegistrationPublicEventSchema).nullable().optional(),
@@ -28552,6 +29167,7 @@ z.object({
28552
29167
  apiBaseUrl: z.string().optional(),
28553
29168
  portalToken: z.string().nullable().optional(),
28554
29169
  previewToken: z.string().nullable().optional(),
29170
+ readAuthority: browserReadAuthoritySchema.optional(),
28555
29171
  stage: previewStageSchema.optional()
28556
29172
  });
28557
29173
  function buildEventRegistrationDisplayFromScopedEvents(source, scopedSourceEvents) {
@@ -28810,6 +29426,7 @@ const eventRegistrationBlockDefinition = {
28810
29426
  text({ as: "h2" }, bind("content.heading"), when("content.heading")),
28811
29427
  richText({ className: "rb-prose rb-max-w-none" }, bind("content.description"), when("content.description")),
28812
29428
  eventRegistration(withApiBindings({
29429
+ readAuthority: { $bind: { from: "$root.readAuthority" } },
28813
29430
  occurrenceContext: { $bind: { from: "$root.occurrenceContext" } },
28814
29431
  subject: { $bind: { from: "$root.subject" } },
28815
29432
  portalToken: { $bind: {
@@ -29442,8 +30059,7 @@ function resolveEventListPaginationAction(input) {
29442
30059
  //#endregion
29443
30060
  //#region ../blocks/src/system/blocks/events/shared/calendarWindow.ts
29444
30061
  function resolveCalendarReadProfile(content) {
29445
- const mode = normalizeEventCalendarDisplayMode$1(content);
29446
- return mode === "timetable" || mode === "week-board" ? "timetable" : "listing-card";
30062
+ return resolveEventCalendarReadPlan(content).readProfile;
29447
30063
  }
29448
30064
  /** Runtime picker sentinels and bound loader IDs must describe the same query. */
29449
30065
  function normalizeCalendarFilterId(value) {
@@ -29553,6 +30169,7 @@ const eventCollectionSourceSchemaShape = {
29553
30169
  events: z.array(publicEventSchema).nullable().optional(),
29554
30170
  siteId: z.string(),
29555
30171
  apiBaseUrl: z.string().optional(),
30172
+ readAuthority: browserReadAuthoritySchema.optional(),
29556
30173
  stage: previewStageSchema.optional(),
29557
30174
  listLayout: eventLayoutSchema.optional(),
29558
30175
  listColumns: columnOptionSchema.optional(),
@@ -29605,7 +30222,6 @@ const eventCollectionDisplaySchemaShape = {
29605
30222
  const eventCollectionHydrationSchema = z.object({
29606
30223
  siteId: z.string(),
29607
30224
  calendarWindow: calendarWindowPageSchema.optional(),
29608
- stage: previewStageSchema.optional(),
29609
30225
  prefetchedEvents: z.boolean(),
29610
30226
  eventSurface: eventSurfaceScopeSchema$1,
29611
30227
  filterEventPresets: z.string().nullable(),
@@ -29680,7 +30296,6 @@ function buildEventCollectionHydration(source, now = /* @__PURE__ */ new Date())
29680
30296
  return {
29681
30297
  calendarWindow: source.calendarWindow ?? void 0,
29682
30298
  siteId: source.siteId,
29683
- stage: source.stage,
29684
30299
  prefetchedEvents: source.events != null,
29685
30300
  eventSurface: selected ? "all" : normalizeEventSurfaceScope(source.eventSurface),
29686
30301
  filterEventPresets: selected ? null : normalizeEventSurfacePresetsCsv(source.filterEventPresets),
@@ -29700,6 +30315,7 @@ const eventListingSourceSchema = z.object({
29700
30315
  events: z.array(publicEventSchema).nullable().optional(),
29701
30316
  siteId: z.string(),
29702
30317
  apiBaseUrl: z.string().optional(),
30318
+ readAuthority: browserReadAuthoritySchema.optional(),
29703
30319
  stage: previewStageSchema.optional(),
29704
30320
  layout: eventLayoutSchema.optional(),
29705
30321
  columns: columnOptionSchema.optional(),
@@ -29740,7 +30356,6 @@ const eventListingDisplaySchema = z.object({
29740
30356
  });
29741
30357
  const eventListingHydrationSchema = z.object({
29742
30358
  siteId: z.string(),
29743
- stage: previewStageSchema.optional(),
29744
30359
  eventsPerPage: eventPageSizeSchema,
29745
30360
  paginationAction: eventListPaginationActionSchema,
29746
30361
  showFilters: z.boolean(),
@@ -29763,6 +30378,7 @@ const eventListingRenderSchema = z.object({
29763
30378
  z.object({
29764
30379
  siteId: z.string(),
29765
30380
  apiBaseUrl: z.string().optional(),
30381
+ readAuthority: browserReadAuthoritySchema.optional(),
29766
30382
  stage: previewStageSchema.optional()
29767
30383
  });
29768
30384
  const eventListingBlockRuntime = defineProgressiveBlockRuntime({
@@ -29797,7 +30413,6 @@ const eventListingBlockRuntime = defineProgressiveBlockRuntime({
29797
30413
  },
29798
30414
  hydration: {
29799
30415
  siteId: source.siteId,
29800
- stage: source.stage,
29801
30416
  eventsPerPage: pageSize,
29802
30417
  paginationAction: resolveEventListPaginationAction({
29803
30418
  paginationMode: source.paginationMode,
@@ -30079,6 +30694,7 @@ const eventListingBlockDefinition = {
30079
30694
  rootType: "stack",
30080
30695
  rootProps: { gap: "lg" },
30081
30696
  children: [...eventSectionHeaderLayoutNodes(), el("event-listing", withApiBindings({
30697
+ readAuthority: { $bind: { from: "$root.readAuthority" } },
30082
30698
  events: { $bind: { from: "data.events" } },
30083
30699
  stage: { $bind: {
30084
30700
  from: "$root.previewStage",
@@ -30276,6 +30892,7 @@ const eventCalendarRenderSchema = z.object({
30276
30892
  z.object({
30277
30893
  siteId: z.string(),
30278
30894
  apiBaseUrl: z.string().optional(),
30895
+ readAuthority: browserReadAuthoritySchema.optional(),
30279
30896
  stage: previewStageSchema.optional()
30280
30897
  });
30281
30898
  /**
@@ -30297,7 +30914,7 @@ function buildEventCalendarDisplay(source) {
30297
30914
  listColumns: source.listColumns ?? source.columns
30298
30915
  }),
30299
30916
  kind: "event-calendar",
30300
- displayMode: normalizeEventCalendarDisplayMode$1(source) ?? "combined",
30917
+ displayMode: resolveEventCalendarReadPlan(source).mode,
30301
30918
  className: source.className ?? null,
30302
30919
  events: (source.events ?? []).slice().sort((left, right) => new Date(left.startsAt).getTime() - new Date(right.startsAt).getTime()),
30303
30920
  boardTitle: normalizeOptionalText(source.boardTitle),
@@ -30314,13 +30931,16 @@ const eventCalendarBlockRuntime = defineProgressiveBlockRuntime({
30314
30931
  source: createZodCodec(eventCalendarSourceSchema),
30315
30932
  render: createZodCodec(eventCalendarRenderSchema)
30316
30933
  },
30317
- buildRender: (source) => ({
30318
- display: buildEventCalendarDisplay(source.calendarWindow && (source.variant ?? source.displayMode ?? "combined") !== "combined" && (source.variant ?? source.displayMode) !== "list" ? {
30319
- ...source,
30320
- events: source.calendarWindow.events
30321
- } : source),
30322
- hydration: buildEventCollectionHydration(source)
30323
- })
30934
+ buildRender: (source) => {
30935
+ const plan = resolveEventCalendarReadPlan(source);
30936
+ return {
30937
+ display: buildEventCalendarDisplay(source.calendarWindow && plan.jobs === "calendar" ? {
30938
+ ...source,
30939
+ events: source.calendarWindow.events
30940
+ } : source),
30941
+ hydration: buildEventCollectionHydration(source)
30942
+ };
30943
+ }
30324
30944
  });
30325
30945
  //#endregion
30326
30946
  //#region ../blocks/src/system/blocks/events/eventCalendarDataLoaders.ts
@@ -30470,6 +31090,7 @@ const eventCalendarLayout = [styledSection({
30470
31090
  rootType: "stack",
30471
31091
  rootProps: { gap: "lg" },
30472
31092
  children: [...eventSectionHeaderLayoutNodes({ splitClassName: "event-section-head event-section-head--split" }), el("event-calendar", withApiBindings({
31093
+ readAuthority: { $bind: { from: "$root.readAuthority" } },
30473
31094
  events: { $bind: { from: "data.events" } },
30474
31095
  calendarWindow: { $bind: { from: "data.calendarWindow" } },
30475
31096
  stage: { $bind: {
@@ -34033,6 +34654,7 @@ const shopSourceSchema = z.object({
34033
34654
  products: z.array(publicProductSchema).nullable().optional(),
34034
34655
  siteId: z.string().optional(),
34035
34656
  apiBaseUrl: z.string().optional(),
34657
+ readAuthority: browserReadAuthoritySchema.optional(),
34036
34658
  stage: previewStageSchema.optional()
34037
34659
  });
34038
34660
  const productVariantOptionDisplaySchema = z.object({
@@ -34200,6 +34822,7 @@ function resolveShowPricePerCredit(source) {
34200
34822
  z.object({
34201
34823
  siteId: z.string().optional(),
34202
34824
  apiBaseUrl: z.string().optional(),
34825
+ readAuthority: browserReadAuthoritySchema.optional(),
34203
34826
  stage: previewStageSchema.optional()
34204
34827
  });
34205
34828
  const shopBlockRuntime = defineProgressiveBlockRuntime({
@@ -34540,6 +35163,7 @@ const shopBlockDefinition = {
34540
35163
  baseClass: "",
34541
35164
  spacing: "spacious",
34542
35165
  children: sectionContainer([shop(withApiBindings({
35166
+ readAuthority: { $bind: { from: "$root.readAuthority" } },
34543
35167
  mode: "passes-memberships",
34544
35168
  showPasses: { $bind: {
34545
35169
  from: "content.showPasses",
@@ -34738,6 +35362,7 @@ const productListBlockDefinition = {
34738
35362
  baseClass: "",
34739
35363
  spacing: "spacious",
34740
35364
  children: sectionContainer([productList(withApiBindings({
35365
+ readAuthority: { $bind: { from: "$root.readAuthority" } },
34741
35366
  mode: "product-list",
34742
35367
  heading: { $bind: {
34743
35368
  from: "content.heading",
@@ -34880,6 +35505,7 @@ const productDetailBlockDefinition = {
34880
35505
  baseClass: "",
34881
35506
  spacing: "spacious",
34882
35507
  children: sectionContainer([productDetail(withApiBindings({
35508
+ readAuthority: { $bind: { from: "$root.readAuthority" } },
34883
35509
  mode: "product-detail",
34884
35510
  heading: { $bind: {
34885
35511
  from: "content.heading",
@@ -34996,6 +35622,7 @@ const cartBlockDefinition = {
34996
35622
  baseClass: "",
34997
35623
  spacing: "spacious",
34998
35624
  children: sectionContainer([cart(withApiBindings({
35625
+ readAuthority: { $bind: { from: "$root.readAuthority" } },
34999
35626
  mode: "cart",
35000
35627
  heading: { $bind: {
35001
35628
  from: "content.heading",
@@ -35079,6 +35706,7 @@ const checkoutBlockDefinition = {
35079
35706
  baseClass: "",
35080
35707
  spacing: "spacious",
35081
35708
  children: sectionContainer([checkout(withApiBindings({
35709
+ readAuthority: { $bind: { from: "$root.readAuthority" } },
35082
35710
  mode: "checkout",
35083
35711
  heading: { $bind: {
35084
35712
  from: "content.heading",
@@ -37739,8 +38367,8 @@ const builtinTransformDefinitions = [
37739
38367
  summary: "Choose the read projection required by the calendar display mode",
37740
38368
  schema: z.object({ job: z.enum(["list", "calendar"]) }),
37741
38369
  run(value, options) {
37742
- const mode = normalizeEventCalendarDisplayMode$1(asPartialObject(value) ?? {}) ?? "combined";
37743
- return options.job === "calendar" ? mode !== "list" : mode === "list" || mode === "combined";
38370
+ const plan = resolveEventCalendarReadPlan(asPartialObject(value) ?? {});
38371
+ return plan.jobs === "both" || plan.jobs === options.job;
37744
38372
  }
37745
38373
  },
37746
38374
  {
@@ -37753,6 +38381,7 @@ const builtinTransformDefinitions = [
37753
38381
  },
37754
38382
  ...formattingTransforms,
37755
38383
  ...layoutTransforms,
38384
+ ...chromeLogoTransforms,
37756
38385
  ...uiTransforms,
37757
38386
  ...mediaTransforms,
37758
38387
  ...backgroundTransforms,
@@ -38521,7 +39150,12 @@ const appointmentSetupServiceDraftSchema = z.object({
38521
39150
  venue: appointmentSetupVenueChoiceSchema,
38522
39151
  timezone: z.string().trim().min(1).nullable(),
38523
39152
  payment: appointmentSetupPaymentDraftSchema,
38524
- assignment: appointmentSetupServiceAssignmentDraftSchema
39153
+ assignment: appointmentSetupServiceAssignmentDraftSchema,
39154
+ /**
39155
+ * The service's category, or null for "Other" (issue 1403). Omitted leaves
39156
+ * an existing service's category alone and puts a new one in "Other".
39157
+ */
39158
+ categoryId: z.string().uuid().nullable().optional()
38525
39159
  }).superRefine((service, ctx) => {
38526
39160
  if (service.payment.kind !== "free" && (service.priceAmount === null || service.priceAmount <= 0)) ctx.addIssue({
38527
39161
  code: "custom",