@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
@@ -7197,6 +7197,7 @@ var init_validation_constants = __esm({
7197
7197
  "layout.headerRootClass",
7198
7198
  "layout.footerRootClass",
7199
7199
  "layout.headerRootStyle",
7200
+ "layout.headerSectionBackground",
7200
7201
  "layout.footerRootStyle",
7201
7202
  // UI (ui.ts)
7202
7203
  "ui.headerNavLinkClass",
@@ -8252,10 +8253,12 @@ function defineBlockDesignCapability(capability) {
8252
8253
  imageSurfaceMotions: capability.imageSurfaceMotions ?? ["static"],
8253
8254
  testimonialCardTreatments: capability.testimonialCardTreatments ?? ["default"],
8254
8255
  tileTreatments: capability.tileTreatments ?? ["default"],
8255
- eyebrowTreatments: capability.eyebrowTreatments ?? ["plain"]
8256
+ eyebrowTreatments: capability.eyebrowTreatments ?? ["plain"],
8257
+ ...capability.headingDecorations ? { headingDecorations: capability.headingDecorations } : {},
8258
+ ...capability.accordionIconSets ? { accordionIconSets: capability.accordionIconSets } : {}
8256
8259
  };
8257
8260
  }
8258
- var plainFrame, tileTreatmentValues, eyebrowTreatmentValues;
8261
+ var plainFrame, tileTreatmentValues, eyebrowTreatmentValues, visibleHeadingDecorationFamilyValues, visibleHeadingDecorationPlacementValues, headingDecorationOverrideValues, headingDecorationColorTokenValues, accordionIconSetValues, accordionIconColorTokenValues, accordionIconMotionValues;
8259
8262
  var init_types2 = __esm({
8260
8263
  "../theme-core/src/site-styles/types.ts"() {
8261
8264
  "use strict";
@@ -8274,6 +8277,47 @@ var init_types2 = __esm({
8274
8277
  "pill-bounce",
8275
8278
  "accent-pill-bounce"
8276
8279
  ];
8280
+ visibleHeadingDecorationFamilyValues = [
8281
+ "organic-squiggle",
8282
+ "short-center-rule"
8283
+ ];
8284
+ visibleHeadingDecorationPlacementValues = [
8285
+ "after-heading",
8286
+ "between-heading-and-body",
8287
+ "under-centered-heading"
8288
+ ];
8289
+ headingDecorationOverrideValues = [
8290
+ "site-default",
8291
+ "on",
8292
+ "off"
8293
+ ];
8294
+ headingDecorationColorTokenValues = [
8295
+ "text",
8296
+ "primary",
8297
+ "secondary",
8298
+ "accent",
8299
+ "border",
8300
+ "muted"
8301
+ ];
8302
+ accordionIconSetValues = [
8303
+ "plus",
8304
+ "chevron",
8305
+ "caret",
8306
+ "minimal-cross"
8307
+ ];
8308
+ accordionIconColorTokenValues = [
8309
+ "text",
8310
+ "muted",
8311
+ "primary",
8312
+ "secondary",
8313
+ "accent",
8314
+ "current"
8315
+ ];
8316
+ accordionIconMotionValues = [
8317
+ "none",
8318
+ "rotate",
8319
+ "swap"
8320
+ ];
8277
8321
  }
8278
8322
  });
8279
8323
 
@@ -8470,6 +8514,25 @@ var init_blockAppearancePresets = __esm({
8470
8514
  emphasis: "high"
8471
8515
  }
8472
8516
  }),
8517
+ defineBlockAppearancePreset({
8518
+ kind: "block-design",
8519
+ id: "intro-soft-earth-statement",
8520
+ target: "intro",
8521
+ label: "Soft Earth intro statement",
8522
+ blockKinds: ["block.intro"],
8523
+ design: {
8524
+ sectionSurface: "base",
8525
+ contentFrame: plainFrame,
8526
+ itemSurface: "none",
8527
+ transitionAfter: "soft-fade-short",
8528
+ emphasis: "high",
8529
+ headingDecoration: {
8530
+ family: "organic-squiggle",
8531
+ placement: "after-heading",
8532
+ colorToken: "primary"
8533
+ }
8534
+ }
8535
+ }),
8473
8536
  defineBlockAppearancePreset({
8474
8537
  kind: "block-design",
8475
8538
  id: "offerings-calm-list",
@@ -8484,6 +8547,25 @@ var init_blockAppearancePresets = __esm({
8484
8547
  emphasis: "medium"
8485
8548
  }
8486
8549
  }),
8550
+ defineBlockAppearancePreset({
8551
+ kind: "block-design",
8552
+ id: "feature-cards-soft-earth-offerings",
8553
+ target: "feature-cards",
8554
+ label: "Soft Earth offering cards",
8555
+ blockKinds: ["block.feature-cards"],
8556
+ design: {
8557
+ sectionSurface: "base",
8558
+ contentFrame: plainFrame,
8559
+ itemSurface: "raised",
8560
+ transitionAfter: "none",
8561
+ emphasis: "high",
8562
+ headingDecoration: {
8563
+ family: "short-center-rule",
8564
+ placement: "under-centered-heading",
8565
+ colorToken: "primary"
8566
+ }
8567
+ }
8568
+ }),
8487
8569
  defineBlockAppearancePreset({
8488
8570
  kind: "block-design",
8489
8571
  id: "events-base-calendar",
@@ -8612,6 +8694,26 @@ var init_blockAppearancePresets = __esm({
8612
8694
  testimonialCardTreatment: "accent-quote"
8613
8695
  }
8614
8696
  }),
8697
+ defineBlockAppearancePreset({
8698
+ kind: "block-design",
8699
+ id: "testimonials-soft-earth-proof-band",
8700
+ target: "testimonials",
8701
+ label: "Soft Earth proof band",
8702
+ blockKinds: ["block.testimonials"],
8703
+ design: {
8704
+ sectionSurface: "brand-depth-band",
8705
+ contentFrame: plainFrame,
8706
+ itemSurface: "none",
8707
+ transitionAfter: "soft-fade-short",
8708
+ emphasis: "high",
8709
+ testimonialCardTreatment: "accent-quote",
8710
+ headingDecoration: {
8711
+ family: "short-center-rule",
8712
+ placement: "under-centered-heading",
8713
+ colorToken: "border"
8714
+ }
8715
+ }
8716
+ }),
8615
8717
  defineBlockAppearancePreset({
8616
8718
  kind: "block-design",
8617
8719
  id: "faq-base-accordion",
@@ -8640,6 +8742,25 @@ var init_blockAppearancePresets = __esm({
8640
8742
  emphasis: "low"
8641
8743
  }
8642
8744
  }),
8745
+ defineBlockAppearancePreset({
8746
+ kind: "block-design",
8747
+ id: "faq-soft-earth-two-column",
8748
+ target: "faq",
8749
+ label: "Soft Earth two-column FAQ",
8750
+ blockKinds: ["block.faq"],
8751
+ design: {
8752
+ sectionSurface: "base",
8753
+ contentFrame: plainFrame,
8754
+ itemSurface: "flat",
8755
+ transitionAfter: "none",
8756
+ emphasis: "medium",
8757
+ accordionIconTreatment: {
8758
+ iconSet: "plus",
8759
+ colorToken: "primary",
8760
+ motion: "swap"
8761
+ }
8762
+ }
8763
+ }),
8643
8764
  defineBlockAppearancePreset({
8644
8765
  kind: "block-design",
8645
8766
  id: "contact-form-panel",
@@ -9445,6 +9566,104 @@ var init_confident_chip = __esm({
9445
9566
  }
9446
9567
  });
9447
9568
 
9569
+ // ../theme-core/src/buttons/personalities/earth-pill.ts
9570
+ var earthPill;
9571
+ var init_earth_pill = __esm({
9572
+ "../theme-core/src/buttons/personalities/earth-pill.ts"() {
9573
+ "use strict";
9574
+ init_types4();
9575
+ earthPill = defineButtonPersonality({
9576
+ id: "earth-pill",
9577
+ name: "Earth Pill",
9578
+ description: "Compact terracotta pills with quiet primary-coloured ghost CTAs.",
9579
+ tags: { tone: "classic", energy: "calm", motion: "subtle", era: "organic" },
9580
+ buttonSystem: {
9581
+ global: {
9582
+ cornerStyle: "pill",
9583
+ shadow: "low",
9584
+ textTransform: "none",
9585
+ fontWeight: 500,
9586
+ borderWidth: 1,
9587
+ hoverTransform: "lift",
9588
+ hoverColor: "none",
9589
+ typography: "body",
9590
+ paddingPreset: "default"
9591
+ },
9592
+ sizes: {
9593
+ sm: { padding: "0.5rem 1rem", fontSize: "text-sm" },
9594
+ md: { padding: "0.625rem 1.35rem" },
9595
+ lg: { padding: "0.75rem 1.65rem", fontSize: "text-lg" },
9596
+ xl: { padding: "0.875rem 2rem", fontSize: "text-xl" }
9597
+ },
9598
+ variants: [
9599
+ {
9600
+ id: "primary",
9601
+ name: "Primary",
9602
+ enabled: true,
9603
+ priority: 1,
9604
+ background: { type: "solid", colorToken: "primary" },
9605
+ textColorToken: "primaryForeground",
9606
+ borderRadius: "rounded-full",
9607
+ shadow: { elevation: "low", softness: "soft", position: "bottom" },
9608
+ effects: {
9609
+ hover: [
9610
+ { effectId: "lift", options: { translateY: "-1px" } },
9611
+ { effectId: "background-on-hover", options: { colorToken: "accent" } }
9612
+ ],
9613
+ active: [{ effectId: "scale-down", options: { scale: "0.98" } }]
9614
+ }
9615
+ },
9616
+ {
9617
+ id: "secondary",
9618
+ name: "Secondary",
9619
+ enabled: true,
9620
+ priority: 2,
9621
+ background: { type: "transparent" },
9622
+ textColorToken: "primary",
9623
+ borderRadius: "rounded-full",
9624
+ border: { widthClass: "border", colorToken: "primary" },
9625
+ effects: {
9626
+ hover: [{ effectId: "background-on-hover", options: { colorToken: "muted" } }]
9627
+ }
9628
+ },
9629
+ {
9630
+ id: "outline",
9631
+ name: "Outline",
9632
+ enabled: true,
9633
+ priority: 3,
9634
+ background: { type: "transparent" },
9635
+ textColorToken: "text",
9636
+ borderRadius: "rounded-full",
9637
+ border: { widthClass: "border", colorToken: "border" },
9638
+ effects: {
9639
+ hover: [{ effectId: "background-on-hover", options: { colorToken: "surfaceAlt" } }]
9640
+ }
9641
+ },
9642
+ {
9643
+ id: "ghost",
9644
+ name: "Ghost",
9645
+ enabled: true,
9646
+ priority: 3,
9647
+ background: { type: "transparent" },
9648
+ textColorToken: "primary",
9649
+ borderRadius: "rounded-full",
9650
+ shadow: { elevation: "none", softness: null, position: "bottom" },
9651
+ sizes: {
9652
+ sm: { padding: "0.25rem 0", fontSize: "text-sm" },
9653
+ md: { padding: "0.375rem 0" },
9654
+ lg: { padding: "0.5rem 0", fontSize: "text-lg" },
9655
+ xl: { padding: "0.625rem 0", fontSize: "text-xl" }
9656
+ },
9657
+ effects: {
9658
+ hover: [{ effectId: "opacity-reduce", options: { reduction: 25 } }]
9659
+ }
9660
+ }
9661
+ ]
9662
+ }
9663
+ });
9664
+ }
9665
+ });
9666
+
9448
9667
  // ../theme-core/src/buttons/personalities/editorial-link.ts
9449
9668
  var editorialLink;
9450
9669
  var init_editorial_link = __esm({
@@ -9942,6 +10161,7 @@ var init_personalities = __esm({
9942
10161
  "use strict";
9943
10162
  init_brushed_wash();
9944
10163
  init_confident_chip();
10164
+ init_earth_pill();
9945
10165
  init_editorial_link();
9946
10166
  init_ink_stamp();
9947
10167
  init_pebble();
@@ -9950,6 +10170,7 @@ var init_personalities = __esm({
9950
10170
  init_types4();
9951
10171
  buttonPersonalities = [
9952
10172
  softPill,
10173
+ earthPill,
9953
10174
  confidentChip,
9954
10175
  editorialLink,
9955
10176
  pebble,
@@ -10867,7 +11088,7 @@ var init_tokenOrColor = __esm({
10867
11088
 
10868
11089
  // ../theme-core/src/schema.ts
10869
11090
  import { z as z24 } from "zod";
10870
- var axesSchema, colourHexString, paletteColorSchema, paletteMetaSchema, paletteSchema, typographyStyleSchema, bodyTypographyStyleSchema, headingSizeSchema, headingTypographyOverridesSchema, headingTypographyStyleSchema, proseLinkUnderlineStyleSchema, proseLinkUnderlineThicknessSchema, proseLinkUnderlineOffsetSchema, proseLinkStyleSchema, semanticSpacingSchema, boxRoundedSchema, boxBackgroundOverlaySchema, boxBackgroundSchema, sectionStylesOverrideSchema, containerStylesOverrideSchema, cardBorderOverrideSchema, cardStylesOverrideSchema, blockStyleOverridesSchema, blockThemeOverrideSchema, typographyScaleSchema, typographySchema, spaceSchema, corners, shadow, border, motion, buttonStyle, cardStyle, inputStyle, headerVariant, headerPositioning, headerNavStyle, navFontWeight, headerMaxWidth, headerContainerSchema, headerBorderSchema, logoStyleSchema, headerLogoTextSchema, navEffectsSchema, dropdownStyleSchema, headerCtaGapSchema, headerCtaTreatmentSchema, navContainerSchema, headerBackgroundSchema, headerSchema, footerVariant, footerMaxWidth, footerMode, footerNavLayoutMode, footerNavLayoutAlign, footerSpacing, footerLogoPlacement, footerLogoSize, footerLogoMaxHeight, footerBottomTextLinkStyleSchema, footerBottomBarSchema, footerNavLayoutSchema, footerLogoSchema, footerSchema, containerPaddingPresetSchema, layoutSchema, heroTypographySizeSchema, heroTypographyLineHeightSchema, heroResponsiveTypographySchema, heroTypographySchema, heroSchema, bodyTextIntroTypographySizeSchema, bodyTextSchema, gradientsSchema, themeSchema, themesTurnSchema;
11091
+ var axesSchema, colourHexString, paletteColorSchema, paletteMetaSchema, paletteSchema, typographyStyleSchema, bodyTypographyStyleSchema, headingSizeSchema, headingTypographyOverridesSchema, headingTypographyStyleSchema, proseLinkUnderlineStyleSchema, proseLinkUnderlineThicknessSchema, proseLinkUnderlineOffsetSchema, proseLinkStyleSchema, semanticSpacingSchema, boxRoundedSchema, boxBackgroundOverlaySchema, boxBackgroundSchema, noHeadingDecorationSchema, visibleHeadingDecorationSchema, headingDecorationSchema, accordionIconTreatmentSchema, sectionStylesOverrideSchema, containerStylesOverrideSchema, cardBorderOverrideSchema, cardStylesOverrideSchema, blockStyleOverridesSchema, blockThemeOverrideSchema, typographyScaleSchema, typographySchema, spaceSchema, corners, shadow, border, motion, buttonStyle, cardStyle, inputStyle, headerVariant, headerPositioning, headerNavStyle, navFontWeight, headerMaxWidth, headerContainerSchema, headerBorderSchema, logoStyleSchema, headerLogoTextSchema, navEffectsSchema, dropdownStyleSchema, headerCtaGapSchema, headerCtaTreatmentSchema, navContainerSchema, headerBackgroundSchema, headerSchema, footerVariant, footerMaxWidth, footerMode, footerNavLayoutMode, footerNavLayoutAlign, footerSpacing, footerLogoPlacement, footerLogoSize, footerLogoMaxHeight, footerBottomTextLinkStyleSchema, footerBottomBarSchema, footerNavLayoutSchema, footerLogoSchema, footerSchema, containerPaddingPresetSchema, layoutSchema, heroTypographySizeSchema, heroTypographyLineHeightSchema, heroResponsiveTypographySchema, heroTypographySchema, heroSchema, bodyTextIntroTypographySizeSchema, bodyTextSchema, gradientsSchema, themeSchema, themesTurnSchema;
10871
11092
  var init_schema3 = __esm({
10872
11093
  "../theme-core/src/schema.ts"() {
10873
11094
  "use strict";
@@ -10928,8 +11149,19 @@ var init_schema3 = __esm({
10928
11149
  colorToken: themeColorTokenSchema.nullable().optional()
10929
11150
  });
10930
11151
  proseLinkUnderlineStyleSchema = z24.enum(["solid", "dotted", "dashed"]);
10931
- proseLinkUnderlineThicknessSchema = z24.enum(["auto", "fromFont", "thin", "medium", "thick"]);
10932
- proseLinkUnderlineOffsetSchema = z24.enum(["auto", "tight", "normal", "loose"]);
11152
+ proseLinkUnderlineThicknessSchema = z24.enum([
11153
+ "auto",
11154
+ "fromFont",
11155
+ "thin",
11156
+ "medium",
11157
+ "thick"
11158
+ ]);
11159
+ proseLinkUnderlineOffsetSchema = z24.enum([
11160
+ "auto",
11161
+ "tight",
11162
+ "normal",
11163
+ "loose"
11164
+ ]);
10933
11165
  proseLinkStyleSchema = z24.object({
10934
11166
  colorToken: themeColorTokenSchema.optional(),
10935
11167
  hoverColorToken: themeColorTokenSchema.optional(),
@@ -10940,7 +11172,14 @@ var init_schema3 = __esm({
10940
11172
  underlineThickness: proseLinkUnderlineThicknessSchema.optional(),
10941
11173
  underlineOffset: proseLinkUnderlineOffsetSchema.optional()
10942
11174
  });
10943
- semanticSpacingSchema = z24.enum(["none", "compact", "cozy", "medium", "comfortable", "spacious"]);
11175
+ semanticSpacingSchema = z24.enum([
11176
+ "none",
11177
+ "compact",
11178
+ "cozy",
11179
+ "medium",
11180
+ "comfortable",
11181
+ "spacious"
11182
+ ]);
10944
11183
  boxRoundedSchema = z24.enum(["none", "sm", "md", "lg", "xl", "2xl", "full"]);
10945
11184
  boxBackgroundOverlaySchema = z24.object({
10946
11185
  type: z24.enum(["none", "color", "gradient"]).nullable().optional(),
@@ -10962,12 +11201,36 @@ var init_schema3 = __esm({
10962
11201
  textColor: tokenOrCssColorValueSchema.nullable().optional(),
10963
11202
  headingColor: tokenOrCssColorValueSchema.nullable().optional()
10964
11203
  });
11204
+ noHeadingDecorationSchema = z24.object({
11205
+ family: z24.literal("none"),
11206
+ placement: z24.literal("none")
11207
+ });
11208
+ visibleHeadingDecorationSchema = z24.object({
11209
+ family: z24.enum(visibleHeadingDecorationFamilyValues),
11210
+ placement: z24.enum(visibleHeadingDecorationPlacementValues),
11211
+ colorToken: z24.enum(headingDecorationColorTokenValues).optional()
11212
+ });
11213
+ headingDecorationSchema = z24.union([
11214
+ noHeadingDecorationSchema,
11215
+ visibleHeadingDecorationSchema
11216
+ ]);
11217
+ accordionIconTreatmentSchema = z24.object({
11218
+ iconSet: z24.enum(accordionIconSetValues),
11219
+ colorToken: z24.enum(accordionIconColorTokenValues),
11220
+ openColorToken: z24.enum(accordionIconColorTokenValues).optional(),
11221
+ motion: z24.enum(accordionIconMotionValues)
11222
+ });
10965
11223
  sectionStylesOverrideSchema = z24.object({
10966
11224
  background: boxBackgroundSchema.nullable().optional(),
10967
11225
  spacing: semanticSpacingSchema.nullable().optional(),
10968
11226
  minHeight: z24.enum(["none", "banner", "hero", "immersive"]).nullable().optional(),
10969
11227
  tileTreatment: z24.enum(tileTreatmentValues).nullable().optional(),
10970
- eyebrowTreatment: z24.enum(eyebrowTreatmentValues).nullable().optional()
11228
+ eyebrowTreatment: z24.enum(eyebrowTreatmentValues).nullable().optional(),
11229
+ headingDecoration: headingDecorationSchema.nullable().optional(),
11230
+ // Author-level override consumed by later block/editor rendering phases.
11231
+ // Keeping it in section styles lets existing block save APIs persist it.
11232
+ headingDecorationOverride: z24.enum(headingDecorationOverrideValues).nullable().optional(),
11233
+ accordionIconTreatment: accordionIconTreatmentSchema.nullable().optional()
10971
11234
  });
10972
11235
  containerStylesOverrideSchema = z24.object({
10973
11236
  background: boxBackgroundSchema.nullable().optional(),
@@ -11060,9 +11323,17 @@ var init_schema3 = __esm({
11060
11323
  focus: z24.enum(["glow", "ring", "underline"]),
11061
11324
  label: z24.enum(["inside", "above"])
11062
11325
  });
11063
- headerVariant = z24.enum(["classic", "centered", "transparent", "floating", "editorial"]);
11326
+ headerVariant = z24.enum(["classic", "centered", "transparent", "floating"]);
11064
11327
  headerPositioning = z24.enum(["static", "sticky", "fixed"]);
11065
- headerNavStyle = z24.enum(["minimal", "underline", "underline-grow", "capsule", "scale", "frosted", "solid"]);
11328
+ headerNavStyle = z24.enum([
11329
+ "minimal",
11330
+ "underline",
11331
+ "underline-grow",
11332
+ "capsule",
11333
+ "scale",
11334
+ "frosted",
11335
+ "solid"
11336
+ ]);
11066
11337
  navFontWeight = z24.enum(["regular", "medium", "semibold", "bold"]);
11067
11338
  headerMaxWidth = z24.enum(["container", "full"]);
11068
11339
  headerContainerSchema = z24.object({
@@ -11110,8 +11381,22 @@ var init_schema3 = __esm({
11110
11381
  textSize: z24.enum(["xs", "sm", "base", "lg"]).optional()
11111
11382
  // optional = no override (browser default)
11112
11383
  }).optional();
11113
- headerCtaGapSchema = z24.enum(["none", "tight", "compact", "default", "relaxed", "spacious"]);
11114
- headerCtaTreatmentSchema = z24.enum(["default", "primary", "secondary", "inverted", "outline", "ghost"]);
11384
+ headerCtaGapSchema = z24.enum([
11385
+ "none",
11386
+ "tight",
11387
+ "compact",
11388
+ "default",
11389
+ "relaxed",
11390
+ "spacious"
11391
+ ]);
11392
+ headerCtaTreatmentSchema = z24.enum([
11393
+ "default",
11394
+ "primary",
11395
+ "secondary",
11396
+ "inverted",
11397
+ "outline",
11398
+ "ghost"
11399
+ ]);
11115
11400
  navContainerSchema = z24.object({
11116
11401
  type: z24.enum(["none", "pill", "glass"]).default("none"),
11117
11402
  tint: z24.string().nullable().optional(),
@@ -11166,7 +11451,14 @@ var init_schema3 = __esm({
11166
11451
  footerMode = z24.enum(["default", "blocks", "default+blocks", "none"]);
11167
11452
  footerNavLayoutMode = z24.enum(["stack", "inline", "inline-wrap"]);
11168
11453
  footerNavLayoutAlign = z24.enum(["start", "center", "end", "space-between"]);
11169
- footerSpacing = z24.enum(["none", "tight", "compact", "default", "relaxed", "spacious"]);
11454
+ footerSpacing = z24.enum([
11455
+ "none",
11456
+ "tight",
11457
+ "compact",
11458
+ "default",
11459
+ "relaxed",
11460
+ "spacious"
11461
+ ]);
11170
11462
  footerLogoPlacement = z24.enum(["left", "right", "above", "below"]);
11171
11463
  footerLogoSize = z24.enum(["sm", "md", "lg", "xl"]);
11172
11464
  footerLogoMaxHeight = z24.enum(["sm", "md", "lg", "xl"]);
@@ -11231,7 +11523,12 @@ var init_schema3 = __esm({
11231
11523
  logo: footerLogoSchema.optional(),
11232
11524
  bottomBar: footerBottomBarSchema.optional()
11233
11525
  });
11234
- containerPaddingPresetSchema = z24.enum(["tight", "compact", "default", "relaxed"]);
11526
+ containerPaddingPresetSchema = z24.enum([
11527
+ "tight",
11528
+ "compact",
11529
+ "default",
11530
+ "relaxed"
11531
+ ]);
11235
11532
  layoutSchema = z24.object({
11236
11533
  containerPadding: z24.object({
11237
11534
  mobile: containerPaddingPresetSchema.optional(),
@@ -11239,8 +11536,24 @@ var init_schema3 = __esm({
11239
11536
  desktop: containerPaddingPresetSchema.optional()
11240
11537
  }).optional()
11241
11538
  }).optional();
11242
- heroTypographySizeSchema = z24.enum(["sm", "base", "lg", "xl", "2xl", "3xl", "4xl", "5xl", "6xl", "editorial"]);
11243
- heroTypographyLineHeightSchema = z24.enum(["tight", "snug", "normal", "relaxed"]);
11539
+ heroTypographySizeSchema = z24.enum([
11540
+ "sm",
11541
+ "base",
11542
+ "lg",
11543
+ "xl",
11544
+ "2xl",
11545
+ "3xl",
11546
+ "4xl",
11547
+ "5xl",
11548
+ "6xl",
11549
+ "editorial"
11550
+ ]);
11551
+ heroTypographyLineHeightSchema = z24.enum([
11552
+ "tight",
11553
+ "snug",
11554
+ "normal",
11555
+ "relaxed"
11556
+ ]);
11244
11557
  heroResponsiveTypographySchema = z24.object({
11245
11558
  headlineSize: heroTypographySizeSchema.optional(),
11246
11559
  headlineLineHeight: heroTypographyLineHeightSchema.optional(),
@@ -11664,7 +11977,7 @@ var init_soft_natural = __esm({
11664
11977
  });
11665
11978
 
11666
11979
  // ../theme-core/src/palette/variants/warm-neutral.ts
11667
- var warmNeutralClay, warmNeutralCream, warmNeutralForest;
11980
+ var warmNeutralClay, warmNeutralCream, warmNeutralSoftEarth, warmNeutralForest;
11668
11981
  var init_warm_neutral = __esm({
11669
11982
  "../theme-core/src/palette/variants/warm-neutral.ts"() {
11670
11983
  "use strict";
@@ -11713,6 +12026,28 @@ var init_warm_neutral = __esm({
11713
12026
  { name: "border", hex: "#e0d2b8" }
11714
12027
  ]
11715
12028
  });
12029
+ warmNeutralSoftEarth = definePaletteVariant({
12030
+ id: "warm-neutral-soft-earth",
12031
+ name: "Warm Neutral \u2014 Soft Earth",
12032
+ description: "Cream ground with terracotta primary, clay accents, and olive depth.",
12033
+ tags: { tone: "classic", energy: "calm", era: "organic" },
12034
+ mode: "light",
12035
+ colors: [
12036
+ { name: "primary", hex: "#a8573d" },
12037
+ { name: "secondary", hex: "#72765c" },
12038
+ { name: "accent", hex: "#c87557" },
12039
+ { name: "success", hex: "#687854" },
12040
+ { name: "warning", hex: "#b7863e" },
12041
+ { name: "destructive", hex: "#a54b3c" },
12042
+ { name: "background", hex: "#fbf6eb" },
12043
+ { name: "surface", hex: "#fffdf7" },
12044
+ { name: "surfaceAlt", hex: "#f0e4d3" },
12045
+ { name: "muted", hex: "#eadbc6" },
12046
+ { name: "text", hex: "#30281f" },
12047
+ { name: "primaryForeground", hex: "#fffaf3" },
12048
+ { name: "border", hex: "#d9c8b2" }
12049
+ ]
12050
+ });
11716
12051
  warmNeutralForest = definePaletteVariant({
11717
12052
  id: "warm-neutral-forest",
11718
12053
  name: "Warm Neutral \u2014 Forest",
@@ -11757,6 +12092,7 @@ var init_variants = __esm({
11757
12092
  // Warm-neutral family
11758
12093
  warmNeutralClay,
11759
12094
  warmNeutralCream,
12095
+ warmNeutralSoftEarth,
11760
12096
  warmNeutralForest,
11761
12097
  // High-contrast family
11762
12098
  highContrastInk,
@@ -11785,6 +12121,12 @@ var init_customizableSurfaces = __esm({
11785
12121
  function asHeaderLookId(value) {
11786
12122
  return value;
11787
12123
  }
12124
+ function asHeaderLayoutId(value) {
12125
+ return value;
12126
+ }
12127
+ function asHeaderStyleId(value) {
12128
+ return value;
12129
+ }
11788
12130
  function baseHeader(theme) {
11789
12131
  const {
11790
12132
  navLinkStyle: _navLinkStyle,
@@ -11803,6 +12145,36 @@ function baseHeader(theme) {
11803
12145
  navContainer: { type: "none", tint: null, opacity: 0.15 }
11804
12146
  };
11805
12147
  }
12148
+ function supportedLayouts(ids) {
12149
+ return ids.map(asHeaderLayoutId);
12150
+ }
12151
+ function headerStyleRepairChain(values) {
12152
+ return values.map(asHeaderStyleId);
12153
+ }
12154
+ function getHeaderStyle(id) {
12155
+ return headerStylesById.get(id) ?? null;
12156
+ }
12157
+ function isHeaderStyleCompatibleWithLayout(style, layoutId) {
12158
+ return style.supportedLayoutIds.includes(layoutId);
12159
+ }
12160
+ function getHeaderStyleOrThrow(id) {
12161
+ const style = getHeaderStyle(id);
12162
+ if (!style) {
12163
+ throw new Error(`Unknown Theme V2 header style: ${id}`);
12164
+ }
12165
+ return style;
12166
+ }
12167
+ function resolveLegacyHeaderLookAlias(lookId) {
12168
+ return legacyHeaderLookAliasesById.get(lookId)?.selection ?? null;
12169
+ }
12170
+ function getCompatibleHeaderStyleIds(layoutId) {
12171
+ return (headerStyleCompatibilityOrder.get(layoutId) ?? []).filter(
12172
+ (styleId) => {
12173
+ const style = getHeaderStyleOrThrow(styleId);
12174
+ return isHeaderStyleCompatibleWithLayout(style, layoutId);
12175
+ }
12176
+ );
12177
+ }
11806
12178
  function solidBrandHeader(theme) {
11807
12179
  const ctaVariant = resolveHeaderCtaVariant(theme, "inverted");
11808
12180
  return {
@@ -11832,8 +12204,14 @@ function solidBrandHeader(theme) {
11832
12204
  borderRadius: "none",
11833
12205
  effects: {
11834
12206
  hover: [
11835
- { effectId: "text-color-change", options: { hoverColorToken: "secondary" } },
11836
- { effectId: "nav-underline", options: { style: "grow", colorToken: "secondary" } }
12207
+ {
12208
+ effectId: "text-color-change",
12209
+ options: { hoverColorToken: "secondary" }
12210
+ },
12211
+ {
12212
+ effectId: "nav-underline",
12213
+ options: { style: "grow", colorToken: "secondary" }
12214
+ }
11837
12215
  ]
11838
12216
  }
11839
12217
  },
@@ -11889,10 +12267,10 @@ function cleanBaseHeader(theme) {
11889
12267
  ctaGap: "default"
11890
12268
  };
11891
12269
  }
11892
- function editorialLineHeader(theme) {
12270
+ function serifLineHeader(theme) {
11893
12271
  return {
11894
12272
  ...baseHeader(theme),
11895
- variant: "editorial",
12273
+ variant: "centered",
11896
12274
  positioning: "sticky",
11897
12275
  shrinkOnScroll: false,
11898
12276
  background: {
@@ -12033,81 +12411,448 @@ function floatingGlassHeader(theme) {
12033
12411
  }
12034
12412
  };
12035
12413
  }
12036
- var headerLookCatalog, guaranteedFallbackHeaderLookId, headerLooksById;
12414
+ function headerConfigurationKey(configuration) {
12415
+ return `${configuration.structure}:${configuration.treatment}:${configuration.behavior}`;
12416
+ }
12417
+ var headerLayoutCatalog, headerStyleCatalog, headerLayoutsById, headerStylesById, headerStyleCompatibilityOrder, headerStyleRepairOrder, legacyHeaderLookAliases, legacyHeaderLookAliasesById, headerLookCatalog, guaranteedFallbackHeaderLookId, guaranteedFallbackHeaderLayoutId, guaranteedFallbackHeaderStyleId, allowedHeaderConfigurationKeys, headerLooksById;
12037
12418
  var init_headerLooks = __esm({
12038
12419
  "../theme-core/src/site-styles/headerLooks.ts"() {
12039
12420
  "use strict";
12040
12421
  init_headerCtaVariants();
12041
12422
  init_customizableSurfaces();
12042
12423
  init_types2();
12043
- headerLookCatalog = [
12424
+ headerLayoutCatalog = [
12044
12425
  {
12045
- id: asHeaderLookId("clean-base"),
12046
- label: "Clean base",
12047
- visualTreatment: "solid-neutral",
12048
- layoutBehavior: "sticky",
12049
- openingRequirement: "none",
12050
- compile: cleanBaseHeader
12426
+ id: asHeaderLayoutId("classic"),
12427
+ label: "Classic",
12428
+ description: "Logo and navigation in one practical horizontal row.",
12429
+ structure: "inline-classic",
12430
+ variant: "classic",
12431
+ defaultPositioning: "sticky",
12432
+ shrinkOnScroll: false
12051
12433
  },
12052
12434
  {
12053
- id: asHeaderLookId("brand-solid"),
12054
- label: "Brand solid",
12055
- visualTreatment: "solid-brand",
12056
- layoutBehavior: "sticky-shrink",
12057
- openingRequirement: "none",
12058
- compile: solidBrandHeader
12435
+ id: asHeaderLayoutId("centered"),
12436
+ label: "Centered",
12437
+ description: "Logo centered above a balanced navigation row.",
12438
+ structure: "centered-stack",
12439
+ variant: "centered",
12440
+ defaultPositioning: "static",
12441
+ shrinkOnScroll: false,
12442
+ maxRecommendedNavItems: 5,
12443
+ allowedLogoShapes: ["none", "text-only", "horizontal", "square"]
12059
12444
  },
12060
12445
  {
12061
- id: asHeaderLookId("editorial-line"),
12062
- label: "Editorial line",
12063
- visualTreatment: "light-editorial",
12064
- layoutBehavior: "sticky",
12065
- openingRequirement: "none",
12066
- maxRecommendedNavItems: 6,
12067
- compile: editorialLineHeader
12446
+ id: asHeaderLayoutId("floating"),
12447
+ label: "Floating",
12448
+ description: "Detached header chrome that sits over the opening section.",
12449
+ structure: "floating-shell",
12450
+ variant: "floating",
12451
+ defaultPositioning: "fixed",
12452
+ shrinkOnScroll: true,
12453
+ maxRecommendedNavItems: 5,
12454
+ allowedLogoShapes: ["none", "text-only", "horizontal"]
12455
+ }
12456
+ ];
12457
+ headerStyleCatalog = [
12458
+ {
12459
+ id: asHeaderStyleId("minimal"),
12460
+ label: "Minimal",
12461
+ description: "Quiet surface with simple color-change navigation.",
12462
+ supportedLayoutIds: supportedLayouts(["classic", "centered"]),
12463
+ navInteraction: "color-change",
12464
+ surface: "neutral",
12465
+ navTypography: "plain"
12068
12466
  },
12069
12467
  {
12070
- id: asHeaderLookId("centered-calm"),
12071
- label: "Centered calm",
12072
- visualTreatment: "light-editorial",
12073
- layoutBehavior: "normal-flow",
12074
- openingRequirement: "none",
12075
- maxRecommendedNavItems: 5,
12076
- allowedLogoShapes: ["none", "text-only", "horizontal", "square"],
12077
- compile: centeredCalmHeader
12468
+ id: asHeaderStyleId("fine-line"),
12469
+ label: "Fine Line",
12470
+ description: "Light surface with a crisp lower rule and underline hover.",
12471
+ supportedLayoutIds: supportedLayouts(["classic", "centered"]),
12472
+ navInteraction: "underline-grow",
12473
+ surface: "bordered",
12474
+ navTypography: "plain"
12078
12475
  },
12079
12476
  {
12080
- id: asHeaderLookId("practical-utility"),
12081
- label: "Practical utility",
12082
- visualTreatment: "solid-neutral",
12083
- layoutBehavior: "sticky-shrink",
12084
- openingRequirement: "none",
12085
- requiresProminentCta: true,
12086
- compile: practicalUtilityHeader
12477
+ id: asHeaderStyleId("soft-bar"),
12478
+ label: "Soft Bar",
12479
+ description: "Soft tinted surface with gentle pill hover states.",
12480
+ supportedLayoutIds: supportedLayouts(["classic", "centered"]),
12481
+ navInteraction: "pill-background",
12482
+ surface: "soft",
12483
+ navTypography: "plain"
12087
12484
  },
12088
12485
  {
12089
- id: asHeaderLookId("minimal-transparent"),
12090
- label: "Minimal transparent",
12091
- visualTreatment: "minimal-transparent",
12092
- layoutBehavior: "normal-flow",
12093
- openingRequirement: "reserved-space-ok",
12094
- compile: minimalTransparentHeader
12486
+ id: asHeaderStyleId("pill-nav"),
12487
+ label: "Pill Nav",
12488
+ description: "A calm pill navigation rail over a neutral header.",
12489
+ supportedLayoutIds: supportedLayouts(["classic", "centered"]),
12490
+ navInteraction: "pill-background",
12491
+ surface: "soft",
12492
+ navTypography: "plain"
12095
12493
  },
12096
12494
  {
12097
- id: asHeaderLookId("transparent-overlay"),
12098
- label: "Transparent overlay",
12099
- visualTreatment: "transparent-overlay",
12100
- layoutBehavior: "fixed-overlay",
12101
- openingRequirement: "requires-image-hero-with-contrast-overlay",
12102
- maxRecommendedNavItems: 5,
12103
- allowedLogoShapes: ["none", "text-only", "horizontal"],
12104
- compile: transparentOverlayHeader
12495
+ id: asHeaderStyleId("brand-bar"),
12496
+ label: "Brand Bar",
12497
+ description: "Solid brand surface with high-contrast navigation.",
12498
+ supportedLayoutIds: supportedLayouts(["classic", "centered"]),
12499
+ navInteraction: "color-change",
12500
+ surface: "brand-solid",
12501
+ navTypography: "brand-caps"
12502
+ },
12503
+ {
12504
+ id: asHeaderStyleId("brand-underline"),
12505
+ label: "Brand Underline",
12506
+ description: "Brand surface with underline-grow navigation.",
12507
+ supportedLayoutIds: supportedLayouts(["classic"]),
12508
+ navInteraction: "underline-grow",
12509
+ surface: "brand-solid",
12510
+ navTypography: "brand-caps"
12511
+ },
12512
+ {
12513
+ id: asHeaderStyleId("brand-pill"),
12514
+ label: "Brand Pill",
12515
+ description: "Solid brand surface with rounded active and hover states.",
12516
+ supportedLayoutIds: supportedLayouts(["classic", "centered", "floating"]),
12517
+ navInteraction: "pill-background",
12518
+ surface: "brand-solid",
12519
+ navTypography: "brand-caps"
12520
+ },
12521
+ {
12522
+ id: asHeaderStyleId("serif-line"),
12523
+ label: "Serif Line",
12524
+ description: "Typographic logo treatment with understated underline navigation.",
12525
+ supportedLayoutIds: supportedLayouts(["classic", "centered"]),
12526
+ navInteraction: "underline-grow",
12527
+ surface: "bordered",
12528
+ navTypography: "heading"
12529
+ },
12530
+ {
12531
+ id: asHeaderStyleId("flat-tabs"),
12532
+ label: "Flat Tabs",
12533
+ description: "Flat block hover and active states with a Swiss utility feel.",
12534
+ supportedLayoutIds: supportedLayouts(["classic", "centered"]),
12535
+ navInteraction: "flat-block",
12536
+ surface: "bordered",
12537
+ navTypography: "quiet-caps"
12538
+ },
12539
+ {
12540
+ id: asHeaderStyleId("glass"),
12541
+ label: "Glass",
12542
+ description: "Translucent chrome with frosted navigation backing.",
12543
+ supportedLayoutIds: supportedLayouts(["classic", "floating"]),
12544
+ navInteraction: "glass-backed",
12545
+ surface: "floating",
12546
+ navTypography: "plain"
12547
+ },
12548
+ {
12549
+ id: asHeaderStyleId("minimal-surface"),
12550
+ label: "Clear Split",
12551
+ description: "Floating logo with transparent navigation and no shared shell.",
12552
+ supportedLayoutIds: supportedLayouts(["floating"]),
12553
+ navInteraction: "color-change",
12554
+ surface: "floating",
12555
+ navTypography: "plain"
12556
+ },
12557
+ {
12558
+ id: asHeaderStyleId("soft-shell"),
12559
+ label: "Soft Shell",
12560
+ description: "Floating rounded shell with soft pill navigation states.",
12561
+ supportedLayoutIds: supportedLayouts(["floating"]),
12562
+ navInteraction: "pill-background",
12563
+ surface: "floating",
12564
+ navTypography: "plain"
12565
+ },
12566
+ {
12567
+ id: asHeaderStyleId("split-glass"),
12568
+ label: "Split Glass",
12569
+ description: "Logo floats independently while the navigation sits in a glass rail.",
12570
+ supportedLayoutIds: supportedLayouts(["floating"]),
12571
+ navInteraction: "glass-backed",
12572
+ surface: "floating",
12573
+ navTypography: "quiet-caps"
12574
+ },
12575
+ {
12576
+ id: asHeaderStyleId("split-pill"),
12577
+ label: "Split Pill",
12578
+ description: "Logo floats independently with a soft pill-backed navigation rail.",
12579
+ supportedLayoutIds: supportedLayouts(["floating"]),
12580
+ navInteraction: "pill-background",
12581
+ surface: "floating",
12582
+ navTypography: "heading"
12583
+ }
12584
+ ];
12585
+ headerLayoutsById = new Map(
12586
+ headerLayoutCatalog.map((layout) => [layout.id, layout])
12587
+ );
12588
+ headerStylesById = new Map(
12589
+ headerStyleCatalog.map((style) => [style.id, style])
12590
+ );
12591
+ headerStyleCompatibilityOrder = /* @__PURE__ */ new Map([
12592
+ [
12593
+ asHeaderLayoutId("classic"),
12594
+ headerStyleRepairChain([
12595
+ "minimal",
12596
+ "glass",
12597
+ "fine-line",
12598
+ "soft-bar",
12599
+ "pill-nav",
12600
+ "brand-bar",
12601
+ "brand-underline",
12602
+ "brand-pill",
12603
+ "serif-line",
12604
+ "flat-tabs"
12605
+ ])
12606
+ ],
12607
+ [
12608
+ asHeaderLayoutId("centered"),
12609
+ headerStyleRepairChain([
12610
+ "minimal",
12611
+ "fine-line",
12612
+ "soft-bar",
12613
+ "pill-nav",
12614
+ "brand-bar",
12615
+ "brand-pill",
12616
+ "serif-line",
12617
+ "flat-tabs"
12618
+ ])
12619
+ ],
12620
+ [
12621
+ asHeaderLayoutId("floating"),
12622
+ headerStyleRepairChain([
12623
+ "glass",
12624
+ "minimal-surface",
12625
+ "split-glass",
12626
+ "split-pill",
12627
+ "soft-shell",
12628
+ "brand-pill"
12629
+ ])
12630
+ ]
12631
+ ]);
12632
+ headerStyleRepairOrder = /* @__PURE__ */ new Map(
12633
+ [
12634
+ [
12635
+ asHeaderStyleId("brand-bar"),
12636
+ headerStyleRepairChain(["brand-bar", "brand-pill", "minimal"])
12637
+ ],
12638
+ [
12639
+ asHeaderStyleId("brand-underline"),
12640
+ headerStyleRepairChain(["serif-line", "fine-line", "minimal"])
12641
+ ],
12642
+ [
12643
+ asHeaderStyleId("brand-pill"),
12644
+ headerStyleRepairChain(["brand-pill", "brand-bar", "minimal"])
12645
+ ],
12646
+ [
12647
+ asHeaderStyleId("pill-nav"),
12648
+ headerStyleRepairChain(["pill-nav", "soft-bar", "minimal"])
12649
+ ],
12650
+ [
12651
+ asHeaderStyleId("flat-tabs"),
12652
+ headerStyleRepairChain(["flat-tabs", "pill-nav", "minimal"])
12653
+ ],
12654
+ [
12655
+ asHeaderStyleId("serif-line"),
12656
+ headerStyleRepairChain(["serif-line", "fine-line", "minimal"])
12657
+ ],
12658
+ [
12659
+ asHeaderStyleId("glass"),
12660
+ headerStyleRepairChain(["glass", "minimal-surface", "minimal"])
12661
+ ],
12662
+ [
12663
+ asHeaderStyleId("soft-shell"),
12664
+ headerStyleRepairChain(["soft-shell", "soft-bar", "minimal"])
12665
+ ],
12666
+ [
12667
+ asHeaderStyleId("minimal-surface"),
12668
+ headerStyleRepairChain(["minimal-surface", "minimal"])
12669
+ ],
12670
+ [
12671
+ asHeaderStyleId("split-glass"),
12672
+ headerStyleRepairChain(["split-glass", "glass", "minimal-surface"])
12673
+ ],
12674
+ [
12675
+ asHeaderStyleId("split-pill"),
12676
+ headerStyleRepairChain(["split-pill", "soft-shell", "brand-pill"])
12677
+ ],
12678
+ [
12679
+ asHeaderStyleId("fine-line"),
12680
+ headerStyleRepairChain(["fine-line", "minimal"])
12681
+ ],
12682
+ [
12683
+ asHeaderStyleId("soft-bar"),
12684
+ headerStyleRepairChain(["soft-bar", "minimal"])
12685
+ ],
12686
+ [asHeaderStyleId("minimal"), headerStyleRepairChain(["minimal"])]
12687
+ ]
12688
+ );
12689
+ legacyHeaderLookAliases = [
12690
+ {
12691
+ lookId: asHeaderLookId("clean-base"),
12692
+ selection: {
12693
+ layoutId: asHeaderLayoutId("classic"),
12694
+ styleId: asHeaderStyleId("minimal")
12695
+ }
12696
+ },
12697
+ {
12698
+ lookId: asHeaderLookId("brand-solid"),
12699
+ selection: {
12700
+ layoutId: asHeaderLayoutId("classic"),
12701
+ styleId: asHeaderStyleId("brand-bar")
12702
+ }
12703
+ },
12704
+ {
12705
+ lookId: asHeaderLookId("serif-line"),
12706
+ selection: {
12707
+ layoutId: asHeaderLayoutId("centered"),
12708
+ styleId: asHeaderStyleId("serif-line")
12709
+ }
12710
+ },
12711
+ {
12712
+ lookId: asHeaderLookId("centered-calm"),
12713
+ selection: {
12714
+ layoutId: asHeaderLayoutId("centered"),
12715
+ styleId: asHeaderStyleId("minimal")
12716
+ }
12717
+ },
12718
+ {
12719
+ lookId: asHeaderLookId("practical-utility"),
12720
+ selection: {
12721
+ layoutId: asHeaderLayoutId("classic"),
12722
+ styleId: asHeaderStyleId("flat-tabs")
12723
+ }
12724
+ },
12725
+ {
12726
+ lookId: asHeaderLookId("minimal-transparent"),
12727
+ selection: {
12728
+ layoutId: asHeaderLayoutId("classic"),
12729
+ styleId: asHeaderStyleId("minimal")
12730
+ }
12731
+ },
12732
+ {
12733
+ lookId: asHeaderLookId("transparent-overlay"),
12734
+ selection: {
12735
+ layoutId: asHeaderLayoutId("floating"),
12736
+ styleId: asHeaderStyleId("glass")
12737
+ }
12738
+ },
12739
+ {
12740
+ lookId: asHeaderLookId("floating-glass"),
12741
+ selection: {
12742
+ layoutId: asHeaderLayoutId("floating"),
12743
+ styleId: asHeaderStyleId("glass")
12744
+ }
12745
+ }
12746
+ ];
12747
+ legacyHeaderLookAliasesById = new Map(legacyHeaderLookAliases.map((alias) => [alias.lookId, alias]));
12748
+ headerLookCatalog = [
12749
+ {
12750
+ id: asHeaderLookId("clean-base"),
12751
+ label: "Clean base",
12752
+ visualTreatment: "solid-neutral",
12753
+ layoutBehavior: "sticky",
12754
+ configuration: {
12755
+ structure: "inline-classic",
12756
+ treatment: "solid-neutral",
12757
+ behavior: "sticky"
12758
+ },
12759
+ openingRequirement: "none",
12760
+ compile: cleanBaseHeader
12761
+ },
12762
+ {
12763
+ id: asHeaderLookId("brand-solid"),
12764
+ label: "Brand solid",
12765
+ visualTreatment: "solid-brand",
12766
+ layoutBehavior: "sticky-shrink",
12767
+ configuration: {
12768
+ structure: "inline-classic",
12769
+ treatment: "solid-brand",
12770
+ behavior: "sticky-shrink"
12771
+ },
12772
+ openingRequirement: "none",
12773
+ compile: solidBrandHeader
12774
+ },
12775
+ {
12776
+ id: asHeaderLookId("serif-line"),
12777
+ label: "Serif line",
12778
+ visualTreatment: "light-serif",
12779
+ layoutBehavior: "sticky",
12780
+ configuration: {
12781
+ structure: "centered-stack",
12782
+ treatment: "light-serif",
12783
+ behavior: "sticky"
12784
+ },
12785
+ openingRequirement: "none",
12786
+ maxRecommendedNavItems: 6,
12787
+ compile: serifLineHeader
12788
+ },
12789
+ {
12790
+ id: asHeaderLookId("centered-calm"),
12791
+ label: "Centered calm",
12792
+ visualTreatment: "light-serif",
12793
+ layoutBehavior: "normal-flow",
12794
+ configuration: {
12795
+ structure: "centered-stack",
12796
+ treatment: "light-serif",
12797
+ behavior: "normal-flow"
12798
+ },
12799
+ openingRequirement: "none",
12800
+ maxRecommendedNavItems: 5,
12801
+ allowedLogoShapes: ["none", "text-only", "horizontal", "square"],
12802
+ compile: centeredCalmHeader
12803
+ },
12804
+ {
12805
+ id: asHeaderLookId("practical-utility"),
12806
+ label: "Practical utility",
12807
+ visualTreatment: "solid-neutral",
12808
+ layoutBehavior: "sticky-shrink",
12809
+ configuration: {
12810
+ structure: "inline-classic",
12811
+ treatment: "solid-neutral",
12812
+ behavior: "sticky-shrink"
12813
+ },
12814
+ openingRequirement: "none",
12815
+ requiresProminentCta: true,
12816
+ compile: practicalUtilityHeader
12817
+ },
12818
+ {
12819
+ id: asHeaderLookId("minimal-transparent"),
12820
+ label: "Minimal transparent",
12821
+ visualTreatment: "minimal-transparent",
12822
+ layoutBehavior: "normal-flow",
12823
+ configuration: {
12824
+ structure: "inline-classic",
12825
+ treatment: "minimal-transparent",
12826
+ behavior: "normal-flow"
12827
+ },
12828
+ openingRequirement: "reserved-space-ok",
12829
+ compile: minimalTransparentHeader
12830
+ },
12831
+ {
12832
+ id: asHeaderLookId("transparent-overlay"),
12833
+ label: "Transparent overlay",
12834
+ visualTreatment: "transparent-overlay",
12835
+ layoutBehavior: "fixed-overlay",
12836
+ configuration: {
12837
+ structure: "inline-classic",
12838
+ treatment: "transparent-overlay",
12839
+ behavior: "fixed-overlay"
12840
+ },
12841
+ openingRequirement: "requires-image-hero-with-contrast-overlay",
12842
+ maxRecommendedNavItems: 5,
12843
+ allowedLogoShapes: ["none", "text-only", "horizontal"],
12844
+ compile: transparentOverlayHeader
12105
12845
  },
12106
12846
  {
12107
12847
  id: asHeaderLookId("floating-glass"),
12108
12848
  label: "Floating glass",
12109
12849
  visualTreatment: "floating-glass",
12110
12850
  layoutBehavior: "fixed-floating",
12851
+ configuration: {
12852
+ structure: "floating-shell",
12853
+ treatment: "floating-glass",
12854
+ behavior: "fixed-floating"
12855
+ },
12111
12856
  openingRequirement: "requires-image-hero-with-contrast-overlay",
12112
12857
  maxRecommendedNavItems: 5,
12113
12858
  allowedLogoShapes: ["none", "text-only", "horizontal"],
@@ -12115,6 +12860,11 @@ var init_headerLooks = __esm({
12115
12860
  }
12116
12861
  ];
12117
12862
  guaranteedFallbackHeaderLookId = asHeaderLookId("clean-base");
12863
+ guaranteedFallbackHeaderLayoutId = asHeaderLayoutId("classic");
12864
+ guaranteedFallbackHeaderStyleId = asHeaderStyleId("minimal");
12865
+ allowedHeaderConfigurationKeys = new Set(
12866
+ headerLookCatalog.map((look) => headerConfigurationKey(look.configuration))
12867
+ );
12118
12868
  headerLooksById = new Map(
12119
12869
  headerLookCatalog.map((look) => [look.id, look])
12120
12870
  );
@@ -12274,27 +13024,310 @@ var init_sourceCatalogs = __esm({
12274
13024
  }
12275
13025
  });
12276
13026
 
13027
+ // ../theme-core/src/site-styles/typographyPresets.ts
13028
+ function asTypographyPresetId(value) {
13029
+ if (!value.startsWith("typography-preset:")) {
13030
+ throw new Error(`TypographyPresetId must start with "typography-preset:". Received: ${value}`);
13031
+ }
13032
+ return value;
13033
+ }
13034
+ function defineTypographyPreset(preset2) {
13035
+ return {
13036
+ ...preset2,
13037
+ id: asTypographyPresetId(preset2.id)
13038
+ };
13039
+ }
13040
+ var bodyReadablePolicy, headingFlexiblePolicy, displayHeadingPolicy, modernSansTypography, warmRoundedTypography, editorialSerifTypography, classicSerifTypography, luxeContrastTypography, boldDisplayTypography, typographyPresets, typographyPresetsById;
13041
+ var init_typographyPresets = __esm({
13042
+ "../theme-core/src/site-styles/typographyPresets.ts"() {
13043
+ "use strict";
13044
+ bodyReadablePolicy = {
13045
+ recommendedCategories: ["sans-serif", "serif"],
13046
+ allowedCategories: ["sans-serif", "serif"],
13047
+ requiresItalicForBody: true,
13048
+ requiresBoldForBody: true
13049
+ };
13050
+ headingFlexiblePolicy = {
13051
+ recommendedCategories: ["sans-serif", "serif", "display"],
13052
+ allowedCategories: ["sans-serif", "serif", "display"]
13053
+ };
13054
+ displayHeadingPolicy = {
13055
+ recommendedCategories: ["display", "sans-serif", "serif"],
13056
+ allowedCategories: ["display", "sans-serif", "serif"]
13057
+ };
13058
+ modernSansTypography = {
13059
+ body: {
13060
+ family: "Inter, system-ui, sans-serif",
13061
+ size: "md",
13062
+ weight: "regular",
13063
+ lineHeight: "relaxed",
13064
+ letterSpacing: "normal"
13065
+ },
13066
+ headings: {
13067
+ default: {
13068
+ family: "Inter, system-ui, sans-serif",
13069
+ weight: "semibold",
13070
+ lineHeight: "normal",
13071
+ letterSpacing: "tight",
13072
+ italic: null,
13073
+ case: null
13074
+ },
13075
+ h1: { size: "xl", weight: "bold", lineHeight: "normal", letterSpacing: "tight", italic: null },
13076
+ h2: { size: "lg", weight: "semibold", lineHeight: "normal", letterSpacing: "tight", italic: null },
13077
+ h3: { size: "md", weight: "semibold", lineHeight: "normal", letterSpacing: "normal", italic: null }
13078
+ },
13079
+ scale: "balanced"
13080
+ };
13081
+ warmRoundedTypography = {
13082
+ body: {
13083
+ family: "Nunito Sans, system-ui, sans-serif",
13084
+ size: "lg",
13085
+ weight: "regular",
13086
+ lineHeight: "relaxed",
13087
+ letterSpacing: "normal"
13088
+ },
13089
+ headings: {
13090
+ default: {
13091
+ family: "Nunito Sans, system-ui, sans-serif",
13092
+ weight: "bold",
13093
+ lineHeight: "normal",
13094
+ letterSpacing: "normal",
13095
+ italic: null,
13096
+ case: null
13097
+ },
13098
+ h1: { size: "xl", weight: "bold", lineHeight: "normal", letterSpacing: "normal", italic: null },
13099
+ h2: { size: "lg", weight: "bold", lineHeight: "normal", letterSpacing: "normal", italic: null },
13100
+ h3: { size: "md", weight: "semibold", lineHeight: "relaxed", letterSpacing: "normal", italic: null }
13101
+ },
13102
+ scale: "balanced"
13103
+ };
13104
+ editorialSerifTypography = {
13105
+ body: {
13106
+ family: "Lora, Georgia, serif",
13107
+ size: "lg",
13108
+ weight: "regular",
13109
+ lineHeight: "loose",
13110
+ letterSpacing: "normal"
13111
+ },
13112
+ headings: {
13113
+ default: {
13114
+ family: "Playfair Display, Georgia, serif",
13115
+ weight: "semibold",
13116
+ lineHeight: "normal",
13117
+ letterSpacing: "tight",
13118
+ italic: null,
13119
+ case: null
13120
+ },
13121
+ h1: { size: "2xl", weight: "semibold", lineHeight: "normal", letterSpacing: "tight", italic: null },
13122
+ h2: { size: "xl", weight: "semibold", lineHeight: "normal", letterSpacing: "normal", italic: null },
13123
+ h3: { size: "md", weight: "semibold", lineHeight: "relaxed", letterSpacing: "normal", italic: true }
13124
+ },
13125
+ scale: "spacious"
13126
+ };
13127
+ classicSerifTypography = {
13128
+ body: {
13129
+ family: "Libre Baskerville, Georgia, serif",
13130
+ size: "md",
13131
+ weight: "regular",
13132
+ lineHeight: "relaxed",
13133
+ letterSpacing: "normal"
13134
+ },
13135
+ headings: {
13136
+ default: {
13137
+ family: "Cormorant Garamond, Georgia, serif",
13138
+ weight: "semibold",
13139
+ lineHeight: "normal",
13140
+ letterSpacing: "normal",
13141
+ italic: null,
13142
+ case: null
13143
+ },
13144
+ h1: { size: "2xl", weight: "semibold", lineHeight: "normal", letterSpacing: "normal", italic: null },
13145
+ h2: { size: "xl", weight: "semibold", lineHeight: "normal", letterSpacing: "normal", italic: null },
13146
+ h3: { size: "md", weight: "medium", lineHeight: "relaxed", letterSpacing: "normal", italic: null }
13147
+ },
13148
+ scale: "balanced"
13149
+ };
13150
+ luxeContrastTypography = {
13151
+ body: {
13152
+ family: "Manrope, system-ui, sans-serif",
13153
+ size: "md",
13154
+ weight: "regular",
13155
+ lineHeight: "relaxed",
13156
+ letterSpacing: "normal"
13157
+ },
13158
+ headings: {
13159
+ default: {
13160
+ family: "Cormorant Garamond, Georgia, serif",
13161
+ weight: "semibold",
13162
+ lineHeight: "normal",
13163
+ letterSpacing: "tight",
13164
+ italic: null,
13165
+ case: null
13166
+ },
13167
+ h1: { size: "2xl", weight: "semibold", lineHeight: "normal", letterSpacing: "tight", italic: null },
13168
+ h2: { size: "xl", weight: "semibold", lineHeight: "normal", letterSpacing: "tight", italic: null },
13169
+ h3: { size: "md", weight: "medium", lineHeight: "relaxed", letterSpacing: "normal", italic: null }
13170
+ },
13171
+ scale: "spacious"
13172
+ };
13173
+ boldDisplayTypography = {
13174
+ body: {
13175
+ family: "Manrope, system-ui, sans-serif",
13176
+ size: "lg",
13177
+ weight: "regular",
13178
+ lineHeight: "relaxed",
13179
+ letterSpacing: "normal"
13180
+ },
13181
+ headings: {
13182
+ default: {
13183
+ family: '"TAN - PEARL", sans-serif',
13184
+ weight: "bold",
13185
+ lineHeight: "normal",
13186
+ letterSpacing: "tight",
13187
+ colorToken: "primary",
13188
+ italic: null,
13189
+ case: null
13190
+ },
13191
+ h1: { size: "xl", weight: "bold", lineHeight: "normal", letterSpacing: "tight", italic: null },
13192
+ h2: { size: "lg", weight: "bold", lineHeight: "normal", letterSpacing: "normal", italic: null },
13193
+ h3: { size: "md", weight: "bold", lineHeight: "normal", letterSpacing: "normal", italic: null }
13194
+ },
13195
+ scale: "balanced"
13196
+ };
13197
+ typographyPresets = [
13198
+ defineTypographyPreset({
13199
+ id: "typography-preset:modern-sans",
13200
+ name: "Modern Sans",
13201
+ description: "Crisp, neutral type for clear service pages and practical editorial structure.",
13202
+ defaultFonts: { body: "Inter, system-ui, sans-serif", heading: "Inter, system-ui, sans-serif" },
13203
+ recommendedFonts: {
13204
+ body: ["Inter", "Source Sans 3", "IBM Plex Sans"],
13205
+ heading: ["Inter", "Manrope", "Source Sans 3"]
13206
+ },
13207
+ slotPolicies: { body: bodyReadablePolicy, heading: headingFlexiblePolicy },
13208
+ typography: modernSansTypography
13209
+ }),
13210
+ defineTypographyPreset({
13211
+ id: "typography-preset:warm-rounded",
13212
+ name: "Warm Rounded",
13213
+ description: "Soft, friendly type for welcoming studios, classes, and community businesses.",
13214
+ defaultFonts: { body: "Nunito Sans, system-ui, sans-serif", heading: "Nunito Sans, system-ui, sans-serif" },
13215
+ recommendedFonts: {
13216
+ body: ["Nunito Sans", "Atkinson Hyperlegible", "Lato"],
13217
+ heading: ["Nunito Sans", "Quicksand", "Manrope"]
13218
+ },
13219
+ slotPolicies: { body: bodyReadablePolicy, heading: headingFlexiblePolicy },
13220
+ typography: warmRoundedTypography
13221
+ }),
13222
+ defineTypographyPreset({
13223
+ id: "typography-preset:editorial-serif",
13224
+ name: "Editorial Serif",
13225
+ description: "Story-led type with warm reading rhythm and expressive headings.",
13226
+ defaultFonts: { body: "Lora, Georgia, serif", heading: "Playfair Display, Georgia, serif" },
13227
+ recommendedFonts: {
13228
+ body: ["Lora", "Source Serif 4", "Libre Baskerville"],
13229
+ heading: ["Playfair Display", "Cormorant Garamond", "Fraunces"]
13230
+ },
13231
+ slotPolicies: { body: bodyReadablePolicy, heading: displayHeadingPolicy },
13232
+ typography: editorialSerifTypography
13233
+ }),
13234
+ defineTypographyPreset({
13235
+ id: "typography-preset:classic-serif",
13236
+ name: "Classic Serif",
13237
+ description: "Measured, polished type for premium and established offers.",
13238
+ defaultFonts: { body: "Libre Baskerville, Georgia, serif", heading: "Cormorant Garamond, Georgia, serif" },
13239
+ recommendedFonts: {
13240
+ body: ["Libre Baskerville", "Source Serif 4", "Lora"],
13241
+ heading: ["Cormorant Garamond", "Playfair Display", "Libre Baskerville"]
13242
+ },
13243
+ slotPolicies: { body: bodyReadablePolicy, heading: displayHeadingPolicy },
13244
+ typography: classicSerifTypography
13245
+ }),
13246
+ defineTypographyPreset({
13247
+ id: "typography-preset:luxe-contrast",
13248
+ name: "Luxe Contrast",
13249
+ description: "A restrained sans body paired with elegant high-contrast headings.",
13250
+ defaultFonts: { body: "Manrope, system-ui, sans-serif", heading: "Cormorant Garamond, Georgia, serif" },
13251
+ recommendedFonts: {
13252
+ body: ["Manrope", "Inter", "Source Sans 3"],
13253
+ heading: ["Cormorant Garamond", "Playfair Display", "Bodoni Moda"]
13254
+ },
13255
+ slotPolicies: { body: bodyReadablePolicy, heading: displayHeadingPolicy },
13256
+ typography: luxeContrastTypography
13257
+ }),
13258
+ defineTypographyPreset({
13259
+ id: "typography-preset:bold-display",
13260
+ name: "Bold Display",
13261
+ description: "Punchy display headings with readable sans body copy for branded launches.",
13262
+ defaultFonts: { body: "Manrope, system-ui, sans-serif", heading: '"TAN - PEARL", sans-serif' },
13263
+ recommendedFonts: {
13264
+ body: ["Manrope", "Inter", "Space Grotesk"],
13265
+ heading: ["Anton", "Bebas Neue", "Archivo Black"]
13266
+ },
13267
+ slotPolicies: { body: bodyReadablePolicy, heading: displayHeadingPolicy },
13268
+ typography: boldDisplayTypography,
13269
+ heroTypography: {
13270
+ headlineSize: "6xl",
13271
+ headlineLineHeight: "tight",
13272
+ subheadlineSize: "editorial",
13273
+ subheadlineLineHeight: "normal",
13274
+ microHeadlineSize: "6xl",
13275
+ microHeadlineLineHeight: "tight",
13276
+ microSubheadlineSize: "xl",
13277
+ microSubheadlineLineHeight: "normal",
13278
+ responsive: {
13279
+ tablet: { headlineSize: "5xl" },
13280
+ mobile: { headlineSize: "4xl", subheadlineSize: "xl" }
13281
+ }
13282
+ }
13283
+ })
13284
+ ];
13285
+ typographyPresetsById = new Map(
13286
+ typographyPresets.map((preset2) => [preset2.id, preset2])
13287
+ );
13288
+ }
13289
+ });
13290
+
12277
13291
  // ../theme-core/src/site-styles/curatedSiteStyles.ts
12278
13292
  function uniqueContentFrameKinds() {
12279
- const kinds = [...new Set(
12280
- generatedDesignOptionCatalog.contentFrames.map((frame) => frame.kind)
12281
- )];
13293
+ const kinds = [
13294
+ ...new Set(
13295
+ generatedDesignOptionCatalog.contentFrames.map((frame) => frame.kind)
13296
+ )
13297
+ ];
12282
13298
  const firstKind = kinds[0];
12283
13299
  if (!firstKind) {
12284
- throw new Error("Expected generated design option catalog to expose at least one content frame kind.");
13300
+ throw new Error(
13301
+ "Expected generated design option catalog to expose at least one content frame kind."
13302
+ );
12285
13303
  }
12286
13304
  return [firstKind, ...kinds.slice(1)];
12287
13305
  }
12288
13306
  function defineCuratedSiteStyle(input) {
13307
+ const legacyHeaderLookIds = input.recommendedHeaderLookIds ?? ["clean-base"];
13308
+ const inferredHeaderCuration = inferHeaderCurationFromLegacyLooks(legacyHeaderLookIds);
13309
+ const typographyPresetChoices = input.typographyPresetChoices ?? defaultTypographyPresetChoicesForRecipe(input.tokenRecipes.typography);
13310
+ const defaultTypographyPresetId = input.defaultTypographyPresetId ? asTypographyPresetId(input.defaultTypographyPresetId) : typographyPresetChoices[0].id;
13311
+ if (!typographyPresetChoices.some(
13312
+ (choice) => choice.id === defaultTypographyPresetId
13313
+ )) {
13314
+ throw new Error(
13315
+ `Default typography preset ${defaultTypographyPresetId} is not curated for site style ${input.id}.`
13316
+ );
13317
+ }
12289
13318
  return {
12290
13319
  id: asSiteStyleId(input.id),
12291
13320
  name: input.name,
12292
13321
  description: input.description,
12293
13322
  generationBrief: input.generationBrief,
12294
13323
  selectionKeywordRules: input.selectionKeywordRules ?? [],
12295
- siteCreatorSelection: input.siteCreatorSelection ?? { kind: "explicit_only" },
13324
+ siteCreatorSelection: input.siteCreatorSelection ?? {
13325
+ kind: "explicit_only"
13326
+ },
12296
13327
  template: {
12297
- id: asDesignSystemTemplateId(`template:${input.id.replace("site-style:", "")}`),
13328
+ id: asDesignSystemTemplateId(
13329
+ `template:${input.id.replace("site-style:", "")}`
13330
+ ),
12298
13331
  name: input.name,
12299
13332
  version: 1,
12300
13333
  tokenRecipes: input.tokenRecipes,
@@ -12306,11 +13339,27 @@ function defineCuratedSiteStyle(input) {
12306
13339
  },
12307
13340
  ...input.themeOverrides ? { themeOverrides: input.themeOverrides } : {},
12308
13341
  recommendedAppearancePresetIds: (input.recommendedAppearancePresetIds ?? []).map(asAppearancePresetId),
12309
- recommendedHeaderLookIds: (input.recommendedHeaderLookIds ?? ["clean-base"]).map(asHeaderLookId),
13342
+ defaultHeaderSelection: input.defaultHeaderSelection ? {
13343
+ layoutId: asHeaderLayoutId(input.defaultHeaderSelection.layoutId),
13344
+ styleId: asHeaderStyleId(input.defaultHeaderSelection.styleId)
13345
+ } : inferredHeaderCuration.defaultHeaderSelection,
13346
+ recommendedHeaderLayoutChoices: input.recommendedHeaderLayoutChoices ?? inferredHeaderCuration.recommendedHeaderLayoutChoices,
13347
+ recommendedHeaderStyleChoicesByLayout: input.recommendedHeaderStyleChoicesByLayout ?? inferredHeaderCuration.recommendedHeaderStyleChoicesByLayout,
13348
+ discouragedHeaderSelections: input.discouragedHeaderSelections?.map(
13349
+ (selection) => ({
13350
+ layoutId: asHeaderLayoutId(selection.layoutId),
13351
+ styleId: asHeaderStyleId(selection.styleId)
13352
+ })
13353
+ ),
13354
+ recommendedHeaderLookIds: legacyHeaderLookIds.map(asHeaderLookId),
12310
13355
  // Empty is intentional: resolveFooterLook always appends its guaranteed fallback.
12311
- recommendedFooterLookIds: (input.recommendedFooterLookIds ?? []).map(asFooterLookId),
13356
+ recommendedFooterLookIds: (input.recommendedFooterLookIds ?? []).map(
13357
+ asFooterLookId
13358
+ ),
12312
13359
  buttonPersonalityChoices: input.buttonPersonalityChoices,
12313
- paletteVariantChoices: input.paletteVariantChoices
13360
+ paletteVariantChoices: input.paletteVariantChoices,
13361
+ typographyPresetChoices,
13362
+ defaultTypographyPresetId
12314
13363
  };
12315
13364
  }
12316
13365
  function buttonChoice(id, note) {
@@ -12319,6 +13368,87 @@ function buttonChoice(id, note) {
12319
13368
  function paletteChoice(id, note) {
12320
13369
  return note ? { id: asPaletteVariantId(id), note } : { id: asPaletteVariantId(id) };
12321
13370
  }
13371
+ function headerLayoutChoice(id, note) {
13372
+ return note ? { id: asHeaderLayoutId(id), note } : { id: asHeaderLayoutId(id) };
13373
+ }
13374
+ function headerStyleChoice(id, note) {
13375
+ return note ? { id: asHeaderStyleId(id), note } : { id: asHeaderStyleId(id) };
13376
+ }
13377
+ function unbrandHeaderLayoutId(id) {
13378
+ return id;
13379
+ }
13380
+ function uniqueHeaderLayoutChoices(choices) {
13381
+ const seen = /* @__PURE__ */ new Set();
13382
+ const unique = choices.filter((choice) => {
13383
+ if (seen.has(choice.id)) return false;
13384
+ seen.add(choice.id);
13385
+ return true;
13386
+ });
13387
+ const first = unique[0];
13388
+ if (!first) {
13389
+ throw new Error("Expected at least one curated header layout choice.");
13390
+ }
13391
+ return [first, ...unique.slice(1)];
13392
+ }
13393
+ function nonEmptyHeaderStyleChoices(choices, fallbackLayoutId) {
13394
+ const first = choices[0] ?? {
13395
+ id: getCompatibleHeaderStyleIds(fallbackLayoutId)[0] ?? asHeaderStyleId("minimal")
13396
+ };
13397
+ return [first, ...choices.slice(1)];
13398
+ }
13399
+ function inferHeaderCurationFromLegacyLooks(lookIds) {
13400
+ const selections = lookIds.map((lookId) => resolveLegacyHeaderLookAlias(asHeaderLookId(lookId))).filter(
13401
+ (selection) => Boolean(selection)
13402
+ );
13403
+ const defaultHeaderSelection = selections[0] ?? {
13404
+ layoutId: asHeaderLayoutId("classic"),
13405
+ styleId: asHeaderStyleId("minimal")
13406
+ };
13407
+ const layoutChoices = uniqueHeaderLayoutChoices(
13408
+ selections.map((selection) => headerLayoutChoice(selection.layoutId))
13409
+ );
13410
+ const stylesByLayout = {};
13411
+ for (const layoutChoice of layoutChoices) {
13412
+ const styleChoices = selections.filter((selection) => selection.layoutId === layoutChoice.id).map((selection) => headerStyleChoice(selection.styleId));
13413
+ stylesByLayout[unbrandHeaderLayoutId(layoutChoice.id)] = nonEmptyHeaderStyleChoices(styleChoices, layoutChoice.id);
13414
+ }
13415
+ return {
13416
+ defaultHeaderSelection,
13417
+ recommendedHeaderLayoutChoices: layoutChoices,
13418
+ recommendedHeaderStyleChoicesByLayout: stylesByLayout
13419
+ };
13420
+ }
13421
+ function typographyChoice(id, note) {
13422
+ return note ? { id: asTypographyPresetId(id), note } : { id: asTypographyPresetId(id) };
13423
+ }
13424
+ function defaultTypographyPresetChoicesForRecipe(recipe) {
13425
+ switch (recipe) {
13426
+ case "clean-sans":
13427
+ return [
13428
+ typographyChoice("typography-preset:modern-sans"),
13429
+ typographyChoice("typography-preset:luxe-contrast"),
13430
+ typographyChoice("typography-preset:bold-display")
13431
+ ];
13432
+ case "friendly-sans":
13433
+ return [
13434
+ typographyChoice("typography-preset:warm-rounded"),
13435
+ typographyChoice("typography-preset:modern-sans"),
13436
+ typographyChoice("typography-preset:editorial-serif")
13437
+ ];
13438
+ case "serif-editorial":
13439
+ return [
13440
+ typographyChoice("typography-preset:editorial-serif"),
13441
+ typographyChoice("typography-preset:classic-serif"),
13442
+ typographyChoice("typography-preset:warm-rounded")
13443
+ ];
13444
+ case "classic-serif":
13445
+ return [
13446
+ typographyChoice("typography-preset:classic-serif"),
13447
+ typographyChoice("typography-preset:luxe-contrast"),
13448
+ typographyChoice("typography-preset:editorial-serif")
13449
+ ];
13450
+ }
13451
+ }
12322
13452
  var curatedSiteStyleIdValues, quietBudget, balancedBudget, expressiveBudget, expressiveUnderlineInputs, generatedContentFrameKinds, curatedSiteStyles, curatedSiteStylesById;
12323
13453
  var init_curatedSiteStyles = __esm({
12324
13454
  "../theme-core/src/site-styles/curatedSiteStyles.ts"() {
@@ -12330,6 +13460,7 @@ var init_curatedSiteStyles = __esm({
12330
13460
  init_curatedChoices();
12331
13461
  init_sourceCatalogs();
12332
13462
  init_types2();
13463
+ init_typographyPresets();
12333
13464
  curatedSiteStyleIdValues = [
12334
13465
  "site-style:calm-studio",
12335
13466
  "site-style:clear-professional",
@@ -12341,6 +13472,7 @@ var init_curatedSiteStyles = __esm({
12341
13472
  "site-style:personal-retreat-journal",
12342
13473
  "site-style:tactile-workshop",
12343
13474
  "site-style:modern-wellness",
13475
+ "site-style:soft-earth",
12344
13476
  "site-style:bold-launch",
12345
13477
  "site-style:south-west-twerk-school"
12346
13478
  ];
@@ -12422,7 +13554,11 @@ var init_curatedSiteStyles = __esm({
12422
13554
  motion: "subtle"
12423
13555
  },
12424
13556
  compositionBudget: quietBudget,
12425
- recommendedHeaderLookIds: ["centered-calm", "minimal-transparent", "clean-base"],
13557
+ recommendedHeaderLookIds: [
13558
+ "centered-calm",
13559
+ "minimal-transparent",
13560
+ "clean-base"
13561
+ ],
12426
13562
  buttonPersonalityChoices: [
12427
13563
  buttonChoice("soft-pill"),
12428
13564
  buttonChoice("pebble"),
@@ -12451,7 +13587,11 @@ var init_curatedSiteStyles = __esm({
12451
13587
  motion: "subtle"
12452
13588
  },
12453
13589
  compositionBudget: balancedBudget,
12454
- recommendedHeaderLookIds: ["practical-utility", "brand-solid", "clean-base"],
13590
+ recommendedHeaderLookIds: [
13591
+ "practical-utility",
13592
+ "brand-solid",
13593
+ "clean-base"
13594
+ ],
12455
13595
  buttonPersonalityChoices: [
12456
13596
  buttonChoice("confident-chip"),
12457
13597
  buttonChoice("soft-pill"),
@@ -12478,7 +13618,11 @@ var init_curatedSiteStyles = __esm({
12478
13618
  motion: "subtle"
12479
13619
  },
12480
13620
  compositionBudget: balancedBudget,
12481
- recommendedHeaderLookIds: ["editorial-line", "minimal-transparent", "centered-calm"],
13621
+ recommendedHeaderLookIds: [
13622
+ "serif-line",
13623
+ "minimal-transparent",
13624
+ "centered-calm"
13625
+ ],
12482
13626
  buttonPersonalityChoices: [
12483
13627
  buttonChoice("editorial-link"),
12484
13628
  buttonChoice("soft-pill"),
@@ -12506,7 +13650,11 @@ var init_curatedSiteStyles = __esm({
12506
13650
  motion: "expressive"
12507
13651
  },
12508
13652
  compositionBudget: balancedBudget,
12509
- recommendedHeaderLookIds: ["brand-solid", "practical-utility", "clean-base"],
13653
+ recommendedHeaderLookIds: [
13654
+ "brand-solid",
13655
+ "practical-utility",
13656
+ "clean-base"
13657
+ ],
12510
13658
  buttonPersonalityChoices: [
12511
13659
  buttonChoice("pebble"),
12512
13660
  buttonChoice("brushed-wash"),
@@ -12523,7 +13671,10 @@ var init_curatedSiteStyles = __esm({
12523
13671
  name: "Quiet Luxury",
12524
13672
  description: "Minimal, confident, and refined for premium experiences and private services.",
12525
13673
  generationBrief: "Use fewer claims, more specificity, and restrained sensory detail. Favor elegant media and low repetition over dense panels.",
12526
- siteCreatorSelection: { kind: "site_creator_keyword_heuristic", priority: 20 },
13674
+ siteCreatorSelection: {
13675
+ kind: "site_creator_keyword_heuristic",
13676
+ priority: 20
13677
+ },
12527
13678
  selectionKeywordRules: [
12528
13679
  { kind: "word", value: "luxury" },
12529
13680
  { kind: "word", value: "premium" },
@@ -12541,7 +13692,11 @@ var init_curatedSiteStyles = __esm({
12541
13692
  motion: "none"
12542
13693
  },
12543
13694
  compositionBudget: quietBudget,
12544
- recommendedHeaderLookIds: ["minimal-transparent", "editorial-line", "clean-base"],
13695
+ recommendedHeaderLookIds: [
13696
+ "minimal-transparent",
13697
+ "serif-line",
13698
+ "clean-base"
13699
+ ],
12545
13700
  buttonPersonalityChoices: [
12546
13701
  buttonChoice("editorial-link"),
12547
13702
  buttonChoice("confident-chip"),
@@ -12577,7 +13732,11 @@ var init_curatedSiteStyles = __esm({
12577
13732
  motion: "none"
12578
13733
  },
12579
13734
  compositionBudget: quietBudget,
12580
- recommendedHeaderLookIds: ["practical-utility", "brand-solid", "clean-base"],
13735
+ recommendedHeaderLookIds: [
13736
+ "practical-utility",
13737
+ "brand-solid",
13738
+ "clean-base"
13739
+ ],
12581
13740
  buttonPersonalityChoices: [
12582
13741
  buttonChoice("confident-chip"),
12583
13742
  buttonChoice("pebble"),
@@ -12604,7 +13763,11 @@ var init_curatedSiteStyles = __esm({
12604
13763
  motion: "subtle"
12605
13764
  },
12606
13765
  compositionBudget: balancedBudget,
12607
- recommendedHeaderLookIds: ["centered-calm", "minimal-transparent", "clean-base"],
13766
+ recommendedHeaderLookIds: [
13767
+ "centered-calm",
13768
+ "minimal-transparent",
13769
+ "clean-base"
13770
+ ],
12608
13771
  buttonPersonalityChoices: [
12609
13772
  buttonChoice("soft-pill"),
12610
13773
  buttonChoice("pebble"),
@@ -12621,7 +13784,10 @@ var init_curatedSiteStyles = __esm({
12621
13784
  name: "Quiet Practice",
12622
13785
  description: "Grounded, calm, and practical for small appointment-first practices.",
12623
13786
  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.",
12624
- siteCreatorSelection: { kind: "site_creator_keyword_heuristic", priority: 30 },
13787
+ siteCreatorSelection: {
13788
+ kind: "site_creator_keyword_heuristic",
13789
+ priority: 30
13790
+ },
12625
13791
  selectionKeywordRules: [
12626
13792
  { kind: "substring", value: "massage" },
12627
13793
  { kind: "word", value: "bodywork" },
@@ -12642,7 +13808,11 @@ var init_curatedSiteStyles = __esm({
12642
13808
  motion: "subtle"
12643
13809
  },
12644
13810
  compositionBudget: quietBudget,
12645
- recommendedHeaderLookIds: ["practical-utility", "clean-base", "centered-calm"],
13811
+ recommendedHeaderLookIds: [
13812
+ "practical-utility",
13813
+ "clean-base",
13814
+ "centered-calm"
13815
+ ],
12646
13816
  buttonPersonalityChoices: [
12647
13817
  buttonChoice("pebble"),
12648
13818
  buttonChoice("soft-pill"),
@@ -12659,7 +13829,10 @@ var init_curatedSiteStyles = __esm({
12659
13829
  name: "Personal Retreat Journal",
12660
13830
  description: "Warm, story-led, and readable for solo practitioners with mixed offers.",
12661
13831
  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.",
12662
- siteCreatorSelection: { kind: "site_creator_keyword_heuristic", priority: 40 },
13832
+ siteCreatorSelection: {
13833
+ kind: "site_creator_keyword_heuristic",
13834
+ priority: 40
13835
+ },
12663
13836
  selectionKeywordRules: [
12664
13837
  { kind: "substring", value: "retreat" },
12665
13838
  { kind: "phrase", value: "solo practitioner" },
@@ -12679,7 +13852,11 @@ var init_curatedSiteStyles = __esm({
12679
13852
  motion: "subtle"
12680
13853
  },
12681
13854
  compositionBudget: balancedBudget,
12682
- recommendedHeaderLookIds: ["editorial-line", "centered-calm", "minimal-transparent"],
13855
+ recommendedHeaderLookIds: [
13856
+ "serif-line",
13857
+ "centered-calm",
13858
+ "minimal-transparent"
13859
+ ],
12683
13860
  buttonPersonalityChoices: [
12684
13861
  buttonChoice("editorial-link"),
12685
13862
  buttonChoice("soft-pill"),
@@ -12696,7 +13873,10 @@ var init_curatedSiteStyles = __esm({
12696
13873
  name: "Tactile Workshop",
12697
13874
  description: "Bright, hands-on, and image-led for maker studios, workshops, and creative classes.",
12698
13875
  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.",
12699
- siteCreatorSelection: { kind: "site_creator_keyword_heuristic", priority: 50 },
13876
+ siteCreatorSelection: {
13877
+ kind: "site_creator_keyword_heuristic",
13878
+ priority: 50
13879
+ },
12700
13880
  selectionKeywordRules: [
12701
13881
  { kind: "substring", value: "ceramic" },
12702
13882
  { kind: "word", value: "pottery" },
@@ -12715,20 +13895,133 @@ var init_curatedSiteStyles = __esm({
12715
13895
  spacing: "regular",
12716
13896
  motion: "subtle"
12717
13897
  },
12718
- compositionBudget: balancedBudget,
12719
- recommendedHeaderLookIds: ["brand-solid", "practical-utility", "clean-base"],
12720
- recommendedFooterLookIds: ["site-footer-brand-two-band", "footer-muted-grounding"],
13898
+ compositionBudget: balancedBudget,
13899
+ recommendedHeaderLookIds: [
13900
+ "brand-solid",
13901
+ "practical-utility",
13902
+ "clean-base"
13903
+ ],
13904
+ recommendedFooterLookIds: [
13905
+ "site-footer-brand-two-band",
13906
+ "footer-muted-grounding"
13907
+ ],
13908
+ buttonPersonalityChoices: [
13909
+ buttonChoice("pebble"),
13910
+ buttonChoice("confident-chip"),
13911
+ buttonChoice("ink-stamp"),
13912
+ buttonChoice("editorial-link")
13913
+ ],
13914
+ paletteVariantChoices: [
13915
+ paletteChoice("brand-led-warm"),
13916
+ paletteChoice("brand-led-cool"),
13917
+ paletteChoice("soft-natural-watercolor"),
13918
+ paletteChoice("warm-neutral-clay")
13919
+ ]
13920
+ }),
13921
+ defineCuratedSiteStyle({
13922
+ id: "site-style:soft-earth",
13923
+ name: "Soft Earth",
13924
+ description: "Warm, grounded, and editorial for yoga studios, retreats, and wellbeing communities.",
13925
+ 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.",
13926
+ siteCreatorSelection: {
13927
+ kind: "site_creator_keyword_heuristic",
13928
+ priority: 45
13929
+ },
13930
+ selectionKeywordRules: [
13931
+ { kind: "word", value: "meditation" },
13932
+ { kind: "word", value: "wellbeing" },
13933
+ { kind: "substring", value: "retreat" },
13934
+ { kind: "phrase", value: "yoga studio" },
13935
+ { kind: "phrase", value: "mindful movement" }
13936
+ ],
13937
+ tokenRecipes: {
13938
+ palette: "warm-neutral",
13939
+ contrast: "standard",
13940
+ radius: "soft",
13941
+ shadow: "subtle",
13942
+ typography: "serif-editorial",
13943
+ spacing: "airy",
13944
+ motion: "subtle"
13945
+ },
13946
+ compositionBudget: balancedBudget,
13947
+ themeOverrides: {
13948
+ typography: {
13949
+ body: {
13950
+ family: "Inter, system-ui, sans-serif",
13951
+ size: "md",
13952
+ weight: "regular",
13953
+ lineHeight: "relaxed",
13954
+ letterSpacing: "normal"
13955
+ },
13956
+ headings: {
13957
+ default: {
13958
+ family: '"Cormorant Garamond", Georgia, serif',
13959
+ weight: "regular",
13960
+ lineHeight: "normal",
13961
+ letterSpacing: "normal",
13962
+ colorToken: "text",
13963
+ italic: null,
13964
+ case: null
13965
+ },
13966
+ h1: {
13967
+ size: "xl",
13968
+ weight: "regular",
13969
+ lineHeight: "normal",
13970
+ letterSpacing: "normal",
13971
+ italic: null
13972
+ },
13973
+ h2: {
13974
+ size: "lg",
13975
+ weight: "regular",
13976
+ lineHeight: "normal",
13977
+ letterSpacing: "normal",
13978
+ italic: null
13979
+ },
13980
+ h3: {
13981
+ size: "md",
13982
+ weight: "regular",
13983
+ lineHeight: "normal",
13984
+ letterSpacing: "normal",
13985
+ italic: null
13986
+ }
13987
+ },
13988
+ scale: "majorThird"
13989
+ },
13990
+ bodyText: {
13991
+ intro: {
13992
+ paragraphSize: "default",
13993
+ headingSize: "editorial"
13994
+ }
13995
+ }
13996
+ },
13997
+ recommendedAppearancePresetIds: [
13998
+ "hero-brand-scrim",
13999
+ "intro-soft-earth-statement",
14000
+ "feature-cards-soft-earth-offerings",
14001
+ "testimonials-soft-earth-proof-band",
14002
+ "faq-soft-earth-two-column",
14003
+ "contact-form-panel"
14004
+ ],
14005
+ recommendedHeaderLookIds: [
14006
+ "centered-calm",
14007
+ "minimal-transparent",
14008
+ "serif-line"
14009
+ ],
14010
+ recommendedFooterLookIds: [
14011
+ "footer-muted-grounding",
14012
+ "site-footer-brand-two-band"
14013
+ ],
12721
14014
  buttonPersonalityChoices: [
14015
+ buttonChoice("earth-pill"),
14016
+ buttonChoice("soft-pill"),
12722
14017
  buttonChoice("pebble"),
12723
- buttonChoice("confident-chip"),
12724
- buttonChoice("ink-stamp"),
12725
14018
  buttonChoice("editorial-link")
12726
14019
  ],
12727
14020
  paletteVariantChoices: [
12728
- paletteChoice("brand-led-warm"),
12729
- paletteChoice("brand-led-cool"),
12730
- paletteChoice("soft-natural-watercolor"),
12731
- paletteChoice("warm-neutral-clay")
14021
+ paletteChoice("warm-neutral-soft-earth"),
14022
+ paletteChoice("warm-neutral-clay"),
14023
+ paletteChoice("warm-neutral-forest"),
14024
+ paletteChoice("soft-natural-sage")
12732
14025
  ]
12733
14026
  }),
12734
14027
  defineCuratedSiteStyle({
@@ -12736,7 +14029,10 @@ var init_curatedSiteStyles = __esm({
12736
14029
  name: "Bold Launch",
12737
14030
  description: "High-energy and punchy for launches, campaigns, and creative offers.",
12738
14031
  generationBrief: "Use crisp positioning, bold hero structure, strong calls to action, and confident visual rhythm. Keep it precise, not shouty.",
12739
- siteCreatorSelection: { kind: "site_creator_keyword_heuristic", priority: 10 },
14032
+ siteCreatorSelection: {
14033
+ kind: "site_creator_keyword_heuristic",
14034
+ priority: 10
14035
+ },
12740
14036
  selectionKeywordRules: [
12741
14037
  { kind: "substring", value: "launch" },
12742
14038
  { kind: "substring", value: "campaign" },
@@ -12755,7 +14051,11 @@ var init_curatedSiteStyles = __esm({
12755
14051
  motion: "expressive"
12756
14052
  },
12757
14053
  compositionBudget: expressiveBudget,
12758
- recommendedHeaderLookIds: ["transparent-overlay", "floating-glass", "brand-solid"],
14054
+ recommendedHeaderLookIds: [
14055
+ "transparent-overlay",
14056
+ "floating-glass",
14057
+ "brand-solid"
14058
+ ],
12759
14059
  buttonPersonalityChoices: [
12760
14060
  buttonChoice("ink-stamp"),
12761
14061
  buttonChoice("confident-chip"),
@@ -12784,49 +14084,13 @@ var init_curatedSiteStyles = __esm({
12784
14084
  motion: "expressive"
12785
14085
  },
12786
14086
  compositionBudget: expressiveBudget,
14087
+ typographyPresetChoices: [
14088
+ typographyChoice("typography-preset:bold-display"),
14089
+ typographyChoice("typography-preset:modern-sans"),
14090
+ typographyChoice("typography-preset:luxe-contrast")
14091
+ ],
14092
+ defaultTypographyPresetId: "typography-preset:bold-display",
12787
14093
  themeOverrides: {
12788
- typography: {
12789
- body: {
12790
- family: "Manrope, system-ui, sans-serif",
12791
- size: "lg",
12792
- weight: "regular",
12793
- lineHeight: "relaxed",
12794
- letterSpacing: "normal"
12795
- },
12796
- headings: {
12797
- default: {
12798
- family: '"TAN - PEARL", sans-serif',
12799
- weight: "bold",
12800
- lineHeight: "normal",
12801
- letterSpacing: "tight",
12802
- colorToken: "primary",
12803
- italic: null,
12804
- case: null
12805
- },
12806
- h1: {
12807
- size: "xl",
12808
- weight: "bold",
12809
- lineHeight: "normal",
12810
- letterSpacing: "tight",
12811
- italic: null
12812
- },
12813
- h2: {
12814
- size: "lg",
12815
- weight: "bold",
12816
- lineHeight: "normal",
12817
- letterSpacing: "normal",
12818
- italic: null
12819
- },
12820
- h3: {
12821
- size: "md",
12822
- weight: "bold",
12823
- lineHeight: "normal",
12824
- letterSpacing: "normal",
12825
- italic: null
12826
- }
12827
- },
12828
- scale: "balanced"
12829
- },
12830
14094
  bodyText: {
12831
14095
  intro: {
12832
14096
  paragraphSize: "editorial",
@@ -12842,8 +14106,15 @@ var init_curatedSiteStyles = __esm({
12842
14106
  "testimonials-accent-quote-proof",
12843
14107
  "contact-form-brand-depth-card"
12844
14108
  ],
12845
- recommendedHeaderLookIds: ["brand-solid", "transparent-overlay", "practical-utility"],
12846
- recommendedFooterLookIds: ["site-footer-brand-two-band", "footer-muted-grounding"],
14109
+ recommendedHeaderLookIds: [
14110
+ "brand-solid",
14111
+ "transparent-overlay",
14112
+ "practical-utility"
14113
+ ],
14114
+ recommendedFooterLookIds: [
14115
+ "site-footer-brand-two-band",
14116
+ "footer-muted-grounding"
14117
+ ],
12847
14118
  buttonPersonalityChoices: [
12848
14119
  buttonChoice("showtime-pill"),
12849
14120
  buttonChoice("confident-chip"),
@@ -13340,6 +14611,7 @@ var init_previewCompiler = __esm({
13340
14611
  init_variants();
13341
14612
  init_curatedChoices();
13342
14613
  init_curatedSiteStyles();
14614
+ init_typographyPresets();
13343
14615
  init_resolver2();
13344
14616
  init_types2();
13345
14617
  init_footerLooks();
@@ -13353,6 +14625,7 @@ var init_previewCompiler = __esm({
13353
14625
  init_runtimeCompiler();
13354
14626
  init_curatedChoices();
13355
14627
  init_curatedSiteStyles();
14628
+ init_typographyPresets();
13356
14629
  init_types2();
13357
14630
  }
13358
14631
  });
@@ -13633,6 +14906,13 @@ var init_pageDesignEditorErrors = __esm({
13633
14906
  }
13634
14907
  });
13635
14908
 
14909
+ // ../theme-core/src/site-styles/persistedIdParseResult.ts
14910
+ var init_persistedIdParseResult = __esm({
14911
+ "../theme-core/src/site-styles/persistedIdParseResult.ts"() {
14912
+ "use strict";
14913
+ }
14914
+ });
14915
+
13636
14916
  // ../theme-core/src/site-styles/tokenRecipes.ts
13637
14917
  import { z as z29 } from "zod";
13638
14918
  var themeTokenRecipeOptions, themeTokenRecipesSchema;
@@ -13690,6 +14970,7 @@ var init_site_styles = __esm({
13690
14970
  init_pageDesignEditorModel();
13691
14971
  init_pageDesignIntent();
13692
14972
  init_previewCustomization();
14973
+ init_persistedIdParseResult();
13693
14974
  init_rawStyleFields();
13694
14975
  init_records();
13695
14976
  init_resolver2();
@@ -13698,6 +14979,7 @@ var init_site_styles = __esm({
13698
14979
  init_sourceCatalogs();
13699
14980
  init_styleTags();
13700
14981
  init_tokenRecipes();
14982
+ init_typographyPresets();
13701
14983
  init_types2();
13702
14984
  }
13703
14985
  });
@@ -17869,8 +19151,9 @@ var init_faqAccordion = __esm({
17869
19151
  },
17870
19152
  fallback: "rb-faq-item"
17871
19153
  },
17872
- iconStyle: { $bind: { from: "theme.accordions.icon.style" } }
17873
- // Pass icon style from theme
19154
+ iconStyle: { $bind: { from: "theme.accordions.icon.style" } },
19155
+ // Legacy theme accordion style
19156
+ iconTreatment: { $bind: { from: "content._sectionStyles.accordionIconTreatment" } }
17874
19157
  },
17875
19158
  triggerFrom: "faqItem.question",
17876
19159
  contentFrom: "faqItem.answer"
@@ -19381,25 +20664,376 @@ var init_hero = __esm({
19381
20664
  intent: "style"
19382
20665
  })
19383
20666
  ],
19384
- layout: classicLayout,
20667
+ layout: classicLayout,
20668
+ variants: {
20669
+ classic: classicLayout,
20670
+ micro: microLayout,
20671
+ split: splitLayout,
20672
+ splitReverse: splitReverseLayout
20673
+ },
20674
+ defaultVariant: "classic",
20675
+ description: "Hero section with headline, subtitle, and repeatable CTAs.",
20676
+ tags: ["header", "banner", "landing", "introduction", "welcome", "splash", "headline"],
20677
+ icon: "Sparkles",
20678
+ styleTokens: {
20679
+ typography: "display",
20680
+ spacing: "xl"
20681
+ }
20682
+ };
20683
+ heroManifest = createBlockManifest(heroConfig);
20684
+ heroBlockDefinition = {
20685
+ manifest: heroManifest
20686
+ };
20687
+ }
20688
+ });
20689
+
20690
+ // ../blocks/src/system/fields/aspectRatio.ts
20691
+ function createAspectRatioField(options = {}) {
20692
+ return {
20693
+ id: options.id ?? "aspectRatio",
20694
+ type: "select",
20695
+ label: options.label ?? "Aspect ratio",
20696
+ ...options.description ? { description: options.description } : {},
20697
+ required: false,
20698
+ defaultValue: options.defaultValue ?? "auto",
20699
+ multiple: false,
20700
+ options: [...standardAspectRatioOptions],
20701
+ ui: {
20702
+ intent: options.uiIntent ?? "display",
20703
+ ...options.visibleWhen ? { visibleWhen: options.visibleWhen } : {}
20704
+ }
20705
+ };
20706
+ }
20707
+ var standardAspectRatioOptions;
20708
+ var init_aspectRatio = __esm({
20709
+ "../blocks/src/system/fields/aspectRatio.ts"() {
20710
+ "use strict";
20711
+ standardAspectRatioOptions = [
20712
+ { value: "auto", label: "Auto (original)" },
20713
+ { value: "16/9", label: "16:9 (Landscape)" },
20714
+ { value: "4/3", label: "4:3 (Standard)" },
20715
+ { value: "1/1", label: "1:1 (Square)" },
20716
+ { value: "3/4", label: "3:4 (Portrait)" }
20717
+ ];
20718
+ }
20719
+ });
20720
+
20721
+ // ../blocks/src/system/fields/imageLayout.ts
20722
+ function createImageColSizeField(options = {}) {
20723
+ const {
20724
+ id = "imageColSize",
20725
+ label = "Image column size",
20726
+ description = "Controls how large the image/thumbnail column is at desktop breakpoints.",
20727
+ defaultValue = "1/3",
20728
+ uiIntent = "display",
20729
+ visibleWhen
20730
+ } = options;
20731
+ return {
20732
+ id,
20733
+ type: "select",
20734
+ label,
20735
+ description,
20736
+ required: false,
20737
+ defaultValue,
20738
+ multiple: false,
20739
+ options: [
20740
+ { value: "1/4", label: "Small (1/4)" },
20741
+ { value: "1/3", label: "Medium (1/3)" },
20742
+ { value: "2/5", label: "Large (2/5)" },
20743
+ { value: "1/2", label: "Extra large (1/2)" },
20744
+ { value: "2/3", label: "Huge (2/3)" }
20745
+ ],
20746
+ ui: {
20747
+ intent: uiIntent,
20748
+ ...visibleWhen ? { visibleWhen } : {}
20749
+ }
20750
+ };
20751
+ }
20752
+ function createImagePositionField(options = {}) {
20753
+ const {
20754
+ id = "imagePosition",
20755
+ label = "Image position",
20756
+ description = "Choose which side the image appears on.",
20757
+ defaultValue = "left",
20758
+ includeAlternate = false,
20759
+ uiIntent = "display",
20760
+ visibleWhen
20761
+ } = options;
20762
+ const positionOptions = [
20763
+ { value: "left", label: "Left" },
20764
+ { value: "right", label: "Right" },
20765
+ ...includeAlternate ? [{ value: "alternate", label: "Alternate" }] : []
20766
+ ];
20767
+ return {
20768
+ id,
20769
+ type: "select",
20770
+ label,
20771
+ description,
20772
+ required: false,
20773
+ defaultValue,
20774
+ multiple: false,
20775
+ // Spread to get a mutable array type without unsafe casts.
20776
+ options: [...positionOptions],
20777
+ ui: {
20778
+ intent: uiIntent,
20779
+ ...visibleWhen ? { visibleWhen } : {}
20780
+ }
20781
+ };
20782
+ }
20783
+ var init_imageLayout = __esm({
20784
+ "../blocks/src/system/fields/imageLayout.ts"() {
20785
+ "use strict";
20786
+ }
20787
+ });
20788
+
20789
+ // ../blocks/src/system/blocks/intro.ts
20790
+ function introHeading(className) {
20791
+ return text(
20792
+ {
20793
+ as: "h2",
20794
+ className
20795
+ },
20796
+ when("content.title"),
20797
+ bind("content.title")
20798
+ );
20799
+ }
20800
+ function introBody(className = "rb-prose rb-max-w-none") {
20801
+ return richText({ className }, bind("content.body"));
20802
+ }
20803
+ function introCtas(justify = "start") {
20804
+ return ctaRow({
20805
+ justify,
20806
+ gap: "md",
20807
+ containerClassName: "rb-mt-2"
20808
+ });
20809
+ }
20810
+ function introCopyStack(options = {}) {
20811
+ return stack(
20812
+ {
20813
+ gap: "md",
20814
+ className: options.className ?? "rb-intro-copy"
20815
+ },
20816
+ [
20817
+ introHeading(options.headingClassName ?? "rb-intro-title"),
20818
+ introBody(options.bodyClassName),
20819
+ introCtas(options.ctaJustify)
20820
+ ]
20821
+ );
20822
+ }
20823
+ var introMedia, centeredCopyLayout, statementCopyLayout, statementMediaLayout, mediaCopyLayout, introConfig, introManifest, introBlockDefinition;
20824
+ var init_intro = __esm({
20825
+ "../blocks/src/system/blocks/intro.ts"() {
20826
+ "use strict";
20827
+ init_defineBlock();
20828
+ init_aspectRatio();
20829
+ init_ctas();
20830
+ init_imageLayout();
20831
+ init_builder();
20832
+ init_fragments();
20833
+ introMedia = media(
20834
+ {
20835
+ className: "rb-intro-media rb-w-full rb-h-auto rb-object-cover",
20836
+ style: {
20837
+ aspectRatio: { $bind: { from: "content.aspectRatio" } }
20838
+ }
20839
+ },
20840
+ bind("content.media")
20841
+ );
20842
+ centeredCopyLayout = styledSection({
20843
+ children: styledContainer({
20844
+ rootType: "stack",
20845
+ rootProps: { gap: "lg" },
20846
+ children: [
20847
+ introCopyStack({
20848
+ className: "rb-intro-copy rb-mx-auto rb-max-w-3xl rb-text-center",
20849
+ headingClassName: "rb-intro-title rb-text-center",
20850
+ bodyClassName: "rb-prose rb-mx-auto rb-max-w-none",
20851
+ ctaJustify: "center"
20852
+ })
20853
+ ]
20854
+ }),
20855
+ baseClass: "",
20856
+ spacing: "medium"
20857
+ });
20858
+ statementCopyLayout = styledSection({
20859
+ children: styledContainer({
20860
+ children: [
20861
+ el(
20862
+ "div",
20863
+ {
20864
+ className: "rb-intro rb-intro-statement rb-grid rb-grid-cols-1 rb-gap-8 rb-md-grid-cols-2 rb-md-items-start"
20865
+ },
20866
+ [
20867
+ introHeading("rb-intro-title rb-max-w-xl"),
20868
+ stack({ gap: "md", className: "rb-intro-copy rb-max-w-xl" }, [
20869
+ introBody(),
20870
+ introCtas("start")
20871
+ ])
20872
+ ]
20873
+ )
20874
+ ]
20875
+ }),
20876
+ baseClass: "",
20877
+ spacing: "medium"
20878
+ });
20879
+ statementMediaLayout = styledSection({
20880
+ children: styledContainer({
20881
+ children: [
20882
+ el(
20883
+ "div",
20884
+ {
20885
+ 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"
20886
+ },
20887
+ [
20888
+ introHeading("rb-intro-title rb-max-w-xl"),
20889
+ stack({ gap: "md", className: "rb-intro-copy rb-max-w-xl" }, [
20890
+ introBody(),
20891
+ introCtas("start")
20892
+ ]),
20893
+ el("div", { className: "rb-intro-media-wrap rb-w-full" }, [introMedia], when("content.media"))
20894
+ ]
20895
+ )
20896
+ ]
20897
+ }),
20898
+ baseClass: "",
20899
+ spacing: "medium"
20900
+ });
20901
+ mediaCopyLayout = styledSection({
20902
+ children: styledContainer({
20903
+ children: [
20904
+ responsiveTwoColumn({
20905
+ image: el("div", { className: "rb-intro-media-wrap rb-w-full" }, [introMedia]),
20906
+ text: introCopyStack({
20907
+ className: "rb-intro-copy rb-max-w-xl",
20908
+ headingClassName: "rb-intro-title"
20909
+ }),
20910
+ ratioFrom: "content.ratio",
20911
+ imagePositionFrom: "content.imagePosition",
20912
+ gapFrom: "content.gap",
20913
+ gapFallback: "comfortable",
20914
+ imageWrapperClassName: "rb-w-full rb-shrink-0",
20915
+ textWrapperClassName: "rb-w-full rb-min-w-0 rb-flex-1 rb-self-center"
20916
+ })
20917
+ ]
20918
+ }),
20919
+ baseClass: "",
20920
+ spacing: "medium"
20921
+ });
20922
+ introConfig = {
20923
+ id: "block.intro",
20924
+ title: "Intro",
20925
+ category: "layout",
20926
+ includeContainerStyles: true,
20927
+ titleSource: "title",
20928
+ additionalFields: [
20929
+ {
20930
+ id: "title",
20931
+ type: "text",
20932
+ label: "Statement",
20933
+ required: false,
20934
+ multiline: true,
20935
+ maxLength: 160
20936
+ },
20937
+ {
20938
+ id: "body",
20939
+ type: "richText",
20940
+ label: "Text",
20941
+ required: true,
20942
+ ui: {
20943
+ richTextVariant: "limited"
20944
+ }
20945
+ },
20946
+ {
20947
+ id: "media",
20948
+ type: "media",
20949
+ label: "Media",
20950
+ required: false,
20951
+ mediaKinds: ["image"],
20952
+ ui: {
20953
+ intent: "content",
20954
+ visibleWhen: { field: "variant", notEquals: "statement-copy" }
20955
+ }
20956
+ },
20957
+ createImagePositionField({
20958
+ id: "imagePosition",
20959
+ label: "Image position",
20960
+ defaultValue: "left",
20961
+ uiIntent: "display",
20962
+ visibleWhen: { field: "variant", equals: "media-copy" }
20963
+ }),
20964
+ {
20965
+ id: "gap",
20966
+ type: "select",
20967
+ label: "Gap between media and text",
20968
+ required: false,
20969
+ defaultValue: "comfortable",
20970
+ multiple: false,
20971
+ options: [
20972
+ { value: "none", label: "None" },
20973
+ { value: "compact", label: "Compact" },
20974
+ { value: "cozy", label: "Cozy" },
20975
+ { value: "medium", label: "Medium" },
20976
+ { value: "comfortable", label: "Comfortable" },
20977
+ { value: "spacious", label: "Spacious" }
20978
+ ],
20979
+ ui: {
20980
+ intent: "display",
20981
+ visibleWhen: { field: "variant", equals: "media-copy" }
20982
+ }
20983
+ },
20984
+ createImageColSizeField({
20985
+ id: "ratio",
20986
+ label: "Media column size",
20987
+ defaultValue: "1/2",
20988
+ uiIntent: "display",
20989
+ visibleWhen: { field: "variant", equals: "media-copy" }
20990
+ }),
20991
+ createAspectRatioField({
20992
+ id: "aspectRatio",
20993
+ label: "Media aspect ratio",
20994
+ description: "Crop media to a consistent aspect ratio.",
20995
+ defaultValue: "auto",
20996
+ visibleWhen: { field: "media", notEquals: null }
20997
+ }),
20998
+ createCtasRepeater({
20999
+ label: "Calls to action",
21000
+ itemLabel: "CTA",
21001
+ maxItems: 2
21002
+ })
21003
+ ],
21004
+ layout: centeredCopyLayout,
19385
21005
  variants: {
19386
- classic: classicLayout,
19387
- micro: microLayout,
19388
- split: splitLayout,
19389
- splitReverse: splitReverseLayout
21006
+ "centered-copy": centeredCopyLayout,
21007
+ "statement-copy": statementCopyLayout,
21008
+ "statement-media": statementMediaLayout,
21009
+ "media-copy": mediaCopyLayout
19390
21010
  },
19391
- defaultVariant: "classic",
19392
- description: "Hero section with headline, subtitle, and repeatable CTAs.",
19393
- tags: ["header", "banner", "landing", "introduction", "welcome", "splash", "headline"],
19394
- icon: "Sparkles",
19395
- styleTokens: {
19396
- typography: "display",
19397
- spacing: "xl"
19398
- }
21011
+ defaultVariant: "statement-copy",
21012
+ variantOptions: {
21013
+ "centered-copy": {
21014
+ label: "Centered copy",
21015
+ description: "A focused intro with centered text and optional calls to action."
21016
+ },
21017
+ "statement-copy": {
21018
+ label: "Statement and copy",
21019
+ description: "A large statement on the left with supporting copy on the right."
21020
+ },
21021
+ "statement-media": {
21022
+ label: "Statement, copy and media",
21023
+ description: "A three-part intro with statement, copy and a small image."
21024
+ },
21025
+ "media-copy": {
21026
+ label: "Media and copy",
21027
+ description: "A compact media/text intro for softer transitions after a hero."
21028
+ }
21029
+ },
21030
+ description: "A flexible introductory section for statement copy, supporting text, media, and CTAs.",
21031
+ tags: ["intro", "introduction", "about", "welcome", "statement", "media", "text"],
21032
+ icon: "PanelTopOpen"
19399
21033
  };
19400
- heroManifest = createBlockManifest(heroConfig);
19401
- heroBlockDefinition = {
19402
- manifest: heroManifest
21034
+ introManifest = createBlockManifest(introConfig);
21035
+ introBlockDefinition = {
21036
+ manifest: introManifest
19403
21037
  };
19404
21038
  }
19405
21039
  });
@@ -20326,7 +21960,13 @@ var init_form = __esm({
20326
21960
  });
20327
21961
 
20328
21962
  // ../blocks/src/system/blocks/faq.ts
20329
- var faqComposition, faqManifest, faqBlockDefinition;
21963
+ function fragmentLayoutNode(layout) {
21964
+ return isNodeDefinitionArray(layout) ? el("div", {}, [...layout]) : layout;
21965
+ }
21966
+ function isNodeDefinitionArray(layout) {
21967
+ return Array.isArray(layout);
21968
+ }
21969
+ var faqComposition, headingLayout, accordionLayout, defaultLayout, twoColumnLayout, faqManifest, faqBlockDefinition;
20330
21970
  var init_faq = __esm({
20331
21971
  "../blocks/src/system/blocks/faq.ts"() {
20332
21972
  "use strict";
@@ -20340,6 +21980,31 @@ var init_faq = __esm({
20340
21980
  { fragment: faqHeadingFragment, fieldPriority: 0 },
20341
21981
  { fragment: faqAccordionFragment, fieldPriority: 1 }
20342
21982
  ]);
21983
+ headingLayout = fragmentLayoutNode(faqHeadingFragment.layout);
21984
+ accordionLayout = fragmentLayoutNode(faqAccordionFragment.layout);
21985
+ defaultLayout = styledSection({
21986
+ children: styledContainer({
21987
+ baseClassName: "rb-relative rb-isolate",
21988
+ children: stack({ gap: "xl", className: "rb-w-full rb-max-w-4xl rb-mx-auto" }, faqComposition.layout)
21989
+ }),
21990
+ baseClass: ""
21991
+ });
21992
+ twoColumnLayout = styledSection({
21993
+ children: styledContainer({
21994
+ baseClassName: "rb-relative rb-isolate",
21995
+ children: el(
21996
+ "div",
21997
+ {
21998
+ className: "rb-faq-two-column rb-grid rb-grid-cols-1 rb-gap-8 rb-lg-grid-cols-2 rb-lg-items-start"
21999
+ },
22000
+ [
22001
+ el("div", { className: "rb-faq-two-column-heading" }, [headingLayout]),
22002
+ el("div", { className: "rb-faq-two-column-accordion" }, [accordionLayout])
22003
+ ]
22004
+ )
22005
+ }),
22006
+ baseClass: ""
22007
+ });
20343
22008
  faqManifest = createBlockManifest({
20344
22009
  id: "block.faq",
20345
22010
  title: "FAQ",
@@ -20356,13 +22021,22 @@ var init_faq = __esm({
20356
22021
  label: "FAQ item styles"
20357
22022
  })
20358
22023
  ],
20359
- layout: styledSection({
20360
- children: styledContainer({
20361
- baseClassName: "rb-relative rb-isolate",
20362
- children: stack({ gap: "xl", className: "rb-w-full rb-max-w-4xl rb-mx-auto" }, faqComposition.layout)
20363
- }),
20364
- baseClass: ""
20365
- }),
22024
+ layout: defaultLayout,
22025
+ variants: {
22026
+ default: defaultLayout,
22027
+ "two-column": twoColumnLayout
22028
+ },
22029
+ defaultVariant: "default",
22030
+ variantOptions: {
22031
+ default: {
22032
+ label: "Default",
22033
+ description: "A centered heading above one FAQ accordion."
22034
+ },
22035
+ "two-column": {
22036
+ label: "Two column",
22037
+ description: "A left heading column with FAQ items on the right."
22038
+ }
22039
+ },
20366
22040
  description: "Accordion of frequently asked questions and answers.",
20367
22041
  tags: ["faq", "questions", "answers", "help", "support", "accordion", "q&a"],
20368
22042
  icon: "HelpCircle"
@@ -21003,7 +22677,8 @@ function resolveBackgroundVisualStyles(backgroundColor, tokens, defaultToken = "
21003
22677
  function resolveHeaderVisualStyles(header, tokens) {
21004
22678
  const navContainerType = header?.navContainer?.type ?? "none";
21005
22679
  const hasContainedNav = navContainerType === "glass" || navContainerType === "pill";
21006
- if (hasContainedNav) {
22680
+ const hasTransparentVariant = header?.variant === "transparent" || header?.variant === "floating";
22681
+ if (hasContainedNav || hasTransparentVariant) {
21007
22682
  return {
21008
22683
  backgroundToken: "transparent",
21009
22684
  paletteHex: null,
@@ -21052,7 +22727,7 @@ function extractBackgroundColorToken(background, fallback) {
21052
22727
  }
21053
22728
  return fallback;
21054
22729
  }
21055
- var joinClasses4, maxWidthClassSchema, maxWidthClassTransform, headerRootClassSchema, headerRootClassTransform, footerRootClassSchema, footerRootClassTransform, headerRootStyleTransform, footerRootStyleTransform, footerSpacingClassXMap, footerSpacingClassYMap, footerGapXClassMap, footerGapYClassMap, footerAlignClassMap, footerBottomBarClassSchema, footerBottomBarClassTransform, footerBottomBarContainerClassSchema, footerBottomBarContainerClassTransform, footerBottomBarStyleTransform, footerSplitNavSingleClassTransform, footerSplitMainClassSchema, footerSplitMainClassTransform, footerLogoClassSchema, footerLogoClassTransform, footerLogoMediaClassSchema, footerLogoMediaClassTransform, footerLogoTextVisibleTransform, layoutTransforms;
22730
+ var joinClasses4, maxWidthClassSchema, maxWidthClassTransform, headerRootClassSchema, headerRootClassTransform, footerRootClassSchema, footerRootClassTransform, headerRootStyleTransform, headerSectionBackgroundTransform, footerRootStyleTransform, footerSpacingClassXMap, footerSpacingClassYMap, footerGapXClassMap, footerGapYClassMap, footerAlignClassMap, footerBottomBarClassSchema, footerBottomBarClassTransform, footerBottomBarContainerClassSchema, footerBottomBarContainerClassTransform, footerBottomBarStyleTransform, footerSplitNavSingleClassTransform, footerSplitMainClassSchema, footerSplitMainClassTransform, footerLogoClassSchema, footerLogoClassTransform, footerLogoMediaClassSchema, footerLogoMediaClassTransform, footerLogoTextVisibleTransform, layoutTransforms;
21056
22731
  var init_layout = __esm({
21057
22732
  "../blocks/src/system/transforms/registry/layout.ts"() {
21058
22733
  "use strict";
@@ -21114,10 +22789,7 @@ var init_layout = __esm({
21114
22789
  const navContainerType = header?.navContainer?.type ?? "none";
21115
22790
  const hasContainedNav = navContainerType === "glass" || navContainerType === "pill";
21116
22791
  const backgroundClass = visuals.isTransparent || hasContainedNav ? "rb-bg-transparent" : null;
21117
- const classes = [
21118
- config.base,
21119
- backgroundClass
21120
- ];
22792
+ const classes = [config.base, backgroundClass];
21121
22793
  if (!hasContainedNav) {
21122
22794
  if (config.blur) classes.push(config.blur);
21123
22795
  if (config.blurSupport) classes.push(config.blurSupport);
@@ -21132,7 +22804,12 @@ var init_layout = __esm({
21132
22804
  if (shrinkOnScroll && (positioning === "sticky" || positioning === "fixed")) {
21133
22805
  classes.push(config.shrink);
21134
22806
  }
21135
- const VALID_VARIANTS = ["classic", "centered", "transparent", "floating", "editorial"];
22807
+ const VALID_VARIANTS = [
22808
+ "classic",
22809
+ "centered",
22810
+ "transparent",
22811
+ "floating"
22812
+ ];
21136
22813
  const variant = header?.variant;
21137
22814
  if (variant && VALID_VARIANTS.includes(variant)) {
21138
22815
  classes.push(`header-variant-${variant}`);
@@ -21185,6 +22862,17 @@ var init_layout = __esm({
21185
22862
  return mergeStyles(...styleParts);
21186
22863
  }
21187
22864
  };
22865
+ headerSectionBackgroundTransform = {
22866
+ id: "layout.headerSectionBackground",
22867
+ kind: "string",
22868
+ summary: "Resolve the inner site-header section background token",
22869
+ run: (value) => {
22870
+ const header = asPartialObject(value);
22871
+ const navContainerType = header?.navContainer?.type ?? "none";
22872
+ const usesTransparentRoot = header?.variant === "transparent" || header?.variant === "floating" || navContainerType === "glass" || navContainerType === "pill";
22873
+ return usesTransparentRoot ? "raw:transparent" : "background";
22874
+ }
22875
+ };
21188
22876
  footerRootStyleTransform = {
21189
22877
  id: "layout.footerRootStyle",
21190
22878
  kind: "formatter",
@@ -21425,6 +23113,7 @@ var init_layout = __esm({
21425
23113
  headerRootClassTransform,
21426
23114
  footerRootClassTransform,
21427
23115
  headerRootStyleTransform,
23116
+ headerSectionBackgroundTransform,
21428
23117
  footerRootStyleTransform,
21429
23118
  footerBottomBarClassTransform,
21430
23119
  footerBottomBarContainerClassTransform,
@@ -21667,7 +23356,7 @@ var init_shared2 = __esm({
21667
23356
  });
21668
23357
 
21669
23358
  // ../blocks/src/system/blocks/site-header.ts
21670
- var logoRow, centeredLogoRow, createNavRow, headerCta, mobileCta, mobileToggleIcon, mobileToggleButton, mobileOverlayToggleButton, mobileNavList, mobileOverlayHeader, mobileOverlayBody, mobileOverlay, mobileHeaderBar, classicLayout2, centeredLayout, transparentLayout, floatingLayout, editorialLayout, headerLayout, siteHeaderManifest, siteHeaderBlockDefinition;
23359
+ var logoRow, centeredLogoRow, createNavRow, headerCta, mobileCta, mobileToggleIcon, mobileToggleButton, mobileOverlayToggleButton, mobileNavList, mobileOverlayHeader, mobileOverlayBody, mobileOverlay, mobileHeaderBar, classicLayout2, centeredLayout, transparentLayout, floatingLayout, headerLayout, siteHeaderManifest, siteHeaderBlockDefinition;
21671
23360
  var init_site_header = __esm({
21672
23361
  "../blocks/src/system/blocks/site-header.ts"() {
21673
23362
  "use strict";
@@ -21770,15 +23459,21 @@ var init_site_header = __esm({
21770
23459
  mobileToggleIcon = stack({ gap: "xs", className: "nav-mobile-icon" }, [
21771
23460
  {
21772
23461
  type: "div",
21773
- props: { className: "nav-mobile-bar nav-mobile-bar-top rb-h-0.5 rb-w-5 rb-rounded-full rb-bg-current" }
23462
+ props: {
23463
+ className: "nav-mobile-bar nav-mobile-bar-top rb-h-0.5 rb-w-5 rb-rounded-full rb-bg-current"
23464
+ }
21774
23465
  },
21775
23466
  {
21776
23467
  type: "div",
21777
- props: { className: "nav-mobile-bar nav-mobile-bar-middle rb-h-0.5 rb-w-5 rb-rounded-full rb-bg-current" }
23468
+ props: {
23469
+ className: "nav-mobile-bar nav-mobile-bar-middle rb-h-0.5 rb-w-5 rb-rounded-full rb-bg-current"
23470
+ }
21778
23471
  },
21779
23472
  {
21780
23473
  type: "div",
21781
- props: { className: "nav-mobile-bar nav-mobile-bar-bottom rb-h-0.5 rb-w-5 rb-rounded-full rb-bg-current" }
23474
+ props: {
23475
+ className: "nav-mobile-bar nav-mobile-bar-bottom rb-h-0.5 rb-w-5 rb-rounded-full rb-bg-current"
23476
+ }
21782
23477
  }
21783
23478
  ]);
21784
23479
  mobileToggleButton = {
@@ -21961,31 +23656,12 @@ var init_site_header = __esm({
21961
23656
  ],
21962
23657
  when("$root.theme.header.variant", { equals: "floating" })
21963
23658
  );
21964
- editorialLayout = stack(
21965
- {
21966
- gap: "md",
21967
- align: "center",
21968
- className: bindProp("$root.theme.header.maxWidth", {
21969
- transforms: pipe(
21970
- tx("layout.maxWidthClass", {
21971
- base: `rb-header-layout ${desktopOnlyDisplay("flex")} rb-w-full rb-flex-col rb-items-center rb-gap-6 rb-text-center`
21972
- })
21973
- ),
21974
- fallback: `rb-container rb-header-layout ${desktopOnlyDisplay("flex")} rb-w-full rb-flex-col rb-items-center rb-gap-6 rb-text-center`
21975
- })
21976
- },
21977
- [
21978
- centeredLogoRow,
21979
- createNavRow(
21980
- `${desktopOnlyDisplay("flex")} rb-flex-wrap rb-justify-center rb-gap-x-8 rb-gap-y-3`,
21981
- "center"
21982
- )
21983
- ],
21984
- when("$root.theme.header.variant", { equals: "editorial" })
21985
- );
21986
23659
  headerLayout = headerSection(
21987
23660
  {
21988
- background: "background",
23661
+ background: bindProp("$root.theme.header", {
23662
+ transforms: pipe(tx("layout.headerSectionBackground")),
23663
+ fallback: "background"
23664
+ }),
21989
23665
  allowOverflow: true,
21990
23666
  className: bindProp("$root.theme.header", {
21991
23667
  transforms: pipe(tx("layout.headerRootClass")),
@@ -21993,10 +23669,7 @@ var init_site_header = __esm({
21993
23669
  }),
21994
23670
  style: bindProp("$root.theme.header", {
21995
23671
  transforms: pipe(tx("layout.headerRootStyle")),
21996
- fallback: mergeStyles(
21997
- textColorStyle("text"),
21998
- borderColorStyle("border")
21999
- )
23672
+ fallback: mergeStyles(textColorStyle("text"), borderColorStyle("border"))
22000
23673
  })
22001
23674
  },
22002
23675
  [
@@ -22005,7 +23678,6 @@ var init_site_header = __esm({
22005
23678
  centeredLayout,
22006
23679
  transparentLayout,
22007
23680
  floatingLayout,
22008
- editorialLayout,
22009
23681
  mobileOverlay
22010
23682
  ],
22011
23683
  props({
@@ -22884,79 +24556,311 @@ var init_collection = __esm({
22884
24556
  { gap: "md" }
22885
24557
  ),
22886
24558
  baseClass: "",
22887
- spacing: "comfortable"
24559
+ spacing: "comfortable"
24560
+ });
24561
+ collectionManifest = createBlockManifest({
24562
+ id: "block.collection",
24563
+ title: "Collection",
24564
+ category: "layout",
24565
+ additionalFields: [
24566
+ parseFieldDefinition({
24567
+ id: "layout",
24568
+ type: "select",
24569
+ label: "Layout",
24570
+ defaultValue: "grid",
24571
+ options: [
24572
+ { value: "grid", label: "Grid" },
24573
+ { value: "stack", label: "Stack" }
24574
+ ],
24575
+ ui: { intent: "display" }
24576
+ }),
24577
+ parseFieldDefinition({
24578
+ id: "columns",
24579
+ type: "select",
24580
+ label: "Columns",
24581
+ description: "Number of columns in the grid layout.",
24582
+ defaultValue: "3",
24583
+ options: [
24584
+ { value: "2", label: "2 columns" },
24585
+ { value: "3", label: "3 columns" },
24586
+ { value: "4", label: "4 columns" }
24587
+ ],
24588
+ ui: {
24589
+ intent: "display",
24590
+ visibleWhen: { field: "layout", equals: "grid" }
24591
+ }
24592
+ }),
24593
+ parseFieldDefinition({
24594
+ id: "gap",
24595
+ type: "select",
24596
+ label: "Gap",
24597
+ defaultValue: "medium",
24598
+ options: [
24599
+ { value: "none", label: "None" },
24600
+ { value: "compact", label: "Compact" },
24601
+ { value: "cozy", label: "Cozy" },
24602
+ { value: "medium", label: "Medium" },
24603
+ { value: "comfortable", label: "Comfortable" },
24604
+ { value: "spacious", label: "Spacious" }
24605
+ ],
24606
+ ui: { intent: "display" }
24607
+ }),
24608
+ fragmentsToRepeaterField(
24609
+ "items",
24610
+ "Items",
24611
+ collectionFragments,
24612
+ {
24613
+ minItems: 0,
24614
+ maxItems: 50,
24615
+ itemLabel: "Item",
24616
+ description: "Add items to this collection."
24617
+ }
24618
+ ),
24619
+ cardStylesField({
24620
+ id: "_cardStyles",
24621
+ label: "Item styles"
24622
+ })
24623
+ ],
24624
+ layout: collectionLayout,
24625
+ description: "Repeat items in a grid or stack layout.",
24626
+ tags: ["collection", "grid", "stack", "repeater"],
24627
+ icon: "LayoutList",
24628
+ styleTokens: { spacing: "lg" }
24629
+ });
24630
+ collectionBlockDefinition = {
24631
+ manifest: collectionManifest
24632
+ };
24633
+ }
24634
+ });
24635
+
24636
+ // ../blocks/src/system/blocks/feature-cards.ts
24637
+ function grid3(props2, children) {
24638
+ return el("grid", props2 ?? void 0, children ?? void 0);
24639
+ }
24640
+ var sectionHeading, featureCard, cardsLayout, featureCardsConfig, featureCardsManifest, featureCardsBlockDefinition;
24641
+ var init_feature_cards = __esm({
24642
+ "../blocks/src/system/blocks/feature-cards.ts"() {
24643
+ "use strict";
24644
+ init_defineBlock();
24645
+ init_aspectRatio();
24646
+ init_boxStyles();
24647
+ init_ctas();
24648
+ init_builder();
24649
+ init_fragments();
24650
+ init_colorStyles();
24651
+ sectionHeading = stack(
24652
+ { gap: "sm", className: "rb-feature-cards-heading rb-mx-auto rb-max-w-3xl rb-text-center" },
24653
+ [
24654
+ text(
24655
+ {
24656
+ as: "h2",
24657
+ className: "rb-feature-cards-title rb-text-center"
24658
+ },
24659
+ when("content.title"),
24660
+ bind("content.title")
24661
+ ),
24662
+ richText(
24663
+ {
24664
+ className: "rb-feature-cards-description rb-prose rb-mx-auto rb-max-w-none",
24665
+ style: textColorStyle("mutedText")
24666
+ },
24667
+ when("content.description"),
24668
+ bind("content.description")
24669
+ )
24670
+ ]
24671
+ );
24672
+ featureCard = styledCard(
24673
+ [
24674
+ media(
24675
+ {
24676
+ className: "rb-feature-card-media rb-w-full rb-h-auto rb-object-cover",
24677
+ style: {
24678
+ aspectRatio: { $bind: { from: "card.aspectRatio" } }
24679
+ }
24680
+ },
24681
+ when("card.media"),
24682
+ bind("card.media")
24683
+ ),
24684
+ stack({ gap: "sm", className: "rb-feature-card-content rb-flex-1 rb-p-6" }, [
24685
+ text(
24686
+ {
24687
+ as: "h3",
24688
+ className: "rb-feature-card-title"
24689
+ },
24690
+ bind("card.title")
24691
+ ),
24692
+ richText(
24693
+ {
24694
+ className: "rb-feature-card-body rb-prose rb-max-w-none",
24695
+ style: textColorStyle("mutedText")
24696
+ },
24697
+ when("card.body"),
24698
+ bind("card.body")
24699
+ ),
24700
+ ctaRow({
24701
+ collectionPath: "ctas",
24702
+ itemName: "cta",
24703
+ gap: "sm",
24704
+ justify: "start",
24705
+ containerClassName: "rb-mt-auto"
24706
+ })
24707
+ ])
24708
+ ],
24709
+ {
24710
+ stylesFrom: "content._cardStyles",
24711
+ backgroundFrom: "content._cardStyles.background",
24712
+ baseClassName: "rb-feature-card rb-relative rb-isolate rb-overflow-hidden rb-border rb-flex rb-h-full rb-flex-col"
24713
+ },
24714
+ repeat("content.cards", "card")
24715
+ );
24716
+ cardsLayout = styledSection({
24717
+ children: styledContainer({
24718
+ rootType: "stack",
24719
+ rootProps: { gap: "xl" },
24720
+ children: [
24721
+ sectionHeading,
24722
+ grid3(
24723
+ {
24724
+ cols: {
24725
+ $bind: {
24726
+ from: "content.columns",
24727
+ fallback: 3,
24728
+ coerce: "number"
24729
+ }
24730
+ },
24731
+ gap: "lg"
24732
+ },
24733
+ [featureCard]
24734
+ )
24735
+ ]
24736
+ }),
24737
+ baseClass: "",
24738
+ spacing: "medium"
22888
24739
  });
22889
- collectionManifest = createBlockManifest({
22890
- id: "block.collection",
22891
- title: "Collection",
24740
+ featureCardsConfig = {
24741
+ id: "block.feature-cards",
24742
+ title: "Feature Cards",
22892
24743
  category: "layout",
24744
+ includeContainerStyles: true,
24745
+ titleSource: "title",
22893
24746
  additionalFields: [
22894
- parseFieldDefinition({
22895
- id: "layout",
22896
- type: "select",
22897
- label: "Layout",
22898
- defaultValue: "grid",
22899
- options: [
22900
- { value: "grid", label: "Grid" },
22901
- { value: "stack", label: "Stack" }
22902
- ],
22903
- ui: { intent: "display" }
22904
- }),
22905
- parseFieldDefinition({
24747
+ {
24748
+ id: "title",
24749
+ type: "text",
24750
+ label: "Title",
24751
+ required: false,
24752
+ multiline: false,
24753
+ maxLength: 120
24754
+ },
24755
+ {
24756
+ id: "description",
24757
+ type: "richText",
24758
+ label: "Description",
24759
+ required: false,
24760
+ ui: {
24761
+ richTextVariant: "limited"
24762
+ }
24763
+ },
24764
+ {
22906
24765
  id: "columns",
22907
24766
  type: "select",
22908
24767
  label: "Columns",
22909
- description: "Number of columns in the grid layout.",
24768
+ required: false,
22910
24769
  defaultValue: "3",
24770
+ multiple: false,
22911
24771
  options: [
22912
24772
  { value: "2", label: "2 columns" },
22913
24773
  { value: "3", label: "3 columns" },
22914
24774
  { value: "4", label: "4 columns" }
22915
24775
  ],
22916
- ui: {
22917
- intent: "display",
22918
- visibleWhen: { field: "layout", equals: "grid" }
22919
- }
22920
- }),
22921
- parseFieldDefinition({
22922
- id: "gap",
22923
- type: "select",
22924
- label: "Gap",
22925
- defaultValue: "medium",
22926
- options: [
22927
- { value: "none", label: "None" },
22928
- { value: "compact", label: "Compact" },
22929
- { value: "cozy", label: "Cozy" },
22930
- { value: "medium", label: "Medium" },
22931
- { value: "comfortable", label: "Comfortable" },
22932
- { value: "spacious", label: "Spacious" }
22933
- ],
22934
24776
  ui: { intent: "display" }
22935
- }),
22936
- fragmentsToRepeaterField(
22937
- "items",
22938
- "Items",
22939
- collectionFragments,
22940
- {
22941
- minItems: 0,
22942
- maxItems: 50,
22943
- itemLabel: "Item",
22944
- description: "Add items to this collection."
24777
+ },
24778
+ {
24779
+ id: "cards",
24780
+ type: "repeater",
24781
+ label: "Cards",
24782
+ required: false,
24783
+ minItems: 1,
24784
+ maxItems: 8,
24785
+ itemLabel: "Card",
24786
+ itemLabelSource: "title",
24787
+ allowConversion: true,
24788
+ ui: {
24789
+ intent: "content"
24790
+ },
24791
+ schema: {
24792
+ fields: [
24793
+ {
24794
+ id: "media",
24795
+ type: "media",
24796
+ label: "Image",
24797
+ required: false,
24798
+ mediaKinds: ["image"]
24799
+ },
24800
+ createAspectRatioField({
24801
+ id: "aspectRatio",
24802
+ label: "Image aspect ratio",
24803
+ defaultValue: "4/3",
24804
+ visibleWhen: { field: "media", notEquals: null }
24805
+ }),
24806
+ {
24807
+ id: "title",
24808
+ type: "text",
24809
+ label: "Title",
24810
+ required: true,
24811
+ multiline: false,
24812
+ maxLength: 120
24813
+ },
24814
+ {
24815
+ id: "body",
24816
+ type: "richText",
24817
+ label: "Text",
24818
+ required: false,
24819
+ ui: {
24820
+ richTextVariant: "limited"
24821
+ }
24822
+ },
24823
+ createCtasRepeater({
24824
+ label: "Calls to action",
24825
+ itemLabel: "CTA",
24826
+ maxItems: 1,
24827
+ button: {
24828
+ variants: [
24829
+ { value: "primary", label: "Primary" },
24830
+ { value: "secondary", label: "Secondary" },
24831
+ { value: "outline", label: "Outline" },
24832
+ { value: "ghost", label: "Ghost" },
24833
+ { value: "link", label: "Link" }
24834
+ ],
24835
+ defaultVariant: "ghost"
24836
+ }
24837
+ })
24838
+ ]
22945
24839
  }
22946
- ),
24840
+ },
22947
24841
  cardStylesField({
22948
24842
  id: "_cardStyles",
22949
- label: "Item styles"
24843
+ label: "Card styles"
22950
24844
  })
22951
24845
  ],
22952
- layout: collectionLayout,
22953
- description: "Repeat items in a grid or stack layout.",
22954
- tags: ["collection", "grid", "stack", "repeater"],
22955
- icon: "LayoutList",
22956
- styleTokens: { spacing: "lg" }
22957
- });
22958
- collectionBlockDefinition = {
22959
- manifest: collectionManifest
24846
+ layout: cardsLayout,
24847
+ variants: {
24848
+ cards: cardsLayout
24849
+ },
24850
+ defaultVariant: "cards",
24851
+ variantOptions: {
24852
+ cards: {
24853
+ label: "Cards",
24854
+ description: "A responsive grid of image cards with optional calls to action."
24855
+ }
24856
+ },
24857
+ description: "A card grid for offerings, services, classes, benefits, or featured links.",
24858
+ tags: ["cards", "features", "offerings", "services", "classes", "grid", "links"],
24859
+ icon: "PanelsTopLeft"
24860
+ };
24861
+ featureCardsManifest = createBlockManifest(featureCardsConfig);
24862
+ featureCardsBlockDefinition = {
24863
+ manifest: featureCardsManifest
22960
24864
  };
22961
24865
  }
22962
24866
  });
@@ -23060,74 +24964,6 @@ var init_carousel = __esm({
23060
24964
  }
23061
24965
  });
23062
24966
 
23063
- // ../blocks/src/system/fields/imageLayout.ts
23064
- function createImageColSizeField(options = {}) {
23065
- const {
23066
- id = "imageColSize",
23067
- label = "Image column size",
23068
- description = "Controls how large the image/thumbnail column is at desktop breakpoints.",
23069
- defaultValue = "1/3",
23070
- uiIntent = "display",
23071
- visibleWhen
23072
- } = options;
23073
- return {
23074
- id,
23075
- type: "select",
23076
- label,
23077
- description,
23078
- required: false,
23079
- defaultValue,
23080
- multiple: false,
23081
- options: [
23082
- { value: "1/4", label: "Small (1/4)" },
23083
- { value: "1/3", label: "Medium (1/3)" },
23084
- { value: "2/5", label: "Large (2/5)" },
23085
- { value: "1/2", label: "Extra large (1/2)" },
23086
- { value: "2/3", label: "Huge (2/3)" }
23087
- ],
23088
- ui: {
23089
- intent: uiIntent,
23090
- ...visibleWhen ? { visibleWhen } : {}
23091
- }
23092
- };
23093
- }
23094
- function createImagePositionField(options = {}) {
23095
- const {
23096
- id = "imagePosition",
23097
- label = "Image position",
23098
- description = "Choose which side the image appears on.",
23099
- defaultValue = "left",
23100
- includeAlternate = false,
23101
- uiIntent = "display",
23102
- visibleWhen
23103
- } = options;
23104
- const positionOptions = [
23105
- { value: "left", label: "Left" },
23106
- { value: "right", label: "Right" },
23107
- ...includeAlternate ? [{ value: "alternate", label: "Alternate" }] : []
23108
- ];
23109
- return {
23110
- id,
23111
- type: "select",
23112
- label,
23113
- description,
23114
- required: false,
23115
- defaultValue,
23116
- multiple: false,
23117
- // Spread to get a mutable array type without unsafe casts.
23118
- options: [...positionOptions],
23119
- ui: {
23120
- intent: uiIntent,
23121
- ...visibleWhen ? { visibleWhen } : {}
23122
- }
23123
- };
23124
- }
23125
- var init_imageLayout = __esm({
23126
- "../blocks/src/system/fields/imageLayout.ts"() {
23127
- "use strict";
23128
- }
23129
- });
23130
-
23131
24967
  // ../blocks/src/system/blocks/media-text.ts
23132
24968
  var mediaTextFrameCapability, textCardStylesField, mediaTextManifest, mediaTextBlockDefinition;
23133
24969
  var init_media_text = __esm({
@@ -23137,6 +24973,7 @@ var init_media_text = __esm({
23137
24973
  init_frameStyles();
23138
24974
  init_fragments();
23139
24975
  init_builder();
24976
+ init_aspectRatio();
23140
24977
  init_boxStyles();
23141
24978
  init_carousel();
23142
24979
  init_imageLayout();
@@ -23262,26 +25099,13 @@ var init_media_text = __esm({
23262
25099
  },
23263
25100
  ui: { intent: "behavior" }
23264
25101
  }),
23265
- {
25102
+ createAspectRatioField({
23266
25103
  id: "aspectRatio",
23267
- type: "select",
23268
25104
  label: "Media aspect ratio",
23269
25105
  description: "Crop media to a consistent aspect ratio.",
23270
- required: false,
23271
25106
  defaultValue: "auto",
23272
- multiple: false,
23273
- options: [
23274
- { value: "auto", label: "Auto (original)" },
23275
- { value: "16/9", label: "16:9 (Landscape)" },
23276
- { value: "4/3", label: "4:3 (Standard)" },
23277
- { value: "1/1", label: "1:1 (Square)" },
23278
- { value: "3/4", label: "3:4 (Portrait)" }
23279
- ],
23280
- ui: {
23281
- intent: "display",
23282
- visibleWhen: { field: "images", notEquals: null }
23283
- }
23284
- },
25107
+ visibleWhen: { field: "images", notEquals: null }
25108
+ }),
23285
25109
  {
23286
25110
  id: "text",
23287
25111
  type: "richText",
@@ -23411,7 +25235,7 @@ var init_media_text = __esm({
23411
25235
  whenImagesLength(0)
23412
25236
  );
23413
25237
  const defaultInner = el("div", {}, [defaultImagesLayout, defaultTextOnlyLayout]);
23414
- const defaultLayout = styledSection({
25238
+ const defaultLayout2 = styledSection({
23415
25239
  children: styledContainer({
23416
25240
  rootType: "stack",
23417
25241
  rootProps: { gap: "lg" },
@@ -23443,9 +25267,9 @@ var init_media_text = __esm({
23443
25267
  spacing: "medium"
23444
25268
  });
23445
25269
  return {
23446
- layout: defaultLayout,
25270
+ layout: defaultLayout2,
23447
25271
  variants: {
23448
- default: defaultLayout
25272
+ default: defaultLayout2
23449
25273
  },
23450
25274
  defaultVariant: "default",
23451
25275
  variantOptions: {
@@ -27156,7 +28980,7 @@ var init_embed = __esm({
27156
28980
  });
27157
28981
 
27158
28982
  // ../blocks/src/system/blocks/image-gallery.ts
27159
- var grid3, galleryContainer, galleryItem, gridLayout3, carouselLayout2, masonryLayout, marqueeTileBase, marqueeTile, marqueeLayout, emptyState2, wrapVariant2, fields, baseImageGalleryManifest, imageGalleryManifest, imageGalleryBlockDefinition;
28983
+ var grid4, galleryContainer, galleryItem, gridLayout3, carouselLayout2, masonryLayout, marqueeTileBase, marqueeTile, marqueeLayout, emptyState2, wrapVariant2, fields, baseImageGalleryManifest, imageGalleryManifest, imageGalleryBlockDefinition;
27160
28984
  var init_image_gallery = __esm({
27161
28985
  "../blocks/src/system/blocks/image-gallery.ts"() {
27162
28986
  "use strict";
@@ -27165,7 +28989,7 @@ var init_image_gallery = __esm({
27165
28989
  init_colorStyles();
27166
28990
  init_defineBlock();
27167
28991
  init_fragments();
27168
- grid3 = (props2, children, ...mods) => el("grid", props2 ?? void 0, children ?? void 0, ...mods);
28992
+ grid4 = (props2, children, ...mods) => el("grid", props2 ?? void 0, children ?? void 0, ...mods);
27169
28993
  galleryContainer = (children, opts) => {
27170
28994
  const gap = opts?.gap ?? "md";
27171
28995
  const withExtraClass = (baseClass) => opts?.className ? `${baseClass} ${opts.className}` : baseClass;
@@ -27245,7 +29069,7 @@ var init_image_gallery = __esm({
27245
29069
  ],
27246
29070
  repeat("content.images", "item")
27247
29071
  );
27248
- gridLayout3 = grid3(
29072
+ gridLayout3 = grid4(
27249
29073
  {
27250
29074
  className: "rb-grid rb-grid-cols-1 rb-gap-4 rb-sm-grid-cols-2 rb-md-grid-cols-3"
27251
29075
  },
@@ -27850,7 +29674,7 @@ var init_image_gallery = __esm({
27850
29674
  });
27851
29675
 
27852
29676
  // ../blocks/src/system/blocks/video-grid.ts
27853
- var grid4, videoItem, gridColumnsClass, createGridLayout, gridLayout1, gridLayout22, gridLayout32, gridLayout4, emptyState3, headingSection, videoGridLayout, fields2, videoGridManifest, videoGridBlockDefinition;
29677
+ var grid5, videoItem, gridColumnsClass, createGridLayout, gridLayout1, gridLayout22, gridLayout32, gridLayout4, emptyState3, headingSection, videoGridLayout, fields2, videoGridManifest, videoGridBlockDefinition;
27854
29678
  var init_video_grid = __esm({
27855
29679
  "../blocks/src/system/blocks/video-grid.ts"() {
27856
29680
  "use strict";
@@ -27859,7 +29683,7 @@ var init_video_grid = __esm({
27859
29683
  init_fragments();
27860
29684
  init_colorStyles();
27861
29685
  init_defineBlock();
27862
- grid4 = (props2, children, ...mods) => el("grid", props2 ?? void 0, children ?? void 0, ...mods);
29686
+ grid5 = (props2, children, ...mods) => el("grid", props2 ?? void 0, children ?? void 0, ...mods);
27863
29687
  videoItem = (options) => stack(
27864
29688
  { gap: "xs", className: options.containerClassName },
27865
29689
  [
@@ -27909,7 +29733,7 @@ var init_video_grid = __esm({
27909
29733
  return "rb-grid rb-grid-cols-1 rb-gap-6 rb-sm-grid-cols-2 rb-md-grid-cols-3";
27910
29734
  }
27911
29735
  };
27912
- createGridLayout = (columns) => grid4(
29736
+ createGridLayout = (columns) => grid5(
27913
29737
  {
27914
29738
  className: gridColumnsClass(columns)
27915
29739
  },
@@ -31156,6 +32980,7 @@ var init_blocks = __esm({
31156
32980
  init_designCapabilities();
31157
32981
  init_registry4();
31158
32982
  init_hero();
32983
+ init_intro();
31159
32984
  init_body_text();
31160
32985
  init_blog_post();
31161
32986
  init_blog_listing();
@@ -31168,6 +32993,7 @@ var init_blocks = __esm({
31168
32993
  init_testimonials();
31169
32994
  init_columns();
31170
32995
  init_collection();
32996
+ init_feature_cards();
31171
32997
  init_media_text();
31172
32998
  init_appointment_booking();
31173
32999
  init_event_registration();
@@ -31190,6 +33016,7 @@ var init_blocks = __esm({
31190
33016
  init_team_members();
31191
33017
  init_location_map();
31192
33018
  init_hero();
33019
+ init_intro();
31193
33020
  init_body_text();
31194
33021
  init_location_map();
31195
33022
  init_blog_post();
@@ -31203,6 +33030,7 @@ var init_blocks = __esm({
31203
33030
  init_testimonials();
31204
33031
  init_columns();
31205
33032
  init_collection();
33033
+ init_feature_cards();
31206
33034
  init_media_text();
31207
33035
  init_appointment_booking();
31208
33036
  init_event_registration();
@@ -31358,6 +33186,40 @@ var init_blocks = __esm({
31358
33186
  })
31359
33187
  ]
31360
33188
  })),
33189
+ withDesignCapability("block.intro", introBlockDefinition, declareBlockDesignCapability({
33190
+ sectionSurfaces: "supported",
33191
+ contentFrames: ["plain", "panel"],
33192
+ itemSurfaces: "unsupported",
33193
+ headingDecorations: ["organic-squiggle"]
33194
+ }), defineBlockDesignMetadata({
33195
+ flow: bodyFlow,
33196
+ layoutProfiles: [
33197
+ layoutProfile({
33198
+ variantKey: "centered-copy",
33199
+ family: "centered",
33200
+ weight: "featured",
33201
+ bias: "soft"
33202
+ }),
33203
+ layoutProfile({
33204
+ variantKey: "statement-copy",
33205
+ family: "split",
33206
+ weight: "featured",
33207
+ bias: "merge"
33208
+ }),
33209
+ layoutProfile({
33210
+ variantKey: "statement-media",
33211
+ family: "media-text",
33212
+ weight: "featured",
33213
+ bias: "soft"
33214
+ }),
33215
+ layoutProfile({
33216
+ variantKey: "media-copy",
33217
+ family: "media-text",
33218
+ weight: "featured",
33219
+ bias: "soft"
33220
+ })
33221
+ ]
33222
+ })),
31361
33223
  withDesignCapability("block.body-text", bodyTextBlockDefinition, sectionOnly(), defineBlockDesignMetadata({
31362
33224
  flow: bodyFlow,
31363
33225
  layoutProfiles: [
@@ -31418,9 +33280,17 @@ var init_blocks = __esm({
31418
33280
  flow: conversionFlow,
31419
33281
  layoutProfiles: [layoutProfile({ variantKey: "default", family: "form", weight: "standard" })]
31420
33282
  })),
31421
- withDesignCapability("block.faq", faqBlockDefinition, withEyebrowCapability(panelAndItemsCapable(), standardEyebrowTreatments), defineBlockDesignMetadata({
33283
+ withDesignCapability("block.faq", faqBlockDefinition, withEyebrowCapability(declareBlockDesignCapability({
33284
+ sectionSurfaces: "supported",
33285
+ contentFrames: ["plain", "panel"],
33286
+ itemSurfaces: "supported",
33287
+ accordionIconSets: ["plus", "chevron", "caret", "minimal-cross"]
33288
+ }), standardEyebrowTreatments), defineBlockDesignMetadata({
31422
33289
  flow: bodyFlow,
31423
- layoutProfiles: [layoutProfile({ variantKey: "default", family: "stack", weight: "standard" })]
33290
+ layoutProfiles: [
33291
+ layoutProfile({ variantKey: "default", family: "stack", weight: "standard" }),
33292
+ layoutProfile({ variantKey: "two-column", family: "split", weight: "standard" })
33293
+ ]
31424
33294
  })),
31425
33295
  withDesignCapability("block.site-header", siteHeaderBlockDefinition, declareNoBlockDesignCapability("site-chrome"), defineBlockDesignMetadata({
31426
33296
  flow: siteChromeFlow,
@@ -31434,7 +33304,8 @@ var init_blocks = __esm({
31434
33304
  sectionSurfaces: "supported",
31435
33305
  contentFrames: ["plain", "panel"],
31436
33306
  itemSurfaces: "supported",
31437
- testimonialCardTreatments: ["default", "accent-quote"]
33307
+ testimonialCardTreatments: ["default", "accent-quote"],
33308
+ headingDecorations: ["short-center-rule"]
31438
33309
  }), defineBlockDesignMetadata({
31439
33310
  flow: proofFlow,
31440
33311
  layoutProfiles: [
@@ -31460,6 +33331,22 @@ var init_blocks = __esm({
31460
33331
  flow: offeringsFlow,
31461
33332
  layoutProfiles: [layoutProfile({ variantKey: "default", family: "grid", weight: "standard" })]
31462
33333
  })),
33334
+ withDesignCapability("block.feature-cards", featureCardsBlockDefinition, declareBlockDesignCapability({
33335
+ sectionSurfaces: "supported",
33336
+ contentFrames: ["plain", "panel"],
33337
+ itemSurfaces: "supported",
33338
+ headingDecorations: ["short-center-rule"]
33339
+ }), defineBlockDesignMetadata({
33340
+ flow: offeringsFlow,
33341
+ layoutProfiles: [
33342
+ layoutProfile({
33343
+ variantKey: "cards",
33344
+ family: "grid",
33345
+ weight: "standard",
33346
+ bias: "soft"
33347
+ })
33348
+ ]
33349
+ })),
31463
33350
  withDesignCapability("block.media-text", mediaTextBlockDefinition, mediaPanelCapable(), defineBlockDesignMetadata({
31464
33351
  flow: mediaFlow,
31465
33352
  layoutProfiles: [