@riverbankcms/sdk 0.75.0 → 0.77.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 (177) hide show
  1. package/README.md +2 -0
  2. package/dist/{PreviewEditorSidebar-U2IHCBYN.mjs → PreviewEditorSidebar-XSX7QKHQ.mjs} +1179 -519
  3. package/dist/{PreviewEditorUI-ZGH2RQNP.mjs → PreviewEditorUI-YZNEZ3QD.mjs} +2 -2
  4. package/dist/SdkPreviewModeRuntime-5FS5E6BI.mjs +8 -0
  5. package/dist/_dts/ai/src/contracts/proposals.d.ts +528 -20
  6. package/dist/_dts/api/src/bookingOperations.d.ts +12 -0
  7. package/dist/_dts/api/src/contentRuntime.d.ts +5 -0
  8. package/dist/_dts/api/src/index.d.ts +1 -1
  9. package/dist/_dts/api/src/publicExperienceEndpoints.d.ts +11 -3
  10. package/dist/_dts/api/src/siteAssets.d.ts +1 -0
  11. package/dist/_dts/api/src/siteRuntimeEndpoints.d.ts +26 -2
  12. package/dist/_dts/block-form/src/blockDraftSaveability.d.ts +28 -1
  13. package/dist/_dts/block-form/src/client/index.d.ts +2 -2
  14. package/dist/_dts/block-form/src/index.d.ts +2 -1
  15. package/dist/_dts/block-form/src/manifest/utils.d.ts +24 -0
  16. package/dist/_dts/block-form/src/widgets/DateField/dateFieldSchema.d.ts +1 -1
  17. package/dist/_dts/block-form/src/widgets/DateTimeField/dateTimeFieldSchema.d.ts +1 -1
  18. package/dist/_dts/block-form/src/widgets/TimeField/timeFieldSchema.d.ts +1 -1
  19. package/dist/_dts/blocks/src/PageRenderer.d.ts +10 -10
  20. package/dist/_dts/blocks/src/client/events.d.ts +3 -1
  21. package/dist/_dts/blocks/src/client/site-chrome.d.ts +22 -0
  22. package/dist/_dts/blocks/src/contracts/proof-block-islands.d.ts +4 -4
  23. package/dist/_dts/blocks/src/customBlockRegistry.d.ts +38 -0
  24. package/dist/_dts/blocks/src/index.d.ts +2 -0
  25. package/dist/_dts/blocks/src/system/blocks/faq.d.ts +20 -2
  26. package/dist/_dts/blocks/src/system/blocks/feature-cards.d.ts +25 -0
  27. package/dist/_dts/blocks/src/system/blocks/index.d.ts +2 -0
  28. package/dist/_dts/blocks/src/system/blocks/intro.d.ts +24 -0
  29. package/dist/_dts/blocks/src/system/blocks/media-text.d.ts +3 -34
  30. package/dist/_dts/blocks/src/system/constants/blockKinds.d.ts +1 -1
  31. package/dist/_dts/blocks/src/system/fields/aspectRatio.d.ts +30 -0
  32. package/dist/_dts/blocks/src/system/fields/boxStyles.d.ts +4 -1
  33. package/dist/_dts/blocks/src/system/fields/ctas.d.ts +7 -0
  34. package/dist/_dts/blocks/src/system/manifest/fieldValidation/index.d.ts +11 -2
  35. package/dist/_dts/blocks/src/system/node/validation-constants.d.ts +1 -1
  36. package/dist/_dts/blocks/src/system/runtime/components/registry.client.d.ts +6 -6
  37. package/dist/_dts/blocks/src/system/runtime/components/runtime-backed-blocks.d.ts +3 -3
  38. package/dist/_dts/blocks/src/system/runtime/nodes/accordion.d.ts +2 -0
  39. package/dist/_dts/blocks/src/system/runtime/nodes/accordion.server.d.ts +2 -0
  40. package/dist/_dts/blocks/src/system/runtime/nodes/accordionIconTreatment.d.ts +5 -0
  41. package/dist/_dts/blocks/src/system/runtime/nodes/booking-form.interactive.d.ts +3 -27
  42. package/dist/_dts/blocks/src/system/runtime/nodes/booking-runtime-sources.d.ts +163 -0
  43. package/dist/_dts/blocks/src/system/runtime/nodes/event-registration.interactive.d.ts +5 -5
  44. package/dist/_dts/blocks/src/system/runtime/shared/components/BookingOptionCompactRow.d.ts +29 -0
  45. package/dist/_dts/blocks/src/system/runtime/shared/components/BookingOptionList.d.ts +13 -0
  46. package/dist/_dts/blocks/src/system/runtime/shared/components/index.d.ts +4 -0
  47. package/dist/_dts/blocks/src/system/runtime/shared/index.d.ts +4 -3
  48. package/dist/_dts/blocks/src/system/runtime/shared/utils/bookingRoute.d.ts +20 -0
  49. package/dist/_dts/blocks/src/system/runtime/shared/utils/index.d.ts +2 -1
  50. package/dist/_dts/blocks/src/system/transforms/registry/layout.d.ts +1 -0
  51. package/dist/_dts/blocks/src/system/transforms/typed.d.ts +2 -1
  52. package/dist/_dts/blocks/src/system/types/link.d.ts +12 -0
  53. package/dist/_dts/content-editor/src/controller/EntryControllerProvider.d.ts +2 -0
  54. package/dist/_dts/content-editor/src/hooks/blockDraftLifecycle.d.ts +48 -0
  55. package/dist/_dts/content-editor/src/hooks/invalidBlockSelectors.d.ts +4 -0
  56. package/dist/_dts/content-editor/src/hooks/publishability.d.ts +47 -0
  57. package/dist/_dts/content-editor/src/index.d.ts +1 -0
  58. package/dist/_dts/db/src/generated/supabase/database.types.d.ts +20 -0
  59. package/dist/_dts/editor-blocks/src/BlockEditor.d.ts +4 -1
  60. package/dist/_dts/editor-blocks/src/block-editor/BlockCard.d.ts +3 -1
  61. package/dist/_dts/editor-blocks/src/block-editor/BlockCardHeader.d.ts +3 -1
  62. package/dist/_dts/editor-blocks/src/block-editor/BlockSettingsModal.d.ts +5 -1
  63. package/dist/_dts/editor-blocks/src/block-editor/SortableBlockItem.d.ts +4 -1
  64. package/dist/_dts/editor-blocks/src/block-editor/actionControlMode.d.ts +2 -0
  65. package/dist/_dts/editor-blocks/src/block-editor/customBlockRegistry.d.ts +2 -0
  66. package/dist/_dts/editor-blocks/src/block-editor/sdkBlockMerger.d.ts +9 -37
  67. package/dist/_dts/editor-blocks/src/index.d.ts +3 -3
  68. package/dist/_dts/preview-next/src/client/index.d.ts +3 -0
  69. package/dist/_dts/preview-next/src/client/layout/PreviewLayoutContext.d.ts +5 -1
  70. package/dist/_dts/preview-next/src/client/preview/PreviewDesignCoordinatorContext.d.ts +20 -0
  71. package/dist/_dts/preview-next/src/client/preview/PreviewEditorSidebar.d.ts +7 -2
  72. package/dist/_dts/preview-next/src/client/preview/PreviewShell.d.ts +7 -2
  73. package/dist/_dts/preview-next/src/client/preview/PreviewShellLayout.d.ts +7 -2
  74. package/dist/_dts/preview-next/src/client/preview/PreviewThemedSiteDocument.d.ts +18 -0
  75. package/dist/_dts/preview-next/src/client/preview/SiteChromeCustomizeContext.d.ts +20 -3
  76. package/dist/_dts/preview-next/src/client/preview/StyleConfigurator.d.ts +6 -1
  77. package/dist/_dts/preview-next/src/client/preview/StyleConfigurator.state.d.ts +14 -4
  78. package/dist/_dts/preview-next/src/client/preview/previewDesignCoordinator.d.ts +73 -0
  79. package/dist/_dts/preview-next/src/client/preview/siteChromeLookRows.d.ts +12 -4
  80. package/dist/_dts/preview-next/src/client/preview/siteStylePreviewPlanner.d.ts +46 -0
  81. package/dist/_dts/preview-next/src/client/preview/styleConfiguratorSnapshot.d.ts +6 -1
  82. package/dist/_dts/preview-next/src/client/preview/themeOverlay.d.ts +21 -3
  83. package/dist/_dts/preview-next/src/client/preview/typographySelectionInput.d.ts +14 -0
  84. package/dist/_dts/preview-next/src/client/sdk/SdkPreviewModeRuntime.d.ts +1 -1
  85. package/dist/_dts/sdk/src/cli/commands/style.d.ts +8 -0
  86. package/dist/_dts/sdk/src/client/management/types.d.ts +6 -1
  87. package/dist/_dts/sdk/src/client/types.d.ts +9 -0
  88. package/dist/_dts/sdk/src/client.d.ts +1 -1
  89. package/dist/_dts/sdk/src/components.d.ts +2 -2
  90. package/dist/_dts/sdk/src/contracts/system-block-content.d.ts +35 -0
  91. package/dist/_dts/sdk/src/index.d.ts +2 -1
  92. package/dist/_dts/sdk/src/public-api/contracts.d.ts +5 -0
  93. package/dist/_dts/sdk/src/rendering/index.d.ts +2 -2
  94. package/dist/_dts/sdk/src/rendering/overrideResolution.d.ts +6 -0
  95. package/dist/_dts/sdk/src/rendering/overrides.d.ts +21 -1
  96. package/dist/_dts/sdk/src/rendering/server.d.ts +4 -3
  97. package/dist/_dts/sdk/src/types/block-kinds.d.ts +1 -1
  98. package/dist/_dts/sdk/src/version.d.ts +1 -1
  99. package/dist/_dts/site-commands/src/commands.d.ts +15 -0
  100. package/dist/_dts/theme-core/src/buttons/personalities/earth-pill.d.ts +16 -0
  101. package/dist/_dts/theme-core/src/buttons/personalities/index.d.ts +11 -0
  102. package/dist/_dts/theme-core/src/fonts/types.d.ts +1 -1
  103. package/dist/_dts/theme-core/src/mock-themes/all.d.ts +45 -0
  104. package/dist/_dts/theme-core/src/palette/variants/index.d.ts +15 -0
  105. package/dist/_dts/theme-core/src/palette/variants/warm-neutral.d.ts +16 -0
  106. package/dist/_dts/theme-core/src/schema.d.ts +280 -0
  107. package/dist/_dts/theme-core/src/site-styles/appearancePresetCatalog.d.ts +81 -0
  108. package/dist/_dts/theme-core/src/site-styles/appearancePresetTypes.d.ts +6 -4
  109. package/dist/_dts/theme-core/src/site-styles/blockAppearancePresets.d.ts +81 -0
  110. package/dist/_dts/theme-core/src/site-styles/curatedSiteStyles.d.ts +118 -2
  111. package/dist/_dts/theme-core/src/site-styles/footerLooks.d.ts +13 -0
  112. package/dist/_dts/theme-core/src/site-styles/generatedSchemas.d.ts +4 -2
  113. package/dist/_dts/theme-core/src/site-styles/headerLooks.d.ts +364 -5
  114. package/dist/_dts/theme-core/src/site-styles/headerOpeningSection.d.ts +6 -0
  115. package/dist/_dts/theme-core/src/site-styles/index.d.ts +2 -0
  116. package/dist/_dts/theme-core/src/site-styles/persistedIdParseResult.d.ts +9 -0
  117. package/dist/_dts/theme-core/src/site-styles/previewCompiler.d.ts +20 -4
  118. package/dist/_dts/theme-core/src/site-styles/types.d.ts +74 -2
  119. package/dist/_dts/theme-core/src/site-styles/typographyPresets.d.ts +189 -0
  120. package/dist/{chunk-Z7JLNTJR.mjs → chunk-6SMUFTXD.mjs} +2 -1
  121. package/dist/{chunk-ZSHFGFUG.mjs → chunk-ANKDYZ2E.mjs} +1 -1
  122. package/dist/{chunk-BGMNDF6T.mjs → chunk-EAWHBECW.mjs} +476 -153
  123. package/dist/{chunk-RWXQBRQZ.mjs → chunk-GSQX43EZ.mjs} +450 -63
  124. package/dist/{chunk-GFE74WRD.mjs → chunk-WLQBJN2Z.mjs} +3275 -435
  125. package/dist/cli/index.mjs +2023 -181
  126. package/dist/client/{accordion-T2UD2ZTH.mjs → accordion-RZMQSYLR.mjs} +1 -1
  127. package/dist/client/{bookingForm-GUP75FKN.mjs → bookingForm-NF4ASVNV.mjs} +3 -13
  128. package/dist/client/bookings.mjs +103 -11
  129. package/dist/client/{carousel-2NQA6V57.mjs → carousel-LDX47ZIK.mjs} +1 -1
  130. package/dist/client/{cart-5TFIAFDS.mjs → cart-RGXDS5F4.mjs} +4 -4
  131. package/dist/client/{checkout-TP4WAHZE.mjs → checkout-P7WWSNNY.mjs} +4 -4
  132. package/dist/client/{chunk-ZLMS67RR.mjs → chunk-E2TDNXCL.mjs} +1 -1
  133. package/dist/client/{chunk-NWOUL6JY.mjs → chunk-GMVTOKYG.mjs} +3 -3
  134. package/dist/client/{chunk-CY2ZTSE5.mjs → chunk-JNC7CGHX.mjs} +1 -1
  135. package/dist/client/{chunk-VUAOE3AG.mjs → chunk-L3DNHIJX.mjs} +4 -4
  136. package/dist/client/{chunk-FU2QRZMX.mjs → chunk-R56FQ3RR.mjs} +163 -24
  137. package/dist/client/{chunk-WJXXNDSE.mjs → chunk-UFSWADAO.mjs} +1 -1
  138. package/dist/client/client.mjs +4392 -2504
  139. package/dist/client/{courseRegistration-5DPU6PDY.mjs → courseRegistration-7F65K5ZR.mjs} +3 -3
  140. package/dist/client/{eventCalendar-F3GZGTEF.mjs → eventCalendar-GLSC5KTL.mjs} +5 -5
  141. package/dist/client/{eventCombined-BQOB6QMY.mjs → eventCombined-ZHK4WKUR.mjs} +5 -5
  142. package/dist/client/{eventDetails-PEM2EJWE.mjs → eventDetails-E3PJYBIN.mjs} +5 -5
  143. package/dist/client/{eventListing-YMIQPVME.mjs → eventListing-EMS3WC3E.mjs} +5 -5
  144. package/dist/client/{eventRegistration-4I6ZNDUF.mjs → eventRegistration-NZOTVNPI.mjs} +5 -5
  145. package/dist/client/{form-ZJVAYZ6G.mjs → form-ETFZFATW.mjs} +1 -1
  146. package/dist/client/{headerSection-TOT5MGTF.mjs → headerSection-4LBP7ULT.mjs} +2 -2
  147. package/dist/client/hooks.mjs +1918 -293
  148. package/dist/client/{locationMap-J66NZREU.mjs → locationMap-5M655YSJ.mjs} +1 -1
  149. package/dist/client/{newsletterForm-ET2XUMRO.mjs → newsletterForm-QOUYW44O.mjs} +1 -1
  150. package/dist/client/{productDetail-C2XIH7C5.mjs → productDetail-O4DOCWQG.mjs} +4 -4
  151. package/dist/client/{productList-T2AZLFTP.mjs → productList-A5RO5WIS.mjs} +4 -4
  152. package/dist/client/rendering/client.mjs +3328 -3177
  153. package/dist/client/rendering/islands.mjs +18 -18
  154. package/dist/client/rendering.mjs +5461 -3584
  155. package/dist/client/{shop-UZ6IUZXD.mjs → shop-L4MZH4I2.mjs} +4 -4
  156. package/dist/preview-next/chrome.css +1 -1
  157. package/dist/preview-next/client/runtime.mjs +4 -4
  158. package/dist/preview-next/editor-base.css +2 -148
  159. package/dist/preview-next/editor-chrome.css +179 -0
  160. package/dist/{sdk-runtime-JCUQM63Y.mjs → sdk-runtime-Q6MTR4KL.mjs} +5 -5
  161. package/dist/server/components.mjs +2983 -1093
  162. package/dist/server/config-validation.mjs +1921 -293
  163. package/dist/server/config.mjs +1921 -293
  164. package/dist/server/data.mjs +1918 -293
  165. package/dist/server/index.mjs +31 -2
  166. package/dist/server/next.mjs +2951 -1043
  167. package/dist/server/page-converter.mjs +1894 -281
  168. package/dist/server/prebuild.mjs +1 -1
  169. package/dist/server/rendering/server.mjs +2995 -1096
  170. package/dist/server/rendering.mjs +2988 -1098
  171. package/dist/server/routing.mjs +1963 -275
  172. package/dist/server/server.mjs +1932 -288
  173. package/dist/server/theme-bridge.mjs +158 -1
  174. package/dist/server/theme.mjs +158 -1
  175. package/package.json +1 -1
  176. package/dist/SdkPreviewModeRuntime-MTUGBTLQ.mjs +0 -8
  177. /package/dist/client/{chunk-2PHQZ666.mjs → chunk-JEZECJ3W.mjs} +0 -0
@@ -6842,7 +6842,7 @@ var SimpleCache = class {
6842
6842
  };
6843
6843
 
6844
6844
  // src/version.ts
6845
- var SDK_VERSION = "0.75.0";
6845
+ var SDK_VERSION = "0.77.0";
6846
6846
 
6847
6847
  // src/client/error.ts
6848
6848
  var RiverbankApiError = class _RiverbankApiError extends Error {
@@ -7270,6 +7270,24 @@ function getPrebuildModule() {
7270
7270
  return null;
7271
7271
  }
7272
7272
  }
7273
+ function mergeDefaultHeaders(defaultHeaders, options) {
7274
+ if (!defaultHeaders || Object.keys(defaultHeaders).length === 0) {
7275
+ return options;
7276
+ }
7277
+ return {
7278
+ ...options,
7279
+ headers: {
7280
+ ...defaultHeaders,
7281
+ ...Object.fromEntries(new Headers(options?.headers).entries())
7282
+ }
7283
+ };
7284
+ }
7285
+ function withDefaultHeaders(apiClient, defaultHeaders) {
7286
+ return async (params) => apiClient({
7287
+ ...params,
7288
+ options: mergeDefaultHeaders(defaultHeaders, params.options)
7289
+ });
7290
+ }
7273
7291
  setSdkVersion(SDK_VERSION);
7274
7292
  var DEFAULT_BROWSER_TIMEOUT_MS = 5e3;
7275
7293
  var DEFAULT_SERVER_TIMEOUT_MS = 8e3;
@@ -7469,7 +7487,8 @@ function createRiverbankClient(config) {
7469
7487
  keyType = "preview";
7470
7488
  break;
7471
7489
  }
7472
- const apiClient = authConfig.type === "none" ? createInternalAPIClient(config.baseUrl) : authConfig.type === "api-key" ? createBearerAPIClient(authConfig.key, config.baseUrl) : createBearerAPIClient(authConfig.token, config.baseUrl);
7490
+ const baseApiClient = authConfig.type === "none" ? createInternalAPIClient(config.baseUrl) : authConfig.type === "api-key" ? createBearerAPIClient(authConfig.key, config.baseUrl) : createBearerAPIClient(authConfig.token, config.baseUrl);
7491
+ const apiClient = withDefaultHeaders(baseApiClient, config.defaultHeaders);
7473
7492
  const cache = new SimpleCache({
7474
7493
  maxSize: cacheMaxSize,
7475
7494
  ttl: cacheTTL,
@@ -9251,6 +9270,47 @@ var eyebrowTreatmentValues = [
9251
9270
  "pill-bounce",
9252
9271
  "accent-pill-bounce"
9253
9272
  ];
9273
+ var visibleHeadingDecorationFamilyValues = [
9274
+ "organic-squiggle",
9275
+ "short-center-rule"
9276
+ ];
9277
+ var visibleHeadingDecorationPlacementValues = [
9278
+ "after-heading",
9279
+ "between-heading-and-body",
9280
+ "under-centered-heading"
9281
+ ];
9282
+ var headingDecorationOverrideValues = [
9283
+ "site-default",
9284
+ "on",
9285
+ "off"
9286
+ ];
9287
+ var headingDecorationColorTokenValues = [
9288
+ "text",
9289
+ "primary",
9290
+ "secondary",
9291
+ "accent",
9292
+ "border",
9293
+ "muted"
9294
+ ];
9295
+ var accordionIconSetValues = [
9296
+ "plus",
9297
+ "chevron",
9298
+ "caret",
9299
+ "minimal-cross"
9300
+ ];
9301
+ var accordionIconColorTokenValues = [
9302
+ "text",
9303
+ "muted",
9304
+ "primary",
9305
+ "secondary",
9306
+ "accent",
9307
+ "current"
9308
+ ];
9309
+ var accordionIconMotionValues = [
9310
+ "none",
9311
+ "rotate",
9312
+ "swap"
9313
+ ];
9254
9314
  function defineBlockDesignCapability(capability) {
9255
9315
  return {
9256
9316
  ...capability,
@@ -9260,7 +9320,9 @@ function defineBlockDesignCapability(capability) {
9260
9320
  imageSurfaceMotions: capability.imageSurfaceMotions ?? ["static"],
9261
9321
  testimonialCardTreatments: capability.testimonialCardTreatments ?? ["default"],
9262
9322
  tileTreatments: capability.tileTreatments ?? ["default"],
9263
- eyebrowTreatments: capability.eyebrowTreatments ?? ["plain"]
9323
+ eyebrowTreatments: capability.eyebrowTreatments ?? ["plain"],
9324
+ ...capability.headingDecorations ? { headingDecorations: capability.headingDecorations } : {},
9325
+ ...capability.accordionIconSets ? { accordionIconSets: capability.accordionIconSets } : {}
9264
9326
  };
9265
9327
  }
9266
9328
 
@@ -9451,6 +9513,25 @@ var blockAppearancePresets = [
9451
9513
  emphasis: "high"
9452
9514
  }
9453
9515
  }),
9516
+ defineBlockAppearancePreset({
9517
+ kind: "block-design",
9518
+ id: "intro-soft-earth-statement",
9519
+ target: "intro",
9520
+ label: "Soft Earth intro statement",
9521
+ blockKinds: ["block.intro"],
9522
+ design: {
9523
+ sectionSurface: "base",
9524
+ contentFrame: plainFrame,
9525
+ itemSurface: "none",
9526
+ transitionAfter: "soft-fade-short",
9527
+ emphasis: "high",
9528
+ headingDecoration: {
9529
+ family: "organic-squiggle",
9530
+ placement: "after-heading",
9531
+ colorToken: "primary"
9532
+ }
9533
+ }
9534
+ }),
9454
9535
  defineBlockAppearancePreset({
9455
9536
  kind: "block-design",
9456
9537
  id: "offerings-calm-list",
@@ -9465,6 +9546,25 @@ var blockAppearancePresets = [
9465
9546
  emphasis: "medium"
9466
9547
  }
9467
9548
  }),
9549
+ defineBlockAppearancePreset({
9550
+ kind: "block-design",
9551
+ id: "feature-cards-soft-earth-offerings",
9552
+ target: "feature-cards",
9553
+ label: "Soft Earth offering cards",
9554
+ blockKinds: ["block.feature-cards"],
9555
+ design: {
9556
+ sectionSurface: "base",
9557
+ contentFrame: plainFrame,
9558
+ itemSurface: "raised",
9559
+ transitionAfter: "none",
9560
+ emphasis: "high",
9561
+ headingDecoration: {
9562
+ family: "short-center-rule",
9563
+ placement: "under-centered-heading",
9564
+ colorToken: "primary"
9565
+ }
9566
+ }
9567
+ }),
9468
9568
  defineBlockAppearancePreset({
9469
9569
  kind: "block-design",
9470
9570
  id: "events-base-calendar",
@@ -9593,6 +9693,26 @@ var blockAppearancePresets = [
9593
9693
  testimonialCardTreatment: "accent-quote"
9594
9694
  }
9595
9695
  }),
9696
+ defineBlockAppearancePreset({
9697
+ kind: "block-design",
9698
+ id: "testimonials-soft-earth-proof-band",
9699
+ target: "testimonials",
9700
+ label: "Soft Earth proof band",
9701
+ blockKinds: ["block.testimonials"],
9702
+ design: {
9703
+ sectionSurface: "brand-depth-band",
9704
+ contentFrame: plainFrame,
9705
+ itemSurface: "none",
9706
+ transitionAfter: "soft-fade-short",
9707
+ emphasis: "high",
9708
+ testimonialCardTreatment: "accent-quote",
9709
+ headingDecoration: {
9710
+ family: "short-center-rule",
9711
+ placement: "under-centered-heading",
9712
+ colorToken: "border"
9713
+ }
9714
+ }
9715
+ }),
9596
9716
  defineBlockAppearancePreset({
9597
9717
  kind: "block-design",
9598
9718
  id: "faq-base-accordion",
@@ -9621,6 +9741,25 @@ var blockAppearancePresets = [
9621
9741
  emphasis: "low"
9622
9742
  }
9623
9743
  }),
9744
+ defineBlockAppearancePreset({
9745
+ kind: "block-design",
9746
+ id: "faq-soft-earth-two-column",
9747
+ target: "faq",
9748
+ label: "Soft Earth two-column FAQ",
9749
+ blockKinds: ["block.faq"],
9750
+ design: {
9751
+ sectionSurface: "base",
9752
+ contentFrame: plainFrame,
9753
+ itemSurface: "flat",
9754
+ transitionAfter: "none",
9755
+ emphasis: "medium",
9756
+ accordionIconTreatment: {
9757
+ iconSet: "plus",
9758
+ colorToken: "primary",
9759
+ motion: "swap"
9760
+ }
9761
+ }
9762
+ }),
9624
9763
  defineBlockAppearancePreset({
9625
9764
  kind: "block-design",
9626
9765
  id: "contact-form-panel",
@@ -10306,6 +10445,97 @@ var confidentChip = defineButtonPersonality({
10306
10445
  }
10307
10446
  });
10308
10447
 
10448
+ // ../theme-core/src/buttons/personalities/earth-pill.ts
10449
+ var earthPill = defineButtonPersonality({
10450
+ id: "earth-pill",
10451
+ name: "Earth Pill",
10452
+ description: "Compact terracotta pills with quiet primary-coloured ghost CTAs.",
10453
+ tags: { tone: "classic", energy: "calm", motion: "subtle", era: "organic" },
10454
+ buttonSystem: {
10455
+ global: {
10456
+ cornerStyle: "pill",
10457
+ shadow: "low",
10458
+ textTransform: "none",
10459
+ fontWeight: 500,
10460
+ borderWidth: 1,
10461
+ hoverTransform: "lift",
10462
+ hoverColor: "none",
10463
+ typography: "body",
10464
+ paddingPreset: "default"
10465
+ },
10466
+ sizes: {
10467
+ sm: { padding: "0.5rem 1rem", fontSize: "text-sm" },
10468
+ md: { padding: "0.625rem 1.35rem" },
10469
+ lg: { padding: "0.75rem 1.65rem", fontSize: "text-lg" },
10470
+ xl: { padding: "0.875rem 2rem", fontSize: "text-xl" }
10471
+ },
10472
+ variants: [
10473
+ {
10474
+ id: "primary",
10475
+ name: "Primary",
10476
+ enabled: true,
10477
+ priority: 1,
10478
+ background: { type: "solid", colorToken: "primary" },
10479
+ textColorToken: "primaryForeground",
10480
+ borderRadius: "rounded-full",
10481
+ shadow: { elevation: "low", softness: "soft", position: "bottom" },
10482
+ effects: {
10483
+ hover: [
10484
+ { effectId: "lift", options: { translateY: "-1px" } },
10485
+ { effectId: "background-on-hover", options: { colorToken: "accent" } }
10486
+ ],
10487
+ active: [{ effectId: "scale-down", options: { scale: "0.98" } }]
10488
+ }
10489
+ },
10490
+ {
10491
+ id: "secondary",
10492
+ name: "Secondary",
10493
+ enabled: true,
10494
+ priority: 2,
10495
+ background: { type: "transparent" },
10496
+ textColorToken: "primary",
10497
+ borderRadius: "rounded-full",
10498
+ border: { widthClass: "border", colorToken: "primary" },
10499
+ effects: {
10500
+ hover: [{ effectId: "background-on-hover", options: { colorToken: "muted" } }]
10501
+ }
10502
+ },
10503
+ {
10504
+ id: "outline",
10505
+ name: "Outline",
10506
+ enabled: true,
10507
+ priority: 3,
10508
+ background: { type: "transparent" },
10509
+ textColorToken: "text",
10510
+ borderRadius: "rounded-full",
10511
+ border: { widthClass: "border", colorToken: "border" },
10512
+ effects: {
10513
+ hover: [{ effectId: "background-on-hover", options: { colorToken: "surfaceAlt" } }]
10514
+ }
10515
+ },
10516
+ {
10517
+ id: "ghost",
10518
+ name: "Ghost",
10519
+ enabled: true,
10520
+ priority: 3,
10521
+ background: { type: "transparent" },
10522
+ textColorToken: "primary",
10523
+ borderRadius: "rounded-full",
10524
+ shadow: { elevation: "none", softness: null, position: "bottom" },
10525
+ sizes: {
10526
+ sm: { padding: "0.25rem 0", fontSize: "text-sm" },
10527
+ md: { padding: "0.375rem 0" },
10528
+ lg: { padding: "0.5rem 0", fontSize: "text-lg" },
10529
+ xl: { padding: "0.625rem 0", fontSize: "text-xl" }
10530
+ },
10531
+ effects: {
10532
+ hover: [{ effectId: "opacity-reduce", options: { reduction: 25 } }]
10533
+ }
10534
+ }
10535
+ ]
10536
+ }
10537
+ });
10538
+
10309
10539
  // ../theme-core/src/buttons/personalities/editorial-link.ts
10310
10540
  var editorialLink = defineButtonPersonality({
10311
10541
  id: "editorial-link",
@@ -10764,6 +10994,7 @@ var softPill = defineButtonPersonality({
10764
10994
  // ../theme-core/src/buttons/personalities/index.ts
10765
10995
  var buttonPersonalities = [
10766
10996
  softPill,
10997
+ earthPill,
10767
10998
  confidentChip,
10768
10999
  editorialLink,
10769
11000
  pebble,
@@ -11439,12 +11670,36 @@ var boxBackgroundSchema = z21.object({
11439
11670
  textColor: tokenOrCssColorValueSchema.nullable().optional(),
11440
11671
  headingColor: tokenOrCssColorValueSchema.nullable().optional()
11441
11672
  });
11673
+ var noHeadingDecorationSchema = z21.object({
11674
+ family: z21.literal("none"),
11675
+ placement: z21.literal("none")
11676
+ });
11677
+ var visibleHeadingDecorationSchema = z21.object({
11678
+ family: z21.enum(visibleHeadingDecorationFamilyValues),
11679
+ placement: z21.enum(visibleHeadingDecorationPlacementValues),
11680
+ colorToken: z21.enum(headingDecorationColorTokenValues).optional()
11681
+ });
11682
+ var headingDecorationSchema = z21.union([
11683
+ noHeadingDecorationSchema,
11684
+ visibleHeadingDecorationSchema
11685
+ ]);
11686
+ var accordionIconTreatmentSchema = z21.object({
11687
+ iconSet: z21.enum(accordionIconSetValues),
11688
+ colorToken: z21.enum(accordionIconColorTokenValues),
11689
+ openColorToken: z21.enum(accordionIconColorTokenValues).optional(),
11690
+ motion: z21.enum(accordionIconMotionValues)
11691
+ });
11442
11692
  var sectionStylesOverrideSchema = z21.object({
11443
11693
  background: boxBackgroundSchema.nullable().optional(),
11444
11694
  spacing: semanticSpacingSchema.nullable().optional(),
11445
11695
  minHeight: z21.enum(["none", "banner", "hero", "immersive"]).nullable().optional(),
11446
11696
  tileTreatment: z21.enum(tileTreatmentValues).nullable().optional(),
11447
- eyebrowTreatment: z21.enum(eyebrowTreatmentValues).nullable().optional()
11697
+ eyebrowTreatment: z21.enum(eyebrowTreatmentValues).nullable().optional(),
11698
+ headingDecoration: headingDecorationSchema.nullable().optional(),
11699
+ // Author-level override consumed by later block/editor rendering phases.
11700
+ // Keeping it in section styles lets existing block save APIs persist it.
11701
+ headingDecorationOverride: z21.enum(headingDecorationOverrideValues).nullable().optional(),
11702
+ accordionIconTreatment: accordionIconTreatmentSchema.nullable().optional()
11448
11703
  });
11449
11704
  var containerStylesOverrideSchema = z21.object({
11450
11705
  background: boxBackgroundSchema.nullable().optional(),
@@ -12152,6 +12407,28 @@ var warmNeutralCream = definePaletteVariant({
12152
12407
  { name: "border", hex: "#e0d2b8" }
12153
12408
  ]
12154
12409
  });
12410
+ var warmNeutralSoftEarth = definePaletteVariant({
12411
+ id: "warm-neutral-soft-earth",
12412
+ name: "Warm Neutral \u2014 Soft Earth",
12413
+ description: "Cream ground with terracotta primary, clay accents, and olive depth.",
12414
+ tags: { tone: "classic", energy: "calm", era: "organic" },
12415
+ mode: "light",
12416
+ colors: [
12417
+ { name: "primary", hex: "#a8573d" },
12418
+ { name: "secondary", hex: "#72765c" },
12419
+ { name: "accent", hex: "#c87557" },
12420
+ { name: "success", hex: "#687854" },
12421
+ { name: "warning", hex: "#b7863e" },
12422
+ { name: "destructive", hex: "#a54b3c" },
12423
+ { name: "background", hex: "#fbf6eb" },
12424
+ { name: "surface", hex: "#fffdf7" },
12425
+ { name: "surfaceAlt", hex: "#f0e4d3" },
12426
+ { name: "muted", hex: "#eadbc6" },
12427
+ { name: "text", hex: "#30281f" },
12428
+ { name: "primaryForeground", hex: "#fffaf3" },
12429
+ { name: "border", hex: "#d9c8b2" }
12430
+ ]
12431
+ });
12155
12432
  var warmNeutralForest = definePaletteVariant({
12156
12433
  id: "warm-neutral-forest",
12157
12434
  name: "Warm Neutral \u2014 Forest",
@@ -12185,6 +12462,7 @@ var paletteVariants = [
12185
12462
  // Warm-neutral family
12186
12463
  warmNeutralClay,
12187
12464
  warmNeutralCream,
12465
+ warmNeutralSoftEarth,
12188
12466
  warmNeutralForest,
12189
12467
  // High-contrast family
12190
12468
  highContrastInk,
@@ -12203,6 +12481,12 @@ var paletteVariantsById = new Map(
12203
12481
  function asHeaderLookId(value) {
12204
12482
  return value;
12205
12483
  }
12484
+ function asHeaderLayoutId(value) {
12485
+ return value;
12486
+ }
12487
+ function asHeaderStyleId(value) {
12488
+ return value;
12489
+ }
12206
12490
  function baseHeader(theme) {
12207
12491
  const {
12208
12492
  navLinkStyle: _navLinkStyle,
@@ -12221,6 +12505,309 @@ function baseHeader(theme) {
12221
12505
  navContainer: { type: "none", tint: null, opacity: 0.15 }
12222
12506
  };
12223
12507
  }
12508
+ var headerLayoutCatalog = [
12509
+ {
12510
+ id: asHeaderLayoutId("classic"),
12511
+ label: "Classic",
12512
+ description: "Logo and navigation in one practical horizontal row.",
12513
+ structure: "inline-classic",
12514
+ variant: "classic",
12515
+ defaultPositioning: "sticky",
12516
+ shrinkOnScroll: false
12517
+ },
12518
+ {
12519
+ id: asHeaderLayoutId("centered"),
12520
+ label: "Centered",
12521
+ description: "Logo centered above a balanced navigation row.",
12522
+ structure: "centered-stack",
12523
+ variant: "centered",
12524
+ defaultPositioning: "static",
12525
+ shrinkOnScroll: false,
12526
+ maxRecommendedNavItems: 5,
12527
+ allowedLogoShapes: ["none", "text-only", "horizontal", "square"]
12528
+ },
12529
+ {
12530
+ id: asHeaderLayoutId("editorial"),
12531
+ label: "Editorial",
12532
+ description: "A composed, magazine-like stacked header treatment.",
12533
+ structure: "editorial-stack",
12534
+ variant: "editorial",
12535
+ defaultPositioning: "static",
12536
+ shrinkOnScroll: false,
12537
+ maxRecommendedNavItems: 6
12538
+ },
12539
+ {
12540
+ id: asHeaderLayoutId("floating"),
12541
+ label: "Floating",
12542
+ description: "Detached header chrome that sits over the opening section.",
12543
+ structure: "floating-shell",
12544
+ variant: "floating",
12545
+ defaultPositioning: "fixed",
12546
+ shrinkOnScroll: true,
12547
+ maxRecommendedNavItems: 5,
12548
+ allowedLogoShapes: ["none", "text-only", "horizontal"]
12549
+ }
12550
+ ];
12551
+ function supportedLayouts(ids) {
12552
+ return ids.map(asHeaderLayoutId);
12553
+ }
12554
+ var headerStyleCatalog = [
12555
+ {
12556
+ id: asHeaderStyleId("minimal"),
12557
+ label: "Minimal",
12558
+ description: "Quiet surface with simple color-change navigation.",
12559
+ supportedLayoutIds: supportedLayouts(["classic", "centered", "editorial"]),
12560
+ navInteraction: "color-change",
12561
+ surface: "neutral"
12562
+ },
12563
+ {
12564
+ id: asHeaderStyleId("fine-line"),
12565
+ label: "Fine Line",
12566
+ description: "Light surface with a crisp lower rule and underline hover.",
12567
+ supportedLayoutIds: supportedLayouts(["classic", "centered", "editorial"]),
12568
+ navInteraction: "underline-grow",
12569
+ surface: "bordered"
12570
+ },
12571
+ {
12572
+ id: asHeaderStyleId("soft-bar"),
12573
+ label: "Soft Bar",
12574
+ description: "Soft tinted surface with gentle pill hover states.",
12575
+ supportedLayoutIds: supportedLayouts(["classic", "centered"]),
12576
+ navInteraction: "pill-background",
12577
+ surface: "soft"
12578
+ },
12579
+ {
12580
+ id: asHeaderStyleId("pill-nav"),
12581
+ label: "Pill Nav",
12582
+ description: "A calm pill navigation rail over a neutral header.",
12583
+ supportedLayoutIds: supportedLayouts(["classic", "centered"]),
12584
+ navInteraction: "pill-background",
12585
+ surface: "soft"
12586
+ },
12587
+ {
12588
+ id: asHeaderStyleId("brand-bar"),
12589
+ label: "Brand Bar",
12590
+ description: "Solid brand surface with high-contrast navigation.",
12591
+ supportedLayoutIds: supportedLayouts(["classic", "centered", "editorial"]),
12592
+ navInteraction: "color-change",
12593
+ surface: "brand-solid"
12594
+ },
12595
+ {
12596
+ id: asHeaderStyleId("brand-underline"),
12597
+ label: "Brand Underline",
12598
+ description: "Brand surface with underline-grow navigation.",
12599
+ supportedLayoutIds: supportedLayouts(["classic", "editorial"]),
12600
+ navInteraction: "underline-grow",
12601
+ surface: "brand-solid"
12602
+ },
12603
+ {
12604
+ id: asHeaderStyleId("brand-pill"),
12605
+ label: "Brand Pill",
12606
+ description: "Solid brand surface with rounded active and hover states.",
12607
+ supportedLayoutIds: supportedLayouts(["classic", "centered", "floating"]),
12608
+ navInteraction: "pill-background",
12609
+ surface: "brand-solid"
12610
+ },
12611
+ {
12612
+ id: asHeaderStyleId("editorial-line"),
12613
+ label: "Editorial Line",
12614
+ description: "Typographic logo treatment with understated underline navigation.",
12615
+ supportedLayoutIds: supportedLayouts(["classic", "centered", "editorial"]),
12616
+ navInteraction: "underline-grow",
12617
+ surface: "bordered"
12618
+ },
12619
+ {
12620
+ id: asHeaderStyleId("flat-tabs"),
12621
+ label: "Flat Tabs",
12622
+ description: "Flat block hover and active states with a Swiss utility feel.",
12623
+ supportedLayoutIds: supportedLayouts(["classic", "centered", "editorial"]),
12624
+ navInteraction: "flat-block",
12625
+ surface: "bordered"
12626
+ },
12627
+ {
12628
+ id: asHeaderStyleId("glass"),
12629
+ label: "Glass",
12630
+ description: "Floating translucent chrome with frosted navigation backing.",
12631
+ supportedLayoutIds: supportedLayouts(["floating"]),
12632
+ navInteraction: "glass-backed",
12633
+ surface: "floating",
12634
+ requiresFloatingLayout: true
12635
+ },
12636
+ {
12637
+ id: asHeaderStyleId("minimal-surface"),
12638
+ label: "Minimal Surface",
12639
+ description: "Floating chrome with a restrained translucent surface.",
12640
+ supportedLayoutIds: supportedLayouts(["floating"]),
12641
+ navInteraction: "color-change",
12642
+ surface: "floating",
12643
+ requiresFloatingLayout: true
12644
+ },
12645
+ {
12646
+ id: asHeaderStyleId("soft-shell"),
12647
+ label: "Soft Shell",
12648
+ description: "Floating rounded shell with soft pill navigation states.",
12649
+ supportedLayoutIds: supportedLayouts(["floating"]),
12650
+ navInteraction: "pill-background",
12651
+ surface: "floating",
12652
+ requiresFloatingLayout: true
12653
+ }
12654
+ ];
12655
+ var headerLayoutsById = new Map(
12656
+ headerLayoutCatalog.map((layout) => [layout.id, layout])
12657
+ );
12658
+ var headerStylesById = new Map(
12659
+ headerStyleCatalog.map((style) => [style.id, style])
12660
+ );
12661
+ var headerStyleCompatibilityOrder = /* @__PURE__ */ new Map([
12662
+ [
12663
+ asHeaderLayoutId("classic"),
12664
+ headerStyleRepairChain([
12665
+ "minimal",
12666
+ "fine-line",
12667
+ "soft-bar",
12668
+ "pill-nav",
12669
+ "brand-bar",
12670
+ "brand-underline",
12671
+ "brand-pill",
12672
+ "editorial-line",
12673
+ "flat-tabs"
12674
+ ])
12675
+ ],
12676
+ [
12677
+ asHeaderLayoutId("centered"),
12678
+ headerStyleRepairChain([
12679
+ "minimal",
12680
+ "fine-line",
12681
+ "soft-bar",
12682
+ "pill-nav",
12683
+ "brand-bar",
12684
+ "brand-pill",
12685
+ "editorial-line",
12686
+ "flat-tabs"
12687
+ ])
12688
+ ],
12689
+ [
12690
+ asHeaderLayoutId("editorial"),
12691
+ headerStyleRepairChain([
12692
+ "minimal",
12693
+ "fine-line",
12694
+ "soft-bar",
12695
+ "brand-bar",
12696
+ "brand-underline",
12697
+ "editorial-line",
12698
+ "flat-tabs"
12699
+ ])
12700
+ ],
12701
+ [
12702
+ asHeaderLayoutId("floating"),
12703
+ headerStyleRepairChain([
12704
+ "glass",
12705
+ "minimal-surface",
12706
+ "soft-shell",
12707
+ "brand-pill"
12708
+ ])
12709
+ ]
12710
+ ]);
12711
+ function headerStyleRepairChain(values) {
12712
+ return values.map(asHeaderStyleId);
12713
+ }
12714
+ var headerStyleRepairOrder = /* @__PURE__ */ new Map([
12715
+ [asHeaderStyleId("brand-bar"), headerStyleRepairChain(["brand-bar", "brand-pill", "minimal"])],
12716
+ [asHeaderStyleId("brand-underline"), headerStyleRepairChain(["editorial-line", "fine-line", "minimal"])],
12717
+ [asHeaderStyleId("brand-pill"), headerStyleRepairChain(["brand-pill", "brand-bar", "minimal"])],
12718
+ [asHeaderStyleId("pill-nav"), headerStyleRepairChain(["pill-nav", "soft-bar", "minimal"])],
12719
+ [asHeaderStyleId("flat-tabs"), headerStyleRepairChain(["flat-tabs", "pill-nav", "minimal"])],
12720
+ [asHeaderStyleId("editorial-line"), headerStyleRepairChain(["editorial-line", "fine-line", "minimal"])],
12721
+ [asHeaderStyleId("glass"), headerStyleRepairChain(["glass", "minimal-surface", "minimal"])],
12722
+ [asHeaderStyleId("soft-shell"), headerStyleRepairChain(["soft-shell", "soft-bar", "minimal"])],
12723
+ [asHeaderStyleId("minimal-surface"), headerStyleRepairChain(["minimal-surface", "minimal"])],
12724
+ [asHeaderStyleId("fine-line"), headerStyleRepairChain(["fine-line", "minimal"])],
12725
+ [asHeaderStyleId("soft-bar"), headerStyleRepairChain(["soft-bar", "minimal"])],
12726
+ [asHeaderStyleId("minimal"), headerStyleRepairChain(["minimal"])]
12727
+ ]);
12728
+ var legacyHeaderLookAliases = [
12729
+ {
12730
+ lookId: asHeaderLookId("clean-base"),
12731
+ selection: {
12732
+ layoutId: asHeaderLayoutId("classic"),
12733
+ styleId: asHeaderStyleId("minimal")
12734
+ }
12735
+ },
12736
+ {
12737
+ lookId: asHeaderLookId("brand-solid"),
12738
+ selection: {
12739
+ layoutId: asHeaderLayoutId("classic"),
12740
+ styleId: asHeaderStyleId("brand-bar")
12741
+ }
12742
+ },
12743
+ {
12744
+ lookId: asHeaderLookId("editorial-line"),
12745
+ selection: {
12746
+ layoutId: asHeaderLayoutId("editorial"),
12747
+ styleId: asHeaderStyleId("editorial-line")
12748
+ }
12749
+ },
12750
+ {
12751
+ lookId: asHeaderLookId("centered-calm"),
12752
+ selection: {
12753
+ layoutId: asHeaderLayoutId("centered"),
12754
+ styleId: asHeaderStyleId("minimal")
12755
+ }
12756
+ },
12757
+ {
12758
+ lookId: asHeaderLookId("practical-utility"),
12759
+ selection: {
12760
+ layoutId: asHeaderLayoutId("classic"),
12761
+ styleId: asHeaderStyleId("flat-tabs")
12762
+ }
12763
+ },
12764
+ {
12765
+ lookId: asHeaderLookId("minimal-transparent"),
12766
+ selection: {
12767
+ layoutId: asHeaderLayoutId("classic"),
12768
+ styleId: asHeaderStyleId("minimal")
12769
+ }
12770
+ },
12771
+ {
12772
+ lookId: asHeaderLookId("transparent-overlay"),
12773
+ selection: {
12774
+ layoutId: asHeaderLayoutId("floating"),
12775
+ styleId: asHeaderStyleId("glass")
12776
+ }
12777
+ },
12778
+ {
12779
+ lookId: asHeaderLookId("floating-glass"),
12780
+ selection: {
12781
+ layoutId: asHeaderLayoutId("floating"),
12782
+ styleId: asHeaderStyleId("glass")
12783
+ }
12784
+ }
12785
+ ];
12786
+ var legacyHeaderLookAliasesById = new Map(
12787
+ legacyHeaderLookAliases.map((alias) => [alias.lookId, alias])
12788
+ );
12789
+ function getHeaderStyle(id) {
12790
+ return headerStylesById.get(id) ?? null;
12791
+ }
12792
+ function isHeaderStyleCompatibleWithLayout(style, layoutId) {
12793
+ return style.supportedLayoutIds.includes(layoutId);
12794
+ }
12795
+ function getHeaderStyleOrThrow(id) {
12796
+ const style = getHeaderStyle(id);
12797
+ if (!style) {
12798
+ throw new Error(`Unknown Theme V2 header style: ${id}`);
12799
+ }
12800
+ return style;
12801
+ }
12802
+ function resolveLegacyHeaderLookAlias(lookId) {
12803
+ return legacyHeaderLookAliasesById.get(lookId)?.selection ?? null;
12804
+ }
12805
+ function getCompatibleHeaderStyleIds(layoutId) {
12806
+ return (headerStyleCompatibilityOrder.get(layoutId) ?? []).filter((styleId) => {
12807
+ const style = getHeaderStyleOrThrow(styleId);
12808
+ return isHeaderStyleCompatibleWithLayout(style, layoutId);
12809
+ });
12810
+ }
12224
12811
  function solidBrandHeader(theme) {
12225
12812
  const ctaVariant = resolveHeaderCtaVariant(theme, "inverted");
12226
12813
  return {
@@ -12457,6 +13044,11 @@ var headerLookCatalog = [
12457
13044
  label: "Clean base",
12458
13045
  visualTreatment: "solid-neutral",
12459
13046
  layoutBehavior: "sticky",
13047
+ configuration: {
13048
+ structure: "inline-classic",
13049
+ treatment: "solid-neutral",
13050
+ behavior: "sticky"
13051
+ },
12460
13052
  openingRequirement: "none",
12461
13053
  compile: cleanBaseHeader
12462
13054
  },
@@ -12465,6 +13057,11 @@ var headerLookCatalog = [
12465
13057
  label: "Brand solid",
12466
13058
  visualTreatment: "solid-brand",
12467
13059
  layoutBehavior: "sticky-shrink",
13060
+ configuration: {
13061
+ structure: "inline-classic",
13062
+ treatment: "solid-brand",
13063
+ behavior: "sticky-shrink"
13064
+ },
12468
13065
  openingRequirement: "none",
12469
13066
  compile: solidBrandHeader
12470
13067
  },
@@ -12473,6 +13070,11 @@ var headerLookCatalog = [
12473
13070
  label: "Editorial line",
12474
13071
  visualTreatment: "light-editorial",
12475
13072
  layoutBehavior: "sticky",
13073
+ configuration: {
13074
+ structure: "editorial-stack",
13075
+ treatment: "light-editorial",
13076
+ behavior: "sticky"
13077
+ },
12476
13078
  openingRequirement: "none",
12477
13079
  maxRecommendedNavItems: 6,
12478
13080
  compile: editorialLineHeader
@@ -12482,6 +13084,11 @@ var headerLookCatalog = [
12482
13084
  label: "Centered calm",
12483
13085
  visualTreatment: "light-editorial",
12484
13086
  layoutBehavior: "normal-flow",
13087
+ configuration: {
13088
+ structure: "centered-stack",
13089
+ treatment: "light-editorial",
13090
+ behavior: "normal-flow"
13091
+ },
12485
13092
  openingRequirement: "none",
12486
13093
  maxRecommendedNavItems: 5,
12487
13094
  allowedLogoShapes: ["none", "text-only", "horizontal", "square"],
@@ -12492,6 +13099,11 @@ var headerLookCatalog = [
12492
13099
  label: "Practical utility",
12493
13100
  visualTreatment: "solid-neutral",
12494
13101
  layoutBehavior: "sticky-shrink",
13102
+ configuration: {
13103
+ structure: "inline-classic",
13104
+ treatment: "solid-neutral",
13105
+ behavior: "sticky-shrink"
13106
+ },
12495
13107
  openingRequirement: "none",
12496
13108
  requiresProminentCta: true,
12497
13109
  compile: practicalUtilityHeader
@@ -12501,6 +13113,11 @@ var headerLookCatalog = [
12501
13113
  label: "Minimal transparent",
12502
13114
  visualTreatment: "minimal-transparent",
12503
13115
  layoutBehavior: "normal-flow",
13116
+ configuration: {
13117
+ structure: "inline-classic",
13118
+ treatment: "minimal-transparent",
13119
+ behavior: "normal-flow"
13120
+ },
12504
13121
  openingRequirement: "reserved-space-ok",
12505
13122
  compile: minimalTransparentHeader
12506
13123
  },
@@ -12509,6 +13126,11 @@ var headerLookCatalog = [
12509
13126
  label: "Transparent overlay",
12510
13127
  visualTreatment: "transparent-overlay",
12511
13128
  layoutBehavior: "fixed-overlay",
13129
+ configuration: {
13130
+ structure: "inline-classic",
13131
+ treatment: "transparent-overlay",
13132
+ behavior: "fixed-overlay"
13133
+ },
12512
13134
  openingRequirement: "requires-image-hero-with-contrast-overlay",
12513
13135
  maxRecommendedNavItems: 5,
12514
13136
  allowedLogoShapes: ["none", "text-only", "horizontal"],
@@ -12519,6 +13141,11 @@ var headerLookCatalog = [
12519
13141
  label: "Floating glass",
12520
13142
  visualTreatment: "floating-glass",
12521
13143
  layoutBehavior: "fixed-floating",
13144
+ configuration: {
13145
+ structure: "floating-shell",
13146
+ treatment: "floating-glass",
13147
+ behavior: "fixed-floating"
13148
+ },
12522
13149
  openingRequirement: "requires-image-hero-with-contrast-overlay",
12523
13150
  maxRecommendedNavItems: 5,
12524
13151
  allowedLogoShapes: ["none", "text-only", "horizontal"],
@@ -12526,9 +13153,17 @@ var headerLookCatalog = [
12526
13153
  }
12527
13154
  ];
12528
13155
  var guaranteedFallbackHeaderLookId = asHeaderLookId("clean-base");
13156
+ var guaranteedFallbackHeaderLayoutId = asHeaderLayoutId("classic");
13157
+ var guaranteedFallbackHeaderStyleId = asHeaderStyleId("minimal");
13158
+ var allowedHeaderConfigurationKeys = new Set(
13159
+ headerLookCatalog.map((look) => headerConfigurationKey(look.configuration))
13160
+ );
12529
13161
  var headerLooksById = new Map(
12530
13162
  headerLookCatalog.map((look) => [look.id, look])
12531
13163
  );
13164
+ function headerConfigurationKey(configuration) {
13165
+ return `${configuration.structure}:${configuration.treatment}:${configuration.behavior}`;
13166
+ }
12532
13167
 
12533
13168
  // ../theme-core/src/site-styles/footerLooks.ts
12534
13169
  function asFooterLookId(value) {
@@ -12661,6 +13296,264 @@ var advancedDesignOptionCatalog = {
12661
13296
  detachedCustom: true
12662
13297
  };
12663
13298
 
13299
+ // ../theme-core/src/site-styles/typographyPresets.ts
13300
+ var bodyReadablePolicy = {
13301
+ recommendedCategories: ["sans-serif", "serif"],
13302
+ allowedCategories: ["sans-serif", "serif"],
13303
+ requiresItalicForBody: true,
13304
+ requiresBoldForBody: true
13305
+ };
13306
+ var headingFlexiblePolicy = {
13307
+ recommendedCategories: ["sans-serif", "serif", "display"],
13308
+ allowedCategories: ["sans-serif", "serif", "display"]
13309
+ };
13310
+ var displayHeadingPolicy = {
13311
+ recommendedCategories: ["display", "sans-serif", "serif"],
13312
+ allowedCategories: ["display", "sans-serif", "serif"]
13313
+ };
13314
+ function asTypographyPresetId(value) {
13315
+ if (!value.startsWith("typography-preset:")) {
13316
+ throw new Error(`TypographyPresetId must start with "typography-preset:". Received: ${value}`);
13317
+ }
13318
+ return value;
13319
+ }
13320
+ function defineTypographyPreset(preset2) {
13321
+ return {
13322
+ ...preset2,
13323
+ id: asTypographyPresetId(preset2.id)
13324
+ };
13325
+ }
13326
+ var modernSansTypography = {
13327
+ body: {
13328
+ family: "Inter, system-ui, sans-serif",
13329
+ size: "md",
13330
+ weight: "regular",
13331
+ lineHeight: "relaxed",
13332
+ letterSpacing: "normal"
13333
+ },
13334
+ headings: {
13335
+ default: {
13336
+ family: "Inter, system-ui, sans-serif",
13337
+ weight: "semibold",
13338
+ lineHeight: "normal",
13339
+ letterSpacing: "tight",
13340
+ italic: null,
13341
+ case: null
13342
+ },
13343
+ h1: { size: "xl", weight: "bold", lineHeight: "normal", letterSpacing: "tight", italic: null },
13344
+ h2: { size: "lg", weight: "semibold", lineHeight: "normal", letterSpacing: "tight", italic: null },
13345
+ h3: { size: "md", weight: "semibold", lineHeight: "normal", letterSpacing: "normal", italic: null }
13346
+ },
13347
+ scale: "balanced"
13348
+ };
13349
+ var warmRoundedTypography = {
13350
+ body: {
13351
+ family: "Nunito Sans, system-ui, sans-serif",
13352
+ size: "lg",
13353
+ weight: "regular",
13354
+ lineHeight: "relaxed",
13355
+ letterSpacing: "normal"
13356
+ },
13357
+ headings: {
13358
+ default: {
13359
+ family: "Nunito Sans, system-ui, sans-serif",
13360
+ weight: "bold",
13361
+ lineHeight: "normal",
13362
+ letterSpacing: "normal",
13363
+ italic: null,
13364
+ case: null
13365
+ },
13366
+ h1: { size: "xl", weight: "bold", lineHeight: "normal", letterSpacing: "normal", italic: null },
13367
+ h2: { size: "lg", weight: "bold", lineHeight: "normal", letterSpacing: "normal", italic: null },
13368
+ h3: { size: "md", weight: "semibold", lineHeight: "relaxed", letterSpacing: "normal", italic: null }
13369
+ },
13370
+ scale: "balanced"
13371
+ };
13372
+ var editorialSerifTypography = {
13373
+ body: {
13374
+ family: "Lora, Georgia, serif",
13375
+ size: "lg",
13376
+ weight: "regular",
13377
+ lineHeight: "loose",
13378
+ letterSpacing: "normal"
13379
+ },
13380
+ headings: {
13381
+ default: {
13382
+ family: "Playfair Display, Georgia, serif",
13383
+ weight: "semibold",
13384
+ lineHeight: "normal",
13385
+ letterSpacing: "tight",
13386
+ italic: null,
13387
+ case: null
13388
+ },
13389
+ h1: { size: "2xl", weight: "semibold", lineHeight: "normal", letterSpacing: "tight", italic: null },
13390
+ h2: { size: "xl", weight: "semibold", lineHeight: "normal", letterSpacing: "normal", italic: null },
13391
+ h3: { size: "md", weight: "semibold", lineHeight: "relaxed", letterSpacing: "normal", italic: true }
13392
+ },
13393
+ scale: "spacious"
13394
+ };
13395
+ var classicSerifTypography = {
13396
+ body: {
13397
+ family: "Libre Baskerville, Georgia, serif",
13398
+ size: "md",
13399
+ weight: "regular",
13400
+ lineHeight: "relaxed",
13401
+ letterSpacing: "normal"
13402
+ },
13403
+ headings: {
13404
+ default: {
13405
+ family: "Cormorant Garamond, Georgia, serif",
13406
+ weight: "semibold",
13407
+ lineHeight: "normal",
13408
+ letterSpacing: "normal",
13409
+ italic: null,
13410
+ case: null
13411
+ },
13412
+ h1: { size: "2xl", weight: "semibold", lineHeight: "normal", letterSpacing: "normal", italic: null },
13413
+ h2: { size: "xl", weight: "semibold", lineHeight: "normal", letterSpacing: "normal", italic: null },
13414
+ h3: { size: "md", weight: "medium", lineHeight: "relaxed", letterSpacing: "normal", italic: null }
13415
+ },
13416
+ scale: "balanced"
13417
+ };
13418
+ var luxeContrastTypography = {
13419
+ body: {
13420
+ family: "Manrope, system-ui, sans-serif",
13421
+ size: "md",
13422
+ weight: "regular",
13423
+ lineHeight: "relaxed",
13424
+ letterSpacing: "normal"
13425
+ },
13426
+ headings: {
13427
+ default: {
13428
+ family: "Cormorant Garamond, Georgia, serif",
13429
+ weight: "semibold",
13430
+ lineHeight: "normal",
13431
+ letterSpacing: "tight",
13432
+ italic: null,
13433
+ case: null
13434
+ },
13435
+ h1: { size: "2xl", weight: "semibold", lineHeight: "normal", letterSpacing: "tight", italic: null },
13436
+ h2: { size: "xl", weight: "semibold", lineHeight: "normal", letterSpacing: "tight", italic: null },
13437
+ h3: { size: "md", weight: "medium", lineHeight: "relaxed", letterSpacing: "normal", italic: null }
13438
+ },
13439
+ scale: "spacious"
13440
+ };
13441
+ var boldDisplayTypography = {
13442
+ body: {
13443
+ family: "Manrope, system-ui, sans-serif",
13444
+ size: "lg",
13445
+ weight: "regular",
13446
+ lineHeight: "relaxed",
13447
+ letterSpacing: "normal"
13448
+ },
13449
+ headings: {
13450
+ default: {
13451
+ family: '"TAN - PEARL", sans-serif',
13452
+ weight: "bold",
13453
+ lineHeight: "normal",
13454
+ letterSpacing: "tight",
13455
+ colorToken: "primary",
13456
+ italic: null,
13457
+ case: null
13458
+ },
13459
+ h1: { size: "xl", weight: "bold", lineHeight: "normal", letterSpacing: "tight", italic: null },
13460
+ h2: { size: "lg", weight: "bold", lineHeight: "normal", letterSpacing: "normal", italic: null },
13461
+ h3: { size: "md", weight: "bold", lineHeight: "normal", letterSpacing: "normal", italic: null }
13462
+ },
13463
+ scale: "balanced"
13464
+ };
13465
+ var typographyPresets = [
13466
+ defineTypographyPreset({
13467
+ id: "typography-preset:modern-sans",
13468
+ name: "Modern Sans",
13469
+ description: "Crisp, neutral type for clear service pages and practical editorial structure.",
13470
+ defaultFonts: { body: "Inter, system-ui, sans-serif", heading: "Inter, system-ui, sans-serif" },
13471
+ recommendedFonts: {
13472
+ body: ["Inter", "Source Sans 3", "IBM Plex Sans"],
13473
+ heading: ["Inter", "Manrope", "Source Sans 3"]
13474
+ },
13475
+ slotPolicies: { body: bodyReadablePolicy, heading: headingFlexiblePolicy },
13476
+ typography: modernSansTypography
13477
+ }),
13478
+ defineTypographyPreset({
13479
+ id: "typography-preset:warm-rounded",
13480
+ name: "Warm Rounded",
13481
+ description: "Soft, friendly type for welcoming studios, classes, and community businesses.",
13482
+ defaultFonts: { body: "Nunito Sans, system-ui, sans-serif", heading: "Nunito Sans, system-ui, sans-serif" },
13483
+ recommendedFonts: {
13484
+ body: ["Nunito Sans", "Atkinson Hyperlegible", "Lato"],
13485
+ heading: ["Nunito Sans", "Quicksand", "Manrope"]
13486
+ },
13487
+ slotPolicies: { body: bodyReadablePolicy, heading: headingFlexiblePolicy },
13488
+ typography: warmRoundedTypography
13489
+ }),
13490
+ defineTypographyPreset({
13491
+ id: "typography-preset:editorial-serif",
13492
+ name: "Editorial Serif",
13493
+ description: "Story-led type with warm reading rhythm and expressive headings.",
13494
+ defaultFonts: { body: "Lora, Georgia, serif", heading: "Playfair Display, Georgia, serif" },
13495
+ recommendedFonts: {
13496
+ body: ["Lora", "Source Serif 4", "Libre Baskerville"],
13497
+ heading: ["Playfair Display", "Cormorant Garamond", "Fraunces"]
13498
+ },
13499
+ slotPolicies: { body: bodyReadablePolicy, heading: displayHeadingPolicy },
13500
+ typography: editorialSerifTypography
13501
+ }),
13502
+ defineTypographyPreset({
13503
+ id: "typography-preset:classic-serif",
13504
+ name: "Classic Serif",
13505
+ description: "Measured, polished type for premium and established offers.",
13506
+ defaultFonts: { body: "Libre Baskerville, Georgia, serif", heading: "Cormorant Garamond, Georgia, serif" },
13507
+ recommendedFonts: {
13508
+ body: ["Libre Baskerville", "Source Serif 4", "Lora"],
13509
+ heading: ["Cormorant Garamond", "Playfair Display", "Libre Baskerville"]
13510
+ },
13511
+ slotPolicies: { body: bodyReadablePolicy, heading: displayHeadingPolicy },
13512
+ typography: classicSerifTypography
13513
+ }),
13514
+ defineTypographyPreset({
13515
+ id: "typography-preset:luxe-contrast",
13516
+ name: "Luxe Contrast",
13517
+ description: "A restrained sans body paired with elegant high-contrast headings.",
13518
+ defaultFonts: { body: "Manrope, system-ui, sans-serif", heading: "Cormorant Garamond, Georgia, serif" },
13519
+ recommendedFonts: {
13520
+ body: ["Manrope", "Inter", "Source Sans 3"],
13521
+ heading: ["Cormorant Garamond", "Playfair Display", "Bodoni Moda"]
13522
+ },
13523
+ slotPolicies: { body: bodyReadablePolicy, heading: displayHeadingPolicy },
13524
+ typography: luxeContrastTypography
13525
+ }),
13526
+ defineTypographyPreset({
13527
+ id: "typography-preset:bold-display",
13528
+ name: "Bold Display",
13529
+ description: "Punchy display headings with readable sans body copy for branded launches.",
13530
+ defaultFonts: { body: "Manrope, system-ui, sans-serif", heading: '"TAN - PEARL", sans-serif' },
13531
+ recommendedFonts: {
13532
+ body: ["Manrope", "Inter", "Space Grotesk"],
13533
+ heading: ["Anton", "Bebas Neue", "Archivo Black"]
13534
+ },
13535
+ slotPolicies: { body: bodyReadablePolicy, heading: displayHeadingPolicy },
13536
+ typography: boldDisplayTypography,
13537
+ heroTypography: {
13538
+ headlineSize: "6xl",
13539
+ headlineLineHeight: "tight",
13540
+ subheadlineSize: "editorial",
13541
+ subheadlineLineHeight: "normal",
13542
+ microHeadlineSize: "6xl",
13543
+ microHeadlineLineHeight: "tight",
13544
+ microSubheadlineSize: "xl",
13545
+ microSubheadlineLineHeight: "normal",
13546
+ responsive: {
13547
+ tablet: { headlineSize: "5xl" },
13548
+ mobile: { headlineSize: "4xl", subheadlineSize: "xl" }
13549
+ }
13550
+ }
13551
+ })
13552
+ ];
13553
+ var typographyPresetsById = new Map(
13554
+ typographyPresets.map((preset2) => [preset2.id, preset2])
13555
+ );
13556
+
12664
13557
  // ../theme-core/src/site-styles/curatedSiteStyles.ts
12665
13558
  var curatedSiteStyleIdValues = [
12666
13559
  "site-style:calm-studio",
@@ -12673,6 +13566,7 @@ var curatedSiteStyleIdValues = [
12673
13566
  "site-style:personal-retreat-journal",
12674
13567
  "site-style:tactile-workshop",
12675
13568
  "site-style:modern-wellness",
13569
+ "site-style:soft-earth",
12676
13570
  "site-style:bold-launch",
12677
13571
  "site-style:south-west-twerk-school"
12678
13572
  ];
@@ -12749,6 +13643,15 @@ function uniqueContentFrameKinds() {
12749
13643
  }
12750
13644
  var generatedContentFrameKinds = uniqueContentFrameKinds();
12751
13645
  function defineCuratedSiteStyle(input) {
13646
+ const legacyHeaderLookIds = input.recommendedHeaderLookIds ?? ["clean-base"];
13647
+ const inferredHeaderCuration = inferHeaderCurationFromLegacyLooks(legacyHeaderLookIds);
13648
+ const typographyPresetChoices = input.typographyPresetChoices ?? defaultTypographyPresetChoicesForRecipe(input.tokenRecipes.typography);
13649
+ const defaultTypographyPresetId = input.defaultTypographyPresetId ? asTypographyPresetId(input.defaultTypographyPresetId) : typographyPresetChoices[0].id;
13650
+ if (!typographyPresetChoices.some((choice) => choice.id === defaultTypographyPresetId)) {
13651
+ throw new Error(
13652
+ `Default typography preset ${defaultTypographyPresetId} is not curated for site style ${input.id}.`
13653
+ );
13654
+ }
12752
13655
  return {
12753
13656
  id: asSiteStyleId(input.id),
12754
13657
  name: input.name,
@@ -12769,11 +13672,23 @@ function defineCuratedSiteStyle(input) {
12769
13672
  },
12770
13673
  ...input.themeOverrides ? { themeOverrides: input.themeOverrides } : {},
12771
13674
  recommendedAppearancePresetIds: (input.recommendedAppearancePresetIds ?? []).map(asAppearancePresetId),
12772
- recommendedHeaderLookIds: (input.recommendedHeaderLookIds ?? ["clean-base"]).map(asHeaderLookId),
13675
+ defaultHeaderSelection: input.defaultHeaderSelection ? {
13676
+ layoutId: asHeaderLayoutId(input.defaultHeaderSelection.layoutId),
13677
+ styleId: asHeaderStyleId(input.defaultHeaderSelection.styleId)
13678
+ } : inferredHeaderCuration.defaultHeaderSelection,
13679
+ recommendedHeaderLayoutChoices: input.recommendedHeaderLayoutChoices ?? inferredHeaderCuration.recommendedHeaderLayoutChoices,
13680
+ recommendedHeaderStyleChoicesByLayout: input.recommendedHeaderStyleChoicesByLayout ?? inferredHeaderCuration.recommendedHeaderStyleChoicesByLayout,
13681
+ discouragedHeaderSelections: input.discouragedHeaderSelections?.map((selection) => ({
13682
+ layoutId: asHeaderLayoutId(selection.layoutId),
13683
+ styleId: asHeaderStyleId(selection.styleId)
13684
+ })),
13685
+ recommendedHeaderLookIds: legacyHeaderLookIds.map(asHeaderLookId),
12773
13686
  // Empty is intentional: resolveFooterLook always appends its guaranteed fallback.
12774
13687
  recommendedFooterLookIds: (input.recommendedFooterLookIds ?? []).map(asFooterLookId),
12775
13688
  buttonPersonalityChoices: input.buttonPersonalityChoices,
12776
- paletteVariantChoices: input.paletteVariantChoices
13689
+ paletteVariantChoices: input.paletteVariantChoices,
13690
+ typographyPresetChoices,
13691
+ defaultTypographyPresetId
12777
13692
  };
12778
13693
  }
12779
13694
  function buttonChoice(id, note) {
@@ -12782,6 +13697,88 @@ function buttonChoice(id, note) {
12782
13697
  function paletteChoice(id, note) {
12783
13698
  return note ? { id: asPaletteVariantId(id), note } : { id: asPaletteVariantId(id) };
12784
13699
  }
13700
+ function headerLayoutChoice(id, note) {
13701
+ return note ? { id: asHeaderLayoutId(id), note } : { id: asHeaderLayoutId(id) };
13702
+ }
13703
+ function headerStyleChoice(id, note) {
13704
+ return note ? { id: asHeaderStyleId(id), note } : { id: asHeaderStyleId(id) };
13705
+ }
13706
+ function headerLayoutRecordKey(id) {
13707
+ return id;
13708
+ }
13709
+ function uniqueHeaderLayoutChoices(choices) {
13710
+ const seen = /* @__PURE__ */ new Set();
13711
+ const unique = choices.filter((choice) => {
13712
+ if (seen.has(choice.id)) return false;
13713
+ seen.add(choice.id);
13714
+ return true;
13715
+ });
13716
+ const first = unique[0];
13717
+ if (!first) {
13718
+ throw new Error("Expected at least one curated header layout choice.");
13719
+ }
13720
+ return [first, ...unique.slice(1)];
13721
+ }
13722
+ function nonEmptyHeaderStyleChoices(choices, fallbackLayoutId) {
13723
+ const first = choices[0] ?? {
13724
+ id: getCompatibleHeaderStyleIds(fallbackLayoutId)[0] ?? asHeaderStyleId("minimal")
13725
+ };
13726
+ return [first, ...choices.slice(1)];
13727
+ }
13728
+ function inferHeaderCurationFromLegacyLooks(lookIds) {
13729
+ const selections = lookIds.map((lookId) => resolveLegacyHeaderLookAlias(asHeaderLookId(lookId))).filter((selection) => Boolean(selection));
13730
+ const defaultHeaderSelection = selections[0] ?? {
13731
+ layoutId: asHeaderLayoutId("classic"),
13732
+ styleId: asHeaderStyleId("minimal")
13733
+ };
13734
+ const layoutChoices = uniqueHeaderLayoutChoices(
13735
+ selections.map((selection) => headerLayoutChoice(selection.layoutId))
13736
+ );
13737
+ const stylesByLayout = {};
13738
+ for (const layoutChoice of layoutChoices) {
13739
+ const styleChoices = selections.filter((selection) => selection.layoutId === layoutChoice.id).map((selection) => headerStyleChoice(selection.styleId));
13740
+ stylesByLayout[headerLayoutRecordKey(layoutChoice.id)] = nonEmptyHeaderStyleChoices(
13741
+ styleChoices,
13742
+ layoutChoice.id
13743
+ );
13744
+ }
13745
+ return {
13746
+ defaultHeaderSelection,
13747
+ recommendedHeaderLayoutChoices: layoutChoices,
13748
+ recommendedHeaderStyleChoicesByLayout: stylesByLayout
13749
+ };
13750
+ }
13751
+ function typographyChoice(id, note) {
13752
+ return note ? { id: asTypographyPresetId(id), note } : { id: asTypographyPresetId(id) };
13753
+ }
13754
+ function defaultTypographyPresetChoicesForRecipe(recipe) {
13755
+ switch (recipe) {
13756
+ case "clean-sans":
13757
+ return [
13758
+ typographyChoice("typography-preset:modern-sans"),
13759
+ typographyChoice("typography-preset:luxe-contrast"),
13760
+ typographyChoice("typography-preset:bold-display")
13761
+ ];
13762
+ case "friendly-sans":
13763
+ return [
13764
+ typographyChoice("typography-preset:warm-rounded"),
13765
+ typographyChoice("typography-preset:modern-sans"),
13766
+ typographyChoice("typography-preset:editorial-serif")
13767
+ ];
13768
+ case "serif-editorial":
13769
+ return [
13770
+ typographyChoice("typography-preset:editorial-serif"),
13771
+ typographyChoice("typography-preset:classic-serif"),
13772
+ typographyChoice("typography-preset:warm-rounded")
13773
+ ];
13774
+ case "classic-serif":
13775
+ return [
13776
+ typographyChoice("typography-preset:classic-serif"),
13777
+ typographyChoice("typography-preset:luxe-contrast"),
13778
+ typographyChoice("typography-preset:editorial-serif")
13779
+ ];
13780
+ }
13781
+ }
12785
13782
  var curatedSiteStyles = [
12786
13783
  defineCuratedSiteStyle({
12787
13784
  id: "site-style:calm-studio",
@@ -13107,6 +14104,102 @@ var curatedSiteStyles = [
13107
14104
  paletteChoice("warm-neutral-clay")
13108
14105
  ]
13109
14106
  }),
14107
+ defineCuratedSiteStyle({
14108
+ id: "site-style:soft-earth",
14109
+ name: "Soft Earth",
14110
+ description: "Warm, grounded, and editorial for yoga studios, retreats, and wellbeing communities.",
14111
+ generationBrief: "Use cream space, terracotta CTAs, olive proof bands, natural imagery, generous but composed spacing, and editorial serif headings. Prefer a real intro section, image-led offering cards, warm community proof, and a simple two-column FAQ when content allows.",
14112
+ siteCreatorSelection: { kind: "site_creator_keyword_heuristic", priority: 45 },
14113
+ selectionKeywordRules: [
14114
+ { kind: "word", value: "meditation" },
14115
+ { kind: "word", value: "wellbeing" },
14116
+ { kind: "substring", value: "retreat" },
14117
+ { kind: "phrase", value: "yoga studio" },
14118
+ { kind: "phrase", value: "mindful movement" }
14119
+ ],
14120
+ tokenRecipes: {
14121
+ palette: "warm-neutral",
14122
+ contrast: "standard",
14123
+ radius: "soft",
14124
+ shadow: "subtle",
14125
+ typography: "serif-editorial",
14126
+ spacing: "airy",
14127
+ motion: "subtle"
14128
+ },
14129
+ compositionBudget: balancedBudget,
14130
+ themeOverrides: {
14131
+ typography: {
14132
+ body: {
14133
+ family: "Inter, system-ui, sans-serif",
14134
+ size: "md",
14135
+ weight: "regular",
14136
+ lineHeight: "relaxed",
14137
+ letterSpacing: "normal"
14138
+ },
14139
+ headings: {
14140
+ default: {
14141
+ family: '"Cormorant Garamond", Georgia, serif',
14142
+ weight: "regular",
14143
+ lineHeight: "normal",
14144
+ letterSpacing: "normal",
14145
+ colorToken: "text",
14146
+ italic: null,
14147
+ case: null
14148
+ },
14149
+ h1: {
14150
+ size: "xl",
14151
+ weight: "regular",
14152
+ lineHeight: "normal",
14153
+ letterSpacing: "normal",
14154
+ italic: null
14155
+ },
14156
+ h2: {
14157
+ size: "lg",
14158
+ weight: "regular",
14159
+ lineHeight: "normal",
14160
+ letterSpacing: "normal",
14161
+ italic: null
14162
+ },
14163
+ h3: {
14164
+ size: "md",
14165
+ weight: "regular",
14166
+ lineHeight: "normal",
14167
+ letterSpacing: "normal",
14168
+ italic: null
14169
+ }
14170
+ },
14171
+ scale: "majorThird"
14172
+ },
14173
+ bodyText: {
14174
+ intro: {
14175
+ paragraphSize: "default",
14176
+ headingSize: "editorial"
14177
+ }
14178
+ }
14179
+ },
14180
+ recommendedAppearancePresetIds: [
14181
+ "hero-brand-scrim",
14182
+ "intro-soft-earth-statement",
14183
+ "feature-cards-soft-earth-offerings",
14184
+ "testimonials-soft-earth-proof-band",
14185
+ "faq-soft-earth-two-column",
14186
+ "contact-form-panel"
14187
+ ],
14188
+ recommendedHeaderLookIds: ["centered-calm", "minimal-transparent", "editorial-line"],
14189
+ recommendedFooterLookIds: ["footer-muted-grounding", "site-footer-brand-two-band"],
14190
+ buttonPersonalityChoices: [
14191
+ buttonChoice("earth-pill"),
14192
+ buttonChoice("soft-pill"),
14193
+ buttonChoice("pebble"),
14194
+ buttonChoice("editorial-link")
14195
+ ],
14196
+ paletteVariantChoices: [
14197
+ paletteChoice("warm-neutral-soft-earth"),
14198
+ paletteChoice("warm-neutral-clay"),
14199
+ paletteChoice("warm-neutral-forest"),
14200
+ paletteChoice("soft-natural-sage")
14201
+ ]
14202
+ }),
13110
14203
  defineCuratedSiteStyle({
13111
14204
  id: "site-style:bold-launch",
13112
14205
  name: "Bold Launch",
@@ -13160,49 +14253,13 @@ var curatedSiteStyles = [
13160
14253
  motion: "expressive"
13161
14254
  },
13162
14255
  compositionBudget: expressiveBudget,
14256
+ typographyPresetChoices: [
14257
+ typographyChoice("typography-preset:bold-display"),
14258
+ typographyChoice("typography-preset:modern-sans"),
14259
+ typographyChoice("typography-preset:luxe-contrast")
14260
+ ],
14261
+ defaultTypographyPresetId: "typography-preset:bold-display",
13163
14262
  themeOverrides: {
13164
- typography: {
13165
- body: {
13166
- family: "Manrope, system-ui, sans-serif",
13167
- size: "lg",
13168
- weight: "regular",
13169
- lineHeight: "relaxed",
13170
- letterSpacing: "normal"
13171
- },
13172
- headings: {
13173
- default: {
13174
- family: '"TAN - PEARL", sans-serif',
13175
- weight: "bold",
13176
- lineHeight: "normal",
13177
- letterSpacing: "tight",
13178
- colorToken: "primary",
13179
- italic: null,
13180
- case: null
13181
- },
13182
- h1: {
13183
- size: "xl",
13184
- weight: "bold",
13185
- lineHeight: "normal",
13186
- letterSpacing: "tight",
13187
- italic: null
13188
- },
13189
- h2: {
13190
- size: "lg",
13191
- weight: "bold",
13192
- lineHeight: "normal",
13193
- letterSpacing: "normal",
13194
- italic: null
13195
- },
13196
- h3: {
13197
- size: "md",
13198
- weight: "bold",
13199
- lineHeight: "normal",
13200
- letterSpacing: "normal",
13201
- italic: null
13202
- }
13203
- },
13204
- scale: "balanced"
13205
- },
13206
14263
  bodyText: {
13207
14264
  intro: {
13208
14265
  paragraphSize: "editorial",
@@ -17545,8 +18602,9 @@ var faqAccordionFragment = defineFragment({
17545
18602
  },
17546
18603
  fallback: "rb-faq-item"
17547
18604
  },
17548
- iconStyle: { $bind: { from: "theme.accordions.icon.style" } }
17549
- // Pass icon style from theme
18605
+ iconStyle: { $bind: { from: "theme.accordions.icon.style" } },
18606
+ // Legacy theme accordion style
18607
+ iconTreatment: { $bind: { from: "content._sectionStyles.accordionIconTreatment" } }
17550
18608
  },
17551
18609
  triggerFrom: "faqItem.question",
17552
18610
  contentFrom: "faqItem.answer"
@@ -18681,93 +19739,421 @@ var heroBlockDefinition = {
18681
19739
  manifest: heroManifest
18682
19740
  };
18683
19741
 
18684
- // ../blocks/src/system/blocks/body-text.ts
18685
- var bodyCopyComposition = composeFragments([{ fragment: bodyCopyFragment }]);
18686
- var proseLayout = styledSection({
18687
- children: stack({ className: "rb-container" }, bodyCopyComposition.layout),
18688
- spacing: "medium",
18689
- baseClass: ""
18690
- });
18691
- var introLayout = styledSection({
18692
- children: stack({ className: "rb-container" }, bodyCopyComposition.layout),
18693
- spacing: "medium",
18694
- baseClass: ""
18695
- });
18696
- var narrowLayout = styledSection({
18697
- children: stack({ className: "rb-container" }, bodyCopyComposition.layout),
18698
- spacing: "medium",
18699
- baseClass: ""
18700
- });
18701
- var bodyTextManifest = createBlockManifest({
18702
- id: "block.body-text",
18703
- title: "Body Text",
18704
- titleSource: "heading",
18705
- category: "content",
18706
- fragments: [
18707
- { fragment: bodyCopyFragment, fieldPriority: 0 }
18708
- ],
18709
- layout: proseLayout,
18710
- variants: {
18711
- prose: proseLayout,
18712
- intro: introLayout,
18713
- narrow: narrowLayout
18714
- },
18715
- defaultVariant: "prose",
18716
- variantOptions: {
18717
- prose: {
18718
- label: "Prose",
18719
- description: "Long-form rich text for pages and posts.",
18720
- icon: "Type"
18721
- },
18722
- intro: {
18723
- label: "Intro",
18724
- description: "Narrower, larger text for above-the-fold intros.",
18725
- icon: "AlignCenter"
18726
- },
18727
- narrow: {
18728
- label: "Narrow",
18729
- description: "Left-aligned lead copy with a shorter max width.",
18730
- icon: "AlignLeft"
19742
+ // ../blocks/src/system/fields/aspectRatio.ts
19743
+ var standardAspectRatioOptions = [
19744
+ { value: "auto", label: "Auto (original)" },
19745
+ { value: "16/9", label: "16:9 (Landscape)" },
19746
+ { value: "4/3", label: "4:3 (Standard)" },
19747
+ { value: "1/1", label: "1:1 (Square)" },
19748
+ { value: "3/4", label: "3:4 (Portrait)" }
19749
+ ];
19750
+ function createAspectRatioField(options = {}) {
19751
+ return {
19752
+ id: options.id ?? "aspectRatio",
19753
+ type: "select",
19754
+ label: options.label ?? "Aspect ratio",
19755
+ ...options.description ? { description: options.description } : {},
19756
+ required: false,
19757
+ defaultValue: options.defaultValue ?? "auto",
19758
+ multiple: false,
19759
+ options: [...standardAspectRatioOptions],
19760
+ ui: {
19761
+ intent: options.uiIntent ?? "display",
19762
+ ...options.visibleWhen ? { visibleWhen: options.visibleWhen } : {}
18731
19763
  }
18732
- },
18733
- description: "Simple text block with optional heading and alignment controls.",
18734
- tags: ["text", "paragraph", "content", "copy", "article", "writing", "rich-text"],
18735
- icon: "Type",
18736
- styleTokens: {
18737
- spacing: "md"
18738
- }
18739
- });
18740
- var bodyTextBlockDefinition = {
18741
- manifest: bodyTextManifest
18742
- };
19764
+ };
19765
+ }
18743
19766
 
18744
- // ../blocks/src/system/blocks/blog-post.tsx
18745
- import { z as z28 } from "zod";
18746
- var composition = composeFragments([{ fragment: blogFeaturedPostFragment }]);
18747
- var blogPostLayout = section(
18748
- { background: "background", className: "rb-px-6 rb-py-12" },
18749
- [...composition.layout]
18750
- );
18751
- var blogPostManifest = createBlockManifest({
18752
- id: "block.blog-post",
18753
- version: "0.1.0",
18754
- title: "Blog post",
18755
- description: "Highlights a single blog post with title, image, and excerpt.",
18756
- category: "blog",
18757
- contentTypes: ["post"],
18758
- tags: ["blog", "post", "featured", "highlight", "article", "single"],
18759
- icon: "FileText",
18760
- styleTokens: {
18761
- background: "surface",
18762
- typography: "body",
18763
- spacing: "md"
18764
- },
18765
- behaviours: {
18766
- supportsThemeSwitching: true,
18767
- inlineEditing: false,
18768
- animation: false,
18769
- paletteHidden: false
18770
- },
19767
+ // ../blocks/src/system/fields/imageLayout.ts
19768
+ function createImageColSizeField(options = {}) {
19769
+ const {
19770
+ id = "imageColSize",
19771
+ label = "Image column size",
19772
+ description = "Controls how large the image/thumbnail column is at desktop breakpoints.",
19773
+ defaultValue = "1/3",
19774
+ uiIntent = "display",
19775
+ visibleWhen
19776
+ } = options;
19777
+ return {
19778
+ id,
19779
+ type: "select",
19780
+ label,
19781
+ description,
19782
+ required: false,
19783
+ defaultValue,
19784
+ multiple: false,
19785
+ options: [
19786
+ { value: "1/4", label: "Small (1/4)" },
19787
+ { value: "1/3", label: "Medium (1/3)" },
19788
+ { value: "2/5", label: "Large (2/5)" },
19789
+ { value: "1/2", label: "Extra large (1/2)" },
19790
+ { value: "2/3", label: "Huge (2/3)" }
19791
+ ],
19792
+ ui: {
19793
+ intent: uiIntent,
19794
+ ...visibleWhen ? { visibleWhen } : {}
19795
+ }
19796
+ };
19797
+ }
19798
+ function createImagePositionField(options = {}) {
19799
+ const {
19800
+ id = "imagePosition",
19801
+ label = "Image position",
19802
+ description = "Choose which side the image appears on.",
19803
+ defaultValue = "left",
19804
+ includeAlternate = false,
19805
+ uiIntent = "display",
19806
+ visibleWhen
19807
+ } = options;
19808
+ const positionOptions = [
19809
+ { value: "left", label: "Left" },
19810
+ { value: "right", label: "Right" },
19811
+ ...includeAlternate ? [{ value: "alternate", label: "Alternate" }] : []
19812
+ ];
19813
+ return {
19814
+ id,
19815
+ type: "select",
19816
+ label,
19817
+ description,
19818
+ required: false,
19819
+ defaultValue,
19820
+ multiple: false,
19821
+ // Spread to get a mutable array type without unsafe casts.
19822
+ options: [...positionOptions],
19823
+ ui: {
19824
+ intent: uiIntent,
19825
+ ...visibleWhen ? { visibleWhen } : {}
19826
+ }
19827
+ };
19828
+ }
19829
+
19830
+ // ../blocks/src/system/blocks/intro.ts
19831
+ function introHeading(className) {
19832
+ return text(
19833
+ {
19834
+ as: "h2",
19835
+ className
19836
+ },
19837
+ when("content.title"),
19838
+ bind("content.title")
19839
+ );
19840
+ }
19841
+ function introBody(className = "rb-prose rb-max-w-none") {
19842
+ return richText({ className }, bind("content.body"));
19843
+ }
19844
+ function introCtas(justify = "start") {
19845
+ return ctaRow({
19846
+ justify,
19847
+ gap: "md",
19848
+ containerClassName: "rb-mt-2"
19849
+ });
19850
+ }
19851
+ function introCopyStack(options = {}) {
19852
+ return stack(
19853
+ {
19854
+ gap: "md",
19855
+ className: options.className ?? "rb-intro-copy"
19856
+ },
19857
+ [
19858
+ introHeading(options.headingClassName ?? "rb-intro-title"),
19859
+ introBody(options.bodyClassName),
19860
+ introCtas(options.ctaJustify)
19861
+ ]
19862
+ );
19863
+ }
19864
+ var introMedia = media(
19865
+ {
19866
+ className: "rb-intro-media rb-w-full rb-h-auto rb-object-cover",
19867
+ style: {
19868
+ aspectRatio: { $bind: { from: "content.aspectRatio" } }
19869
+ }
19870
+ },
19871
+ bind("content.media")
19872
+ );
19873
+ var centeredCopyLayout = styledSection({
19874
+ children: styledContainer({
19875
+ rootType: "stack",
19876
+ rootProps: { gap: "lg" },
19877
+ children: [
19878
+ introCopyStack({
19879
+ className: "rb-intro-copy rb-mx-auto rb-max-w-3xl rb-text-center",
19880
+ headingClassName: "rb-intro-title rb-text-center",
19881
+ bodyClassName: "rb-prose rb-mx-auto rb-max-w-none",
19882
+ ctaJustify: "center"
19883
+ })
19884
+ ]
19885
+ }),
19886
+ baseClass: "",
19887
+ spacing: "medium"
19888
+ });
19889
+ var statementCopyLayout = styledSection({
19890
+ children: styledContainer({
19891
+ children: [
19892
+ el(
19893
+ "div",
19894
+ {
19895
+ className: "rb-intro rb-intro-statement rb-grid rb-grid-cols-1 rb-gap-8 rb-md-grid-cols-2 rb-md-items-start"
19896
+ },
19897
+ [
19898
+ introHeading("rb-intro-title rb-max-w-xl"),
19899
+ stack({ gap: "md", className: "rb-intro-copy rb-max-w-xl" }, [
19900
+ introBody(),
19901
+ introCtas("start")
19902
+ ])
19903
+ ]
19904
+ )
19905
+ ]
19906
+ }),
19907
+ baseClass: "",
19908
+ spacing: "medium"
19909
+ });
19910
+ var statementMediaLayout = styledSection({
19911
+ children: styledContainer({
19912
+ children: [
19913
+ el(
19914
+ "div",
19915
+ {
19916
+ className: "rb-intro rb-intro-statement-media rb-grid rb-grid-cols-1 rb-gap-8 rb-lg-grid-cols-3 rb-lg-items-center"
19917
+ },
19918
+ [
19919
+ introHeading("rb-intro-title rb-max-w-xl"),
19920
+ stack({ gap: "md", className: "rb-intro-copy rb-max-w-xl" }, [
19921
+ introBody(),
19922
+ introCtas("start")
19923
+ ]),
19924
+ el("div", { className: "rb-intro-media-wrap rb-w-full" }, [introMedia], when("content.media"))
19925
+ ]
19926
+ )
19927
+ ]
19928
+ }),
19929
+ baseClass: "",
19930
+ spacing: "medium"
19931
+ });
19932
+ var mediaCopyLayout = styledSection({
19933
+ children: styledContainer({
19934
+ children: [
19935
+ responsiveTwoColumn({
19936
+ image: el("div", { className: "rb-intro-media-wrap rb-w-full" }, [introMedia]),
19937
+ text: introCopyStack({
19938
+ className: "rb-intro-copy rb-max-w-xl",
19939
+ headingClassName: "rb-intro-title"
19940
+ }),
19941
+ ratioFrom: "content.ratio",
19942
+ imagePositionFrom: "content.imagePosition",
19943
+ gapFrom: "content.gap",
19944
+ gapFallback: "comfortable",
19945
+ imageWrapperClassName: "rb-w-full rb-shrink-0",
19946
+ textWrapperClassName: "rb-w-full rb-min-w-0 rb-flex-1 rb-self-center"
19947
+ })
19948
+ ]
19949
+ }),
19950
+ baseClass: "",
19951
+ spacing: "medium"
19952
+ });
19953
+ var introConfig = {
19954
+ id: "block.intro",
19955
+ title: "Intro",
19956
+ category: "layout",
19957
+ includeContainerStyles: true,
19958
+ titleSource: "title",
19959
+ additionalFields: [
19960
+ {
19961
+ id: "title",
19962
+ type: "text",
19963
+ label: "Statement",
19964
+ required: false,
19965
+ multiline: true,
19966
+ maxLength: 160
19967
+ },
19968
+ {
19969
+ id: "body",
19970
+ type: "richText",
19971
+ label: "Text",
19972
+ required: true,
19973
+ ui: {
19974
+ richTextVariant: "limited"
19975
+ }
19976
+ },
19977
+ {
19978
+ id: "media",
19979
+ type: "media",
19980
+ label: "Media",
19981
+ required: false,
19982
+ mediaKinds: ["image"],
19983
+ ui: {
19984
+ intent: "content",
19985
+ visibleWhen: { field: "variant", notEquals: "statement-copy" }
19986
+ }
19987
+ },
19988
+ createImagePositionField({
19989
+ id: "imagePosition",
19990
+ label: "Image position",
19991
+ defaultValue: "left",
19992
+ uiIntent: "display",
19993
+ visibleWhen: { field: "variant", equals: "media-copy" }
19994
+ }),
19995
+ {
19996
+ id: "gap",
19997
+ type: "select",
19998
+ label: "Gap between media and text",
19999
+ required: false,
20000
+ defaultValue: "comfortable",
20001
+ multiple: false,
20002
+ options: [
20003
+ { value: "none", label: "None" },
20004
+ { value: "compact", label: "Compact" },
20005
+ { value: "cozy", label: "Cozy" },
20006
+ { value: "medium", label: "Medium" },
20007
+ { value: "comfortable", label: "Comfortable" },
20008
+ { value: "spacious", label: "Spacious" }
20009
+ ],
20010
+ ui: {
20011
+ intent: "display",
20012
+ visibleWhen: { field: "variant", equals: "media-copy" }
20013
+ }
20014
+ },
20015
+ createImageColSizeField({
20016
+ id: "ratio",
20017
+ label: "Media column size",
20018
+ defaultValue: "1/2",
20019
+ uiIntent: "display",
20020
+ visibleWhen: { field: "variant", equals: "media-copy" }
20021
+ }),
20022
+ createAspectRatioField({
20023
+ id: "aspectRatio",
20024
+ label: "Media aspect ratio",
20025
+ description: "Crop media to a consistent aspect ratio.",
20026
+ defaultValue: "auto",
20027
+ visibleWhen: { field: "media", notEquals: null }
20028
+ }),
20029
+ createCtasRepeater({
20030
+ label: "Calls to action",
20031
+ itemLabel: "CTA",
20032
+ maxItems: 2
20033
+ })
20034
+ ],
20035
+ layout: centeredCopyLayout,
20036
+ variants: {
20037
+ "centered-copy": centeredCopyLayout,
20038
+ "statement-copy": statementCopyLayout,
20039
+ "statement-media": statementMediaLayout,
20040
+ "media-copy": mediaCopyLayout
20041
+ },
20042
+ defaultVariant: "statement-copy",
20043
+ variantOptions: {
20044
+ "centered-copy": {
20045
+ label: "Centered copy",
20046
+ description: "A focused intro with centered text and optional calls to action."
20047
+ },
20048
+ "statement-copy": {
20049
+ label: "Statement and copy",
20050
+ description: "A large statement on the left with supporting copy on the right."
20051
+ },
20052
+ "statement-media": {
20053
+ label: "Statement, copy and media",
20054
+ description: "A three-part intro with statement, copy and a small image."
20055
+ },
20056
+ "media-copy": {
20057
+ label: "Media and copy",
20058
+ description: "A compact media/text intro for softer transitions after a hero."
20059
+ }
20060
+ },
20061
+ description: "A flexible introductory section for statement copy, supporting text, media, and CTAs.",
20062
+ tags: ["intro", "introduction", "about", "welcome", "statement", "media", "text"],
20063
+ icon: "PanelTopOpen"
20064
+ };
20065
+ var introManifest = createBlockManifest(introConfig);
20066
+ var introBlockDefinition = {
20067
+ manifest: introManifest
20068
+ };
20069
+
20070
+ // ../blocks/src/system/blocks/body-text.ts
20071
+ var bodyCopyComposition = composeFragments([{ fragment: bodyCopyFragment }]);
20072
+ var proseLayout = styledSection({
20073
+ children: stack({ className: "rb-container" }, bodyCopyComposition.layout),
20074
+ spacing: "medium",
20075
+ baseClass: ""
20076
+ });
20077
+ var introLayout = styledSection({
20078
+ children: stack({ className: "rb-container" }, bodyCopyComposition.layout),
20079
+ spacing: "medium",
20080
+ baseClass: ""
20081
+ });
20082
+ var narrowLayout = styledSection({
20083
+ children: stack({ className: "rb-container" }, bodyCopyComposition.layout),
20084
+ spacing: "medium",
20085
+ baseClass: ""
20086
+ });
20087
+ var bodyTextManifest = createBlockManifest({
20088
+ id: "block.body-text",
20089
+ title: "Body Text",
20090
+ titleSource: "heading",
20091
+ category: "content",
20092
+ fragments: [
20093
+ { fragment: bodyCopyFragment, fieldPriority: 0 }
20094
+ ],
20095
+ layout: proseLayout,
20096
+ variants: {
20097
+ prose: proseLayout,
20098
+ intro: introLayout,
20099
+ narrow: narrowLayout
20100
+ },
20101
+ defaultVariant: "prose",
20102
+ variantOptions: {
20103
+ prose: {
20104
+ label: "Prose",
20105
+ description: "Long-form rich text for pages and posts.",
20106
+ icon: "Type"
20107
+ },
20108
+ intro: {
20109
+ label: "Intro",
20110
+ description: "Narrower, larger text for above-the-fold intros.",
20111
+ icon: "AlignCenter"
20112
+ },
20113
+ narrow: {
20114
+ label: "Narrow",
20115
+ description: "Left-aligned lead copy with a shorter max width.",
20116
+ icon: "AlignLeft"
20117
+ }
20118
+ },
20119
+ description: "Simple text block with optional heading and alignment controls.",
20120
+ tags: ["text", "paragraph", "content", "copy", "article", "writing", "rich-text"],
20121
+ icon: "Type",
20122
+ styleTokens: {
20123
+ spacing: "md"
20124
+ }
20125
+ });
20126
+ var bodyTextBlockDefinition = {
20127
+ manifest: bodyTextManifest
20128
+ };
20129
+
20130
+ // ../blocks/src/system/blocks/blog-post.tsx
20131
+ import { z as z28 } from "zod";
20132
+ var composition = composeFragments([{ fragment: blogFeaturedPostFragment }]);
20133
+ var blogPostLayout = section(
20134
+ { background: "background", className: "rb-px-6 rb-py-12" },
20135
+ [...composition.layout]
20136
+ );
20137
+ var blogPostManifest = createBlockManifest({
20138
+ id: "block.blog-post",
20139
+ version: "0.1.0",
20140
+ title: "Blog post",
20141
+ description: "Highlights a single blog post with title, image, and excerpt.",
20142
+ category: "blog",
20143
+ contentTypes: ["post"],
20144
+ tags: ["blog", "post", "featured", "highlight", "article", "single"],
20145
+ icon: "FileText",
20146
+ styleTokens: {
20147
+ background: "surface",
20148
+ typography: "body",
20149
+ spacing: "md"
20150
+ },
20151
+ behaviours: {
20152
+ supportsThemeSwitching: true,
20153
+ inlineEditing: false,
20154
+ animation: false,
20155
+ paletteHidden: false
20156
+ },
18771
20157
  additionalFields: composition.fields,
18772
20158
  layout: blogPostLayout
18773
20159
  });
@@ -19524,6 +20910,37 @@ var faqComposition = composeFragments([
19524
20910
  { fragment: faqHeadingFragment, fieldPriority: 0 },
19525
20911
  { fragment: faqAccordionFragment, fieldPriority: 1 }
19526
20912
  ]);
20913
+ function fragmentLayoutNode(layout) {
20914
+ return isNodeDefinitionArray(layout) ? el("div", {}, [...layout]) : layout;
20915
+ }
20916
+ function isNodeDefinitionArray(layout) {
20917
+ return Array.isArray(layout);
20918
+ }
20919
+ var headingLayout = fragmentLayoutNode(faqHeadingFragment.layout);
20920
+ var accordionLayout = fragmentLayoutNode(faqAccordionFragment.layout);
20921
+ var defaultLayout = styledSection({
20922
+ children: styledContainer({
20923
+ baseClassName: "rb-relative rb-isolate",
20924
+ children: stack({ gap: "xl", className: "rb-w-full rb-max-w-4xl rb-mx-auto" }, faqComposition.layout)
20925
+ }),
20926
+ baseClass: ""
20927
+ });
20928
+ var twoColumnLayout = styledSection({
20929
+ children: styledContainer({
20930
+ baseClassName: "rb-relative rb-isolate",
20931
+ children: el(
20932
+ "div",
20933
+ {
20934
+ className: "rb-faq-two-column rb-grid rb-grid-cols-1 rb-gap-8 rb-lg-grid-cols-2 rb-lg-items-start"
20935
+ },
20936
+ [
20937
+ el("div", { className: "rb-faq-two-column-heading" }, [headingLayout]),
20938
+ el("div", { className: "rb-faq-two-column-accordion" }, [accordionLayout])
20939
+ ]
20940
+ )
20941
+ }),
20942
+ baseClass: ""
20943
+ });
19527
20944
  var faqManifest = createBlockManifest({
19528
20945
  id: "block.faq",
19529
20946
  title: "FAQ",
@@ -19540,13 +20957,22 @@ var faqManifest = createBlockManifest({
19540
20957
  label: "FAQ item styles"
19541
20958
  })
19542
20959
  ],
19543
- layout: styledSection({
19544
- children: styledContainer({
19545
- baseClassName: "rb-relative rb-isolate",
19546
- children: stack({ gap: "xl", className: "rb-w-full rb-max-w-4xl rb-mx-auto" }, faqComposition.layout)
19547
- }),
19548
- baseClass: ""
19549
- }),
20960
+ layout: defaultLayout,
20961
+ variants: {
20962
+ default: defaultLayout,
20963
+ "two-column": twoColumnLayout
20964
+ },
20965
+ defaultVariant: "default",
20966
+ variantOptions: {
20967
+ default: {
20968
+ label: "Default",
20969
+ description: "A centered heading above one FAQ accordion."
20970
+ },
20971
+ "two-column": {
20972
+ label: "Two column",
20973
+ description: "A left heading column with FAQ items on the right."
20974
+ }
20975
+ },
19550
20976
  description: "Accordion of frequently asked questions and answers.",
19551
20977
  tags: ["faq", "questions", "answers", "help", "support", "accordion", "q&a"],
19552
20978
  icon: "HelpCircle"
@@ -20196,7 +21622,8 @@ function resolveBackgroundVisualStyles(backgroundColor, tokens, defaultToken = "
20196
21622
  function resolveHeaderVisualStyles(header, tokens) {
20197
21623
  const navContainerType = header?.navContainer?.type ?? "none";
20198
21624
  const hasContainedNav = navContainerType === "glass" || navContainerType === "pill";
20199
- if (hasContainedNav) {
21625
+ const hasTransparentVariant = header?.variant === "transparent" || header?.variant === "floating";
21626
+ if (hasContainedNav || hasTransparentVariant) {
20200
21627
  return {
20201
21628
  backgroundToken: "transparent",
20202
21629
  paletteHex: null,
@@ -20325,6 +21752,17 @@ var headerRootStyleTransform = {
20325
21752
  return mergeStyles(...styleParts);
20326
21753
  }
20327
21754
  };
21755
+ var headerSectionBackgroundTransform = {
21756
+ id: "layout.headerSectionBackground",
21757
+ kind: "string",
21758
+ summary: "Resolve the inner site-header section background token",
21759
+ run: (value) => {
21760
+ const header = asPartialObject(value);
21761
+ const navContainerType = header?.navContainer?.type ?? "none";
21762
+ const usesTransparentRoot = header?.variant === "transparent" || header?.variant === "floating" || navContainerType === "glass" || navContainerType === "pill";
21763
+ return usesTransparentRoot ? "raw:transparent" : "background";
21764
+ }
21765
+ };
20328
21766
  var footerRootStyleTransform = {
20329
21767
  id: "layout.footerRootStyle",
20330
21768
  kind: "formatter",
@@ -20583,6 +22021,7 @@ var layoutTransforms = [
20583
22021
  headerRootClassTransform,
20584
22022
  footerRootClassTransform,
20585
22023
  headerRootStyleTransform,
22024
+ headerSectionBackgroundTransform,
20586
22025
  footerRootStyleTransform,
20587
22026
  footerBottomBarClassTransform,
20588
22027
  footerBottomBarContainerClassTransform,
@@ -21096,7 +22535,10 @@ var editorialLayout = stack(
21096
22535
  );
21097
22536
  var headerLayout = headerSection(
21098
22537
  {
21099
- background: "background",
22538
+ background: bindProp("$root.theme.header", {
22539
+ transforms: pipe(tx("layout.headerSectionBackground")),
22540
+ fallback: "background"
22541
+ }),
21100
22542
  allowOverflow: true,
21101
22543
  className: bindProp("$root.theme.header", {
21102
22544
  transforms: pipe(tx("layout.headerRootClass")),
@@ -21931,79 +23373,298 @@ var collectionLayout = styledSection({
21931
23373
  { gap: "md" }
21932
23374
  ),
21933
23375
  baseClass: "",
21934
- spacing: "comfortable"
23376
+ spacing: "comfortable"
23377
+ });
23378
+ var collectionManifest = createBlockManifest({
23379
+ id: "block.collection",
23380
+ title: "Collection",
23381
+ category: "layout",
23382
+ additionalFields: [
23383
+ parseFieldDefinition({
23384
+ id: "layout",
23385
+ type: "select",
23386
+ label: "Layout",
23387
+ defaultValue: "grid",
23388
+ options: [
23389
+ { value: "grid", label: "Grid" },
23390
+ { value: "stack", label: "Stack" }
23391
+ ],
23392
+ ui: { intent: "display" }
23393
+ }),
23394
+ parseFieldDefinition({
23395
+ id: "columns",
23396
+ type: "select",
23397
+ label: "Columns",
23398
+ description: "Number of columns in the grid layout.",
23399
+ defaultValue: "3",
23400
+ options: [
23401
+ { value: "2", label: "2 columns" },
23402
+ { value: "3", label: "3 columns" },
23403
+ { value: "4", label: "4 columns" }
23404
+ ],
23405
+ ui: {
23406
+ intent: "display",
23407
+ visibleWhen: { field: "layout", equals: "grid" }
23408
+ }
23409
+ }),
23410
+ parseFieldDefinition({
23411
+ id: "gap",
23412
+ type: "select",
23413
+ label: "Gap",
23414
+ defaultValue: "medium",
23415
+ options: [
23416
+ { value: "none", label: "None" },
23417
+ { value: "compact", label: "Compact" },
23418
+ { value: "cozy", label: "Cozy" },
23419
+ { value: "medium", label: "Medium" },
23420
+ { value: "comfortable", label: "Comfortable" },
23421
+ { value: "spacious", label: "Spacious" }
23422
+ ],
23423
+ ui: { intent: "display" }
23424
+ }),
23425
+ fragmentsToRepeaterField(
23426
+ "items",
23427
+ "Items",
23428
+ collectionFragments,
23429
+ {
23430
+ minItems: 0,
23431
+ maxItems: 50,
23432
+ itemLabel: "Item",
23433
+ description: "Add items to this collection."
23434
+ }
23435
+ ),
23436
+ cardStylesField({
23437
+ id: "_cardStyles",
23438
+ label: "Item styles"
23439
+ })
23440
+ ],
23441
+ layout: collectionLayout,
23442
+ description: "Repeat items in a grid or stack layout.",
23443
+ tags: ["collection", "grid", "stack", "repeater"],
23444
+ icon: "LayoutList",
23445
+ styleTokens: { spacing: "lg" }
23446
+ });
23447
+ var collectionBlockDefinition = {
23448
+ manifest: collectionManifest
23449
+ };
23450
+
23451
+ // ../blocks/src/system/blocks/feature-cards.ts
23452
+ function grid3(props2, children) {
23453
+ return el("grid", props2 ?? void 0, children ?? void 0);
23454
+ }
23455
+ var sectionHeading = stack(
23456
+ { gap: "sm", className: "rb-feature-cards-heading rb-mx-auto rb-max-w-3xl rb-text-center" },
23457
+ [
23458
+ text(
23459
+ {
23460
+ as: "h2",
23461
+ className: "rb-feature-cards-title rb-text-center"
23462
+ },
23463
+ when("content.title"),
23464
+ bind("content.title")
23465
+ ),
23466
+ richText(
23467
+ {
23468
+ className: "rb-feature-cards-description rb-prose rb-mx-auto rb-max-w-none",
23469
+ style: textColorStyle("mutedText")
23470
+ },
23471
+ when("content.description"),
23472
+ bind("content.description")
23473
+ )
23474
+ ]
23475
+ );
23476
+ var featureCard = styledCard(
23477
+ [
23478
+ media(
23479
+ {
23480
+ className: "rb-feature-card-media rb-w-full rb-h-auto rb-object-cover",
23481
+ style: {
23482
+ aspectRatio: { $bind: { from: "card.aspectRatio" } }
23483
+ }
23484
+ },
23485
+ when("card.media"),
23486
+ bind("card.media")
23487
+ ),
23488
+ stack({ gap: "sm", className: "rb-feature-card-content rb-flex-1 rb-p-6" }, [
23489
+ text(
23490
+ {
23491
+ as: "h3",
23492
+ className: "rb-feature-card-title"
23493
+ },
23494
+ bind("card.title")
23495
+ ),
23496
+ richText(
23497
+ {
23498
+ className: "rb-feature-card-body rb-prose rb-max-w-none",
23499
+ style: textColorStyle("mutedText")
23500
+ },
23501
+ when("card.body"),
23502
+ bind("card.body")
23503
+ ),
23504
+ ctaRow({
23505
+ collectionPath: "ctas",
23506
+ itemName: "cta",
23507
+ gap: "sm",
23508
+ justify: "start",
23509
+ containerClassName: "rb-mt-auto"
23510
+ })
23511
+ ])
23512
+ ],
23513
+ {
23514
+ stylesFrom: "content._cardStyles",
23515
+ backgroundFrom: "content._cardStyles.background",
23516
+ baseClassName: "rb-feature-card rb-relative rb-isolate rb-overflow-hidden rb-border rb-flex rb-h-full rb-flex-col"
23517
+ },
23518
+ repeat("content.cards", "card")
23519
+ );
23520
+ var cardsLayout = styledSection({
23521
+ children: styledContainer({
23522
+ rootType: "stack",
23523
+ rootProps: { gap: "xl" },
23524
+ children: [
23525
+ sectionHeading,
23526
+ grid3(
23527
+ {
23528
+ cols: {
23529
+ $bind: {
23530
+ from: "content.columns",
23531
+ fallback: 3,
23532
+ coerce: "number"
23533
+ }
23534
+ },
23535
+ gap: "lg"
23536
+ },
23537
+ [featureCard]
23538
+ )
23539
+ ]
23540
+ }),
23541
+ baseClass: "",
23542
+ spacing: "medium"
21935
23543
  });
21936
- var collectionManifest = createBlockManifest({
21937
- id: "block.collection",
21938
- title: "Collection",
23544
+ var featureCardsConfig = {
23545
+ id: "block.feature-cards",
23546
+ title: "Feature Cards",
21939
23547
  category: "layout",
23548
+ includeContainerStyles: true,
23549
+ titleSource: "title",
21940
23550
  additionalFields: [
21941
- parseFieldDefinition({
21942
- id: "layout",
21943
- type: "select",
21944
- label: "Layout",
21945
- defaultValue: "grid",
21946
- options: [
21947
- { value: "grid", label: "Grid" },
21948
- { value: "stack", label: "Stack" }
21949
- ],
21950
- ui: { intent: "display" }
21951
- }),
21952
- parseFieldDefinition({
23551
+ {
23552
+ id: "title",
23553
+ type: "text",
23554
+ label: "Title",
23555
+ required: false,
23556
+ multiline: false,
23557
+ maxLength: 120
23558
+ },
23559
+ {
23560
+ id: "description",
23561
+ type: "richText",
23562
+ label: "Description",
23563
+ required: false,
23564
+ ui: {
23565
+ richTextVariant: "limited"
23566
+ }
23567
+ },
23568
+ {
21953
23569
  id: "columns",
21954
23570
  type: "select",
21955
23571
  label: "Columns",
21956
- description: "Number of columns in the grid layout.",
23572
+ required: false,
21957
23573
  defaultValue: "3",
23574
+ multiple: false,
21958
23575
  options: [
21959
23576
  { value: "2", label: "2 columns" },
21960
23577
  { value: "3", label: "3 columns" },
21961
23578
  { value: "4", label: "4 columns" }
21962
23579
  ],
21963
- ui: {
21964
- intent: "display",
21965
- visibleWhen: { field: "layout", equals: "grid" }
21966
- }
21967
- }),
21968
- parseFieldDefinition({
21969
- id: "gap",
21970
- type: "select",
21971
- label: "Gap",
21972
- defaultValue: "medium",
21973
- options: [
21974
- { value: "none", label: "None" },
21975
- { value: "compact", label: "Compact" },
21976
- { value: "cozy", label: "Cozy" },
21977
- { value: "medium", label: "Medium" },
21978
- { value: "comfortable", label: "Comfortable" },
21979
- { value: "spacious", label: "Spacious" }
21980
- ],
21981
23580
  ui: { intent: "display" }
21982
- }),
21983
- fragmentsToRepeaterField(
21984
- "items",
21985
- "Items",
21986
- collectionFragments,
21987
- {
21988
- minItems: 0,
21989
- maxItems: 50,
21990
- itemLabel: "Item",
21991
- description: "Add items to this collection."
23581
+ },
23582
+ {
23583
+ id: "cards",
23584
+ type: "repeater",
23585
+ label: "Cards",
23586
+ required: false,
23587
+ minItems: 1,
23588
+ maxItems: 8,
23589
+ itemLabel: "Card",
23590
+ itemLabelSource: "title",
23591
+ allowConversion: true,
23592
+ ui: {
23593
+ intent: "content"
23594
+ },
23595
+ schema: {
23596
+ fields: [
23597
+ {
23598
+ id: "media",
23599
+ type: "media",
23600
+ label: "Image",
23601
+ required: false,
23602
+ mediaKinds: ["image"]
23603
+ },
23604
+ createAspectRatioField({
23605
+ id: "aspectRatio",
23606
+ label: "Image aspect ratio",
23607
+ defaultValue: "4/3",
23608
+ visibleWhen: { field: "media", notEquals: null }
23609
+ }),
23610
+ {
23611
+ id: "title",
23612
+ type: "text",
23613
+ label: "Title",
23614
+ required: true,
23615
+ multiline: false,
23616
+ maxLength: 120
23617
+ },
23618
+ {
23619
+ id: "body",
23620
+ type: "richText",
23621
+ label: "Text",
23622
+ required: false,
23623
+ ui: {
23624
+ richTextVariant: "limited"
23625
+ }
23626
+ },
23627
+ createCtasRepeater({
23628
+ label: "Calls to action",
23629
+ itemLabel: "CTA",
23630
+ maxItems: 1,
23631
+ button: {
23632
+ variants: [
23633
+ { value: "primary", label: "Primary" },
23634
+ { value: "secondary", label: "Secondary" },
23635
+ { value: "outline", label: "Outline" },
23636
+ { value: "ghost", label: "Ghost" },
23637
+ { value: "link", label: "Link" }
23638
+ ],
23639
+ defaultVariant: "ghost"
23640
+ }
23641
+ })
23642
+ ]
21992
23643
  }
21993
- ),
23644
+ },
21994
23645
  cardStylesField({
21995
23646
  id: "_cardStyles",
21996
- label: "Item styles"
23647
+ label: "Card styles"
21997
23648
  })
21998
23649
  ],
21999
- layout: collectionLayout,
22000
- description: "Repeat items in a grid or stack layout.",
22001
- tags: ["collection", "grid", "stack", "repeater"],
22002
- icon: "LayoutList",
22003
- styleTokens: { spacing: "lg" }
22004
- });
22005
- var collectionBlockDefinition = {
22006
- manifest: collectionManifest
23650
+ layout: cardsLayout,
23651
+ variants: {
23652
+ cards: cardsLayout
23653
+ },
23654
+ defaultVariant: "cards",
23655
+ variantOptions: {
23656
+ cards: {
23657
+ label: "Cards",
23658
+ description: "A responsive grid of image cards with optional calls to action."
23659
+ }
23660
+ },
23661
+ description: "A card grid for offerings, services, classes, benefits, or featured links.",
23662
+ tags: ["cards", "features", "offerings", "services", "classes", "grid", "links"],
23663
+ icon: "PanelsTopLeft"
23664
+ };
23665
+ var featureCardsManifest = createBlockManifest(featureCardsConfig);
23666
+ var featureCardsBlockDefinition = {
23667
+ manifest: featureCardsManifest
22007
23668
  };
22008
23669
 
22009
23670
  // ../blocks/src/system/fields/carousel.ts
@@ -22091,69 +23752,6 @@ function createCarouselBehaviorFields(options = {}) {
22091
23752
  return fields3;
22092
23753
  }
22093
23754
 
22094
- // ../blocks/src/system/fields/imageLayout.ts
22095
- function createImageColSizeField(options = {}) {
22096
- const {
22097
- id = "imageColSize",
22098
- label = "Image column size",
22099
- description = "Controls how large the image/thumbnail column is at desktop breakpoints.",
22100
- defaultValue = "1/3",
22101
- uiIntent = "display",
22102
- visibleWhen
22103
- } = options;
22104
- return {
22105
- id,
22106
- type: "select",
22107
- label,
22108
- description,
22109
- required: false,
22110
- defaultValue,
22111
- multiple: false,
22112
- options: [
22113
- { value: "1/4", label: "Small (1/4)" },
22114
- { value: "1/3", label: "Medium (1/3)" },
22115
- { value: "2/5", label: "Large (2/5)" },
22116
- { value: "1/2", label: "Extra large (1/2)" },
22117
- { value: "2/3", label: "Huge (2/3)" }
22118
- ],
22119
- ui: {
22120
- intent: uiIntent,
22121
- ...visibleWhen ? { visibleWhen } : {}
22122
- }
22123
- };
22124
- }
22125
- function createImagePositionField(options = {}) {
22126
- const {
22127
- id = "imagePosition",
22128
- label = "Image position",
22129
- description = "Choose which side the image appears on.",
22130
- defaultValue = "left",
22131
- includeAlternate = false,
22132
- uiIntent = "display",
22133
- visibleWhen
22134
- } = options;
22135
- const positionOptions = [
22136
- { value: "left", label: "Left" },
22137
- { value: "right", label: "Right" },
22138
- ...includeAlternate ? [{ value: "alternate", label: "Alternate" }] : []
22139
- ];
22140
- return {
22141
- id,
22142
- type: "select",
22143
- label,
22144
- description,
22145
- required: false,
22146
- defaultValue,
22147
- multiple: false,
22148
- // Spread to get a mutable array type without unsafe casts.
22149
- options: [...positionOptions],
22150
- ui: {
22151
- intent: uiIntent,
22152
- ...visibleWhen ? { visibleWhen } : {}
22153
- }
22154
- };
22155
- }
22156
-
22157
23755
  // ../blocks/src/system/blocks/media-text.ts
22158
23756
  var mediaTextFrameCapability = defineFrameCapability([
22159
23757
  "plain",
@@ -22277,26 +23875,13 @@ var mediaTextManifest = createBlockManifest({
22277
23875
  },
22278
23876
  ui: { intent: "behavior" }
22279
23877
  }),
22280
- {
23878
+ createAspectRatioField({
22281
23879
  id: "aspectRatio",
22282
- type: "select",
22283
23880
  label: "Media aspect ratio",
22284
23881
  description: "Crop media to a consistent aspect ratio.",
22285
- required: false,
22286
23882
  defaultValue: "auto",
22287
- multiple: false,
22288
- options: [
22289
- { value: "auto", label: "Auto (original)" },
22290
- { value: "16/9", label: "16:9 (Landscape)" },
22291
- { value: "4/3", label: "4:3 (Standard)" },
22292
- { value: "1/1", label: "1:1 (Square)" },
22293
- { value: "3/4", label: "3:4 (Portrait)" }
22294
- ],
22295
- ui: {
22296
- intent: "display",
22297
- visibleWhen: { field: "images", notEquals: null }
22298
- }
22299
- },
23883
+ visibleWhen: { field: "images", notEquals: null }
23884
+ }),
22300
23885
  {
22301
23886
  id: "text",
22302
23887
  type: "richText",
@@ -22426,7 +24011,7 @@ var mediaTextManifest = createBlockManifest({
22426
24011
  whenImagesLength(0)
22427
24012
  );
22428
24013
  const defaultInner = el("div", {}, [defaultImagesLayout, defaultTextOnlyLayout]);
22429
- const defaultLayout = styledSection({
24014
+ const defaultLayout2 = styledSection({
22430
24015
  children: styledContainer({
22431
24016
  rootType: "stack",
22432
24017
  rootProps: { gap: "lg" },
@@ -22458,9 +24043,9 @@ var mediaTextManifest = createBlockManifest({
22458
24043
  spacing: "medium"
22459
24044
  });
22460
24045
  return {
22461
- layout: defaultLayout,
24046
+ layout: defaultLayout2,
22462
24047
  variants: {
22463
- default: defaultLayout
24048
+ default: defaultLayout2
22464
24049
  },
22465
24050
  defaultVariant: "default",
22466
24051
  variantOptions: {
@@ -25860,7 +27445,7 @@ var embedBlockDefinition = {
25860
27445
  };
25861
27446
 
25862
27447
  // ../blocks/src/system/blocks/image-gallery.ts
25863
- var grid3 = (props2, children, ...mods) => el("grid", props2 ?? void 0, children ?? void 0, ...mods);
27448
+ var grid4 = (props2, children, ...mods) => el("grid", props2 ?? void 0, children ?? void 0, ...mods);
25864
27449
  var galleryContainer = (children, opts) => {
25865
27450
  const gap = opts?.gap ?? "md";
25866
27451
  const withExtraClass = (baseClass) => opts?.className ? `${baseClass} ${opts.className}` : baseClass;
@@ -25940,7 +27525,7 @@ var galleryItem = (options) => stack(
25940
27525
  ],
25941
27526
  repeat("content.images", "item")
25942
27527
  );
25943
- var gridLayout3 = grid3(
27528
+ var gridLayout3 = grid4(
25944
27529
  {
25945
27530
  className: "rb-grid rb-grid-cols-1 rb-gap-4 rb-sm-grid-cols-2 rb-md-grid-cols-3"
25946
27531
  },
@@ -26543,7 +28128,7 @@ var imageGalleryBlockDefinition = {
26543
28128
  };
26544
28129
 
26545
28130
  // ../blocks/src/system/blocks/video-grid.ts
26546
- var grid4 = (props2, children, ...mods) => el("grid", props2 ?? void 0, children ?? void 0, ...mods);
28131
+ var grid5 = (props2, children, ...mods) => el("grid", props2 ?? void 0, children ?? void 0, ...mods);
26547
28132
  var videoItem = (options) => stack(
26548
28133
  { gap: "xs", className: options.containerClassName },
26549
28134
  [
@@ -26593,7 +28178,7 @@ var gridColumnsClass = (columns) => {
26593
28178
  return "rb-grid rb-grid-cols-1 rb-gap-6 rb-sm-grid-cols-2 rb-md-grid-cols-3";
26594
28179
  }
26595
28180
  };
26596
- var createGridLayout = (columns) => grid4(
28181
+ var createGridLayout = (columns) => grid5(
26597
28182
  {
26598
28183
  className: gridColumnsClass(columns)
26599
28184
  },
@@ -29757,6 +31342,40 @@ var systemBlockDefinitionsRaw = [
29757
31342
  })
29758
31343
  ]
29759
31344
  })),
31345
+ withDesignCapability("block.intro", introBlockDefinition, declareBlockDesignCapability({
31346
+ sectionSurfaces: "supported",
31347
+ contentFrames: ["plain", "panel"],
31348
+ itemSurfaces: "unsupported",
31349
+ headingDecorations: ["organic-squiggle"]
31350
+ }), defineBlockDesignMetadata({
31351
+ flow: bodyFlow,
31352
+ layoutProfiles: [
31353
+ layoutProfile({
31354
+ variantKey: "centered-copy",
31355
+ family: "centered",
31356
+ weight: "featured",
31357
+ bias: "soft"
31358
+ }),
31359
+ layoutProfile({
31360
+ variantKey: "statement-copy",
31361
+ family: "split",
31362
+ weight: "featured",
31363
+ bias: "merge"
31364
+ }),
31365
+ layoutProfile({
31366
+ variantKey: "statement-media",
31367
+ family: "media-text",
31368
+ weight: "featured",
31369
+ bias: "soft"
31370
+ }),
31371
+ layoutProfile({
31372
+ variantKey: "media-copy",
31373
+ family: "media-text",
31374
+ weight: "featured",
31375
+ bias: "soft"
31376
+ })
31377
+ ]
31378
+ })),
29760
31379
  withDesignCapability("block.body-text", bodyTextBlockDefinition, sectionOnly(), defineBlockDesignMetadata({
29761
31380
  flow: bodyFlow,
29762
31381
  layoutProfiles: [
@@ -29817,9 +31436,17 @@ var systemBlockDefinitionsRaw = [
29817
31436
  flow: conversionFlow,
29818
31437
  layoutProfiles: [layoutProfile({ variantKey: "default", family: "form", weight: "standard" })]
29819
31438
  })),
29820
- withDesignCapability("block.faq", faqBlockDefinition, withEyebrowCapability(panelAndItemsCapable(), standardEyebrowTreatments), defineBlockDesignMetadata({
31439
+ withDesignCapability("block.faq", faqBlockDefinition, withEyebrowCapability(declareBlockDesignCapability({
31440
+ sectionSurfaces: "supported",
31441
+ contentFrames: ["plain", "panel"],
31442
+ itemSurfaces: "supported",
31443
+ accordionIconSets: ["plus", "chevron", "caret", "minimal-cross"]
31444
+ }), standardEyebrowTreatments), defineBlockDesignMetadata({
29821
31445
  flow: bodyFlow,
29822
- layoutProfiles: [layoutProfile({ variantKey: "default", family: "stack", weight: "standard" })]
31446
+ layoutProfiles: [
31447
+ layoutProfile({ variantKey: "default", family: "stack", weight: "standard" }),
31448
+ layoutProfile({ variantKey: "two-column", family: "split", weight: "standard" })
31449
+ ]
29823
31450
  })),
29824
31451
  withDesignCapability("block.site-header", siteHeaderBlockDefinition, declareNoBlockDesignCapability("site-chrome"), defineBlockDesignMetadata({
29825
31452
  flow: siteChromeFlow,
@@ -29833,7 +31460,8 @@ var systemBlockDefinitionsRaw = [
29833
31460
  sectionSurfaces: "supported",
29834
31461
  contentFrames: ["plain", "panel"],
29835
31462
  itemSurfaces: "supported",
29836
- testimonialCardTreatments: ["default", "accent-quote"]
31463
+ testimonialCardTreatments: ["default", "accent-quote"],
31464
+ headingDecorations: ["short-center-rule"]
29837
31465
  }), defineBlockDesignMetadata({
29838
31466
  flow: proofFlow,
29839
31467
  layoutProfiles: [
@@ -29859,6 +31487,22 @@ var systemBlockDefinitionsRaw = [
29859
31487
  flow: offeringsFlow,
29860
31488
  layoutProfiles: [layoutProfile({ variantKey: "default", family: "grid", weight: "standard" })]
29861
31489
  })),
31490
+ withDesignCapability("block.feature-cards", featureCardsBlockDefinition, declareBlockDesignCapability({
31491
+ sectionSurfaces: "supported",
31492
+ contentFrames: ["plain", "panel"],
31493
+ itemSurfaces: "supported",
31494
+ headingDecorations: ["short-center-rule"]
31495
+ }), defineBlockDesignMetadata({
31496
+ flow: offeringsFlow,
31497
+ layoutProfiles: [
31498
+ layoutProfile({
31499
+ variantKey: "cards",
31500
+ family: "grid",
31501
+ weight: "standard",
31502
+ bias: "soft"
31503
+ })
31504
+ ]
31505
+ })),
29862
31506
  withDesignCapability("block.media-text", mediaTextBlockDefinition, mediaPanelCapable(), defineBlockDesignMetadata({
29863
31507
  flow: mediaFlow,
29864
31508
  layoutProfiles: [