@riverbankcms/sdk 0.82.0 → 0.84.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (194) hide show
  1. package/README.md +16 -0
  2. package/dist/{PreviewEditorSidebar-LHGK6RIO.mjs → PreviewEditorSidebar-HML67UDA.mjs} +330 -11
  3. package/dist/{PreviewEditorUI-AXZG2SDC.mjs → PreviewEditorUI-I4BQUU6K.mjs} +3 -3
  4. package/dist/SdkPreviewModeRuntime-MCKMVDTK.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/event-registration.headless.state.d.ts +303 -0
  51. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/useEventRegistrationSubmit.d.ts +20 -1
  52. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/useEventRegistrationWizard.d.ts +4 -3
  53. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration/utils.d.ts +1 -1
  54. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration.interactive.d.ts +26 -6
  55. package/dist/_dts/blocks/src/system/runtime/nodes/events/shared/pricing.d.ts +14 -0
  56. package/dist/_dts/content-editor/src/controller/EntryControllerProvider.d.ts +1 -1
  57. package/dist/_dts/content-editor/src/controller/buildBlockPublishedBaselines.d.ts +1 -1
  58. package/dist/_dts/content-editor/src/controller/seedDraftBaselinesFromBlocks.d.ts +1 -1
  59. package/dist/_dts/content-editor/src/controller/useBlocksList.d.ts +1 -1
  60. package/dist/_dts/content-editor/src/controller/useInvalidBlockRecovery.d.ts +1 -1
  61. package/dist/_dts/content-editor/src/primitives/PreviewRichTextEditor.d.ts +2 -1
  62. package/dist/_dts/content-editor/src/primitives/PreviewTextEditor.d.ts +1 -0
  63. package/dist/_dts/content-model/src/entry-slots/index.d.ts +1 -0
  64. package/dist/_dts/content-model/src/entry-slots/types.d.ts +356 -0
  65. package/dist/_dts/content-model/src/index.d.ts +1 -0
  66. package/dist/_dts/content-model/src/templates/defaults.d.ts +7 -0
  67. package/dist/_dts/db/src/generated/supabase/database.types.d.ts +100 -5
  68. package/dist/_dts/editor-blocks/src/BlockEditor.d.ts +6 -1
  69. package/dist/_dts/editor-blocks/src/BlockForm.d.ts +1 -1
  70. package/dist/_dts/editor-blocks/src/block-editor/hooks/useBlockCreation.d.ts +3 -2
  71. package/dist/_dts/editor-blocks/src/block-editor/hooks/useBlockDuplication.d.ts +3 -2
  72. package/dist/_dts/editor-blocks/src/block-editor/hooks/useBlockReorder.d.ts +3 -2
  73. package/dist/_dts/editor-blocks/src/block-editor/owner.d.ts +27 -0
  74. package/dist/_dts/editor-blocks/src/index.d.ts +1 -0
  75. package/dist/_dts/media-core/src/assetsInUseSummary.d.ts +8 -0
  76. package/dist/_dts/media-core/src/mediaUsageProjection.d.ts +37 -3
  77. package/dist/_dts/preview-next/src/client/blocks/pageDesignRuntimePreview.d.ts +4 -2
  78. package/dist/_dts/preview-next/src/client/blocks/previewProjection/runtimeContentDecoration.d.ts +2 -2
  79. package/dist/_dts/preview-next/src/client/preview/EntryEditorPanel.d.ts +3 -1
  80. package/dist/_dts/preview-next/src/client/preview/EntrySlotBlockEditorPanel.d.ts +19 -0
  81. package/dist/_dts/preview-next/src/client/preview/SiteChromeCustomizeButton.d.ts +8 -0
  82. package/dist/_dts/preview-next/src/client/preview/SiteChromeCustomizeContext.d.ts +4 -1
  83. package/dist/_dts/preview-next/src/client/preview/StyleConfigurator.state.d.ts +1 -1
  84. package/dist/_dts/preview-next/src/client/preview/linkedEntryEditEvents.d.ts +9 -0
  85. package/dist/_dts/preview-next/src/client/preview/previewCustomizeControls.d.ts +9 -8
  86. package/dist/_dts/preview-next/src/client/preview/siteChromeLookRows.d.ts +10 -1
  87. package/dist/_dts/preview-next/src/client/preview/siteChromeQuickControlHistoryState.d.ts +5 -1
  88. package/dist/_dts/sdk/src/bookings/index.d.ts +5 -4
  89. package/dist/_dts/sdk/src/bookings/types.d.ts +2 -2
  90. package/dist/_dts/sdk/src/cli/content/reader.d.ts +9 -8
  91. package/dist/_dts/sdk/src/cli/content/writer.d.ts +6 -1
  92. package/dist/_dts/sdk/src/cli/helpers.d.ts +10 -5
  93. package/dist/_dts/sdk/src/cli/merge-remote/entryLocal.d.ts +2 -2
  94. package/dist/_dts/sdk/src/cli/merge-remote/entryMerge.d.ts +2 -1
  95. package/dist/_dts/sdk/src/cli/merge-remote/entrySnapshots.d.ts +2 -2
  96. package/dist/_dts/sdk/src/client/management/index.d.ts +1 -1
  97. package/dist/_dts/sdk/src/client/management/types.d.ts +40 -10
  98. package/dist/_dts/sdk/src/config/field-definitions.d.ts +13 -7
  99. package/dist/_dts/sdk/src/contracts/system-block-content.d.ts +26 -3
  100. package/dist/_dts/sdk/src/public-api/contracts.d.ts +13 -0
  101. package/dist/_dts/sdk/src/rendering/blocks-page-renderer.d.ts +1 -0
  102. package/dist/_dts/sdk/src/rendering/components/pageShared.d.ts +6 -1
  103. package/dist/_dts/sdk/src/rendering/overrides.d.ts +6 -1
  104. package/dist/_dts/sdk/src/types/block-kinds.d.ts +1 -1
  105. package/dist/_dts/sdk/src/version.d.ts +1 -1
  106. package/dist/_dts/site-commands/src/commands.d.ts +15 -0
  107. package/dist/_dts/theme-core/src/accordions/types.d.ts +1 -1
  108. package/dist/_dts/theme-core/src/buttons/personalities/index.d.ts +11 -0
  109. package/dist/_dts/theme-core/src/buttons/personalities/ornate-ritual.d.ts +16 -0
  110. package/dist/_dts/theme-core/src/buttons/personalities/types.d.ts +1 -1
  111. package/dist/_dts/theme-core/src/buttons/types.d.ts +3 -3
  112. package/dist/_dts/theme-core/src/cards/types.d.ts +15 -15
  113. package/dist/_dts/theme-core/src/generated/containerResponsiveThemeCss.d.ts +1 -1
  114. package/dist/_dts/theme-core/src/inputs/types.d.ts +1 -1
  115. package/dist/_dts/theme-core/src/mock-themes/all.d.ts +33 -33
  116. package/dist/_dts/theme-core/src/palette/variants/index.d.ts +15 -0
  117. package/dist/_dts/theme-core/src/palette/variants/warm-dark.d.ts +16 -0
  118. package/dist/_dts/theme-core/src/schema.d.ts +30 -25
  119. package/dist/_dts/theme-core/src/site-styles/backgroundAppearance.d.ts +2 -2
  120. package/dist/_dts/theme-core/src/site-styles/curatedSiteStyles.d.ts +141 -1
  121. package/dist/_dts/theme-core/src/site-styles/designState.d.ts +2 -0
  122. package/dist/_dts/theme-core/src/site-styles/footerLooks.d.ts +110 -5
  123. package/dist/_dts/theme-core/src/site-styles/generatedSchemas.d.ts +4 -2
  124. package/dist/_dts/theme-core/src/site-styles/previewCompiler.d.ts +1 -1
  125. package/dist/_dts/theme-core/src/site-styles/runtimeCompiler.d.ts +5 -1
  126. package/dist/_dts/theme-core/src/site-styles/tokenRecipes.d.ts +1 -1
  127. package/dist/_dts/theme-core/src/site-styles/types.d.ts +1 -1
  128. package/dist/_dts/theme-core/src/site-styles/typographyPresets.d.ts +16 -1
  129. package/dist/_dts/theme-core/src/siteChromePlanning.d.ts +1 -0
  130. package/dist/_dts/theme-core/src/utils/colorStyles.d.ts +6 -6
  131. package/dist/{chunk-2BUMISSH.mjs → chunk-3LXFQS7T.mjs} +1 -1
  132. package/dist/{chunk-G35HOQEN.mjs → chunk-5E33VO6J.mjs} +132 -46
  133. package/dist/{chunk-HKB6XVIP.mjs → chunk-6X2OVO3S.mjs} +2 -2
  134. package/dist/{chunk-6FWNF3DJ.mjs → chunk-HFMGVJCE.mjs} +158 -20
  135. package/dist/{chunk-FIREV57T.mjs → chunk-LBBPD2IW.mjs} +40 -0
  136. package/dist/{chunk-XQR6THQJ.mjs → chunk-MSHZO4SL.mjs} +3193 -1216
  137. package/dist/cli/index.mjs +2635 -575
  138. package/dist/cli/init-docs/content/getting-started.md +2 -0
  139. package/dist/cli/init-docs/content/workflow-templates.md +93 -2
  140. package/dist/client/{accordion-G34C45TW.mjs → accordion-ESY65T56.mjs} +2 -2
  141. package/dist/client/{bookingForm-BLBVKSAQ.mjs → bookingForm-JRFNZUHD.mjs} +5 -5
  142. package/dist/client/bookings.mjs +3539 -269
  143. package/dist/client/{carousel-7ZVTBRMD.mjs → carousel-CPR5VWIP.mjs} +3 -3
  144. package/dist/client/{cart-Q6S6LZUO.mjs → cart-ZUX5BA7O.mjs} +6 -6
  145. package/dist/client/{checkout-5QJLDE4I.mjs → checkout-RULGBADZ.mjs} +6 -6
  146. package/dist/client/{chunk-CHAB5ACD.mjs → chunk-52I7BGEK.mjs} +2 -2
  147. package/dist/client/{chunk-CSZGLBYR.mjs → chunk-5ZEAZ33K.mjs} +1 -1
  148. package/dist/client/{chunk-ZF4XEWDM.mjs → chunk-BT6AEIKN.mjs} +1 -1
  149. package/dist/client/{chunk-RJHTCTCZ.mjs → chunk-HXPWP5EN.mjs} +268 -15
  150. package/dist/client/{chunk-5PQH4Y75.mjs → chunk-JWEYB4V6.mjs} +2 -2
  151. package/dist/client/{chunk-EQKYMX4N.mjs → chunk-RDJFCPY3.mjs} +158 -51
  152. package/dist/client/{chunk-SBBSMFFG.mjs → chunk-SYIJ5JO2.mjs} +1 -1
  153. package/dist/client/{chunk-WJFHDTYF.mjs → chunk-URQCZD5W.mjs} +5 -5
  154. package/dist/client/{chunk-U2EW7RSR.mjs → chunk-Z5OBQ5I4.mjs} +1 -1
  155. package/dist/client/{chunk-S3MKFGOG.mjs → chunk-ZE5G642V.mjs} +1 -1
  156. package/dist/client/client.mjs +2391 -673
  157. package/dist/client/{courseRegistration-VUG2JJDB.mjs → courseRegistration-QTUDC35T.mjs} +5 -5
  158. package/dist/client/{eventCalendar-E7D2LD4N.mjs → eventCalendar-Q7NS4XLD.mjs} +7 -7
  159. package/dist/client/{eventCombined-FUZ2Z3CS.mjs → eventCombined-QAO7VUO5.mjs} +7 -7
  160. package/dist/client/{eventDetails-QRITJAOW.mjs → eventDetails-WTNNU6Q3.mjs} +7 -7
  161. package/dist/client/{eventListing-INMQMJZ5.mjs → eventListing-5TA2ELDT.mjs} +7 -7
  162. package/dist/client/{eventRegistration-TOOJD4WU.mjs → eventRegistration-M6USZGRF.mjs} +7 -7
  163. package/dist/client/{form-BOWN7ZNQ.mjs → form-DGVGXLMH.mjs} +2 -2
  164. package/dist/client/{headerSection-HFQNZOUU.mjs → headerSection-O2AGMPCU.mjs} +3 -3
  165. package/dist/client/hooks.mjs +1636 -385
  166. package/dist/client/{locationMap-VUZGC7Y5.mjs → locationMap-EJRNRIKJ.mjs} +2 -2
  167. package/dist/client/{newsletterForm-X2XQTPCB.mjs → newsletterForm-7NTC2DTR.mjs} +2 -2
  168. package/dist/client/{productDetail-TA7D2G2B.mjs → productDetail-HH4LP53D.mjs} +6 -6
  169. package/dist/client/{productList-AZOLOZKM.mjs → productList-YVHYM2AF.mjs} +6 -6
  170. package/dist/client/rendering/client.mjs +2303 -1068
  171. package/dist/client/rendering/islands.mjs +19 -19
  172. package/dist/client/rendering.mjs +2587 -796
  173. package/dist/client/{shop-ZDLO7IIG.mjs → shop-UIFX7XRK.mjs} +6 -6
  174. package/dist/preview-next/before-render.mjs +40 -0
  175. package/dist/preview-next/client/runtime.mjs +5 -5
  176. package/dist/preview-next/middleware.mjs +40 -0
  177. package/dist/{sdk-runtime-CTWKNBDQ.mjs → sdk-runtime-ZENAOYMN.mjs} +6 -6
  178. package/dist/server/components.mjs +2028 -457
  179. package/dist/server/config-validation.mjs +1629 -377
  180. package/dist/server/config.mjs +1629 -377
  181. package/dist/server/data.mjs +1636 -385
  182. package/dist/server/index.mjs +42 -1
  183. package/dist/server/next.mjs +2215 -571
  184. package/dist/server/page-converter.mjs +2068 -884
  185. package/dist/server/prebuild.mjs +1 -1
  186. package/dist/server/rendering/server.mjs +2040 -469
  187. package/dist/server/rendering.mjs +2119 -475
  188. package/dist/server/routing.mjs +1711 -419
  189. package/dist/server/server.mjs +1718 -394
  190. package/dist/server/theme-bridge.mjs +1180 -101
  191. package/dist/server/theme.mjs +92 -1
  192. package/dist/styles/index.css +292 -36
  193. package/package.json +1 -1
  194. 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,6 +13778,319 @@ var typographyPresetsById = new Map(
13412
13778
  typographyPresets.map((preset2) => [preset2.id, preset2])
13413
13779
  );
13414
13780
 
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
+ }
13941
+ },
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
+ }
13962
+ },
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
+ }
13974
+ },
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
+
13415
14094
  // ../theme-core/src/site-styles/curatedSiteStyles.ts
13416
14095
  var SOFT_EARTH_SITE_STYLE_ID_VALUE = "site-style:soft-earth";
13417
14096
  var SOFT_EARTH_SITE_STYLE_ID = asSiteStyleId(SOFT_EARTH_SITE_STYLE_ID_VALUE);
@@ -13430,6 +14109,7 @@ var curatedSiteStyleIdValues = [
13430
14109
  SOFT_EARTH_SITE_STYLE_ID_VALUE,
13431
14110
  "site-style:bold-launch",
13432
14111
  "site-style:south-west-twerk-school",
14112
+ "site-style:kirtan-ornate",
13433
14113
  "site-style:original-joy"
13434
14114
  ];
13435
14115
  var quietBudget = {
@@ -13456,6 +14136,50 @@ var expressiveBudget = {
13456
14136
  mediaDensity: "high",
13457
14137
  decorativeRepetition: "medium"
13458
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
+ });
13459
14183
  var expressiveUnderlineInputs = {
13460
14184
  base: {
13461
14185
  background: { type: "transparent" },
@@ -13493,6 +14217,43 @@ var expressiveUnderlineInputs = {
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,6 +26993,126 @@ 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
 
26996
+ // ../blocks/src/system/runtime/nodes/events/shared/pricing.ts
26997
+ var DEFAULT_EVENT_CURRENCY = "USD";
26998
+ function resolveRuntimeEventPricing(event) {
26999
+ if (isPublicEventPricing(event.pricing)) {
27000
+ return event.pricing;
27001
+ }
27002
+ const legacy = event;
27003
+ const currency = readCurrency(legacy.currency);
27004
+ if (event.requiresRegistration === false) {
27005
+ return {
27006
+ kind: "drop_in",
27007
+ currency,
27008
+ display: { kind: "free", currency }
27009
+ };
27010
+ }
27011
+ if (legacy.pricingMode === "ticket_types") {
27012
+ const ticketTypes = Array.isArray(legacy.ticketTypes) ? legacy.ticketTypes.filter(isPublicEventTicketType) : [];
27013
+ return {
27014
+ kind: "ticket_types",
27015
+ currency,
27016
+ ticketTypes,
27017
+ display: readTicketTypePriceDisplay(legacy.priceDisplay, currency)
27018
+ };
27019
+ }
27020
+ const amount = typeof legacy.price === "number" ? legacy.price : 0;
27021
+ if (legacy.pricingType === "paid" && amount > 0) {
27022
+ return {
27023
+ kind: "single_paid",
27024
+ amount,
27025
+ currency,
27026
+ display: { kind: "exact", amount, currency }
27027
+ };
27028
+ }
27029
+ return {
27030
+ kind: "free_registration",
27031
+ currency,
27032
+ display: { kind: "free", currency }
27033
+ };
27034
+ }
27035
+ function readCurrency(value) {
27036
+ return typeof value === "string" && value.trim().length > 0 ? value : DEFAULT_EVENT_CURRENCY;
27037
+ }
27038
+ function isRecord5(value) {
27039
+ return typeof value === "object" && value !== null && !Array.isArray(value);
27040
+ }
27041
+ function isPublicEventPricing(value) {
27042
+ if (!isRecord5(value) || typeof value.kind !== "string") return false;
27043
+ return value.kind === "drop_in" || value.kind === "free_registration" || value.kind === "single_paid" || value.kind === "ticket_types" || value.kind === "course";
27044
+ }
27045
+ function isPublicEventTicketType(value) {
27046
+ return isRecord5(value) && typeof value.id === "string";
27047
+ }
27048
+ function readTicketTypePriceDisplay(value, currency) {
27049
+ const display = readLegacyPriceDisplay(value, currency);
27050
+ return display.kind === "course" ? { kind: "unavailable", currency } : display;
27051
+ }
27052
+ function readLegacyPriceDisplay(value, currency) {
27053
+ if (!isRecord5(value) || typeof value.kind !== "string") {
27054
+ return { kind: "unavailable", currency };
27055
+ }
27056
+ const displayCurrency = readCurrency(value.currency);
27057
+ switch (value.kind) {
27058
+ case "free":
27059
+ return { kind: "free", currency: displayCurrency };
27060
+ case "exact":
27061
+ return readAmount(value.amount) !== null ? {
27062
+ kind: "exact",
27063
+ amount: readAmount(value.amount) ?? 0,
27064
+ currency: displayCurrency
27065
+ } : { kind: "unavailable", currency };
27066
+ case "from":
27067
+ return readAmount(value.amount) !== null ? {
27068
+ kind: "from",
27069
+ amount: readAmount(value.amount) ?? 0,
27070
+ currency: displayCurrency
27071
+ } : { kind: "unavailable", currency };
27072
+ case "mixed":
27073
+ return readAmount(value.paidFromAmount) !== null ? {
27074
+ kind: "mixed",
27075
+ paidFromAmount: readAmount(value.paidFromAmount) ?? 0,
27076
+ currency: displayCurrency
27077
+ } : { kind: "unavailable", currency };
27078
+ case "unavailable":
27079
+ return { kind: "unavailable", currency: displayCurrency };
27080
+ case "course":
27081
+ return isRecord5(value.display) ? {
27082
+ kind: "course",
27083
+ display: readCoursePriceDisplay(value.display, displayCurrency)
27084
+ } : {
27085
+ kind: "course",
27086
+ display: { kind: "unavailable", currency: displayCurrency }
27087
+ };
27088
+ default:
27089
+ return { kind: "unavailable", currency };
27090
+ }
27091
+ }
27092
+ function readCoursePriceDisplay(value, currency) {
27093
+ switch (value.kind) {
27094
+ case "free":
27095
+ return { kind: "free", currency: readCurrency(value.currency) };
27096
+ case "exact":
27097
+ return readAmount(value.amount) !== null ? {
27098
+ kind: "exact",
27099
+ amount: readAmount(value.amount) ?? 0,
27100
+ currency: readCurrency(value.currency)
27101
+ } : { kind: "unavailable", currency };
27102
+ case "from":
27103
+ return readAmount(value.amount) !== null ? {
27104
+ kind: "from",
27105
+ amount: readAmount(value.amount) ?? 0,
27106
+ currency: readCurrency(value.currency)
27107
+ } : { kind: "unavailable", currency };
27108
+ default:
27109
+ return { kind: "unavailable", currency };
27110
+ }
27111
+ }
27112
+ function readAmount(value) {
27113
+ return typeof value === "number" && Number.isFinite(value) ? value : null;
27114
+ }
27115
+
25953
27116
  // ../blocks/src/system/runtime/nodes/shared/contract-schemas.ts
25954
27117
  import { z as z45 } from "zod";
25955
27118
 
@@ -25980,11 +27143,21 @@ var filterAutoShowSchema = z45.enum(["auto", "always", "never"]);
25980
27143
  var calendarTabViewsSchema = z45.enum(["both", "month", "week"]);
25981
27144
 
25982
27145
  // ../blocks/src/system/runtime/nodes/event-registration.interactive.ts
27146
+ var EVENT_REGISTRATION_GENERIC_SHELL_STEP_LABELS = ["Date", "Tickets", "Details"];
27147
+ var [
27148
+ eventRegistrationGenericDateStepLabel,
27149
+ eventRegistrationGenericTicketsStepLabel,
27150
+ eventRegistrationGenericDetailsStepLabel
27151
+ ] = EVENT_REGISTRATION_GENERIC_SHELL_STEP_LABELS;
25983
27152
  var contentEntrySchema = z46.object({
25984
27153
  id: z46.string(),
25985
27154
  slug: z46.string(),
25986
27155
  contentTypeSlug: z46.string()
25987
27156
  });
27157
+ var eventRegistrationPublicEventSchema = z46.preprocess(
27158
+ normalizeEventRegistrationEventInput,
27159
+ publicEventSchema
27160
+ );
25988
27161
  var eventRegistrationSourceSchema = z46.object({
25989
27162
  siteId: z46.string().optional(),
25990
27163
  apiBaseUrl: z46.string().optional(),
@@ -25992,7 +27165,7 @@ var eventRegistrationSourceSchema = z46.object({
25992
27165
  previewToken: z46.string().nullable().optional(),
25993
27166
  occurrenceContext: occurrenceContextSchema.optional(),
25994
27167
  contentEntry: contentEntrySchema.nullable().optional(),
25995
- events: z46.array(publicEventSchema).nullable().optional(),
27168
+ events: z46.array(eventRegistrationPublicEventSchema).nullable().optional(),
25996
27169
  className: z46.string().nullable().optional(),
25997
27170
  buttonText: z46.string().nullable().optional(),
25998
27171
  maxTickets: z46.string().nullable().optional(),
@@ -26007,14 +27180,21 @@ var eventRegistrationSourceSchema = z46.object({
26007
27180
  });
26008
27181
  var eventRegistrationDisplaySchema = z46.object({
26009
27182
  kind: z46.literal("event-registration"),
26010
- state: z46.literal("shell"),
27183
+ state: z46.literal("generic-shell"),
26011
27184
  className: z46.string().nullable(),
27185
+ titleText: z46.string(),
27186
+ bodyText: z46.string(),
27187
+ stepLabels: z46.tuple([
27188
+ z46.literal(eventRegistrationGenericDateStepLabel),
27189
+ z46.literal(eventRegistrationGenericTicketsStepLabel),
27190
+ z46.literal(eventRegistrationGenericDetailsStepLabel)
27191
+ ]),
26012
27192
  summaryButtonText: z46.string()
26013
27193
  });
26014
27194
  var eventRegistrationHydrationSchema = z46.object({
26015
27195
  occurrenceContext: occurrenceContextSchema.optional(),
26016
27196
  contentEntry: contentEntrySchema.nullable().optional(),
26017
- events: z46.array(publicEventSchema).nullable().optional(),
27197
+ events: z46.array(eventRegistrationPublicEventSchema).nullable().optional(),
26018
27198
  maxTickets: z46.string().optional(),
26019
27199
  showVenue: z46.boolean().optional(),
26020
27200
  showCapacity: z46.boolean().optional(),
@@ -26045,8 +27225,11 @@ var eventRegistrationIslandMetaKeys = defineInteractiveIslandMetaKeys(
26045
27225
  function buildEventRegistrationDisplay(source) {
26046
27226
  return {
26047
27227
  kind: "event-registration",
26048
- state: "shell",
27228
+ state: "generic-shell",
26049
27229
  className: source.className ?? null,
27230
+ titleText: "Event registration",
27231
+ bodyText: "Preparing dates, tickets, and booking details.",
27232
+ stepLabels: EVENT_REGISTRATION_GENERIC_SHELL_STEP_LABELS,
26050
27233
  summaryButtonText: source.buttonText?.trim() || "Register"
26051
27234
  };
26052
27235
  }
@@ -26073,6 +27256,18 @@ var eventRegistrationBlockRuntime = defineClientOwnedBlockRuntime({
26073
27256
  }
26074
27257
  })
26075
27258
  });
27259
+ function normalizeEventRegistrationEventInput(value) {
27260
+ if (!isRecord6(value)) {
27261
+ return value;
27262
+ }
27263
+ return {
27264
+ ...value,
27265
+ pricing: resolveRuntimeEventPricing(value)
27266
+ };
27267
+ }
27268
+ function isRecord6(value) {
27269
+ return typeof value === "object" && value !== null && !Array.isArray(value);
27270
+ }
26076
27271
  var eventRegistrationInteractiveIslandPropsCodec = createInteractiveIslandCodec({
26077
27272
  runtime: eventRegistrationBlockRuntime,
26078
27273
  mode: "event-registration",
@@ -27922,7 +29117,9 @@ function formatPublicEventPriceDisplay(display) {
27922
29117
  }
27923
29118
  }
27924
29119
  function formatEventPrice(event) {
27925
- return formatPublicEventPriceDisplay(publicEventPricingDisplay(event.pricing));
29120
+ return formatPublicEventPriceDisplay(
29121
+ publicEventPricingDisplay(resolveRuntimeEventPricing(event))
29122
+ );
27926
29123
  }
27927
29124
  function resolveEventCta(event, buttonText) {
27928
29125
  const { isFull: isSoldOut } = getEventAvailability(event);
@@ -30988,7 +32185,7 @@ function inferLegacyOfferingsPreviewGroupOrder(overrides) {
30988
32185
  return keys.length >= 2 ? keys : [];
30989
32186
  }
30990
32187
  function normalizeOfferingsPreviewContentForWrite(value) {
30991
- if (!isRecord5(value)) return null;
32188
+ if (!isRecord7(value)) return null;
30992
32189
  const groupOrderValue = value.groupOrder;
30993
32190
  if (Array.isArray(groupOrderValue)) {
30994
32191
  const normalized = normalizeOfferingsPreviewGroupOrder(groupOrderValue);
@@ -31001,7 +32198,7 @@ function normalizeOfferingsPreviewContentForWrite(value) {
31001
32198
  return { ...value, groupOrder: [] };
31002
32199
  }
31003
32200
  const legacyOrder = inferLegacyOfferingsPreviewGroupOrder(
31004
- Array.isArray(value.groupOverrides) ? value.groupOverrides.filter(isRecord5) : []
32201
+ Array.isArray(value.groupOverrides) ? value.groupOverrides.filter(isRecord7) : []
31005
32202
  );
31006
32203
  return legacyOrder.length > 0 ? { ...value, groupOrder: legacyOrder } : value;
31007
32204
  }
@@ -31055,7 +32252,7 @@ function uniqueOfferingsPreviewSourceKeys(values) {
31055
32252
  }
31056
32253
  return keys;
31057
32254
  }
31058
- function isRecord5(value) {
32255
+ function isRecord7(value) {
31059
32256
  return typeof value === "object" && value !== null && !Array.isArray(value);
31060
32257
  }
31061
32258
  function mergeOrderedKeysWithDefaults(orderedKeys, defaultKeys) {
@@ -31517,7 +32714,7 @@ function isOfferingsPreviewItemLimit(value) {
31517
32714
  return value === "1" || value === "2" || value === "3" || value === "4" || value === "5" || value === "6" || value === null;
31518
32715
  }
31519
32716
  function normalizeOfferingsPreviewGroupOverride(value) {
31520
- if (!isRecord6(value)) return [];
32717
+ if (!isRecord8(value)) return [];
31521
32718
  const override = {};
31522
32719
  if (isOfferingsPreviewSourceKey(value.sourceKey) || value.sourceKey === null) {
31523
32720
  override.sourceKey = value.sourceKey;
@@ -31549,12 +32746,12 @@ function isButtonVariant(value) {
31549
32746
  return value === "primary" || value === "secondary" || value === "outline" || value === "link" || value === null;
31550
32747
  }
31551
32748
  function normalizeCardStylesContent(value) {
31552
- return isRecord6(value) || value === null ? value : void 0;
32749
+ return isRecord8(value) || value === null ? value : void 0;
31553
32750
  }
31554
32751
  function normalizeSectionStylesContent(value) {
31555
- return isRecord6(value) || value === null ? value : void 0;
32752
+ return isRecord8(value) || value === null ? value : void 0;
31556
32753
  }
31557
- function isRecord6(value) {
32754
+ function isRecord8(value) {
31558
32755
  return typeof value === "object" && value !== null && !Array.isArray(value);
31559
32756
  }
31560
32757
 
@@ -35633,11 +36830,13 @@ var heroImageSurfaceMotions = [
35633
36830
  ];
35634
36831
  var standardEyebrowTreatments = [
35635
36832
  "plain",
36833
+ "accent",
35636
36834
  "pill",
35637
36835
  "accent-pill"
35638
36836
  ];
35639
36837
  var animatedEyebrowTreatments = [
35640
36838
  "plain",
36839
+ "accent",
35641
36840
  "pill",
35642
36841
  "accent-pill",
35643
36842
  "pill-bounce",
@@ -35938,6 +37137,17 @@ var systemBlockDefinitionsRaw = [
35938
37137
  layoutProfile({ variantKey: "two-column", family: "split", weight: "standard" })
35939
37138
  ]
35940
37139
  })),
37140
+ withDesignCapability("block.contact-newsletter", contactNewsletterBlockDefinition, sectionOnly(), defineBlockDesignMetadata({
37141
+ flow: conversionFlow,
37142
+ layoutProfiles: [
37143
+ layoutProfile({
37144
+ variantKey: "default",
37145
+ family: "split",
37146
+ weight: "featured",
37147
+ bias: "soft"
37148
+ })
37149
+ ]
37150
+ })),
35941
37151
  withDesignCapability("block.faq", faqBlockDefinition, withEyebrowCapability(declareBlockDesignCapability({
35942
37152
  sectionSurfaces: "supported",
35943
37153
  contentFrames: ["plain", "panel"],
@@ -36029,6 +37239,12 @@ var systemBlockDefinitionsRaw = [
36029
37239
  family: "media-text",
36030
37240
  weight: "featured",
36031
37241
  bias: "soft"
37242
+ }),
37243
+ layoutProfile({
37244
+ variantKey: "bio",
37245
+ family: "media-text",
37246
+ weight: "featured",
37247
+ bias: "soft"
36032
37248
  })
36033
37249
  ]
36034
37250
  })),
@@ -36839,7 +38055,7 @@ import React4 from "react";
36839
38055
  // ../blocks/src/system/data/linkedContentEntries.ts
36840
38056
  var LINKED_CONTENT_ENTRY_META_KEY = "__rbLinkedContentEntry";
36841
38057
  function coerceLinkedContentEntriesPayload(payload) {
36842
- if (!isRecord7(payload)) return payload;
38058
+ if (!isRecord9(payload)) return payload;
36843
38059
  const response = payload;
36844
38060
  if (!Array.isArray(response.entries)) return payload;
36845
38061
  const contentType = parsePublicContentTypeMeta(response.contentType);
@@ -36847,16 +38063,16 @@ function coerceLinkedContentEntriesPayload(payload) {
36847
38063
  return response.entries.map((entry) => enrichLinkedContentEntry(entry, contentType));
36848
38064
  }
36849
38065
  function getLinkedContentEntryMeta(value) {
36850
- if (!isRecord7(value)) return null;
38066
+ if (!isRecord9(value)) return null;
36851
38067
  const candidate = value[LINKED_CONTENT_ENTRY_META_KEY];
36852
38068
  return isLinkedContentEntryMeta(candidate) ? candidate : null;
36853
38069
  }
36854
38070
  function buildLinkedContentEditTarget(input) {
36855
38071
  const { entry, sourceBlockId, sourceBlockKind, itemIndex } = input;
36856
- if (!isRecord7(entry)) return null;
38072
+ if (!isRecord9(entry)) return null;
36857
38073
  const meta = getLinkedContentEntryMeta(entry);
36858
38074
  if (!meta || meta.support.kind !== "supported") return null;
36859
- const content = isRecord7(entry.content) ? entry.content : {};
38075
+ const content = isRecord9(entry.content) ? entry.content : {};
36860
38076
  return {
36861
38077
  kind: "linked-content-entry",
36862
38078
  entryId: meta.entryId,
@@ -36906,12 +38122,12 @@ function resolveLinkedEntryInlineFieldEligibility(input) {
36906
38122
  };
36907
38123
  }
36908
38124
  function enrichLinkedContentEntry(entry, contentType) {
36909
- if (!isRecord7(entry)) return entry;
38125
+ if (!isRecord9(entry)) return entry;
36910
38126
  const entryId = typeof entry.id === "string" ? entry.id : null;
36911
38127
  if (!entryId) return entry;
36912
38128
  const title = typeof entry.title === "string" && entry.title.trim().length > 0 ? entry.title : entryId;
36913
38129
  const optimisticHash = typeof entry.optimisticHash === "string" && entry.optimisticHash.length > 0 ? entry.optimisticHash : null;
36914
- const content = isRecord7(entry.content) ? entry.content : {};
38130
+ const content = isRecord9(entry.content) ? entry.content : {};
36915
38131
  const meta = {
36916
38132
  kind: "linked-content-entry",
36917
38133
  entryId,
@@ -37007,7 +38223,7 @@ function capitalize(value) {
37007
38223
  return value.charAt(0).toUpperCase() + value.slice(1).toLowerCase();
37008
38224
  }
37009
38225
  function parsePublicContentTypeMeta(value) {
37010
- if (!isRecord7(value)) return null;
38226
+ if (!isRecord9(value)) return null;
37011
38227
  if (typeof value.key !== "string" || value.key.trim().length === 0) return null;
37012
38228
  return {
37013
38229
  key: value.key,
@@ -37017,7 +38233,7 @@ function parsePublicContentTypeMeta(value) {
37017
38233
  };
37018
38234
  }
37019
38235
  function parsePublicContentTypeLinkedEntryEditing(value) {
37020
- if (!isRecord7(value) || typeof value.kind !== "string") return null;
38236
+ if (!isRecord9(value) || typeof value.kind !== "string") return null;
37021
38237
  switch (value.kind) {
37022
38238
  case "generic":
37023
38239
  return { kind: "generic" };
@@ -37031,7 +38247,7 @@ function parsePublicContentTypeLinkedEntryEditing(value) {
37031
38247
  }
37032
38248
  }
37033
38249
  function parsePublicContentTypeFieldMeta(value) {
37034
- if (!isRecord7(value)) return [];
38250
+ if (!isRecord9(value)) return [];
37035
38251
  if (typeof value.id !== "string" || typeof value.type !== "string") return [];
37036
38252
  return [{
37037
38253
  id: value.id,
@@ -37046,14 +38262,14 @@ function parseStringArray(value) {
37046
38262
  return value.filter((item) => typeof item === "string");
37047
38263
  }
37048
38264
  function isLinkedContentEntryMeta(value) {
37049
- if (!isRecord7(value)) return false;
38265
+ if (!isRecord9(value)) return false;
37050
38266
  if (value.kind !== "linked-content-entry") return false;
37051
38267
  if (typeof value.entryId !== "string") return false;
37052
38268
  if (typeof value.contentTypeKey !== "string") return false;
37053
38269
  if (typeof value.contentTypeLabel !== "string") return false;
37054
38270
  if (typeof value.title !== "string") return false;
37055
38271
  if (!(value.optimisticHash === null || typeof value.optimisticHash === "string")) return false;
37056
- if (!isRecord7(value.contentType)) return false;
38272
+ if (!isRecord9(value.contentType)) return false;
37057
38273
  if (!isLinkedEntryFieldSourceArray(value.fieldSources)) return false;
37058
38274
  return isLinkedContentEditSupport(value.support);
37059
38275
  }
@@ -37061,7 +38277,7 @@ function isLinkedEntryFieldSourceArray(value) {
37061
38277
  return Array.isArray(value) && value.every(isLinkedEntryFieldSource);
37062
38278
  }
37063
38279
  function isLinkedEntryFieldSource(value) {
37064
- if (!isRecord7(value)) return false;
38280
+ if (!isRecord9(value)) return false;
37065
38281
  if (typeof value.displayPath !== "string") return false;
37066
38282
  switch (value.kind) {
37067
38283
  case "content-field":
@@ -37087,7 +38303,7 @@ function isLinkedEntryInlineFieldReadOnlyReason(value) {
37087
38303
  }
37088
38304
  }
37089
38305
  function isLinkedContentEditSupport(value) {
37090
- if (!isRecord7(value) || typeof value.kind !== "string") return false;
38306
+ if (!isRecord9(value) || typeof value.kind !== "string") return false;
37091
38307
  switch (value.kind) {
37092
38308
  case "supported":
37093
38309
  return true;
@@ -37099,7 +38315,7 @@ function isLinkedContentEditSupport(value) {
37099
38315
  return false;
37100
38316
  }
37101
38317
  }
37102
- function isRecord7(value) {
38318
+ function isRecord9(value) {
37103
38319
  return typeof value === "object" && value !== null && !Array.isArray(value);
37104
38320
  }
37105
38321
 
@@ -38626,12 +39842,12 @@ function toTrimmedString(value) {
38626
39842
  return trimmed ? trimmed : void 0;
38627
39843
  }
38628
39844
  function normalizeBookingFormConfig(form2) {
38629
- if (!isRecord8(form2)) return null;
39845
+ if (!isRecord10(form2)) return null;
38630
39846
  const id = readNonEmptyString(form2.id);
38631
39847
  const name = readNonEmptyString(form2.name);
38632
39848
  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;
39849
+ const schemaSource = isRecord10(form2.schema) ? form2.schema : isRecord10(form2.schemaJson) ? form2.schemaJson : null;
39850
+ const settingsSource = isRecord10(form2.settings) ? form2.settings : isRecord10(form2.settingsJson) ? form2.settingsJson : null;
38635
39851
  return {
38636
39852
  id,
38637
39853
  name,
@@ -38655,10 +39871,10 @@ function normalizeBookingServices(services) {
38655
39871
  if (Array.isArray(services)) {
38656
39872
  return services.filter(isBookingFormService).map(normalizeService);
38657
39873
  }
38658
- if (isRecord8(services) && "services" in services) {
39874
+ if (isRecord10(services) && "services" in services) {
38659
39875
  return Array.isArray(services.services) ? services.services.filter(isBookingFormService).map(normalizeService) : [];
38660
39876
  }
38661
- return isRecord8(services) ? Object.values(services).filter(isBookingFormService).map(normalizeService) : [];
39877
+ return isRecord10(services) ? Object.values(services).filter(isBookingFormService).map(normalizeService) : [];
38662
39878
  }
38663
39879
  function normalizeBookingSchema(value) {
38664
39880
  if (!value) return void 0;
@@ -38670,7 +39886,7 @@ function normalizeBookingSchema(value) {
38670
39886
  };
38671
39887
  }
38672
39888
  function readBookingFormField(value) {
38673
- if (!isRecord8(value)) return null;
39889
+ if (!isRecord10(value)) return null;
38674
39890
  const id = readNonEmptyString(value.id);
38675
39891
  const label = readNonEmptyString(value.label);
38676
39892
  const type = readBookingFieldType(value.type);
@@ -38716,7 +39932,7 @@ function readBookingFieldOptions(value) {
38716
39932
  return options.length > 0 ? options : void 0;
38717
39933
  }
38718
39934
  function readBookingFieldOption(value) {
38719
- if (!isRecord8(value)) return null;
39935
+ if (!isRecord10(value)) return null;
38720
39936
  const optionValue = readNonEmptyString(value.value);
38721
39937
  const label = readNonEmptyString(value.label);
38722
39938
  return optionValue && label ? { value: optionValue, label } : null;
@@ -38733,7 +39949,7 @@ function normalizeBookingSettings(value) {
38733
39949
  };
38734
39950
  }
38735
39951
  function isBookingFormService(value) {
38736
- return isRecord8(value) && typeof value.id === "string" && typeof value.siteId === "string" && typeof value.title === "string";
39952
+ return isRecord10(value) && typeof value.id === "string" && typeof value.siteId === "string" && typeof value.title === "string";
38737
39953
  }
38738
39954
  function readNonEmptyString(value) {
38739
39955
  if (typeof value !== "string") return null;
@@ -38751,7 +39967,7 @@ function readStringArray(value) {
38751
39967
  const strings = value.filter((item) => typeof item === "string");
38752
39968
  return strings.length > 0 ? strings : void 0;
38753
39969
  }
38754
- function isRecord8(value) {
39970
+ function isRecord10(value) {
38755
39971
  return typeof value === "object" && value !== null;
38756
39972
  }
38757
39973
 
@@ -39199,8 +40415,9 @@ function EventDetailsView({
39199
40415
  priceCents: selected.course.priceCents,
39200
40416
  currency: selected.course.currency
39201
40417
  }) : null;
39202
- const eventPricingType = publicEventPricingType(selected.pricing);
39203
- const eventPricingCurrency = publicEventPricingCurrency(selected.pricing) ?? "USD";
40418
+ const eventPricing = resolveRuntimeEventPricing(selected);
40419
+ const eventPricingType = publicEventPricingType(eventPricing);
40420
+ const eventPricingCurrency = publicEventPricingCurrency(eventPricing) ?? "USD";
39204
40421
  const isPaid = eventPricingType === "paid";
39205
40422
  const shouldShowCoursePricing = showCost && !isDropIn && coursePricing !== null;
39206
40423
  const shouldShowEventCost = showCost && isPaid && !isDropIn && coursePricing === null;
@@ -41368,6 +42585,9 @@ var EventListingSSR = (props2) => {
41368
42585
 
41369
42586
  // ../blocks/src/system/runtime/nodes/event-registration.server.tsx
41370
42587
  import { jsx as jsx48, jsxs as jsxs34 } from "react/jsx-runtime";
42588
+ function cx(...classes) {
42589
+ return classes.filter((className) => Boolean(className)).join(" ");
42590
+ }
41371
42591
  function EventRegistrationSSR({
41372
42592
  blockId,
41373
42593
  siteId,
@@ -41410,6 +42630,7 @@ function EventRegistrationSSR({
41410
42630
  stage,
41411
42631
  supportEmail
41412
42632
  });
42633
+ const display = islandProps.render.display;
41413
42634
  return /* @__PURE__ */ jsxs34(
41414
42635
  "div",
41415
42636
  {
@@ -41421,12 +42642,52 @@ function EventRegistrationSSR({
41421
42642
  ...getIslandRootProps("event-registration", blockId),
41422
42643
  children: [
41423
42644
  /* @__PURE__ */ jsx48(IslandPropsScript, { value: islandProps }),
41424
- /* @__PURE__ */ jsx48("div", { className: "event-registration__summary", children: /* @__PURE__ */ jsx48("strong", { children: "Loading booking options..." }) }),
42645
+ /* @__PURE__ */ jsx48(EventRegistrationShell, { display }),
41425
42646
  children
41426
42647
  ]
41427
42648
  }
41428
42649
  );
41429
42650
  }
42651
+ function EventRegistrationShell({
42652
+ display
42653
+ }) {
42654
+ return /* @__PURE__ */ jsx48("div", { className: "er-container er-registration-shell", "aria-busy": "true", role: "status", children: /* @__PURE__ */ jsxs34("div", { className: "er-payment-layout er-payment-layout--no-sidebar", children: [
42655
+ /* @__PURE__ */ jsxs34("div", { className: "er-payment-layout-main", children: [
42656
+ /* @__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) => {
42657
+ const isActive = index === 0;
42658
+ return /* @__PURE__ */ jsxs34("li", { className: "er-step", children: [
42659
+ /* @__PURE__ */ jsx48("span", { className: cx("er-step-circle", isActive && "er-step-circle--active"), children: index + 1 }),
42660
+ /* @__PURE__ */ jsx48("span", { className: cx("er-step-label", isActive && "er-step-label--active"), children: label }),
42661
+ index < display.stepLabels.length - 1 ? /* @__PURE__ */ jsx48("span", { className: "er-step-connector" }) : null
42662
+ ] }, label);
42663
+ }) }) }),
42664
+ /* @__PURE__ */ jsxs34("div", { className: "er-stack", children: [
42665
+ /* @__PURE__ */ jsxs34("div", { children: [
42666
+ /* @__PURE__ */ jsx48("p", { className: "er-registration-shell__eyebrow", children: "Registration" }),
42667
+ /* @__PURE__ */ jsx48("h3", { className: "er-title er-registration-shell__title", children: display.titleText }),
42668
+ /* @__PURE__ */ jsx48("p", { className: "er-text er-text--muted er-registration-shell__copy", children: display.bodyText })
42669
+ ] }),
42670
+ /* @__PURE__ */ jsxs34("div", { className: "er-event-grid er-registration-shell__cards", "aria-hidden": "true", children: [
42671
+ /* @__PURE__ */ jsxs34("div", { className: "er-event-card er-registration-shell__card", children: [
42672
+ /* @__PURE__ */ jsx48("div", { className: "er-registration-shell__line er-registration-shell__line--lg" }),
42673
+ /* @__PURE__ */ jsx48("div", { className: "er-registration-shell__line er-registration-shell__line--sm" })
42674
+ ] }),
42675
+ /* @__PURE__ */ jsxs34("div", { className: "er-event-card er-registration-shell__card", children: [
42676
+ /* @__PURE__ */ jsx48("div", { className: "er-registration-shell__line er-registration-shell__line--md" }),
42677
+ /* @__PURE__ */ jsx48("div", { className: "er-registration-shell__line er-registration-shell__line--xs" })
42678
+ ] })
42679
+ ] })
42680
+ ] })
42681
+ ] }),
42682
+ /* @__PURE__ */ jsx48("div", { className: "er-payment-layout-footer", children: /* @__PURE__ */ jsxs34("div", { className: "er-summary-bar er-registration-shell__summary", "aria-hidden": "true", children: [
42683
+ /* @__PURE__ */ jsxs34("div", { className: "er-summary-bar-info", children: [
42684
+ /* @__PURE__ */ jsx48("div", { className: "er-registration-shell__line er-registration-shell__line--md" }),
42685
+ /* @__PURE__ */ jsx48("div", { className: "er-registration-shell__line er-registration-shell__line--xs" })
42686
+ ] }),
42687
+ /* @__PURE__ */ jsx48("div", { className: "er-registration-shell__button-placeholder", children: display.summaryButtonText })
42688
+ ] }) })
42689
+ ] }) });
42690
+ }
41430
42691
  var event_registration_server_default = EventRegistrationSSR;
41431
42692
 
41432
42693
  // ../blocks/src/system/runtime/shared/components/FeedbackMessage.tsx
@@ -42012,14 +43273,14 @@ function isDecoratedHeadingBlockKind(blockKind) {
42012
43273
  return blockKind === "block.intro" || blockKind === "block.feature-cards" || blockKind === "block.testimonials" || blockKind === "block.faq";
42013
43274
  }
42014
43275
  function readVariant(blockContent) {
42015
- if (!isRecord9(blockContent)) return void 0;
43276
+ if (!isRecord11(blockContent)) return void 0;
42016
43277
  const variant = blockContent.variant;
42017
43278
  return typeof variant === "string" ? variant : void 0;
42018
43279
  }
42019
43280
  function isFaqDecoratedVariant(variant) {
42020
43281
  return variant === "default" || variant === "question-columns";
42021
43282
  }
42022
- function isRecord9(value) {
43283
+ function isRecord11(value) {
42023
43284
  return typeof value === "object" && value !== null && !Array.isArray(value);
42024
43285
  }
42025
43286
  function buildHeadingDecorationWrapperClassName(className) {
@@ -43527,20 +44788,20 @@ function generateInputCss({
43527
44788
  baseInputRules.push("background-color: transparent");
43528
44789
  } else {
43529
44790
  baseInputRules.push(
43530
- `background-color: rgb(var(--tb-${inputSystem.base.background.colorToken}))`
44791
+ `background-color: ${rgbColorValue(inputSystem.base.background.colorToken)}`
43531
44792
  );
43532
44793
  }
43533
- baseInputRules.push(`color: rgb(var(--tb-${inputSystem.base.textColorToken}))`);
44794
+ baseInputRules.push(`color: ${rgbColorValue(inputSystem.base.textColorToken)}`);
43534
44795
  const borderPx = parseBorderWidth(inputSystem.base.border.widthClass);
43535
44796
  const borderStyle = inputSystem.base.border.style ?? "all";
43536
44797
  if (borderStyle === "underline") {
43537
44798
  baseInputRules.push("border: none");
43538
44799
  baseInputRules.push(
43539
- `border-bottom: ${borderPx} solid rgb(var(--tb-${inputSystem.base.border.colorToken}))`
44800
+ `border-bottom: ${borderPx} solid ${rgbColorValue(inputSystem.base.border.colorToken)}`
43540
44801
  );
43541
44802
  } else {
43542
44803
  baseInputRules.push(
43543
- `border: ${borderPx} solid rgb(var(--tb-${inputSystem.base.border.colorToken}))`
44804
+ `border: ${borderPx} solid ${rgbColorValue(inputSystem.base.border.colorToken)}`
43544
44805
  );
43545
44806
  }
43546
44807
  if (borderStyle === "underline") {
@@ -43567,7 +44828,7 @@ function generateInputCss({
43567
44828
  baseInputRules.push("transition: border-color 0.2s ease, box-shadow 0.2s ease");
43568
44829
  const labelSelector = `${rootSelector} .form-label`;
43569
44830
  const labelRules = [];
43570
- labelRules.push(`color: rgb(var(--tb-${inputSystem.label.textColorToken}))`);
44831
+ labelRules.push(`color: ${rgbColorValue(inputSystem.label.textColorToken)}`);
43571
44832
  labelRules.push(`font-weight: ${FONT_WEIGHT_MAP[inputSystem.label.fontWeight]}`);
43572
44833
  labelRules.push(`font-size: ${LABEL_FONT_SIZE_MAP[inputSystem.label.fontSize]}`);
43573
44834
  if (inputSystem.label.textTransform && inputSystem.label.textTransform !== "none") {
@@ -43608,9 +44869,9 @@ function generateInputCss({
43608
44869
  ];
43609
44870
  const focusRules = [];
43610
44871
  focusRules.push("outline: none");
43611
- focusRules.push(`box-shadow: 0 0 0 ${inputSystem.focus.ringWidth}px rgb(var(--tb-${inputSystem.focus.ringColorToken}))`);
44872
+ focusRules.push(`box-shadow: 0 0 0 ${inputSystem.focus.ringWidth}px ${rgbColorValue(inputSystem.focus.ringColorToken)}`);
43612
44873
  if (inputSystem.focus.borderColorToken) {
43613
- focusRules.push(`border-color: rgb(var(--tb-${inputSystem.focus.borderColorToken}))`);
44874
+ focusRules.push(`border-color: ${rgbColorValue(inputSystem.focus.borderColorToken)}`);
43614
44875
  }
43615
44876
  const errorSelectors = [
43616
44877
  `${inputSelector}[aria-invalid="true"]`,
@@ -43618,16 +44879,16 @@ function generateInputCss({
43618
44879
  `${selectSelector}[aria-invalid="true"]`
43619
44880
  ];
43620
44881
  const errorRules = [];
43621
- errorRules.push(`border-color: rgb(var(--tb-${inputSystem.error.borderColorToken}))`);
43622
- errorRules.push(`color: rgb(var(--tb-${inputSystem.error.textColorToken}))`);
44882
+ errorRules.push(`border-color: ${rgbColorValue(inputSystem.error.borderColorToken)}`);
44883
+ errorRules.push(`color: ${rgbColorValue(inputSystem.error.textColorToken)}`);
43623
44884
  const disabledSelectors = [
43624
44885
  `${inputSelector}:disabled`,
43625
44886
  `${textareaSelector}:disabled`,
43626
44887
  `${selectSelector}:disabled`
43627
44888
  ];
43628
44889
  const disabledRules = [];
43629
- disabledRules.push(`background-color: rgb(var(--tb-${inputSystem.disabled.backgroundColorToken}))`);
43630
- disabledRules.push(`color: rgb(var(--tb-${inputSystem.disabled.textColorToken}))`);
44890
+ disabledRules.push(`background-color: ${rgbColorValue(inputSystem.disabled.backgroundColorToken)}`);
44891
+ disabledRules.push(`color: ${rgbColorValue(inputSystem.disabled.textColorToken)}`);
43631
44892
  disabledRules.push(`opacity: ${inputSystem.disabled.opacity}`);
43632
44893
  disabledRules.push("cursor: not-allowed");
43633
44894
  const checkboxSelector = `${rootSelector} .form-checkbox`;
@@ -43637,12 +44898,12 @@ function generateInputCss({
43637
44898
  checkableRules.push("width: 1rem");
43638
44899
  checkableRules.push("height: 1rem");
43639
44900
  checkableRules.push("flex-shrink: 0");
43640
- checkableRules.push(`border: ${borderPx} solid rgb(var(--tb-${inputSystem.base.border.colorToken}))`);
44901
+ checkableRules.push(`border: ${borderPx} solid ${rgbColorValue(inputSystem.base.border.colorToken)}`);
43641
44902
  if (inputSystem.base.background.type === "transparent") {
43642
44903
  checkableRules.push("background-color: transparent");
43643
44904
  } else {
43644
44905
  checkableRules.push(
43645
- `background-color: rgb(var(--tb-${inputSystem.base.background.colorToken}))`
44906
+ `background-color: ${rgbColorValue(inputSystem.base.background.colorToken)}`
43646
44907
  );
43647
44908
  }
43648
44909
  checkableRules.push("cursor: pointer");
@@ -43653,22 +44914,22 @@ function generateInputCss({
43653
44914
  radioSpecificRules.push("border-radius: 9999px");
43654
44915
  const checkboxCheckedSelector = `${checkboxSelector}:checked`;
43655
44916
  const checkboxCheckedRules = [];
43656
- checkboxCheckedRules.push(`background-color: rgb(var(--tb-${inputSystem.focus.ringColorToken}))`);
43657
- checkboxCheckedRules.push(`border-color: rgb(var(--tb-${inputSystem.focus.ringColorToken}))`);
44917
+ checkboxCheckedRules.push(`background-color: ${rgbColorValue(inputSystem.focus.ringColorToken)}`);
44918
+ checkboxCheckedRules.push(`border-color: ${rgbColorValue(inputSystem.focus.ringColorToken)}`);
43658
44919
  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
44920
  checkboxCheckedRules.push("background-size: 100% 100%");
43660
44921
  checkboxCheckedRules.push("background-position: center");
43661
44922
  checkboxCheckedRules.push("background-repeat: no-repeat");
43662
44923
  const radioCheckedSelector = `${radioSelector}:checked`;
43663
44924
  const radioCheckedRules = [];
43664
- radioCheckedRules.push(`background-color: rgb(var(--tb-${inputSystem.focus.ringColorToken}))`);
43665
- radioCheckedRules.push(`border-color: rgb(var(--tb-${inputSystem.focus.ringColorToken}))`);
44925
+ radioCheckedRules.push(`background-color: ${rgbColorValue(inputSystem.focus.ringColorToken)}`);
44926
+ radioCheckedRules.push(`border-color: ${rgbColorValue(inputSystem.focus.ringColorToken)}`);
43666
44927
  radioCheckedRules.push("background-image: radial-gradient(circle, white 40%, transparent 40%)");
43667
44928
  const checkboxFocusSelector = `${checkboxSelector}:focus-visible`;
43668
44929
  const radioFocusSelector = `${radioSelector}:focus-visible`;
43669
44930
  const checkableFocusRules = [];
43670
44931
  checkableFocusRules.push("outline: none");
43671
- checkableFocusRules.push(`box-shadow: 0 0 0 ${inputSystem.focus.ringWidth}px rgb(var(--tb-${inputSystem.focus.ringColorToken}))`);
44932
+ checkableFocusRules.push(`box-shadow: 0 0 0 ${inputSystem.focus.ringWidth}px ${rgbColorValue(inputSystem.focus.ringColorToken)}`);
43672
44933
  const cssBlocks = [];
43673
44934
  cssBlocks.push(`${labelSelector} {
43674
44935
  ${labelRules.join(";\n ")};
@@ -45516,6 +46777,11 @@ ${root} {
45516
46777
  --er-event-card-bg: rgb(var(--tb-surface));
45517
46778
  --er-event-card-border-width: var(--rb-border-width, 1px);
45518
46779
  --er-event-card-hover-opacity: 1;
46780
+ --er-control-bg: rgb(var(--tb-background, var(--tb-surface)));
46781
+ --er-control-text: rgb(var(--tb-foreground, var(--tb-text)));
46782
+ --er-radius: var(--rb-block-radius);
46783
+ --er-surface-muted: rgba(var(--tb-muted, 241 245 249), 0.42);
46784
+ --er-shell-line: rgba(var(--tb-mutedText, 100 116 139), 0.22);
45519
46785
 
45520
46786
  /* Step indicator */
45521
46787
  --er-step-active: rgb(var(--tb-primary));
@@ -46516,7 +47782,7 @@ function buildThemeCssVars(theme) {
46516
47782
  // These expose inputStyle/InputSystem values for blocks that can't use .form-* classes
46517
47783
  [THEME_RADIUS_CSS_VARS.input]: inputRadius,
46518
47784
  ["--rb-input-focus-width"]: `${inputSystem.focus.ringWidth}px`,
46519
- ["--rb-input-focus-color"]: `rgb(var(--tb-${inputSystem.focus.ringColorToken}))`,
47785
+ ["--rb-input-focus-color"]: rgbColorValue(inputSystem.focus.ringColorToken),
46520
47786
  // Deprecated compatibility aliases for pre-v2 block/custom CSS. New CSS should
46521
47787
  // consume the semantic --rb-* primitives above.
46522
47788
  [THEME_RADIUS_CSS_VARS.legacyCard]: blockRadius,
@@ -46842,8 +48108,8 @@ function hydrateValue(value, context) {
46842
48108
  return isUnchanged ? value : Object.fromEntries(resolvedEntries);
46843
48109
  }
46844
48110
  return value;
46845
- } catch (err2) {
46846
- console.error("[hydrateLinks] Error hydrating value:", err2, value);
48111
+ } catch (err3) {
48112
+ console.error("[hydrateLinks] Error hydrating value:", err3, value);
46847
48113
  return value;
46848
48114
  }
46849
48115
  }
@@ -47283,6 +48549,11 @@ var MemoBlockSection = React6.memo(
47283
48549
  siteId: dataContext?.siteId,
47284
48550
  apiBaseUrl: dataContext?.apiBaseUrl,
47285
48551
  portalToken: dataContext?.portalToken ?? null,
48552
+ previewToken: dataContext?.previewToken ?? null,
48553
+ stage: dataContext?.previewStage,
48554
+ occurrenceContext: dataContext?.occurrenceContext ?? null,
48555
+ entrySubrouteContext: dataContext?.entrySubrouteContext ?? null,
48556
+ contentEntry: dataContext?.contentEntry ?? null,
47286
48557
  supabaseUrl: dataContext?.supabaseUrl,
47287
48558
  imageResolveContext: resolvedImageResolveContext,
47288
48559
  blockId: block.id ?? null,
@@ -47406,6 +48677,11 @@ var MemoBlockSection = React6.memo(
47406
48677
  siteId: dataContext?.siteId,
47407
48678
  apiBaseUrl: dataContext?.apiBaseUrl,
47408
48679
  portalToken: dataContext?.portalToken ?? null,
48680
+ previewToken: dataContext?.previewToken ?? null,
48681
+ stage: dataContext?.previewStage,
48682
+ occurrenceContext: dataContext?.occurrenceContext ?? null,
48683
+ entrySubrouteContext: dataContext?.entrySubrouteContext ?? null,
48684
+ contentEntry: dataContext?.contentEntry ?? null,
47409
48685
  supabaseUrl: dataContext?.supabaseUrl,
47410
48686
  imageResolveContext: resolvedImageResolveContext,
47411
48687
  blockId: block.id ?? null,
@@ -47592,6 +48868,9 @@ var containerResponsiveThemeCss = `/*
47592
48868
  letter-spacing: 0.025em;
47593
48869
  text-transform: uppercase;
47594
48870
  }
48871
+ .rb-eyebrow-treatment-accent {
48872
+ color: rgb(var(--tb-accent));
48873
+ }
47595
48874
  .rb-eyebrow-treatment-pill {
47596
48875
  align-self: center;
47597
48876
  display: inline-flex;
@@ -47646,6 +48925,27 @@ var containerResponsiveThemeCss = `/*
47646
48925
  font-weight: 400;
47647
48926
  }
47648
48927
 
48928
+ /* Media shape treatments */
48929
+ .rb-media-shape-square,
48930
+ .rb-media-shape-rounded,
48931
+ .rb-media-shape-circle,
48932
+ .rb-media-shape-arch {
48933
+ overflow: hidden;
48934
+ }
48935
+ .rb-media-shape-square {
48936
+ border-radius: 0;
48937
+ }
48938
+ .rb-media-shape-rounded {
48939
+ border-radius: var(--rb-media-shape-radius, 1rem);
48940
+ }
48941
+ .rb-media-shape-circle {
48942
+ border-radius: 9999px;
48943
+ }
48944
+ .rb-media-shape-arch {
48945
+ border-radius: 9999px 9999px var(--rb-media-shape-arch-base-radius, 0.125rem)
48946
+ var(--rb-media-shape-arch-base-radius, 0.125rem);
48947
+ }
48948
+
47649
48949
  /* Navigation typography */
47650
48950
  .rb-nav-text {
47651
48951
  font-size: 0.875rem;
@@ -50800,7 +52100,7 @@ var containerResponsiveThemeCss = `/*
50800
52100
  :where(.theme-scope) :where([data-block="event-registration"]) .er-container {
50801
52101
  border-radius: var(--rb-block-radius);
50802
52102
  border: 1px solid var(--er-border);
50803
- padding: 1.5rem;
52103
+ padding: clamp(1rem, 2vw, 1.5rem);
50804
52104
  background: rgb(var(--tb-surface));
50805
52105
  color: var(--er-on-surface);
50806
52106
  transition: border-color var(--rb-block-transition) ease;
@@ -50809,6 +52109,109 @@ var containerResponsiveThemeCss = `/*
50809
52109
  margin-inline: 0;
50810
52110
  }
50811
52111
 
52112
+ /* SSR shell / required-island fallback */
52113
+ :where(.theme-scope) :where([data-block="event-registration"]) .er-registration-shell {
52114
+ min-height: 24rem;
52115
+ }
52116
+
52117
+ :where(.theme-scope) :where([data-block="event-registration"]) .er-registration-shell__steps {
52118
+ margin-bottom: 1.25rem;
52119
+ }
52120
+
52121
+ :where(.theme-scope) :where([data-block="event-registration"]) .er-registration-shell__eyebrow {
52122
+ margin: 0 0 0.35rem;
52123
+ color: var(--er-on-surface-subtle);
52124
+ font-size: 0.75rem;
52125
+ font-weight: 700;
52126
+ letter-spacing: 0.04em;
52127
+ line-height: 1.2;
52128
+ text-transform: uppercase;
52129
+ }
52130
+
52131
+ :where(.theme-scope) :where([data-block="event-registration"]) .er-registration-shell__title {
52132
+ margin: 0;
52133
+ }
52134
+
52135
+ :where(.theme-scope) :where([data-block="event-registration"]) .er-registration-shell__copy {
52136
+ margin: 0.35rem 0 0;
52137
+ max-width: 36rem;
52138
+ line-height: 1.45;
52139
+ }
52140
+
52141
+ :where(.theme-scope) :where([data-block="event-registration"]) .er-registration-shell__cards {
52142
+ margin-top: 0.25rem;
52143
+ overflow: hidden;
52144
+ border: 1px solid var(--er-border);
52145
+ border-radius: var(--rb-block-radius);
52146
+ background: var(--er-control-bg);
52147
+ }
52148
+
52149
+ :where(.theme-scope) :where([data-block="event-registration"]) .er-registration-shell__card {
52150
+ display: grid;
52151
+ gap: 0.5rem;
52152
+ padding: 1rem;
52153
+ }
52154
+
52155
+ :where(.theme-scope) :where([data-block="event-registration"]) .er-registration-shell__line {
52156
+ height: 0.75rem;
52157
+ border-radius: 9999px;
52158
+ background: linear-gradient(
52159
+ 90deg,
52160
+ var(--er-shell-line),
52161
+ rgba(var(--tb-primary), 0.12),
52162
+ var(--er-shell-line)
52163
+ );
52164
+ }
52165
+
52166
+ :where(.theme-scope) :where([data-block="event-registration"]) .er-registration-shell__line--lg {
52167
+ width: min(26rem, 82%);
52168
+ }
52169
+
52170
+ :where(.theme-scope) :where([data-block="event-registration"]) .er-registration-shell__line--md {
52171
+ width: min(19rem, 68%);
52172
+ }
52173
+
52174
+ :where(.theme-scope) :where([data-block="event-registration"]) .er-registration-shell__line--sm {
52175
+ width: min(14rem, 52%);
52176
+ }
52177
+
52178
+ :where(.theme-scope) :where([data-block="event-registration"]) .er-registration-shell__line--xs {
52179
+ width: min(10rem, 42%);
52180
+ }
52181
+
52182
+ :where(.theme-scope) :where([data-block="event-registration"]) .er-registration-shell__summary {
52183
+ align-items: center;
52184
+ border-radius: calc(var(--rb-block-radius) * 0.75);
52185
+ border: 1px solid var(--er-summary-border);
52186
+ padding: 0.875rem 1rem;
52187
+ }
52188
+
52189
+ :where(.theme-scope) :where([data-block="event-registration"]) .er-registration-shell__button-placeholder {
52190
+ display: inline-flex;
52191
+ min-height: 2.5rem;
52192
+ align-items: center;
52193
+ justify-content: center;
52194
+ border-radius: calc(var(--rb-block-radius) * 0.6);
52195
+ background: rgb(var(--tb-primary));
52196
+ color: rgb(var(--tb-primaryText, var(--tb-primaryForeground, 255 255 255)));
52197
+ padding: 0.625rem 1rem;
52198
+ font-size: 0.875rem;
52199
+ font-weight: 600;
52200
+ line-height: 1.2;
52201
+ text-align: center;
52202
+ white-space: nowrap;
52203
+ }
52204
+
52205
+ :where(.theme-scope) :where([data-block="event-registration"]) .event-registration__hydration-error {
52206
+ border-radius: var(--rb-block-radius);
52207
+ border: 1px solid var(--er-border-error);
52208
+ background: var(--er-error-bg);
52209
+ color: var(--er-error-text);
52210
+ padding: 1rem;
52211
+ font-size: 0.9375rem;
52212
+ line-height: 1.45;
52213
+ }
52214
+
50812
52215
  :where(.theme-scope) :where([data-block="event-registration"].event-registration--embedded) .er-container {
50813
52216
  max-width: none;
50814
52217
  padding: 0;
@@ -50856,6 +52259,7 @@ var containerResponsiveThemeCss = `/*
50856
52259
  padding: 1rem;
50857
52260
  border-radius: calc(var(--rb-block-radius) * 0.75);
50858
52261
  border: 1px solid var(--er-border);
52262
+ background: var(--er-surface-muted);
50859
52263
  }
50860
52264
 
50861
52265
  /* Ticket counter */
@@ -50901,14 +52305,23 @@ var containerResponsiveThemeCss = `/*
50901
52305
  /* Form inputs */
50902
52306
  :where(.theme-scope) :where([data-block="event-registration"]) .er-input {
50903
52307
  width: 100%;
50904
- padding: 0.5rem 0.75rem;
52308
+ min-height: 2.75rem;
52309
+ padding: 0.625rem 0.75rem;
50905
52310
  border-radius: calc(var(--rb-block-radius) * 0.5);
50906
52311
  border: 1px solid var(--er-border);
50907
- background: transparent;
52312
+ background: var(--er-control-bg);
52313
+ color: var(--er-control-text);
52314
+ font: inherit;
52315
+ line-height: 1.4;
50908
52316
  transition: border-color var(--rb-block-transition) ease,
52317
+ background-color var(--rb-block-transition) ease,
50909
52318
  box-shadow var(--rb-block-transition) ease;
50910
52319
  }
50911
52320
 
52321
+ :where(.theme-scope) :where([data-block="event-registration"]) .er-input::placeholder {
52322
+ color: var(--er-on-surface-faint);
52323
+ }
52324
+
50912
52325
  :where(.theme-scope) :where([data-block="event-registration"]) .er-input:focus {
50913
52326
  outline: none;
50914
52327
  border-color: var(--er-border-selected);
@@ -51030,7 +52443,7 @@ var containerResponsiveThemeCss = `/*
51030
52443
  }
51031
52444
 
51032
52445
  :where(.theme-scope) :where([data-block="event-registration"]) .er-event-grid .er-event-card {
51033
- padding: 0.75rem 0;
52446
+ padding: 0.875rem 0;
51034
52447
  border-width: 0 0 var(--rb-event-tile-border-width, var(--rb-border-width, 1px)) 0;
51035
52448
  border-style: solid;
51036
52449
  border-radius: 0;
@@ -51262,21 +52675,24 @@ var containerResponsiveThemeCss = `/*
51262
52675
  align-items: flex-start;
51263
52676
  gap: 0.75rem;
51264
52677
  padding: 1rem;
51265
- border: 2px solid var(--er-payment-border);
52678
+ border: 1px solid var(--er-payment-border);
51266
52679
  border-radius: var(--rb-block-radius);
51267
- background: transparent;
52680
+ background: var(--er-control-bg);
51268
52681
  cursor: pointer;
51269
52682
  transition: border-color var(--rb-block-transition) ease,
52683
+ box-shadow var(--rb-block-transition) ease,
51270
52684
  background-color var(--rb-block-transition) ease;
51271
52685
  }
51272
52686
 
51273
52687
  :where(.theme-scope) :where([data-block="event-registration"]) .er-payment-option:hover {
51274
52688
  border-color: var(--er-payment-border-hover);
52689
+ box-shadow: 0 8px 18px rgba(var(--tb-shadow, 15 23 42), 0.08);
51275
52690
  }
51276
52691
 
51277
52692
  :where(.theme-scope) :where([data-block="event-registration"]) .er-payment-option--selected {
51278
52693
  border-color: var(--er-payment-border-selected);
51279
52694
  background-color: var(--er-payment-bg-selected);
52695
+ box-shadow: 0 0 0 1px var(--er-payment-border-selected);
51280
52696
  }
51281
52697
 
51282
52698
  /* Discount code entry */
@@ -51964,22 +53380,25 @@ var containerResponsiveThemeCss = `/*
51964
53380
  justify-content: center;
51965
53381
  gap: 0.25rem;
51966
53382
  padding: 0.75rem 0.625rem;
51967
- border: 2px solid var(--er-payment-border);
53383
+ border: 1px solid var(--er-payment-border);
51968
53384
  border-radius: var(--rb-block-radius);
51969
- background: transparent;
53385
+ background: var(--er-control-bg);
51970
53386
  cursor: pointer;
51971
53387
  text-align: center;
51972
53388
  transition: border-color var(--rb-block-transition) ease,
53389
+ box-shadow var(--rb-block-transition) ease,
51973
53390
  background-color var(--rb-block-transition) ease;
51974
53391
  }
51975
53392
 
51976
53393
  :where(.theme-scope) :where([data-block="event-registration"]) .er-payment-tile:hover:not([aria-disabled="true"]) {
51977
53394
  border-color: var(--er-payment-border-hover);
53395
+ box-shadow: 0 8px 18px rgba(var(--tb-shadow, 15 23 42), 0.08);
51978
53396
  }
51979
53397
 
51980
53398
  :where(.theme-scope) :where([data-block="event-registration"]) .er-payment-tile--selected {
51981
53399
  border-color: var(--er-payment-border-selected);
51982
53400
  background-color: var(--er-payment-bg-selected);
53401
+ box-shadow: 0 0 0 1px var(--er-payment-border-selected);
51983
53402
  }
51984
53403
 
51985
53404
  :where(.theme-scope) :where([data-block="event-registration"]) .er-payment-tile--disabled {
@@ -52082,11 +53501,10 @@ var containerResponsiveThemeCss = `/*
52082
53501
  justify-content: space-between;
52083
53502
  align-items: flex-start;
52084
53503
  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;
53504
+ padding: 0.875rem 1rem;
53505
+ background: var(--er-surface-muted);
53506
+ border: 1px solid var(--er-summary-border);
53507
+ border-radius: calc(var(--rb-block-radius) * 0.75);
52090
53508
  }
52091
53509
 
52092
53510
  :where(.theme-scope) :where([data-block="event-registration"]) .er-summary-bar-info {
@@ -53858,18 +55276,10 @@ var containerResponsiveThemeCss = `/*
53858
55276
  /* Two-column row (opt-in per field via schema layout) */
53859
55277
  :where(.theme-scope) :where([data-block="form"]) .fb-row-2 {
53860
55278
  display: grid;
53861
- grid-template-columns: 1fr;
55279
+ grid-template-columns: repeat(auto-fit, minmax(min(14rem, 100%), 1fr));
53862
55280
  gap: 1rem;
53863
55281
  }
53864
55282
 
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
55283
  /* Field wrapper */
53874
55284
  :where(.theme-scope) :where([data-block="form"]) .fb-field {
53875
55285
  display: flex;
@@ -53943,6 +55353,10 @@ var containerResponsiveThemeCss = `/*
53943
55353
  }
53944
55354
 
53945
55355
  /* Subheadline - supporting text below headline */
55356
+ :where(.theme-scope) :where([data-block="hero"]) .hero-headline {
55357
+ text-wrap: balance;
55358
+ }
55359
+
53946
55360
  :where(.theme-scope) :where([data-block="hero"]) .hero-subheadline {
53947
55361
  font-size: 1.125rem;
53948
55362
  color: var(--section-supporting-color, var(--section-text-color, rgb(var(--tb-text))));
@@ -53968,8 +55382,8 @@ var containerResponsiveThemeCss = `/*
53968
55382
  }
53969
55383
 
53970
55384
  :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;
55385
+ font-size: clamp(2.75rem, 5.6vw, 4.75rem);
55386
+ line-height: 1.06;
53973
55387
  }
53974
55388
 
53975
55389
  :where(.theme-scope) :where([data-block="hero"]) .rb-hero-typography-editorial .hero-subheadline {
@@ -53978,8 +55392,8 @@ var containerResponsiveThemeCss = `/*
53978
55392
  }
53979
55393
 
53980
55394
  :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;
55395
+ font-size: clamp(3.5rem, 7.2vw, 6.25rem);
55396
+ line-height: 1;
53983
55397
  }
53984
55398
 
53985
55399
  :where(.theme-scope) :where([data-block="hero"]) .rb-hero-typography-display .hero-subheadline {
@@ -53988,8 +55402,8 @@ var containerResponsiveThemeCss = `/*
53988
55402
  }
53989
55403
 
53990
55404
  :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;
55405
+ font-size: clamp(4.25rem, 10vw, 8.5rem);
55406
+ line-height: 0.94;
53993
55407
  }
53994
55408
 
53995
55409
  :where(.theme-scope) :where([data-block="hero"]) .rb-hero-typography-poster .hero-subheadline {
@@ -53998,13 +55412,13 @@ var containerResponsiveThemeCss = `/*
53998
55412
  }
53999
55413
 
54000
55414
  :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);
55415
+ font-size: clamp(3.5rem, 7.5vw, 6.5rem);
54002
55416
  }
54003
55417
 
54004
55418
  :where(.theme-scope) :where([data-block="hero"]) .rb-hero-title-long.rb-hero-typography-poster .hero-headline,
54005
55419
  :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;
55420
+ font-size: clamp(3rem, 6vw, 5.25rem);
55421
+ line-height: 1.02;
54008
55422
  }
54009
55423
 
54010
55424
  @container rb-site (max-width: 639px) {
@@ -56726,8 +58140,9 @@ var containerResponsiveThemeCss = `/*
56726
58140
  /* Privacy note */
56727
58141
  :where(.theme-scope) .newsletter-privacy-note {
56728
58142
  margin-top: 0.75rem;
56729
- font-size: 0.75rem;
56730
- color: var(--section-supporting-color, rgb(var(--tb-mutedText)));
58143
+ font-size: 1rem;
58144
+ line-height: 1.6;
58145
+ color: var(--section-text-color, rgb(var(--tb-text)));
56731
58146
  text-align: center;
56732
58147
  }
56733
58148
 
@@ -56782,6 +58197,116 @@ var containerResponsiveThemeCss = `/*
56782
58197
  color: rgb(var(--tb-text));
56783
58198
  }
56784
58199
 
58200
+ /* =============================================================================
58201
+ * Block: Contact + Newsletter
58202
+ * =============================================================================
58203
+ */
58204
+
58205
+ :where(.theme-scope) :where([data-block="contact-newsletter"]) .contact-newsletter-grid {
58206
+ display: grid;
58207
+ grid-template-columns: repeat(auto-fit, minmax(min(24rem, 100%), 1fr));
58208
+ gap: clamp(2.5rem, 6vw, 4rem);
58209
+ align-items: start;
58210
+ }
58211
+
58212
+ :where(.theme-scope) :where([data-block="contact-newsletter"]) .contact-newsletter-column {
58213
+ min-width: 0;
58214
+ }
58215
+
58216
+ :where(.theme-scope) :where([data-block="contact-newsletter"]) .contact-newsletter-copy {
58217
+ margin-bottom: 1.5rem;
58218
+ }
58219
+
58220
+ :where(.theme-scope) :where([data-block="contact-newsletter"]) .form-copy-title,
58221
+ :where(.theme-scope) :where([data-block="contact-newsletter"]) .newsletter-copy-title {
58222
+ margin: 0 0 0.75rem;
58223
+ }
58224
+
58225
+ :where(.theme-scope) :where([data-block="contact-newsletter"]) .form-copy-intro,
58226
+ :where(.theme-scope) :where([data-block="contact-newsletter"]) .newsletter-copy-subtitle {
58227
+ color: var(--section-text-color, rgb(var(--tb-text)));
58228
+ }
58229
+
58230
+ :where(.theme-scope) :where([data-block="contact-newsletter"]) .contact-newsletter-info {
58231
+ display: flex;
58232
+ flex-direction: column;
58233
+ align-items: flex-start;
58234
+ }
58235
+
58236
+ :where(.theme-scope) :where([data-block="contact-newsletter"]) .newsletter-form {
58237
+ max-width: none;
58238
+ margin-left: 0;
58239
+ margin-right: 0;
58240
+ }
58241
+
58242
+ :where(.theme-scope) :where([data-block="contact-newsletter"]) .newsletter-privacy-note {
58243
+ text-align: left;
58244
+ }
58245
+
58246
+ :where(.theme-scope) :where([data-block="contact-newsletter"]) .fb-form {
58247
+ display: flex;
58248
+ flex-direction: column;
58249
+ gap: 1rem;
58250
+ }
58251
+
58252
+ :where(.theme-scope) :where([data-block="contact-newsletter"]) .fb-row-2 {
58253
+ display: grid;
58254
+ grid-template-columns: repeat(auto-fit, minmax(min(14rem, 100%), 1fr));
58255
+ gap: 1rem;
58256
+ }
58257
+
58258
+ :where(.theme-scope) :where([data-block="contact-newsletter"]) .fb-field {
58259
+ display: flex;
58260
+ flex-direction: column;
58261
+ gap: 0.25rem;
58262
+ }
58263
+
58264
+ :where(.theme-scope) :where([data-block="contact-newsletter"]) .fb-fieldset {
58265
+ display: flex;
58266
+ flex-direction: column;
58267
+ gap: 0.5rem;
58268
+ border: none;
58269
+ padding: 0;
58270
+ margin: 0;
58271
+ }
58272
+
58273
+ :where(.theme-scope) :where([data-block="contact-newsletter"]) .fb-inline {
58274
+ display: flex;
58275
+ align-items: center;
58276
+ gap: 0.5rem;
58277
+ }
58278
+
58279
+ :where(.theme-scope) :where([data-block="contact-newsletter"]) .fb-success,
58280
+ :where(.theme-scope) :where([data-block="contact-newsletter"]) .fb-error,
58281
+ :where(.theme-scope) :where([data-block="contact-newsletter"]) .fb-empty {
58282
+ border-radius: var(--rb-block-radius);
58283
+ padding: 1rem;
58284
+ font-size: 0.875rem;
58285
+ }
58286
+
58287
+ :where(.theme-scope) :where([data-block="contact-newsletter"]) .fb-success {
58288
+ background-color: var(--fb-success-bg);
58289
+ color: var(--fb-success-text);
58290
+ border: 1px solid var(--fb-success-border);
58291
+ }
58292
+
58293
+ :where(.theme-scope) :where([data-block="contact-newsletter"]) .fb-error {
58294
+ background-color: var(--fb-error-bg);
58295
+ color: var(--fb-error-text);
58296
+ border: 1px solid var(--fb-error-border);
58297
+ }
58298
+
58299
+ :where(.theme-scope) :where([data-block="contact-newsletter"]) .fb-empty {
58300
+ background-color: var(--fb-empty-bg);
58301
+ color: var(--fb-empty-text);
58302
+ border: 1px dashed var(--fb-empty-border);
58303
+ text-align: center;
58304
+ }
58305
+
58306
+ :where(.theme-scope) :where([data-block="contact-newsletter"]) .fb-actions {
58307
+ margin-top: 0.5rem;
58308
+ }
58309
+
56785
58310
  /* =============================================================================
56786
58311
  * Block: Team Members
56787
58312
  * =============================================================================
@@ -57006,8 +58531,8 @@ var containerResponsiveThemeCss = `/*
57006
58531
  container: event-compact-list / inline-size;
57007
58532
  border: 1px solid var(--event-compact-divider-color);
57008
58533
  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);
58534
+ background: rgb(var(--tb-surface, 255 255 255));
58535
+ box-shadow: none;
57011
58536
  }
57012
58537
 
57013
58538
  :where(.theme-scope) .rb-event-list-treatment-lined-panel .event-listing-compact-container {
@@ -57016,6 +58541,12 @@ var containerResponsiveThemeCss = `/*
57016
58541
  rgb(var(--tb-border, 229 231 235)),
57017
58542
  rgb(var(--tb-text, 17 24 39)) 8%
57018
58543
  );
58544
+ background: rgb(var(--tb-surface, 255 255 255));
58545
+ border-color: color-mix(
58546
+ in oklab,
58547
+ rgb(var(--tb-primary, 0 0 0)),
58548
+ rgb(var(--tb-border, 229 231 235)) 72%
58549
+ );
57019
58550
  }
57020
58551
 
57021
58552
  :where(.theme-scope) .event-compact-row {
@@ -57091,7 +58622,7 @@ var containerResponsiveThemeCss = `/*
57091
58622
 
57092
58623
  :where(.theme-scope) .event-compact-row-title {
57093
58624
  margin: 0;
57094
- color: rgb(var(--tb-text, 17 24 39));
58625
+ color: var(--section-heading-color, rgb(var(--tb-primary, 0 0 0)));
57095
58626
  font-family: var(--font-heading, var(--font-body, inherit));
57096
58627
  font-size: clamp(1.05rem, 1rem + 0.35vw, 1.3rem);
57097
58628
  font-weight: 400;
@@ -57184,8 +58715,6 @@ var containerResponsiveThemeCss = `/*
57184
58715
  min-height: 2.7rem;
57185
58716
  justify-content: space-between;
57186
58717
  gap: 1rem;
57187
- border-radius: 9999px;
57188
- padding-inline: 1.25rem 1rem;
57189
58718
  white-space: nowrap;
57190
58719
  }
57191
58720
 
@@ -58247,6 +59776,7 @@ function PageContent({
58247
59776
  mediaAssets,
58248
59777
  apiBaseUrl,
58249
59778
  portalToken,
59779
+ previewToken,
58250
59780
  dataContext,
58251
59781
  useThemeScope = false
58252
59782
  }) {
@@ -58263,6 +59793,7 @@ function PageContent({
58263
59793
  siteId,
58264
59794
  apiBaseUrl,
58265
59795
  portalToken,
59796
+ previewToken,
58266
59797
  resolvedData,
58267
59798
  routes: routeMap,
58268
59799
  pagesByIdentifier,
@@ -58951,11 +60482,11 @@ function resolveParamsBindings(input, vm, meta) {
58951
60482
  return binding.fallback;
58952
60483
  }
58953
60484
  return resolved;
58954
- } catch (err2) {
60485
+ } catch (err3) {
58955
60486
  if (shouldLogWarnings) {
58956
60487
  console.warn(
58957
60488
  `bindings: failed to parse loader param binding for block "${meta?.blockKind ?? "unknown"}"`,
58958
- err2
60489
+ err3
58959
60490
  );
58960
60491
  }
58961
60492
  return void 0;
@@ -62504,6 +64035,46 @@ var ENDPOINT_DEFINITIONS = {
62504
64035
  auth: "user",
62505
64036
  responseKind: "json"
62506
64037
  },
64038
+ listEntrySlotBlocks: {
64039
+ path: "/sites/{siteId}/content/{type}/{entryId}/slots/{slotKey}/blocks",
64040
+ method: "GET",
64041
+ tags: ["site-{siteId}", "content-entry-{entryId}", "entry-slot-{slotKey}", "blocks"],
64042
+ auth: "user",
64043
+ responseKind: "json",
64044
+ errors: ["resource:not_found"]
64045
+ },
64046
+ listEntryPageContentSlots: {
64047
+ path: "/sites/{siteId}/content/{type}/{entryId}/slots",
64048
+ method: "GET",
64049
+ tags: ["site-{siteId}", "content-entry-{entryId}", "entry-slots", "blocks"],
64050
+ auth: "user",
64051
+ responseKind: "json",
64052
+ errors: ["resource:not_found"]
64053
+ },
64054
+ createEntrySlotBlock: {
64055
+ path: "/sites/{siteId}/content/{type}/{entryId}/slots/{slotKey}/blocks",
64056
+ method: "POST",
64057
+ tags: ["site-{siteId}", "content-entry-{entryId}", "entry-slot-{slotKey}", "blocks"],
64058
+ auth: "user",
64059
+ responseKind: "json",
64060
+ errors: ["validation:invalid_input", "resource:not_found"]
64061
+ },
64062
+ reorderEntrySlotBlocks: {
64063
+ path: "/sites/{siteId}/content/{type}/{entryId}/slots/{slotKey}/blocks/reorder",
64064
+ method: "POST",
64065
+ tags: ["site-{siteId}", "content-entry-{entryId}", "entry-slot-{slotKey}", "blocks"],
64066
+ auth: "user",
64067
+ responseKind: "json",
64068
+ errors: ["validation:invalid_input", "resource:not_found"]
64069
+ },
64070
+ deleteEntrySlotBlock: {
64071
+ path: "/sites/{siteId}/content/{type}/{entryId}/slots/{slotKey}/blocks/{blockId}",
64072
+ method: "DELETE",
64073
+ tags: ["site-{siteId}", "content-entry-{entryId}", "entry-slot-{slotKey}", "blocks"],
64074
+ auth: "user",
64075
+ responseKind: "json",
64076
+ errors: ["resource:not_found"]
64077
+ },
62507
64078
  createBlock: {
62508
64079
  path: "/sites/{siteId}/pages/{pageId}/blocks",
62509
64080
  method: "POST",
@@ -66327,7 +67898,7 @@ function preset(id, verticalId, canonicalBehaviour, label, pluralLabel, descript
66327
67898
  }
66328
67899
 
66329
67900
  // ../api/src/utils/isRecord.ts
66330
- function isRecord10(value) {
67901
+ function isRecord12(value) {
66331
67902
  return typeof value === "object" && value !== null && !Array.isArray(value);
66332
67903
  }
66333
67904
 
@@ -66634,7 +68205,7 @@ function sanitizeMarks(marks) {
66634
68205
  if (mark.type === "bold" || mark.type === "strong" || mark.type === "italic" || mark.type === "em") {
66635
68206
  return [{ type: mark.type }];
66636
68207
  }
66637
- if (mark.type === "link" && isRecord10(mark.attrs) && typeof mark.attrs.href === "string") {
68208
+ if (mark.type === "link" && isRecord12(mark.attrs) && typeof mark.attrs.href === "string") {
66638
68209
  const attrs = { href: mark.attrs.href };
66639
68210
  if (typeof mark.attrs.target === "string" && mark.attrs.target.trim().length > 0) {
66640
68211
  attrs.target = mark.attrs.target;
@@ -66649,10 +68220,10 @@ function sanitizeMarks(marks) {
66649
68220
  return sanitized.length > 0 ? sanitized : void 0;
66650
68221
  }
66651
68222
  function unwrapRichTextValue(value) {
66652
- if (isRecord10(value) && isRecord10(value.doc)) {
68223
+ if (isRecord12(value) && isRecord12(value.doc)) {
66653
68224
  return unwrapRichTextValue(value.doc);
66654
68225
  }
66655
- if (isRecord10(value) && value.type === "doc") {
68226
+ if (isRecord12(value) && value.type === "doc") {
66656
68227
  return {
66657
68228
  type: "doc",
66658
68229
  content: Array.isArray(value.content) ? value.content.filter(isTipTapNodeLike).map(coerceTipTapNode) : []
@@ -66661,7 +68232,7 @@ function unwrapRichTextValue(value) {
66661
68232
  return EMPTY_SITE_BANNER_BODY;
66662
68233
  }
66663
68234
  function isTipTapNodeLike(value) {
66664
- return isRecord10(value) && typeof value.type === "string";
68235
+ return isRecord12(value) && typeof value.type === "string";
66665
68236
  }
66666
68237
  function coerceTipTapNode(value) {
66667
68238
  return {
@@ -66669,9 +68240,9 @@ function coerceTipTapNode(value) {
66669
68240
  ...Array.isArray(value.content) ? { content: value.content.filter(isTipTapNodeLike).map(coerceTipTapNode) } : {},
66670
68241
  ...typeof value.text === "string" ? { text: value.text } : {},
66671
68242
  ...Array.isArray(value.marks) ? {
66672
- marks: value.marks.filter((mark) => isRecord10(mark) && typeof mark.type === "string").map((mark) => ({
68243
+ marks: value.marks.filter((mark) => isRecord12(mark) && typeof mark.type === "string").map((mark) => ({
66673
68244
  type: mark.type,
66674
- ...isRecord10(mark.attrs) ? { attrs: mark.attrs } : {}
68245
+ ...isRecord12(mark.attrs) ? { attrs: mark.attrs } : {}
66675
68246
  }))
66676
68247
  } : {}
66677
68248
  };
@@ -66854,7 +68425,7 @@ var ENTRY_REF_KEYS = [
66854
68425
  "entryId",
66855
68426
  "slug"
66856
68427
  ];
66857
- function isRecord11(value) {
68428
+ function isRecord13(value) {
66858
68429
  return Boolean(value) && typeof value === "object" && !Array.isArray(value);
66859
68430
  }
66860
68431
  function extractManualEntryRef(item) {
@@ -66862,7 +68433,7 @@ function extractManualEntryRef(item) {
66862
68433
  const trimmed = item.trim();
66863
68434
  return trimmed.length > 0 ? trimmed : null;
66864
68435
  }
66865
- if (!isRecord11(item)) return null;
68436
+ if (!isRecord13(item)) return null;
66866
68437
  for (const key of ENTRY_REF_KEYS) {
66867
68438
  const raw = item[key];
66868
68439
  if (typeof raw === "string" && raw.trim().length > 0) {
@@ -67657,6 +69228,31 @@ function isDocWrapper(value) {
67657
69228
  var normalizeBindingOutput2 = normalizeBindingOutput;
67658
69229
  var applyBindingsToContent2 = applyBindingsToContent;
67659
69230
 
69231
+ // ../content-model/src/entry-slots/types.ts
69232
+ function ok2(value) {
69233
+ return { ok: true, value };
69234
+ }
69235
+ function err2(error) {
69236
+ return { ok: false, error };
69237
+ }
69238
+ var SLOT_KEY_PATTERN = /^[a-z][a-z0-9]*(?:[-_][a-z0-9]+)*$/;
69239
+ function unsafeAsSlotKey(value) {
69240
+ return value;
69241
+ }
69242
+ function parseSlotKey(value) {
69243
+ if (typeof value !== "string") return err2({ kind: "not-string" });
69244
+ const normalized = value.trim();
69245
+ if (!normalized) return err2({ kind: "empty" });
69246
+ if (!SLOT_KEY_PATTERN.test(normalized)) {
69247
+ return err2({ kind: "invalid-format", value: normalized });
69248
+ }
69249
+ return ok2(unsafeAsSlotKey(normalized));
69250
+ }
69251
+ var SYSTEM_ENTRY_SLOT_BLOCK_KIND = "system.entry-slot";
69252
+ function selectBlocksForDeclaredEntrySlot(input) {
69253
+ return input.entrySlots.find((slot) => slot.slotKey === input.declaredSlotKey)?.blocks ?? [];
69254
+ }
69255
+
67660
69256
  // src/rendering/helpers/loadContent.ts
67661
69257
  function isPageContent(result) {
67662
69258
  return result.type === "page";
@@ -67709,6 +69305,7 @@ async function loadContent(params) {
67709
69305
  };
67710
69306
  const { templatePage, resolvedData: resolvedData2 } = await processEntryTemplate(
67711
69307
  contentResponse.templates,
69308
+ contentResponse.entrySlots,
67712
69309
  entry,
67713
69310
  { siteId, preview },
67714
69311
  client,
@@ -67832,7 +69429,7 @@ function validateAndConvertBlock(block, source) {
67832
69429
  content
67833
69430
  };
67834
69431
  }
67835
- async function processEntryTemplate(templates, entry, context, client, options) {
69432
+ async function processEntryTemplate(templates, entrySlots, entry, context, client, options) {
67836
69433
  const template = templates?.[0];
67837
69434
  if (!template || !template.blocks?.length) {
67838
69435
  return { templatePage: null, resolvedData: {} };
@@ -67850,7 +69447,12 @@ async function processEntryTemplate(templates, entry, context, client, options)
67850
69447
  updatedAt: entry.updatedAt
67851
69448
  }
67852
69449
  };
67853
- const blocks = template.blocks.map((block) => resolveTemplateBlock(block, bindingContext));
69450
+ const blocks = template.blocks.flatMap(
69451
+ (block) => resolveTemplateBlockSequence(block, bindingContext, entrySlots)
69452
+ );
69453
+ if (blocks.length === 0) {
69454
+ return { templatePage: null, resolvedData: {} };
69455
+ }
67854
69456
  const templatePage = {
67855
69457
  name: template.name || "Entry Template",
67856
69458
  path: entry.path || "/",
@@ -67890,6 +69492,48 @@ function resolveTemplateBlock(block, bindingContext) {
67890
69492
  content: resolvedContent
67891
69493
  };
67892
69494
  }
69495
+ function resolveTemplateBlockSequence(block, bindingContext, entrySlots) {
69496
+ const slotKey = readEntrySlotKey(block);
69497
+ if (slotKey) {
69498
+ return selectBlocksForDeclaredEntrySlot({
69499
+ declaredSlotKey: slotKey,
69500
+ entrySlots: entrySlots ?? []
69501
+ }).map(mapEntrySlotBlock);
69502
+ }
69503
+ if (block.blockKind === SYSTEM_ENTRY_SLOT_BLOCK_KIND) {
69504
+ return [];
69505
+ }
69506
+ return [resolveTemplateBlock(block, bindingContext)];
69507
+ }
69508
+ function readEntrySlotKey(block) {
69509
+ if (block.blockKind !== SYSTEM_ENTRY_SLOT_BLOCK_KIND) return null;
69510
+ if (block.scope !== "template") return null;
69511
+ const content = block.content;
69512
+ const slotKey = content?.slotKey;
69513
+ const parsed = parseSlotKey(slotKey);
69514
+ return parsed.ok ? parsed.value : null;
69515
+ }
69516
+ function mapEntrySlotBlock(block) {
69517
+ const mapped = {
69518
+ id: block.id ?? block.blockId ?? null,
69519
+ kind: block.kind,
69520
+ purpose: block.purpose,
69521
+ orderIndex: block.orderIndex ?? null,
69522
+ content: normalizeBindingOutput2(block.content ?? {}),
69523
+ draftContent: normalizeNullableEntrySlotContent(block.draftContent),
69524
+ publishedContent: normalizeNullableEntrySlotContent(block.publishedContent)
69525
+ };
69526
+ if (block.bindings == null) {
69527
+ return mapped;
69528
+ }
69529
+ return {
69530
+ ...mapped,
69531
+ bindings: block.bindings
69532
+ };
69533
+ }
69534
+ function normalizeNullableEntrySlotContent(content) {
69535
+ return content == null ? null : normalizeBindingOutput2(content);
69536
+ }
67893
69537
 
67894
69538
  // src/contracts/bindings.ts
67895
69539
  var BINDING_TRANSFORMS = {