@riverbankcms/sdk 0.123.0 → 0.125.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 (263) hide show
  1. package/README.md +14 -9
  2. package/dist/{PreviewEditorSidebar-DvJFmC29.mjs → PreviewEditorSidebar-BezDOtQ7.mjs} +22 -39
  3. package/dist/{PreviewEditorUI-DVHP4bCo.mjs → PreviewEditorUI-CgSqmfo2.mjs} +3 -3
  4. package/dist/{PreviewQueryProvider-07EE4uWL.mjs → PreviewQueryProvider-BH-3-jSj.mjs} +1 -1
  5. package/dist/{SdkPreviewModeRuntime-BE5eFayo.mjs → SdkPreviewModeRuntime-Co3AHfj0.mjs} +1031 -1237
  6. package/dist/{SiteChromeCustomizeContext-4hn4A0HX.mjs → SiteChromeCustomizeContext-BHF-KANn.mjs} +1949 -2004
  7. package/dist/_dts/ai/src/contracts/proposals.d.ts +1236 -4152
  8. package/dist/_dts/api/src/accessAdmin.d.ts +2 -14
  9. package/dist/_dts/api/src/appointmentEndpointDefinitions.d.ts +435 -0
  10. package/dist/_dts/api/src/bookingClosures.d.ts +3 -3
  11. package/dist/_dts/api/src/bookingConfig.d.ts +72 -73
  12. package/dist/_dts/api/src/bookingManagementEndpoints.d.ts +26 -35
  13. package/dist/_dts/api/src/bookingRecords.d.ts +4 -15
  14. package/dist/_dts/api/src/bookingVerticalCatalog.d.ts +746 -0
  15. package/dist/_dts/api/src/bookingVerticalPreset.d.ts +38 -0
  16. package/dist/_dts/api/src/bookingVerticals.d.ts +11 -652
  17. package/dist/_dts/api/src/bookings.d.ts +11 -9
  18. package/dist/_dts/api/src/cache-tags.d.ts +2 -2
  19. package/dist/_dts/api/src/commercePortalEndpoints.d.ts +10 -10
  20. package/dist/_dts/api/src/common/envelope.d.ts +2 -0
  21. package/dist/_dts/api/src/contentRuntime.d.ts +0 -17
  22. package/dist/_dts/api/src/courseEndpointDefinitions.d.ts +99 -0
  23. package/dist/_dts/api/src/courses.d.ts +22 -33
  24. package/dist/_dts/api/src/defineEndpointDefinitions.d.ts +14 -0
  25. package/dist/_dts/api/src/demoMutationPolicies.d.ts +4 -0
  26. package/dist/_dts/api/src/endpoints.d.ts +3740 -3733
  27. package/dist/_dts/api/src/event-destination-policy.d.ts +1 -1
  28. package/dist/_dts/api/src/event-presentation.d.ts +4 -9
  29. package/dist/_dts/api/src/index.d.ts +9 -11
  30. package/dist/_dts/api/src/newsletterEndpointDefinitions.d.ts +376 -0
  31. package/dist/_dts/api/src/participantMessaging.d.ts +2 -2
  32. package/dist/_dts/api/src/public/endpoints.d.ts +1 -1
  33. package/dist/_dts/api/src/publicExperience/commerceEndpoints.d.ts +272 -0
  34. package/dist/_dts/api/src/publicExperience/eventEndpoints.d.ts +274 -0
  35. package/dist/_dts/api/src/publicExperience/newsletterEndpoints.d.ts +31 -0
  36. package/dist/_dts/api/src/publicExperience/sharedTypes.d.ts +152 -0
  37. package/dist/_dts/api/src/publicExperience/siteEndpoints.d.ts +95 -0
  38. package/dist/_dts/api/src/publicExperience/wholeSeriesEndpoints.d.ts +154 -0
  39. package/dist/_dts/api/src/publicExperienceEndpoints.d.ts +10 -962
  40. package/dist/_dts/api/src/publicWholeSeriesEndpointDefinitions.d.ts +52 -0
  41. package/dist/_dts/api/src/sdkContracts.d.ts +0 -51
  42. package/dist/_dts/api/src/sdkEntryReadEndpoints.d.ts +23 -0
  43. package/dist/_dts/api/src/siteAccessAdmin.d.ts +23 -0
  44. package/dist/_dts/api/src/sitePlatformEndpoints.d.ts +1 -38
  45. package/dist/_dts/api/src/siteRuntimeEndpoints.d.ts +3 -4
  46. package/dist/_dts/billing/src/plans/types.d.ts +24 -5
  47. package/dist/_dts/blocks/src/PageRenderer.d.ts +4 -15
  48. package/dist/_dts/blocks/src/contracts/index.d.ts +1 -1
  49. package/dist/_dts/blocks/src/contracts/non-block-islands.d.ts +4 -16
  50. package/dist/_dts/blocks/src/contracts/proof-block-islands.d.ts +8 -222
  51. package/dist/_dts/blocks/src/portal/types.d.ts +3 -3
  52. package/dist/_dts/blocks/src/subroutes/fold.d.ts +1 -14
  53. package/dist/_dts/blocks/src/subroutes/index.d.ts +1 -1
  54. package/dist/_dts/blocks/src/subroutes/kinds.d.ts +3 -3
  55. package/dist/_dts/blocks/src/system/blocks/course-details.d.ts +0 -11
  56. package/dist/_dts/blocks/src/system/blocks/course-registration.d.ts +3 -4
  57. package/dist/_dts/blocks/src/system/blocks/courses/shared/pricing.d.ts +1 -1
  58. package/dist/_dts/blocks/src/system/blocks/courses/shared/schemas.d.ts +401 -12
  59. package/dist/_dts/blocks/src/system/blocks/courses/shared/types.d.ts +9 -10
  60. package/dist/_dts/blocks/src/system/blocks/events/event-calendar.d.ts +14 -13
  61. package/dist/_dts/blocks/src/system/blocks/events/event-listing.d.ts +1 -2
  62. package/dist/_dts/blocks/src/system/blocks/events/shared/filtering.d.ts +1 -4
  63. package/dist/_dts/blocks/src/system/blocks/events/shared/schemas.d.ts +19 -18
  64. package/dist/_dts/blocks/src/system/blocks/events/shared/types.d.ts +9 -11
  65. package/dist/_dts/blocks/src/system/blocks/offerings-preview/model.d.ts +2 -2
  66. package/dist/_dts/blocks/src/system/data/loaderEndpoints.d.ts +1 -1
  67. package/dist/_dts/blocks/src/system/runtime/api/client.d.ts +10 -10
  68. package/dist/_dts/blocks/src/system/runtime/api/endpoints.d.ts +10 -10
  69. package/dist/_dts/blocks/src/system/runtime/api/index.d.ts +1 -1
  70. package/dist/_dts/blocks/src/system/runtime/api/types/appointments.d.ts +162 -0
  71. package/dist/_dts/blocks/src/system/runtime/api/types/core.d.ts +59 -0
  72. package/dist/_dts/blocks/src/system/runtime/api/types/courses.d.ts +134 -0
  73. package/dist/_dts/blocks/src/system/runtime/api/types/discounts.d.ts +85 -0
  74. package/dist/_dts/blocks/src/system/runtime/api/types/events.d.ts +241 -0
  75. package/dist/_dts/blocks/src/system/runtime/api/types/forms.d.ts +53 -0
  76. package/dist/_dts/blocks/src/system/runtime/api/types/newsletter.d.ts +32 -0
  77. package/dist/_dts/blocks/src/system/runtime/api/types/portal.d.ts +220 -0
  78. package/dist/_dts/blocks/src/system/runtime/api/types/shop.d.ts +176 -0
  79. package/dist/_dts/blocks/src/system/runtime/api/types.d.ts +12 -1121
  80. package/dist/_dts/blocks/src/system/runtime/components/registry.client.d.ts +20 -583
  81. package/dist/_dts/blocks/src/system/runtime/components/runtime-backed-blocks.d.ts +9 -276
  82. package/dist/_dts/blocks/src/system/runtime/hooks/useEventFilters.d.ts +1 -12
  83. package/dist/_dts/blocks/src/system/runtime/hooks/useHeadlessEventRegistrationFlow.d.ts +0 -1
  84. package/dist/_dts/blocks/src/system/runtime/hooks/useHeadlessWholeSeriesRegistrationFlow.d.ts +0 -1
  85. package/dist/_dts/blocks/src/system/runtime/nodes/booking-runtime-sources.d.ts +2 -3
  86. package/dist/_dts/blocks/src/system/runtime/nodes/course-details/logic.d.ts +1 -18
  87. package/dist/_dts/blocks/src/system/runtime/nodes/course-details/runs.d.ts +0 -2
  88. package/dist/_dts/blocks/src/system/runtime/nodes/course-details.server.d.ts +1 -5
  89. package/dist/_dts/blocks/src/system/runtime/nodes/course-registration/courseRegistrationViewState.d.ts +21 -0
  90. package/dist/_dts/blocks/src/system/runtime/nodes/course-registration/index.d.ts +1 -1
  91. package/dist/_dts/blocks/src/system/runtime/nodes/course-registration/pricing.d.ts +14 -0
  92. package/dist/_dts/blocks/src/system/runtime/nodes/course-registration/types.d.ts +0 -25
  93. package/dist/_dts/blocks/src/system/runtime/nodes/course-registration/useCourseEligibility.d.ts +24 -0
  94. package/dist/_dts/blocks/src/system/runtime/nodes/course-registration/useCoursePaymentVerification.d.ts +9 -0
  95. package/dist/_dts/blocks/src/system/runtime/nodes/course-registration/useCourseRegistrationActions.d.ts +35 -0
  96. package/dist/_dts/blocks/src/system/runtime/nodes/course-registration/useCourseRegistrationPortal.d.ts +7 -0
  97. package/dist/_dts/blocks/src/system/runtime/nodes/course-registration/useCourseRegistrationSelection.d.ts +31 -0
  98. package/dist/_dts/blocks/src/system/runtime/nodes/course-registration/useCourseRegistrationWizard.d.ts +80 -55
  99. package/dist/_dts/blocks/src/system/runtime/nodes/course-registration/useCourseWaitlistSelection.d.ts +14 -0
  100. package/dist/_dts/blocks/src/system/runtime/nodes/course-registration/whole-series-registration.headless.contract.d.ts +4 -5
  101. package/dist/_dts/blocks/src/system/runtime/nodes/course-registration.interactive.d.ts +0 -38
  102. package/dist/_dts/blocks/src/system/runtime/nodes/course-registration.server.d.ts +1 -1
  103. package/dist/_dts/blocks/src/system/runtime/nodes/event-details/logic.d.ts +2 -0
  104. package/dist/_dts/blocks/src/system/runtime/nodes/event-details.client.d.ts +4 -3
  105. package/dist/_dts/blocks/src/system/runtime/nodes/event-details.server.d.ts +2 -2
  106. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/EventRegistrationWizardActions.d.ts +12 -0
  107. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/event-registration.headless.contract.d.ts +0 -4
  108. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/eventScope.d.ts +0 -9
  109. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/types.d.ts +0 -5
  110. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/useEventRegistrationWizard.d.ts +0 -11
  111. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/utils.d.ts +13 -0
  112. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration.interactive.d.ts +0 -21
  113. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration.server.d.ts +1 -1
  114. package/dist/_dts/blocks/src/system/runtime/nodes/events/EventCalendar.interactive.d.ts +24 -433
  115. package/dist/_dts/blocks/src/system/runtime/nodes/events/EventCombined.client.d.ts +1 -2
  116. package/dist/_dts/blocks/src/system/runtime/nodes/events/EventCombined.interactive.d.ts +52 -266
  117. package/dist/_dts/blocks/src/system/runtime/nodes/events/EventListing.interactive.d.ts +5 -15
  118. package/dist/_dts/blocks/src/system/runtime/nodes/events/shared/EventFilters.d.ts +0 -8
  119. package/dist/_dts/blocks/src/system/runtime/nodes/events/shared/eventCollectionContract.d.ts +1573 -0
  120. package/dist/_dts/blocks/src/system/runtime/nodes/events/shared/listOptions.d.ts +1 -3
  121. package/dist/_dts/content-editor/src/ui/editorSnapshot.d.ts +2 -3
  122. package/dist/_dts/content-editor/src/ui/editorUiStore.d.ts +2 -2
  123. package/dist/_dts/content-model/src/content-types/builtin-schemas.d.ts +0 -5
  124. package/dist/_dts/content-model/src/content-types/builtins.d.ts +0 -5
  125. package/dist/_dts/content-model/src/templates/defaults.d.ts +6 -3
  126. package/dist/_dts/core/src/editor-state.d.ts +1 -13
  127. package/dist/_dts/db/src/generated/supabase/database.types.d.ts +1646 -37
  128. package/dist/_dts/preview-next/src/client/preview/siteChromeBrandPreferences.d.ts +6 -6
  129. package/dist/_dts/preview-next/src/client/preview/siteChromeSavePlan.d.ts +6 -1
  130. package/dist/_dts/preview-next/src/client/preview/siteStylePreviewPlanner.d.ts +27 -4
  131. package/dist/_dts/sdk/src/cli/commands/audit.d.ts +1 -2
  132. package/dist/_dts/sdk/src/cli/commands/pull-dated-offering-scope.d.ts +1 -1
  133. package/dist/_dts/sdk/src/cli/commands/pull-dry-run.d.ts +4 -6
  134. package/dist/_dts/sdk/src/cli/commands/push/consts.d.ts +1 -1
  135. package/dist/_dts/sdk/src/cli/commands/push/options.d.ts +1 -1
  136. package/dist/_dts/sdk/src/cli/commands/push/pushAllExtras.d.ts +0 -1
  137. package/dist/_dts/sdk/src/cli/commands/push/verification.d.ts +1 -1
  138. package/dist/_dts/sdk/src/cli/content/collectionWriters.d.ts +23 -0
  139. package/dist/_dts/sdk/src/cli/content/metadataAfterPush.d.ts +25 -0
  140. package/dist/_dts/sdk/src/cli/content/reader.d.ts +0 -52
  141. package/dist/_dts/sdk/src/cli/content/writer.d.ts +3 -81
  142. package/dist/_dts/sdk/src/cli/site-commands/datedOfferingCommands.d.ts +6 -9
  143. package/dist/_dts/sdk/src/client/contentReadOperations.d.ts +40 -0
  144. package/dist/_dts/sdk/src/client/management/index.d.ts +1 -3
  145. package/dist/_dts/sdk/src/client/management/types.d.ts +3 -91
  146. package/dist/_dts/sdk/src/client/runtimeCacheKeys.d.ts +72 -0
  147. package/dist/_dts/sdk/src/client/runtimeCachePolicy.d.ts +10 -75
  148. package/dist/_dts/sdk/src/client/types.d.ts +7 -33
  149. package/dist/_dts/sdk/src/components.d.ts +1 -1
  150. package/dist/_dts/sdk/src/config/types.d.ts +1 -1
  151. package/dist/_dts/sdk/src/config/validation.d.ts +3 -6
  152. package/dist/_dts/sdk/src/contracts/index.d.ts +1 -1
  153. package/dist/_dts/sdk/src/contracts/page.d.ts +0 -8
  154. package/dist/_dts/sdk/src/contracts/system-block-content.d.ts +1 -34
  155. package/dist/_dts/sdk/src/data/prefetchBlockData.d.ts +4 -3
  156. package/dist/_dts/sdk/src/next/catch-all-utils.d.ts +0 -11
  157. package/dist/_dts/sdk/src/next/catch-all.d.ts +1 -76
  158. package/dist/_dts/sdk/src/next/types.d.ts +0 -19
  159. package/dist/_dts/sdk/src/public-api/contracts.d.ts +7 -207
  160. package/dist/_dts/sdk/src/public-api/runtime.d.ts +1 -1
  161. package/dist/_dts/sdk/src/rendering/blocks-page-renderer.d.ts +2 -1
  162. package/dist/_dts/sdk/src/rendering/components/pageShared.d.ts +2 -2
  163. package/dist/_dts/sdk/src/rendering/helpers/loadContent.d.ts +0 -7
  164. package/dist/_dts/sdk/src/rendering/helpers/templateContent.d.ts +81 -0
  165. package/dist/_dts/sdk/src/rendering/index.d.ts +1 -1
  166. package/dist/_dts/sdk/src/rendering/islands/types.d.ts +1 -51
  167. package/dist/_dts/sdk/src/rendering/overrides.d.ts +2 -1
  168. package/dist/_dts/sdk/src/routing/entrySubroutes.d.ts +6 -6
  169. package/dist/_dts/sdk/src/routing/index.d.ts +0 -2
  170. package/dist/_dts/sdk/src/routing/resolveOccurrence.d.ts +3 -3
  171. package/dist/_dts/sdk/src/routing/resolvePageContent.d.ts +10 -39
  172. package/dist/_dts/sdk/src/types/block-kinds.d.ts +1 -1
  173. package/dist/_dts/sdk/src/version.d.ts +1 -1
  174. package/dist/_dts/site-commands/src/adapter.d.ts +1 -1
  175. package/dist/_dts/site-commands/src/appointmentCommandSchemas.d.ts +100 -0
  176. package/dist/_dts/site-commands/src/capabilityGaps.d.ts +2 -2
  177. package/dist/_dts/site-commands/src/commandContract.d.ts +1242 -0
  178. package/dist/_dts/site-commands/src/commandDomain.d.ts +20 -0
  179. package/dist/_dts/site-commands/src/commandIdentifiers.d.ts +7 -0
  180. package/dist/_dts/site-commands/src/commandValidation.d.ts +10 -0
  181. package/dist/_dts/site-commands/src/commands.d.ts +729 -2659
  182. package/dist/_dts/site-commands/src/domain.d.ts +1 -1
  183. package/dist/_dts/site-commands/src/eventCommandContent.d.ts +11 -0
  184. package/dist/_dts/site-commands/src/exposure.d.ts +1 -1
  185. package/dist/_dts/site-commands/src/index.d.ts +6 -0
  186. package/dist/_dts/site-commands/src/metadata.d.ts +1 -27
  187. package/dist/_dts/site-commands/src/planner.d.ts +1 -1
  188. package/dist/_dts/site-commands/src/refContributions.d.ts +1 -1
  189. package/dist/_dts/site-commands/src/refs.d.ts +1 -4
  190. package/dist/_dts/site-commands/src/siteStyleCommandSchema.d.ts +378 -0
  191. package/dist/_dts/site-commands/src/siteStyleSelectionSchemaBuilder.d.ts +46 -0
  192. package/dist/_dts/site-commands/src/staticExecutionGaps.d.ts +2 -2
  193. package/dist/_dts/site-commands/src/venueCommandMapping.d.ts +21 -0
  194. package/dist/_dts/theme-core/src/site-styles/compilationPlan.d.ts +58 -0
  195. package/dist/_dts/theme-core/src/site-styles/headerLooks.d.ts +1 -0
  196. package/dist/_dts/theme-core/src/site-styles/index.d.ts +1 -0
  197. package/dist/_dts/theme-core/src/site-styles/previewCompiler.d.ts +47 -24
  198. package/dist/cli/index.mjs +7267 -8479
  199. package/dist/cli/init-docs/content/cli-reference.md +5 -21
  200. package/dist/cli/init-docs/content/content-management.md +4 -5
  201. package/dist/client/{DiscountCodeDisclosure-DIWj-P9v.mjs → DiscountCodeDisclosure-CyPpekBp.mjs} +2 -2
  202. package/dist/client/{EventCombined.client-De8YWBSr.mjs → EventCombined.client-zywit-60.mjs} +5 -16
  203. package/dist/client/{EventListing.client-seHTjimY.mjs → EventListing.client-J2nLhkKT.mjs} +3 -10
  204. package/dist/client/{LeafletStaticMap-BmQxFcJW.mjs → LeafletStaticMap-CSubXWt6.mjs} +1 -1
  205. package/dist/client/{MagicLinkForm-OoJAIUIj.mjs → MagicLinkForm-DDLIfiq9.mjs} +2 -2
  206. package/dist/client/{StepIndicator-CiZ8kdPk.mjs → StepIndicator-DE8EvHIp.mjs} +2 -2
  207. package/dist/client/{accordion-6lnN__XJ.mjs → accordion-Ct5T5NiA.mjs} +1 -1
  208. package/dist/client/{bookingForm-5uyqhONU.mjs → bookingForm-DMxtLPxw.mjs} +6 -6
  209. package/dist/client/bookings.mjs +753 -818
  210. package/dist/client/{carousel-Dtnifil_.mjs → carousel--FMqgvob.mjs} +1 -1
  211. package/dist/client/{cart-5Tc5S7NV.mjs → cart-BKX1bWiU.mjs} +3 -3
  212. package/dist/client/{checkout-CYKKN5Hr.mjs → checkout-B_jxi4WW.mjs} +3 -3
  213. package/dist/client/client.mjs +6876 -7150
  214. package/dist/client/{context-BGZNlGXB.mjs → context-CJz1Vlsz.mjs} +40 -43
  215. package/dist/client/{courseRegistration-CxCBybB4.mjs → courseRegistration-DH4MlkRD.mjs} +606 -621
  216. package/dist/client/{eventCalendar-Xj2jZS9X.mjs → eventCalendar-BQILwAcL.mjs} +5 -13
  217. package/dist/client/{eventCombined-CgcMoOgM.mjs → eventCombined-DFFW_Vmo.mjs} +3 -3
  218. package/dist/client/{eventDetails-CEAH8Edc.mjs → eventDetails-B045CTSJ.mjs} +147 -118
  219. package/dist/client/{eventListing-qyPVQ0wP.mjs → eventListing-BDMYNVzS.mjs} +3 -3
  220. package/dist/client/{eventRegistration-DDu79CtL.mjs → eventRegistration-CQ2-BSnB.mjs} +165 -68
  221. package/dist/client/{form-Bc7JKI7I.mjs → form-DJKuyZgN.mjs} +2 -2
  222. package/dist/client/{headerSection-vTku_LEl.mjs → headerSection-DeTjfiDo.mjs} +2 -2
  223. package/dist/client/hooks.mjs +3454 -2363
  224. package/dist/client/{locationMap-Bg7X4Jna.mjs → locationMap-i2wDA8gB.mjs} +2 -2
  225. package/dist/client/{newsletterForm-lpylVdp5.mjs → newsletterForm-DKiueauk.mjs} +2 -2
  226. package/dist/client/{pricing-DE8fjJiT.mjs → pricing-C01J3Epx.mjs} +3 -19
  227. package/dist/client/{productDetail-D7Bo2RMH.mjs → productDetail-Dfc1sZaX.mjs} +3 -3
  228. package/dist/client/{productList-VjnZqiqN.mjs → productList-BXbvXWTF.mjs} +3 -3
  229. package/dist/client/{propsDecoder-DreFXjNP.mjs → propsDecoder-CIR5DQ1l.mjs} +213 -376
  230. package/dist/client/rendering/client.mjs +3036 -3292
  231. package/dist/client/rendering/islands.mjs +18 -18
  232. package/dist/client/rendering.mjs +5489 -4585
  233. package/dist/client/{shop-IRsHHbf7.mjs → shop-BbNwPKM-.mjs} +6 -6
  234. package/dist/client/{shop-commerce-gnI8PieZ.mjs → shop-commerce-XO-XMFEt.mjs} +5 -5
  235. package/dist/client/{shop-commerce-store-BTbrhObn.mjs → shop-commerce-store-Byh6OUGK.mjs} +1 -1
  236. package/dist/client/{shopShared-D6KS2_qk.mjs → shopShared-Bbq39mwr.mjs} +3 -3
  237. package/dist/client/{useDiscountCodeUi-DCccGCxV.mjs → useDiscountCodeUi-Bcyh4508.mjs} +2 -2
  238. package/dist/client/{useEventFilters-eGs3rPZQ.mjs → useEventFilters-C8OOJ3el.mjs} +59 -124
  239. package/dist/client/{usePolling-CvSU2sur.mjs → usePolling-CyJVo9kF.mjs} +2 -2
  240. package/dist/preview-next/before-render.mjs +1115 -1044
  241. package/dist/preview-next/client/runtime.mjs +4 -4
  242. package/dist/preview-next/middleware.mjs +1118 -1047
  243. package/dist/{previewAuthStore-ShY26RNz.mjs → previewAuthStore-CJX21dGi.mjs} +1121 -1047
  244. package/dist/{sdk-runtime-CJxkFq2B.mjs → sdk-runtime-BGhyuE-E.mjs} +2 -2
  245. package/dist/{separator-CoFmo8uA.mjs → separator-BFs-Kmv5.mjs} +1 -1
  246. package/dist/server/components.mjs +5909 -5011
  247. package/dist/server/config-validation.mjs +3456 -2354
  248. package/dist/server/config.mjs +3456 -2354
  249. package/dist/server/data.mjs +3454 -2365
  250. package/dist/server/index.mjs +1501 -1491
  251. package/dist/server/next.mjs +7534 -8067
  252. package/dist/server/page-converter.mjs +1900 -2038
  253. package/dist/server/prebuild.mjs +1 -1
  254. package/dist/server/rendering/server.mjs +5618 -4723
  255. package/dist/server/rendering.mjs +6238 -5393
  256. package/dist/server/routing.mjs +3616 -2507
  257. package/dist/server/server.mjs +3300 -3477
  258. package/package.json +1 -1
  259. package/dist/_dts/api/src/previewContentContract.d.ts +0 -4
  260. package/dist/_dts/sdk/src/cli/commands/course.d.ts +0 -6
  261. package/dist/_dts/sdk/src/cli/commands/push/scopes/courses.d.ts +0 -4
  262. package/dist/_dts/sdk/src/client/management/courses.d.ts +0 -10
  263. 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-ShY26RNz.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";
@@ -88369,6 +88369,83 @@ const blockBookingPaymentCollectionOptionSchema = z$1.union([
88369
88369
  })
88370
88370
  ]);
88371
88371
  const blockBookingPaymentTermsSchema = z$1.object({ allowedOptions: z$1.array(blockBookingPaymentCollectionOptionSchema).min(1) });
88372
+ const unsupportedEventRegistrationPageSurfaceSubjectSchema = z$1.object({
88373
+ kind: z$1.literal("unsupported"),
88374
+ reason: z$1.enum([
88375
+ "unsupportedSubject",
88376
+ "invalidEventSeriesId",
88377
+ "invalidEventOfferingId"
88378
+ ])
88379
+ });
88380
+ const eventRegistrationPageSurfaceSubjectSchema = z$1.unknown().transform((value, ctx) => {
88381
+ const unsupported = unsupportedEventRegistrationPageSurfaceSubjectSchema.safeParse(value);
88382
+ if (unsupported.success) return unsupported.data;
88383
+ const parsed = parseEventPageSurfaceSubject(value);
88384
+ if (parsed.ok) return parsed.value;
88385
+ ctx.addIssue({
88386
+ code: z$1.ZodIssueCode.custom,
88387
+ message: `Invalid event page-surface subject (${parsed.error.kind})`
88388
+ });
88389
+ return z$1.NEVER;
88390
+ });
88391
+ function parseEventRegistrationPageSurfaceSubject(value) {
88392
+ return parseEventPageSurfaceSubject(value);
88393
+ }
88394
+ function normalizeEventRegistrationPageSurfaceSubject(value) {
88395
+ const parsed = parseEventRegistrationPageSurfaceSubject(value);
88396
+ if (parsed.ok) return parsed.value;
88397
+ switch (parsed.error.kind) {
88398
+ case "notObject": return null;
88399
+ case "unsupportedSubject": return {
88400
+ kind: "unsupported",
88401
+ reason: "unsupportedSubject"
88402
+ };
88403
+ case "invalidEventSeriesId": return {
88404
+ kind: "unsupported",
88405
+ reason: "invalidEventSeriesId"
88406
+ };
88407
+ case "invalidEventOfferingId": return {
88408
+ kind: "unsupported",
88409
+ reason: "invalidEventOfferingId"
88410
+ };
88411
+ }
88412
+ }
88413
+ function resolveEventRegistrationScope(context) {
88414
+ const occurrenceSeriesId = context.occurrenceContext?.seriesId;
88415
+ if (occurrenceSeriesId) return {
88416
+ kind: "occurrenceSeries",
88417
+ seriesId: occurrenceSeriesId
88418
+ };
88419
+ if (context.subject?.kind === "eventSeries") return {
88420
+ kind: "pageSurfaceSeries",
88421
+ seriesId: context.subject.eventSeriesId
88422
+ };
88423
+ if (context.subject?.kind === "eventOffering") return {
88424
+ kind: "pageSurfaceOffering",
88425
+ offeringId: context.subject.eventOfferingId,
88426
+ seriesIds: context.subject.availableEventSeriesIds
88427
+ };
88428
+ if (context.subject?.kind === "unsupported") return {
88429
+ kind: "unsupportedPageSurfaceSubject",
88430
+ reason: context.subject.reason
88431
+ };
88432
+ return { kind: "unscoped" };
88433
+ }
88434
+ function applyEventRegistrationScope(events, scope) {
88435
+ switch (scope.kind) {
88436
+ case "occurrenceSeries":
88437
+ case "pageSurfaceSeries": return events.filter((event) => event.seriesId === scope.seriesId);
88438
+ case "pageSurfaceOffering": {
88439
+ const seriesIds = new Set(scope.seriesIds);
88440
+ return events.filter((event) => seriesIds.has(event.seriesId));
88441
+ }
88442
+ case "unsupportedPageSurfaceSubject": return [];
88443
+ case "unscoped": return [...events];
88444
+ }
88445
+ }
88446
+ function resolveEventRegistrationScopedEvents(events, context) {
88447
+ return applyEventRegistrationScope(events, resolveEventRegistrationScope(context));
88448
+ }
88372
88449
  //#endregion
88373
88450
  //#region ../blocks/src/system/blocks/courses/shared/schemas.ts
88374
88451
  /**
@@ -88432,16 +88509,15 @@ const coursePricingSchema = z$1.object({
88432
88509
  /**
88433
88510
  * Zod schema for public course data
88434
88511
  */
88435
- const publicCourseSchema = z$1.object({
88436
- id: z$1.string(),
88437
- seriesId: z$1.string(),
88512
+ const publicWholeSeriesOfferingSchema = z$1.object({
88513
+ eventSeriesId: z$1.string(),
88514
+ eventOfferingId: z$1.string(),
88438
88515
  title: z$1.string(),
88439
88516
  slug: z$1.string(),
88440
88517
  description: z$1.unknown().nullable(),
88441
88518
  teamMembers: z$1.array(courseTeamMemberSummarySchema).optional(),
88442
88519
  enrollmentOpen: z$1.boolean(),
88443
- pricing: coursePricingSchema.optional(),
88444
- priceCents: z$1.number().nullable(),
88520
+ pricing: coursePricingSchema,
88445
88521
  currency: z$1.string(),
88446
88522
  paymentTerms: blockBookingPaymentTermsSchema,
88447
88523
  enrollmentCapacity: z$1.number().nullable(),
@@ -88455,13 +88531,11 @@ const publicCourseSchema = z$1.object({
88455
88531
  enrolledCount: z$1.number(),
88456
88532
  availableSpots: z$1.number().nullable(),
88457
88533
  sessions: z$1.array(courseSessionSchema),
88458
- venue: courseVenueSchema.nullable(),
88459
- contentEntryId: z$1.string().nullable()
88534
+ venue: courseVenueSchema.nullable()
88460
88535
  });
88461
- /**
88462
- * Schema for an array of public courses
88463
- */
88464
- const publicCoursesArraySchema = z$1.array(publicCourseSchema);
88536
+ /** Deployed course blocks retain this schema alias for stored content. */
88537
+ const publicCourseSchema = publicWholeSeriesOfferingSchema;
88538
+ const publicCoursesArraySchema = z$1.array(publicWholeSeriesOfferingSchema);
88465
88539
  //#endregion
88466
88540
  //#region ../blocks/src/system/runtime/nodes/events/shared/destination.ts
88467
88541
  function isRecord$7(value) {
@@ -88972,7 +89046,7 @@ function resolveEventCta(event, buttonText) {
88972
89046
  const { isFull: isSoldOut } = getEventAvailability(event);
88973
89047
  const destination = resolveRuntimeEventDestination(event);
88974
89048
  const isExternal = destination.kind === "external";
88975
- const defaultButtonText = isExternal ? destination.label : event.kind === "course_session" ? "Book course" : "Book";
89049
+ const defaultButtonText = isExternal ? destination.label : event.bookingScope === "whole_series" ? "Book course" : "Book";
88976
89050
  const effectiveButtonText = buttonText ?? defaultButtonText;
88977
89051
  const href = resolveEventHref(event);
88978
89052
  if (!isExternal && isSoldOut) return {
@@ -88982,7 +89056,7 @@ function resolveEventCta(event, buttonText) {
88982
89056
  hidden: true
88983
89057
  };
88984
89058
  return {
88985
- label: !(event.kind === "course_session" ? event.course?.enrollmentOpen !== false : true) ? "Registration closed" : effectiveButtonText,
89059
+ label: !(event.bookingScope === "whole_series" ? event.wholeSeries?.enrollmentOpen !== false : true) ? "Registration closed" : effectiveButtonText,
88986
89060
  href,
88987
89061
  external: isExternal,
88988
89062
  hidden: false
@@ -89136,10 +89210,74 @@ function buildGoogleMapsDirectionsUrl(input) {
89136
89210
  return url.toString();
89137
89211
  }
89138
89212
  //#endregion
89213
+ //#region ../blocks/src/system/constants/events.ts
89214
+ const eventCalendarDisplayModeValues = [
89215
+ "combined",
89216
+ "calendar",
89217
+ "list",
89218
+ "timetable",
89219
+ "week-board"
89220
+ ];
89221
+ const eventCalendarDefaultViewValues = ["month", "week"];
89222
+ const eventCalendarListLayoutValues = [
89223
+ "stack",
89224
+ "grid",
89225
+ "compact"
89226
+ ];
89227
+ const eventCalendarListLayoutOptions = [
89228
+ {
89229
+ id: "stack",
89230
+ label: "Stack"
89231
+ },
89232
+ {
89233
+ id: "grid",
89234
+ label: "Grid"
89235
+ },
89236
+ {
89237
+ id: "compact",
89238
+ label: "Compact"
89239
+ }
89240
+ ];
89241
+ const eventCalendarListLayoutCompatibleDisplayModeValues = ["combined", "list"];
89242
+ function isEventCalendarDisplayMode(value) {
89243
+ return typeof value === "string" && eventCalendarDisplayModeValues.includes(value);
89244
+ }
89245
+ function isEventCalendarDefaultView(value) {
89246
+ return typeof value === "string" && eventCalendarDefaultViewValues.includes(value);
89247
+ }
89248
+ function isEventCalendarListLayout(value) {
89249
+ return typeof value === "string" && eventCalendarListLayoutValues.includes(value);
89250
+ }
89251
+ //#endregion
89252
+ //#region ../blocks/src/system/runtime/nodes/shared/contract-schemas.ts
89253
+ const previewStageSchema = z$1.enum(["preview", "published"]);
89254
+ const registrationButtonVariantSchema = blockButtonRoleSchema;
89255
+ const eventButtonVariantSchema = persistedBlockButtonRoleSchema;
89256
+ const eventLayoutSchema = z$1.enum(eventCalendarListLayoutValues);
89257
+ const eventCalendarDisplayModeSchema = z$1.enum(eventCalendarDisplayModeValues);
89258
+ const eventCalendarDefaultViewSchema = z$1.enum(eventCalendarDefaultViewValues);
89259
+ const columnOptionSchema = z$1.enum([
89260
+ "2",
89261
+ "3",
89262
+ "4"
89263
+ ]);
89264
+ const weekStartSchema = z$1.enum(["sunday", "monday"]);
89265
+ const filterAutoShowSchema = z$1.enum([
89266
+ "auto",
89267
+ "always",
89268
+ "never"
89269
+ ]);
89270
+ const calendarTabViewsSchema = z$1.enum([
89271
+ "both",
89272
+ "month",
89273
+ "week"
89274
+ ]);
89275
+ //#endregion
89139
89276
  //#region ../blocks/src/system/blocks/events/shared/schemas.ts
89140
89277
  const eventPresetSchema = z$1.enum([
89141
89278
  "event",
89142
89279
  "class",
89280
+ "course",
89143
89281
  "workshop",
89144
89282
  "retreat",
89145
89283
  "performance"
@@ -89406,7 +89544,7 @@ const publicTeamMemberSummarySchema = z$1.object({
89406
89544
  * Zod schema for public event data
89407
89545
  */
89408
89546
  const publicEventSchema = z$1.object({
89409
- kind: z$1.enum(["event", "course_session"]).optional(),
89547
+ bookingScope: z$1.enum(["single_occurrence", "whole_series"]),
89410
89548
  eventPreset: eventPresetSchema.optional(),
89411
89549
  eventDestinationMode: eventDestinationModeSchema.optional(),
89412
89550
  scheduleScope: eventScheduleScopeSchema$2.optional(),
@@ -89454,10 +89592,9 @@ const publicEventSchema = z$1.object({
89454
89592
  requireGuestDetails: z$1.boolean().optional(),
89455
89593
  acceptsPasses: z$1.boolean().optional(),
89456
89594
  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(),
89595
+ wholeSeries: z$1.object({
89596
+ eventSeriesId: z$1.string(),
89597
+ pricing: coursePricingSchema,
89461
89598
  currency: z$1.string(),
89462
89599
  enrollmentOpen: z$1.boolean()
89463
89600
  }).nullable().optional()
@@ -89745,12 +89882,8 @@ function normalizeIdList(parts) {
89745
89882
  }
89746
89883
  //#endregion
89747
89884
  //#region ../blocks/src/system/blocks/events/shared/filtering.ts
89748
- const eventBlockKindValues = [
89749
- "all",
89750
- "courses",
89751
- "events"
89752
- ];
89753
89885
  const eventSurfacePresetValues = [
89886
+ "course",
89754
89887
  "class",
89755
89888
  "workshop",
89756
89889
  "retreat",
@@ -89769,9 +89902,6 @@ const eventScheduleScopeValues = [
89769
89902
  ];
89770
89903
  const unsafeAsEventCategoryId = (value) => value;
89771
89904
  const unsafeAsVenueId = (value) => value;
89772
- function normalizeEventBlockKind(value) {
89773
- return value === "courses" || value === "events" ? value : "all";
89774
- }
89775
89905
  function normalizeEventSurfaceScope(value) {
89776
89906
  return value === "regularClassSchedule" || value === "specialDatedEvents" || value === "custom" ? value : "all";
89777
89907
  }
@@ -90063,86 +90193,6 @@ function eventSectionHeaderLayoutNodes(options = {}) {
90063
90193
  return [headingNode, descriptionNode];
90064
90194
  }
90065
90195
  //#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
90196
  //#region ../blocks/src/system/runtime/hooks/utils/normalize.ts
90147
90197
  function normalizeOptionalId(value) {
90148
90198
  const trimmed = typeof value === "string" ? value.trim() : void 0;
@@ -90217,15 +90267,8 @@ function buildEventRuntimeFilters(input) {
90217
90267
  if (input.scheduleScope && input.scheduleScope !== "any") params.scheduleScope = input.scheduleScope;
90218
90268
  const venueId = normalizeFilterId(input.filterVenueId);
90219
90269
  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
90270
  const categoryIds = normalizeCsvString(input.filterCategoryIds);
90227
90271
  if (categoryIds) params.categoryIds = categoryIds;
90228
- if (input.eventKind === "events") params.kind = "events";
90229
90272
  if (venueId) params.venueId = venueId;
90230
90273
  if (staffMemberId) params.staffMemberId = staffMemberId;
90231
90274
  return params;
@@ -90235,13 +90278,157 @@ function getEventRuntimeFiltersKey(filters) {
90235
90278
  categoryIds: normalizeCsvString(filters?.categoryIds),
90236
90279
  staffMemberId: normalizeOptionalId(filters?.staffMemberId),
90237
90280
  venueId: normalizeOptionalId(filters?.venueId),
90238
- kind: filters?.kind ?? null,
90239
90281
  eventSurface: filters?.eventSurface ?? null,
90240
90282
  eventPresets: normalizeCsvString(filters?.eventPresets),
90241
90283
  scheduleScope: filters?.scheduleScope ?? null
90242
90284
  });
90243
90285
  }
90244
90286
  //#endregion
90287
+ //#region ../blocks/src/system/runtime/nodes/events/shared/eventCollectionContract.ts
90288
+ const eventSurfaceScopeSchema$1 = z$1.enum(eventSurfaceScopeValues);
90289
+ const eventScheduleScopeSchema$1 = z$1.enum(eventScheduleScopeValues);
90290
+ const eventCollectionFilterSourceSchemaShape = {
90291
+ showFilters: z$1.boolean().nullable().optional(),
90292
+ showCategoryFilter: filterAutoShowSchema.optional(),
90293
+ showVenueFilter: z$1.boolean().nullable().optional(),
90294
+ showStaffFilter: z$1.boolean().nullable().optional(),
90295
+ eventSurface: eventSurfaceScopeSchema$1.nullable().optional(),
90296
+ filterEventPresets: z$1.union([z$1.string(), z$1.array(z$1.string())]).nullable().optional(),
90297
+ scheduleScope: eventScheduleScopeSchema$1.nullable().optional(),
90298
+ filterCategoryIds: z$1.union([z$1.string(), z$1.array(z$1.string())]).nullable().optional(),
90299
+ filterStaffMemberId: z$1.string().nullable().optional(),
90300
+ filterVenueId: z$1.string().nullable().optional()
90301
+ };
90302
+ const eventCollectionSourceSchemaShape = {
90303
+ events: z$1.array(publicEventSchema).nullable().optional(),
90304
+ siteId: z$1.string(),
90305
+ apiBaseUrl: z$1.string().optional(),
90306
+ stage: previewStageSchema.optional(),
90307
+ listLayout: eventLayoutSchema.optional(),
90308
+ listColumns: columnOptionSchema.optional(),
90309
+ eventsPerPage: z$1.string().optional(),
90310
+ paginationMode: z$1.enum(["loadMore", "seeAllLink"]).optional(),
90311
+ seeAllUrl: z$1.string().optional(),
90312
+ loadMoreText: z$1.string().optional(),
90313
+ startOfWeek: weekStartSchema.optional(),
90314
+ calendarTabViews: calendarTabViewsSchema.optional(),
90315
+ defaultCalendarView: eventCalendarDefaultViewSchema.optional(),
90316
+ ...eventCollectionFilterSourceSchemaShape,
90317
+ showVenue: z$1.boolean().nullable().optional(),
90318
+ showMap: z$1.boolean().nullable().optional(),
90319
+ showCapacity: z$1.boolean().nullable().optional(),
90320
+ buttonVariant: eventButtonVariantSchema.optional(),
90321
+ buttonText: z$1.string().optional(),
90322
+ emptyMessage: z$1.string().optional(),
90323
+ className: z$1.string().optional()
90324
+ };
90325
+ const eventCollectionDisplaySchemaShape = {
90326
+ events: z$1.array(publicEventSchema),
90327
+ listLayout: eventLayoutSchema,
90328
+ listColumns: columnOptionSchema,
90329
+ eventsPerPage: eventPageSizeSchema,
90330
+ paginationAction: eventListPaginationActionSchema,
90331
+ startOfWeek: weekStartSchema,
90332
+ calendarTabViews: calendarTabViewsSchema,
90333
+ defaultCalendarView: eventCalendarDefaultViewSchema,
90334
+ showFilters: z$1.boolean(),
90335
+ showCategoryFilter: filterAutoShowSchema,
90336
+ showVenueFilter: z$1.boolean(),
90337
+ showStaffFilter: z$1.boolean(),
90338
+ eventSurface: eventSurfaceScopeSchema$1,
90339
+ filterEventPresets: z$1.string().nullable(),
90340
+ scheduleScope: eventScheduleScopeSchema$1,
90341
+ filterCategoryIds: z$1.string().nullable(),
90342
+ filterStaffMemberId: z$1.string().nullable(),
90343
+ filterVenueId: z$1.string().nullable(),
90344
+ showVenue: z$1.boolean(),
90345
+ showMap: z$1.boolean(),
90346
+ showCapacity: z$1.boolean(),
90347
+ buttonVariant: eventButtonVariantSchema,
90348
+ buttonText: z$1.string(),
90349
+ emptyMessage: z$1.string()
90350
+ };
90351
+ const eventCollectionHydrationSchema = z$1.object({
90352
+ siteId: z$1.string(),
90353
+ stage: previewStageSchema.optional(),
90354
+ prefetchedEvents: z$1.boolean(),
90355
+ eventSurface: eventSurfaceScopeSchema$1,
90356
+ filterEventPresets: z$1.string().nullable(),
90357
+ scheduleScope: eventScheduleScopeSchema$1
90358
+ });
90359
+ function buildEventCollectionDisplay(source) {
90360
+ return {
90361
+ ...buildEventCollectionFilterDisplay(source),
90362
+ ...buildEventCollectionPresentationDisplay(source),
90363
+ events: Array.isArray(source.events) ? [...source.events] : [],
90364
+ listLayout: source.listLayout ?? "stack",
90365
+ listColumns: source.listColumns ?? "3",
90366
+ eventsPerPage: resolveEventCalendarListPageSize({ eventsPerPage: source.eventsPerPage }),
90367
+ paginationAction: resolveEventListPaginationAction({
90368
+ paginationMode: source.paginationMode,
90369
+ seeAllUrl: source.seeAllUrl,
90370
+ loadMoreText: source.loadMoreText
90371
+ }),
90372
+ startOfWeek: source.startOfWeek ?? "monday",
90373
+ calendarTabViews: source.calendarTabViews ?? "both",
90374
+ defaultCalendarView: source.defaultCalendarView ?? "month"
90375
+ };
90376
+ }
90377
+ function buildEventCollectionFilterDisplay(source) {
90378
+ return {
90379
+ showFilters: source.showFilters ?? true,
90380
+ showCategoryFilter: source.showCategoryFilter ?? "auto",
90381
+ showVenueFilter: source.showVenueFilter ?? false,
90382
+ showStaffFilter: source.showStaffFilter ?? true,
90383
+ eventSurface: normalizeEventSurfaceScope(source.eventSurface),
90384
+ filterEventPresets: normalizeEventSurfacePresetsCsv(source.filterEventPresets),
90385
+ scheduleScope: normalizeEventScheduleScope(source.scheduleScope),
90386
+ filterCategoryIds: normalizeEventCategoryIdsCsv(source.filterCategoryIds),
90387
+ filterStaffMemberId: normalizeEventStaffMemberId(source.filterStaffMemberId),
90388
+ filterVenueId: normalizeEventVenueId(source.filterVenueId)
90389
+ };
90390
+ }
90391
+ function buildEventCollectionPresentationDisplay(source) {
90392
+ return {
90393
+ showVenue: source.showVenue ?? true,
90394
+ showMap: source.showMap ?? true,
90395
+ showCapacity: source.showCapacity ?? true,
90396
+ buttonVariant: source.buttonVariant ?? "primary",
90397
+ buttonText: source.buttonText ?? "Book",
90398
+ emptyMessage: source.emptyMessage ?? "No upcoming events scheduled."
90399
+ };
90400
+ }
90401
+ function buildEventCollectionHydration(source) {
90402
+ return {
90403
+ siteId: source.siteId,
90404
+ stage: source.stage,
90405
+ prefetchedEvents: source.events != null,
90406
+ eventSurface: normalizeEventSurfaceScope(source.eventSurface),
90407
+ filterEventPresets: normalizeEventSurfacePresetsCsv(source.filterEventPresets),
90408
+ scheduleScope: normalizeEventScheduleScope(source.scheduleScope)
90409
+ };
90410
+ }
90411
+ function buildEventCollectionListingDisplay(display, prefetchedEvents, className) {
90412
+ const initialEvents = display.events.slice(0, display.eventsPerPage);
90413
+ return {
90414
+ kind: "event-listing",
90415
+ state: initialEvents.length === 0 ? prefetchedEvents ? "empty" : "loading" : "ready",
90416
+ listLayout: display.listLayout,
90417
+ className,
90418
+ emptyMessage: display.emptyMessage,
90419
+ loadingMessage: "Loading events…",
90420
+ containerClass: getContainerClass(display.listLayout, display.listColumns),
90421
+ cardVariant: "default",
90422
+ buttonVariant: display.buttonVariant,
90423
+ buttonText: display.buttonText,
90424
+ showVenue: display.showVenue,
90425
+ showMap: display.showMap,
90426
+ showCapacity: display.showCapacity,
90427
+ orientation: getCardOrientation(display.listLayout),
90428
+ events: initialEvents
90429
+ };
90430
+ }
90431
+ //#endregion
90245
90432
  //#region ../blocks/src/system/spacing.ts
90246
90433
  /**
90247
90434
  * Type-safe spacing system for sections and containers.
@@ -90560,7 +90747,7 @@ function buildOfferingsPreviewRenderStates(input) {
90560
90747
  return states;
90561
90748
  }
90562
90749
  function sourceFromPresetSummary(preset) {
90563
- if (preset.engine === "course" && preset.canonicalBehaviour === "course") return { kind: "course" };
90750
+ if (preset.engine === "event_series" && preset.canonicalBehaviour === "course") return { kind: "course" };
90564
90751
  if (preset.engine !== "event_series") return null;
90565
90752
  if (isOfferingsPreviewEventPreset(preset.canonicalBehaviour)) return {
90566
90753
  kind: "eventPreset",
@@ -90621,13 +90808,12 @@ function resolveAutoCtaPath(source, routes) {
90621
90808
  return routeByNormalizedPath.get("/offerings") ?? null;
90622
90809
  }
90623
90810
  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}`;
90811
+ const routeIds = [course.eventSeriesId, course.eventOfferingId];
90812
+ for (const entityId of routeIds) {
90813
+ const path = normalizeRoutePath((routes ?? []).find((candidate) => candidate.entityId === entityId)?.path);
90814
+ if (path) return path;
90815
+ }
90816
+ return null;
90631
90817
  }
90632
90818
  function preferredPathsForSource(source) {
90633
90819
  switch (source.kind) {
@@ -90648,11 +90834,6 @@ function normalizeRoutePath(value) {
90648
90834
  const path = text.startsWith("/") ? text : `/${text}`;
90649
90835
  return path.length > 1 ? path.replace(/\/+$/, "") : path;
90650
90836
  }
90651
- function normalizePathSegment(value) {
90652
- const text = normalizeTextOverride(value);
90653
- if (!text) return null;
90654
- return text.replace(/^\/+|\/+$/g, "");
90655
- }
90656
90837
  function isOfferingsPreviewEventPreset(value) {
90657
90838
  return typeof value === "string" && OFFERINGS_PREVIEW_EVENT_PRESETS.includes(value);
90658
90839
  }
@@ -95860,1029 +96041,6 @@ function uniqueStrings(values) {
95860
96041
  return Array.from(new Set(values));
95861
96042
  }
95862
96043
  //#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
96044
  //#region ../theme-core/src/site-styles/customizableSurfaces.ts
96887
96045
  function uniqueLookIds(ids) {
96888
96046
  const result = [];
@@ -96982,7 +96140,7 @@ const defaultHeaderSelectionContext = {
96982
96140
  cta: { importance: "medium" },
96983
96141
  banner: { persistentVisibility: "possible" }
96984
96142
  };
96985
- function mergeHeaderSelectionContext(context) {
96143
+ function completeHeaderSelectionContext(context) {
96986
96144
  return mergeWithDefaults(defaultHeaderSelectionContext, context);
96987
96145
  }
96988
96146
  const titleOnlyLogoAccommodation = {
@@ -98279,255 +97437,1306 @@ function practicalUtilityHeader(theme) {
98279
97437
  }
98280
97438
  };
98281
97439
  }
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
- };
97440
+ function minimalTransparentHeader(theme) {
97441
+ return {
97442
+ ...baseHeader(theme),
97443
+ variant: "classic",
97444
+ positioning: "static",
97445
+ shrinkOnScroll: false,
97446
+ background: {
97447
+ type: "color",
97448
+ color: "transparent"
97449
+ },
97450
+ textColor: "text",
97451
+ navColor: "text",
97452
+ navStyle: "underline",
97453
+ navWeight: "medium",
97454
+ border: {
97455
+ style: "solid",
97456
+ width: "none",
97457
+ position: "none"
97458
+ },
97459
+ ctaTreatment: "outline",
97460
+ ctaVariant: resolveHeaderCtaVariant(theme, "outline"),
97461
+ ctaGap: "default"
97462
+ };
97463
+ }
97464
+ function transparentOverlayHeader(theme) {
97465
+ return {
97466
+ ...baseHeader(theme),
97467
+ variant: "transparent",
97468
+ positioning: "fixed",
97469
+ shrinkOnScroll: true,
97470
+ background: {
97471
+ type: "color",
97472
+ color: "transparent"
97473
+ },
97474
+ textColor: "background",
97475
+ navColor: "background",
97476
+ navStyle: "frosted",
97477
+ navWeight: "semibold",
97478
+ border: {
97479
+ style: "solid",
97480
+ width: "none",
97481
+ position: "none"
97482
+ },
97483
+ ctaTreatment: "inverted",
97484
+ ctaVariant: resolveHeaderCtaVariant(theme, "inverted"),
97485
+ ctaGap: "compact"
97486
+ };
97487
+ }
97488
+ function floatingGlassHeader(theme) {
97489
+ return {
97490
+ ...transparentOverlayHeader(theme),
97491
+ variant: "floating",
97492
+ positioning: "sticky",
97493
+ navStyle: "frosted",
97494
+ navContainer: {
97495
+ type: "glass",
97496
+ tint: "text",
97497
+ opacity: .16
97498
+ },
97499
+ container: {
97500
+ rounded: "2xl",
97501
+ border: true,
97502
+ shadow: true,
97503
+ padding: "sm",
97504
+ tint: "background",
97505
+ opacity: .12
97506
+ }
97507
+ };
97508
+ }
97509
+ const headerLookCatalog = defineExactCatalog()([
97510
+ {
97511
+ id: asHeaderLookId("clean-base"),
97512
+ label: "Clean base",
97513
+ visualTreatment: "solid-neutral",
97514
+ layoutBehavior: "sticky",
97515
+ configuration: {
97516
+ structure: "inline-classic",
97517
+ treatment: "solid-neutral",
97518
+ behavior: "sticky"
97519
+ },
97520
+ openingRequirement: "none",
97521
+ logoAccommodations: inlineClassicLogoAccommodations,
97522
+ compile: cleanBaseHeader
97523
+ },
97524
+ {
97525
+ id: asHeaderLookId("classic-centered-nav"),
97526
+ label: "Centered nav",
97527
+ visualTreatment: "solid-neutral",
97528
+ layoutBehavior: "sticky",
97529
+ configuration: {
97530
+ structure: "inline-classic",
97531
+ treatment: "solid-neutral",
97532
+ behavior: "sticky"
97533
+ },
97534
+ openingRequirement: "none",
97535
+ maxRecommendedNavItems: 6,
97536
+ logoAccommodations: inlineClassicLogoAccommodations,
97537
+ compile: classicCenteredNavHeader
97538
+ },
97539
+ {
97540
+ id: asHeaderLookId("brand-solid"),
97541
+ label: "Brand solid",
97542
+ visualTreatment: "solid-brand",
97543
+ layoutBehavior: "sticky-shrink",
97544
+ configuration: {
97545
+ structure: "inline-classic",
97546
+ treatment: "solid-brand",
97547
+ behavior: "sticky-shrink"
97548
+ },
97549
+ openingRequirement: "none",
97550
+ logoAccommodations: inlineClassicLogoAccommodations,
97551
+ compile: solidBrandHeader
97552
+ },
97553
+ {
97554
+ id: asHeaderLookId("serif-line"),
97555
+ label: "Serif line",
97556
+ visualTreatment: "light-serif",
97557
+ layoutBehavior: "sticky",
97558
+ configuration: {
97559
+ structure: "centered-stack",
97560
+ treatment: "light-serif",
97561
+ behavior: "sticky"
97562
+ },
97563
+ openingRequirement: "none",
97564
+ maxRecommendedNavItems: 6,
97565
+ logoAccommodations: centeredLogoAccommodations,
97566
+ compile: serifLineHeader
97567
+ },
97568
+ {
97569
+ id: asHeaderLookId("centered-calm"),
97570
+ label: "Centered calm",
97571
+ visualTreatment: "light-serif",
97572
+ layoutBehavior: "normal-flow",
97573
+ configuration: {
97574
+ structure: "centered-stack",
97575
+ treatment: "light-serif",
97576
+ behavior: "normal-flow"
97577
+ },
97578
+ openingRequirement: "none",
97579
+ maxRecommendedNavItems: 5,
97580
+ logoAccommodations: centeredLogoAccommodations,
97581
+ compile: centeredCalmHeader
97582
+ },
97583
+ {
97584
+ id: asHeaderLookId("practical-utility"),
97585
+ label: "Practical utility",
97586
+ visualTreatment: "solid-neutral",
97587
+ layoutBehavior: "sticky-shrink",
97588
+ configuration: {
97589
+ structure: "inline-classic",
97590
+ treatment: "solid-neutral",
97591
+ behavior: "sticky-shrink"
97592
+ },
97593
+ openingRequirement: "none",
97594
+ requiresProminentCta: true,
97595
+ logoAccommodations: inlineClassicLogoAccommodations,
97596
+ compile: practicalUtilityHeader
97597
+ },
97598
+ {
97599
+ id: asHeaderLookId("minimal-transparent"),
97600
+ label: "Minimal transparent",
97601
+ visualTreatment: "minimal-transparent",
97602
+ layoutBehavior: "normal-flow",
97603
+ configuration: {
97604
+ structure: "inline-classic",
97605
+ treatment: "minimal-transparent",
97606
+ behavior: "normal-flow"
97607
+ },
97608
+ openingRequirement: "reserved-space-ok",
97609
+ logoAccommodations: inlineClassicLogoAccommodations,
97610
+ compile: minimalTransparentHeader
97611
+ },
97612
+ {
97613
+ id: asHeaderLookId("transparent-overlay"),
97614
+ label: "Transparent overlay",
97615
+ visualTreatment: "transparent-overlay",
97616
+ layoutBehavior: "fixed-overlay",
97617
+ configuration: {
97618
+ structure: "inline-classic",
97619
+ treatment: "transparent-overlay",
97620
+ behavior: "fixed-overlay"
97621
+ },
97622
+ openingRequirement: "requires-image-hero-with-contrast-overlay",
97623
+ maxRecommendedNavItems: 5,
97624
+ logoAccommodations: overlayLogoAccommodations,
97625
+ compile: transparentOverlayHeader
97626
+ },
97627
+ {
97628
+ id: asHeaderLookId("floating-glass"),
97629
+ label: "Floating glass",
97630
+ visualTreatment: "floating-glass",
97631
+ layoutBehavior: "fixed-floating",
97632
+ configuration: {
97633
+ structure: "floating-shell",
97634
+ treatment: "floating-glass",
97635
+ behavior: "fixed-floating"
97636
+ },
97637
+ openingRequirement: "requires-image-hero-with-contrast-overlay",
97638
+ maxRecommendedNavItems: 5,
97639
+ logoAccommodations: overlayLogoAccommodations,
97640
+ compile: floatingGlassHeader
97641
+ }
97642
+ ]);
97643
+ const guaranteedFallbackHeaderLookId = asHeaderLookId("clean-base");
97644
+ new Set(headerLookCatalog.map((look) => headerConfigurationKey(look.configuration)));
97645
+ const headerLooksById = new Map(headerLookCatalog.map((look) => [look.id, look]));
97646
+ function headerConfigurationKey(configuration) {
97647
+ return `${configuration.structure}:${configuration.treatment}:${configuration.behavior}`;
97648
+ }
97649
+ function getHeaderLook(id) {
97650
+ return headerLooksById.get(id) ?? null;
97651
+ }
97652
+ function getHeaderLookOrThrow(id) {
97653
+ const look = getHeaderLook(id);
97654
+ if (!look) throw new Error(`Unknown Theme V2 header Look: ${id}`);
97655
+ return look;
97656
+ }
97657
+ function rejectReasonsForLook(look, context) {
97658
+ const brandPresentation = resolveHeaderBrandPresentation({
97659
+ logo: context.logo,
97660
+ accommodations: look.logoAccommodations
97661
+ });
97662
+ return [
97663
+ ...look.maxRecommendedNavItems !== void 0 && context.navigation.itemCount > look.maxRecommendedNavItems ? ["too-many-nav-items"] : [],
97664
+ ...brandPresentation.kind === "rejected" ? brandPresentation.reasons : [],
97665
+ ...look.requiresProminentCta && context.cta.importance === "low" ? ["cta-treatment-unavailable"] : []
97666
+ ];
97667
+ }
97668
+ function resolveHeaderLook(input) {
97669
+ const context = completeHeaderSelectionContext(input.context);
97670
+ const result = resolveLook({
97671
+ recommendedLookIds: input.recommendedLookIds,
97672
+ guaranteedFallbackLookId: guaranteedFallbackHeaderLookId,
97673
+ getLookOrThrow: getHeaderLookOrThrow,
97674
+ context,
97675
+ rejectReasonsForLook,
97676
+ compileLook: (look) => look.compile(input.theme)
97677
+ });
97678
+ return {
97679
+ selectedLookId: result.selectedLookId,
97680
+ selectedLook: result.selectedLook,
97681
+ header: result.compiled,
97682
+ brandPresentation: requireHeaderBrandPresentationSelection(resolveHeaderBrandPresentation({
97683
+ logo: context.logo,
97684
+ accommodations: result.selectedLook.logoAccommodations,
97685
+ allowDisplayFallback: true
97686
+ })),
97687
+ rejected: result.rejected
97688
+ };
97689
+ }
97690
+ //#endregion
97691
+ //#region ../theme-core/src/site-styles/compilationPlan.ts
97692
+ const defaultHeaderBrandPreferences = {
97693
+ brandDisplay: "auto",
97694
+ logoSize: "auto"
97695
+ };
97696
+ function headerBrandPreferencesFromTheme(theme) {
97697
+ return {
97698
+ brandDisplay: theme?.header.logo?.brandDisplay ?? defaultHeaderBrandPreferences.brandDisplay,
97699
+ logoSize: theme?.header.logo?.size ?? defaultHeaderBrandPreferences.logoSize
97700
+ };
97701
+ }
97702
+ function replaceSiteStyleCompilationPlan(input = {}) {
97703
+ return {
97704
+ kind: "replace-site-style",
97705
+ header: {
97706
+ kind: "recompile",
97707
+ selection: {
97708
+ headerLookId: input.headerLookId ?? null,
97709
+ headerLayoutId: input.headerLayoutId ?? null,
97710
+ headerStyleId: input.headerStyleId ?? null
97711
+ },
97712
+ context: completeHeaderSelectionContext(input.headerSelectionContext),
97713
+ brandPresentation: input.headerSelectionContext?.logo === void 0 ? { kind: "use-compiled-defaults" } : { kind: "apply-logo-context" }
97714
+ },
97715
+ footerLookId: input.footerLookId ?? null
97716
+ };
97717
+ }
97718
+ //#endregion
97719
+ //#region ../theme-core/src/site-styles/sectionTransitions.ts
97720
+ function boundaryRuntimeMetrics(family, size, heightExpression) {
97721
+ return {
97722
+ family,
97723
+ size,
97724
+ heightCss: heightExpression.includes(" ") ? `calc(${heightExpression})` : heightExpression,
97725
+ reserveCss: `calc((${heightExpression}) / 2)`
97726
+ };
97727
+ }
97728
+ const sectionBoundaryRuntimeMetricsByTransition = {
97729
+ none: null,
97730
+ "soft-fade-short": boundaryRuntimeMetrics("gradient", "medium", "6rem + 2px"),
97731
+ "soft-fade-long": boundaryRuntimeMetrics("gradient", "spacious", "10rem"),
97732
+ "soft-fade-expansive": boundaryRuntimeMetrics("gradient", "expansive", "14rem"),
97733
+ "wave-edge": boundaryRuntimeMetrics("wave", "medium", "6rem + 2px"),
97734
+ "wave-edge-balanced": boundaryRuntimeMetrics("wave", "medium", "6rem + 2px"),
97735
+ "wave-edge-gentle": boundaryRuntimeMetrics("wave", "compact", "4.5rem + 2px"),
97736
+ "wave-edge-bold": boundaryRuntimeMetrics("wave", "large", "7rem + 2px"),
97737
+ "wave-edge-drift": boundaryRuntimeMetrics("wave", "medium", "6rem + 2px"),
97738
+ "angle-edge": boundaryRuntimeMetrics("angle", "medium", "6rem + 2px"),
97739
+ "angle-edge-subtle": boundaryRuntimeMetrics("angle", "compact", "4.5rem + 2px"),
97740
+ "angle-edge-steep": boundaryRuntimeMetrics("angle", "large", "7rem + 2px")
97741
+ };
97742
+ function boundaryRuntimeMetricsForTransition(transition) {
97743
+ return sectionBoundaryRuntimeMetricsByTransition[transition];
97744
+ }
97745
+ const noneBoundaryOption = {
97746
+ id: asBoundaryOptionId("break:none"),
97747
+ label: "None",
97748
+ transitionAfter: "none",
97749
+ treatment: { kind: "none" }
97750
+ };
97751
+ const softBoundaryOption = {
97752
+ id: asBoundaryOptionId("break:soft"),
97753
+ label: "Soft",
97754
+ transitionAfter: "soft-fade-short",
97755
+ treatment: {
97756
+ kind: "soft-fade",
97757
+ height: "medium",
97758
+ curve: "soft"
97759
+ }
97760
+ };
97761
+ const spaciousBoundaryOption = {
97762
+ id: asBoundaryOptionId("break:spacious"),
97763
+ label: "Spacious",
97764
+ transitionAfter: "soft-fade-long",
97765
+ treatment: {
97766
+ kind: "soft-fade",
97767
+ height: "large",
97768
+ curve: "spacious"
97769
+ }
97770
+ };
97771
+ const expansiveBoundaryOption = {
97772
+ id: asBoundaryOptionId("break:expansive"),
97773
+ label: "Expansive",
97774
+ transitionAfter: "soft-fade-expansive",
97775
+ treatment: {
97776
+ kind: "soft-fade",
97777
+ height: "expansive",
97778
+ curve: "expansive"
97779
+ }
97780
+ };
97781
+ const waveBoundaryOption = {
97782
+ id: asBoundaryOptionId("break:wave"),
97783
+ label: "Classic wave",
97784
+ transitionAfter: "wave-edge",
97785
+ treatment: {
97786
+ kind: "wave-edge",
97787
+ height: "medium",
97788
+ amplitude: "balanced",
97789
+ rhythm: "double",
97790
+ symmetry: "asymmetrical"
97791
+ }
97792
+ };
97793
+ const balancedWaveBoundaryOption = {
97794
+ id: asBoundaryOptionId("break:wave-balanced"),
97795
+ label: "Balanced wave",
97796
+ transitionAfter: "wave-edge-balanced",
97797
+ treatment: {
97798
+ kind: "wave-edge",
97799
+ height: "medium",
97800
+ amplitude: "balanced",
97801
+ rhythm: "double",
97802
+ symmetry: "symmetrical"
97803
+ }
97804
+ };
97805
+ const gentleWaveBoundaryOption = {
97806
+ id: asBoundaryOptionId("break:wave-gentle"),
97807
+ label: "Gentle wave",
97808
+ transitionAfter: "wave-edge-gentle",
97809
+ treatment: {
97810
+ kind: "wave-edge",
97811
+ height: "compact",
97812
+ amplitude: "subtle",
97813
+ rhythm: "single",
97814
+ symmetry: "symmetrical"
97815
+ }
97816
+ };
97817
+ const boldWaveBoundaryOption = {
97818
+ id: asBoundaryOptionId("break:wave-bold"),
97819
+ label: "Bold wave",
97820
+ transitionAfter: "wave-edge-bold",
97821
+ treatment: {
97822
+ kind: "wave-edge",
97823
+ height: "large",
97824
+ amplitude: "bold",
97825
+ rhythm: "double",
97826
+ symmetry: "symmetrical"
97827
+ }
97828
+ };
97829
+ const driftWaveBoundaryOption = {
97830
+ id: asBoundaryOptionId("break:wave-drift"),
97831
+ label: "Drift wave",
97832
+ transitionAfter: "wave-edge-drift",
97833
+ treatment: {
97834
+ kind: "wave-edge",
97835
+ height: "medium",
97836
+ amplitude: "balanced",
97837
+ rhythm: "double",
97838
+ symmetry: "drift"
97839
+ }
97840
+ };
97841
+ const subtleAngleBoundaryOption = {
97842
+ id: asBoundaryOptionId("break:angle-subtle"),
97843
+ label: "Subtle angle",
97844
+ transitionAfter: "angle-edge-subtle",
97845
+ treatment: {
97846
+ kind: "angle-edge",
97847
+ height: "compact",
97848
+ slope: "subtle",
97849
+ direction: "forward"
97850
+ }
97851
+ };
97852
+ const balancedAngleBoundaryOption = {
97853
+ id: asBoundaryOptionId("break:angle-balanced"),
97854
+ label: "Balanced angle",
97855
+ transitionAfter: "angle-edge",
97856
+ treatment: {
97857
+ kind: "angle-edge",
97858
+ height: "medium",
97859
+ slope: "balanced",
97860
+ direction: "forward"
97861
+ }
97862
+ };
97863
+ const steepAngleBoundaryOption = {
97864
+ id: asBoundaryOptionId("break:angle-steep"),
97865
+ label: "Steep angle",
97866
+ transitionAfter: "angle-edge-steep",
97867
+ treatment: {
97868
+ kind: "angle-edge",
97869
+ height: "large",
97870
+ slope: "steep",
97871
+ direction: "forward"
97872
+ }
97873
+ };
97874
+ const sectionTransitionFamilies = [
97875
+ {
97876
+ id: "none",
97877
+ label: "None",
97878
+ variants: [{
97879
+ familyId: "none",
97880
+ variantId: "none",
97881
+ label: "None",
97882
+ boundaryOption: noneBoundaryOption
97883
+ }]
97884
+ },
97885
+ {
97886
+ id: "gradient",
97887
+ label: "Gradient",
97888
+ variants: [
97889
+ {
97890
+ familyId: "gradient",
97891
+ variantId: "soft",
97892
+ label: "Soft",
97893
+ boundaryOption: softBoundaryOption
97894
+ },
97895
+ {
97896
+ familyId: "gradient",
97897
+ variantId: "spacious",
97898
+ label: "Spacious",
97899
+ boundaryOption: spaciousBoundaryOption
97900
+ },
97901
+ {
97902
+ familyId: "gradient",
97903
+ variantId: "expansive",
97904
+ label: "Expansive",
97905
+ boundaryOption: expansiveBoundaryOption
97906
+ }
97907
+ ]
97908
+ },
97909
+ {
97910
+ id: "wave",
97911
+ label: "Wave",
97912
+ variants: [
97913
+ {
97914
+ familyId: "wave",
97915
+ variantId: "balanced",
97916
+ label: "Balanced",
97917
+ boundaryOption: balancedWaveBoundaryOption
97918
+ },
97919
+ {
97920
+ familyId: "wave",
97921
+ variantId: "classic",
97922
+ label: "Classic",
97923
+ boundaryOption: waveBoundaryOption
97924
+ },
97925
+ {
97926
+ familyId: "wave",
97927
+ variantId: "gentle",
97928
+ label: "Gentle",
97929
+ boundaryOption: gentleWaveBoundaryOption
97930
+ },
97931
+ {
97932
+ familyId: "wave",
97933
+ variantId: "bold",
97934
+ label: "Bold",
97935
+ boundaryOption: boldWaveBoundaryOption
97936
+ },
97937
+ {
97938
+ familyId: "wave",
97939
+ variantId: "drift",
97940
+ label: "Drift",
97941
+ boundaryOption: driftWaveBoundaryOption
97942
+ }
97943
+ ]
97944
+ },
97945
+ {
97946
+ id: "angle",
97947
+ label: "Angle",
97948
+ variants: [
97949
+ {
97950
+ familyId: "angle",
97951
+ variantId: "subtle",
97952
+ label: "Subtle",
97953
+ boundaryOption: subtleAngleBoundaryOption
97954
+ },
97955
+ {
97956
+ familyId: "angle",
97957
+ variantId: "balanced",
97958
+ label: "Balanced",
97959
+ boundaryOption: balancedAngleBoundaryOption
97960
+ },
97961
+ {
97962
+ familyId: "angle",
97963
+ variantId: "steep",
97964
+ label: "Steep",
97965
+ boundaryOption: steepAngleBoundaryOption
97966
+ }
97967
+ ]
97968
+ }
97969
+ ];
97970
+ function sectionTransitionVariantForBoundaryOptionId(boundaryOptionId) {
97971
+ if (!boundaryOptionId) return null;
97972
+ for (const family of sectionTransitionFamilies) {
97973
+ const variant = family.variants.find((candidate) => candidate.boundaryOption.id === boundaryOptionId);
97974
+ if (variant) return variant;
97975
+ }
97976
+ return null;
97977
+ }
97978
+ function sectionTransitionFamilyForBoundaryOptionId(boundaryOptionId) {
97979
+ const variant = sectionTransitionVariantForBoundaryOptionId(boundaryOptionId);
97980
+ if (!variant) return null;
97981
+ return sectionTransitionFamilies.find((family) => family.id === variant.familyId) ?? null;
97982
+ }
97983
+ function defaultSectionTransitionVariantForFamily(familyId) {
97984
+ const family = sectionTransitionFamilies.find((candidate) => candidate.id === familyId);
97985
+ if (!family) throw new Error(`Unknown section transition family: ${familyId}`);
97986
+ return family.variants[0];
97987
+ }
97988
+ asBoundaryOptionId("break:unknown");
97989
+ const pageDesignUserPinnedAppearanceChoiceSchema = z$1.object({
97990
+ kind: z$1.literal("user-pinned"),
97991
+ value: z$1.string().min(1).transform(asAppearancePresetId)
97992
+ }).strict();
97993
+ const pageDesignUserPinnedBoundaryChoiceSchema = z$1.object({
97994
+ kind: z$1.literal("user-pinned"),
97995
+ value: z$1.string().min(1).transform(asBoundaryOptionId)
97996
+ }).strict();
97997
+ const pageDesignBoundaryTreatmentSchema = z$1.discriminatedUnion("kind", [
97998
+ z$1.object({ kind: z$1.literal("none") }).strict(),
97999
+ z$1.object({
98000
+ kind: z$1.literal("soft-fade"),
98001
+ height: z$1.enum([
98002
+ "compact",
98003
+ "medium",
98004
+ "large",
98005
+ "expansive"
98006
+ ]),
98007
+ curve: z$1.enum([
98008
+ "soft",
98009
+ "spacious",
98010
+ "expansive"
98011
+ ])
98012
+ }).strict(),
98013
+ z$1.object({
98014
+ kind: z$1.literal("wave-edge"),
98015
+ height: z$1.enum([
98016
+ "compact",
98017
+ "medium",
98018
+ "large"
98019
+ ]),
98020
+ amplitude: z$1.enum([
98021
+ "subtle",
98022
+ "balanced",
98023
+ "bold"
98024
+ ]),
98025
+ rhythm: z$1.enum(["single", "double"]),
98026
+ symmetry: z$1.enum([
98027
+ "symmetrical",
98028
+ "asymmetrical",
98029
+ "drift"
98030
+ ])
98031
+ }).strict(),
98032
+ z$1.object({
98033
+ kind: z$1.literal("angle-edge"),
98034
+ height: z$1.enum([
98035
+ "compact",
98036
+ "medium",
98037
+ "large"
98038
+ ]),
98039
+ slope: z$1.enum([
98040
+ "subtle",
98041
+ "balanced",
98042
+ "steep"
98043
+ ]),
98044
+ direction: z$1.enum(["forward", "reverse"])
98045
+ }).strict(),
98046
+ z$1.object({
98047
+ kind: z$1.literal("legacy-unsupported"),
98048
+ boundaryOptionId: z$1.string().min(1).transform(asBoundaryOptionId)
98049
+ }).strict()
98050
+ ]);
98051
+ const pageDesignUserPinnedBoundaryTreatmentChoiceSchema = z$1.object({
98052
+ kind: z$1.literal("user-pinned"),
98053
+ value: pageDesignBoundaryTreatmentSchema
98054
+ }).strict();
98055
+ const pageDesignBlockLookPinSchema = z$1.object({
98056
+ blockId: z$1.string().min(1).transform(asDesignBlockId),
98057
+ blockKind: z$1.string().min(1),
98058
+ choice: pageDesignUserPinnedAppearanceChoiceSchema
98059
+ }).strict();
98060
+ const pageDesignBoundaryPinSchema = z$1.object({
98061
+ boundaryId: z$1.string().min(1).transform(asDesignBoundaryId),
98062
+ previousBlockId: z$1.string().min(1).transform(asDesignBlockId),
98063
+ nextBlockId: z$1.string().min(1).transform(asDesignBlockId),
98064
+ choice: pageDesignUserPinnedBoundaryTreatmentChoiceSchema
98065
+ }).strict().superRefine(validateBoundaryPinIdMatchesBlocks);
98066
+ const legacyPageDesignBoundaryPinSchema = z$1.object({
98067
+ boundaryId: z$1.string().min(1).transform(asDesignBoundaryId),
98068
+ previousBlockId: z$1.string().min(1).transform(asDesignBlockId),
98069
+ nextBlockId: z$1.string().min(1).transform(asDesignBlockId),
98070
+ choice: pageDesignUserPinnedBoundaryChoiceSchema
98071
+ }).strict().superRefine(validateBoundaryPinIdMatchesBlocks);
98072
+ z$1.object({
98073
+ schemaVersion: z$1.literal(1),
98074
+ siteStyleId: z$1.string().min(1).transform(asSiteStyleId),
98075
+ pageFlowPresetId: z$1.string().min(1).transform(asPageFlowPresetId),
98076
+ blockLookPins: z$1.array(pageDesignBlockLookPinSchema),
98077
+ boundaryPins: z$1.array(legacyPageDesignBoundaryPinSchema)
98078
+ }).strict().superRefine(validateUniquePageDesignPins);
98079
+ z$1.object({
98080
+ schemaVersion: z$1.literal(2),
98081
+ siteStyleId: z$1.string().min(1).transform(asSiteStyleId),
98082
+ pageFlowPresetId: z$1.string().min(1).transform(asPageFlowPresetId),
98083
+ blockLookPins: z$1.array(pageDesignBlockLookPinSchema),
98084
+ boundaryPins: z$1.array(pageDesignBoundaryPinSchema)
98085
+ }).strict().superRefine(validateUniquePageDesignPins);
98086
+ function addDuplicateStringIssues(ctx, input) {
98087
+ const seen = /* @__PURE__ */ new Set();
98088
+ const duplicates = /* @__PURE__ */ new Set();
98089
+ for (const value of input.values) {
98090
+ if (seen.has(value)) duplicates.add(value);
98091
+ seen.add(value);
98092
+ }
98093
+ for (const duplicate of duplicates) ctx.addIssue({
98094
+ code: z$1.ZodIssueCode.custom,
98095
+ path: [...input.path],
98096
+ message: `Duplicate ${input.label}: ${duplicate}.`
98097
+ });
98098
+ }
98099
+ function validateBoundaryPinIdMatchesBlocks(pin, ctx) {
98100
+ const expectedBoundaryId = makeBoundaryId(pin.previousBlockId, pin.nextBlockId);
98101
+ if (pin.boundaryId !== expectedBoundaryId) ctx.addIssue({
98102
+ code: z$1.ZodIssueCode.custom,
98103
+ path: ["boundaryId"],
98104
+ message: `Boundary id must match previousBlockId and nextBlockId. Expected ${expectedBoundaryId}.`
98105
+ });
98305
98106
  }
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
- };
98107
+ function validateUniquePageDesignPins(intent, ctx) {
98108
+ addDuplicateStringIssues(ctx, {
98109
+ values: intent.blockLookPins.map((pin) => pin.blockId),
98110
+ path: ["blockLookPins"],
98111
+ label: "block Look pin"
98112
+ });
98113
+ addDuplicateStringIssues(ctx, {
98114
+ values: intent.boundaryPins.map((pin) => boundaryKey(pin.previousBlockId, pin.nextBlockId)),
98115
+ path: ["boundaryPins"],
98116
+ label: "boundary pin"
98117
+ });
98329
98118
  }
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
98348
- }
98349
- };
98119
+ function boundaryKey(previousBlockId, nextBlockId) {
98120
+ return makeBoundaryId(previousBlockId, nextBlockId);
98350
98121
  }
98351
- const headerLookCatalog = defineExactCatalog()([
98122
+ //#endregion
98123
+ //#region ../theme-core/src/accordions/siteStyleDefaults.ts
98124
+ /**
98125
+ * Reusable accordion "looks" for curated site styles.
98126
+ *
98127
+ * Each curated site style should declare one of these (or a bespoke variant)
98128
+ * via `themeOverrides.accordions` so its FAQ accordions carry the style's
98129
+ * personality instead of falling back to the generic generated default. The
98130
+ * looks vary the things that make an accordion read as designed vs. cheap:
98131
+ * box vs. boxless, question typography (body vs. heading font + scale), icon,
98132
+ * and how an open item is emphasised.
98133
+ */
98134
+ /**
98135
+ * Boxless editorial list: transparent root, hairline dividers between rows,
98136
+ * generous spacing, heading-font questions, plus/minus marks, and an accented
98137
+ * tinted band on the open row. The reference "expensive" FAQ look.
98138
+ */
98139
+ const editorialDividedAccordionSystem = {
98140
+ background: null,
98141
+ spacing: "comfortable",
98142
+ corners: "square",
98143
+ border: null,
98144
+ shadow: null,
98145
+ icon: {
98146
+ style: "plus-minus",
98147
+ position: "right",
98148
+ size: "md",
98149
+ colorToken: "primary"
98150
+ },
98151
+ trigger: {
98152
+ textColorToken: "text",
98153
+ fontWeight: "regular",
98154
+ fontFamily: "heading",
98155
+ fontScale: "lg"
98156
+ },
98157
+ hover: { textColorToken: "primary" },
98158
+ openState: {
98159
+ backgroundColorToken: "surfaceAlt",
98160
+ triggerColorToken: "primary",
98161
+ accent: {
98162
+ edge: "left",
98163
+ colorToken: "primary",
98164
+ thickness: "medium"
98165
+ }
98166
+ },
98167
+ content: { textColorToken: "neutral-700" }
98168
+ };
98169
+ /**
98170
+ * Quiet, airy underlined rows: transparent, spacious, large calm heading-font
98171
+ * questions, a small subtle chevron, and open emphasis carried only by the
98172
+ * question recolouring. For minimal / premium / wellness styles.
98173
+ */
98174
+ const quietUnderlinedAccordionSystem = {
98175
+ background: null,
98176
+ spacing: "spacious",
98177
+ corners: "square",
98178
+ border: null,
98179
+ shadow: null,
98180
+ icon: {
98181
+ style: "chevron",
98182
+ position: "right",
98183
+ size: "sm",
98184
+ colorToken: "muted"
98185
+ },
98186
+ trigger: {
98187
+ textColorToken: "text",
98188
+ fontWeight: "regular",
98189
+ fontFamily: "heading",
98190
+ fontScale: "lg"
98191
+ },
98192
+ hover: { textColorToken: "primary" },
98193
+ openState: { triggerColorToken: "primary" },
98194
+ content: { textColorToken: "neutral-700" }
98195
+ };
98196
+ /**
98197
+ * Soft contained panel: a gentle surface box with soft corners, a hairline
98198
+ * border and a low shadow, heading-font questions at a moderate size, chevron,
98199
+ * and a tinted open state. For clean, trustworthy, appointment-led styles.
98200
+ */
98201
+ const calmPanelAccordionSystem = {
98202
+ background: {
98203
+ type: "solid",
98204
+ colorToken: "surface"
98205
+ },
98206
+ spacing: "comfortable",
98207
+ corners: "soft",
98208
+ border: {
98209
+ widthClass: "border",
98210
+ colorToken: "border"
98211
+ },
98212
+ shadow: {
98213
+ elevation: "low",
98214
+ softness: "soft",
98215
+ position: "bottom"
98216
+ },
98217
+ icon: {
98218
+ style: "chevron",
98219
+ position: "right",
98220
+ size: "md",
98221
+ colorToken: "primary"
98222
+ },
98223
+ trigger: {
98224
+ textColorToken: "text",
98225
+ fontWeight: "medium",
98226
+ fontFamily: "heading",
98227
+ fontScale: "md"
98228
+ },
98229
+ hover: {
98230
+ backgroundColorToken: "primary/5",
98231
+ textColorToken: "primary"
98232
+ },
98233
+ openState: {
98234
+ backgroundColorToken: "primary/5",
98235
+ triggerColorToken: "primary"
98236
+ },
98237
+ content: { textColorToken: "neutral-700" }
98238
+ };
98239
+ /**
98240
+ * Bold bordered panel: a strong-bordered surface box, bold heading-font
98241
+ * questions, large plus/minus marks, and a high-emphasis tinted + accented
98242
+ * open state. For confident, conversion-led, high-energy styles.
98243
+ */
98244
+ const boldBorderedAccordionSystem = {
98245
+ background: {
98246
+ type: "solid",
98247
+ colorToken: "surface"
98248
+ },
98249
+ spacing: "comfortable",
98250
+ corners: "soft",
98251
+ border: {
98252
+ widthClass: "border-2",
98253
+ colorToken: "border"
98254
+ },
98255
+ shadow: null,
98256
+ icon: {
98257
+ style: "plus-minus",
98258
+ position: "right",
98259
+ size: "lg",
98260
+ colorToken: "primary"
98261
+ },
98262
+ trigger: {
98263
+ textColorToken: "text",
98264
+ fontWeight: "bold",
98265
+ fontFamily: "heading",
98266
+ fontScale: "md"
98267
+ },
98268
+ hover: {
98269
+ backgroundColorToken: "primary/10",
98270
+ textColorToken: "primary"
98271
+ },
98272
+ openState: {
98273
+ backgroundColorToken: "primary/10",
98274
+ triggerColorToken: "primary",
98275
+ accent: {
98276
+ edge: "left",
98277
+ colorToken: "primary",
98278
+ thickness: "thick"
98279
+ }
98280
+ },
98281
+ content: { textColorToken: "neutral-700" }
98282
+ };
98283
+ /**
98284
+ * Warm inset tiles: a tinted (surfaceAlt) root with rounded corners and no
98285
+ * border; the open row lifts to the lighter surface colour. Friendly,
98286
+ * hands-on, community styles.
98287
+ */
98288
+ const warmInsetAccordionSystem = {
98289
+ background: {
98290
+ type: "solid",
98291
+ colorToken: "surfaceAlt"
98292
+ },
98293
+ spacing: "comfortable",
98294
+ corners: "rounded",
98295
+ border: null,
98296
+ shadow: null,
98297
+ icon: {
98298
+ style: "circle-plus-minus",
98299
+ position: "right",
98300
+ size: "md",
98301
+ colorToken: "primary"
98302
+ },
98303
+ trigger: {
98304
+ textColorToken: "text",
98305
+ fontWeight: "semibold",
98306
+ fontFamily: "heading",
98307
+ fontScale: "md"
98308
+ },
98309
+ hover: {
98310
+ backgroundColorToken: "primary/5",
98311
+ textColorToken: "primary"
98312
+ },
98313
+ openState: {
98314
+ backgroundColorToken: "surface",
98315
+ triggerColorToken: "primary"
98316
+ },
98317
+ content: { textColorToken: "neutral-700" }
98318
+ };
98319
+ /**
98320
+ * Soft Earth's grounded look: boxless, plus/minus, heading-font questions on
98321
+ * a warm ground, with a quiet open recolour.
98322
+ */
98323
+ const softEarthAccordionSystem = {
98324
+ background: {
98325
+ type: "solid",
98326
+ colorToken: "background"
98327
+ },
98328
+ spacing: "comfortable",
98329
+ corners: "square",
98330
+ border: null,
98331
+ shadow: null,
98332
+ icon: {
98333
+ style: "plus-minus",
98334
+ position: "right",
98335
+ size: "md",
98336
+ colorToken: "primary"
98337
+ },
98338
+ trigger: {
98339
+ textColorToken: "text",
98340
+ fontWeight: "medium",
98341
+ fontFamily: "heading",
98342
+ fontScale: "md"
98343
+ },
98344
+ hover: { textColorToken: "primary" },
98345
+ openState: { triggerColorToken: "primary" },
98346
+ content: { textColorToken: "neutral-700" }
98347
+ };
98348
+ //#endregion
98349
+ //#region ../theme-core/src/cards/siteStyleDefaults.ts
98350
+ /**
98351
+ * Reusable card systems for curated site styles.
98352
+ *
98353
+ * generateCardCss emits a `.card-{id}` class per enabled variant. The
98354
+ * intended convention (block-level role selection is wired in a follow-up) is
98355
+ * a role pair:
98356
+ * - `default` — the quiet, everyday card (most blocks, most of the time)
98357
+ * - `alternative` — the prominent "statement" card for sections that pop
98358
+ * A card-heavy site style may add a third; the schema allows up to three
98359
+ * variants. The planned fallback when a block references a missing variant is
98360
+ * `alternative`, then `default`.
98361
+ *
98362
+ * Keep `default` close to the generated baseline so shared consumers (event
98363
+ * cards, testimonials) stay stable; put the personality in `alternative`.
98364
+ */
98365
+ /**
98366
+ * South West Twerk School: a quiet default surface card plus a high-impact
98367
+ * "statement" card that reproduces the legacy accent-quote testimonial surface
98368
+ * — burgundy fill, light text, a heavy gold left accent bar, and an expressive
98369
+ * asymmetric top-right corner.
98370
+ */
98371
+ const southWestCardSystem = { variants: [{
98372
+ id: "default",
98373
+ name: "Default",
98374
+ enabled: true,
98375
+ priority: 1,
98376
+ background: {
98377
+ type: "solid",
98378
+ colorToken: "surface"
98379
+ },
98380
+ foregroundToken: "text",
98381
+ spacing: "comfortable",
98382
+ corners: "soft",
98383
+ shadow: {
98384
+ elevation: "low",
98385
+ softness: "soft",
98386
+ position: "bottom"
98387
+ }
98388
+ }, {
98389
+ id: "alternative",
98390
+ name: "Statement",
98391
+ enabled: true,
98392
+ priority: 2,
98393
+ background: {
98394
+ type: "solid",
98395
+ colorToken: "primary-700"
98396
+ },
98397
+ foregroundToken: "primaryForeground",
98398
+ spacing: "comfortable",
98399
+ shadow: {
98400
+ elevation: "none",
98401
+ softness: null,
98402
+ position: "bottom"
98403
+ },
98404
+ accentEdge: {
98405
+ edge: "left",
98406
+ colorToken: "secondary",
98407
+ width: "heavy"
98408
+ },
98409
+ cornerRadii: {
98410
+ topLeft: "square",
98411
+ topRight: "expressive",
98412
+ bottomLeft: "square",
98413
+ bottomRight: "square"
98414
+ }
98415
+ }] };
98416
+ const clarityZenCardSystem = { variants: [{
98417
+ id: "default",
98418
+ name: "Default",
98419
+ enabled: true,
98420
+ priority: 1,
98421
+ background: {
98422
+ type: "solid",
98423
+ colorToken: "surface"
98424
+ },
98425
+ foregroundToken: "text",
98426
+ spacing: "comfortable",
98427
+ corners: "rounded",
98428
+ shadow: {
98429
+ elevation: "low",
98430
+ softness: "soft",
98431
+ position: "bottom"
98432
+ }
98433
+ }, {
98434
+ id: "alternative",
98435
+ name: "Statement",
98436
+ enabled: true,
98437
+ priority: 2,
98438
+ background: {
98439
+ type: "solid",
98440
+ colorToken: "surfaceAlt"
98441
+ },
98442
+ foregroundToken: "text",
98443
+ spacing: "comfortable",
98444
+ corners: "rounded",
98445
+ shadow: {
98446
+ elevation: "medium",
98447
+ softness: "soft",
98448
+ position: "bottom"
98449
+ }
98450
+ }] };
98451
+ /**
98452
+ * Original Joy: warm, flat, generously rounded cards on the dark clay ground.
98453
+ * `default` is a quiet brown surface card with cream text; `alternative` is a
98454
+ * burnt-orange statement card for sections that should pop. Both flat (the
98455
+ * look's depth comes from colour, not shadow), matching the bold editorial
98456
+ * feel. Shared by event and testimonial cards.
98457
+ */
98458
+ const originalJoyCardSystem = { variants: [{
98459
+ id: "default",
98460
+ name: "Default",
98461
+ enabled: true,
98462
+ priority: 1,
98463
+ background: {
98464
+ type: "solid",
98465
+ colorToken: "surface"
98466
+ },
98467
+ foregroundToken: "text",
98468
+ spacing: "comfortable",
98469
+ corners: "rounded",
98470
+ shadow: {
98471
+ elevation: "none",
98472
+ softness: null,
98473
+ position: "bottom"
98474
+ }
98475
+ }, {
98476
+ id: "alternative",
98477
+ name: "Statement",
98478
+ enabled: true,
98479
+ priority: 2,
98480
+ background: {
98481
+ type: "solid",
98482
+ colorToken: "primary"
98483
+ },
98484
+ foregroundToken: "primaryForeground",
98485
+ spacing: "comfortable",
98486
+ corners: "rounded",
98487
+ shadow: {
98488
+ elevation: "none",
98489
+ softness: null,
98490
+ position: "bottom"
98491
+ }
98492
+ }] };
98493
+ //#endregion
98494
+ //#region ../theme-core/src/site-styles/testimonialQuotePresets.ts
98495
+ /**
98496
+ * Reusable testimonial quote-mark treatments for curated site styles.
98497
+ *
98498
+ * The quote mark is brand identity the site style owns (analogous to the FAQ
98499
+ * accordion icon); every curated style declares one. `style` is the coarse
98500
+ * selector and the resolver in blocks/vars/testimonials.ts fills in the rest.
98501
+ */
98502
+ /** Large display quotation mark in the heading font. Editorial / calm styles. */
98503
+ const serifDisplayQuote = { style: "serif-display" };
98504
+ /** Punchy quotation mark in the secondary accent colour. Bold / accent styles. */
98505
+ const accentGlyphQuote = { style: "accent-glyph" };
98506
+ /**
98507
+ * Curated library of gradient presets.
98508
+ * All gradients use theme color tokens, so they adapt to the site's palette.
98509
+ */
98510
+ const GRADIENT_PRESETS = [
98352
98511
  {
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
98512
+ id: "primary-secondary",
98513
+ name: "Primary to Secondary",
98514
+ description: "Blend your primary and secondary brand colors",
98515
+ type: "linear",
98516
+ angle: 135,
98517
+ stops: [{
98518
+ color: "primary-500",
98519
+ position: 0
98520
+ }, {
98521
+ color: "secondary-500",
98522
+ position: 100
98523
+ }]
98365
98524
  },
98366
98525
  {
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
98526
+ id: "primary-accent",
98527
+ name: "Primary to Accent",
98528
+ description: "Energetic gradient from primary to accent",
98529
+ type: "linear",
98530
+ angle: 135,
98531
+ stops: [{
98532
+ color: "primary-500",
98533
+ position: 0
98534
+ }, {
98535
+ color: "accent-500",
98536
+ position: 100
98537
+ }]
98380
98538
  },
98381
98539
  {
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
98540
+ id: "secondary-accent",
98541
+ name: "Secondary to Accent",
98542
+ description: "Vibrant secondary to accent blend",
98543
+ type: "linear",
98544
+ angle: 135,
98545
+ stops: [{
98546
+ color: "secondary-500",
98547
+ position: 0
98548
+ }, {
98549
+ color: "accent-500",
98550
+ position: 100
98551
+ }]
98394
98552
  },
98395
98553
  {
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
98554
+ id: "primary-light-dark",
98555
+ name: "Primary Light to Dark",
98556
+ description: "Subtle primary color fade",
98557
+ type: "linear",
98558
+ angle: 180,
98559
+ stops: [{
98560
+ color: "primary-500",
98561
+ position: 0
98562
+ }, {
98563
+ color: "primary-900",
98564
+ position: 100
98565
+ }]
98409
98566
  },
98410
98567
  {
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
98568
+ id: "primary-dark-light",
98569
+ name: "Primary Dark to Light",
98570
+ description: "Reverse primary fade",
98571
+ type: "linear",
98572
+ angle: 180,
98573
+ stops: [{
98574
+ color: "primary-900",
98575
+ position: 0
98576
+ }, {
98577
+ color: "primary-50",
98578
+ position: 100
98579
+ }]
98424
98580
  },
98425
98581
  {
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
98582
+ id: "secondary-light-dark",
98583
+ name: "Secondary Light to Dark",
98584
+ description: "Subtle secondary color fade",
98585
+ type: "linear",
98586
+ angle: 180,
98587
+ stops: [{
98588
+ color: "secondary-500",
98589
+ position: 0
98590
+ }, {
98591
+ color: "secondary-900",
98592
+ position: 100
98593
+ }]
98439
98594
  },
98440
98595
  {
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
98596
+ id: "accent-light-dark",
98597
+ name: "Accent Light to Dark",
98598
+ description: "Accent color depth fade",
98599
+ type: "linear",
98600
+ angle: 180,
98601
+ stops: [{
98602
+ color: "accent-500",
98603
+ position: 0
98604
+ }, {
98605
+ color: "accent-900",
98606
+ position: 100
98607
+ }]
98453
98608
  },
98454
98609
  {
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
98610
+ id: "background-surface",
98611
+ name: "Background to Surface",
98612
+ description: "Subtle depth using base colors",
98613
+ type: "linear",
98614
+ angle: 180,
98615
+ stops: [{
98616
+ color: "background",
98617
+ position: 0
98618
+ }, {
98619
+ color: "surface",
98620
+ position: 100
98621
+ }]
98468
98622
  },
98469
98623
  {
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
98624
+ id: "neutral-fade",
98625
+ name: "Neutral Gradient",
98626
+ description: "Elegant neutral color fade",
98627
+ type: "linear",
98628
+ angle: 180,
98629
+ stops: [{
98630
+ color: "neutral-900",
98631
+ position: 0
98632
+ }, {
98633
+ color: "neutral-50",
98634
+ position: 100
98635
+ }]
98636
+ },
98637
+ {
98638
+ id: "primary-glow",
98639
+ name: "Primary glow",
98640
+ description: "A soft top-centred glow using your primary palette",
98641
+ type: "radial",
98642
+ shape: "ellipse",
98643
+ position: "top center",
98644
+ stops: [{
98645
+ color: "primary-900",
98646
+ position: 0
98647
+ }, {
98648
+ color: "primary-950",
98649
+ position: 100
98650
+ }],
98651
+ foreground: {
98652
+ textColor: "onPrimary900",
98653
+ headingColor: "onPrimary900",
98654
+ linkColor: "onPrimary900",
98655
+ supportingColor: "onPrimary900"
98656
+ }
98657
+ },
98658
+ {
98659
+ id: "accent-glow",
98660
+ name: "Accent glow",
98661
+ description: "A soft top-centred glow using your accent palette",
98662
+ type: "radial",
98663
+ shape: "ellipse",
98664
+ position: "top center",
98665
+ stops: [{
98666
+ color: "accent-900",
98667
+ position: 0
98668
+ }, {
98669
+ color: "accent-950",
98670
+ position: 100
98671
+ }],
98672
+ foreground: {
98673
+ textColor: "onAccent900",
98674
+ headingColor: "onAccent900",
98675
+ linkColor: "onAccent900",
98676
+ supportingColor: "onAccent900"
98677
+ }
98678
+ },
98679
+ {
98680
+ id: "primary-secondary-accent",
98681
+ name: "Brand Trio",
98682
+ description: "All three brand colors in harmony",
98683
+ type: "linear",
98684
+ angle: 135,
98685
+ stops: [
98686
+ {
98687
+ color: "primary-500",
98688
+ position: 0
98689
+ },
98690
+ {
98691
+ color: "secondary-500",
98692
+ position: 50
98693
+ },
98694
+ {
98695
+ color: "accent-500",
98696
+ position: 100
98697
+ }
98698
+ ]
98483
98699
  }
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;
98700
+ ].map((preset) => ({
98701
+ ...preset,
98702
+ id: preset.id,
98703
+ stops: preset.stops
98704
+ }));
98705
+ const GRADIENT_PRESET_IDS = GRADIENT_PRESETS.map((preset) => preset.id);
98706
+ const gradientPresetIdSet = new Set(GRADIENT_PRESET_IDS);
98707
+ const gradientPresetById = Object.fromEntries(GRADIENT_PRESETS.map((preset) => [preset.id, preset]));
98708
+ function parseGradientPresetId(value) {
98709
+ if (typeof value !== "string") return null;
98710
+ const normalized = value.trim();
98711
+ if (!gradientPresetIdSet.has(normalized)) return null;
98712
+ return normalized;
98498
98713
  }
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
- ];
98714
+ function getGradientPreset(id) {
98715
+ return gradientPresetById[id];
98509
98716
  }
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
- };
98717
+ //#endregion
98718
+ //#region ../theme-core/src/gradients/utils.ts
98719
+ /**
98720
+ * Convert a GradientConfig to a CSS gradient string
98721
+ *
98722
+ * @param config - The gradient configuration using theme tokens
98723
+ * @param tokens - Map of theme color tokens to hex values
98724
+ * @returns CSS gradient string (e.g., "linear-gradient(180deg, #3b82f6 0%, #f59e0b 100%)")
98725
+ */
98726
+ function gradientToCss(config, tokens) {
98727
+ const stops = config.stops.map((stop) => {
98728
+ return `${tokens[stop.color] ?? "#000000"} ${stop.position}%`;
98729
+ }).join(", ");
98730
+ const type = config.type ?? "linear";
98731
+ if (type === "radial") {
98732
+ const position = config.position ?? "center";
98733
+ return `radial-gradient(${config.shape ?? "circle"} at ${position}, ${stops})`;
98734
+ }
98735
+ if (type === "conic") {
98736
+ const position = config.position ?? "center";
98737
+ return `conic-gradient(from ${config.angle ?? 0}deg at ${position}, ${stops})`;
98738
+ }
98739
+ return `linear-gradient(${config.angle ?? 180}deg, ${stops})`;
98531
98740
  }
98532
98741
  //#endregion
98533
98742
  //#region ../theme-core/src/site-styles/footerLooks.ts
@@ -102594,38 +102803,109 @@ function canonicalHeaderSelectionInput(layoutId, styleId) {
102594
102803
  }
102595
102804
  };
102596
102805
  }
102597
- function applySiteChromeLooks({ theme, siteStyle, footerPresentation, headerLookId, headerLayoutId, headerStyleId, footerLookId, headerSelectionContext }) {
102806
+ function applySiteChromeLooks({ theme, siteStyle, compilationPlan }) {
102807
+ const headerDirective = compilationPlan.header;
102808
+ const headerResult = compileHeaderDirective({
102809
+ theme,
102810
+ siteStyle,
102811
+ directive: headerDirective
102812
+ });
102813
+ const footerResult = compilationPlan.kind === "replace-site-style" ? compileReplacementFooter({
102814
+ theme,
102815
+ siteStyle,
102816
+ footerLookId: compilationPlan.footerLookId,
102817
+ headerSelection: headerResult.headerCompilation.kind === "recompiled" ? headerResult.headerCompilation.result : headerResult.headerCompilation,
102818
+ brandPresentation: compilationPlan.header.brandPresentation
102819
+ }) : compileIncrementalFooter({
102820
+ theme,
102821
+ siteStyle,
102822
+ directive: compilationPlan.footer
102823
+ });
102824
+ return {
102825
+ theme: themeSchema.parse({
102826
+ ...theme,
102827
+ header: headerResult.header,
102828
+ footer: footerResult.footer
102829
+ }),
102830
+ headerCompilation: headerResult.headerCompilation,
102831
+ resolvedHeaderSelection: headerResult.resolvedHeaderSelection,
102832
+ footerCompilation: footerResult.footerCompilation,
102833
+ resolvedFooterLookId: footerResult.resolvedFooterLookId
102834
+ };
102835
+ }
102836
+ function compileHeaderDirective(input) {
102837
+ if (input.directive.kind === "preserve") return {
102838
+ header: input.directive.header,
102839
+ headerCompilation: {
102840
+ kind: "preserved",
102841
+ selection: input.directive.selection
102842
+ },
102843
+ resolvedHeaderSelection: input.directive.selection
102844
+ };
102845
+ const { headerLookId, headerLayoutId, headerStyleId } = input.directive.selection;
102598
102846
  const canonicalHeaderSelection = canonicalHeaderSelectionInput(headerLayoutId, headerStyleId);
102599
102847
  const headerSelection = resolveHeaderLook({
102600
- theme,
102601
- recommendedLookIds: headerLookId ? [headerLookId] : siteStyle.recommendedHeaderLookIds,
102602
- context: headerSelectionContext
102848
+ theme: input.theme,
102849
+ recommendedLookIds: headerLookId ? [headerLookId] : input.siteStyle.recommendedHeaderLookIds,
102850
+ context: input.directive.context
102603
102851
  });
102604
102852
  const headerLayoutStyleSelection = canonicalHeaderSelection.kind === "canonical" ? resolveHeaderLayoutStyleSelection({
102605
102853
  layoutId: canonicalHeaderSelection.selection.layoutId,
102606
102854
  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;
102855
+ }).selection : resolveLegacyHeaderLookAlias(headerSelection.selectedLookId) ?? input.siteStyle.defaultHeaderSelection;
102856
+ const header = canonicalHeaderSelection.kind === "canonical" ? compileHeaderLayoutStyleSelection(input.theme, headerLayoutStyleSelection) : headerSelection.header;
102857
+ const headerWithBrandPresentation = input.directive.brandPresentation.kind === "apply-logo-context" ? applyHeaderBrandPresentation(header, headerSelection.brandPresentation) : header;
102610
102858
  const resolvedHeaderLookId = canonicalHeaderSelection.kind === "canonical" ? findLegacyHeaderLookIdForSelection(headerLayoutStyleSelection) : headerSelection.selectedLookId;
102611
- const footerSelection = resolveFooterLook({
102612
- theme: footerPresentation === void 0 ? theme : {
102613
- ...theme,
102614
- footer: footerPresentation
102859
+ return {
102860
+ header: headerWithBrandPresentation,
102861
+ headerCompilation: {
102862
+ kind: "recompiled",
102863
+ result: headerSelection
102615
102864
  },
102616
- recommendedLookIds: footerLookId ? [footerLookId] : siteStyle.recommendedFooterLookIds
102865
+ resolvedHeaderSelection: {
102866
+ headerLookId: resolvedHeaderLookId,
102867
+ headerLayoutId: headerLayoutStyleSelection.layoutId,
102868
+ headerStyleId: headerLayoutStyleSelection.styleId
102869
+ }
102870
+ };
102871
+ }
102872
+ function compileReplacementFooter(input) {
102873
+ const result = resolveFooterLook({
102874
+ theme: input.theme,
102875
+ recommendedLookIds: input.footerLookId ? [input.footerLookId] : input.siteStyle.recommendedFooterLookIds
102617
102876
  });
102618
- const footerWithBrandPresentation = footerPresentation === void 0 && headerSelectionContext?.logo ? applyFooterBrandPresentation(footerSelection.footer, headerSelection.brandPresentation) : footerSelection.footer;
102619
102877
  return {
102620
- theme: themeSchema.parse({
102621
- ...theme,
102622
- header: headerWithBrandPresentation,
102623
- footer: footerWithBrandPresentation
102624
- }),
102625
- headerSelection,
102626
- headerLayoutStyleSelection,
102627
- resolvedHeaderLookId,
102628
- footerSelection
102878
+ footer: input.brandPresentation.kind === "apply-logo-context" && "brandPresentation" in input.headerSelection ? applyFooterBrandPresentation(result.footer, input.headerSelection.brandPresentation) : result.footer,
102879
+ footerCompilation: {
102880
+ kind: "applied-look",
102881
+ result
102882
+ },
102883
+ resolvedFooterLookId: result.selectedLookId
102884
+ };
102885
+ }
102886
+ function compileIncrementalFooter(input) {
102887
+ if (input.directive.kind === "preserve") return {
102888
+ footer: input.directive.footer,
102889
+ footerCompilation: {
102890
+ kind: "preserved",
102891
+ footerLookId: input.directive.footerLookId
102892
+ },
102893
+ resolvedFooterLookId: input.directive.footerLookId
102894
+ };
102895
+ const result = resolveFooterLook({
102896
+ theme: {
102897
+ ...input.theme,
102898
+ footer: input.directive.footer
102899
+ },
102900
+ recommendedLookIds: input.directive.footerLookId ? [input.directive.footerLookId] : input.siteStyle.recommendedFooterLookIds
102901
+ });
102902
+ return {
102903
+ footer: result.footer,
102904
+ footerCompilation: {
102905
+ kind: "applied-look",
102906
+ result
102907
+ },
102908
+ resolvedFooterLookId: result.selectedLookId
102629
102909
  };
102630
102910
  }
102631
102911
  function applyHeaderBrandPresentation(header, presentation) {
@@ -102664,17 +102944,8 @@ function footerLogoSizeFromBrandPresentation(size) {
102664
102944
  default: return size;
102665
102945
  }
102666
102946
  }
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
102947
  function compileSiteThemeFromSelections(input) {
102677
- const { siteStyle, buttonStyleSelection, typography, footerPresentation, headerLookId, headerLayoutId, headerStyleId, footerLookId, headerSelectionContext } = input;
102948
+ const { siteStyle, buttonStyleSelection, typography, compilationPlan } = input;
102678
102949
  const defaultButtonStyle = defaultButtonStyleSelectionForSiteStyle(siteStyle);
102679
102950
  const requestedButtonStyle = buttonStyleSelection ?? defaultButtonStyle;
102680
102951
  const acceptsRequestedButtonStyle = siteStyle.buttonStyleChoices.some((choice) => choice.styleId === requestedButtonStyle.styleId);
@@ -102691,30 +102962,19 @@ function compileSiteThemeFromSelections(input) {
102691
102962
  resolvedPalette: input.resolvedPalette
102692
102963
  }), siteStyle), typography ?? siteStyle.typography, siteStyle.heroTypography),
102693
102964
  siteStyle,
102694
- footerPresentation,
102695
- headerLookId,
102696
- headerLayoutId,
102697
- headerStyleId,
102698
- footerLookId,
102699
- headerSelectionContext
102965
+ compilationPlan
102700
102966
  });
102967
+ const requestedSelections = requestedSelectionsForPlan(compilationPlan);
102701
102968
  const commonResult = {
102702
102969
  theme: withSiteStyleMetadata(siteChromeResult.theme, siteStyle),
102703
- requestedSelections: {
102704
- headerLookId: headerLookId ?? null,
102705
- headerLayoutId: headerLayoutId ?? null,
102706
- headerStyleId: headerStyleId ?? null,
102707
- footerLookId: footerLookId ?? null
102708
- },
102970
+ requestedSelections,
102709
102971
  resolvedSelections: {
102710
102972
  buttonStyleSelection: resolvedButtonStyle,
102711
- headerLookId: siteChromeResult.resolvedHeaderLookId,
102712
- headerLayoutId: siteChromeResult.headerLayoutStyleSelection.layoutId,
102713
- headerStyleId: siteChromeResult.headerLayoutStyleSelection.styleId,
102714
- footerLookId: siteChromeResult.footerSelection.selectedLookId
102973
+ ...siteChromeResult.resolvedHeaderSelection,
102974
+ footerLookId: siteChromeResult.resolvedFooterLookId
102715
102975
  },
102716
- headerSelection: siteChromeResult.headerSelection,
102717
- footerSelection: siteChromeResult.footerSelection,
102976
+ headerCompilation: siteChromeResult.headerCompilation,
102977
+ footerCompilation: siteChromeResult.footerCompilation,
102718
102978
  warnings
102719
102979
  };
102720
102980
  return {
@@ -102725,6 +102985,16 @@ function compileSiteThemeFromSelections(input) {
102725
102985
  }
102726
102986
  };
102727
102987
  }
102988
+ function requestedSelectionsForPlan(plan) {
102989
+ if (plan.kind === "replace-site-style") return {
102990
+ ...plan.header.selection,
102991
+ footerLookId: plan.footerLookId
102992
+ };
102993
+ return {
102994
+ ...plan.header.selection,
102995
+ footerLookId: plan.footer.footerLookId
102996
+ };
102997
+ }
102728
102998
  function siteStyleIdFromTheme(theme) {
102729
102999
  const rawSiteStyleId = theme?.siteStyleId;
102730
103000
  if (!rawSiteStyleId) return null;
@@ -108755,7 +109025,7 @@ const shopModeSchema = z$1.enum([
108755
109025
  "cart",
108756
109026
  "checkout"
108757
109027
  ]);
108758
- const contentEntrySchema$2 = z$1.object({
109028
+ const contentEntrySchema = z$1.object({
108759
109029
  id: z$1.string().nullable().optional(),
108760
109030
  slug: z$1.string().nullable().optional()
108761
109031
  }).nullable();
@@ -108789,7 +109059,7 @@ const shopSourceSchema = z$1.object({
108789
109059
  checkoutButtonText: z$1.string().optional(),
108790
109060
  clearButtonText: z$1.string().optional(),
108791
109061
  submitButtonText: z$1.string().optional(),
108792
- contentEntry: contentEntrySchema$2.optional(),
109062
+ contentEntry: contentEntrySchema.optional(),
108793
109063
  passes: z$1.array(publicPassProductSchema).nullable().optional(),
108794
109064
  memberships: z$1.array(publicMembershipProductSchema).nullable().optional(),
108795
109065
  products: z$1.array(publicProductSchema).nullable().optional(),
@@ -109366,130 +109636,11 @@ const checkoutBlockDefinition = {
109366
109636
  runtime: checkoutBlockRuntime
109367
109637
  };
109368
109638
  //#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
- const unsupportedEventRegistrationPageSurfaceSubjectSchema = z$1.object({
109385
- kind: z$1.literal("unsupported"),
109386
- reason: z$1.enum([
109387
- "unsupportedSubject",
109388
- "invalidEventSeriesId",
109389
- "invalidEventOfferingId"
109390
- ])
109391
- });
109392
- const eventRegistrationPageSurfaceSubjectSchema = z$1.unknown().transform((value, ctx) => {
109393
- const unsupported = unsupportedEventRegistrationPageSurfaceSubjectSchema.safeParse(value);
109394
- if (unsupported.success) return unsupported.data;
109395
- const parsed = parseEventPageSurfaceSubject(value);
109396
- if (parsed.ok) return parsed.value;
109397
- ctx.addIssue({
109398
- code: z$1.ZodIssueCode.custom,
109399
- message: `Invalid event page-surface subject (${parsed.error.kind})`
109400
- });
109401
- return z$1.NEVER;
109402
- });
109403
- function parseEventRegistrationPageSurfaceSubject(value) {
109404
- return parseEventPageSurfaceSubject(value);
109405
- }
109406
- function normalizeEventRegistrationPageSurfaceSubject(value) {
109407
- const parsed = parseEventRegistrationPageSurfaceSubject(value);
109408
- if (parsed.ok) return parsed.value;
109409
- switch (parsed.error.kind) {
109410
- case "notObject": return null;
109411
- case "unsupportedSubject": return {
109412
- kind: "unsupported",
109413
- reason: "unsupportedSubject"
109414
- };
109415
- case "invalidEventSeriesId": return {
109416
- kind: "unsupported",
109417
- reason: "invalidEventSeriesId"
109418
- };
109419
- case "invalidEventOfferingId": return {
109420
- kind: "unsupported",
109421
- reason: "invalidEventOfferingId"
109422
- };
109423
- }
109424
- }
109425
- function resolveEventRegistrationScope(context) {
109426
- const occurrenceSeriesId = context.occurrenceContext?.seriesId;
109427
- if (occurrenceSeriesId) return {
109428
- kind: "occurrenceSeries",
109429
- seriesId: occurrenceSeriesId
109430
- };
109431
- if (context.subject?.kind === "eventSeries") return {
109432
- kind: "pageSurfaceSeries",
109433
- seriesId: context.subject.eventSeriesId
109434
- };
109435
- if (context.subject?.kind === "eventOffering") return {
109436
- kind: "pageSurfaceOffering",
109437
- offeringId: context.subject.eventOfferingId,
109438
- seriesIds: context.subject.availableEventSeriesIds
109439
- };
109440
- if (context.subject?.kind === "unsupported") return {
109441
- kind: "unsupportedPageSurfaceSubject",
109442
- reason: context.subject.reason
109443
- };
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
- return { kind: "unscoped" };
109451
- }
109452
- function applyEventRegistrationScope(events, scope) {
109453
- switch (scope.kind) {
109454
- case "occurrenceSeries":
109455
- case "pageSurfaceSeries": return events.filter((event) => event.seriesId === scope.seriesId);
109456
- case "pageSurfaceOffering": {
109457
- const seriesIds = new Set(scope.seriesIds);
109458
- return events.filter((event) => seriesIds.has(event.seriesId));
109459
- }
109460
- case "legacyEventSlug": return events.filter((event) => event.slug === scope.slug);
109461
- case "unsupportedPageSurfaceSubject": return [];
109462
- case "unscoped": return [...events];
109463
- }
109464
- }
109465
- function resolveEventRegistrationScopedEvents(events, context) {
109466
- return applyEventRegistrationScope(events, resolveEventRegistrationScope(context));
109467
- }
109468
- //#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,8 +119830,8 @@ const eventDetailsManifest = createBlockManifest({
119868
119830
  from: "$root.occurrenceContext",
119869
119831
  fallback: null
119870
119832
  } },
119871
- contentEntry: { $bind: {
119872
- from: "$root.contentEntry",
119833
+ subject: { $bind: {
119834
+ from: "$root.subject",
119873
119835
  fallback: null
119874
119836
  } },
119875
119837
  events: { $bind: { from: "data.eventDetailsData.events" } },
@@ -119945,7 +119907,6 @@ const eventDetailsBlockDefinition = {
119945
119907
  fallback: "published"
119946
119908
  } },
119947
119909
  limit: "25",
119948
- entryId: { $bind: { from: "$root.contentEntry._entryId" } },
119949
119910
  seriesId: { $bind: { from: "$root.occurrenceContext.seriesId" } },
119950
119911
  includeOccurrenceId: { $bind: { from: "$root.occurrenceContext.id" } }
119951
119912
  },
@@ -119990,15 +119951,6 @@ const courseDetailsBlockDefinition = {
119990
119951
  multiline: false,
119991
119952
  defaultValue: "Course details"
119992
119953
  },
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
119954
  {
120003
119955
  id: "showTitle",
120004
119956
  type: "boolean",
@@ -120097,23 +120049,11 @@ const courseDetailsBlockDefinition = {
120097
120049
  baseClass: "",
120098
120050
  spacing: "spacious",
120099
120051
  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
120052
  subject: { $bind: {
120109
120053
  from: "$root.subject",
120110
120054
  fallback: null
120111
120055
  } },
120112
120056
  courses: { $bind: { from: "data.courses" } },
120113
- courseSlug: { $bind: {
120114
- from: "content.courseSlug",
120115
- fallback: null
120116
- } },
120117
120057
  showTitle: { $bind: {
120118
120058
  from: "content.showTitle",
120119
120059
  fallback: false
@@ -120155,7 +120095,7 @@ const courseDetailsBlockDefinition = {
120155
120095
  }),
120156
120096
  dataSchemas: { courses: publicCoursesArraySchema.optional() },
120157
120097
  dataLoaders: { courses: {
120158
- endpoint: "listPublicCourses",
120098
+ endpoint: "listPublicWholeSeriesOfferings",
120159
120099
  params: {
120160
120100
  siteId: { $bind: { from: "$root.siteId" } },
120161
120101
  limit: "50",
@@ -120773,7 +120713,6 @@ const recurringScheduleBlockDefinition = {
120773
120713
  } },
120774
120714
  detailLevel: "listing",
120775
120715
  readProfile: "compact-list",
120776
- kind: "events",
120777
120716
  eventSurface: "custom",
120778
120717
  eventPresets: "class",
120779
120718
  scheduleScope: "any"
@@ -121091,7 +121030,7 @@ const offeringsPreviewBlockDefinition = {
121091
121030
  mode: "server"
121092
121031
  },
121093
121032
  courses: {
121094
- endpoint: "listPublicCourses",
121033
+ endpoint: "listPublicWholeSeriesOfferings",
121095
121034
  params: {
121096
121035
  siteId: { $bind: { from: "$root.siteId" } },
121097
121036
  limit: { $bind: {
@@ -121122,7 +121061,6 @@ function eventPresetLoader(preset) {
121122
121061
  } },
121123
121062
  detailLevel: "listing",
121124
121063
  readProfile: "listing-card",
121125
- kind: "events",
121126
121064
  eventPresets: preset
121127
121065
  },
121128
121066
  mode: "server"
@@ -141185,7 +141123,7 @@ const SUPPORTED_LOADER_ENDPOINTS = [
141185
141123
  "listPublicEvents",
141186
141124
  "listPublicRecurringSchedule",
141187
141125
  "getPublicEventDetails",
141188
- "listPublicCourses",
141126
+ "listPublicWholeSeriesOfferings",
141189
141127
  "listPublicRouteCandidates",
141190
141128
  "listPublicTeamMembers",
141191
141129
  "listPublicProducts",
@@ -146014,8 +145952,94 @@ const EVENT_ATTENDEE_REFUND_INVALID_CODES = ["manual_booking_not_refundable", ..
146014
145952
  [...EVENT_ATTENDEE_REFUND_INVALID_CODES, ...CANONICAL_ADMIN_REFUND_FAILURE_CODES];
146015
145953
  [...STANDARD_LINE_ITEM_REFUND_INVALID_CODES, ...CANONICAL_ADMIN_REFUND_FAILURE_CODES];
146016
145954
  //#endregion
146017
- //#region ../api/src/bookingVerticals.ts
146018
- const VERTICAL_IDS = [
145955
+ //#region ../api/src/bookingVerticalPreset.ts
145956
+ const BOOKING_ENGINE_BY_BEHAVIOUR = {
145957
+ class: "event_series",
145958
+ workshop: "event_series",
145959
+ course: "event_series",
145960
+ retreat: "event_series",
145961
+ performance: "event_series",
145962
+ appointment: "appointment_service"
145963
+ };
145964
+ function verticalBookingPreset(id, verticalId, canonicalBehaviour, label, pluralLabel, description, availability = "onboarding") {
145965
+ return {
145966
+ id,
145967
+ verticalId,
145968
+ canonicalBehaviour,
145969
+ engine: BOOKING_ENGINE_BY_BEHAVIOUR[canonicalBehaviour],
145970
+ availability,
145971
+ label,
145972
+ pluralLabel,
145973
+ description
145974
+ };
145975
+ }
145976
+ //#endregion
145977
+ //#region ../api/src/bookingVerticalCatalog.ts
145978
+ const VERTICAL_BOOKING_PRESETS = [
145979
+ verticalBookingPreset("yoga_wellness.classes", "yoga_wellness", "class", "Class", "Classes", "Regular scheduled classes and group sessions."),
145980
+ verticalBookingPreset("yoga_wellness.workshops", "yoga_wellness", "workshop", "Workshop", "Workshops", "One-off workshops, day retreats, or special sessions."),
145981
+ verticalBookingPreset("yoga_wellness.courses", "yoga_wellness", "course", "Course", "Courses", "Fixed-schedule courses or multi-session groups."),
145982
+ verticalBookingPreset("yoga_wellness.retreats", "yoga_wellness", "retreat", "Retreat", "Retreats", "Multi-day or residential retreats and immersive experiences."),
145983
+ verticalBookingPreset("yoga_wellness.appointments", "yoga_wellness", "appointment", "Appointment", "Appointments", "Private sessions, consultations, or one-to-one support."),
145984
+ verticalBookingPreset("fitness_pt.group_training", "fitness_pt", "class", "Group training", "Group training", "Regular scheduled classes and group sessions."),
145985
+ verticalBookingPreset("fitness_pt.personal_training", "fitness_pt", "appointment", "Personal training", "Personal training", "One-to-one sessions booked from your availability."),
145986
+ verticalBookingPreset("fitness_pt.programmes", "fitness_pt", "course", "Programme", "Programmes", "Multi-session programmes like bootcamps or courses."),
145987
+ verticalBookingPreset("fitness_pt.workshops", "fitness_pt", "workshop", "Workshop", "Workshops", "One-off workshops, events, or special sessions."),
145988
+ verticalBookingPreset("fitness_pt.retreats", "fitness_pt", "retreat", "Retreat", "Retreats", "Multi-day or residential fitness experiences."),
145989
+ verticalBookingPreset("dance_school.classes", "dance_school", "class", "Class", "Classes", "Regular group classes and weekly sessions."),
145990
+ verticalBookingPreset("dance_school.terms", "dance_school", "course", "Term", "Terms", "Multi-week term blocks or fixed-date course groups."),
145991
+ verticalBookingPreset("dance_school.courses", "dance_school", "course", "Course", "Courses", "Fixed-schedule courses or multi-session groups.", "settings"),
145992
+ verticalBookingPreset("dance_school.workshops", "dance_school", "workshop", "Workshop", "Workshops", "One-off workshops, masterclasses, or intensives."),
145993
+ verticalBookingPreset("dance_school.private_lessons", "dance_school", "appointment", "Private lesson", "Private lessons", "One-to-one lessons or coaching sessions."),
145994
+ verticalBookingPreset("dance_school.shows", "dance_school", "performance", "Show", "Shows", "Ticketed performances, showcases, and recitals."),
145995
+ verticalBookingPreset("physiotherapy_physical_health.appointments", "physiotherapy_physical_health", "appointment", "Appointment", "Appointments", "Assessments, treatments, follow-ups, and rehabilitation sessions."),
145996
+ verticalBookingPreset("physiotherapy_physical_health.rehab_classes", "physiotherapy_physical_health", "class", "Rehab class", "Rehab classes", "Regular rehabilitation, mobility, strength, or recovery classes."),
145997
+ verticalBookingPreset("physiotherapy_physical_health.workshops", "physiotherapy_physical_health", "workshop", "Workshop", "Workshops", "One-off workshops, talks, or practical group sessions."),
145998
+ verticalBookingPreset("massage_bodywork.treatments", "massage_bodywork", "appointment", "Treatment", "Treatments", "Massage treatments, bodywork sessions, and one-to-one appointments."),
145999
+ verticalBookingPreset("massage_bodywork.group_sessions", "massage_bodywork", "class", "Group session", "Group sessions", "Regular bodywork, somatic movement, or self-massage sessions."),
146000
+ verticalBookingPreset("massage_bodywork.workshops", "massage_bodywork", "workshop", "Workshop", "Workshops", "One-off bodywork, self-massage, or somatic practice workshops."),
146001
+ verticalBookingPreset("therapist_practitioner.appointments", "therapist_practitioner", "appointment", "Appointment", "Appointments", "Sessions, consultations, treatments, or assessments."),
146002
+ verticalBookingPreset("therapist_practitioner.workshops", "therapist_practitioner", "workshop", "Workshop", "Workshops", "One-off group workshops, talks, or wellbeing sessions."),
146003
+ verticalBookingPreset("therapist_practitioner.retreats", "therapist_practitioner", "retreat", "Retreat", "Retreats", "Multi-day retreats or immersive group experiences."),
146004
+ verticalBookingPreset("beauty_spa.appointments", "beauty_spa", "appointment", "Appointment", "Appointments", "Treatments, consultations, services, and sessions."),
146005
+ verticalBookingPreset("beauty_spa.workshops", "beauty_spa", "workshop", "Workshop", "Workshops", "Skincare workshops, makeup lessons, demos, or group events."),
146006
+ verticalBookingPreset("consultant_coach.appointments", "consultant_coach", "appointment", "Appointment", "Appointments", "One-to-one calls, consultations, reviews, or coaching sessions."),
146007
+ verticalBookingPreset("consultant_coach.workshops", "consultant_coach", "workshop", "Workshop", "Workshops", "One-off group sessions, webinars, or strategy days."),
146008
+ verticalBookingPreset("consultant_coach.courses", "consultant_coach", "course", "Course", "Courses", "Fixed-schedule cohorts or multi-session group programmes."),
146009
+ verticalBookingPreset("consultant_coach.retreats", "consultant_coach", "retreat", "Retreat", "Retreats", "Multi-day coaching retreats or immersive experiences."),
146010
+ verticalBookingPreset("training_provider.courses", "training_provider", "course", "Course", "Courses", "Fixed-schedule courses, cohorts, and multi-session training."),
146011
+ verticalBookingPreset("training_provider.workshops", "training_provider", "workshop", "Workshop", "Workshops", "One-off workshops, masterclasses, and short training sessions."),
146012
+ verticalBookingPreset("training_provider.appointments", "training_provider", "appointment", "Appointment", "Appointments", "Consultations, assessments, mentoring, or office hours."),
146013
+ verticalBookingPreset("training_provider.classes", "training_provider", "class", "Class", "Classes", "Regular classes, sessions, or groups.", "settings"),
146014
+ verticalBookingPreset("training_provider.residentials", "training_provider", "retreat", "Residential", "Residentials", "Residential courses or multi-day training experiences.", "settings"),
146015
+ verticalBookingPreset("retreat_centre.retreats", "retreat_centre", "retreat", "Retreat", "Retreats", "Multi-day or residential retreats with richer booking needs."),
146016
+ verticalBookingPreset("retreat_centre.workshops", "retreat_centre", "workshop", "Workshop", "Workshops", "One-day retreats, ceremonies, workshops, or special events."),
146017
+ verticalBookingPreset("retreat_centre.classes", "retreat_centre", "class", "Class", "Classes", "Regular sessions like guided meditations or group practices."),
146018
+ verticalBookingPreset("retreat_centre.courses", "retreat_centre", "course", "Course", "Courses", "Fixed-schedule programmes or multi-session experiences."),
146019
+ verticalBookingPreset("retreat_centre.appointments", "retreat_centre", "appointment", "Appointment", "Appointments", "Private sessions, therapies, consultations, or add-ons."),
146020
+ verticalBookingPreset("music_school.lessons", "music_school", "appointment", "Lesson", "Lessons", "One-to-one lessons, consultations, or coaching sessions."),
146021
+ verticalBookingPreset("music_school.classes", "music_school", "class", "Class", "Classes", "Regular group classes, ensembles, or recurring sessions."),
146022
+ verticalBookingPreset("music_school.terms", "music_school", "course", "Term", "Terms", "Multi-week term blocks or fixed-date group courses."),
146023
+ verticalBookingPreset("music_school.workshops", "music_school", "workshop", "Workshop", "Workshops", "One-off workshops, masterclasses, or intensives."),
146024
+ verticalBookingPreset("music_school.performances", "music_school", "performance", "Performance", "Performances", "Concerts, recitals, showcases, or ticketed performances."),
146025
+ verticalBookingPreset("voice_singing.lessons", "voice_singing", "appointment", "Voice session", "Voice sessions", "One-to-one singing lessons, voice coaching, or private practice sessions."),
146026
+ verticalBookingPreset("voice_singing.classes", "voice_singing", "class", "Ongoing weekly session", "Ongoing weekly sessions", "Regular choirs, voice circles, community singing, or group practice."),
146027
+ verticalBookingPreset("voice_singing.terms", "voice_singing", "course", "Singing term", "Singing terms", "Multi-week choir terms, voice courses, or fixed-date group programmes."),
146028
+ verticalBookingPreset("voice_singing.workshops", "voice_singing", "workshop", "Workshop", "Workshops", "One-off singing workshops, voice journeys, or devotional singing sessions."),
146029
+ verticalBookingPreset("voice_singing.performances", "voice_singing", "performance", "Performance", "Performances", "Choir concerts, sharing events, recitals, or community performances."),
146030
+ verticalBookingPreset("performing_arts_school.classes", "performing_arts_school", "class", "Class", "Classes", "Regular group classes, rehearsals, or weekly sessions."),
146031
+ verticalBookingPreset("performing_arts_school.terms", "performing_arts_school", "course", "Term", "Terms", "Multi-week term blocks or fixed-date course groups."),
146032
+ verticalBookingPreset("performing_arts_school.workshops", "performing_arts_school", "workshop", "Workshop", "Workshops", "One-off workshops, masterclasses, or intensives."),
146033
+ verticalBookingPreset("performing_arts_school.performances", "performing_arts_school", "performance", "Performance", "Performances", "Shows, showcases, productions, or ticketed performances."),
146034
+ verticalBookingPreset("performing_arts_school.lessons", "performing_arts_school", "appointment", "Lesson", "Lessons", "One-to-one lessons, coaching, or audition prep."),
146035
+ verticalBookingPreset("community_wellbeing.classes", "community_wellbeing", "class", "Class", "Classes", "Regular groups, sessions, practices, or weekly activities."),
146036
+ verticalBookingPreset("community_wellbeing.workshops", "community_wellbeing", "workshop", "Workshop", "Workshops", "One-off workshops, talks, events, or gatherings."),
146037
+ verticalBookingPreset("community_wellbeing.courses", "community_wellbeing", "course", "Course", "Courses", "Fixed-schedule courses, study groups, or multi-session programmes."),
146038
+ verticalBookingPreset("community_wellbeing.appointments", "community_wellbeing", "appointment", "Appointment", "Appointments", "One-to-one appointments, consultations, or support sessions."),
146039
+ verticalBookingPreset("community_wellbeing.retreats", "community_wellbeing", "retreat", "Retreat", "Retreats", "Multi-day or residential retreats."),
146040
+ verticalBookingPreset("venue_event_space.resource_hire", "venue_event_space", "appointment", "Hire slot", "Hire slots", "Future room, venue, and resource hire bookings.", "future")
146041
+ ];
146042
+ const VERTICAL_ID_SET = /* @__PURE__ */ new Set([
146019
146043
  "yoga_wellness",
146020
146044
  "fitness_pt",
146021
146045
  "dance_school",
@@ -146031,79 +146055,7 @@ const VERTICAL_IDS = [
146031
146055
  "performing_arts_school",
146032
146056
  "community_wellbeing",
146033
146057
  "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);
146058
+ ]);
146107
146059
  const VERTICAL_PRESET_ID_SET = new Set(VERTICAL_BOOKING_PRESETS.map((presetDefinition) => presetDefinition.id));
146108
146060
  function parseVerticalId(value) {
146109
146061
  return typeof value === "string" && VERTICAL_ID_SET.has(value) ? value : null;
@@ -146219,18 +146171,6 @@ const DEFAULT_SITE_VERTICAL_BOOKING_CONFIG = {
146219
146171
  verticalId: null,
146220
146172
  selectedPresetIds: []
146221
146173
  };
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
146174
  //#endregion
146235
146175
  //#region ../api/src/utils/isRecord.ts
146236
146176
  function isRecord$2(value) {
@@ -146387,10 +146327,9 @@ z$1.object({
146387
146327
  const BOOKING_QUESTION_ANSWER_EXPORT_SCOPES = {
146388
146328
  site: "site",
146389
146329
  appointments: "appointments",
146390
- eventSeries: "event_series",
146391
- course: "course"
146330
+ eventSeries: "event_series"
146392
146331
  };
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;
146332
+ BOOKING_QUESTION_ANSWER_EXPORT_SCOPES.site, BOOKING_QUESTION_ANSWER_EXPORT_SCOPES.appointments, BOOKING_QUESTION_ANSWER_EXPORT_SCOPES.eventSeries;
146394
146333
  //#endregion
146395
146334
  //#region ../api/src/siteBanner.ts
146396
146335
  const SITE_BANNER_SCOPE_VALUES = ["homepage", "all-pages"];
@@ -159285,12 +159224,6 @@ function optimisticHashForSave(revision) {
159285
159224
  }
159286
159225
  }
159287
159226
  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
159227
  /**
159295
159228
  * Hook to handle block autosave for pages.
159296
159229
  * Watches for pending block changes and debounces saves to the server.
@@ -159324,7 +159257,7 @@ function useBlockAutosave({ uiStore, apiClient, siteId, hasRoute, owner }) {
159324
159257
  });
159325
159258
  } else {
159326
159259
  const message = result.reason instanceof Error ? result.reason.message : "Failed to save block";
159327
- drafts.autosaveFailed(blockId, message, planBlockSaveFailureRecovery(result.reason, pending.revision));
159260
+ drafts.autosaveFailed(blockId, message);
159328
159261
  }
159329
159262
  });
159330
159263
  return results;
@@ -160400,58 +160333,6 @@ function cloneContentValues(value) {
160400
160333
  function cloneBlockValues(value) {
160401
160334
  return cloneBrandedValues(value, unsafeAsEditorBlockValues);
160402
160335
  }
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
160336
  function createSyncState(baseline, current) {
160456
160337
  return recordsEqual(baseline, current) ? BASELINE_SYNC_STATE : PENDING_SYNC_STATE;
160457
160338
  }
@@ -161103,7 +160984,7 @@ function applySystemOperation(snapshot, operation) {
161103
160984
  case "remove-draft-block": return removeDraftBlock(snapshot, operation.blockId);
161104
160985
  case "set-draft-published-baselines": return setDraftPublishedBaselines(snapshot, operation.blocks);
161105
160986
  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);
160987
+ case "autosave-draft-failed": return autosaveDraftFailed(snapshot, operation.blockId, operation.message);
161107
160988
  case "clear-draft-error": return clearDraftError(snapshot, operation.blockId);
161108
160989
  case "set-draft-pending": return setDraftPending(snapshot, operation.blockId);
161109
160990
  case "clear-draft-pending": return clearDraftPending(snapshot, operation.blockId);
@@ -161250,15 +161131,12 @@ function buildDraftSnapshotFromBaseline(blockId, baseline, meta, existing) {
161250
161131
  const hasPendingSave = existingSyncState?.kind === "pending";
161251
161132
  const failedSave = existingSyncState?.kind === "failed" ? existingSyncState : null;
161252
161133
  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);
161134
+ const shouldPreserveFailedSave = Boolean(failedSave);
161256
161135
  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);
161136
+ const nextCurrent = hasPendingSave ? existing?.current ?? null : shouldPreserveFailedSave ? existing?.current ?? null : cloneBlockValues(normalizedBaseline);
161258
161137
  const nextSyncState = hasPendingSave ? existingSyncState ?? BASELINE_SYNC_STATE : shouldPreserveFailedSave ? failedSave ?? {
161259
161138
  kind: "failed",
161260
- error: "Save failed",
161261
- recovery: { kind: "manualRetry" }
161139
+ error: "Save failed"
161262
161140
  } : createSyncState(nextBaseline, nextCurrent);
161263
161141
  return createDraftSnapshot(blockId, {
161264
161142
  version: existing?.version ?? 0,
@@ -161377,11 +161255,10 @@ function autosaveDraftSucceeded(snapshot, blockId, savedValues, acknowledgedVers
161377
161255
  }
161378
161256
  };
161379
161257
  }
161380
- function autosaveDraftFailed(snapshot, blockId, message, recovery = { kind: "manualRetry" }) {
161258
+ function autosaveDraftFailed(snapshot, blockId, message) {
161381
161259
  return nextDraftRecord(snapshot, blockId, (draft) => updateDraftSnapshot(draft, { syncState: {
161382
161260
  kind: "failed",
161383
- error: message ?? "Save failed",
161384
- recovery
161261
+ error: message ?? "Save failed"
161385
161262
  } }));
161386
161263
  }
161387
161264
  function clearDraftError(snapshot, blockId) {
@@ -162153,12 +162030,11 @@ function createEditorUiStore(options = {}) {
162153
162030
  optimisticHash: acknowledgement?.optimisticHash ?? currentSnapshot?.meta.optimisticHash ?? null
162154
162031
  })) notifyDraftChangeListeners(blockId);
162155
162032
  },
162156
- autosaveFailed: (blockId, message, recovery) => {
162033
+ autosaveFailed: (blockId, message) => {
162157
162034
  if (applySystemEditorOperation({
162158
162035
  type: "autosave-draft-failed",
162159
162036
  blockId,
162160
- message,
162161
- recovery
162037
+ message
162162
162038
  })) notifyDraftChangeListeners(blockId);
162163
162039
  },
162164
162040
  setAtPath: (blockId, path, value) => {
@@ -194067,6 +193943,13 @@ function usePreviewDesignCoordinator() {
194067
193943
  }
194068
193944
  //#endregion
194069
193945
  //#region ../preview-next/src/client/preview/siteStylePreviewPlanner.ts
193946
+ function deriveSiteStylePreviewUpdate(baseTheme, baseSelection) {
193947
+ return {
193948
+ kind: "derive-update",
193949
+ baseTheme,
193950
+ baseSelection
193951
+ };
193952
+ }
194070
193953
  function planSiteStylePreviewChange(input) {
194071
193954
  const resolvedPalette = resolvedPaletteForPreview(input.selection.palette, input.siteStyle);
194072
193955
  const compiled = compileSiteThemeFromSelections({
@@ -194074,15 +193957,15 @@ function planSiteStylePreviewChange(input) {
194074
193957
  buttonStyleSelection: input.selection.buttonStyleSelection,
194075
193958
  resolvedPalette,
194076
193959
  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
193960
+ compilationPlan: compilationPlanForPreview(input)
194082
193961
  });
194083
193962
  return {
194084
193963
  themeOverlay: compiled.theme,
194085
- resolvedSelections: compiled.resolvedSelections,
193964
+ resolvedSelections: {
193965
+ ...compiled.resolvedSelections,
193966
+ headerLayoutId: compiled.resolvedSelections.headerLayoutId ?? input.selection.headerLayoutId ?? input.siteStyle.defaultHeaderSelection.layoutId,
193967
+ headerStyleId: compiled.resolvedSelections.headerStyleId ?? input.selection.headerStyleId ?? input.siteStyle.defaultHeaderSelection.styleId
193968
+ },
194086
193969
  chromeSelection: {
194087
193970
  headerLookId: input.selection.headerLookId,
194088
193971
  footerLookId: input.selection.footerLookId
@@ -194090,6 +193973,65 @@ function planSiteStylePreviewChange(input) {
194090
193973
  warnings: compiled.warnings
194091
193974
  };
194092
193975
  }
193976
+ function compilationPlanForPreview(input) {
193977
+ const replacement = () => replaceSiteStyleCompilationPlan({
193978
+ headerLayoutId: input.selection.headerLayoutId,
193979
+ headerStyleId: input.selection.headerStyleId,
193980
+ headerLookId: input.selection.headerLookId,
193981
+ footerLookId: input.selection.footerLookId,
193982
+ headerSelectionContext: input.headerSelectionContext
193983
+ });
193984
+ if (input.compilation.kind === "replace-site-style") return replacement();
193985
+ const baseTheme = input.compilation.baseTheme;
193986
+ if (!baseTheme) return replacement();
193987
+ if (input.compilation.kind === "edit-chrome") return updateCompilationPlan({
193988
+ baseTheme,
193989
+ selection: input.selection,
193990
+ headerSelectionContext: input.headerSelectionContext,
193991
+ recompileHeader: input.compilation.surface === "header",
193992
+ applyFooterLook: input.compilation.surface === "footer"
193993
+ });
193994
+ if (input.compilation.baseSelection.siteStyleId !== input.selection.siteStyleId) return replacement();
193995
+ return updateCompilationPlan({
193996
+ baseTheme,
193997
+ selection: input.selection,
193998
+ headerSelectionContext: input.headerSelectionContext,
193999
+ recompileHeader: headerSelectionChanged(input.compilation.baseSelection, input.selection),
194000
+ applyFooterLook: input.compilation.baseSelection.footerLookId !== input.selection.footerLookId
194001
+ });
194002
+ }
194003
+ function updateCompilationPlan(input) {
194004
+ const selection = {
194005
+ headerLookId: input.selection.headerLookId,
194006
+ headerLayoutId: input.selection.headerLayoutId ?? null,
194007
+ headerStyleId: input.selection.headerStyleId ?? null
194008
+ };
194009
+ return {
194010
+ kind: "update-selection",
194011
+ header: input.recompileHeader ? {
194012
+ kind: "recompile",
194013
+ selection,
194014
+ context: completeHeaderSelectionContext(input.headerSelectionContext),
194015
+ brandPresentation: { kind: "apply-logo-context" }
194016
+ } : {
194017
+ kind: "preserve",
194018
+ header: input.baseTheme.header,
194019
+ selection
194020
+ },
194021
+ footer: input.applyFooterLook ? {
194022
+ kind: "apply-look",
194023
+ footer: input.baseTheme.footer,
194024
+ footerLookId: input.selection.footerLookId
194025
+ } : {
194026
+ kind: "preserve",
194027
+ footer: input.baseTheme.footer,
194028
+ footerLookId: input.selection.footerLookId
194029
+ }
194030
+ };
194031
+ }
194032
+ function headerSelectionChanged(base, previewed) {
194033
+ return base.headerLookId !== previewed.headerLookId || base.headerLayoutId !== previewed.headerLayoutId || base.headerStyleId !== previewed.headerStyleId;
194034
+ }
194093
194035
  function resolvedPaletteForPreview(palette, siteStyle) {
194094
194036
  if (palette.kind === "available") {
194095
194037
  const preview = completePaletteEditorPreview(palette.editor);
@@ -194146,11 +194088,13 @@ function buildSiteChromeLookModels(input) {
194146
194088
  siteStyle: input.siteStyle,
194147
194089
  buttonStyleSelection: selection.buttonStyleSelection,
194148
194090
  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
194091
+ compilationPlan: replaceSiteStyleCompilationPlan({
194092
+ headerLayoutId: selection.headerLayoutId,
194093
+ headerStyleId: selection.headerStyleId,
194094
+ headerLookId: selection.headerLookId,
194095
+ footerLookId: selection.footerLookId,
194096
+ headerSelectionContext: input.headerSelectionContext
194097
+ })
194154
194098
  });
194155
194099
  const renderedHeaderLayoutId = current.resolvedSelections.headerLayoutId;
194156
194100
  const renderedHeaderStyleId = current.resolvedSelections.headerStyleId;
@@ -194275,7 +194219,7 @@ function resolveStyleConfiguratorInitialSnapshot(input) {
194275
194219
  buttonStyleSelection: input.initialSelections.buttonStyleSelection,
194276
194220
  resolvedPalette: resolvedRuntimePalette?.ok ? resolvedRuntimePalette.resolved : resolvedPaletteForPreview(palette, siteStyle),
194277
194221
  typography: input.theme?.typography ?? siteStyle.typography,
194278
- ...sharedSelectionInputs(input)
194222
+ compilationPlan: replaceSiteStyleCompilationPlan(sharedSelectionInputs(input))
194279
194223
  });
194280
194224
  return {
194281
194225
  siteStyleId: siteStyle.id,
@@ -194301,10 +194245,7 @@ function sharedSelectionInputs(input) {
194301
194245
  }
194302
194246
  //#endregion
194303
194247
  //#region ../preview-next/src/client/preview/siteChromeBrandPreferences.ts
194304
- const DEFAULT_HEADER_BRAND_PREFERENCES = {
194305
- brandDisplay: "auto",
194306
- logoSize: "auto"
194307
- };
194248
+ const DEFAULT_HEADER_BRAND_PREFERENCES = defaultHeaderBrandPreferences;
194308
194249
  const HEADER_BRAND_DISPLAY_OPTIONS = [
194309
194250
  {
194310
194251
  value: "auto",
@@ -194382,10 +194323,7 @@ function createHeaderBrandControlStateFromPreferences({ preferences, headerSelec
194382
194323
  };
194383
194324
  }
194384
194325
  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
- };
194326
+ return headerBrandPreferencesFromTheme(theme);
194389
194327
  }
194390
194328
  function normalizeHeaderBrandPreferences(preferences, hasLogo) {
194391
194329
  if (hasLogo || preferences.brandDisplay !== "logo-only") return preferences;
@@ -194431,12 +194369,16 @@ function hasLogoInHeaderSelectionContext(context) {
194431
194369
  }
194432
194370
  //#endregion
194433
194371
  //#region ../preview-next/src/client/preview/siteChromeSavePlan.ts
194434
- function buildSiteChromeSavePlan({ surface, siteStyle, selection, baseTheme, headerSelectionContext, headerBrandPreferences, headerNavPreferences, backgroundPreferences, themeId, selectionId, baseSelectionUpdatedAt }) {
194372
+ function buildSiteChromeSavePlan({ surface, selectionPersistence, siteStyle, selection, baseTheme, headerSelectionContext, headerBrandPreferences, headerNavPreferences, backgroundPreferences, themeId, selectionId, baseSelectionUpdatedAt }) {
194435
194373
  const compiled = planSiteStylePreviewChange({
194436
194374
  siteStyle,
194437
194375
  selection,
194438
- baseTheme,
194439
- headerSelectionContext: withHeaderBrandPreferences(headerSelectionContext, headerBrandPreferences)
194376
+ headerSelectionContext: withHeaderBrandPreferences(headerSelectionContext, headerBrandPreferences),
194377
+ compilation: {
194378
+ kind: "edit-chrome",
194379
+ baseTheme,
194380
+ surface
194381
+ }
194440
194382
  });
194441
194383
  const themeOverlay = applySiteChromeBackgroundPreferences(withHeaderNavThemePreferences(withHeaderBrandThemePreferences(compiled.themeOverlay, headerBrandPreferences), headerNavPreferences), backgroundPreferences);
194442
194384
  return {
@@ -194445,8 +194387,10 @@ function buildSiteChromeSavePlan({ surface, siteStyle, selection, baseTheme, hea
194445
194387
  body: surface === "header" ? {
194446
194388
  surface,
194447
194389
  lookId: selection.headerLookId,
194448
- layoutId: selection.headerLayoutId,
194449
- styleId: selection.headerStyleId,
194390
+ ...selectionPersistence.kind === "write" ? {
194391
+ layoutId: selection.headerLayoutId,
194392
+ styleId: selection.headerStyleId
194393
+ } : {},
194450
194394
  theme: themeOverlay,
194451
194395
  themeId,
194452
194396
  selectionId,
@@ -194552,8 +194496,8 @@ function selectionSnapshotFromApplySiteStyleSelectionResponse(saved, fallback) {
194552
194496
  palette: paletteSnapshotFromApplyResponse(saved),
194553
194497
  typography: saved.theme.typography,
194554
194498
  headerLookId: saved.headerLookId,
194555
- headerLayoutId: saved.headerLayoutId,
194556
- headerStyleId: saved.headerStyleId,
194499
+ headerLayoutId: saved.headerLayoutId ?? fallback.headerLayoutId,
194500
+ headerStyleId: saved.headerStyleId ?? fallback.headerStyleId,
194557
194501
  footerLookId: saved.footerLookId
194558
194502
  };
194559
194503
  }
@@ -195403,6 +195347,7 @@ function SiteChromeCustomizeProvider({ children, siteId, apiClient, theme, theme
195403
195347
  };
195404
195348
  const savePlan = buildSiteChromeSavePlan({
195405
195349
  surface: request.kind === "selection" ? request.surface : "header",
195350
+ selectionPersistence: request.kind === "selection" ? { kind: "write" } : { kind: "preserve" },
195406
195351
  siteStyle,
195407
195352
  selection,
195408
195353
  baseTheme: currentThemeRef.current ?? theme,
@@ -195875,8 +195820,8 @@ function selectionSnapshotFromSiteChromeSaveResponse({ saved, fallback, savePlan
195875
195820
  palette: fallback.palette,
195876
195821
  typography: savePlan.themeOverlay.typography,
195877
195822
  headerLookId: saved.headerLookId ?? fallback.headerLookId,
195878
- headerLayoutId: saved.headerLayoutId ?? savePlan.compiled.resolvedSelections.headerLayoutId,
195879
- headerStyleId: saved.headerStyleId ?? savePlan.compiled.resolvedSelections.headerStyleId,
195823
+ headerLayoutId: saved.headerLayoutId ?? savePlan.compiled.resolvedSelections.headerLayoutId ?? fallback.headerLayoutId,
195824
+ headerStyleId: saved.headerStyleId ?? savePlan.compiled.resolvedSelections.headerStyleId ?? fallback.headerStyleId,
195880
195825
  footerLookId: saved.footerLookId ?? fallback.footerLookId
195881
195826
  };
195882
195827
  }
@@ -195906,4 +195851,4 @@ function useSiteChromeCustomizeOptional() {
195906
195851
  return useContext(SiteChromeCustomizeContext);
195907
195852
  }
195908
195853
  //#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 };
195854
+ export { beginAutosaveBatch as $, resolveRuntimeEventPricing as $a, toScheduledBookingDateTime as $c, buildPaletteLibraryReadModel as $i, layoutTransforms as $n, renderAudio as $o, reduceCommerceCart as $r, SearchInput as $s, redoHistory as $t, deriveStyleConfiguratorCapabilities as A, bindingSchema as Aa, createCollection as Ac, designRuntimeRulesForTheme 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, formatEventPrice as Ba, parseFooterModuleId as Bc, sectionTransitionFamilies as Bi, GripVertical as Bl, escapeStyleContent as Bn, ClockIcon as Bo, buildShopInteractiveIslandProps as Br, unmapValueFromSelect as Bs, BlockEditor as Bt, usePreviewThemeOverlay as C, buildEventRuntimeFilters as Ca, DropdownMenuContent as Cc, applyCompiledRuntimeFieldsToContent as Ci, Ticket as Cl, MediaEditorContextProvider as Cn, parseGeneratedIconSetId as Co, findPreSelectedEvent as Cr, pageDesignEditorBackgroundOverrideOwner as Cs, InlineTextField as Ct, committedPaletteForSnapshot as D, normalizeOptionalId as Da, DropdownMenuTrigger as Dc, planPageDesignLayoutLookCompatibility 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, normalizeCsvString as Ea, DropdownMenuSeparator as Ec, retargetCompiledRuntimeFieldsForContentAdjacency 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, normalizeLocationMapProps as Fa, Button$1 as Fc, GRADIENT_PRESETS as Fi, Monitor as Fl, containerResponsiveThemeCss as Fn, ArrowDownIcon as Fo, cartBlockDefinition as Fr, SdkConfigProvider as Fs, RichTextWidgetProvider as Ft, previewSitePalette as G, getContainerClass as Ga, formatBookingDateTime as Gc, BACKGROUND_BODY_TEXT_MIN_CONTRAST_RATIO as Gi, CircleMinus as Gl, siteFooterManifest as Gn, FileTextIcon as Go, formatCommercePrice as Gr, TooltipTrigger as Gs, classifyHistoryShortcut as Gt, previewFooterLook as H, formatEventTeacherLine as Ha, unsafeAsEditorBlockValues as Hc, sectionTransitionVariantForBoundaryOptionId as Hi, EllipsisVertical as Hl, generateDefaultAccordionSystem as Hn, FileArchiveIcon as Ho, buildCartDisplay as Hr, useField as Hs, prepareBlockEditorManifest as Ht, openRow as I, toLocationMapHydrationProps as Ia, cva as Ic, GRADIENT_PRESET_IDS as Ii, Minus as Il, createCustomBlockRegistry as In, ArrowRightIcon as Io, buildCartInteractiveIslandProps as Ir, useSdkConfig as Is, EditorProvider as It, resetTypographyToSaved as J, resolveEventLinkProps as Ja, formatLocalScheduleDate as Jc, foregroundTokenForBackgroundAppearanceColorToken as Ji, ChevronDown as Jl, SITE_OVERLAY_HEADER_CLEARANCE_CSS_VAR as Jn, ImagePresets as Jo, buildPassCartItem as Jr, SelectItem as Js, useOptionalEditorUiStoreInstance as Jt, previewSiteStyle as K, groupEventsByDate as Ka, formatBookingInstant as Kc, backgroundAppearanceColorTokenNames as Ki, ChevronRight as Kl, siteHeaderManifest as Kn, MinusIcon as Ko, formatInterval as Kr, Select$1 as Ks, useEditorUiStore as Kt, paletteMutationCapability as L, formatDate as La, useComposedRefs as Lc, getGradientPreset as Li, Maximize2 as Ll, buildThemeRuntime as Ln, ChevronDownIcon as Lo, buildCheckoutInteractiveIslandProps as Lr, hasEmptyOption as Ls, useEditor$1 as Lt, isPreviewingChange as M, eventCalendarListLayoutCompatibleDisplayModeValues as Ma, createContextScope as Mc, surfaceResolutionContextFromTheme 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, eventCalendarListLayoutOptions as Na, composeEventHandlers as Nc, findFooterLook as Ni, PenLine as Nl, isSupportedLoaderEndpoint as Nn, isBlockButtonRole as No, buildCourseRegistrationInteractiveIslandProps as Nr, getFieldIntent as Ns, useRichTextImagePicker as Nt, createPalette as O, el as Oa, useId$1 as Oc, componentRuntimeRulesForTheme as Oi, SlidersHorizontal as Ol, listEntryPageContentSlots as On, coerceInlineTextWithFallback as Oo, getStepNumber as Or, normalizeCardVariantRole as Os, ButtonWidgetProvider as Ot, markApplySaved as P, buildGoogleMapsDirectionsUrl as Pa, Primitive as Pc, gradientToCss as Pi, Palette as Pl, ThemeScope as Pn, getIconComponent as Po, checkoutBlockDefinition as Pr, isHeaderField as Ps, RichTextField as Pt, toggleRow as Q, getLocalMinuteOfDay as Qa, toBookingTimeZone as Qc, findCuratedPalette as Qi, mediaTransforms as Qn, getCurrentResolveImageUrlContext as Qo, productItemKey as Qr, CalloutDescription as Qs, pushHistoryEntry as Qt, palettePreviewProjection as R, formatEventCompactDateRail as Ra, cn$2 as Rc, parseGradientPresetId as Ri, LoaderCircle as Rl, DEFAULT_THEME_RESPONSIVE_MODE as Rn, CircleMinusIcon as Ro, buildProductDetailInteractiveIslandProps as Rr, mapCurrentValueForSelect as Rs, LinkField as Rt, PreviewThemeOverlayProvider as S, eventCollectionSourceSchemaShape as Sa, DropdownMenu as Sc, formatSiteChromeBackgroundTokenLabel as Si, TriangleAlert as Sl, MediaEditor as Sn, parseGeneratedIconAssetId as So, findEventByOccurrenceId as Sr, isThemeV2NormalEditorRawStyleFieldName as Ss, OfferingsPreviewWidgetProvider as St, applyTypographyDraftPatch as T, normalizeCsvIds as Ta, DropdownMenuLabel as Tc, retargetCompiledBoundaryRuntimeForContentAdjacency 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, formatTime as Ua, addLocalScheduleDays as Uc, getHeaderLayout as Ui, CreditCard as Ul, getBlockDefinition as Un, FileAudioIcon as Uo, buildProductCardDisplay as Ur, Tooltip as Us, stripTopLevelRoutingUi as Ut, previewCuratedPalette as V, formatEventPriceDisplay as Va, unsafeAsEditorBlockId as Vc, sectionTransitionFamilyForBoundaryOptionId as Vi, Eye as Vl, mergeContentWithBlockStyleOverrides as Vn, DownloadIcon as Vo, getShopDisplayForItems as Vr, FieldFrame as Vs, hideThemeV2RawStyleFields as Vt, previewHeaderStyle as W, getCardOrientation as Wa, formatBookingDate as Wc, getHeaderStyle as Wi, CirclePlus as Wl, projectRecurringSchedule as Wn, FileSpreadsheetIcon as Wo, buildProductDetailDisplay as Wr, TooltipContent as Ws, getBlockManifestFromSdkConfig as Wt, styleConfiguratorHistoryEntryForPersistedSelection as X, getEventAvailabilityStatus as Xa, parseBookingLocalDate as Xc, defaultThemeTokens as Xi, ArrowDown as Xl, visibleHeaderClearancePx as Xn, buildResolveImageUrlContext as Xo, deriveCommerceCheckoutState as Xr, SelectValue as Xs, canUndoHistory as Xt, setPaletteColors as Y, getEventAvailability as Ya, getBookingLocalDateKey as Yc, parseBackgroundAppearanceColorToken as Yi, Check as Yl, planSiteOverlayHeaderClearance as Yn, MediaPlaceholder as Yo, buildProductCartItem as Yr, SelectTrigger as Ys, canRedoHistory as Yt, syncStyleConfiguratorState as Z, getLocalDateKey as Za, resolveBookingTimeZoneId as Zc, curatedPalettes as Zi, __exportAll as Zl, contentTransforms as Zn, computeMediaTransformStyle as Zo, parseStoredCommerceCartState as Zr, Callout as Zs, createHistoryState as Zt, planSiteChromeLookSelection as _, buildEventCollectionDisplay as _a, Content$1 as _c, BACKGROUND_POSITION_PRESET_VALUES as _i, err as _l, createManifestFormAdapter as _n, resolveFeatureCardGeneratedIconSizePx as _o, formBlockDefinition as _r, parseThemeForPersistence as _s, createSiteOptionApiLoader as _t, previewDesignHistoryDomainForCommand as a, ctaButton as aa, TabsContent as ac, blogFeaturedPostFragment 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, eventCollectionDisplaySchemaShape as ba, createCollapsibleScope as bc, resolveSurfaceForegroundStyles 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_FAILED_MESSAGE as ca, Dialog as cc, formCopyFragment 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, normalizeOfferingsPreviewItemLimit as da, DialogFooter as dc, ctaCopyFragment as di, parseSiteId as dl, resolvePageRouteSlug as dn, markEditableSurfaceForwarding as do, eventListingBlockDefinition as dr, resolveButtonStyleSelection as ds, ContentFieldsForm as dt, paletteColorEntries as ea, Popover as ec, richTextFragment as ei, parseEventPageSurfaceSubject as el, undoHistory as en, normalizeEventRegistrationPageSurfaceSubject as eo, uiTransforms as er, renderVideo as es, confirmAutosaveBatch as et, PREVIEW_DESIGN_SAVE_ERROR_MESSAGE as f, resolveOfferingsPreviewCoursePath as fa, DialogHeader as fc, heroCtaRowFragment as fi, unsafeAsAppointmentResourceId as fl, resolveContentTitle as fn, splitPositioningClasses as fo, buildEventListingInteractiveIslandProps as fr, updateButtonStyleSelectionChoice as fs, useUISelector as ft, cycleableSiteChromeOptions as g, resolveSpacing as ga, CollapsibleTrigger as gc, defineFragment 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, isSemanticSpacing as ha, CollapsibleContent as hc, bodyCopyFragment as hi, unsafeAsFormId as hl, validateBlockManifestIssues as hn, mediaSchema as ho, buildEventCalendarListingDisplay as hr, parseThemeButtonVariantId as hs, useEntryController as ht, usePreviewDesignHistoryOrder as i, runTransforms as ia, Tabs as ic, faqHeadingFragment as ii, publicEventPricingType as il, useDebouncedLatestSave as in, createInteractiveIslandCodec as io, useImageResolveContextOptional as ir, setContextResolveImageUrlContext as is, rejectAutosaveBatch as it, dismissWarnings as j, previewStageSchema as ja, useControllableState as jc, getCuratedSiteStyle as ji, Plus as jl, deriveLaunchReadiness as jn, parseInlineTextFromUnknown as jo, buildGiftingInteractiveIslandProps as jr, rgbColorValue as js, ReferenceField as jt, createStyleConfiguratorState as k, when as ka, useDirection as kc, curatedSiteStyles 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_EVENT_PRESET_DEFINITIONS as la, DialogContent as lc, testimonialsCarouselFragment 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, resolveOfferingsPreviewGroups as ma, Collapsible as mc, heroCopyFragment 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, paletteColorsSchema as na, PopoverTrigger as nc, cardFragment as ni, publicEventPricingCurrency as nl, recordsEqual as nn, blockBookingPaymentTermsSchema as no, createManifestValidator as nr, resolveMediaNodeResponsiveImage as ns, enqueueTransaction as nt, selectPreviewDesignHistoryDomain as o, OFFERINGS_PREVIEW_DEFAULT_BUTTON_TEXT as oa, TabsList as oc, singleButtonFragment as oi, publicEventTicketTypes as ol, createSnapshotFromPageRecord as on, createZodCodec as oo, shopBlockDefinition as or, attachRenderableMediaAssetFields as os, resolvePreviewSidebarTab as ot, reportPreviewDesignError as p, resolveOfferingsPreviewGroupCta as pa, DialogTitle as pc, ctaRowFragment as pi, unsafeAsAppointmentServiceId as pl, PaletteProvider as pn, planSiteChromePlacement as po, eventCalendarBlockDefinition as pr, buttonStyleSelectionKey as ps, EditableBlockProvider as pt, reconcilePaletteLibraryActive as q, resolveEventCta as qa, formatBookingTime as qc, backgroundAppearanceQuickColorTokenNames as qi, ChevronLeft as ql, SITE_CHROME_VISIBLE_HEADER_SELECTOR as qn, PlusIcon as qo, EMPTY_COMMERCE_CART_STATE as qr, SelectContent as qs, useEditorUiStoreInstance as qt, PreviewDesignHistoryOrderProvider as r, createTransformRegistry as ra, Input as rc, faqAccordionFragment as ri, publicEventPricingMode as rl, useMultiAutosave as rn, buildInteractiveIslandProps as ro, ImageResolveContextProvider as rr, resolveMediaStorageUrl as rs, idleEditorTransactionQueueState as rt, buildApplySiteStyleSelectionBody as s, OFFERINGS_PREVIEW_DEFAULT_EMPTY_MESSAGE as sa, TabsTrigger as sc, formEmbedFragment 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, paletteColorsEqual as ta, PopoverContent as tc, headingFragment as ti, formatBookingPriceDisplay as tl, unsafeAsLinkedContentEntryId as tn, resolveEventRegistrationScopedEvents as to, formattingTransforms as tr, resolveImageUrlWithContext as ts, deriveTransactionCapabilities as tt, PREVIEW_DESIGN_LOAD_ERROR_MESSAGE as u, buildOfferingsPreviewRenderStates as ua, DialogDescription as uc, testimonialsHeadingFragment as ui, parseMediaAssetId as ul, deriveRouteMetadataPresentation as un, composeHeaderSectionWrapperClassName as uo, buildNewsletterFormInteractiveIslandProps as ur, findButtonStyleRecipe as us, PreviewTextEditor as ut, deriveSiteStylePreviewUpdate as v, buildEventCollectionHydration as va, Root$3 as vc, getAnchorClasses as vi, ok$1 as vl, createManifestValidation as vn, shouldReserveFeatureCardIconZone as vo, buildFormInteractiveIslandProps as vr, getTextColorForBackground as vs, createSiteOptionWidgetAdapters as vt, applyResolvedSelections as w, getEventRuntimeFiltersKey as wa, DropdownMenuItem as wc, compileEditorModelRuntime as wi, Tablet as wl, useMediaEditorOptional as wn, RichTextDocSchema as wo, resolveDiscountContext as wr, asDesignBlockId as ws, IconPickerField as wt, usePreviewDesignCoordinator as x, eventCollectionHydrationSchema as xa, Surface as xc, resolveBackgroundColorValue as xi, Undo2 as xl, createStoreBackend as xn, resolveBlockIconRenderValue as xo, toRegistrationEvents as xr, resolveTokenOrCssColorValue as xs, OfferingsPreviewGroupOrderField as xt, planSiteStylePreviewChange as y, buildEventCollectionListingDisplay as ya, Trigger$3 as yc, boxStylesTransforms as yi, X as yl, FormRenderer as yn, buildGeneratedBlockIconRenderAssetLookupFromUnknown as yo, eventRegistrationBlockDefinition as yr, isCssColorLiteral as ys, SiteOptionPickerField as yt, prepareStalePaletteRetry as z, formatEventDateParts as za, clsx as zc, defaultSectionTransitionVariantForFamily as zi, Image as zl, getResponsiveScopeSpec as zn, CirclePlusIcon as zo, buildProductListInteractiveIslandProps as zr, mapOptionValueForSelect as zs, LinkWidgetProvider as zt };