@riverbankcms/sdk 0.82.0 → 0.84.1

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 (206) hide show
  1. package/README.md +16 -0
  2. package/dist/{PreviewEditorSidebar-LHGK6RIO.mjs → PreviewEditorSidebar-X7RLMEI6.mjs} +330 -11
  3. package/dist/{PreviewEditorUI-AXZG2SDC.mjs → PreviewEditorUI-CT67N4O3.mjs} +3 -3
  4. package/dist/SdkPreviewModeRuntime-EIMQ3S2V.mjs +8 -0
  5. package/dist/_dts/ai/src/contracts/proposals.d.ts +200 -0
  6. package/dist/_dts/api/src/blocks.d.ts +36 -0
  7. package/dist/_dts/api/src/contentRuntime.d.ts +46 -0
  8. package/dist/_dts/api/src/endpoints.d.ts +40 -0
  9. package/dist/_dts/api/src/index.d.ts +2 -2
  10. package/dist/_dts/api/src/sdk-event-pricing.d.ts +61 -0
  11. package/dist/_dts/api/src/sdk-event-schedule.d.ts +52 -0
  12. package/dist/_dts/api/src/sdk-event-upsert.d.ts +50 -0
  13. package/dist/_dts/api/src/sdkContracts.d.ts +67 -33
  14. package/dist/_dts/api/src/shared-contracts.d.ts +13 -0
  15. package/dist/_dts/api/src/sitePlatformEndpoints.d.ts +22 -36
  16. package/dist/_dts/api/src/siteRuntimeEndpoints.d.ts +46 -1
  17. package/dist/_dts/block-form/src/backend/useBackendWatch.d.ts +6 -1
  18. package/dist/_dts/block-form/src/utils/evaluateVisibility.d.ts +3 -2
  19. package/dist/_dts/block-form/src/utils/visibleWhen.d.ts +7 -0
  20. package/dist/_dts/blocks/src/PageRenderer.d.ts +11 -0
  21. package/dist/_dts/blocks/src/bindings/index.d.ts +1 -1
  22. package/dist/_dts/blocks/src/client/site-chrome.d.ts +1 -1
  23. package/dist/_dts/blocks/src/client.d.ts +4 -0
  24. package/dist/_dts/blocks/src/contracts/proof-block-islands.d.ts +16 -4
  25. package/dist/_dts/blocks/src/system/blocks/appointment-booking.d.ts +288 -2016
  26. package/dist/_dts/blocks/src/system/blocks/blog-listing.d.ts +288 -2016
  27. package/dist/_dts/blocks/src/system/blocks/cart.d.ts +288 -2016
  28. package/dist/_dts/blocks/src/system/blocks/checkout.d.ts +288 -2016
  29. package/dist/_dts/blocks/src/system/blocks/collection.d.ts +288 -2016
  30. package/dist/_dts/blocks/src/system/blocks/contact-newsletter.d.ts +171 -0
  31. package/dist/_dts/blocks/src/system/blocks/faq.d.ts +288 -2016
  32. package/dist/_dts/blocks/src/system/blocks/gifting.d.ts +288 -2016
  33. package/dist/_dts/blocks/src/system/blocks/hero.d.ts +3 -2
  34. package/dist/_dts/blocks/src/system/blocks/index.d.ts +1 -0
  35. package/dist/_dts/blocks/src/system/blocks/location-map.d.ts +1 -7
  36. package/dist/_dts/blocks/src/system/blocks/media-text.d.ts +2534 -151
  37. package/dist/_dts/blocks/src/system/blocks/product-detail.d.ts +288 -2016
  38. package/dist/_dts/blocks/src/system/blocks/product-list.d.ts +288 -2016
  39. package/dist/_dts/blocks/src/system/blocks/shop.d.ts +288 -2016
  40. package/dist/_dts/blocks/src/system/blocks/site-header.d.ts +36 -3
  41. package/dist/_dts/blocks/src/system/blocks/team-members.d.ts +2 -2
  42. package/dist/_dts/blocks/src/system/constants/blockKinds.d.ts +1 -1
  43. package/dist/_dts/blocks/src/system/fields/aspectRatio.d.ts +4 -1
  44. package/dist/_dts/blocks/src/system/fields/imageShape.d.ts +30 -0
  45. package/dist/_dts/blocks/src/system/fragments/library/heroLayoutControls.d.ts +25 -0
  46. package/dist/_dts/blocks/src/system/manifest/schema.d.ts +35 -161
  47. package/dist/_dts/blocks/src/system/runtime/components/registry.client.d.ts +24 -6
  48. package/dist/_dts/blocks/src/system/runtime/components/runtime-backed-blocks.d.ts +12 -3
  49. package/dist/_dts/blocks/src/system/runtime/hooks/useHeadlessEventRegistrationFlow.d.ts +33 -0
  50. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/EventRegistrationWizard.d.ts +0 -2
  51. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/constants.d.ts +1 -0
  52. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/event-registration.headless.contract.d.ts +275 -0
  53. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/event-registration.headless.override.d.ts +10 -0
  54. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/event-registration.headless.planning.d.ts +22 -0
  55. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/event-registration.headless.state.d.ts +3 -0
  56. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/useEventRegistrationSubmit.d.ts +20 -1
  57. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/useEventRegistrationWizard.d.ts +13 -4
  58. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/utils.d.ts +1 -1
  59. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration.interactive.d.ts +28 -6
  60. package/dist/_dts/blocks/src/system/runtime/nodes/events/shared/pricing.d.ts +14 -0
  61. package/dist/_dts/content-editor/src/controller/EntryControllerProvider.d.ts +1 -1
  62. package/dist/_dts/content-editor/src/controller/buildBlockPublishedBaselines.d.ts +1 -1
  63. package/dist/_dts/content-editor/src/controller/seedDraftBaselinesFromBlocks.d.ts +1 -1
  64. package/dist/_dts/content-editor/src/controller/useBlocksList.d.ts +1 -1
  65. package/dist/_dts/content-editor/src/controller/useInvalidBlockRecovery.d.ts +1 -1
  66. package/dist/_dts/content-editor/src/primitives/PreviewRichTextEditor.d.ts +2 -1
  67. package/dist/_dts/content-editor/src/primitives/PreviewTextEditor.d.ts +1 -0
  68. package/dist/_dts/content-model/src/entry-slots/index.d.ts +1 -0
  69. package/dist/_dts/content-model/src/entry-slots/types.d.ts +356 -0
  70. package/dist/_dts/content-model/src/index.d.ts +1 -0
  71. package/dist/_dts/content-model/src/templates/defaults.d.ts +7 -0
  72. package/dist/_dts/db/src/generated/supabase/database.types.d.ts +100 -5
  73. package/dist/_dts/editor-blocks/src/BlockEditor.d.ts +6 -1
  74. package/dist/_dts/editor-blocks/src/BlockForm.d.ts +7 -5
  75. package/dist/_dts/editor-blocks/src/block-editor/hooks/useBlockCreation.d.ts +3 -2
  76. package/dist/_dts/editor-blocks/src/block-editor/hooks/useBlockDuplication.d.ts +3 -2
  77. package/dist/_dts/editor-blocks/src/block-editor/hooks/useBlockReorder.d.ts +3 -2
  78. package/dist/_dts/editor-blocks/src/block-editor/owner.d.ts +27 -0
  79. package/dist/_dts/editor-blocks/src/index.d.ts +1 -0
  80. package/dist/_dts/media-core/src/assetsInUseSummary.d.ts +8 -0
  81. package/dist/_dts/media-core/src/mediaUsageProjection.d.ts +37 -3
  82. package/dist/_dts/preview-next/src/client/blocks/pageDesignRuntimePreview.d.ts +4 -2
  83. package/dist/_dts/preview-next/src/client/blocks/previewProjection/runtimeContentDecoration.d.ts +2 -2
  84. package/dist/_dts/preview-next/src/client/preview/EntryEditorPanel.d.ts +3 -1
  85. package/dist/_dts/preview-next/src/client/preview/EntrySlotBlockEditorPanel.d.ts +19 -0
  86. package/dist/_dts/preview-next/src/client/preview/SiteChromeCustomizeButton.d.ts +8 -0
  87. package/dist/_dts/preview-next/src/client/preview/SiteChromeCustomizeContext.d.ts +4 -1
  88. package/dist/_dts/preview-next/src/client/preview/StyleConfigurator.state.d.ts +1 -1
  89. package/dist/_dts/preview-next/src/client/preview/linkedEntryEditEvents.d.ts +9 -0
  90. package/dist/_dts/preview-next/src/client/preview/previewCustomizeControls.d.ts +9 -8
  91. package/dist/_dts/preview-next/src/client/preview/siteChromeLookRows.d.ts +10 -1
  92. package/dist/_dts/preview-next/src/client/preview/siteChromeQuickControlHistoryState.d.ts +5 -1
  93. package/dist/_dts/sdk/src/bookings/index.d.ts +5 -4
  94. package/dist/_dts/sdk/src/bookings/types.d.ts +2 -2
  95. package/dist/_dts/sdk/src/cli/content/reader.d.ts +9 -8
  96. package/dist/_dts/sdk/src/cli/content/writer.d.ts +6 -1
  97. package/dist/_dts/sdk/src/cli/helpers.d.ts +10 -5
  98. package/dist/_dts/sdk/src/cli/merge-remote/entryLocal.d.ts +2 -2
  99. package/dist/_dts/sdk/src/cli/merge-remote/entryMerge.d.ts +2 -1
  100. package/dist/_dts/sdk/src/cli/merge-remote/entrySnapshots.d.ts +2 -2
  101. package/dist/_dts/sdk/src/client/management/index.d.ts +1 -1
  102. package/dist/_dts/sdk/src/client/management/types.d.ts +40 -10
  103. package/dist/_dts/sdk/src/config/field-definitions.d.ts +13 -7
  104. package/dist/_dts/sdk/src/contracts/system-block-content.d.ts +26 -3
  105. package/dist/_dts/sdk/src/public-api/contracts.d.ts +13 -0
  106. package/dist/_dts/sdk/src/rendering/blocks-page-renderer.d.ts +1 -0
  107. package/dist/_dts/sdk/src/rendering/components/pageShared.d.ts +6 -1
  108. package/dist/_dts/sdk/src/rendering/overrides.d.ts +6 -1
  109. package/dist/_dts/sdk/src/types/block-kinds.d.ts +1 -1
  110. package/dist/_dts/sdk/src/version.d.ts +1 -1
  111. package/dist/_dts/site-commands/src/commands.d.ts +15 -0
  112. package/dist/_dts/theme-core/src/accordions/types.d.ts +1 -1
  113. package/dist/_dts/theme-core/src/buttons/personalities/index.d.ts +11 -0
  114. package/dist/_dts/theme-core/src/buttons/personalities/ornate-ritual.d.ts +16 -0
  115. package/dist/_dts/theme-core/src/buttons/personalities/types.d.ts +1 -1
  116. package/dist/_dts/theme-core/src/buttons/types.d.ts +3 -3
  117. package/dist/_dts/theme-core/src/cards/types.d.ts +15 -15
  118. package/dist/_dts/theme-core/src/generated/containerResponsiveThemeCss.d.ts +1 -1
  119. package/dist/_dts/theme-core/src/inputs/types.d.ts +1 -1
  120. package/dist/_dts/theme-core/src/mock-themes/all.d.ts +33 -33
  121. package/dist/_dts/theme-core/src/palette/variants/index.d.ts +15 -0
  122. package/dist/_dts/theme-core/src/palette/variants/warm-dark.d.ts +16 -0
  123. package/dist/_dts/theme-core/src/schema.d.ts +30 -25
  124. package/dist/_dts/theme-core/src/site-styles/backgroundAppearance.d.ts +2 -2
  125. package/dist/_dts/theme-core/src/site-styles/curatedSiteStyles.d.ts +141 -1
  126. package/dist/_dts/theme-core/src/site-styles/designState.d.ts +2 -0
  127. package/dist/_dts/theme-core/src/site-styles/footerLooks.d.ts +110 -5
  128. package/dist/_dts/theme-core/src/site-styles/generatedSchemas.d.ts +4 -2
  129. package/dist/_dts/theme-core/src/site-styles/previewCompiler.d.ts +1 -1
  130. package/dist/_dts/theme-core/src/site-styles/runtimeCompiler.d.ts +5 -1
  131. package/dist/_dts/theme-core/src/site-styles/tokenRecipes.d.ts +1 -1
  132. package/dist/_dts/theme-core/src/site-styles/types.d.ts +1 -1
  133. package/dist/_dts/theme-core/src/site-styles/typographyPresets.d.ts +16 -1
  134. package/dist/_dts/theme-core/src/siteChromePlanning.d.ts +1 -0
  135. package/dist/_dts/theme-core/src/utils/colorStyles.d.ts +6 -6
  136. package/dist/{chunk-2BUMISSH.mjs → chunk-3LXFQS7T.mjs} +1 -1
  137. package/dist/{chunk-FIREV57T.mjs → chunk-LBBPD2IW.mjs} +40 -0
  138. package/dist/{chunk-XQR6THQJ.mjs → chunk-O62NDCTI.mjs} +3390 -1331
  139. package/dist/{chunk-6FWNF3DJ.mjs → chunk-QRKJDWT7.mjs} +158 -20
  140. package/dist/{chunk-HKB6XVIP.mjs → chunk-RCTJAZSK.mjs} +2 -2
  141. package/dist/{chunk-G35HOQEN.mjs → chunk-X5ZCSU6F.mjs} +132 -46
  142. package/dist/cli/index.mjs +2925 -577
  143. package/dist/cli/init-docs/content/agents-section.md +5 -0
  144. package/dist/cli/init-docs/content/cli-reference.md +13 -0
  145. package/dist/cli/init-docs/content/content-management.md +31 -0
  146. package/dist/cli/init-docs/content/getting-started.md +14 -0
  147. package/dist/cli/init-docs/content/workflow-add-block.md +3 -1
  148. package/dist/cli/init-docs/content/workflow-agent-safe-sync.md +81 -0
  149. package/dist/cli/init-docs/content/workflow-create-page.md +13 -3
  150. package/dist/cli/init-docs/content/workflow-custom-block.md +9 -0
  151. package/dist/cli/init-docs/content/workflow-templates.md +107 -2
  152. package/dist/client/{accordion-G34C45TW.mjs → accordion-2UZPBMYM.mjs} +2 -2
  153. package/dist/client/{bookingForm-BLBVKSAQ.mjs → bookingForm-DYXT6YB6.mjs} +5 -5
  154. package/dist/client/bookings.mjs +3477 -186
  155. package/dist/client/{carousel-7ZVTBRMD.mjs → carousel-QH77HR6X.mjs} +3 -3
  156. package/dist/client/{cart-Q6S6LZUO.mjs → cart-X4YK4FTW.mjs} +6 -6
  157. package/dist/client/{checkout-5QJLDE4I.mjs → checkout-OM2BEPWD.mjs} +6 -6
  158. package/dist/client/{chunk-ZF4XEWDM.mjs → chunk-3DTWLTXM.mjs} +1 -1
  159. package/dist/client/{chunk-5PQH4Y75.mjs → chunk-4OXKTA3D.mjs} +2 -2
  160. package/dist/client/{chunk-WJFHDTYF.mjs → chunk-52CGCQ7B.mjs} +5 -5
  161. package/dist/client/{chunk-CHAB5ACD.mjs → chunk-7UCLJ5SP.mjs} +2 -2
  162. package/dist/client/{chunk-U2EW7RSR.mjs → chunk-F5VRX5Y6.mjs} +1 -1
  163. package/dist/client/{chunk-SBBSMFFG.mjs → chunk-SYIJ5JO2.mjs} +1 -1
  164. package/dist/client/{chunk-EQKYMX4N.mjs → chunk-UHDWIXVR.mjs} +180 -157
  165. package/dist/client/{chunk-RJHTCTCZ.mjs → chunk-VGDBVNOO.mjs} +429 -15
  166. package/dist/client/{chunk-S3MKFGOG.mjs → chunk-ZE5G642V.mjs} +1 -1
  167. package/dist/client/{chunk-CSZGLBYR.mjs → chunk-ZKUO52W3.mjs} +1 -1
  168. package/dist/client/client.mjs +2685 -847
  169. package/dist/client/{courseRegistration-VUG2JJDB.mjs → courseRegistration-YBOGURTA.mjs} +5 -5
  170. package/dist/client/{eventCalendar-E7D2LD4N.mjs → eventCalendar-K4QJVCMD.mjs} +7 -7
  171. package/dist/client/{eventCombined-FUZ2Z3CS.mjs → eventCombined-MTXGMTCZ.mjs} +7 -7
  172. package/dist/client/{eventDetails-QRITJAOW.mjs → eventDetails-3PC4NL3U.mjs} +7 -7
  173. package/dist/client/{eventListing-INMQMJZ5.mjs → eventListing-TFJET6DN.mjs} +7 -7
  174. package/dist/client/{eventRegistration-TOOJD4WU.mjs → eventRegistration-QGPBGJTW.mjs} +7 -7
  175. package/dist/client/{form-BOWN7ZNQ.mjs → form-MDKR4FNB.mjs} +2 -2
  176. package/dist/client/{headerSection-HFQNZOUU.mjs → headerSection-Y5TMR3TW.mjs} +3 -3
  177. package/dist/client/hooks.mjs +2077 -546
  178. package/dist/client/{locationMap-VUZGC7Y5.mjs → locationMap-RH2LG7FZ.mjs} +2 -2
  179. package/dist/client/{newsletterForm-X2XQTPCB.mjs → newsletterForm-ZR5UDGBT.mjs} +2 -2
  180. package/dist/client/{productDetail-TA7D2G2B.mjs → productDetail-OIGDR4YE.mjs} +6 -6
  181. package/dist/client/{productList-AZOLOZKM.mjs → productList-4MA5S2CX.mjs} +6 -6
  182. package/dist/client/rendering/client.mjs +2560 -1205
  183. package/dist/client/rendering/islands.mjs +19 -19
  184. package/dist/client/rendering.mjs +2932 -1021
  185. package/dist/client/{shop-ZDLO7IIG.mjs → shop-WXSYV5QO.mjs} +6 -6
  186. package/dist/preview-next/before-render.mjs +40 -0
  187. package/dist/preview-next/client/runtime.mjs +5 -5
  188. package/dist/preview-next/middleware.mjs +40 -0
  189. package/dist/{sdk-runtime-CTWKNBDQ.mjs → sdk-runtime-7HJYPRWQ.mjs} +6 -6
  190. package/dist/server/components.mjs +2232 -534
  191. package/dist/server/config-validation.mjs +2068 -536
  192. package/dist/server/config.mjs +2068 -536
  193. package/dist/server/data.mjs +2077 -546
  194. package/dist/server/index.mjs +42 -1
  195. package/dist/server/next.mjs +2345 -574
  196. package/dist/server/page-converter.mjs +2684 -1220
  197. package/dist/server/prebuild.mjs +1 -1
  198. package/dist/server/rendering/server.mjs +2244 -546
  199. package/dist/server/rendering.mjs +2323 -552
  200. package/dist/server/routing.mjs +2012 -420
  201. package/dist/server/server.mjs +2153 -549
  202. package/dist/server/theme-bridge.mjs +1180 -101
  203. package/dist/server/theme.mjs +92 -1
  204. package/dist/styles/index.css +292 -36
  205. package/package.json +1 -1
  206. package/dist/SdkPreviewModeRuntime-RNVRHFFR.mjs +0 -8
@@ -880,6 +880,21 @@ var selectSourceSchema = z3.discriminatedUnion("kind", [
880
880
  function assertNeverSelectSource(value) {
881
881
  throw new Error(`Unhandled select source: ${JSON.stringify(value)}`);
882
882
  }
883
+ var visibleWhenPredicateSchema = z3.object({
884
+ field: z3.string().min(1),
885
+ equals: z3.any().optional(),
886
+ notEquals: z3.any().optional(),
887
+ oneOf: z3.array(z3.any()).optional(),
888
+ notIn: z3.array(z3.any()).optional(),
889
+ minItems: z3.number().int().nonnegative().optional(),
890
+ maxItems: z3.number().int().nonnegative().optional()
891
+ });
892
+ var visibleWhenSchema = z3.union([
893
+ visibleWhenPredicateSchema,
894
+ z3.object({
895
+ allOf: z3.array(visibleWhenPredicateSchema).min(1)
896
+ })
897
+ ]);
883
898
  var uiSchema = z3.object({
884
899
  widget: z3.string().optional(),
885
900
  // Container/widget presets (used by Group/Repeater widgets themselves, not for widget selection)
@@ -912,13 +927,7 @@ var uiSchema = z3.object({
912
927
  showValue: z3.boolean().optional(),
913
928
  pattern: z3.string().optional(),
914
929
  placeholder: z3.string().optional(),
915
- visibleWhen: z3.object({
916
- field: z3.string().min(1),
917
- equals: z3.any().optional(),
918
- notEquals: z3.any().optional(),
919
- oneOf: z3.array(z3.any()).optional(),
920
- notIn: z3.array(z3.any()).optional()
921
- }).optional(),
930
+ visibleWhen: visibleWhenSchema.optional(),
922
931
  // Modal configuration for modal and group fields
923
932
  modalConfig: z3.object({
924
933
  buttonLabel: z3.string().optional(),
@@ -3832,6 +3841,7 @@ var eventListTreatmentValues = [
3832
3841
  ];
3833
3842
  var eyebrowTreatmentValues = [
3834
3843
  "plain",
3844
+ "accent",
3835
3845
  "pill",
3836
3846
  "accent-pill",
3837
3847
  "pill-bounce",
@@ -5689,9 +5699,9 @@ var _Vibrant = class _Vibrant2 {
5689
5699
  }
5690
5700
  image.remove();
5691
5701
  return res;
5692
- } catch (err2) {
5702
+ } catch (err3) {
5693
5703
  image.remove();
5694
- return Promise.reject(err2);
5704
+ return Promise.reject(err3);
5695
5705
  }
5696
5706
  }
5697
5707
  async getPalettes() {
@@ -5705,9 +5715,9 @@ var _Vibrant = class _Vibrant2 {
5705
5715
  const res = result1.palettes;
5706
5716
  image.remove();
5707
5717
  return res;
5708
- } catch (err2) {
5718
+ } catch (err3) {
5709
5719
  image.remove();
5710
- return Promise.reject(err2);
5720
+ return Promise.reject(err3);
5711
5721
  }
5712
5722
  }
5713
5723
  };
@@ -8170,7 +8180,8 @@ var STRUCTURAL_DECLARATIONS = [
8170
8180
  ["transition", "all 200ms ease-in-out"],
8171
8181
  ["display", "inline-flex"],
8172
8182
  ["align-items", "center"],
8173
- ["justify-content", "center"]
8183
+ ["justify-content", "center"],
8184
+ ["outline", "none"]
8174
8185
  ];
8175
8186
  function generateButtonCss(options) {
8176
8187
  const { themeId, theme, buttonSystem: providedButtonSystem } = options;
@@ -8200,6 +8211,7 @@ function variantChunks(variant, global, themeSizes, themeId, tokens, theme) {
8200
8211
  out.push(variantBaseRule(variant, variantId, global, themeId, tokens, theme));
8201
8212
  const hoverBg = variantHoverBackgroundRule(variant, variantId, global, themeId, tokens);
8202
8213
  if (hoverBg) out.push(hoverBg);
8214
+ out.push(variantFocusVisibleRule(variantId, themeId));
8203
8215
  const effects = variantEffectsCss(variant, themeId, tokens, theme);
8204
8216
  if (effects) out.push({ raw: effects });
8205
8217
  out.push(...variantDisabledRules(variantId, themeId));
@@ -8257,6 +8269,12 @@ function variantHoverBackgroundRule(variant, variantId, global, themeId, tokens)
8257
8269
  ["background-color", tokens.getColor(hoverToken)]
8258
8270
  ]);
8259
8271
  }
8272
+ function variantFocusVisibleRule(variantId, themeId) {
8273
+ return rule(`:where([data-theme-scope="${themeId}"]) ${themeButtonSelector(variantId)}:focus-visible`, [
8274
+ ["outline", "2px solid currentColor"],
8275
+ ["outline-offset", "3px"]
8276
+ ]);
8277
+ }
8260
8278
  function variantEffectsCss(variant, themeId, tokens, theme) {
8261
8279
  if (!variant.effects) return "";
8262
8280
  const elementConfig = {
@@ -8888,6 +8906,95 @@ var joyStamp = defineButtonPersonality({
8888
8906
  }
8889
8907
  });
8890
8908
 
8909
+ // ../theme-core/src/buttons/personalities/ornate-ritual.ts
8910
+ var ornateRitual = defineButtonPersonality({
8911
+ id: "ornate-ritual",
8912
+ name: "Ornate Ritual",
8913
+ description: "Ceremonial framed buttons with jewel-toned fills and quiet color-change hover states.",
8914
+ tags: { tone: "classic", energy: "vibrant", motion: "subtle", era: "organic" },
8915
+ buttonSystem: {
8916
+ global: {
8917
+ cornerStyle: "rounded",
8918
+ shadow: "none",
8919
+ textTransform: "uppercase",
8920
+ fontWeight: 600,
8921
+ borderWidth: 1,
8922
+ hoverTransform: "none",
8923
+ hoverColor: "none",
8924
+ letterSpacing: "loose"
8925
+ },
8926
+ sizes: {
8927
+ sm: { padding: "0.5625rem 1.25rem", fontSize: "text-xs" },
8928
+ md: { padding: "0.75rem 1.75rem", fontSize: "text-xs" },
8929
+ lg: { padding: "0.875rem 2.25rem", fontSize: "text-sm" },
8930
+ xl: { padding: "1rem 2.75rem", fontSize: "text-base" }
8931
+ },
8932
+ variants: [
8933
+ {
8934
+ id: "primary",
8935
+ name: "Primary",
8936
+ enabled: true,
8937
+ priority: 1,
8938
+ background: { type: "solid", colorToken: "primary" },
8939
+ textColorToken: "primaryForeground",
8940
+ borderRadius: "rounded-md",
8941
+ border: { widthClass: "border", colorToken: "primary" },
8942
+ shadow: { elevation: "none", softness: null, position: "bottom" },
8943
+ effects: {
8944
+ hover: [{ effectId: "background-on-hover", options: { colorToken: "primary-100" } }],
8945
+ active: [{ effectId: "scale-down", options: { scale: "0.98" } }]
8946
+ }
8947
+ },
8948
+ {
8949
+ id: "secondary",
8950
+ name: "Secondary",
8951
+ enabled: true,
8952
+ priority: 2,
8953
+ background: { type: "solid", colorToken: "secondary" },
8954
+ textColorToken: "primaryForeground",
8955
+ borderRadius: "rounded-md",
8956
+ border: { widthClass: "border", colorToken: "primary" },
8957
+ shadow: { elevation: "none", softness: null, position: "bottom" },
8958
+ effects: {
8959
+ hover: [{ effectId: "background-on-hover", options: { colorToken: "surface" } }]
8960
+ }
8961
+ },
8962
+ {
8963
+ id: "outline",
8964
+ name: "Outline",
8965
+ enabled: true,
8966
+ priority: 3,
8967
+ background: { type: "transparent" },
8968
+ textColorToken: "primary",
8969
+ borderRadius: "rounded-md",
8970
+ border: { widthClass: "border", colorToken: "primary" },
8971
+ shadow: { elevation: "none", softness: null, position: "bottom" },
8972
+ effects: {
8973
+ hover: [{ effectId: "background-on-hover", options: { colorToken: "muted" } }]
8974
+ }
8975
+ },
8976
+ {
8977
+ id: "ghost",
8978
+ name: "Ghost",
8979
+ enabled: true,
8980
+ priority: 3,
8981
+ background: { type: "transparent" },
8982
+ textColorToken: "accent",
8983
+ borderRadius: "rounded-none",
8984
+ sizes: {
8985
+ sm: { padding: "0.375rem 0", fontSize: "text-xs" },
8986
+ md: { padding: "0.5rem 0", fontSize: "text-sm" },
8987
+ lg: { padding: "0.625rem 0", fontSize: "text-base" },
8988
+ xl: { padding: "0.75rem 0", fontSize: "text-lg" }
8989
+ },
8990
+ effects: {
8991
+ base: [{ effectId: "border-bottom-grow", options: { height: 1, colorToken: "accent", origin: "left" } }]
8992
+ }
8993
+ }
8994
+ ]
8995
+ }
8996
+ });
8997
+
8891
8998
  // ../theme-core/src/buttons/personalities/pebble.ts
8892
8999
  var pebble = defineButtonPersonality({
8893
9000
  id: "pebble",
@@ -9161,7 +9268,8 @@ var buttonPersonalities = [
9161
9268
  inkStamp,
9162
9269
  brushedWash,
9163
9270
  showtimePill,
9164
- joyStamp
9271
+ joyStamp,
9272
+ ornateRitual
9165
9273
  ];
9166
9274
  var personalitiesById = new Map(
9167
9275
  buttonPersonalities.map((p) => [p.id, p])
@@ -10156,7 +10264,7 @@ function rgbColorValue(token) {
10156
10264
  if (alpha === void 0) {
10157
10265
  return `rgb(var(${cssVar}))`;
10158
10266
  }
10159
- return `rgba(var(${cssVar}), ${alpha})`;
10267
+ return `rgb(var(${cssVar}) / ${alpha})`;
10160
10268
  }
10161
10269
  function backgroundColorStyle(token) {
10162
10270
  return { backgroundColor: rgbColorValue(token) };
@@ -11285,6 +11393,28 @@ var warmDarkEmber = definePaletteVariant({
11285
11393
  { name: "border", hex: "#894e31" }
11286
11394
  ]
11287
11395
  });
11396
+ var warmDarkKirtanGold = definePaletteVariant({
11397
+ id: "warm-dark-kirtan-gold",
11398
+ name: "Warm Dark \u2014 Kirtan Gold",
11399
+ description: "Deep plum ground with pale gold primary, rose accent, and soft devotional text.",
11400
+ tags: { tone: "bold", energy: "calm", era: "editorial" },
11401
+ mode: "dark",
11402
+ colors: [
11403
+ { name: "primary", hex: "#ffcdb2" },
11404
+ { name: "secondary", hex: "#b5838d" },
11405
+ { name: "accent", hex: "#e5989b" },
11406
+ { name: "success", hex: "#8fbf8f" },
11407
+ { name: "warning", hex: "#f2b86b" },
11408
+ { name: "destructive", hex: "#d96b6b" },
11409
+ { name: "background", hex: "#403944" },
11410
+ { name: "surface", hex: "#403944" },
11411
+ { name: "surfaceAlt", hex: "#372f3b" },
11412
+ { name: "muted", hex: "#4d4550" },
11413
+ { name: "text", hex: "#e6d2d5" },
11414
+ { name: "primaryForeground", hex: "#403944" },
11415
+ { name: "border", hex: "#8d747a" }
11416
+ ]
11417
+ });
11288
11418
 
11289
11419
  // ../theme-core/src/palette/variants/index.ts
11290
11420
  var paletteVariants = [
@@ -11308,7 +11438,8 @@ var paletteVariants = [
11308
11438
  softNaturalWatercolor,
11309
11439
  softNaturalLilac,
11310
11440
  // Warm-dark family (dark mode)
11311
- warmDarkEmber
11441
+ warmDarkEmber,
11442
+ warmDarkKirtanGold
11312
11443
  ];
11313
11444
  var paletteVariantsById = new Map(
11314
11445
  paletteVariants.map((v) => [v.id, v])
@@ -12877,9 +13008,125 @@ function headerConfigurationKey(configuration) {
12877
13008
  function asFooterLookId(value) {
12878
13009
  return value;
12879
13010
  }
12880
- var guaranteedFallbackFooterLookId = asFooterLookId("footer-muted-grounding");
13011
+ function asFooterLayoutId(value) {
13012
+ return value;
13013
+ }
13014
+ function asFooterStyleId(value) {
13015
+ return value;
13016
+ }
13017
+ var guaranteedFallbackFooterLookId = asFooterLookId("footer-identity-quiet");
13018
+ var footerLayoutCatalog = defineExactCatalog()([
13019
+ {
13020
+ id: asFooterLayoutId("identity"),
13021
+ label: "Identity",
13022
+ description: "Logo, site text, address, and legal copy without relying on footer navigation."
13023
+ },
13024
+ {
13025
+ id: asFooterLayoutId("centered"),
13026
+ label: "Centered",
13027
+ description: "A calm centered stack for identity, short copy, and optional compact navigation.",
13028
+ maxRecommendedNavDensity: "sparse"
13029
+ },
13030
+ {
13031
+ id: asFooterLayoutId("split"),
13032
+ label: "Split",
13033
+ description: "Navigation and brand signoff separated into a wider split footer.",
13034
+ requiresFooterNav: true,
13035
+ maxRecommendedNavDensity: "balanced"
13036
+ },
13037
+ {
13038
+ id: asFooterLayoutId("columns"),
13039
+ label: "Columns",
13040
+ description: "Grouped footer navigation columns with a supporting bottom line.",
13041
+ requiresFooterNav: true,
13042
+ requiresFooterNavGroups: true
13043
+ }
13044
+ ]);
13045
+ var footerStyleCatalog = defineExactCatalog()([
13046
+ {
13047
+ id: asFooterStyleId("quiet"),
13048
+ label: "Quiet",
13049
+ description: "Lightweight, practical footer treatment."
13050
+ },
13051
+ {
13052
+ id: asFooterStyleId("calm"),
13053
+ label: "Calm",
13054
+ description: "Soft centered treatment with restrained dividers."
13055
+ },
13056
+ {
13057
+ id: asFooterStyleId("editorial"),
13058
+ label: "Editorial",
13059
+ description: "Text-forward treatment with fine-line structure."
13060
+ },
13061
+ {
13062
+ id: asFooterStyleId("brand-band"),
13063
+ label: "Brand band",
13064
+ description: "High-contrast brand treatment with a stronger bottom bar."
13065
+ }
13066
+ ]);
13067
+ var footerLayoutsById = new Map(
13068
+ footerLayoutCatalog.map((layout) => [layout.id, layout])
13069
+ );
13070
+ var footerStylesById = new Map(
13071
+ footerStyleCatalog.map((style) => [style.id, style])
13072
+ );
13073
+ function identityQuietFooter(theme) {
13074
+ return {
13075
+ ...theme.footer,
13076
+ variant: "simple",
13077
+ maxWidth: "container",
13078
+ background: {
13079
+ type: "color",
13080
+ color: "surface"
13081
+ },
13082
+ navStyle: "minimal",
13083
+ navWeight: "regular",
13084
+ navColor: "text",
13085
+ navLinkStyle: {
13086
+ typography: "body",
13087
+ fontWeight: "regular",
13088
+ textTransform: "none",
13089
+ italic: false,
13090
+ colorToken: "text",
13091
+ hoverColorToken: "primary",
13092
+ padding: "none",
13093
+ borderRadius: "none"
13094
+ },
13095
+ navLayout: {
13096
+ layout: "inline-wrap",
13097
+ align: "start",
13098
+ gapX: "default",
13099
+ gapY: "tight"
13100
+ },
13101
+ logo: {
13102
+ showLogo: true,
13103
+ showLogoText: true,
13104
+ placement: "left",
13105
+ size: "sm",
13106
+ align: "start"
13107
+ },
13108
+ bottomBar: {
13109
+ enabled: false,
13110
+ fullBleed: false,
13111
+ textAlign: "left",
13112
+ paddingX: "default",
13113
+ paddingY: "compact",
13114
+ borderTop: {
13115
+ width: "none"
13116
+ }
13117
+ }
13118
+ };
13119
+ }
12881
13120
  function mutedGroundingFooter(theme) {
12882
- return theme.footer;
13121
+ return {
13122
+ ...identityQuietFooter(theme),
13123
+ background: theme.footer.background,
13124
+ navStyle: theme.footer.navStyle,
13125
+ navColor: theme.footer.navColor,
13126
+ navWeight: theme.footer.navWeight,
13127
+ navLinkStyle: theme.footer.navLinkStyle,
13128
+ bottomTextLinkStyle: theme.footer.bottomTextLinkStyle
13129
+ };
12883
13130
  }
12884
13131
  function brandTwoBandFooter(theme) {
12885
13132
  return {
@@ -12984,6 +13231,53 @@ function centeredCalmFooter(theme) {
12984
13231
  }
12985
13232
  };
12986
13233
  }
13234
+ function splitEditorialFooter(theme) {
13235
+ return {
13236
+ ...theme.footer,
13237
+ variant: "split",
13238
+ maxWidth: "container",
13239
+ background: {
13240
+ type: "color",
13241
+ color: "surface"
13242
+ },
13243
+ navStyle: "minimal",
13244
+ navWeight: "regular",
13245
+ navColor: "text",
13246
+ navLinkStyle: {
13247
+ typography: "body",
13248
+ fontWeight: "regular",
13249
+ textTransform: "none",
13250
+ italic: false,
13251
+ colorToken: "text",
13252
+ hoverColorToken: "primary",
13253
+ padding: "none",
13254
+ borderRadius: "none"
13255
+ },
13256
+ navLayout: {
13257
+ layout: "inline-wrap",
13258
+ align: "start",
13259
+ gapX: "relaxed",
13260
+ gapY: "tight"
13261
+ },
13262
+ logo: {
13263
+ showLogo: true,
13264
+ showLogoText: true,
13265
+ placement: "right",
13266
+ size: "sm",
13267
+ align: "end"
13268
+ },
13269
+ bottomBar: {
13270
+ enabled: true,
13271
+ fullBleed: false,
13272
+ textAlign: "left",
13273
+ paddingX: "default",
13274
+ paddingY: "compact",
13275
+ borderTop: {
13276
+ width: "thin"
13277
+ }
13278
+ }
13279
+ };
13280
+ }
12987
13281
  function editorialColumnsFooter(theme) {
12988
13282
  return {
12989
13283
  ...theme.footer,
@@ -13026,25 +13320,47 @@ function editorialColumnsFooter(theme) {
13026
13320
  };
13027
13321
  }
13028
13322
  var footerLookCatalog = defineExactCatalog()([
13323
+ {
13324
+ id: asFooterLookId("footer-identity-quiet"),
13325
+ label: "Identity footer",
13326
+ layoutId: asFooterLayoutId("identity"),
13327
+ styleId: asFooterStyleId("quiet"),
13328
+ compile: identityQuietFooter
13329
+ },
13029
13330
  {
13030
13331
  id: asFooterLookId("footer-muted-grounding"),
13031
13332
  label: "Muted grounding footer",
13333
+ layoutId: asFooterLayoutId("identity"),
13334
+ styleId: asFooterStyleId("quiet"),
13335
+ hiddenFromLayoutStyleControls: true,
13032
13336
  compile: mutedGroundingFooter
13033
13337
  },
13034
13338
  {
13035
13339
  id: asFooterLookId("footer-centered-calm"),
13036
13340
  label: "Centered calm footer",
13341
+ layoutId: asFooterLayoutId("centered"),
13342
+ styleId: asFooterStyleId("calm"),
13037
13343
  compile: centeredCalmFooter
13038
13344
  },
13345
+ {
13346
+ id: asFooterLookId("footer-split-editorial"),
13347
+ label: "Split editorial footer",
13348
+ layoutId: asFooterLayoutId("split"),
13349
+ styleId: asFooterStyleId("editorial"),
13350
+ compile: splitEditorialFooter
13351
+ },
13039
13352
  {
13040
13353
  id: asFooterLookId("footer-editorial-columns"),
13041
13354
  label: "Editorial columns footer",
13355
+ layoutId: asFooterLayoutId("columns"),
13356
+ styleId: asFooterStyleId("editorial"),
13042
13357
  compile: editorialColumnsFooter
13043
13358
  },
13044
13359
  {
13045
13360
  id: asFooterLookId("site-footer-brand-two-band"),
13046
13361
  label: "Two-band brand footer",
13047
- maxRecommendedNavDensity: "balanced",
13362
+ layoutId: asFooterLayoutId("split"),
13363
+ styleId: asFooterStyleId("brand-band"),
13048
13364
  allowedContentPresence: ["default-footer", "default-and-blocks"],
13049
13365
  compile: brandTwoBandFooter
13050
13366
  }
@@ -13247,6 +13563,30 @@ var luxeContrastTypography = {
13247
13563
  },
13248
13564
  scale: "spacious"
13249
13565
  };
13566
+ var kirtanOrnateTypography = {
13567
+ body: {
13568
+ family: "Jost, system-ui, sans-serif",
13569
+ size: "md",
13570
+ weight: "regular",
13571
+ lineHeight: "relaxed",
13572
+ letterSpacing: "normal"
13573
+ },
13574
+ headings: {
13575
+ default: {
13576
+ family: "Marcellus, Georgia, serif",
13577
+ weight: "regular",
13578
+ lineHeight: "normal",
13579
+ letterSpacing: "normal",
13580
+ colorToken: "primary",
13581
+ italic: null,
13582
+ case: null
13583
+ },
13584
+ h1: { size: "2xl", weight: "regular", lineHeight: "normal", letterSpacing: "normal", italic: null },
13585
+ h2: { size: "xl", weight: "regular", lineHeight: "normal", letterSpacing: "normal", italic: null },
13586
+ h3: { size: "md", weight: "regular", lineHeight: "relaxed", letterSpacing: "normal", italic: null }
13587
+ },
13588
+ scale: "spacious"
13589
+ };
13250
13590
  var boldDisplayTypography = {
13251
13591
  body: {
13252
13592
  family: "Manrope, system-ui, sans-serif",
@@ -13281,16 +13621,16 @@ var originalJoyTypography = {
13281
13621
  },
13282
13622
  headings: {
13283
13623
  default: {
13284
- family: "Bricolage Grotesque, system-ui, sans-serif",
13285
- weight: "bold",
13624
+ family: "Lobster, cursive",
13625
+ weight: "regular",
13286
13626
  lineHeight: "normal",
13287
- letterSpacing: "tight",
13627
+ letterSpacing: "normal",
13288
13628
  italic: null,
13289
13629
  case: null
13290
13630
  },
13291
- h1: { size: "2xl", weight: "bold", lineHeight: "normal", letterSpacing: "tight", italic: null },
13292
- h2: { size: "xl", weight: "bold", lineHeight: "normal", letterSpacing: "tight", italic: null },
13293
- h3: { size: "lg", weight: "bold", lineHeight: "normal", letterSpacing: "tight", italic: null }
13631
+ h1: { size: "2xl", weight: "regular", lineHeight: "normal", letterSpacing: "normal", italic: null },
13632
+ h2: { size: "xl", weight: "regular", lineHeight: "normal", letterSpacing: "normal", italic: null },
13633
+ h3: { size: "lg", weight: "regular", lineHeight: "normal", letterSpacing: "normal", italic: null }
13294
13634
  },
13295
13635
  scale: "balanced"
13296
13636
  };
@@ -13355,6 +13695,32 @@ var typographyPresets = [
13355
13695
  slotPolicies: { body: bodyReadablePolicy, heading: displayHeadingPolicy },
13356
13696
  typography: luxeContrastTypography
13357
13697
  }),
13698
+ defineTypographyPreset({
13699
+ id: "typography-preset:kirtan-ornate",
13700
+ name: "Kirtan Ornate",
13701
+ description: "Marcellus devotional headings over a refined Jost body, matching dark ceremonial layouts.",
13702
+ defaultFonts: { body: "Jost, system-ui, sans-serif", heading: "Marcellus, Georgia, serif" },
13703
+ recommendedFonts: {
13704
+ body: ["Jost", "Manrope", "Inter"],
13705
+ heading: ["Marcellus", "Cormorant Garamond", "Playfair Display"]
13706
+ },
13707
+ slotPolicies: { body: bodyReadablePolicy, heading: displayHeadingPolicy },
13708
+ typography: kirtanOrnateTypography,
13709
+ heroTypography: {
13710
+ headlineSize: "6xl",
13711
+ headlineLineHeight: "normal",
13712
+ subheadlineSize: "xl",
13713
+ subheadlineLineHeight: "relaxed",
13714
+ microHeadlineSize: "5xl",
13715
+ microHeadlineLineHeight: "normal",
13716
+ microSubheadlineSize: "lg",
13717
+ microSubheadlineLineHeight: "relaxed",
13718
+ responsive: {
13719
+ tablet: { headlineSize: "5xl" },
13720
+ mobile: { headlineSize: "4xl", subheadlineSize: "lg" }
13721
+ }
13722
+ }
13723
+ }),
13358
13724
  defineTypographyPreset({
13359
13725
  id: "typography-preset:bold-display",
13360
13726
  name: "Bold Display",
@@ -13384,11 +13750,11 @@ var typographyPresets = [
13384
13750
  defineTypographyPreset({
13385
13751
  id: "typography-preset:original-joy",
13386
13752
  name: "Original Joy",
13387
- description: "Bold Bricolage Grotesque display headings over a clean DM Sans body, editorial and warm.",
13388
- defaultFonts: { body: "DM Sans, system-ui, sans-serif", heading: "Bricolage Grotesque, system-ui, sans-serif" },
13753
+ description: "Lobster display headings over a clean DM Sans body, expressive and warm.",
13754
+ defaultFonts: { body: "DM Sans, system-ui, sans-serif", heading: "Lobster, cursive" },
13389
13755
  recommendedFonts: {
13390
13756
  body: ["DM Sans", "Inter", "Manrope"],
13391
- heading: ["Bricolage Grotesque", "Space Grotesk", "Archivo"]
13757
+ heading: ["Lobster", "Bricolage Grotesque", "Space Grotesk"]
13392
13758
  },
13393
13759
  slotPolicies: { body: bodyReadablePolicy, heading: displayHeadingPolicy },
13394
13760
  typography: originalJoyTypography,
@@ -13412,87 +13778,482 @@ var typographyPresetsById = new Map(
13412
13778
  typographyPresets.map((preset2) => [preset2.id, preset2])
13413
13779
  );
13414
13780
 
13415
- // ../theme-core/src/site-styles/curatedSiteStyles.ts
13416
- var SOFT_EARTH_SITE_STYLE_ID_VALUE = "site-style:soft-earth";
13417
- var SOFT_EARTH_SITE_STYLE_ID = asSiteStyleId(SOFT_EARTH_SITE_STYLE_ID_VALUE);
13418
- var curatedSiteStyleIdValues = [
13419
- "site-style:calm-studio",
13420
- "site-style:clear-professional",
13421
- "site-style:warm-editorial",
13422
- "site-style:bright-community",
13423
- "site-style:quiet-luxury",
13424
- "site-style:practical-services",
13425
- "site-style:quiet-practice",
13426
- "site-style:personal-retreat-journal",
13427
- "site-style:tactile-workshop",
13428
- "site-style:modern-wellness",
13429
- "site-style:clarity-zen-blue",
13430
- SOFT_EARTH_SITE_STYLE_ID_VALUE,
13431
- "site-style:bold-launch",
13432
- "site-style:south-west-twerk-school",
13433
- "site-style:original-joy"
13434
- ];
13435
- var quietBudget = {
13436
- accentDensity: "low",
13437
- panelDensity: "medium",
13438
- transitionMix: "quiet",
13439
- primaryCtaLimit: 2,
13440
- mediaDensity: "medium",
13441
- decorativeRepetition: "low"
13442
- };
13443
- var balancedBudget = {
13444
- accentDensity: "medium",
13445
- panelDensity: "medium",
13446
- transitionMix: "balanced",
13447
- primaryCtaLimit: 3,
13448
- mediaDensity: "medium",
13449
- decorativeRepetition: "medium"
13450
- };
13451
- var expressiveBudget = {
13452
- accentDensity: "high",
13453
- panelDensity: "high",
13454
- transitionMix: "expressive",
13455
- primaryCtaLimit: 3,
13456
- mediaDensity: "high",
13457
- decorativeRepetition: "medium"
13458
- };
13459
- var expressiveUnderlineInputs = {
13460
- base: {
13461
- background: { type: "transparent" },
13462
- textColorToken: "text",
13463
- border: {
13464
- widthClass: "border-2",
13465
- colorToken: "border",
13466
- style: "underline"
13781
+ // ../theme-core/src/site-styles/designState.ts
13782
+ import { z as z25 } from "zod";
13783
+ var themeV2DesignStateSchemaVersion = 1;
13784
+ var designResolutionPolicySchema = z25.enum(["generated", "user", "admin", "sdk"]);
13785
+ var runtimeStyleFieldNameSchema = z25.enum(themeV2RuntimeStyleFieldNames);
13786
+ var nonEmptyRuntimeStyleFieldNamesSchema = z25.array(runtimeStyleFieldNameSchema).min(1).transform((fields3) => [
13787
+ fields3[0],
13788
+ ...fields3.slice(1)
13789
+ ]);
13790
+ var heroLegibilityStrategySchema = z25.enum([
13791
+ "none",
13792
+ "scrim-gradient",
13793
+ "solid-panel"
13794
+ ]);
13795
+ var heroCompositionIntentSchema = z25.enum([
13796
+ "center",
13797
+ "bottom-left"
13798
+ ]);
13799
+ var heroTypographyScaleIntentSchema = z25.enum([
13800
+ "quiet",
13801
+ "editorial",
13802
+ "display",
13803
+ "poster"
13804
+ ]);
13805
+ var sectionHeightIntentSchema = z25.enum([
13806
+ "default",
13807
+ "banner",
13808
+ "hero",
13809
+ "immersive"
13810
+ ]);
13811
+ var imageSurfaceTreatmentIntensitySchema = z25.enum(["soft", "balanced", "strong"]);
13812
+ var imageSurfaceMotionSchema = z25.enum(["static", "fixed-frame"]);
13813
+ var imageSurfaceTreatmentSchema = z25.discriminatedUnion("kind", [
13814
+ z25.object({ kind: z25.literal("none") }).strict(),
13815
+ z25.object({
13816
+ kind: z25.literal("brand-scrim"),
13817
+ token: z25.enum(["primary", "secondary", "accent"]),
13818
+ intensity: imageSurfaceTreatmentIntensitySchema.optional()
13819
+ }).strict(),
13820
+ z25.object({
13821
+ kind: z25.literal("brand-wash"),
13822
+ token: z25.enum(["primary", "secondary", "accent"]),
13823
+ intensity: imageSurfaceTreatmentIntensitySchema.optional()
13824
+ }).strict(),
13825
+ z25.object({
13826
+ kind: z25.literal("neutral-scrim"),
13827
+ intensity: imageSurfaceTreatmentIntensitySchema.optional()
13828
+ }).strict(),
13829
+ z25.object({
13830
+ kind: z25.literal("neutral-wash"),
13831
+ intensity: imageSurfaceTreatmentIntensitySchema.optional()
13832
+ }).strict(),
13833
+ z25.object({
13834
+ kind: z25.literal("solid-panel"),
13835
+ intensity: imageSurfaceTreatmentIntensitySchema.optional()
13836
+ }).strict()
13837
+ ]);
13838
+ var testimonialCardTreatmentSchema = z25.enum(["default", "accent-quote"]);
13839
+ var tileTreatmentSchema = z25.enum(tileTreatmentValues);
13840
+ var eventListTreatmentSchema = z25.enum(eventListTreatmentValues);
13841
+ var eyebrowTreatmentSchema = z25.enum(eyebrowTreatmentValues);
13842
+ function uniqueNonEmpty(values) {
13843
+ const uniqueValues = [...new Set(values)];
13844
+ const firstValue = uniqueValues[0];
13845
+ if (!firstValue) {
13846
+ throw new Error("Expected at least one Theme V2 design state option.");
13847
+ }
13848
+ return [firstValue, ...uniqueValues.slice(1)];
13849
+ }
13850
+ var userPanelTreatments = uniqueNonEmpty(
13851
+ userDesignOptionCatalog.contentFrames.filter((frame) => frame.kind === "panel").map((frame) => frame.treatment)
13852
+ );
13853
+ var userFlushTreatments = uniqueNonEmpty(
13854
+ userDesignOptionCatalog.contentFrames.filter((frame) => frame.kind === "flush-panel").map((frame) => frame.treatment)
13855
+ );
13856
+ var userFlushBleeds = uniqueNonEmpty(
13857
+ userDesignOptionCatalog.contentFrames.filter((frame) => frame.kind === "flush-panel").map((frame) => frame.bleed)
13858
+ );
13859
+ var contentFrameIntentSchema = z25.discriminatedUnion("kind", [
13860
+ z25.object({ kind: z25.literal("plain") }).strict(),
13861
+ z25.object({
13862
+ kind: z25.literal("panel"),
13863
+ treatment: z25.enum(userPanelTreatments)
13864
+ }).strict(),
13865
+ z25.object({
13866
+ kind: z25.literal("flush-panel"),
13867
+ treatment: z25.enum(userFlushTreatments),
13868
+ bleed: z25.enum(userFlushBleeds)
13869
+ }).strict()
13870
+ ]);
13871
+ var blockDesignPlanSchema = z25.object({
13872
+ blockId: z25.string().min(1).transform(asDesignBlockId),
13873
+ blockKind: z25.string().min(1),
13874
+ purpose: z25.string().min(1),
13875
+ sectionSurface: z25.enum(userDesignOptionCatalog.sectionSurfaces),
13876
+ contentFrame: contentFrameIntentSchema,
13877
+ itemSurface: z25.enum(userDesignOptionCatalog.itemSurfaces),
13878
+ transitionAfter: z25.enum(userDesignOptionCatalog.transitions),
13879
+ emphasis: z25.enum(userDesignOptionCatalog.emphases),
13880
+ sectionHeight: sectionHeightIntentSchema.optional(),
13881
+ heroLegibility: heroLegibilityStrategySchema.optional(),
13882
+ heroComposition: heroCompositionIntentSchema.optional(),
13883
+ heroTypographyScale: heroTypographyScaleIntentSchema.optional(),
13884
+ imageSurfaceTreatment: imageSurfaceTreatmentSchema.optional(),
13885
+ imageSurfaceMotion: imageSurfaceMotionSchema.optional(),
13886
+ testimonialCardTreatment: testimonialCardTreatmentSchema.optional(),
13887
+ tileTreatment: tileTreatmentSchema.optional(),
13888
+ eventListTreatment: eventListTreatmentSchema.optional(),
13889
+ eyebrowTreatment: eyebrowTreatmentSchema.optional()
13890
+ }).strict();
13891
+ var styleAuthoritySchema = z25.discriminatedUnion("kind", [
13892
+ z25.object({
13893
+ kind: z25.literal("theme-v2"),
13894
+ source: designResolutionPolicySchema,
13895
+ siteStyleId: z25.string().min(1).transform(asSiteStyleId),
13896
+ templateId: z25.string().min(1).transform(asDesignSystemTemplateId),
13897
+ templateVersion: z25.number().int().nonnegative(),
13898
+ resolverVersion: z25.number().int().nonnegative()
13899
+ }).strict(),
13900
+ z25.object({
13901
+ kind: z25.literal("legacy-raw"),
13902
+ reason: z25.enum(["pre-theme-v2", "manual-runtime-fields"])
13903
+ }).strict(),
13904
+ z25.object({
13905
+ kind: z25.literal("advanced-detached"),
13906
+ reason: z25.literal("detached-custom-runtime-fields")
13907
+ }).strict()
13908
+ ]);
13909
+ var blockRuntimeStyleAuthoritySchema = z25.object({
13910
+ unit: z25.literal("block-runtime-fields"),
13911
+ blockId: z25.string().min(1).transform(asDesignBlockId),
13912
+ fields: nonEmptyRuntimeStyleFieldNamesSchema,
13913
+ authority: styleAuthoritySchema
13914
+ }).strict();
13915
+ var persistedPageDesignStateV1Schema = z25.object({
13916
+ schemaVersion: z25.literal(themeV2DesignStateSchemaVersion),
13917
+ siteStyleId: z25.string().min(1).transform(asSiteStyleId),
13918
+ templateId: z25.string().min(1).transform(asDesignSystemTemplateId),
13919
+ templateVersion: z25.number().int().nonnegative(),
13920
+ resolverVersion: z25.number().int().nonnegative(),
13921
+ rhythmPresetId: z25.string().min(1),
13922
+ blocks: z25.array(blockDesignPlanSchema),
13923
+ styleAuthorities: z25.array(blockRuntimeStyleAuthoritySchema)
13924
+ }).strict();
13925
+
13926
+ // ../theme-core/src/site-styles/runtimeCompiler.ts
13927
+ function defineDesignRuntimeRules(rules) {
13928
+ return rules;
13929
+ }
13930
+ function defineComponentRuntimeRules(rules) {
13931
+ return rules;
13932
+ }
13933
+ var defaultDesignRuntimeRules = defineDesignRuntimeRules({
13934
+ sectionSurfaces: {
13935
+ base: {},
13936
+ "muted-band": {
13937
+ background: {
13938
+ type: "color",
13939
+ color: "muted"
13940
+ }
13467
13941
  },
13468
- corners: "square",
13469
- shadow: null,
13470
- spacing: "compact",
13471
- fontSize: "base"
13472
- },
13473
- label: {
13474
- textColorToken: "primary",
13475
- fontWeight: "black",
13476
- fontSize: "xs",
13477
- textTransform: "uppercase",
13478
- letterSpacing: "widest",
13479
- opacity: 1
13480
- },
13481
- focus: {
13482
- ringColorToken: "secondary",
13483
- ringWidth: "0",
13484
- borderColorToken: "secondary"
13942
+ "accent-band": {
13943
+ background: {
13944
+ type: "color",
13945
+ color: "primary"
13946
+ }
13947
+ },
13948
+ "brand-depth-band": {
13949
+ background: {
13950
+ type: "color",
13951
+ color: "primary-800"
13952
+ }
13953
+ },
13954
+ "hero-image": {
13955
+ background: {
13956
+ type: "image",
13957
+ opacity: 1,
13958
+ position: "center center",
13959
+ ...uniformSectionForeground("text")
13960
+ }
13961
+ }
13485
13962
  },
13486
- error: {
13487
- borderColorToken: "destructive",
13488
- textColorToken: "destructive"
13963
+ heroLegibility: {
13964
+ "scrim-gradient": {
13965
+ type: "gradient",
13966
+ gradient: "linear-gradient(180deg, rgba(255,255,255,0.38) 0%, rgba(244,241,234,0.62) 90%)",
13967
+ opacity: 1
13968
+ },
13969
+ "solid-panel": {
13970
+ type: "color",
13971
+ color: "surface",
13972
+ opacity: 0.88
13973
+ }
13489
13974
  },
13490
- disabled: {
13491
- backgroundColorToken: "surface",
13975
+ transitionClassName: (transition, fromSurface, toSurface) => transition === "none" ? null : `site-style-transition-${transition}-from-${fromSurface}-to-${toSurface}`
13976
+ });
13977
+ var defaultComponentRuntimeRules = defineComponentRuntimeRules({
13978
+ panelFrames: {
13979
+ inset: {
13980
+ spacing: "comfortable",
13981
+ rounded: "xl",
13982
+ raised: false,
13983
+ background: {
13984
+ type: "color",
13985
+ color: "surfaceAlt",
13986
+ textColor: "text"
13987
+ }
13988
+ },
13989
+ raised: {
13990
+ spacing: "comfortable",
13991
+ rounded: "xl",
13992
+ raised: true,
13993
+ background: {
13994
+ type: "color",
13995
+ color: "surfaceAlt",
13996
+ textColor: "text"
13997
+ }
13998
+ },
13999
+ editorial: {
14000
+ spacing: "medium",
14001
+ rounded: "xl",
14002
+ raised: false,
14003
+ background: {
14004
+ type: "color",
14005
+ color: "surface",
14006
+ textColor: "text"
14007
+ }
14008
+ }
14009
+ },
14010
+ flushFrames: {
14011
+ "media-panel": {
14012
+ fullWidth: true,
14013
+ spacing: "none",
14014
+ rounded: "none",
14015
+ raised: false
14016
+ }
14017
+ },
14018
+ itemSurfaces: {
14019
+ none: null,
14020
+ default: {
14021
+ spacing: "medium",
14022
+ rounded: "lg",
14023
+ raised: false
14024
+ },
14025
+ flat: {
14026
+ spacing: "medium",
14027
+ rounded: "lg",
14028
+ raised: false
14029
+ },
14030
+ outlined: {
14031
+ spacing: "medium",
14032
+ rounded: "lg",
14033
+ raised: false,
14034
+ border: {
14035
+ enabled: true,
14036
+ width: "1",
14037
+ colorToken: "border"
14038
+ }
14039
+ },
14040
+ raised: {
14041
+ spacing: "medium",
14042
+ rounded: "xl",
14043
+ raised: true
14044
+ },
14045
+ inset: {
14046
+ treatment: "soft-panel",
14047
+ spacing: "comfortable",
14048
+ rounded: "xl",
14049
+ raised: false,
14050
+ border: {
14051
+ enabled: false
14052
+ },
14053
+ background: {
14054
+ type: "color",
14055
+ color: "surfaceAlt",
14056
+ textColor: "text"
14057
+ }
14058
+ },
14059
+ editorial: {
14060
+ // Boxless open column with a short rule on top; the visual treatment
14061
+ // lives in blocks-static/card-treatments.css.
14062
+ treatment: "editorial-rule",
14063
+ spacing: "none",
14064
+ rounded: "none",
14065
+ raised: false,
14066
+ border: {
14067
+ enabled: false
14068
+ }
14069
+ },
14070
+ "color-blocked": {
14071
+ // Bold, flat colour-blocked cards. The per-card background colour cycle
14072
+ // (by position) and staggered offset live in
14073
+ // blocks-static/card-treatments.css; here we set the shared shape:
14074
+ // generous padding, large radius, no border, flat (no shadow).
14075
+ treatment: "color-blocked",
14076
+ spacing: "spacious",
14077
+ rounded: "2xl",
14078
+ raised: false,
14079
+ border: {
14080
+ enabled: false
14081
+ }
14082
+ }
14083
+ }
14084
+ });
14085
+ function uniformSectionForeground(token) {
14086
+ return {
14087
+ textColor: token,
14088
+ headingColor: token,
14089
+ linkColor: token,
14090
+ supportingColor: token
14091
+ };
14092
+ }
14093
+
14094
+ // ../theme-core/src/site-styles/curatedSiteStyles.ts
14095
+ var SOFT_EARTH_SITE_STYLE_ID_VALUE = "site-style:soft-earth";
14096
+ var SOFT_EARTH_SITE_STYLE_ID = asSiteStyleId(SOFT_EARTH_SITE_STYLE_ID_VALUE);
14097
+ var curatedSiteStyleIdValues = [
14098
+ "site-style:calm-studio",
14099
+ "site-style:clear-professional",
14100
+ "site-style:warm-editorial",
14101
+ "site-style:bright-community",
14102
+ "site-style:quiet-luxury",
14103
+ "site-style:practical-services",
14104
+ "site-style:quiet-practice",
14105
+ "site-style:personal-retreat-journal",
14106
+ "site-style:tactile-workshop",
14107
+ "site-style:modern-wellness",
14108
+ "site-style:clarity-zen-blue",
14109
+ SOFT_EARTH_SITE_STYLE_ID_VALUE,
14110
+ "site-style:bold-launch",
14111
+ "site-style:south-west-twerk-school",
14112
+ "site-style:kirtan-ornate",
14113
+ "site-style:original-joy"
14114
+ ];
14115
+ var quietBudget = {
14116
+ accentDensity: "low",
14117
+ panelDensity: "medium",
14118
+ transitionMix: "quiet",
14119
+ primaryCtaLimit: 2,
14120
+ mediaDensity: "medium",
14121
+ decorativeRepetition: "low"
14122
+ };
14123
+ var balancedBudget = {
14124
+ accentDensity: "medium",
14125
+ panelDensity: "medium",
14126
+ transitionMix: "balanced",
14127
+ primaryCtaLimit: 3,
14128
+ mediaDensity: "medium",
14129
+ decorativeRepetition: "medium"
14130
+ };
14131
+ var expressiveBudget = {
14132
+ accentDensity: "high",
14133
+ panelDensity: "high",
14134
+ transitionMix: "expressive",
14135
+ primaryCtaLimit: 3,
14136
+ mediaDensity: "high",
14137
+ decorativeRepetition: "medium"
14138
+ };
14139
+ var kirtanOrnateDesignRuntimeRules = defineDesignRuntimeRules({
14140
+ ...defaultDesignRuntimeRules,
14141
+ defaultEyebrowTreatment: "accent",
14142
+ sectionSurfaces: {
14143
+ ...defaultDesignRuntimeRules.sectionSurfaces,
14144
+ "muted-band": {
14145
+ background: {
14146
+ type: "color",
14147
+ color: "muted"
14148
+ },
14149
+ foreground: {
14150
+ textColor: "text",
14151
+ headingColor: "primary",
14152
+ linkColor: "primary",
14153
+ supportingColor: "text"
14154
+ }
14155
+ },
14156
+ "brand-depth-band": {
14157
+ background: {
14158
+ type: "color",
14159
+ color: "primary-800"
14160
+ },
14161
+ foreground: {
14162
+ textColor: "text",
14163
+ headingColor: "primary",
14164
+ linkColor: "primary",
14165
+ supportingColor: "text"
14166
+ }
14167
+ },
14168
+ "hero-image": {
14169
+ background: {
14170
+ type: "image",
14171
+ opacity: 1,
14172
+ position: "center center"
14173
+ },
14174
+ foreground: {
14175
+ textColor: "text",
14176
+ headingColor: "primary",
14177
+ linkColor: "primary",
14178
+ supportingColor: "text"
14179
+ }
14180
+ }
14181
+ }
14182
+ });
14183
+ var expressiveUnderlineInputs = {
14184
+ base: {
14185
+ background: { type: "transparent" },
14186
+ textColorToken: "text",
14187
+ border: {
14188
+ widthClass: "border-2",
14189
+ colorToken: "border",
14190
+ style: "underline"
14191
+ },
14192
+ corners: "square",
14193
+ shadow: null,
14194
+ spacing: "compact",
14195
+ fontSize: "base"
14196
+ },
14197
+ label: {
14198
+ textColorToken: "primary",
14199
+ fontWeight: "black",
14200
+ fontSize: "xs",
14201
+ textTransform: "uppercase",
14202
+ letterSpacing: "widest",
14203
+ opacity: 1
14204
+ },
14205
+ focus: {
14206
+ ringColorToken: "secondary",
14207
+ ringWidth: "0",
14208
+ borderColorToken: "secondary"
14209
+ },
14210
+ error: {
14211
+ borderColorToken: "destructive",
14212
+ textColorToken: "destructive"
14213
+ },
14214
+ disabled: {
14215
+ backgroundColorToken: "surface",
13492
14216
  textColorToken: "text",
13493
14217
  opacity: 0.6
13494
14218
  }
13495
14219
  };
14220
+ var ornateDarkInputs = {
14221
+ base: {
14222
+ background: { type: "solid", colorToken: "surfaceAlt" },
14223
+ textColorToken: "text",
14224
+ border: {
14225
+ widthClass: "border",
14226
+ colorToken: "primary/45",
14227
+ style: "all"
14228
+ },
14229
+ corners: "square",
14230
+ shadow: null,
14231
+ spacing: "medium",
14232
+ fontSize: "base"
14233
+ },
14234
+ label: {
14235
+ textColorToken: "primary",
14236
+ fontWeight: "semibold",
14237
+ fontSize: "xs",
14238
+ textTransform: "uppercase",
14239
+ letterSpacing: "wider",
14240
+ opacity: 1
14241
+ },
14242
+ focus: {
14243
+ ringColorToken: "primary/18",
14244
+ ringWidth: "2",
14245
+ borderColorToken: "primary/70"
14246
+ },
14247
+ error: {
14248
+ borderColorToken: "destructive",
14249
+ textColorToken: "destructive"
14250
+ },
14251
+ disabled: {
14252
+ backgroundColorToken: "muted",
14253
+ textColorToken: "mutedText",
14254
+ opacity: 0.6
14255
+ }
14256
+ };
13496
14257
  function uniqueContentFrameKinds() {
13497
14258
  const kinds = [
13498
14259
  ...new Set(
@@ -13550,6 +14311,7 @@ function defineCuratedSiteStyle(input) {
13550
14311
  // clean/minimal styles default to none.
13551
14312
  headingDecoration: input.headingDecoration ?? noHeadingDecoration,
13552
14313
  ...input.themeOverrides ? { themeOverrides: input.themeOverrides } : {},
14314
+ ...input.designRuntimeRules ? { designRuntimeRules: input.designRuntimeRules } : {},
13553
14315
  ...input.defaultBlockVariants ? { defaultBlockVariants: input.defaultBlockVariants } : {},
13554
14316
  recommendedAppearancePresetIds: (input.recommendedAppearancePresetIds ?? []).map(asAppearancePresetId),
13555
14317
  defaultHeaderSelection: input.defaultHeaderSelection ? {
@@ -14500,6 +15262,80 @@ var curatedSiteStyles = [
14500
15262
  paletteChoice("high-contrast-ink")
14501
15263
  ]
14502
15264
  }),
15265
+ defineCuratedSiteStyle({
15266
+ id: "site-style:kirtan-ornate",
15267
+ name: "Kirtan Ornate",
15268
+ headingDecoration: { family: "short-center-rule", colorToken: "accent" },
15269
+ description: "Ceremonial, jewel-toned, and devotional: ornate frames, warm contrast, and composed rhythm for intimate music gatherings.",
15270
+ generationBrief: "Use a deep plum ground with pale gold as the main brand color, rose accent details, cream text, spacious split hero sections, devotional editorial headings, compact event lists, and framed conversion sections. The mood should feel soulful and ceremonial, not gothic or theatrical.",
15271
+ selectionKeywordRules: [
15272
+ { kind: "word", value: "kirtan" },
15273
+ { kind: "word", value: "chanting" },
15274
+ { kind: "word", value: "ceremony" },
15275
+ { kind: "word", value: "devotional" }
15276
+ ],
15277
+ tokenRecipes: {
15278
+ palette: "brand-led",
15279
+ contrast: "strong",
15280
+ radius: "soft",
15281
+ shadow: "subtle",
15282
+ typography: "serif-editorial",
15283
+ spacing: "airy",
15284
+ motion: "subtle"
15285
+ },
15286
+ compositionBudget: expressiveBudget,
15287
+ typographyPresetChoices: [
15288
+ typographyChoice("typography-preset:kirtan-ornate"),
15289
+ typographyChoice("typography-preset:luxe-contrast"),
15290
+ typographyChoice("typography-preset:editorial-serif")
15291
+ ],
15292
+ defaultTypographyPresetId: "typography-preset:kirtan-ornate",
15293
+ themeOverrides: {
15294
+ accordions: warmInsetAccordionSystem,
15295
+ cards: originalJoyCardSystem,
15296
+ testimonialQuote: serifDisplayQuote,
15297
+ bodyText: {
15298
+ intro: {
15299
+ paragraphSize: "editorial",
15300
+ headingSize: "editorial"
15301
+ }
15302
+ },
15303
+ inputs: ornateDarkInputs
15304
+ },
15305
+ designRuntimeRules: kirtanOrnateDesignRuntimeRules,
15306
+ recommendedAppearancePresetIds: [
15307
+ "hero-brand-scrim-fixed-frame",
15308
+ "media-text-quiet-story",
15309
+ "events-lined-panel",
15310
+ "schedule-details-brand-depth",
15311
+ "testimonials-statement-cards",
15312
+ "contact-form-panel"
15313
+ ],
15314
+ defaultHeaderSelection: { layoutId: "floating", styleId: "minimal-surface" },
15315
+ recommendedHeaderLayoutChoices: [headerLayoutChoice("floating")],
15316
+ recommendedHeaderStyleChoicesByLayout: {
15317
+ floating: [
15318
+ headerStyleChoice("minimal-surface"),
15319
+ headerStyleChoice("split-glass"),
15320
+ headerStyleChoice("glass")
15321
+ ]
15322
+ },
15323
+ recommendedHeaderLookIds: ["minimal-transparent"],
15324
+ recommendedFooterLookIds: [
15325
+ "site-footer-brand-two-band",
15326
+ "footer-muted-grounding"
15327
+ ],
15328
+ buttonPersonalityChoices: [
15329
+ buttonChoice("ornate-ritual"),
15330
+ buttonChoice("joy-stamp"),
15331
+ buttonChoice("ink-stamp")
15332
+ ],
15333
+ paletteVariantChoices: [
15334
+ paletteChoice("warm-dark-kirtan-gold"),
15335
+ paletteChoice("warm-dark-ember"),
15336
+ paletteChoice("brand-led-burgundy-gold")
15337
+ ]
15338
+ }),
14503
15339
  defineCuratedSiteStyle({
14504
15340
  id: "site-style:original-joy",
14505
15341
  name: "Original Joy",
@@ -14606,319 +15442,6 @@ var pageFlowPresets = [
14606
15442
  }
14607
15443
  ];
14608
15444
 
14609
- // ../theme-core/src/site-styles/designState.ts
14610
- import { z as z25 } from "zod";
14611
- var themeV2DesignStateSchemaVersion = 1;
14612
- var designResolutionPolicySchema = z25.enum(["generated", "user", "admin", "sdk"]);
14613
- var runtimeStyleFieldNameSchema = z25.enum(themeV2RuntimeStyleFieldNames);
14614
- var nonEmptyRuntimeStyleFieldNamesSchema = z25.array(runtimeStyleFieldNameSchema).min(1).transform((fields3) => [
14615
- fields3[0],
14616
- ...fields3.slice(1)
14617
- ]);
14618
- var heroLegibilityStrategySchema = z25.enum([
14619
- "none",
14620
- "scrim-gradient",
14621
- "solid-panel"
14622
- ]);
14623
- var heroCompositionIntentSchema = z25.enum([
14624
- "center",
14625
- "bottom-left"
14626
- ]);
14627
- var heroTypographyScaleIntentSchema = z25.enum([
14628
- "quiet",
14629
- "editorial",
14630
- "display",
14631
- "poster"
14632
- ]);
14633
- var sectionHeightIntentSchema = z25.enum([
14634
- "default",
14635
- "banner",
14636
- "hero",
14637
- "immersive"
14638
- ]);
14639
- var imageSurfaceTreatmentIntensitySchema = z25.enum(["soft", "balanced", "strong"]);
14640
- var imageSurfaceMotionSchema = z25.enum(["static", "fixed-frame"]);
14641
- var imageSurfaceTreatmentSchema = z25.discriminatedUnion("kind", [
14642
- z25.object({ kind: z25.literal("none") }).strict(),
14643
- z25.object({
14644
- kind: z25.literal("brand-scrim"),
14645
- token: z25.enum(["primary", "secondary", "accent"]),
14646
- intensity: imageSurfaceTreatmentIntensitySchema.optional()
14647
- }).strict(),
14648
- z25.object({
14649
- kind: z25.literal("brand-wash"),
14650
- token: z25.enum(["primary", "secondary", "accent"]),
14651
- intensity: imageSurfaceTreatmentIntensitySchema.optional()
14652
- }).strict(),
14653
- z25.object({
14654
- kind: z25.literal("neutral-scrim"),
14655
- intensity: imageSurfaceTreatmentIntensitySchema.optional()
14656
- }).strict(),
14657
- z25.object({
14658
- kind: z25.literal("neutral-wash"),
14659
- intensity: imageSurfaceTreatmentIntensitySchema.optional()
14660
- }).strict(),
14661
- z25.object({
14662
- kind: z25.literal("solid-panel"),
14663
- intensity: imageSurfaceTreatmentIntensitySchema.optional()
14664
- }).strict()
14665
- ]);
14666
- var testimonialCardTreatmentSchema = z25.enum(["default", "accent-quote"]);
14667
- var tileTreatmentSchema = z25.enum(tileTreatmentValues);
14668
- var eventListTreatmentSchema = z25.enum(eventListTreatmentValues);
14669
- var eyebrowTreatmentSchema = z25.enum(eyebrowTreatmentValues);
14670
- function uniqueNonEmpty(values) {
14671
- const uniqueValues = [...new Set(values)];
14672
- const firstValue = uniqueValues[0];
14673
- if (!firstValue) {
14674
- throw new Error("Expected at least one Theme V2 design state option.");
14675
- }
14676
- return [firstValue, ...uniqueValues.slice(1)];
14677
- }
14678
- var userPanelTreatments = uniqueNonEmpty(
14679
- userDesignOptionCatalog.contentFrames.filter((frame) => frame.kind === "panel").map((frame) => frame.treatment)
14680
- );
14681
- var userFlushTreatments = uniqueNonEmpty(
14682
- userDesignOptionCatalog.contentFrames.filter((frame) => frame.kind === "flush-panel").map((frame) => frame.treatment)
14683
- );
14684
- var userFlushBleeds = uniqueNonEmpty(
14685
- userDesignOptionCatalog.contentFrames.filter((frame) => frame.kind === "flush-panel").map((frame) => frame.bleed)
14686
- );
14687
- var contentFrameIntentSchema = z25.discriminatedUnion("kind", [
14688
- z25.object({ kind: z25.literal("plain") }).strict(),
14689
- z25.object({
14690
- kind: z25.literal("panel"),
14691
- treatment: z25.enum(userPanelTreatments)
14692
- }).strict(),
14693
- z25.object({
14694
- kind: z25.literal("flush-panel"),
14695
- treatment: z25.enum(userFlushTreatments),
14696
- bleed: z25.enum(userFlushBleeds)
14697
- }).strict()
14698
- ]);
14699
- var blockDesignPlanSchema = z25.object({
14700
- blockId: z25.string().min(1).transform(asDesignBlockId),
14701
- blockKind: z25.string().min(1),
14702
- purpose: z25.string().min(1),
14703
- sectionSurface: z25.enum(userDesignOptionCatalog.sectionSurfaces),
14704
- contentFrame: contentFrameIntentSchema,
14705
- itemSurface: z25.enum(userDesignOptionCatalog.itemSurfaces),
14706
- transitionAfter: z25.enum(userDesignOptionCatalog.transitions),
14707
- emphasis: z25.enum(userDesignOptionCatalog.emphases),
14708
- sectionHeight: sectionHeightIntentSchema.optional(),
14709
- heroLegibility: heroLegibilityStrategySchema.optional(),
14710
- heroComposition: heroCompositionIntentSchema.optional(),
14711
- heroTypographyScale: heroTypographyScaleIntentSchema.optional(),
14712
- imageSurfaceTreatment: imageSurfaceTreatmentSchema.optional(),
14713
- imageSurfaceMotion: imageSurfaceMotionSchema.optional(),
14714
- testimonialCardTreatment: testimonialCardTreatmentSchema.optional(),
14715
- tileTreatment: tileTreatmentSchema.optional(),
14716
- eventListTreatment: eventListTreatmentSchema.optional(),
14717
- eyebrowTreatment: eyebrowTreatmentSchema.optional()
14718
- }).strict();
14719
- var styleAuthoritySchema = z25.discriminatedUnion("kind", [
14720
- z25.object({
14721
- kind: z25.literal("theme-v2"),
14722
- source: designResolutionPolicySchema,
14723
- siteStyleId: z25.string().min(1).transform(asSiteStyleId),
14724
- templateId: z25.string().min(1).transform(asDesignSystemTemplateId),
14725
- templateVersion: z25.number().int().nonnegative(),
14726
- resolverVersion: z25.number().int().nonnegative()
14727
- }).strict(),
14728
- z25.object({
14729
- kind: z25.literal("legacy-raw"),
14730
- reason: z25.enum(["pre-theme-v2", "manual-runtime-fields"])
14731
- }).strict(),
14732
- z25.object({
14733
- kind: z25.literal("advanced-detached"),
14734
- reason: z25.literal("detached-custom-runtime-fields")
14735
- }).strict()
14736
- ]);
14737
- var blockRuntimeStyleAuthoritySchema = z25.object({
14738
- unit: z25.literal("block-runtime-fields"),
14739
- blockId: z25.string().min(1).transform(asDesignBlockId),
14740
- fields: nonEmptyRuntimeStyleFieldNamesSchema,
14741
- authority: styleAuthoritySchema
14742
- }).strict();
14743
- var persistedPageDesignStateV1Schema = z25.object({
14744
- schemaVersion: z25.literal(themeV2DesignStateSchemaVersion),
14745
- siteStyleId: z25.string().min(1).transform(asSiteStyleId),
14746
- templateId: z25.string().min(1).transform(asDesignSystemTemplateId),
14747
- templateVersion: z25.number().int().nonnegative(),
14748
- resolverVersion: z25.number().int().nonnegative(),
14749
- rhythmPresetId: z25.string().min(1),
14750
- blocks: z25.array(blockDesignPlanSchema),
14751
- styleAuthorities: z25.array(blockRuntimeStyleAuthoritySchema)
14752
- }).strict();
14753
-
14754
- // ../theme-core/src/site-styles/runtimeCompiler.ts
14755
- function defineDesignRuntimeRules(rules) {
14756
- return rules;
14757
- }
14758
- function defineComponentRuntimeRules(rules) {
14759
- return rules;
14760
- }
14761
- var defaultDesignRuntimeRules = defineDesignRuntimeRules({
14762
- sectionSurfaces: {
14763
- base: {},
14764
- "muted-band": {
14765
- background: {
14766
- type: "color",
14767
- color: "muted"
14768
- }
14769
- },
14770
- "accent-band": {
14771
- background: {
14772
- type: "color",
14773
- color: "primary"
14774
- }
14775
- },
14776
- "brand-depth-band": {
14777
- background: {
14778
- type: "color",
14779
- color: "primary-800"
14780
- }
14781
- },
14782
- "hero-image": {
14783
- background: {
14784
- type: "image",
14785
- opacity: 1,
14786
- position: "center center",
14787
- ...uniformSectionForeground("text")
14788
- }
14789
- }
14790
- },
14791
- heroLegibility: {
14792
- "scrim-gradient": {
14793
- type: "gradient",
14794
- gradient: "linear-gradient(180deg, rgba(255,255,255,0.38) 0%, rgba(244,241,234,0.62) 90%)",
14795
- opacity: 1
14796
- },
14797
- "solid-panel": {
14798
- type: "color",
14799
- color: "surface",
14800
- opacity: 0.88
14801
- }
14802
- },
14803
- transitionClassName: (transition, fromSurface, toSurface) => transition === "none" ? null : `site-style-transition-${transition}-from-${fromSurface}-to-${toSurface}`
14804
- });
14805
- var defaultComponentRuntimeRules = defineComponentRuntimeRules({
14806
- panelFrames: {
14807
- inset: {
14808
- spacing: "comfortable",
14809
- rounded: "xl",
14810
- raised: false,
14811
- background: {
14812
- type: "color",
14813
- color: "surfaceAlt",
14814
- textColor: "text"
14815
- }
14816
- },
14817
- raised: {
14818
- spacing: "comfortable",
14819
- rounded: "xl",
14820
- raised: true,
14821
- background: {
14822
- type: "color",
14823
- color: "surfaceAlt",
14824
- textColor: "text"
14825
- }
14826
- },
14827
- editorial: {
14828
- spacing: "medium",
14829
- rounded: "xl",
14830
- raised: false,
14831
- background: {
14832
- type: "color",
14833
- color: "surface",
14834
- textColor: "text"
14835
- }
14836
- }
14837
- },
14838
- flushFrames: {
14839
- "media-panel": {
14840
- fullWidth: true,
14841
- spacing: "none",
14842
- rounded: "none",
14843
- raised: false
14844
- }
14845
- },
14846
- itemSurfaces: {
14847
- none: null,
14848
- default: {
14849
- spacing: "medium",
14850
- rounded: "lg",
14851
- raised: false
14852
- },
14853
- flat: {
14854
- spacing: "medium",
14855
- rounded: "lg",
14856
- raised: false
14857
- },
14858
- outlined: {
14859
- spacing: "medium",
14860
- rounded: "lg",
14861
- raised: false,
14862
- border: {
14863
- enabled: true,
14864
- width: "1",
14865
- colorToken: "border"
14866
- }
14867
- },
14868
- raised: {
14869
- spacing: "medium",
14870
- rounded: "xl",
14871
- raised: true
14872
- },
14873
- inset: {
14874
- treatment: "soft-panel",
14875
- spacing: "comfortable",
14876
- rounded: "xl",
14877
- raised: false,
14878
- border: {
14879
- enabled: false
14880
- },
14881
- background: {
14882
- type: "color",
14883
- color: "surfaceAlt",
14884
- textColor: "text"
14885
- }
14886
- },
14887
- editorial: {
14888
- // Boxless open column with a short rule on top; the visual treatment
14889
- // lives in blocks-static/card-treatments.css.
14890
- treatment: "editorial-rule",
14891
- spacing: "none",
14892
- rounded: "none",
14893
- raised: false,
14894
- border: {
14895
- enabled: false
14896
- }
14897
- },
14898
- "color-blocked": {
14899
- // Bold, flat colour-blocked cards. The per-card background colour cycle
14900
- // (by position) and staggered offset live in
14901
- // blocks-static/card-treatments.css; here we set the shared shape:
14902
- // generous padding, large radius, no border, flat (no shadow).
14903
- treatment: "color-blocked",
14904
- spacing: "spacious",
14905
- rounded: "2xl",
14906
- raised: false,
14907
- border: {
14908
- enabled: false
14909
- }
14910
- }
14911
- }
14912
- });
14913
- function uniformSectionForeground(token) {
14914
- return {
14915
- textColor: token,
14916
- headingColor: token,
14917
- linkColor: token,
14918
- supportingColor: token
14919
- };
14920
- }
14921
-
14922
15445
  // ../theme-core/src/site-styles/generatedSchemas.ts
14923
15446
  import { z as z26 } from "zod";
14924
15447
  function uniqueNonEmpty2(values) {
@@ -15730,6 +16253,31 @@ function cardStylesField(options = {}) {
15730
16253
  return createBoxStylesFieldWithDepth("card", options);
15731
16254
  }
15732
16255
 
16256
+ // ../blocks/src/system/fields/imageShape.ts
16257
+ var standardImageShapeOptions = [
16258
+ { value: "default", label: "Default" },
16259
+ { value: "square", label: "Square corners" },
16260
+ { value: "rounded", label: "Rounded corners" },
16261
+ { value: "circle", label: "Circle" },
16262
+ { value: "arch", label: "Arch" }
16263
+ ];
16264
+ function createImageShapeField(options = {}) {
16265
+ return {
16266
+ id: options.id ?? "imageShape",
16267
+ type: "select",
16268
+ label: options.label ?? "Image shape",
16269
+ ...options.description ? { description: options.description } : {},
16270
+ required: false,
16271
+ defaultValue: options.defaultValue ?? "default",
16272
+ multiple: false,
16273
+ options: [...standardImageShapeOptions],
16274
+ ui: {
16275
+ intent: options.uiIntent ?? "display",
16276
+ ...options.visibleWhen ? { visibleWhen: options.visibleWhen } : {}
16277
+ }
16278
+ };
16279
+ }
16280
+
15733
16281
  // ../blocks/src/utils/env.ts
15734
16282
  function isDevEnvironment() {
15735
16283
  try {
@@ -16544,7 +17092,7 @@ function buildFooterNavAll(common) {
16544
17092
  return stack(
16545
17093
  { className: common.className, gap: common.gap, align: "stretch" },
16546
17094
  [item],
16547
- when(collectionPath)
17095
+ whenCollectionHasItems(collectionPath)
16548
17096
  );
16549
17097
  }
16550
17098
  function buildFooterNavLinksOnly(common) {
@@ -16577,7 +17125,7 @@ function buildFooterNavLinksOnly(common) {
16577
17125
  return stack(
16578
17126
  { className: common.className, gap: common.gap, align: "stretch" },
16579
17127
  [item],
16580
- when(collectionPath)
17128
+ whenCollectionHasItems(collectionPath)
16581
17129
  );
16582
17130
  }
16583
17131
  function buildFooterNavFlatten(common) {
@@ -16626,9 +17174,20 @@ function buildFooterNavFlatten(common) {
16626
17174
  return stack(
16627
17175
  { className: common.className, gap: common.gap, align: "stretch" },
16628
17176
  [item],
16629
- when(collectionPath)
17177
+ whenCollectionHasItems(collectionPath)
16630
17178
  );
16631
17179
  }
17180
+ var whenCollectionHasItems = (collectionPath) => (node) => ({
17181
+ ...node,
17182
+ $when: {
17183
+ when: {
17184
+ from: collectionPath,
17185
+ transforms: [{ id: "array.length" }]
17186
+ },
17187
+ equals: 0,
17188
+ not: true
17189
+ }
17190
+ });
16632
17191
  function footerNav(opts) {
16633
17192
  const mode = opts?.mode ?? "all";
16634
17193
  const collectionPath = opts?.collectionPath ?? "footerMenu.items";
@@ -19343,8 +19902,23 @@ function fragmentsToRepeaterField(id, label, fragments, options = {}) {
19343
19902
  var heroLayoutControlsFragment = defineFragment({
19344
19903
  id: "heroLayoutControls",
19345
19904
  title: "Hero Layout",
19346
- description: "Alignment and content width controls for hero layouts.",
19905
+ description: "Title scale, alignment, and content width controls for hero layouts.",
19347
19906
  fields: [
19907
+ {
19908
+ id: "titleSize",
19909
+ type: "select",
19910
+ label: "Title size",
19911
+ description: "Adjust the visual scale of the hero title.",
19912
+ required: false,
19913
+ ui: { intent: "display" },
19914
+ options: [
19915
+ { value: "auto", label: "Auto" },
19916
+ { value: "quiet", label: "Normal" },
19917
+ { value: "editorial", label: "Large" },
19918
+ { value: "display", label: "Huge" },
19919
+ { value: "poster", label: "Poster" }
19920
+ ]
19921
+ },
19348
19922
  {
19349
19923
  id: "contentAlignment",
19350
19924
  type: "select",
@@ -20139,7 +20713,18 @@ function heroSplitImagePane() {
20139
20713
  return stack(
20140
20714
  {
20141
20715
  gap: "none",
20142
- className: "rb-relative rb-overflow-hidden rb-rounded-3xl",
20716
+ className: {
20717
+ $bind: {
20718
+ from: "content.imageShape",
20719
+ transforms: [
20720
+ {
20721
+ id: "ui.imageShapeClassName",
20722
+ options: { baseClass: "rb-relative rb-overflow-hidden rb-rounded-3xl" }
20723
+ }
20724
+ ],
20725
+ fallback: "rb-relative rb-overflow-hidden rb-rounded-3xl"
20726
+ }
20727
+ },
20143
20728
  style: {
20144
20729
  minHeight: "clamp(18rem, 36vw, 34rem)"
20145
20730
  }
@@ -20257,6 +20842,12 @@ var heroConfig = {
20257
20842
  label: "Content card",
20258
20843
  renderInHeader: true,
20259
20844
  intent: "style"
20845
+ }),
20846
+ createImageShapeField({
20847
+ id: "imageShape",
20848
+ label: "Image shape",
20849
+ defaultValue: "default",
20850
+ uiIntent: "display"
20260
20851
  })
20261
20852
  ],
20262
20853
  layout: classicLayout,
@@ -20271,6 +20862,15 @@ var heroConfig = {
20271
20862
  description: "Hero section with headline, subtitle, and repeatable CTAs.",
20272
20863
  tags: ["header", "banner", "landing", "introduction", "welcome", "splash", "headline"],
20273
20864
  icon: "Sparkles",
20865
+ previewCustomize: {
20866
+ quickFieldPriority: [
20867
+ "titleSize",
20868
+ "contentAlignment",
20869
+ "contentMaxWidth",
20870
+ "verticalAlignment",
20871
+ "imageShape"
20872
+ ]
20873
+ },
20274
20874
  styleTokens: {
20275
20875
  typography: "display",
20276
20876
  spacing: "xl"
@@ -20287,7 +20887,8 @@ var standardAspectRatioOptions = [
20287
20887
  { value: "16/9", label: "16:9 (Landscape)" },
20288
20888
  { value: "4/3", label: "4:3 (Standard)" },
20289
20889
  { value: "1/1", label: "1:1 (Square)" },
20290
- { value: "3/4", label: "3:4 (Portrait)" }
20890
+ { value: "3/4", label: "3:4 (Portrait)" },
20891
+ { value: "9/16", label: "9:16 (Tall portrait)" }
20291
20892
  ];
20292
20893
  function createAspectRatioField(options = {}) {
20293
20894
  return {
@@ -21529,6 +22130,258 @@ var formBlockDefinition = {
21529
22130
  runtime: formBlockRuntime
21530
22131
  };
21531
22132
 
22133
+ // ../blocks/src/system/blocks/contact-newsletter.ts
22134
+ var contactNewsletterLayout = styledSection({
22135
+ children: sectionContainer([
22136
+ el(
22137
+ "div",
22138
+ { className: "contact-newsletter-grid" },
22139
+ [
22140
+ el(
22141
+ "div",
22142
+ { className: "contact-newsletter-column contact-newsletter-contact" },
22143
+ [
22144
+ el(
22145
+ "div",
22146
+ { className: "contact-newsletter-copy" },
22147
+ [
22148
+ text(
22149
+ {
22150
+ as: "h2",
22151
+ className: "form-copy-title"
22152
+ },
22153
+ when("contactTitle"),
22154
+ bind("contactTitle")
22155
+ ),
22156
+ richText(
22157
+ {
22158
+ className: "form-copy-intro rb-prose rb-max-w-none"
22159
+ },
22160
+ when("contactIntro"),
22161
+ bind("contactIntro")
22162
+ )
22163
+ ]
22164
+ ),
22165
+ el(
22166
+ "form",
22167
+ withApiBindings({
22168
+ spamProtectionEnabled: { $bind: { from: "$root.spamProtectionEnabled" } },
22169
+ submitLabel: { $bind: { from: "contactSubmitLabel" } },
22170
+ successMessage: { $bind: { from: "contactSuccessMessage" } }
22171
+ }),
22172
+ [],
22173
+ bind("data.form")
22174
+ )
22175
+ ]
22176
+ ),
22177
+ el(
22178
+ "div",
22179
+ { className: "contact-newsletter-column contact-newsletter-info contact-newsletter-newsletter" },
22180
+ [
22181
+ el(
22182
+ "div",
22183
+ { className: "contact-newsletter-copy" },
22184
+ [
22185
+ text(
22186
+ {
22187
+ as: "h2",
22188
+ className: "newsletter-copy-title"
22189
+ },
22190
+ when("newsletterTitle"),
22191
+ bind("newsletterTitle")
22192
+ ),
22193
+ richText(
22194
+ {
22195
+ className: "newsletter-copy-subtitle rb-prose rb-max-w-none"
22196
+ },
22197
+ when("newsletterSubtitle"),
22198
+ bind("newsletterSubtitle")
22199
+ )
22200
+ ]
22201
+ ),
22202
+ el(
22203
+ "newsletter-form",
22204
+ withApiBindings({
22205
+ listId: { $bind: { from: "listId" } },
22206
+ preset: { $bind: { from: "preset" } },
22207
+ includePhone: { $bind: { from: "includePhone" } },
22208
+ buttonLabel: { $bind: { from: "newsletterButtonLabel" } },
22209
+ successMessage: { $bind: { from: "newsletterSuccessMessage" } },
22210
+ privacyNote: { $bind: { from: "newsletterPrivacyNote" } },
22211
+ tags: { $bind: { from: "newsletterTags" } },
22212
+ spamProtectionEnabled: { $bind: { from: "$root.spamProtectionEnabled" } }
22213
+ }),
22214
+ []
22215
+ )
22216
+ ]
22217
+ )
22218
+ ]
22219
+ )
22220
+ ], {
22221
+ className: "contact-newsletter-container"
22222
+ }),
22223
+ baseClass: "",
22224
+ spacing: "medium",
22225
+ background: "surface"
22226
+ });
22227
+ var contactNewsletterManifest = createBlockManifest({
22228
+ id: "block.contact-newsletter",
22229
+ title: "Contact + Newsletter",
22230
+ titleSource: "contactTitle",
22231
+ description: "Two-column newsletter signup and contact form section.",
22232
+ category: "interactive",
22233
+ layout: contactNewsletterLayout,
22234
+ defaultVariant: "default",
22235
+ variants: {
22236
+ default: contactNewsletterLayout
22237
+ },
22238
+ variantOptions: {
22239
+ default: {
22240
+ label: "Two column",
22241
+ description: "Newsletter and contact form side by side.",
22242
+ icon: "Columns2"
22243
+ }
22244
+ },
22245
+ additionalFields: [
22246
+ {
22247
+ id: "newsletterTitle",
22248
+ type: "text",
22249
+ label: "Newsletter title",
22250
+ defaultValue: "Stay connected"
22251
+ },
22252
+ {
22253
+ id: "newsletterSubtitle",
22254
+ type: "richText",
22255
+ label: "Newsletter intro"
22256
+ },
22257
+ {
22258
+ id: "listId",
22259
+ type: "reference",
22260
+ label: "Newsletter list",
22261
+ description: "Select the list new subscribers should be added to.",
22262
+ required: true,
22263
+ referenceKind: "newsletterList",
22264
+ allowManualEntry: false,
22265
+ ui: { intent: "behavior" }
22266
+ },
22267
+ {
22268
+ id: "preset",
22269
+ type: "select",
22270
+ label: "Newsletter fields",
22271
+ defaultValue: "emailOnly",
22272
+ ui: { intent: "display" },
22273
+ options: [
22274
+ { value: "emailOnly", label: "Email only" },
22275
+ { value: "emailName", label: "Email + Name" },
22276
+ { value: "emailFirstLast", label: "Email + First/Last Name" },
22277
+ { value: "emailNameCompany", label: "Email + Name + Company (B2B)" }
22278
+ ]
22279
+ },
22280
+ {
22281
+ id: "includePhone",
22282
+ type: "boolean",
22283
+ label: "Include phone field",
22284
+ defaultValue: false,
22285
+ ui: { intent: "display" }
22286
+ },
22287
+ {
22288
+ id: "newsletterButtonLabel",
22289
+ type: "text",
22290
+ label: "Newsletter button label",
22291
+ defaultValue: "Subscribe",
22292
+ ui: { intent: "display" }
22293
+ },
22294
+ {
22295
+ id: "newsletterSuccessMessage",
22296
+ type: "text",
22297
+ label: "Newsletter success message",
22298
+ defaultValue: "Thanks for subscribing!",
22299
+ ui: { intent: "behavior" }
22300
+ },
22301
+ {
22302
+ id: "newsletterPrivacyNote",
22303
+ type: "text",
22304
+ label: "Privacy note",
22305
+ ui: { intent: "display" }
22306
+ },
22307
+ {
22308
+ id: "newsletterTags",
22309
+ type: "text",
22310
+ label: "Newsletter tags",
22311
+ description: "Optional tags to apply on subscribe, separated by comma or semicolon.",
22312
+ ui: { intent: "behavior" }
22313
+ },
22314
+ {
22315
+ id: "contactTitle",
22316
+ type: "text",
22317
+ label: "Contact title",
22318
+ defaultValue: "Get in touch"
22319
+ },
22320
+ {
22321
+ id: "contactIntro",
22322
+ type: "richText",
22323
+ label: "Contact intro"
22324
+ },
22325
+ {
22326
+ id: "formSlug",
22327
+ type: "reference",
22328
+ label: "Contact form",
22329
+ description: "Pick a saved form to render.",
22330
+ required: true,
22331
+ referenceKind: "form",
22332
+ allowManualEntry: false,
22333
+ ui: { intent: "behavior" }
22334
+ },
22335
+ {
22336
+ id: "contactSubmitLabel",
22337
+ type: "text",
22338
+ label: "Contact button label",
22339
+ defaultValue: "Send message",
22340
+ ui: { intent: "display" }
22341
+ },
22342
+ {
22343
+ id: "contactSuccessMessage",
22344
+ type: "text",
22345
+ label: "Contact success message",
22346
+ defaultValue: "Thanks - we received your message.",
22347
+ ui: { intent: "behavior" }
22348
+ }
22349
+ ],
22350
+ styleTokens: {
22351
+ background: "surface",
22352
+ typography: "body",
22353
+ spacing: "md"
22354
+ },
22355
+ behaviours: {
22356
+ supportsThemeSwitching: true,
22357
+ inlineEditing: true,
22358
+ animation: false,
22359
+ paletteHidden: false
22360
+ },
22361
+ tags: [
22362
+ "contact",
22363
+ "newsletter",
22364
+ "signup",
22365
+ "email",
22366
+ "form",
22367
+ "lead-capture"
22368
+ ],
22369
+ icon: "MailPlus"
22370
+ });
22371
+ var contactNewsletterBlockDefinition = {
22372
+ manifest: contactNewsletterManifest,
22373
+ dataSchemas: { form: formDataSchema.optional() },
22374
+ dataLoaders: {
22375
+ form: {
22376
+ endpoint: "getPublicFormById",
22377
+ params: {
22378
+ formSlug: { $bind: { from: "formSlug" } }
22379
+ },
22380
+ mode: "server"
22381
+ }
22382
+ }
22383
+ };
22384
+
21532
22385
  // ../blocks/src/system/blocks/faq.ts
21533
22386
  function fragmentLayoutNode2(layout) {
21534
22387
  return isNodeDefinitionArray2(layout) ? el("div", {}, [...layout]) : layout;
@@ -21757,6 +22610,7 @@ var joinClasses3 = (parts) => parts.filter(
21757
22610
  ).join(" ").replace(/\s+/g, " ").trim();
21758
22611
  var eyebrowTreatmentClassMap = {
21759
22612
  plain: "",
22613
+ accent: "rb-eyebrow-treatment-accent",
21760
22614
  pill: "rb-eyebrow-treatment-pill",
21761
22615
  "accent-pill": "rb-eyebrow-treatment-pill rb-eyebrow-treatment-accent",
21762
22616
  "pill-bounce": "rb-eyebrow-treatment-pill rb-eyebrow-treatment-pill-bounce",
@@ -21783,6 +22637,13 @@ var imageGalleryCornerClassMap = {
21783
22637
  "2xl": "rb-rounded-2xl",
21784
22638
  "3xl": "rb-rounded-3xl"
21785
22639
  };
22640
+ var imageShapeClassMap = {
22641
+ default: "",
22642
+ square: "rb-media-shape-square",
22643
+ rounded: "rb-media-shape-rounded",
22644
+ circle: "rb-media-shape-circle",
22645
+ arch: "rb-media-shape-arch"
22646
+ };
21786
22647
  var parseRatio = (raw) => {
21787
22648
  if (typeof raw !== "string") return null;
21788
22649
  const value = raw.trim();
@@ -21927,6 +22788,10 @@ function resolveHeroContentMaxWidth(content) {
21927
22788
  return "default";
21928
22789
  }
21929
22790
  function resolveHeroTypographyScale(content) {
22791
+ const titleSize = readString(content, "titleSize");
22792
+ if (titleSize === "quiet" || titleSize === "editorial" || titleSize === "display" || titleSize === "poster") {
22793
+ return titleSize;
22794
+ }
21930
22795
  const raw = readHeroLayoutString(
21931
22796
  content,
21932
22797
  "typographyScale",
@@ -22168,6 +23033,16 @@ var uiTransforms = [
22168
23033
  heroGridClassFromVerticalAlignmentTransform,
22169
23034
  imageFragmentClassTransform,
22170
23035
  imageFragmentSizeTransform,
23036
+ {
23037
+ id: "ui.imageShapeClassName",
23038
+ kind: "string",
23039
+ summary: "Apply a constrained media shape class",
23040
+ run: (value, options) => {
23041
+ const baseClass = typeof options?.baseClass === "string" ? options.baseClass : "";
23042
+ const shape = typeof value === "string" ? value.trim() : "default";
23043
+ return joinClasses3([baseClass, imageShapeClassMap[shape] ?? ""]);
23044
+ }
23045
+ },
22171
23046
  conditionalClassTransform,
22172
23047
  twoColumnContainerClassTransform,
22173
23048
  twoColumnFlexBasisTransform,
@@ -23561,6 +24436,21 @@ var siteHeaderManifest = createBlockManifest({
23561
24436
  id: "block.site-header",
23562
24437
  title: "Site Header",
23563
24438
  category: "layout",
24439
+ additionalFields: [
24440
+ {
24441
+ id: "mode",
24442
+ type: "select",
24443
+ label: "Header display",
24444
+ required: false,
24445
+ multiple: false,
24446
+ defaultValue: "default",
24447
+ options: [
24448
+ { value: "default", label: "Show header" },
24449
+ { value: "hidden", label: "Hide header" }
24450
+ ],
24451
+ ui: { intent: "display" }
24452
+ }
24453
+ ],
23564
24454
  // Skip section styles - this block uses theme-based styling
23565
24455
  skipSectionStyles: true,
23566
24456
  // Block manages its own wrapper - enables sticky positioning
@@ -24973,6 +25863,9 @@ var mediaTextManifest = createBlockManifest({
24973
25863
  category: "layout",
24974
25864
  includeContainerStyles: true,
24975
25865
  titleSource: "title",
25866
+ previewCustomize: {
25867
+ quickFieldPriority: ["imagePosition", "ratio", "imageShape", "titleAlignment", "aspectRatio"]
25868
+ },
24976
25869
  additionalFields: [
24977
25870
  {
24978
25871
  id: "images",
@@ -25011,7 +25904,7 @@ var mediaTextManifest = createBlockManifest({
25011
25904
  {
25012
25905
  id: "titleAlignment",
25013
25906
  type: "select",
25014
- label: "Title alignment",
25907
+ label: "Content alignment",
25015
25908
  required: false,
25016
25909
  defaultValue: "left",
25017
25910
  multiple: false,
@@ -25069,7 +25962,18 @@ var mediaTextManifest = createBlockManifest({
25069
25962
  transition: "slide"
25070
25963
  },
25071
25964
  ui: { intent: "behavior" }
25072
- }),
25965
+ }).map((field) => ({
25966
+ ...field,
25967
+ ui: {
25968
+ ...field.ui ?? {},
25969
+ visibleWhen: field.id === "carouselAutoplayDelay" ? {
25970
+ allOf: [
25971
+ { field: "images", minItems: 2 },
25972
+ { field: "carouselAutoplay", equals: true }
25973
+ ]
25974
+ } : { field: "images", minItems: 2 }
25975
+ }
25976
+ })),
25073
25977
  createAspectRatioField({
25074
25978
  id: "aspectRatio",
25075
25979
  label: "Media aspect ratio",
@@ -25077,6 +25981,12 @@ var mediaTextManifest = createBlockManifest({
25077
25981
  defaultValue: "auto",
25078
25982
  visibleWhen: { field: "images", notEquals: null }
25079
25983
  }),
25984
+ createImageShapeField({
25985
+ id: "imageShape",
25986
+ label: "Media shape",
25987
+ defaultValue: "default",
25988
+ visibleWhen: { field: "images", notEquals: null }
25989
+ }),
25080
25990
  {
25081
25991
  id: "text",
25082
25992
  type: "richText",
@@ -25110,6 +26020,30 @@ var mediaTextManifest = createBlockManifest({
25110
26020
  ...options?.not ? { not: true } : {}
25111
26021
  }
25112
26022
  });
26023
+ const bodyClassNameFromAlignment = {
26024
+ $bind: {
26025
+ from: "content.titleAlignment",
26026
+ transforms: [
26027
+ {
26028
+ id: "ui.bodyClassFromAlignment",
26029
+ options: { base: "rb-prose rb-max-w-none" }
26030
+ }
26031
+ ],
26032
+ fallback: "rb-prose rb-max-w-none"
26033
+ }
26034
+ };
26035
+ const titleClassNameFromAlignment = {
26036
+ $bind: {
26037
+ from: "content.titleAlignment",
26038
+ transforms: [
26039
+ {
26040
+ id: "ui.headingClassFromAlignment",
26041
+ options: { base: "" }
26042
+ }
26043
+ ],
26044
+ fallback: ""
26045
+ }
26046
+ };
25113
26047
  const defaultTextColumn = el("div", {}, [
25114
26048
  styledCard(
25115
26049
  [
@@ -25134,8 +26068,55 @@ var mediaTextManifest = createBlockManifest({
25134
26068
  bind("content.text")
25135
26069
  )
25136
26070
  ]);
26071
+ const bioTextColumn = el(
26072
+ "div",
26073
+ { className: "rb-flex rb-h-full rb-w-full rb-max-w-prose rb-flex-col rb-justify-center rb-gap-5" },
26074
+ [
26075
+ text(
26076
+ {
26077
+ as: "h2",
26078
+ className: titleClassNameFromAlignment
26079
+ },
26080
+ when("content.title"),
26081
+ bind("content.title")
26082
+ ),
26083
+ styledCard(
26084
+ [
26085
+ richText(
26086
+ {
26087
+ className: bodyClassNameFromAlignment
26088
+ },
26089
+ bind("content.text")
26090
+ )
26091
+ ],
26092
+ {
26093
+ stylesFrom: "content._textCardStyles",
26094
+ backgroundFrom: "content._textCardStyles.background"
26095
+ },
26096
+ when("content.wrapTextInCard")
26097
+ ),
26098
+ richText(
26099
+ {
26100
+ className: bodyClassNameFromAlignment
26101
+ },
26102
+ when("content.wrapTextInCard", { not: true }),
26103
+ bind("content.text")
26104
+ )
26105
+ ]
26106
+ );
25137
26107
  const defaultImageCommonProps = {
25138
- className: "rb-w-full rb-h-auto rb-object-cover",
26108
+ className: {
26109
+ $bind: {
26110
+ from: "content.imageShape",
26111
+ transforms: [
26112
+ {
26113
+ id: "ui.imageShapeClassName",
26114
+ options: { baseClass: "rb-w-full rb-h-auto rb-object-cover" }
26115
+ }
26116
+ ],
26117
+ fallback: "rb-w-full rb-h-auto rb-object-cover"
26118
+ }
26119
+ },
25139
26120
  style: {
25140
26121
  aspectRatio: { $bind: { from: "content.aspectRatio" } }
25141
26122
  }
@@ -25176,6 +26157,27 @@ var mediaTextManifest = createBlockManifest({
25176
26157
  ],
25177
26158
  whenImagesLength(0, { not: true })
25178
26159
  );
26160
+ const bioImagesLayout = el(
26161
+ "div",
26162
+ {},
26163
+ [
26164
+ responsiveTwoColumn({
26165
+ image: el("div", {}, [
26166
+ el("div", {}, [defaultSingleImage], whenImagesLength(1)),
26167
+ el("div", {}, [defaultCarouselImages], whenImagesLength(1, { not: true }))
26168
+ ]),
26169
+ text: bioTextColumn,
26170
+ ratioFrom: "content.ratio",
26171
+ imagePositionFrom: "content.imagePosition",
26172
+ containerClassName: "rb-flex rb-flex-col rb-md-flex-row rb-md-items-center",
26173
+ gapFrom: "content.gap",
26174
+ gapFallback: "comfortable",
26175
+ imageWrapperClassName: "rb-w-full rb-shrink-0",
26176
+ textWrapperClassName: "rb-w-full rb-min-w-0 rb-flex-1 rb-self-stretch"
26177
+ })
26178
+ ],
26179
+ whenImagesLength(0, { not: true })
26180
+ );
25179
26181
  const defaultTextOnlyLayout = el(
25180
26182
  "div",
25181
26183
  {},
@@ -25205,7 +26207,45 @@ var mediaTextManifest = createBlockManifest({
25205
26207
  ],
25206
26208
  whenImagesLength(0)
25207
26209
  );
26210
+ const bioTextOnlyLayout = el(
26211
+ "div",
26212
+ { className: "rb-flex rb-w-full rb-max-w-prose rb-flex-col rb-gap-5" },
26213
+ [
26214
+ text(
26215
+ {
26216
+ as: "h2",
26217
+ className: titleClassNameFromAlignment
26218
+ },
26219
+ when("content.title"),
26220
+ bind("content.title")
26221
+ ),
26222
+ styledCard(
26223
+ [
26224
+ richText(
26225
+ {
26226
+ className: bodyClassNameFromAlignment
26227
+ },
26228
+ bind("content.text")
26229
+ )
26230
+ ],
26231
+ {
26232
+ stylesFrom: "content._textCardStyles",
26233
+ backgroundFrom: "content._textCardStyles.background"
26234
+ },
26235
+ when("content.wrapTextInCard")
26236
+ ),
26237
+ richText(
26238
+ {
26239
+ className: bodyClassNameFromAlignment
26240
+ },
26241
+ when("content.wrapTextInCard", { not: true }),
26242
+ bind("content.text")
26243
+ )
26244
+ ],
26245
+ whenImagesLength(0)
26246
+ );
25208
26247
  const defaultInner = el("div", {}, [defaultImagesLayout, defaultTextOnlyLayout]);
26248
+ const bioInner = el("div", {}, [bioImagesLayout, bioTextOnlyLayout]);
25209
26249
  const defaultLayout2 = styledSection({
25210
26250
  children: styledContainer({
25211
26251
  rootType: "stack",
@@ -25214,18 +26254,7 @@ var mediaTextManifest = createBlockManifest({
25214
26254
  text(
25215
26255
  {
25216
26256
  as: "h2",
25217
- className: {
25218
- $bind: {
25219
- from: "content.titleAlignment",
25220
- transforms: [
25221
- {
25222
- id: "ui.headingClassFromAlignment",
25223
- options: { base: "" }
25224
- }
25225
- ],
25226
- fallback: ""
25227
- }
25228
- }
26257
+ className: titleClassNameFromAlignment
25229
26258
  },
25230
26259
  when("content.title"),
25231
26260
  bind("content.title")
@@ -25237,14 +26266,28 @@ var mediaTextManifest = createBlockManifest({
25237
26266
  baseClass: "",
25238
26267
  spacing: "medium"
25239
26268
  });
26269
+ const bioLayout = styledSection({
26270
+ children: styledContainer({
26271
+ rootType: "stack",
26272
+ rootProps: { gap: "lg" },
26273
+ children: [bioInner]
26274
+ }),
26275
+ baseClass: "",
26276
+ spacing: "medium"
26277
+ });
25240
26278
  return {
25241
26279
  layout: defaultLayout2,
25242
26280
  variants: {
25243
- default: defaultLayout2
26281
+ default: defaultLayout2,
26282
+ bio: bioLayout
25244
26283
  },
25245
26284
  defaultVariant: "default",
25246
26285
  variantOptions: {
25247
- default: { label: "Default" }
26286
+ default: { label: "Default" },
26287
+ bio: {
26288
+ label: "Bio",
26289
+ description: "Vertically centered title and copy beside media."
26290
+ }
25248
26291
  }
25249
26292
  };
25250
26293
  })(),
@@ -25950,10 +26993,8 @@ var occurrenceContextSchema = z44.object({
25950
26993
  // ../blocks/src/system/runtime/nodes/event-registration.interactive.ts
25951
26994
  import { z as z46 } from "zod";
25952
26995
 
25953
- // ../blocks/src/system/runtime/nodes/shared/contract-schemas.ts
25954
- import { z as z45 } from "zod";
25955
-
25956
26996
  // ../blocks/src/system/constants/events.ts
26997
+ var EVENT_CONTENT_TYPE_SLUGS = ["event", "events"];
25957
26998
  var eventCalendarDisplayModeValues = ["combined", "month", "week", "list", "timetable"];
25958
26999
  var eventCalendarListLayoutValues = ["stack", "grid", "compact"];
25959
27000
  var eventCalendarListLayoutOptions = [
@@ -25967,8 +27008,133 @@ function isEventCalendarDisplayMode(value) {
25967
27008
  function isEventCalendarListLayout(value) {
25968
27009
  return typeof value === "string" && eventCalendarListLayoutValues.includes(value);
25969
27010
  }
27011
+ function isEventContentType(slug) {
27012
+ if (!slug) return false;
27013
+ return EVENT_CONTENT_TYPE_SLUGS.includes(slug);
27014
+ }
27015
+
27016
+ // ../blocks/src/system/runtime/nodes/events/shared/pricing.ts
27017
+ var DEFAULT_EVENT_CURRENCY = "USD";
27018
+ function resolveRuntimeEventPricing(event) {
27019
+ if (isPublicEventPricing(event.pricing)) {
27020
+ return event.pricing;
27021
+ }
27022
+ const legacy = event;
27023
+ const currency = readCurrency(legacy.currency);
27024
+ if (event.requiresRegistration === false) {
27025
+ return {
27026
+ kind: "drop_in",
27027
+ currency,
27028
+ display: { kind: "free", currency }
27029
+ };
27030
+ }
27031
+ if (legacy.pricingMode === "ticket_types") {
27032
+ const ticketTypes = Array.isArray(legacy.ticketTypes) ? legacy.ticketTypes.filter(isPublicEventTicketType) : [];
27033
+ return {
27034
+ kind: "ticket_types",
27035
+ currency,
27036
+ ticketTypes,
27037
+ display: readTicketTypePriceDisplay(legacy.priceDisplay, currency)
27038
+ };
27039
+ }
27040
+ const amount = typeof legacy.price === "number" ? legacy.price : 0;
27041
+ if (legacy.pricingType === "paid" && amount > 0) {
27042
+ return {
27043
+ kind: "single_paid",
27044
+ amount,
27045
+ currency,
27046
+ display: { kind: "exact", amount, currency }
27047
+ };
27048
+ }
27049
+ return {
27050
+ kind: "free_registration",
27051
+ currency,
27052
+ display: { kind: "free", currency }
27053
+ };
27054
+ }
27055
+ function readCurrency(value) {
27056
+ return typeof value === "string" && value.trim().length > 0 ? value : DEFAULT_EVENT_CURRENCY;
27057
+ }
27058
+ function isRecord5(value) {
27059
+ return typeof value === "object" && value !== null && !Array.isArray(value);
27060
+ }
27061
+ function isPublicEventPricing(value) {
27062
+ if (!isRecord5(value) || typeof value.kind !== "string") return false;
27063
+ return value.kind === "drop_in" || value.kind === "free_registration" || value.kind === "single_paid" || value.kind === "ticket_types" || value.kind === "course";
27064
+ }
27065
+ function isPublicEventTicketType(value) {
27066
+ return isRecord5(value) && typeof value.id === "string";
27067
+ }
27068
+ function readTicketTypePriceDisplay(value, currency) {
27069
+ const display = readLegacyPriceDisplay(value, currency);
27070
+ return display.kind === "course" ? { kind: "unavailable", currency } : display;
27071
+ }
27072
+ function readLegacyPriceDisplay(value, currency) {
27073
+ if (!isRecord5(value) || typeof value.kind !== "string") {
27074
+ return { kind: "unavailable", currency };
27075
+ }
27076
+ const displayCurrency = readCurrency(value.currency);
27077
+ switch (value.kind) {
27078
+ case "free":
27079
+ return { kind: "free", currency: displayCurrency };
27080
+ case "exact":
27081
+ return readAmount(value.amount) !== null ? {
27082
+ kind: "exact",
27083
+ amount: readAmount(value.amount) ?? 0,
27084
+ currency: displayCurrency
27085
+ } : { kind: "unavailable", currency };
27086
+ case "from":
27087
+ return readAmount(value.amount) !== null ? {
27088
+ kind: "from",
27089
+ amount: readAmount(value.amount) ?? 0,
27090
+ currency: displayCurrency
27091
+ } : { kind: "unavailable", currency };
27092
+ case "mixed":
27093
+ return readAmount(value.paidFromAmount) !== null ? {
27094
+ kind: "mixed",
27095
+ paidFromAmount: readAmount(value.paidFromAmount) ?? 0,
27096
+ currency: displayCurrency
27097
+ } : { kind: "unavailable", currency };
27098
+ case "unavailable":
27099
+ return { kind: "unavailable", currency: displayCurrency };
27100
+ case "course":
27101
+ return isRecord5(value.display) ? {
27102
+ kind: "course",
27103
+ display: readCoursePriceDisplay(value.display, displayCurrency)
27104
+ } : {
27105
+ kind: "course",
27106
+ display: { kind: "unavailable", currency: displayCurrency }
27107
+ };
27108
+ default:
27109
+ return { kind: "unavailable", currency };
27110
+ }
27111
+ }
27112
+ function readCoursePriceDisplay(value, currency) {
27113
+ switch (value.kind) {
27114
+ case "free":
27115
+ return { kind: "free", currency: readCurrency(value.currency) };
27116
+ case "exact":
27117
+ return readAmount(value.amount) !== null ? {
27118
+ kind: "exact",
27119
+ amount: readAmount(value.amount) ?? 0,
27120
+ currency: readCurrency(value.currency)
27121
+ } : { kind: "unavailable", currency };
27122
+ case "from":
27123
+ return readAmount(value.amount) !== null ? {
27124
+ kind: "from",
27125
+ amount: readAmount(value.amount) ?? 0,
27126
+ currency: readCurrency(value.currency)
27127
+ } : { kind: "unavailable", currency };
27128
+ default:
27129
+ return { kind: "unavailable", currency };
27130
+ }
27131
+ }
27132
+ function readAmount(value) {
27133
+ return typeof value === "number" && Number.isFinite(value) ? value : null;
27134
+ }
25970
27135
 
25971
27136
  // ../blocks/src/system/runtime/nodes/shared/contract-schemas.ts
27137
+ import { z as z45 } from "zod";
25972
27138
  var previewStageSchema = z45.enum(["preview", "published"]);
25973
27139
  var registrationButtonVariantSchema = z45.enum(["primary", "secondary", "outline"]);
25974
27140
  var eventButtonVariantSchema = z45.enum(["primary", "secondary", "outline", "link"]);
@@ -25979,12 +27145,73 @@ var weekStartSchema = z45.enum(["sunday", "monday"]);
25979
27145
  var filterAutoShowSchema = z45.enum(["auto", "always", "never"]);
25980
27146
  var calendarTabViewsSchema = z45.enum(["both", "month", "week"]);
25981
27147
 
27148
+ // ../blocks/src/system/runtime/nodes/event-registration/wizardSteps.ts
27149
+ function getWizardStepsForContext(hasPreSelectedContext, needsPaymentStep) {
27150
+ const baseSteps = hasPreSelectedContext ? ["select-tickets", "enter-details"] : ["select-event", "select-tickets", "enter-details"];
27151
+ if (!needsPaymentStep) {
27152
+ return baseSteps;
27153
+ }
27154
+ return [...baseSteps, "select-payment"];
27155
+ }
27156
+
27157
+ // ../blocks/src/system/runtime/nodes/event-registration/registrationDerivations.ts
27158
+ function eventMatchesOccurrenceId(event, occurrenceId) {
27159
+ return event.registrationOccurrenceId === occurrenceId || event.publicEventId === occurrenceId;
27160
+ }
27161
+ function findPreSelectedEvent(input) {
27162
+ const occurrenceContext = input.occurrenceContext;
27163
+ if (!occurrenceContext) {
27164
+ return null;
27165
+ }
27166
+ const contextDate = getBookingLocalDateKey(toScheduledBookingDateTime({
27167
+ startsAt: occurrenceContext.startsAt,
27168
+ timeZone: occurrenceContext.timeZone
27169
+ }));
27170
+ return input.scopedEvents.find(
27171
+ (event) => eventMatchesOccurrenceId(event, occurrenceContext.id) || getBookingLocalDateKey(toScheduledBookingDateTime({
27172
+ startsAt: event.startsAt,
27173
+ timeZone: event.timeZone
27174
+ })) === contextDate
27175
+ ) ?? null;
27176
+ }
27177
+ function resolveEventRequiresPayment(input) {
27178
+ if (input.eligibility) {
27179
+ return input.eligibility.requiresPayment;
27180
+ }
27181
+ if (input.selectedTicketType) {
27182
+ return input.selectedTicketType.priceAmount > 0;
27183
+ }
27184
+ if (!input.event) {
27185
+ return false;
27186
+ }
27187
+ return publicEventPricingType(resolveRuntimeEventPricing(input.event)) !== "free";
27188
+ }
27189
+
27190
+ // ../blocks/src/system/runtime/nodes/event-registration/registrationEventAdapter.ts
27191
+ function toRegistrationEvent(event) {
27192
+ return {
27193
+ ...event,
27194
+ pricing: resolveRuntimeEventPricing(event),
27195
+ publicEventId: event.id,
27196
+ registrationOccurrenceId: event.occurrenceId
27197
+ };
27198
+ }
27199
+ function toRegistrationEvents(events) {
27200
+ return events.map(toRegistrationEvent);
27201
+ }
27202
+
25982
27203
  // ../blocks/src/system/runtime/nodes/event-registration.interactive.ts
27204
+ var EVENT_REGISTRATION_GENERIC_SHELL_STEP_LABELS = ["Date", "Tickets", "Details"];
27205
+ var EVENT_REGISTRATION_SHELL_STEP_LABELS = ["Event", "Date", "Tickets", "Details", "Payment"];
25983
27206
  var contentEntrySchema = z46.object({
25984
27207
  id: z46.string(),
25985
27208
  slug: z46.string(),
25986
27209
  contentTypeSlug: z46.string()
25987
27210
  });
27211
+ var eventRegistrationPublicEventSchema = z46.preprocess(
27212
+ normalizeEventRegistrationEventInput,
27213
+ publicEventSchema
27214
+ );
25988
27215
  var eventRegistrationSourceSchema = z46.object({
25989
27216
  siteId: z46.string().optional(),
25990
27217
  apiBaseUrl: z46.string().optional(),
@@ -25992,7 +27219,7 @@ var eventRegistrationSourceSchema = z46.object({
25992
27219
  previewToken: z46.string().nullable().optional(),
25993
27220
  occurrenceContext: occurrenceContextSchema.optional(),
25994
27221
  contentEntry: contentEntrySchema.nullable().optional(),
25995
- events: z46.array(publicEventSchema).nullable().optional(),
27222
+ events: z46.array(eventRegistrationPublicEventSchema).nullable().optional(),
25996
27223
  className: z46.string().nullable().optional(),
25997
27224
  buttonText: z46.string().nullable().optional(),
25998
27225
  maxTickets: z46.string().nullable().optional(),
@@ -26007,14 +27234,17 @@ var eventRegistrationSourceSchema = z46.object({
26007
27234
  });
26008
27235
  var eventRegistrationDisplaySchema = z46.object({
26009
27236
  kind: z46.literal("event-registration"),
26010
- state: z46.literal("shell"),
27237
+ state: z46.literal("generic-shell"),
26011
27238
  className: z46.string().nullable(),
27239
+ titleText: z46.string(),
27240
+ bodyText: z46.string(),
27241
+ stepLabels: z46.array(z46.enum(EVENT_REGISTRATION_SHELL_STEP_LABELS)).min(1),
26012
27242
  summaryButtonText: z46.string()
26013
27243
  });
26014
27244
  var eventRegistrationHydrationSchema = z46.object({
26015
27245
  occurrenceContext: occurrenceContextSchema.optional(),
26016
27246
  contentEntry: contentEntrySchema.nullable().optional(),
26017
- events: z46.array(publicEventSchema).nullable().optional(),
27247
+ events: z46.array(eventRegistrationPublicEventSchema).nullable().optional(),
26018
27248
  maxTickets: z46.string().optional(),
26019
27249
  showVenue: z46.boolean().optional(),
26020
27250
  showCapacity: z46.boolean().optional(),
@@ -26043,13 +27273,81 @@ var eventRegistrationIslandMetaKeys = defineInteractiveIslandMetaKeys(
26043
27273
  "stage"
26044
27274
  );
26045
27275
  function buildEventRegistrationDisplay(source) {
27276
+ const stepLabels = buildEventRegistrationShellStepLabels(source);
26046
27277
  return {
26047
27278
  kind: "event-registration",
26048
- state: "shell",
27279
+ state: "generic-shell",
26049
27280
  className: source.className ?? null,
27281
+ titleText: "Event registration",
27282
+ bodyText: buildEventRegistrationShellBodyText(stepLabels),
27283
+ stepLabels,
26050
27284
  summaryButtonText: source.buttonText?.trim() || "Register"
26051
27285
  };
26052
27286
  }
27287
+ function buildEventRegistrationShellStepLabels(source) {
27288
+ const scopedEvents = scopeEventRegistrationEvents(source);
27289
+ if (scopedEvents.length === 0) {
27290
+ return EVENT_REGISTRATION_GENERIC_SHELL_STEP_LABELS;
27291
+ }
27292
+ const preSelectedEvent = findPreSelectedEvent({
27293
+ scopedEvents,
27294
+ occurrenceContext: source.occurrenceContext
27295
+ });
27296
+ const hasPreSelectedContext = Boolean(source.occurrenceContext || preSelectedEvent);
27297
+ const needsPaymentStep = hasPreSelectedContext && preSelectedEvent ? resolveEventRequiresPayment({
27298
+ eligibility: null,
27299
+ selectedTicketType: null,
27300
+ event: preSelectedEvent
27301
+ }) : false;
27302
+ return getWizardStepsForContext(hasPreSelectedContext, needsPaymentStep).map((step) => shellLabelForRegistrationStep(step, scopedEvents));
27303
+ }
27304
+ function scopeEventRegistrationEvents(source) {
27305
+ const events = toRegistrationEvents(source.events ?? []);
27306
+ if (source.occurrenceContext?.seriesId) {
27307
+ return events.filter((event) => event.seriesId === source.occurrenceContext?.seriesId);
27308
+ }
27309
+ const entrySlug = source.contentEntry?.slug;
27310
+ const entryContentType = source.contentEntry?.contentTypeSlug;
27311
+ if (entrySlug && entryContentType && isEventContentType(entryContentType)) {
27312
+ return events.filter((event) => event.slug === entrySlug);
27313
+ }
27314
+ return events;
27315
+ }
27316
+ function shellLabelForRegistrationStep(step, events) {
27317
+ switch (step) {
27318
+ case "select-event":
27319
+ return isDateSelection(events) ? "Date" : "Event";
27320
+ case "select-tickets":
27321
+ return "Tickets";
27322
+ case "enter-details":
27323
+ return "Details";
27324
+ case "select-payment":
27325
+ return "Payment";
27326
+ case "error":
27327
+ case "success":
27328
+ case "submitting":
27329
+ case "redirecting":
27330
+ case "verifying-payment":
27331
+ case "verifying-timeout":
27332
+ case "payment-failed":
27333
+ return "Details";
27334
+ }
27335
+ }
27336
+ function isDateSelection(events) {
27337
+ const firstSeriesId = events[0]?.seriesId;
27338
+ return Boolean(
27339
+ events.length > 1 && firstSeriesId && events.every((event) => event.seriesId === firstSeriesId)
27340
+ );
27341
+ }
27342
+ function buildEventRegistrationShellBodyText(stepLabels) {
27343
+ if (stepLabels.includes("Payment")) {
27344
+ return "Preparing tickets, details, and payment options.";
27345
+ }
27346
+ if (stepLabels[0] === "Tickets") {
27347
+ return "Preparing tickets and booking details.";
27348
+ }
27349
+ return "Preparing dates, tickets, and booking details.";
27350
+ }
26053
27351
  var eventRegistrationBlockRuntime = defineClientOwnedBlockRuntime({
26054
27352
  kind: "client-owned",
26055
27353
  contracts: {
@@ -26073,6 +27371,18 @@ var eventRegistrationBlockRuntime = defineClientOwnedBlockRuntime({
26073
27371
  }
26074
27372
  })
26075
27373
  });
27374
+ function normalizeEventRegistrationEventInput(value) {
27375
+ if (!isRecord6(value)) {
27376
+ return value;
27377
+ }
27378
+ return {
27379
+ ...value,
27380
+ pricing: resolveRuntimeEventPricing(value)
27381
+ };
27382
+ }
27383
+ function isRecord6(value) {
27384
+ return typeof value === "object" && value !== null && !Array.isArray(value);
27385
+ }
26076
27386
  var eventRegistrationInteractiveIslandPropsCodec = createInteractiveIslandCodec({
26077
27387
  runtime: eventRegistrationBlockRuntime,
26078
27388
  mode: "event-registration",
@@ -27922,7 +29232,9 @@ function formatPublicEventPriceDisplay(display) {
27922
29232
  }
27923
29233
  }
27924
29234
  function formatEventPrice(event) {
27925
- return formatPublicEventPriceDisplay(publicEventPricingDisplay(event.pricing));
29235
+ return formatPublicEventPriceDisplay(
29236
+ publicEventPricingDisplay(resolveRuntimeEventPricing(event))
29237
+ );
27926
29238
  }
27927
29239
  function resolveEventCta(event, buttonText) {
27928
29240
  const { isFull: isSoldOut } = getEventAvailability(event);
@@ -30988,7 +32300,7 @@ function inferLegacyOfferingsPreviewGroupOrder(overrides) {
30988
32300
  return keys.length >= 2 ? keys : [];
30989
32301
  }
30990
32302
  function normalizeOfferingsPreviewContentForWrite(value) {
30991
- if (!isRecord5(value)) return null;
32303
+ if (!isRecord7(value)) return null;
30992
32304
  const groupOrderValue = value.groupOrder;
30993
32305
  if (Array.isArray(groupOrderValue)) {
30994
32306
  const normalized = normalizeOfferingsPreviewGroupOrder(groupOrderValue);
@@ -31001,7 +32313,7 @@ function normalizeOfferingsPreviewContentForWrite(value) {
31001
32313
  return { ...value, groupOrder: [] };
31002
32314
  }
31003
32315
  const legacyOrder = inferLegacyOfferingsPreviewGroupOrder(
31004
- Array.isArray(value.groupOverrides) ? value.groupOverrides.filter(isRecord5) : []
32316
+ Array.isArray(value.groupOverrides) ? value.groupOverrides.filter(isRecord7) : []
31005
32317
  );
31006
32318
  return legacyOrder.length > 0 ? { ...value, groupOrder: legacyOrder } : value;
31007
32319
  }
@@ -31055,7 +32367,7 @@ function uniqueOfferingsPreviewSourceKeys(values) {
31055
32367
  }
31056
32368
  return keys;
31057
32369
  }
31058
- function isRecord5(value) {
32370
+ function isRecord7(value) {
31059
32371
  return typeof value === "object" && value !== null && !Array.isArray(value);
31060
32372
  }
31061
32373
  function mergeOrderedKeysWithDefaults(orderedKeys, defaultKeys) {
@@ -31517,7 +32829,7 @@ function isOfferingsPreviewItemLimit(value) {
31517
32829
  return value === "1" || value === "2" || value === "3" || value === "4" || value === "5" || value === "6" || value === null;
31518
32830
  }
31519
32831
  function normalizeOfferingsPreviewGroupOverride(value) {
31520
- if (!isRecord6(value)) return [];
32832
+ if (!isRecord8(value)) return [];
31521
32833
  const override = {};
31522
32834
  if (isOfferingsPreviewSourceKey(value.sourceKey) || value.sourceKey === null) {
31523
32835
  override.sourceKey = value.sourceKey;
@@ -31549,12 +32861,12 @@ function isButtonVariant(value) {
31549
32861
  return value === "primary" || value === "secondary" || value === "outline" || value === "link" || value === null;
31550
32862
  }
31551
32863
  function normalizeCardStylesContent(value) {
31552
- return isRecord6(value) || value === null ? value : void 0;
32864
+ return isRecord8(value) || value === null ? value : void 0;
31553
32865
  }
31554
32866
  function normalizeSectionStylesContent(value) {
31555
- return isRecord6(value) || value === null ? value : void 0;
32867
+ return isRecord8(value) || value === null ? value : void 0;
31556
32868
  }
31557
- function isRecord6(value) {
32869
+ function isRecord8(value) {
31558
32870
  return typeof value === "object" && value !== null && !Array.isArray(value);
31559
32871
  }
31560
32872
 
@@ -35633,11 +36945,13 @@ var heroImageSurfaceMotions = [
35633
36945
  ];
35634
36946
  var standardEyebrowTreatments = [
35635
36947
  "plain",
36948
+ "accent",
35636
36949
  "pill",
35637
36950
  "accent-pill"
35638
36951
  ];
35639
36952
  var animatedEyebrowTreatments = [
35640
36953
  "plain",
36954
+ "accent",
35641
36955
  "pill",
35642
36956
  "accent-pill",
35643
36957
  "pill-bounce",
@@ -35938,6 +37252,17 @@ var systemBlockDefinitionsRaw = [
35938
37252
  layoutProfile({ variantKey: "two-column", family: "split", weight: "standard" })
35939
37253
  ]
35940
37254
  })),
37255
+ withDesignCapability("block.contact-newsletter", contactNewsletterBlockDefinition, sectionOnly(), defineBlockDesignMetadata({
37256
+ flow: conversionFlow,
37257
+ layoutProfiles: [
37258
+ layoutProfile({
37259
+ variantKey: "default",
37260
+ family: "split",
37261
+ weight: "featured",
37262
+ bias: "soft"
37263
+ })
37264
+ ]
37265
+ })),
35941
37266
  withDesignCapability("block.faq", faqBlockDefinition, withEyebrowCapability(declareBlockDesignCapability({
35942
37267
  sectionSurfaces: "supported",
35943
37268
  contentFrames: ["plain", "panel"],
@@ -36029,6 +37354,12 @@ var systemBlockDefinitionsRaw = [
36029
37354
  family: "media-text",
36030
37355
  weight: "featured",
36031
37356
  bias: "soft"
37357
+ }),
37358
+ layoutProfile({
37359
+ variantKey: "bio",
37360
+ family: "media-text",
37361
+ weight: "featured",
37362
+ bias: "soft"
36032
37363
  })
36033
37364
  ]
36034
37365
  })),
@@ -36839,7 +38170,7 @@ import React4 from "react";
36839
38170
  // ../blocks/src/system/data/linkedContentEntries.ts
36840
38171
  var LINKED_CONTENT_ENTRY_META_KEY = "__rbLinkedContentEntry";
36841
38172
  function coerceLinkedContentEntriesPayload(payload) {
36842
- if (!isRecord7(payload)) return payload;
38173
+ if (!isRecord9(payload)) return payload;
36843
38174
  const response = payload;
36844
38175
  if (!Array.isArray(response.entries)) return payload;
36845
38176
  const contentType = parsePublicContentTypeMeta(response.contentType);
@@ -36847,16 +38178,16 @@ function coerceLinkedContentEntriesPayload(payload) {
36847
38178
  return response.entries.map((entry) => enrichLinkedContentEntry(entry, contentType));
36848
38179
  }
36849
38180
  function getLinkedContentEntryMeta(value) {
36850
- if (!isRecord7(value)) return null;
38181
+ if (!isRecord9(value)) return null;
36851
38182
  const candidate = value[LINKED_CONTENT_ENTRY_META_KEY];
36852
38183
  return isLinkedContentEntryMeta(candidate) ? candidate : null;
36853
38184
  }
36854
38185
  function buildLinkedContentEditTarget(input) {
36855
38186
  const { entry, sourceBlockId, sourceBlockKind, itemIndex } = input;
36856
- if (!isRecord7(entry)) return null;
38187
+ if (!isRecord9(entry)) return null;
36857
38188
  const meta = getLinkedContentEntryMeta(entry);
36858
38189
  if (!meta || meta.support.kind !== "supported") return null;
36859
- const content = isRecord7(entry.content) ? entry.content : {};
38190
+ const content = isRecord9(entry.content) ? entry.content : {};
36860
38191
  return {
36861
38192
  kind: "linked-content-entry",
36862
38193
  entryId: meta.entryId,
@@ -36906,12 +38237,12 @@ function resolveLinkedEntryInlineFieldEligibility(input) {
36906
38237
  };
36907
38238
  }
36908
38239
  function enrichLinkedContentEntry(entry, contentType) {
36909
- if (!isRecord7(entry)) return entry;
38240
+ if (!isRecord9(entry)) return entry;
36910
38241
  const entryId = typeof entry.id === "string" ? entry.id : null;
36911
38242
  if (!entryId) return entry;
36912
38243
  const title = typeof entry.title === "string" && entry.title.trim().length > 0 ? entry.title : entryId;
36913
38244
  const optimisticHash = typeof entry.optimisticHash === "string" && entry.optimisticHash.length > 0 ? entry.optimisticHash : null;
36914
- const content = isRecord7(entry.content) ? entry.content : {};
38245
+ const content = isRecord9(entry.content) ? entry.content : {};
36915
38246
  const meta = {
36916
38247
  kind: "linked-content-entry",
36917
38248
  entryId,
@@ -37007,7 +38338,7 @@ function capitalize(value) {
37007
38338
  return value.charAt(0).toUpperCase() + value.slice(1).toLowerCase();
37008
38339
  }
37009
38340
  function parsePublicContentTypeMeta(value) {
37010
- if (!isRecord7(value)) return null;
38341
+ if (!isRecord9(value)) return null;
37011
38342
  if (typeof value.key !== "string" || value.key.trim().length === 0) return null;
37012
38343
  return {
37013
38344
  key: value.key,
@@ -37017,7 +38348,7 @@ function parsePublicContentTypeMeta(value) {
37017
38348
  };
37018
38349
  }
37019
38350
  function parsePublicContentTypeLinkedEntryEditing(value) {
37020
- if (!isRecord7(value) || typeof value.kind !== "string") return null;
38351
+ if (!isRecord9(value) || typeof value.kind !== "string") return null;
37021
38352
  switch (value.kind) {
37022
38353
  case "generic":
37023
38354
  return { kind: "generic" };
@@ -37031,7 +38362,7 @@ function parsePublicContentTypeLinkedEntryEditing(value) {
37031
38362
  }
37032
38363
  }
37033
38364
  function parsePublicContentTypeFieldMeta(value) {
37034
- if (!isRecord7(value)) return [];
38365
+ if (!isRecord9(value)) return [];
37035
38366
  if (typeof value.id !== "string" || typeof value.type !== "string") return [];
37036
38367
  return [{
37037
38368
  id: value.id,
@@ -37046,14 +38377,14 @@ function parseStringArray(value) {
37046
38377
  return value.filter((item) => typeof item === "string");
37047
38378
  }
37048
38379
  function isLinkedContentEntryMeta(value) {
37049
- if (!isRecord7(value)) return false;
38380
+ if (!isRecord9(value)) return false;
37050
38381
  if (value.kind !== "linked-content-entry") return false;
37051
38382
  if (typeof value.entryId !== "string") return false;
37052
38383
  if (typeof value.contentTypeKey !== "string") return false;
37053
38384
  if (typeof value.contentTypeLabel !== "string") return false;
37054
38385
  if (typeof value.title !== "string") return false;
37055
38386
  if (!(value.optimisticHash === null || typeof value.optimisticHash === "string")) return false;
37056
- if (!isRecord7(value.contentType)) return false;
38387
+ if (!isRecord9(value.contentType)) return false;
37057
38388
  if (!isLinkedEntryFieldSourceArray(value.fieldSources)) return false;
37058
38389
  return isLinkedContentEditSupport(value.support);
37059
38390
  }
@@ -37061,7 +38392,7 @@ function isLinkedEntryFieldSourceArray(value) {
37061
38392
  return Array.isArray(value) && value.every(isLinkedEntryFieldSource);
37062
38393
  }
37063
38394
  function isLinkedEntryFieldSource(value) {
37064
- if (!isRecord7(value)) return false;
38395
+ if (!isRecord9(value)) return false;
37065
38396
  if (typeof value.displayPath !== "string") return false;
37066
38397
  switch (value.kind) {
37067
38398
  case "content-field":
@@ -37087,7 +38418,7 @@ function isLinkedEntryInlineFieldReadOnlyReason(value) {
37087
38418
  }
37088
38419
  }
37089
38420
  function isLinkedContentEditSupport(value) {
37090
- if (!isRecord7(value) || typeof value.kind !== "string") return false;
38421
+ if (!isRecord9(value) || typeof value.kind !== "string") return false;
37091
38422
  switch (value.kind) {
37092
38423
  case "supported":
37093
38424
  return true;
@@ -37099,7 +38430,7 @@ function isLinkedContentEditSupport(value) {
37099
38430
  return false;
37100
38431
  }
37101
38432
  }
37102
- function isRecord7(value) {
38433
+ function isRecord9(value) {
37103
38434
  return typeof value === "object" && value !== null && !Array.isArray(value);
37104
38435
  }
37105
38436
 
@@ -38626,12 +39957,12 @@ function toTrimmedString(value) {
38626
39957
  return trimmed ? trimmed : void 0;
38627
39958
  }
38628
39959
  function normalizeBookingFormConfig(form2) {
38629
- if (!isRecord8(form2)) return null;
39960
+ if (!isRecord10(form2)) return null;
38630
39961
  const id = readNonEmptyString(form2.id);
38631
39962
  const name = readNonEmptyString(form2.name);
38632
39963
  if (!id || !name) return null;
38633
- const schemaSource = isRecord8(form2.schema) ? form2.schema : isRecord8(form2.schemaJson) ? form2.schemaJson : null;
38634
- const settingsSource = isRecord8(form2.settings) ? form2.settings : isRecord8(form2.settingsJson) ? form2.settingsJson : null;
39964
+ const schemaSource = isRecord10(form2.schema) ? form2.schema : isRecord10(form2.schemaJson) ? form2.schemaJson : null;
39965
+ const settingsSource = isRecord10(form2.settings) ? form2.settings : isRecord10(form2.settingsJson) ? form2.settingsJson : null;
38635
39966
  return {
38636
39967
  id,
38637
39968
  name,
@@ -38655,10 +39986,10 @@ function normalizeBookingServices(services) {
38655
39986
  if (Array.isArray(services)) {
38656
39987
  return services.filter(isBookingFormService).map(normalizeService);
38657
39988
  }
38658
- if (isRecord8(services) && "services" in services) {
39989
+ if (isRecord10(services) && "services" in services) {
38659
39990
  return Array.isArray(services.services) ? services.services.filter(isBookingFormService).map(normalizeService) : [];
38660
39991
  }
38661
- return isRecord8(services) ? Object.values(services).filter(isBookingFormService).map(normalizeService) : [];
39992
+ return isRecord10(services) ? Object.values(services).filter(isBookingFormService).map(normalizeService) : [];
38662
39993
  }
38663
39994
  function normalizeBookingSchema(value) {
38664
39995
  if (!value) return void 0;
@@ -38670,7 +40001,7 @@ function normalizeBookingSchema(value) {
38670
40001
  };
38671
40002
  }
38672
40003
  function readBookingFormField(value) {
38673
- if (!isRecord8(value)) return null;
40004
+ if (!isRecord10(value)) return null;
38674
40005
  const id = readNonEmptyString(value.id);
38675
40006
  const label = readNonEmptyString(value.label);
38676
40007
  const type = readBookingFieldType(value.type);
@@ -38716,7 +40047,7 @@ function readBookingFieldOptions(value) {
38716
40047
  return options.length > 0 ? options : void 0;
38717
40048
  }
38718
40049
  function readBookingFieldOption(value) {
38719
- if (!isRecord8(value)) return null;
40050
+ if (!isRecord10(value)) return null;
38720
40051
  const optionValue = readNonEmptyString(value.value);
38721
40052
  const label = readNonEmptyString(value.label);
38722
40053
  return optionValue && label ? { value: optionValue, label } : null;
@@ -38733,7 +40064,7 @@ function normalizeBookingSettings(value) {
38733
40064
  };
38734
40065
  }
38735
40066
  function isBookingFormService(value) {
38736
- return isRecord8(value) && typeof value.id === "string" && typeof value.siteId === "string" && typeof value.title === "string";
40067
+ return isRecord10(value) && typeof value.id === "string" && typeof value.siteId === "string" && typeof value.title === "string";
38737
40068
  }
38738
40069
  function readNonEmptyString(value) {
38739
40070
  if (typeof value !== "string") return null;
@@ -38751,7 +40082,7 @@ function readStringArray(value) {
38751
40082
  const strings = value.filter((item) => typeof item === "string");
38752
40083
  return strings.length > 0 ? strings : void 0;
38753
40084
  }
38754
- function isRecord8(value) {
40085
+ function isRecord10(value) {
38755
40086
  return typeof value === "object" && value !== null;
38756
40087
  }
38757
40088
 
@@ -39199,8 +40530,9 @@ function EventDetailsView({
39199
40530
  priceCents: selected.course.priceCents,
39200
40531
  currency: selected.course.currency
39201
40532
  }) : null;
39202
- const eventPricingType = publicEventPricingType(selected.pricing);
39203
- const eventPricingCurrency = publicEventPricingCurrency(selected.pricing) ?? "USD";
40533
+ const eventPricing = resolveRuntimeEventPricing(selected);
40534
+ const eventPricingType = publicEventPricingType(eventPricing);
40535
+ const eventPricingCurrency = publicEventPricingCurrency(eventPricing) ?? "USD";
39204
40536
  const isPaid = eventPricingType === "paid";
39205
40537
  const shouldShowCoursePricing = showCost && !isDropIn && coursePricing !== null;
39206
40538
  const shouldShowEventCost = showCost && isPaid && !isDropIn && coursePricing === null;
@@ -41366,8 +42698,14 @@ var EventListingSSR = (props2) => {
41366
42698
  ] });
41367
42699
  };
41368
42700
 
42701
+ // ../blocks/src/system/runtime/nodes/event-registration/constants.ts
42702
+ var EVENT_REGISTRATION_ANCHOR_ID = "event-registration";
42703
+
41369
42704
  // ../blocks/src/system/runtime/nodes/event-registration.server.tsx
41370
42705
  import { jsx as jsx48, jsxs as jsxs34 } from "react/jsx-runtime";
42706
+ function cx(...classes) {
42707
+ return classes.filter((className) => Boolean(className)).join(" ");
42708
+ }
41371
42709
  function EventRegistrationSSR({
41372
42710
  blockId,
41373
42711
  siteId,
@@ -41410,6 +42748,7 @@ function EventRegistrationSSR({
41410
42748
  stage,
41411
42749
  supportEmail
41412
42750
  });
42751
+ const display = islandProps.render.display;
41413
42752
  return /* @__PURE__ */ jsxs34(
41414
42753
  "div",
41415
42754
  {
@@ -41421,12 +42760,61 @@ function EventRegistrationSSR({
41421
42760
  ...getIslandRootProps("event-registration", blockId),
41422
42761
  children: [
41423
42762
  /* @__PURE__ */ jsx48(IslandPropsScript, { value: islandProps }),
41424
- /* @__PURE__ */ jsx48("div", { className: "event-registration__summary", children: /* @__PURE__ */ jsx48("strong", { children: "Loading booking options..." }) }),
42763
+ /* @__PURE__ */ jsx48(EventRegistrationShell, { display }),
41425
42764
  children
41426
42765
  ]
41427
42766
  }
41428
42767
  );
41429
42768
  }
42769
+ function EventRegistrationShell({
42770
+ display
42771
+ }) {
42772
+ return /* @__PURE__ */ jsx48(
42773
+ "div",
42774
+ {
42775
+ id: EVENT_REGISTRATION_ANCHOR_ID,
42776
+ className: "er-container er-registration-shell",
42777
+ "aria-busy": "true",
42778
+ role: "status",
42779
+ children: /* @__PURE__ */ jsxs34("div", { className: "er-payment-layout er-payment-layout--no-sidebar", children: [
42780
+ /* @__PURE__ */ jsxs34("div", { className: "er-payment-layout-main", children: [
42781
+ /* @__PURE__ */ jsx48("div", { className: "er-steps-nav er-registration-shell__steps", "aria-hidden": "true", children: /* @__PURE__ */ jsx48("ol", { className: "er-steps", children: display.stepLabels.map((label, index) => {
42782
+ const isActive = index === 0;
42783
+ return /* @__PURE__ */ jsxs34("li", { className: "er-step", children: [
42784
+ /* @__PURE__ */ jsx48("span", { className: cx("er-step-circle", isActive && "er-step-circle--active"), children: index + 1 }),
42785
+ /* @__PURE__ */ jsx48("span", { className: cx("er-step-label", isActive && "er-step-label--active"), children: label }),
42786
+ index < display.stepLabels.length - 1 ? /* @__PURE__ */ jsx48("span", { className: "er-step-connector" }) : null
42787
+ ] }, label);
42788
+ }) }) }),
42789
+ /* @__PURE__ */ jsxs34("div", { className: "er-stack", children: [
42790
+ /* @__PURE__ */ jsxs34("div", { children: [
42791
+ /* @__PURE__ */ jsx48("p", { className: "er-registration-shell__eyebrow", children: "Registration" }),
42792
+ /* @__PURE__ */ jsx48("h3", { className: "er-title er-registration-shell__title", children: display.titleText }),
42793
+ /* @__PURE__ */ jsx48("p", { className: "er-text er-text--muted er-registration-shell__copy", children: display.bodyText })
42794
+ ] }),
42795
+ /* @__PURE__ */ jsxs34("div", { className: "er-event-grid er-registration-shell__cards", "aria-hidden": "true", children: [
42796
+ /* @__PURE__ */ jsxs34("div", { className: "er-event-card er-registration-shell__card", children: [
42797
+ /* @__PURE__ */ jsx48("div", { className: "er-registration-shell__line er-registration-shell__line--lg" }),
42798
+ /* @__PURE__ */ jsx48("div", { className: "er-registration-shell__line er-registration-shell__line--sm" })
42799
+ ] }),
42800
+ /* @__PURE__ */ jsxs34("div", { className: "er-event-card er-registration-shell__card", children: [
42801
+ /* @__PURE__ */ jsx48("div", { className: "er-registration-shell__line er-registration-shell__line--md" }),
42802
+ /* @__PURE__ */ jsx48("div", { className: "er-registration-shell__line er-registration-shell__line--xs" })
42803
+ ] })
42804
+ ] })
42805
+ ] })
42806
+ ] }),
42807
+ /* @__PURE__ */ jsx48("div", { className: "er-payment-layout-footer", children: /* @__PURE__ */ jsxs34("div", { className: "er-summary-bar er-registration-shell__summary", "aria-hidden": "true", children: [
42808
+ /* @__PURE__ */ jsxs34("div", { className: "er-summary-bar-info", children: [
42809
+ /* @__PURE__ */ jsx48("div", { className: "er-registration-shell__line er-registration-shell__line--md" }),
42810
+ /* @__PURE__ */ jsx48("div", { className: "er-registration-shell__line er-registration-shell__line--xs" })
42811
+ ] }),
42812
+ /* @__PURE__ */ jsx48("div", { className: "er-registration-shell__button-placeholder", children: display.summaryButtonText })
42813
+ ] }) })
42814
+ ] })
42815
+ }
42816
+ );
42817
+ }
41430
42818
  var event_registration_server_default = EventRegistrationSSR;
41431
42819
 
41432
42820
  // ../blocks/src/system/runtime/shared/components/FeedbackMessage.tsx
@@ -42012,14 +43400,14 @@ function isDecoratedHeadingBlockKind(blockKind) {
42012
43400
  return blockKind === "block.intro" || blockKind === "block.feature-cards" || blockKind === "block.testimonials" || blockKind === "block.faq";
42013
43401
  }
42014
43402
  function readVariant(blockContent) {
42015
- if (!isRecord9(blockContent)) return void 0;
43403
+ if (!isRecord11(blockContent)) return void 0;
42016
43404
  const variant = blockContent.variant;
42017
43405
  return typeof variant === "string" ? variant : void 0;
42018
43406
  }
42019
43407
  function isFaqDecoratedVariant(variant) {
42020
43408
  return variant === "default" || variant === "question-columns";
42021
43409
  }
42022
- function isRecord9(value) {
43410
+ function isRecord11(value) {
42023
43411
  return typeof value === "object" && value !== null && !Array.isArray(value);
42024
43412
  }
42025
43413
  function buildHeadingDecorationWrapperClassName(className) {
@@ -43527,20 +44915,20 @@ function generateInputCss({
43527
44915
  baseInputRules.push("background-color: transparent");
43528
44916
  } else {
43529
44917
  baseInputRules.push(
43530
- `background-color: rgb(var(--tb-${inputSystem.base.background.colorToken}))`
44918
+ `background-color: ${rgbColorValue(inputSystem.base.background.colorToken)}`
43531
44919
  );
43532
44920
  }
43533
- baseInputRules.push(`color: rgb(var(--tb-${inputSystem.base.textColorToken}))`);
44921
+ baseInputRules.push(`color: ${rgbColorValue(inputSystem.base.textColorToken)}`);
43534
44922
  const borderPx = parseBorderWidth(inputSystem.base.border.widthClass);
43535
44923
  const borderStyle = inputSystem.base.border.style ?? "all";
43536
44924
  if (borderStyle === "underline") {
43537
44925
  baseInputRules.push("border: none");
43538
44926
  baseInputRules.push(
43539
- `border-bottom: ${borderPx} solid rgb(var(--tb-${inputSystem.base.border.colorToken}))`
44927
+ `border-bottom: ${borderPx} solid ${rgbColorValue(inputSystem.base.border.colorToken)}`
43540
44928
  );
43541
44929
  } else {
43542
44930
  baseInputRules.push(
43543
- `border: ${borderPx} solid rgb(var(--tb-${inputSystem.base.border.colorToken}))`
44931
+ `border: ${borderPx} solid ${rgbColorValue(inputSystem.base.border.colorToken)}`
43544
44932
  );
43545
44933
  }
43546
44934
  if (borderStyle === "underline") {
@@ -43567,7 +44955,7 @@ function generateInputCss({
43567
44955
  baseInputRules.push("transition: border-color 0.2s ease, box-shadow 0.2s ease");
43568
44956
  const labelSelector = `${rootSelector} .form-label`;
43569
44957
  const labelRules = [];
43570
- labelRules.push(`color: rgb(var(--tb-${inputSystem.label.textColorToken}))`);
44958
+ labelRules.push(`color: ${rgbColorValue(inputSystem.label.textColorToken)}`);
43571
44959
  labelRules.push(`font-weight: ${FONT_WEIGHT_MAP[inputSystem.label.fontWeight]}`);
43572
44960
  labelRules.push(`font-size: ${LABEL_FONT_SIZE_MAP[inputSystem.label.fontSize]}`);
43573
44961
  if (inputSystem.label.textTransform && inputSystem.label.textTransform !== "none") {
@@ -43608,9 +44996,9 @@ function generateInputCss({
43608
44996
  ];
43609
44997
  const focusRules = [];
43610
44998
  focusRules.push("outline: none");
43611
- focusRules.push(`box-shadow: 0 0 0 ${inputSystem.focus.ringWidth}px rgb(var(--tb-${inputSystem.focus.ringColorToken}))`);
44999
+ focusRules.push(`box-shadow: 0 0 0 ${inputSystem.focus.ringWidth}px ${rgbColorValue(inputSystem.focus.ringColorToken)}`);
43612
45000
  if (inputSystem.focus.borderColorToken) {
43613
- focusRules.push(`border-color: rgb(var(--tb-${inputSystem.focus.borderColorToken}))`);
45001
+ focusRules.push(`border-color: ${rgbColorValue(inputSystem.focus.borderColorToken)}`);
43614
45002
  }
43615
45003
  const errorSelectors = [
43616
45004
  `${inputSelector}[aria-invalid="true"]`,
@@ -43618,16 +45006,16 @@ function generateInputCss({
43618
45006
  `${selectSelector}[aria-invalid="true"]`
43619
45007
  ];
43620
45008
  const errorRules = [];
43621
- errorRules.push(`border-color: rgb(var(--tb-${inputSystem.error.borderColorToken}))`);
43622
- errorRules.push(`color: rgb(var(--tb-${inputSystem.error.textColorToken}))`);
45009
+ errorRules.push(`border-color: ${rgbColorValue(inputSystem.error.borderColorToken)}`);
45010
+ errorRules.push(`color: ${rgbColorValue(inputSystem.error.textColorToken)}`);
43623
45011
  const disabledSelectors = [
43624
45012
  `${inputSelector}:disabled`,
43625
45013
  `${textareaSelector}:disabled`,
43626
45014
  `${selectSelector}:disabled`
43627
45015
  ];
43628
45016
  const disabledRules = [];
43629
- disabledRules.push(`background-color: rgb(var(--tb-${inputSystem.disabled.backgroundColorToken}))`);
43630
- disabledRules.push(`color: rgb(var(--tb-${inputSystem.disabled.textColorToken}))`);
45017
+ disabledRules.push(`background-color: ${rgbColorValue(inputSystem.disabled.backgroundColorToken)}`);
45018
+ disabledRules.push(`color: ${rgbColorValue(inputSystem.disabled.textColorToken)}`);
43631
45019
  disabledRules.push(`opacity: ${inputSystem.disabled.opacity}`);
43632
45020
  disabledRules.push("cursor: not-allowed");
43633
45021
  const checkboxSelector = `${rootSelector} .form-checkbox`;
@@ -43637,12 +45025,12 @@ function generateInputCss({
43637
45025
  checkableRules.push("width: 1rem");
43638
45026
  checkableRules.push("height: 1rem");
43639
45027
  checkableRules.push("flex-shrink: 0");
43640
- checkableRules.push(`border: ${borderPx} solid rgb(var(--tb-${inputSystem.base.border.colorToken}))`);
45028
+ checkableRules.push(`border: ${borderPx} solid ${rgbColorValue(inputSystem.base.border.colorToken)}`);
43641
45029
  if (inputSystem.base.background.type === "transparent") {
43642
45030
  checkableRules.push("background-color: transparent");
43643
45031
  } else {
43644
45032
  checkableRules.push(
43645
- `background-color: rgb(var(--tb-${inputSystem.base.background.colorToken}))`
45033
+ `background-color: ${rgbColorValue(inputSystem.base.background.colorToken)}`
43646
45034
  );
43647
45035
  }
43648
45036
  checkableRules.push("cursor: pointer");
@@ -43653,22 +45041,22 @@ function generateInputCss({
43653
45041
  radioSpecificRules.push("border-radius: 9999px");
43654
45042
  const checkboxCheckedSelector = `${checkboxSelector}:checked`;
43655
45043
  const checkboxCheckedRules = [];
43656
- checkboxCheckedRules.push(`background-color: rgb(var(--tb-${inputSystem.focus.ringColorToken}))`);
43657
- checkboxCheckedRules.push(`border-color: rgb(var(--tb-${inputSystem.focus.ringColorToken}))`);
45044
+ checkboxCheckedRules.push(`background-color: ${rgbColorValue(inputSystem.focus.ringColorToken)}`);
45045
+ checkboxCheckedRules.push(`border-color: ${rgbColorValue(inputSystem.focus.ringColorToken)}`);
43658
45046
  checkboxCheckedRules.push(`background-image: url("data:image/svg+xml,%3csvg viewBox='0 0 16 16' fill='white' xmlns='http://www.w3.org/2000/svg'%3e%3cpath d='M12.207 4.793a1 1 0 010 1.414l-5 5a1 1 0 01-1.414 0l-2-2a1 1 0 011.414-1.414L6.5 9.086l4.293-4.293a1 1 0 011.414 0z'/%3e%3c/svg%3e")`);
43659
45047
  checkboxCheckedRules.push("background-size: 100% 100%");
43660
45048
  checkboxCheckedRules.push("background-position: center");
43661
45049
  checkboxCheckedRules.push("background-repeat: no-repeat");
43662
45050
  const radioCheckedSelector = `${radioSelector}:checked`;
43663
45051
  const radioCheckedRules = [];
43664
- radioCheckedRules.push(`background-color: rgb(var(--tb-${inputSystem.focus.ringColorToken}))`);
43665
- radioCheckedRules.push(`border-color: rgb(var(--tb-${inputSystem.focus.ringColorToken}))`);
45052
+ radioCheckedRules.push(`background-color: ${rgbColorValue(inputSystem.focus.ringColorToken)}`);
45053
+ radioCheckedRules.push(`border-color: ${rgbColorValue(inputSystem.focus.ringColorToken)}`);
43666
45054
  radioCheckedRules.push("background-image: radial-gradient(circle, white 40%, transparent 40%)");
43667
45055
  const checkboxFocusSelector = `${checkboxSelector}:focus-visible`;
43668
45056
  const radioFocusSelector = `${radioSelector}:focus-visible`;
43669
45057
  const checkableFocusRules = [];
43670
45058
  checkableFocusRules.push("outline: none");
43671
- checkableFocusRules.push(`box-shadow: 0 0 0 ${inputSystem.focus.ringWidth}px rgb(var(--tb-${inputSystem.focus.ringColorToken}))`);
45059
+ checkableFocusRules.push(`box-shadow: 0 0 0 ${inputSystem.focus.ringWidth}px ${rgbColorValue(inputSystem.focus.ringColorToken)}`);
43672
45060
  const cssBlocks = [];
43673
45061
  cssBlocks.push(`${labelSelector} {
43674
45062
  ${labelRules.join(";\n ")};
@@ -45516,6 +46904,11 @@ ${root} {
45516
46904
  --er-event-card-bg: rgb(var(--tb-surface));
45517
46905
  --er-event-card-border-width: var(--rb-border-width, 1px);
45518
46906
  --er-event-card-hover-opacity: 1;
46907
+ --er-control-bg: rgb(var(--tb-background, var(--tb-surface)));
46908
+ --er-control-text: rgb(var(--tb-foreground, var(--tb-text)));
46909
+ --er-radius: var(--rb-block-radius);
46910
+ --er-surface-muted: rgba(var(--tb-muted, 241 245 249), 0.42);
46911
+ --er-shell-line: rgba(var(--tb-mutedText, 100 116 139), 0.22);
45519
46912
 
45520
46913
  /* Step indicator */
45521
46914
  --er-step-active: rgb(var(--tb-primary));
@@ -46516,7 +47909,7 @@ function buildThemeCssVars(theme) {
46516
47909
  // These expose inputStyle/InputSystem values for blocks that can't use .form-* classes
46517
47910
  [THEME_RADIUS_CSS_VARS.input]: inputRadius,
46518
47911
  ["--rb-input-focus-width"]: `${inputSystem.focus.ringWidth}px`,
46519
- ["--rb-input-focus-color"]: `rgb(var(--tb-${inputSystem.focus.ringColorToken}))`,
47912
+ ["--rb-input-focus-color"]: rgbColorValue(inputSystem.focus.ringColorToken),
46520
47913
  // Deprecated compatibility aliases for pre-v2 block/custom CSS. New CSS should
46521
47914
  // consume the semantic --rb-* primitives above.
46522
47915
  [THEME_RADIUS_CSS_VARS.legacyCard]: blockRadius,
@@ -46842,8 +48235,8 @@ function hydrateValue(value, context) {
46842
48235
  return isUnchanged ? value : Object.fromEntries(resolvedEntries);
46843
48236
  }
46844
48237
  return value;
46845
- } catch (err2) {
46846
- console.error("[hydrateLinks] Error hydrating value:", err2, value);
48238
+ } catch (err3) {
48239
+ console.error("[hydrateLinks] Error hydrating value:", err3, value);
46847
48240
  return value;
46848
48241
  }
46849
48242
  }
@@ -47283,6 +48676,11 @@ var MemoBlockSection = React6.memo(
47283
48676
  siteId: dataContext?.siteId,
47284
48677
  apiBaseUrl: dataContext?.apiBaseUrl,
47285
48678
  portalToken: dataContext?.portalToken ?? null,
48679
+ previewToken: dataContext?.previewToken ?? null,
48680
+ stage: dataContext?.previewStage,
48681
+ occurrenceContext: dataContext?.occurrenceContext ?? null,
48682
+ entrySubrouteContext: dataContext?.entrySubrouteContext ?? null,
48683
+ contentEntry: dataContext?.contentEntry ?? null,
47286
48684
  supabaseUrl: dataContext?.supabaseUrl,
47287
48685
  imageResolveContext: resolvedImageResolveContext,
47288
48686
  blockId: block.id ?? null,
@@ -47406,6 +48804,11 @@ var MemoBlockSection = React6.memo(
47406
48804
  siteId: dataContext?.siteId,
47407
48805
  apiBaseUrl: dataContext?.apiBaseUrl,
47408
48806
  portalToken: dataContext?.portalToken ?? null,
48807
+ previewToken: dataContext?.previewToken ?? null,
48808
+ stage: dataContext?.previewStage,
48809
+ occurrenceContext: dataContext?.occurrenceContext ?? null,
48810
+ entrySubrouteContext: dataContext?.entrySubrouteContext ?? null,
48811
+ contentEntry: dataContext?.contentEntry ?? null,
47409
48812
  supabaseUrl: dataContext?.supabaseUrl,
47410
48813
  imageResolveContext: resolvedImageResolveContext,
47411
48814
  blockId: block.id ?? null,
@@ -47592,6 +48995,9 @@ var containerResponsiveThemeCss = `/*
47592
48995
  letter-spacing: 0.025em;
47593
48996
  text-transform: uppercase;
47594
48997
  }
48998
+ .rb-eyebrow-treatment-accent {
48999
+ color: rgb(var(--tb-accent));
49000
+ }
47595
49001
  .rb-eyebrow-treatment-pill {
47596
49002
  align-self: center;
47597
49003
  display: inline-flex;
@@ -47646,6 +49052,27 @@ var containerResponsiveThemeCss = `/*
47646
49052
  font-weight: 400;
47647
49053
  }
47648
49054
 
49055
+ /* Media shape treatments */
49056
+ .rb-media-shape-square,
49057
+ .rb-media-shape-rounded,
49058
+ .rb-media-shape-circle,
49059
+ .rb-media-shape-arch {
49060
+ overflow: hidden;
49061
+ }
49062
+ .rb-media-shape-square {
49063
+ border-radius: 0;
49064
+ }
49065
+ .rb-media-shape-rounded {
49066
+ border-radius: var(--rb-media-shape-radius, 1rem);
49067
+ }
49068
+ .rb-media-shape-circle {
49069
+ border-radius: 9999px;
49070
+ }
49071
+ .rb-media-shape-arch {
49072
+ border-radius: 9999px 9999px var(--rb-media-shape-arch-base-radius, 0.125rem)
49073
+ var(--rb-media-shape-arch-base-radius, 0.125rem);
49074
+ }
49075
+
47649
49076
  /* Navigation typography */
47650
49077
  .rb-nav-text {
47651
49078
  font-size: 0.875rem;
@@ -50800,7 +52227,7 @@ var containerResponsiveThemeCss = `/*
50800
52227
  :where(.theme-scope) :where([data-block="event-registration"]) .er-container {
50801
52228
  border-radius: var(--rb-block-radius);
50802
52229
  border: 1px solid var(--er-border);
50803
- padding: 1.5rem;
52230
+ padding: clamp(1rem, 2vw, 1.5rem);
50804
52231
  background: rgb(var(--tb-surface));
50805
52232
  color: var(--er-on-surface);
50806
52233
  transition: border-color var(--rb-block-transition) ease;
@@ -50809,6 +52236,109 @@ var containerResponsiveThemeCss = `/*
50809
52236
  margin-inline: 0;
50810
52237
  }
50811
52238
 
52239
+ /* SSR shell / required-island fallback */
52240
+ :where(.theme-scope) :where([data-block="event-registration"]) .er-registration-shell {
52241
+ min-height: 24rem;
52242
+ }
52243
+
52244
+ :where(.theme-scope) :where([data-block="event-registration"]) .er-registration-shell__steps {
52245
+ margin-bottom: 1.25rem;
52246
+ }
52247
+
52248
+ :where(.theme-scope) :where([data-block="event-registration"]) .er-registration-shell__eyebrow {
52249
+ margin: 0 0 0.35rem;
52250
+ color: var(--er-on-surface-subtle);
52251
+ font-size: 0.75rem;
52252
+ font-weight: 700;
52253
+ letter-spacing: 0.04em;
52254
+ line-height: 1.2;
52255
+ text-transform: uppercase;
52256
+ }
52257
+
52258
+ :where(.theme-scope) :where([data-block="event-registration"]) .er-registration-shell__title {
52259
+ margin: 0;
52260
+ }
52261
+
52262
+ :where(.theme-scope) :where([data-block="event-registration"]) .er-registration-shell__copy {
52263
+ margin: 0.35rem 0 0;
52264
+ max-width: 36rem;
52265
+ line-height: 1.45;
52266
+ }
52267
+
52268
+ :where(.theme-scope) :where([data-block="event-registration"]) .er-registration-shell__cards {
52269
+ margin-top: 0.25rem;
52270
+ overflow: hidden;
52271
+ border: 1px solid var(--er-border);
52272
+ border-radius: var(--rb-block-radius);
52273
+ background: var(--er-control-bg);
52274
+ }
52275
+
52276
+ :where(.theme-scope) :where([data-block="event-registration"]) .er-registration-shell__card {
52277
+ display: grid;
52278
+ gap: 0.5rem;
52279
+ padding: 1rem;
52280
+ }
52281
+
52282
+ :where(.theme-scope) :where([data-block="event-registration"]) .er-registration-shell__line {
52283
+ height: 0.75rem;
52284
+ border-radius: 9999px;
52285
+ background: linear-gradient(
52286
+ 90deg,
52287
+ var(--er-shell-line),
52288
+ rgba(var(--tb-primary), 0.12),
52289
+ var(--er-shell-line)
52290
+ );
52291
+ }
52292
+
52293
+ :where(.theme-scope) :where([data-block="event-registration"]) .er-registration-shell__line--lg {
52294
+ width: min(26rem, 82%);
52295
+ }
52296
+
52297
+ :where(.theme-scope) :where([data-block="event-registration"]) .er-registration-shell__line--md {
52298
+ width: min(19rem, 68%);
52299
+ }
52300
+
52301
+ :where(.theme-scope) :where([data-block="event-registration"]) .er-registration-shell__line--sm {
52302
+ width: min(14rem, 52%);
52303
+ }
52304
+
52305
+ :where(.theme-scope) :where([data-block="event-registration"]) .er-registration-shell__line--xs {
52306
+ width: min(10rem, 42%);
52307
+ }
52308
+
52309
+ :where(.theme-scope) :where([data-block="event-registration"]) .er-registration-shell__summary {
52310
+ align-items: center;
52311
+ border-radius: calc(var(--rb-block-radius) * 0.75);
52312
+ border: 1px solid var(--er-summary-border);
52313
+ padding: 0.875rem 1rem;
52314
+ }
52315
+
52316
+ :where(.theme-scope) :where([data-block="event-registration"]) .er-registration-shell__button-placeholder {
52317
+ display: inline-flex;
52318
+ min-height: 2.5rem;
52319
+ align-items: center;
52320
+ justify-content: center;
52321
+ border-radius: calc(var(--rb-block-radius) * 0.6);
52322
+ background: rgb(var(--tb-primary));
52323
+ color: rgb(var(--tb-primaryText, var(--tb-primaryForeground, 255 255 255)));
52324
+ padding: 0.625rem 1rem;
52325
+ font-size: 0.875rem;
52326
+ font-weight: 600;
52327
+ line-height: 1.2;
52328
+ text-align: center;
52329
+ white-space: nowrap;
52330
+ }
52331
+
52332
+ :where(.theme-scope) :where([data-block="event-registration"]) .event-registration__hydration-error {
52333
+ border-radius: var(--rb-block-radius);
52334
+ border: 1px solid var(--er-border-error);
52335
+ background: var(--er-error-bg);
52336
+ color: var(--er-error-text);
52337
+ padding: 1rem;
52338
+ font-size: 0.9375rem;
52339
+ line-height: 1.45;
52340
+ }
52341
+
50812
52342
  :where(.theme-scope) :where([data-block="event-registration"].event-registration--embedded) .er-container {
50813
52343
  max-width: none;
50814
52344
  padding: 0;
@@ -50856,6 +52386,7 @@ var containerResponsiveThemeCss = `/*
50856
52386
  padding: 1rem;
50857
52387
  border-radius: calc(var(--rb-block-radius) * 0.75);
50858
52388
  border: 1px solid var(--er-border);
52389
+ background: var(--er-surface-muted);
50859
52390
  }
50860
52391
 
50861
52392
  /* Ticket counter */
@@ -50901,14 +52432,23 @@ var containerResponsiveThemeCss = `/*
50901
52432
  /* Form inputs */
50902
52433
  :where(.theme-scope) :where([data-block="event-registration"]) .er-input {
50903
52434
  width: 100%;
50904
- padding: 0.5rem 0.75rem;
52435
+ min-height: 2.75rem;
52436
+ padding: 0.625rem 0.75rem;
50905
52437
  border-radius: calc(var(--rb-block-radius) * 0.5);
50906
52438
  border: 1px solid var(--er-border);
50907
- background: transparent;
52439
+ background: var(--er-control-bg);
52440
+ color: var(--er-control-text);
52441
+ font: inherit;
52442
+ line-height: 1.4;
50908
52443
  transition: border-color var(--rb-block-transition) ease,
52444
+ background-color var(--rb-block-transition) ease,
50909
52445
  box-shadow var(--rb-block-transition) ease;
50910
52446
  }
50911
52447
 
52448
+ :where(.theme-scope) :where([data-block="event-registration"]) .er-input::placeholder {
52449
+ color: var(--er-on-surface-faint);
52450
+ }
52451
+
50912
52452
  :where(.theme-scope) :where([data-block="event-registration"]) .er-input:focus {
50913
52453
  outline: none;
50914
52454
  border-color: var(--er-border-selected);
@@ -51030,7 +52570,7 @@ var containerResponsiveThemeCss = `/*
51030
52570
  }
51031
52571
 
51032
52572
  :where(.theme-scope) :where([data-block="event-registration"]) .er-event-grid .er-event-card {
51033
- padding: 0.75rem 0;
52573
+ padding: 0.875rem 0;
51034
52574
  border-width: 0 0 var(--rb-event-tile-border-width, var(--rb-border-width, 1px)) 0;
51035
52575
  border-style: solid;
51036
52576
  border-radius: 0;
@@ -51262,21 +52802,24 @@ var containerResponsiveThemeCss = `/*
51262
52802
  align-items: flex-start;
51263
52803
  gap: 0.75rem;
51264
52804
  padding: 1rem;
51265
- border: 2px solid var(--er-payment-border);
52805
+ border: 1px solid var(--er-payment-border);
51266
52806
  border-radius: var(--rb-block-radius);
51267
- background: transparent;
52807
+ background: var(--er-control-bg);
51268
52808
  cursor: pointer;
51269
52809
  transition: border-color var(--rb-block-transition) ease,
52810
+ box-shadow var(--rb-block-transition) ease,
51270
52811
  background-color var(--rb-block-transition) ease;
51271
52812
  }
51272
52813
 
51273
52814
  :where(.theme-scope) :where([data-block="event-registration"]) .er-payment-option:hover {
51274
52815
  border-color: var(--er-payment-border-hover);
52816
+ box-shadow: 0 8px 18px rgba(var(--tb-shadow, 15 23 42), 0.08);
51275
52817
  }
51276
52818
 
51277
52819
  :where(.theme-scope) :where([data-block="event-registration"]) .er-payment-option--selected {
51278
52820
  border-color: var(--er-payment-border-selected);
51279
52821
  background-color: var(--er-payment-bg-selected);
52822
+ box-shadow: 0 0 0 1px var(--er-payment-border-selected);
51280
52823
  }
51281
52824
 
51282
52825
  /* Discount code entry */
@@ -51964,22 +53507,25 @@ var containerResponsiveThemeCss = `/*
51964
53507
  justify-content: center;
51965
53508
  gap: 0.25rem;
51966
53509
  padding: 0.75rem 0.625rem;
51967
- border: 2px solid var(--er-payment-border);
53510
+ border: 1px solid var(--er-payment-border);
51968
53511
  border-radius: var(--rb-block-radius);
51969
- background: transparent;
53512
+ background: var(--er-control-bg);
51970
53513
  cursor: pointer;
51971
53514
  text-align: center;
51972
53515
  transition: border-color var(--rb-block-transition) ease,
53516
+ box-shadow var(--rb-block-transition) ease,
51973
53517
  background-color var(--rb-block-transition) ease;
51974
53518
  }
51975
53519
 
51976
53520
  :where(.theme-scope) :where([data-block="event-registration"]) .er-payment-tile:hover:not([aria-disabled="true"]) {
51977
53521
  border-color: var(--er-payment-border-hover);
53522
+ box-shadow: 0 8px 18px rgba(var(--tb-shadow, 15 23 42), 0.08);
51978
53523
  }
51979
53524
 
51980
53525
  :where(.theme-scope) :where([data-block="event-registration"]) .er-payment-tile--selected {
51981
53526
  border-color: var(--er-payment-border-selected);
51982
53527
  background-color: var(--er-payment-bg-selected);
53528
+ box-shadow: 0 0 0 1px var(--er-payment-border-selected);
51983
53529
  }
51984
53530
 
51985
53531
  :where(.theme-scope) :where([data-block="event-registration"]) .er-payment-tile--disabled {
@@ -52082,11 +53628,10 @@ var containerResponsiveThemeCss = `/*
52082
53628
  justify-content: space-between;
52083
53629
  align-items: flex-start;
52084
53630
  gap: 1rem;
52085
- padding: 0.875rem 0;
52086
- background: transparent;
52087
- border-top: 1px solid var(--er-summary-border);
52088
- border-bottom: 1px solid var(--er-summary-border);
52089
- border-radius: 0;
53631
+ padding: 0.875rem 1rem;
53632
+ background: var(--er-surface-muted);
53633
+ border: 1px solid var(--er-summary-border);
53634
+ border-radius: calc(var(--rb-block-radius) * 0.75);
52090
53635
  }
52091
53636
 
52092
53637
  :where(.theme-scope) :where([data-block="event-registration"]) .er-summary-bar-info {
@@ -53858,18 +55403,10 @@ var containerResponsiveThemeCss = `/*
53858
55403
  /* Two-column row (opt-in per field via schema layout) */
53859
55404
  :where(.theme-scope) :where([data-block="form"]) .fb-row-2 {
53860
55405
  display: grid;
53861
- grid-template-columns: 1fr;
55406
+ grid-template-columns: repeat(auto-fit, minmax(min(14rem, 100%), 1fr));
53862
55407
  gap: 1rem;
53863
55408
  }
53864
55409
 
53865
- @container rb-site (min-width: 768px) {
53866
- @scope ([data-rb-responsive-mode="container"]) to (:scope [data-rb-responsive-mode]) {
53867
- :where(.theme-scope) :where([data-block="form"]) .fb-row-2 {
53868
- grid-template-columns: 1fr 1fr;
53869
- }
53870
- }
53871
- }
53872
-
53873
55410
  /* Field wrapper */
53874
55411
  :where(.theme-scope) :where([data-block="form"]) .fb-field {
53875
55412
  display: flex;
@@ -53943,6 +55480,10 @@ var containerResponsiveThemeCss = `/*
53943
55480
  }
53944
55481
 
53945
55482
  /* Subheadline - supporting text below headline */
55483
+ :where(.theme-scope) :where([data-block="hero"]) .hero-headline {
55484
+ text-wrap: balance;
55485
+ }
55486
+
53946
55487
  :where(.theme-scope) :where([data-block="hero"]) .hero-subheadline {
53947
55488
  font-size: 1.125rem;
53948
55489
  color: var(--section-supporting-color, var(--section-text-color, rgb(var(--tb-text))));
@@ -53968,8 +55509,8 @@ var containerResponsiveThemeCss = `/*
53968
55509
  }
53969
55510
 
53970
55511
  :where(.theme-scope) :where([data-block="hero"]) .rb-hero-typography-editorial .hero-headline {
53971
- font-size: clamp(2.5rem, 5vw, 4rem);
53972
- line-height: 1.08;
55512
+ font-size: clamp(2.75rem, 5.6vw, 4.75rem);
55513
+ line-height: 1.06;
53973
55514
  }
53974
55515
 
53975
55516
  :where(.theme-scope) :where([data-block="hero"]) .rb-hero-typography-editorial .hero-subheadline {
@@ -53978,8 +55519,8 @@ var containerResponsiveThemeCss = `/*
53978
55519
  }
53979
55520
 
53980
55521
  :where(.theme-scope) :where([data-block="hero"]) .rb-hero-typography-display .hero-headline {
53981
- font-size: clamp(3rem, 6vw, 5rem);
53982
- line-height: 1.04;
55522
+ font-size: clamp(3.5rem, 7.2vw, 6.25rem);
55523
+ line-height: 1;
53983
55524
  }
53984
55525
 
53985
55526
  :where(.theme-scope) :where([data-block="hero"]) .rb-hero-typography-display .hero-subheadline {
@@ -53988,8 +55529,8 @@ var containerResponsiveThemeCss = `/*
53988
55529
  }
53989
55530
 
53990
55531
  :where(.theme-scope) :where([data-block="hero"]) .rb-hero-typography-poster .hero-headline {
53991
- font-size: clamp(3.5rem, 8vw, 6.5rem);
53992
- line-height: 0.98;
55532
+ font-size: clamp(4.25rem, 10vw, 8.5rem);
55533
+ line-height: 0.94;
53993
55534
  }
53994
55535
 
53995
55536
  :where(.theme-scope) :where([data-block="hero"]) .rb-hero-typography-poster .hero-subheadline {
@@ -53998,13 +55539,13 @@ var containerResponsiveThemeCss = `/*
53998
55539
  }
53999
55540
 
54000
55541
  :where(.theme-scope) :where([data-block="hero"]) .rb-hero-title-medium.rb-hero-typography-poster .hero-headline {
54001
- font-size: clamp(3rem, 6.5vw, 5rem);
55542
+ font-size: clamp(3.5rem, 7.5vw, 6.5rem);
54002
55543
  }
54003
55544
 
54004
55545
  :where(.theme-scope) :where([data-block="hero"]) .rb-hero-title-long.rb-hero-typography-poster .hero-headline,
54005
55546
  :where(.theme-scope) :where([data-block="hero"]) .rb-hero-title-long.rb-hero-typography-display .hero-headline {
54006
- font-size: clamp(2.75rem, 5.5vw, 4.5rem);
54007
- line-height: 1.05;
55547
+ font-size: clamp(3rem, 6vw, 5.25rem);
55548
+ line-height: 1.02;
54008
55549
  }
54009
55550
 
54010
55551
  @container rb-site (max-width: 639px) {
@@ -56726,8 +58267,9 @@ var containerResponsiveThemeCss = `/*
56726
58267
  /* Privacy note */
56727
58268
  :where(.theme-scope) .newsletter-privacy-note {
56728
58269
  margin-top: 0.75rem;
56729
- font-size: 0.75rem;
56730
- color: var(--section-supporting-color, rgb(var(--tb-mutedText)));
58270
+ font-size: 1rem;
58271
+ line-height: 1.6;
58272
+ color: var(--section-text-color, rgb(var(--tb-text)));
56731
58273
  text-align: center;
56732
58274
  }
56733
58275
 
@@ -56782,6 +58324,116 @@ var containerResponsiveThemeCss = `/*
56782
58324
  color: rgb(var(--tb-text));
56783
58325
  }
56784
58326
 
58327
+ /* =============================================================================
58328
+ * Block: Contact + Newsletter
58329
+ * =============================================================================
58330
+ */
58331
+
58332
+ :where(.theme-scope) :where([data-block="contact-newsletter"]) .contact-newsletter-grid {
58333
+ display: grid;
58334
+ grid-template-columns: repeat(auto-fit, minmax(min(24rem, 100%), 1fr));
58335
+ gap: clamp(2.5rem, 6vw, 4rem);
58336
+ align-items: start;
58337
+ }
58338
+
58339
+ :where(.theme-scope) :where([data-block="contact-newsletter"]) .contact-newsletter-column {
58340
+ min-width: 0;
58341
+ }
58342
+
58343
+ :where(.theme-scope) :where([data-block="contact-newsletter"]) .contact-newsletter-copy {
58344
+ margin-bottom: 1.5rem;
58345
+ }
58346
+
58347
+ :where(.theme-scope) :where([data-block="contact-newsletter"]) .form-copy-title,
58348
+ :where(.theme-scope) :where([data-block="contact-newsletter"]) .newsletter-copy-title {
58349
+ margin: 0 0 0.75rem;
58350
+ }
58351
+
58352
+ :where(.theme-scope) :where([data-block="contact-newsletter"]) .form-copy-intro,
58353
+ :where(.theme-scope) :where([data-block="contact-newsletter"]) .newsletter-copy-subtitle {
58354
+ color: var(--section-text-color, rgb(var(--tb-text)));
58355
+ }
58356
+
58357
+ :where(.theme-scope) :where([data-block="contact-newsletter"]) .contact-newsletter-info {
58358
+ display: flex;
58359
+ flex-direction: column;
58360
+ align-items: flex-start;
58361
+ }
58362
+
58363
+ :where(.theme-scope) :where([data-block="contact-newsletter"]) .newsletter-form {
58364
+ max-width: none;
58365
+ margin-left: 0;
58366
+ margin-right: 0;
58367
+ }
58368
+
58369
+ :where(.theme-scope) :where([data-block="contact-newsletter"]) .newsletter-privacy-note {
58370
+ text-align: left;
58371
+ }
58372
+
58373
+ :where(.theme-scope) :where([data-block="contact-newsletter"]) .fb-form {
58374
+ display: flex;
58375
+ flex-direction: column;
58376
+ gap: 1rem;
58377
+ }
58378
+
58379
+ :where(.theme-scope) :where([data-block="contact-newsletter"]) .fb-row-2 {
58380
+ display: grid;
58381
+ grid-template-columns: repeat(auto-fit, minmax(min(14rem, 100%), 1fr));
58382
+ gap: 1rem;
58383
+ }
58384
+
58385
+ :where(.theme-scope) :where([data-block="contact-newsletter"]) .fb-field {
58386
+ display: flex;
58387
+ flex-direction: column;
58388
+ gap: 0.25rem;
58389
+ }
58390
+
58391
+ :where(.theme-scope) :where([data-block="contact-newsletter"]) .fb-fieldset {
58392
+ display: flex;
58393
+ flex-direction: column;
58394
+ gap: 0.5rem;
58395
+ border: none;
58396
+ padding: 0;
58397
+ margin: 0;
58398
+ }
58399
+
58400
+ :where(.theme-scope) :where([data-block="contact-newsletter"]) .fb-inline {
58401
+ display: flex;
58402
+ align-items: center;
58403
+ gap: 0.5rem;
58404
+ }
58405
+
58406
+ :where(.theme-scope) :where([data-block="contact-newsletter"]) .fb-success,
58407
+ :where(.theme-scope) :where([data-block="contact-newsletter"]) .fb-error,
58408
+ :where(.theme-scope) :where([data-block="contact-newsletter"]) .fb-empty {
58409
+ border-radius: var(--rb-block-radius);
58410
+ padding: 1rem;
58411
+ font-size: 0.875rem;
58412
+ }
58413
+
58414
+ :where(.theme-scope) :where([data-block="contact-newsletter"]) .fb-success {
58415
+ background-color: var(--fb-success-bg);
58416
+ color: var(--fb-success-text);
58417
+ border: 1px solid var(--fb-success-border);
58418
+ }
58419
+
58420
+ :where(.theme-scope) :where([data-block="contact-newsletter"]) .fb-error {
58421
+ background-color: var(--fb-error-bg);
58422
+ color: var(--fb-error-text);
58423
+ border: 1px solid var(--fb-error-border);
58424
+ }
58425
+
58426
+ :where(.theme-scope) :where([data-block="contact-newsletter"]) .fb-empty {
58427
+ background-color: var(--fb-empty-bg);
58428
+ color: var(--fb-empty-text);
58429
+ border: 1px dashed var(--fb-empty-border);
58430
+ text-align: center;
58431
+ }
58432
+
58433
+ :where(.theme-scope) :where([data-block="contact-newsletter"]) .fb-actions {
58434
+ margin-top: 0.5rem;
58435
+ }
58436
+
56785
58437
  /* =============================================================================
56786
58438
  * Block: Team Members
56787
58439
  * =============================================================================
@@ -57006,8 +58658,8 @@ var containerResponsiveThemeCss = `/*
57006
58658
  container: event-compact-list / inline-size;
57007
58659
  border: 1px solid var(--event-compact-divider-color);
57008
58660
  border-radius: 1rem;
57009
- background: rgb(var(--tb-background, 255 255 255));
57010
- box-shadow: 0 1.25rem 3.5rem rgba(var(--tb-shadow), 0.08);
58661
+ background: rgb(var(--tb-surface, 255 255 255));
58662
+ box-shadow: none;
57011
58663
  }
57012
58664
 
57013
58665
  :where(.theme-scope) .rb-event-list-treatment-lined-panel .event-listing-compact-container {
@@ -57016,6 +58668,12 @@ var containerResponsiveThemeCss = `/*
57016
58668
  rgb(var(--tb-border, 229 231 235)),
57017
58669
  rgb(var(--tb-text, 17 24 39)) 8%
57018
58670
  );
58671
+ background: rgb(var(--tb-surface, 255 255 255));
58672
+ border-color: color-mix(
58673
+ in oklab,
58674
+ rgb(var(--tb-primary, 0 0 0)),
58675
+ rgb(var(--tb-border, 229 231 235)) 72%
58676
+ );
57019
58677
  }
57020
58678
 
57021
58679
  :where(.theme-scope) .event-compact-row {
@@ -57091,7 +58749,7 @@ var containerResponsiveThemeCss = `/*
57091
58749
 
57092
58750
  :where(.theme-scope) .event-compact-row-title {
57093
58751
  margin: 0;
57094
- color: rgb(var(--tb-text, 17 24 39));
58752
+ color: var(--section-heading-color, rgb(var(--tb-primary, 0 0 0)));
57095
58753
  font-family: var(--font-heading, var(--font-body, inherit));
57096
58754
  font-size: clamp(1.05rem, 1rem + 0.35vw, 1.3rem);
57097
58755
  font-weight: 400;
@@ -57184,8 +58842,6 @@ var containerResponsiveThemeCss = `/*
57184
58842
  min-height: 2.7rem;
57185
58843
  justify-content: space-between;
57186
58844
  gap: 1rem;
57187
- border-radius: 9999px;
57188
- padding-inline: 1.25rem 1rem;
57189
58845
  white-space: nowrap;
57190
58846
  }
57191
58847
 
@@ -58247,6 +59903,7 @@ function PageContent({
58247
59903
  mediaAssets,
58248
59904
  apiBaseUrl,
58249
59905
  portalToken,
59906
+ previewToken,
58250
59907
  dataContext,
58251
59908
  useThemeScope = false
58252
59909
  }) {
@@ -58263,6 +59920,7 @@ function PageContent({
58263
59920
  siteId,
58264
59921
  apiBaseUrl,
58265
59922
  portalToken,
59923
+ previewToken,
58266
59924
  resolvedData,
58267
59925
  routes: routeMap,
58268
59926
  pagesByIdentifier,
@@ -58951,11 +60609,11 @@ function resolveParamsBindings(input, vm, meta) {
58951
60609
  return binding.fallback;
58952
60610
  }
58953
60611
  return resolved;
58954
- } catch (err2) {
60612
+ } catch (err3) {
58955
60613
  if (shouldLogWarnings) {
58956
60614
  console.warn(
58957
60615
  `bindings: failed to parse loader param binding for block "${meta?.blockKind ?? "unknown"}"`,
58958
- err2
60616
+ err3
58959
60617
  );
58960
60618
  }
58961
60619
  return void 0;
@@ -62504,6 +64162,46 @@ var ENDPOINT_DEFINITIONS = {
62504
64162
  auth: "user",
62505
64163
  responseKind: "json"
62506
64164
  },
64165
+ listEntrySlotBlocks: {
64166
+ path: "/sites/{siteId}/content/{type}/{entryId}/slots/{slotKey}/blocks",
64167
+ method: "GET",
64168
+ tags: ["site-{siteId}", "content-entry-{entryId}", "entry-slot-{slotKey}", "blocks"],
64169
+ auth: "user",
64170
+ responseKind: "json",
64171
+ errors: ["resource:not_found"]
64172
+ },
64173
+ listEntryPageContentSlots: {
64174
+ path: "/sites/{siteId}/content/{type}/{entryId}/slots",
64175
+ method: "GET",
64176
+ tags: ["site-{siteId}", "content-entry-{entryId}", "entry-slots", "blocks"],
64177
+ auth: "user",
64178
+ responseKind: "json",
64179
+ errors: ["resource:not_found"]
64180
+ },
64181
+ createEntrySlotBlock: {
64182
+ path: "/sites/{siteId}/content/{type}/{entryId}/slots/{slotKey}/blocks",
64183
+ method: "POST",
64184
+ tags: ["site-{siteId}", "content-entry-{entryId}", "entry-slot-{slotKey}", "blocks"],
64185
+ auth: "user",
64186
+ responseKind: "json",
64187
+ errors: ["validation:invalid_input", "resource:not_found"]
64188
+ },
64189
+ reorderEntrySlotBlocks: {
64190
+ path: "/sites/{siteId}/content/{type}/{entryId}/slots/{slotKey}/blocks/reorder",
64191
+ method: "POST",
64192
+ tags: ["site-{siteId}", "content-entry-{entryId}", "entry-slot-{slotKey}", "blocks"],
64193
+ auth: "user",
64194
+ responseKind: "json",
64195
+ errors: ["validation:invalid_input", "resource:not_found"]
64196
+ },
64197
+ deleteEntrySlotBlock: {
64198
+ path: "/sites/{siteId}/content/{type}/{entryId}/slots/{slotKey}/blocks/{blockId}",
64199
+ method: "DELETE",
64200
+ tags: ["site-{siteId}", "content-entry-{entryId}", "entry-slot-{slotKey}", "blocks"],
64201
+ auth: "user",
64202
+ responseKind: "json",
64203
+ errors: ["resource:not_found"]
64204
+ },
62507
64205
  createBlock: {
62508
64206
  path: "/sites/{siteId}/pages/{pageId}/blocks",
62509
64207
  method: "POST",
@@ -66327,7 +68025,7 @@ function preset(id, verticalId, canonicalBehaviour, label, pluralLabel, descript
66327
68025
  }
66328
68026
 
66329
68027
  // ../api/src/utils/isRecord.ts
66330
- function isRecord10(value) {
68028
+ function isRecord12(value) {
66331
68029
  return typeof value === "object" && value !== null && !Array.isArray(value);
66332
68030
  }
66333
68031
 
@@ -66634,7 +68332,7 @@ function sanitizeMarks(marks) {
66634
68332
  if (mark.type === "bold" || mark.type === "strong" || mark.type === "italic" || mark.type === "em") {
66635
68333
  return [{ type: mark.type }];
66636
68334
  }
66637
- if (mark.type === "link" && isRecord10(mark.attrs) && typeof mark.attrs.href === "string") {
68335
+ if (mark.type === "link" && isRecord12(mark.attrs) && typeof mark.attrs.href === "string") {
66638
68336
  const attrs = { href: mark.attrs.href };
66639
68337
  if (typeof mark.attrs.target === "string" && mark.attrs.target.trim().length > 0) {
66640
68338
  attrs.target = mark.attrs.target;
@@ -66649,10 +68347,10 @@ function sanitizeMarks(marks) {
66649
68347
  return sanitized.length > 0 ? sanitized : void 0;
66650
68348
  }
66651
68349
  function unwrapRichTextValue(value) {
66652
- if (isRecord10(value) && isRecord10(value.doc)) {
68350
+ if (isRecord12(value) && isRecord12(value.doc)) {
66653
68351
  return unwrapRichTextValue(value.doc);
66654
68352
  }
66655
- if (isRecord10(value) && value.type === "doc") {
68353
+ if (isRecord12(value) && value.type === "doc") {
66656
68354
  return {
66657
68355
  type: "doc",
66658
68356
  content: Array.isArray(value.content) ? value.content.filter(isTipTapNodeLike).map(coerceTipTapNode) : []
@@ -66661,7 +68359,7 @@ function unwrapRichTextValue(value) {
66661
68359
  return EMPTY_SITE_BANNER_BODY;
66662
68360
  }
66663
68361
  function isTipTapNodeLike(value) {
66664
- return isRecord10(value) && typeof value.type === "string";
68362
+ return isRecord12(value) && typeof value.type === "string";
66665
68363
  }
66666
68364
  function coerceTipTapNode(value) {
66667
68365
  return {
@@ -66669,9 +68367,9 @@ function coerceTipTapNode(value) {
66669
68367
  ...Array.isArray(value.content) ? { content: value.content.filter(isTipTapNodeLike).map(coerceTipTapNode) } : {},
66670
68368
  ...typeof value.text === "string" ? { text: value.text } : {},
66671
68369
  ...Array.isArray(value.marks) ? {
66672
- marks: value.marks.filter((mark) => isRecord10(mark) && typeof mark.type === "string").map((mark) => ({
68370
+ marks: value.marks.filter((mark) => isRecord12(mark) && typeof mark.type === "string").map((mark) => ({
66673
68371
  type: mark.type,
66674
- ...isRecord10(mark.attrs) ? { attrs: mark.attrs } : {}
68372
+ ...isRecord12(mark.attrs) ? { attrs: mark.attrs } : {}
66675
68373
  }))
66676
68374
  } : {}
66677
68375
  };
@@ -66854,7 +68552,7 @@ var ENTRY_REF_KEYS = [
66854
68552
  "entryId",
66855
68553
  "slug"
66856
68554
  ];
66857
- function isRecord11(value) {
68555
+ function isRecord13(value) {
66858
68556
  return Boolean(value) && typeof value === "object" && !Array.isArray(value);
66859
68557
  }
66860
68558
  function extractManualEntryRef(item) {
@@ -66862,7 +68560,7 @@ function extractManualEntryRef(item) {
66862
68560
  const trimmed = item.trim();
66863
68561
  return trimmed.length > 0 ? trimmed : null;
66864
68562
  }
66865
- if (!isRecord11(item)) return null;
68563
+ if (!isRecord13(item)) return null;
66866
68564
  for (const key of ENTRY_REF_KEYS) {
66867
68565
  const raw = item[key];
66868
68566
  if (typeof raw === "string" && raw.trim().length > 0) {
@@ -67657,6 +69355,31 @@ function isDocWrapper(value) {
67657
69355
  var normalizeBindingOutput2 = normalizeBindingOutput;
67658
69356
  var applyBindingsToContent2 = applyBindingsToContent;
67659
69357
 
69358
+ // ../content-model/src/entry-slots/types.ts
69359
+ function ok2(value) {
69360
+ return { ok: true, value };
69361
+ }
69362
+ function err2(error) {
69363
+ return { ok: false, error };
69364
+ }
69365
+ var SLOT_KEY_PATTERN = /^[a-z][a-z0-9]*(?:[-_][a-z0-9]+)*$/;
69366
+ function unsafeAsSlotKey(value) {
69367
+ return value;
69368
+ }
69369
+ function parseSlotKey(value) {
69370
+ if (typeof value !== "string") return err2({ kind: "not-string" });
69371
+ const normalized = value.trim();
69372
+ if (!normalized) return err2({ kind: "empty" });
69373
+ if (!SLOT_KEY_PATTERN.test(normalized)) {
69374
+ return err2({ kind: "invalid-format", value: normalized });
69375
+ }
69376
+ return ok2(unsafeAsSlotKey(normalized));
69377
+ }
69378
+ var SYSTEM_ENTRY_SLOT_BLOCK_KIND = "system.entry-slot";
69379
+ function selectBlocksForDeclaredEntrySlot(input) {
69380
+ return input.entrySlots.find((slot) => slot.slotKey === input.declaredSlotKey)?.blocks ?? [];
69381
+ }
69382
+
67660
69383
  // src/rendering/helpers/loadContent.ts
67661
69384
  function isPageContent(result) {
67662
69385
  return result.type === "page";
@@ -67709,6 +69432,7 @@ async function loadContent(params) {
67709
69432
  };
67710
69433
  const { templatePage, resolvedData: resolvedData2 } = await processEntryTemplate(
67711
69434
  contentResponse.templates,
69435
+ contentResponse.entrySlots,
67712
69436
  entry,
67713
69437
  { siteId, preview },
67714
69438
  client,
@@ -67832,7 +69556,7 @@ function validateAndConvertBlock(block, source) {
67832
69556
  content
67833
69557
  };
67834
69558
  }
67835
- async function processEntryTemplate(templates, entry, context, client, options) {
69559
+ async function processEntryTemplate(templates, entrySlots, entry, context, client, options) {
67836
69560
  const template = templates?.[0];
67837
69561
  if (!template || !template.blocks?.length) {
67838
69562
  return { templatePage: null, resolvedData: {} };
@@ -67850,7 +69574,12 @@ async function processEntryTemplate(templates, entry, context, client, options)
67850
69574
  updatedAt: entry.updatedAt
67851
69575
  }
67852
69576
  };
67853
- const blocks = template.blocks.map((block) => resolveTemplateBlock(block, bindingContext));
69577
+ const blocks = template.blocks.flatMap(
69578
+ (block) => resolveTemplateBlockSequence(block, bindingContext, entrySlots)
69579
+ );
69580
+ if (blocks.length === 0) {
69581
+ return { templatePage: null, resolvedData: {} };
69582
+ }
67854
69583
  const templatePage = {
67855
69584
  name: template.name || "Entry Template",
67856
69585
  path: entry.path || "/",
@@ -67890,6 +69619,48 @@ function resolveTemplateBlock(block, bindingContext) {
67890
69619
  content: resolvedContent
67891
69620
  };
67892
69621
  }
69622
+ function resolveTemplateBlockSequence(block, bindingContext, entrySlots) {
69623
+ const slotKey = readEntrySlotKey(block);
69624
+ if (slotKey) {
69625
+ return selectBlocksForDeclaredEntrySlot({
69626
+ declaredSlotKey: slotKey,
69627
+ entrySlots: entrySlots ?? []
69628
+ }).map(mapEntrySlotBlock);
69629
+ }
69630
+ if (block.blockKind === SYSTEM_ENTRY_SLOT_BLOCK_KIND) {
69631
+ return [];
69632
+ }
69633
+ return [resolveTemplateBlock(block, bindingContext)];
69634
+ }
69635
+ function readEntrySlotKey(block) {
69636
+ if (block.blockKind !== SYSTEM_ENTRY_SLOT_BLOCK_KIND) return null;
69637
+ if (block.scope !== "template") return null;
69638
+ const content = block.content;
69639
+ const slotKey = content?.slotKey;
69640
+ const parsed = parseSlotKey(slotKey);
69641
+ return parsed.ok ? parsed.value : null;
69642
+ }
69643
+ function mapEntrySlotBlock(block) {
69644
+ const mapped = {
69645
+ id: block.id ?? block.blockId ?? null,
69646
+ kind: block.kind,
69647
+ purpose: block.purpose,
69648
+ orderIndex: block.orderIndex ?? null,
69649
+ content: normalizeBindingOutput2(block.content ?? {}),
69650
+ draftContent: normalizeNullableEntrySlotContent(block.draftContent),
69651
+ publishedContent: normalizeNullableEntrySlotContent(block.publishedContent)
69652
+ };
69653
+ if (block.bindings == null) {
69654
+ return mapped;
69655
+ }
69656
+ return {
69657
+ ...mapped,
69658
+ bindings: block.bindings
69659
+ };
69660
+ }
69661
+ function normalizeNullableEntrySlotContent(content) {
69662
+ return content == null ? null : normalizeBindingOutput2(content);
69663
+ }
67893
69664
 
67894
69665
  // src/contracts/bindings.ts
67895
69666
  var BINDING_TRANSFORMS = {