@riverbankcms/sdk 0.76.0 → 0.77.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (151) hide show
  1. package/dist/{PreviewEditorSidebar-X2HWXFOL.mjs → PreviewEditorSidebar-DVUG7GK4.mjs} +1019 -442
  2. package/dist/{PreviewEditorUI-AQXIXPOH.mjs → PreviewEditorUI-P7RN4CDS.mjs} +2 -2
  3. package/dist/SdkPreviewModeRuntime-KLPX47SE.mjs +8 -0
  4. package/dist/_dts/ai/src/contracts/proposals.d.ts +538 -20
  5. package/dist/_dts/api/src/contentRuntime.d.ts +5 -0
  6. package/dist/_dts/api/src/siteAssets.d.ts +1 -0
  7. package/dist/_dts/api/src/siteRuntimeEndpoints.d.ts +26 -2
  8. package/dist/_dts/block-form/src/blockDraftSaveability.d.ts +28 -0
  9. package/dist/_dts/block-form/src/client/index.d.ts +2 -2
  10. package/dist/_dts/block-form/src/index.d.ts +2 -1
  11. package/dist/_dts/block-form/src/widgets/DateField/dateFieldSchema.d.ts +1 -1
  12. package/dist/_dts/block-form/src/widgets/DateTimeField/dateTimeFieldSchema.d.ts +1 -1
  13. package/dist/_dts/block-form/src/widgets/TimeField/timeFieldSchema.d.ts +1 -1
  14. package/dist/_dts/blocks/src/PageRenderer.d.ts +10 -10
  15. package/dist/_dts/blocks/src/client/site-chrome.d.ts +22 -0
  16. package/dist/_dts/blocks/src/customBlockRegistry.d.ts +57 -0
  17. package/dist/_dts/blocks/src/index.d.ts +2 -0
  18. package/dist/_dts/blocks/src/system/blocks/faq.d.ts +20 -2
  19. package/dist/_dts/blocks/src/system/blocks/feature-cards.d.ts +25 -0
  20. package/dist/_dts/blocks/src/system/blocks/index.d.ts +2 -0
  21. package/dist/_dts/blocks/src/system/blocks/intro.d.ts +24 -0
  22. package/dist/_dts/blocks/src/system/blocks/media-text.d.ts +3 -34
  23. package/dist/_dts/blocks/src/system/blocks/site-header.d.ts +2 -2
  24. package/dist/_dts/blocks/src/system/constants/blockKinds.d.ts +1 -1
  25. package/dist/_dts/blocks/src/system/fields/aspectRatio.d.ts +30 -0
  26. package/dist/_dts/blocks/src/system/fields/boxStyles.d.ts +4 -1
  27. package/dist/_dts/blocks/src/system/fields/ctas.d.ts +7 -0
  28. package/dist/_dts/blocks/src/system/manifest/fieldValidation/index.d.ts +16 -2
  29. package/dist/_dts/blocks/src/system/node/validation-constants.d.ts +1 -1
  30. package/dist/_dts/blocks/src/system/runtime/components/multi-step/runtimeFormValidation.d.ts +28 -0
  31. package/dist/_dts/blocks/src/system/runtime/nodes/accordion.d.ts +2 -0
  32. package/dist/_dts/blocks/src/system/runtime/nodes/accordion.server.d.ts +2 -0
  33. package/dist/_dts/blocks/src/system/runtime/nodes/accordionIconTreatment.d.ts +5 -0
  34. package/dist/_dts/blocks/src/system/transforms/registry/layout.d.ts +5 -4
  35. package/dist/_dts/blocks/src/system/transforms/typed.d.ts +2 -1
  36. package/dist/_dts/content-editor/src/controller/EntryControllerProvider.d.ts +2 -0
  37. package/dist/_dts/content-editor/src/hooks/blockDraftLifecycle.d.ts +48 -0
  38. package/dist/_dts/content-editor/src/hooks/invalidBlockSelectors.d.ts +4 -0
  39. package/dist/_dts/content-editor/src/hooks/publishability.d.ts +47 -0
  40. package/dist/_dts/content-editor/src/index.d.ts +1 -0
  41. package/dist/_dts/db/src/generated/supabase/database.types.d.ts +20 -0
  42. package/dist/_dts/editor-blocks/src/BlockEditor.d.ts +2 -1
  43. package/dist/_dts/editor-blocks/src/block-editor/SortableBlockItem.d.ts +2 -1
  44. package/dist/_dts/editor-blocks/src/block-editor/customBlockRegistry.d.ts +2 -0
  45. package/dist/_dts/editor-blocks/src/block-editor/sdkBlockMerger.d.ts +9 -37
  46. package/dist/_dts/editor-blocks/src/index.d.ts +2 -2
  47. package/dist/_dts/preview-next/src/client/index.d.ts +3 -0
  48. package/dist/_dts/preview-next/src/client/layout/PreviewLayoutContext.d.ts +5 -1
  49. package/dist/_dts/preview-next/src/client/preview/PreviewDesignCoordinatorContext.d.ts +20 -0
  50. package/dist/_dts/preview-next/src/client/preview/PreviewEditorSidebar.d.ts +7 -2
  51. package/dist/_dts/preview-next/src/client/preview/PreviewShell.d.ts +7 -2
  52. package/dist/_dts/preview-next/src/client/preview/PreviewShellLayout.d.ts +7 -2
  53. package/dist/_dts/preview-next/src/client/preview/PreviewThemedSiteDocument.d.ts +18 -0
  54. package/dist/_dts/preview-next/src/client/preview/SiteChromeCustomizeContext.d.ts +20 -3
  55. package/dist/_dts/preview-next/src/client/preview/StyleConfigurator.d.ts +6 -1
  56. package/dist/_dts/preview-next/src/client/preview/StyleConfigurator.state.d.ts +14 -4
  57. package/dist/_dts/preview-next/src/client/preview/previewDesignCoordinator.d.ts +73 -0
  58. package/dist/_dts/preview-next/src/client/preview/siteChromeLookRows.d.ts +12 -4
  59. package/dist/_dts/preview-next/src/client/preview/siteStylePreviewPlanner.d.ts +46 -0
  60. package/dist/_dts/preview-next/src/client/preview/styleConfiguratorSnapshot.d.ts +6 -1
  61. package/dist/_dts/preview-next/src/client/preview/typographySelectionInput.d.ts +14 -0
  62. package/dist/_dts/preview-next/src/client/sdk/SdkPreviewModeRuntime.d.ts +1 -1
  63. package/dist/_dts/sdk/src/cli/commands/style.d.ts +8 -0
  64. package/dist/_dts/sdk/src/client/management/types.d.ts +6 -1
  65. package/dist/_dts/sdk/src/client/types.d.ts +9 -0
  66. package/dist/_dts/sdk/src/client.d.ts +1 -1
  67. package/dist/_dts/sdk/src/contracts/system-block-content.d.ts +35 -0
  68. package/dist/_dts/sdk/src/contracts/theme.d.ts +1 -1
  69. package/dist/_dts/sdk/src/index.d.ts +2 -1
  70. package/dist/_dts/sdk/src/public-api/contracts.d.ts +5 -0
  71. package/dist/_dts/sdk/src/rendering/components/Layout.d.ts +2 -2
  72. package/dist/_dts/sdk/src/types/block-kinds.d.ts +1 -1
  73. package/dist/_dts/sdk/src/version.d.ts +1 -1
  74. package/dist/_dts/site-commands/src/commands.d.ts +15 -0
  75. package/dist/_dts/theme-core/src/buttons/personalities/earth-pill.d.ts +16 -0
  76. package/dist/_dts/theme-core/src/buttons/personalities/index.d.ts +11 -0
  77. package/dist/_dts/theme-core/src/fonts/types.d.ts +1 -1
  78. package/dist/_dts/theme-core/src/generated/containerResponsiveThemeCss.d.ts +1 -1
  79. package/dist/_dts/theme-core/src/mock-themes/all.d.ts +72 -27
  80. package/dist/_dts/theme-core/src/palette/variants/index.d.ts +15 -0
  81. package/dist/_dts/theme-core/src/palette/variants/warm-neutral.d.ts +16 -0
  82. package/dist/_dts/theme-core/src/schema.d.ts +306 -30
  83. package/dist/_dts/theme-core/src/site-styles/appearancePresetCatalog.d.ts +81 -0
  84. package/dist/_dts/theme-core/src/site-styles/appearancePresetTypes.d.ts +6 -4
  85. package/dist/_dts/theme-core/src/site-styles/blockAppearancePresets.d.ts +81 -0
  86. package/dist/_dts/theme-core/src/site-styles/curatedSiteStyles.d.ts +119 -3
  87. package/dist/_dts/theme-core/src/site-styles/designState.d.ts +4 -4
  88. package/dist/_dts/theme-core/src/site-styles/footerLooks.d.ts +13 -0
  89. package/dist/_dts/theme-core/src/site-styles/generatedSchemas.d.ts +4 -2
  90. package/dist/_dts/theme-core/src/site-styles/headerLooks.d.ts +402 -13
  91. package/dist/_dts/theme-core/src/site-styles/headerOpeningSection.d.ts +6 -0
  92. package/dist/_dts/theme-core/src/site-styles/index.d.ts +2 -0
  93. package/dist/_dts/theme-core/src/site-styles/persistedIdParseResult.d.ts +9 -0
  94. package/dist/_dts/theme-core/src/site-styles/previewCompiler.d.ts +20 -4
  95. package/dist/_dts/theme-core/src/site-styles/types.d.ts +74 -2
  96. package/dist/_dts/theme-core/src/site-styles/typographyPresets.d.ts +189 -0
  97. package/dist/{chunk-Q4OLG66B.mjs → chunk-2SPENC5M.mjs} +476 -153
  98. package/dist/{chunk-Z7JLNTJR.mjs → chunk-6SMUFTXD.mjs} +2 -1
  99. package/dist/{chunk-TW2Y4RR5.mjs → chunk-IENWFSLO.mjs} +365 -52
  100. package/dist/{chunk-LYI7TEMH.mjs → chunk-KWJPDZH2.mjs} +4682 -1463
  101. package/dist/{chunk-V5VORNEJ.mjs → chunk-ZYEJLCTN.mjs} +1 -1
  102. package/dist/cli/index.mjs +2314 -267
  103. package/dist/client/{accordion-2YHIBOZH.mjs → accordion-RZMQSYLR.mjs} +1 -1
  104. package/dist/client/{bookingForm-35IBDWAS.mjs → bookingForm-NF4ASVNV.mjs} +2 -2
  105. package/dist/client/bookings.mjs +92 -0
  106. package/dist/client/{carousel-K6XG7NZQ.mjs → carousel-LDX47ZIK.mjs} +1 -1
  107. package/dist/client/{cart-HCFYUTTU.mjs → cart-RGXDS5F4.mjs} +3 -3
  108. package/dist/client/{checkout-J3U4XR7K.mjs → checkout-P7WWSNNY.mjs} +3 -3
  109. package/dist/client/{chunk-BOIHIU7E.mjs → chunk-E2TDNXCL.mjs} +1 -1
  110. package/dist/client/{chunk-PFBX3IQL.mjs → chunk-GMVTOKYG.mjs} +2 -2
  111. package/dist/client/{chunk-FGUIVT2B.mjs → chunk-JNC7CGHX.mjs} +1 -1
  112. package/dist/client/{chunk-SNSWVZEP.mjs → chunk-L3DNHIJX.mjs} +3 -3
  113. package/dist/client/{chunk-7UOSCYY4.mjs → chunk-R56FQ3RR.mjs} +92 -0
  114. package/dist/client/{chunk-J227A3CQ.mjs → chunk-UFSWADAO.mjs} +1 -1
  115. package/dist/client/client.mjs +3579 -1351
  116. package/dist/client/{courseRegistration-ZBXS7VGI.mjs → courseRegistration-7F65K5ZR.mjs} +2 -2
  117. package/dist/client/{eventCalendar-EQQZHJBA.mjs → eventCalendar-GLSC5KTL.mjs} +4 -4
  118. package/dist/client/{eventCombined-JCFTGBFQ.mjs → eventCombined-ZHK4WKUR.mjs} +4 -4
  119. package/dist/client/{eventDetails-HLUTQSYY.mjs → eventDetails-E3PJYBIN.mjs} +4 -4
  120. package/dist/client/{eventListing-FG4MICVB.mjs → eventListing-EMS3WC3E.mjs} +4 -4
  121. package/dist/client/{eventRegistration-GUEB7LBT.mjs → eventRegistration-NZOTVNPI.mjs} +4 -4
  122. package/dist/client/{form-YQEW4YIT.mjs → form-ETFZFATW.mjs} +1 -1
  123. package/dist/client/{headerSection-GTR3TTRM.mjs → headerSection-4LBP7ULT.mjs} +2 -2
  124. package/dist/client/hooks.mjs +2226 -402
  125. package/dist/client/{locationMap-SPC7VGUH.mjs → locationMap-5M655YSJ.mjs} +1 -1
  126. package/dist/client/{newsletterForm-4IW5BLID.mjs → newsletterForm-QOUYW44O.mjs} +1 -1
  127. package/dist/client/{productDetail-KP5H2WJO.mjs → productDetail-O4DOCWQG.mjs} +3 -3
  128. package/dist/client/{productList-3M3M72XZ.mjs → productList-A5RO5WIS.mjs} +3 -3
  129. package/dist/client/rendering/client.mjs +198 -32
  130. package/dist/client/rendering/islands.mjs +18 -18
  131. package/dist/client/rendering.mjs +3573 -1355
  132. package/dist/client/{shop-ACQKVGOM.mjs → shop-L4MZH4I2.mjs} +3 -3
  133. package/dist/preview-next/client/runtime.mjs +4 -4
  134. package/dist/{sdk-runtime-K7HNB4U2.mjs → sdk-runtime-6UT2S7KZ.mjs} +5 -5
  135. package/dist/server/components.mjs +3497 -1333
  136. package/dist/server/config-validation.mjs +2229 -402
  137. package/dist/server/config.mjs +2229 -402
  138. package/dist/server/data.mjs +2226 -402
  139. package/dist/server/index.mjs +31 -2
  140. package/dist/server/next.mjs +3503 -1329
  141. package/dist/server/page-converter.mjs +2213 -403
  142. package/dist/server/prebuild.mjs +1 -1
  143. package/dist/server/rendering/server.mjs +3497 -1333
  144. package/dist/server/rendering.mjs +3497 -1333
  145. package/dist/server/routing.mjs +2250 -363
  146. package/dist/server/server.mjs +2243 -400
  147. package/dist/server/theme-bridge.mjs +1313 -1035
  148. package/dist/server/theme.mjs +237 -12
  149. package/dist/styles/index.css +1081 -1028
  150. package/package.json +1 -1
  151. package/dist/SdkPreviewModeRuntime-ZQNDCASH.mjs +0 -8
@@ -6842,7 +6842,7 @@ var SimpleCache = class {
6842
6842
  };
6843
6843
 
6844
6844
  // src/version.ts
6845
- var SDK_VERSION = "0.76.0";
6845
+ var SDK_VERSION = "0.77.1";
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,
@@ -11405,8 +11636,19 @@ var headingTypographyStyleSchema = typographyStyleSchema.extend({
11405
11636
  colorToken: themeColorTokenSchema.nullable().optional()
11406
11637
  });
11407
11638
  var proseLinkUnderlineStyleSchema = z21.enum(["solid", "dotted", "dashed"]);
11408
- var proseLinkUnderlineThicknessSchema = z21.enum(["auto", "fromFont", "thin", "medium", "thick"]);
11409
- var proseLinkUnderlineOffsetSchema = z21.enum(["auto", "tight", "normal", "loose"]);
11639
+ var proseLinkUnderlineThicknessSchema = z21.enum([
11640
+ "auto",
11641
+ "fromFont",
11642
+ "thin",
11643
+ "medium",
11644
+ "thick"
11645
+ ]);
11646
+ var proseLinkUnderlineOffsetSchema = z21.enum([
11647
+ "auto",
11648
+ "tight",
11649
+ "normal",
11650
+ "loose"
11651
+ ]);
11410
11652
  var proseLinkStyleSchema = z21.object({
11411
11653
  colorToken: themeColorTokenSchema.optional(),
11412
11654
  hoverColorToken: themeColorTokenSchema.optional(),
@@ -11417,7 +11659,14 @@ var proseLinkStyleSchema = z21.object({
11417
11659
  underlineThickness: proseLinkUnderlineThicknessSchema.optional(),
11418
11660
  underlineOffset: proseLinkUnderlineOffsetSchema.optional()
11419
11661
  });
11420
- var semanticSpacingSchema = z21.enum(["none", "compact", "cozy", "medium", "comfortable", "spacious"]);
11662
+ var semanticSpacingSchema = z21.enum([
11663
+ "none",
11664
+ "compact",
11665
+ "cozy",
11666
+ "medium",
11667
+ "comfortable",
11668
+ "spacious"
11669
+ ]);
11421
11670
  var boxRoundedSchema = z21.enum(["none", "sm", "md", "lg", "xl", "2xl", "full"]);
11422
11671
  var boxBackgroundOverlaySchema = z21.object({
11423
11672
  type: z21.enum(["none", "color", "gradient"]).nullable().optional(),
@@ -11439,12 +11688,36 @@ var boxBackgroundSchema = z21.object({
11439
11688
  textColor: tokenOrCssColorValueSchema.nullable().optional(),
11440
11689
  headingColor: tokenOrCssColorValueSchema.nullable().optional()
11441
11690
  });
11691
+ var noHeadingDecorationSchema = z21.object({
11692
+ family: z21.literal("none"),
11693
+ placement: z21.literal("none")
11694
+ });
11695
+ var visibleHeadingDecorationSchema = z21.object({
11696
+ family: z21.enum(visibleHeadingDecorationFamilyValues),
11697
+ placement: z21.enum(visibleHeadingDecorationPlacementValues),
11698
+ colorToken: z21.enum(headingDecorationColorTokenValues).optional()
11699
+ });
11700
+ var headingDecorationSchema = z21.union([
11701
+ noHeadingDecorationSchema,
11702
+ visibleHeadingDecorationSchema
11703
+ ]);
11704
+ var accordionIconTreatmentSchema = z21.object({
11705
+ iconSet: z21.enum(accordionIconSetValues),
11706
+ colorToken: z21.enum(accordionIconColorTokenValues),
11707
+ openColorToken: z21.enum(accordionIconColorTokenValues).optional(),
11708
+ motion: z21.enum(accordionIconMotionValues)
11709
+ });
11442
11710
  var sectionStylesOverrideSchema = z21.object({
11443
11711
  background: boxBackgroundSchema.nullable().optional(),
11444
11712
  spacing: semanticSpacingSchema.nullable().optional(),
11445
11713
  minHeight: z21.enum(["none", "banner", "hero", "immersive"]).nullable().optional(),
11446
11714
  tileTreatment: z21.enum(tileTreatmentValues).nullable().optional(),
11447
- eyebrowTreatment: z21.enum(eyebrowTreatmentValues).nullable().optional()
11715
+ eyebrowTreatment: z21.enum(eyebrowTreatmentValues).nullable().optional(),
11716
+ headingDecoration: headingDecorationSchema.nullable().optional(),
11717
+ // Author-level override consumed by later block/editor rendering phases.
11718
+ // Keeping it in section styles lets existing block save APIs persist it.
11719
+ headingDecorationOverride: z21.enum(headingDecorationOverrideValues).nullable().optional(),
11720
+ accordionIconTreatment: accordionIconTreatmentSchema.nullable().optional()
11448
11721
  });
11449
11722
  var containerStylesOverrideSchema = z21.object({
11450
11723
  background: boxBackgroundSchema.nullable().optional(),
@@ -11537,9 +11810,17 @@ var inputStyle = z21.object({
11537
11810
  focus: z21.enum(["glow", "ring", "underline"]),
11538
11811
  label: z21.enum(["inside", "above"])
11539
11812
  });
11540
- var headerVariant = z21.enum(["classic", "centered", "transparent", "floating", "editorial"]);
11813
+ var headerVariant = z21.enum(["classic", "centered", "transparent", "floating"]);
11541
11814
  var headerPositioning = z21.enum(["static", "sticky", "fixed"]);
11542
- var headerNavStyle = z21.enum(["minimal", "underline", "underline-grow", "capsule", "scale", "frosted", "solid"]);
11815
+ var headerNavStyle = z21.enum([
11816
+ "minimal",
11817
+ "underline",
11818
+ "underline-grow",
11819
+ "capsule",
11820
+ "scale",
11821
+ "frosted",
11822
+ "solid"
11823
+ ]);
11543
11824
  var navFontWeight = z21.enum(["regular", "medium", "semibold", "bold"]);
11544
11825
  var headerMaxWidth = z21.enum(["container", "full"]);
11545
11826
  var headerContainerSchema = z21.object({
@@ -11587,8 +11868,22 @@ var dropdownStyleSchema = z21.object({
11587
11868
  textSize: z21.enum(["xs", "sm", "base", "lg"]).optional()
11588
11869
  // optional = no override (browser default)
11589
11870
  }).optional();
11590
- var headerCtaGapSchema = z21.enum(["none", "tight", "compact", "default", "relaxed", "spacious"]);
11591
- var headerCtaTreatmentSchema = z21.enum(["default", "primary", "secondary", "inverted", "outline", "ghost"]);
11871
+ var headerCtaGapSchema = z21.enum([
11872
+ "none",
11873
+ "tight",
11874
+ "compact",
11875
+ "default",
11876
+ "relaxed",
11877
+ "spacious"
11878
+ ]);
11879
+ var headerCtaTreatmentSchema = z21.enum([
11880
+ "default",
11881
+ "primary",
11882
+ "secondary",
11883
+ "inverted",
11884
+ "outline",
11885
+ "ghost"
11886
+ ]);
11592
11887
  var navContainerSchema = z21.object({
11593
11888
  type: z21.enum(["none", "pill", "glass"]).default("none"),
11594
11889
  tint: z21.string().nullable().optional(),
@@ -11643,7 +11938,14 @@ var footerMaxWidth = z21.enum(["container", "full"]);
11643
11938
  var footerMode = z21.enum(["default", "blocks", "default+blocks", "none"]);
11644
11939
  var footerNavLayoutMode = z21.enum(["stack", "inline", "inline-wrap"]);
11645
11940
  var footerNavLayoutAlign = z21.enum(["start", "center", "end", "space-between"]);
11646
- var footerSpacing = z21.enum(["none", "tight", "compact", "default", "relaxed", "spacious"]);
11941
+ var footerSpacing = z21.enum([
11942
+ "none",
11943
+ "tight",
11944
+ "compact",
11945
+ "default",
11946
+ "relaxed",
11947
+ "spacious"
11948
+ ]);
11647
11949
  var footerLogoPlacement = z21.enum(["left", "right", "above", "below"]);
11648
11950
  var footerLogoSize = z21.enum(["sm", "md", "lg", "xl"]);
11649
11951
  var footerLogoMaxHeight = z21.enum(["sm", "md", "lg", "xl"]);
@@ -11708,7 +12010,12 @@ var footerSchema = z21.object({
11708
12010
  logo: footerLogoSchema.optional(),
11709
12011
  bottomBar: footerBottomBarSchema.optional()
11710
12012
  });
11711
- var containerPaddingPresetSchema = z21.enum(["tight", "compact", "default", "relaxed"]);
12013
+ var containerPaddingPresetSchema = z21.enum([
12014
+ "tight",
12015
+ "compact",
12016
+ "default",
12017
+ "relaxed"
12018
+ ]);
11712
12019
  var layoutSchema = z21.object({
11713
12020
  containerPadding: z21.object({
11714
12021
  mobile: containerPaddingPresetSchema.optional(),
@@ -11716,8 +12023,24 @@ var layoutSchema = z21.object({
11716
12023
  desktop: containerPaddingPresetSchema.optional()
11717
12024
  }).optional()
11718
12025
  }).optional();
11719
- var heroTypographySizeSchema = z21.enum(["sm", "base", "lg", "xl", "2xl", "3xl", "4xl", "5xl", "6xl", "editorial"]);
11720
- var heroTypographyLineHeightSchema = z21.enum(["tight", "snug", "normal", "relaxed"]);
12026
+ var heroTypographySizeSchema = z21.enum([
12027
+ "sm",
12028
+ "base",
12029
+ "lg",
12030
+ "xl",
12031
+ "2xl",
12032
+ "3xl",
12033
+ "4xl",
12034
+ "5xl",
12035
+ "6xl",
12036
+ "editorial"
12037
+ ]);
12038
+ var heroTypographyLineHeightSchema = z21.enum([
12039
+ "tight",
12040
+ "snug",
12041
+ "normal",
12042
+ "relaxed"
12043
+ ]);
11721
12044
  var heroResponsiveTypographySchema = z21.object({
11722
12045
  headlineSize: heroTypographySizeSchema.optional(),
11723
12046
  headlineLineHeight: heroTypographyLineHeightSchema.optional(),
@@ -12152,6 +12475,28 @@ var warmNeutralCream = definePaletteVariant({
12152
12475
  { name: "border", hex: "#e0d2b8" }
12153
12476
  ]
12154
12477
  });
12478
+ var warmNeutralSoftEarth = definePaletteVariant({
12479
+ id: "warm-neutral-soft-earth",
12480
+ name: "Warm Neutral \u2014 Soft Earth",
12481
+ description: "Cream ground with terracotta primary, clay accents, and olive depth.",
12482
+ tags: { tone: "classic", energy: "calm", era: "organic" },
12483
+ mode: "light",
12484
+ colors: [
12485
+ { name: "primary", hex: "#a8573d" },
12486
+ { name: "secondary", hex: "#72765c" },
12487
+ { name: "accent", hex: "#c87557" },
12488
+ { name: "success", hex: "#687854" },
12489
+ { name: "warning", hex: "#b7863e" },
12490
+ { name: "destructive", hex: "#a54b3c" },
12491
+ { name: "background", hex: "#fbf6eb" },
12492
+ { name: "surface", hex: "#fffdf7" },
12493
+ { name: "surfaceAlt", hex: "#f0e4d3" },
12494
+ { name: "muted", hex: "#eadbc6" },
12495
+ { name: "text", hex: "#30281f" },
12496
+ { name: "primaryForeground", hex: "#fffaf3" },
12497
+ { name: "border", hex: "#d9c8b2" }
12498
+ ]
12499
+ });
12155
12500
  var warmNeutralForest = definePaletteVariant({
12156
12501
  id: "warm-neutral-forest",
12157
12502
  name: "Warm Neutral \u2014 Forest",
@@ -12185,6 +12530,7 @@ var paletteVariants = [
12185
12530
  // Warm-neutral family
12186
12531
  warmNeutralClay,
12187
12532
  warmNeutralCream,
12533
+ warmNeutralSoftEarth,
12188
12534
  warmNeutralForest,
12189
12535
  // High-contrast family
12190
12536
  highContrastInk,
@@ -12203,6 +12549,12 @@ var paletteVariantsById = new Map(
12203
12549
  function asHeaderLookId(value) {
12204
12550
  return value;
12205
12551
  }
12552
+ function asHeaderLayoutId(value) {
12553
+ return value;
12554
+ }
12555
+ function asHeaderStyleId(value) {
12556
+ return value;
12557
+ }
12206
12558
  function baseHeader(theme) {
12207
12559
  const {
12208
12560
  navLinkStyle: _navLinkStyle,
@@ -12221,63 +12573,423 @@ function baseHeader(theme) {
12221
12573
  navContainer: { type: "none", tint: null, opacity: 0.15 }
12222
12574
  };
12223
12575
  }
12224
- function solidBrandHeader(theme) {
12225
- const ctaVariant = resolveHeaderCtaVariant(theme, "inverted");
12226
- return {
12227
- ...baseHeader(theme),
12576
+ var headerLayoutCatalog = [
12577
+ {
12578
+ id: asHeaderLayoutId("classic"),
12579
+ label: "Classic",
12580
+ description: "Logo and navigation in one practical horizontal row.",
12581
+ structure: "inline-classic",
12228
12582
  variant: "classic",
12229
- positioning: "sticky",
12583
+ defaultPositioning: "sticky",
12584
+ shrinkOnScroll: false
12585
+ },
12586
+ {
12587
+ id: asHeaderLayoutId("centered"),
12588
+ label: "Centered",
12589
+ description: "Logo centered above a balanced navigation row.",
12590
+ structure: "centered-stack",
12591
+ variant: "centered",
12592
+ defaultPositioning: "static",
12593
+ shrinkOnScroll: false,
12594
+ maxRecommendedNavItems: 5,
12595
+ allowedLogoShapes: ["none", "text-only", "horizontal", "square"]
12596
+ },
12597
+ {
12598
+ id: asHeaderLayoutId("floating"),
12599
+ label: "Floating",
12600
+ description: "Detached header chrome that sits over the opening section.",
12601
+ structure: "floating-shell",
12602
+ variant: "floating",
12603
+ defaultPositioning: "fixed",
12230
12604
  shrinkOnScroll: true,
12231
- background: {
12232
- type: "color",
12233
- color: "primary"
12234
- },
12235
- textColor: "primaryForeground",
12236
- navColor: "primaryForeground",
12237
- navStyle: "underline-grow",
12238
- navWeight: "bold",
12239
- navLinkStyle: {
12240
- typography: "body",
12241
- fontWeight: "bold",
12242
- textTransform: "uppercase",
12243
- italic: false,
12244
- colorToken: "primaryForeground",
12245
- hoverColorToken: "secondary",
12246
- textSize: "sm",
12247
- letterSpacing: "wider",
12248
- padding: "compact",
12249
- paddingX: "compact",
12250
- borderRadius: "none",
12251
- effects: {
12252
- hover: [
12253
- { effectId: "text-color-change", options: { hoverColorToken: "secondary" } },
12254
- { effectId: "nav-underline", options: { style: "grow", colorToken: "secondary" } }
12255
- ]
12256
- }
12257
- },
12258
- dropdownStyle: {
12259
- background: "primary-700",
12260
- textColor: "primaryForeground",
12261
- borderColor: null,
12262
- shadow: "md",
12263
- borderRadius: "md",
12264
- hoverBackground: "primary-900",
12265
- hoverTextColor: "secondary",
12266
- textTransform: "uppercase",
12267
- letterSpacing: "wider",
12268
- fontWeight: "bold",
12269
- textSize: "sm"
12270
- },
12271
- border: {
12272
- style: "solid",
12273
- width: "none",
12274
- position: "none"
12275
- },
12276
- logoText: {
12277
- hideOnShrink: true,
12278
- mobileMaxWidth: "sm",
12279
- mobileWrapLines: 2
12280
- },
12605
+ maxRecommendedNavItems: 5,
12606
+ allowedLogoShapes: ["none", "text-only", "horizontal"]
12607
+ }
12608
+ ];
12609
+ function supportedLayouts(ids) {
12610
+ return ids.map(asHeaderLayoutId);
12611
+ }
12612
+ var headerStyleCatalog = [
12613
+ {
12614
+ id: asHeaderStyleId("minimal"),
12615
+ label: "Minimal",
12616
+ description: "Quiet surface with simple color-change navigation.",
12617
+ supportedLayoutIds: supportedLayouts(["classic", "centered"]),
12618
+ navInteraction: "color-change",
12619
+ surface: "neutral",
12620
+ navTypography: "plain"
12621
+ },
12622
+ {
12623
+ id: asHeaderStyleId("fine-line"),
12624
+ label: "Fine Line",
12625
+ description: "Light surface with a crisp lower rule and underline hover.",
12626
+ supportedLayoutIds: supportedLayouts(["classic", "centered"]),
12627
+ navInteraction: "underline-grow",
12628
+ surface: "bordered",
12629
+ navTypography: "plain"
12630
+ },
12631
+ {
12632
+ id: asHeaderStyleId("soft-bar"),
12633
+ label: "Soft Bar",
12634
+ description: "Soft tinted surface with gentle pill hover states.",
12635
+ supportedLayoutIds: supportedLayouts(["classic", "centered"]),
12636
+ navInteraction: "pill-background",
12637
+ surface: "soft",
12638
+ navTypography: "plain"
12639
+ },
12640
+ {
12641
+ id: asHeaderStyleId("pill-nav"),
12642
+ label: "Pill Nav",
12643
+ description: "A calm pill navigation rail over a neutral header.",
12644
+ supportedLayoutIds: supportedLayouts(["classic", "centered"]),
12645
+ navInteraction: "pill-background",
12646
+ surface: "soft",
12647
+ navTypography: "plain"
12648
+ },
12649
+ {
12650
+ id: asHeaderStyleId("brand-bar"),
12651
+ label: "Brand Bar",
12652
+ description: "Solid brand surface with high-contrast navigation.",
12653
+ supportedLayoutIds: supportedLayouts(["classic", "centered"]),
12654
+ navInteraction: "color-change",
12655
+ surface: "brand-solid",
12656
+ navTypography: "brand-caps"
12657
+ },
12658
+ {
12659
+ id: asHeaderStyleId("brand-underline"),
12660
+ label: "Brand Underline",
12661
+ description: "Brand surface with underline-grow navigation.",
12662
+ supportedLayoutIds: supportedLayouts(["classic"]),
12663
+ navInteraction: "underline-grow",
12664
+ surface: "brand-solid",
12665
+ navTypography: "brand-caps"
12666
+ },
12667
+ {
12668
+ id: asHeaderStyleId("brand-pill"),
12669
+ label: "Brand Pill",
12670
+ description: "Solid brand surface with rounded active and hover states.",
12671
+ supportedLayoutIds: supportedLayouts(["classic", "centered", "floating"]),
12672
+ navInteraction: "pill-background",
12673
+ surface: "brand-solid",
12674
+ navTypography: "brand-caps"
12675
+ },
12676
+ {
12677
+ id: asHeaderStyleId("serif-line"),
12678
+ label: "Serif Line",
12679
+ description: "Typographic logo treatment with understated underline navigation.",
12680
+ supportedLayoutIds: supportedLayouts(["classic", "centered"]),
12681
+ navInteraction: "underline-grow",
12682
+ surface: "bordered",
12683
+ navTypography: "heading"
12684
+ },
12685
+ {
12686
+ id: asHeaderStyleId("flat-tabs"),
12687
+ label: "Flat Tabs",
12688
+ description: "Flat block hover and active states with a Swiss utility feel.",
12689
+ supportedLayoutIds: supportedLayouts(["classic", "centered"]),
12690
+ navInteraction: "flat-block",
12691
+ surface: "bordered",
12692
+ navTypography: "quiet-caps"
12693
+ },
12694
+ {
12695
+ id: asHeaderStyleId("glass"),
12696
+ label: "Glass",
12697
+ description: "Translucent chrome with frosted navigation backing.",
12698
+ supportedLayoutIds: supportedLayouts(["classic", "floating"]),
12699
+ navInteraction: "glass-backed",
12700
+ surface: "floating",
12701
+ navTypography: "plain"
12702
+ },
12703
+ {
12704
+ id: asHeaderStyleId("minimal-surface"),
12705
+ label: "Clear Split",
12706
+ description: "Floating logo with transparent navigation and no shared shell.",
12707
+ supportedLayoutIds: supportedLayouts(["floating"]),
12708
+ navInteraction: "color-change",
12709
+ surface: "floating",
12710
+ navTypography: "plain"
12711
+ },
12712
+ {
12713
+ id: asHeaderStyleId("soft-shell"),
12714
+ label: "Soft Shell",
12715
+ description: "Floating rounded shell with soft pill navigation states.",
12716
+ supportedLayoutIds: supportedLayouts(["floating"]),
12717
+ navInteraction: "pill-background",
12718
+ surface: "floating",
12719
+ navTypography: "plain"
12720
+ },
12721
+ {
12722
+ id: asHeaderStyleId("split-glass"),
12723
+ label: "Split Glass",
12724
+ description: "Logo floats independently while the navigation sits in a glass rail.",
12725
+ supportedLayoutIds: supportedLayouts(["floating"]),
12726
+ navInteraction: "glass-backed",
12727
+ surface: "floating",
12728
+ navTypography: "quiet-caps"
12729
+ },
12730
+ {
12731
+ id: asHeaderStyleId("split-pill"),
12732
+ label: "Split Pill",
12733
+ description: "Logo floats independently with a soft pill-backed navigation rail.",
12734
+ supportedLayoutIds: supportedLayouts(["floating"]),
12735
+ navInteraction: "pill-background",
12736
+ surface: "floating",
12737
+ navTypography: "heading"
12738
+ }
12739
+ ];
12740
+ var headerLayoutsById = new Map(
12741
+ headerLayoutCatalog.map((layout) => [layout.id, layout])
12742
+ );
12743
+ var headerStylesById = new Map(
12744
+ headerStyleCatalog.map((style) => [style.id, style])
12745
+ );
12746
+ var headerStyleCompatibilityOrder = /* @__PURE__ */ new Map([
12747
+ [
12748
+ asHeaderLayoutId("classic"),
12749
+ headerStyleRepairChain([
12750
+ "minimal",
12751
+ "glass",
12752
+ "fine-line",
12753
+ "soft-bar",
12754
+ "pill-nav",
12755
+ "brand-bar",
12756
+ "brand-underline",
12757
+ "brand-pill",
12758
+ "serif-line",
12759
+ "flat-tabs"
12760
+ ])
12761
+ ],
12762
+ [
12763
+ asHeaderLayoutId("centered"),
12764
+ headerStyleRepairChain([
12765
+ "minimal",
12766
+ "fine-line",
12767
+ "soft-bar",
12768
+ "pill-nav",
12769
+ "brand-bar",
12770
+ "brand-pill",
12771
+ "serif-line",
12772
+ "flat-tabs"
12773
+ ])
12774
+ ],
12775
+ [
12776
+ asHeaderLayoutId("floating"),
12777
+ headerStyleRepairChain([
12778
+ "glass",
12779
+ "minimal-surface",
12780
+ "split-glass",
12781
+ "split-pill",
12782
+ "soft-shell",
12783
+ "brand-pill"
12784
+ ])
12785
+ ]
12786
+ ]);
12787
+ function headerStyleRepairChain(values) {
12788
+ return values.map(asHeaderStyleId);
12789
+ }
12790
+ var headerStyleRepairOrder = /* @__PURE__ */ new Map(
12791
+ [
12792
+ [
12793
+ asHeaderStyleId("brand-bar"),
12794
+ headerStyleRepairChain(["brand-bar", "brand-pill", "minimal"])
12795
+ ],
12796
+ [
12797
+ asHeaderStyleId("brand-underline"),
12798
+ headerStyleRepairChain(["serif-line", "fine-line", "minimal"])
12799
+ ],
12800
+ [
12801
+ asHeaderStyleId("brand-pill"),
12802
+ headerStyleRepairChain(["brand-pill", "brand-bar", "minimal"])
12803
+ ],
12804
+ [
12805
+ asHeaderStyleId("pill-nav"),
12806
+ headerStyleRepairChain(["pill-nav", "soft-bar", "minimal"])
12807
+ ],
12808
+ [
12809
+ asHeaderStyleId("flat-tabs"),
12810
+ headerStyleRepairChain(["flat-tabs", "pill-nav", "minimal"])
12811
+ ],
12812
+ [
12813
+ asHeaderStyleId("serif-line"),
12814
+ headerStyleRepairChain(["serif-line", "fine-line", "minimal"])
12815
+ ],
12816
+ [
12817
+ asHeaderStyleId("glass"),
12818
+ headerStyleRepairChain(["glass", "minimal-surface", "minimal"])
12819
+ ],
12820
+ [
12821
+ asHeaderStyleId("soft-shell"),
12822
+ headerStyleRepairChain(["soft-shell", "soft-bar", "minimal"])
12823
+ ],
12824
+ [
12825
+ asHeaderStyleId("minimal-surface"),
12826
+ headerStyleRepairChain(["minimal-surface", "minimal"])
12827
+ ],
12828
+ [
12829
+ asHeaderStyleId("split-glass"),
12830
+ headerStyleRepairChain(["split-glass", "glass", "minimal-surface"])
12831
+ ],
12832
+ [
12833
+ asHeaderStyleId("split-pill"),
12834
+ headerStyleRepairChain(["split-pill", "soft-shell", "brand-pill"])
12835
+ ],
12836
+ [
12837
+ asHeaderStyleId("fine-line"),
12838
+ headerStyleRepairChain(["fine-line", "minimal"])
12839
+ ],
12840
+ [
12841
+ asHeaderStyleId("soft-bar"),
12842
+ headerStyleRepairChain(["soft-bar", "minimal"])
12843
+ ],
12844
+ [asHeaderStyleId("minimal"), headerStyleRepairChain(["minimal"])]
12845
+ ]
12846
+ );
12847
+ var legacyHeaderLookAliases = [
12848
+ {
12849
+ lookId: asHeaderLookId("clean-base"),
12850
+ selection: {
12851
+ layoutId: asHeaderLayoutId("classic"),
12852
+ styleId: asHeaderStyleId("minimal")
12853
+ }
12854
+ },
12855
+ {
12856
+ lookId: asHeaderLookId("brand-solid"),
12857
+ selection: {
12858
+ layoutId: asHeaderLayoutId("classic"),
12859
+ styleId: asHeaderStyleId("brand-bar")
12860
+ }
12861
+ },
12862
+ {
12863
+ lookId: asHeaderLookId("serif-line"),
12864
+ selection: {
12865
+ layoutId: asHeaderLayoutId("centered"),
12866
+ styleId: asHeaderStyleId("serif-line")
12867
+ }
12868
+ },
12869
+ {
12870
+ lookId: asHeaderLookId("centered-calm"),
12871
+ selection: {
12872
+ layoutId: asHeaderLayoutId("centered"),
12873
+ styleId: asHeaderStyleId("minimal")
12874
+ }
12875
+ },
12876
+ {
12877
+ lookId: asHeaderLookId("practical-utility"),
12878
+ selection: {
12879
+ layoutId: asHeaderLayoutId("classic"),
12880
+ styleId: asHeaderStyleId("flat-tabs")
12881
+ }
12882
+ },
12883
+ {
12884
+ lookId: asHeaderLookId("minimal-transparent"),
12885
+ selection: {
12886
+ layoutId: asHeaderLayoutId("classic"),
12887
+ styleId: asHeaderStyleId("minimal")
12888
+ }
12889
+ },
12890
+ {
12891
+ lookId: asHeaderLookId("transparent-overlay"),
12892
+ selection: {
12893
+ layoutId: asHeaderLayoutId("floating"),
12894
+ styleId: asHeaderStyleId("glass")
12895
+ }
12896
+ },
12897
+ {
12898
+ lookId: asHeaderLookId("floating-glass"),
12899
+ selection: {
12900
+ layoutId: asHeaderLayoutId("floating"),
12901
+ styleId: asHeaderStyleId("glass")
12902
+ }
12903
+ }
12904
+ ];
12905
+ var legacyHeaderLookAliasesById = new Map(legacyHeaderLookAliases.map((alias) => [alias.lookId, alias]));
12906
+ function getHeaderStyle(id) {
12907
+ return headerStylesById.get(id) ?? null;
12908
+ }
12909
+ function isHeaderStyleCompatibleWithLayout(style, layoutId) {
12910
+ return style.supportedLayoutIds.includes(layoutId);
12911
+ }
12912
+ function getHeaderStyleOrThrow(id) {
12913
+ const style = getHeaderStyle(id);
12914
+ if (!style) {
12915
+ throw new Error(`Unknown Theme V2 header style: ${id}`);
12916
+ }
12917
+ return style;
12918
+ }
12919
+ function resolveLegacyHeaderLookAlias(lookId) {
12920
+ return legacyHeaderLookAliasesById.get(lookId)?.selection ?? null;
12921
+ }
12922
+ function getCompatibleHeaderStyleIds(layoutId) {
12923
+ return (headerStyleCompatibilityOrder.get(layoutId) ?? []).filter(
12924
+ (styleId) => {
12925
+ const style = getHeaderStyleOrThrow(styleId);
12926
+ return isHeaderStyleCompatibleWithLayout(style, layoutId);
12927
+ }
12928
+ );
12929
+ }
12930
+ function solidBrandHeader(theme) {
12931
+ const ctaVariant = resolveHeaderCtaVariant(theme, "inverted");
12932
+ return {
12933
+ ...baseHeader(theme),
12934
+ variant: "classic",
12935
+ positioning: "sticky",
12936
+ shrinkOnScroll: true,
12937
+ background: {
12938
+ type: "color",
12939
+ color: "primary"
12940
+ },
12941
+ textColor: "primaryForeground",
12942
+ navColor: "primaryForeground",
12943
+ navStyle: "underline-grow",
12944
+ navWeight: "bold",
12945
+ navLinkStyle: {
12946
+ typography: "body",
12947
+ fontWeight: "bold",
12948
+ textTransform: "uppercase",
12949
+ italic: false,
12950
+ colorToken: "primaryForeground",
12951
+ hoverColorToken: "secondary",
12952
+ textSize: "sm",
12953
+ letterSpacing: "wider",
12954
+ padding: "compact",
12955
+ paddingX: "compact",
12956
+ borderRadius: "none",
12957
+ effects: {
12958
+ hover: [
12959
+ {
12960
+ effectId: "text-color-change",
12961
+ options: { hoverColorToken: "secondary" }
12962
+ },
12963
+ {
12964
+ effectId: "nav-underline",
12965
+ options: { style: "grow", colorToken: "secondary" }
12966
+ }
12967
+ ]
12968
+ }
12969
+ },
12970
+ dropdownStyle: {
12971
+ background: "primary-700",
12972
+ textColor: "primaryForeground",
12973
+ borderColor: null,
12974
+ shadow: "md",
12975
+ borderRadius: "md",
12976
+ hoverBackground: "primary-900",
12977
+ hoverTextColor: "secondary",
12978
+ textTransform: "uppercase",
12979
+ letterSpacing: "wider",
12980
+ fontWeight: "bold",
12981
+ textSize: "sm"
12982
+ },
12983
+ border: {
12984
+ style: "solid",
12985
+ width: "none",
12986
+ position: "none"
12987
+ },
12988
+ logoText: {
12989
+ hideOnShrink: true,
12990
+ mobileMaxWidth: "sm",
12991
+ mobileWrapLines: 2
12992
+ },
12281
12993
  ctaGap: "compact",
12282
12994
  ctaTreatment: "inverted",
12283
12995
  ...ctaVariant ? { ctaVariant } : {}
@@ -12307,10 +13019,10 @@ function cleanBaseHeader(theme) {
12307
13019
  ctaGap: "default"
12308
13020
  };
12309
13021
  }
12310
- function editorialLineHeader(theme) {
13022
+ function serifLineHeader(theme) {
12311
13023
  return {
12312
13024
  ...baseHeader(theme),
12313
- variant: "editorial",
13025
+ variant: "centered",
12314
13026
  positioning: "sticky",
12315
13027
  shrinkOnScroll: false,
12316
13028
  background: {
@@ -12457,6 +13169,11 @@ var headerLookCatalog = [
12457
13169
  label: "Clean base",
12458
13170
  visualTreatment: "solid-neutral",
12459
13171
  layoutBehavior: "sticky",
13172
+ configuration: {
13173
+ structure: "inline-classic",
13174
+ treatment: "solid-neutral",
13175
+ behavior: "sticky"
13176
+ },
12460
13177
  openingRequirement: "none",
12461
13178
  compile: cleanBaseHeader
12462
13179
  },
@@ -12465,23 +13182,38 @@ var headerLookCatalog = [
12465
13182
  label: "Brand solid",
12466
13183
  visualTreatment: "solid-brand",
12467
13184
  layoutBehavior: "sticky-shrink",
13185
+ configuration: {
13186
+ structure: "inline-classic",
13187
+ treatment: "solid-brand",
13188
+ behavior: "sticky-shrink"
13189
+ },
12468
13190
  openingRequirement: "none",
12469
13191
  compile: solidBrandHeader
12470
13192
  },
12471
13193
  {
12472
- id: asHeaderLookId("editorial-line"),
12473
- label: "Editorial line",
12474
- visualTreatment: "light-editorial",
13194
+ id: asHeaderLookId("serif-line"),
13195
+ label: "Serif line",
13196
+ visualTreatment: "light-serif",
12475
13197
  layoutBehavior: "sticky",
13198
+ configuration: {
13199
+ structure: "centered-stack",
13200
+ treatment: "light-serif",
13201
+ behavior: "sticky"
13202
+ },
12476
13203
  openingRequirement: "none",
12477
13204
  maxRecommendedNavItems: 6,
12478
- compile: editorialLineHeader
13205
+ compile: serifLineHeader
12479
13206
  },
12480
13207
  {
12481
13208
  id: asHeaderLookId("centered-calm"),
12482
13209
  label: "Centered calm",
12483
- visualTreatment: "light-editorial",
13210
+ visualTreatment: "light-serif",
12484
13211
  layoutBehavior: "normal-flow",
13212
+ configuration: {
13213
+ structure: "centered-stack",
13214
+ treatment: "light-serif",
13215
+ behavior: "normal-flow"
13216
+ },
12485
13217
  openingRequirement: "none",
12486
13218
  maxRecommendedNavItems: 5,
12487
13219
  allowedLogoShapes: ["none", "text-only", "horizontal", "square"],
@@ -12492,6 +13224,11 @@ var headerLookCatalog = [
12492
13224
  label: "Practical utility",
12493
13225
  visualTreatment: "solid-neutral",
12494
13226
  layoutBehavior: "sticky-shrink",
13227
+ configuration: {
13228
+ structure: "inline-classic",
13229
+ treatment: "solid-neutral",
13230
+ behavior: "sticky-shrink"
13231
+ },
12495
13232
  openingRequirement: "none",
12496
13233
  requiresProminentCta: true,
12497
13234
  compile: practicalUtilityHeader
@@ -12501,6 +13238,11 @@ var headerLookCatalog = [
12501
13238
  label: "Minimal transparent",
12502
13239
  visualTreatment: "minimal-transparent",
12503
13240
  layoutBehavior: "normal-flow",
13241
+ configuration: {
13242
+ structure: "inline-classic",
13243
+ treatment: "minimal-transparent",
13244
+ behavior: "normal-flow"
13245
+ },
12504
13246
  openingRequirement: "reserved-space-ok",
12505
13247
  compile: minimalTransparentHeader
12506
13248
  },
@@ -12509,6 +13251,11 @@ var headerLookCatalog = [
12509
13251
  label: "Transparent overlay",
12510
13252
  visualTreatment: "transparent-overlay",
12511
13253
  layoutBehavior: "fixed-overlay",
13254
+ configuration: {
13255
+ structure: "inline-classic",
13256
+ treatment: "transparent-overlay",
13257
+ behavior: "fixed-overlay"
13258
+ },
12512
13259
  openingRequirement: "requires-image-hero-with-contrast-overlay",
12513
13260
  maxRecommendedNavItems: 5,
12514
13261
  allowedLogoShapes: ["none", "text-only", "horizontal"],
@@ -12519,6 +13266,11 @@ var headerLookCatalog = [
12519
13266
  label: "Floating glass",
12520
13267
  visualTreatment: "floating-glass",
12521
13268
  layoutBehavior: "fixed-floating",
13269
+ configuration: {
13270
+ structure: "floating-shell",
13271
+ treatment: "floating-glass",
13272
+ behavior: "fixed-floating"
13273
+ },
12522
13274
  openingRequirement: "requires-image-hero-with-contrast-overlay",
12523
13275
  maxRecommendedNavItems: 5,
12524
13276
  allowedLogoShapes: ["none", "text-only", "horizontal"],
@@ -12526,9 +13278,17 @@ var headerLookCatalog = [
12526
13278
  }
12527
13279
  ];
12528
13280
  var guaranteedFallbackHeaderLookId = asHeaderLookId("clean-base");
13281
+ var guaranteedFallbackHeaderLayoutId = asHeaderLayoutId("classic");
13282
+ var guaranteedFallbackHeaderStyleId = asHeaderStyleId("minimal");
13283
+ var allowedHeaderConfigurationKeys = new Set(
13284
+ headerLookCatalog.map((look) => headerConfigurationKey(look.configuration))
13285
+ );
12529
13286
  var headerLooksById = new Map(
12530
13287
  headerLookCatalog.map((look) => [look.id, look])
12531
13288
  );
13289
+ function headerConfigurationKey(configuration) {
13290
+ return `${configuration.structure}:${configuration.treatment}:${configuration.behavior}`;
13291
+ }
12532
13292
 
12533
13293
  // ../theme-core/src/site-styles/footerLooks.ts
12534
13294
  function asFooterLookId(value) {
@@ -12661,6 +13421,264 @@ var advancedDesignOptionCatalog = {
12661
13421
  detachedCustom: true
12662
13422
  };
12663
13423
 
13424
+ // ../theme-core/src/site-styles/typographyPresets.ts
13425
+ var bodyReadablePolicy = {
13426
+ recommendedCategories: ["sans-serif", "serif"],
13427
+ allowedCategories: ["sans-serif", "serif"],
13428
+ requiresItalicForBody: true,
13429
+ requiresBoldForBody: true
13430
+ };
13431
+ var headingFlexiblePolicy = {
13432
+ recommendedCategories: ["sans-serif", "serif", "display"],
13433
+ allowedCategories: ["sans-serif", "serif", "display"]
13434
+ };
13435
+ var displayHeadingPolicy = {
13436
+ recommendedCategories: ["display", "sans-serif", "serif"],
13437
+ allowedCategories: ["display", "sans-serif", "serif"]
13438
+ };
13439
+ function asTypographyPresetId(value) {
13440
+ if (!value.startsWith("typography-preset:")) {
13441
+ throw new Error(`TypographyPresetId must start with "typography-preset:". Received: ${value}`);
13442
+ }
13443
+ return value;
13444
+ }
13445
+ function defineTypographyPreset(preset2) {
13446
+ return {
13447
+ ...preset2,
13448
+ id: asTypographyPresetId(preset2.id)
13449
+ };
13450
+ }
13451
+ var modernSansTypography = {
13452
+ body: {
13453
+ family: "Inter, system-ui, sans-serif",
13454
+ size: "md",
13455
+ weight: "regular",
13456
+ lineHeight: "relaxed",
13457
+ letterSpacing: "normal"
13458
+ },
13459
+ headings: {
13460
+ default: {
13461
+ family: "Inter, system-ui, sans-serif",
13462
+ weight: "semibold",
13463
+ lineHeight: "normal",
13464
+ letterSpacing: "tight",
13465
+ italic: null,
13466
+ case: null
13467
+ },
13468
+ h1: { size: "xl", weight: "bold", lineHeight: "normal", letterSpacing: "tight", italic: null },
13469
+ h2: { size: "lg", weight: "semibold", lineHeight: "normal", letterSpacing: "tight", italic: null },
13470
+ h3: { size: "md", weight: "semibold", lineHeight: "normal", letterSpacing: "normal", italic: null }
13471
+ },
13472
+ scale: "balanced"
13473
+ };
13474
+ var warmRoundedTypography = {
13475
+ body: {
13476
+ family: "Nunito Sans, system-ui, sans-serif",
13477
+ size: "lg",
13478
+ weight: "regular",
13479
+ lineHeight: "relaxed",
13480
+ letterSpacing: "normal"
13481
+ },
13482
+ headings: {
13483
+ default: {
13484
+ family: "Nunito Sans, system-ui, sans-serif",
13485
+ weight: "bold",
13486
+ lineHeight: "normal",
13487
+ letterSpacing: "normal",
13488
+ italic: null,
13489
+ case: null
13490
+ },
13491
+ h1: { size: "xl", weight: "bold", lineHeight: "normal", letterSpacing: "normal", italic: null },
13492
+ h2: { size: "lg", weight: "bold", lineHeight: "normal", letterSpacing: "normal", italic: null },
13493
+ h3: { size: "md", weight: "semibold", lineHeight: "relaxed", letterSpacing: "normal", italic: null }
13494
+ },
13495
+ scale: "balanced"
13496
+ };
13497
+ var editorialSerifTypography = {
13498
+ body: {
13499
+ family: "Lora, Georgia, serif",
13500
+ size: "lg",
13501
+ weight: "regular",
13502
+ lineHeight: "loose",
13503
+ letterSpacing: "normal"
13504
+ },
13505
+ headings: {
13506
+ default: {
13507
+ family: "Playfair Display, Georgia, serif",
13508
+ weight: "semibold",
13509
+ lineHeight: "normal",
13510
+ letterSpacing: "tight",
13511
+ italic: null,
13512
+ case: null
13513
+ },
13514
+ h1: { size: "2xl", weight: "semibold", lineHeight: "normal", letterSpacing: "tight", italic: null },
13515
+ h2: { size: "xl", weight: "semibold", lineHeight: "normal", letterSpacing: "normal", italic: null },
13516
+ h3: { size: "md", weight: "semibold", lineHeight: "relaxed", letterSpacing: "normal", italic: true }
13517
+ },
13518
+ scale: "spacious"
13519
+ };
13520
+ var classicSerifTypography = {
13521
+ body: {
13522
+ family: "Libre Baskerville, Georgia, serif",
13523
+ size: "md",
13524
+ weight: "regular",
13525
+ lineHeight: "relaxed",
13526
+ letterSpacing: "normal"
13527
+ },
13528
+ headings: {
13529
+ default: {
13530
+ family: "Cormorant Garamond, Georgia, serif",
13531
+ weight: "semibold",
13532
+ lineHeight: "normal",
13533
+ letterSpacing: "normal",
13534
+ italic: null,
13535
+ case: null
13536
+ },
13537
+ h1: { size: "2xl", weight: "semibold", lineHeight: "normal", letterSpacing: "normal", italic: null },
13538
+ h2: { size: "xl", weight: "semibold", lineHeight: "normal", letterSpacing: "normal", italic: null },
13539
+ h3: { size: "md", weight: "medium", lineHeight: "relaxed", letterSpacing: "normal", italic: null }
13540
+ },
13541
+ scale: "balanced"
13542
+ };
13543
+ var luxeContrastTypography = {
13544
+ body: {
13545
+ family: "Manrope, system-ui, sans-serif",
13546
+ size: "md",
13547
+ weight: "regular",
13548
+ lineHeight: "relaxed",
13549
+ letterSpacing: "normal"
13550
+ },
13551
+ headings: {
13552
+ default: {
13553
+ family: "Cormorant Garamond, Georgia, serif",
13554
+ weight: "semibold",
13555
+ lineHeight: "normal",
13556
+ letterSpacing: "tight",
13557
+ italic: null,
13558
+ case: null
13559
+ },
13560
+ h1: { size: "2xl", weight: "semibold", lineHeight: "normal", letterSpacing: "tight", italic: null },
13561
+ h2: { size: "xl", weight: "semibold", lineHeight: "normal", letterSpacing: "tight", italic: null },
13562
+ h3: { size: "md", weight: "medium", lineHeight: "relaxed", letterSpacing: "normal", italic: null }
13563
+ },
13564
+ scale: "spacious"
13565
+ };
13566
+ var boldDisplayTypography = {
13567
+ body: {
13568
+ family: "Manrope, system-ui, sans-serif",
13569
+ size: "lg",
13570
+ weight: "regular",
13571
+ lineHeight: "relaxed",
13572
+ letterSpacing: "normal"
13573
+ },
13574
+ headings: {
13575
+ default: {
13576
+ family: '"TAN - PEARL", sans-serif',
13577
+ weight: "bold",
13578
+ lineHeight: "normal",
13579
+ letterSpacing: "tight",
13580
+ colorToken: "primary",
13581
+ italic: null,
13582
+ case: null
13583
+ },
13584
+ h1: { size: "xl", weight: "bold", lineHeight: "normal", letterSpacing: "tight", italic: null },
13585
+ h2: { size: "lg", weight: "bold", lineHeight: "normal", letterSpacing: "normal", italic: null },
13586
+ h3: { size: "md", weight: "bold", lineHeight: "normal", letterSpacing: "normal", italic: null }
13587
+ },
13588
+ scale: "balanced"
13589
+ };
13590
+ var typographyPresets = [
13591
+ defineTypographyPreset({
13592
+ id: "typography-preset:modern-sans",
13593
+ name: "Modern Sans",
13594
+ description: "Crisp, neutral type for clear service pages and practical editorial structure.",
13595
+ defaultFonts: { body: "Inter, system-ui, sans-serif", heading: "Inter, system-ui, sans-serif" },
13596
+ recommendedFonts: {
13597
+ body: ["Inter", "Source Sans 3", "IBM Plex Sans"],
13598
+ heading: ["Inter", "Manrope", "Source Sans 3"]
13599
+ },
13600
+ slotPolicies: { body: bodyReadablePolicy, heading: headingFlexiblePolicy },
13601
+ typography: modernSansTypography
13602
+ }),
13603
+ defineTypographyPreset({
13604
+ id: "typography-preset:warm-rounded",
13605
+ name: "Warm Rounded",
13606
+ description: "Soft, friendly type for welcoming studios, classes, and community businesses.",
13607
+ defaultFonts: { body: "Nunito Sans, system-ui, sans-serif", heading: "Nunito Sans, system-ui, sans-serif" },
13608
+ recommendedFonts: {
13609
+ body: ["Nunito Sans", "Atkinson Hyperlegible", "Lato"],
13610
+ heading: ["Nunito Sans", "Quicksand", "Manrope"]
13611
+ },
13612
+ slotPolicies: { body: bodyReadablePolicy, heading: headingFlexiblePolicy },
13613
+ typography: warmRoundedTypography
13614
+ }),
13615
+ defineTypographyPreset({
13616
+ id: "typography-preset:editorial-serif",
13617
+ name: "Editorial Serif",
13618
+ description: "Story-led type with warm reading rhythm and expressive headings.",
13619
+ defaultFonts: { body: "Lora, Georgia, serif", heading: "Playfair Display, Georgia, serif" },
13620
+ recommendedFonts: {
13621
+ body: ["Lora", "Source Serif 4", "Libre Baskerville"],
13622
+ heading: ["Playfair Display", "Cormorant Garamond", "Fraunces"]
13623
+ },
13624
+ slotPolicies: { body: bodyReadablePolicy, heading: displayHeadingPolicy },
13625
+ typography: editorialSerifTypography
13626
+ }),
13627
+ defineTypographyPreset({
13628
+ id: "typography-preset:classic-serif",
13629
+ name: "Classic Serif",
13630
+ description: "Measured, polished type for premium and established offers.",
13631
+ defaultFonts: { body: "Libre Baskerville, Georgia, serif", heading: "Cormorant Garamond, Georgia, serif" },
13632
+ recommendedFonts: {
13633
+ body: ["Libre Baskerville", "Source Serif 4", "Lora"],
13634
+ heading: ["Cormorant Garamond", "Playfair Display", "Libre Baskerville"]
13635
+ },
13636
+ slotPolicies: { body: bodyReadablePolicy, heading: displayHeadingPolicy },
13637
+ typography: classicSerifTypography
13638
+ }),
13639
+ defineTypographyPreset({
13640
+ id: "typography-preset:luxe-contrast",
13641
+ name: "Luxe Contrast",
13642
+ description: "A restrained sans body paired with elegant high-contrast headings.",
13643
+ defaultFonts: { body: "Manrope, system-ui, sans-serif", heading: "Cormorant Garamond, Georgia, serif" },
13644
+ recommendedFonts: {
13645
+ body: ["Manrope", "Inter", "Source Sans 3"],
13646
+ heading: ["Cormorant Garamond", "Playfair Display", "Bodoni Moda"]
13647
+ },
13648
+ slotPolicies: { body: bodyReadablePolicy, heading: displayHeadingPolicy },
13649
+ typography: luxeContrastTypography
13650
+ }),
13651
+ defineTypographyPreset({
13652
+ id: "typography-preset:bold-display",
13653
+ name: "Bold Display",
13654
+ description: "Punchy display headings with readable sans body copy for branded launches.",
13655
+ defaultFonts: { body: "Manrope, system-ui, sans-serif", heading: '"TAN - PEARL", sans-serif' },
13656
+ recommendedFonts: {
13657
+ body: ["Manrope", "Inter", "Space Grotesk"],
13658
+ heading: ["Anton", "Bebas Neue", "Archivo Black"]
13659
+ },
13660
+ slotPolicies: { body: bodyReadablePolicy, heading: displayHeadingPolicy },
13661
+ typography: boldDisplayTypography,
13662
+ heroTypography: {
13663
+ headlineSize: "6xl",
13664
+ headlineLineHeight: "tight",
13665
+ subheadlineSize: "editorial",
13666
+ subheadlineLineHeight: "normal",
13667
+ microHeadlineSize: "6xl",
13668
+ microHeadlineLineHeight: "tight",
13669
+ microSubheadlineSize: "xl",
13670
+ microSubheadlineLineHeight: "normal",
13671
+ responsive: {
13672
+ tablet: { headlineSize: "5xl" },
13673
+ mobile: { headlineSize: "4xl", subheadlineSize: "xl" }
13674
+ }
13675
+ }
13676
+ })
13677
+ ];
13678
+ var typographyPresetsById = new Map(
13679
+ typographyPresets.map((preset2) => [preset2.id, preset2])
13680
+ );
13681
+
12664
13682
  // ../theme-core/src/site-styles/curatedSiteStyles.ts
12665
13683
  var curatedSiteStyleIdValues = [
12666
13684
  "site-style:calm-studio",
@@ -12673,6 +13691,7 @@ var curatedSiteStyleIdValues = [
12673
13691
  "site-style:personal-retreat-journal",
12674
13692
  "site-style:tactile-workshop",
12675
13693
  "site-style:modern-wellness",
13694
+ "site-style:soft-earth",
12676
13695
  "site-style:bold-launch",
12677
13696
  "site-style:south-west-twerk-school"
12678
13697
  ];
@@ -12738,26 +13757,45 @@ var expressiveUnderlineInputs = {
12738
13757
  }
12739
13758
  };
12740
13759
  function uniqueContentFrameKinds() {
12741
- const kinds = [...new Set(
12742
- generatedDesignOptionCatalog.contentFrames.map((frame) => frame.kind)
12743
- )];
13760
+ const kinds = [
13761
+ ...new Set(
13762
+ generatedDesignOptionCatalog.contentFrames.map((frame) => frame.kind)
13763
+ )
13764
+ ];
12744
13765
  const firstKind = kinds[0];
12745
13766
  if (!firstKind) {
12746
- throw new Error("Expected generated design option catalog to expose at least one content frame kind.");
13767
+ throw new Error(
13768
+ "Expected generated design option catalog to expose at least one content frame kind."
13769
+ );
12747
13770
  }
12748
13771
  return [firstKind, ...kinds.slice(1)];
12749
13772
  }
12750
13773
  var generatedContentFrameKinds = uniqueContentFrameKinds();
12751
13774
  function defineCuratedSiteStyle(input) {
13775
+ const legacyHeaderLookIds = input.recommendedHeaderLookIds ?? ["clean-base"];
13776
+ const inferredHeaderCuration = inferHeaderCurationFromLegacyLooks(legacyHeaderLookIds);
13777
+ const typographyPresetChoices = input.typographyPresetChoices ?? defaultTypographyPresetChoicesForRecipe(input.tokenRecipes.typography);
13778
+ const defaultTypographyPresetId = input.defaultTypographyPresetId ? asTypographyPresetId(input.defaultTypographyPresetId) : typographyPresetChoices[0].id;
13779
+ if (!typographyPresetChoices.some(
13780
+ (choice) => choice.id === defaultTypographyPresetId
13781
+ )) {
13782
+ throw new Error(
13783
+ `Default typography preset ${defaultTypographyPresetId} is not curated for site style ${input.id}.`
13784
+ );
13785
+ }
12752
13786
  return {
12753
13787
  id: asSiteStyleId(input.id),
12754
13788
  name: input.name,
12755
13789
  description: input.description,
12756
13790
  generationBrief: input.generationBrief,
12757
13791
  selectionKeywordRules: input.selectionKeywordRules ?? [],
12758
- siteCreatorSelection: input.siteCreatorSelection ?? { kind: "explicit_only" },
13792
+ siteCreatorSelection: input.siteCreatorSelection ?? {
13793
+ kind: "explicit_only"
13794
+ },
12759
13795
  template: {
12760
- id: asDesignSystemTemplateId(`template:${input.id.replace("site-style:", "")}`),
13796
+ id: asDesignSystemTemplateId(
13797
+ `template:${input.id.replace("site-style:", "")}`
13798
+ ),
12761
13799
  name: input.name,
12762
13800
  version: 1,
12763
13801
  tokenRecipes: input.tokenRecipes,
@@ -12769,11 +13807,27 @@ function defineCuratedSiteStyle(input) {
12769
13807
  },
12770
13808
  ...input.themeOverrides ? { themeOverrides: input.themeOverrides } : {},
12771
13809
  recommendedAppearancePresetIds: (input.recommendedAppearancePresetIds ?? []).map(asAppearancePresetId),
12772
- recommendedHeaderLookIds: (input.recommendedHeaderLookIds ?? ["clean-base"]).map(asHeaderLookId),
13810
+ defaultHeaderSelection: input.defaultHeaderSelection ? {
13811
+ layoutId: asHeaderLayoutId(input.defaultHeaderSelection.layoutId),
13812
+ styleId: asHeaderStyleId(input.defaultHeaderSelection.styleId)
13813
+ } : inferredHeaderCuration.defaultHeaderSelection,
13814
+ recommendedHeaderLayoutChoices: input.recommendedHeaderLayoutChoices ?? inferredHeaderCuration.recommendedHeaderLayoutChoices,
13815
+ recommendedHeaderStyleChoicesByLayout: input.recommendedHeaderStyleChoicesByLayout ?? inferredHeaderCuration.recommendedHeaderStyleChoicesByLayout,
13816
+ discouragedHeaderSelections: input.discouragedHeaderSelections?.map(
13817
+ (selection) => ({
13818
+ layoutId: asHeaderLayoutId(selection.layoutId),
13819
+ styleId: asHeaderStyleId(selection.styleId)
13820
+ })
13821
+ ),
13822
+ recommendedHeaderLookIds: legacyHeaderLookIds.map(asHeaderLookId),
12773
13823
  // Empty is intentional: resolveFooterLook always appends its guaranteed fallback.
12774
- recommendedFooterLookIds: (input.recommendedFooterLookIds ?? []).map(asFooterLookId),
13824
+ recommendedFooterLookIds: (input.recommendedFooterLookIds ?? []).map(
13825
+ asFooterLookId
13826
+ ),
12775
13827
  buttonPersonalityChoices: input.buttonPersonalityChoices,
12776
- paletteVariantChoices: input.paletteVariantChoices
13828
+ paletteVariantChoices: input.paletteVariantChoices,
13829
+ typographyPresetChoices,
13830
+ defaultTypographyPresetId
12777
13831
  };
12778
13832
  }
12779
13833
  function buttonChoice(id, note) {
@@ -12782,6 +13836,87 @@ function buttonChoice(id, note) {
12782
13836
  function paletteChoice(id, note) {
12783
13837
  return note ? { id: asPaletteVariantId(id), note } : { id: asPaletteVariantId(id) };
12784
13838
  }
13839
+ function headerLayoutChoice(id, note) {
13840
+ return note ? { id: asHeaderLayoutId(id), note } : { id: asHeaderLayoutId(id) };
13841
+ }
13842
+ function headerStyleChoice(id, note) {
13843
+ return note ? { id: asHeaderStyleId(id), note } : { id: asHeaderStyleId(id) };
13844
+ }
13845
+ function unbrandHeaderLayoutId(id) {
13846
+ return id;
13847
+ }
13848
+ function uniqueHeaderLayoutChoices(choices) {
13849
+ const seen = /* @__PURE__ */ new Set();
13850
+ const unique = choices.filter((choice) => {
13851
+ if (seen.has(choice.id)) return false;
13852
+ seen.add(choice.id);
13853
+ return true;
13854
+ });
13855
+ const first = unique[0];
13856
+ if (!first) {
13857
+ throw new Error("Expected at least one curated header layout choice.");
13858
+ }
13859
+ return [first, ...unique.slice(1)];
13860
+ }
13861
+ function nonEmptyHeaderStyleChoices(choices, fallbackLayoutId) {
13862
+ const first = choices[0] ?? {
13863
+ id: getCompatibleHeaderStyleIds(fallbackLayoutId)[0] ?? asHeaderStyleId("minimal")
13864
+ };
13865
+ return [first, ...choices.slice(1)];
13866
+ }
13867
+ function inferHeaderCurationFromLegacyLooks(lookIds) {
13868
+ const selections = lookIds.map((lookId) => resolveLegacyHeaderLookAlias(asHeaderLookId(lookId))).filter(
13869
+ (selection) => Boolean(selection)
13870
+ );
13871
+ const defaultHeaderSelection = selections[0] ?? {
13872
+ layoutId: asHeaderLayoutId("classic"),
13873
+ styleId: asHeaderStyleId("minimal")
13874
+ };
13875
+ const layoutChoices = uniqueHeaderLayoutChoices(
13876
+ selections.map((selection) => headerLayoutChoice(selection.layoutId))
13877
+ );
13878
+ const stylesByLayout = {};
13879
+ for (const layoutChoice of layoutChoices) {
13880
+ const styleChoices = selections.filter((selection) => selection.layoutId === layoutChoice.id).map((selection) => headerStyleChoice(selection.styleId));
13881
+ stylesByLayout[unbrandHeaderLayoutId(layoutChoice.id)] = nonEmptyHeaderStyleChoices(styleChoices, layoutChoice.id);
13882
+ }
13883
+ return {
13884
+ defaultHeaderSelection,
13885
+ recommendedHeaderLayoutChoices: layoutChoices,
13886
+ recommendedHeaderStyleChoicesByLayout: stylesByLayout
13887
+ };
13888
+ }
13889
+ function typographyChoice(id, note) {
13890
+ return note ? { id: asTypographyPresetId(id), note } : { id: asTypographyPresetId(id) };
13891
+ }
13892
+ function defaultTypographyPresetChoicesForRecipe(recipe) {
13893
+ switch (recipe) {
13894
+ case "clean-sans":
13895
+ return [
13896
+ typographyChoice("typography-preset:modern-sans"),
13897
+ typographyChoice("typography-preset:luxe-contrast"),
13898
+ typographyChoice("typography-preset:bold-display")
13899
+ ];
13900
+ case "friendly-sans":
13901
+ return [
13902
+ typographyChoice("typography-preset:warm-rounded"),
13903
+ typographyChoice("typography-preset:modern-sans"),
13904
+ typographyChoice("typography-preset:editorial-serif")
13905
+ ];
13906
+ case "serif-editorial":
13907
+ return [
13908
+ typographyChoice("typography-preset:editorial-serif"),
13909
+ typographyChoice("typography-preset:classic-serif"),
13910
+ typographyChoice("typography-preset:warm-rounded")
13911
+ ];
13912
+ case "classic-serif":
13913
+ return [
13914
+ typographyChoice("typography-preset:classic-serif"),
13915
+ typographyChoice("typography-preset:luxe-contrast"),
13916
+ typographyChoice("typography-preset:editorial-serif")
13917
+ ];
13918
+ }
13919
+ }
12785
13920
  var curatedSiteStyles = [
12786
13921
  defineCuratedSiteStyle({
12787
13922
  id: "site-style:calm-studio",
@@ -12798,7 +13933,11 @@ var curatedSiteStyles = [
12798
13933
  motion: "subtle"
12799
13934
  },
12800
13935
  compositionBudget: quietBudget,
12801
- recommendedHeaderLookIds: ["centered-calm", "minimal-transparent", "clean-base"],
13936
+ recommendedHeaderLookIds: [
13937
+ "centered-calm",
13938
+ "minimal-transparent",
13939
+ "clean-base"
13940
+ ],
12802
13941
  buttonPersonalityChoices: [
12803
13942
  buttonChoice("soft-pill"),
12804
13943
  buttonChoice("pebble"),
@@ -12827,7 +13966,11 @@ var curatedSiteStyles = [
12827
13966
  motion: "subtle"
12828
13967
  },
12829
13968
  compositionBudget: balancedBudget,
12830
- recommendedHeaderLookIds: ["practical-utility", "brand-solid", "clean-base"],
13969
+ recommendedHeaderLookIds: [
13970
+ "practical-utility",
13971
+ "brand-solid",
13972
+ "clean-base"
13973
+ ],
12831
13974
  buttonPersonalityChoices: [
12832
13975
  buttonChoice("confident-chip"),
12833
13976
  buttonChoice("soft-pill"),
@@ -12854,7 +13997,11 @@ var curatedSiteStyles = [
12854
13997
  motion: "subtle"
12855
13998
  },
12856
13999
  compositionBudget: balancedBudget,
12857
- recommendedHeaderLookIds: ["editorial-line", "minimal-transparent", "centered-calm"],
14000
+ recommendedHeaderLookIds: [
14001
+ "serif-line",
14002
+ "minimal-transparent",
14003
+ "centered-calm"
14004
+ ],
12858
14005
  buttonPersonalityChoices: [
12859
14006
  buttonChoice("editorial-link"),
12860
14007
  buttonChoice("soft-pill"),
@@ -12882,7 +14029,11 @@ var curatedSiteStyles = [
12882
14029
  motion: "expressive"
12883
14030
  },
12884
14031
  compositionBudget: balancedBudget,
12885
- recommendedHeaderLookIds: ["brand-solid", "practical-utility", "clean-base"],
14032
+ recommendedHeaderLookIds: [
14033
+ "brand-solid",
14034
+ "practical-utility",
14035
+ "clean-base"
14036
+ ],
12886
14037
  buttonPersonalityChoices: [
12887
14038
  buttonChoice("pebble"),
12888
14039
  buttonChoice("brushed-wash"),
@@ -12899,7 +14050,10 @@ var curatedSiteStyles = [
12899
14050
  name: "Quiet Luxury",
12900
14051
  description: "Minimal, confident, and refined for premium experiences and private services.",
12901
14052
  generationBrief: "Use fewer claims, more specificity, and restrained sensory detail. Favor elegant media and low repetition over dense panels.",
12902
- siteCreatorSelection: { kind: "site_creator_keyword_heuristic", priority: 20 },
14053
+ siteCreatorSelection: {
14054
+ kind: "site_creator_keyword_heuristic",
14055
+ priority: 20
14056
+ },
12903
14057
  selectionKeywordRules: [
12904
14058
  { kind: "word", value: "luxury" },
12905
14059
  { kind: "word", value: "premium" },
@@ -12917,7 +14071,11 @@ var curatedSiteStyles = [
12917
14071
  motion: "none"
12918
14072
  },
12919
14073
  compositionBudget: quietBudget,
12920
- recommendedHeaderLookIds: ["minimal-transparent", "editorial-line", "clean-base"],
14074
+ recommendedHeaderLookIds: [
14075
+ "minimal-transparent",
14076
+ "serif-line",
14077
+ "clean-base"
14078
+ ],
12921
14079
  buttonPersonalityChoices: [
12922
14080
  buttonChoice("editorial-link"),
12923
14081
  buttonChoice("confident-chip"),
@@ -12953,7 +14111,11 @@ var curatedSiteStyles = [
12953
14111
  motion: "none"
12954
14112
  },
12955
14113
  compositionBudget: quietBudget,
12956
- recommendedHeaderLookIds: ["practical-utility", "brand-solid", "clean-base"],
14114
+ recommendedHeaderLookIds: [
14115
+ "practical-utility",
14116
+ "brand-solid",
14117
+ "clean-base"
14118
+ ],
12957
14119
  buttonPersonalityChoices: [
12958
14120
  buttonChoice("confident-chip"),
12959
14121
  buttonChoice("pebble"),
@@ -12980,7 +14142,11 @@ var curatedSiteStyles = [
12980
14142
  motion: "subtle"
12981
14143
  },
12982
14144
  compositionBudget: balancedBudget,
12983
- recommendedHeaderLookIds: ["centered-calm", "minimal-transparent", "clean-base"],
14145
+ recommendedHeaderLookIds: [
14146
+ "centered-calm",
14147
+ "minimal-transparent",
14148
+ "clean-base"
14149
+ ],
12984
14150
  buttonPersonalityChoices: [
12985
14151
  buttonChoice("soft-pill"),
12986
14152
  buttonChoice("pebble"),
@@ -12997,7 +14163,10 @@ var curatedSiteStyles = [
12997
14163
  name: "Quiet Practice",
12998
14164
  description: "Grounded, calm, and practical for small appointment-first practices.",
12999
14165
  generationBrief: "Make services, practitioner trust, preparation notes, and booking routes easy to scan. Keep the tone warm and specific, with quiet confidence rather than spa cliches or medical claims.",
13000
- siteCreatorSelection: { kind: "site_creator_keyword_heuristic", priority: 30 },
14166
+ siteCreatorSelection: {
14167
+ kind: "site_creator_keyword_heuristic",
14168
+ priority: 30
14169
+ },
13001
14170
  selectionKeywordRules: [
13002
14171
  { kind: "substring", value: "massage" },
13003
14172
  { kind: "word", value: "bodywork" },
@@ -13018,7 +14187,11 @@ var curatedSiteStyles = [
13018
14187
  motion: "subtle"
13019
14188
  },
13020
14189
  compositionBudget: quietBudget,
13021
- recommendedHeaderLookIds: ["practical-utility", "clean-base", "centered-calm"],
14190
+ recommendedHeaderLookIds: [
14191
+ "practical-utility",
14192
+ "clean-base",
14193
+ "centered-calm"
14194
+ ],
13022
14195
  buttonPersonalityChoices: [
13023
14196
  buttonChoice("pebble"),
13024
14197
  buttonChoice("soft-pill"),
@@ -13035,7 +14208,10 @@ var curatedSiteStyles = [
13035
14208
  name: "Personal Retreat Journal",
13036
14209
  description: "Warm, story-led, and readable for solo practitioners with mixed offers.",
13037
14210
  generationBrief: "Center the practitioner as the guide, then make private sessions, classes, retreats, and resources feel like clear pathways. Keep retreat copy grounded and practical, with enough editorial warmth for longer reading.",
13038
- siteCreatorSelection: { kind: "site_creator_keyword_heuristic", priority: 40 },
14211
+ siteCreatorSelection: {
14212
+ kind: "site_creator_keyword_heuristic",
14213
+ priority: 40
14214
+ },
13039
14215
  selectionKeywordRules: [
13040
14216
  { kind: "substring", value: "retreat" },
13041
14217
  { kind: "phrase", value: "solo practitioner" },
@@ -13055,7 +14231,11 @@ var curatedSiteStyles = [
13055
14231
  motion: "subtle"
13056
14232
  },
13057
14233
  compositionBudget: balancedBudget,
13058
- recommendedHeaderLookIds: ["editorial-line", "centered-calm", "minimal-transparent"],
14234
+ recommendedHeaderLookIds: [
14235
+ "serif-line",
14236
+ "centered-calm",
14237
+ "minimal-transparent"
14238
+ ],
13059
14239
  buttonPersonalityChoices: [
13060
14240
  buttonChoice("editorial-link"),
13061
14241
  buttonChoice("soft-pill"),
@@ -13072,7 +14252,10 @@ var curatedSiteStyles = [
13072
14252
  name: "Tactile Workshop",
13073
14253
  description: "Bright, hands-on, and image-led for maker studios, workshops, and creative classes.",
13074
14254
  generationBrief: "Lead with objects, materials, studio process, and practical booking detail. Keep the tone warm and direct, with useful mess, clear dates, and enough gallery rhythm to feel like a real creative studio.",
13075
- siteCreatorSelection: { kind: "site_creator_keyword_heuristic", priority: 50 },
14255
+ siteCreatorSelection: {
14256
+ kind: "site_creator_keyword_heuristic",
14257
+ priority: 50
14258
+ },
13076
14259
  selectionKeywordRules: [
13077
14260
  { kind: "substring", value: "ceramic" },
13078
14261
  { kind: "word", value: "pottery" },
@@ -13092,8 +14275,15 @@ var curatedSiteStyles = [
13092
14275
  motion: "subtle"
13093
14276
  },
13094
14277
  compositionBudget: balancedBudget,
13095
- recommendedHeaderLookIds: ["brand-solid", "practical-utility", "clean-base"],
13096
- recommendedFooterLookIds: ["site-footer-brand-two-band", "footer-muted-grounding"],
14278
+ recommendedHeaderLookIds: [
14279
+ "brand-solid",
14280
+ "practical-utility",
14281
+ "clean-base"
14282
+ ],
14283
+ recommendedFooterLookIds: [
14284
+ "site-footer-brand-two-band",
14285
+ "footer-muted-grounding"
14286
+ ],
13097
14287
  buttonPersonalityChoices: [
13098
14288
  buttonChoice("pebble"),
13099
14289
  buttonChoice("confident-chip"),
@@ -13108,101 +14298,178 @@ var curatedSiteStyles = [
13108
14298
  ]
13109
14299
  }),
13110
14300
  defineCuratedSiteStyle({
13111
- id: "site-style:bold-launch",
13112
- name: "Bold Launch",
13113
- description: "High-energy and punchy for launches, campaigns, and creative offers.",
13114
- generationBrief: "Use crisp positioning, bold hero structure, strong calls to action, and confident visual rhythm. Keep it precise, not shouty.",
13115
- siteCreatorSelection: { kind: "site_creator_keyword_heuristic", priority: 10 },
13116
- selectionKeywordRules: [
13117
- { kind: "substring", value: "launch" },
13118
- { kind: "substring", value: "campaign" },
13119
- { kind: "word", value: "preorder" },
13120
- { kind: "phrase", value: "pre-order" },
13121
- { kind: "substring", value: "waitlist" },
13122
- { kind: "word", value: "drop" }
13123
- ],
13124
- tokenRecipes: {
13125
- palette: "high-contrast",
13126
- contrast: "maximum",
13127
- radius: "pill",
13128
- shadow: "layered",
13129
- typography: "clean-sans",
13130
- spacing: "regular",
13131
- motion: "expressive"
14301
+ id: "site-style:soft-earth",
14302
+ name: "Soft Earth",
14303
+ description: "Warm, grounded, and editorial for yoga studios, retreats, and wellbeing communities.",
14304
+ 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.",
14305
+ siteCreatorSelection: {
14306
+ kind: "site_creator_keyword_heuristic",
14307
+ priority: 45
13132
14308
  },
13133
- compositionBudget: expressiveBudget,
13134
- recommendedHeaderLookIds: ["transparent-overlay", "floating-glass", "brand-solid"],
13135
- buttonPersonalityChoices: [
13136
- buttonChoice("ink-stamp"),
13137
- buttonChoice("confident-chip"),
13138
- buttonChoice("brushed-wash"),
13139
- buttonChoice("pebble")
14309
+ selectionKeywordRules: [
14310
+ { kind: "word", value: "meditation" },
14311
+ { kind: "word", value: "wellbeing" },
14312
+ { kind: "substring", value: "retreat" },
14313
+ { kind: "phrase", value: "yoga studio" },
14314
+ { kind: "phrase", value: "mindful movement" }
13140
14315
  ],
13141
- paletteVariantChoices: [
13142
- paletteChoice("high-contrast-monochrome"),
13143
- paletteChoice("high-contrast-ink"),
13144
- paletteChoice("brand-led-jewel"),
13145
- paletteChoice("brand-led-warm")
13146
- ]
13147
- }),
13148
- defineCuratedSiteStyle({
13149
- id: "site-style:south-west-twerk-school",
13150
- name: "South West Twerk School",
13151
- description: "Energetic, editorial, and high-contrast for a branded dance school presence.",
13152
- generationBrief: "Use confident rhythm, bold burgundy-and-gold accents, large editorial intro copy, strong booking routes, and dark feature sections where proof or forms need emphasis.",
13153
14316
  tokenRecipes: {
13154
- palette: "brand-led",
13155
- contrast: "maximum",
14317
+ palette: "warm-neutral",
14318
+ contrast: "standard",
13156
14319
  radius: "soft",
13157
- shadow: "layered",
13158
- typography: "clean-sans",
14320
+ shadow: "subtle",
14321
+ typography: "serif-editorial",
13159
14322
  spacing: "airy",
13160
- motion: "expressive"
14323
+ motion: "subtle"
13161
14324
  },
13162
- compositionBudget: expressiveBudget,
14325
+ compositionBudget: balancedBudget,
13163
14326
  themeOverrides: {
13164
14327
  typography: {
13165
14328
  body: {
13166
- family: "Manrope, system-ui, sans-serif",
13167
- size: "lg",
14329
+ family: "Inter, system-ui, sans-serif",
14330
+ size: "md",
13168
14331
  weight: "regular",
13169
14332
  lineHeight: "relaxed",
13170
14333
  letterSpacing: "normal"
13171
14334
  },
13172
14335
  headings: {
13173
14336
  default: {
13174
- family: '"TAN - PEARL", sans-serif',
13175
- weight: "bold",
14337
+ family: '"Cormorant Garamond", Georgia, serif',
14338
+ weight: "regular",
13176
14339
  lineHeight: "normal",
13177
- letterSpacing: "tight",
13178
- colorToken: "primary",
14340
+ letterSpacing: "normal",
14341
+ colorToken: "text",
13179
14342
  italic: null,
13180
14343
  case: null
13181
14344
  },
13182
14345
  h1: {
13183
14346
  size: "xl",
13184
- weight: "bold",
14347
+ weight: "regular",
13185
14348
  lineHeight: "normal",
13186
- letterSpacing: "tight",
14349
+ letterSpacing: "normal",
13187
14350
  italic: null
13188
14351
  },
13189
14352
  h2: {
13190
14353
  size: "lg",
13191
- weight: "bold",
14354
+ weight: "regular",
13192
14355
  lineHeight: "normal",
13193
14356
  letterSpacing: "normal",
13194
14357
  italic: null
13195
14358
  },
13196
14359
  h3: {
13197
14360
  size: "md",
13198
- weight: "bold",
14361
+ weight: "regular",
13199
14362
  lineHeight: "normal",
13200
14363
  letterSpacing: "normal",
13201
14364
  italic: null
13202
14365
  }
13203
14366
  },
13204
- scale: "balanced"
14367
+ scale: "majorThird"
13205
14368
  },
14369
+ bodyText: {
14370
+ intro: {
14371
+ paragraphSize: "default",
14372
+ headingSize: "editorial"
14373
+ }
14374
+ }
14375
+ },
14376
+ recommendedAppearancePresetIds: [
14377
+ "hero-brand-scrim",
14378
+ "intro-soft-earth-statement",
14379
+ "feature-cards-soft-earth-offerings",
14380
+ "testimonials-soft-earth-proof-band",
14381
+ "faq-soft-earth-two-column",
14382
+ "contact-form-panel"
14383
+ ],
14384
+ recommendedHeaderLookIds: [
14385
+ "centered-calm",
14386
+ "minimal-transparent",
14387
+ "serif-line"
14388
+ ],
14389
+ recommendedFooterLookIds: [
14390
+ "footer-muted-grounding",
14391
+ "site-footer-brand-two-band"
14392
+ ],
14393
+ buttonPersonalityChoices: [
14394
+ buttonChoice("earth-pill"),
14395
+ buttonChoice("soft-pill"),
14396
+ buttonChoice("pebble"),
14397
+ buttonChoice("editorial-link")
14398
+ ],
14399
+ paletteVariantChoices: [
14400
+ paletteChoice("warm-neutral-soft-earth"),
14401
+ paletteChoice("warm-neutral-clay"),
14402
+ paletteChoice("warm-neutral-forest"),
14403
+ paletteChoice("soft-natural-sage")
14404
+ ]
14405
+ }),
14406
+ defineCuratedSiteStyle({
14407
+ id: "site-style:bold-launch",
14408
+ name: "Bold Launch",
14409
+ description: "High-energy and punchy for launches, campaigns, and creative offers.",
14410
+ generationBrief: "Use crisp positioning, bold hero structure, strong calls to action, and confident visual rhythm. Keep it precise, not shouty.",
14411
+ siteCreatorSelection: {
14412
+ kind: "site_creator_keyword_heuristic",
14413
+ priority: 10
14414
+ },
14415
+ selectionKeywordRules: [
14416
+ { kind: "substring", value: "launch" },
14417
+ { kind: "substring", value: "campaign" },
14418
+ { kind: "word", value: "preorder" },
14419
+ { kind: "phrase", value: "pre-order" },
14420
+ { kind: "substring", value: "waitlist" },
14421
+ { kind: "word", value: "drop" }
14422
+ ],
14423
+ tokenRecipes: {
14424
+ palette: "high-contrast",
14425
+ contrast: "maximum",
14426
+ radius: "pill",
14427
+ shadow: "layered",
14428
+ typography: "clean-sans",
14429
+ spacing: "regular",
14430
+ motion: "expressive"
14431
+ },
14432
+ compositionBudget: expressiveBudget,
14433
+ recommendedHeaderLookIds: [
14434
+ "transparent-overlay",
14435
+ "floating-glass",
14436
+ "brand-solid"
14437
+ ],
14438
+ buttonPersonalityChoices: [
14439
+ buttonChoice("ink-stamp"),
14440
+ buttonChoice("confident-chip"),
14441
+ buttonChoice("brushed-wash"),
14442
+ buttonChoice("pebble")
14443
+ ],
14444
+ paletteVariantChoices: [
14445
+ paletteChoice("high-contrast-monochrome"),
14446
+ paletteChoice("high-contrast-ink"),
14447
+ paletteChoice("brand-led-jewel"),
14448
+ paletteChoice("brand-led-warm")
14449
+ ]
14450
+ }),
14451
+ defineCuratedSiteStyle({
14452
+ id: "site-style:south-west-twerk-school",
14453
+ name: "South West Twerk School",
14454
+ description: "Energetic, editorial, and high-contrast for a branded dance school presence.",
14455
+ generationBrief: "Use confident rhythm, bold burgundy-and-gold accents, large editorial intro copy, strong booking routes, and dark feature sections where proof or forms need emphasis.",
14456
+ tokenRecipes: {
14457
+ palette: "brand-led",
14458
+ contrast: "maximum",
14459
+ radius: "soft",
14460
+ shadow: "layered",
14461
+ typography: "clean-sans",
14462
+ spacing: "airy",
14463
+ motion: "expressive"
14464
+ },
14465
+ compositionBudget: expressiveBudget,
14466
+ typographyPresetChoices: [
14467
+ typographyChoice("typography-preset:bold-display"),
14468
+ typographyChoice("typography-preset:modern-sans"),
14469
+ typographyChoice("typography-preset:luxe-contrast")
14470
+ ],
14471
+ defaultTypographyPresetId: "typography-preset:bold-display",
14472
+ themeOverrides: {
13206
14473
  bodyText: {
13207
14474
  intro: {
13208
14475
  paragraphSize: "editorial",
@@ -13218,8 +14485,15 @@ var curatedSiteStyles = [
13218
14485
  "testimonials-accent-quote-proof",
13219
14486
  "contact-form-brand-depth-card"
13220
14487
  ],
13221
- recommendedHeaderLookIds: ["brand-solid", "transparent-overlay", "practical-utility"],
13222
- recommendedFooterLookIds: ["site-footer-brand-two-band", "footer-muted-grounding"],
14488
+ recommendedHeaderLookIds: [
14489
+ "brand-solid",
14490
+ "transparent-overlay",
14491
+ "practical-utility"
14492
+ ],
14493
+ recommendedFooterLookIds: [
14494
+ "site-footer-brand-two-band",
14495
+ "footer-muted-grounding"
14496
+ ],
13223
14497
  buttonPersonalityChoices: [
13224
14498
  buttonChoice("showtime-pill"),
13225
14499
  buttonChoice("confident-chip"),
@@ -17545,8 +18819,9 @@ var faqAccordionFragment = defineFragment({
17545
18819
  },
17546
18820
  fallback: "rb-faq-item"
17547
18821
  },
17548
- iconStyle: { $bind: { from: "theme.accordions.icon.style" } }
17549
- // Pass icon style from theme
18822
+ iconStyle: { $bind: { from: "theme.accordions.icon.style" } },
18823
+ // Legacy theme accordion style
18824
+ iconTreatment: { $bind: { from: "content._sectionStyles.accordionIconTreatment" } }
17550
18825
  },
17551
18826
  triggerFrom: "faqItem.question",
17552
18827
  contentFrom: "faqItem.answer"
@@ -18624,61 +19899,389 @@ function splitLayoutWith(children) {
18624
19899
  children
18625
19900
  }
18626
19901
  }),
18627
- // The split variants render the image as a real grid column, so suppress
18628
- // the default absolute background image layer while keeping color/overlay.
18629
- renderBackgroundImage: false,
18630
- baseClass: ""
18631
- });
18632
- }
18633
- var splitContentColumn = heroContentWrapper(heroContentNodes, "md", "rb-w-full rb-text-left");
18634
- var splitImageColumn = heroSplitImagePane();
18635
- var splitLayout = splitLayoutWith([
18636
- splitContentColumn,
18637
- splitImageColumn
18638
- ]);
18639
- var splitReverseLayout = splitLayoutWith([
18640
- splitImageColumn,
18641
- splitContentColumn
18642
- ]);
18643
- var heroConfig = {
18644
- id: "block.hero",
18645
- title: "Hero",
18646
- titleSource: "headline",
18647
- category: "layout",
18648
- includeContainerStyles: true,
18649
- promotedFields: ["_sectionStyles.background.image"],
18650
- fragments: [
18651
- { fragment: heroCopyFragment, fieldPriority: 0 },
18652
- { fragment: heroLayoutControlsFragment, fieldPriority: 1 },
18653
- { fragment: heroCtaRowFragment, fieldPriority: 2 }
18654
- ],
18655
- additionalFields: [
18656
- containerStylesField({
18657
- id: "_contentCardStyles",
18658
- label: "Content card",
18659
- renderInHeader: true,
18660
- intent: "style"
19902
+ // The split variants render the image as a real grid column, so suppress
19903
+ // the default absolute background image layer while keeping color/overlay.
19904
+ renderBackgroundImage: false,
19905
+ baseClass: ""
19906
+ });
19907
+ }
19908
+ var splitContentColumn = heroContentWrapper(heroContentNodes, "md", "rb-w-full rb-text-left");
19909
+ var splitImageColumn = heroSplitImagePane();
19910
+ var splitLayout = splitLayoutWith([
19911
+ splitContentColumn,
19912
+ splitImageColumn
19913
+ ]);
19914
+ var splitReverseLayout = splitLayoutWith([
19915
+ splitImageColumn,
19916
+ splitContentColumn
19917
+ ]);
19918
+ var heroConfig = {
19919
+ id: "block.hero",
19920
+ title: "Hero",
19921
+ titleSource: "headline",
19922
+ category: "layout",
19923
+ includeContainerStyles: true,
19924
+ promotedFields: ["_sectionStyles.background.image"],
19925
+ fragments: [
19926
+ { fragment: heroCopyFragment, fieldPriority: 0 },
19927
+ { fragment: heroLayoutControlsFragment, fieldPriority: 1 },
19928
+ { fragment: heroCtaRowFragment, fieldPriority: 2 }
19929
+ ],
19930
+ additionalFields: [
19931
+ containerStylesField({
19932
+ id: "_contentCardStyles",
19933
+ label: "Content card",
19934
+ renderInHeader: true,
19935
+ intent: "style"
19936
+ })
19937
+ ],
19938
+ layout: classicLayout,
19939
+ variants: {
19940
+ classic: classicLayout,
19941
+ micro: microLayout,
19942
+ split: splitLayout,
19943
+ splitReverse: splitReverseLayout
19944
+ },
19945
+ defaultVariant: "classic",
19946
+ description: "Hero section with headline, subtitle, and repeatable CTAs.",
19947
+ tags: ["header", "banner", "landing", "introduction", "welcome", "splash", "headline"],
19948
+ icon: "Sparkles",
19949
+ styleTokens: {
19950
+ typography: "display",
19951
+ spacing: "xl"
19952
+ }
19953
+ };
19954
+ var heroManifest = createBlockManifest(heroConfig);
19955
+ var heroBlockDefinition = {
19956
+ manifest: heroManifest
19957
+ };
19958
+
19959
+ // ../blocks/src/system/fields/aspectRatio.ts
19960
+ var standardAspectRatioOptions = [
19961
+ { value: "auto", label: "Auto (original)" },
19962
+ { value: "16/9", label: "16:9 (Landscape)" },
19963
+ { value: "4/3", label: "4:3 (Standard)" },
19964
+ { value: "1/1", label: "1:1 (Square)" },
19965
+ { value: "3/4", label: "3:4 (Portrait)" }
19966
+ ];
19967
+ function createAspectRatioField(options = {}) {
19968
+ return {
19969
+ id: options.id ?? "aspectRatio",
19970
+ type: "select",
19971
+ label: options.label ?? "Aspect ratio",
19972
+ ...options.description ? { description: options.description } : {},
19973
+ required: false,
19974
+ defaultValue: options.defaultValue ?? "auto",
19975
+ multiple: false,
19976
+ options: [...standardAspectRatioOptions],
19977
+ ui: {
19978
+ intent: options.uiIntent ?? "display",
19979
+ ...options.visibleWhen ? { visibleWhen: options.visibleWhen } : {}
19980
+ }
19981
+ };
19982
+ }
19983
+
19984
+ // ../blocks/src/system/fields/imageLayout.ts
19985
+ function createImageColSizeField(options = {}) {
19986
+ const {
19987
+ id = "imageColSize",
19988
+ label = "Image column size",
19989
+ description = "Controls how large the image/thumbnail column is at desktop breakpoints.",
19990
+ defaultValue = "1/3",
19991
+ uiIntent = "display",
19992
+ visibleWhen
19993
+ } = options;
19994
+ return {
19995
+ id,
19996
+ type: "select",
19997
+ label,
19998
+ description,
19999
+ required: false,
20000
+ defaultValue,
20001
+ multiple: false,
20002
+ options: [
20003
+ { value: "1/4", label: "Small (1/4)" },
20004
+ { value: "1/3", label: "Medium (1/3)" },
20005
+ { value: "2/5", label: "Large (2/5)" },
20006
+ { value: "1/2", label: "Extra large (1/2)" },
20007
+ { value: "2/3", label: "Huge (2/3)" }
20008
+ ],
20009
+ ui: {
20010
+ intent: uiIntent,
20011
+ ...visibleWhen ? { visibleWhen } : {}
20012
+ }
20013
+ };
20014
+ }
20015
+ function createImagePositionField(options = {}) {
20016
+ const {
20017
+ id = "imagePosition",
20018
+ label = "Image position",
20019
+ description = "Choose which side the image appears on.",
20020
+ defaultValue = "left",
20021
+ includeAlternate = false,
20022
+ uiIntent = "display",
20023
+ visibleWhen
20024
+ } = options;
20025
+ const positionOptions = [
20026
+ { value: "left", label: "Left" },
20027
+ { value: "right", label: "Right" },
20028
+ ...includeAlternate ? [{ value: "alternate", label: "Alternate" }] : []
20029
+ ];
20030
+ return {
20031
+ id,
20032
+ type: "select",
20033
+ label,
20034
+ description,
20035
+ required: false,
20036
+ defaultValue,
20037
+ multiple: false,
20038
+ // Spread to get a mutable array type without unsafe casts.
20039
+ options: [...positionOptions],
20040
+ ui: {
20041
+ intent: uiIntent,
20042
+ ...visibleWhen ? { visibleWhen } : {}
20043
+ }
20044
+ };
20045
+ }
20046
+
20047
+ // ../blocks/src/system/blocks/intro.ts
20048
+ function introHeading(className) {
20049
+ return text(
20050
+ {
20051
+ as: "h2",
20052
+ className
20053
+ },
20054
+ when("content.title"),
20055
+ bind("content.title")
20056
+ );
20057
+ }
20058
+ function introBody(className = "rb-prose rb-max-w-none") {
20059
+ return richText({ className }, bind("content.body"));
20060
+ }
20061
+ function introCtas(justify = "start") {
20062
+ return ctaRow({
20063
+ justify,
20064
+ gap: "md",
20065
+ containerClassName: "rb-mt-2"
20066
+ });
20067
+ }
20068
+ function introCopyStack(options = {}) {
20069
+ return stack(
20070
+ {
20071
+ gap: "md",
20072
+ className: options.className ?? "rb-intro-copy"
20073
+ },
20074
+ [
20075
+ introHeading(options.headingClassName ?? "rb-intro-title"),
20076
+ introBody(options.bodyClassName),
20077
+ introCtas(options.ctaJustify)
20078
+ ]
20079
+ );
20080
+ }
20081
+ var introMedia = media(
20082
+ {
20083
+ className: "rb-intro-media rb-w-full rb-h-auto rb-object-cover",
20084
+ style: {
20085
+ aspectRatio: { $bind: { from: "content.aspectRatio" } }
20086
+ }
20087
+ },
20088
+ bind("content.media")
20089
+ );
20090
+ var centeredCopyLayout = styledSection({
20091
+ children: styledContainer({
20092
+ rootType: "stack",
20093
+ rootProps: { gap: "lg" },
20094
+ children: [
20095
+ introCopyStack({
20096
+ className: "rb-intro-copy rb-mx-auto rb-max-w-3xl rb-text-center",
20097
+ headingClassName: "rb-intro-title rb-text-center",
20098
+ bodyClassName: "rb-prose rb-mx-auto rb-max-w-none",
20099
+ ctaJustify: "center"
20100
+ })
20101
+ ]
20102
+ }),
20103
+ baseClass: "",
20104
+ spacing: "medium"
20105
+ });
20106
+ var statementCopyLayout = styledSection({
20107
+ children: styledContainer({
20108
+ children: [
20109
+ el(
20110
+ "div",
20111
+ {
20112
+ className: "rb-intro rb-intro-statement rb-grid rb-grid-cols-1 rb-gap-8 rb-md-grid-cols-2 rb-md-items-start"
20113
+ },
20114
+ [
20115
+ introHeading("rb-intro-title rb-max-w-xl"),
20116
+ stack({ gap: "md", className: "rb-intro-copy rb-max-w-xl" }, [
20117
+ introBody(),
20118
+ introCtas("start")
20119
+ ])
20120
+ ]
20121
+ )
20122
+ ]
20123
+ }),
20124
+ baseClass: "",
20125
+ spacing: "medium"
20126
+ });
20127
+ var statementMediaLayout = styledSection({
20128
+ children: styledContainer({
20129
+ children: [
20130
+ el(
20131
+ "div",
20132
+ {
20133
+ 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"
20134
+ },
20135
+ [
20136
+ introHeading("rb-intro-title rb-max-w-xl"),
20137
+ stack({ gap: "md", className: "rb-intro-copy rb-max-w-xl" }, [
20138
+ introBody(),
20139
+ introCtas("start")
20140
+ ]),
20141
+ el("div", { className: "rb-intro-media-wrap rb-w-full" }, [introMedia], when("content.media"))
20142
+ ]
20143
+ )
20144
+ ]
20145
+ }),
20146
+ baseClass: "",
20147
+ spacing: "medium"
20148
+ });
20149
+ var mediaCopyLayout = styledSection({
20150
+ children: styledContainer({
20151
+ children: [
20152
+ responsiveTwoColumn({
20153
+ image: el("div", { className: "rb-intro-media-wrap rb-w-full" }, [introMedia]),
20154
+ text: introCopyStack({
20155
+ className: "rb-intro-copy rb-max-w-xl",
20156
+ headingClassName: "rb-intro-title"
20157
+ }),
20158
+ ratioFrom: "content.ratio",
20159
+ imagePositionFrom: "content.imagePosition",
20160
+ gapFrom: "content.gap",
20161
+ gapFallback: "comfortable",
20162
+ imageWrapperClassName: "rb-w-full rb-shrink-0",
20163
+ textWrapperClassName: "rb-w-full rb-min-w-0 rb-flex-1 rb-self-center"
20164
+ })
20165
+ ]
20166
+ }),
20167
+ baseClass: "",
20168
+ spacing: "medium"
20169
+ });
20170
+ var introConfig = {
20171
+ id: "block.intro",
20172
+ title: "Intro",
20173
+ category: "layout",
20174
+ includeContainerStyles: true,
20175
+ titleSource: "title",
20176
+ additionalFields: [
20177
+ {
20178
+ id: "title",
20179
+ type: "text",
20180
+ label: "Statement",
20181
+ required: false,
20182
+ multiline: true,
20183
+ maxLength: 160
20184
+ },
20185
+ {
20186
+ id: "body",
20187
+ type: "richText",
20188
+ label: "Text",
20189
+ required: true,
20190
+ ui: {
20191
+ richTextVariant: "limited"
20192
+ }
20193
+ },
20194
+ {
20195
+ id: "media",
20196
+ type: "media",
20197
+ label: "Media",
20198
+ required: false,
20199
+ mediaKinds: ["image"],
20200
+ ui: {
20201
+ intent: "content",
20202
+ visibleWhen: { field: "variant", notEquals: "statement-copy" }
20203
+ }
20204
+ },
20205
+ createImagePositionField({
20206
+ id: "imagePosition",
20207
+ label: "Image position",
20208
+ defaultValue: "left",
20209
+ uiIntent: "display",
20210
+ visibleWhen: { field: "variant", equals: "media-copy" }
20211
+ }),
20212
+ {
20213
+ id: "gap",
20214
+ type: "select",
20215
+ label: "Gap between media and text",
20216
+ required: false,
20217
+ defaultValue: "comfortable",
20218
+ multiple: false,
20219
+ options: [
20220
+ { value: "none", label: "None" },
20221
+ { value: "compact", label: "Compact" },
20222
+ { value: "cozy", label: "Cozy" },
20223
+ { value: "medium", label: "Medium" },
20224
+ { value: "comfortable", label: "Comfortable" },
20225
+ { value: "spacious", label: "Spacious" }
20226
+ ],
20227
+ ui: {
20228
+ intent: "display",
20229
+ visibleWhen: { field: "variant", equals: "media-copy" }
20230
+ }
20231
+ },
20232
+ createImageColSizeField({
20233
+ id: "ratio",
20234
+ label: "Media column size",
20235
+ defaultValue: "1/2",
20236
+ uiIntent: "display",
20237
+ visibleWhen: { field: "variant", equals: "media-copy" }
20238
+ }),
20239
+ createAspectRatioField({
20240
+ id: "aspectRatio",
20241
+ label: "Media aspect ratio",
20242
+ description: "Crop media to a consistent aspect ratio.",
20243
+ defaultValue: "auto",
20244
+ visibleWhen: { field: "media", notEquals: null }
20245
+ }),
20246
+ createCtasRepeater({
20247
+ label: "Calls to action",
20248
+ itemLabel: "CTA",
20249
+ maxItems: 2
18661
20250
  })
18662
20251
  ],
18663
- layout: classicLayout,
20252
+ layout: centeredCopyLayout,
18664
20253
  variants: {
18665
- classic: classicLayout,
18666
- micro: microLayout,
18667
- split: splitLayout,
18668
- splitReverse: splitReverseLayout
20254
+ "centered-copy": centeredCopyLayout,
20255
+ "statement-copy": statementCopyLayout,
20256
+ "statement-media": statementMediaLayout,
20257
+ "media-copy": mediaCopyLayout
18669
20258
  },
18670
- defaultVariant: "classic",
18671
- description: "Hero section with headline, subtitle, and repeatable CTAs.",
18672
- tags: ["header", "banner", "landing", "introduction", "welcome", "splash", "headline"],
18673
- icon: "Sparkles",
18674
- styleTokens: {
18675
- typography: "display",
18676
- spacing: "xl"
18677
- }
20259
+ defaultVariant: "statement-copy",
20260
+ variantOptions: {
20261
+ "centered-copy": {
20262
+ label: "Centered copy",
20263
+ description: "A focused intro with centered text and optional calls to action."
20264
+ },
20265
+ "statement-copy": {
20266
+ label: "Statement and copy",
20267
+ description: "A large statement on the left with supporting copy on the right."
20268
+ },
20269
+ "statement-media": {
20270
+ label: "Statement, copy and media",
20271
+ description: "A three-part intro with statement, copy and a small image."
20272
+ },
20273
+ "media-copy": {
20274
+ label: "Media and copy",
20275
+ description: "A compact media/text intro for softer transitions after a hero."
20276
+ }
20277
+ },
20278
+ description: "A flexible introductory section for statement copy, supporting text, media, and CTAs.",
20279
+ tags: ["intro", "introduction", "about", "welcome", "statement", "media", "text"],
20280
+ icon: "PanelTopOpen"
18678
20281
  };
18679
- var heroManifest = createBlockManifest(heroConfig);
18680
- var heroBlockDefinition = {
18681
- manifest: heroManifest
20282
+ var introManifest = createBlockManifest(introConfig);
20283
+ var introBlockDefinition = {
20284
+ manifest: introManifest
18682
20285
  };
18683
20286
 
18684
20287
  // ../blocks/src/system/blocks/body-text.ts
@@ -19524,6 +21127,37 @@ var faqComposition = composeFragments([
19524
21127
  { fragment: faqHeadingFragment, fieldPriority: 0 },
19525
21128
  { fragment: faqAccordionFragment, fieldPriority: 1 }
19526
21129
  ]);
21130
+ function fragmentLayoutNode(layout) {
21131
+ return isNodeDefinitionArray(layout) ? el("div", {}, [...layout]) : layout;
21132
+ }
21133
+ function isNodeDefinitionArray(layout) {
21134
+ return Array.isArray(layout);
21135
+ }
21136
+ var headingLayout = fragmentLayoutNode(faqHeadingFragment.layout);
21137
+ var accordionLayout = fragmentLayoutNode(faqAccordionFragment.layout);
21138
+ var defaultLayout = styledSection({
21139
+ children: styledContainer({
21140
+ baseClassName: "rb-relative rb-isolate",
21141
+ children: stack({ gap: "xl", className: "rb-w-full rb-max-w-4xl rb-mx-auto" }, faqComposition.layout)
21142
+ }),
21143
+ baseClass: ""
21144
+ });
21145
+ var twoColumnLayout = styledSection({
21146
+ children: styledContainer({
21147
+ baseClassName: "rb-relative rb-isolate",
21148
+ children: el(
21149
+ "div",
21150
+ {
21151
+ className: "rb-faq-two-column rb-grid rb-grid-cols-1 rb-gap-8 rb-lg-grid-cols-2 rb-lg-items-start"
21152
+ },
21153
+ [
21154
+ el("div", { className: "rb-faq-two-column-heading" }, [headingLayout]),
21155
+ el("div", { className: "rb-faq-two-column-accordion" }, [accordionLayout])
21156
+ ]
21157
+ )
21158
+ }),
21159
+ baseClass: ""
21160
+ });
19527
21161
  var faqManifest = createBlockManifest({
19528
21162
  id: "block.faq",
19529
21163
  title: "FAQ",
@@ -19540,13 +21174,22 @@ var faqManifest = createBlockManifest({
19540
21174
  label: "FAQ item styles"
19541
21175
  })
19542
21176
  ],
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
- }),
21177
+ layout: defaultLayout,
21178
+ variants: {
21179
+ default: defaultLayout,
21180
+ "two-column": twoColumnLayout
21181
+ },
21182
+ defaultVariant: "default",
21183
+ variantOptions: {
21184
+ default: {
21185
+ label: "Default",
21186
+ description: "A centered heading above one FAQ accordion."
21187
+ },
21188
+ "two-column": {
21189
+ label: "Two column",
21190
+ description: "A left heading column with FAQ items on the right."
21191
+ }
21192
+ },
19550
21193
  description: "Accordion of frequently asked questions and answers.",
19551
21194
  tags: ["faq", "questions", "answers", "help", "support", "accordion", "q&a"],
19552
21195
  icon: "HelpCircle"
@@ -20196,7 +21839,8 @@ function resolveBackgroundVisualStyles(backgroundColor, tokens, defaultToken = "
20196
21839
  function resolveHeaderVisualStyles(header, tokens) {
20197
21840
  const navContainerType = header?.navContainer?.type ?? "none";
20198
21841
  const hasContainedNav = navContainerType === "glass" || navContainerType === "pill";
20199
- if (hasContainedNav) {
21842
+ const hasTransparentVariant = header?.variant === "transparent" || header?.variant === "floating";
21843
+ if (hasContainedNav || hasTransparentVariant) {
20200
21844
  return {
20201
21845
  backgroundToken: "transparent",
20202
21846
  paletteHex: null,
@@ -20254,10 +21898,7 @@ var headerRootClassTransform = {
20254
21898
  const navContainerType = header?.navContainer?.type ?? "none";
20255
21899
  const hasContainedNav = navContainerType === "glass" || navContainerType === "pill";
20256
21900
  const backgroundClass = visuals.isTransparent || hasContainedNav ? "rb-bg-transparent" : null;
20257
- const classes = [
20258
- config.base,
20259
- backgroundClass
20260
- ];
21901
+ const classes = [config.base, backgroundClass];
20261
21902
  if (!hasContainedNav) {
20262
21903
  if (config.blur) classes.push(config.blur);
20263
21904
  if (config.blurSupport) classes.push(config.blurSupport);
@@ -20272,7 +21913,12 @@ var headerRootClassTransform = {
20272
21913
  if (shrinkOnScroll && (positioning === "sticky" || positioning === "fixed")) {
20273
21914
  classes.push(config.shrink);
20274
21915
  }
20275
- const VALID_VARIANTS = ["classic", "centered", "transparent", "floating", "editorial"];
21916
+ const VALID_VARIANTS = [
21917
+ "classic",
21918
+ "centered",
21919
+ "transparent",
21920
+ "floating"
21921
+ ];
20276
21922
  const variant = header?.variant;
20277
21923
  if (variant && VALID_VARIANTS.includes(variant)) {
20278
21924
  classes.push(`header-variant-${variant}`);
@@ -20325,6 +21971,17 @@ var headerRootStyleTransform = {
20325
21971
  return mergeStyles(...styleParts);
20326
21972
  }
20327
21973
  };
21974
+ var headerSectionBackgroundTransform = {
21975
+ id: "layout.headerSectionBackground",
21976
+ kind: "string",
21977
+ summary: "Resolve the inner site-header section background token",
21978
+ run: (value) => {
21979
+ const header = asPartialObject(value);
21980
+ const navContainerType = header?.navContainer?.type ?? "none";
21981
+ const usesTransparentRoot = header?.variant === "transparent" || header?.variant === "floating" || navContainerType === "glass" || navContainerType === "pill";
21982
+ return usesTransparentRoot ? "raw:transparent" : "background";
21983
+ }
21984
+ };
20328
21985
  var footerRootStyleTransform = {
20329
21986
  id: "layout.footerRootStyle",
20330
21987
  kind: "formatter",
@@ -20583,6 +22240,7 @@ var layoutTransforms = [
20583
22240
  headerRootClassTransform,
20584
22241
  footerRootClassTransform,
20585
22242
  headerRootStyleTransform,
22243
+ headerSectionBackgroundTransform,
20586
22244
  footerRootStyleTransform,
20587
22245
  footerBottomBarClassTransform,
20588
22246
  footerBottomBarContainerClassTransform,
@@ -20881,15 +22539,21 @@ var mobileCta = ctaButton({
20881
22539
  var mobileToggleIcon = stack({ gap: "xs", className: "nav-mobile-icon" }, [
20882
22540
  {
20883
22541
  type: "div",
20884
- props: { className: "nav-mobile-bar nav-mobile-bar-top rb-h-0.5 rb-w-5 rb-rounded-full rb-bg-current" }
22542
+ props: {
22543
+ className: "nav-mobile-bar nav-mobile-bar-top rb-h-0.5 rb-w-5 rb-rounded-full rb-bg-current"
22544
+ }
20885
22545
  },
20886
22546
  {
20887
22547
  type: "div",
20888
- props: { className: "nav-mobile-bar nav-mobile-bar-middle rb-h-0.5 rb-w-5 rb-rounded-full rb-bg-current" }
22548
+ props: {
22549
+ className: "nav-mobile-bar nav-mobile-bar-middle rb-h-0.5 rb-w-5 rb-rounded-full rb-bg-current"
22550
+ }
20889
22551
  },
20890
22552
  {
20891
22553
  type: "div",
20892
- props: { className: "nav-mobile-bar nav-mobile-bar-bottom rb-h-0.5 rb-w-5 rb-rounded-full rb-bg-current" }
22554
+ props: {
22555
+ className: "nav-mobile-bar nav-mobile-bar-bottom rb-h-0.5 rb-w-5 rb-rounded-full rb-bg-current"
22556
+ }
20893
22557
  }
20894
22558
  ]);
20895
22559
  var mobileToggleButton = {
@@ -21072,31 +22736,12 @@ var floatingLayout = inline(
21072
22736
  ],
21073
22737
  when("$root.theme.header.variant", { equals: "floating" })
21074
22738
  );
21075
- var editorialLayout = stack(
21076
- {
21077
- gap: "md",
21078
- align: "center",
21079
- className: bindProp("$root.theme.header.maxWidth", {
21080
- transforms: pipe(
21081
- tx("layout.maxWidthClass", {
21082
- base: `rb-header-layout ${desktopOnlyDisplay("flex")} rb-w-full rb-flex-col rb-items-center rb-gap-6 rb-text-center`
21083
- })
21084
- ),
21085
- fallback: `rb-container rb-header-layout ${desktopOnlyDisplay("flex")} rb-w-full rb-flex-col rb-items-center rb-gap-6 rb-text-center`
21086
- })
21087
- },
21088
- [
21089
- centeredLogoRow,
21090
- createNavRow(
21091
- `${desktopOnlyDisplay("flex")} rb-flex-wrap rb-justify-center rb-gap-x-8 rb-gap-y-3`,
21092
- "center"
21093
- )
21094
- ],
21095
- when("$root.theme.header.variant", { equals: "editorial" })
21096
- );
21097
22739
  var headerLayout = headerSection(
21098
22740
  {
21099
- background: "background",
22741
+ background: bindProp("$root.theme.header", {
22742
+ transforms: pipe(tx("layout.headerSectionBackground")),
22743
+ fallback: "background"
22744
+ }),
21100
22745
  allowOverflow: true,
21101
22746
  className: bindProp("$root.theme.header", {
21102
22747
  transforms: pipe(tx("layout.headerRootClass")),
@@ -21104,10 +22749,7 @@ var headerLayout = headerSection(
21104
22749
  }),
21105
22750
  style: bindProp("$root.theme.header", {
21106
22751
  transforms: pipe(tx("layout.headerRootStyle")),
21107
- fallback: mergeStyles(
21108
- textColorStyle("text"),
21109
- borderColorStyle("border")
21110
- )
22752
+ fallback: mergeStyles(textColorStyle("text"), borderColorStyle("border"))
21111
22753
  })
21112
22754
  },
21113
22755
  [
@@ -21116,7 +22758,6 @@ var headerLayout = headerSection(
21116
22758
  centeredLayout,
21117
22759
  transparentLayout,
21118
22760
  floatingLayout,
21119
- editorialLayout,
21120
22761
  mobileOverlay
21121
22762
  ],
21122
22763
  props({
@@ -21931,79 +23572,298 @@ var collectionLayout = styledSection({
21931
23572
  { gap: "md" }
21932
23573
  ),
21933
23574
  baseClass: "",
21934
- spacing: "comfortable"
23575
+ spacing: "comfortable"
23576
+ });
23577
+ var collectionManifest = createBlockManifest({
23578
+ id: "block.collection",
23579
+ title: "Collection",
23580
+ category: "layout",
23581
+ additionalFields: [
23582
+ parseFieldDefinition({
23583
+ id: "layout",
23584
+ type: "select",
23585
+ label: "Layout",
23586
+ defaultValue: "grid",
23587
+ options: [
23588
+ { value: "grid", label: "Grid" },
23589
+ { value: "stack", label: "Stack" }
23590
+ ],
23591
+ ui: { intent: "display" }
23592
+ }),
23593
+ parseFieldDefinition({
23594
+ id: "columns",
23595
+ type: "select",
23596
+ label: "Columns",
23597
+ description: "Number of columns in the grid layout.",
23598
+ defaultValue: "3",
23599
+ options: [
23600
+ { value: "2", label: "2 columns" },
23601
+ { value: "3", label: "3 columns" },
23602
+ { value: "4", label: "4 columns" }
23603
+ ],
23604
+ ui: {
23605
+ intent: "display",
23606
+ visibleWhen: { field: "layout", equals: "grid" }
23607
+ }
23608
+ }),
23609
+ parseFieldDefinition({
23610
+ id: "gap",
23611
+ type: "select",
23612
+ label: "Gap",
23613
+ defaultValue: "medium",
23614
+ options: [
23615
+ { value: "none", label: "None" },
23616
+ { value: "compact", label: "Compact" },
23617
+ { value: "cozy", label: "Cozy" },
23618
+ { value: "medium", label: "Medium" },
23619
+ { value: "comfortable", label: "Comfortable" },
23620
+ { value: "spacious", label: "Spacious" }
23621
+ ],
23622
+ ui: { intent: "display" }
23623
+ }),
23624
+ fragmentsToRepeaterField(
23625
+ "items",
23626
+ "Items",
23627
+ collectionFragments,
23628
+ {
23629
+ minItems: 0,
23630
+ maxItems: 50,
23631
+ itemLabel: "Item",
23632
+ description: "Add items to this collection."
23633
+ }
23634
+ ),
23635
+ cardStylesField({
23636
+ id: "_cardStyles",
23637
+ label: "Item styles"
23638
+ })
23639
+ ],
23640
+ layout: collectionLayout,
23641
+ description: "Repeat items in a grid or stack layout.",
23642
+ tags: ["collection", "grid", "stack", "repeater"],
23643
+ icon: "LayoutList",
23644
+ styleTokens: { spacing: "lg" }
23645
+ });
23646
+ var collectionBlockDefinition = {
23647
+ manifest: collectionManifest
23648
+ };
23649
+
23650
+ // ../blocks/src/system/blocks/feature-cards.ts
23651
+ function grid3(props2, children) {
23652
+ return el("grid", props2 ?? void 0, children ?? void 0);
23653
+ }
23654
+ var sectionHeading = stack(
23655
+ { gap: "sm", className: "rb-feature-cards-heading rb-mx-auto rb-max-w-3xl rb-text-center" },
23656
+ [
23657
+ text(
23658
+ {
23659
+ as: "h2",
23660
+ className: "rb-feature-cards-title rb-text-center"
23661
+ },
23662
+ when("content.title"),
23663
+ bind("content.title")
23664
+ ),
23665
+ richText(
23666
+ {
23667
+ className: "rb-feature-cards-description rb-prose rb-mx-auto rb-max-w-none",
23668
+ style: textColorStyle("mutedText")
23669
+ },
23670
+ when("content.description"),
23671
+ bind("content.description")
23672
+ )
23673
+ ]
23674
+ );
23675
+ var featureCard = styledCard(
23676
+ [
23677
+ media(
23678
+ {
23679
+ className: "rb-feature-card-media rb-w-full rb-h-auto rb-object-cover",
23680
+ style: {
23681
+ aspectRatio: { $bind: { from: "card.aspectRatio" } }
23682
+ }
23683
+ },
23684
+ when("card.media"),
23685
+ bind("card.media")
23686
+ ),
23687
+ stack({ gap: "sm", className: "rb-feature-card-content rb-flex-1 rb-p-6" }, [
23688
+ text(
23689
+ {
23690
+ as: "h3",
23691
+ className: "rb-feature-card-title"
23692
+ },
23693
+ bind("card.title")
23694
+ ),
23695
+ richText(
23696
+ {
23697
+ className: "rb-feature-card-body rb-prose rb-max-w-none",
23698
+ style: textColorStyle("mutedText")
23699
+ },
23700
+ when("card.body"),
23701
+ bind("card.body")
23702
+ ),
23703
+ ctaRow({
23704
+ collectionPath: "ctas",
23705
+ itemName: "cta",
23706
+ gap: "sm",
23707
+ justify: "start",
23708
+ containerClassName: "rb-mt-auto"
23709
+ })
23710
+ ])
23711
+ ],
23712
+ {
23713
+ stylesFrom: "content._cardStyles",
23714
+ backgroundFrom: "content._cardStyles.background",
23715
+ baseClassName: "rb-feature-card rb-relative rb-isolate rb-overflow-hidden rb-border rb-flex rb-h-full rb-flex-col"
23716
+ },
23717
+ repeat("content.cards", "card")
23718
+ );
23719
+ var cardsLayout = styledSection({
23720
+ children: styledContainer({
23721
+ rootType: "stack",
23722
+ rootProps: { gap: "xl" },
23723
+ children: [
23724
+ sectionHeading,
23725
+ grid3(
23726
+ {
23727
+ cols: {
23728
+ $bind: {
23729
+ from: "content.columns",
23730
+ fallback: 3,
23731
+ coerce: "number"
23732
+ }
23733
+ },
23734
+ gap: "lg"
23735
+ },
23736
+ [featureCard]
23737
+ )
23738
+ ]
23739
+ }),
23740
+ baseClass: "",
23741
+ spacing: "medium"
21935
23742
  });
21936
- var collectionManifest = createBlockManifest({
21937
- id: "block.collection",
21938
- title: "Collection",
23743
+ var featureCardsConfig = {
23744
+ id: "block.feature-cards",
23745
+ title: "Feature Cards",
21939
23746
  category: "layout",
23747
+ includeContainerStyles: true,
23748
+ titleSource: "title",
21940
23749
  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({
23750
+ {
23751
+ id: "title",
23752
+ type: "text",
23753
+ label: "Title",
23754
+ required: false,
23755
+ multiline: false,
23756
+ maxLength: 120
23757
+ },
23758
+ {
23759
+ id: "description",
23760
+ type: "richText",
23761
+ label: "Description",
23762
+ required: false,
23763
+ ui: {
23764
+ richTextVariant: "limited"
23765
+ }
23766
+ },
23767
+ {
21953
23768
  id: "columns",
21954
23769
  type: "select",
21955
23770
  label: "Columns",
21956
- description: "Number of columns in the grid layout.",
23771
+ required: false,
21957
23772
  defaultValue: "3",
23773
+ multiple: false,
21958
23774
  options: [
21959
23775
  { value: "2", label: "2 columns" },
21960
23776
  { value: "3", label: "3 columns" },
21961
23777
  { value: "4", label: "4 columns" }
21962
23778
  ],
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
23779
  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."
23780
+ },
23781
+ {
23782
+ id: "cards",
23783
+ type: "repeater",
23784
+ label: "Cards",
23785
+ required: false,
23786
+ minItems: 1,
23787
+ maxItems: 8,
23788
+ itemLabel: "Card",
23789
+ itemLabelSource: "title",
23790
+ allowConversion: true,
23791
+ ui: {
23792
+ intent: "content"
23793
+ },
23794
+ schema: {
23795
+ fields: [
23796
+ {
23797
+ id: "media",
23798
+ type: "media",
23799
+ label: "Image",
23800
+ required: false,
23801
+ mediaKinds: ["image"]
23802
+ },
23803
+ createAspectRatioField({
23804
+ id: "aspectRatio",
23805
+ label: "Image aspect ratio",
23806
+ defaultValue: "4/3",
23807
+ visibleWhen: { field: "media", notEquals: null }
23808
+ }),
23809
+ {
23810
+ id: "title",
23811
+ type: "text",
23812
+ label: "Title",
23813
+ required: true,
23814
+ multiline: false,
23815
+ maxLength: 120
23816
+ },
23817
+ {
23818
+ id: "body",
23819
+ type: "richText",
23820
+ label: "Text",
23821
+ required: false,
23822
+ ui: {
23823
+ richTextVariant: "limited"
23824
+ }
23825
+ },
23826
+ createCtasRepeater({
23827
+ label: "Calls to action",
23828
+ itemLabel: "CTA",
23829
+ maxItems: 1,
23830
+ button: {
23831
+ variants: [
23832
+ { value: "primary", label: "Primary" },
23833
+ { value: "secondary", label: "Secondary" },
23834
+ { value: "outline", label: "Outline" },
23835
+ { value: "ghost", label: "Ghost" },
23836
+ { value: "link", label: "Link" }
23837
+ ],
23838
+ defaultVariant: "ghost"
23839
+ }
23840
+ })
23841
+ ]
21992
23842
  }
21993
- ),
23843
+ },
21994
23844
  cardStylesField({
21995
23845
  id: "_cardStyles",
21996
- label: "Item styles"
23846
+ label: "Card styles"
21997
23847
  })
21998
23848
  ],
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
23849
+ layout: cardsLayout,
23850
+ variants: {
23851
+ cards: cardsLayout
23852
+ },
23853
+ defaultVariant: "cards",
23854
+ variantOptions: {
23855
+ cards: {
23856
+ label: "Cards",
23857
+ description: "A responsive grid of image cards with optional calls to action."
23858
+ }
23859
+ },
23860
+ description: "A card grid for offerings, services, classes, benefits, or featured links.",
23861
+ tags: ["cards", "features", "offerings", "services", "classes", "grid", "links"],
23862
+ icon: "PanelsTopLeft"
23863
+ };
23864
+ var featureCardsManifest = createBlockManifest(featureCardsConfig);
23865
+ var featureCardsBlockDefinition = {
23866
+ manifest: featureCardsManifest
22007
23867
  };
22008
23868
 
22009
23869
  // ../blocks/src/system/fields/carousel.ts
@@ -22091,69 +23951,6 @@ function createCarouselBehaviorFields(options = {}) {
22091
23951
  return fields3;
22092
23952
  }
22093
23953
 
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
23954
  // ../blocks/src/system/blocks/media-text.ts
22158
23955
  var mediaTextFrameCapability = defineFrameCapability([
22159
23956
  "plain",
@@ -22277,26 +24074,13 @@ var mediaTextManifest = createBlockManifest({
22277
24074
  },
22278
24075
  ui: { intent: "behavior" }
22279
24076
  }),
22280
- {
24077
+ createAspectRatioField({
22281
24078
  id: "aspectRatio",
22282
- type: "select",
22283
24079
  label: "Media aspect ratio",
22284
24080
  description: "Crop media to a consistent aspect ratio.",
22285
- required: false,
22286
24081
  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
- },
24082
+ visibleWhen: { field: "images", notEquals: null }
24083
+ }),
22300
24084
  {
22301
24085
  id: "text",
22302
24086
  type: "richText",
@@ -22426,7 +24210,7 @@ var mediaTextManifest = createBlockManifest({
22426
24210
  whenImagesLength(0)
22427
24211
  );
22428
24212
  const defaultInner = el("div", {}, [defaultImagesLayout, defaultTextOnlyLayout]);
22429
- const defaultLayout = styledSection({
24213
+ const defaultLayout2 = styledSection({
22430
24214
  children: styledContainer({
22431
24215
  rootType: "stack",
22432
24216
  rootProps: { gap: "lg" },
@@ -22458,9 +24242,9 @@ var mediaTextManifest = createBlockManifest({
22458
24242
  spacing: "medium"
22459
24243
  });
22460
24244
  return {
22461
- layout: defaultLayout,
24245
+ layout: defaultLayout2,
22462
24246
  variants: {
22463
- default: defaultLayout
24247
+ default: defaultLayout2
22464
24248
  },
22465
24249
  defaultVariant: "default",
22466
24250
  variantOptions: {
@@ -25860,7 +27644,7 @@ var embedBlockDefinition = {
25860
27644
  };
25861
27645
 
25862
27646
  // ../blocks/src/system/blocks/image-gallery.ts
25863
- var grid3 = (props2, children, ...mods) => el("grid", props2 ?? void 0, children ?? void 0, ...mods);
27647
+ var grid4 = (props2, children, ...mods) => el("grid", props2 ?? void 0, children ?? void 0, ...mods);
25864
27648
  var galleryContainer = (children, opts) => {
25865
27649
  const gap = opts?.gap ?? "md";
25866
27650
  const withExtraClass = (baseClass) => opts?.className ? `${baseClass} ${opts.className}` : baseClass;
@@ -25940,7 +27724,7 @@ var galleryItem = (options) => stack(
25940
27724
  ],
25941
27725
  repeat("content.images", "item")
25942
27726
  );
25943
- var gridLayout3 = grid3(
27727
+ var gridLayout3 = grid4(
25944
27728
  {
25945
27729
  className: "rb-grid rb-grid-cols-1 rb-gap-4 rb-sm-grid-cols-2 rb-md-grid-cols-3"
25946
27730
  },
@@ -26543,7 +28327,7 @@ var imageGalleryBlockDefinition = {
26543
28327
  };
26544
28328
 
26545
28329
  // ../blocks/src/system/blocks/video-grid.ts
26546
- var grid4 = (props2, children, ...mods) => el("grid", props2 ?? void 0, children ?? void 0, ...mods);
28330
+ var grid5 = (props2, children, ...mods) => el("grid", props2 ?? void 0, children ?? void 0, ...mods);
26547
28331
  var videoItem = (options) => stack(
26548
28332
  { gap: "xs", className: options.containerClassName },
26549
28333
  [
@@ -26593,7 +28377,7 @@ var gridColumnsClass = (columns) => {
26593
28377
  return "rb-grid rb-grid-cols-1 rb-gap-6 rb-sm-grid-cols-2 rb-md-grid-cols-3";
26594
28378
  }
26595
28379
  };
26596
- var createGridLayout = (columns) => grid4(
28380
+ var createGridLayout = (columns) => grid5(
26597
28381
  {
26598
28382
  className: gridColumnsClass(columns)
26599
28383
  },
@@ -29757,6 +31541,40 @@ var systemBlockDefinitionsRaw = [
29757
31541
  })
29758
31542
  ]
29759
31543
  })),
31544
+ withDesignCapability("block.intro", introBlockDefinition, declareBlockDesignCapability({
31545
+ sectionSurfaces: "supported",
31546
+ contentFrames: ["plain", "panel"],
31547
+ itemSurfaces: "unsupported",
31548
+ headingDecorations: ["organic-squiggle"]
31549
+ }), defineBlockDesignMetadata({
31550
+ flow: bodyFlow,
31551
+ layoutProfiles: [
31552
+ layoutProfile({
31553
+ variantKey: "centered-copy",
31554
+ family: "centered",
31555
+ weight: "featured",
31556
+ bias: "soft"
31557
+ }),
31558
+ layoutProfile({
31559
+ variantKey: "statement-copy",
31560
+ family: "split",
31561
+ weight: "featured",
31562
+ bias: "merge"
31563
+ }),
31564
+ layoutProfile({
31565
+ variantKey: "statement-media",
31566
+ family: "media-text",
31567
+ weight: "featured",
31568
+ bias: "soft"
31569
+ }),
31570
+ layoutProfile({
31571
+ variantKey: "media-copy",
31572
+ family: "media-text",
31573
+ weight: "featured",
31574
+ bias: "soft"
31575
+ })
31576
+ ]
31577
+ })),
29760
31578
  withDesignCapability("block.body-text", bodyTextBlockDefinition, sectionOnly(), defineBlockDesignMetadata({
29761
31579
  flow: bodyFlow,
29762
31580
  layoutProfiles: [
@@ -29817,9 +31635,17 @@ var systemBlockDefinitionsRaw = [
29817
31635
  flow: conversionFlow,
29818
31636
  layoutProfiles: [layoutProfile({ variantKey: "default", family: "form", weight: "standard" })]
29819
31637
  })),
29820
- withDesignCapability("block.faq", faqBlockDefinition, withEyebrowCapability(panelAndItemsCapable(), standardEyebrowTreatments), defineBlockDesignMetadata({
31638
+ withDesignCapability("block.faq", faqBlockDefinition, withEyebrowCapability(declareBlockDesignCapability({
31639
+ sectionSurfaces: "supported",
31640
+ contentFrames: ["plain", "panel"],
31641
+ itemSurfaces: "supported",
31642
+ accordionIconSets: ["plus", "chevron", "caret", "minimal-cross"]
31643
+ }), standardEyebrowTreatments), defineBlockDesignMetadata({
29821
31644
  flow: bodyFlow,
29822
- layoutProfiles: [layoutProfile({ variantKey: "default", family: "stack", weight: "standard" })]
31645
+ layoutProfiles: [
31646
+ layoutProfile({ variantKey: "default", family: "stack", weight: "standard" }),
31647
+ layoutProfile({ variantKey: "two-column", family: "split", weight: "standard" })
31648
+ ]
29823
31649
  })),
29824
31650
  withDesignCapability("block.site-header", siteHeaderBlockDefinition, declareNoBlockDesignCapability("site-chrome"), defineBlockDesignMetadata({
29825
31651
  flow: siteChromeFlow,
@@ -29833,7 +31659,8 @@ var systemBlockDefinitionsRaw = [
29833
31659
  sectionSurfaces: "supported",
29834
31660
  contentFrames: ["plain", "panel"],
29835
31661
  itemSurfaces: "supported",
29836
- testimonialCardTreatments: ["default", "accent-quote"]
31662
+ testimonialCardTreatments: ["default", "accent-quote"],
31663
+ headingDecorations: ["short-center-rule"]
29837
31664
  }), defineBlockDesignMetadata({
29838
31665
  flow: proofFlow,
29839
31666
  layoutProfiles: [
@@ -29859,6 +31686,22 @@ var systemBlockDefinitionsRaw = [
29859
31686
  flow: offeringsFlow,
29860
31687
  layoutProfiles: [layoutProfile({ variantKey: "default", family: "grid", weight: "standard" })]
29861
31688
  })),
31689
+ withDesignCapability("block.feature-cards", featureCardsBlockDefinition, declareBlockDesignCapability({
31690
+ sectionSurfaces: "supported",
31691
+ contentFrames: ["plain", "panel"],
31692
+ itemSurfaces: "supported",
31693
+ headingDecorations: ["short-center-rule"]
31694
+ }), defineBlockDesignMetadata({
31695
+ flow: offeringsFlow,
31696
+ layoutProfiles: [
31697
+ layoutProfile({
31698
+ variantKey: "cards",
31699
+ family: "grid",
31700
+ weight: "standard",
31701
+ bias: "soft"
31702
+ })
31703
+ ]
31704
+ })),
29862
31705
  withDesignCapability("block.media-text", mediaTextBlockDefinition, mediaPanelCapable(), defineBlockDesignMetadata({
29863
31706
  flow: mediaFlow,
29864
31707
  layoutProfiles: [