@riverbankcms/sdk 0.121.0 → 0.124.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 (259) hide show
  1. package/README.md +14 -9
  2. package/dist/{PreviewEditorSidebar-lZ600tJx.mjs → PreviewEditorSidebar-DBmAJJkQ.mjs} +24 -41
  3. package/dist/{PreviewEditorUI-CTBWzLSb.mjs → PreviewEditorUI-CfGaz9cY.mjs} +3 -3
  4. package/dist/{PreviewQueryProvider-BHT8CJvZ.mjs → PreviewQueryProvider-BH-3-jSj.mjs} +1 -1
  5. package/dist/{SdkPreviewModeRuntime-DhPU58s7.mjs → SdkPreviewModeRuntime-BW9Z8j8T.mjs} +1020 -1234
  6. package/dist/{SiteChromeCustomizeContext-BkNvpzNZ.mjs → SiteChromeCustomizeContext-2z8moxYf.mjs} +1902 -1961
  7. package/dist/_dts/ai/src/contracts/proposals.d.ts +1236 -4152
  8. package/dist/_dts/api/src/appointmentEndpointDefinitions.d.ts +435 -0
  9. package/dist/_dts/api/src/bookingClosures.d.ts +3 -3
  10. package/dist/_dts/api/src/bookingConfig.d.ts +100 -75
  11. package/dist/_dts/api/src/bookingManagementEndpoints.d.ts +26 -35
  12. package/dist/_dts/api/src/bookingRecords.d.ts +4 -15
  13. package/dist/_dts/api/src/bookingVerticalCatalog.d.ts +746 -0
  14. package/dist/_dts/api/src/bookingVerticalPreset.d.ts +38 -0
  15. package/dist/_dts/api/src/bookingVerticals.d.ts +11 -652
  16. package/dist/_dts/api/src/bookings.d.ts +11 -9
  17. package/dist/_dts/api/src/cache-tags.d.ts +2 -2
  18. package/dist/_dts/api/src/commercePortalEndpoints.d.ts +10 -10
  19. package/dist/_dts/api/src/common/envelope.d.ts +2 -0
  20. package/dist/_dts/api/src/contentRuntime.d.ts +0 -17
  21. package/dist/_dts/api/src/courseEndpointDefinitions.d.ts +99 -0
  22. package/dist/_dts/api/src/courses.d.ts +22 -33
  23. package/dist/_dts/api/src/defineEndpointDefinitions.d.ts +14 -0
  24. package/dist/_dts/api/src/demoMutationPolicies.d.ts +4 -0
  25. package/dist/_dts/api/src/endpoints.d.ts +3740 -3733
  26. package/dist/_dts/api/src/event-destination-policy.d.ts +1 -1
  27. package/dist/_dts/api/src/event-presentation.d.ts +4 -9
  28. package/dist/_dts/api/src/index.d.ts +10 -12
  29. package/dist/_dts/api/src/newsletterEndpointDefinitions.d.ts +376 -0
  30. package/dist/_dts/api/src/participantMessaging.d.ts +2 -2
  31. package/dist/_dts/api/src/public/endpoints.d.ts +1 -1
  32. package/dist/_dts/api/src/publicExperience/commerceEndpoints.d.ts +272 -0
  33. package/dist/_dts/api/src/publicExperience/eventEndpoints.d.ts +274 -0
  34. package/dist/_dts/api/src/publicExperience/newsletterEndpoints.d.ts +31 -0
  35. package/dist/_dts/api/src/publicExperience/sharedTypes.d.ts +152 -0
  36. package/dist/_dts/api/src/publicExperience/siteEndpoints.d.ts +95 -0
  37. package/dist/_dts/api/src/publicExperience/wholeSeriesEndpoints.d.ts +154 -0
  38. package/dist/_dts/api/src/publicExperienceEndpoints.d.ts +10 -962
  39. package/dist/_dts/api/src/publicWholeSeriesEndpointDefinitions.d.ts +52 -0
  40. package/dist/_dts/api/src/sdkContracts.d.ts +0 -51
  41. package/dist/_dts/api/src/sdkEntryReadEndpoints.d.ts +23 -0
  42. package/dist/_dts/api/src/sitePlatformEndpoints.d.ts +1 -38
  43. package/dist/_dts/api/src/siteRuntimeEndpoints.d.ts +6 -7
  44. package/dist/_dts/blocks/src/PageRenderer.d.ts +4 -15
  45. package/dist/_dts/blocks/src/contracts/index.d.ts +1 -1
  46. package/dist/_dts/blocks/src/contracts/non-block-islands.d.ts +0 -16
  47. package/dist/_dts/blocks/src/contracts/proof-block-islands.d.ts +6 -222
  48. package/dist/_dts/blocks/src/portal/types.d.ts +3 -3
  49. package/dist/_dts/blocks/src/subroutes/fold.d.ts +1 -14
  50. package/dist/_dts/blocks/src/subroutes/index.d.ts +1 -1
  51. package/dist/_dts/blocks/src/subroutes/kinds.d.ts +3 -3
  52. package/dist/_dts/blocks/src/system/blocks/course-details.d.ts +0 -11
  53. package/dist/_dts/blocks/src/system/blocks/course-registration.d.ts +3 -4
  54. package/dist/_dts/blocks/src/system/blocks/courses/shared/pricing.d.ts +1 -1
  55. package/dist/_dts/blocks/src/system/blocks/courses/shared/schemas.d.ts +401 -12
  56. package/dist/_dts/blocks/src/system/blocks/courses/shared/types.d.ts +9 -10
  57. package/dist/_dts/blocks/src/system/blocks/events/event-calendar.d.ts +14 -13
  58. package/dist/_dts/blocks/src/system/blocks/events/event-listing.d.ts +1 -2
  59. package/dist/_dts/blocks/src/system/blocks/events/shared/filtering.d.ts +1 -4
  60. package/dist/_dts/blocks/src/system/blocks/events/shared/schemas.d.ts +19 -18
  61. package/dist/_dts/blocks/src/system/blocks/events/shared/types.d.ts +9 -11
  62. package/dist/_dts/blocks/src/system/blocks/offerings-preview/model.d.ts +2 -2
  63. package/dist/_dts/blocks/src/system/data/loaderEndpoints.d.ts +1 -1
  64. package/dist/_dts/blocks/src/system/runtime/api/client.d.ts +10 -10
  65. package/dist/_dts/blocks/src/system/runtime/api/endpoints.d.ts +10 -10
  66. package/dist/_dts/blocks/src/system/runtime/api/index.d.ts +1 -1
  67. package/dist/_dts/blocks/src/system/runtime/api/types/appointments.d.ts +162 -0
  68. package/dist/_dts/blocks/src/system/runtime/api/types/core.d.ts +59 -0
  69. package/dist/_dts/blocks/src/system/runtime/api/types/courses.d.ts +134 -0
  70. package/dist/_dts/blocks/src/system/runtime/api/types/discounts.d.ts +85 -0
  71. package/dist/_dts/blocks/src/system/runtime/api/types/events.d.ts +241 -0
  72. package/dist/_dts/blocks/src/system/runtime/api/types/forms.d.ts +53 -0
  73. package/dist/_dts/blocks/src/system/runtime/api/types/newsletter.d.ts +32 -0
  74. package/dist/_dts/blocks/src/system/runtime/api/types/portal.d.ts +220 -0
  75. package/dist/_dts/blocks/src/system/runtime/api/types/shop.d.ts +176 -0
  76. package/dist/_dts/blocks/src/system/runtime/api/types.d.ts +12 -1121
  77. package/dist/_dts/blocks/src/system/runtime/components/registry.client.d.ts +19 -583
  78. package/dist/_dts/blocks/src/system/runtime/components/runtime-backed-blocks.d.ts +9 -276
  79. package/dist/_dts/blocks/src/system/runtime/hooks/useEventFilters.d.ts +1 -12
  80. package/dist/_dts/blocks/src/system/runtime/hooks/useHeadlessEventRegistrationFlow.d.ts +0 -1
  81. package/dist/_dts/blocks/src/system/runtime/hooks/useHeadlessWholeSeriesRegistrationFlow.d.ts +0 -1
  82. package/dist/_dts/blocks/src/system/runtime/nodes/booking-runtime-sources.d.ts +2 -3
  83. package/dist/_dts/blocks/src/system/runtime/nodes/course-details/logic.d.ts +1 -18
  84. package/dist/_dts/blocks/src/system/runtime/nodes/course-details/runs.d.ts +0 -2
  85. package/dist/_dts/blocks/src/system/runtime/nodes/course-details.server.d.ts +1 -5
  86. package/dist/_dts/blocks/src/system/runtime/nodes/course-registration/courseRegistrationViewState.d.ts +21 -0
  87. package/dist/_dts/blocks/src/system/runtime/nodes/course-registration/index.d.ts +1 -1
  88. package/dist/_dts/blocks/src/system/runtime/nodes/course-registration/pricing.d.ts +14 -0
  89. package/dist/_dts/blocks/src/system/runtime/nodes/course-registration/types.d.ts +0 -25
  90. package/dist/_dts/blocks/src/system/runtime/nodes/course-registration/useCourseEligibility.d.ts +24 -0
  91. package/dist/_dts/blocks/src/system/runtime/nodes/course-registration/useCoursePaymentVerification.d.ts +9 -0
  92. package/dist/_dts/blocks/src/system/runtime/nodes/course-registration/useCourseRegistrationActions.d.ts +35 -0
  93. package/dist/_dts/blocks/src/system/runtime/nodes/course-registration/useCourseRegistrationPortal.d.ts +7 -0
  94. package/dist/_dts/blocks/src/system/runtime/nodes/course-registration/useCourseRegistrationSelection.d.ts +31 -0
  95. package/dist/_dts/blocks/src/system/runtime/nodes/course-registration/useCourseRegistrationWizard.d.ts +80 -55
  96. package/dist/_dts/blocks/src/system/runtime/nodes/course-registration/useCourseWaitlistSelection.d.ts +14 -0
  97. package/dist/_dts/blocks/src/system/runtime/nodes/course-registration/whole-series-registration.headless.contract.d.ts +4 -5
  98. package/dist/_dts/blocks/src/system/runtime/nodes/course-registration.interactive.d.ts +0 -38
  99. package/dist/_dts/blocks/src/system/runtime/nodes/course-registration.server.d.ts +1 -1
  100. package/dist/_dts/blocks/src/system/runtime/nodes/event-details.client.d.ts +1 -2
  101. package/dist/_dts/blocks/src/system/runtime/nodes/event-details.server.d.ts +0 -1
  102. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/EventRegistrationWizardActions.d.ts +12 -0
  103. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/event-registration.headless.contract.d.ts +0 -4
  104. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/eventScope.d.ts +0 -9
  105. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/types.d.ts +0 -5
  106. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/useEventRegistrationWizard.d.ts +0 -11
  107. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/utils.d.ts +13 -0
  108. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration.interactive.d.ts +0 -21
  109. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration.server.d.ts +1 -1
  110. package/dist/_dts/blocks/src/system/runtime/nodes/events/EventCalendar.interactive.d.ts +24 -433
  111. package/dist/_dts/blocks/src/system/runtime/nodes/events/EventCombined.client.d.ts +1 -2
  112. package/dist/_dts/blocks/src/system/runtime/nodes/events/EventCombined.interactive.d.ts +52 -266
  113. package/dist/_dts/blocks/src/system/runtime/nodes/events/EventListing.interactive.d.ts +5 -15
  114. package/dist/_dts/blocks/src/system/runtime/nodes/events/shared/EventFilters.d.ts +0 -8
  115. package/dist/_dts/blocks/src/system/runtime/nodes/events/shared/eventCollectionContract.d.ts +1573 -0
  116. package/dist/_dts/blocks/src/system/runtime/nodes/events/shared/listOptions.d.ts +1 -3
  117. package/dist/_dts/content-editor/src/ui/editorSnapshot.d.ts +2 -3
  118. package/dist/_dts/content-editor/src/ui/editorUiStore.d.ts +2 -2
  119. package/dist/_dts/content-model/src/content-types/builtin-schemas.d.ts +0 -5
  120. package/dist/_dts/content-model/src/content-types/builtins.d.ts +0 -5
  121. package/dist/_dts/content-model/src/templates/defaults.d.ts +6 -3
  122. package/dist/_dts/core/src/editor-state.d.ts +1 -13
  123. package/dist/_dts/db/src/generated/supabase/database.types.d.ts +1587 -115
  124. package/dist/_dts/preview-next/src/client/preview/siteChromeBrandPreferences.d.ts +6 -6
  125. package/dist/_dts/preview-next/src/client/preview/siteChromeSavePlan.d.ts +6 -1
  126. package/dist/_dts/preview-next/src/client/preview/siteStylePreviewPlanner.d.ts +27 -4
  127. package/dist/_dts/sdk/src/cli/commands/audit.d.ts +1 -2
  128. package/dist/_dts/sdk/src/cli/commands/pull-dated-offering-scope.d.ts +1 -1
  129. package/dist/_dts/sdk/src/cli/commands/pull-dry-run.d.ts +4 -6
  130. package/dist/_dts/sdk/src/cli/commands/push/consts.d.ts +1 -1
  131. package/dist/_dts/sdk/src/cli/commands/push/options.d.ts +1 -1
  132. package/dist/_dts/sdk/src/cli/commands/push/pushAllExtras.d.ts +0 -1
  133. package/dist/_dts/sdk/src/cli/commands/push/verification.d.ts +1 -1
  134. package/dist/_dts/sdk/src/cli/content/collectionWriters.d.ts +23 -0
  135. package/dist/_dts/sdk/src/cli/content/metadataAfterPush.d.ts +25 -0
  136. package/dist/_dts/sdk/src/cli/content/reader.d.ts +0 -52
  137. package/dist/_dts/sdk/src/cli/content/writer.d.ts +3 -81
  138. package/dist/_dts/sdk/src/cli/site-commands/datedOfferingCommands.d.ts +6 -9
  139. package/dist/_dts/sdk/src/client/contentReadOperations.d.ts +40 -0
  140. package/dist/_dts/sdk/src/client/management/index.d.ts +1 -3
  141. package/dist/_dts/sdk/src/client/management/types.d.ts +3 -91
  142. package/dist/_dts/sdk/src/client/runtimeCacheKeys.d.ts +72 -0
  143. package/dist/_dts/sdk/src/client/runtimeCachePolicy.d.ts +10 -75
  144. package/dist/_dts/sdk/src/client/types.d.ts +7 -33
  145. package/dist/_dts/sdk/src/components.d.ts +1 -1
  146. package/dist/_dts/sdk/src/config/types.d.ts +1 -1
  147. package/dist/_dts/sdk/src/config/validation.d.ts +3 -6
  148. package/dist/_dts/sdk/src/contracts/index.d.ts +1 -1
  149. package/dist/_dts/sdk/src/contracts/page.d.ts +0 -8
  150. package/dist/_dts/sdk/src/contracts/system-block-content.d.ts +1 -34
  151. package/dist/_dts/sdk/src/data/prefetchBlockData.d.ts +4 -3
  152. package/dist/_dts/sdk/src/next/catch-all-utils.d.ts +0 -11
  153. package/dist/_dts/sdk/src/next/catch-all.d.ts +1 -76
  154. package/dist/_dts/sdk/src/next/types.d.ts +0 -19
  155. package/dist/_dts/sdk/src/public-api/contracts.d.ts +7 -207
  156. package/dist/_dts/sdk/src/public-api/runtime.d.ts +1 -1
  157. package/dist/_dts/sdk/src/rendering/blocks-page-renderer.d.ts +2 -1
  158. package/dist/_dts/sdk/src/rendering/components/pageShared.d.ts +2 -2
  159. package/dist/_dts/sdk/src/rendering/helpers/loadContent.d.ts +0 -7
  160. package/dist/_dts/sdk/src/rendering/helpers/templateContent.d.ts +81 -0
  161. package/dist/_dts/sdk/src/rendering/index.d.ts +1 -1
  162. package/dist/_dts/sdk/src/rendering/islands/types.d.ts +1 -51
  163. package/dist/_dts/sdk/src/rendering/overrides.d.ts +2 -1
  164. package/dist/_dts/sdk/src/routing/entrySubroutes.d.ts +6 -6
  165. package/dist/_dts/sdk/src/routing/index.d.ts +0 -2
  166. package/dist/_dts/sdk/src/routing/resolveOccurrence.d.ts +3 -3
  167. package/dist/_dts/sdk/src/routing/resolvePageContent.d.ts +10 -39
  168. package/dist/_dts/sdk/src/types/block-kinds.d.ts +1 -1
  169. package/dist/_dts/sdk/src/version.d.ts +1 -1
  170. package/dist/_dts/site-commands/src/adapter.d.ts +1 -1
  171. package/dist/_dts/site-commands/src/appointmentCommandSchemas.d.ts +100 -0
  172. package/dist/_dts/site-commands/src/capabilityGaps.d.ts +2 -2
  173. package/dist/_dts/site-commands/src/commandContract.d.ts +1242 -0
  174. package/dist/_dts/site-commands/src/commandDomain.d.ts +20 -0
  175. package/dist/_dts/site-commands/src/commandIdentifiers.d.ts +7 -0
  176. package/dist/_dts/site-commands/src/commandValidation.d.ts +10 -0
  177. package/dist/_dts/site-commands/src/commands.d.ts +729 -2659
  178. package/dist/_dts/site-commands/src/domain.d.ts +1 -1
  179. package/dist/_dts/site-commands/src/eventCommandContent.d.ts +11 -0
  180. package/dist/_dts/site-commands/src/exposure.d.ts +1 -1
  181. package/dist/_dts/site-commands/src/index.d.ts +6 -0
  182. package/dist/_dts/site-commands/src/metadata.d.ts +1 -27
  183. package/dist/_dts/site-commands/src/planner.d.ts +1 -1
  184. package/dist/_dts/site-commands/src/refContributions.d.ts +1 -1
  185. package/dist/_dts/site-commands/src/refs.d.ts +1 -4
  186. package/dist/_dts/site-commands/src/siteStyleCommandSchema.d.ts +378 -0
  187. package/dist/_dts/site-commands/src/siteStyleSelectionSchemaBuilder.d.ts +46 -0
  188. package/dist/_dts/site-commands/src/staticExecutionGaps.d.ts +2 -2
  189. package/dist/_dts/site-commands/src/venueCommandMapping.d.ts +21 -0
  190. package/dist/_dts/theme-core/src/site-styles/compilationPlan.d.ts +58 -0
  191. package/dist/_dts/theme-core/src/site-styles/headerLooks.d.ts +1 -0
  192. package/dist/_dts/theme-core/src/site-styles/index.d.ts +1 -0
  193. package/dist/_dts/theme-core/src/site-styles/previewCompiler.d.ts +47 -24
  194. package/dist/cli/index.mjs +7392 -10989
  195. package/dist/cli/init-docs/content/cli-reference.md +5 -21
  196. package/dist/cli/init-docs/content/content-management.md +4 -5
  197. package/dist/client/{DiscountCodeDisclosure-DIWj-P9v.mjs → DiscountCodeDisclosure-DxvjKvck.mjs} +2 -2
  198. package/dist/client/{EventCombined.client-De8YWBSr.mjs → EventCombined.client-BydMGc4c.mjs} +5 -16
  199. package/dist/client/{EventListing.client-seHTjimY.mjs → EventListing.client-vpzhhysN.mjs} +3 -10
  200. package/dist/client/{LeafletStaticMap-BmQxFcJW.mjs → LeafletStaticMap-CB07rpf8.mjs} +1 -1
  201. package/dist/client/{MagicLinkForm-OoJAIUIj.mjs → MagicLinkForm-BzyRJ8VF.mjs} +2 -2
  202. package/dist/client/{StepIndicator-CiZ8kdPk.mjs → StepIndicator-CTcGf8Be.mjs} +2 -2
  203. package/dist/client/{accordion-6lnN__XJ.mjs → accordion-B-DUDLRD.mjs} +1 -1
  204. package/dist/client/{bookingForm-5uyqhONU.mjs → bookingForm-DSbClLcZ.mjs} +6 -6
  205. package/dist/client/bookings.mjs +753 -818
  206. package/dist/client/{carousel-Dtnifil_.mjs → carousel-B6Ccdx8M.mjs} +1 -1
  207. package/dist/client/{cart-5Tc5S7NV.mjs → cart-BZh8G8wM.mjs} +3 -3
  208. package/dist/client/{checkout-CYKKN5Hr.mjs → checkout-o6zaC-kM.mjs} +3 -3
  209. package/dist/client/client.mjs +7398 -7687
  210. package/dist/client/{context-BGZNlGXB.mjs → context-CJz1Vlsz.mjs} +40 -43
  211. package/dist/client/{courseRegistration-CxCBybB4.mjs → courseRegistration-Cf11pNDs.mjs} +606 -621
  212. package/dist/client/{eventCalendar-Xj2jZS9X.mjs → eventCalendar-BeXrdsSE.mjs} +5 -13
  213. package/dist/client/{eventCombined-CgcMoOgM.mjs → eventCombined-DA76PZgG.mjs} +3 -3
  214. package/dist/client/{eventDetails-CEAH8Edc.mjs → eventDetails-BLxg0rok.mjs} +140 -116
  215. package/dist/client/{eventListing-qyPVQ0wP.mjs → eventListing-tO9LheBX.mjs} +3 -3
  216. package/dist/client/{eventRegistration-DDu79CtL.mjs → eventRegistration-Cnene9D9.mjs} +165 -68
  217. package/dist/client/{form-Bc7JKI7I.mjs → form-DZf72CHB.mjs} +2 -2
  218. package/dist/client/{headerSection-vTku_LEl.mjs → headerSection-Hioja5Cr.mjs} +2 -2
  219. package/dist/client/hooks.mjs +3452 -2365
  220. package/dist/client/{locationMap-Bg7X4Jna.mjs → locationMap-DwhUXEix.mjs} +2 -2
  221. package/dist/client/{newsletterForm-lpylVdp5.mjs → newsletterForm-C350bEQf.mjs} +2 -2
  222. package/dist/client/{pricing-DE8fjJiT.mjs → pricing-BYWN_ATa.mjs} +3 -19
  223. package/dist/client/{productDetail-D7Bo2RMH.mjs → productDetail-CCqCyXgU.mjs} +3 -3
  224. package/dist/client/{productList-VjnZqiqN.mjs → productList-BAiNJrOU.mjs} +3 -3
  225. package/dist/client/{propsDecoder-DreFXjNP.mjs → propsDecoder-DeunRj6m.mjs} +210 -378
  226. package/dist/client/rendering/client.mjs +2541 -2813
  227. package/dist/client/rendering/islands.mjs +18 -18
  228. package/dist/client/rendering.mjs +5622 -4734
  229. package/dist/client/{shop-IRsHHbf7.mjs → shop-DUmCdBtw.mjs} +6 -6
  230. package/dist/client/{shop-commerce-gnI8PieZ.mjs → shop-commerce-CY27mEUr.mjs} +5 -5
  231. package/dist/client/{shop-commerce-store-BTbrhObn.mjs → shop-commerce-store-ChXPbWfa.mjs} +1 -1
  232. package/dist/client/{shopShared-D6KS2_qk.mjs → shopShared-q0kin1cv.mjs} +3 -3
  233. package/dist/client/{useDiscountCodeUi-DCccGCxV.mjs → useDiscountCodeUi-I-92-x2V.mjs} +2 -2
  234. package/dist/client/{useEventFilters-eGs3rPZQ.mjs → useEventFilters-DlcVluZh.mjs} +59 -124
  235. package/dist/client/{usePolling-CvSU2sur.mjs → usePolling-Bz7GFV_a.mjs} +2 -2
  236. package/dist/preview-next/before-render.mjs +1115 -1043
  237. package/dist/preview-next/client/runtime.mjs +4 -4
  238. package/dist/preview-next/middleware.mjs +1116 -1044
  239. package/dist/{previewAuthStore-31xH13Jc.mjs → previewAuthStore-CJX21dGi.mjs} +1119 -1044
  240. package/dist/{sdk-runtime-BE_vcGua.mjs → sdk-runtime-OnPM8Z69.mjs} +2 -2
  241. package/dist/{separator-CiffYtk3.mjs → separator-CPtfzHqA.mjs} +1 -1
  242. package/dist/server/components.mjs +11120 -12601
  243. package/dist/server/config-validation.mjs +3454 -2356
  244. package/dist/server/config.mjs +3454 -2356
  245. package/dist/server/data.mjs +3452 -2367
  246. package/dist/server/index.mjs +1499 -1488
  247. package/dist/server/next.mjs +18291 -21201
  248. package/dist/server/page-converter.mjs +1898 -2040
  249. package/dist/server/prebuild.mjs +1 -1
  250. package/dist/server/rendering/server.mjs +19666 -21153
  251. package/dist/server/rendering.mjs +17117 -18651
  252. package/dist/server/routing.mjs +3614 -2509
  253. package/dist/server/server.mjs +3298 -3478
  254. package/package.json +1 -1
  255. package/dist/_dts/api/src/previewContentContract.d.ts +0 -4
  256. package/dist/_dts/sdk/src/cli/commands/course.d.ts +0 -6
  257. package/dist/_dts/sdk/src/cli/commands/push/scopes/courses.d.ts +0 -4
  258. package/dist/_dts/sdk/src/client/management/courses.d.ts +0 -10
  259. package/dist/_dts/sdk/src/routing/resolveEntrySubroute.d.ts +0 -36
@@ -1,5 +1,5 @@
1
1
  "use client";
2
- import { d as unwrapResponse, l as ApiEnvelopeError, s as ApiRequestError, u as extractApiEnvelopeErrorDetails } from "./previewAuthStore-31xH13Jc.mjs";
2
+ import { d as unwrapResponse, l as ApiEnvelopeError, s as ApiRequestError, u as extractApiEnvelopeErrorDetails } from "./previewAuthStore-CJX21dGi.mjs";
3
3
  import * as React$1 from "react";
4
4
  import React, { Component, Fragment, cloneElement, createContext, createElement, createRef, forwardRef, isValidElement, memo, useCallback, useContext, useDebugValue, useEffect, useId, useImperativeHandle, useLayoutEffect, useMemo, useReducer, useRef, useState, useSyncExternalStore } from "react";
5
5
  import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
@@ -88432,16 +88432,15 @@ const coursePricingSchema = z$1.object({
88432
88432
  /**
88433
88433
  * Zod schema for public course data
88434
88434
  */
88435
- const publicCourseSchema = z$1.object({
88436
- id: z$1.string(),
88437
- seriesId: z$1.string(),
88435
+ const publicWholeSeriesOfferingSchema = z$1.object({
88436
+ eventSeriesId: z$1.string(),
88437
+ eventOfferingId: z$1.string(),
88438
88438
  title: z$1.string(),
88439
88439
  slug: z$1.string(),
88440
88440
  description: z$1.unknown().nullable(),
88441
88441
  teamMembers: z$1.array(courseTeamMemberSummarySchema).optional(),
88442
88442
  enrollmentOpen: z$1.boolean(),
88443
- pricing: coursePricingSchema.optional(),
88444
- priceCents: z$1.number().nullable(),
88443
+ pricing: coursePricingSchema,
88445
88444
  currency: z$1.string(),
88446
88445
  paymentTerms: blockBookingPaymentTermsSchema,
88447
88446
  enrollmentCapacity: z$1.number().nullable(),
@@ -88455,13 +88454,11 @@ const publicCourseSchema = z$1.object({
88455
88454
  enrolledCount: z$1.number(),
88456
88455
  availableSpots: z$1.number().nullable(),
88457
88456
  sessions: z$1.array(courseSessionSchema),
88458
- venue: courseVenueSchema.nullable(),
88459
- contentEntryId: z$1.string().nullable()
88457
+ venue: courseVenueSchema.nullable()
88460
88458
  });
88461
- /**
88462
- * Schema for an array of public courses
88463
- */
88464
- const publicCoursesArraySchema = z$1.array(publicCourseSchema);
88459
+ /** Deployed course blocks retain this schema alias for stored content. */
88460
+ const publicCourseSchema = publicWholeSeriesOfferingSchema;
88461
+ const publicCoursesArraySchema = z$1.array(publicWholeSeriesOfferingSchema);
88465
88462
  //#endregion
88466
88463
  //#region ../blocks/src/system/runtime/nodes/events/shared/destination.ts
88467
88464
  function isRecord$7(value) {
@@ -88972,7 +88969,7 @@ function resolveEventCta(event, buttonText) {
88972
88969
  const { isFull: isSoldOut } = getEventAvailability(event);
88973
88970
  const destination = resolveRuntimeEventDestination(event);
88974
88971
  const isExternal = destination.kind === "external";
88975
- const defaultButtonText = isExternal ? destination.label : event.kind === "course_session" ? "Book course" : "Book";
88972
+ const defaultButtonText = isExternal ? destination.label : event.bookingScope === "whole_series" ? "Book course" : "Book";
88976
88973
  const effectiveButtonText = buttonText ?? defaultButtonText;
88977
88974
  const href = resolveEventHref(event);
88978
88975
  if (!isExternal && isSoldOut) return {
@@ -88982,7 +88979,7 @@ function resolveEventCta(event, buttonText) {
88982
88979
  hidden: true
88983
88980
  };
88984
88981
  return {
88985
- label: !(event.kind === "course_session" ? event.course?.enrollmentOpen !== false : true) ? "Registration closed" : effectiveButtonText,
88982
+ label: !(event.bookingScope === "whole_series" ? event.wholeSeries?.enrollmentOpen !== false : true) ? "Registration closed" : effectiveButtonText,
88986
88983
  href,
88987
88984
  external: isExternal,
88988
88985
  hidden: false
@@ -89136,10 +89133,74 @@ function buildGoogleMapsDirectionsUrl(input) {
89136
89133
  return url.toString();
89137
89134
  }
89138
89135
  //#endregion
89136
+ //#region ../blocks/src/system/constants/events.ts
89137
+ const eventCalendarDisplayModeValues = [
89138
+ "combined",
89139
+ "calendar",
89140
+ "list",
89141
+ "timetable",
89142
+ "week-board"
89143
+ ];
89144
+ const eventCalendarDefaultViewValues = ["month", "week"];
89145
+ const eventCalendarListLayoutValues = [
89146
+ "stack",
89147
+ "grid",
89148
+ "compact"
89149
+ ];
89150
+ const eventCalendarListLayoutOptions = [
89151
+ {
89152
+ id: "stack",
89153
+ label: "Stack"
89154
+ },
89155
+ {
89156
+ id: "grid",
89157
+ label: "Grid"
89158
+ },
89159
+ {
89160
+ id: "compact",
89161
+ label: "Compact"
89162
+ }
89163
+ ];
89164
+ const eventCalendarListLayoutCompatibleDisplayModeValues = ["combined", "list"];
89165
+ function isEventCalendarDisplayMode(value) {
89166
+ return typeof value === "string" && eventCalendarDisplayModeValues.includes(value);
89167
+ }
89168
+ function isEventCalendarDefaultView(value) {
89169
+ return typeof value === "string" && eventCalendarDefaultViewValues.includes(value);
89170
+ }
89171
+ function isEventCalendarListLayout(value) {
89172
+ return typeof value === "string" && eventCalendarListLayoutValues.includes(value);
89173
+ }
89174
+ //#endregion
89175
+ //#region ../blocks/src/system/runtime/nodes/shared/contract-schemas.ts
89176
+ const previewStageSchema = z$1.enum(["preview", "published"]);
89177
+ const registrationButtonVariantSchema = blockButtonRoleSchema;
89178
+ const eventButtonVariantSchema = persistedBlockButtonRoleSchema;
89179
+ const eventLayoutSchema = z$1.enum(eventCalendarListLayoutValues);
89180
+ const eventCalendarDisplayModeSchema = z$1.enum(eventCalendarDisplayModeValues);
89181
+ const eventCalendarDefaultViewSchema = z$1.enum(eventCalendarDefaultViewValues);
89182
+ const columnOptionSchema = z$1.enum([
89183
+ "2",
89184
+ "3",
89185
+ "4"
89186
+ ]);
89187
+ const weekStartSchema = z$1.enum(["sunday", "monday"]);
89188
+ const filterAutoShowSchema = z$1.enum([
89189
+ "auto",
89190
+ "always",
89191
+ "never"
89192
+ ]);
89193
+ const calendarTabViewsSchema = z$1.enum([
89194
+ "both",
89195
+ "month",
89196
+ "week"
89197
+ ]);
89198
+ //#endregion
89139
89199
  //#region ../blocks/src/system/blocks/events/shared/schemas.ts
89140
89200
  const eventPresetSchema = z$1.enum([
89141
89201
  "event",
89142
89202
  "class",
89203
+ "course",
89143
89204
  "workshop",
89144
89205
  "retreat",
89145
89206
  "performance"
@@ -89406,7 +89467,7 @@ const publicTeamMemberSummarySchema = z$1.object({
89406
89467
  * Zod schema for public event data
89407
89468
  */
89408
89469
  const publicEventSchema = z$1.object({
89409
- kind: z$1.enum(["event", "course_session"]).optional(),
89470
+ bookingScope: z$1.enum(["single_occurrence", "whole_series"]),
89410
89471
  eventPreset: eventPresetSchema.optional(),
89411
89472
  eventDestinationMode: eventDestinationModeSchema.optional(),
89412
89473
  scheduleScope: eventScheduleScopeSchema$2.optional(),
@@ -89454,10 +89515,9 @@ const publicEventSchema = z$1.object({
89454
89515
  requireGuestDetails: z$1.boolean().optional(),
89455
89516
  acceptsPasses: z$1.boolean().optional(),
89456
89517
  acceptsMemberships: z$1.boolean().optional(),
89457
- course: z$1.object({
89458
- id: z$1.string(),
89459
- pricing: coursePricingSchema.optional(),
89460
- priceCents: z$1.number().nullable(),
89518
+ wholeSeries: z$1.object({
89519
+ eventSeriesId: z$1.string(),
89520
+ pricing: coursePricingSchema,
89461
89521
  currency: z$1.string(),
89462
89522
  enrollmentOpen: z$1.boolean()
89463
89523
  }).nullable().optional()
@@ -89745,12 +89805,8 @@ function normalizeIdList(parts) {
89745
89805
  }
89746
89806
  //#endregion
89747
89807
  //#region ../blocks/src/system/blocks/events/shared/filtering.ts
89748
- const eventBlockKindValues = [
89749
- "all",
89750
- "courses",
89751
- "events"
89752
- ];
89753
89808
  const eventSurfacePresetValues = [
89809
+ "course",
89754
89810
  "class",
89755
89811
  "workshop",
89756
89812
  "retreat",
@@ -89769,9 +89825,6 @@ const eventScheduleScopeValues = [
89769
89825
  ];
89770
89826
  const unsafeAsEventCategoryId = (value) => value;
89771
89827
  const unsafeAsVenueId = (value) => value;
89772
- function normalizeEventBlockKind(value) {
89773
- return value === "courses" || value === "events" ? value : "all";
89774
- }
89775
89828
  function normalizeEventSurfaceScope(value) {
89776
89829
  return value === "regularClassSchedule" || value === "specialDatedEvents" || value === "custom" ? value : "all";
89777
89830
  }
@@ -90063,86 +90116,6 @@ function eventSectionHeaderLayoutNodes(options = {}) {
90063
90116
  return [headingNode, descriptionNode];
90064
90117
  }
90065
90118
  //#endregion
90066
- //#region ../blocks/src/system/constants/events.ts
90067
- /**
90068
- * Content type slugs that represent event content.
90069
- * These are the standard slugs used when creating event content types in the CMS.
90070
- *
90071
- * Used by:
90072
- * - Occurrence resolution to detect event pages
90073
- * - Event Calendar block to identify event content
90074
- * - Content type definitions
90075
- */
90076
- const EVENT_CONTENT_TYPE_SLUGS = ["event", "events"];
90077
- const eventCalendarDisplayModeValues = [
90078
- "combined",
90079
- "calendar",
90080
- "list",
90081
- "timetable",
90082
- "week-board"
90083
- ];
90084
- const eventCalendarDefaultViewValues = ["month", "week"];
90085
- const eventCalendarListLayoutValues = [
90086
- "stack",
90087
- "grid",
90088
- "compact"
90089
- ];
90090
- const eventCalendarListLayoutOptions = [
90091
- {
90092
- id: "stack",
90093
- label: "Stack"
90094
- },
90095
- {
90096
- id: "grid",
90097
- label: "Grid"
90098
- },
90099
- {
90100
- id: "compact",
90101
- label: "Compact"
90102
- }
90103
- ];
90104
- const eventCalendarListLayoutCompatibleDisplayModeValues = ["combined", "list"];
90105
- function isEventCalendarDisplayMode(value) {
90106
- return typeof value === "string" && eventCalendarDisplayModeValues.includes(value);
90107
- }
90108
- function isEventCalendarDefaultView(value) {
90109
- return typeof value === "string" && eventCalendarDefaultViewValues.includes(value);
90110
- }
90111
- function isEventCalendarListLayout(value) {
90112
- return typeof value === "string" && eventCalendarListLayoutValues.includes(value);
90113
- }
90114
- /**
90115
- * Check if a content type slug represents an event type
90116
- */
90117
- function isEventContentType(slug) {
90118
- if (!slug) return false;
90119
- return EVENT_CONTENT_TYPE_SLUGS.includes(slug);
90120
- }
90121
- //#endregion
90122
- //#region ../blocks/src/system/runtime/nodes/shared/contract-schemas.ts
90123
- const previewStageSchema = z$1.enum(["preview", "published"]);
90124
- const registrationButtonVariantSchema = blockButtonRoleSchema;
90125
- const eventButtonVariantSchema = persistedBlockButtonRoleSchema;
90126
- const eventLayoutSchema = z$1.enum(eventCalendarListLayoutValues);
90127
- const eventCalendarDisplayModeSchema = z$1.enum(eventCalendarDisplayModeValues);
90128
- const eventCalendarDefaultViewSchema = z$1.enum(eventCalendarDefaultViewValues);
90129
- const columnOptionSchema = z$1.enum([
90130
- "2",
90131
- "3",
90132
- "4"
90133
- ]);
90134
- const weekStartSchema = z$1.enum(["sunday", "monday"]);
90135
- const filterAutoShowSchema = z$1.enum([
90136
- "auto",
90137
- "always",
90138
- "never"
90139
- ]);
90140
- const calendarTabViewsSchema = z$1.enum([
90141
- "both",
90142
- "month",
90143
- "week"
90144
- ]);
90145
- //#endregion
90146
90119
  //#region ../blocks/src/system/runtime/hooks/utils/normalize.ts
90147
90120
  function normalizeOptionalId(value) {
90148
90121
  const trimmed = typeof value === "string" ? value.trim() : void 0;
@@ -90217,15 +90190,8 @@ function buildEventRuntimeFilters(input) {
90217
90190
  if (input.scheduleScope && input.scheduleScope !== "any") params.scheduleScope = input.scheduleScope;
90218
90191
  const venueId = normalizeFilterId(input.filterVenueId);
90219
90192
  const staffMemberId = normalizeFilterId(input.filterStaffMemberId);
90220
- if (input.eventKind === "courses") {
90221
- params.kind = "courses";
90222
- if (venueId) params.venueId = venueId;
90223
- if (staffMemberId) params.staffMemberId = staffMemberId;
90224
- return params;
90225
- }
90226
90193
  const categoryIds = normalizeCsvString(input.filterCategoryIds);
90227
90194
  if (categoryIds) params.categoryIds = categoryIds;
90228
- if (input.eventKind === "events") params.kind = "events";
90229
90195
  if (venueId) params.venueId = venueId;
90230
90196
  if (staffMemberId) params.staffMemberId = staffMemberId;
90231
90197
  return params;
@@ -90235,13 +90201,157 @@ function getEventRuntimeFiltersKey(filters) {
90235
90201
  categoryIds: normalizeCsvString(filters?.categoryIds),
90236
90202
  staffMemberId: normalizeOptionalId(filters?.staffMemberId),
90237
90203
  venueId: normalizeOptionalId(filters?.venueId),
90238
- kind: filters?.kind ?? null,
90239
90204
  eventSurface: filters?.eventSurface ?? null,
90240
90205
  eventPresets: normalizeCsvString(filters?.eventPresets),
90241
90206
  scheduleScope: filters?.scheduleScope ?? null
90242
90207
  });
90243
90208
  }
90244
90209
  //#endregion
90210
+ //#region ../blocks/src/system/runtime/nodes/events/shared/eventCollectionContract.ts
90211
+ const eventSurfaceScopeSchema$1 = z$1.enum(eventSurfaceScopeValues);
90212
+ const eventScheduleScopeSchema$1 = z$1.enum(eventScheduleScopeValues);
90213
+ const eventCollectionFilterSourceSchemaShape = {
90214
+ showFilters: z$1.boolean().nullable().optional(),
90215
+ showCategoryFilter: filterAutoShowSchema.optional(),
90216
+ showVenueFilter: z$1.boolean().nullable().optional(),
90217
+ showStaffFilter: z$1.boolean().nullable().optional(),
90218
+ eventSurface: eventSurfaceScopeSchema$1.nullable().optional(),
90219
+ filterEventPresets: z$1.union([z$1.string(), z$1.array(z$1.string())]).nullable().optional(),
90220
+ scheduleScope: eventScheduleScopeSchema$1.nullable().optional(),
90221
+ filterCategoryIds: z$1.union([z$1.string(), z$1.array(z$1.string())]).nullable().optional(),
90222
+ filterStaffMemberId: z$1.string().nullable().optional(),
90223
+ filterVenueId: z$1.string().nullable().optional()
90224
+ };
90225
+ const eventCollectionSourceSchemaShape = {
90226
+ events: z$1.array(publicEventSchema).nullable().optional(),
90227
+ siteId: z$1.string(),
90228
+ apiBaseUrl: z$1.string().optional(),
90229
+ stage: previewStageSchema.optional(),
90230
+ listLayout: eventLayoutSchema.optional(),
90231
+ listColumns: columnOptionSchema.optional(),
90232
+ eventsPerPage: z$1.string().optional(),
90233
+ paginationMode: z$1.enum(["loadMore", "seeAllLink"]).optional(),
90234
+ seeAllUrl: z$1.string().optional(),
90235
+ loadMoreText: z$1.string().optional(),
90236
+ startOfWeek: weekStartSchema.optional(),
90237
+ calendarTabViews: calendarTabViewsSchema.optional(),
90238
+ defaultCalendarView: eventCalendarDefaultViewSchema.optional(),
90239
+ ...eventCollectionFilterSourceSchemaShape,
90240
+ showVenue: z$1.boolean().nullable().optional(),
90241
+ showMap: z$1.boolean().nullable().optional(),
90242
+ showCapacity: z$1.boolean().nullable().optional(),
90243
+ buttonVariant: eventButtonVariantSchema.optional(),
90244
+ buttonText: z$1.string().optional(),
90245
+ emptyMessage: z$1.string().optional(),
90246
+ className: z$1.string().optional()
90247
+ };
90248
+ const eventCollectionDisplaySchemaShape = {
90249
+ events: z$1.array(publicEventSchema),
90250
+ listLayout: eventLayoutSchema,
90251
+ listColumns: columnOptionSchema,
90252
+ eventsPerPage: eventPageSizeSchema,
90253
+ paginationAction: eventListPaginationActionSchema,
90254
+ startOfWeek: weekStartSchema,
90255
+ calendarTabViews: calendarTabViewsSchema,
90256
+ defaultCalendarView: eventCalendarDefaultViewSchema,
90257
+ showFilters: z$1.boolean(),
90258
+ showCategoryFilter: filterAutoShowSchema,
90259
+ showVenueFilter: z$1.boolean(),
90260
+ showStaffFilter: z$1.boolean(),
90261
+ eventSurface: eventSurfaceScopeSchema$1,
90262
+ filterEventPresets: z$1.string().nullable(),
90263
+ scheduleScope: eventScheduleScopeSchema$1,
90264
+ filterCategoryIds: z$1.string().nullable(),
90265
+ filterStaffMemberId: z$1.string().nullable(),
90266
+ filterVenueId: z$1.string().nullable(),
90267
+ showVenue: z$1.boolean(),
90268
+ showMap: z$1.boolean(),
90269
+ showCapacity: z$1.boolean(),
90270
+ buttonVariant: eventButtonVariantSchema,
90271
+ buttonText: z$1.string(),
90272
+ emptyMessage: z$1.string()
90273
+ };
90274
+ const eventCollectionHydrationSchema = z$1.object({
90275
+ siteId: z$1.string(),
90276
+ stage: previewStageSchema.optional(),
90277
+ prefetchedEvents: z$1.boolean(),
90278
+ eventSurface: eventSurfaceScopeSchema$1,
90279
+ filterEventPresets: z$1.string().nullable(),
90280
+ scheduleScope: eventScheduleScopeSchema$1
90281
+ });
90282
+ function buildEventCollectionDisplay(source) {
90283
+ return {
90284
+ ...buildEventCollectionFilterDisplay(source),
90285
+ ...buildEventCollectionPresentationDisplay(source),
90286
+ events: Array.isArray(source.events) ? [...source.events] : [],
90287
+ listLayout: source.listLayout ?? "stack",
90288
+ listColumns: source.listColumns ?? "3",
90289
+ eventsPerPage: resolveEventCalendarListPageSize({ eventsPerPage: source.eventsPerPage }),
90290
+ paginationAction: resolveEventListPaginationAction({
90291
+ paginationMode: source.paginationMode,
90292
+ seeAllUrl: source.seeAllUrl,
90293
+ loadMoreText: source.loadMoreText
90294
+ }),
90295
+ startOfWeek: source.startOfWeek ?? "monday",
90296
+ calendarTabViews: source.calendarTabViews ?? "both",
90297
+ defaultCalendarView: source.defaultCalendarView ?? "month"
90298
+ };
90299
+ }
90300
+ function buildEventCollectionFilterDisplay(source) {
90301
+ return {
90302
+ showFilters: source.showFilters ?? true,
90303
+ showCategoryFilter: source.showCategoryFilter ?? "auto",
90304
+ showVenueFilter: source.showVenueFilter ?? false,
90305
+ showStaffFilter: source.showStaffFilter ?? true,
90306
+ eventSurface: normalizeEventSurfaceScope(source.eventSurface),
90307
+ filterEventPresets: normalizeEventSurfacePresetsCsv(source.filterEventPresets),
90308
+ scheduleScope: normalizeEventScheduleScope(source.scheduleScope),
90309
+ filterCategoryIds: normalizeEventCategoryIdsCsv(source.filterCategoryIds),
90310
+ filterStaffMemberId: normalizeEventStaffMemberId(source.filterStaffMemberId),
90311
+ filterVenueId: normalizeEventVenueId(source.filterVenueId)
90312
+ };
90313
+ }
90314
+ function buildEventCollectionPresentationDisplay(source) {
90315
+ return {
90316
+ showVenue: source.showVenue ?? true,
90317
+ showMap: source.showMap ?? true,
90318
+ showCapacity: source.showCapacity ?? true,
90319
+ buttonVariant: source.buttonVariant ?? "primary",
90320
+ buttonText: source.buttonText ?? "Book",
90321
+ emptyMessage: source.emptyMessage ?? "No upcoming events scheduled."
90322
+ };
90323
+ }
90324
+ function buildEventCollectionHydration(source) {
90325
+ return {
90326
+ siteId: source.siteId,
90327
+ stage: source.stage,
90328
+ prefetchedEvents: source.events != null,
90329
+ eventSurface: normalizeEventSurfaceScope(source.eventSurface),
90330
+ filterEventPresets: normalizeEventSurfacePresetsCsv(source.filterEventPresets),
90331
+ scheduleScope: normalizeEventScheduleScope(source.scheduleScope)
90332
+ };
90333
+ }
90334
+ function buildEventCollectionListingDisplay(display, prefetchedEvents, className) {
90335
+ const initialEvents = display.events.slice(0, display.eventsPerPage);
90336
+ return {
90337
+ kind: "event-listing",
90338
+ state: initialEvents.length === 0 ? prefetchedEvents ? "empty" : "loading" : "ready",
90339
+ listLayout: display.listLayout,
90340
+ className,
90341
+ emptyMessage: display.emptyMessage,
90342
+ loadingMessage: "Loading events…",
90343
+ containerClass: getContainerClass(display.listLayout, display.listColumns),
90344
+ cardVariant: "default",
90345
+ buttonVariant: display.buttonVariant,
90346
+ buttonText: display.buttonText,
90347
+ showVenue: display.showVenue,
90348
+ showMap: display.showMap,
90349
+ showCapacity: display.showCapacity,
90350
+ orientation: getCardOrientation(display.listLayout),
90351
+ events: initialEvents
90352
+ };
90353
+ }
90354
+ //#endregion
90245
90355
  //#region ../blocks/src/system/spacing.ts
90246
90356
  /**
90247
90357
  * Type-safe spacing system for sections and containers.
@@ -90560,7 +90670,7 @@ function buildOfferingsPreviewRenderStates(input) {
90560
90670
  return states;
90561
90671
  }
90562
90672
  function sourceFromPresetSummary(preset) {
90563
- if (preset.engine === "course" && preset.canonicalBehaviour === "course") return { kind: "course" };
90673
+ if (preset.engine === "event_series" && preset.canonicalBehaviour === "course") return { kind: "course" };
90564
90674
  if (preset.engine !== "event_series") return null;
90565
90675
  if (isOfferingsPreviewEventPreset(preset.canonicalBehaviour)) return {
90566
90676
  kind: "eventPreset",
@@ -90621,13 +90731,12 @@ function resolveAutoCtaPath(source, routes) {
90621
90731
  return routeByNormalizedPath.get("/offerings") ?? null;
90622
90732
  }
90623
90733
  function resolveOfferingsPreviewCoursePath(course, routes) {
90624
- if (!course.contentEntryId) return null;
90625
- const baseRoute = (routes ?? []).find((route) => route.kind === "content" && route.entityId === course.contentEntryId);
90626
- if (!baseRoute) return null;
90627
- const basePath = normalizeRoutePath(baseRoute.path);
90628
- const slug = normalizePathSegment(course.slug);
90629
- if (!basePath || !slug) return null;
90630
- return `${basePath}/${slug}`;
90734
+ const routeIds = [course.eventSeriesId, course.eventOfferingId];
90735
+ for (const entityId of routeIds) {
90736
+ const path = normalizeRoutePath((routes ?? []).find((candidate) => candidate.entityId === entityId)?.path);
90737
+ if (path) return path;
90738
+ }
90739
+ return null;
90631
90740
  }
90632
90741
  function preferredPathsForSource(source) {
90633
90742
  switch (source.kind) {
@@ -90648,11 +90757,6 @@ function normalizeRoutePath(value) {
90648
90757
  const path = text.startsWith("/") ? text : `/${text}`;
90649
90758
  return path.length > 1 ? path.replace(/\/+$/, "") : path;
90650
90759
  }
90651
- function normalizePathSegment(value) {
90652
- const text = normalizeTextOverride(value);
90653
- if (!text) return null;
90654
- return text.replace(/^\/+|\/+$/g, "");
90655
- }
90656
90760
  function isOfferingsPreviewEventPreset(value) {
90657
90761
  return typeof value === "string" && OFFERINGS_PREVIEW_EVENT_PRESETS.includes(value);
90658
90762
  }
@@ -95860,1029 +95964,6 @@ function uniqueStrings(values) {
95860
95964
  return Array.from(new Set(values));
95861
95965
  }
95862
95966
  //#endregion
95863
- //#region ../theme-core/src/site-styles/sectionTransitions.ts
95864
- function boundaryRuntimeMetrics(family, size, heightExpression) {
95865
- return {
95866
- family,
95867
- size,
95868
- heightCss: heightExpression.includes(" ") ? `calc(${heightExpression})` : heightExpression,
95869
- reserveCss: `calc((${heightExpression}) / 2)`
95870
- };
95871
- }
95872
- const sectionBoundaryRuntimeMetricsByTransition = {
95873
- none: null,
95874
- "soft-fade-short": boundaryRuntimeMetrics("gradient", "medium", "6rem + 2px"),
95875
- "soft-fade-long": boundaryRuntimeMetrics("gradient", "spacious", "10rem"),
95876
- "soft-fade-expansive": boundaryRuntimeMetrics("gradient", "expansive", "14rem"),
95877
- "wave-edge": boundaryRuntimeMetrics("wave", "medium", "6rem + 2px"),
95878
- "wave-edge-balanced": boundaryRuntimeMetrics("wave", "medium", "6rem + 2px"),
95879
- "wave-edge-gentle": boundaryRuntimeMetrics("wave", "compact", "4.5rem + 2px"),
95880
- "wave-edge-bold": boundaryRuntimeMetrics("wave", "large", "7rem + 2px"),
95881
- "wave-edge-drift": boundaryRuntimeMetrics("wave", "medium", "6rem + 2px"),
95882
- "angle-edge": boundaryRuntimeMetrics("angle", "medium", "6rem + 2px"),
95883
- "angle-edge-subtle": boundaryRuntimeMetrics("angle", "compact", "4.5rem + 2px"),
95884
- "angle-edge-steep": boundaryRuntimeMetrics("angle", "large", "7rem + 2px")
95885
- };
95886
- function boundaryRuntimeMetricsForTransition(transition) {
95887
- return sectionBoundaryRuntimeMetricsByTransition[transition];
95888
- }
95889
- const noneBoundaryOption = {
95890
- id: asBoundaryOptionId("break:none"),
95891
- label: "None",
95892
- transitionAfter: "none",
95893
- treatment: { kind: "none" }
95894
- };
95895
- const softBoundaryOption = {
95896
- id: asBoundaryOptionId("break:soft"),
95897
- label: "Soft",
95898
- transitionAfter: "soft-fade-short",
95899
- treatment: {
95900
- kind: "soft-fade",
95901
- height: "medium",
95902
- curve: "soft"
95903
- }
95904
- };
95905
- const spaciousBoundaryOption = {
95906
- id: asBoundaryOptionId("break:spacious"),
95907
- label: "Spacious",
95908
- transitionAfter: "soft-fade-long",
95909
- treatment: {
95910
- kind: "soft-fade",
95911
- height: "large",
95912
- curve: "spacious"
95913
- }
95914
- };
95915
- const expansiveBoundaryOption = {
95916
- id: asBoundaryOptionId("break:expansive"),
95917
- label: "Expansive",
95918
- transitionAfter: "soft-fade-expansive",
95919
- treatment: {
95920
- kind: "soft-fade",
95921
- height: "expansive",
95922
- curve: "expansive"
95923
- }
95924
- };
95925
- const waveBoundaryOption = {
95926
- id: asBoundaryOptionId("break:wave"),
95927
- label: "Classic wave",
95928
- transitionAfter: "wave-edge",
95929
- treatment: {
95930
- kind: "wave-edge",
95931
- height: "medium",
95932
- amplitude: "balanced",
95933
- rhythm: "double",
95934
- symmetry: "asymmetrical"
95935
- }
95936
- };
95937
- const balancedWaveBoundaryOption = {
95938
- id: asBoundaryOptionId("break:wave-balanced"),
95939
- label: "Balanced wave",
95940
- transitionAfter: "wave-edge-balanced",
95941
- treatment: {
95942
- kind: "wave-edge",
95943
- height: "medium",
95944
- amplitude: "balanced",
95945
- rhythm: "double",
95946
- symmetry: "symmetrical"
95947
- }
95948
- };
95949
- const gentleWaveBoundaryOption = {
95950
- id: asBoundaryOptionId("break:wave-gentle"),
95951
- label: "Gentle wave",
95952
- transitionAfter: "wave-edge-gentle",
95953
- treatment: {
95954
- kind: "wave-edge",
95955
- height: "compact",
95956
- amplitude: "subtle",
95957
- rhythm: "single",
95958
- symmetry: "symmetrical"
95959
- }
95960
- };
95961
- const boldWaveBoundaryOption = {
95962
- id: asBoundaryOptionId("break:wave-bold"),
95963
- label: "Bold wave",
95964
- transitionAfter: "wave-edge-bold",
95965
- treatment: {
95966
- kind: "wave-edge",
95967
- height: "large",
95968
- amplitude: "bold",
95969
- rhythm: "double",
95970
- symmetry: "symmetrical"
95971
- }
95972
- };
95973
- const driftWaveBoundaryOption = {
95974
- id: asBoundaryOptionId("break:wave-drift"),
95975
- label: "Drift wave",
95976
- transitionAfter: "wave-edge-drift",
95977
- treatment: {
95978
- kind: "wave-edge",
95979
- height: "medium",
95980
- amplitude: "balanced",
95981
- rhythm: "double",
95982
- symmetry: "drift"
95983
- }
95984
- };
95985
- const subtleAngleBoundaryOption = {
95986
- id: asBoundaryOptionId("break:angle-subtle"),
95987
- label: "Subtle angle",
95988
- transitionAfter: "angle-edge-subtle",
95989
- treatment: {
95990
- kind: "angle-edge",
95991
- height: "compact",
95992
- slope: "subtle",
95993
- direction: "forward"
95994
- }
95995
- };
95996
- const balancedAngleBoundaryOption = {
95997
- id: asBoundaryOptionId("break:angle-balanced"),
95998
- label: "Balanced angle",
95999
- transitionAfter: "angle-edge",
96000
- treatment: {
96001
- kind: "angle-edge",
96002
- height: "medium",
96003
- slope: "balanced",
96004
- direction: "forward"
96005
- }
96006
- };
96007
- const steepAngleBoundaryOption = {
96008
- id: asBoundaryOptionId("break:angle-steep"),
96009
- label: "Steep angle",
96010
- transitionAfter: "angle-edge-steep",
96011
- treatment: {
96012
- kind: "angle-edge",
96013
- height: "large",
96014
- slope: "steep",
96015
- direction: "forward"
96016
- }
96017
- };
96018
- const sectionTransitionFamilies = [
96019
- {
96020
- id: "none",
96021
- label: "None",
96022
- variants: [{
96023
- familyId: "none",
96024
- variantId: "none",
96025
- label: "None",
96026
- boundaryOption: noneBoundaryOption
96027
- }]
96028
- },
96029
- {
96030
- id: "gradient",
96031
- label: "Gradient",
96032
- variants: [
96033
- {
96034
- familyId: "gradient",
96035
- variantId: "soft",
96036
- label: "Soft",
96037
- boundaryOption: softBoundaryOption
96038
- },
96039
- {
96040
- familyId: "gradient",
96041
- variantId: "spacious",
96042
- label: "Spacious",
96043
- boundaryOption: spaciousBoundaryOption
96044
- },
96045
- {
96046
- familyId: "gradient",
96047
- variantId: "expansive",
96048
- label: "Expansive",
96049
- boundaryOption: expansiveBoundaryOption
96050
- }
96051
- ]
96052
- },
96053
- {
96054
- id: "wave",
96055
- label: "Wave",
96056
- variants: [
96057
- {
96058
- familyId: "wave",
96059
- variantId: "balanced",
96060
- label: "Balanced",
96061
- boundaryOption: balancedWaveBoundaryOption
96062
- },
96063
- {
96064
- familyId: "wave",
96065
- variantId: "classic",
96066
- label: "Classic",
96067
- boundaryOption: waveBoundaryOption
96068
- },
96069
- {
96070
- familyId: "wave",
96071
- variantId: "gentle",
96072
- label: "Gentle",
96073
- boundaryOption: gentleWaveBoundaryOption
96074
- },
96075
- {
96076
- familyId: "wave",
96077
- variantId: "bold",
96078
- label: "Bold",
96079
- boundaryOption: boldWaveBoundaryOption
96080
- },
96081
- {
96082
- familyId: "wave",
96083
- variantId: "drift",
96084
- label: "Drift",
96085
- boundaryOption: driftWaveBoundaryOption
96086
- }
96087
- ]
96088
- },
96089
- {
96090
- id: "angle",
96091
- label: "Angle",
96092
- variants: [
96093
- {
96094
- familyId: "angle",
96095
- variantId: "subtle",
96096
- label: "Subtle",
96097
- boundaryOption: subtleAngleBoundaryOption
96098
- },
96099
- {
96100
- familyId: "angle",
96101
- variantId: "balanced",
96102
- label: "Balanced",
96103
- boundaryOption: balancedAngleBoundaryOption
96104
- },
96105
- {
96106
- familyId: "angle",
96107
- variantId: "steep",
96108
- label: "Steep",
96109
- boundaryOption: steepAngleBoundaryOption
96110
- }
96111
- ]
96112
- }
96113
- ];
96114
- function sectionTransitionVariantForBoundaryOptionId(boundaryOptionId) {
96115
- if (!boundaryOptionId) return null;
96116
- for (const family of sectionTransitionFamilies) {
96117
- const variant = family.variants.find((candidate) => candidate.boundaryOption.id === boundaryOptionId);
96118
- if (variant) return variant;
96119
- }
96120
- return null;
96121
- }
96122
- function sectionTransitionFamilyForBoundaryOptionId(boundaryOptionId) {
96123
- const variant = sectionTransitionVariantForBoundaryOptionId(boundaryOptionId);
96124
- if (!variant) return null;
96125
- return sectionTransitionFamilies.find((family) => family.id === variant.familyId) ?? null;
96126
- }
96127
- function defaultSectionTransitionVariantForFamily(familyId) {
96128
- const family = sectionTransitionFamilies.find((candidate) => candidate.id === familyId);
96129
- if (!family) throw new Error(`Unknown section transition family: ${familyId}`);
96130
- return family.variants[0];
96131
- }
96132
- asBoundaryOptionId("break:unknown");
96133
- const pageDesignUserPinnedAppearanceChoiceSchema = z$1.object({
96134
- kind: z$1.literal("user-pinned"),
96135
- value: z$1.string().min(1).transform(asAppearancePresetId)
96136
- }).strict();
96137
- const pageDesignUserPinnedBoundaryChoiceSchema = z$1.object({
96138
- kind: z$1.literal("user-pinned"),
96139
- value: z$1.string().min(1).transform(asBoundaryOptionId)
96140
- }).strict();
96141
- const pageDesignBoundaryTreatmentSchema = z$1.discriminatedUnion("kind", [
96142
- z$1.object({ kind: z$1.literal("none") }).strict(),
96143
- z$1.object({
96144
- kind: z$1.literal("soft-fade"),
96145
- height: z$1.enum([
96146
- "compact",
96147
- "medium",
96148
- "large",
96149
- "expansive"
96150
- ]),
96151
- curve: z$1.enum([
96152
- "soft",
96153
- "spacious",
96154
- "expansive"
96155
- ])
96156
- }).strict(),
96157
- z$1.object({
96158
- kind: z$1.literal("wave-edge"),
96159
- height: z$1.enum([
96160
- "compact",
96161
- "medium",
96162
- "large"
96163
- ]),
96164
- amplitude: z$1.enum([
96165
- "subtle",
96166
- "balanced",
96167
- "bold"
96168
- ]),
96169
- rhythm: z$1.enum(["single", "double"]),
96170
- symmetry: z$1.enum([
96171
- "symmetrical",
96172
- "asymmetrical",
96173
- "drift"
96174
- ])
96175
- }).strict(),
96176
- z$1.object({
96177
- kind: z$1.literal("angle-edge"),
96178
- height: z$1.enum([
96179
- "compact",
96180
- "medium",
96181
- "large"
96182
- ]),
96183
- slope: z$1.enum([
96184
- "subtle",
96185
- "balanced",
96186
- "steep"
96187
- ]),
96188
- direction: z$1.enum(["forward", "reverse"])
96189
- }).strict(),
96190
- z$1.object({
96191
- kind: z$1.literal("legacy-unsupported"),
96192
- boundaryOptionId: z$1.string().min(1).transform(asBoundaryOptionId)
96193
- }).strict()
96194
- ]);
96195
- const pageDesignUserPinnedBoundaryTreatmentChoiceSchema = z$1.object({
96196
- kind: z$1.literal("user-pinned"),
96197
- value: pageDesignBoundaryTreatmentSchema
96198
- }).strict();
96199
- const pageDesignBlockLookPinSchema = z$1.object({
96200
- blockId: z$1.string().min(1).transform(asDesignBlockId),
96201
- blockKind: z$1.string().min(1),
96202
- choice: pageDesignUserPinnedAppearanceChoiceSchema
96203
- }).strict();
96204
- const pageDesignBoundaryPinSchema = z$1.object({
96205
- boundaryId: z$1.string().min(1).transform(asDesignBoundaryId),
96206
- previousBlockId: z$1.string().min(1).transform(asDesignBlockId),
96207
- nextBlockId: z$1.string().min(1).transform(asDesignBlockId),
96208
- choice: pageDesignUserPinnedBoundaryTreatmentChoiceSchema
96209
- }).strict().superRefine(validateBoundaryPinIdMatchesBlocks);
96210
- const legacyPageDesignBoundaryPinSchema = z$1.object({
96211
- boundaryId: z$1.string().min(1).transform(asDesignBoundaryId),
96212
- previousBlockId: z$1.string().min(1).transform(asDesignBlockId),
96213
- nextBlockId: z$1.string().min(1).transform(asDesignBlockId),
96214
- choice: pageDesignUserPinnedBoundaryChoiceSchema
96215
- }).strict().superRefine(validateBoundaryPinIdMatchesBlocks);
96216
- z$1.object({
96217
- schemaVersion: z$1.literal(1),
96218
- siteStyleId: z$1.string().min(1).transform(asSiteStyleId),
96219
- pageFlowPresetId: z$1.string().min(1).transform(asPageFlowPresetId),
96220
- blockLookPins: z$1.array(pageDesignBlockLookPinSchema),
96221
- boundaryPins: z$1.array(legacyPageDesignBoundaryPinSchema)
96222
- }).strict().superRefine(validateUniquePageDesignPins);
96223
- z$1.object({
96224
- schemaVersion: z$1.literal(2),
96225
- siteStyleId: z$1.string().min(1).transform(asSiteStyleId),
96226
- pageFlowPresetId: z$1.string().min(1).transform(asPageFlowPresetId),
96227
- blockLookPins: z$1.array(pageDesignBlockLookPinSchema),
96228
- boundaryPins: z$1.array(pageDesignBoundaryPinSchema)
96229
- }).strict().superRefine(validateUniquePageDesignPins);
96230
- function addDuplicateStringIssues(ctx, input) {
96231
- const seen = /* @__PURE__ */ new Set();
96232
- const duplicates = /* @__PURE__ */ new Set();
96233
- for (const value of input.values) {
96234
- if (seen.has(value)) duplicates.add(value);
96235
- seen.add(value);
96236
- }
96237
- for (const duplicate of duplicates) ctx.addIssue({
96238
- code: z$1.ZodIssueCode.custom,
96239
- path: [...input.path],
96240
- message: `Duplicate ${input.label}: ${duplicate}.`
96241
- });
96242
- }
96243
- function validateBoundaryPinIdMatchesBlocks(pin, ctx) {
96244
- const expectedBoundaryId = makeBoundaryId(pin.previousBlockId, pin.nextBlockId);
96245
- if (pin.boundaryId !== expectedBoundaryId) ctx.addIssue({
96246
- code: z$1.ZodIssueCode.custom,
96247
- path: ["boundaryId"],
96248
- message: `Boundary id must match previousBlockId and nextBlockId. Expected ${expectedBoundaryId}.`
96249
- });
96250
- }
96251
- function validateUniquePageDesignPins(intent, ctx) {
96252
- addDuplicateStringIssues(ctx, {
96253
- values: intent.blockLookPins.map((pin) => pin.blockId),
96254
- path: ["blockLookPins"],
96255
- label: "block Look pin"
96256
- });
96257
- addDuplicateStringIssues(ctx, {
96258
- values: intent.boundaryPins.map((pin) => boundaryKey(pin.previousBlockId, pin.nextBlockId)),
96259
- path: ["boundaryPins"],
96260
- label: "boundary pin"
96261
- });
96262
- }
96263
- function boundaryKey(previousBlockId, nextBlockId) {
96264
- return makeBoundaryId(previousBlockId, nextBlockId);
96265
- }
96266
- //#endregion
96267
- //#region ../theme-core/src/accordions/siteStyleDefaults.ts
96268
- /**
96269
- * Reusable accordion "looks" for curated site styles.
96270
- *
96271
- * Each curated site style should declare one of these (or a bespoke variant)
96272
- * via `themeOverrides.accordions` so its FAQ accordions carry the style's
96273
- * personality instead of falling back to the generic generated default. The
96274
- * looks vary the things that make an accordion read as designed vs. cheap:
96275
- * box vs. boxless, question typography (body vs. heading font + scale), icon,
96276
- * and how an open item is emphasised.
96277
- */
96278
- /**
96279
- * Boxless editorial list: transparent root, hairline dividers between rows,
96280
- * generous spacing, heading-font questions, plus/minus marks, and an accented
96281
- * tinted band on the open row. The reference "expensive" FAQ look.
96282
- */
96283
- const editorialDividedAccordionSystem = {
96284
- background: null,
96285
- spacing: "comfortable",
96286
- corners: "square",
96287
- border: null,
96288
- shadow: null,
96289
- icon: {
96290
- style: "plus-minus",
96291
- position: "right",
96292
- size: "md",
96293
- colorToken: "primary"
96294
- },
96295
- trigger: {
96296
- textColorToken: "text",
96297
- fontWeight: "regular",
96298
- fontFamily: "heading",
96299
- fontScale: "lg"
96300
- },
96301
- hover: { textColorToken: "primary" },
96302
- openState: {
96303
- backgroundColorToken: "surfaceAlt",
96304
- triggerColorToken: "primary",
96305
- accent: {
96306
- edge: "left",
96307
- colorToken: "primary",
96308
- thickness: "medium"
96309
- }
96310
- },
96311
- content: { textColorToken: "neutral-700" }
96312
- };
96313
- /**
96314
- * Quiet, airy underlined rows: transparent, spacious, large calm heading-font
96315
- * questions, a small subtle chevron, and open emphasis carried only by the
96316
- * question recolouring. For minimal / premium / wellness styles.
96317
- */
96318
- const quietUnderlinedAccordionSystem = {
96319
- background: null,
96320
- spacing: "spacious",
96321
- corners: "square",
96322
- border: null,
96323
- shadow: null,
96324
- icon: {
96325
- style: "chevron",
96326
- position: "right",
96327
- size: "sm",
96328
- colorToken: "muted"
96329
- },
96330
- trigger: {
96331
- textColorToken: "text",
96332
- fontWeight: "regular",
96333
- fontFamily: "heading",
96334
- fontScale: "lg"
96335
- },
96336
- hover: { textColorToken: "primary" },
96337
- openState: { triggerColorToken: "primary" },
96338
- content: { textColorToken: "neutral-700" }
96339
- };
96340
- /**
96341
- * Soft contained panel: a gentle surface box with soft corners, a hairline
96342
- * border and a low shadow, heading-font questions at a moderate size, chevron,
96343
- * and a tinted open state. For clean, trustworthy, appointment-led styles.
96344
- */
96345
- const calmPanelAccordionSystem = {
96346
- background: {
96347
- type: "solid",
96348
- colorToken: "surface"
96349
- },
96350
- spacing: "comfortable",
96351
- corners: "soft",
96352
- border: {
96353
- widthClass: "border",
96354
- colorToken: "border"
96355
- },
96356
- shadow: {
96357
- elevation: "low",
96358
- softness: "soft",
96359
- position: "bottom"
96360
- },
96361
- icon: {
96362
- style: "chevron",
96363
- position: "right",
96364
- size: "md",
96365
- colorToken: "primary"
96366
- },
96367
- trigger: {
96368
- textColorToken: "text",
96369
- fontWeight: "medium",
96370
- fontFamily: "heading",
96371
- fontScale: "md"
96372
- },
96373
- hover: {
96374
- backgroundColorToken: "primary/5",
96375
- textColorToken: "primary"
96376
- },
96377
- openState: {
96378
- backgroundColorToken: "primary/5",
96379
- triggerColorToken: "primary"
96380
- },
96381
- content: { textColorToken: "neutral-700" }
96382
- };
96383
- /**
96384
- * Bold bordered panel: a strong-bordered surface box, bold heading-font
96385
- * questions, large plus/minus marks, and a high-emphasis tinted + accented
96386
- * open state. For confident, conversion-led, high-energy styles.
96387
- */
96388
- const boldBorderedAccordionSystem = {
96389
- background: {
96390
- type: "solid",
96391
- colorToken: "surface"
96392
- },
96393
- spacing: "comfortable",
96394
- corners: "soft",
96395
- border: {
96396
- widthClass: "border-2",
96397
- colorToken: "border"
96398
- },
96399
- shadow: null,
96400
- icon: {
96401
- style: "plus-minus",
96402
- position: "right",
96403
- size: "lg",
96404
- colorToken: "primary"
96405
- },
96406
- trigger: {
96407
- textColorToken: "text",
96408
- fontWeight: "bold",
96409
- fontFamily: "heading",
96410
- fontScale: "md"
96411
- },
96412
- hover: {
96413
- backgroundColorToken: "primary/10",
96414
- textColorToken: "primary"
96415
- },
96416
- openState: {
96417
- backgroundColorToken: "primary/10",
96418
- triggerColorToken: "primary",
96419
- accent: {
96420
- edge: "left",
96421
- colorToken: "primary",
96422
- thickness: "thick"
96423
- }
96424
- },
96425
- content: { textColorToken: "neutral-700" }
96426
- };
96427
- /**
96428
- * Warm inset tiles: a tinted (surfaceAlt) root with rounded corners and no
96429
- * border; the open row lifts to the lighter surface colour. Friendly,
96430
- * hands-on, community styles.
96431
- */
96432
- const warmInsetAccordionSystem = {
96433
- background: {
96434
- type: "solid",
96435
- colorToken: "surfaceAlt"
96436
- },
96437
- spacing: "comfortable",
96438
- corners: "rounded",
96439
- border: null,
96440
- shadow: null,
96441
- icon: {
96442
- style: "circle-plus-minus",
96443
- position: "right",
96444
- size: "md",
96445
- colorToken: "primary"
96446
- },
96447
- trigger: {
96448
- textColorToken: "text",
96449
- fontWeight: "semibold",
96450
- fontFamily: "heading",
96451
- fontScale: "md"
96452
- },
96453
- hover: {
96454
- backgroundColorToken: "primary/5",
96455
- textColorToken: "primary"
96456
- },
96457
- openState: {
96458
- backgroundColorToken: "surface",
96459
- triggerColorToken: "primary"
96460
- },
96461
- content: { textColorToken: "neutral-700" }
96462
- };
96463
- /**
96464
- * Soft Earth's grounded look: boxless, plus/minus, heading-font questions on
96465
- * a warm ground, with a quiet open recolour.
96466
- */
96467
- const softEarthAccordionSystem = {
96468
- background: {
96469
- type: "solid",
96470
- colorToken: "background"
96471
- },
96472
- spacing: "comfortable",
96473
- corners: "square",
96474
- border: null,
96475
- shadow: null,
96476
- icon: {
96477
- style: "plus-minus",
96478
- position: "right",
96479
- size: "md",
96480
- colorToken: "primary"
96481
- },
96482
- trigger: {
96483
- textColorToken: "text",
96484
- fontWeight: "medium",
96485
- fontFamily: "heading",
96486
- fontScale: "md"
96487
- },
96488
- hover: { textColorToken: "primary" },
96489
- openState: { triggerColorToken: "primary" },
96490
- content: { textColorToken: "neutral-700" }
96491
- };
96492
- //#endregion
96493
- //#region ../theme-core/src/cards/siteStyleDefaults.ts
96494
- /**
96495
- * Reusable card systems for curated site styles.
96496
- *
96497
- * generateCardCss emits a `.card-{id}` class per enabled variant. The
96498
- * intended convention (block-level role selection is wired in a follow-up) is
96499
- * a role pair:
96500
- * - `default` — the quiet, everyday card (most blocks, most of the time)
96501
- * - `alternative` — the prominent "statement" card for sections that pop
96502
- * A card-heavy site style may add a third; the schema allows up to three
96503
- * variants. The planned fallback when a block references a missing variant is
96504
- * `alternative`, then `default`.
96505
- *
96506
- * Keep `default` close to the generated baseline so shared consumers (event
96507
- * cards, testimonials) stay stable; put the personality in `alternative`.
96508
- */
96509
- /**
96510
- * South West Twerk School: a quiet default surface card plus a high-impact
96511
- * "statement" card that reproduces the legacy accent-quote testimonial surface
96512
- * — burgundy fill, light text, a heavy gold left accent bar, and an expressive
96513
- * asymmetric top-right corner.
96514
- */
96515
- const southWestCardSystem = { variants: [{
96516
- id: "default",
96517
- name: "Default",
96518
- enabled: true,
96519
- priority: 1,
96520
- background: {
96521
- type: "solid",
96522
- colorToken: "surface"
96523
- },
96524
- foregroundToken: "text",
96525
- spacing: "comfortable",
96526
- corners: "soft",
96527
- shadow: {
96528
- elevation: "low",
96529
- softness: "soft",
96530
- position: "bottom"
96531
- }
96532
- }, {
96533
- id: "alternative",
96534
- name: "Statement",
96535
- enabled: true,
96536
- priority: 2,
96537
- background: {
96538
- type: "solid",
96539
- colorToken: "primary-700"
96540
- },
96541
- foregroundToken: "primaryForeground",
96542
- spacing: "comfortable",
96543
- shadow: {
96544
- elevation: "none",
96545
- softness: null,
96546
- position: "bottom"
96547
- },
96548
- accentEdge: {
96549
- edge: "left",
96550
- colorToken: "secondary",
96551
- width: "heavy"
96552
- },
96553
- cornerRadii: {
96554
- topLeft: "square",
96555
- topRight: "expressive",
96556
- bottomLeft: "square",
96557
- bottomRight: "square"
96558
- }
96559
- }] };
96560
- const clarityZenCardSystem = { variants: [{
96561
- id: "default",
96562
- name: "Default",
96563
- enabled: true,
96564
- priority: 1,
96565
- background: {
96566
- type: "solid",
96567
- colorToken: "surface"
96568
- },
96569
- foregroundToken: "text",
96570
- spacing: "comfortable",
96571
- corners: "rounded",
96572
- shadow: {
96573
- elevation: "low",
96574
- softness: "soft",
96575
- position: "bottom"
96576
- }
96577
- }, {
96578
- id: "alternative",
96579
- name: "Statement",
96580
- enabled: true,
96581
- priority: 2,
96582
- background: {
96583
- type: "solid",
96584
- colorToken: "surfaceAlt"
96585
- },
96586
- foregroundToken: "text",
96587
- spacing: "comfortable",
96588
- corners: "rounded",
96589
- shadow: {
96590
- elevation: "medium",
96591
- softness: "soft",
96592
- position: "bottom"
96593
- }
96594
- }] };
96595
- /**
96596
- * Original Joy: warm, flat, generously rounded cards on the dark clay ground.
96597
- * `default` is a quiet brown surface card with cream text; `alternative` is a
96598
- * burnt-orange statement card for sections that should pop. Both flat (the
96599
- * look's depth comes from colour, not shadow), matching the bold editorial
96600
- * feel. Shared by event and testimonial cards.
96601
- */
96602
- const originalJoyCardSystem = { variants: [{
96603
- id: "default",
96604
- name: "Default",
96605
- enabled: true,
96606
- priority: 1,
96607
- background: {
96608
- type: "solid",
96609
- colorToken: "surface"
96610
- },
96611
- foregroundToken: "text",
96612
- spacing: "comfortable",
96613
- corners: "rounded",
96614
- shadow: {
96615
- elevation: "none",
96616
- softness: null,
96617
- position: "bottom"
96618
- }
96619
- }, {
96620
- id: "alternative",
96621
- name: "Statement",
96622
- enabled: true,
96623
- priority: 2,
96624
- background: {
96625
- type: "solid",
96626
- colorToken: "primary"
96627
- },
96628
- foregroundToken: "primaryForeground",
96629
- spacing: "comfortable",
96630
- corners: "rounded",
96631
- shadow: {
96632
- elevation: "none",
96633
- softness: null,
96634
- position: "bottom"
96635
- }
96636
- }] };
96637
- //#endregion
96638
- //#region ../theme-core/src/site-styles/testimonialQuotePresets.ts
96639
- /**
96640
- * Reusable testimonial quote-mark treatments for curated site styles.
96641
- *
96642
- * The quote mark is brand identity the site style owns (analogous to the FAQ
96643
- * accordion icon); every curated style declares one. `style` is the coarse
96644
- * selector and the resolver in blocks/vars/testimonials.ts fills in the rest.
96645
- */
96646
- /** Large display quotation mark in the heading font. Editorial / calm styles. */
96647
- const serifDisplayQuote = { style: "serif-display" };
96648
- /** Punchy quotation mark in the secondary accent colour. Bold / accent styles. */
96649
- const accentGlyphQuote = { style: "accent-glyph" };
96650
- /**
96651
- * Curated library of gradient presets.
96652
- * All gradients use theme color tokens, so they adapt to the site's palette.
96653
- */
96654
- const GRADIENT_PRESETS = [
96655
- {
96656
- id: "primary-secondary",
96657
- name: "Primary to Secondary",
96658
- description: "Blend your primary and secondary brand colors",
96659
- type: "linear",
96660
- angle: 135,
96661
- stops: [{
96662
- color: "primary-500",
96663
- position: 0
96664
- }, {
96665
- color: "secondary-500",
96666
- position: 100
96667
- }]
96668
- },
96669
- {
96670
- id: "primary-accent",
96671
- name: "Primary to Accent",
96672
- description: "Energetic gradient from primary to accent",
96673
- type: "linear",
96674
- angle: 135,
96675
- stops: [{
96676
- color: "primary-500",
96677
- position: 0
96678
- }, {
96679
- color: "accent-500",
96680
- position: 100
96681
- }]
96682
- },
96683
- {
96684
- id: "secondary-accent",
96685
- name: "Secondary to Accent",
96686
- description: "Vibrant secondary to accent blend",
96687
- type: "linear",
96688
- angle: 135,
96689
- stops: [{
96690
- color: "secondary-500",
96691
- position: 0
96692
- }, {
96693
- color: "accent-500",
96694
- position: 100
96695
- }]
96696
- },
96697
- {
96698
- id: "primary-light-dark",
96699
- name: "Primary Light to Dark",
96700
- description: "Subtle primary color fade",
96701
- type: "linear",
96702
- angle: 180,
96703
- stops: [{
96704
- color: "primary-500",
96705
- position: 0
96706
- }, {
96707
- color: "primary-900",
96708
- position: 100
96709
- }]
96710
- },
96711
- {
96712
- id: "primary-dark-light",
96713
- name: "Primary Dark to Light",
96714
- description: "Reverse primary fade",
96715
- type: "linear",
96716
- angle: 180,
96717
- stops: [{
96718
- color: "primary-900",
96719
- position: 0
96720
- }, {
96721
- color: "primary-50",
96722
- position: 100
96723
- }]
96724
- },
96725
- {
96726
- id: "secondary-light-dark",
96727
- name: "Secondary Light to Dark",
96728
- description: "Subtle secondary color fade",
96729
- type: "linear",
96730
- angle: 180,
96731
- stops: [{
96732
- color: "secondary-500",
96733
- position: 0
96734
- }, {
96735
- color: "secondary-900",
96736
- position: 100
96737
- }]
96738
- },
96739
- {
96740
- id: "accent-light-dark",
96741
- name: "Accent Light to Dark",
96742
- description: "Accent color depth fade",
96743
- type: "linear",
96744
- angle: 180,
96745
- stops: [{
96746
- color: "accent-500",
96747
- position: 0
96748
- }, {
96749
- color: "accent-900",
96750
- position: 100
96751
- }]
96752
- },
96753
- {
96754
- id: "background-surface",
96755
- name: "Background to Surface",
96756
- description: "Subtle depth using base colors",
96757
- type: "linear",
96758
- angle: 180,
96759
- stops: [{
96760
- color: "background",
96761
- position: 0
96762
- }, {
96763
- color: "surface",
96764
- position: 100
96765
- }]
96766
- },
96767
- {
96768
- id: "neutral-fade",
96769
- name: "Neutral Gradient",
96770
- description: "Elegant neutral color fade",
96771
- type: "linear",
96772
- angle: 180,
96773
- stops: [{
96774
- color: "neutral-900",
96775
- position: 0
96776
- }, {
96777
- color: "neutral-50",
96778
- position: 100
96779
- }]
96780
- },
96781
- {
96782
- id: "primary-glow",
96783
- name: "Primary glow",
96784
- description: "A soft top-centred glow using your primary palette",
96785
- type: "radial",
96786
- shape: "ellipse",
96787
- position: "top center",
96788
- stops: [{
96789
- color: "primary-900",
96790
- position: 0
96791
- }, {
96792
- color: "primary-950",
96793
- position: 100
96794
- }],
96795
- foreground: {
96796
- textColor: "onPrimary900",
96797
- headingColor: "onPrimary900",
96798
- linkColor: "onPrimary900",
96799
- supportingColor: "onPrimary900"
96800
- }
96801
- },
96802
- {
96803
- id: "accent-glow",
96804
- name: "Accent glow",
96805
- description: "A soft top-centred glow using your accent palette",
96806
- type: "radial",
96807
- shape: "ellipse",
96808
- position: "top center",
96809
- stops: [{
96810
- color: "accent-900",
96811
- position: 0
96812
- }, {
96813
- color: "accent-950",
96814
- position: 100
96815
- }],
96816
- foreground: {
96817
- textColor: "onAccent900",
96818
- headingColor: "onAccent900",
96819
- linkColor: "onAccent900",
96820
- supportingColor: "onAccent900"
96821
- }
96822
- },
96823
- {
96824
- id: "primary-secondary-accent",
96825
- name: "Brand Trio",
96826
- description: "All three brand colors in harmony",
96827
- type: "linear",
96828
- angle: 135,
96829
- stops: [
96830
- {
96831
- color: "primary-500",
96832
- position: 0
96833
- },
96834
- {
96835
- color: "secondary-500",
96836
- position: 50
96837
- },
96838
- {
96839
- color: "accent-500",
96840
- position: 100
96841
- }
96842
- ]
96843
- }
96844
- ].map((preset) => ({
96845
- ...preset,
96846
- id: preset.id,
96847
- stops: preset.stops
96848
- }));
96849
- const GRADIENT_PRESET_IDS = GRADIENT_PRESETS.map((preset) => preset.id);
96850
- const gradientPresetIdSet = new Set(GRADIENT_PRESET_IDS);
96851
- const gradientPresetById = Object.fromEntries(GRADIENT_PRESETS.map((preset) => [preset.id, preset]));
96852
- function parseGradientPresetId(value) {
96853
- if (typeof value !== "string") return null;
96854
- const normalized = value.trim();
96855
- if (!gradientPresetIdSet.has(normalized)) return null;
96856
- return normalized;
96857
- }
96858
- function getGradientPreset(id) {
96859
- return gradientPresetById[id];
96860
- }
96861
- //#endregion
96862
- //#region ../theme-core/src/gradients/utils.ts
96863
- /**
96864
- * Convert a GradientConfig to a CSS gradient string
96865
- *
96866
- * @param config - The gradient configuration using theme tokens
96867
- * @param tokens - Map of theme color tokens to hex values
96868
- * @returns CSS gradient string (e.g., "linear-gradient(180deg, #3b82f6 0%, #f59e0b 100%)")
96869
- */
96870
- function gradientToCss(config, tokens) {
96871
- const stops = config.stops.map((stop) => {
96872
- return `${tokens[stop.color] ?? "#000000"} ${stop.position}%`;
96873
- }).join(", ");
96874
- const type = config.type ?? "linear";
96875
- if (type === "radial") {
96876
- const position = config.position ?? "center";
96877
- return `radial-gradient(${config.shape ?? "circle"} at ${position}, ${stops})`;
96878
- }
96879
- if (type === "conic") {
96880
- const position = config.position ?? "center";
96881
- return `conic-gradient(from ${config.angle ?? 0}deg at ${position}, ${stops})`;
96882
- }
96883
- return `linear-gradient(${config.angle ?? 180}deg, ${stops})`;
96884
- }
96885
- //#endregion
96886
95967
  //#region ../theme-core/src/site-styles/customizableSurfaces.ts
96887
95968
  function uniqueLookIds(ids) {
96888
95969
  const result = [];
@@ -96982,7 +96063,7 @@ const defaultHeaderSelectionContext = {
96982
96063
  cta: { importance: "medium" },
96983
96064
  banner: { persistentVisibility: "possible" }
96984
96065
  };
96985
- function mergeHeaderSelectionContext(context) {
96066
+ function completeHeaderSelectionContext(context) {
96986
96067
  return mergeWithDefaults(defaultHeaderSelectionContext, context);
96987
96068
  }
96988
96069
  const titleOnlyLogoAccommodation = {
@@ -98248,286 +97329,1337 @@ function centeredCalmHeader(theme) {
98248
97329
  ctaGap: "none"
98249
97330
  };
98250
97331
  }
98251
- function practicalUtilityHeader(theme) {
98252
- return {
98253
- ...baseHeader(theme),
98254
- variant: "classic",
98255
- positioning: "sticky",
98256
- shrinkOnScroll: true,
98257
- background: {
98258
- type: "color",
98259
- color: "surface"
98260
- },
98261
- textColor: "text",
98262
- navColor: "text",
98263
- navStyle: "solid",
98264
- navWeight: "semibold",
98265
- shadow: themedHeaderShadow(theme),
98266
- border: {
98267
- style: "solid",
98268
- width: "thin",
98269
- position: "bottom",
98270
- colorToken: "border"
98271
- },
98272
- ctaTreatment: "primary",
98273
- ctaVariant: resolveHeaderCtaVariant(theme, "primary"),
98274
- ctaGap: "compact",
98275
- logoText: {
98276
- mobileMaxWidth: "sm",
98277
- mobileWrapLines: 1,
98278
- hideOnShrink: false
98279
- }
98280
- };
97332
+ function practicalUtilityHeader(theme) {
97333
+ return {
97334
+ ...baseHeader(theme),
97335
+ variant: "classic",
97336
+ positioning: "sticky",
97337
+ shrinkOnScroll: true,
97338
+ background: {
97339
+ type: "color",
97340
+ color: "surface"
97341
+ },
97342
+ textColor: "text",
97343
+ navColor: "text",
97344
+ navStyle: "solid",
97345
+ navWeight: "semibold",
97346
+ shadow: themedHeaderShadow(theme),
97347
+ border: {
97348
+ style: "solid",
97349
+ width: "thin",
97350
+ position: "bottom",
97351
+ colorToken: "border"
97352
+ },
97353
+ ctaTreatment: "primary",
97354
+ ctaVariant: resolveHeaderCtaVariant(theme, "primary"),
97355
+ ctaGap: "compact",
97356
+ logoText: {
97357
+ mobileMaxWidth: "sm",
97358
+ mobileWrapLines: 1,
97359
+ hideOnShrink: false
97360
+ }
97361
+ };
97362
+ }
97363
+ function minimalTransparentHeader(theme) {
97364
+ return {
97365
+ ...baseHeader(theme),
97366
+ variant: "classic",
97367
+ positioning: "static",
97368
+ shrinkOnScroll: false,
97369
+ background: {
97370
+ type: "color",
97371
+ color: "transparent"
97372
+ },
97373
+ textColor: "text",
97374
+ navColor: "text",
97375
+ navStyle: "underline",
97376
+ navWeight: "medium",
97377
+ border: {
97378
+ style: "solid",
97379
+ width: "none",
97380
+ position: "none"
97381
+ },
97382
+ ctaTreatment: "outline",
97383
+ ctaVariant: resolveHeaderCtaVariant(theme, "outline"),
97384
+ ctaGap: "default"
97385
+ };
97386
+ }
97387
+ function transparentOverlayHeader(theme) {
97388
+ return {
97389
+ ...baseHeader(theme),
97390
+ variant: "transparent",
97391
+ positioning: "fixed",
97392
+ shrinkOnScroll: true,
97393
+ background: {
97394
+ type: "color",
97395
+ color: "transparent"
97396
+ },
97397
+ textColor: "background",
97398
+ navColor: "background",
97399
+ navStyle: "frosted",
97400
+ navWeight: "semibold",
97401
+ border: {
97402
+ style: "solid",
97403
+ width: "none",
97404
+ position: "none"
97405
+ },
97406
+ ctaTreatment: "inverted",
97407
+ ctaVariant: resolveHeaderCtaVariant(theme, "inverted"),
97408
+ ctaGap: "compact"
97409
+ };
97410
+ }
97411
+ function floatingGlassHeader(theme) {
97412
+ return {
97413
+ ...transparentOverlayHeader(theme),
97414
+ variant: "floating",
97415
+ positioning: "sticky",
97416
+ navStyle: "frosted",
97417
+ navContainer: {
97418
+ type: "glass",
97419
+ tint: "text",
97420
+ opacity: .16
97421
+ },
97422
+ container: {
97423
+ rounded: "2xl",
97424
+ border: true,
97425
+ shadow: true,
97426
+ padding: "sm",
97427
+ tint: "background",
97428
+ opacity: .12
97429
+ }
97430
+ };
97431
+ }
97432
+ const headerLookCatalog = defineExactCatalog()([
97433
+ {
97434
+ id: asHeaderLookId("clean-base"),
97435
+ label: "Clean base",
97436
+ visualTreatment: "solid-neutral",
97437
+ layoutBehavior: "sticky",
97438
+ configuration: {
97439
+ structure: "inline-classic",
97440
+ treatment: "solid-neutral",
97441
+ behavior: "sticky"
97442
+ },
97443
+ openingRequirement: "none",
97444
+ logoAccommodations: inlineClassicLogoAccommodations,
97445
+ compile: cleanBaseHeader
97446
+ },
97447
+ {
97448
+ id: asHeaderLookId("classic-centered-nav"),
97449
+ label: "Centered nav",
97450
+ visualTreatment: "solid-neutral",
97451
+ layoutBehavior: "sticky",
97452
+ configuration: {
97453
+ structure: "inline-classic",
97454
+ treatment: "solid-neutral",
97455
+ behavior: "sticky"
97456
+ },
97457
+ openingRequirement: "none",
97458
+ maxRecommendedNavItems: 6,
97459
+ logoAccommodations: inlineClassicLogoAccommodations,
97460
+ compile: classicCenteredNavHeader
97461
+ },
97462
+ {
97463
+ id: asHeaderLookId("brand-solid"),
97464
+ label: "Brand solid",
97465
+ visualTreatment: "solid-brand",
97466
+ layoutBehavior: "sticky-shrink",
97467
+ configuration: {
97468
+ structure: "inline-classic",
97469
+ treatment: "solid-brand",
97470
+ behavior: "sticky-shrink"
97471
+ },
97472
+ openingRequirement: "none",
97473
+ logoAccommodations: inlineClassicLogoAccommodations,
97474
+ compile: solidBrandHeader
97475
+ },
97476
+ {
97477
+ id: asHeaderLookId("serif-line"),
97478
+ label: "Serif line",
97479
+ visualTreatment: "light-serif",
97480
+ layoutBehavior: "sticky",
97481
+ configuration: {
97482
+ structure: "centered-stack",
97483
+ treatment: "light-serif",
97484
+ behavior: "sticky"
97485
+ },
97486
+ openingRequirement: "none",
97487
+ maxRecommendedNavItems: 6,
97488
+ logoAccommodations: centeredLogoAccommodations,
97489
+ compile: serifLineHeader
97490
+ },
97491
+ {
97492
+ id: asHeaderLookId("centered-calm"),
97493
+ label: "Centered calm",
97494
+ visualTreatment: "light-serif",
97495
+ layoutBehavior: "normal-flow",
97496
+ configuration: {
97497
+ structure: "centered-stack",
97498
+ treatment: "light-serif",
97499
+ behavior: "normal-flow"
97500
+ },
97501
+ openingRequirement: "none",
97502
+ maxRecommendedNavItems: 5,
97503
+ logoAccommodations: centeredLogoAccommodations,
97504
+ compile: centeredCalmHeader
97505
+ },
97506
+ {
97507
+ id: asHeaderLookId("practical-utility"),
97508
+ label: "Practical utility",
97509
+ visualTreatment: "solid-neutral",
97510
+ layoutBehavior: "sticky-shrink",
97511
+ configuration: {
97512
+ structure: "inline-classic",
97513
+ treatment: "solid-neutral",
97514
+ behavior: "sticky-shrink"
97515
+ },
97516
+ openingRequirement: "none",
97517
+ requiresProminentCta: true,
97518
+ logoAccommodations: inlineClassicLogoAccommodations,
97519
+ compile: practicalUtilityHeader
97520
+ },
97521
+ {
97522
+ id: asHeaderLookId("minimal-transparent"),
97523
+ label: "Minimal transparent",
97524
+ visualTreatment: "minimal-transparent",
97525
+ layoutBehavior: "normal-flow",
97526
+ configuration: {
97527
+ structure: "inline-classic",
97528
+ treatment: "minimal-transparent",
97529
+ behavior: "normal-flow"
97530
+ },
97531
+ openingRequirement: "reserved-space-ok",
97532
+ logoAccommodations: inlineClassicLogoAccommodations,
97533
+ compile: minimalTransparentHeader
97534
+ },
97535
+ {
97536
+ id: asHeaderLookId("transparent-overlay"),
97537
+ label: "Transparent overlay",
97538
+ visualTreatment: "transparent-overlay",
97539
+ layoutBehavior: "fixed-overlay",
97540
+ configuration: {
97541
+ structure: "inline-classic",
97542
+ treatment: "transparent-overlay",
97543
+ behavior: "fixed-overlay"
97544
+ },
97545
+ openingRequirement: "requires-image-hero-with-contrast-overlay",
97546
+ maxRecommendedNavItems: 5,
97547
+ logoAccommodations: overlayLogoAccommodations,
97548
+ compile: transparentOverlayHeader
97549
+ },
97550
+ {
97551
+ id: asHeaderLookId("floating-glass"),
97552
+ label: "Floating glass",
97553
+ visualTreatment: "floating-glass",
97554
+ layoutBehavior: "fixed-floating",
97555
+ configuration: {
97556
+ structure: "floating-shell",
97557
+ treatment: "floating-glass",
97558
+ behavior: "fixed-floating"
97559
+ },
97560
+ openingRequirement: "requires-image-hero-with-contrast-overlay",
97561
+ maxRecommendedNavItems: 5,
97562
+ logoAccommodations: overlayLogoAccommodations,
97563
+ compile: floatingGlassHeader
97564
+ }
97565
+ ]);
97566
+ const guaranteedFallbackHeaderLookId = asHeaderLookId("clean-base");
97567
+ new Set(headerLookCatalog.map((look) => headerConfigurationKey(look.configuration)));
97568
+ const headerLooksById = new Map(headerLookCatalog.map((look) => [look.id, look]));
97569
+ function headerConfigurationKey(configuration) {
97570
+ return `${configuration.structure}:${configuration.treatment}:${configuration.behavior}`;
97571
+ }
97572
+ function getHeaderLook(id) {
97573
+ return headerLooksById.get(id) ?? null;
97574
+ }
97575
+ function getHeaderLookOrThrow(id) {
97576
+ const look = getHeaderLook(id);
97577
+ if (!look) throw new Error(`Unknown Theme V2 header Look: ${id}`);
97578
+ return look;
97579
+ }
97580
+ function rejectReasonsForLook(look, context) {
97581
+ const brandPresentation = resolveHeaderBrandPresentation({
97582
+ logo: context.logo,
97583
+ accommodations: look.logoAccommodations
97584
+ });
97585
+ return [
97586
+ ...look.maxRecommendedNavItems !== void 0 && context.navigation.itemCount > look.maxRecommendedNavItems ? ["too-many-nav-items"] : [],
97587
+ ...brandPresentation.kind === "rejected" ? brandPresentation.reasons : [],
97588
+ ...look.requiresProminentCta && context.cta.importance === "low" ? ["cta-treatment-unavailable"] : []
97589
+ ];
97590
+ }
97591
+ function resolveHeaderLook(input) {
97592
+ const context = completeHeaderSelectionContext(input.context);
97593
+ const result = resolveLook({
97594
+ recommendedLookIds: input.recommendedLookIds,
97595
+ guaranteedFallbackLookId: guaranteedFallbackHeaderLookId,
97596
+ getLookOrThrow: getHeaderLookOrThrow,
97597
+ context,
97598
+ rejectReasonsForLook,
97599
+ compileLook: (look) => look.compile(input.theme)
97600
+ });
97601
+ return {
97602
+ selectedLookId: result.selectedLookId,
97603
+ selectedLook: result.selectedLook,
97604
+ header: result.compiled,
97605
+ brandPresentation: requireHeaderBrandPresentationSelection(resolveHeaderBrandPresentation({
97606
+ logo: context.logo,
97607
+ accommodations: result.selectedLook.logoAccommodations,
97608
+ allowDisplayFallback: true
97609
+ })),
97610
+ rejected: result.rejected
97611
+ };
97612
+ }
97613
+ //#endregion
97614
+ //#region ../theme-core/src/site-styles/compilationPlan.ts
97615
+ const defaultHeaderBrandPreferences = {
97616
+ brandDisplay: "auto",
97617
+ logoSize: "auto"
97618
+ };
97619
+ function headerBrandPreferencesFromTheme(theme) {
97620
+ return {
97621
+ brandDisplay: theme?.header.logo?.brandDisplay ?? defaultHeaderBrandPreferences.brandDisplay,
97622
+ logoSize: theme?.header.logo?.size ?? defaultHeaderBrandPreferences.logoSize
97623
+ };
97624
+ }
97625
+ function replaceSiteStyleCompilationPlan(input = {}) {
97626
+ return {
97627
+ kind: "replace-site-style",
97628
+ header: {
97629
+ kind: "recompile",
97630
+ selection: {
97631
+ headerLookId: input.headerLookId ?? null,
97632
+ headerLayoutId: input.headerLayoutId ?? null,
97633
+ headerStyleId: input.headerStyleId ?? null
97634
+ },
97635
+ context: completeHeaderSelectionContext(input.headerSelectionContext),
97636
+ brandPresentation: input.headerSelectionContext?.logo === void 0 ? { kind: "use-compiled-defaults" } : { kind: "apply-logo-context" }
97637
+ },
97638
+ footerLookId: input.footerLookId ?? null
97639
+ };
97640
+ }
97641
+ //#endregion
97642
+ //#region ../theme-core/src/site-styles/sectionTransitions.ts
97643
+ function boundaryRuntimeMetrics(family, size, heightExpression) {
97644
+ return {
97645
+ family,
97646
+ size,
97647
+ heightCss: heightExpression.includes(" ") ? `calc(${heightExpression})` : heightExpression,
97648
+ reserveCss: `calc((${heightExpression}) / 2)`
97649
+ };
97650
+ }
97651
+ const sectionBoundaryRuntimeMetricsByTransition = {
97652
+ none: null,
97653
+ "soft-fade-short": boundaryRuntimeMetrics("gradient", "medium", "6rem + 2px"),
97654
+ "soft-fade-long": boundaryRuntimeMetrics("gradient", "spacious", "10rem"),
97655
+ "soft-fade-expansive": boundaryRuntimeMetrics("gradient", "expansive", "14rem"),
97656
+ "wave-edge": boundaryRuntimeMetrics("wave", "medium", "6rem + 2px"),
97657
+ "wave-edge-balanced": boundaryRuntimeMetrics("wave", "medium", "6rem + 2px"),
97658
+ "wave-edge-gentle": boundaryRuntimeMetrics("wave", "compact", "4.5rem + 2px"),
97659
+ "wave-edge-bold": boundaryRuntimeMetrics("wave", "large", "7rem + 2px"),
97660
+ "wave-edge-drift": boundaryRuntimeMetrics("wave", "medium", "6rem + 2px"),
97661
+ "angle-edge": boundaryRuntimeMetrics("angle", "medium", "6rem + 2px"),
97662
+ "angle-edge-subtle": boundaryRuntimeMetrics("angle", "compact", "4.5rem + 2px"),
97663
+ "angle-edge-steep": boundaryRuntimeMetrics("angle", "large", "7rem + 2px")
97664
+ };
97665
+ function boundaryRuntimeMetricsForTransition(transition) {
97666
+ return sectionBoundaryRuntimeMetricsByTransition[transition];
97667
+ }
97668
+ const noneBoundaryOption = {
97669
+ id: asBoundaryOptionId("break:none"),
97670
+ label: "None",
97671
+ transitionAfter: "none",
97672
+ treatment: { kind: "none" }
97673
+ };
97674
+ const softBoundaryOption = {
97675
+ id: asBoundaryOptionId("break:soft"),
97676
+ label: "Soft",
97677
+ transitionAfter: "soft-fade-short",
97678
+ treatment: {
97679
+ kind: "soft-fade",
97680
+ height: "medium",
97681
+ curve: "soft"
97682
+ }
97683
+ };
97684
+ const spaciousBoundaryOption = {
97685
+ id: asBoundaryOptionId("break:spacious"),
97686
+ label: "Spacious",
97687
+ transitionAfter: "soft-fade-long",
97688
+ treatment: {
97689
+ kind: "soft-fade",
97690
+ height: "large",
97691
+ curve: "spacious"
97692
+ }
97693
+ };
97694
+ const expansiveBoundaryOption = {
97695
+ id: asBoundaryOptionId("break:expansive"),
97696
+ label: "Expansive",
97697
+ transitionAfter: "soft-fade-expansive",
97698
+ treatment: {
97699
+ kind: "soft-fade",
97700
+ height: "expansive",
97701
+ curve: "expansive"
97702
+ }
97703
+ };
97704
+ const waveBoundaryOption = {
97705
+ id: asBoundaryOptionId("break:wave"),
97706
+ label: "Classic wave",
97707
+ transitionAfter: "wave-edge",
97708
+ treatment: {
97709
+ kind: "wave-edge",
97710
+ height: "medium",
97711
+ amplitude: "balanced",
97712
+ rhythm: "double",
97713
+ symmetry: "asymmetrical"
97714
+ }
97715
+ };
97716
+ const balancedWaveBoundaryOption = {
97717
+ id: asBoundaryOptionId("break:wave-balanced"),
97718
+ label: "Balanced wave",
97719
+ transitionAfter: "wave-edge-balanced",
97720
+ treatment: {
97721
+ kind: "wave-edge",
97722
+ height: "medium",
97723
+ amplitude: "balanced",
97724
+ rhythm: "double",
97725
+ symmetry: "symmetrical"
97726
+ }
97727
+ };
97728
+ const gentleWaveBoundaryOption = {
97729
+ id: asBoundaryOptionId("break:wave-gentle"),
97730
+ label: "Gentle wave",
97731
+ transitionAfter: "wave-edge-gentle",
97732
+ treatment: {
97733
+ kind: "wave-edge",
97734
+ height: "compact",
97735
+ amplitude: "subtle",
97736
+ rhythm: "single",
97737
+ symmetry: "symmetrical"
97738
+ }
97739
+ };
97740
+ const boldWaveBoundaryOption = {
97741
+ id: asBoundaryOptionId("break:wave-bold"),
97742
+ label: "Bold wave",
97743
+ transitionAfter: "wave-edge-bold",
97744
+ treatment: {
97745
+ kind: "wave-edge",
97746
+ height: "large",
97747
+ amplitude: "bold",
97748
+ rhythm: "double",
97749
+ symmetry: "symmetrical"
97750
+ }
97751
+ };
97752
+ const driftWaveBoundaryOption = {
97753
+ id: asBoundaryOptionId("break:wave-drift"),
97754
+ label: "Drift wave",
97755
+ transitionAfter: "wave-edge-drift",
97756
+ treatment: {
97757
+ kind: "wave-edge",
97758
+ height: "medium",
97759
+ amplitude: "balanced",
97760
+ rhythm: "double",
97761
+ symmetry: "drift"
97762
+ }
97763
+ };
97764
+ const subtleAngleBoundaryOption = {
97765
+ id: asBoundaryOptionId("break:angle-subtle"),
97766
+ label: "Subtle angle",
97767
+ transitionAfter: "angle-edge-subtle",
97768
+ treatment: {
97769
+ kind: "angle-edge",
97770
+ height: "compact",
97771
+ slope: "subtle",
97772
+ direction: "forward"
97773
+ }
97774
+ };
97775
+ const balancedAngleBoundaryOption = {
97776
+ id: asBoundaryOptionId("break:angle-balanced"),
97777
+ label: "Balanced angle",
97778
+ transitionAfter: "angle-edge",
97779
+ treatment: {
97780
+ kind: "angle-edge",
97781
+ height: "medium",
97782
+ slope: "balanced",
97783
+ direction: "forward"
97784
+ }
97785
+ };
97786
+ const steepAngleBoundaryOption = {
97787
+ id: asBoundaryOptionId("break:angle-steep"),
97788
+ label: "Steep angle",
97789
+ transitionAfter: "angle-edge-steep",
97790
+ treatment: {
97791
+ kind: "angle-edge",
97792
+ height: "large",
97793
+ slope: "steep",
97794
+ direction: "forward"
97795
+ }
97796
+ };
97797
+ const sectionTransitionFamilies = [
97798
+ {
97799
+ id: "none",
97800
+ label: "None",
97801
+ variants: [{
97802
+ familyId: "none",
97803
+ variantId: "none",
97804
+ label: "None",
97805
+ boundaryOption: noneBoundaryOption
97806
+ }]
97807
+ },
97808
+ {
97809
+ id: "gradient",
97810
+ label: "Gradient",
97811
+ variants: [
97812
+ {
97813
+ familyId: "gradient",
97814
+ variantId: "soft",
97815
+ label: "Soft",
97816
+ boundaryOption: softBoundaryOption
97817
+ },
97818
+ {
97819
+ familyId: "gradient",
97820
+ variantId: "spacious",
97821
+ label: "Spacious",
97822
+ boundaryOption: spaciousBoundaryOption
97823
+ },
97824
+ {
97825
+ familyId: "gradient",
97826
+ variantId: "expansive",
97827
+ label: "Expansive",
97828
+ boundaryOption: expansiveBoundaryOption
97829
+ }
97830
+ ]
97831
+ },
97832
+ {
97833
+ id: "wave",
97834
+ label: "Wave",
97835
+ variants: [
97836
+ {
97837
+ familyId: "wave",
97838
+ variantId: "balanced",
97839
+ label: "Balanced",
97840
+ boundaryOption: balancedWaveBoundaryOption
97841
+ },
97842
+ {
97843
+ familyId: "wave",
97844
+ variantId: "classic",
97845
+ label: "Classic",
97846
+ boundaryOption: waveBoundaryOption
97847
+ },
97848
+ {
97849
+ familyId: "wave",
97850
+ variantId: "gentle",
97851
+ label: "Gentle",
97852
+ boundaryOption: gentleWaveBoundaryOption
97853
+ },
97854
+ {
97855
+ familyId: "wave",
97856
+ variantId: "bold",
97857
+ label: "Bold",
97858
+ boundaryOption: boldWaveBoundaryOption
97859
+ },
97860
+ {
97861
+ familyId: "wave",
97862
+ variantId: "drift",
97863
+ label: "Drift",
97864
+ boundaryOption: driftWaveBoundaryOption
97865
+ }
97866
+ ]
97867
+ },
97868
+ {
97869
+ id: "angle",
97870
+ label: "Angle",
97871
+ variants: [
97872
+ {
97873
+ familyId: "angle",
97874
+ variantId: "subtle",
97875
+ label: "Subtle",
97876
+ boundaryOption: subtleAngleBoundaryOption
97877
+ },
97878
+ {
97879
+ familyId: "angle",
97880
+ variantId: "balanced",
97881
+ label: "Balanced",
97882
+ boundaryOption: balancedAngleBoundaryOption
97883
+ },
97884
+ {
97885
+ familyId: "angle",
97886
+ variantId: "steep",
97887
+ label: "Steep",
97888
+ boundaryOption: steepAngleBoundaryOption
97889
+ }
97890
+ ]
97891
+ }
97892
+ ];
97893
+ function sectionTransitionVariantForBoundaryOptionId(boundaryOptionId) {
97894
+ if (!boundaryOptionId) return null;
97895
+ for (const family of sectionTransitionFamilies) {
97896
+ const variant = family.variants.find((candidate) => candidate.boundaryOption.id === boundaryOptionId);
97897
+ if (variant) return variant;
97898
+ }
97899
+ return null;
97900
+ }
97901
+ function sectionTransitionFamilyForBoundaryOptionId(boundaryOptionId) {
97902
+ const variant = sectionTransitionVariantForBoundaryOptionId(boundaryOptionId);
97903
+ if (!variant) return null;
97904
+ return sectionTransitionFamilies.find((family) => family.id === variant.familyId) ?? null;
97905
+ }
97906
+ function defaultSectionTransitionVariantForFamily(familyId) {
97907
+ const family = sectionTransitionFamilies.find((candidate) => candidate.id === familyId);
97908
+ if (!family) throw new Error(`Unknown section transition family: ${familyId}`);
97909
+ return family.variants[0];
97910
+ }
97911
+ asBoundaryOptionId("break:unknown");
97912
+ const pageDesignUserPinnedAppearanceChoiceSchema = z$1.object({
97913
+ kind: z$1.literal("user-pinned"),
97914
+ value: z$1.string().min(1).transform(asAppearancePresetId)
97915
+ }).strict();
97916
+ const pageDesignUserPinnedBoundaryChoiceSchema = z$1.object({
97917
+ kind: z$1.literal("user-pinned"),
97918
+ value: z$1.string().min(1).transform(asBoundaryOptionId)
97919
+ }).strict();
97920
+ const pageDesignBoundaryTreatmentSchema = z$1.discriminatedUnion("kind", [
97921
+ z$1.object({ kind: z$1.literal("none") }).strict(),
97922
+ z$1.object({
97923
+ kind: z$1.literal("soft-fade"),
97924
+ height: z$1.enum([
97925
+ "compact",
97926
+ "medium",
97927
+ "large",
97928
+ "expansive"
97929
+ ]),
97930
+ curve: z$1.enum([
97931
+ "soft",
97932
+ "spacious",
97933
+ "expansive"
97934
+ ])
97935
+ }).strict(),
97936
+ z$1.object({
97937
+ kind: z$1.literal("wave-edge"),
97938
+ height: z$1.enum([
97939
+ "compact",
97940
+ "medium",
97941
+ "large"
97942
+ ]),
97943
+ amplitude: z$1.enum([
97944
+ "subtle",
97945
+ "balanced",
97946
+ "bold"
97947
+ ]),
97948
+ rhythm: z$1.enum(["single", "double"]),
97949
+ symmetry: z$1.enum([
97950
+ "symmetrical",
97951
+ "asymmetrical",
97952
+ "drift"
97953
+ ])
97954
+ }).strict(),
97955
+ z$1.object({
97956
+ kind: z$1.literal("angle-edge"),
97957
+ height: z$1.enum([
97958
+ "compact",
97959
+ "medium",
97960
+ "large"
97961
+ ]),
97962
+ slope: z$1.enum([
97963
+ "subtle",
97964
+ "balanced",
97965
+ "steep"
97966
+ ]),
97967
+ direction: z$1.enum(["forward", "reverse"])
97968
+ }).strict(),
97969
+ z$1.object({
97970
+ kind: z$1.literal("legacy-unsupported"),
97971
+ boundaryOptionId: z$1.string().min(1).transform(asBoundaryOptionId)
97972
+ }).strict()
97973
+ ]);
97974
+ const pageDesignUserPinnedBoundaryTreatmentChoiceSchema = z$1.object({
97975
+ kind: z$1.literal("user-pinned"),
97976
+ value: pageDesignBoundaryTreatmentSchema
97977
+ }).strict();
97978
+ const pageDesignBlockLookPinSchema = z$1.object({
97979
+ blockId: z$1.string().min(1).transform(asDesignBlockId),
97980
+ blockKind: z$1.string().min(1),
97981
+ choice: pageDesignUserPinnedAppearanceChoiceSchema
97982
+ }).strict();
97983
+ const pageDesignBoundaryPinSchema = z$1.object({
97984
+ boundaryId: z$1.string().min(1).transform(asDesignBoundaryId),
97985
+ previousBlockId: z$1.string().min(1).transform(asDesignBlockId),
97986
+ nextBlockId: z$1.string().min(1).transform(asDesignBlockId),
97987
+ choice: pageDesignUserPinnedBoundaryTreatmentChoiceSchema
97988
+ }).strict().superRefine(validateBoundaryPinIdMatchesBlocks);
97989
+ const legacyPageDesignBoundaryPinSchema = z$1.object({
97990
+ boundaryId: z$1.string().min(1).transform(asDesignBoundaryId),
97991
+ previousBlockId: z$1.string().min(1).transform(asDesignBlockId),
97992
+ nextBlockId: z$1.string().min(1).transform(asDesignBlockId),
97993
+ choice: pageDesignUserPinnedBoundaryChoiceSchema
97994
+ }).strict().superRefine(validateBoundaryPinIdMatchesBlocks);
97995
+ z$1.object({
97996
+ schemaVersion: z$1.literal(1),
97997
+ siteStyleId: z$1.string().min(1).transform(asSiteStyleId),
97998
+ pageFlowPresetId: z$1.string().min(1).transform(asPageFlowPresetId),
97999
+ blockLookPins: z$1.array(pageDesignBlockLookPinSchema),
98000
+ boundaryPins: z$1.array(legacyPageDesignBoundaryPinSchema)
98001
+ }).strict().superRefine(validateUniquePageDesignPins);
98002
+ z$1.object({
98003
+ schemaVersion: z$1.literal(2),
98004
+ siteStyleId: z$1.string().min(1).transform(asSiteStyleId),
98005
+ pageFlowPresetId: z$1.string().min(1).transform(asPageFlowPresetId),
98006
+ blockLookPins: z$1.array(pageDesignBlockLookPinSchema),
98007
+ boundaryPins: z$1.array(pageDesignBoundaryPinSchema)
98008
+ }).strict().superRefine(validateUniquePageDesignPins);
98009
+ function addDuplicateStringIssues(ctx, input) {
98010
+ const seen = /* @__PURE__ */ new Set();
98011
+ const duplicates = /* @__PURE__ */ new Set();
98012
+ for (const value of input.values) {
98013
+ if (seen.has(value)) duplicates.add(value);
98014
+ seen.add(value);
98015
+ }
98016
+ for (const duplicate of duplicates) ctx.addIssue({
98017
+ code: z$1.ZodIssueCode.custom,
98018
+ path: [...input.path],
98019
+ message: `Duplicate ${input.label}: ${duplicate}.`
98020
+ });
98021
+ }
98022
+ function validateBoundaryPinIdMatchesBlocks(pin, ctx) {
98023
+ const expectedBoundaryId = makeBoundaryId(pin.previousBlockId, pin.nextBlockId);
98024
+ if (pin.boundaryId !== expectedBoundaryId) ctx.addIssue({
98025
+ code: z$1.ZodIssueCode.custom,
98026
+ path: ["boundaryId"],
98027
+ message: `Boundary id must match previousBlockId and nextBlockId. Expected ${expectedBoundaryId}.`
98028
+ });
98281
98029
  }
98282
- function minimalTransparentHeader(theme) {
98283
- return {
98284
- ...baseHeader(theme),
98285
- variant: "classic",
98286
- positioning: "static",
98287
- shrinkOnScroll: false,
98288
- background: {
98289
- type: "color",
98290
- color: "transparent"
98291
- },
98292
- textColor: "text",
98293
- navColor: "text",
98294
- navStyle: "underline",
98295
- navWeight: "medium",
98296
- border: {
98297
- style: "solid",
98298
- width: "none",
98299
- position: "none"
98300
- },
98301
- ctaTreatment: "outline",
98302
- ctaVariant: resolveHeaderCtaVariant(theme, "outline"),
98303
- ctaGap: "default"
98304
- };
98030
+ function validateUniquePageDesignPins(intent, ctx) {
98031
+ addDuplicateStringIssues(ctx, {
98032
+ values: intent.blockLookPins.map((pin) => pin.blockId),
98033
+ path: ["blockLookPins"],
98034
+ label: "block Look pin"
98035
+ });
98036
+ addDuplicateStringIssues(ctx, {
98037
+ values: intent.boundaryPins.map((pin) => boundaryKey(pin.previousBlockId, pin.nextBlockId)),
98038
+ path: ["boundaryPins"],
98039
+ label: "boundary pin"
98040
+ });
98305
98041
  }
98306
- function transparentOverlayHeader(theme) {
98307
- return {
98308
- ...baseHeader(theme),
98309
- variant: "transparent",
98310
- positioning: "fixed",
98311
- shrinkOnScroll: true,
98312
- background: {
98313
- type: "color",
98314
- color: "transparent"
98315
- },
98316
- textColor: "background",
98317
- navColor: "background",
98318
- navStyle: "frosted",
98319
- navWeight: "semibold",
98320
- border: {
98321
- style: "solid",
98322
- width: "none",
98323
- position: "none"
98324
- },
98325
- ctaTreatment: "inverted",
98326
- ctaVariant: resolveHeaderCtaVariant(theme, "inverted"),
98327
- ctaGap: "compact"
98328
- };
98042
+ function boundaryKey(previousBlockId, nextBlockId) {
98043
+ return makeBoundaryId(previousBlockId, nextBlockId);
98329
98044
  }
98330
- function floatingGlassHeader(theme) {
98331
- return {
98332
- ...transparentOverlayHeader(theme),
98333
- variant: "floating",
98334
- positioning: "sticky",
98335
- navStyle: "frosted",
98336
- navContainer: {
98337
- type: "glass",
98338
- tint: "text",
98339
- opacity: .16
98340
- },
98341
- container: {
98342
- rounded: "2xl",
98343
- border: true,
98344
- shadow: true,
98345
- padding: "sm",
98346
- tint: "background",
98347
- opacity: .12
98045
+ //#endregion
98046
+ //#region ../theme-core/src/accordions/siteStyleDefaults.ts
98047
+ /**
98048
+ * Reusable accordion "looks" for curated site styles.
98049
+ *
98050
+ * Each curated site style should declare one of these (or a bespoke variant)
98051
+ * via `themeOverrides.accordions` so its FAQ accordions carry the style's
98052
+ * personality instead of falling back to the generic generated default. The
98053
+ * looks vary the things that make an accordion read as designed vs. cheap:
98054
+ * box vs. boxless, question typography (body vs. heading font + scale), icon,
98055
+ * and how an open item is emphasised.
98056
+ */
98057
+ /**
98058
+ * Boxless editorial list: transparent root, hairline dividers between rows,
98059
+ * generous spacing, heading-font questions, plus/minus marks, and an accented
98060
+ * tinted band on the open row. The reference "expensive" FAQ look.
98061
+ */
98062
+ const editorialDividedAccordionSystem = {
98063
+ background: null,
98064
+ spacing: "comfortable",
98065
+ corners: "square",
98066
+ border: null,
98067
+ shadow: null,
98068
+ icon: {
98069
+ style: "plus-minus",
98070
+ position: "right",
98071
+ size: "md",
98072
+ colorToken: "primary"
98073
+ },
98074
+ trigger: {
98075
+ textColorToken: "text",
98076
+ fontWeight: "regular",
98077
+ fontFamily: "heading",
98078
+ fontScale: "lg"
98079
+ },
98080
+ hover: { textColorToken: "primary" },
98081
+ openState: {
98082
+ backgroundColorToken: "surfaceAlt",
98083
+ triggerColorToken: "primary",
98084
+ accent: {
98085
+ edge: "left",
98086
+ colorToken: "primary",
98087
+ thickness: "medium"
98348
98088
  }
98349
- };
98350
- }
98351
- const headerLookCatalog = defineExactCatalog()([
98089
+ },
98090
+ content: { textColorToken: "neutral-700" }
98091
+ };
98092
+ /**
98093
+ * Quiet, airy underlined rows: transparent, spacious, large calm heading-font
98094
+ * questions, a small subtle chevron, and open emphasis carried only by the
98095
+ * question recolouring. For minimal / premium / wellness styles.
98096
+ */
98097
+ const quietUnderlinedAccordionSystem = {
98098
+ background: null,
98099
+ spacing: "spacious",
98100
+ corners: "square",
98101
+ border: null,
98102
+ shadow: null,
98103
+ icon: {
98104
+ style: "chevron",
98105
+ position: "right",
98106
+ size: "sm",
98107
+ colorToken: "muted"
98108
+ },
98109
+ trigger: {
98110
+ textColorToken: "text",
98111
+ fontWeight: "regular",
98112
+ fontFamily: "heading",
98113
+ fontScale: "lg"
98114
+ },
98115
+ hover: { textColorToken: "primary" },
98116
+ openState: { triggerColorToken: "primary" },
98117
+ content: { textColorToken: "neutral-700" }
98118
+ };
98119
+ /**
98120
+ * Soft contained panel: a gentle surface box with soft corners, a hairline
98121
+ * border and a low shadow, heading-font questions at a moderate size, chevron,
98122
+ * and a tinted open state. For clean, trustworthy, appointment-led styles.
98123
+ */
98124
+ const calmPanelAccordionSystem = {
98125
+ background: {
98126
+ type: "solid",
98127
+ colorToken: "surface"
98128
+ },
98129
+ spacing: "comfortable",
98130
+ corners: "soft",
98131
+ border: {
98132
+ widthClass: "border",
98133
+ colorToken: "border"
98134
+ },
98135
+ shadow: {
98136
+ elevation: "low",
98137
+ softness: "soft",
98138
+ position: "bottom"
98139
+ },
98140
+ icon: {
98141
+ style: "chevron",
98142
+ position: "right",
98143
+ size: "md",
98144
+ colorToken: "primary"
98145
+ },
98146
+ trigger: {
98147
+ textColorToken: "text",
98148
+ fontWeight: "medium",
98149
+ fontFamily: "heading",
98150
+ fontScale: "md"
98151
+ },
98152
+ hover: {
98153
+ backgroundColorToken: "primary/5",
98154
+ textColorToken: "primary"
98155
+ },
98156
+ openState: {
98157
+ backgroundColorToken: "primary/5",
98158
+ triggerColorToken: "primary"
98159
+ },
98160
+ content: { textColorToken: "neutral-700" }
98161
+ };
98162
+ /**
98163
+ * Bold bordered panel: a strong-bordered surface box, bold heading-font
98164
+ * questions, large plus/minus marks, and a high-emphasis tinted + accented
98165
+ * open state. For confident, conversion-led, high-energy styles.
98166
+ */
98167
+ const boldBorderedAccordionSystem = {
98168
+ background: {
98169
+ type: "solid",
98170
+ colorToken: "surface"
98171
+ },
98172
+ spacing: "comfortable",
98173
+ corners: "soft",
98174
+ border: {
98175
+ widthClass: "border-2",
98176
+ colorToken: "border"
98177
+ },
98178
+ shadow: null,
98179
+ icon: {
98180
+ style: "plus-minus",
98181
+ position: "right",
98182
+ size: "lg",
98183
+ colorToken: "primary"
98184
+ },
98185
+ trigger: {
98186
+ textColorToken: "text",
98187
+ fontWeight: "bold",
98188
+ fontFamily: "heading",
98189
+ fontScale: "md"
98190
+ },
98191
+ hover: {
98192
+ backgroundColorToken: "primary/10",
98193
+ textColorToken: "primary"
98194
+ },
98195
+ openState: {
98196
+ backgroundColorToken: "primary/10",
98197
+ triggerColorToken: "primary",
98198
+ accent: {
98199
+ edge: "left",
98200
+ colorToken: "primary",
98201
+ thickness: "thick"
98202
+ }
98203
+ },
98204
+ content: { textColorToken: "neutral-700" }
98205
+ };
98206
+ /**
98207
+ * Warm inset tiles: a tinted (surfaceAlt) root with rounded corners and no
98208
+ * border; the open row lifts to the lighter surface colour. Friendly,
98209
+ * hands-on, community styles.
98210
+ */
98211
+ const warmInsetAccordionSystem = {
98212
+ background: {
98213
+ type: "solid",
98214
+ colorToken: "surfaceAlt"
98215
+ },
98216
+ spacing: "comfortable",
98217
+ corners: "rounded",
98218
+ border: null,
98219
+ shadow: null,
98220
+ icon: {
98221
+ style: "circle-plus-minus",
98222
+ position: "right",
98223
+ size: "md",
98224
+ colorToken: "primary"
98225
+ },
98226
+ trigger: {
98227
+ textColorToken: "text",
98228
+ fontWeight: "semibold",
98229
+ fontFamily: "heading",
98230
+ fontScale: "md"
98231
+ },
98232
+ hover: {
98233
+ backgroundColorToken: "primary/5",
98234
+ textColorToken: "primary"
98235
+ },
98236
+ openState: {
98237
+ backgroundColorToken: "surface",
98238
+ triggerColorToken: "primary"
98239
+ },
98240
+ content: { textColorToken: "neutral-700" }
98241
+ };
98242
+ /**
98243
+ * Soft Earth's grounded look: boxless, plus/minus, heading-font questions on
98244
+ * a warm ground, with a quiet open recolour.
98245
+ */
98246
+ const softEarthAccordionSystem = {
98247
+ background: {
98248
+ type: "solid",
98249
+ colorToken: "background"
98250
+ },
98251
+ spacing: "comfortable",
98252
+ corners: "square",
98253
+ border: null,
98254
+ shadow: null,
98255
+ icon: {
98256
+ style: "plus-minus",
98257
+ position: "right",
98258
+ size: "md",
98259
+ colorToken: "primary"
98260
+ },
98261
+ trigger: {
98262
+ textColorToken: "text",
98263
+ fontWeight: "medium",
98264
+ fontFamily: "heading",
98265
+ fontScale: "md"
98266
+ },
98267
+ hover: { textColorToken: "primary" },
98268
+ openState: { triggerColorToken: "primary" },
98269
+ content: { textColorToken: "neutral-700" }
98270
+ };
98271
+ //#endregion
98272
+ //#region ../theme-core/src/cards/siteStyleDefaults.ts
98273
+ /**
98274
+ * Reusable card systems for curated site styles.
98275
+ *
98276
+ * generateCardCss emits a `.card-{id}` class per enabled variant. The
98277
+ * intended convention (block-level role selection is wired in a follow-up) is
98278
+ * a role pair:
98279
+ * - `default` — the quiet, everyday card (most blocks, most of the time)
98280
+ * - `alternative` — the prominent "statement" card for sections that pop
98281
+ * A card-heavy site style may add a third; the schema allows up to three
98282
+ * variants. The planned fallback when a block references a missing variant is
98283
+ * `alternative`, then `default`.
98284
+ *
98285
+ * Keep `default` close to the generated baseline so shared consumers (event
98286
+ * cards, testimonials) stay stable; put the personality in `alternative`.
98287
+ */
98288
+ /**
98289
+ * South West Twerk School: a quiet default surface card plus a high-impact
98290
+ * "statement" card that reproduces the legacy accent-quote testimonial surface
98291
+ * — burgundy fill, light text, a heavy gold left accent bar, and an expressive
98292
+ * asymmetric top-right corner.
98293
+ */
98294
+ const southWestCardSystem = { variants: [{
98295
+ id: "default",
98296
+ name: "Default",
98297
+ enabled: true,
98298
+ priority: 1,
98299
+ background: {
98300
+ type: "solid",
98301
+ colorToken: "surface"
98302
+ },
98303
+ foregroundToken: "text",
98304
+ spacing: "comfortable",
98305
+ corners: "soft",
98306
+ shadow: {
98307
+ elevation: "low",
98308
+ softness: "soft",
98309
+ position: "bottom"
98310
+ }
98311
+ }, {
98312
+ id: "alternative",
98313
+ name: "Statement",
98314
+ enabled: true,
98315
+ priority: 2,
98316
+ background: {
98317
+ type: "solid",
98318
+ colorToken: "primary-700"
98319
+ },
98320
+ foregroundToken: "primaryForeground",
98321
+ spacing: "comfortable",
98322
+ shadow: {
98323
+ elevation: "none",
98324
+ softness: null,
98325
+ position: "bottom"
98326
+ },
98327
+ accentEdge: {
98328
+ edge: "left",
98329
+ colorToken: "secondary",
98330
+ width: "heavy"
98331
+ },
98332
+ cornerRadii: {
98333
+ topLeft: "square",
98334
+ topRight: "expressive",
98335
+ bottomLeft: "square",
98336
+ bottomRight: "square"
98337
+ }
98338
+ }] };
98339
+ const clarityZenCardSystem = { variants: [{
98340
+ id: "default",
98341
+ name: "Default",
98342
+ enabled: true,
98343
+ priority: 1,
98344
+ background: {
98345
+ type: "solid",
98346
+ colorToken: "surface"
98347
+ },
98348
+ foregroundToken: "text",
98349
+ spacing: "comfortable",
98350
+ corners: "rounded",
98351
+ shadow: {
98352
+ elevation: "low",
98353
+ softness: "soft",
98354
+ position: "bottom"
98355
+ }
98356
+ }, {
98357
+ id: "alternative",
98358
+ name: "Statement",
98359
+ enabled: true,
98360
+ priority: 2,
98361
+ background: {
98362
+ type: "solid",
98363
+ colorToken: "surfaceAlt"
98364
+ },
98365
+ foregroundToken: "text",
98366
+ spacing: "comfortable",
98367
+ corners: "rounded",
98368
+ shadow: {
98369
+ elevation: "medium",
98370
+ softness: "soft",
98371
+ position: "bottom"
98372
+ }
98373
+ }] };
98374
+ /**
98375
+ * Original Joy: warm, flat, generously rounded cards on the dark clay ground.
98376
+ * `default` is a quiet brown surface card with cream text; `alternative` is a
98377
+ * burnt-orange statement card for sections that should pop. Both flat (the
98378
+ * look's depth comes from colour, not shadow), matching the bold editorial
98379
+ * feel. Shared by event and testimonial cards.
98380
+ */
98381
+ const originalJoyCardSystem = { variants: [{
98382
+ id: "default",
98383
+ name: "Default",
98384
+ enabled: true,
98385
+ priority: 1,
98386
+ background: {
98387
+ type: "solid",
98388
+ colorToken: "surface"
98389
+ },
98390
+ foregroundToken: "text",
98391
+ spacing: "comfortable",
98392
+ corners: "rounded",
98393
+ shadow: {
98394
+ elevation: "none",
98395
+ softness: null,
98396
+ position: "bottom"
98397
+ }
98398
+ }, {
98399
+ id: "alternative",
98400
+ name: "Statement",
98401
+ enabled: true,
98402
+ priority: 2,
98403
+ background: {
98404
+ type: "solid",
98405
+ colorToken: "primary"
98406
+ },
98407
+ foregroundToken: "primaryForeground",
98408
+ spacing: "comfortable",
98409
+ corners: "rounded",
98410
+ shadow: {
98411
+ elevation: "none",
98412
+ softness: null,
98413
+ position: "bottom"
98414
+ }
98415
+ }] };
98416
+ //#endregion
98417
+ //#region ../theme-core/src/site-styles/testimonialQuotePresets.ts
98418
+ /**
98419
+ * Reusable testimonial quote-mark treatments for curated site styles.
98420
+ *
98421
+ * The quote mark is brand identity the site style owns (analogous to the FAQ
98422
+ * accordion icon); every curated style declares one. `style` is the coarse
98423
+ * selector and the resolver in blocks/vars/testimonials.ts fills in the rest.
98424
+ */
98425
+ /** Large display quotation mark in the heading font. Editorial / calm styles. */
98426
+ const serifDisplayQuote = { style: "serif-display" };
98427
+ /** Punchy quotation mark in the secondary accent colour. Bold / accent styles. */
98428
+ const accentGlyphQuote = { style: "accent-glyph" };
98429
+ /**
98430
+ * Curated library of gradient presets.
98431
+ * All gradients use theme color tokens, so they adapt to the site's palette.
98432
+ */
98433
+ const GRADIENT_PRESETS = [
98352
98434
  {
98353
- id: asHeaderLookId("clean-base"),
98354
- label: "Clean base",
98355
- visualTreatment: "solid-neutral",
98356
- layoutBehavior: "sticky",
98357
- configuration: {
98358
- structure: "inline-classic",
98359
- treatment: "solid-neutral",
98360
- behavior: "sticky"
98361
- },
98362
- openingRequirement: "none",
98363
- logoAccommodations: inlineClassicLogoAccommodations,
98364
- compile: cleanBaseHeader
98435
+ id: "primary-secondary",
98436
+ name: "Primary to Secondary",
98437
+ description: "Blend your primary and secondary brand colors",
98438
+ type: "linear",
98439
+ angle: 135,
98440
+ stops: [{
98441
+ color: "primary-500",
98442
+ position: 0
98443
+ }, {
98444
+ color: "secondary-500",
98445
+ position: 100
98446
+ }]
98365
98447
  },
98366
98448
  {
98367
- id: asHeaderLookId("classic-centered-nav"),
98368
- label: "Centered nav",
98369
- visualTreatment: "solid-neutral",
98370
- layoutBehavior: "sticky",
98371
- configuration: {
98372
- structure: "inline-classic",
98373
- treatment: "solid-neutral",
98374
- behavior: "sticky"
98375
- },
98376
- openingRequirement: "none",
98377
- maxRecommendedNavItems: 6,
98378
- logoAccommodations: inlineClassicLogoAccommodations,
98379
- compile: classicCenteredNavHeader
98449
+ id: "primary-accent",
98450
+ name: "Primary to Accent",
98451
+ description: "Energetic gradient from primary to accent",
98452
+ type: "linear",
98453
+ angle: 135,
98454
+ stops: [{
98455
+ color: "primary-500",
98456
+ position: 0
98457
+ }, {
98458
+ color: "accent-500",
98459
+ position: 100
98460
+ }]
98380
98461
  },
98381
98462
  {
98382
- id: asHeaderLookId("brand-solid"),
98383
- label: "Brand solid",
98384
- visualTreatment: "solid-brand",
98385
- layoutBehavior: "sticky-shrink",
98386
- configuration: {
98387
- structure: "inline-classic",
98388
- treatment: "solid-brand",
98389
- behavior: "sticky-shrink"
98390
- },
98391
- openingRequirement: "none",
98392
- logoAccommodations: inlineClassicLogoAccommodations,
98393
- compile: solidBrandHeader
98463
+ id: "secondary-accent",
98464
+ name: "Secondary to Accent",
98465
+ description: "Vibrant secondary to accent blend",
98466
+ type: "linear",
98467
+ angle: 135,
98468
+ stops: [{
98469
+ color: "secondary-500",
98470
+ position: 0
98471
+ }, {
98472
+ color: "accent-500",
98473
+ position: 100
98474
+ }]
98394
98475
  },
98395
98476
  {
98396
- id: asHeaderLookId("serif-line"),
98397
- label: "Serif line",
98398
- visualTreatment: "light-serif",
98399
- layoutBehavior: "sticky",
98400
- configuration: {
98401
- structure: "centered-stack",
98402
- treatment: "light-serif",
98403
- behavior: "sticky"
98404
- },
98405
- openingRequirement: "none",
98406
- maxRecommendedNavItems: 6,
98407
- logoAccommodations: centeredLogoAccommodations,
98408
- compile: serifLineHeader
98477
+ id: "primary-light-dark",
98478
+ name: "Primary Light to Dark",
98479
+ description: "Subtle primary color fade",
98480
+ type: "linear",
98481
+ angle: 180,
98482
+ stops: [{
98483
+ color: "primary-500",
98484
+ position: 0
98485
+ }, {
98486
+ color: "primary-900",
98487
+ position: 100
98488
+ }]
98409
98489
  },
98410
98490
  {
98411
- id: asHeaderLookId("centered-calm"),
98412
- label: "Centered calm",
98413
- visualTreatment: "light-serif",
98414
- layoutBehavior: "normal-flow",
98415
- configuration: {
98416
- structure: "centered-stack",
98417
- treatment: "light-serif",
98418
- behavior: "normal-flow"
98419
- },
98420
- openingRequirement: "none",
98421
- maxRecommendedNavItems: 5,
98422
- logoAccommodations: centeredLogoAccommodations,
98423
- compile: centeredCalmHeader
98491
+ id: "primary-dark-light",
98492
+ name: "Primary Dark to Light",
98493
+ description: "Reverse primary fade",
98494
+ type: "linear",
98495
+ angle: 180,
98496
+ stops: [{
98497
+ color: "primary-900",
98498
+ position: 0
98499
+ }, {
98500
+ color: "primary-50",
98501
+ position: 100
98502
+ }]
98424
98503
  },
98425
98504
  {
98426
- id: asHeaderLookId("practical-utility"),
98427
- label: "Practical utility",
98428
- visualTreatment: "solid-neutral",
98429
- layoutBehavior: "sticky-shrink",
98430
- configuration: {
98431
- structure: "inline-classic",
98432
- treatment: "solid-neutral",
98433
- behavior: "sticky-shrink"
98434
- },
98435
- openingRequirement: "none",
98436
- requiresProminentCta: true,
98437
- logoAccommodations: inlineClassicLogoAccommodations,
98438
- compile: practicalUtilityHeader
98505
+ id: "secondary-light-dark",
98506
+ name: "Secondary Light to Dark",
98507
+ description: "Subtle secondary color fade",
98508
+ type: "linear",
98509
+ angle: 180,
98510
+ stops: [{
98511
+ color: "secondary-500",
98512
+ position: 0
98513
+ }, {
98514
+ color: "secondary-900",
98515
+ position: 100
98516
+ }]
98439
98517
  },
98440
98518
  {
98441
- id: asHeaderLookId("minimal-transparent"),
98442
- label: "Minimal transparent",
98443
- visualTreatment: "minimal-transparent",
98444
- layoutBehavior: "normal-flow",
98445
- configuration: {
98446
- structure: "inline-classic",
98447
- treatment: "minimal-transparent",
98448
- behavior: "normal-flow"
98449
- },
98450
- openingRequirement: "reserved-space-ok",
98451
- logoAccommodations: inlineClassicLogoAccommodations,
98452
- compile: minimalTransparentHeader
98519
+ id: "accent-light-dark",
98520
+ name: "Accent Light to Dark",
98521
+ description: "Accent color depth fade",
98522
+ type: "linear",
98523
+ angle: 180,
98524
+ stops: [{
98525
+ color: "accent-500",
98526
+ position: 0
98527
+ }, {
98528
+ color: "accent-900",
98529
+ position: 100
98530
+ }]
98453
98531
  },
98454
98532
  {
98455
- id: asHeaderLookId("transparent-overlay"),
98456
- label: "Transparent overlay",
98457
- visualTreatment: "transparent-overlay",
98458
- layoutBehavior: "fixed-overlay",
98459
- configuration: {
98460
- structure: "inline-classic",
98461
- treatment: "transparent-overlay",
98462
- behavior: "fixed-overlay"
98463
- },
98464
- openingRequirement: "requires-image-hero-with-contrast-overlay",
98465
- maxRecommendedNavItems: 5,
98466
- logoAccommodations: overlayLogoAccommodations,
98467
- compile: transparentOverlayHeader
98533
+ id: "background-surface",
98534
+ name: "Background to Surface",
98535
+ description: "Subtle depth using base colors",
98536
+ type: "linear",
98537
+ angle: 180,
98538
+ stops: [{
98539
+ color: "background",
98540
+ position: 0
98541
+ }, {
98542
+ color: "surface",
98543
+ position: 100
98544
+ }]
98468
98545
  },
98469
98546
  {
98470
- id: asHeaderLookId("floating-glass"),
98471
- label: "Floating glass",
98472
- visualTreatment: "floating-glass",
98473
- layoutBehavior: "fixed-floating",
98474
- configuration: {
98475
- structure: "floating-shell",
98476
- treatment: "floating-glass",
98477
- behavior: "fixed-floating"
98478
- },
98479
- openingRequirement: "requires-image-hero-with-contrast-overlay",
98480
- maxRecommendedNavItems: 5,
98481
- logoAccommodations: overlayLogoAccommodations,
98482
- compile: floatingGlassHeader
98547
+ id: "neutral-fade",
98548
+ name: "Neutral Gradient",
98549
+ description: "Elegant neutral color fade",
98550
+ type: "linear",
98551
+ angle: 180,
98552
+ stops: [{
98553
+ color: "neutral-900",
98554
+ position: 0
98555
+ }, {
98556
+ color: "neutral-50",
98557
+ position: 100
98558
+ }]
98559
+ },
98560
+ {
98561
+ id: "primary-glow",
98562
+ name: "Primary glow",
98563
+ description: "A soft top-centred glow using your primary palette",
98564
+ type: "radial",
98565
+ shape: "ellipse",
98566
+ position: "top center",
98567
+ stops: [{
98568
+ color: "primary-900",
98569
+ position: 0
98570
+ }, {
98571
+ color: "primary-950",
98572
+ position: 100
98573
+ }],
98574
+ foreground: {
98575
+ textColor: "onPrimary900",
98576
+ headingColor: "onPrimary900",
98577
+ linkColor: "onPrimary900",
98578
+ supportingColor: "onPrimary900"
98579
+ }
98580
+ },
98581
+ {
98582
+ id: "accent-glow",
98583
+ name: "Accent glow",
98584
+ description: "A soft top-centred glow using your accent palette",
98585
+ type: "radial",
98586
+ shape: "ellipse",
98587
+ position: "top center",
98588
+ stops: [{
98589
+ color: "accent-900",
98590
+ position: 0
98591
+ }, {
98592
+ color: "accent-950",
98593
+ position: 100
98594
+ }],
98595
+ foreground: {
98596
+ textColor: "onAccent900",
98597
+ headingColor: "onAccent900",
98598
+ linkColor: "onAccent900",
98599
+ supportingColor: "onAccent900"
98600
+ }
98601
+ },
98602
+ {
98603
+ id: "primary-secondary-accent",
98604
+ name: "Brand Trio",
98605
+ description: "All three brand colors in harmony",
98606
+ type: "linear",
98607
+ angle: 135,
98608
+ stops: [
98609
+ {
98610
+ color: "primary-500",
98611
+ position: 0
98612
+ },
98613
+ {
98614
+ color: "secondary-500",
98615
+ position: 50
98616
+ },
98617
+ {
98618
+ color: "accent-500",
98619
+ position: 100
98620
+ }
98621
+ ]
98483
98622
  }
98484
- ]);
98485
- const guaranteedFallbackHeaderLookId = asHeaderLookId("clean-base");
98486
- new Set(headerLookCatalog.map((look) => headerConfigurationKey(look.configuration)));
98487
- const headerLooksById = new Map(headerLookCatalog.map((look) => [look.id, look]));
98488
- function headerConfigurationKey(configuration) {
98489
- return `${configuration.structure}:${configuration.treatment}:${configuration.behavior}`;
98490
- }
98491
- function getHeaderLook(id) {
98492
- return headerLooksById.get(id) ?? null;
98493
- }
98494
- function getHeaderLookOrThrow(id) {
98495
- const look = getHeaderLook(id);
98496
- if (!look) throw new Error(`Unknown Theme V2 header Look: ${id}`);
98497
- return look;
98623
+ ].map((preset) => ({
98624
+ ...preset,
98625
+ id: preset.id,
98626
+ stops: preset.stops
98627
+ }));
98628
+ const GRADIENT_PRESET_IDS = GRADIENT_PRESETS.map((preset) => preset.id);
98629
+ const gradientPresetIdSet = new Set(GRADIENT_PRESET_IDS);
98630
+ const gradientPresetById = Object.fromEntries(GRADIENT_PRESETS.map((preset) => [preset.id, preset]));
98631
+ function parseGradientPresetId(value) {
98632
+ if (typeof value !== "string") return null;
98633
+ const normalized = value.trim();
98634
+ if (!gradientPresetIdSet.has(normalized)) return null;
98635
+ return normalized;
98498
98636
  }
98499
- function rejectReasonsForLook(look, context) {
98500
- const brandPresentation = resolveHeaderBrandPresentation({
98501
- logo: context.logo,
98502
- accommodations: look.logoAccommodations
98503
- });
98504
- return [
98505
- ...look.maxRecommendedNavItems !== void 0 && context.navigation.itemCount > look.maxRecommendedNavItems ? ["too-many-nav-items"] : [],
98506
- ...brandPresentation.kind === "rejected" ? brandPresentation.reasons : [],
98507
- ...look.requiresProminentCta && context.cta.importance === "low" ? ["cta-treatment-unavailable"] : []
98508
- ];
98637
+ function getGradientPreset(id) {
98638
+ return gradientPresetById[id];
98509
98639
  }
98510
- function resolveHeaderLook(input) {
98511
- const context = mergeHeaderSelectionContext(input.context);
98512
- const result = resolveLook({
98513
- recommendedLookIds: input.recommendedLookIds,
98514
- guaranteedFallbackLookId: guaranteedFallbackHeaderLookId,
98515
- getLookOrThrow: getHeaderLookOrThrow,
98516
- context,
98517
- rejectReasonsForLook,
98518
- compileLook: (look) => look.compile(input.theme)
98519
- });
98520
- return {
98521
- selectedLookId: result.selectedLookId,
98522
- selectedLook: result.selectedLook,
98523
- header: result.compiled,
98524
- brandPresentation: requireHeaderBrandPresentationSelection(resolveHeaderBrandPresentation({
98525
- logo: context.logo,
98526
- accommodations: result.selectedLook.logoAccommodations,
98527
- allowDisplayFallback: true
98528
- })),
98529
- rejected: result.rejected
98530
- };
98640
+ //#endregion
98641
+ //#region ../theme-core/src/gradients/utils.ts
98642
+ /**
98643
+ * Convert a GradientConfig to a CSS gradient string
98644
+ *
98645
+ * @param config - The gradient configuration using theme tokens
98646
+ * @param tokens - Map of theme color tokens to hex values
98647
+ * @returns CSS gradient string (e.g., "linear-gradient(180deg, #3b82f6 0%, #f59e0b 100%)")
98648
+ */
98649
+ function gradientToCss(config, tokens) {
98650
+ const stops = config.stops.map((stop) => {
98651
+ return `${tokens[stop.color] ?? "#000000"} ${stop.position}%`;
98652
+ }).join(", ");
98653
+ const type = config.type ?? "linear";
98654
+ if (type === "radial") {
98655
+ const position = config.position ?? "center";
98656
+ return `radial-gradient(${config.shape ?? "circle"} at ${position}, ${stops})`;
98657
+ }
98658
+ if (type === "conic") {
98659
+ const position = config.position ?? "center";
98660
+ return `conic-gradient(from ${config.angle ?? 0}deg at ${position}, ${stops})`;
98661
+ }
98662
+ return `linear-gradient(${config.angle ?? 180}deg, ${stops})`;
98531
98663
  }
98532
98664
  //#endregion
98533
98665
  //#region ../theme-core/src/site-styles/footerLooks.ts
@@ -102594,38 +102726,109 @@ function canonicalHeaderSelectionInput(layoutId, styleId) {
102594
102726
  }
102595
102727
  };
102596
102728
  }
102597
- function applySiteChromeLooks({ theme, siteStyle, footerPresentation, headerLookId, headerLayoutId, headerStyleId, footerLookId, headerSelectionContext }) {
102729
+ function applySiteChromeLooks({ theme, siteStyle, compilationPlan }) {
102730
+ const headerDirective = compilationPlan.header;
102731
+ const headerResult = compileHeaderDirective({
102732
+ theme,
102733
+ siteStyle,
102734
+ directive: headerDirective
102735
+ });
102736
+ const footerResult = compilationPlan.kind === "replace-site-style" ? compileReplacementFooter({
102737
+ theme,
102738
+ siteStyle,
102739
+ footerLookId: compilationPlan.footerLookId,
102740
+ headerSelection: headerResult.headerCompilation.kind === "recompiled" ? headerResult.headerCompilation.result : headerResult.headerCompilation,
102741
+ brandPresentation: compilationPlan.header.brandPresentation
102742
+ }) : compileIncrementalFooter({
102743
+ theme,
102744
+ siteStyle,
102745
+ directive: compilationPlan.footer
102746
+ });
102747
+ return {
102748
+ theme: themeSchema.parse({
102749
+ ...theme,
102750
+ header: headerResult.header,
102751
+ footer: footerResult.footer
102752
+ }),
102753
+ headerCompilation: headerResult.headerCompilation,
102754
+ resolvedHeaderSelection: headerResult.resolvedHeaderSelection,
102755
+ footerCompilation: footerResult.footerCompilation,
102756
+ resolvedFooterLookId: footerResult.resolvedFooterLookId
102757
+ };
102758
+ }
102759
+ function compileHeaderDirective(input) {
102760
+ if (input.directive.kind === "preserve") return {
102761
+ header: input.directive.header,
102762
+ headerCompilation: {
102763
+ kind: "preserved",
102764
+ selection: input.directive.selection
102765
+ },
102766
+ resolvedHeaderSelection: input.directive.selection
102767
+ };
102768
+ const { headerLookId, headerLayoutId, headerStyleId } = input.directive.selection;
102598
102769
  const canonicalHeaderSelection = canonicalHeaderSelectionInput(headerLayoutId, headerStyleId);
102599
102770
  const headerSelection = resolveHeaderLook({
102600
- theme,
102601
- recommendedLookIds: headerLookId ? [headerLookId] : siteStyle.recommendedHeaderLookIds,
102602
- context: headerSelectionContext
102771
+ theme: input.theme,
102772
+ recommendedLookIds: headerLookId ? [headerLookId] : input.siteStyle.recommendedHeaderLookIds,
102773
+ context: input.directive.context
102603
102774
  });
102604
102775
  const headerLayoutStyleSelection = canonicalHeaderSelection.kind === "canonical" ? resolveHeaderLayoutStyleSelection({
102605
102776
  layoutId: canonicalHeaderSelection.selection.layoutId,
102606
102777
  styleId: canonicalHeaderSelection.selection.styleId
102607
- }).selection : resolveLegacyHeaderLookAlias(headerSelection.selectedLookId) ?? siteStyle.defaultHeaderSelection;
102608
- const header = canonicalHeaderSelection.kind === "canonical" ? compileHeaderLayoutStyleSelection(theme, headerLayoutStyleSelection) : headerSelection.header;
102609
- const headerWithBrandPresentation = headerSelectionContext?.logo ? applyHeaderBrandPresentation(header, headerSelection.brandPresentation) : header;
102778
+ }).selection : resolveLegacyHeaderLookAlias(headerSelection.selectedLookId) ?? input.siteStyle.defaultHeaderSelection;
102779
+ const header = canonicalHeaderSelection.kind === "canonical" ? compileHeaderLayoutStyleSelection(input.theme, headerLayoutStyleSelection) : headerSelection.header;
102780
+ const headerWithBrandPresentation = input.directive.brandPresentation.kind === "apply-logo-context" ? applyHeaderBrandPresentation(header, headerSelection.brandPresentation) : header;
102610
102781
  const resolvedHeaderLookId = canonicalHeaderSelection.kind === "canonical" ? findLegacyHeaderLookIdForSelection(headerLayoutStyleSelection) : headerSelection.selectedLookId;
102611
- const footerSelection = resolveFooterLook({
102612
- theme: footerPresentation === void 0 ? theme : {
102613
- ...theme,
102614
- footer: footerPresentation
102782
+ return {
102783
+ header: headerWithBrandPresentation,
102784
+ headerCompilation: {
102785
+ kind: "recompiled",
102786
+ result: headerSelection
102615
102787
  },
102616
- recommendedLookIds: footerLookId ? [footerLookId] : siteStyle.recommendedFooterLookIds
102788
+ resolvedHeaderSelection: {
102789
+ headerLookId: resolvedHeaderLookId,
102790
+ headerLayoutId: headerLayoutStyleSelection.layoutId,
102791
+ headerStyleId: headerLayoutStyleSelection.styleId
102792
+ }
102793
+ };
102794
+ }
102795
+ function compileReplacementFooter(input) {
102796
+ const result = resolveFooterLook({
102797
+ theme: input.theme,
102798
+ recommendedLookIds: input.footerLookId ? [input.footerLookId] : input.siteStyle.recommendedFooterLookIds
102617
102799
  });
102618
- const footerWithBrandPresentation = footerPresentation === void 0 && headerSelectionContext?.logo ? applyFooterBrandPresentation(footerSelection.footer, headerSelection.brandPresentation) : footerSelection.footer;
102619
102800
  return {
102620
- theme: themeSchema.parse({
102621
- ...theme,
102622
- header: headerWithBrandPresentation,
102623
- footer: footerWithBrandPresentation
102624
- }),
102625
- headerSelection,
102626
- headerLayoutStyleSelection,
102627
- resolvedHeaderLookId,
102628
- footerSelection
102801
+ footer: input.brandPresentation.kind === "apply-logo-context" && "brandPresentation" in input.headerSelection ? applyFooterBrandPresentation(result.footer, input.headerSelection.brandPresentation) : result.footer,
102802
+ footerCompilation: {
102803
+ kind: "applied-look",
102804
+ result
102805
+ },
102806
+ resolvedFooterLookId: result.selectedLookId
102807
+ };
102808
+ }
102809
+ function compileIncrementalFooter(input) {
102810
+ if (input.directive.kind === "preserve") return {
102811
+ footer: input.directive.footer,
102812
+ footerCompilation: {
102813
+ kind: "preserved",
102814
+ footerLookId: input.directive.footerLookId
102815
+ },
102816
+ resolvedFooterLookId: input.directive.footerLookId
102817
+ };
102818
+ const result = resolveFooterLook({
102819
+ theme: {
102820
+ ...input.theme,
102821
+ footer: input.directive.footer
102822
+ },
102823
+ recommendedLookIds: input.directive.footerLookId ? [input.directive.footerLookId] : input.siteStyle.recommendedFooterLookIds
102824
+ });
102825
+ return {
102826
+ footer: result.footer,
102827
+ footerCompilation: {
102828
+ kind: "applied-look",
102829
+ result
102830
+ },
102831
+ resolvedFooterLookId: result.selectedLookId
102629
102832
  };
102630
102833
  }
102631
102834
  function applyHeaderBrandPresentation(header, presentation) {
@@ -102664,17 +102867,8 @@ function footerLogoSizeFromBrandPresentation(size) {
102664
102867
  default: return size;
102665
102868
  }
102666
102869
  }
102667
- /**
102668
- * High-level, site-style-aware compiler. Resolves the user's button style and
102669
- * palette selections into theme tokens. Palette authority is always supplied
102670
- * as a complete resolved curated/site selection or an explicit draft.
102671
- *
102672
- * Returns the resolved IDs so the caller can persist auto-pick decisions, plus
102673
- * any fallback warnings the UI can surface as "we changed your selection"
102674
- * notices.
102675
- */
102676
102870
  function compileSiteThemeFromSelections(input) {
102677
- const { siteStyle, buttonStyleSelection, typography, footerPresentation, headerLookId, headerLayoutId, headerStyleId, footerLookId, headerSelectionContext } = input;
102871
+ const { siteStyle, buttonStyleSelection, typography, compilationPlan } = input;
102678
102872
  const defaultButtonStyle = defaultButtonStyleSelectionForSiteStyle(siteStyle);
102679
102873
  const requestedButtonStyle = buttonStyleSelection ?? defaultButtonStyle;
102680
102874
  const acceptsRequestedButtonStyle = siteStyle.buttonStyleChoices.some((choice) => choice.styleId === requestedButtonStyle.styleId);
@@ -102691,30 +102885,19 @@ function compileSiteThemeFromSelections(input) {
102691
102885
  resolvedPalette: input.resolvedPalette
102692
102886
  }), siteStyle), typography ?? siteStyle.typography, siteStyle.heroTypography),
102693
102887
  siteStyle,
102694
- footerPresentation,
102695
- headerLookId,
102696
- headerLayoutId,
102697
- headerStyleId,
102698
- footerLookId,
102699
- headerSelectionContext
102888
+ compilationPlan
102700
102889
  });
102890
+ const requestedSelections = requestedSelectionsForPlan(compilationPlan);
102701
102891
  const commonResult = {
102702
102892
  theme: withSiteStyleMetadata(siteChromeResult.theme, siteStyle),
102703
- requestedSelections: {
102704
- headerLookId: headerLookId ?? null,
102705
- headerLayoutId: headerLayoutId ?? null,
102706
- headerStyleId: headerStyleId ?? null,
102707
- footerLookId: footerLookId ?? null
102708
- },
102893
+ requestedSelections,
102709
102894
  resolvedSelections: {
102710
102895
  buttonStyleSelection: resolvedButtonStyle,
102711
- headerLookId: siteChromeResult.resolvedHeaderLookId,
102712
- headerLayoutId: siteChromeResult.headerLayoutStyleSelection.layoutId,
102713
- headerStyleId: siteChromeResult.headerLayoutStyleSelection.styleId,
102714
- footerLookId: siteChromeResult.footerSelection.selectedLookId
102896
+ ...siteChromeResult.resolvedHeaderSelection,
102897
+ footerLookId: siteChromeResult.resolvedFooterLookId
102715
102898
  },
102716
- headerSelection: siteChromeResult.headerSelection,
102717
- footerSelection: siteChromeResult.footerSelection,
102899
+ headerCompilation: siteChromeResult.headerCompilation,
102900
+ footerCompilation: siteChromeResult.footerCompilation,
102718
102901
  warnings
102719
102902
  };
102720
102903
  return {
@@ -102725,6 +102908,16 @@ function compileSiteThemeFromSelections(input) {
102725
102908
  }
102726
102909
  };
102727
102910
  }
102911
+ function requestedSelectionsForPlan(plan) {
102912
+ if (plan.kind === "replace-site-style") return {
102913
+ ...plan.header.selection,
102914
+ footerLookId: plan.footerLookId
102915
+ };
102916
+ return {
102917
+ ...plan.header.selection,
102918
+ footerLookId: plan.footer.footerLookId
102919
+ };
102920
+ }
102728
102921
  function siteStyleIdFromTheme(theme) {
102729
102922
  const rawSiteStyleId = theme?.siteStyleId;
102730
102923
  if (!rawSiteStyleId) return null;
@@ -108755,7 +108948,7 @@ const shopModeSchema = z$1.enum([
108755
108948
  "cart",
108756
108949
  "checkout"
108757
108950
  ]);
108758
- const contentEntrySchema$2 = z$1.object({
108951
+ const contentEntrySchema = z$1.object({
108759
108952
  id: z$1.string().nullable().optional(),
108760
108953
  slug: z$1.string().nullable().optional()
108761
108954
  }).nullable();
@@ -108789,7 +108982,7 @@ const shopSourceSchema = z$1.object({
108789
108982
  checkoutButtonText: z$1.string().optional(),
108790
108983
  clearButtonText: z$1.string().optional(),
108791
108984
  submitButtonText: z$1.string().optional(),
108792
- contentEntry: contentEntrySchema$2.optional(),
108985
+ contentEntry: contentEntrySchema.optional(),
108793
108986
  passes: z$1.array(publicPassProductSchema).nullable().optional(),
108794
108987
  memberships: z$1.array(publicMembershipProductSchema).nullable().optional(),
108795
108988
  products: z$1.array(publicProductSchema).nullable().optional(),
@@ -109365,22 +109558,6 @@ const checkoutBlockDefinition = {
109365
109558
  }),
109366
109559
  runtime: checkoutBlockRuntime
109367
109560
  };
109368
- //#endregion
109369
- //#region ../blocks/src/system/blocks/event-registration.shared.ts
109370
- /**
109371
- * Flat occurrence context passed from `PageRenderer.$root.occurrenceContext`.
109372
- * Kept in a shared module so the block definition and runtime contracts can
109373
- * depend on the same schema without creating an initialization cycle.
109374
- */
109375
- const occurrenceContextSchema$1 = z$1.object({
109376
- id: z$1.string(),
109377
- seriesId: z$1.string(),
109378
- startsAt: z$1.string(),
109379
- endsAt: z$1.string(),
109380
- timeZone: z$1.string(),
109381
- capacityOverride: z$1.number().nullable().optional(),
109382
- overrides: z$1.record(z$1.string(), z$1.unknown()).nullable().optional()
109383
- }).nullable();
109384
109561
  const unsupportedEventRegistrationPageSurfaceSubjectSchema = z$1.object({
109385
109562
  kind: z$1.literal("unsupported"),
109386
109563
  reason: z$1.enum([
@@ -109441,12 +109618,6 @@ function resolveEventRegistrationScope(context) {
109441
109618
  kind: "unsupportedPageSurfaceSubject",
109442
109619
  reason: context.subject.reason
109443
109620
  };
109444
- const entrySlug = context.contentEntry?.slug;
109445
- const entryContentType = context.contentEntry?.contentTypeSlug;
109446
- if (entrySlug && entryContentType && isEventContentType(entryContentType)) return {
109447
- kind: "legacyEventSlug",
109448
- slug: entrySlug
109449
- };
109450
109621
  return { kind: "unscoped" };
109451
109622
  }
109452
109623
  function applyEventRegistrationScope(events, scope) {
@@ -109457,7 +109628,6 @@ function applyEventRegistrationScope(events, scope) {
109457
109628
  const seriesIds = new Set(scope.seriesIds);
109458
109629
  return events.filter((event) => seriesIds.has(event.seriesId));
109459
109630
  }
109460
- case "legacyEventSlug": return events.filter((event) => event.slug === scope.slug);
109461
109631
  case "unsupportedPageSurfaceSubject": return [];
109462
109632
  case "unscoped": return [...events];
109463
109633
  }
@@ -109467,29 +109637,10 @@ function resolveEventRegistrationScopedEvents(events, context) {
109467
109637
  }
109468
109638
  //#endregion
109469
109639
  //#region ../blocks/src/system/runtime/nodes/course-registration.interactive.ts
109470
- const contentEntrySchema$1 = z$1.object({
109471
- id: z$1.string(),
109472
- slug: z$1.string(),
109473
- contentTypeSlug: z$1.string()
109474
- });
109475
- const courseEntrySubrouteContextSchema = z$1.union([z$1.object({
109476
- kind: z$1.literal("course-run"),
109477
- run: z$1.object({
109478
- courseId: z$1.string(),
109479
- seriesId: z$1.string(),
109480
- runSlug: z$1.string(),
109481
- runName: z$1.string().nullable()
109482
- })
109483
- }), z$1.object({
109484
- kind: z$1.literal("event-occurrence"),
109485
- occurrence: occurrenceContextSchema$1
109486
- })]);
109487
109640
  const courseRegistrationSourceSchema = z$1.object({
109488
109641
  siteId: z$1.string().optional(),
109489
109642
  apiBaseUrl: z$1.string().optional(),
109490
109643
  portalToken: z$1.string().nullable().optional(),
109491
- contentEntry: contentEntrySchema$1.nullable().optional(),
109492
- entrySubrouteContext: courseEntrySubrouteContextSchema.nullable().optional(),
109493
109644
  subject: eventRegistrationPageSurfaceSubjectSchema.nullable().optional(),
109494
109645
  courses: z$1.array(publicCourseSchema).nullable().optional(),
109495
109646
  className: z$1.string().nullable().optional(),
@@ -109511,8 +109662,6 @@ const courseRegistrationDisplaySchema = z$1.object({
109511
109662
  summaryButtonText: z$1.string()
109512
109663
  });
109513
109664
  const courseRegistrationHydrationSchema = z$1.object({
109514
- contentEntry: contentEntrySchema$1.nullable().optional(),
109515
- entrySubrouteContext: courseEntrySubrouteContextSchema.nullable().optional(),
109516
109665
  subject: eventRegistrationPageSurfaceSubjectSchema.nullable().optional(),
109517
109666
  courses: z$1.array(publicCourseSchema).nullable().optional(),
109518
109667
  showSessions: z$1.boolean().optional(),
@@ -109551,8 +109700,6 @@ const courseRegistrationBlockRuntime = defineClientOwnedBlockRuntime({
109551
109700
  buildRender: (source) => ({
109552
109701
  display: buildCourseRegistrationDisplay(source),
109553
109702
  hydration: {
109554
- contentEntry: source.contentEntry ?? null,
109555
- entrySubrouteContext: source.entrySubrouteContext ?? null,
109556
109703
  subject: source.subject ?? null,
109557
109704
  courses: source.courses ?? null,
109558
109705
  showSessions: source.showSessions,
@@ -109710,11 +109857,6 @@ const courseRegistrationBlockDefinition = {
109710
109857
  text({ as: "h2" }, bind$1("content.heading"), when("content.heading")),
109711
109858
  richText({ className: "rb-prose rb-max-w-none" }, bind$1("content.description"), when("content.description")),
109712
109859
  courseRegistration(withApiBindings({
109713
- contentEntry: { $bind: { from: "$root.contentEntry" } },
109714
- entrySubrouteContext: { $bind: {
109715
- from: "$root.entrySubrouteContext",
109716
- fallback: null
109717
- } },
109718
109860
  subject: { $bind: {
109719
109861
  from: "$root.subject",
109720
109862
  fallback: null
@@ -109750,7 +109892,7 @@ const courseRegistrationBlockDefinition = {
109750
109892
  runtime: courseRegistrationBlockRuntime,
109751
109893
  dataSchemas: { courses: publicCoursesArraySchema.optional() },
109752
109894
  dataLoaders: { courses: {
109753
- endpoint: "listPublicCourses",
109895
+ endpoint: "listPublicWholeSeriesOfferings",
109754
109896
  params: {
109755
109897
  siteId: { $bind: { from: "$root.siteId" } },
109756
109898
  limit: "50",
@@ -110001,6 +110143,22 @@ const giftingBlockDefinition = {
110001
110143
  } }
110002
110144
  };
110003
110145
  //#endregion
110146
+ //#region ../blocks/src/system/blocks/event-registration.shared.ts
110147
+ /**
110148
+ * Flat occurrence context passed from `PageRenderer.$root.occurrenceContext`.
110149
+ * Kept in a shared module so the block definition and runtime contracts can
110150
+ * depend on the same schema without creating an initialization cycle.
110151
+ */
110152
+ const occurrenceContextSchema$1 = z$1.object({
110153
+ id: z$1.string(),
110154
+ seriesId: z$1.string(),
110155
+ startsAt: z$1.string(),
110156
+ endsAt: z$1.string(),
110157
+ timeZone: z$1.string(),
110158
+ capacityOverride: z$1.number().nullable().optional(),
110159
+ overrides: z$1.record(z$1.string(), z$1.unknown()).nullable().optional()
110160
+ }).nullable();
110161
+ //#endregion
110004
110162
  //#region ../blocks/src/system/runtime/nodes/event-registration/wizardSteps.ts
110005
110163
  /**
110006
110164
  * Steps that are part of the main wizard and should show the step indicator
@@ -110116,11 +110274,6 @@ const EVENT_REGISTRATION_SHELL_STEP_LABELS = [
110116
110274
  "Details",
110117
110275
  "Payment"
110118
110276
  ];
110119
- const contentEntrySchema = z$1.object({
110120
- id: z$1.string(),
110121
- slug: z$1.string(),
110122
- contentTypeSlug: z$1.string()
110123
- });
110124
110277
  const eventRegistrationPublicEventSchema = z$1.preprocess(normalizeEventRegistrationEventInput, publicEventSchema);
110125
110278
  const eventRegistrationSourceSchema = z$1.object({
110126
110279
  siteId: z$1.string().optional(),
@@ -110128,7 +110281,6 @@ const eventRegistrationSourceSchema = z$1.object({
110128
110281
  portalToken: z$1.string().nullable().optional(),
110129
110282
  previewToken: z$1.string().nullable().optional(),
110130
110283
  occurrenceContext: occurrenceContextSchema$1.optional(),
110131
- contentEntry: contentEntrySchema.nullable().optional(),
110132
110284
  subject: eventRegistrationPageSurfaceSubjectSchema.nullable().optional(),
110133
110285
  events: z$1.array(eventRegistrationPublicEventSchema).nullable().optional(),
110134
110286
  className: z$1.string().nullable().optional(),
@@ -110157,7 +110309,6 @@ const eventRegistrationDisplaySchema = z$1.object({
110157
110309
  });
110158
110310
  const eventRegistrationHydrationSchema = z$1.object({
110159
110311
  occurrenceContext: occurrenceContextSchema$1.optional(),
110160
- contentEntry: contentEntrySchema.nullable().optional(),
110161
110312
  subject: eventRegistrationPageSurfaceSubjectSchema.nullable().optional(),
110162
110313
  events: z$1.array(eventRegistrationPublicEventSchema).nullable().optional(),
110163
110314
  maxTickets: z$1.string().optional(),
@@ -110212,8 +110363,7 @@ function buildEventRegistrationShellStepLabels(source) {
110212
110363
  function scopeEventRegistrationEvents(source) {
110213
110364
  return resolveEventRegistrationScopedEvents(toRegistrationEvents(source.events ?? []), {
110214
110365
  occurrenceContext: source.occurrenceContext,
110215
- subject: source.subject,
110216
- contentEntry: source.contentEntry
110366
+ subject: source.subject
110217
110367
  });
110218
110368
  }
110219
110369
  function shellLabelForRegistrationStep(step, events) {
@@ -110250,7 +110400,6 @@ const eventRegistrationBlockRuntime = defineClientOwnedBlockRuntime({
110250
110400
  display: buildEventRegistrationDisplay(source),
110251
110401
  hydration: {
110252
110402
  occurrenceContext: source.occurrenceContext ?? null,
110253
- contentEntry: source.contentEntry ?? null,
110254
110403
  subject: source.subject ?? null,
110255
110404
  events: source.events ?? null,
110256
110405
  maxTickets: source.maxTickets ?? void 0,
@@ -110417,7 +110566,6 @@ const eventRegistrationBlockDefinition = {
110417
110566
  richText({ className: "rb-prose rb-max-w-none" }, bind$1("content.description"), when("content.description")),
110418
110567
  eventRegistration(withApiBindings({
110419
110568
  occurrenceContext: { $bind: { from: "$root.occurrenceContext" } },
110420
- contentEntry: { $bind: { from: "$root.contentEntry" } },
110421
110569
  subject: { $bind: { from: "$root.subject" } },
110422
110570
  portalToken: { $bind: {
110423
110571
  from: "$root.portalToken",
@@ -110472,10 +110620,8 @@ const eventRegistrationBlockDefinition = {
110472
110620
  fallback: "published"
110473
110621
  } },
110474
110622
  readProfile: "registration",
110475
- entryId: { $bind: {
110476
- from: "$root.contentEntry._entryId",
110477
- fallback: ""
110478
- } }
110623
+ seriesId: { $bind: { from: "$root.occurrenceContext.seriesId" } },
110624
+ includeOccurrenceId: { $bind: { from: "$root.occurrenceContext.id" } }
110479
110625
  },
110480
110626
  mode: "server"
110481
110627
  },
@@ -110731,95 +110877,30 @@ const formBlockDefinition = {
110731
110877
  };
110732
110878
  //#endregion
110733
110879
  //#region ../blocks/src/system/runtime/nodes/events/EventCalendar.interactive.ts
110734
- const eventBlockKindSchema$1 = z$1.enum(eventBlockKindValues);
110735
- const eventSurfaceScopeSchema$1 = z$1.enum(eventSurfaceScopeValues);
110736
- const eventScheduleScopeSchema$1 = z$1.enum(eventScheduleScopeValues);
110737
110880
  const eventCalendarSourceSchema = z$1.object({
110738
- events: z$1.array(publicEventSchema).nullable().optional(),
110739
- siteId: z$1.string(),
110740
- apiBaseUrl: z$1.string().optional(),
110741
- stage: previewStageSchema.optional(),
110881
+ ...eventCollectionSourceSchemaShape,
110742
110882
  variant: eventCalendarDisplayModeSchema.nullable().optional(),
110743
110883
  displayMode: eventCalendarDisplayModeSchema.nullable().optional(),
110744
- listLayout: eventLayoutSchema.optional(),
110745
- listColumns: columnOptionSchema.optional(),
110746
110884
  layout: eventLayoutSchema.optional(),
110747
- columns: columnOptionSchema.optional(),
110748
- eventsPerPage: z$1.string().optional(),
110749
- paginationMode: z$1.enum(["loadMore", "seeAllLink"]).optional(),
110750
- seeAllUrl: z$1.string().optional(),
110751
- loadMoreText: z$1.string().optional(),
110752
- startOfWeek: weekStartSchema.optional(),
110753
- calendarTabViews: calendarTabViewsSchema.optional(),
110754
- defaultCalendarView: eventCalendarDefaultViewSchema.optional(),
110755
- showFilters: z$1.boolean().nullable().optional(),
110756
- showCategoryFilter: filterAutoShowSchema.optional(),
110757
- showVenueFilter: z$1.boolean().nullable().optional(),
110758
- showStaffFilter: z$1.boolean().nullable().optional(),
110759
- kind: eventBlockKindSchema$1.nullable().optional(),
110760
- eventSurface: eventSurfaceScopeSchema$1.nullable().optional(),
110761
- filterEventPresets: z$1.union([z$1.string(), z$1.array(z$1.string())]).nullable().optional(),
110762
- scheduleScope: eventScheduleScopeSchema$1.nullable().optional(),
110763
- filterCategoryIds: z$1.union([z$1.string(), z$1.array(z$1.string())]).nullable().optional(),
110764
- filterStaffMemberId: z$1.string().nullable().optional(),
110765
- filterVenueId: z$1.string().nullable().optional(),
110766
- buttonVariant: eventButtonVariantSchema.optional(),
110767
- buttonText: z$1.string().optional(),
110885
+ columns: eventCollectionSourceSchemaShape.listColumns,
110768
110886
  boardTitle: z$1.string().optional(),
110769
110887
  footerNote: z$1.string().optional(),
110770
110888
  elevated: z$1.boolean().nullable().optional(),
110771
- banded: z$1.boolean().nullable().optional(),
110772
- showVenue: z$1.boolean().nullable().optional(),
110773
- showMap: z$1.boolean().nullable().optional(),
110774
- showCapacity: z$1.boolean().nullable().optional(),
110775
- emptyMessage: z$1.string().optional(),
110776
- className: z$1.string().optional()
110889
+ banded: z$1.boolean().nullable().optional()
110777
110890
  });
110778
110891
  const eventCalendarDisplaySchema = z$1.object({
110779
110892
  kind: z$1.literal("event-calendar"),
110780
110893
  displayMode: eventCalendarDisplayModeSchema,
110781
110894
  className: z$1.string().nullable(),
110782
- events: z$1.array(publicEventSchema),
110783
- listLayout: eventLayoutSchema,
110784
- listColumns: columnOptionSchema,
110785
- eventsPerPage: eventPageSizeSchema,
110786
- paginationAction: eventListPaginationActionSchema,
110787
- startOfWeek: weekStartSchema,
110788
- calendarTabViews: calendarTabViewsSchema,
110789
- defaultCalendarView: eventCalendarDefaultViewSchema,
110790
- showFilters: z$1.boolean(),
110791
- showCategoryFilter: filterAutoShowSchema,
110792
- showVenueFilter: z$1.boolean(),
110793
- showStaffFilter: z$1.boolean(),
110794
- eventKind: eventBlockKindSchema$1,
110795
- eventSurface: eventSurfaceScopeSchema$1,
110796
- filterEventPresets: z$1.string().nullable(),
110797
- scheduleScope: eventScheduleScopeSchema$1,
110798
- filterCategoryIds: z$1.string().nullable(),
110799
- filterStaffMemberId: z$1.string().nullable(),
110800
- filterVenueId: z$1.string().nullable(),
110801
- buttonVariant: eventButtonVariantSchema,
110802
- buttonText: z$1.string(),
110895
+ ...eventCollectionDisplaySchemaShape,
110803
110896
  boardTitle: z$1.string().optional(),
110804
110897
  footerNote: z$1.string().optional(),
110805
110898
  seeAllUrl: z$1.string().optional(),
110806
110899
  loadMoreText: z$1.string().optional(),
110807
110900
  elevated: z$1.boolean(),
110808
- banded: z$1.boolean(),
110809
- showVenue: z$1.boolean(),
110810
- showMap: z$1.boolean(),
110811
- showCapacity: z$1.boolean(),
110812
- emptyMessage: z$1.string()
110813
- });
110814
- const eventCalendarHydrationSchema = z$1.object({
110815
- siteId: z$1.string(),
110816
- stage: previewStageSchema.optional(),
110817
- prefetchedEvents: z$1.boolean(),
110818
- eventKind: eventBlockKindSchema$1,
110819
- eventSurface: eventSurfaceScopeSchema$1,
110820
- filterEventPresets: z$1.string().nullable(),
110821
- scheduleScope: eventScheduleScopeSchema$1
110901
+ banded: z$1.boolean()
110822
110902
  });
110903
+ const eventCalendarHydrationSchema = eventCollectionHydrationSchema;
110823
110904
  const eventCalendarRenderSchema = z$1.object({
110824
110905
  display: eventCalendarDisplaySchema,
110825
110906
  hydration: eventCalendarHydrationSchema
@@ -110842,66 +110923,25 @@ function normalizeOptionalText(value) {
110842
110923
  function buildEventCalendarDisplay(source) {
110843
110924
  const listLayout = source.listLayout ?? source.layout ?? "stack";
110844
110925
  return {
110926
+ ...buildEventCollectionDisplay({
110927
+ ...source,
110928
+ listLayout,
110929
+ listColumns: source.listColumns ?? source.columns
110930
+ }),
110845
110931
  kind: "event-calendar",
110846
110932
  displayMode: source.variant ?? source.displayMode ?? "combined",
110847
110933
  className: source.className ?? null,
110848
110934
  events: (source.events ?? []).slice().sort((left, right) => new Date(left.startsAt).getTime() - new Date(right.startsAt).getTime()),
110849
- listLayout,
110850
- listColumns: source.listColumns ?? source.columns ?? "3",
110851
- eventsPerPage: resolveEventCalendarListPageSize({ eventsPerPage: source.eventsPerPage }),
110852
- paginationAction: resolveEventListPaginationAction({
110853
- paginationMode: source.paginationMode,
110854
- seeAllUrl: source.seeAllUrl,
110855
- loadMoreText: source.loadMoreText
110856
- }),
110857
- startOfWeek: source.startOfWeek ?? "monday",
110858
- calendarTabViews: source.calendarTabViews ?? "both",
110859
- defaultCalendarView: source.defaultCalendarView ?? "month",
110860
- showFilters: source.showFilters ?? true,
110861
- showCategoryFilter: source.showCategoryFilter ?? "auto",
110862
- showVenueFilter: source.showVenueFilter ?? false,
110863
- showStaffFilter: source.showStaffFilter ?? true,
110864
- eventKind: normalizeEventBlockKind(source.kind),
110865
- eventSurface: normalizeEventSurfaceScope(source.eventSurface),
110866
- filterEventPresets: normalizeEventSurfacePresetsCsv(source.filterEventPresets),
110867
- scheduleScope: normalizeEventScheduleScope(source.scheduleScope),
110868
- filterCategoryIds: normalizeEventCategoryIdsCsv(source.filterCategoryIds),
110869
- filterStaffMemberId: normalizeEventStaffMemberId(source.filterStaffMemberId),
110870
- filterVenueId: normalizeEventVenueId(source.filterVenueId),
110871
- buttonVariant: source.buttonVariant ?? "primary",
110872
- buttonText: source.buttonText ?? "Book",
110873
110935
  boardTitle: normalizeOptionalText(source.boardTitle),
110874
110936
  footerNote: normalizeOptionalText(source.footerNote),
110875
110937
  seeAllUrl: normalizeOptionalText(source.seeAllUrl),
110876
110938
  loadMoreText: normalizeOptionalText(source.loadMoreText),
110877
110939
  elevated: source.elevated ?? false,
110878
- banded: source.banded ?? false,
110879
- showVenue: source.showVenue ?? true,
110880
- showMap: source.showMap ?? true,
110881
- showCapacity: source.showCapacity ?? true,
110882
- emptyMessage: source.emptyMessage ?? "No upcoming events scheduled."
110940
+ banded: source.banded ?? false
110883
110941
  };
110884
110942
  }
110885
110943
  function buildEventCalendarListingDisplay(display, prefetchedEvents, className = display.className) {
110886
- const pageSize = display.eventsPerPage;
110887
- const initialEvents = display.events.slice(0, pageSize);
110888
- return {
110889
- kind: "event-listing",
110890
- state: initialEvents.length === 0 ? prefetchedEvents ? "empty" : "loading" : "ready",
110891
- listLayout: display.listLayout,
110892
- className,
110893
- emptyMessage: display.emptyMessage,
110894
- loadingMessage: "Loading events…",
110895
- containerClass: getContainerClass(display.listLayout, display.listColumns),
110896
- cardVariant: "default",
110897
- buttonVariant: display.buttonVariant,
110898
- buttonText: display.buttonText,
110899
- showVenue: display.showVenue,
110900
- showMap: display.showMap,
110901
- showCapacity: display.showCapacity,
110902
- orientation: getCardOrientation(display.listLayout),
110903
- events: initialEvents
110904
- };
110944
+ return buildEventCollectionListingDisplay(display, prefetchedEvents, className);
110905
110945
  }
110906
110946
  function buildEventCalendarListingRender(render, className = render.display.className) {
110907
110947
  const { display, hydration } = render;
@@ -110917,7 +110957,6 @@ function buildEventCalendarListingRender(render, className = render.display.clas
110917
110957
  showCategoryFilter: display.showCategoryFilter,
110918
110958
  showVenueFilter: display.showVenueFilter,
110919
110959
  showStaffFilter: display.showStaffFilter,
110920
- eventKind: display.eventKind,
110921
110960
  eventSurface: display.eventSurface,
110922
110961
  filterEventPresets: display.filterEventPresets,
110923
110962
  scheduleScope: display.scheduleScope,
@@ -110936,15 +110975,7 @@ const eventCalendarBlockRuntime = defineProgressiveBlockRuntime({
110936
110975
  },
110937
110976
  buildRender: (source) => ({
110938
110977
  display: buildEventCalendarDisplay(source),
110939
- hydration: {
110940
- siteId: source.siteId,
110941
- stage: source.stage,
110942
- prefetchedEvents: source.events != null,
110943
- eventKind: normalizeEventBlockKind(source.kind),
110944
- eventSurface: normalizeEventSurfaceScope(source.eventSurface),
110945
- filterEventPresets: normalizeEventSurfacePresetsCsv(source.filterEventPresets),
110946
- scheduleScope: normalizeEventScheduleScope(source.scheduleScope)
110947
- }
110978
+ hydration: buildEventCollectionHydration(source)
110948
110979
  })
110949
110980
  });
110950
110981
  function buildEventCalendarInteractiveIslandProps(props) {
@@ -110963,7 +110994,6 @@ function buildEventCalendarInteractiveIslandProps(props) {
110963
110994
  //#region ../blocks/src/system/blocks/events/event-calendar.ts
110964
110995
  function normalizeEventCalendarContent(content) {
110965
110996
  const record = typeof content === "object" && content !== null ? content : {};
110966
- const kind = normalizeEventBlockKind(record.kind);
110967
110997
  const variant = normalizeEventCalendarDisplayMode(record.variant) ?? normalizeEventCalendarDisplayMode(record.displayMode);
110968
110998
  return {
110969
110999
  ...record,
@@ -110971,11 +111001,10 @@ function normalizeEventCalendarContent(content) {
110971
111001
  displayMode: normalizeEventCalendarDisplayMode(record.displayMode),
110972
111002
  listLayout: normalizeEventCalendarListLayout(record.listLayout),
110973
111003
  defaultCalendarView: normalizeEventCalendarDefaultView(record.defaultCalendarView),
110974
- kind,
110975
111004
  eventSurface: normalizeEventSurfaceScope(record.eventSurface),
110976
111005
  filterEventPresets: normalizeEventSurfacePresets(record.filterEventPresets),
110977
111006
  scheduleScope: normalizeEventScheduleScope(record.scheduleScope),
110978
- filterCategoryIds: kind === "courses" ? [] : normalizeEventCategoryIds(record.filterCategoryIds),
111007
+ filterCategoryIds: normalizeEventCategoryIds(record.filterCategoryIds),
110979
111008
  filterStaffMemberId: normalizeEventStaffMemberId(record.filterStaffMemberId),
110980
111009
  filterVenueId: normalizeEventVenueId(record.filterVenueId)
110981
111010
  };
@@ -111069,10 +111098,6 @@ const eventCalendarLayout = [styledSection({
111069
111098
  from: "content.showCapacity",
111070
111099
  fallback: true
111071
111100
  } },
111072
- kind: { $bind: {
111073
- from: "content.kind",
111074
- fallback: "all"
111075
- } },
111076
111101
  eventSurface: { $bind: {
111077
111102
  from: "content.eventSurface",
111078
111103
  fallback: "all"
@@ -111390,30 +111415,6 @@ const eventCalendarAdditionalFields = [
111390
111415
  }] }] }
111391
111416
  }
111392
111417
  },
111393
- {
111394
- id: "kind",
111395
- type: "select",
111396
- label: "Show",
111397
- description: "Restrict this block to all offerings, courses, or events",
111398
- required: false,
111399
- multiple: false,
111400
- defaultValue: "all",
111401
- options: [
111402
- {
111403
- value: "all",
111404
- label: "All offerings"
111405
- },
111406
- {
111407
- value: "courses",
111408
- label: "Courses only"
111409
- },
111410
- {
111411
- value: "events",
111412
- label: "Events only"
111413
- }
111414
- ],
111415
- ui: { intent: "behavior" }
111416
- },
111417
111418
  {
111418
111419
  id: "showFilters",
111419
111420
  type: "boolean",
@@ -111645,6 +111646,10 @@ const eventCalendarAdditionalFields = [
111645
111646
  multiple: true,
111646
111647
  defaultValue: [],
111647
111648
  options: [
111649
+ {
111650
+ value: "course",
111651
+ label: "Courses"
111652
+ },
111648
111653
  {
111649
111654
  value: "class",
111650
111655
  label: "Classes"
@@ -111710,11 +111715,7 @@ const eventCalendarAdditionalFields = [
111710
111715
  optionSource: "eventCategories",
111711
111716
  ui: {
111712
111717
  intent: "behavior",
111713
- searchThreshold: 8,
111714
- visibleWhen: {
111715
- field: "kind",
111716
- notEquals: "courses"
111717
- }
111718
+ searchThreshold: 8
111718
111719
  }
111719
111720
  }),
111720
111721
  createSiteOptionSelectField({
@@ -111875,7 +111876,6 @@ const eventCalendarBlockDefinition = {
111875
111876
  from: "content.variant",
111876
111877
  fallback: "listing-card"
111877
111878
  } },
111878
- kind: { $bind: { from: "content.kind" } },
111879
111879
  eventSurface: { $bind: { from: "content.eventSurface" } },
111880
111880
  eventPresets: { $bind: {
111881
111881
  from: "content.filterEventPresets",
@@ -111895,7 +111895,6 @@ const eventCalendarBlockDefinition = {
111895
111895
  const legacyEventCardVariantSchema = z$1.enum(["variant1", "variant2"]);
111896
111896
  const eventCardVariantInputSchema = z$1.union([cardVariantRoleSchema, legacyEventCardVariantSchema]);
111897
111897
  const cardOrientationSchema = z$1.enum(["vertical", "horizontal"]);
111898
- const eventBlockKindSchema = z$1.enum(eventBlockKindValues);
111899
111898
  const eventSurfaceScopeSchema = z$1.enum(eventSurfaceScopeValues);
111900
111899
  const eventScheduleScopeSchema = z$1.enum(eventScheduleScopeValues);
111901
111900
  const eventListingSourceSchema = z$1.object({
@@ -111917,17 +111916,7 @@ const eventListingSourceSchema = z$1.object({
111917
111916
  showCapacity: z$1.boolean().optional(),
111918
111917
  emptyMessage: z$1.string().optional(),
111919
111918
  className: z$1.string().optional(),
111920
- showFilters: z$1.boolean().nullable().optional(),
111921
- showCategoryFilter: filterAutoShowSchema.optional(),
111922
- showVenueFilter: z$1.boolean().nullable().optional(),
111923
- showStaffFilter: z$1.boolean().nullable().optional(),
111924
- eventKind: eventBlockKindSchema.nullable().optional(),
111925
- eventSurface: eventSurfaceScopeSchema.nullable().optional(),
111926
- filterEventPresets: z$1.union([z$1.string(), z$1.array(z$1.string())]).nullable().optional(),
111927
- scheduleScope: eventScheduleScopeSchema.nullable().optional(),
111928
- filterCategoryIds: z$1.string().nullable().optional(),
111929
- filterStaffMemberId: z$1.string().nullable().optional(),
111930
- filterVenueId: z$1.string().nullable().optional()
111919
+ ...eventCollectionFilterSourceSchemaShape
111931
111920
  });
111932
111921
  const eventListingDisplaySchema = z$1.object({
111933
111922
  kind: z$1.literal("event-listing"),
@@ -111959,7 +111948,6 @@ const eventListingHydrationSchema = z$1.object({
111959
111948
  showCategoryFilter: filterAutoShowSchema,
111960
111949
  showVenueFilter: z$1.boolean(),
111961
111950
  showStaffFilter: z$1.boolean(),
111962
- eventKind: eventBlockKindSchema,
111963
111951
  eventSurface: eventSurfaceScopeSchema,
111964
111952
  filterEventPresets: z$1.string().nullable(),
111965
111953
  scheduleScope: eventScheduleScopeSchema,
@@ -112020,7 +112008,6 @@ const eventListingBlockRuntime = defineProgressiveBlockRuntime({
112020
112008
  showCategoryFilter: source.showCategoryFilter ?? "auto",
112021
112009
  showVenueFilter: source.showVenueFilter ?? false,
112022
112010
  showStaffFilter: source.showStaffFilter ?? false,
112023
- eventKind: normalizeEventBlockKind(source.eventKind),
112024
112011
  eventSurface: normalizeEventSurfaceScope(source.eventSurface),
112025
112012
  filterEventPresets: normalizeEventSurfacePresetsCsv(source.filterEventPresets),
112026
112013
  scheduleScope: normalizeEventScheduleScope(source.scheduleScope),
@@ -112156,30 +112143,6 @@ const eventListingBlockDefinition = {
112156
112143
  intent: "display"
112157
112144
  }
112158
112145
  })),
112159
- {
112160
- id: "kind",
112161
- type: "select",
112162
- label: "Show",
112163
- description: "Choose whether this list shows courses, events, or both",
112164
- required: false,
112165
- multiple: false,
112166
- defaultValue: "all",
112167
- options: [
112168
- {
112169
- value: "all",
112170
- label: "Courses and events"
112171
- },
112172
- {
112173
- value: "courses",
112174
- label: "Courses only"
112175
- },
112176
- {
112177
- value: "events",
112178
- label: "Events only"
112179
- }
112180
- ],
112181
- ui: { intent: "behavior" }
112182
- },
112183
112146
  {
112184
112147
  id: "eventSurface",
112185
112148
  type: "select",
@@ -112217,6 +112180,10 @@ const eventListingBlockDefinition = {
112217
112180
  multiple: true,
112218
112181
  defaultValue: [],
112219
112182
  options: [
112183
+ {
112184
+ value: "course",
112185
+ label: "Courses"
112186
+ },
112220
112187
  {
112221
112188
  value: "class",
112222
112189
  label: "Classes"
@@ -112368,10 +112335,6 @@ const eventListingBlockDefinition = {
112368
112335
  showVenue: { $bind: { from: "content.showVenue" } },
112369
112336
  showMap: { $bind: { from: "content.showMap" } },
112370
112337
  showCapacity: { $bind: { from: "content.showCapacity" } },
112371
- eventKind: { $bind: {
112372
- from: "content.kind",
112373
- fallback: "all"
112374
- } },
112375
112338
  eventSurface: { $bind: {
112376
112339
  from: "content.eventSurface",
112377
112340
  fallback: "all"
@@ -112422,7 +112385,6 @@ const eventListingBlockDefinition = {
112422
112385
  from: "content.layout",
112423
112386
  fallback: "listing-card"
112424
112387
  } },
112425
- kind: { $bind: { from: "content.kind" } },
112426
112388
  eventSurface: { $bind: { from: "content.eventSurface" } },
112427
112389
  eventPresets: { $bind: {
112428
112390
  from: "content.filterEventPresets",
@@ -119868,10 +119830,6 @@ const eventDetailsManifest = createBlockManifest({
119868
119830
  from: "$root.occurrenceContext",
119869
119831
  fallback: null
119870
119832
  } },
119871
- contentEntry: { $bind: {
119872
- from: "$root.contentEntry",
119873
- fallback: null
119874
- } },
119875
119833
  events: { $bind: { from: "data.eventDetailsData.events" } },
119876
119834
  showVenue: { $bind: { from: "content.showVenue" } },
119877
119835
  showMap: { $bind: { from: "content.showMap" } },
@@ -119945,7 +119903,6 @@ const eventDetailsBlockDefinition = {
119945
119903
  fallback: "published"
119946
119904
  } },
119947
119905
  limit: "25",
119948
- entryId: { $bind: { from: "$root.contentEntry._entryId" } },
119949
119906
  seriesId: { $bind: { from: "$root.occurrenceContext.seriesId" } },
119950
119907
  includeOccurrenceId: { $bind: { from: "$root.occurrenceContext.id" } }
119951
119908
  },
@@ -119990,15 +119947,6 @@ const courseDetailsBlockDefinition = {
119990
119947
  multiline: false,
119991
119948
  defaultValue: "Course details"
119992
119949
  },
119993
- {
119994
- id: "courseSlug",
119995
- type: "text",
119996
- label: "Course slug (optional)",
119997
- description: "Select a course by slug when not used on a course template route",
119998
- required: false,
119999
- multiline: false,
120000
- ui: { intent: "behavior" }
120001
- },
120002
119950
  {
120003
119951
  id: "showTitle",
120004
119952
  type: "boolean",
@@ -120097,23 +120045,11 @@ const courseDetailsBlockDefinition = {
120097
120045
  baseClass: "",
120098
120046
  spacing: "spacious",
120099
120047
  children: sectionContainer([text({ as: "h2" }, bind$1("content.heading"), when("content.heading")), el("course-details", {
120100
- contentEntry: { $bind: {
120101
- from: "$root.contentEntry",
120102
- fallback: null
120103
- } },
120104
- entrySubrouteContext: { $bind: {
120105
- from: "$root.entrySubrouteContext",
120106
- fallback: null
120107
- } },
120108
120048
  subject: { $bind: {
120109
120049
  from: "$root.subject",
120110
120050
  fallback: null
120111
120051
  } },
120112
120052
  courses: { $bind: { from: "data.courses" } },
120113
- courseSlug: { $bind: {
120114
- from: "content.courseSlug",
120115
- fallback: null
120116
- } },
120117
120053
  showTitle: { $bind: {
120118
120054
  from: "content.showTitle",
120119
120055
  fallback: false
@@ -120155,7 +120091,7 @@ const courseDetailsBlockDefinition = {
120155
120091
  }),
120156
120092
  dataSchemas: { courses: publicCoursesArraySchema.optional() },
120157
120093
  dataLoaders: { courses: {
120158
- endpoint: "listPublicCourses",
120094
+ endpoint: "listPublicWholeSeriesOfferings",
120159
120095
  params: {
120160
120096
  siteId: { $bind: { from: "$root.siteId" } },
120161
120097
  limit: "50",
@@ -120773,7 +120709,6 @@ const recurringScheduleBlockDefinition = {
120773
120709
  } },
120774
120710
  detailLevel: "listing",
120775
120711
  readProfile: "compact-list",
120776
- kind: "events",
120777
120712
  eventSurface: "custom",
120778
120713
  eventPresets: "class",
120779
120714
  scheduleScope: "any"
@@ -121091,7 +121026,7 @@ const offeringsPreviewBlockDefinition = {
121091
121026
  mode: "server"
121092
121027
  },
121093
121028
  courses: {
121094
- endpoint: "listPublicCourses",
121029
+ endpoint: "listPublicWholeSeriesOfferings",
121095
121030
  params: {
121096
121031
  siteId: { $bind: { from: "$root.siteId" } },
121097
121032
  limit: { $bind: {
@@ -121122,7 +121057,6 @@ function eventPresetLoader(preset) {
121122
121057
  } },
121123
121058
  detailLevel: "listing",
121124
121059
  readProfile: "listing-card",
121125
- kind: "events",
121126
121060
  eventPresets: preset
121127
121061
  },
121128
121062
  mode: "server"
@@ -141185,7 +141119,7 @@ const SUPPORTED_LOADER_ENDPOINTS = [
141185
141119
  "listPublicEvents",
141186
141120
  "listPublicRecurringSchedule",
141187
141121
  "getPublicEventDetails",
141188
- "listPublicCourses",
141122
+ "listPublicWholeSeriesOfferings",
141189
141123
  "listPublicRouteCandidates",
141190
141124
  "listPublicTeamMembers",
141191
141125
  "listPublicProducts",
@@ -146014,8 +145948,94 @@ const EVENT_ATTENDEE_REFUND_INVALID_CODES = ["manual_booking_not_refundable", ..
146014
145948
  [...EVENT_ATTENDEE_REFUND_INVALID_CODES, ...CANONICAL_ADMIN_REFUND_FAILURE_CODES];
146015
145949
  [...STANDARD_LINE_ITEM_REFUND_INVALID_CODES, ...CANONICAL_ADMIN_REFUND_FAILURE_CODES];
146016
145950
  //#endregion
146017
- //#region ../api/src/bookingVerticals.ts
146018
- const VERTICAL_IDS = [
145951
+ //#region ../api/src/bookingVerticalPreset.ts
145952
+ const BOOKING_ENGINE_BY_BEHAVIOUR = {
145953
+ class: "event_series",
145954
+ workshop: "event_series",
145955
+ course: "event_series",
145956
+ retreat: "event_series",
145957
+ performance: "event_series",
145958
+ appointment: "appointment_service"
145959
+ };
145960
+ function verticalBookingPreset(id, verticalId, canonicalBehaviour, label, pluralLabel, description, availability = "onboarding") {
145961
+ return {
145962
+ id,
145963
+ verticalId,
145964
+ canonicalBehaviour,
145965
+ engine: BOOKING_ENGINE_BY_BEHAVIOUR[canonicalBehaviour],
145966
+ availability,
145967
+ label,
145968
+ pluralLabel,
145969
+ description
145970
+ };
145971
+ }
145972
+ //#endregion
145973
+ //#region ../api/src/bookingVerticalCatalog.ts
145974
+ const VERTICAL_BOOKING_PRESETS = [
145975
+ verticalBookingPreset("yoga_wellness.classes", "yoga_wellness", "class", "Class", "Classes", "Regular scheduled classes and group sessions."),
145976
+ verticalBookingPreset("yoga_wellness.workshops", "yoga_wellness", "workshop", "Workshop", "Workshops", "One-off workshops, day retreats, or special sessions."),
145977
+ verticalBookingPreset("yoga_wellness.courses", "yoga_wellness", "course", "Course", "Courses", "Fixed-schedule courses or multi-session groups."),
145978
+ verticalBookingPreset("yoga_wellness.retreats", "yoga_wellness", "retreat", "Retreat", "Retreats", "Multi-day or residential retreats and immersive experiences."),
145979
+ verticalBookingPreset("yoga_wellness.appointments", "yoga_wellness", "appointment", "Appointment", "Appointments", "Private sessions, consultations, or one-to-one support."),
145980
+ verticalBookingPreset("fitness_pt.group_training", "fitness_pt", "class", "Group training", "Group training", "Regular scheduled classes and group sessions."),
145981
+ verticalBookingPreset("fitness_pt.personal_training", "fitness_pt", "appointment", "Personal training", "Personal training", "One-to-one sessions booked from your availability."),
145982
+ verticalBookingPreset("fitness_pt.programmes", "fitness_pt", "course", "Programme", "Programmes", "Multi-session programmes like bootcamps or courses."),
145983
+ verticalBookingPreset("fitness_pt.workshops", "fitness_pt", "workshop", "Workshop", "Workshops", "One-off workshops, events, or special sessions."),
145984
+ verticalBookingPreset("fitness_pt.retreats", "fitness_pt", "retreat", "Retreat", "Retreats", "Multi-day or residential fitness experiences."),
145985
+ verticalBookingPreset("dance_school.classes", "dance_school", "class", "Class", "Classes", "Regular group classes and weekly sessions."),
145986
+ verticalBookingPreset("dance_school.terms", "dance_school", "course", "Term", "Terms", "Multi-week term blocks or fixed-date course groups."),
145987
+ verticalBookingPreset("dance_school.courses", "dance_school", "course", "Course", "Courses", "Fixed-schedule courses or multi-session groups.", "settings"),
145988
+ verticalBookingPreset("dance_school.workshops", "dance_school", "workshop", "Workshop", "Workshops", "One-off workshops, masterclasses, or intensives."),
145989
+ verticalBookingPreset("dance_school.private_lessons", "dance_school", "appointment", "Private lesson", "Private lessons", "One-to-one lessons or coaching sessions."),
145990
+ verticalBookingPreset("dance_school.shows", "dance_school", "performance", "Show", "Shows", "Ticketed performances, showcases, and recitals."),
145991
+ verticalBookingPreset("physiotherapy_physical_health.appointments", "physiotherapy_physical_health", "appointment", "Appointment", "Appointments", "Assessments, treatments, follow-ups, and rehabilitation sessions."),
145992
+ verticalBookingPreset("physiotherapy_physical_health.rehab_classes", "physiotherapy_physical_health", "class", "Rehab class", "Rehab classes", "Regular rehabilitation, mobility, strength, or recovery classes."),
145993
+ verticalBookingPreset("physiotherapy_physical_health.workshops", "physiotherapy_physical_health", "workshop", "Workshop", "Workshops", "One-off workshops, talks, or practical group sessions."),
145994
+ verticalBookingPreset("massage_bodywork.treatments", "massage_bodywork", "appointment", "Treatment", "Treatments", "Massage treatments, bodywork sessions, and one-to-one appointments."),
145995
+ verticalBookingPreset("massage_bodywork.group_sessions", "massage_bodywork", "class", "Group session", "Group sessions", "Regular bodywork, somatic movement, or self-massage sessions."),
145996
+ verticalBookingPreset("massage_bodywork.workshops", "massage_bodywork", "workshop", "Workshop", "Workshops", "One-off bodywork, self-massage, or somatic practice workshops."),
145997
+ verticalBookingPreset("therapist_practitioner.appointments", "therapist_practitioner", "appointment", "Appointment", "Appointments", "Sessions, consultations, treatments, or assessments."),
145998
+ verticalBookingPreset("therapist_practitioner.workshops", "therapist_practitioner", "workshop", "Workshop", "Workshops", "One-off group workshops, talks, or wellbeing sessions."),
145999
+ verticalBookingPreset("therapist_practitioner.retreats", "therapist_practitioner", "retreat", "Retreat", "Retreats", "Multi-day retreats or immersive group experiences."),
146000
+ verticalBookingPreset("beauty_spa.appointments", "beauty_spa", "appointment", "Appointment", "Appointments", "Treatments, consultations, services, and sessions."),
146001
+ verticalBookingPreset("beauty_spa.workshops", "beauty_spa", "workshop", "Workshop", "Workshops", "Skincare workshops, makeup lessons, demos, or group events."),
146002
+ verticalBookingPreset("consultant_coach.appointments", "consultant_coach", "appointment", "Appointment", "Appointments", "One-to-one calls, consultations, reviews, or coaching sessions."),
146003
+ verticalBookingPreset("consultant_coach.workshops", "consultant_coach", "workshop", "Workshop", "Workshops", "One-off group sessions, webinars, or strategy days."),
146004
+ verticalBookingPreset("consultant_coach.courses", "consultant_coach", "course", "Course", "Courses", "Fixed-schedule cohorts or multi-session group programmes."),
146005
+ verticalBookingPreset("consultant_coach.retreats", "consultant_coach", "retreat", "Retreat", "Retreats", "Multi-day coaching retreats or immersive experiences."),
146006
+ verticalBookingPreset("training_provider.courses", "training_provider", "course", "Course", "Courses", "Fixed-schedule courses, cohorts, and multi-session training."),
146007
+ verticalBookingPreset("training_provider.workshops", "training_provider", "workshop", "Workshop", "Workshops", "One-off workshops, masterclasses, and short training sessions."),
146008
+ verticalBookingPreset("training_provider.appointments", "training_provider", "appointment", "Appointment", "Appointments", "Consultations, assessments, mentoring, or office hours."),
146009
+ verticalBookingPreset("training_provider.classes", "training_provider", "class", "Class", "Classes", "Regular classes, sessions, or groups.", "settings"),
146010
+ verticalBookingPreset("training_provider.residentials", "training_provider", "retreat", "Residential", "Residentials", "Residential courses or multi-day training experiences.", "settings"),
146011
+ verticalBookingPreset("retreat_centre.retreats", "retreat_centre", "retreat", "Retreat", "Retreats", "Multi-day or residential retreats with richer booking needs."),
146012
+ verticalBookingPreset("retreat_centre.workshops", "retreat_centre", "workshop", "Workshop", "Workshops", "One-day retreats, ceremonies, workshops, or special events."),
146013
+ verticalBookingPreset("retreat_centre.classes", "retreat_centre", "class", "Class", "Classes", "Regular sessions like guided meditations or group practices."),
146014
+ verticalBookingPreset("retreat_centre.courses", "retreat_centre", "course", "Course", "Courses", "Fixed-schedule programmes or multi-session experiences."),
146015
+ verticalBookingPreset("retreat_centre.appointments", "retreat_centre", "appointment", "Appointment", "Appointments", "Private sessions, therapies, consultations, or add-ons."),
146016
+ verticalBookingPreset("music_school.lessons", "music_school", "appointment", "Lesson", "Lessons", "One-to-one lessons, consultations, or coaching sessions."),
146017
+ verticalBookingPreset("music_school.classes", "music_school", "class", "Class", "Classes", "Regular group classes, ensembles, or recurring sessions."),
146018
+ verticalBookingPreset("music_school.terms", "music_school", "course", "Term", "Terms", "Multi-week term blocks or fixed-date group courses."),
146019
+ verticalBookingPreset("music_school.workshops", "music_school", "workshop", "Workshop", "Workshops", "One-off workshops, masterclasses, or intensives."),
146020
+ verticalBookingPreset("music_school.performances", "music_school", "performance", "Performance", "Performances", "Concerts, recitals, showcases, or ticketed performances."),
146021
+ verticalBookingPreset("voice_singing.lessons", "voice_singing", "appointment", "Voice session", "Voice sessions", "One-to-one singing lessons, voice coaching, or private practice sessions."),
146022
+ verticalBookingPreset("voice_singing.classes", "voice_singing", "class", "Ongoing weekly session", "Ongoing weekly sessions", "Regular choirs, voice circles, community singing, or group practice."),
146023
+ verticalBookingPreset("voice_singing.terms", "voice_singing", "course", "Singing term", "Singing terms", "Multi-week choir terms, voice courses, or fixed-date group programmes."),
146024
+ verticalBookingPreset("voice_singing.workshops", "voice_singing", "workshop", "Workshop", "Workshops", "One-off singing workshops, voice journeys, or devotional singing sessions."),
146025
+ verticalBookingPreset("voice_singing.performances", "voice_singing", "performance", "Performance", "Performances", "Choir concerts, sharing events, recitals, or community performances."),
146026
+ verticalBookingPreset("performing_arts_school.classes", "performing_arts_school", "class", "Class", "Classes", "Regular group classes, rehearsals, or weekly sessions."),
146027
+ verticalBookingPreset("performing_arts_school.terms", "performing_arts_school", "course", "Term", "Terms", "Multi-week term blocks or fixed-date course groups."),
146028
+ verticalBookingPreset("performing_arts_school.workshops", "performing_arts_school", "workshop", "Workshop", "Workshops", "One-off workshops, masterclasses, or intensives."),
146029
+ verticalBookingPreset("performing_arts_school.performances", "performing_arts_school", "performance", "Performance", "Performances", "Shows, showcases, productions, or ticketed performances."),
146030
+ verticalBookingPreset("performing_arts_school.lessons", "performing_arts_school", "appointment", "Lesson", "Lessons", "One-to-one lessons, coaching, or audition prep."),
146031
+ verticalBookingPreset("community_wellbeing.classes", "community_wellbeing", "class", "Class", "Classes", "Regular groups, sessions, practices, or weekly activities."),
146032
+ verticalBookingPreset("community_wellbeing.workshops", "community_wellbeing", "workshop", "Workshop", "Workshops", "One-off workshops, talks, events, or gatherings."),
146033
+ verticalBookingPreset("community_wellbeing.courses", "community_wellbeing", "course", "Course", "Courses", "Fixed-schedule courses, study groups, or multi-session programmes."),
146034
+ verticalBookingPreset("community_wellbeing.appointments", "community_wellbeing", "appointment", "Appointment", "Appointments", "One-to-one appointments, consultations, or support sessions."),
146035
+ verticalBookingPreset("community_wellbeing.retreats", "community_wellbeing", "retreat", "Retreat", "Retreats", "Multi-day or residential retreats."),
146036
+ verticalBookingPreset("venue_event_space.resource_hire", "venue_event_space", "appointment", "Hire slot", "Hire slots", "Future room, venue, and resource hire bookings.", "future")
146037
+ ];
146038
+ const VERTICAL_ID_SET = /* @__PURE__ */ new Set([
146019
146039
  "yoga_wellness",
146020
146040
  "fitness_pt",
146021
146041
  "dance_school",
@@ -146031,79 +146051,7 @@ const VERTICAL_IDS = [
146031
146051
  "performing_arts_school",
146032
146052
  "community_wellbeing",
146033
146053
  "venue_event_space"
146034
- ];
146035
- const BOOKING_ENGINE_BY_BEHAVIOUR = {
146036
- class: "event_series",
146037
- workshop: "event_series",
146038
- course: "course",
146039
- retreat: "event_series",
146040
- performance: "event_series",
146041
- appointment: "appointment_service"
146042
- };
146043
- const VERTICAL_BOOKING_PRESETS = [
146044
- preset("yoga_wellness.classes", "yoga_wellness", "class", "Class", "Classes", "Regular scheduled classes and group sessions."),
146045
- preset("yoga_wellness.workshops", "yoga_wellness", "workshop", "Workshop", "Workshops", "One-off workshops, day retreats, or special sessions."),
146046
- preset("yoga_wellness.courses", "yoga_wellness", "course", "Course", "Courses", "Fixed-schedule courses or multi-session groups."),
146047
- preset("yoga_wellness.retreats", "yoga_wellness", "retreat", "Retreat", "Retreats", "Multi-day or residential retreats and immersive experiences."),
146048
- preset("yoga_wellness.appointments", "yoga_wellness", "appointment", "Appointment", "Appointments", "Private sessions, consultations, or one-to-one support."),
146049
- preset("fitness_pt.group_training", "fitness_pt", "class", "Group training", "Group training", "Regular scheduled classes and group sessions."),
146050
- preset("fitness_pt.personal_training", "fitness_pt", "appointment", "Personal training", "Personal training", "One-to-one sessions booked from your availability."),
146051
- preset("fitness_pt.programmes", "fitness_pt", "course", "Programme", "Programmes", "Multi-session programmes like bootcamps or courses."),
146052
- preset("fitness_pt.workshops", "fitness_pt", "workshop", "Workshop", "Workshops", "One-off workshops, events, or special sessions."),
146053
- preset("fitness_pt.retreats", "fitness_pt", "retreat", "Retreat", "Retreats", "Multi-day or residential fitness experiences."),
146054
- preset("dance_school.classes", "dance_school", "class", "Class", "Classes", "Regular group classes and weekly sessions."),
146055
- preset("dance_school.terms", "dance_school", "course", "Term", "Terms", "Multi-week term blocks or fixed-date course groups."),
146056
- preset("dance_school.workshops", "dance_school", "workshop", "Workshop", "Workshops", "One-off workshops, masterclasses, or intensives."),
146057
- preset("dance_school.private_lessons", "dance_school", "appointment", "Private lesson", "Private lessons", "One-to-one lessons or coaching sessions."),
146058
- preset("dance_school.shows", "dance_school", "performance", "Show", "Shows", "Ticketed performances, showcases, and recitals."),
146059
- preset("physiotherapy_physical_health.appointments", "physiotherapy_physical_health", "appointment", "Appointment", "Appointments", "Assessments, treatments, follow-ups, and rehabilitation sessions."),
146060
- preset("physiotherapy_physical_health.rehab_classes", "physiotherapy_physical_health", "class", "Rehab class", "Rehab classes", "Regular rehabilitation, mobility, strength, or recovery classes."),
146061
- preset("physiotherapy_physical_health.workshops", "physiotherapy_physical_health", "workshop", "Workshop", "Workshops", "One-off workshops, talks, or practical group sessions."),
146062
- preset("massage_bodywork.treatments", "massage_bodywork", "appointment", "Treatment", "Treatments", "Massage treatments, bodywork sessions, and one-to-one appointments."),
146063
- preset("massage_bodywork.group_sessions", "massage_bodywork", "class", "Group session", "Group sessions", "Regular bodywork, somatic movement, or self-massage sessions."),
146064
- preset("massage_bodywork.workshops", "massage_bodywork", "workshop", "Workshop", "Workshops", "One-off bodywork, self-massage, or somatic practice workshops."),
146065
- preset("therapist_practitioner.appointments", "therapist_practitioner", "appointment", "Appointment", "Appointments", "Sessions, consultations, treatments, or assessments."),
146066
- preset("therapist_practitioner.workshops", "therapist_practitioner", "workshop", "Workshop", "Workshops", "One-off group workshops, talks, or wellbeing sessions."),
146067
- preset("therapist_practitioner.retreats", "therapist_practitioner", "retreat", "Retreat", "Retreats", "Multi-day retreats or immersive group experiences."),
146068
- preset("beauty_spa.appointments", "beauty_spa", "appointment", "Appointment", "Appointments", "Treatments, consultations, services, and sessions."),
146069
- preset("beauty_spa.workshops", "beauty_spa", "workshop", "Workshop", "Workshops", "Skincare workshops, makeup lessons, demos, or group events."),
146070
- preset("consultant_coach.appointments", "consultant_coach", "appointment", "Appointment", "Appointments", "One-to-one calls, consultations, reviews, or coaching sessions."),
146071
- preset("consultant_coach.workshops", "consultant_coach", "workshop", "Workshop", "Workshops", "One-off group sessions, webinars, or strategy days."),
146072
- preset("consultant_coach.courses", "consultant_coach", "course", "Course", "Courses", "Fixed-schedule cohorts or multi-session group programmes."),
146073
- preset("consultant_coach.retreats", "consultant_coach", "retreat", "Retreat", "Retreats", "Multi-day coaching retreats or immersive experiences."),
146074
- preset("training_provider.courses", "training_provider", "course", "Course", "Courses", "Fixed-schedule courses, cohorts, and multi-session training."),
146075
- preset("training_provider.workshops", "training_provider", "workshop", "Workshop", "Workshops", "One-off workshops, masterclasses, and short training sessions."),
146076
- preset("training_provider.appointments", "training_provider", "appointment", "Appointment", "Appointments", "Consultations, assessments, mentoring, or office hours."),
146077
- preset("training_provider.classes", "training_provider", "class", "Class", "Classes", "Regular classes, sessions, or groups.", "settings"),
146078
- preset("training_provider.residentials", "training_provider", "retreat", "Residential", "Residentials", "Residential courses or multi-day training experiences.", "settings"),
146079
- preset("retreat_centre.retreats", "retreat_centre", "retreat", "Retreat", "Retreats", "Multi-day or residential retreats with richer booking needs."),
146080
- preset("retreat_centre.workshops", "retreat_centre", "workshop", "Workshop", "Workshops", "One-day retreats, ceremonies, workshops, or special events."),
146081
- preset("retreat_centre.classes", "retreat_centre", "class", "Class", "Classes", "Regular sessions like guided meditations or group practices."),
146082
- preset("retreat_centre.courses", "retreat_centre", "course", "Course", "Courses", "Fixed-schedule programmes or multi-session experiences."),
146083
- preset("retreat_centre.appointments", "retreat_centre", "appointment", "Appointment", "Appointments", "Private sessions, therapies, consultations, or add-ons."),
146084
- preset("music_school.lessons", "music_school", "appointment", "Lesson", "Lessons", "One-to-one lessons, consultations, or coaching sessions."),
146085
- preset("music_school.classes", "music_school", "class", "Class", "Classes", "Regular group classes, ensembles, or recurring sessions."),
146086
- preset("music_school.terms", "music_school", "course", "Term", "Terms", "Multi-week term blocks or fixed-date group courses."),
146087
- preset("music_school.workshops", "music_school", "workshop", "Workshop", "Workshops", "One-off workshops, masterclasses, or intensives."),
146088
- preset("music_school.performances", "music_school", "performance", "Performance", "Performances", "Concerts, recitals, showcases, or ticketed performances."),
146089
- preset("voice_singing.lessons", "voice_singing", "appointment", "Voice session", "Voice sessions", "One-to-one singing lessons, voice coaching, or private practice sessions."),
146090
- preset("voice_singing.classes", "voice_singing", "class", "Ongoing weekly session", "Ongoing weekly sessions", "Regular choirs, voice circles, community singing, or group practice."),
146091
- preset("voice_singing.terms", "voice_singing", "course", "Singing term", "Singing terms", "Multi-week choir terms, voice courses, or fixed-date group programmes."),
146092
- preset("voice_singing.workshops", "voice_singing", "workshop", "Workshop", "Workshops", "One-off singing workshops, voice journeys, or devotional singing sessions."),
146093
- preset("voice_singing.performances", "voice_singing", "performance", "Performance", "Performances", "Choir concerts, sharing events, recitals, or community performances."),
146094
- preset("performing_arts_school.classes", "performing_arts_school", "class", "Class", "Classes", "Regular group classes, rehearsals, or weekly sessions."),
146095
- preset("performing_arts_school.terms", "performing_arts_school", "course", "Term", "Terms", "Multi-week term blocks or fixed-date course groups."),
146096
- preset("performing_arts_school.workshops", "performing_arts_school", "workshop", "Workshop", "Workshops", "One-off workshops, masterclasses, or intensives."),
146097
- preset("performing_arts_school.performances", "performing_arts_school", "performance", "Performance", "Performances", "Shows, showcases, productions, or ticketed performances."),
146098
- preset("performing_arts_school.lessons", "performing_arts_school", "appointment", "Lesson", "Lessons", "One-to-one lessons, coaching, or audition prep."),
146099
- preset("community_wellbeing.classes", "community_wellbeing", "class", "Class", "Classes", "Regular groups, sessions, practices, or weekly activities."),
146100
- preset("community_wellbeing.workshops", "community_wellbeing", "workshop", "Workshop", "Workshops", "One-off workshops, talks, events, or gatherings."),
146101
- preset("community_wellbeing.courses", "community_wellbeing", "course", "Course", "Courses", "Fixed-schedule courses, study groups, or multi-session programmes."),
146102
- preset("community_wellbeing.appointments", "community_wellbeing", "appointment", "Appointment", "Appointments", "One-to-one appointments, consultations, or support sessions."),
146103
- preset("community_wellbeing.retreats", "community_wellbeing", "retreat", "Retreat", "Retreats", "Multi-day or residential retreats."),
146104
- preset("venue_event_space.resource_hire", "venue_event_space", "appointment", "Hire slot", "Hire slots", "Future room, venue, and resource hire bookings.", "future")
146105
- ];
146106
- const VERTICAL_ID_SET = new Set(VERTICAL_IDS);
146054
+ ]);
146107
146055
  const VERTICAL_PRESET_ID_SET = new Set(VERTICAL_BOOKING_PRESETS.map((presetDefinition) => presetDefinition.id));
146108
146056
  function parseVerticalId(value) {
146109
146057
  return typeof value === "string" && VERTICAL_ID_SET.has(value) ? value : null;
@@ -146219,18 +146167,6 @@ const DEFAULT_SITE_VERTICAL_BOOKING_CONFIG = {
146219
146167
  verticalId: null,
146220
146168
  selectedPresetIds: []
146221
146169
  };
146222
- function preset(id, verticalId, canonicalBehaviour, label, pluralLabel, description, availability = "onboarding") {
146223
- return {
146224
- id,
146225
- verticalId,
146226
- canonicalBehaviour,
146227
- engine: BOOKING_ENGINE_BY_BEHAVIOUR[canonicalBehaviour],
146228
- availability,
146229
- label,
146230
- pluralLabel,
146231
- description
146232
- };
146233
- }
146234
146170
  //#endregion
146235
146171
  //#region ../api/src/utils/isRecord.ts
146236
146172
  function isRecord$2(value) {
@@ -146387,10 +146323,9 @@ z$1.object({
146387
146323
  const BOOKING_QUESTION_ANSWER_EXPORT_SCOPES = {
146388
146324
  site: "site",
146389
146325
  appointments: "appointments",
146390
- eventSeries: "event_series",
146391
- course: "course"
146326
+ eventSeries: "event_series"
146392
146327
  };
146393
- BOOKING_QUESTION_ANSWER_EXPORT_SCOPES.site, BOOKING_QUESTION_ANSWER_EXPORT_SCOPES.appointments, BOOKING_QUESTION_ANSWER_EXPORT_SCOPES.eventSeries, BOOKING_QUESTION_ANSWER_EXPORT_SCOPES.course;
146328
+ BOOKING_QUESTION_ANSWER_EXPORT_SCOPES.site, BOOKING_QUESTION_ANSWER_EXPORT_SCOPES.appointments, BOOKING_QUESTION_ANSWER_EXPORT_SCOPES.eventSeries;
146394
146329
  //#endregion
146395
146330
  //#region ../api/src/siteBanner.ts
146396
146331
  const SITE_BANNER_SCOPE_VALUES = ["homepage", "all-pages"];
@@ -159285,12 +159220,6 @@ function optimisticHashForSave(revision) {
159285
159220
  }
159286
159221
  }
159287
159222
  const MISSING_REQUIRED_BLOCK_REVISION = "This Page Content block is missing its current revision. Reload the editor and try again.";
159288
- function planBlockSaveFailureRecovery(error, revision) {
159289
- return (error instanceof ApiEnvelopeError && error.code === "resource:conflict" || error instanceof ApiRequestError && (error.errorCode === "resource:conflict" || error.status === 409)) && revision.kind === "compareAndSet" ? {
159290
- kind: "rebaseOnNewRevision",
159291
- failedOptimisticHash: revision.optimisticHash
159292
- } : { kind: "manualRetry" };
159293
- }
159294
159223
  /**
159295
159224
  * Hook to handle block autosave for pages.
159296
159225
  * Watches for pending block changes and debounces saves to the server.
@@ -159324,7 +159253,7 @@ function useBlockAutosave({ uiStore, apiClient, siteId, hasRoute, owner }) {
159324
159253
  });
159325
159254
  } else {
159326
159255
  const message = result.reason instanceof Error ? result.reason.message : "Failed to save block";
159327
- drafts.autosaveFailed(blockId, message, planBlockSaveFailureRecovery(result.reason, pending.revision));
159256
+ drafts.autosaveFailed(blockId, message);
159328
159257
  }
159329
159258
  });
159330
159259
  return results;
@@ -159804,7 +159733,7 @@ function useEntryActions({ entry, uiStore, hasRoute, routing, publishMutation, d
159804
159733
  setErrorMessage(null);
159805
159734
  const dirtyTypes = getDirtyAutosaveTypes(uiStore, hasRoute);
159806
159735
  if (dirtyTypes.length === 0) return;
159807
- uiStore.getState().autosave.saveNow(dirtyTypes);
159736
+ await uiStore.getState().autosave.saveNow(dirtyTypes);
159808
159737
  await waitForAutosavesComplete(uiStore);
159809
159738
  if (hasAutosaveErrors(uiStore)) {
159810
159739
  const message = "Failed to save draft — some changes may not be saved.";
@@ -159837,7 +159766,7 @@ function useEntryActions({ entry, uiStore, hasRoute, routing, publishMutation, d
159837
159766
  throw new Error("Cannot publish: failed to save draft changes.");
159838
159767
  }
159839
159768
  const dirtyTypes = getDirtyAutosaveTypes(uiStore, hasRoute);
159840
- uiStore.getState().autosave.saveNow(dirtyTypes);
159769
+ await uiStore.getState().autosave.saveNow(dirtyTypes);
159841
159770
  uiStore.getState().autosave.flushAllPending();
159842
159771
  await waitForAutosavesComplete(uiStore);
159843
159772
  const autosavePublishability = derivePublishability({
@@ -160400,58 +160329,6 @@ function cloneContentValues(value) {
160400
160329
  function cloneBlockValues(value) {
160401
160330
  return cloneBrandedValues(value, unsafeAsEditorBlockValues);
160402
160331
  }
160403
- const MISSING_MERGE_VALUE = Symbol("missing-merge-value");
160404
- function isMergeRecord(value) {
160405
- return typeof value === "object" && value !== null && !Array.isArray(value);
160406
- }
160407
- function mergeValuesEqual(left, right) {
160408
- if (left === MISSING_MERGE_VALUE || right === MISSING_MERGE_VALUE) return left === right;
160409
- if (Object.is(left, right)) return true;
160410
- if (Array.isArray(left) && Array.isArray(right)) return left.length === right.length && left.every((value, index) => mergeValuesEqual(value, right[index]));
160411
- if (!isMergeRecord(left) || !isMergeRecord(right)) return false;
160412
- const leftKeys = Object.keys(left).sort();
160413
- const rightKeys = Object.keys(right).sort();
160414
- return leftKeys.length === rightKeys.length && leftKeys.every((key, index) => key === rightKeys[index] && mergeValuesEqual(left[key], right[key]));
160415
- }
160416
- function mergeValueChanges(baseline, local, remote) {
160417
- if (mergeValuesEqual(local, baseline)) return {
160418
- kind: "merged",
160419
- value: cloneUnknown(remote)
160420
- };
160421
- if (mergeValuesEqual(remote, baseline) || mergeValuesEqual(local, remote)) return {
160422
- kind: "merged",
160423
- value: cloneUnknown(local)
160424
- };
160425
- if (!isMergeRecord(baseline) || !isMergeRecord(local) || !isMergeRecord(remote)) return { kind: "conflict" };
160426
- const merged = {};
160427
- const keys = /* @__PURE__ */ new Set([
160428
- ...Object.keys(baseline),
160429
- ...Object.keys(local),
160430
- ...Object.keys(remote)
160431
- ]);
160432
- for (const key of keys) {
160433
- const child = mergeValueChanges(key in baseline ? baseline[key] : MISSING_MERGE_VALUE, key in local ? local[key] : MISSING_MERGE_VALUE, key in remote ? remote[key] : MISSING_MERGE_VALUE);
160434
- if (child.kind === "conflict") return child;
160435
- if (child.value !== MISSING_MERGE_VALUE) merged[key] = child.value;
160436
- }
160437
- return {
160438
- kind: "merged",
160439
- value: merged
160440
- };
160441
- }
160442
- function mergeBlockValues(baseline, local, remote) {
160443
- const result = mergeValueChanges(baseline, local, remote);
160444
- if (result.kind === "conflict") return result;
160445
- if (result.value === null) return {
160446
- kind: "merged",
160447
- value: null
160448
- };
160449
- if (!isMergeRecord(result.value)) return { kind: "conflict" };
160450
- return {
160451
- kind: "merged",
160452
- value: unsafeAsEditorBlockValues(result.value)
160453
- };
160454
- }
160455
160332
  function createSyncState(baseline, current) {
160456
160333
  return recordsEqual(baseline, current) ? BASELINE_SYNC_STATE : PENDING_SYNC_STATE;
160457
160334
  }
@@ -161103,7 +160980,7 @@ function applySystemOperation(snapshot, operation) {
161103
160980
  case "remove-draft-block": return removeDraftBlock(snapshot, operation.blockId);
161104
160981
  case "set-draft-published-baselines": return setDraftPublishedBaselines(snapshot, operation.blocks);
161105
160982
  case "autosave-draft-succeeded": return autosaveDraftSucceeded(snapshot, operation.blockId, operation.savedValues, operation.acknowledgedVersion, operation.optimisticHash);
161106
- case "autosave-draft-failed": return autosaveDraftFailed(snapshot, operation.blockId, operation.message, operation.recovery);
160983
+ case "autosave-draft-failed": return autosaveDraftFailed(snapshot, operation.blockId, operation.message);
161107
160984
  case "clear-draft-error": return clearDraftError(snapshot, operation.blockId);
161108
160985
  case "set-draft-pending": return setDraftPending(snapshot, operation.blockId);
161109
160986
  case "clear-draft-pending": return clearDraftPending(snapshot, operation.blockId);
@@ -161250,15 +161127,12 @@ function buildDraftSnapshotFromBaseline(blockId, baseline, meta, existing) {
161250
161127
  const hasPendingSave = existingSyncState?.kind === "pending";
161251
161128
  const failedSave = existingSyncState?.kind === "failed" ? existingSyncState : null;
161252
161129
  const loadedOptimisticHash = meta.optimisticHash !== void 0 ? meta.optimisticHash : existing?.meta.optimisticHash ?? null;
161253
- const mergeResult = failedSave?.recovery.kind === "rebaseOnNewRevision" && loadedOptimisticHash !== failedSave.recovery.failedOptimisticHash ? mergeBlockValues(existing?.baseline ?? null, existing?.current ?? null, cloneBlockValues(normalizedBaseline)) : null;
161254
- const recoveredConflict = mergeResult?.kind === "merged";
161255
- const shouldPreserveFailedSave = Boolean(failedSave && !recoveredConflict);
161130
+ const shouldPreserveFailedSave = Boolean(failedSave);
161256
161131
  const nextBaseline = hasPendingSave || shouldPreserveFailedSave ? cloneBlockValues(existing?.baseline ?? null) : cloneBlockValues(normalizedBaseline);
161257
- const nextCurrent = hasPendingSave ? existing?.current ?? null : recoveredConflict ? mergeResult.value : shouldPreserveFailedSave ? existing?.current ?? null : cloneBlockValues(normalizedBaseline);
161132
+ const nextCurrent = hasPendingSave ? existing?.current ?? null : shouldPreserveFailedSave ? existing?.current ?? null : cloneBlockValues(normalizedBaseline);
161258
161133
  const nextSyncState = hasPendingSave ? existingSyncState ?? BASELINE_SYNC_STATE : shouldPreserveFailedSave ? failedSave ?? {
161259
161134
  kind: "failed",
161260
- error: "Save failed",
161261
- recovery: { kind: "manualRetry" }
161135
+ error: "Save failed"
161262
161136
  } : createSyncState(nextBaseline, nextCurrent);
161263
161137
  return createDraftSnapshot(blockId, {
161264
161138
  version: existing?.version ?? 0,
@@ -161377,11 +161251,10 @@ function autosaveDraftSucceeded(snapshot, blockId, savedValues, acknowledgedVers
161377
161251
  }
161378
161252
  };
161379
161253
  }
161380
- function autosaveDraftFailed(snapshot, blockId, message, recovery = { kind: "manualRetry" }) {
161254
+ function autosaveDraftFailed(snapshot, blockId, message) {
161381
161255
  return nextDraftRecord(snapshot, blockId, (draft) => updateDraftSnapshot(draft, { syncState: {
161382
161256
  kind: "failed",
161383
- error: message ?? "Save failed",
161384
- recovery
161257
+ error: message ?? "Save failed"
161385
161258
  } }));
161386
161259
  }
161387
161260
  function clearDraftError(snapshot, blockId) {
@@ -162153,12 +162026,11 @@ function createEditorUiStore(options = {}) {
162153
162026
  optimisticHash: acknowledgement?.optimisticHash ?? currentSnapshot?.meta.optimisticHash ?? null
162154
162027
  })) notifyDraftChangeListeners(blockId);
162155
162028
  },
162156
- autosaveFailed: (blockId, message, recovery) => {
162029
+ autosaveFailed: (blockId, message) => {
162157
162030
  if (applySystemEditorOperation({
162158
162031
  type: "autosave-draft-failed",
162159
162032
  blockId,
162160
- message,
162161
- recovery
162033
+ message
162162
162034
  })) notifyDraftChangeListeners(blockId);
162163
162035
  },
162164
162036
  setAtPath: (blockId, path, value) => {
@@ -194067,6 +193939,13 @@ function usePreviewDesignCoordinator() {
194067
193939
  }
194068
193940
  //#endregion
194069
193941
  //#region ../preview-next/src/client/preview/siteStylePreviewPlanner.ts
193942
+ function deriveSiteStylePreviewUpdate(baseTheme, baseSelection) {
193943
+ return {
193944
+ kind: "derive-update",
193945
+ baseTheme,
193946
+ baseSelection
193947
+ };
193948
+ }
194070
193949
  function planSiteStylePreviewChange(input) {
194071
193950
  const resolvedPalette = resolvedPaletteForPreview(input.selection.palette, input.siteStyle);
194072
193951
  const compiled = compileSiteThemeFromSelections({
@@ -194074,15 +193953,15 @@ function planSiteStylePreviewChange(input) {
194074
193953
  buttonStyleSelection: input.selection.buttonStyleSelection,
194075
193954
  resolvedPalette,
194076
193955
  typography: input.selection.typography,
194077
- headerLayoutId: input.selection.headerLayoutId,
194078
- headerStyleId: input.selection.headerStyleId,
194079
- headerLookId: input.selection.headerLookId,
194080
- footerLookId: input.selection.footerLookId,
194081
- headerSelectionContext: input.headerSelectionContext
193956
+ compilationPlan: compilationPlanForPreview(input)
194082
193957
  });
194083
193958
  return {
194084
193959
  themeOverlay: compiled.theme,
194085
- resolvedSelections: compiled.resolvedSelections,
193960
+ resolvedSelections: {
193961
+ ...compiled.resolvedSelections,
193962
+ headerLayoutId: compiled.resolvedSelections.headerLayoutId ?? input.selection.headerLayoutId ?? input.siteStyle.defaultHeaderSelection.layoutId,
193963
+ headerStyleId: compiled.resolvedSelections.headerStyleId ?? input.selection.headerStyleId ?? input.siteStyle.defaultHeaderSelection.styleId
193964
+ },
194086
193965
  chromeSelection: {
194087
193966
  headerLookId: input.selection.headerLookId,
194088
193967
  footerLookId: input.selection.footerLookId
@@ -194090,6 +193969,65 @@ function planSiteStylePreviewChange(input) {
194090
193969
  warnings: compiled.warnings
194091
193970
  };
194092
193971
  }
193972
+ function compilationPlanForPreview(input) {
193973
+ const replacement = () => replaceSiteStyleCompilationPlan({
193974
+ headerLayoutId: input.selection.headerLayoutId,
193975
+ headerStyleId: input.selection.headerStyleId,
193976
+ headerLookId: input.selection.headerLookId,
193977
+ footerLookId: input.selection.footerLookId,
193978
+ headerSelectionContext: input.headerSelectionContext
193979
+ });
193980
+ if (input.compilation.kind === "replace-site-style") return replacement();
193981
+ const baseTheme = input.compilation.baseTheme;
193982
+ if (!baseTheme) return replacement();
193983
+ if (input.compilation.kind === "edit-chrome") return updateCompilationPlan({
193984
+ baseTheme,
193985
+ selection: input.selection,
193986
+ headerSelectionContext: input.headerSelectionContext,
193987
+ recompileHeader: input.compilation.surface === "header",
193988
+ applyFooterLook: input.compilation.surface === "footer"
193989
+ });
193990
+ if (input.compilation.baseSelection.siteStyleId !== input.selection.siteStyleId) return replacement();
193991
+ return updateCompilationPlan({
193992
+ baseTheme,
193993
+ selection: input.selection,
193994
+ headerSelectionContext: input.headerSelectionContext,
193995
+ recompileHeader: headerSelectionChanged(input.compilation.baseSelection, input.selection),
193996
+ applyFooterLook: input.compilation.baseSelection.footerLookId !== input.selection.footerLookId
193997
+ });
193998
+ }
193999
+ function updateCompilationPlan(input) {
194000
+ const selection = {
194001
+ headerLookId: input.selection.headerLookId,
194002
+ headerLayoutId: input.selection.headerLayoutId ?? null,
194003
+ headerStyleId: input.selection.headerStyleId ?? null
194004
+ };
194005
+ return {
194006
+ kind: "update-selection",
194007
+ header: input.recompileHeader ? {
194008
+ kind: "recompile",
194009
+ selection,
194010
+ context: completeHeaderSelectionContext(input.headerSelectionContext),
194011
+ brandPresentation: { kind: "apply-logo-context" }
194012
+ } : {
194013
+ kind: "preserve",
194014
+ header: input.baseTheme.header,
194015
+ selection
194016
+ },
194017
+ footer: input.applyFooterLook ? {
194018
+ kind: "apply-look",
194019
+ footer: input.baseTheme.footer,
194020
+ footerLookId: input.selection.footerLookId
194021
+ } : {
194022
+ kind: "preserve",
194023
+ footer: input.baseTheme.footer,
194024
+ footerLookId: input.selection.footerLookId
194025
+ }
194026
+ };
194027
+ }
194028
+ function headerSelectionChanged(base, previewed) {
194029
+ return base.headerLookId !== previewed.headerLookId || base.headerLayoutId !== previewed.headerLayoutId || base.headerStyleId !== previewed.headerStyleId;
194030
+ }
194093
194031
  function resolvedPaletteForPreview(palette, siteStyle) {
194094
194032
  if (palette.kind === "available") {
194095
194033
  const preview = completePaletteEditorPreview(palette.editor);
@@ -194146,11 +194084,13 @@ function buildSiteChromeLookModels(input) {
194146
194084
  siteStyle: input.siteStyle,
194147
194085
  buttonStyleSelection: selection.buttonStyleSelection,
194148
194086
  resolvedPalette: resolvedPaletteForPreview(selection.palette, input.siteStyle),
194149
- headerLayoutId: selection.headerLayoutId,
194150
- headerStyleId: selection.headerStyleId,
194151
- headerLookId: selection.headerLookId,
194152
- footerLookId: selection.footerLookId,
194153
- headerSelectionContext: input.headerSelectionContext
194087
+ compilationPlan: replaceSiteStyleCompilationPlan({
194088
+ headerLayoutId: selection.headerLayoutId,
194089
+ headerStyleId: selection.headerStyleId,
194090
+ headerLookId: selection.headerLookId,
194091
+ footerLookId: selection.footerLookId,
194092
+ headerSelectionContext: input.headerSelectionContext
194093
+ })
194154
194094
  });
194155
194095
  const renderedHeaderLayoutId = current.resolvedSelections.headerLayoutId;
194156
194096
  const renderedHeaderStyleId = current.resolvedSelections.headerStyleId;
@@ -194275,7 +194215,7 @@ function resolveStyleConfiguratorInitialSnapshot(input) {
194275
194215
  buttonStyleSelection: input.initialSelections.buttonStyleSelection,
194276
194216
  resolvedPalette: resolvedRuntimePalette?.ok ? resolvedRuntimePalette.resolved : resolvedPaletteForPreview(palette, siteStyle),
194277
194217
  typography: input.theme?.typography ?? siteStyle.typography,
194278
- ...sharedSelectionInputs(input)
194218
+ compilationPlan: replaceSiteStyleCompilationPlan(sharedSelectionInputs(input))
194279
194219
  });
194280
194220
  return {
194281
194221
  siteStyleId: siteStyle.id,
@@ -194301,10 +194241,7 @@ function sharedSelectionInputs(input) {
194301
194241
  }
194302
194242
  //#endregion
194303
194243
  //#region ../preview-next/src/client/preview/siteChromeBrandPreferences.ts
194304
- const DEFAULT_HEADER_BRAND_PREFERENCES = {
194305
- brandDisplay: "auto",
194306
- logoSize: "auto"
194307
- };
194244
+ const DEFAULT_HEADER_BRAND_PREFERENCES = defaultHeaderBrandPreferences;
194308
194245
  const HEADER_BRAND_DISPLAY_OPTIONS = [
194309
194246
  {
194310
194247
  value: "auto",
@@ -194382,10 +194319,7 @@ function createHeaderBrandControlStateFromPreferences({ preferences, headerSelec
194382
194319
  };
194383
194320
  }
194384
194321
  function readHeaderBrandPreferences(theme) {
194385
- return {
194386
- brandDisplay: theme?.header?.logo?.brandDisplay ?? DEFAULT_HEADER_BRAND_PREFERENCES.brandDisplay,
194387
- logoSize: theme?.header?.logo?.size ?? DEFAULT_HEADER_BRAND_PREFERENCES.logoSize
194388
- };
194322
+ return headerBrandPreferencesFromTheme(theme);
194389
194323
  }
194390
194324
  function normalizeHeaderBrandPreferences(preferences, hasLogo) {
194391
194325
  if (hasLogo || preferences.brandDisplay !== "logo-only") return preferences;
@@ -194431,12 +194365,16 @@ function hasLogoInHeaderSelectionContext(context) {
194431
194365
  }
194432
194366
  //#endregion
194433
194367
  //#region ../preview-next/src/client/preview/siteChromeSavePlan.ts
194434
- function buildSiteChromeSavePlan({ surface, siteStyle, selection, baseTheme, headerSelectionContext, headerBrandPreferences, headerNavPreferences, backgroundPreferences, themeId, selectionId, baseSelectionUpdatedAt }) {
194368
+ function buildSiteChromeSavePlan({ surface, selectionPersistence, siteStyle, selection, baseTheme, headerSelectionContext, headerBrandPreferences, headerNavPreferences, backgroundPreferences, themeId, selectionId, baseSelectionUpdatedAt }) {
194435
194369
  const compiled = planSiteStylePreviewChange({
194436
194370
  siteStyle,
194437
194371
  selection,
194438
- baseTheme,
194439
- headerSelectionContext: withHeaderBrandPreferences(headerSelectionContext, headerBrandPreferences)
194372
+ headerSelectionContext: withHeaderBrandPreferences(headerSelectionContext, headerBrandPreferences),
194373
+ compilation: {
194374
+ kind: "edit-chrome",
194375
+ baseTheme,
194376
+ surface
194377
+ }
194440
194378
  });
194441
194379
  const themeOverlay = applySiteChromeBackgroundPreferences(withHeaderNavThemePreferences(withHeaderBrandThemePreferences(compiled.themeOverlay, headerBrandPreferences), headerNavPreferences), backgroundPreferences);
194442
194380
  return {
@@ -194445,8 +194383,10 @@ function buildSiteChromeSavePlan({ surface, siteStyle, selection, baseTheme, hea
194445
194383
  body: surface === "header" ? {
194446
194384
  surface,
194447
194385
  lookId: selection.headerLookId,
194448
- layoutId: selection.headerLayoutId,
194449
- styleId: selection.headerStyleId,
194386
+ ...selectionPersistence.kind === "write" ? {
194387
+ layoutId: selection.headerLayoutId,
194388
+ styleId: selection.headerStyleId
194389
+ } : {},
194450
194390
  theme: themeOverlay,
194451
194391
  themeId,
194452
194392
  selectionId,
@@ -194552,8 +194492,8 @@ function selectionSnapshotFromApplySiteStyleSelectionResponse(saved, fallback) {
194552
194492
  palette: paletteSnapshotFromApplyResponse(saved),
194553
194493
  typography: saved.theme.typography,
194554
194494
  headerLookId: saved.headerLookId,
194555
- headerLayoutId: saved.headerLayoutId,
194556
- headerStyleId: saved.headerStyleId,
194495
+ headerLayoutId: saved.headerLayoutId ?? fallback.headerLayoutId,
194496
+ headerStyleId: saved.headerStyleId ?? fallback.headerStyleId,
194557
194497
  footerLookId: saved.footerLookId
194558
194498
  };
194559
194499
  }
@@ -195403,6 +195343,7 @@ function SiteChromeCustomizeProvider({ children, siteId, apiClient, theme, theme
195403
195343
  };
195404
195344
  const savePlan = buildSiteChromeSavePlan({
195405
195345
  surface: request.kind === "selection" ? request.surface : "header",
195346
+ selectionPersistence: request.kind === "selection" ? { kind: "write" } : { kind: "preserve" },
195406
195347
  siteStyle,
195407
195348
  selection,
195408
195349
  baseTheme: currentThemeRef.current ?? theme,
@@ -195875,8 +195816,8 @@ function selectionSnapshotFromSiteChromeSaveResponse({ saved, fallback, savePlan
195875
195816
  palette: fallback.palette,
195876
195817
  typography: savePlan.themeOverlay.typography,
195877
195818
  headerLookId: saved.headerLookId ?? fallback.headerLookId,
195878
- headerLayoutId: saved.headerLayoutId ?? savePlan.compiled.resolvedSelections.headerLayoutId,
195879
- headerStyleId: saved.headerStyleId ?? savePlan.compiled.resolvedSelections.headerStyleId,
195819
+ headerLayoutId: saved.headerLayoutId ?? savePlan.compiled.resolvedSelections.headerLayoutId ?? fallback.headerLayoutId,
195820
+ headerStyleId: saved.headerStyleId ?? savePlan.compiled.resolvedSelections.headerStyleId ?? fallback.headerStyleId,
195880
195821
  footerLookId: saved.footerLookId ?? fallback.footerLookId
195881
195822
  };
195882
195823
  }
@@ -195906,4 +195847,4 @@ function useSiteChromeCustomizeOptional() {
195906
195847
  return useContext(SiteChromeCustomizeContext);
195907
195848
  }
195908
195849
  //#endregion
195909
- export { confirmAutosaveBatch as $, toLocationMapHydrationProps as $a, cn$2 as $c, findCuratedPalette as $i, LoaderCircle as $l, uiTransforms as $n, CircleMinusIcon as $o, productItemKey as $r, mapCurrentValueForSelect as $s, undoHistory as $t, dismissWarnings as A, eventCalendarDefaultViewSchema as Aa, CollapsibleContent as Ac, curatedSiteStyles as Ai, unsafeAsFormId as Al, deriveLaunchReadiness as An, mediaSchema as Ao, buildGiftingInteractiveIslandProps as Ar, parseThemeButtonVariantId as As, ReferenceField as At, previewCuratedPalette as B, eventBlockKindValues as Ba, DropdownMenuLabel as Bc, getGradientPreset as Bi, Star as Bl, mergeContentWithBlockStyleOverrides as Bn, isObjectRecord$1 as Bo, buildProductListInteractiveIslandProps as Br, assertNever$8 as Bs, hideThemeV2RawStyleFields as Bt, applyResolvedSelections as C, resolveEventListPaginationAction as Ca, Dialog as Cc, formatSiteChromeBackgroundTokenLabel as Ci, assertNever$9 as Cl, useMediaEditorOptional as Cn, defineProgressiveBlockRuntime as Co, resolveDiscountContext as Cr, siblingPath$1 as Cs, IconPickerField as Ct, createPalette as D, calendarTabViewsSchema as Da, DialogHeader as Dc, retargetCompiledRuntimeFieldsForContentAdjacency as Di, unsafeAsAppointmentResourceId as Dl, listEntryPageContentSlots as Dn, splitPositioningClasses as Do, getStepNumber as Dr, updateButtonStyleSelectionChoice as Ds, ButtonWidgetProvider as Dt, committedPaletteForSnapshot as E, normalizeOptionalId as Ea, DialogFooter as Ec, retargetCompiledBoundaryRuntimeForContentAdjacency as Ei, parseSiteId as El, getPageDesignEditorState as En, markEditableSurfaceForwarding as Eo, WIZARD_STEPS as Er, resolveButtonStyleSelection as Es, ButtonVariantField as Et, openRow as F, eventCalendarListLayoutCompatibleDisplayModeValues as Fa, createCollapsibleScope as Fc, getHeaderLayout as Fi, Upload as Fl, createCustomBlockRegistry as Fn, parseBlockIconValue as Fo, checkoutBlockDefinition as Fr, resolveOnColorForThemeToken as Fs, EditorProvider as Ft, previewSiteStyle as G, normalizeEventScheduleScope as Ga, createCollection as Gc, sectionTransitionVariantForBoundaryOptionId as Gi, Redo2 as Gl, siteHeaderManifest as Gn, isInlineTextEmpty as Go, buildProductDetailDisplay as Gr, mergeStyles as Gs, useEditorUiStore as Gt, previewHeaderLayout as H, eventSurfaceScopeValues as Ha, DropdownMenuTrigger as Hc, defaultSectionTransitionVariantForFamily as Hi, Smartphone as Hl, getBlockDefinition as Hn, logger$1 as Ho, getShopDisplayForItems as Hr, normalizeBoxStylesCardVariant as Hs, stripTopLevelRoutingUi as Ht, paletteMutationCapability as I, eventCalendarListLayoutOptions as Ia, Surface as Ic, getHeaderStyle as Ii, Undo2 as Il, buildThemeRuntime as In, resolveBlockIconRenderValue as Io, cartBlockDefinition as Ir, resolveTokenOrCssColorValue as Is, useEditor$1 as It, setPaletteColors as J, normalizeEventSurfaceScope as Ja, composeEventHandlers as Jc, backgroundAppearanceQuickColorTokenNames as Ji, PenLine as Jl, planSiteOverlayHeaderClearance as Jn, isBlockButtonRole as Jo, EMPTY_COMMERCE_CART_STATE as Jr, getFieldIntent as Js, canRedoHistory as Jt, reconcilePaletteLibraryActive as K, normalizeEventStaffMemberId as Ka, useControllableState as Kc, BACKGROUND_BODY_TEXT_MIN_CONTRAST_RATIO as Ki, Plus as Kl, SITE_CHROME_VISIBLE_HEADER_SELECTOR as Kn, parseInlineTextFromUnknown as Ko, formatCommercePrice as Kr, rgbColorValue as Ks, useEditorUiStoreInstance as Kt, palettePreviewProjection as L, el as La, DropdownMenu as Lc, gradientToCss as Li, TriangleAlert as Ll, DEFAULT_THEME_RESPONSIVE_MODE as Ln, parseGeneratedIconAssetId as Lo, buildCartInteractiveIslandProps as Lr, isThemeV2NormalEditorRawStyleFieldName as Ls, LinkField as Lt, markApplyFailed as M, filterAutoShowSchema as Ma, Content$1 as Mc, getCuratedSiteStyle as Mi, err as Ml, isSupportedLoaderEndpoint as Mn, resolveFeatureCardGeneratedIconSizePx as Mo, buildCourseRegistrationInteractiveIslandProps as Mr, parseThemeForPersistence as Ms, useRichTextImagePicker as Mt, markApplySaved as N, previewStageSchema as Na, Root$3 as Nc, surfaceResolutionContextFromTheme as Ni, ok$1 as Nl, ThemeScope as Nn, shouldReserveFeatureCardIconZone as No, normalizeEventRegistrationPageSurfaceSubject as Nr, getTextColorForBackground as Ns, RichTextField as Nt, createStyleConfiguratorState as O, columnOptionSchema as Oa, DialogTitle as Oc, planPageDesignLayoutLookCompatibility as Oi, unsafeAsAppointmentServiceId as Ol, decodePublicProductCategorySelectorQuery as On, planSiteChromePlacement as Oo, getWizardStepsForContext as Or, buttonStyleSelectionKey as Os, FileField as Ot, markApplySaving as P, weekStartSchema as Pa, Trigger$3 as Pc, findFooterLook as Pi, X as Pl, containerResponsiveThemeCss as Pn, buildGeneratedBlockIconRenderAssetLookupFromUnknown as Po, resolveEventRegistrationScopedEvents as Pr, isCssColorLiteral as Ps, RichTextWidgetProvider as Pt, beginAutosaveBatch as Q, normalizeLocationMapProps as Qa, useComposedRefs as Qc, curatedPalettes as Qi, Maximize2 as Ql, layoutTransforms as Qn, ChevronDownIcon as Qo, parseStoredCommerceCartState as Qr, hasEmptyOption as Qs, redoHistory as Qt, prepareStalePaletteRetry as R, when as Ra, DropdownMenuContent as Rc, GRADIENT_PRESETS as Ri, Ticket as Rl, getResponsiveScopeSpec as Rn, parseGeneratedIconSetId as Ro, buildCheckoutInteractiveIslandProps as Rr, pageDesignEditorBackgroundOverrideOwner as Rs, LinkWidgetProvider as Rt, usePreviewThemeOverlay as S, resolveEventCalendarListPageSize as Sa, TabsTrigger as Sc, resolveBackgroundColorValue as Si, formatCurrencyAmount as Sl, MediaEditorContextProvider as Sn, defineClientOwnedBlockRuntime as So, findPreSelectedEvent as Sr, getAtPath as Ss, InlineTextField as St, cancelPreview as T, normalizeCsvString as Ta, DialogDescription as Tc, compileEditorModelRuntime as Ti, parseMediaAssetId as Tl, applyPageDesignEditorAction as Tn, composeHeaderSectionWrapperClassName as To, resolveRegistrationTarget as Tr, findButtonStyleRecipe as Ts, EntryPickerWidgetProvider as Tt, previewHeaderStyle as U, normalizeEventBlockKind as Ua, useId$1 as Uc, sectionTransitionFamilies as Ui, SlidersHorizontal as Ul, projectRecurringSchedule as Un, coerceInlineTextWithFallback as Uo, buildCartDisplay as Ur, normalizeCardVariantRole as Us, getBlockManifestFromSdkConfig as Ut, previewFooterLook as V, eventScheduleScopeValues as Va, DropdownMenuSeparator as Vc, parseGradientPresetId as Vi, Sparkles as Vl, generateDefaultAccordionSystem as Vn, isRecord$10 as Vo, buildShopInteractiveIslandProps as Vr, ICON_CONFIG as Vs, prepareBlockEditorManifest as Vt, previewSitePalette as W, normalizeEventCategoryIdsCsv as Wa, useDirection as Wc, sectionTransitionFamilyForBoundaryOptionId as Wi, RotateCcw as Wl, siteFooterManifest as Wn, inlineTextToPlainText as Wo, buildProductCardDisplay as Wr, backgroundColorStyle as Ws, classifyHistoryShortcut as Wt, syncStyleConfiguratorState as X, publicEventSchema as Xa, Button$1 as Xc, parseBackgroundAppearanceColorToken as Xi, Monitor as Xl, contentTransforms as Xn, ArrowDownIcon as Xo, buildProductCartItem as Xr, SdkConfigProvider as Xs, createHistoryState as Xt, styleConfiguratorHistoryEntryForPersistedSelection as Y, normalizeEventVenueId as Ya, Primitive as Yc, foregroundTokenForBackgroundAppearanceColorToken as Yi, Palette as Yl, visibleHeaderClearancePx as Yn, getIconComponent as Yo, buildPassCartItem as Yr, isHeaderField as Ys, canUndoHistory as Yt, toggleRow as Z, buildGoogleMapsDirectionsUrl as Za, cva as Zc, defaultThemeTokens as Zi, Minus as Zl, mediaTransforms as Zn, ArrowRightIcon as Zo, deriveCommerceCheckoutState as Zr, useSdkConfig as Zs, pushHistoryEntry as Zt, planSiteChromeLookSelection as _, resolveSpacing as _a, PopoverTrigger as _c, defineFragment as _i, publicEventPricingCurrency as _l, createManifestValidation as _n, blockBookingPaymentTermsSchema as _o, buildFormInteractiveIslandProps as _r, resolveMediaNodeResponsiveImage as _s, createSiteOptionWidgetAdapters as _t, previewDesignHistoryDomainForCommand as a, runTransforms as aa, TooltipContent as ac, faqHeadingFragment as ai, formatBookingDate as al, createSnapshotFromPageRecord as an, formatEventTeacherLine as ao, shopBlockDefinition as ar, FileSpreadsheetIcon as as, resolvePreviewSidebarTab as at, CirclePlus as au, usePreviewDesignCoordinator as b, eventPageSizeSchema as ba, TabsContent as bc, boxStylesTransforms as bi, publicEventScalarPrice as bl, createStoreBackend as bn, defineInteractiveIslandMetaKeys as bo, toRegistrationEvents as br, SECTION_BACKGROUND_MIN_SOURCE_WIDTH as bs, OfferingsPreviewGroupOrderField as bt, selectionSnapshotFromApplySiteStyleSelectionResponse as c, OFFERINGS_PREVIEW_DEFAULT_EMPTY_MESSAGE as ca, SelectContent as cc, formEmbedFragment as ci, formatBookingTime as cl, parseReferenceKind as cn, getContainerClass as co, newsletterSignupBlockDefinition as cr, PlusIcon as cs, PreviewInlineTextEditor as ct, ChevronLeft as cu, PREVIEW_DESIGN_REFRESH_ERROR_MESSAGE as d, buildOfferingsPreviewRenderStates as da, SelectValue as dc, testimonialsHeadingFragment as di, parseBookingLocalDate as dl, resolveContentTitle as dn, resolveEventLinkProps as do, buildEventListingInteractiveIslandProps as dr, buildResolveImageUrlContext as ds, useUISelector as dt, ArrowDown as du, buildPaletteLibraryReadModel as ea, mapOptionValueForSelect as ec, reduceCommerceCart as ei, clsx as el, unsafeAsLinkedContentEntryId as en, formatDate as eo, formattingTransforms as er, CirclePlusIcon as es, deriveTransactionCapabilities as et, Image as eu, PREVIEW_DESIGN_SAVE_ERROR_MESSAGE as f, normalizeOfferingsPreviewItemLimit as fa, Callout as fc, ctaCopyFragment as fi, resolveBookingTimeZoneId as fl, PaletteProvider as fn, getEventAvailability as fo, eventCalendarBlockDefinition as fr, computeMediaTransformStyle as fs, EditableBlockProvider as ft, __exportAll as fu, cycleableSiteChromeOptions as g, isSemanticSpacing as ga, PopoverContent as gc, bodyCopyFragment as gi, formatBookingPriceDisplay as gl, createManifestFormAdapter as gn, resolveRuntimeEventPricing as go, formBlockDefinition as gr, resolveImageUrlWithContext as gs, createSiteOptionApiLoader as gt, cycleSiteChromeLookId as h, resolveOfferingsPreviewGroups as ha, Popover as hc, heroCopyFragment as hi, parseEventPageSurfaceSubject as hl, ManifestForm as hn, getLocalMinuteOfDay as ho, buildEventCalendarListingRender as hr, renderVideo as hs, useEntryEditorController as ht, usePreviewDesignHistoryOrder as i, createTransformRegistry as ia, Tooltip as ic, faqAccordionFragment as ii, addLocalScheduleDays as il, createRoutingHelpers as in, formatEventPriceDisplay as io, NAV_DROPDOWN_SHIFT_PROPERTY as ir, FileAudioIcon as is, createOptimisticActionRunner as it, CreditCard as iu, isPreviewingChange as j, eventLayoutSchema as ja, CollapsibleTrigger as jc, designRuntimeRulesForTheme as ji, unsafeAsPassId as jl, AMBIENT_BACKGROUND_ROLES as jn, FEATURE_CARD_ICON_TREATMENTS as jo, courseRegistrationBlockDefinition as jr, themeButtonClassName as js, ReferenceWidgetProvider as jt, deriveStyleConfiguratorCapabilities as k, eventButtonVariantSchema as ka, Collapsible as kc, componentRuntimeRulesForTheme as ki, unsafeAsCustomerPassId as kl, DEFAULT_LAUNCH_READINESS_INPUT as kn, PUBLIC_DOWNLOAD_MEDIA_TYPES as ko, giftingBlockDefinition as kr, AFFORDANCE_SUPPRESS_CLASS as ks, MediaField as kt, resolveStyleConfiguratorInitialSnapshot as l, OFFERINGS_PREVIEW_DEFAULT_FAILED_MESSAGE as la, SelectItem as lc, formCopyFragment as li, formatLocalScheduleDate as ll, deriveRouteMetadataPresentation as ln, groupEventsByDate as lo, buildNewsletterFormInteractiveIslandProps as lr, ImagePresets as ls, PreviewTextEditor as lt, ChevronDown as lu, buildSiteChromeLookModels as m, resolveOfferingsPreviewGroupCta as ma, SearchInput as mc, ctaRowFragment as mi, toScheduledBookingDateTime as ml, validateBlockManifestIssues as mn, getLocalDateKey as mo, buildEventCalendarListingDisplay as mr, renderAudio as ms, useEntryController as mt, useSiteChromeCustomizeOptional as n, paletteColorsEqual as na, FieldFrame as nc, headingFragment as ni, unsafeAsEditorBlockId as nl, useMultiAutosave as nn, formatEventDateParts as no, ImageResolveContextProvider as nr, DownloadIcon as ns, idleEditorTransactionQueueState as nt, Eye as nu, selectPreviewDesignHistoryDomain as o, ctaButton as oa, TooltipTrigger as oc, blogFeaturedPostFragment as oi, formatBookingDateTime as ol, BUILT_IN_REFERENCE_KINDS as on, formatTime as oo, productListBlockDefinition as or, FileTextIcon as os, FooterComposerPanel as ot, CircleMinus as ou, reportPreviewDesignError as p, resolveOfferingsPreviewCoursePath as pa, CalloutDescription as pc, heroCtaRowFragment as pi, toBookingTimeZone as pl, usePalette as pn, getEventAvailabilityStatus as po, buildEventCalendarInteractiveIslandProps as pr, getCurrentResolveImageUrlContext as ps, EntryControllerProvider as pt, resetTypographyToSaved as q, normalizeEventSurfacePresetsCsv as qa, createContextScope as qc, backgroundAppearanceColorTokenNames as qi, Pencil as ql, SITE_OVERLAY_HEADER_CLEARANCE_CSS_VAR as qn, canonicalizePersistedBlockButtonRole as qo, formatInterval as qr, textColorStyle as qs, useOptionalEditorUiStoreInstance as qt, PreviewDesignHistoryOrderProvider as r, paletteColorsSchema as ra, useField as rc, cardFragment as ri, unsafeAsEditorBlockValues as rl, useDebouncedLatestSave as rn, formatEventPrice as ro, useImageResolveContextOptional as rr, FileArchiveIcon as rs, rejectAutosaveBatch as rt, EllipsisVertical as ru, buildApplySiteStyleSelectionBody as s, OFFERINGS_PREVIEW_DEFAULT_BUTTON_TEXT as sa, Select$1 as sc, singleButtonFragment as si, formatBookingInstant as sl, isAdapterReferenceKind as sn, getCardOrientation as so, productDetailBlockDefinition as sr, MinusIcon as ss, PreviewRichTextEditor as st, ChevronRight as su, SiteChromeCustomizeProvider as t, paletteColorEntries as ta, unmapValueFromSelect as tc, richTextFragment as ti, parseFooterModuleId as tl, recordsEqual as tn, formatEventCompactDateRail as to, createManifestValidator as tr, ClockIcon as ts, enqueueTransaction as tt, GripVertical as tu, PREVIEW_DESIGN_LOAD_ERROR_MESSAGE as u, OFFERINGS_PREVIEW_EVENT_PRESET_DEFINITIONS as ua, SelectTrigger as uc, testimonialsCarouselFragment as ui, getBookingLocalDateKey as ul, resolvePageRouteSlug as un, resolveEventCta as uo, eventListingBlockDefinition as ur, MediaPlaceholder as us, ContentFieldsForm as ut, Check as uu, planSiteStylePreviewChange as v, buildEventRuntimeFilters as va, Input as vc, BACKGROUND_POSITION_PRESET_VALUES as vi, publicEventPricingMode as vl, FormRenderer as vn, buildInteractiveIslandProps as vo, eventRegistrationBlockDefinition as vr, resolveMediaStorageUrl as vs, SiteOptionPickerField as vt, applyTypographyDraftPatch as w, normalizeCsvIds as wa, DialogContent as wc, applyCompiledRuntimeFieldsToContent as wi, expectParsedBrandedId as wl, useApiMediaUploader as wn, EDITABLE_SURFACE_FORWARDING_PROP as wo, resolveEventRequiresPayment as wr, buttonStyleSelectionParameterValue as ws, EntryPickerField as wt, PreviewThemeOverlayProvider as x, getEventRuntimeFiltersKey as xa, TabsList as xc, resolveSurfaceForegroundStyles as xi, publicEventTicketTypes as xl, MediaEditor as xn, createZodCodec as xo, findEventByOccurrenceId as xr, attachRenderableMediaAssetFields as xs, OfferingsPreviewWidgetProvider as xt, PreviewDesignCoordinatorProvider as y, eventListPaginationActionSchema as ya, Tabs as yc, getAnchorClasses as yi, publicEventPricingType as yl, evaluateVisibility as yn, createInteractiveIslandCodec as yo, buildEventRegistrationInteractiveIslandProps as yr, setContextResolveImageUrlContext as ys, SiteOptionWidgetProvider as yt, previewButtonStyle as z, bindingSchema as za, DropdownMenuItem as zc, GRADIENT_PRESET_IDS as zi, Tablet as zl, escapeStyleContent as zn, RichTextDocSchema as zo, buildProductDetailInteractiveIslandProps as zr, asDesignBlockId as zs, BlockEditor as zt };
195850
+ export { beginAutosaveBatch as $, getLocalDateKey as $a, toScheduledBookingDateTime as $c, curatedPalettes as $i, layoutTransforms as $n, renderAudio as $o, parseStoredCommerceCartState as $r, SearchInput as $s, redoHistory as $t, deriveStyleConfiguratorCapabilities as A, el as Aa, createCollection as Ac, componentRuntimeRulesForTheme as Ai, Redo2 as Al, DEFAULT_LAUNCH_READINESS_INPUT as An, isInlineTextEmpty as Ao, giftingBlockDefinition as Ar, mergeStyles as As, MediaField as At, previewButtonStyle as B, formatEventCompactDateRail as Ba, parseFooterModuleId as Bc, parseGradientPresetId as Bi, GripVertical as Bl, escapeStyleContent as Bn, ClockIcon as Bo, buildProductDetailInteractiveIslandProps as Br, unmapValueFromSelect as Bs, BlockEditor as Bt, usePreviewThemeOverlay as C, eventCollectionHydrationSchema as Ca, DropdownMenuContent as Cc, resolveBackgroundColorValue as Ci, Ticket as Cl, MediaEditorContextProvider as Cn, parseGeneratedIconSetId as Co, findPreSelectedEvent as Cr, pageDesignEditorBackgroundOverrideOwner as Cs, InlineTextField as Ct, committedPaletteForSnapshot as D, normalizeCsvIds as Da, DropdownMenuTrigger as Dc, retargetCompiledBoundaryRuntimeForContentAdjacency as Di, Smartphone as Dl, getPageDesignEditorState as Dn, logger$1 as Do, WIZARD_STEPS as Dr, normalizeBoxStylesCardVariant as Ds, ButtonVariantField as Dt, cancelPreview as E, getEventRuntimeFiltersKey as Ea, DropdownMenuSeparator as Ec, compileEditorModelRuntime as Ei, Sparkles as El, applyPageDesignEditorAction as En, isRecord$10 as Eo, resolveRegistrationTarget as Er, ICON_CONFIG as Es, EntryPickerWidgetProvider as Et, markApplySaving as F, eventCalendarListLayoutOptions as Fa, Button$1 as Fc, findFooterLook as Fi, Monitor as Fl, containerResponsiveThemeCss as Fn, ArrowDownIcon as Fo, resolveEventRegistrationScopedEvents as Fr, SdkConfigProvider as Fs, RichTextWidgetProvider as Ft, previewSitePalette as G, formatTime as Ga, formatBookingDateTime as Gc, getHeaderLayout as Gi, CircleMinus as Gl, siteFooterManifest as Gn, FileTextIcon as Go, buildProductCardDisplay as Gr, TooltipTrigger as Gs, classifyHistoryShortcut as Gt, previewFooterLook as H, formatEventPrice as Ha, unsafeAsEditorBlockValues as Hc, sectionTransitionFamilies as Hi, EllipsisVertical as Hl, generateDefaultAccordionSystem as Hn, FileArchiveIcon as Ho, buildShopInteractiveIslandProps as Hr, useField as Hs, prepareBlockEditorManifest as Ht, openRow as I, buildGoogleMapsDirectionsUrl as Ia, cva as Ic, gradientToCss as Ii, Minus as Il, createCustomBlockRegistry as In, ArrowRightIcon as Io, checkoutBlockDefinition as Ir, useSdkConfig as Is, EditorProvider as It, resetTypographyToSaved as J, groupEventsByDate as Ja, formatLocalScheduleDate as Jc, backgroundAppearanceColorTokenNames as Ji, ChevronDown as Jl, SITE_OVERLAY_HEADER_CLEARANCE_CSS_VAR as Jn, ImagePresets as Jo, formatInterval as Jr, SelectItem as Js, useOptionalEditorUiStoreInstance as Jt, previewSiteStyle as K, getCardOrientation as Ka, formatBookingInstant as Kc, getHeaderStyle as Ki, ChevronRight as Kl, siteHeaderManifest as Kn, MinusIcon as Ko, buildProductDetailDisplay as Kr, Select$1 as Ks, useEditorUiStore as Kt, paletteMutationCapability as L, normalizeLocationMapProps as La, useComposedRefs as Lc, GRADIENT_PRESETS as Li, Maximize2 as Ll, buildThemeRuntime as Ln, ChevronDownIcon as Lo, cartBlockDefinition as Lr, hasEmptyOption as Ls, useEditor$1 as Lt, isPreviewingChange as M, bindingSchema as Ma, createContextScope as Mc, designRuntimeRulesForTheme as Mi, Pencil as Ml, AMBIENT_BACKGROUND_ROLES as Mn, canonicalizePersistedBlockButtonRole as Mo, courseRegistrationBlockDefinition as Mr, textColorStyle as Ms, ReferenceWidgetProvider as Mt, markApplyFailed as N, previewStageSchema as Na, composeEventHandlers as Nc, getCuratedSiteStyle as Ni, PenLine as Nl, isSupportedLoaderEndpoint as Nn, isBlockButtonRole as No, buildCourseRegistrationInteractiveIslandProps as Nr, getFieldIntent as Ns, useRichTextImagePicker as Nt, createPalette as O, normalizeCsvString as Oa, useId$1 as Oc, retargetCompiledRuntimeFieldsForContentAdjacency as Oi, SlidersHorizontal as Ol, listEntryPageContentSlots as On, coerceInlineTextWithFallback as Oo, getStepNumber as Or, normalizeCardVariantRole as Os, ButtonWidgetProvider as Ot, markApplySaved as P, eventCalendarListLayoutCompatibleDisplayModeValues as Pa, Primitive as Pc, surfaceResolutionContextFromTheme as Pi, Palette as Pl, ThemeScope as Pn, getIconComponent as Po, normalizeEventRegistrationPageSurfaceSubject as Pr, isHeaderField as Ps, RichTextField as Pt, toggleRow as Q, getEventAvailabilityStatus as Qa, toBookingTimeZone as Qc, defaultThemeTokens as Qi, mediaTransforms as Qn, getCurrentResolveImageUrlContext as Qo, deriveCommerceCheckoutState as Qr, CalloutDescription as Qs, pushHistoryEntry as Qt, palettePreviewProjection as R, toLocationMapHydrationProps as Ra, cn$2 as Rc, GRADIENT_PRESET_IDS as Ri, LoaderCircle as Rl, DEFAULT_THEME_RESPONSIVE_MODE as Rn, CircleMinusIcon as Ro, buildCartInteractiveIslandProps as Rr, mapCurrentValueForSelect as Rs, LinkField as Rt, PreviewThemeOverlayProvider as S, eventCollectionDisplaySchemaShape as Sa, DropdownMenu as Sc, resolveSurfaceForegroundStyles as Si, TriangleAlert as Sl, MediaEditor as Sn, parseGeneratedIconAssetId as So, findEventByOccurrenceId as Sr, isThemeV2NormalEditorRawStyleFieldName as Ss, OfferingsPreviewWidgetProvider as St, applyTypographyDraftPatch as T, buildEventRuntimeFilters as Ta, DropdownMenuLabel as Tc, applyCompiledRuntimeFieldsToContent as Ti, Star as Tl, useApiMediaUploader as Tn, isObjectRecord$1 as To, resolveEventRequiresPayment as Tr, assertNever$8 as Ts, EntryPickerField as Tt, previewHeaderLayout as U, formatEventPriceDisplay as Ua, addLocalScheduleDays as Uc, sectionTransitionFamilyForBoundaryOptionId as Ui, CreditCard as Ul, getBlockDefinition as Un, FileAudioIcon as Uo, getShopDisplayForItems as Ur, Tooltip as Us, stripTopLevelRoutingUi as Ut, previewCuratedPalette as V, formatEventDateParts as Va, unsafeAsEditorBlockId as Vc, defaultSectionTransitionVariantForFamily as Vi, Eye as Vl, mergeContentWithBlockStyleOverrides as Vn, DownloadIcon as Vo, buildProductListInteractiveIslandProps as Vr, FieldFrame as Vs, hideThemeV2RawStyleFields as Vt, previewHeaderStyle as W, formatEventTeacherLine as Wa, formatBookingDate as Wc, sectionTransitionVariantForBoundaryOptionId as Wi, CirclePlus as Wl, projectRecurringSchedule as Wn, FileSpreadsheetIcon as Wo, buildCartDisplay as Wr, TooltipContent as Ws, getBlockManifestFromSdkConfig as Wt, styleConfiguratorHistoryEntryForPersistedSelection as X, resolveEventLinkProps as Xa, parseBookingLocalDate as Xc, foregroundTokenForBackgroundAppearanceColorToken as Xi, ArrowDown as Xl, visibleHeaderClearancePx as Xn, buildResolveImageUrlContext as Xo, buildPassCartItem as Xr, SelectValue as Xs, canUndoHistory as Xt, setPaletteColors as Y, resolveEventCta as Ya, getBookingLocalDateKey as Yc, backgroundAppearanceQuickColorTokenNames as Yi, Check as Yl, planSiteOverlayHeaderClearance as Yn, MediaPlaceholder as Yo, EMPTY_COMMERCE_CART_STATE as Yr, SelectTrigger as Ys, canRedoHistory as Yt, syncStyleConfiguratorState as Z, getEventAvailability as Za, resolveBookingTimeZoneId as Zc, parseBackgroundAppearanceColorToken as Zi, __exportAll as Zl, contentTransforms as Zn, computeMediaTransformStyle as Zo, buildProductCartItem as Zr, Callout as Zs, createHistoryState as Zt, planSiteChromeLookSelection as _, isSemanticSpacing as _a, Content$1 as _c, bodyCopyFragment as _i, err as _l, createManifestFormAdapter as _n, resolveFeatureCardGeneratedIconSizePx as _o, formBlockDefinition as _r, parseThemeForPersistence as _s, createSiteOptionApiLoader as _t, previewDesignHistoryDomainForCommand as a, createTransformRegistry as aa, TabsContent as ac, faqAccordionFragment as ai, publicEventScalarPrice as al, createRoutingHelpers as an, defineInteractiveIslandMetaKeys as ao, NAV_DROPDOWN_SHIFT_PROPERTY as ar, SECTION_BACKGROUND_MIN_SOURCE_WIDTH as as, createOptimisticActionRunner as at, PreviewDesignCoordinatorProvider as b, buildEventCollectionHydration as ba, createCollapsibleScope as bc, getAnchorClasses as bi, Upload as bl, evaluateVisibility as bn, parseBlockIconValue as bo, buildEventRegistrationInteractiveIslandProps as br, resolveOnColorForThemeToken as bs, SiteOptionWidgetProvider as bt, selectionSnapshotFromApplySiteStyleSelectionResponse as c, OFFERINGS_PREVIEW_DEFAULT_BUTTON_TEXT as ca, Dialog as cc, singleButtonFragment as ci, assertNever$9 as cl, isAdapterReferenceKind as cn, defineProgressiveBlockRuntime as co, productDetailBlockDefinition as cr, siblingPath$1 as cs, PreviewRichTextEditor as ct, PREVIEW_DESIGN_REFRESH_ERROR_MESSAGE as d, OFFERINGS_PREVIEW_EVENT_PRESET_DEFINITIONS as da, DialogFooter as dc, testimonialsCarouselFragment as di, parseSiteId as dl, resolvePageRouteSlug as dn, markEditableSurfaceForwarding as do, eventListingBlockDefinition as dr, resolveButtonStyleSelection as ds, ContentFieldsForm as dt, findCuratedPalette as ea, Popover as ec, productItemKey as ei, parseEventPageSurfaceSubject as el, undoHistory as en, getLocalMinuteOfDay as eo, uiTransforms as er, renderVideo as es, confirmAutosaveBatch as et, PREVIEW_DESIGN_SAVE_ERROR_MESSAGE as f, buildOfferingsPreviewRenderStates as fa, DialogHeader as fc, testimonialsHeadingFragment as fi, unsafeAsAppointmentResourceId as fl, resolveContentTitle as fn, splitPositioningClasses as fo, buildEventListingInteractiveIslandProps as fr, updateButtonStyleSelectionChoice as fs, useUISelector as ft, cycleableSiteChromeOptions as g, resolveOfferingsPreviewGroups as ga, CollapsibleTrigger as gc, heroCopyFragment as gi, unsafeAsPassId as gl, ManifestForm as gn, FEATURE_CARD_ICON_TREATMENTS as go, buildEventCalendarListingRender as gr, themeButtonClassName as gs, useEntryEditorController as gt, cycleSiteChromeLookId as h, resolveOfferingsPreviewGroupCta as ha, CollapsibleContent as hc, ctaRowFragment as hi, unsafeAsFormId as hl, validateBlockManifestIssues as hn, mediaSchema as ho, buildEventCalendarListingDisplay as hr, parseThemeButtonVariantId as hs, useEntryController as ht, usePreviewDesignHistoryOrder as i, paletteColorsSchema as ia, Tabs as ic, cardFragment as ii, publicEventPricingType as il, useDebouncedLatestSave as in, createInteractiveIslandCodec as io, useImageResolveContextOptional as ir, setContextResolveImageUrlContext as is, rejectAutosaveBatch as it, dismissWarnings as j, when as ja, useControllableState as jc, curatedSiteStyles as ji, Plus as jl, deriveLaunchReadiness as jn, parseInlineTextFromUnknown as jo, buildGiftingInteractiveIslandProps as jr, rgbColorValue as js, ReferenceField as jt, createStyleConfiguratorState as k, normalizeOptionalId as ka, useDirection as kc, planPageDesignLayoutLookCompatibility as ki, RotateCcw as kl, decodePublicProductCategorySelectorQuery as kn, inlineTextToPlainText as ko, getWizardStepsForContext as kr, backgroundColorStyle as ks, FileField as kt, resolveStyleConfiguratorInitialSnapshot as l, OFFERINGS_PREVIEW_DEFAULT_EMPTY_MESSAGE as la, DialogContent as lc, formEmbedFragment as li, expectParsedBrandedId as ll, parseReferenceKind as ln, EDITABLE_SURFACE_FORWARDING_PROP as lo, newsletterSignupBlockDefinition as lr, buttonStyleSelectionParameterValue as ls, PreviewInlineTextEditor as lt, buildSiteChromeLookModels as m, resolveOfferingsPreviewCoursePath as ma, Collapsible as mc, heroCtaRowFragment as mi, unsafeAsCustomerPassId as ml, usePalette as mn, PUBLIC_DOWNLOAD_MEDIA_TYPES as mo, buildEventCalendarInteractiveIslandProps as mr, AFFORDANCE_SUPPRESS_CLASS as ms, EntryControllerProvider as mt, useSiteChromeCustomizeOptional as n, paletteColorEntries as na, PopoverTrigger as nc, richTextFragment as ni, publicEventPricingCurrency as nl, recordsEqual as nn, blockBookingPaymentTermsSchema as no, createManifestValidator as nr, resolveMediaNodeResponsiveImage as ns, enqueueTransaction as nt, selectPreviewDesignHistoryDomain as o, runTransforms as oa, TabsList as oc, faqHeadingFragment as oi, publicEventTicketTypes as ol, createSnapshotFromPageRecord as on, createZodCodec as oo, shopBlockDefinition as or, attachRenderableMediaAssetFields as os, resolvePreviewSidebarTab as ot, reportPreviewDesignError as p, normalizeOfferingsPreviewItemLimit as pa, DialogTitle as pc, ctaCopyFragment as pi, unsafeAsAppointmentServiceId as pl, PaletteProvider as pn, planSiteChromePlacement as po, eventCalendarBlockDefinition as pr, buttonStyleSelectionKey as ps, EditableBlockProvider as pt, reconcilePaletteLibraryActive as q, getContainerClass as qa, formatBookingTime as qc, BACKGROUND_BODY_TEXT_MIN_CONTRAST_RATIO as qi, ChevronLeft as ql, SITE_CHROME_VISIBLE_HEADER_SELECTOR as qn, PlusIcon as qo, formatCommercePrice as qr, SelectContent as qs, useEditorUiStoreInstance as qt, PreviewDesignHistoryOrderProvider as r, paletteColorsEqual as ra, Input as rc, headingFragment as ri, publicEventPricingMode as rl, useMultiAutosave as rn, buildInteractiveIslandProps as ro, ImageResolveContextProvider as rr, resolveMediaStorageUrl as rs, idleEditorTransactionQueueState as rt, buildApplySiteStyleSelectionBody as s, ctaButton as sa, TabsTrigger as sc, blogFeaturedPostFragment as si, formatCurrencyAmount as sl, BUILT_IN_REFERENCE_KINDS as sn, defineClientOwnedBlockRuntime as so, productListBlockDefinition as sr, getAtPath as ss, FooterComposerPanel as st, SiteChromeCustomizeProvider as t, buildPaletteLibraryReadModel as ta, PopoverContent as tc, reduceCommerceCart as ti, formatBookingPriceDisplay as tl, unsafeAsLinkedContentEntryId as tn, resolveRuntimeEventPricing as to, formattingTransforms as tr, resolveImageUrlWithContext as ts, deriveTransactionCapabilities as tt, PREVIEW_DESIGN_LOAD_ERROR_MESSAGE as u, OFFERINGS_PREVIEW_DEFAULT_FAILED_MESSAGE as ua, DialogDescription as uc, formCopyFragment as ui, parseMediaAssetId as ul, deriveRouteMetadataPresentation as un, composeHeaderSectionWrapperClassName as uo, buildNewsletterFormInteractiveIslandProps as ur, findButtonStyleRecipe as us, PreviewTextEditor as ut, deriveSiteStylePreviewUpdate as v, resolveSpacing as va, Root$3 as vc, defineFragment as vi, ok$1 as vl, createManifestValidation as vn, shouldReserveFeatureCardIconZone as vo, buildFormInteractiveIslandProps as vr, getTextColorForBackground as vs, createSiteOptionWidgetAdapters as vt, applyResolvedSelections as w, eventCollectionSourceSchemaShape as wa, DropdownMenuItem as wc, formatSiteChromeBackgroundTokenLabel as wi, Tablet as wl, useMediaEditorOptional as wn, RichTextDocSchema as wo, resolveDiscountContext as wr, asDesignBlockId as ws, IconPickerField as wt, usePreviewDesignCoordinator as x, buildEventCollectionListingDisplay as xa, Surface as xc, boxStylesTransforms as xi, Undo2 as xl, createStoreBackend as xn, resolveBlockIconRenderValue as xo, toRegistrationEvents as xr, resolveTokenOrCssColorValue as xs, OfferingsPreviewGroupOrderField as xt, planSiteStylePreviewChange as y, buildEventCollectionDisplay as ya, Trigger$3 as yc, BACKGROUND_POSITION_PRESET_VALUES as yi, X as yl, FormRenderer as yn, buildGeneratedBlockIconRenderAssetLookupFromUnknown as yo, eventRegistrationBlockDefinition as yr, isCssColorLiteral as ys, SiteOptionPickerField as yt, prepareStalePaletteRetry as z, formatDate as za, clsx as zc, getGradientPreset as zi, Image as zl, getResponsiveScopeSpec as zn, CirclePlusIcon as zo, buildCheckoutInteractiveIslandProps as zr, mapOptionValueForSelect as zs, LinkWidgetProvider as zt };