@riverbankcms/sdk 0.121.0 → 0.124.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (259) hide show
  1. package/README.md +14 -9
  2. package/dist/{PreviewEditorSidebar-lZ600tJx.mjs → PreviewEditorSidebar-DBmAJJkQ.mjs} +24 -41
  3. package/dist/{PreviewEditorUI-CTBWzLSb.mjs → PreviewEditorUI-CfGaz9cY.mjs} +3 -3
  4. package/dist/{PreviewQueryProvider-BHT8CJvZ.mjs → PreviewQueryProvider-BH-3-jSj.mjs} +1 -1
  5. package/dist/{SdkPreviewModeRuntime-DhPU58s7.mjs → SdkPreviewModeRuntime-BW9Z8j8T.mjs} +1020 -1234
  6. package/dist/{SiteChromeCustomizeContext-BkNvpzNZ.mjs → SiteChromeCustomizeContext-2z8moxYf.mjs} +1902 -1961
  7. package/dist/_dts/ai/src/contracts/proposals.d.ts +1236 -4152
  8. package/dist/_dts/api/src/appointmentEndpointDefinitions.d.ts +435 -0
  9. package/dist/_dts/api/src/bookingClosures.d.ts +3 -3
  10. package/dist/_dts/api/src/bookingConfig.d.ts +100 -75
  11. package/dist/_dts/api/src/bookingManagementEndpoints.d.ts +26 -35
  12. package/dist/_dts/api/src/bookingRecords.d.ts +4 -15
  13. package/dist/_dts/api/src/bookingVerticalCatalog.d.ts +746 -0
  14. package/dist/_dts/api/src/bookingVerticalPreset.d.ts +38 -0
  15. package/dist/_dts/api/src/bookingVerticals.d.ts +11 -652
  16. package/dist/_dts/api/src/bookings.d.ts +11 -9
  17. package/dist/_dts/api/src/cache-tags.d.ts +2 -2
  18. package/dist/_dts/api/src/commercePortalEndpoints.d.ts +10 -10
  19. package/dist/_dts/api/src/common/envelope.d.ts +2 -0
  20. package/dist/_dts/api/src/contentRuntime.d.ts +0 -17
  21. package/dist/_dts/api/src/courseEndpointDefinitions.d.ts +99 -0
  22. package/dist/_dts/api/src/courses.d.ts +22 -33
  23. package/dist/_dts/api/src/defineEndpointDefinitions.d.ts +14 -0
  24. package/dist/_dts/api/src/demoMutationPolicies.d.ts +4 -0
  25. package/dist/_dts/api/src/endpoints.d.ts +3740 -3733
  26. package/dist/_dts/api/src/event-destination-policy.d.ts +1 -1
  27. package/dist/_dts/api/src/event-presentation.d.ts +4 -9
  28. package/dist/_dts/api/src/index.d.ts +10 -12
  29. package/dist/_dts/api/src/newsletterEndpointDefinitions.d.ts +376 -0
  30. package/dist/_dts/api/src/participantMessaging.d.ts +2 -2
  31. package/dist/_dts/api/src/public/endpoints.d.ts +1 -1
  32. package/dist/_dts/api/src/publicExperience/commerceEndpoints.d.ts +272 -0
  33. package/dist/_dts/api/src/publicExperience/eventEndpoints.d.ts +274 -0
  34. package/dist/_dts/api/src/publicExperience/newsletterEndpoints.d.ts +31 -0
  35. package/dist/_dts/api/src/publicExperience/sharedTypes.d.ts +152 -0
  36. package/dist/_dts/api/src/publicExperience/siteEndpoints.d.ts +95 -0
  37. package/dist/_dts/api/src/publicExperience/wholeSeriesEndpoints.d.ts +154 -0
  38. package/dist/_dts/api/src/publicExperienceEndpoints.d.ts +10 -962
  39. package/dist/_dts/api/src/publicWholeSeriesEndpointDefinitions.d.ts +52 -0
  40. package/dist/_dts/api/src/sdkContracts.d.ts +0 -51
  41. package/dist/_dts/api/src/sdkEntryReadEndpoints.d.ts +23 -0
  42. package/dist/_dts/api/src/sitePlatformEndpoints.d.ts +1 -38
  43. package/dist/_dts/api/src/siteRuntimeEndpoints.d.ts +6 -7
  44. package/dist/_dts/blocks/src/PageRenderer.d.ts +4 -15
  45. package/dist/_dts/blocks/src/contracts/index.d.ts +1 -1
  46. package/dist/_dts/blocks/src/contracts/non-block-islands.d.ts +0 -16
  47. package/dist/_dts/blocks/src/contracts/proof-block-islands.d.ts +6 -222
  48. package/dist/_dts/blocks/src/portal/types.d.ts +3 -3
  49. package/dist/_dts/blocks/src/subroutes/fold.d.ts +1 -14
  50. package/dist/_dts/blocks/src/subroutes/index.d.ts +1 -1
  51. package/dist/_dts/blocks/src/subroutes/kinds.d.ts +3 -3
  52. package/dist/_dts/blocks/src/system/blocks/course-details.d.ts +0 -11
  53. package/dist/_dts/blocks/src/system/blocks/course-registration.d.ts +3 -4
  54. package/dist/_dts/blocks/src/system/blocks/courses/shared/pricing.d.ts +1 -1
  55. package/dist/_dts/blocks/src/system/blocks/courses/shared/schemas.d.ts +401 -12
  56. package/dist/_dts/blocks/src/system/blocks/courses/shared/types.d.ts +9 -10
  57. package/dist/_dts/blocks/src/system/blocks/events/event-calendar.d.ts +14 -13
  58. package/dist/_dts/blocks/src/system/blocks/events/event-listing.d.ts +1 -2
  59. package/dist/_dts/blocks/src/system/blocks/events/shared/filtering.d.ts +1 -4
  60. package/dist/_dts/blocks/src/system/blocks/events/shared/schemas.d.ts +19 -18
  61. package/dist/_dts/blocks/src/system/blocks/events/shared/types.d.ts +9 -11
  62. package/dist/_dts/blocks/src/system/blocks/offerings-preview/model.d.ts +2 -2
  63. package/dist/_dts/blocks/src/system/data/loaderEndpoints.d.ts +1 -1
  64. package/dist/_dts/blocks/src/system/runtime/api/client.d.ts +10 -10
  65. package/dist/_dts/blocks/src/system/runtime/api/endpoints.d.ts +10 -10
  66. package/dist/_dts/blocks/src/system/runtime/api/index.d.ts +1 -1
  67. package/dist/_dts/blocks/src/system/runtime/api/types/appointments.d.ts +162 -0
  68. package/dist/_dts/blocks/src/system/runtime/api/types/core.d.ts +59 -0
  69. package/dist/_dts/blocks/src/system/runtime/api/types/courses.d.ts +134 -0
  70. package/dist/_dts/blocks/src/system/runtime/api/types/discounts.d.ts +85 -0
  71. package/dist/_dts/blocks/src/system/runtime/api/types/events.d.ts +241 -0
  72. package/dist/_dts/blocks/src/system/runtime/api/types/forms.d.ts +53 -0
  73. package/dist/_dts/blocks/src/system/runtime/api/types/newsletter.d.ts +32 -0
  74. package/dist/_dts/blocks/src/system/runtime/api/types/portal.d.ts +220 -0
  75. package/dist/_dts/blocks/src/system/runtime/api/types/shop.d.ts +176 -0
  76. package/dist/_dts/blocks/src/system/runtime/api/types.d.ts +12 -1121
  77. package/dist/_dts/blocks/src/system/runtime/components/registry.client.d.ts +19 -583
  78. package/dist/_dts/blocks/src/system/runtime/components/runtime-backed-blocks.d.ts +9 -276
  79. package/dist/_dts/blocks/src/system/runtime/hooks/useEventFilters.d.ts +1 -12
  80. package/dist/_dts/blocks/src/system/runtime/hooks/useHeadlessEventRegistrationFlow.d.ts +0 -1
  81. package/dist/_dts/blocks/src/system/runtime/hooks/useHeadlessWholeSeriesRegistrationFlow.d.ts +0 -1
  82. package/dist/_dts/blocks/src/system/runtime/nodes/booking-runtime-sources.d.ts +2 -3
  83. package/dist/_dts/blocks/src/system/runtime/nodes/course-details/logic.d.ts +1 -18
  84. package/dist/_dts/blocks/src/system/runtime/nodes/course-details/runs.d.ts +0 -2
  85. package/dist/_dts/blocks/src/system/runtime/nodes/course-details.server.d.ts +1 -5
  86. package/dist/_dts/blocks/src/system/runtime/nodes/course-registration/courseRegistrationViewState.d.ts +21 -0
  87. package/dist/_dts/blocks/src/system/runtime/nodes/course-registration/index.d.ts +1 -1
  88. package/dist/_dts/blocks/src/system/runtime/nodes/course-registration/pricing.d.ts +14 -0
  89. package/dist/_dts/blocks/src/system/runtime/nodes/course-registration/types.d.ts +0 -25
  90. package/dist/_dts/blocks/src/system/runtime/nodes/course-registration/useCourseEligibility.d.ts +24 -0
  91. package/dist/_dts/blocks/src/system/runtime/nodes/course-registration/useCoursePaymentVerification.d.ts +9 -0
  92. package/dist/_dts/blocks/src/system/runtime/nodes/course-registration/useCourseRegistrationActions.d.ts +35 -0
  93. package/dist/_dts/blocks/src/system/runtime/nodes/course-registration/useCourseRegistrationPortal.d.ts +7 -0
  94. package/dist/_dts/blocks/src/system/runtime/nodes/course-registration/useCourseRegistrationSelection.d.ts +31 -0
  95. package/dist/_dts/blocks/src/system/runtime/nodes/course-registration/useCourseRegistrationWizard.d.ts +80 -55
  96. package/dist/_dts/blocks/src/system/runtime/nodes/course-registration/useCourseWaitlistSelection.d.ts +14 -0
  97. package/dist/_dts/blocks/src/system/runtime/nodes/course-registration/whole-series-registration.headless.contract.d.ts +4 -5
  98. package/dist/_dts/blocks/src/system/runtime/nodes/course-registration.interactive.d.ts +0 -38
  99. package/dist/_dts/blocks/src/system/runtime/nodes/course-registration.server.d.ts +1 -1
  100. package/dist/_dts/blocks/src/system/runtime/nodes/event-details.client.d.ts +1 -2
  101. package/dist/_dts/blocks/src/system/runtime/nodes/event-details.server.d.ts +0 -1
  102. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/EventRegistrationWizardActions.d.ts +12 -0
  103. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/event-registration.headless.contract.d.ts +0 -4
  104. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/eventScope.d.ts +0 -9
  105. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/types.d.ts +0 -5
  106. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/useEventRegistrationWizard.d.ts +0 -11
  107. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/utils.d.ts +13 -0
  108. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration.interactive.d.ts +0 -21
  109. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration.server.d.ts +1 -1
  110. package/dist/_dts/blocks/src/system/runtime/nodes/events/EventCalendar.interactive.d.ts +24 -433
  111. package/dist/_dts/blocks/src/system/runtime/nodes/events/EventCombined.client.d.ts +1 -2
  112. package/dist/_dts/blocks/src/system/runtime/nodes/events/EventCombined.interactive.d.ts +52 -266
  113. package/dist/_dts/blocks/src/system/runtime/nodes/events/EventListing.interactive.d.ts +5 -15
  114. package/dist/_dts/blocks/src/system/runtime/nodes/events/shared/EventFilters.d.ts +0 -8
  115. package/dist/_dts/blocks/src/system/runtime/nodes/events/shared/eventCollectionContract.d.ts +1573 -0
  116. package/dist/_dts/blocks/src/system/runtime/nodes/events/shared/listOptions.d.ts +1 -3
  117. package/dist/_dts/content-editor/src/ui/editorSnapshot.d.ts +2 -3
  118. package/dist/_dts/content-editor/src/ui/editorUiStore.d.ts +2 -2
  119. package/dist/_dts/content-model/src/content-types/builtin-schemas.d.ts +0 -5
  120. package/dist/_dts/content-model/src/content-types/builtins.d.ts +0 -5
  121. package/dist/_dts/content-model/src/templates/defaults.d.ts +6 -3
  122. package/dist/_dts/core/src/editor-state.d.ts +1 -13
  123. package/dist/_dts/db/src/generated/supabase/database.types.d.ts +1587 -115
  124. package/dist/_dts/preview-next/src/client/preview/siteChromeBrandPreferences.d.ts +6 -6
  125. package/dist/_dts/preview-next/src/client/preview/siteChromeSavePlan.d.ts +6 -1
  126. package/dist/_dts/preview-next/src/client/preview/siteStylePreviewPlanner.d.ts +27 -4
  127. package/dist/_dts/sdk/src/cli/commands/audit.d.ts +1 -2
  128. package/dist/_dts/sdk/src/cli/commands/pull-dated-offering-scope.d.ts +1 -1
  129. package/dist/_dts/sdk/src/cli/commands/pull-dry-run.d.ts +4 -6
  130. package/dist/_dts/sdk/src/cli/commands/push/consts.d.ts +1 -1
  131. package/dist/_dts/sdk/src/cli/commands/push/options.d.ts +1 -1
  132. package/dist/_dts/sdk/src/cli/commands/push/pushAllExtras.d.ts +0 -1
  133. package/dist/_dts/sdk/src/cli/commands/push/verification.d.ts +1 -1
  134. package/dist/_dts/sdk/src/cli/content/collectionWriters.d.ts +23 -0
  135. package/dist/_dts/sdk/src/cli/content/metadataAfterPush.d.ts +25 -0
  136. package/dist/_dts/sdk/src/cli/content/reader.d.ts +0 -52
  137. package/dist/_dts/sdk/src/cli/content/writer.d.ts +3 -81
  138. package/dist/_dts/sdk/src/cli/site-commands/datedOfferingCommands.d.ts +6 -9
  139. package/dist/_dts/sdk/src/client/contentReadOperations.d.ts +40 -0
  140. package/dist/_dts/sdk/src/client/management/index.d.ts +1 -3
  141. package/dist/_dts/sdk/src/client/management/types.d.ts +3 -91
  142. package/dist/_dts/sdk/src/client/runtimeCacheKeys.d.ts +72 -0
  143. package/dist/_dts/sdk/src/client/runtimeCachePolicy.d.ts +10 -75
  144. package/dist/_dts/sdk/src/client/types.d.ts +7 -33
  145. package/dist/_dts/sdk/src/components.d.ts +1 -1
  146. package/dist/_dts/sdk/src/config/types.d.ts +1 -1
  147. package/dist/_dts/sdk/src/config/validation.d.ts +3 -6
  148. package/dist/_dts/sdk/src/contracts/index.d.ts +1 -1
  149. package/dist/_dts/sdk/src/contracts/page.d.ts +0 -8
  150. package/dist/_dts/sdk/src/contracts/system-block-content.d.ts +1 -34
  151. package/dist/_dts/sdk/src/data/prefetchBlockData.d.ts +4 -3
  152. package/dist/_dts/sdk/src/next/catch-all-utils.d.ts +0 -11
  153. package/dist/_dts/sdk/src/next/catch-all.d.ts +1 -76
  154. package/dist/_dts/sdk/src/next/types.d.ts +0 -19
  155. package/dist/_dts/sdk/src/public-api/contracts.d.ts +7 -207
  156. package/dist/_dts/sdk/src/public-api/runtime.d.ts +1 -1
  157. package/dist/_dts/sdk/src/rendering/blocks-page-renderer.d.ts +2 -1
  158. package/dist/_dts/sdk/src/rendering/components/pageShared.d.ts +2 -2
  159. package/dist/_dts/sdk/src/rendering/helpers/loadContent.d.ts +0 -7
  160. package/dist/_dts/sdk/src/rendering/helpers/templateContent.d.ts +81 -0
  161. package/dist/_dts/sdk/src/rendering/index.d.ts +1 -1
  162. package/dist/_dts/sdk/src/rendering/islands/types.d.ts +1 -51
  163. package/dist/_dts/sdk/src/rendering/overrides.d.ts +2 -1
  164. package/dist/_dts/sdk/src/routing/entrySubroutes.d.ts +6 -6
  165. package/dist/_dts/sdk/src/routing/index.d.ts +0 -2
  166. package/dist/_dts/sdk/src/routing/resolveOccurrence.d.ts +3 -3
  167. package/dist/_dts/sdk/src/routing/resolvePageContent.d.ts +10 -39
  168. package/dist/_dts/sdk/src/types/block-kinds.d.ts +1 -1
  169. package/dist/_dts/sdk/src/version.d.ts +1 -1
  170. package/dist/_dts/site-commands/src/adapter.d.ts +1 -1
  171. package/dist/_dts/site-commands/src/appointmentCommandSchemas.d.ts +100 -0
  172. package/dist/_dts/site-commands/src/capabilityGaps.d.ts +2 -2
  173. package/dist/_dts/site-commands/src/commandContract.d.ts +1242 -0
  174. package/dist/_dts/site-commands/src/commandDomain.d.ts +20 -0
  175. package/dist/_dts/site-commands/src/commandIdentifiers.d.ts +7 -0
  176. package/dist/_dts/site-commands/src/commandValidation.d.ts +10 -0
  177. package/dist/_dts/site-commands/src/commands.d.ts +729 -2659
  178. package/dist/_dts/site-commands/src/domain.d.ts +1 -1
  179. package/dist/_dts/site-commands/src/eventCommandContent.d.ts +11 -0
  180. package/dist/_dts/site-commands/src/exposure.d.ts +1 -1
  181. package/dist/_dts/site-commands/src/index.d.ts +6 -0
  182. package/dist/_dts/site-commands/src/metadata.d.ts +1 -27
  183. package/dist/_dts/site-commands/src/planner.d.ts +1 -1
  184. package/dist/_dts/site-commands/src/refContributions.d.ts +1 -1
  185. package/dist/_dts/site-commands/src/refs.d.ts +1 -4
  186. package/dist/_dts/site-commands/src/siteStyleCommandSchema.d.ts +378 -0
  187. package/dist/_dts/site-commands/src/siteStyleSelectionSchemaBuilder.d.ts +46 -0
  188. package/dist/_dts/site-commands/src/staticExecutionGaps.d.ts +2 -2
  189. package/dist/_dts/site-commands/src/venueCommandMapping.d.ts +21 -0
  190. package/dist/_dts/theme-core/src/site-styles/compilationPlan.d.ts +58 -0
  191. package/dist/_dts/theme-core/src/site-styles/headerLooks.d.ts +1 -0
  192. package/dist/_dts/theme-core/src/site-styles/index.d.ts +1 -0
  193. package/dist/_dts/theme-core/src/site-styles/previewCompiler.d.ts +47 -24
  194. package/dist/cli/index.mjs +7392 -10989
  195. package/dist/cli/init-docs/content/cli-reference.md +5 -21
  196. package/dist/cli/init-docs/content/content-management.md +4 -5
  197. package/dist/client/{DiscountCodeDisclosure-DIWj-P9v.mjs → DiscountCodeDisclosure-DxvjKvck.mjs} +2 -2
  198. package/dist/client/{EventCombined.client-De8YWBSr.mjs → EventCombined.client-BydMGc4c.mjs} +5 -16
  199. package/dist/client/{EventListing.client-seHTjimY.mjs → EventListing.client-vpzhhysN.mjs} +3 -10
  200. package/dist/client/{LeafletStaticMap-BmQxFcJW.mjs → LeafletStaticMap-CB07rpf8.mjs} +1 -1
  201. package/dist/client/{MagicLinkForm-OoJAIUIj.mjs → MagicLinkForm-BzyRJ8VF.mjs} +2 -2
  202. package/dist/client/{StepIndicator-CiZ8kdPk.mjs → StepIndicator-CTcGf8Be.mjs} +2 -2
  203. package/dist/client/{accordion-6lnN__XJ.mjs → accordion-B-DUDLRD.mjs} +1 -1
  204. package/dist/client/{bookingForm-5uyqhONU.mjs → bookingForm-DSbClLcZ.mjs} +6 -6
  205. package/dist/client/bookings.mjs +753 -818
  206. package/dist/client/{carousel-Dtnifil_.mjs → carousel-B6Ccdx8M.mjs} +1 -1
  207. package/dist/client/{cart-5Tc5S7NV.mjs → cart-BZh8G8wM.mjs} +3 -3
  208. package/dist/client/{checkout-CYKKN5Hr.mjs → checkout-o6zaC-kM.mjs} +3 -3
  209. package/dist/client/client.mjs +7398 -7687
  210. package/dist/client/{context-BGZNlGXB.mjs → context-CJz1Vlsz.mjs} +40 -43
  211. package/dist/client/{courseRegistration-CxCBybB4.mjs → courseRegistration-Cf11pNDs.mjs} +606 -621
  212. package/dist/client/{eventCalendar-Xj2jZS9X.mjs → eventCalendar-BeXrdsSE.mjs} +5 -13
  213. package/dist/client/{eventCombined-CgcMoOgM.mjs → eventCombined-DA76PZgG.mjs} +3 -3
  214. package/dist/client/{eventDetails-CEAH8Edc.mjs → eventDetails-BLxg0rok.mjs} +140 -116
  215. package/dist/client/{eventListing-qyPVQ0wP.mjs → eventListing-tO9LheBX.mjs} +3 -3
  216. package/dist/client/{eventRegistration-DDu79CtL.mjs → eventRegistration-Cnene9D9.mjs} +165 -68
  217. package/dist/client/{form-Bc7JKI7I.mjs → form-DZf72CHB.mjs} +2 -2
  218. package/dist/client/{headerSection-vTku_LEl.mjs → headerSection-Hioja5Cr.mjs} +2 -2
  219. package/dist/client/hooks.mjs +3452 -2365
  220. package/dist/client/{locationMap-Bg7X4Jna.mjs → locationMap-DwhUXEix.mjs} +2 -2
  221. package/dist/client/{newsletterForm-lpylVdp5.mjs → newsletterForm-C350bEQf.mjs} +2 -2
  222. package/dist/client/{pricing-DE8fjJiT.mjs → pricing-BYWN_ATa.mjs} +3 -19
  223. package/dist/client/{productDetail-D7Bo2RMH.mjs → productDetail-CCqCyXgU.mjs} +3 -3
  224. package/dist/client/{productList-VjnZqiqN.mjs → productList-BAiNJrOU.mjs} +3 -3
  225. package/dist/client/{propsDecoder-DreFXjNP.mjs → propsDecoder-DeunRj6m.mjs} +210 -378
  226. package/dist/client/rendering/client.mjs +2541 -2813
  227. package/dist/client/rendering/islands.mjs +18 -18
  228. package/dist/client/rendering.mjs +5622 -4734
  229. package/dist/client/{shop-IRsHHbf7.mjs → shop-DUmCdBtw.mjs} +6 -6
  230. package/dist/client/{shop-commerce-gnI8PieZ.mjs → shop-commerce-CY27mEUr.mjs} +5 -5
  231. package/dist/client/{shop-commerce-store-BTbrhObn.mjs → shop-commerce-store-ChXPbWfa.mjs} +1 -1
  232. package/dist/client/{shopShared-D6KS2_qk.mjs → shopShared-q0kin1cv.mjs} +3 -3
  233. package/dist/client/{useDiscountCodeUi-DCccGCxV.mjs → useDiscountCodeUi-I-92-x2V.mjs} +2 -2
  234. package/dist/client/{useEventFilters-eGs3rPZQ.mjs → useEventFilters-DlcVluZh.mjs} +59 -124
  235. package/dist/client/{usePolling-CvSU2sur.mjs → usePolling-Bz7GFV_a.mjs} +2 -2
  236. package/dist/preview-next/before-render.mjs +1115 -1043
  237. package/dist/preview-next/client/runtime.mjs +4 -4
  238. package/dist/preview-next/middleware.mjs +1116 -1044
  239. package/dist/{previewAuthStore-31xH13Jc.mjs → previewAuthStore-CJX21dGi.mjs} +1119 -1044
  240. package/dist/{sdk-runtime-BE_vcGua.mjs → sdk-runtime-OnPM8Z69.mjs} +2 -2
  241. package/dist/{separator-CiffYtk3.mjs → separator-CPtfzHqA.mjs} +1 -1
  242. package/dist/server/components.mjs +11120 -12601
  243. package/dist/server/config-validation.mjs +3454 -2356
  244. package/dist/server/config.mjs +3454 -2356
  245. package/dist/server/data.mjs +3452 -2367
  246. package/dist/server/index.mjs +1499 -1488
  247. package/dist/server/next.mjs +18291 -21201
  248. package/dist/server/page-converter.mjs +1898 -2040
  249. package/dist/server/prebuild.mjs +1 -1
  250. package/dist/server/rendering/server.mjs +19666 -21153
  251. package/dist/server/rendering.mjs +17117 -18651
  252. package/dist/server/routing.mjs +3614 -2509
  253. package/dist/server/server.mjs +3298 -3478
  254. package/package.json +1 -1
  255. package/dist/_dts/api/src/previewContentContract.d.ts +0 -4
  256. package/dist/_dts/sdk/src/cli/commands/course.d.ts +0 -6
  257. package/dist/_dts/sdk/src/cli/commands/push/scopes/courses.d.ts +0 -4
  258. package/dist/_dts/sdk/src/client/management/courses.d.ts +0 -10
  259. package/dist/_dts/sdk/src/routing/resolveEntrySubroute.d.ts +0 -36
@@ -7648,1785 +7648,1785 @@ function uniqueStrings(values) {
7648
7648
  return Array.from(new Set(values));
7649
7649
  }
7650
7650
  //#endregion
7651
- //#region ../theme-core/src/site-styles/sectionTransitions.ts
7652
- function boundaryRuntimeMetrics(family, size, heightExpression) {
7653
- return {
7654
- family,
7655
- size,
7656
- heightCss: heightExpression.includes(" ") ? `calc(${heightExpression})` : heightExpression,
7657
- reserveCss: `calc((${heightExpression}) / 2)`
7658
- };
7659
- }
7660
- boundaryRuntimeMetrics("gradient", "medium", "6rem + 2px"), boundaryRuntimeMetrics("gradient", "spacious", "10rem"), boundaryRuntimeMetrics("gradient", "expansive", "14rem"), boundaryRuntimeMetrics("wave", "medium", "6rem + 2px"), boundaryRuntimeMetrics("wave", "medium", "6rem + 2px"), boundaryRuntimeMetrics("wave", "compact", "4.5rem + 2px"), boundaryRuntimeMetrics("wave", "large", "7rem + 2px"), boundaryRuntimeMetrics("wave", "medium", "6rem + 2px"), boundaryRuntimeMetrics("angle", "medium", "6rem + 2px"), boundaryRuntimeMetrics("angle", "compact", "4.5rem + 2px"), boundaryRuntimeMetrics("angle", "large", "7rem + 2px");
7661
- const noneBoundaryOption = {
7662
- id: asBoundaryOptionId("break:none"),
7663
- label: "None",
7664
- transitionAfter: "none",
7665
- treatment: { kind: "none" }
7666
- };
7667
- const softBoundaryOption = {
7668
- id: asBoundaryOptionId("break:soft"),
7669
- label: "Soft",
7670
- transitionAfter: "soft-fade-short",
7671
- treatment: {
7672
- kind: "soft-fade",
7673
- height: "medium",
7674
- curve: "soft"
7675
- }
7676
- };
7677
- const spaciousBoundaryOption = {
7678
- id: asBoundaryOptionId("break:spacious"),
7679
- label: "Spacious",
7680
- transitionAfter: "soft-fade-long",
7681
- treatment: {
7682
- kind: "soft-fade",
7683
- height: "large",
7684
- curve: "spacious"
7685
- }
7686
- };
7687
- asBoundaryOptionId("break:expansive");
7688
- asBoundaryOptionId("break:wave");
7689
- asBoundaryOptionId("break:wave-balanced");
7690
- asBoundaryOptionId("break:wave-gentle");
7691
- asBoundaryOptionId("break:wave-bold");
7692
- asBoundaryOptionId("break:wave-drift");
7693
- asBoundaryOptionId("break:angle-subtle");
7694
- asBoundaryOptionId("break:angle-balanced");
7695
- asBoundaryOptionId("break:angle-steep");
7696
- asBoundaryOptionId("break:unknown");
7697
- const pageDesignUserPinnedAppearanceChoiceSchema = z$1.object({
7698
- kind: z$1.literal("user-pinned"),
7699
- value: z$1.string().min(1).transform(asAppearancePresetId)
7700
- }).strict();
7701
- const pageDesignUserPinnedBoundaryChoiceSchema = z$1.object({
7702
- kind: z$1.literal("user-pinned"),
7703
- value: z$1.string().min(1).transform(asBoundaryOptionId)
7704
- }).strict();
7705
- const pageDesignBoundaryTreatmentSchema = z$1.discriminatedUnion("kind", [
7706
- z$1.object({ kind: z$1.literal("none") }).strict(),
7707
- z$1.object({
7708
- kind: z$1.literal("soft-fade"),
7709
- height: z$1.enum([
7710
- "compact",
7711
- "medium",
7712
- "large",
7713
- "expansive"
7714
- ]),
7715
- curve: z$1.enum([
7716
- "soft",
7717
- "spacious",
7718
- "expansive"
7719
- ])
7720
- }).strict(),
7721
- z$1.object({
7722
- kind: z$1.literal("wave-edge"),
7723
- height: z$1.enum([
7724
- "compact",
7725
- "medium",
7726
- "large"
7727
- ]),
7728
- amplitude: z$1.enum([
7729
- "subtle",
7730
- "balanced",
7731
- "bold"
7732
- ]),
7733
- rhythm: z$1.enum(["single", "double"]),
7734
- symmetry: z$1.enum([
7735
- "symmetrical",
7736
- "asymmetrical",
7737
- "drift"
7738
- ])
7739
- }).strict(),
7740
- z$1.object({
7741
- kind: z$1.literal("angle-edge"),
7742
- height: z$1.enum([
7743
- "compact",
7744
- "medium",
7745
- "large"
7746
- ]),
7747
- slope: z$1.enum([
7748
- "subtle",
7749
- "balanced",
7750
- "steep"
7751
- ]),
7752
- direction: z$1.enum(["forward", "reverse"])
7753
- }).strict(),
7754
- z$1.object({
7755
- kind: z$1.literal("legacy-unsupported"),
7756
- boundaryOptionId: z$1.string().min(1).transform(asBoundaryOptionId)
7757
- }).strict()
7758
- ]);
7759
- const pageDesignUserPinnedBoundaryTreatmentChoiceSchema = z$1.object({
7760
- kind: z$1.literal("user-pinned"),
7761
- value: pageDesignBoundaryTreatmentSchema
7762
- }).strict();
7763
- const pageDesignBlockLookPinSchema = z$1.object({
7764
- blockId: z$1.string().min(1).transform(asDesignBlockId),
7765
- blockKind: z$1.string().min(1),
7766
- choice: pageDesignUserPinnedAppearanceChoiceSchema
7767
- }).strict();
7768
- const pageDesignBoundaryPinSchema = z$1.object({
7769
- boundaryId: z$1.string().min(1).transform(asDesignBoundaryId),
7770
- previousBlockId: z$1.string().min(1).transform(asDesignBlockId),
7771
- nextBlockId: z$1.string().min(1).transform(asDesignBlockId),
7772
- choice: pageDesignUserPinnedBoundaryTreatmentChoiceSchema
7773
- }).strict().superRefine(validateBoundaryPinIdMatchesBlocks);
7774
- const legacyPageDesignBoundaryPinSchema = z$1.object({
7775
- boundaryId: z$1.string().min(1).transform(asDesignBoundaryId),
7776
- previousBlockId: z$1.string().min(1).transform(asDesignBlockId),
7777
- nextBlockId: z$1.string().min(1).transform(asDesignBlockId),
7778
- choice: pageDesignUserPinnedBoundaryChoiceSchema
7779
- }).strict().superRefine(validateBoundaryPinIdMatchesBlocks);
7780
- z$1.object({
7781
- schemaVersion: z$1.literal(1),
7782
- siteStyleId: z$1.string().min(1).transform(asSiteStyleId),
7783
- pageFlowPresetId: z$1.string().min(1).transform(asPageFlowPresetId),
7784
- blockLookPins: z$1.array(pageDesignBlockLookPinSchema),
7785
- boundaryPins: z$1.array(legacyPageDesignBoundaryPinSchema)
7786
- }).strict().superRefine(validateUniquePageDesignPins);
7787
- z$1.object({
7788
- schemaVersion: z$1.literal(2),
7789
- siteStyleId: z$1.string().min(1).transform(asSiteStyleId),
7790
- pageFlowPresetId: z$1.string().min(1).transform(asPageFlowPresetId),
7791
- blockLookPins: z$1.array(pageDesignBlockLookPinSchema),
7792
- boundaryPins: z$1.array(pageDesignBoundaryPinSchema)
7793
- }).strict().superRefine(validateUniquePageDesignPins);
7794
- function addDuplicateStringIssues(ctx, input) {
7795
- const seen = /* @__PURE__ */ new Set();
7796
- const duplicates = /* @__PURE__ */ new Set();
7797
- for (const value of input.values) {
7798
- if (seen.has(value)) duplicates.add(value);
7799
- seen.add(value);
7800
- }
7801
- for (const duplicate of duplicates) ctx.addIssue({
7802
- code: z$1.ZodIssueCode.custom,
7803
- path: [...input.path],
7804
- message: `Duplicate ${input.label}: ${duplicate}.`
7805
- });
7806
- }
7807
- function validateBoundaryPinIdMatchesBlocks(pin, ctx) {
7808
- const expectedBoundaryId = makeBoundaryId(pin.previousBlockId, pin.nextBlockId);
7809
- if (pin.boundaryId !== expectedBoundaryId) ctx.addIssue({
7810
- code: z$1.ZodIssueCode.custom,
7811
- path: ["boundaryId"],
7812
- message: `Boundary id must match previousBlockId and nextBlockId. Expected ${expectedBoundaryId}.`
7813
- });
7651
+ //#region ../theme-core/src/site-styles/headerLooks.ts
7652
+ function asHeaderLookId(value) {
7653
+ return value;
7814
7654
  }
7815
- function validateUniquePageDesignPins(intent, ctx) {
7816
- addDuplicateStringIssues(ctx, {
7817
- values: intent.blockLookPins.map((pin) => pin.blockId),
7818
- path: ["blockLookPins"],
7819
- label: "block Look pin"
7820
- });
7821
- addDuplicateStringIssues(ctx, {
7822
- values: intent.boundaryPins.map((pin) => boundaryKey(pin.previousBlockId, pin.nextBlockId)),
7823
- path: ["boundaryPins"],
7824
- label: "boundary pin"
7825
- });
7655
+ function asHeaderLayoutId(value) {
7656
+ return value;
7826
7657
  }
7827
- function boundaryKey(previousBlockId, nextBlockId) {
7828
- return makeBoundaryId(previousBlockId, nextBlockId);
7658
+ function asHeaderStyleId(value) {
7659
+ return value;
7829
7660
  }
7830
- //#endregion
7831
- //#region ../theme-core/src/accordions/siteStyleDefaults.ts
7832
- /**
7833
- * Reusable accordion "looks" for curated site styles.
7834
- *
7835
- * Each curated site style should declare one of these (or a bespoke variant)
7836
- * via `themeOverrides.accordions` so its FAQ accordions carry the style's
7837
- * personality instead of falling back to the generic generated default. The
7838
- * looks vary the things that make an accordion read as designed vs. cheap:
7839
- * box vs. boxless, question typography (body vs. heading font + scale), icon,
7840
- * and how an open item is emphasised.
7841
- */
7842
- /**
7843
- * Boxless editorial list: transparent root, hairline dividers between rows,
7844
- * generous spacing, heading-font questions, plus/minus marks, and an accented
7845
- * tinted band on the open row. The reference "expensive" FAQ look.
7846
- */
7847
- const editorialDividedAccordionSystem = {
7848
- background: null,
7849
- spacing: "comfortable",
7850
- corners: "square",
7851
- border: null,
7852
- shadow: null,
7853
- icon: {
7854
- style: "plus-minus",
7855
- position: "right",
7856
- size: "md",
7857
- colorToken: "primary"
7858
- },
7859
- trigger: {
7860
- textColorToken: "text",
7861
- fontWeight: "regular",
7862
- fontFamily: "heading",
7863
- fontScale: "lg"
7864
- },
7865
- hover: { textColorToken: "primary" },
7866
- openState: {
7867
- backgroundColorToken: "surfaceAlt",
7868
- triggerColorToken: "primary",
7869
- accent: {
7870
- edge: "left",
7871
- colorToken: "primary",
7872
- thickness: "medium"
7873
- }
7874
- },
7875
- content: { textColorToken: "neutral-700" }
7661
+ const titleOnlyLogoAccommodation = {
7662
+ pattern: "title-only",
7663
+ supportedShapes: [
7664
+ "none",
7665
+ "horizontal",
7666
+ "square",
7667
+ "portrait",
7668
+ "tall"
7669
+ ],
7670
+ supportedTextPresence: [
7671
+ "contains-text",
7672
+ "no-text",
7673
+ "unknown"
7674
+ ],
7675
+ supportedDisplayModes: ["title-only"],
7676
+ size: "compact"
7876
7677
  };
7877
- /**
7878
- * Quiet, airy underlined rows: transparent, spacious, large calm heading-font
7879
- * questions, a small subtle chevron, and open emphasis carried only by the
7880
- * question recolouring. For minimal / premium / wellness styles.
7881
- */
7882
- const quietUnderlinedAccordionSystem = {
7883
- background: null,
7884
- spacing: "spacious",
7885
- corners: "square",
7886
- border: null,
7887
- shadow: null,
7888
- icon: {
7889
- style: "chevron",
7890
- position: "right",
7891
- size: "sm",
7892
- colorToken: "muted"
7893
- },
7894
- trigger: {
7895
- textColorToken: "text",
7896
- fontWeight: "regular",
7897
- fontFamily: "heading",
7898
- fontScale: "lg"
7899
- },
7900
- hover: { textColorToken: "primary" },
7901
- openState: { triggerColorToken: "primary" },
7902
- content: { textColorToken: "neutral-700" }
7678
+ const inlineWordmarkLogoAccommodation = {
7679
+ pattern: "inline-wordmark",
7680
+ supportedShapes: ["horizontal"],
7681
+ supportedTextPresence: [
7682
+ "contains-text",
7683
+ "no-text",
7684
+ "unknown"
7685
+ ],
7686
+ supportedDisplayModes: ["logo-only"],
7687
+ size: "standard",
7688
+ maxDensity: "detailed"
7689
+ };
7690
+ const inlineMarkWithTitleLogoAccommodation = {
7691
+ pattern: "inline-mark-with-title",
7692
+ supportedShapes: [
7693
+ "horizontal",
7694
+ "square",
7695
+ "portrait",
7696
+ "tall"
7697
+ ],
7698
+ supportedTextPresence: ["no-text"],
7699
+ supportedDisplayModes: ["logo-plus-title"],
7700
+ size: "compact",
7701
+ maxDensity: "simple"
7702
+ };
7703
+ const logoPlateAccommodation = {
7704
+ pattern: "logo-plate",
7705
+ supportedShapes: [
7706
+ "square",
7707
+ "portrait",
7708
+ "tall"
7709
+ ],
7710
+ supportedTextPresence: ["contains-text", "unknown"],
7711
+ supportedDisplayModes: ["logo-only"],
7712
+ size: "display",
7713
+ providesBacking: true
7714
+ };
7715
+ const centeredBadgeAccommodation = {
7716
+ pattern: "centered-badge",
7717
+ supportedShapes: [
7718
+ "square",
7719
+ "portrait",
7720
+ "tall"
7721
+ ],
7722
+ supportedTextPresence: ["contains-text", "unknown"],
7723
+ supportedDisplayModes: ["logo-only"],
7724
+ size: "display",
7725
+ providesBacking: true
7726
+ };
7727
+ const popoutBadgeAccommodation = {
7728
+ pattern: "popout-badge",
7729
+ supportedShapes: [
7730
+ "square",
7731
+ "portrait",
7732
+ "tall"
7733
+ ],
7734
+ supportedTextPresence: ["contains-text", "unknown"],
7735
+ supportedDisplayModes: ["logo-only"],
7736
+ size: "display",
7737
+ providesBacking: true
7738
+ };
7739
+ const centeredMastheadAccommodation = {
7740
+ pattern: "centered-masthead",
7741
+ supportedShapes: [
7742
+ "square",
7743
+ "portrait",
7744
+ "tall"
7745
+ ],
7746
+ supportedTextPresence: ["contains-text", "unknown"],
7747
+ supportedDisplayModes: ["logo-only"],
7748
+ size: "display",
7749
+ providesBacking: true
7750
+ };
7751
+ const unbackedOverlayLogoAccommodation = {
7752
+ pattern: "inline-logo-only",
7753
+ supportedShapes: ["square"],
7754
+ supportedTextPresence: ["contains-text", "unknown"],
7755
+ supportedDisplayModes: ["logo-only"],
7756
+ size: "compact",
7757
+ providesBacking: false
7903
7758
  };
7759
+ const inlineClassicLogoAccommodations = [
7760
+ titleOnlyLogoAccommodation,
7761
+ inlineWordmarkLogoAccommodation,
7762
+ inlineMarkWithTitleLogoAccommodation,
7763
+ popoutBadgeAccommodation,
7764
+ logoPlateAccommodation
7765
+ ];
7766
+ const centeredLogoAccommodations = [
7767
+ titleOnlyLogoAccommodation,
7768
+ inlineWordmarkLogoAccommodation,
7769
+ inlineMarkWithTitleLogoAccommodation,
7770
+ centeredMastheadAccommodation,
7771
+ centeredBadgeAccommodation
7772
+ ];
7773
+ const overlayLogoAccommodations = [
7774
+ titleOnlyLogoAccommodation,
7775
+ inlineWordmarkLogoAccommodation,
7776
+ inlineMarkWithTitleLogoAccommodation,
7777
+ unbackedOverlayLogoAccommodation
7778
+ ];
7904
7779
  /**
7905
- * Soft contained panel: a gentle surface box with soft corners, a hairline
7906
- * border and a low shadow, heading-font questions at a moderate size, chevron,
7907
- * and a tinted open state. For clean, trustworthy, appointment-led styles.
7780
+ * Starts every Look from the generated theme's header branch, then clears
7781
+ * optional nested styling fields that would otherwise leak from another Look.
7908
7782
  */
7909
- const calmPanelAccordionSystem = {
7910
- background: {
7911
- type: "solid",
7912
- colorToken: "surface"
7913
- },
7914
- spacing: "comfortable",
7915
- corners: "soft",
7916
- border: {
7917
- widthClass: "border",
7918
- colorToken: "border"
7783
+ function baseHeader(theme) {
7784
+ const { navLinkStyle: _navLinkStyle, navFontRole: _navFontRole, navTypography: _navTypography, navTextSize: _navTextSize, dropdownStyle: _dropdownStyle, ctaVariant: _ctaVariant, navContainer: _navContainer, container: _container, shadow: _shadow, logo: _logo, logoText: _logoText, border: _border, ...header } = theme.header;
7785
+ return {
7786
+ ...header,
7787
+ navContainer: {
7788
+ type: "none",
7789
+ tint: null,
7790
+ opacity: .15
7791
+ }
7792
+ };
7793
+ }
7794
+ const headerLayoutCatalog = defineExactCatalog()([
7795
+ {
7796
+ id: asHeaderLayoutId("classic"),
7797
+ label: "Classic",
7798
+ description: "Logo and navigation in one practical horizontal row.",
7799
+ structure: "inline-classic",
7800
+ variant: "classic",
7801
+ defaultPositioning: "sticky",
7802
+ shrinkOnScroll: false
7919
7803
  },
7920
- shadow: {
7921
- elevation: "low",
7922
- softness: "soft",
7923
- position: "bottom"
7804
+ {
7805
+ id: asHeaderLayoutId("centered"),
7806
+ label: "Centered",
7807
+ description: "Logo centered above a balanced navigation row.",
7808
+ structure: "centered-stack",
7809
+ variant: "centered",
7810
+ defaultPositioning: "static",
7811
+ shrinkOnScroll: false,
7812
+ maxRecommendedNavItems: 5,
7813
+ allowedLogoShapes: [
7814
+ "none",
7815
+ "text-only",
7816
+ "horizontal",
7817
+ "square"
7818
+ ]
7924
7819
  },
7925
- icon: {
7926
- style: "chevron",
7927
- position: "right",
7928
- size: "md",
7929
- colorToken: "primary"
7820
+ {
7821
+ id: asHeaderLayoutId("floating"),
7822
+ label: "Floating",
7823
+ description: "Detached header chrome that sits over the opening section.",
7824
+ structure: "floating-shell",
7825
+ variant: "floating",
7826
+ defaultPositioning: "sticky",
7827
+ shrinkOnScroll: true,
7828
+ maxRecommendedNavItems: 5,
7829
+ allowedLogoShapes: [
7830
+ "none",
7831
+ "text-only",
7832
+ "horizontal"
7833
+ ]
7834
+ }
7835
+ ]);
7836
+ function supportedLayouts(ids) {
7837
+ return ids.map(asHeaderLayoutId);
7838
+ }
7839
+ const headerStyleCatalog = defineExactCatalog()([
7840
+ {
7841
+ id: asHeaderStyleId("minimal"),
7842
+ label: "Minimal",
7843
+ description: "Quiet surface with simple color-change navigation.",
7844
+ supportedLayoutIds: supportedLayouts(["classic", "centered"]),
7845
+ navInteraction: "color-change",
7846
+ surface: "neutral",
7847
+ defaultDepth: "none",
7848
+ navTypography: "plain",
7849
+ moods: [
7850
+ "calm",
7851
+ "professional",
7852
+ "editorial"
7853
+ ]
7930
7854
  },
7931
- trigger: {
7932
- textColorToken: "text",
7933
- fontWeight: "medium",
7934
- fontFamily: "heading",
7935
- fontScale: "md"
7855
+ {
7856
+ id: asHeaderStyleId("fine-line"),
7857
+ label: "Seamless",
7858
+ description: "Borderless surface with underline hover for a quieter page transition.",
7859
+ supportedLayoutIds: supportedLayouts(["classic", "centered"]),
7860
+ navInteraction: "underline-grow",
7861
+ surface: "neutral",
7862
+ defaultDepth: "none",
7863
+ navTypography: "plain",
7864
+ moods: [
7865
+ "calm",
7866
+ "professional",
7867
+ "editorial"
7868
+ ]
7936
7869
  },
7937
- hover: {
7938
- backgroundColorToken: "primary/5",
7939
- textColorToken: "primary"
7870
+ {
7871
+ id: asHeaderStyleId("soft-bar"),
7872
+ label: "Soft Bar",
7873
+ description: "Soft tinted surface with gentle pill hover states.",
7874
+ supportedLayoutIds: supportedLayouts(["classic", "centered"]),
7875
+ navInteraction: "pill-background",
7876
+ surface: "soft",
7877
+ defaultDepth: "line",
7878
+ navTypography: "plain",
7879
+ moods: ["calm", "professional"]
7940
7880
  },
7941
- openState: {
7942
- backgroundColorToken: "primary/5",
7943
- triggerColorToken: "primary"
7881
+ {
7882
+ id: asHeaderStyleId("pill-nav"),
7883
+ label: "Pill Nav",
7884
+ description: "A calm pill navigation rail over a neutral header.",
7885
+ supportedLayoutIds: supportedLayouts(["classic", "centered"]),
7886
+ navInteraction: "pill-background",
7887
+ surface: "soft",
7888
+ defaultDepth: "none",
7889
+ navTypography: "plain",
7890
+ moods: ["calm"]
7944
7891
  },
7945
- content: { textColorToken: "neutral-700" }
7946
- };
7947
- /**
7948
- * Bold bordered panel: a strong-bordered surface box, bold heading-font
7949
- * questions, large plus/minus marks, and a high-emphasis tinted + accented
7950
- * open state. For confident, conversion-led, high-energy styles.
7951
- */
7952
- const boldBorderedAccordionSystem = {
7953
- background: {
7954
- type: "solid",
7955
- colorToken: "surface"
7956
- },
7957
- spacing: "comfortable",
7958
- corners: "soft",
7959
- border: {
7960
- widthClass: "border-2",
7961
- colorToken: "border"
7962
- },
7963
- shadow: null,
7964
- icon: {
7965
- style: "plus-minus",
7966
- position: "right",
7967
- size: "lg",
7968
- colorToken: "primary"
7969
- },
7970
- trigger: {
7971
- textColorToken: "text",
7972
- fontWeight: "bold",
7973
- fontFamily: "heading",
7974
- fontScale: "md"
7975
- },
7976
- hover: {
7977
- backgroundColorToken: "primary/10",
7978
- textColorToken: "primary"
7979
- },
7980
- openState: {
7981
- backgroundColorToken: "primary/10",
7982
- triggerColorToken: "primary",
7983
- accent: {
7984
- edge: "left",
7985
- colorToken: "primary",
7986
- thickness: "thick"
7987
- }
7892
+ {
7893
+ id: asHeaderStyleId("brand-bar"),
7894
+ label: "Brand Bar",
7895
+ description: "Solid brand surface with high-contrast navigation.",
7896
+ supportedLayoutIds: supportedLayouts(["classic", "centered"]),
7897
+ navInteraction: "color-change",
7898
+ surface: "brand-solid",
7899
+ defaultDepth: "none",
7900
+ navTypography: "brand-caps",
7901
+ moods: [
7902
+ "professional",
7903
+ "expressive",
7904
+ "utility"
7905
+ ]
7988
7906
  },
7989
- content: { textColorToken: "neutral-700" }
7990
- };
7991
- /**
7992
- * Warm inset tiles: a tinted (surfaceAlt) root with rounded corners and no
7993
- * border; the open row lifts to the lighter surface colour. Friendly,
7994
- * hands-on, community styles.
7995
- */
7996
- const warmInsetAccordionSystem = {
7997
- background: {
7998
- type: "solid",
7999
- colorToken: "surfaceAlt"
7907
+ {
7908
+ id: asHeaderStyleId("brand-underline"),
7909
+ label: "Brand Underline",
7910
+ description: "Brand surface with underline-grow navigation.",
7911
+ supportedLayoutIds: supportedLayouts(["classic"]),
7912
+ navInteraction: "underline-grow",
7913
+ surface: "brand-solid",
7914
+ defaultDepth: "none",
7915
+ navTypography: "brand-caps",
7916
+ moods: ["expressive"]
8000
7917
  },
8001
- spacing: "comfortable",
8002
- corners: "rounded",
8003
- border: null,
8004
- shadow: null,
8005
- icon: {
8006
- style: "circle-plus-minus",
8007
- position: "right",
8008
- size: "md",
8009
- colorToken: "primary"
7918
+ {
7919
+ id: asHeaderStyleId("brand-pill"),
7920
+ label: "Brand Pill",
7921
+ description: "Solid brand surface with rounded active and hover states.",
7922
+ supportedLayoutIds: supportedLayouts([
7923
+ "classic",
7924
+ "centered",
7925
+ "floating"
7926
+ ]),
7927
+ navInteraction: "pill-background",
7928
+ surface: "brand-solid",
7929
+ defaultDepth: "none",
7930
+ navTypography: "brand-caps",
7931
+ moods: ["expressive"]
8010
7932
  },
8011
- trigger: {
8012
- textColorToken: "text",
8013
- fontWeight: "semibold",
8014
- fontFamily: "heading",
8015
- fontScale: "md"
7933
+ {
7934
+ id: asHeaderStyleId("brand-capsule"),
7935
+ label: "Brand Capsule",
7936
+ description: "Solid brand chrome designed as a floating capsule, with quiet-caps nav, a soft pill active state, and an inverted CTA pill.",
7937
+ supportedLayoutIds: supportedLayouts(["classic"]),
7938
+ navInteraction: "pill-background",
7939
+ surface: "brand-solid",
7940
+ defaultDepth: "shadow",
7941
+ navTypography: "quiet-caps",
7942
+ moods: ["expressive", "professional"]
8016
7943
  },
8017
- hover: {
8018
- backgroundColorToken: "primary/5",
8019
- textColorToken: "primary"
7944
+ {
7945
+ id: asHeaderStyleId("serif-line"),
7946
+ label: "Serif Line",
7947
+ description: "Typographic logo treatment with understated underline navigation.",
7948
+ supportedLayoutIds: supportedLayouts(["classic", "centered"]),
7949
+ navInteraction: "underline-grow",
7950
+ surface: "bordered",
7951
+ defaultDepth: "line",
7952
+ navTypography: "heading",
7953
+ moods: ["editorial", "calm"]
8020
7954
  },
8021
- openState: {
8022
- backgroundColorToken: "surface",
8023
- triggerColorToken: "primary"
7955
+ {
7956
+ id: asHeaderStyleId("flat-tabs"),
7957
+ label: "Flat Tabs",
7958
+ description: "Flat block hover and active states with a Swiss utility feel.",
7959
+ supportedLayoutIds: supportedLayouts(["classic", "centered"]),
7960
+ navInteraction: "flat-block",
7961
+ surface: "bordered",
7962
+ defaultDepth: "shadow",
7963
+ navTypography: "quiet-caps",
7964
+ moods: [
7965
+ "professional",
7966
+ "utility",
7967
+ "expressive"
7968
+ ]
8024
7969
  },
8025
- content: { textColorToken: "neutral-700" }
8026
- };
8027
- /**
8028
- * Soft Earth's grounded look: boxless, plus/minus, heading-font questions on
8029
- * a warm ground, with a quiet open recolour.
8030
- */
8031
- const softEarthAccordionSystem = {
8032
- background: {
8033
- type: "solid",
8034
- colorToken: "background"
7970
+ {
7971
+ id: asHeaderStyleId("glass"),
7972
+ label: "Glass",
7973
+ description: "Translucent chrome with frosted navigation backing.",
7974
+ supportedLayoutIds: supportedLayouts(["floating"]),
7975
+ navInteraction: "glass-backed",
7976
+ surface: "floating",
7977
+ defaultDepth: "shadow",
7978
+ navTypography: "plain",
7979
+ moods: ["expressive", "calm"]
8035
7980
  },
8036
- spacing: "comfortable",
8037
- corners: "square",
8038
- border: null,
8039
- shadow: null,
8040
- icon: {
8041
- style: "plus-minus",
8042
- position: "right",
8043
- size: "md",
8044
- colorToken: "primary"
7981
+ {
7982
+ id: asHeaderStyleId("minimal-surface"),
7983
+ label: "Clear Split",
7984
+ description: "Floating logo with transparent navigation and no shared shell.",
7985
+ supportedLayoutIds: supportedLayouts(["floating"]),
7986
+ navInteraction: "color-change",
7987
+ surface: "floating",
7988
+ defaultDepth: "none",
7989
+ navTypography: "plain",
7990
+ moods: ["editorial", "calm"]
8045
7991
  },
8046
- trigger: {
8047
- textColorToken: "text",
8048
- fontWeight: "medium",
8049
- fontFamily: "heading",
8050
- fontScale: "md"
7992
+ {
7993
+ id: asHeaderStyleId("soft-shell"),
7994
+ label: "Soft Shell",
7995
+ description: "Floating rounded shell with soft pill navigation states.",
7996
+ supportedLayoutIds: supportedLayouts(["floating"]),
7997
+ navInteraction: "pill-background",
7998
+ surface: "floating",
7999
+ defaultDepth: "shadow",
8000
+ navTypography: "plain",
8001
+ moods: ["calm", "professional"]
8051
8002
  },
8052
- hover: { textColorToken: "primary" },
8053
- openState: { triggerColorToken: "primary" },
8054
- content: { textColorToken: "neutral-700" }
8055
- };
8056
- //#endregion
8057
- //#region ../theme-core/src/cards/siteStyleDefaults.ts
8058
- /**
8059
- * Reusable card systems for curated site styles.
8060
- *
8061
- * generateCardCss emits a `.card-{id}` class per enabled variant. The
8062
- * intended convention (block-level role selection is wired in a follow-up) is
8063
- * a role pair:
8064
- * - `default` — the quiet, everyday card (most blocks, most of the time)
8065
- * - `alternative` — the prominent "statement" card for sections that pop
8066
- * A card-heavy site style may add a third; the schema allows up to three
8067
- * variants. The planned fallback when a block references a missing variant is
8068
- * `alternative`, then `default`.
8069
- *
8070
- * Keep `default` close to the generated baseline so shared consumers (event
8071
- * cards, testimonials) stay stable; put the personality in `alternative`.
8072
- */
8073
- /**
8074
- * South West Twerk School: a quiet default surface card plus a high-impact
8075
- * "statement" card that reproduces the legacy accent-quote testimonial surface
8076
- * — burgundy fill, light text, a heavy gold left accent bar, and an expressive
8077
- * asymmetric top-right corner.
8078
- */
8079
- const southWestCardSystem = { variants: [{
8080
- id: "default",
8081
- name: "Default",
8082
- enabled: true,
8083
- priority: 1,
8084
- background: {
8085
- type: "solid",
8086
- colorToken: "surface"
8003
+ {
8004
+ id: asHeaderStyleId("split-glass"),
8005
+ label: "Split Glass",
8006
+ description: "Logo floats independently while the navigation sits in a glass rail.",
8007
+ supportedLayoutIds: supportedLayouts(["floating"]),
8008
+ navInteraction: "glass-backed",
8009
+ surface: "floating",
8010
+ defaultDepth: "shadow",
8011
+ navTypography: "quiet-caps",
8012
+ moods: ["expressive"]
8087
8013
  },
8088
- foregroundToken: "text",
8089
- spacing: "comfortable",
8090
- corners: "soft",
8091
- shadow: {
8092
- elevation: "low",
8093
- softness: "soft",
8094
- position: "bottom"
8095
- }
8096
- }, {
8097
- id: "alternative",
8098
- name: "Statement",
8099
- enabled: true,
8100
- priority: 2,
8101
- background: {
8102
- type: "solid",
8103
- colorToken: "primary-700"
8104
- },
8105
- foregroundToken: "primaryForeground",
8106
- spacing: "comfortable",
8107
- shadow: {
8108
- elevation: "none",
8109
- softness: null,
8110
- position: "bottom"
8111
- },
8112
- accentEdge: {
8113
- edge: "left",
8114
- colorToken: "secondary",
8115
- width: "heavy"
8116
- },
8117
- cornerRadii: {
8118
- topLeft: "square",
8119
- topRight: "expressive",
8120
- bottomLeft: "square",
8121
- bottomRight: "square"
8014
+ {
8015
+ id: asHeaderStyleId("split-pill"),
8016
+ label: "Split Pill",
8017
+ description: "Logo floats independently with a soft pill-backed navigation rail.",
8018
+ supportedLayoutIds: supportedLayouts(["floating"]),
8019
+ navInteraction: "pill-background",
8020
+ surface: "floating",
8021
+ defaultDepth: "shadow",
8022
+ navTypography: "heading",
8023
+ moods: ["calm", "editorial"]
8122
8024
  }
8123
- }] };
8124
- const clarityZenCardSystem = { variants: [{
8125
- id: "default",
8126
- name: "Default",
8127
- enabled: true,
8128
- priority: 1,
8129
- background: {
8130
- type: "solid",
8131
- colorToken: "surface"
8025
+ ]);
8026
+ new Map(headerLayoutCatalog.map((layout) => [layout.id, layout]));
8027
+ const headerStylesById = new Map(headerStyleCatalog.map((style) => [style.id, style]));
8028
+ const headerStyleCompatibilityOrder = /* @__PURE__ */ new Map([
8029
+ [asHeaderLayoutId("classic"), headerStyleRepairChain([
8030
+ "minimal",
8031
+ "fine-line",
8032
+ "soft-bar",
8033
+ "pill-nav",
8034
+ "brand-bar",
8035
+ "brand-underline",
8036
+ "brand-pill",
8037
+ "brand-capsule",
8038
+ "serif-line",
8039
+ "flat-tabs"
8040
+ ])],
8041
+ [asHeaderLayoutId("centered"), headerStyleRepairChain([
8042
+ "minimal",
8043
+ "fine-line",
8044
+ "soft-bar",
8045
+ "pill-nav",
8046
+ "brand-bar",
8047
+ "brand-pill",
8048
+ "serif-line",
8049
+ "flat-tabs"
8050
+ ])],
8051
+ [asHeaderLayoutId("floating"), headerStyleRepairChain([
8052
+ "glass",
8053
+ "minimal-surface",
8054
+ "split-glass",
8055
+ "split-pill",
8056
+ "soft-shell",
8057
+ "brand-pill"
8058
+ ])]
8059
+ ]);
8060
+ function headerStyleRepairChain(values) {
8061
+ return values.map(asHeaderStyleId);
8062
+ }
8063
+ headerStyleRepairChain([
8064
+ "brand-bar",
8065
+ "brand-pill",
8066
+ "minimal"
8067
+ ]), headerStyleRepairChain([
8068
+ "serif-line",
8069
+ "fine-line",
8070
+ "minimal"
8071
+ ]), headerStyleRepairChain([
8072
+ "brand-pill",
8073
+ "brand-bar",
8074
+ "minimal"
8075
+ ]), headerStyleRepairChain([
8076
+ "brand-capsule",
8077
+ "brand-pill",
8078
+ "brand-bar",
8079
+ "minimal"
8080
+ ]), headerStyleRepairChain([
8081
+ "pill-nav",
8082
+ "soft-bar",
8083
+ "minimal"
8084
+ ]), headerStyleRepairChain([
8085
+ "flat-tabs",
8086
+ "pill-nav",
8087
+ "minimal"
8088
+ ]), headerStyleRepairChain([
8089
+ "serif-line",
8090
+ "fine-line",
8091
+ "minimal"
8092
+ ]), headerStyleRepairChain([
8093
+ "glass",
8094
+ "soft-shell",
8095
+ "fine-line",
8096
+ "minimal-surface",
8097
+ "minimal"
8098
+ ]), headerStyleRepairChain([
8099
+ "soft-shell",
8100
+ "soft-bar",
8101
+ "minimal"
8102
+ ]), headerStyleRepairChain(["minimal-surface", "minimal"]), headerStyleRepairChain([
8103
+ "split-glass",
8104
+ "glass",
8105
+ "minimal-surface"
8106
+ ]), headerStyleRepairChain([
8107
+ "split-pill",
8108
+ "soft-shell",
8109
+ "brand-pill"
8110
+ ]), headerStyleRepairChain(["fine-line", "minimal"]), headerStyleRepairChain(["soft-bar", "minimal"]), headerStyleRepairChain(["minimal"]);
8111
+ const legacyHeaderLookAliases = defineExactCatalog()([
8112
+ {
8113
+ lookId: asHeaderLookId("clean-base"),
8114
+ selection: {
8115
+ layoutId: asHeaderLayoutId("classic"),
8116
+ styleId: asHeaderStyleId("minimal")
8117
+ }
8132
8118
  },
8133
- foregroundToken: "text",
8134
- spacing: "comfortable",
8135
- corners: "rounded",
8136
- shadow: {
8137
- elevation: "low",
8138
- softness: "soft",
8139
- position: "bottom"
8140
- }
8141
- }, {
8142
- id: "alternative",
8143
- name: "Statement",
8144
- enabled: true,
8145
- priority: 2,
8146
- background: {
8147
- type: "solid",
8148
- colorToken: "surfaceAlt"
8119
+ {
8120
+ lookId: asHeaderLookId("classic-centered-nav"),
8121
+ selection: {
8122
+ layoutId: asHeaderLayoutId("classic"),
8123
+ styleId: asHeaderStyleId("fine-line")
8124
+ }
8149
8125
  },
8150
- foregroundToken: "text",
8151
- spacing: "comfortable",
8152
- corners: "rounded",
8153
- shadow: {
8154
- elevation: "medium",
8155
- softness: "soft",
8156
- position: "bottom"
8157
- }
8158
- }] };
8159
- /**
8160
- * Original Joy: warm, flat, generously rounded cards on the dark clay ground.
8161
- * `default` is a quiet brown surface card with cream text; `alternative` is a
8162
- * burnt-orange statement card for sections that should pop. Both flat (the
8163
- * look's depth comes from colour, not shadow), matching the bold editorial
8164
- * feel. Shared by event and testimonial cards.
8165
- */
8166
- const originalJoyCardSystem = { variants: [{
8167
- id: "default",
8168
- name: "Default",
8169
- enabled: true,
8170
- priority: 1,
8171
- background: {
8172
- type: "solid",
8173
- colorToken: "surface"
8126
+ {
8127
+ lookId: asHeaderLookId("brand-solid"),
8128
+ selection: {
8129
+ layoutId: asHeaderLayoutId("classic"),
8130
+ styleId: asHeaderStyleId("brand-bar")
8131
+ }
8174
8132
  },
8175
- foregroundToken: "text",
8176
- spacing: "comfortable",
8177
- corners: "rounded",
8178
- shadow: {
8179
- elevation: "none",
8180
- softness: null,
8181
- position: "bottom"
8182
- }
8183
- }, {
8184
- id: "alternative",
8185
- name: "Statement",
8186
- enabled: true,
8187
- priority: 2,
8188
- background: {
8189
- type: "solid",
8190
- colorToken: "primary"
8133
+ {
8134
+ lookId: asHeaderLookId("serif-line"),
8135
+ selection: {
8136
+ layoutId: asHeaderLayoutId("centered"),
8137
+ styleId: asHeaderStyleId("serif-line")
8138
+ }
8191
8139
  },
8192
- foregroundToken: "primaryForeground",
8193
- spacing: "comfortable",
8194
- corners: "rounded",
8195
- shadow: {
8196
- elevation: "none",
8197
- softness: null,
8198
- position: "bottom"
8199
- }
8200
- }] };
8201
- //#endregion
8202
- //#region ../theme-core/src/site-styles/testimonialQuotePresets.ts
8203
- /**
8204
- * Reusable testimonial quote-mark treatments for curated site styles.
8205
- *
8206
- * The quote mark is brand identity the site style owns (analogous to the FAQ
8207
- * accordion icon); every curated style declares one. `style` is the coarse
8208
- * selector and the resolver in blocks/vars/testimonials.ts fills in the rest.
8209
- */
8210
- /** Large display quotation mark in the heading font. Editorial / calm styles. */
8211
- const serifDisplayQuote = { style: "serif-display" };
8212
- /** Punchy quotation mark in the secondary accent colour. Bold / accent styles. */
8213
- const accentGlyphQuote = { style: "accent-glyph" };
8214
- /**
8215
- * Curated library of gradient presets.
8216
- * All gradients use theme color tokens, so they adapt to the site's palette.
8217
- */
8218
- const GRADIENT_PRESETS = [
8219
8140
  {
8220
- id: "primary-secondary",
8221
- name: "Primary to Secondary",
8222
- description: "Blend your primary and secondary brand colors",
8223
- type: "linear",
8224
- angle: 135,
8225
- stops: [{
8226
- color: "primary-500",
8227
- position: 0
8228
- }, {
8229
- color: "secondary-500",
8230
- position: 100
8231
- }]
8141
+ lookId: asHeaderLookId("centered-calm"),
8142
+ selection: {
8143
+ layoutId: asHeaderLayoutId("centered"),
8144
+ styleId: asHeaderStyleId("minimal")
8145
+ }
8232
8146
  },
8233
8147
  {
8234
- id: "primary-accent",
8235
- name: "Primary to Accent",
8236
- description: "Energetic gradient from primary to accent",
8237
- type: "linear",
8238
- angle: 135,
8239
- stops: [{
8240
- color: "primary-500",
8241
- position: 0
8242
- }, {
8243
- color: "accent-500",
8244
- position: 100
8245
- }]
8246
- },
8247
- {
8248
- id: "secondary-accent",
8249
- name: "Secondary to Accent",
8250
- description: "Vibrant secondary to accent blend",
8251
- type: "linear",
8252
- angle: 135,
8253
- stops: [{
8254
- color: "secondary-500",
8255
- position: 0
8256
- }, {
8257
- color: "accent-500",
8258
- position: 100
8259
- }]
8260
- },
8261
- {
8262
- id: "primary-light-dark",
8263
- name: "Primary Light to Dark",
8264
- description: "Subtle primary color fade",
8265
- type: "linear",
8266
- angle: 180,
8267
- stops: [{
8268
- color: "primary-500",
8269
- position: 0
8270
- }, {
8271
- color: "primary-900",
8272
- position: 100
8273
- }]
8274
- },
8275
- {
8276
- id: "primary-dark-light",
8277
- name: "Primary Dark to Light",
8278
- description: "Reverse primary fade",
8279
- type: "linear",
8280
- angle: 180,
8281
- stops: [{
8282
- color: "primary-900",
8283
- position: 0
8284
- }, {
8285
- color: "primary-50",
8286
- position: 100
8287
- }]
8288
- },
8289
- {
8290
- id: "secondary-light-dark",
8291
- name: "Secondary Light to Dark",
8292
- description: "Subtle secondary color fade",
8293
- type: "linear",
8294
- angle: 180,
8295
- stops: [{
8296
- color: "secondary-500",
8297
- position: 0
8298
- }, {
8299
- color: "secondary-900",
8300
- position: 100
8301
- }]
8302
- },
8303
- {
8304
- id: "accent-light-dark",
8305
- name: "Accent Light to Dark",
8306
- description: "Accent color depth fade",
8307
- type: "linear",
8308
- angle: 180,
8309
- stops: [{
8310
- color: "accent-500",
8311
- position: 0
8312
- }, {
8313
- color: "accent-900",
8314
- position: 100
8315
- }]
8316
- },
8317
- {
8318
- id: "background-surface",
8319
- name: "Background to Surface",
8320
- description: "Subtle depth using base colors",
8321
- type: "linear",
8322
- angle: 180,
8323
- stops: [{
8324
- color: "background",
8325
- position: 0
8326
- }, {
8327
- color: "surface",
8328
- position: 100
8329
- }]
8330
- },
8331
- {
8332
- id: "neutral-fade",
8333
- name: "Neutral Gradient",
8334
- description: "Elegant neutral color fade",
8335
- type: "linear",
8336
- angle: 180,
8337
- stops: [{
8338
- color: "neutral-900",
8339
- position: 0
8340
- }, {
8341
- color: "neutral-50",
8342
- position: 100
8343
- }]
8148
+ lookId: asHeaderLookId("practical-utility"),
8149
+ selection: {
8150
+ layoutId: asHeaderLayoutId("classic"),
8151
+ styleId: asHeaderStyleId("flat-tabs")
8152
+ }
8344
8153
  },
8345
8154
  {
8346
- id: "primary-glow",
8347
- name: "Primary glow",
8348
- description: "A soft top-centred glow using your primary palette",
8349
- type: "radial",
8350
- shape: "ellipse",
8351
- position: "top center",
8352
- stops: [{
8353
- color: "primary-900",
8354
- position: 0
8355
- }, {
8356
- color: "primary-950",
8357
- position: 100
8358
- }],
8359
- foreground: {
8360
- textColor: "onPrimary900",
8361
- headingColor: "onPrimary900",
8362
- linkColor: "onPrimary900",
8363
- supportingColor: "onPrimary900"
8155
+ lookId: asHeaderLookId("minimal-transparent"),
8156
+ selection: {
8157
+ layoutId: asHeaderLayoutId("classic"),
8158
+ styleId: asHeaderStyleId("minimal")
8364
8159
  }
8365
8160
  },
8366
8161
  {
8367
- id: "accent-glow",
8368
- name: "Accent glow",
8369
- description: "A soft top-centred glow using your accent palette",
8370
- type: "radial",
8371
- shape: "ellipse",
8372
- position: "top center",
8373
- stops: [{
8374
- color: "accent-900",
8375
- position: 0
8376
- }, {
8377
- color: "accent-950",
8378
- position: 100
8379
- }],
8380
- foreground: {
8381
- textColor: "onAccent900",
8382
- headingColor: "onAccent900",
8383
- linkColor: "onAccent900",
8384
- supportingColor: "onAccent900"
8162
+ lookId: asHeaderLookId("transparent-overlay"),
8163
+ selection: {
8164
+ layoutId: asHeaderLayoutId("floating"),
8165
+ styleId: asHeaderStyleId("glass")
8385
8166
  }
8386
8167
  },
8387
8168
  {
8388
- id: "primary-secondary-accent",
8389
- name: "Brand Trio",
8390
- description: "All three brand colors in harmony",
8391
- type: "linear",
8392
- angle: 135,
8393
- stops: [
8394
- {
8395
- color: "primary-500",
8396
- position: 0
8397
- },
8398
- {
8399
- color: "secondary-500",
8400
- position: 50
8401
- },
8402
- {
8403
- color: "accent-500",
8404
- position: 100
8405
- }
8406
- ]
8169
+ lookId: asHeaderLookId("floating-glass"),
8170
+ selection: {
8171
+ layoutId: asHeaderLayoutId("floating"),
8172
+ styleId: asHeaderStyleId("glass")
8173
+ }
8407
8174
  }
8408
- ].map((preset) => ({
8409
- ...preset,
8410
- id: preset.id,
8411
- stops: preset.stops
8412
- }));
8413
- const GRADIENT_PRESET_IDS = GRADIENT_PRESETS.map((preset) => preset.id);
8414
- const gradientPresetIdSet = new Set(GRADIENT_PRESET_IDS);
8415
- Object.fromEntries(GRADIENT_PRESETS.map((preset) => [preset.id, preset]));
8416
- function parseGradientPresetId(value) {
8417
- if (typeof value !== "string") return null;
8418
- const normalized = value.trim();
8419
- if (!gradientPresetIdSet.has(normalized)) return null;
8420
- return normalized;
8175
+ ]);
8176
+ const legacyHeaderLookAliasesById = new Map(legacyHeaderLookAliases.map((alias) => [alias.lookId, alias]));
8177
+ function getHeaderStyle(id) {
8178
+ return headerStylesById.get(id) ?? null;
8421
8179
  }
8422
- //#endregion
8423
- //#region ../theme-core/src/site-styles/headerLooks.ts
8424
- function asHeaderLookId(value) {
8425
- return value;
8180
+ function isHeaderStyleCompatibleWithLayout(style, layoutId) {
8181
+ return style.supportedLayoutIds.includes(layoutId);
8426
8182
  }
8427
- function asHeaderLayoutId(value) {
8428
- return value;
8183
+ function getHeaderStyleOrThrow(id) {
8184
+ const style = getHeaderStyle(id);
8185
+ if (!style) throw new Error(`Unknown Theme V2 header style: ${id}`);
8186
+ return style;
8429
8187
  }
8430
- function asHeaderStyleId(value) {
8431
- return value;
8188
+ function resolveLegacyHeaderLookAlias(lookId) {
8189
+ return legacyHeaderLookAliasesById.get(lookId)?.selection ?? null;
8432
8190
  }
8433
- const titleOnlyLogoAccommodation = {
8434
- pattern: "title-only",
8435
- supportedShapes: [
8436
- "none",
8437
- "horizontal",
8438
- "square",
8439
- "portrait",
8440
- "tall"
8441
- ],
8442
- supportedTextPresence: [
8443
- "contains-text",
8444
- "no-text",
8445
- "unknown"
8446
- ],
8447
- supportedDisplayModes: ["title-only"],
8448
- size: "compact"
8449
- };
8450
- const inlineWordmarkLogoAccommodation = {
8451
- pattern: "inline-wordmark",
8452
- supportedShapes: ["horizontal"],
8453
- supportedTextPresence: [
8454
- "contains-text",
8455
- "no-text",
8456
- "unknown"
8457
- ],
8458
- supportedDisplayModes: ["logo-only"],
8459
- size: "standard",
8460
- maxDensity: "detailed"
8461
- };
8462
- const inlineMarkWithTitleLogoAccommodation = {
8463
- pattern: "inline-mark-with-title",
8464
- supportedShapes: [
8465
- "horizontal",
8466
- "square",
8467
- "portrait",
8468
- "tall"
8469
- ],
8470
- supportedTextPresence: ["no-text"],
8471
- supportedDisplayModes: ["logo-plus-title"],
8472
- size: "compact",
8473
- maxDensity: "simple"
8474
- };
8475
- const logoPlateAccommodation = {
8476
- pattern: "logo-plate",
8477
- supportedShapes: [
8478
- "square",
8479
- "portrait",
8480
- "tall"
8481
- ],
8482
- supportedTextPresence: ["contains-text", "unknown"],
8483
- supportedDisplayModes: ["logo-only"],
8484
- size: "display",
8485
- providesBacking: true
8486
- };
8487
- const centeredBadgeAccommodation = {
8488
- pattern: "centered-badge",
8489
- supportedShapes: [
8490
- "square",
8491
- "portrait",
8492
- "tall"
8493
- ],
8494
- supportedTextPresence: ["contains-text", "unknown"],
8495
- supportedDisplayModes: ["logo-only"],
8496
- size: "display",
8497
- providesBacking: true
8498
- };
8499
- const popoutBadgeAccommodation = {
8500
- pattern: "popout-badge",
8501
- supportedShapes: [
8502
- "square",
8503
- "portrait",
8504
- "tall"
8505
- ],
8506
- supportedTextPresence: ["contains-text", "unknown"],
8507
- supportedDisplayModes: ["logo-only"],
8508
- size: "display",
8509
- providesBacking: true
8510
- };
8511
- const centeredMastheadAccommodation = {
8512
- pattern: "centered-masthead",
8513
- supportedShapes: [
8514
- "square",
8515
- "portrait",
8516
- "tall"
8517
- ],
8518
- supportedTextPresence: ["contains-text", "unknown"],
8519
- supportedDisplayModes: ["logo-only"],
8520
- size: "display",
8521
- providesBacking: true
8522
- };
8523
- const unbackedOverlayLogoAccommodation = {
8524
- pattern: "inline-logo-only",
8525
- supportedShapes: ["square"],
8526
- supportedTextPresence: ["contains-text", "unknown"],
8527
- supportedDisplayModes: ["logo-only"],
8528
- size: "compact",
8529
- providesBacking: false
8530
- };
8531
- const inlineClassicLogoAccommodations = [
8532
- titleOnlyLogoAccommodation,
8533
- inlineWordmarkLogoAccommodation,
8534
- inlineMarkWithTitleLogoAccommodation,
8535
- popoutBadgeAccommodation,
8536
- logoPlateAccommodation
8537
- ];
8538
- const centeredLogoAccommodations = [
8539
- titleOnlyLogoAccommodation,
8540
- inlineWordmarkLogoAccommodation,
8541
- inlineMarkWithTitleLogoAccommodation,
8542
- centeredMastheadAccommodation,
8543
- centeredBadgeAccommodation
8544
- ];
8545
- const overlayLogoAccommodations = [
8546
- titleOnlyLogoAccommodation,
8547
- inlineWordmarkLogoAccommodation,
8548
- inlineMarkWithTitleLogoAccommodation,
8549
- unbackedOverlayLogoAccommodation
8550
- ];
8551
- /**
8552
- * Starts every Look from the generated theme's header branch, then clears
8553
- * optional nested styling fields that would otherwise leak from another Look.
8554
- */
8555
- function baseHeader(theme) {
8556
- const { navLinkStyle: _navLinkStyle, navFontRole: _navFontRole, navTypography: _navTypography, navTextSize: _navTextSize, dropdownStyle: _dropdownStyle, ctaVariant: _ctaVariant, navContainer: _navContainer, container: _container, shadow: _shadow, logo: _logo, logoText: _logoText, border: _border, ...header } = theme.header;
8191
+ function getCompatibleHeaderStyleIds(layoutId) {
8192
+ return (headerStyleCompatibilityOrder.get(layoutId) ?? []).filter((styleId) => {
8193
+ return isHeaderStyleCompatibleWithLayout(getHeaderStyleOrThrow(styleId), layoutId);
8194
+ });
8195
+ }
8196
+ function applyNavTypography(style, typography) {
8197
+ switch (typography) {
8198
+ case "plain": return style;
8199
+ case "heading": return {
8200
+ ...style,
8201
+ typography: "heading",
8202
+ fontWeight: "medium",
8203
+ letterSpacing: "wide"
8204
+ };
8205
+ case "quiet-caps": return {
8206
+ ...style,
8207
+ textTransform: "uppercase",
8208
+ textSize: "sm",
8209
+ letterSpacing: "wide"
8210
+ };
8211
+ case "brand-caps": return {
8212
+ ...style,
8213
+ textTransform: "uppercase",
8214
+ textSize: "sm",
8215
+ letterSpacing: "wider"
8216
+ };
8217
+ default: return assertNever$1(typography, "Unhandled header nav typography");
8218
+ }
8219
+ }
8220
+ function underlineNavLinkStyle(colorToken, underlineColorToken, typography = "plain") {
8221
+ return applyNavTypography({
8222
+ name: "Underline grow",
8223
+ typography: "body",
8224
+ fontWeight: "medium",
8225
+ textTransform: "none",
8226
+ italic: false,
8227
+ colorToken,
8228
+ padding: "compact",
8229
+ paddingX: "compact",
8230
+ borderRadius: "none",
8231
+ effects: { hover: [{
8232
+ effectId: "nav-underline",
8233
+ options: {
8234
+ style: "grow",
8235
+ ...underlineColorToken ? { colorToken: underlineColorToken } : {}
8236
+ }
8237
+ }] }
8238
+ }, typography);
8239
+ }
8240
+ function themedHeaderShadow(theme) {
8241
+ switch (theme.shadow.elevation) {
8242
+ case "none": return;
8243
+ case "low": return { elevation: "sm" };
8244
+ case "medium": return { elevation: "md" };
8245
+ case "high": return { elevation: "lg" };
8246
+ default: return assertNever$1(theme.shadow.elevation, "Unhandled theme shadow elevation");
8247
+ }
8248
+ }
8249
+ function solidBrandHeader(theme) {
8250
+ const ctaVariant = resolveHeaderCtaVariant(theme, "inverted");
8557
8251
  return {
8558
- ...header,
8559
- navContainer: {
8560
- type: "none",
8561
- tint: null,
8562
- opacity: .15
8563
- }
8252
+ ...baseHeader(theme),
8253
+ variant: "classic",
8254
+ positioning: "sticky",
8255
+ shrinkOnScroll: true,
8256
+ background: {
8257
+ type: "color",
8258
+ color: "primary"
8259
+ },
8260
+ textColor: "primaryForeground",
8261
+ navColor: "primaryForeground",
8262
+ navStyle: "underline-grow",
8263
+ navWeight: "bold",
8264
+ navLinkStyle: {
8265
+ typography: "body",
8266
+ fontWeight: "bold",
8267
+ textTransform: "uppercase",
8268
+ italic: false,
8269
+ colorToken: "primaryForeground",
8270
+ hoverColorToken: "secondary",
8271
+ textSize: "sm",
8272
+ letterSpacing: "wider",
8273
+ padding: "compact",
8274
+ paddingX: "compact",
8275
+ borderRadius: "none",
8276
+ effects: { hover: [{
8277
+ effectId: "text-color-change",
8278
+ options: { hoverColorToken: "secondary" }
8279
+ }, {
8280
+ effectId: "nav-underline",
8281
+ options: {
8282
+ style: "grow",
8283
+ colorToken: "secondary"
8284
+ }
8285
+ }] }
8286
+ },
8287
+ dropdownStyle: {
8288
+ background: "primary-700",
8289
+ textColor: "primaryForeground",
8290
+ borderColor: null,
8291
+ shadow: "md",
8292
+ borderRadius: "md",
8293
+ hoverBackground: "primary-900",
8294
+ hoverTextColor: "secondary",
8295
+ textTransform: "uppercase",
8296
+ letterSpacing: "wider",
8297
+ fontWeight: "bold",
8298
+ textSize: "sm"
8299
+ },
8300
+ border: {
8301
+ style: "solid",
8302
+ width: "none",
8303
+ position: "none"
8304
+ },
8305
+ logoText: {
8306
+ hideOnShrink: true,
8307
+ mobileMaxWidth: "sm",
8308
+ mobileWrapLines: 2
8309
+ },
8310
+ ctaGap: "compact",
8311
+ ctaTreatment: "inverted",
8312
+ ...ctaVariant ? { ctaVariant } : {}
8564
8313
  };
8565
8314
  }
8566
- const headerLayoutCatalog = defineExactCatalog()([
8567
- {
8568
- id: asHeaderLayoutId("classic"),
8569
- label: "Classic",
8570
- description: "Logo and navigation in one practical horizontal row.",
8571
- structure: "inline-classic",
8315
+ function cleanBaseHeader(theme) {
8316
+ return {
8317
+ ...baseHeader(theme),
8572
8318
  variant: "classic",
8573
- defaultPositioning: "sticky",
8574
- shrinkOnScroll: false
8575
- },
8576
- {
8577
- id: asHeaderLayoutId("centered"),
8578
- label: "Centered",
8579
- description: "Logo centered above a balanced navigation row.",
8580
- structure: "centered-stack",
8581
- variant: "centered",
8582
- defaultPositioning: "static",
8319
+ positioning: "sticky",
8583
8320
  shrinkOnScroll: false,
8584
- maxRecommendedNavItems: 5,
8585
- allowedLogoShapes: [
8586
- "none",
8587
- "text-only",
8588
- "horizontal",
8589
- "square"
8590
- ]
8591
- },
8592
- {
8593
- id: asHeaderLayoutId("floating"),
8594
- label: "Floating",
8595
- description: "Detached header chrome that sits over the opening section.",
8596
- structure: "floating-shell",
8597
- variant: "floating",
8598
- defaultPositioning: "sticky",
8599
- shrinkOnScroll: true,
8600
- maxRecommendedNavItems: 5,
8601
- allowedLogoShapes: [
8602
- "none",
8603
- "text-only",
8604
- "horizontal"
8605
- ]
8606
- }
8607
- ]);
8608
- function supportedLayouts(ids) {
8609
- return ids.map(asHeaderLayoutId);
8610
- }
8611
- const headerStyleCatalog = defineExactCatalog()([
8612
- {
8613
- id: asHeaderStyleId("minimal"),
8614
- label: "Minimal",
8615
- description: "Quiet surface with simple color-change navigation.",
8616
- supportedLayoutIds: supportedLayouts(["classic", "centered"]),
8617
- navInteraction: "color-change",
8618
- surface: "neutral",
8619
- defaultDepth: "none",
8620
- navTypography: "plain",
8621
- moods: [
8622
- "calm",
8623
- "professional",
8624
- "editorial"
8625
- ]
8321
+ background: {
8322
+ type: "color",
8323
+ color: "surface"
8324
+ },
8325
+ textColor: "text",
8326
+ navColor: "text",
8327
+ navStyle: "minimal",
8328
+ navWeight: "medium",
8329
+ border: {
8330
+ style: "solid",
8331
+ width: "thin",
8332
+ position: "bottom",
8333
+ colorToken: "border"
8334
+ },
8335
+ ctaTreatment: "default",
8336
+ ctaGap: "default"
8337
+ };
8338
+ }
8339
+ function classicCenteredNavHeader(theme) {
8340
+ return {
8341
+ ...baseHeader(theme),
8342
+ variant: "classic",
8343
+ navPlacement: "center",
8344
+ positioning: "sticky",
8345
+ shrinkOnScroll: false,
8346
+ background: {
8347
+ type: "color",
8348
+ color: "surface"
8349
+ },
8350
+ textColor: "text",
8351
+ navColor: "text",
8352
+ navStyle: "underline-grow",
8353
+ navWeight: "medium",
8354
+ navLinkStyle: underlineNavLinkStyle("text", "accent"),
8355
+ border: {
8356
+ style: "solid",
8357
+ width: "thin",
8358
+ position: "bottom",
8359
+ colorToken: "border"
8360
+ },
8361
+ ctaTreatment: "primary",
8362
+ ctaVariant: resolveHeaderCtaVariant(theme, "primary"),
8363
+ ctaGap: "default",
8364
+ logoText: {
8365
+ mobileMaxWidth: "sm",
8366
+ mobileWrapLines: 1,
8367
+ hideOnShrink: false
8368
+ }
8369
+ };
8370
+ }
8371
+ function serifLineHeader(theme) {
8372
+ return {
8373
+ ...baseHeader(theme),
8374
+ variant: "centered",
8375
+ positioning: "sticky",
8376
+ shrinkOnScroll: false,
8377
+ background: {
8378
+ type: "color",
8379
+ color: "background"
8380
+ },
8381
+ textColor: "text",
8382
+ navColor: "text",
8383
+ navStyle: "underline-grow",
8384
+ navWeight: "medium",
8385
+ logo: {
8386
+ fontFamily: "heading",
8387
+ letterSpacing: "wide",
8388
+ gradient: false
8389
+ },
8390
+ border: {
8391
+ style: "solid",
8392
+ width: "none",
8393
+ position: "none"
8394
+ },
8395
+ shadow: { elevation: "none" },
8396
+ ctaTreatment: "outline",
8397
+ ctaVariant: resolveHeaderCtaVariant(theme, "outline"),
8398
+ ctaGap: "relaxed"
8399
+ };
8400
+ }
8401
+ function centeredCalmHeader(theme) {
8402
+ return {
8403
+ ...baseHeader(theme),
8404
+ variant: "centered",
8405
+ positioning: "static",
8406
+ shrinkOnScroll: false,
8407
+ background: {
8408
+ type: "color",
8409
+ color: "surface"
8410
+ },
8411
+ textColor: "text",
8412
+ navColor: "text",
8413
+ navStyle: "minimal",
8414
+ navWeight: "medium",
8415
+ ctaTreatment: "ghost",
8416
+ ctaVariant: resolveHeaderCtaVariant(theme, "ghost"),
8417
+ ctaGap: "none"
8418
+ };
8419
+ }
8420
+ function practicalUtilityHeader(theme) {
8421
+ return {
8422
+ ...baseHeader(theme),
8423
+ variant: "classic",
8424
+ positioning: "sticky",
8425
+ shrinkOnScroll: true,
8426
+ background: {
8427
+ type: "color",
8428
+ color: "surface"
8429
+ },
8430
+ textColor: "text",
8431
+ navColor: "text",
8432
+ navStyle: "solid",
8433
+ navWeight: "semibold",
8434
+ shadow: themedHeaderShadow(theme),
8435
+ border: {
8436
+ style: "solid",
8437
+ width: "thin",
8438
+ position: "bottom",
8439
+ colorToken: "border"
8440
+ },
8441
+ ctaTreatment: "primary",
8442
+ ctaVariant: resolveHeaderCtaVariant(theme, "primary"),
8443
+ ctaGap: "compact",
8444
+ logoText: {
8445
+ mobileMaxWidth: "sm",
8446
+ mobileWrapLines: 1,
8447
+ hideOnShrink: false
8448
+ }
8449
+ };
8450
+ }
8451
+ function minimalTransparentHeader(theme) {
8452
+ return {
8453
+ ...baseHeader(theme),
8454
+ variant: "classic",
8455
+ positioning: "static",
8456
+ shrinkOnScroll: false,
8457
+ background: {
8458
+ type: "color",
8459
+ color: "transparent"
8460
+ },
8461
+ textColor: "text",
8462
+ navColor: "text",
8463
+ navStyle: "underline",
8464
+ navWeight: "medium",
8465
+ border: {
8466
+ style: "solid",
8467
+ width: "none",
8468
+ position: "none"
8469
+ },
8470
+ ctaTreatment: "outline",
8471
+ ctaVariant: resolveHeaderCtaVariant(theme, "outline"),
8472
+ ctaGap: "default"
8473
+ };
8474
+ }
8475
+ function transparentOverlayHeader(theme) {
8476
+ return {
8477
+ ...baseHeader(theme),
8478
+ variant: "transparent",
8479
+ positioning: "fixed",
8480
+ shrinkOnScroll: true,
8481
+ background: {
8482
+ type: "color",
8483
+ color: "transparent"
8484
+ },
8485
+ textColor: "background",
8486
+ navColor: "background",
8487
+ navStyle: "frosted",
8488
+ navWeight: "semibold",
8489
+ border: {
8490
+ style: "solid",
8491
+ width: "none",
8492
+ position: "none"
8493
+ },
8494
+ ctaTreatment: "inverted",
8495
+ ctaVariant: resolveHeaderCtaVariant(theme, "inverted"),
8496
+ ctaGap: "compact"
8497
+ };
8498
+ }
8499
+ function floatingGlassHeader(theme) {
8500
+ return {
8501
+ ...transparentOverlayHeader(theme),
8502
+ variant: "floating",
8503
+ positioning: "sticky",
8504
+ navStyle: "frosted",
8505
+ navContainer: {
8506
+ type: "glass",
8507
+ tint: "text",
8508
+ opacity: .16
8509
+ },
8510
+ container: {
8511
+ rounded: "2xl",
8512
+ border: true,
8513
+ shadow: true,
8514
+ padding: "sm",
8515
+ tint: "background",
8516
+ opacity: .12
8517
+ }
8518
+ };
8519
+ }
8520
+ const headerLookCatalog = defineExactCatalog()([
8521
+ {
8522
+ id: asHeaderLookId("clean-base"),
8523
+ label: "Clean base",
8524
+ visualTreatment: "solid-neutral",
8525
+ layoutBehavior: "sticky",
8526
+ configuration: {
8527
+ structure: "inline-classic",
8528
+ treatment: "solid-neutral",
8529
+ behavior: "sticky"
8530
+ },
8531
+ openingRequirement: "none",
8532
+ logoAccommodations: inlineClassicLogoAccommodations,
8533
+ compile: cleanBaseHeader
8626
8534
  },
8627
8535
  {
8628
- id: asHeaderStyleId("fine-line"),
8629
- label: "Seamless",
8630
- description: "Borderless surface with underline hover for a quieter page transition.",
8631
- supportedLayoutIds: supportedLayouts(["classic", "centered"]),
8632
- navInteraction: "underline-grow",
8633
- surface: "neutral",
8634
- defaultDepth: "none",
8635
- navTypography: "plain",
8636
- moods: [
8637
- "calm",
8638
- "professional",
8639
- "editorial"
8640
- ]
8536
+ id: asHeaderLookId("classic-centered-nav"),
8537
+ label: "Centered nav",
8538
+ visualTreatment: "solid-neutral",
8539
+ layoutBehavior: "sticky",
8540
+ configuration: {
8541
+ structure: "inline-classic",
8542
+ treatment: "solid-neutral",
8543
+ behavior: "sticky"
8544
+ },
8545
+ openingRequirement: "none",
8546
+ maxRecommendedNavItems: 6,
8547
+ logoAccommodations: inlineClassicLogoAccommodations,
8548
+ compile: classicCenteredNavHeader
8641
8549
  },
8642
8550
  {
8643
- id: asHeaderStyleId("soft-bar"),
8644
- label: "Soft Bar",
8645
- description: "Soft tinted surface with gentle pill hover states.",
8646
- supportedLayoutIds: supportedLayouts(["classic", "centered"]),
8647
- navInteraction: "pill-background",
8648
- surface: "soft",
8649
- defaultDepth: "line",
8650
- navTypography: "plain",
8651
- moods: ["calm", "professional"]
8652
- },
8653
- {
8654
- id: asHeaderStyleId("pill-nav"),
8655
- label: "Pill Nav",
8656
- description: "A calm pill navigation rail over a neutral header.",
8657
- supportedLayoutIds: supportedLayouts(["classic", "centered"]),
8658
- navInteraction: "pill-background",
8659
- surface: "soft",
8660
- defaultDepth: "none",
8661
- navTypography: "plain",
8662
- moods: ["calm"]
8663
- },
8664
- {
8665
- id: asHeaderStyleId("brand-bar"),
8666
- label: "Brand Bar",
8667
- description: "Solid brand surface with high-contrast navigation.",
8668
- supportedLayoutIds: supportedLayouts(["classic", "centered"]),
8669
- navInteraction: "color-change",
8670
- surface: "brand-solid",
8671
- defaultDepth: "none",
8672
- navTypography: "brand-caps",
8673
- moods: [
8674
- "professional",
8675
- "expressive",
8676
- "utility"
8677
- ]
8678
- },
8679
- {
8680
- id: asHeaderStyleId("brand-underline"),
8681
- label: "Brand Underline",
8682
- description: "Brand surface with underline-grow navigation.",
8683
- supportedLayoutIds: supportedLayouts(["classic"]),
8684
- navInteraction: "underline-grow",
8685
- surface: "brand-solid",
8686
- defaultDepth: "none",
8687
- navTypography: "brand-caps",
8688
- moods: ["expressive"]
8689
- },
8690
- {
8691
- id: asHeaderStyleId("brand-pill"),
8692
- label: "Brand Pill",
8693
- description: "Solid brand surface with rounded active and hover states.",
8694
- supportedLayoutIds: supportedLayouts([
8695
- "classic",
8696
- "centered",
8697
- "floating"
8698
- ]),
8699
- navInteraction: "pill-background",
8700
- surface: "brand-solid",
8701
- defaultDepth: "none",
8702
- navTypography: "brand-caps",
8703
- moods: ["expressive"]
8704
- },
8705
- {
8706
- id: asHeaderStyleId("brand-capsule"),
8707
- label: "Brand Capsule",
8708
- description: "Solid brand chrome designed as a floating capsule, with quiet-caps nav, a soft pill active state, and an inverted CTA pill.",
8709
- supportedLayoutIds: supportedLayouts(["classic"]),
8710
- navInteraction: "pill-background",
8711
- surface: "brand-solid",
8712
- defaultDepth: "shadow",
8713
- navTypography: "quiet-caps",
8714
- moods: ["expressive", "professional"]
8715
- },
8716
- {
8717
- id: asHeaderStyleId("serif-line"),
8718
- label: "Serif Line",
8719
- description: "Typographic logo treatment with understated underline navigation.",
8720
- supportedLayoutIds: supportedLayouts(["classic", "centered"]),
8721
- navInteraction: "underline-grow",
8722
- surface: "bordered",
8723
- defaultDepth: "line",
8724
- navTypography: "heading",
8725
- moods: ["editorial", "calm"]
8551
+ id: asHeaderLookId("brand-solid"),
8552
+ label: "Brand solid",
8553
+ visualTreatment: "solid-brand",
8554
+ layoutBehavior: "sticky-shrink",
8555
+ configuration: {
8556
+ structure: "inline-classic",
8557
+ treatment: "solid-brand",
8558
+ behavior: "sticky-shrink"
8559
+ },
8560
+ openingRequirement: "none",
8561
+ logoAccommodations: inlineClassicLogoAccommodations,
8562
+ compile: solidBrandHeader
8726
8563
  },
8727
8564
  {
8728
- id: asHeaderStyleId("flat-tabs"),
8729
- label: "Flat Tabs",
8730
- description: "Flat block hover and active states with a Swiss utility feel.",
8731
- supportedLayoutIds: supportedLayouts(["classic", "centered"]),
8732
- navInteraction: "flat-block",
8733
- surface: "bordered",
8734
- defaultDepth: "shadow",
8735
- navTypography: "quiet-caps",
8736
- moods: [
8737
- "professional",
8738
- "utility",
8739
- "expressive"
8740
- ]
8565
+ id: asHeaderLookId("serif-line"),
8566
+ label: "Serif line",
8567
+ visualTreatment: "light-serif",
8568
+ layoutBehavior: "sticky",
8569
+ configuration: {
8570
+ structure: "centered-stack",
8571
+ treatment: "light-serif",
8572
+ behavior: "sticky"
8573
+ },
8574
+ openingRequirement: "none",
8575
+ maxRecommendedNavItems: 6,
8576
+ logoAccommodations: centeredLogoAccommodations,
8577
+ compile: serifLineHeader
8741
8578
  },
8742
8579
  {
8743
- id: asHeaderStyleId("glass"),
8744
- label: "Glass",
8745
- description: "Translucent chrome with frosted navigation backing.",
8746
- supportedLayoutIds: supportedLayouts(["floating"]),
8747
- navInteraction: "glass-backed",
8748
- surface: "floating",
8749
- defaultDepth: "shadow",
8750
- navTypography: "plain",
8751
- moods: ["expressive", "calm"]
8580
+ id: asHeaderLookId("centered-calm"),
8581
+ label: "Centered calm",
8582
+ visualTreatment: "light-serif",
8583
+ layoutBehavior: "normal-flow",
8584
+ configuration: {
8585
+ structure: "centered-stack",
8586
+ treatment: "light-serif",
8587
+ behavior: "normal-flow"
8588
+ },
8589
+ openingRequirement: "none",
8590
+ maxRecommendedNavItems: 5,
8591
+ logoAccommodations: centeredLogoAccommodations,
8592
+ compile: centeredCalmHeader
8752
8593
  },
8753
8594
  {
8754
- id: asHeaderStyleId("minimal-surface"),
8755
- label: "Clear Split",
8756
- description: "Floating logo with transparent navigation and no shared shell.",
8757
- supportedLayoutIds: supportedLayouts(["floating"]),
8758
- navInteraction: "color-change",
8759
- surface: "floating",
8760
- defaultDepth: "none",
8761
- navTypography: "plain",
8762
- moods: ["editorial", "calm"]
8595
+ id: asHeaderLookId("practical-utility"),
8596
+ label: "Practical utility",
8597
+ visualTreatment: "solid-neutral",
8598
+ layoutBehavior: "sticky-shrink",
8599
+ configuration: {
8600
+ structure: "inline-classic",
8601
+ treatment: "solid-neutral",
8602
+ behavior: "sticky-shrink"
8603
+ },
8604
+ openingRequirement: "none",
8605
+ requiresProminentCta: true,
8606
+ logoAccommodations: inlineClassicLogoAccommodations,
8607
+ compile: practicalUtilityHeader
8763
8608
  },
8764
8609
  {
8765
- id: asHeaderStyleId("soft-shell"),
8766
- label: "Soft Shell",
8767
- description: "Floating rounded shell with soft pill navigation states.",
8768
- supportedLayoutIds: supportedLayouts(["floating"]),
8769
- navInteraction: "pill-background",
8770
- surface: "floating",
8771
- defaultDepth: "shadow",
8772
- navTypography: "plain",
8773
- moods: ["calm", "professional"]
8610
+ id: asHeaderLookId("minimal-transparent"),
8611
+ label: "Minimal transparent",
8612
+ visualTreatment: "minimal-transparent",
8613
+ layoutBehavior: "normal-flow",
8614
+ configuration: {
8615
+ structure: "inline-classic",
8616
+ treatment: "minimal-transparent",
8617
+ behavior: "normal-flow"
8618
+ },
8619
+ openingRequirement: "reserved-space-ok",
8620
+ logoAccommodations: inlineClassicLogoAccommodations,
8621
+ compile: minimalTransparentHeader
8774
8622
  },
8775
8623
  {
8776
- id: asHeaderStyleId("split-glass"),
8777
- label: "Split Glass",
8778
- description: "Logo floats independently while the navigation sits in a glass rail.",
8779
- supportedLayoutIds: supportedLayouts(["floating"]),
8780
- navInteraction: "glass-backed",
8781
- surface: "floating",
8782
- defaultDepth: "shadow",
8783
- navTypography: "quiet-caps",
8784
- moods: ["expressive"]
8624
+ id: asHeaderLookId("transparent-overlay"),
8625
+ label: "Transparent overlay",
8626
+ visualTreatment: "transparent-overlay",
8627
+ layoutBehavior: "fixed-overlay",
8628
+ configuration: {
8629
+ structure: "inline-classic",
8630
+ treatment: "transparent-overlay",
8631
+ behavior: "fixed-overlay"
8632
+ },
8633
+ openingRequirement: "requires-image-hero-with-contrast-overlay",
8634
+ maxRecommendedNavItems: 5,
8635
+ logoAccommodations: overlayLogoAccommodations,
8636
+ compile: transparentOverlayHeader
8785
8637
  },
8786
8638
  {
8787
- id: asHeaderStyleId("split-pill"),
8788
- label: "Split Pill",
8789
- description: "Logo floats independently with a soft pill-backed navigation rail.",
8790
- supportedLayoutIds: supportedLayouts(["floating"]),
8791
- navInteraction: "pill-background",
8792
- surface: "floating",
8793
- defaultDepth: "shadow",
8794
- navTypography: "heading",
8795
- moods: ["calm", "editorial"]
8639
+ id: asHeaderLookId("floating-glass"),
8640
+ label: "Floating glass",
8641
+ visualTreatment: "floating-glass",
8642
+ layoutBehavior: "fixed-floating",
8643
+ configuration: {
8644
+ structure: "floating-shell",
8645
+ treatment: "floating-glass",
8646
+ behavior: "fixed-floating"
8647
+ },
8648
+ openingRequirement: "requires-image-hero-with-contrast-overlay",
8649
+ maxRecommendedNavItems: 5,
8650
+ logoAccommodations: overlayLogoAccommodations,
8651
+ compile: floatingGlassHeader
8796
8652
  }
8797
8653
  ]);
8798
- new Map(headerLayoutCatalog.map((layout) => [layout.id, layout]));
8799
- const headerStylesById = new Map(headerStyleCatalog.map((style) => [style.id, style]));
8800
- const headerStyleCompatibilityOrder = /* @__PURE__ */ new Map([
8801
- [asHeaderLayoutId("classic"), headerStyleRepairChain([
8802
- "minimal",
8803
- "fine-line",
8804
- "soft-bar",
8805
- "pill-nav",
8806
- "brand-bar",
8807
- "brand-underline",
8808
- "brand-pill",
8809
- "brand-capsule",
8810
- "serif-line",
8811
- "flat-tabs"
8812
- ])],
8813
- [asHeaderLayoutId("centered"), headerStyleRepairChain([
8814
- "minimal",
8815
- "fine-line",
8816
- "soft-bar",
8817
- "pill-nav",
8818
- "brand-bar",
8819
- "brand-pill",
8820
- "serif-line",
8821
- "flat-tabs"
8822
- ])],
8823
- [asHeaderLayoutId("floating"), headerStyleRepairChain([
8824
- "glass",
8825
- "minimal-surface",
8826
- "split-glass",
8827
- "split-pill",
8828
- "soft-shell",
8829
- "brand-pill"
8830
- ])]
8831
- ]);
8832
- function headerStyleRepairChain(values) {
8833
- return values.map(asHeaderStyleId);
8834
- }
8835
- headerStyleRepairChain([
8836
- "brand-bar",
8837
- "brand-pill",
8838
- "minimal"
8839
- ]), headerStyleRepairChain([
8840
- "serif-line",
8841
- "fine-line",
8842
- "minimal"
8843
- ]), headerStyleRepairChain([
8844
- "brand-pill",
8845
- "brand-bar",
8846
- "minimal"
8847
- ]), headerStyleRepairChain([
8848
- "brand-capsule",
8849
- "brand-pill",
8850
- "brand-bar",
8851
- "minimal"
8852
- ]), headerStyleRepairChain([
8853
- "pill-nav",
8854
- "soft-bar",
8855
- "minimal"
8856
- ]), headerStyleRepairChain([
8857
- "flat-tabs",
8858
- "pill-nav",
8859
- "minimal"
8860
- ]), headerStyleRepairChain([
8861
- "serif-line",
8862
- "fine-line",
8863
- "minimal"
8864
- ]), headerStyleRepairChain([
8865
- "glass",
8866
- "soft-shell",
8867
- "fine-line",
8868
- "minimal-surface",
8869
- "minimal"
8870
- ]), headerStyleRepairChain([
8871
- "soft-shell",
8872
- "soft-bar",
8873
- "minimal"
8874
- ]), headerStyleRepairChain(["minimal-surface", "minimal"]), headerStyleRepairChain([
8875
- "split-glass",
8876
- "glass",
8877
- "minimal-surface"
8878
- ]), headerStyleRepairChain([
8879
- "split-pill",
8880
- "soft-shell",
8881
- "brand-pill"
8882
- ]), headerStyleRepairChain(["fine-line", "minimal"]), headerStyleRepairChain(["soft-bar", "minimal"]), headerStyleRepairChain(["minimal"]);
8883
- const legacyHeaderLookAliases = defineExactCatalog()([
8884
- {
8885
- lookId: asHeaderLookId("clean-base"),
8886
- selection: {
8887
- layoutId: asHeaderLayoutId("classic"),
8888
- styleId: asHeaderStyleId("minimal")
8889
- }
8890
- },
8891
- {
8892
- lookId: asHeaderLookId("classic-centered-nav"),
8893
- selection: {
8894
- layoutId: asHeaderLayoutId("classic"),
8895
- styleId: asHeaderStyleId("fine-line")
8896
- }
8897
- },
8898
- {
8899
- lookId: asHeaderLookId("brand-solid"),
8900
- selection: {
8901
- layoutId: asHeaderLayoutId("classic"),
8902
- styleId: asHeaderStyleId("brand-bar")
8903
- }
8904
- },
8905
- {
8906
- lookId: asHeaderLookId("serif-line"),
8907
- selection: {
8908
- layoutId: asHeaderLayoutId("centered"),
8909
- styleId: asHeaderStyleId("serif-line")
8910
- }
8911
- },
8912
- {
8913
- lookId: asHeaderLookId("centered-calm"),
8914
- selection: {
8915
- layoutId: asHeaderLayoutId("centered"),
8916
- styleId: asHeaderStyleId("minimal")
8917
- }
8918
- },
8919
- {
8920
- lookId: asHeaderLookId("practical-utility"),
8921
- selection: {
8922
- layoutId: asHeaderLayoutId("classic"),
8923
- styleId: asHeaderStyleId("flat-tabs")
8924
- }
8925
- },
8926
- {
8927
- lookId: asHeaderLookId("minimal-transparent"),
8928
- selection: {
8929
- layoutId: asHeaderLayoutId("classic"),
8930
- styleId: asHeaderStyleId("minimal")
8931
- }
8932
- },
8933
- {
8934
- lookId: asHeaderLookId("transparent-overlay"),
8935
- selection: {
8936
- layoutId: asHeaderLayoutId("floating"),
8937
- styleId: asHeaderStyleId("glass")
8938
- }
8939
- },
8940
- {
8941
- lookId: asHeaderLookId("floating-glass"),
8942
- selection: {
8943
- layoutId: asHeaderLayoutId("floating"),
8944
- styleId: asHeaderStyleId("glass")
8945
- }
8946
- }
8947
- ]);
8948
- const legacyHeaderLookAliasesById = new Map(legacyHeaderLookAliases.map((alias) => [alias.lookId, alias]));
8949
- function getHeaderStyle(id) {
8950
- return headerStylesById.get(id) ?? null;
8951
- }
8952
- function isHeaderStyleCompatibleWithLayout(style, layoutId) {
8953
- return style.supportedLayoutIds.includes(layoutId);
8954
- }
8955
- function getHeaderStyleOrThrow(id) {
8956
- const style = getHeaderStyle(id);
8957
- if (!style) throw new Error(`Unknown Theme V2 header style: ${id}`);
8958
- return style;
8959
- }
8960
- function resolveLegacyHeaderLookAlias(lookId) {
8961
- return legacyHeaderLookAliasesById.get(lookId)?.selection ?? null;
8654
+ new Set(headerLookCatalog.map((look) => headerConfigurationKey(look.configuration)));
8655
+ new Map(headerLookCatalog.map((look) => [look.id, look]));
8656
+ function headerConfigurationKey(configuration) {
8657
+ return `${configuration.structure}:${configuration.treatment}:${configuration.behavior}`;
8962
8658
  }
8963
- function getCompatibleHeaderStyleIds(layoutId) {
8964
- return (headerStyleCompatibilityOrder.get(layoutId) ?? []).filter((styleId) => {
8965
- return isHeaderStyleCompatibleWithLayout(getHeaderStyleOrThrow(styleId), layoutId);
8966
- });
8659
+ //#endregion
8660
+ //#region ../theme-core/src/site-styles/sectionTransitions.ts
8661
+ function boundaryRuntimeMetrics(family, size, heightExpression) {
8662
+ return {
8663
+ family,
8664
+ size,
8665
+ heightCss: heightExpression.includes(" ") ? `calc(${heightExpression})` : heightExpression,
8666
+ reserveCss: `calc((${heightExpression}) / 2)`
8667
+ };
8967
8668
  }
8968
- function applyNavTypography(style, typography) {
8969
- switch (typography) {
8970
- case "plain": return style;
8971
- case "heading": return {
8972
- ...style,
8973
- typography: "heading",
8974
- fontWeight: "medium",
8975
- letterSpacing: "wide"
8976
- };
8977
- case "quiet-caps": return {
8978
- ...style,
8979
- textTransform: "uppercase",
8980
- textSize: "sm",
8981
- letterSpacing: "wide"
8982
- };
8983
- case "brand-caps": return {
8984
- ...style,
8985
- textTransform: "uppercase",
8986
- textSize: "sm",
8987
- letterSpacing: "wider"
8988
- };
8989
- default: return assertNever$1(typography, "Unhandled header nav typography");
8669
+ boundaryRuntimeMetrics("gradient", "medium", "6rem + 2px"), boundaryRuntimeMetrics("gradient", "spacious", "10rem"), boundaryRuntimeMetrics("gradient", "expansive", "14rem"), boundaryRuntimeMetrics("wave", "medium", "6rem + 2px"), boundaryRuntimeMetrics("wave", "medium", "6rem + 2px"), boundaryRuntimeMetrics("wave", "compact", "4.5rem + 2px"), boundaryRuntimeMetrics("wave", "large", "7rem + 2px"), boundaryRuntimeMetrics("wave", "medium", "6rem + 2px"), boundaryRuntimeMetrics("angle", "medium", "6rem + 2px"), boundaryRuntimeMetrics("angle", "compact", "4.5rem + 2px"), boundaryRuntimeMetrics("angle", "large", "7rem + 2px");
8670
+ const noneBoundaryOption = {
8671
+ id: asBoundaryOptionId("break:none"),
8672
+ label: "None",
8673
+ transitionAfter: "none",
8674
+ treatment: { kind: "none" }
8675
+ };
8676
+ const softBoundaryOption = {
8677
+ id: asBoundaryOptionId("break:soft"),
8678
+ label: "Soft",
8679
+ transitionAfter: "soft-fade-short",
8680
+ treatment: {
8681
+ kind: "soft-fade",
8682
+ height: "medium",
8683
+ curve: "soft"
8990
8684
  }
8991
- }
8992
- function underlineNavLinkStyle(colorToken, underlineColorToken, typography = "plain") {
8993
- return applyNavTypography({
8994
- name: "Underline grow",
8995
- typography: "body",
8996
- fontWeight: "medium",
8997
- textTransform: "none",
8998
- italic: false,
8999
- colorToken,
9000
- padding: "compact",
9001
- paddingX: "compact",
9002
- borderRadius: "none",
9003
- effects: { hover: [{
9004
- effectId: "nav-underline",
9005
- options: {
9006
- style: "grow",
9007
- ...underlineColorToken ? { colorToken: underlineColorToken } : {}
9008
- }
9009
- }] }
9010
- }, typography);
9011
- }
9012
- function themedHeaderShadow(theme) {
9013
- switch (theme.shadow.elevation) {
9014
- case "none": return;
9015
- case "low": return { elevation: "sm" };
9016
- case "medium": return { elevation: "md" };
9017
- case "high": return { elevation: "lg" };
9018
- default: return assertNever$1(theme.shadow.elevation, "Unhandled theme shadow elevation");
8685
+ };
8686
+ const spaciousBoundaryOption = {
8687
+ id: asBoundaryOptionId("break:spacious"),
8688
+ label: "Spacious",
8689
+ transitionAfter: "soft-fade-long",
8690
+ treatment: {
8691
+ kind: "soft-fade",
8692
+ height: "large",
8693
+ curve: "spacious"
9019
8694
  }
8695
+ };
8696
+ asBoundaryOptionId("break:expansive");
8697
+ asBoundaryOptionId("break:wave");
8698
+ asBoundaryOptionId("break:wave-balanced");
8699
+ asBoundaryOptionId("break:wave-gentle");
8700
+ asBoundaryOptionId("break:wave-bold");
8701
+ asBoundaryOptionId("break:wave-drift");
8702
+ asBoundaryOptionId("break:angle-subtle");
8703
+ asBoundaryOptionId("break:angle-balanced");
8704
+ asBoundaryOptionId("break:angle-steep");
8705
+ asBoundaryOptionId("break:unknown");
8706
+ const pageDesignUserPinnedAppearanceChoiceSchema = z$1.object({
8707
+ kind: z$1.literal("user-pinned"),
8708
+ value: z$1.string().min(1).transform(asAppearancePresetId)
8709
+ }).strict();
8710
+ const pageDesignUserPinnedBoundaryChoiceSchema = z$1.object({
8711
+ kind: z$1.literal("user-pinned"),
8712
+ value: z$1.string().min(1).transform(asBoundaryOptionId)
8713
+ }).strict();
8714
+ const pageDesignBoundaryTreatmentSchema = z$1.discriminatedUnion("kind", [
8715
+ z$1.object({ kind: z$1.literal("none") }).strict(),
8716
+ z$1.object({
8717
+ kind: z$1.literal("soft-fade"),
8718
+ height: z$1.enum([
8719
+ "compact",
8720
+ "medium",
8721
+ "large",
8722
+ "expansive"
8723
+ ]),
8724
+ curve: z$1.enum([
8725
+ "soft",
8726
+ "spacious",
8727
+ "expansive"
8728
+ ])
8729
+ }).strict(),
8730
+ z$1.object({
8731
+ kind: z$1.literal("wave-edge"),
8732
+ height: z$1.enum([
8733
+ "compact",
8734
+ "medium",
8735
+ "large"
8736
+ ]),
8737
+ amplitude: z$1.enum([
8738
+ "subtle",
8739
+ "balanced",
8740
+ "bold"
8741
+ ]),
8742
+ rhythm: z$1.enum(["single", "double"]),
8743
+ symmetry: z$1.enum([
8744
+ "symmetrical",
8745
+ "asymmetrical",
8746
+ "drift"
8747
+ ])
8748
+ }).strict(),
8749
+ z$1.object({
8750
+ kind: z$1.literal("angle-edge"),
8751
+ height: z$1.enum([
8752
+ "compact",
8753
+ "medium",
8754
+ "large"
8755
+ ]),
8756
+ slope: z$1.enum([
8757
+ "subtle",
8758
+ "balanced",
8759
+ "steep"
8760
+ ]),
8761
+ direction: z$1.enum(["forward", "reverse"])
8762
+ }).strict(),
8763
+ z$1.object({
8764
+ kind: z$1.literal("legacy-unsupported"),
8765
+ boundaryOptionId: z$1.string().min(1).transform(asBoundaryOptionId)
8766
+ }).strict()
8767
+ ]);
8768
+ const pageDesignUserPinnedBoundaryTreatmentChoiceSchema = z$1.object({
8769
+ kind: z$1.literal("user-pinned"),
8770
+ value: pageDesignBoundaryTreatmentSchema
8771
+ }).strict();
8772
+ const pageDesignBlockLookPinSchema = z$1.object({
8773
+ blockId: z$1.string().min(1).transform(asDesignBlockId),
8774
+ blockKind: z$1.string().min(1),
8775
+ choice: pageDesignUserPinnedAppearanceChoiceSchema
8776
+ }).strict();
8777
+ const pageDesignBoundaryPinSchema = z$1.object({
8778
+ boundaryId: z$1.string().min(1).transform(asDesignBoundaryId),
8779
+ previousBlockId: z$1.string().min(1).transform(asDesignBlockId),
8780
+ nextBlockId: z$1.string().min(1).transform(asDesignBlockId),
8781
+ choice: pageDesignUserPinnedBoundaryTreatmentChoiceSchema
8782
+ }).strict().superRefine(validateBoundaryPinIdMatchesBlocks);
8783
+ const legacyPageDesignBoundaryPinSchema = z$1.object({
8784
+ boundaryId: z$1.string().min(1).transform(asDesignBoundaryId),
8785
+ previousBlockId: z$1.string().min(1).transform(asDesignBlockId),
8786
+ nextBlockId: z$1.string().min(1).transform(asDesignBlockId),
8787
+ choice: pageDesignUserPinnedBoundaryChoiceSchema
8788
+ }).strict().superRefine(validateBoundaryPinIdMatchesBlocks);
8789
+ z$1.object({
8790
+ schemaVersion: z$1.literal(1),
8791
+ siteStyleId: z$1.string().min(1).transform(asSiteStyleId),
8792
+ pageFlowPresetId: z$1.string().min(1).transform(asPageFlowPresetId),
8793
+ blockLookPins: z$1.array(pageDesignBlockLookPinSchema),
8794
+ boundaryPins: z$1.array(legacyPageDesignBoundaryPinSchema)
8795
+ }).strict().superRefine(validateUniquePageDesignPins);
8796
+ z$1.object({
8797
+ schemaVersion: z$1.literal(2),
8798
+ siteStyleId: z$1.string().min(1).transform(asSiteStyleId),
8799
+ pageFlowPresetId: z$1.string().min(1).transform(asPageFlowPresetId),
8800
+ blockLookPins: z$1.array(pageDesignBlockLookPinSchema),
8801
+ boundaryPins: z$1.array(pageDesignBoundaryPinSchema)
8802
+ }).strict().superRefine(validateUniquePageDesignPins);
8803
+ function addDuplicateStringIssues(ctx, input) {
8804
+ const seen = /* @__PURE__ */ new Set();
8805
+ const duplicates = /* @__PURE__ */ new Set();
8806
+ for (const value of input.values) {
8807
+ if (seen.has(value)) duplicates.add(value);
8808
+ seen.add(value);
8809
+ }
8810
+ for (const duplicate of duplicates) ctx.addIssue({
8811
+ code: z$1.ZodIssueCode.custom,
8812
+ path: [...input.path],
8813
+ message: `Duplicate ${input.label}: ${duplicate}.`
8814
+ });
9020
8815
  }
9021
- function solidBrandHeader(theme) {
9022
- const ctaVariant = resolveHeaderCtaVariant(theme, "inverted");
9023
- return {
9024
- ...baseHeader(theme),
9025
- variant: "classic",
9026
- positioning: "sticky",
9027
- shrinkOnScroll: true,
9028
- background: {
9029
- type: "color",
9030
- color: "primary"
9031
- },
9032
- textColor: "primaryForeground",
9033
- navColor: "primaryForeground",
9034
- navStyle: "underline-grow",
9035
- navWeight: "bold",
9036
- navLinkStyle: {
9037
- typography: "body",
9038
- fontWeight: "bold",
9039
- textTransform: "uppercase",
9040
- italic: false,
9041
- colorToken: "primaryForeground",
9042
- hoverColorToken: "secondary",
9043
- textSize: "sm",
9044
- letterSpacing: "wider",
9045
- padding: "compact",
9046
- paddingX: "compact",
9047
- borderRadius: "none",
9048
- effects: { hover: [{
9049
- effectId: "text-color-change",
9050
- options: { hoverColorToken: "secondary" }
9051
- }, {
9052
- effectId: "nav-underline",
9053
- options: {
9054
- style: "grow",
9055
- colorToken: "secondary"
9056
- }
9057
- }] }
9058
- },
9059
- dropdownStyle: {
9060
- background: "primary-700",
9061
- textColor: "primaryForeground",
9062
- borderColor: null,
9063
- shadow: "md",
9064
- borderRadius: "md",
9065
- hoverBackground: "primary-900",
9066
- hoverTextColor: "secondary",
9067
- textTransform: "uppercase",
9068
- letterSpacing: "wider",
9069
- fontWeight: "bold",
9070
- textSize: "sm"
9071
- },
9072
- border: {
9073
- style: "solid",
9074
- width: "none",
9075
- position: "none"
9076
- },
9077
- logoText: {
9078
- hideOnShrink: true,
9079
- mobileMaxWidth: "sm",
9080
- mobileWrapLines: 2
9081
- },
9082
- ctaGap: "compact",
9083
- ctaTreatment: "inverted",
9084
- ...ctaVariant ? { ctaVariant } : {}
9085
- };
9086
- }
9087
- function cleanBaseHeader(theme) {
9088
- return {
9089
- ...baseHeader(theme),
9090
- variant: "classic",
9091
- positioning: "sticky",
9092
- shrinkOnScroll: false,
9093
- background: {
9094
- type: "color",
9095
- color: "surface"
9096
- },
9097
- textColor: "text",
9098
- navColor: "text",
9099
- navStyle: "minimal",
9100
- navWeight: "medium",
9101
- border: {
9102
- style: "solid",
9103
- width: "thin",
9104
- position: "bottom",
9105
- colorToken: "border"
9106
- },
9107
- ctaTreatment: "default",
9108
- ctaGap: "default"
9109
- };
8816
+ function validateBoundaryPinIdMatchesBlocks(pin, ctx) {
8817
+ const expectedBoundaryId = makeBoundaryId(pin.previousBlockId, pin.nextBlockId);
8818
+ if (pin.boundaryId !== expectedBoundaryId) ctx.addIssue({
8819
+ code: z$1.ZodIssueCode.custom,
8820
+ path: ["boundaryId"],
8821
+ message: `Boundary id must match previousBlockId and nextBlockId. Expected ${expectedBoundaryId}.`
8822
+ });
9110
8823
  }
9111
- function classicCenteredNavHeader(theme) {
9112
- return {
9113
- ...baseHeader(theme),
9114
- variant: "classic",
9115
- navPlacement: "center",
9116
- positioning: "sticky",
9117
- shrinkOnScroll: false,
9118
- background: {
9119
- type: "color",
9120
- color: "surface"
9121
- },
9122
- textColor: "text",
9123
- navColor: "text",
9124
- navStyle: "underline-grow",
9125
- navWeight: "medium",
9126
- navLinkStyle: underlineNavLinkStyle("text", "accent"),
9127
- border: {
9128
- style: "solid",
9129
- width: "thin",
9130
- position: "bottom",
9131
- colorToken: "border"
9132
- },
9133
- ctaTreatment: "primary",
9134
- ctaVariant: resolveHeaderCtaVariant(theme, "primary"),
9135
- ctaGap: "default",
9136
- logoText: {
9137
- mobileMaxWidth: "sm",
9138
- mobileWrapLines: 1,
9139
- hideOnShrink: false
9140
- }
9141
- };
8824
+ function validateUniquePageDesignPins(intent, ctx) {
8825
+ addDuplicateStringIssues(ctx, {
8826
+ values: intent.blockLookPins.map((pin) => pin.blockId),
8827
+ path: ["blockLookPins"],
8828
+ label: "block Look pin"
8829
+ });
8830
+ addDuplicateStringIssues(ctx, {
8831
+ values: intent.boundaryPins.map((pin) => boundaryKey(pin.previousBlockId, pin.nextBlockId)),
8832
+ path: ["boundaryPins"],
8833
+ label: "boundary pin"
8834
+ });
9142
8835
  }
9143
- function serifLineHeader(theme) {
9144
- return {
9145
- ...baseHeader(theme),
9146
- variant: "centered",
9147
- positioning: "sticky",
9148
- shrinkOnScroll: false,
9149
- background: {
9150
- type: "color",
9151
- color: "background"
9152
- },
9153
- textColor: "text",
9154
- navColor: "text",
9155
- navStyle: "underline-grow",
9156
- navWeight: "medium",
9157
- logo: {
9158
- fontFamily: "heading",
9159
- letterSpacing: "wide",
9160
- gradient: false
9161
- },
9162
- border: {
9163
- style: "solid",
9164
- width: "none",
9165
- position: "none"
9166
- },
9167
- shadow: { elevation: "none" },
9168
- ctaTreatment: "outline",
9169
- ctaVariant: resolveHeaderCtaVariant(theme, "outline"),
9170
- ctaGap: "relaxed"
9171
- };
8836
+ function boundaryKey(previousBlockId, nextBlockId) {
8837
+ return makeBoundaryId(previousBlockId, nextBlockId);
9172
8838
  }
9173
- function centeredCalmHeader(theme) {
9174
- return {
9175
- ...baseHeader(theme),
9176
- variant: "centered",
9177
- positioning: "static",
9178
- shrinkOnScroll: false,
9179
- background: {
9180
- type: "color",
9181
- color: "surface"
9182
- },
9183
- textColor: "text",
9184
- navColor: "text",
9185
- navStyle: "minimal",
9186
- navWeight: "medium",
9187
- ctaTreatment: "ghost",
9188
- ctaVariant: resolveHeaderCtaVariant(theme, "ghost"),
9189
- ctaGap: "none"
9190
- };
9191
- }
9192
- function practicalUtilityHeader(theme) {
9193
- return {
9194
- ...baseHeader(theme),
9195
- variant: "classic",
9196
- positioning: "sticky",
9197
- shrinkOnScroll: true,
9198
- background: {
9199
- type: "color",
9200
- color: "surface"
9201
- },
9202
- textColor: "text",
9203
- navColor: "text",
9204
- navStyle: "solid",
9205
- navWeight: "semibold",
9206
- shadow: themedHeaderShadow(theme),
9207
- border: {
9208
- style: "solid",
9209
- width: "thin",
9210
- position: "bottom",
9211
- colorToken: "border"
9212
- },
9213
- ctaTreatment: "primary",
9214
- ctaVariant: resolveHeaderCtaVariant(theme, "primary"),
9215
- ctaGap: "compact",
9216
- logoText: {
9217
- mobileMaxWidth: "sm",
9218
- mobileWrapLines: 1,
9219
- hideOnShrink: false
8839
+ //#endregion
8840
+ //#region ../theme-core/src/accordions/siteStyleDefaults.ts
8841
+ /**
8842
+ * Reusable accordion "looks" for curated site styles.
8843
+ *
8844
+ * Each curated site style should declare one of these (or a bespoke variant)
8845
+ * via `themeOverrides.accordions` so its FAQ accordions carry the style's
8846
+ * personality instead of falling back to the generic generated default. The
8847
+ * looks vary the things that make an accordion read as designed vs. cheap:
8848
+ * box vs. boxless, question typography (body vs. heading font + scale), icon,
8849
+ * and how an open item is emphasised.
8850
+ */
8851
+ /**
8852
+ * Boxless editorial list: transparent root, hairline dividers between rows,
8853
+ * generous spacing, heading-font questions, plus/minus marks, and an accented
8854
+ * tinted band on the open row. The reference "expensive" FAQ look.
8855
+ */
8856
+ const editorialDividedAccordionSystem = {
8857
+ background: null,
8858
+ spacing: "comfortable",
8859
+ corners: "square",
8860
+ border: null,
8861
+ shadow: null,
8862
+ icon: {
8863
+ style: "plus-minus",
8864
+ position: "right",
8865
+ size: "md",
8866
+ colorToken: "primary"
8867
+ },
8868
+ trigger: {
8869
+ textColorToken: "text",
8870
+ fontWeight: "regular",
8871
+ fontFamily: "heading",
8872
+ fontScale: "lg"
8873
+ },
8874
+ hover: { textColorToken: "primary" },
8875
+ openState: {
8876
+ backgroundColorToken: "surfaceAlt",
8877
+ triggerColorToken: "primary",
8878
+ accent: {
8879
+ edge: "left",
8880
+ colorToken: "primary",
8881
+ thickness: "medium"
9220
8882
  }
9221
- };
9222
- }
9223
- function minimalTransparentHeader(theme) {
9224
- return {
9225
- ...baseHeader(theme),
9226
- variant: "classic",
9227
- positioning: "static",
9228
- shrinkOnScroll: false,
9229
- background: {
9230
- type: "color",
9231
- color: "transparent"
9232
- },
9233
- textColor: "text",
9234
- navColor: "text",
9235
- navStyle: "underline",
9236
- navWeight: "medium",
9237
- border: {
9238
- style: "solid",
9239
- width: "none",
9240
- position: "none"
9241
- },
9242
- ctaTreatment: "outline",
9243
- ctaVariant: resolveHeaderCtaVariant(theme, "outline"),
9244
- ctaGap: "default"
9245
- };
9246
- }
9247
- function transparentOverlayHeader(theme) {
9248
- return {
9249
- ...baseHeader(theme),
9250
- variant: "transparent",
9251
- positioning: "fixed",
9252
- shrinkOnScroll: true,
9253
- background: {
9254
- type: "color",
9255
- color: "transparent"
9256
- },
9257
- textColor: "background",
9258
- navColor: "background",
9259
- navStyle: "frosted",
9260
- navWeight: "semibold",
9261
- border: {
9262
- style: "solid",
9263
- width: "none",
9264
- position: "none"
9265
- },
9266
- ctaTreatment: "inverted",
9267
- ctaVariant: resolveHeaderCtaVariant(theme, "inverted"),
9268
- ctaGap: "compact"
9269
- };
9270
- }
9271
- function floatingGlassHeader(theme) {
9272
- return {
9273
- ...transparentOverlayHeader(theme),
9274
- variant: "floating",
9275
- positioning: "sticky",
9276
- navStyle: "frosted",
9277
- navContainer: {
9278
- type: "glass",
9279
- tint: "text",
9280
- opacity: .16
9281
- },
9282
- container: {
9283
- rounded: "2xl",
9284
- border: true,
9285
- shadow: true,
9286
- padding: "sm",
9287
- tint: "background",
9288
- opacity: .12
8883
+ },
8884
+ content: { textColorToken: "neutral-700" }
8885
+ };
8886
+ /**
8887
+ * Quiet, airy underlined rows: transparent, spacious, large calm heading-font
8888
+ * questions, a small subtle chevron, and open emphasis carried only by the
8889
+ * question recolouring. For minimal / premium / wellness styles.
8890
+ */
8891
+ const quietUnderlinedAccordionSystem = {
8892
+ background: null,
8893
+ spacing: "spacious",
8894
+ corners: "square",
8895
+ border: null,
8896
+ shadow: null,
8897
+ icon: {
8898
+ style: "chevron",
8899
+ position: "right",
8900
+ size: "sm",
8901
+ colorToken: "muted"
8902
+ },
8903
+ trigger: {
8904
+ textColorToken: "text",
8905
+ fontWeight: "regular",
8906
+ fontFamily: "heading",
8907
+ fontScale: "lg"
8908
+ },
8909
+ hover: { textColorToken: "primary" },
8910
+ openState: { triggerColorToken: "primary" },
8911
+ content: { textColorToken: "neutral-700" }
8912
+ };
8913
+ /**
8914
+ * Soft contained panel: a gentle surface box with soft corners, a hairline
8915
+ * border and a low shadow, heading-font questions at a moderate size, chevron,
8916
+ * and a tinted open state. For clean, trustworthy, appointment-led styles.
8917
+ */
8918
+ const calmPanelAccordionSystem = {
8919
+ background: {
8920
+ type: "solid",
8921
+ colorToken: "surface"
8922
+ },
8923
+ spacing: "comfortable",
8924
+ corners: "soft",
8925
+ border: {
8926
+ widthClass: "border",
8927
+ colorToken: "border"
8928
+ },
8929
+ shadow: {
8930
+ elevation: "low",
8931
+ softness: "soft",
8932
+ position: "bottom"
8933
+ },
8934
+ icon: {
8935
+ style: "chevron",
8936
+ position: "right",
8937
+ size: "md",
8938
+ colorToken: "primary"
8939
+ },
8940
+ trigger: {
8941
+ textColorToken: "text",
8942
+ fontWeight: "medium",
8943
+ fontFamily: "heading",
8944
+ fontScale: "md"
8945
+ },
8946
+ hover: {
8947
+ backgroundColorToken: "primary/5",
8948
+ textColorToken: "primary"
8949
+ },
8950
+ openState: {
8951
+ backgroundColorToken: "primary/5",
8952
+ triggerColorToken: "primary"
8953
+ },
8954
+ content: { textColorToken: "neutral-700" }
8955
+ };
8956
+ /**
8957
+ * Bold bordered panel: a strong-bordered surface box, bold heading-font
8958
+ * questions, large plus/minus marks, and a high-emphasis tinted + accented
8959
+ * open state. For confident, conversion-led, high-energy styles.
8960
+ */
8961
+ const boldBorderedAccordionSystem = {
8962
+ background: {
8963
+ type: "solid",
8964
+ colorToken: "surface"
8965
+ },
8966
+ spacing: "comfortable",
8967
+ corners: "soft",
8968
+ border: {
8969
+ widthClass: "border-2",
8970
+ colorToken: "border"
8971
+ },
8972
+ shadow: null,
8973
+ icon: {
8974
+ style: "plus-minus",
8975
+ position: "right",
8976
+ size: "lg",
8977
+ colorToken: "primary"
8978
+ },
8979
+ trigger: {
8980
+ textColorToken: "text",
8981
+ fontWeight: "bold",
8982
+ fontFamily: "heading",
8983
+ fontScale: "md"
8984
+ },
8985
+ hover: {
8986
+ backgroundColorToken: "primary/10",
8987
+ textColorToken: "primary"
8988
+ },
8989
+ openState: {
8990
+ backgroundColorToken: "primary/10",
8991
+ triggerColorToken: "primary",
8992
+ accent: {
8993
+ edge: "left",
8994
+ colorToken: "primary",
8995
+ thickness: "thick"
9289
8996
  }
9290
- };
9291
- }
9292
- const headerLookCatalog = defineExactCatalog()([
8997
+ },
8998
+ content: { textColorToken: "neutral-700" }
8999
+ };
9000
+ /**
9001
+ * Warm inset tiles: a tinted (surfaceAlt) root with rounded corners and no
9002
+ * border; the open row lifts to the lighter surface colour. Friendly,
9003
+ * hands-on, community styles.
9004
+ */
9005
+ const warmInsetAccordionSystem = {
9006
+ background: {
9007
+ type: "solid",
9008
+ colorToken: "surfaceAlt"
9009
+ },
9010
+ spacing: "comfortable",
9011
+ corners: "rounded",
9012
+ border: null,
9013
+ shadow: null,
9014
+ icon: {
9015
+ style: "circle-plus-minus",
9016
+ position: "right",
9017
+ size: "md",
9018
+ colorToken: "primary"
9019
+ },
9020
+ trigger: {
9021
+ textColorToken: "text",
9022
+ fontWeight: "semibold",
9023
+ fontFamily: "heading",
9024
+ fontScale: "md"
9025
+ },
9026
+ hover: {
9027
+ backgroundColorToken: "primary/5",
9028
+ textColorToken: "primary"
9029
+ },
9030
+ openState: {
9031
+ backgroundColorToken: "surface",
9032
+ triggerColorToken: "primary"
9033
+ },
9034
+ content: { textColorToken: "neutral-700" }
9035
+ };
9036
+ /**
9037
+ * Soft Earth's grounded look: boxless, plus/minus, heading-font questions on
9038
+ * a warm ground, with a quiet open recolour.
9039
+ */
9040
+ const softEarthAccordionSystem = {
9041
+ background: {
9042
+ type: "solid",
9043
+ colorToken: "background"
9044
+ },
9045
+ spacing: "comfortable",
9046
+ corners: "square",
9047
+ border: null,
9048
+ shadow: null,
9049
+ icon: {
9050
+ style: "plus-minus",
9051
+ position: "right",
9052
+ size: "md",
9053
+ colorToken: "primary"
9054
+ },
9055
+ trigger: {
9056
+ textColorToken: "text",
9057
+ fontWeight: "medium",
9058
+ fontFamily: "heading",
9059
+ fontScale: "md"
9060
+ },
9061
+ hover: { textColorToken: "primary" },
9062
+ openState: { triggerColorToken: "primary" },
9063
+ content: { textColorToken: "neutral-700" }
9064
+ };
9065
+ //#endregion
9066
+ //#region ../theme-core/src/cards/siteStyleDefaults.ts
9067
+ /**
9068
+ * Reusable card systems for curated site styles.
9069
+ *
9070
+ * generateCardCss emits a `.card-{id}` class per enabled variant. The
9071
+ * intended convention (block-level role selection is wired in a follow-up) is
9072
+ * a role pair:
9073
+ * - `default` — the quiet, everyday card (most blocks, most of the time)
9074
+ * - `alternative` — the prominent "statement" card for sections that pop
9075
+ * A card-heavy site style may add a third; the schema allows up to three
9076
+ * variants. The planned fallback when a block references a missing variant is
9077
+ * `alternative`, then `default`.
9078
+ *
9079
+ * Keep `default` close to the generated baseline so shared consumers (event
9080
+ * cards, testimonials) stay stable; put the personality in `alternative`.
9081
+ */
9082
+ /**
9083
+ * South West Twerk School: a quiet default surface card plus a high-impact
9084
+ * "statement" card that reproduces the legacy accent-quote testimonial surface
9085
+ * — burgundy fill, light text, a heavy gold left accent bar, and an expressive
9086
+ * asymmetric top-right corner.
9087
+ */
9088
+ const southWestCardSystem = { variants: [{
9089
+ id: "default",
9090
+ name: "Default",
9091
+ enabled: true,
9092
+ priority: 1,
9093
+ background: {
9094
+ type: "solid",
9095
+ colorToken: "surface"
9096
+ },
9097
+ foregroundToken: "text",
9098
+ spacing: "comfortable",
9099
+ corners: "soft",
9100
+ shadow: {
9101
+ elevation: "low",
9102
+ softness: "soft",
9103
+ position: "bottom"
9104
+ }
9105
+ }, {
9106
+ id: "alternative",
9107
+ name: "Statement",
9108
+ enabled: true,
9109
+ priority: 2,
9110
+ background: {
9111
+ type: "solid",
9112
+ colorToken: "primary-700"
9113
+ },
9114
+ foregroundToken: "primaryForeground",
9115
+ spacing: "comfortable",
9116
+ shadow: {
9117
+ elevation: "none",
9118
+ softness: null,
9119
+ position: "bottom"
9120
+ },
9121
+ accentEdge: {
9122
+ edge: "left",
9123
+ colorToken: "secondary",
9124
+ width: "heavy"
9125
+ },
9126
+ cornerRadii: {
9127
+ topLeft: "square",
9128
+ topRight: "expressive",
9129
+ bottomLeft: "square",
9130
+ bottomRight: "square"
9131
+ }
9132
+ }] };
9133
+ const clarityZenCardSystem = { variants: [{
9134
+ id: "default",
9135
+ name: "Default",
9136
+ enabled: true,
9137
+ priority: 1,
9138
+ background: {
9139
+ type: "solid",
9140
+ colorToken: "surface"
9141
+ },
9142
+ foregroundToken: "text",
9143
+ spacing: "comfortable",
9144
+ corners: "rounded",
9145
+ shadow: {
9146
+ elevation: "low",
9147
+ softness: "soft",
9148
+ position: "bottom"
9149
+ }
9150
+ }, {
9151
+ id: "alternative",
9152
+ name: "Statement",
9153
+ enabled: true,
9154
+ priority: 2,
9155
+ background: {
9156
+ type: "solid",
9157
+ colorToken: "surfaceAlt"
9158
+ },
9159
+ foregroundToken: "text",
9160
+ spacing: "comfortable",
9161
+ corners: "rounded",
9162
+ shadow: {
9163
+ elevation: "medium",
9164
+ softness: "soft",
9165
+ position: "bottom"
9166
+ }
9167
+ }] };
9168
+ /**
9169
+ * Original Joy: warm, flat, generously rounded cards on the dark clay ground.
9170
+ * `default` is a quiet brown surface card with cream text; `alternative` is a
9171
+ * burnt-orange statement card for sections that should pop. Both flat (the
9172
+ * look's depth comes from colour, not shadow), matching the bold editorial
9173
+ * feel. Shared by event and testimonial cards.
9174
+ */
9175
+ const originalJoyCardSystem = { variants: [{
9176
+ id: "default",
9177
+ name: "Default",
9178
+ enabled: true,
9179
+ priority: 1,
9180
+ background: {
9181
+ type: "solid",
9182
+ colorToken: "surface"
9183
+ },
9184
+ foregroundToken: "text",
9185
+ spacing: "comfortable",
9186
+ corners: "rounded",
9187
+ shadow: {
9188
+ elevation: "none",
9189
+ softness: null,
9190
+ position: "bottom"
9191
+ }
9192
+ }, {
9193
+ id: "alternative",
9194
+ name: "Statement",
9195
+ enabled: true,
9196
+ priority: 2,
9197
+ background: {
9198
+ type: "solid",
9199
+ colorToken: "primary"
9200
+ },
9201
+ foregroundToken: "primaryForeground",
9202
+ spacing: "comfortable",
9203
+ corners: "rounded",
9204
+ shadow: {
9205
+ elevation: "none",
9206
+ softness: null,
9207
+ position: "bottom"
9208
+ }
9209
+ }] };
9210
+ //#endregion
9211
+ //#region ../theme-core/src/site-styles/testimonialQuotePresets.ts
9212
+ /**
9213
+ * Reusable testimonial quote-mark treatments for curated site styles.
9214
+ *
9215
+ * The quote mark is brand identity the site style owns (analogous to the FAQ
9216
+ * accordion icon); every curated style declares one. `style` is the coarse
9217
+ * selector and the resolver in blocks/vars/testimonials.ts fills in the rest.
9218
+ */
9219
+ /** Large display quotation mark in the heading font. Editorial / calm styles. */
9220
+ const serifDisplayQuote = { style: "serif-display" };
9221
+ /** Punchy quotation mark in the secondary accent colour. Bold / accent styles. */
9222
+ const accentGlyphQuote = { style: "accent-glyph" };
9223
+ /**
9224
+ * Curated library of gradient presets.
9225
+ * All gradients use theme color tokens, so they adapt to the site's palette.
9226
+ */
9227
+ const GRADIENT_PRESETS = [
9293
9228
  {
9294
- id: asHeaderLookId("clean-base"),
9295
- label: "Clean base",
9296
- visualTreatment: "solid-neutral",
9297
- layoutBehavior: "sticky",
9298
- configuration: {
9299
- structure: "inline-classic",
9300
- treatment: "solid-neutral",
9301
- behavior: "sticky"
9302
- },
9303
- openingRequirement: "none",
9304
- logoAccommodations: inlineClassicLogoAccommodations,
9305
- compile: cleanBaseHeader
9229
+ id: "primary-secondary",
9230
+ name: "Primary to Secondary",
9231
+ description: "Blend your primary and secondary brand colors",
9232
+ type: "linear",
9233
+ angle: 135,
9234
+ stops: [{
9235
+ color: "primary-500",
9236
+ position: 0
9237
+ }, {
9238
+ color: "secondary-500",
9239
+ position: 100
9240
+ }]
9306
9241
  },
9307
9242
  {
9308
- id: asHeaderLookId("classic-centered-nav"),
9309
- label: "Centered nav",
9310
- visualTreatment: "solid-neutral",
9311
- layoutBehavior: "sticky",
9312
- configuration: {
9313
- structure: "inline-classic",
9314
- treatment: "solid-neutral",
9315
- behavior: "sticky"
9316
- },
9317
- openingRequirement: "none",
9318
- maxRecommendedNavItems: 6,
9319
- logoAccommodations: inlineClassicLogoAccommodations,
9320
- compile: classicCenteredNavHeader
9243
+ id: "primary-accent",
9244
+ name: "Primary to Accent",
9245
+ description: "Energetic gradient from primary to accent",
9246
+ type: "linear",
9247
+ angle: 135,
9248
+ stops: [{
9249
+ color: "primary-500",
9250
+ position: 0
9251
+ }, {
9252
+ color: "accent-500",
9253
+ position: 100
9254
+ }]
9321
9255
  },
9322
9256
  {
9323
- id: asHeaderLookId("brand-solid"),
9324
- label: "Brand solid",
9325
- visualTreatment: "solid-brand",
9326
- layoutBehavior: "sticky-shrink",
9327
- configuration: {
9328
- structure: "inline-classic",
9329
- treatment: "solid-brand",
9330
- behavior: "sticky-shrink"
9331
- },
9332
- openingRequirement: "none",
9333
- logoAccommodations: inlineClassicLogoAccommodations,
9334
- compile: solidBrandHeader
9257
+ id: "secondary-accent",
9258
+ name: "Secondary to Accent",
9259
+ description: "Vibrant secondary to accent blend",
9260
+ type: "linear",
9261
+ angle: 135,
9262
+ stops: [{
9263
+ color: "secondary-500",
9264
+ position: 0
9265
+ }, {
9266
+ color: "accent-500",
9267
+ position: 100
9268
+ }]
9335
9269
  },
9336
9270
  {
9337
- id: asHeaderLookId("serif-line"),
9338
- label: "Serif line",
9339
- visualTreatment: "light-serif",
9340
- layoutBehavior: "sticky",
9341
- configuration: {
9342
- structure: "centered-stack",
9343
- treatment: "light-serif",
9344
- behavior: "sticky"
9345
- },
9346
- openingRequirement: "none",
9347
- maxRecommendedNavItems: 6,
9348
- logoAccommodations: centeredLogoAccommodations,
9349
- compile: serifLineHeader
9271
+ id: "primary-light-dark",
9272
+ name: "Primary Light to Dark",
9273
+ description: "Subtle primary color fade",
9274
+ type: "linear",
9275
+ angle: 180,
9276
+ stops: [{
9277
+ color: "primary-500",
9278
+ position: 0
9279
+ }, {
9280
+ color: "primary-900",
9281
+ position: 100
9282
+ }]
9350
9283
  },
9351
9284
  {
9352
- id: asHeaderLookId("centered-calm"),
9353
- label: "Centered calm",
9354
- visualTreatment: "light-serif",
9355
- layoutBehavior: "normal-flow",
9356
- configuration: {
9357
- structure: "centered-stack",
9358
- treatment: "light-serif",
9359
- behavior: "normal-flow"
9360
- },
9361
- openingRequirement: "none",
9362
- maxRecommendedNavItems: 5,
9363
- logoAccommodations: centeredLogoAccommodations,
9364
- compile: centeredCalmHeader
9285
+ id: "primary-dark-light",
9286
+ name: "Primary Dark to Light",
9287
+ description: "Reverse primary fade",
9288
+ type: "linear",
9289
+ angle: 180,
9290
+ stops: [{
9291
+ color: "primary-900",
9292
+ position: 0
9293
+ }, {
9294
+ color: "primary-50",
9295
+ position: 100
9296
+ }]
9365
9297
  },
9366
9298
  {
9367
- id: asHeaderLookId("practical-utility"),
9368
- label: "Practical utility",
9369
- visualTreatment: "solid-neutral",
9370
- layoutBehavior: "sticky-shrink",
9371
- configuration: {
9372
- structure: "inline-classic",
9373
- treatment: "solid-neutral",
9374
- behavior: "sticky-shrink"
9375
- },
9376
- openingRequirement: "none",
9377
- requiresProminentCta: true,
9378
- logoAccommodations: inlineClassicLogoAccommodations,
9379
- compile: practicalUtilityHeader
9299
+ id: "secondary-light-dark",
9300
+ name: "Secondary Light to Dark",
9301
+ description: "Subtle secondary color fade",
9302
+ type: "linear",
9303
+ angle: 180,
9304
+ stops: [{
9305
+ color: "secondary-500",
9306
+ position: 0
9307
+ }, {
9308
+ color: "secondary-900",
9309
+ position: 100
9310
+ }]
9311
+ },
9312
+ {
9313
+ id: "accent-light-dark",
9314
+ name: "Accent Light to Dark",
9315
+ description: "Accent color depth fade",
9316
+ type: "linear",
9317
+ angle: 180,
9318
+ stops: [{
9319
+ color: "accent-500",
9320
+ position: 0
9321
+ }, {
9322
+ color: "accent-900",
9323
+ position: 100
9324
+ }]
9325
+ },
9326
+ {
9327
+ id: "background-surface",
9328
+ name: "Background to Surface",
9329
+ description: "Subtle depth using base colors",
9330
+ type: "linear",
9331
+ angle: 180,
9332
+ stops: [{
9333
+ color: "background",
9334
+ position: 0
9335
+ }, {
9336
+ color: "surface",
9337
+ position: 100
9338
+ }]
9380
9339
  },
9381
9340
  {
9382
- id: asHeaderLookId("minimal-transparent"),
9383
- label: "Minimal transparent",
9384
- visualTreatment: "minimal-transparent",
9385
- layoutBehavior: "normal-flow",
9386
- configuration: {
9387
- structure: "inline-classic",
9388
- treatment: "minimal-transparent",
9389
- behavior: "normal-flow"
9390
- },
9391
- openingRequirement: "reserved-space-ok",
9392
- logoAccommodations: inlineClassicLogoAccommodations,
9393
- compile: minimalTransparentHeader
9341
+ id: "neutral-fade",
9342
+ name: "Neutral Gradient",
9343
+ description: "Elegant neutral color fade",
9344
+ type: "linear",
9345
+ angle: 180,
9346
+ stops: [{
9347
+ color: "neutral-900",
9348
+ position: 0
9349
+ }, {
9350
+ color: "neutral-50",
9351
+ position: 100
9352
+ }]
9394
9353
  },
9395
9354
  {
9396
- id: asHeaderLookId("transparent-overlay"),
9397
- label: "Transparent overlay",
9398
- visualTreatment: "transparent-overlay",
9399
- layoutBehavior: "fixed-overlay",
9400
- configuration: {
9401
- structure: "inline-classic",
9402
- treatment: "transparent-overlay",
9403
- behavior: "fixed-overlay"
9404
- },
9405
- openingRequirement: "requires-image-hero-with-contrast-overlay",
9406
- maxRecommendedNavItems: 5,
9407
- logoAccommodations: overlayLogoAccommodations,
9408
- compile: transparentOverlayHeader
9355
+ id: "primary-glow",
9356
+ name: "Primary glow",
9357
+ description: "A soft top-centred glow using your primary palette",
9358
+ type: "radial",
9359
+ shape: "ellipse",
9360
+ position: "top center",
9361
+ stops: [{
9362
+ color: "primary-900",
9363
+ position: 0
9364
+ }, {
9365
+ color: "primary-950",
9366
+ position: 100
9367
+ }],
9368
+ foreground: {
9369
+ textColor: "onPrimary900",
9370
+ headingColor: "onPrimary900",
9371
+ linkColor: "onPrimary900",
9372
+ supportingColor: "onPrimary900"
9373
+ }
9409
9374
  },
9410
9375
  {
9411
- id: asHeaderLookId("floating-glass"),
9412
- label: "Floating glass",
9413
- visualTreatment: "floating-glass",
9414
- layoutBehavior: "fixed-floating",
9415
- configuration: {
9416
- structure: "floating-shell",
9417
- treatment: "floating-glass",
9418
- behavior: "fixed-floating"
9419
- },
9420
- openingRequirement: "requires-image-hero-with-contrast-overlay",
9421
- maxRecommendedNavItems: 5,
9422
- logoAccommodations: overlayLogoAccommodations,
9423
- compile: floatingGlassHeader
9376
+ id: "accent-glow",
9377
+ name: "Accent glow",
9378
+ description: "A soft top-centred glow using your accent palette",
9379
+ type: "radial",
9380
+ shape: "ellipse",
9381
+ position: "top center",
9382
+ stops: [{
9383
+ color: "accent-900",
9384
+ position: 0
9385
+ }, {
9386
+ color: "accent-950",
9387
+ position: 100
9388
+ }],
9389
+ foreground: {
9390
+ textColor: "onAccent900",
9391
+ headingColor: "onAccent900",
9392
+ linkColor: "onAccent900",
9393
+ supportingColor: "onAccent900"
9394
+ }
9395
+ },
9396
+ {
9397
+ id: "primary-secondary-accent",
9398
+ name: "Brand Trio",
9399
+ description: "All three brand colors in harmony",
9400
+ type: "linear",
9401
+ angle: 135,
9402
+ stops: [
9403
+ {
9404
+ color: "primary-500",
9405
+ position: 0
9406
+ },
9407
+ {
9408
+ color: "secondary-500",
9409
+ position: 50
9410
+ },
9411
+ {
9412
+ color: "accent-500",
9413
+ position: 100
9414
+ }
9415
+ ]
9424
9416
  }
9425
- ]);
9426
- new Set(headerLookCatalog.map((look) => headerConfigurationKey(look.configuration)));
9427
- new Map(headerLookCatalog.map((look) => [look.id, look]));
9428
- function headerConfigurationKey(configuration) {
9429
- return `${configuration.structure}:${configuration.treatment}:${configuration.behavior}`;
9417
+ ].map((preset) => ({
9418
+ ...preset,
9419
+ id: preset.id,
9420
+ stops: preset.stops
9421
+ }));
9422
+ const GRADIENT_PRESET_IDS = GRADIENT_PRESETS.map((preset) => preset.id);
9423
+ const gradientPresetIdSet = new Set(GRADIENT_PRESET_IDS);
9424
+ Object.fromEntries(GRADIENT_PRESETS.map((preset) => [preset.id, preset]));
9425
+ function parseGradientPresetId(value) {
9426
+ if (typeof value !== "string") return null;
9427
+ const normalized = value.trim();
9428
+ if (!gradientPresetIdSet.has(normalized)) return null;
9429
+ return normalized;
9430
9430
  }
9431
9431
  //#endregion
9432
9432
  //#region ../theme-core/src/site-styles/footerLooks.ts
@@ -22189,16 +22189,15 @@ const coursePricingSchema = z$1.object({
22189
22189
  /**
22190
22190
  * Zod schema for public course data
22191
22191
  */
22192
- const publicCourseSchema = z$1.object({
22193
- id: z$1.string(),
22194
- seriesId: z$1.string(),
22192
+ const publicWholeSeriesOfferingSchema = z$1.object({
22193
+ eventSeriesId: z$1.string(),
22194
+ eventOfferingId: z$1.string(),
22195
22195
  title: z$1.string(),
22196
22196
  slug: z$1.string(),
22197
22197
  description: z$1.unknown().nullable(),
22198
22198
  teamMembers: z$1.array(courseTeamMemberSummarySchema).optional(),
22199
22199
  enrollmentOpen: z$1.boolean(),
22200
- pricing: coursePricingSchema.optional(),
22201
- priceCents: z$1.number().nullable(),
22200
+ pricing: coursePricingSchema,
22202
22201
  currency: z$1.string(),
22203
22202
  paymentTerms: blockBookingPaymentTermsSchema,
22204
22203
  enrollmentCapacity: z$1.number().nullable(),
@@ -22212,18 +22211,17 @@ const publicCourseSchema = z$1.object({
22212
22211
  enrolledCount: z$1.number(),
22213
22212
  availableSpots: z$1.number().nullable(),
22214
22213
  sessions: z$1.array(courseSessionSchema),
22215
- venue: courseVenueSchema.nullable(),
22216
- contentEntryId: z$1.string().nullable()
22214
+ venue: courseVenueSchema.nullable()
22217
22215
  });
22218
- /**
22219
- * Schema for an array of public courses
22220
- */
22221
- const publicCoursesArraySchema = z$1.array(publicCourseSchema);
22216
+ /** Deployed course blocks retain this schema alias for stored content. */
22217
+ const publicCourseSchema = publicWholeSeriesOfferingSchema;
22218
+ const publicCoursesArraySchema = z$1.array(publicWholeSeriesOfferingSchema);
22222
22219
  //#endregion
22223
22220
  //#region ../blocks/src/system/blocks/events/shared/schemas.ts
22224
22221
  const eventPresetSchema = z$1.enum([
22225
22222
  "event",
22226
22223
  "class",
22224
+ "course",
22227
22225
  "workshop",
22228
22226
  "retreat",
22229
22227
  "performance"
@@ -22490,7 +22488,7 @@ const publicTeamMemberSummarySchema = z$1.object({
22490
22488
  * Zod schema for public event data
22491
22489
  */
22492
22490
  const publicEventSchema = z$1.object({
22493
- kind: z$1.enum(["event", "course_session"]).optional(),
22491
+ bookingScope: z$1.enum(["single_occurrence", "whole_series"]),
22494
22492
  eventPreset: eventPresetSchema.optional(),
22495
22493
  eventDestinationMode: eventDestinationModeSchema.optional(),
22496
22494
  scheduleScope: eventScheduleScopeSchema$2.optional(),
@@ -22538,10 +22536,9 @@ const publicEventSchema = z$1.object({
22538
22536
  requireGuestDetails: z$1.boolean().optional(),
22539
22537
  acceptsPasses: z$1.boolean().optional(),
22540
22538
  acceptsMemberships: z$1.boolean().optional(),
22541
- course: z$1.object({
22542
- id: z$1.string(),
22543
- pricing: coursePricingSchema.optional(),
22544
- priceCents: z$1.number().nullable(),
22539
+ wholeSeries: z$1.object({
22540
+ eventSeriesId: z$1.string(),
22541
+ pricing: coursePricingSchema,
22545
22542
  currency: z$1.string(),
22546
22543
  enrollmentOpen: z$1.boolean()
22547
22544
  }).nullable().optional()
@@ -22706,12 +22703,8 @@ function normalizeIdList(parts) {
22706
22703
  }
22707
22704
  //#endregion
22708
22705
  //#region ../blocks/src/system/blocks/events/shared/filtering.ts
22709
- const eventBlockKindValues = [
22710
- "all",
22711
- "courses",
22712
- "events"
22713
- ];
22714
22706
  const eventSurfacePresetValues = [
22707
+ "course",
22715
22708
  "class",
22716
22709
  "workshop",
22717
22710
  "retreat",
@@ -22730,9 +22723,6 @@ const eventScheduleScopeValues = [
22730
22723
  ];
22731
22724
  const unsafeAsEventCategoryId = (value) => value;
22732
22725
  const unsafeAsVenueId = (value) => value;
22733
- function normalizeEventBlockKind(value) {
22734
- return value === "courses" || value === "events" ? value : "all";
22735
- }
22736
22726
  function normalizeEventSurfaceScope(value) {
22737
22727
  return value === "regularClassSchedule" || value === "specialDatedEvents" || value === "custom" ? value : "all";
22738
22728
  }
@@ -22834,61 +22824,6 @@ const occurrenceContextSchema$1 = z$1.object({
22834
22824
  capacityOverride: z$1.number().nullable().optional(),
22835
22825
  overrides: z$1.record(z$1.string(), z$1.unknown()).nullable().optional()
22836
22826
  }).nullable();
22837
- //#endregion
22838
- //#region ../blocks/src/system/constants/events.ts
22839
- /**
22840
- * Content type slugs that represent event content.
22841
- * These are the standard slugs used when creating event content types in the CMS.
22842
- *
22843
- * Used by:
22844
- * - Occurrence resolution to detect event pages
22845
- * - Event Calendar block to identify event content
22846
- * - Content type definitions
22847
- */
22848
- const EVENT_CONTENT_TYPE_SLUGS = ["event", "events"];
22849
- const eventCalendarDisplayModeValues = [
22850
- "combined",
22851
- "calendar",
22852
- "list",
22853
- "timetable",
22854
- "week-board"
22855
- ];
22856
- const eventCalendarDefaultViewValues = ["month", "week"];
22857
- const eventCalendarListLayoutValues = [
22858
- "stack",
22859
- "grid",
22860
- "compact"
22861
- ];
22862
- const eventCalendarListLayoutOptions = [
22863
- {
22864
- id: "stack",
22865
- label: "Stack"
22866
- },
22867
- {
22868
- id: "grid",
22869
- label: "Grid"
22870
- },
22871
- {
22872
- id: "compact",
22873
- label: "Compact"
22874
- }
22875
- ];
22876
- function isEventCalendarDisplayMode(value) {
22877
- return typeof value === "string" && eventCalendarDisplayModeValues.includes(value);
22878
- }
22879
- function isEventCalendarDefaultView(value) {
22880
- return typeof value === "string" && eventCalendarDefaultViewValues.includes(value);
22881
- }
22882
- function isEventCalendarListLayout(value) {
22883
- return typeof value === "string" && eventCalendarListLayoutValues.includes(value);
22884
- }
22885
- /**
22886
- * Check if a content type slug represents an event type
22887
- */
22888
- function isEventContentType(slug) {
22889
- if (!slug) return false;
22890
- return EVENT_CONTENT_TYPE_SLUGS.includes(slug);
22891
- }
22892
22827
  const unsupportedEventRegistrationPageSurfaceSubjectSchema = z$1.object({
22893
22828
  kind: z$1.literal("unsupported"),
22894
22829
  reason: z$1.enum([
@@ -22927,12 +22862,6 @@ function resolveEventRegistrationScope(context) {
22927
22862
  kind: "unsupportedPageSurfaceSubject",
22928
22863
  reason: context.subject.reason
22929
22864
  };
22930
- const entrySlug = context.contentEntry?.slug;
22931
- const entryContentType = context.contentEntry?.contentTypeSlug;
22932
- if (entrySlug && entryContentType && isEventContentType(entryContentType)) return {
22933
- kind: "legacyEventSlug",
22934
- slug: entrySlug
22935
- };
22936
22865
  return { kind: "unscoped" };
22937
22866
  }
22938
22867
  function applyEventRegistrationScope(events, scope) {
@@ -22943,7 +22872,6 @@ function applyEventRegistrationScope(events, scope) {
22943
22872
  const seriesIds = new Set(scope.seriesIds);
22944
22873
  return events.filter((event) => seriesIds.has(event.seriesId));
22945
22874
  }
22946
- case "legacyEventSlug": return events.filter((event) => event.slug === scope.slug);
22947
22875
  case "unsupportedPageSurfaceSubject": return [];
22948
22876
  case "unscoped": return [...events];
22949
22877
  }
@@ -23138,6 +23066,44 @@ function readAmount(value) {
23138
23066
  return typeof value === "number" && Number.isFinite(value) ? value : null;
23139
23067
  }
23140
23068
  //#endregion
23069
+ //#region ../blocks/src/system/constants/events.ts
23070
+ const eventCalendarDisplayModeValues = [
23071
+ "combined",
23072
+ "calendar",
23073
+ "list",
23074
+ "timetable",
23075
+ "week-board"
23076
+ ];
23077
+ const eventCalendarDefaultViewValues = ["month", "week"];
23078
+ const eventCalendarListLayoutValues = [
23079
+ "stack",
23080
+ "grid",
23081
+ "compact"
23082
+ ];
23083
+ const eventCalendarListLayoutOptions = [
23084
+ {
23085
+ id: "stack",
23086
+ label: "Stack"
23087
+ },
23088
+ {
23089
+ id: "grid",
23090
+ label: "Grid"
23091
+ },
23092
+ {
23093
+ id: "compact",
23094
+ label: "Compact"
23095
+ }
23096
+ ];
23097
+ function isEventCalendarDisplayMode(value) {
23098
+ return typeof value === "string" && eventCalendarDisplayModeValues.includes(value);
23099
+ }
23100
+ function isEventCalendarDefaultView(value) {
23101
+ return typeof value === "string" && eventCalendarDefaultViewValues.includes(value);
23102
+ }
23103
+ function isEventCalendarListLayout(value) {
23104
+ return typeof value === "string" && eventCalendarListLayoutValues.includes(value);
23105
+ }
23106
+ //#endregion
23141
23107
  //#region ../blocks/src/system/runtime/nodes/shared/contract-schemas.ts
23142
23108
  const previewStageSchema = z$1.enum(["preview", "published"]);
23143
23109
  const registrationButtonVariantSchema = blockButtonRoleSchema;
@@ -23229,11 +23195,6 @@ const EVENT_REGISTRATION_SHELL_STEP_LABELS = [
23229
23195
  "Details",
23230
23196
  "Payment"
23231
23197
  ];
23232
- const contentEntrySchema$2 = z$1.object({
23233
- id: z$1.string(),
23234
- slug: z$1.string(),
23235
- contentTypeSlug: z$1.string()
23236
- });
23237
23198
  const eventRegistrationPublicEventSchema = z$1.preprocess(normalizeEventRegistrationEventInput, publicEventSchema);
23238
23199
  const eventRegistrationSourceSchema = z$1.object({
23239
23200
  siteId: z$1.string().optional(),
@@ -23241,7 +23202,6 @@ const eventRegistrationSourceSchema = z$1.object({
23241
23202
  portalToken: z$1.string().nullable().optional(),
23242
23203
  previewToken: z$1.string().nullable().optional(),
23243
23204
  occurrenceContext: occurrenceContextSchema$1.optional(),
23244
- contentEntry: contentEntrySchema$2.nullable().optional(),
23245
23205
  subject: eventRegistrationPageSurfaceSubjectSchema.nullable().optional(),
23246
23206
  events: z$1.array(eventRegistrationPublicEventSchema).nullable().optional(),
23247
23207
  className: z$1.string().nullable().optional(),
@@ -23270,7 +23230,6 @@ const eventRegistrationDisplaySchema = z$1.object({
23270
23230
  });
23271
23231
  const eventRegistrationHydrationSchema = z$1.object({
23272
23232
  occurrenceContext: occurrenceContextSchema$1.optional(),
23273
- contentEntry: contentEntrySchema$2.nullable().optional(),
23274
23233
  subject: eventRegistrationPageSurfaceSubjectSchema.nullable().optional(),
23275
23234
  events: z$1.array(eventRegistrationPublicEventSchema).nullable().optional(),
23276
23235
  maxTickets: z$1.string().optional(),
@@ -23325,8 +23284,7 @@ function buildEventRegistrationShellStepLabels(source) {
23325
23284
  function scopeEventRegistrationEvents(source) {
23326
23285
  return resolveEventRegistrationScopedEvents(toRegistrationEvents(source.events ?? []), {
23327
23286
  occurrenceContext: source.occurrenceContext,
23328
- subject: source.subject,
23329
- contentEntry: source.contentEntry
23287
+ subject: source.subject
23330
23288
  });
23331
23289
  }
23332
23290
  function shellLabelForRegistrationStep(step, events) {
@@ -23363,7 +23321,6 @@ const eventRegistrationBlockRuntime = defineClientOwnedBlockRuntime({
23363
23321
  display: buildEventRegistrationDisplay(source),
23364
23322
  hydration: {
23365
23323
  occurrenceContext: source.occurrenceContext ?? null,
23366
- contentEntry: source.contentEntry ?? null,
23367
23324
  subject: source.subject ?? null,
23368
23325
  events: source.events ?? null,
23369
23326
  maxTickets: source.maxTickets ?? void 0,
@@ -23516,7 +23473,6 @@ const eventRegistrationBlockDefinition = {
23516
23473
  richText({ className: "rb-prose rb-max-w-none" }, bind("content.description"), when("content.description")),
23517
23474
  eventRegistration(withApiBindings({
23518
23475
  occurrenceContext: { $bind: { from: "$root.occurrenceContext" } },
23519
- contentEntry: { $bind: { from: "$root.contentEntry" } },
23520
23476
  subject: { $bind: { from: "$root.subject" } },
23521
23477
  portalToken: { $bind: {
23522
23478
  from: "$root.portalToken",
@@ -23571,10 +23527,8 @@ const eventRegistrationBlockDefinition = {
23571
23527
  fallback: "published"
23572
23528
  } },
23573
23529
  readProfile: "registration",
23574
- entryId: { $bind: {
23575
- from: "$root.contentEntry._entryId",
23576
- fallback: ""
23577
- } }
23530
+ seriesId: { $bind: { from: "$root.occurrenceContext.seriesId" } },
23531
+ includeOccurrenceId: { $bind: { from: "$root.occurrenceContext.id" } }
23578
23532
  },
23579
23533
  mode: "server"
23580
23534
  },
@@ -23592,29 +23546,10 @@ const eventRegistrationBlockDefinition = {
23592
23546
  };
23593
23547
  //#endregion
23594
23548
  //#region ../blocks/src/system/runtime/nodes/course-registration.interactive.ts
23595
- const contentEntrySchema$1 = z$1.object({
23596
- id: z$1.string(),
23597
- slug: z$1.string(),
23598
- contentTypeSlug: z$1.string()
23599
- });
23600
- const courseEntrySubrouteContextSchema = z$1.union([z$1.object({
23601
- kind: z$1.literal("course-run"),
23602
- run: z$1.object({
23603
- courseId: z$1.string(),
23604
- seriesId: z$1.string(),
23605
- runSlug: z$1.string(),
23606
- runName: z$1.string().nullable()
23607
- })
23608
- }), z$1.object({
23609
- kind: z$1.literal("event-occurrence"),
23610
- occurrence: occurrenceContextSchema$1
23611
- })]);
23612
23549
  const courseRegistrationSourceSchema = z$1.object({
23613
23550
  siteId: z$1.string().optional(),
23614
23551
  apiBaseUrl: z$1.string().optional(),
23615
23552
  portalToken: z$1.string().nullable().optional(),
23616
- contentEntry: contentEntrySchema$1.nullable().optional(),
23617
- entrySubrouteContext: courseEntrySubrouteContextSchema.nullable().optional(),
23618
23553
  subject: eventRegistrationPageSurfaceSubjectSchema.nullable().optional(),
23619
23554
  courses: z$1.array(publicCourseSchema).nullable().optional(),
23620
23555
  className: z$1.string().nullable().optional(),
@@ -23636,8 +23571,6 @@ const courseRegistrationDisplaySchema = z$1.object({
23636
23571
  summaryButtonText: z$1.string()
23637
23572
  });
23638
23573
  const courseRegistrationHydrationSchema = z$1.object({
23639
- contentEntry: contentEntrySchema$1.nullable().optional(),
23640
- entrySubrouteContext: courseEntrySubrouteContextSchema.nullable().optional(),
23641
23574
  subject: eventRegistrationPageSurfaceSubjectSchema.nullable().optional(),
23642
23575
  courses: z$1.array(publicCourseSchema).nullable().optional(),
23643
23576
  showSessions: z$1.boolean().optional(),
@@ -23676,8 +23609,6 @@ const courseRegistrationBlockRuntime = defineClientOwnedBlockRuntime({
23676
23609
  buildRender: (source) => ({
23677
23610
  display: buildCourseRegistrationDisplay(source),
23678
23611
  hydration: {
23679
- contentEntry: source.contentEntry ?? null,
23680
- entrySubrouteContext: source.entrySubrouteContext ?? null,
23681
23612
  subject: source.subject ?? null,
23682
23613
  courses: source.courses ?? null,
23683
23614
  showSessions: source.showSessions,
@@ -23822,11 +23753,6 @@ const courseRegistrationBlockDefinition = {
23822
23753
  text({ as: "h2" }, bind("content.heading"), when("content.heading")),
23823
23754
  richText({ className: "rb-prose rb-max-w-none" }, bind("content.description"), when("content.description")),
23824
23755
  courseRegistration(withApiBindings({
23825
- contentEntry: { $bind: { from: "$root.contentEntry" } },
23826
- entrySubrouteContext: { $bind: {
23827
- from: "$root.entrySubrouteContext",
23828
- fallback: null
23829
- } },
23830
23756
  subject: { $bind: {
23831
23757
  from: "$root.subject",
23832
23758
  fallback: null
@@ -23862,7 +23788,7 @@ const courseRegistrationBlockDefinition = {
23862
23788
  runtime: courseRegistrationBlockRuntime,
23863
23789
  dataSchemas: { courses: publicCoursesArraySchema.optional() },
23864
23790
  dataLoaders: { courses: {
23865
- endpoint: "listPublicCourses",
23791
+ endpoint: "listPublicWholeSeriesOfferings",
23866
23792
  params: {
23867
23793
  siteId: { $bind: { from: "$root.siteId" } },
23868
23794
  limit: "50",
@@ -24007,10 +23933,6 @@ const eventDetailsManifest = createBlockManifest({
24007
23933
  from: "$root.occurrenceContext",
24008
23934
  fallback: null
24009
23935
  } },
24010
- contentEntry: { $bind: {
24011
- from: "$root.contentEntry",
24012
- fallback: null
24013
- } },
24014
23936
  events: { $bind: { from: "data.eventDetailsData.events" } },
24015
23937
  showVenue: { $bind: { from: "content.showVenue" } },
24016
23938
  showMap: { $bind: { from: "content.showMap" } },
@@ -24084,7 +24006,6 @@ const eventDetailsBlockDefinition = {
24084
24006
  fallback: "published"
24085
24007
  } },
24086
24008
  limit: "25",
24087
- entryId: { $bind: { from: "$root.contentEntry._entryId" } },
24088
24009
  seriesId: { $bind: { from: "$root.occurrenceContext.seriesId" } },
24089
24010
  includeOccurrenceId: { $bind: { from: "$root.occurrenceContext.id" } }
24090
24011
  },
@@ -24129,15 +24050,6 @@ const courseDetailsBlockDefinition = {
24129
24050
  multiline: false,
24130
24051
  defaultValue: "Course details"
24131
24052
  },
24132
- {
24133
- id: "courseSlug",
24134
- type: "text",
24135
- label: "Course slug (optional)",
24136
- description: "Select a course by slug when not used on a course template route",
24137
- required: false,
24138
- multiline: false,
24139
- ui: { intent: "behavior" }
24140
- },
24141
24053
  {
24142
24054
  id: "showTitle",
24143
24055
  type: "boolean",
@@ -24233,26 +24145,14 @@ const courseDetailsBlockDefinition = {
24233
24145
  }
24234
24146
  ],
24235
24147
  layout: [styledSection({
24236
- baseClass: "",
24237
- spacing: "spacious",
24238
- children: sectionContainer([text({ as: "h2" }, bind("content.heading"), when("content.heading")), el("course-details", {
24239
- contentEntry: { $bind: {
24240
- from: "$root.contentEntry",
24241
- fallback: null
24242
- } },
24243
- entrySubrouteContext: { $bind: {
24244
- from: "$root.entrySubrouteContext",
24245
- fallback: null
24246
- } },
24148
+ baseClass: "",
24149
+ spacing: "spacious",
24150
+ children: sectionContainer([text({ as: "h2" }, bind("content.heading"), when("content.heading")), el("course-details", {
24247
24151
  subject: { $bind: {
24248
24152
  from: "$root.subject",
24249
24153
  fallback: null
24250
24154
  } },
24251
24155
  courses: { $bind: { from: "data.courses" } },
24252
- courseSlug: { $bind: {
24253
- from: "content.courseSlug",
24254
- fallback: null
24255
- } },
24256
24156
  showTitle: { $bind: {
24257
24157
  from: "content.showTitle",
24258
24158
  fallback: false
@@ -24294,7 +24194,7 @@ const courseDetailsBlockDefinition = {
24294
24194
  }),
24295
24195
  dataSchemas: { courses: publicCoursesArraySchema.optional() },
24296
24196
  dataLoaders: { courses: {
24297
- endpoint: "listPublicCourses",
24197
+ endpoint: "listPublicWholeSeriesOfferings",
24298
24198
  params: {
24299
24199
  siteId: { $bind: { from: "$root.siteId" } },
24300
24200
  limit: "50",
@@ -24538,13 +24438,137 @@ function resolveEventListPaginationAction(input) {
24538
24438
  };
24539
24439
  }
24540
24440
  //#endregion
24441
+ //#region ../blocks/src/system/runtime/nodes/events/shared/eventCollectionContract.ts
24442
+ const eventSurfaceScopeSchema$1 = z$1.enum(eventSurfaceScopeValues);
24443
+ const eventScheduleScopeSchema$1 = z$1.enum(eventScheduleScopeValues);
24444
+ const eventCollectionFilterSourceSchemaShape = {
24445
+ showFilters: z$1.boolean().nullable().optional(),
24446
+ showCategoryFilter: filterAutoShowSchema.optional(),
24447
+ showVenueFilter: z$1.boolean().nullable().optional(),
24448
+ showStaffFilter: z$1.boolean().nullable().optional(),
24449
+ eventSurface: eventSurfaceScopeSchema$1.nullable().optional(),
24450
+ filterEventPresets: z$1.union([z$1.string(), z$1.array(z$1.string())]).nullable().optional(),
24451
+ scheduleScope: eventScheduleScopeSchema$1.nullable().optional(),
24452
+ filterCategoryIds: z$1.union([z$1.string(), z$1.array(z$1.string())]).nullable().optional(),
24453
+ filterStaffMemberId: z$1.string().nullable().optional(),
24454
+ filterVenueId: z$1.string().nullable().optional()
24455
+ };
24456
+ const eventCollectionSourceSchemaShape = {
24457
+ events: z$1.array(publicEventSchema).nullable().optional(),
24458
+ siteId: z$1.string(),
24459
+ apiBaseUrl: z$1.string().optional(),
24460
+ stage: previewStageSchema.optional(),
24461
+ listLayout: eventLayoutSchema.optional(),
24462
+ listColumns: columnOptionSchema.optional(),
24463
+ eventsPerPage: z$1.string().optional(),
24464
+ paginationMode: z$1.enum(["loadMore", "seeAllLink"]).optional(),
24465
+ seeAllUrl: z$1.string().optional(),
24466
+ loadMoreText: z$1.string().optional(),
24467
+ startOfWeek: weekStartSchema.optional(),
24468
+ calendarTabViews: calendarTabViewsSchema.optional(),
24469
+ defaultCalendarView: eventCalendarDefaultViewSchema.optional(),
24470
+ ...eventCollectionFilterSourceSchemaShape,
24471
+ showVenue: z$1.boolean().nullable().optional(),
24472
+ showMap: z$1.boolean().nullable().optional(),
24473
+ showCapacity: z$1.boolean().nullable().optional(),
24474
+ buttonVariant: eventButtonVariantSchema.optional(),
24475
+ buttonText: z$1.string().optional(),
24476
+ emptyMessage: z$1.string().optional(),
24477
+ className: z$1.string().optional()
24478
+ };
24479
+ const eventCollectionDisplaySchemaShape = {
24480
+ events: z$1.array(publicEventSchema),
24481
+ listLayout: eventLayoutSchema,
24482
+ listColumns: columnOptionSchema,
24483
+ eventsPerPage: eventPageSizeSchema,
24484
+ paginationAction: eventListPaginationActionSchema,
24485
+ startOfWeek: weekStartSchema,
24486
+ calendarTabViews: calendarTabViewsSchema,
24487
+ defaultCalendarView: eventCalendarDefaultViewSchema,
24488
+ showFilters: z$1.boolean(),
24489
+ showCategoryFilter: filterAutoShowSchema,
24490
+ showVenueFilter: z$1.boolean(),
24491
+ showStaffFilter: z$1.boolean(),
24492
+ eventSurface: eventSurfaceScopeSchema$1,
24493
+ filterEventPresets: z$1.string().nullable(),
24494
+ scheduleScope: eventScheduleScopeSchema$1,
24495
+ filterCategoryIds: z$1.string().nullable(),
24496
+ filterStaffMemberId: z$1.string().nullable(),
24497
+ filterVenueId: z$1.string().nullable(),
24498
+ showVenue: z$1.boolean(),
24499
+ showMap: z$1.boolean(),
24500
+ showCapacity: z$1.boolean(),
24501
+ buttonVariant: eventButtonVariantSchema,
24502
+ buttonText: z$1.string(),
24503
+ emptyMessage: z$1.string()
24504
+ };
24505
+ const eventCollectionHydrationSchema = z$1.object({
24506
+ siteId: z$1.string(),
24507
+ stage: previewStageSchema.optional(),
24508
+ prefetchedEvents: z$1.boolean(),
24509
+ eventSurface: eventSurfaceScopeSchema$1,
24510
+ filterEventPresets: z$1.string().nullable(),
24511
+ scheduleScope: eventScheduleScopeSchema$1
24512
+ });
24513
+ function buildEventCollectionDisplay(source) {
24514
+ return {
24515
+ ...buildEventCollectionFilterDisplay(source),
24516
+ ...buildEventCollectionPresentationDisplay(source),
24517
+ events: Array.isArray(source.events) ? [...source.events] : [],
24518
+ listLayout: source.listLayout ?? "stack",
24519
+ listColumns: source.listColumns ?? "3",
24520
+ eventsPerPage: resolveEventCalendarListPageSize({ eventsPerPage: source.eventsPerPage }),
24521
+ paginationAction: resolveEventListPaginationAction({
24522
+ paginationMode: source.paginationMode,
24523
+ seeAllUrl: source.seeAllUrl,
24524
+ loadMoreText: source.loadMoreText
24525
+ }),
24526
+ startOfWeek: source.startOfWeek ?? "monday",
24527
+ calendarTabViews: source.calendarTabViews ?? "both",
24528
+ defaultCalendarView: source.defaultCalendarView ?? "month"
24529
+ };
24530
+ }
24531
+ function buildEventCollectionFilterDisplay(source) {
24532
+ return {
24533
+ showFilters: source.showFilters ?? true,
24534
+ showCategoryFilter: source.showCategoryFilter ?? "auto",
24535
+ showVenueFilter: source.showVenueFilter ?? false,
24536
+ showStaffFilter: source.showStaffFilter ?? true,
24537
+ eventSurface: normalizeEventSurfaceScope(source.eventSurface),
24538
+ filterEventPresets: normalizeEventSurfacePresetsCsv(source.filterEventPresets),
24539
+ scheduleScope: normalizeEventScheduleScope(source.scheduleScope),
24540
+ filterCategoryIds: normalizeEventCategoryIdsCsv(source.filterCategoryIds),
24541
+ filterStaffMemberId: normalizeEventStaffMemberId(source.filterStaffMemberId),
24542
+ filterVenueId: normalizeEventVenueId(source.filterVenueId)
24543
+ };
24544
+ }
24545
+ function buildEventCollectionPresentationDisplay(source) {
24546
+ return {
24547
+ showVenue: source.showVenue ?? true,
24548
+ showMap: source.showMap ?? true,
24549
+ showCapacity: source.showCapacity ?? true,
24550
+ buttonVariant: source.buttonVariant ?? "primary",
24551
+ buttonText: source.buttonText ?? "Book",
24552
+ emptyMessage: source.emptyMessage ?? "No upcoming events scheduled."
24553
+ };
24554
+ }
24555
+ function buildEventCollectionHydration(source) {
24556
+ return {
24557
+ siteId: source.siteId,
24558
+ stage: source.stage,
24559
+ prefetchedEvents: source.events != null,
24560
+ eventSurface: normalizeEventSurfaceScope(source.eventSurface),
24561
+ filterEventPresets: normalizeEventSurfacePresetsCsv(source.filterEventPresets),
24562
+ scheduleScope: normalizeEventScheduleScope(source.scheduleScope)
24563
+ };
24564
+ }
24565
+ //#endregion
24541
24566
  //#region ../blocks/src/system/runtime/nodes/events/EventListing.interactive.ts
24542
24567
  const legacyEventCardVariantSchema = z$1.enum(["variant1", "variant2"]);
24543
24568
  const eventCardVariantInputSchema = z$1.union([cardVariantRoleSchema, legacyEventCardVariantSchema]);
24544
24569
  const cardOrientationSchema = z$1.enum(["vertical", "horizontal"]);
24545
- const eventBlockKindSchema$1 = z$1.enum(eventBlockKindValues);
24546
- const eventSurfaceScopeSchema$1 = z$1.enum(eventSurfaceScopeValues);
24547
- const eventScheduleScopeSchema$1 = z$1.enum(eventScheduleScopeValues);
24570
+ const eventSurfaceScopeSchema = z$1.enum(eventSurfaceScopeValues);
24571
+ const eventScheduleScopeSchema = z$1.enum(eventScheduleScopeValues);
24548
24572
  const eventListingSourceSchema = z$1.object({
24549
24573
  events: z$1.array(publicEventSchema).nullable().optional(),
24550
24574
  siteId: z$1.string(),
@@ -24564,17 +24588,7 @@ const eventListingSourceSchema = z$1.object({
24564
24588
  showCapacity: z$1.boolean().optional(),
24565
24589
  emptyMessage: z$1.string().optional(),
24566
24590
  className: z$1.string().optional(),
24567
- showFilters: z$1.boolean().nullable().optional(),
24568
- showCategoryFilter: filterAutoShowSchema.optional(),
24569
- showVenueFilter: z$1.boolean().nullable().optional(),
24570
- showStaffFilter: z$1.boolean().nullable().optional(),
24571
- eventKind: eventBlockKindSchema$1.nullable().optional(),
24572
- eventSurface: eventSurfaceScopeSchema$1.nullable().optional(),
24573
- filterEventPresets: z$1.union([z$1.string(), z$1.array(z$1.string())]).nullable().optional(),
24574
- scheduleScope: eventScheduleScopeSchema$1.nullable().optional(),
24575
- filterCategoryIds: z$1.string().nullable().optional(),
24576
- filterStaffMemberId: z$1.string().nullable().optional(),
24577
- filterVenueId: z$1.string().nullable().optional()
24591
+ ...eventCollectionFilterSourceSchemaShape
24578
24592
  });
24579
24593
  const eventListingDisplaySchema = z$1.object({
24580
24594
  kind: z$1.literal("event-listing"),
@@ -24606,10 +24620,9 @@ const eventListingHydrationSchema = z$1.object({
24606
24620
  showCategoryFilter: filterAutoShowSchema,
24607
24621
  showVenueFilter: z$1.boolean(),
24608
24622
  showStaffFilter: z$1.boolean(),
24609
- eventKind: eventBlockKindSchema$1,
24610
- eventSurface: eventSurfaceScopeSchema$1,
24623
+ eventSurface: eventSurfaceScopeSchema,
24611
24624
  filterEventPresets: z$1.string().nullable(),
24612
- scheduleScope: eventScheduleScopeSchema$1,
24625
+ scheduleScope: eventScheduleScopeSchema,
24613
24626
  filterCategoryIds: z$1.string().nullable().optional(),
24614
24627
  filterStaffMemberId: z$1.string().nullable().optional(),
24615
24628
  filterVenueId: z$1.string().nullable().optional(),
@@ -24667,7 +24680,6 @@ const eventListingBlockRuntime = defineProgressiveBlockRuntime({
24667
24680
  showCategoryFilter: source.showCategoryFilter ?? "auto",
24668
24681
  showVenueFilter: source.showVenueFilter ?? false,
24669
24682
  showStaffFilter: source.showStaffFilter ?? false,
24670
- eventKind: normalizeEventBlockKind(source.eventKind),
24671
24683
  eventSurface: normalizeEventSurfaceScope(source.eventSurface),
24672
24684
  filterEventPresets: normalizeEventSurfacePresetsCsv(source.filterEventPresets),
24673
24685
  scheduleScope: normalizeEventScheduleScope(source.scheduleScope),
@@ -24791,30 +24803,6 @@ const eventListingBlockDefinition = {
24791
24803
  intent: "display"
24792
24804
  }
24793
24805
  })),
24794
- {
24795
- id: "kind",
24796
- type: "select",
24797
- label: "Show",
24798
- description: "Choose whether this list shows courses, events, or both",
24799
- required: false,
24800
- multiple: false,
24801
- defaultValue: "all",
24802
- options: [
24803
- {
24804
- value: "all",
24805
- label: "Courses and events"
24806
- },
24807
- {
24808
- value: "courses",
24809
- label: "Courses only"
24810
- },
24811
- {
24812
- value: "events",
24813
- label: "Events only"
24814
- }
24815
- ],
24816
- ui: { intent: "behavior" }
24817
- },
24818
24806
  {
24819
24807
  id: "eventSurface",
24820
24808
  type: "select",
@@ -24852,6 +24840,10 @@ const eventListingBlockDefinition = {
24852
24840
  multiple: true,
24853
24841
  defaultValue: [],
24854
24842
  options: [
24843
+ {
24844
+ value: "course",
24845
+ label: "Courses"
24846
+ },
24855
24847
  {
24856
24848
  value: "class",
24857
24849
  label: "Classes"
@@ -25003,10 +24995,6 @@ const eventListingBlockDefinition = {
25003
24995
  showVenue: { $bind: { from: "content.showVenue" } },
25004
24996
  showMap: { $bind: { from: "content.showMap" } },
25005
24997
  showCapacity: { $bind: { from: "content.showCapacity" } },
25006
- eventKind: { $bind: {
25007
- from: "content.kind",
25008
- fallback: "all"
25009
- } },
25010
24998
  eventSurface: { $bind: {
25011
24999
  from: "content.eventSurface",
25012
25000
  fallback: "all"
@@ -25057,7 +25045,6 @@ const eventListingBlockDefinition = {
25057
25045
  from: "content.layout",
25058
25046
  fallback: "listing-card"
25059
25047
  } },
25060
- kind: { $bind: { from: "content.kind" } },
25061
25048
  eventSurface: { $bind: { from: "content.eventSurface" } },
25062
25049
  eventPresets: { $bind: {
25063
25050
  from: "content.filterEventPresets",
@@ -25070,95 +25057,30 @@ const eventListingBlockDefinition = {
25070
25057
  };
25071
25058
  //#endregion
25072
25059
  //#region ../blocks/src/system/runtime/nodes/events/EventCalendar.interactive.ts
25073
- const eventBlockKindSchema = z$1.enum(eventBlockKindValues);
25074
- const eventSurfaceScopeSchema = z$1.enum(eventSurfaceScopeValues);
25075
- const eventScheduleScopeSchema = z$1.enum(eventScheduleScopeValues);
25076
25060
  const eventCalendarSourceSchema = z$1.object({
25077
- events: z$1.array(publicEventSchema).nullable().optional(),
25078
- siteId: z$1.string(),
25079
- apiBaseUrl: z$1.string().optional(),
25080
- stage: previewStageSchema.optional(),
25061
+ ...eventCollectionSourceSchemaShape,
25081
25062
  variant: eventCalendarDisplayModeSchema.nullable().optional(),
25082
25063
  displayMode: eventCalendarDisplayModeSchema.nullable().optional(),
25083
- listLayout: eventLayoutSchema.optional(),
25084
- listColumns: columnOptionSchema.optional(),
25085
25064
  layout: eventLayoutSchema.optional(),
25086
- columns: columnOptionSchema.optional(),
25087
- eventsPerPage: z$1.string().optional(),
25088
- paginationMode: z$1.enum(["loadMore", "seeAllLink"]).optional(),
25089
- seeAllUrl: z$1.string().optional(),
25090
- loadMoreText: z$1.string().optional(),
25091
- startOfWeek: weekStartSchema.optional(),
25092
- calendarTabViews: calendarTabViewsSchema.optional(),
25093
- defaultCalendarView: eventCalendarDefaultViewSchema.optional(),
25094
- showFilters: z$1.boolean().nullable().optional(),
25095
- showCategoryFilter: filterAutoShowSchema.optional(),
25096
- showVenueFilter: z$1.boolean().nullable().optional(),
25097
- showStaffFilter: z$1.boolean().nullable().optional(),
25098
- kind: eventBlockKindSchema.nullable().optional(),
25099
- eventSurface: eventSurfaceScopeSchema.nullable().optional(),
25100
- filterEventPresets: z$1.union([z$1.string(), z$1.array(z$1.string())]).nullable().optional(),
25101
- scheduleScope: eventScheduleScopeSchema.nullable().optional(),
25102
- filterCategoryIds: z$1.union([z$1.string(), z$1.array(z$1.string())]).nullable().optional(),
25103
- filterStaffMemberId: z$1.string().nullable().optional(),
25104
- filterVenueId: z$1.string().nullable().optional(),
25105
- buttonVariant: eventButtonVariantSchema.optional(),
25106
- buttonText: z$1.string().optional(),
25065
+ columns: eventCollectionSourceSchemaShape.listColumns,
25107
25066
  boardTitle: z$1.string().optional(),
25108
25067
  footerNote: z$1.string().optional(),
25109
25068
  elevated: z$1.boolean().nullable().optional(),
25110
- banded: z$1.boolean().nullable().optional(),
25111
- showVenue: z$1.boolean().nullable().optional(),
25112
- showMap: z$1.boolean().nullable().optional(),
25113
- showCapacity: z$1.boolean().nullable().optional(),
25114
- emptyMessage: z$1.string().optional(),
25115
- className: z$1.string().optional()
25069
+ banded: z$1.boolean().nullable().optional()
25116
25070
  });
25117
25071
  const eventCalendarDisplaySchema = z$1.object({
25118
25072
  kind: z$1.literal("event-calendar"),
25119
25073
  displayMode: eventCalendarDisplayModeSchema,
25120
25074
  className: z$1.string().nullable(),
25121
- events: z$1.array(publicEventSchema),
25122
- listLayout: eventLayoutSchema,
25123
- listColumns: columnOptionSchema,
25124
- eventsPerPage: eventPageSizeSchema,
25125
- paginationAction: eventListPaginationActionSchema,
25126
- startOfWeek: weekStartSchema,
25127
- calendarTabViews: calendarTabViewsSchema,
25128
- defaultCalendarView: eventCalendarDefaultViewSchema,
25129
- showFilters: z$1.boolean(),
25130
- showCategoryFilter: filterAutoShowSchema,
25131
- showVenueFilter: z$1.boolean(),
25132
- showStaffFilter: z$1.boolean(),
25133
- eventKind: eventBlockKindSchema,
25134
- eventSurface: eventSurfaceScopeSchema,
25135
- filterEventPresets: z$1.string().nullable(),
25136
- scheduleScope: eventScheduleScopeSchema,
25137
- filterCategoryIds: z$1.string().nullable(),
25138
- filterStaffMemberId: z$1.string().nullable(),
25139
- filterVenueId: z$1.string().nullable(),
25140
- buttonVariant: eventButtonVariantSchema,
25141
- buttonText: z$1.string(),
25075
+ ...eventCollectionDisplaySchemaShape,
25142
25076
  boardTitle: z$1.string().optional(),
25143
25077
  footerNote: z$1.string().optional(),
25144
25078
  seeAllUrl: z$1.string().optional(),
25145
25079
  loadMoreText: z$1.string().optional(),
25146
25080
  elevated: z$1.boolean(),
25147
- banded: z$1.boolean(),
25148
- showVenue: z$1.boolean(),
25149
- showMap: z$1.boolean(),
25150
- showCapacity: z$1.boolean(),
25151
- emptyMessage: z$1.string()
25152
- });
25153
- const eventCalendarHydrationSchema = z$1.object({
25154
- siteId: z$1.string(),
25155
- stage: previewStageSchema.optional(),
25156
- prefetchedEvents: z$1.boolean(),
25157
- eventKind: eventBlockKindSchema,
25158
- eventSurface: eventSurfaceScopeSchema,
25159
- filterEventPresets: z$1.string().nullable(),
25160
- scheduleScope: eventScheduleScopeSchema
25081
+ banded: z$1.boolean()
25161
25082
  });
25083
+ const eventCalendarHydrationSchema = eventCollectionHydrationSchema;
25162
25084
  const eventCalendarRenderSchema = z$1.object({
25163
25085
  display: eventCalendarDisplaySchema,
25164
25086
  hydration: eventCalendarHydrationSchema
@@ -25181,44 +25103,21 @@ function normalizeOptionalText(value) {
25181
25103
  function buildEventCalendarDisplay(source) {
25182
25104
  const listLayout = source.listLayout ?? source.layout ?? "stack";
25183
25105
  return {
25106
+ ...buildEventCollectionDisplay({
25107
+ ...source,
25108
+ listLayout,
25109
+ listColumns: source.listColumns ?? source.columns
25110
+ }),
25184
25111
  kind: "event-calendar",
25185
25112
  displayMode: source.variant ?? source.displayMode ?? "combined",
25186
25113
  className: source.className ?? null,
25187
25114
  events: (source.events ?? []).slice().sort((left, right) => new Date(left.startsAt).getTime() - new Date(right.startsAt).getTime()),
25188
- listLayout,
25189
- listColumns: source.listColumns ?? source.columns ?? "3",
25190
- eventsPerPage: resolveEventCalendarListPageSize({ eventsPerPage: source.eventsPerPage }),
25191
- paginationAction: resolveEventListPaginationAction({
25192
- paginationMode: source.paginationMode,
25193
- seeAllUrl: source.seeAllUrl,
25194
- loadMoreText: source.loadMoreText
25195
- }),
25196
- startOfWeek: source.startOfWeek ?? "monday",
25197
- calendarTabViews: source.calendarTabViews ?? "both",
25198
- defaultCalendarView: source.defaultCalendarView ?? "month",
25199
- showFilters: source.showFilters ?? true,
25200
- showCategoryFilter: source.showCategoryFilter ?? "auto",
25201
- showVenueFilter: source.showVenueFilter ?? false,
25202
- showStaffFilter: source.showStaffFilter ?? true,
25203
- eventKind: normalizeEventBlockKind(source.kind),
25204
- eventSurface: normalizeEventSurfaceScope(source.eventSurface),
25205
- filterEventPresets: normalizeEventSurfacePresetsCsv(source.filterEventPresets),
25206
- scheduleScope: normalizeEventScheduleScope(source.scheduleScope),
25207
- filterCategoryIds: normalizeEventCategoryIdsCsv(source.filterCategoryIds),
25208
- filterStaffMemberId: normalizeEventStaffMemberId(source.filterStaffMemberId),
25209
- filterVenueId: normalizeEventVenueId(source.filterVenueId),
25210
- buttonVariant: source.buttonVariant ?? "primary",
25211
- buttonText: source.buttonText ?? "Book",
25212
25115
  boardTitle: normalizeOptionalText(source.boardTitle),
25213
25116
  footerNote: normalizeOptionalText(source.footerNote),
25214
25117
  seeAllUrl: normalizeOptionalText(source.seeAllUrl),
25215
25118
  loadMoreText: normalizeOptionalText(source.loadMoreText),
25216
25119
  elevated: source.elevated ?? false,
25217
- banded: source.banded ?? false,
25218
- showVenue: source.showVenue ?? true,
25219
- showMap: source.showMap ?? true,
25220
- showCapacity: source.showCapacity ?? true,
25221
- emptyMessage: source.emptyMessage ?? "No upcoming events scheduled."
25120
+ banded: source.banded ?? false
25222
25121
  };
25223
25122
  }
25224
25123
  const eventCalendarBlockRuntime = defineProgressiveBlockRuntime({
@@ -25229,22 +25128,13 @@ const eventCalendarBlockRuntime = defineProgressiveBlockRuntime({
25229
25128
  },
25230
25129
  buildRender: (source) => ({
25231
25130
  display: buildEventCalendarDisplay(source),
25232
- hydration: {
25233
- siteId: source.siteId,
25234
- stage: source.stage,
25235
- prefetchedEvents: source.events != null,
25236
- eventKind: normalizeEventBlockKind(source.kind),
25237
- eventSurface: normalizeEventSurfaceScope(source.eventSurface),
25238
- filterEventPresets: normalizeEventSurfacePresetsCsv(source.filterEventPresets),
25239
- scheduleScope: normalizeEventScheduleScope(source.scheduleScope)
25240
- }
25131
+ hydration: buildEventCollectionHydration(source)
25241
25132
  })
25242
25133
  });
25243
25134
  //#endregion
25244
25135
  //#region ../blocks/src/system/blocks/events/event-calendar.ts
25245
25136
  function normalizeEventCalendarContent(content) {
25246
25137
  const record = typeof content === "object" && content !== null ? content : {};
25247
- const kind = normalizeEventBlockKind(record.kind);
25248
25138
  const variant = normalizeEventCalendarDisplayMode(record.variant) ?? normalizeEventCalendarDisplayMode(record.displayMode);
25249
25139
  return {
25250
25140
  ...record,
@@ -25252,11 +25142,10 @@ function normalizeEventCalendarContent(content) {
25252
25142
  displayMode: normalizeEventCalendarDisplayMode(record.displayMode),
25253
25143
  listLayout: normalizeEventCalendarListLayout(record.listLayout),
25254
25144
  defaultCalendarView: normalizeEventCalendarDefaultView(record.defaultCalendarView),
25255
- kind,
25256
25145
  eventSurface: normalizeEventSurfaceScope(record.eventSurface),
25257
25146
  filterEventPresets: normalizeEventSurfacePresets(record.filterEventPresets),
25258
25147
  scheduleScope: normalizeEventScheduleScope(record.scheduleScope),
25259
- filterCategoryIds: kind === "courses" ? [] : normalizeEventCategoryIds(record.filterCategoryIds),
25148
+ filterCategoryIds: normalizeEventCategoryIds(record.filterCategoryIds),
25260
25149
  filterStaffMemberId: normalizeEventStaffMemberId(record.filterStaffMemberId),
25261
25150
  filterVenueId: normalizeEventVenueId(record.filterVenueId)
25262
25151
  };
@@ -25350,10 +25239,6 @@ const eventCalendarLayout = [styledSection({
25350
25239
  from: "content.showCapacity",
25351
25240
  fallback: true
25352
25241
  } },
25353
- kind: { $bind: {
25354
- from: "content.kind",
25355
- fallback: "all"
25356
- } },
25357
25242
  eventSurface: { $bind: {
25358
25243
  from: "content.eventSurface",
25359
25244
  fallback: "all"
@@ -25671,30 +25556,6 @@ const eventCalendarAdditionalFields = [
25671
25556
  }] }] }
25672
25557
  }
25673
25558
  },
25674
- {
25675
- id: "kind",
25676
- type: "select",
25677
- label: "Show",
25678
- description: "Restrict this block to all offerings, courses, or events",
25679
- required: false,
25680
- multiple: false,
25681
- defaultValue: "all",
25682
- options: [
25683
- {
25684
- value: "all",
25685
- label: "All offerings"
25686
- },
25687
- {
25688
- value: "courses",
25689
- label: "Courses only"
25690
- },
25691
- {
25692
- value: "events",
25693
- label: "Events only"
25694
- }
25695
- ],
25696
- ui: { intent: "behavior" }
25697
- },
25698
25559
  {
25699
25560
  id: "showFilters",
25700
25561
  type: "boolean",
@@ -25926,6 +25787,10 @@ const eventCalendarAdditionalFields = [
25926
25787
  multiple: true,
25927
25788
  defaultValue: [],
25928
25789
  options: [
25790
+ {
25791
+ value: "course",
25792
+ label: "Courses"
25793
+ },
25929
25794
  {
25930
25795
  value: "class",
25931
25796
  label: "Classes"
@@ -25991,11 +25856,7 @@ const eventCalendarAdditionalFields = [
25991
25856
  optionSource: "eventCategories",
25992
25857
  ui: {
25993
25858
  intent: "behavior",
25994
- searchThreshold: 8,
25995
- visibleWhen: {
25996
- field: "kind",
25997
- notEquals: "courses"
25998
- }
25859
+ searchThreshold: 8
25999
25860
  }
26000
25861
  }),
26001
25862
  createSiteOptionSelectField({
@@ -26156,7 +26017,6 @@ const eventCalendarBlockDefinition = {
26156
26017
  from: "content.variant",
26157
26018
  fallback: "listing-card"
26158
26019
  } },
26159
- kind: { $bind: { from: "content.kind" } },
26160
26020
  eventSurface: { $bind: { from: "content.eventSurface" } },
26161
26021
  eventPresets: { $bind: {
26162
26022
  from: "content.filterEventPresets",
@@ -26403,7 +26263,6 @@ const recurringScheduleBlockDefinition = {
26403
26263
  } },
26404
26264
  detailLevel: "listing",
26405
26265
  readProfile: "compact-list",
26406
- kind: "events",
26407
26266
  eventSurface: "custom",
26408
26267
  eventPresets: "class",
26409
26268
  scheduleScope: "any"
@@ -26805,7 +26664,7 @@ const offeringsPreviewBlockDefinition = {
26805
26664
  mode: "server"
26806
26665
  },
26807
26666
  courses: {
26808
- endpoint: "listPublicCourses",
26667
+ endpoint: "listPublicWholeSeriesOfferings",
26809
26668
  params: {
26810
26669
  siteId: { $bind: { from: "$root.siteId" } },
26811
26670
  limit: { $bind: {
@@ -26836,7 +26695,6 @@ function eventPresetLoader(preset) {
26836
26695
  } },
26837
26696
  detailLevel: "listing",
26838
26697
  readProfile: "listing-card",
26839
- kind: "events",
26840
26698
  eventPresets: preset
26841
26699
  },
26842
26700
  mode: "server"