@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
@@ -209,6 +209,7 @@ var ALLOWED_TRANSFORM_IDS = [
209
209
  "layout.headerRootClass",
210
210
  "layout.footerRootClass",
211
211
  "layout.headerRootStyle",
212
+ "layout.headerSectionBackground",
212
213
  "layout.footerRootStyle",
213
214
  // UI (ui.ts)
214
215
  "ui.headerNavLinkClass",
@@ -1092,6 +1093,47 @@ var eyebrowTreatmentValues = [
1092
1093
  "pill-bounce",
1093
1094
  "accent-pill-bounce"
1094
1095
  ];
1096
+ var visibleHeadingDecorationFamilyValues = [
1097
+ "organic-squiggle",
1098
+ "short-center-rule"
1099
+ ];
1100
+ var visibleHeadingDecorationPlacementValues = [
1101
+ "after-heading",
1102
+ "between-heading-and-body",
1103
+ "under-centered-heading"
1104
+ ];
1105
+ var headingDecorationOverrideValues = [
1106
+ "site-default",
1107
+ "on",
1108
+ "off"
1109
+ ];
1110
+ var headingDecorationColorTokenValues = [
1111
+ "text",
1112
+ "primary",
1113
+ "secondary",
1114
+ "accent",
1115
+ "border",
1116
+ "muted"
1117
+ ];
1118
+ var accordionIconSetValues = [
1119
+ "plus",
1120
+ "chevron",
1121
+ "caret",
1122
+ "minimal-cross"
1123
+ ];
1124
+ var accordionIconColorTokenValues = [
1125
+ "text",
1126
+ "muted",
1127
+ "primary",
1128
+ "secondary",
1129
+ "accent",
1130
+ "current"
1131
+ ];
1132
+ var accordionIconMotionValues = [
1133
+ "none",
1134
+ "rotate",
1135
+ "swap"
1136
+ ];
1095
1137
  function defineBlockDesignCapability(capability) {
1096
1138
  return {
1097
1139
  ...capability,
@@ -1101,7 +1143,9 @@ function defineBlockDesignCapability(capability) {
1101
1143
  imageSurfaceMotions: capability.imageSurfaceMotions ?? ["static"],
1102
1144
  testimonialCardTreatments: capability.testimonialCardTreatments ?? ["default"],
1103
1145
  tileTreatments: capability.tileTreatments ?? ["default"],
1104
- eyebrowTreatments: capability.eyebrowTreatments ?? ["plain"]
1146
+ eyebrowTreatments: capability.eyebrowTreatments ?? ["plain"],
1147
+ ...capability.headingDecorations ? { headingDecorations: capability.headingDecorations } : {},
1148
+ ...capability.accordionIconSets ? { accordionIconSets: capability.accordionIconSets } : {}
1105
1149
  };
1106
1150
  }
1107
1151
 
@@ -1292,6 +1336,25 @@ var blockAppearancePresets = [
1292
1336
  emphasis: "high"
1293
1337
  }
1294
1338
  }),
1339
+ defineBlockAppearancePreset({
1340
+ kind: "block-design",
1341
+ id: "intro-soft-earth-statement",
1342
+ target: "intro",
1343
+ label: "Soft Earth intro statement",
1344
+ blockKinds: ["block.intro"],
1345
+ design: {
1346
+ sectionSurface: "base",
1347
+ contentFrame: plainFrame,
1348
+ itemSurface: "none",
1349
+ transitionAfter: "soft-fade-short",
1350
+ emphasis: "high",
1351
+ headingDecoration: {
1352
+ family: "organic-squiggle",
1353
+ placement: "after-heading",
1354
+ colorToken: "primary"
1355
+ }
1356
+ }
1357
+ }),
1295
1358
  defineBlockAppearancePreset({
1296
1359
  kind: "block-design",
1297
1360
  id: "offerings-calm-list",
@@ -1306,6 +1369,25 @@ var blockAppearancePresets = [
1306
1369
  emphasis: "medium"
1307
1370
  }
1308
1371
  }),
1372
+ defineBlockAppearancePreset({
1373
+ kind: "block-design",
1374
+ id: "feature-cards-soft-earth-offerings",
1375
+ target: "feature-cards",
1376
+ label: "Soft Earth offering cards",
1377
+ blockKinds: ["block.feature-cards"],
1378
+ design: {
1379
+ sectionSurface: "base",
1380
+ contentFrame: plainFrame,
1381
+ itemSurface: "raised",
1382
+ transitionAfter: "none",
1383
+ emphasis: "high",
1384
+ headingDecoration: {
1385
+ family: "short-center-rule",
1386
+ placement: "under-centered-heading",
1387
+ colorToken: "primary"
1388
+ }
1389
+ }
1390
+ }),
1309
1391
  defineBlockAppearancePreset({
1310
1392
  kind: "block-design",
1311
1393
  id: "events-base-calendar",
@@ -1434,6 +1516,26 @@ var blockAppearancePresets = [
1434
1516
  testimonialCardTreatment: "accent-quote"
1435
1517
  }
1436
1518
  }),
1519
+ defineBlockAppearancePreset({
1520
+ kind: "block-design",
1521
+ id: "testimonials-soft-earth-proof-band",
1522
+ target: "testimonials",
1523
+ label: "Soft Earth proof band",
1524
+ blockKinds: ["block.testimonials"],
1525
+ design: {
1526
+ sectionSurface: "brand-depth-band",
1527
+ contentFrame: plainFrame,
1528
+ itemSurface: "none",
1529
+ transitionAfter: "soft-fade-short",
1530
+ emphasis: "high",
1531
+ testimonialCardTreatment: "accent-quote",
1532
+ headingDecoration: {
1533
+ family: "short-center-rule",
1534
+ placement: "under-centered-heading",
1535
+ colorToken: "border"
1536
+ }
1537
+ }
1538
+ }),
1437
1539
  defineBlockAppearancePreset({
1438
1540
  kind: "block-design",
1439
1541
  id: "faq-base-accordion",
@@ -1462,6 +1564,25 @@ var blockAppearancePresets = [
1462
1564
  emphasis: "low"
1463
1565
  }
1464
1566
  }),
1567
+ defineBlockAppearancePreset({
1568
+ kind: "block-design",
1569
+ id: "faq-soft-earth-two-column",
1570
+ target: "faq",
1571
+ label: "Soft Earth two-column FAQ",
1572
+ blockKinds: ["block.faq"],
1573
+ design: {
1574
+ sectionSurface: "base",
1575
+ contentFrame: plainFrame,
1576
+ itemSurface: "flat",
1577
+ transitionAfter: "none",
1578
+ emphasis: "medium",
1579
+ accordionIconTreatment: {
1580
+ iconSet: "plus",
1581
+ colorToken: "primary",
1582
+ motion: "swap"
1583
+ }
1584
+ }
1585
+ }),
1465
1586
  defineBlockAppearancePreset({
1466
1587
  kind: "block-design",
1467
1588
  id: "contact-form-panel",
@@ -2134,6 +2255,97 @@ var confidentChip = defineButtonPersonality({
2134
2255
  }
2135
2256
  });
2136
2257
 
2258
+ // ../theme-core/src/buttons/personalities/earth-pill.ts
2259
+ var earthPill = defineButtonPersonality({
2260
+ id: "earth-pill",
2261
+ name: "Earth Pill",
2262
+ description: "Compact terracotta pills with quiet primary-coloured ghost CTAs.",
2263
+ tags: { tone: "classic", energy: "calm", motion: "subtle", era: "organic" },
2264
+ buttonSystem: {
2265
+ global: {
2266
+ cornerStyle: "pill",
2267
+ shadow: "low",
2268
+ textTransform: "none",
2269
+ fontWeight: 500,
2270
+ borderWidth: 1,
2271
+ hoverTransform: "lift",
2272
+ hoverColor: "none",
2273
+ typography: "body",
2274
+ paddingPreset: "default"
2275
+ },
2276
+ sizes: {
2277
+ sm: { padding: "0.5rem 1rem", fontSize: "text-sm" },
2278
+ md: { padding: "0.625rem 1.35rem" },
2279
+ lg: { padding: "0.75rem 1.65rem", fontSize: "text-lg" },
2280
+ xl: { padding: "0.875rem 2rem", fontSize: "text-xl" }
2281
+ },
2282
+ variants: [
2283
+ {
2284
+ id: "primary",
2285
+ name: "Primary",
2286
+ enabled: true,
2287
+ priority: 1,
2288
+ background: { type: "solid", colorToken: "primary" },
2289
+ textColorToken: "primaryForeground",
2290
+ borderRadius: "rounded-full",
2291
+ shadow: { elevation: "low", softness: "soft", position: "bottom" },
2292
+ effects: {
2293
+ hover: [
2294
+ { effectId: "lift", options: { translateY: "-1px" } },
2295
+ { effectId: "background-on-hover", options: { colorToken: "accent" } }
2296
+ ],
2297
+ active: [{ effectId: "scale-down", options: { scale: "0.98" } }]
2298
+ }
2299
+ },
2300
+ {
2301
+ id: "secondary",
2302
+ name: "Secondary",
2303
+ enabled: true,
2304
+ priority: 2,
2305
+ background: { type: "transparent" },
2306
+ textColorToken: "primary",
2307
+ borderRadius: "rounded-full",
2308
+ border: { widthClass: "border", colorToken: "primary" },
2309
+ effects: {
2310
+ hover: [{ effectId: "background-on-hover", options: { colorToken: "muted" } }]
2311
+ }
2312
+ },
2313
+ {
2314
+ id: "outline",
2315
+ name: "Outline",
2316
+ enabled: true,
2317
+ priority: 3,
2318
+ background: { type: "transparent" },
2319
+ textColorToken: "text",
2320
+ borderRadius: "rounded-full",
2321
+ border: { widthClass: "border", colorToken: "border" },
2322
+ effects: {
2323
+ hover: [{ effectId: "background-on-hover", options: { colorToken: "surfaceAlt" } }]
2324
+ }
2325
+ },
2326
+ {
2327
+ id: "ghost",
2328
+ name: "Ghost",
2329
+ enabled: true,
2330
+ priority: 3,
2331
+ background: { type: "transparent" },
2332
+ textColorToken: "primary",
2333
+ borderRadius: "rounded-full",
2334
+ shadow: { elevation: "none", softness: null, position: "bottom" },
2335
+ sizes: {
2336
+ sm: { padding: "0.25rem 0", fontSize: "text-sm" },
2337
+ md: { padding: "0.375rem 0" },
2338
+ lg: { padding: "0.5rem 0", fontSize: "text-lg" },
2339
+ xl: { padding: "0.625rem 0", fontSize: "text-xl" }
2340
+ },
2341
+ effects: {
2342
+ hover: [{ effectId: "opacity-reduce", options: { reduction: 25 } }]
2343
+ }
2344
+ }
2345
+ ]
2346
+ }
2347
+ });
2348
+
2137
2349
  // ../theme-core/src/buttons/personalities/editorial-link.ts
2138
2350
  var editorialLink = defineButtonPersonality({
2139
2351
  id: "editorial-link",
@@ -2592,6 +2804,7 @@ var softPill = defineButtonPersonality({
2592
2804
  // ../theme-core/src/buttons/personalities/index.ts
2593
2805
  var buttonPersonalities = [
2594
2806
  softPill,
2807
+ earthPill,
2595
2808
  confidentChip,
2596
2809
  editorialLink,
2597
2810
  pebble,
@@ -3163,8 +3376,19 @@ var headingTypographyStyleSchema = typographyStyleSchema.extend({
3163
3376
  colorToken: themeColorTokenSchema.nullable().optional()
3164
3377
  });
3165
3378
  var proseLinkUnderlineStyleSchema = z19.enum(["solid", "dotted", "dashed"]);
3166
- var proseLinkUnderlineThicknessSchema = z19.enum(["auto", "fromFont", "thin", "medium", "thick"]);
3167
- var proseLinkUnderlineOffsetSchema = z19.enum(["auto", "tight", "normal", "loose"]);
3379
+ var proseLinkUnderlineThicknessSchema = z19.enum([
3380
+ "auto",
3381
+ "fromFont",
3382
+ "thin",
3383
+ "medium",
3384
+ "thick"
3385
+ ]);
3386
+ var proseLinkUnderlineOffsetSchema = z19.enum([
3387
+ "auto",
3388
+ "tight",
3389
+ "normal",
3390
+ "loose"
3391
+ ]);
3168
3392
  var proseLinkStyleSchema = z19.object({
3169
3393
  colorToken: themeColorTokenSchema.optional(),
3170
3394
  hoverColorToken: themeColorTokenSchema.optional(),
@@ -3175,7 +3399,14 @@ var proseLinkStyleSchema = z19.object({
3175
3399
  underlineThickness: proseLinkUnderlineThicknessSchema.optional(),
3176
3400
  underlineOffset: proseLinkUnderlineOffsetSchema.optional()
3177
3401
  });
3178
- var semanticSpacingSchema = z19.enum(["none", "compact", "cozy", "medium", "comfortable", "spacious"]);
3402
+ var semanticSpacingSchema = z19.enum([
3403
+ "none",
3404
+ "compact",
3405
+ "cozy",
3406
+ "medium",
3407
+ "comfortable",
3408
+ "spacious"
3409
+ ]);
3179
3410
  var boxRoundedSchema = z19.enum(["none", "sm", "md", "lg", "xl", "2xl", "full"]);
3180
3411
  var boxBackgroundOverlaySchema = z19.object({
3181
3412
  type: z19.enum(["none", "color", "gradient"]).nullable().optional(),
@@ -3197,12 +3428,36 @@ var boxBackgroundSchema = z19.object({
3197
3428
  textColor: tokenOrCssColorValueSchema.nullable().optional(),
3198
3429
  headingColor: tokenOrCssColorValueSchema.nullable().optional()
3199
3430
  });
3431
+ var noHeadingDecorationSchema = z19.object({
3432
+ family: z19.literal("none"),
3433
+ placement: z19.literal("none")
3434
+ });
3435
+ var visibleHeadingDecorationSchema = z19.object({
3436
+ family: z19.enum(visibleHeadingDecorationFamilyValues),
3437
+ placement: z19.enum(visibleHeadingDecorationPlacementValues),
3438
+ colorToken: z19.enum(headingDecorationColorTokenValues).optional()
3439
+ });
3440
+ var headingDecorationSchema = z19.union([
3441
+ noHeadingDecorationSchema,
3442
+ visibleHeadingDecorationSchema
3443
+ ]);
3444
+ var accordionIconTreatmentSchema = z19.object({
3445
+ iconSet: z19.enum(accordionIconSetValues),
3446
+ colorToken: z19.enum(accordionIconColorTokenValues),
3447
+ openColorToken: z19.enum(accordionIconColorTokenValues).optional(),
3448
+ motion: z19.enum(accordionIconMotionValues)
3449
+ });
3200
3450
  var sectionStylesOverrideSchema = z19.object({
3201
3451
  background: boxBackgroundSchema.nullable().optional(),
3202
3452
  spacing: semanticSpacingSchema.nullable().optional(),
3203
3453
  minHeight: z19.enum(["none", "banner", "hero", "immersive"]).nullable().optional(),
3204
3454
  tileTreatment: z19.enum(tileTreatmentValues).nullable().optional(),
3205
- eyebrowTreatment: z19.enum(eyebrowTreatmentValues).nullable().optional()
3455
+ eyebrowTreatment: z19.enum(eyebrowTreatmentValues).nullable().optional(),
3456
+ headingDecoration: headingDecorationSchema.nullable().optional(),
3457
+ // Author-level override consumed by later block/editor rendering phases.
3458
+ // Keeping it in section styles lets existing block save APIs persist it.
3459
+ headingDecorationOverride: z19.enum(headingDecorationOverrideValues).nullable().optional(),
3460
+ accordionIconTreatment: accordionIconTreatmentSchema.nullable().optional()
3206
3461
  });
3207
3462
  var containerStylesOverrideSchema = z19.object({
3208
3463
  background: boxBackgroundSchema.nullable().optional(),
@@ -3295,9 +3550,17 @@ var inputStyle = z19.object({
3295
3550
  focus: z19.enum(["glow", "ring", "underline"]),
3296
3551
  label: z19.enum(["inside", "above"])
3297
3552
  });
3298
- var headerVariant = z19.enum(["classic", "centered", "transparent", "floating", "editorial"]);
3553
+ var headerVariant = z19.enum(["classic", "centered", "transparent", "floating"]);
3299
3554
  var headerPositioning = z19.enum(["static", "sticky", "fixed"]);
3300
- var headerNavStyle = z19.enum(["minimal", "underline", "underline-grow", "capsule", "scale", "frosted", "solid"]);
3555
+ var headerNavStyle = z19.enum([
3556
+ "minimal",
3557
+ "underline",
3558
+ "underline-grow",
3559
+ "capsule",
3560
+ "scale",
3561
+ "frosted",
3562
+ "solid"
3563
+ ]);
3301
3564
  var navFontWeight = z19.enum(["regular", "medium", "semibold", "bold"]);
3302
3565
  var headerMaxWidth = z19.enum(["container", "full"]);
3303
3566
  var headerContainerSchema = z19.object({
@@ -3345,8 +3608,22 @@ var dropdownStyleSchema = z19.object({
3345
3608
  textSize: z19.enum(["xs", "sm", "base", "lg"]).optional()
3346
3609
  // optional = no override (browser default)
3347
3610
  }).optional();
3348
- var headerCtaGapSchema = z19.enum(["none", "tight", "compact", "default", "relaxed", "spacious"]);
3349
- var headerCtaTreatmentSchema = z19.enum(["default", "primary", "secondary", "inverted", "outline", "ghost"]);
3611
+ var headerCtaGapSchema = z19.enum([
3612
+ "none",
3613
+ "tight",
3614
+ "compact",
3615
+ "default",
3616
+ "relaxed",
3617
+ "spacious"
3618
+ ]);
3619
+ var headerCtaTreatmentSchema = z19.enum([
3620
+ "default",
3621
+ "primary",
3622
+ "secondary",
3623
+ "inverted",
3624
+ "outline",
3625
+ "ghost"
3626
+ ]);
3350
3627
  var navContainerSchema = z19.object({
3351
3628
  type: z19.enum(["none", "pill", "glass"]).default("none"),
3352
3629
  tint: z19.string().nullable().optional(),
@@ -3401,7 +3678,14 @@ var footerMaxWidth = z19.enum(["container", "full"]);
3401
3678
  var footerMode = z19.enum(["default", "blocks", "default+blocks", "none"]);
3402
3679
  var footerNavLayoutMode = z19.enum(["stack", "inline", "inline-wrap"]);
3403
3680
  var footerNavLayoutAlign = z19.enum(["start", "center", "end", "space-between"]);
3404
- var footerSpacing = z19.enum(["none", "tight", "compact", "default", "relaxed", "spacious"]);
3681
+ var footerSpacing = z19.enum([
3682
+ "none",
3683
+ "tight",
3684
+ "compact",
3685
+ "default",
3686
+ "relaxed",
3687
+ "spacious"
3688
+ ]);
3405
3689
  var footerLogoPlacement = z19.enum(["left", "right", "above", "below"]);
3406
3690
  var footerLogoSize = z19.enum(["sm", "md", "lg", "xl"]);
3407
3691
  var footerLogoMaxHeight = z19.enum(["sm", "md", "lg", "xl"]);
@@ -3466,7 +3750,12 @@ var footerSchema = z19.object({
3466
3750
  logo: footerLogoSchema.optional(),
3467
3751
  bottomBar: footerBottomBarSchema.optional()
3468
3752
  });
3469
- var containerPaddingPresetSchema = z19.enum(["tight", "compact", "default", "relaxed"]);
3753
+ var containerPaddingPresetSchema = z19.enum([
3754
+ "tight",
3755
+ "compact",
3756
+ "default",
3757
+ "relaxed"
3758
+ ]);
3470
3759
  var layoutSchema = z19.object({
3471
3760
  containerPadding: z19.object({
3472
3761
  mobile: containerPaddingPresetSchema.optional(),
@@ -3474,8 +3763,24 @@ var layoutSchema = z19.object({
3474
3763
  desktop: containerPaddingPresetSchema.optional()
3475
3764
  }).optional()
3476
3765
  }).optional();
3477
- var heroTypographySizeSchema = z19.enum(["sm", "base", "lg", "xl", "2xl", "3xl", "4xl", "5xl", "6xl", "editorial"]);
3478
- var heroTypographyLineHeightSchema = z19.enum(["tight", "snug", "normal", "relaxed"]);
3766
+ var heroTypographySizeSchema = z19.enum([
3767
+ "sm",
3768
+ "base",
3769
+ "lg",
3770
+ "xl",
3771
+ "2xl",
3772
+ "3xl",
3773
+ "4xl",
3774
+ "5xl",
3775
+ "6xl",
3776
+ "editorial"
3777
+ ]);
3778
+ var heroTypographyLineHeightSchema = z19.enum([
3779
+ "tight",
3780
+ "snug",
3781
+ "normal",
3782
+ "relaxed"
3783
+ ]);
3479
3784
  var heroResponsiveTypographySchema = z19.object({
3480
3785
  headlineSize: heroTypographySizeSchema.optional(),
3481
3786
  headlineLineHeight: heroTypographyLineHeightSchema.optional(),
@@ -3910,6 +4215,28 @@ var warmNeutralCream = definePaletteVariant({
3910
4215
  { name: "border", hex: "#e0d2b8" }
3911
4216
  ]
3912
4217
  });
4218
+ var warmNeutralSoftEarth = definePaletteVariant({
4219
+ id: "warm-neutral-soft-earth",
4220
+ name: "Warm Neutral \u2014 Soft Earth",
4221
+ description: "Cream ground with terracotta primary, clay accents, and olive depth.",
4222
+ tags: { tone: "classic", energy: "calm", era: "organic" },
4223
+ mode: "light",
4224
+ colors: [
4225
+ { name: "primary", hex: "#a8573d" },
4226
+ { name: "secondary", hex: "#72765c" },
4227
+ { name: "accent", hex: "#c87557" },
4228
+ { name: "success", hex: "#687854" },
4229
+ { name: "warning", hex: "#b7863e" },
4230
+ { name: "destructive", hex: "#a54b3c" },
4231
+ { name: "background", hex: "#fbf6eb" },
4232
+ { name: "surface", hex: "#fffdf7" },
4233
+ { name: "surfaceAlt", hex: "#f0e4d3" },
4234
+ { name: "muted", hex: "#eadbc6" },
4235
+ { name: "text", hex: "#30281f" },
4236
+ { name: "primaryForeground", hex: "#fffaf3" },
4237
+ { name: "border", hex: "#d9c8b2" }
4238
+ ]
4239
+ });
3913
4240
  var warmNeutralForest = definePaletteVariant({
3914
4241
  id: "warm-neutral-forest",
3915
4242
  name: "Warm Neutral \u2014 Forest",
@@ -3943,6 +4270,7 @@ var paletteVariants = [
3943
4270
  // Warm-neutral family
3944
4271
  warmNeutralClay,
3945
4272
  warmNeutralCream,
4273
+ warmNeutralSoftEarth,
3946
4274
  warmNeutralForest,
3947
4275
  // High-contrast family
3948
4276
  highContrastInk,
@@ -3961,6 +4289,12 @@ var paletteVariantsById = new Map(
3961
4289
  function asHeaderLookId(value) {
3962
4290
  return value;
3963
4291
  }
4292
+ function asHeaderLayoutId(value) {
4293
+ return value;
4294
+ }
4295
+ function asHeaderStyleId(value) {
4296
+ return value;
4297
+ }
3964
4298
  function baseHeader(theme) {
3965
4299
  const {
3966
4300
  navLinkStyle: _navLinkStyle,
@@ -3979,75 +4313,435 @@ function baseHeader(theme) {
3979
4313
  navContainer: { type: "none", tint: null, opacity: 0.15 }
3980
4314
  };
3981
4315
  }
3982
- function solidBrandHeader(theme) {
3983
- const ctaVariant = resolveHeaderCtaVariant(theme, "inverted");
3984
- return {
3985
- ...baseHeader(theme),
4316
+ var headerLayoutCatalog = [
4317
+ {
4318
+ id: asHeaderLayoutId("classic"),
4319
+ label: "Classic",
4320
+ description: "Logo and navigation in one practical horizontal row.",
4321
+ structure: "inline-classic",
3986
4322
  variant: "classic",
3987
- positioning: "sticky",
4323
+ defaultPositioning: "sticky",
4324
+ shrinkOnScroll: false
4325
+ },
4326
+ {
4327
+ id: asHeaderLayoutId("centered"),
4328
+ label: "Centered",
4329
+ description: "Logo centered above a balanced navigation row.",
4330
+ structure: "centered-stack",
4331
+ variant: "centered",
4332
+ defaultPositioning: "static",
4333
+ shrinkOnScroll: false,
4334
+ maxRecommendedNavItems: 5,
4335
+ allowedLogoShapes: ["none", "text-only", "horizontal", "square"]
4336
+ },
4337
+ {
4338
+ id: asHeaderLayoutId("floating"),
4339
+ label: "Floating",
4340
+ description: "Detached header chrome that sits over the opening section.",
4341
+ structure: "floating-shell",
4342
+ variant: "floating",
4343
+ defaultPositioning: "fixed",
3988
4344
  shrinkOnScroll: true,
3989
- background: {
3990
- type: "color",
3991
- color: "primary"
3992
- },
3993
- textColor: "primaryForeground",
3994
- navColor: "primaryForeground",
3995
- navStyle: "underline-grow",
3996
- navWeight: "bold",
3997
- navLinkStyle: {
3998
- typography: "body",
3999
- fontWeight: "bold",
4000
- textTransform: "uppercase",
4001
- italic: false,
4002
- colorToken: "primaryForeground",
4003
- hoverColorToken: "secondary",
4004
- textSize: "sm",
4005
- letterSpacing: "wider",
4006
- padding: "compact",
4007
- paddingX: "compact",
4008
- borderRadius: "none",
4009
- effects: {
4010
- hover: [
4011
- { effectId: "text-color-change", options: { hoverColorToken: "secondary" } },
4012
- { effectId: "nav-underline", options: { style: "grow", colorToken: "secondary" } }
4013
- ]
4014
- }
4015
- },
4016
- dropdownStyle: {
4017
- background: "primary-700",
4018
- textColor: "primaryForeground",
4019
- borderColor: null,
4020
- shadow: "md",
4021
- borderRadius: "md",
4022
- hoverBackground: "primary-900",
4023
- hoverTextColor: "secondary",
4024
- textTransform: "uppercase",
4025
- letterSpacing: "wider",
4026
- fontWeight: "bold",
4027
- textSize: "sm"
4028
- },
4029
- border: {
4030
- style: "solid",
4031
- width: "none",
4032
- position: "none"
4033
- },
4034
- logoText: {
4035
- hideOnShrink: true,
4036
- mobileMaxWidth: "sm",
4037
- mobileWrapLines: 2
4038
- },
4039
- ctaGap: "compact",
4040
- ctaTreatment: "inverted",
4041
- ...ctaVariant ? { ctaVariant } : {}
4042
- };
4345
+ maxRecommendedNavItems: 5,
4346
+ allowedLogoShapes: ["none", "text-only", "horizontal"]
4347
+ }
4348
+ ];
4349
+ function supportedLayouts(ids) {
4350
+ return ids.map(asHeaderLayoutId);
4043
4351
  }
4044
- function cleanBaseHeader(theme) {
4045
- return {
4046
- ...baseHeader(theme),
4047
- variant: "classic",
4048
- positioning: "sticky",
4049
- shrinkOnScroll: false,
4050
- background: {
4352
+ var headerStyleCatalog = [
4353
+ {
4354
+ id: asHeaderStyleId("minimal"),
4355
+ label: "Minimal",
4356
+ description: "Quiet surface with simple color-change navigation.",
4357
+ supportedLayoutIds: supportedLayouts(["classic", "centered"]),
4358
+ navInteraction: "color-change",
4359
+ surface: "neutral",
4360
+ navTypography: "plain"
4361
+ },
4362
+ {
4363
+ id: asHeaderStyleId("fine-line"),
4364
+ label: "Fine Line",
4365
+ description: "Light surface with a crisp lower rule and underline hover.",
4366
+ supportedLayoutIds: supportedLayouts(["classic", "centered"]),
4367
+ navInteraction: "underline-grow",
4368
+ surface: "bordered",
4369
+ navTypography: "plain"
4370
+ },
4371
+ {
4372
+ id: asHeaderStyleId("soft-bar"),
4373
+ label: "Soft Bar",
4374
+ description: "Soft tinted surface with gentle pill hover states.",
4375
+ supportedLayoutIds: supportedLayouts(["classic", "centered"]),
4376
+ navInteraction: "pill-background",
4377
+ surface: "soft",
4378
+ navTypography: "plain"
4379
+ },
4380
+ {
4381
+ id: asHeaderStyleId("pill-nav"),
4382
+ label: "Pill Nav",
4383
+ description: "A calm pill navigation rail over a neutral header.",
4384
+ supportedLayoutIds: supportedLayouts(["classic", "centered"]),
4385
+ navInteraction: "pill-background",
4386
+ surface: "soft",
4387
+ navTypography: "plain"
4388
+ },
4389
+ {
4390
+ id: asHeaderStyleId("brand-bar"),
4391
+ label: "Brand Bar",
4392
+ description: "Solid brand surface with high-contrast navigation.",
4393
+ supportedLayoutIds: supportedLayouts(["classic", "centered"]),
4394
+ navInteraction: "color-change",
4395
+ surface: "brand-solid",
4396
+ navTypography: "brand-caps"
4397
+ },
4398
+ {
4399
+ id: asHeaderStyleId("brand-underline"),
4400
+ label: "Brand Underline",
4401
+ description: "Brand surface with underline-grow navigation.",
4402
+ supportedLayoutIds: supportedLayouts(["classic"]),
4403
+ navInteraction: "underline-grow",
4404
+ surface: "brand-solid",
4405
+ navTypography: "brand-caps"
4406
+ },
4407
+ {
4408
+ id: asHeaderStyleId("brand-pill"),
4409
+ label: "Brand Pill",
4410
+ description: "Solid brand surface with rounded active and hover states.",
4411
+ supportedLayoutIds: supportedLayouts(["classic", "centered", "floating"]),
4412
+ navInteraction: "pill-background",
4413
+ surface: "brand-solid",
4414
+ navTypography: "brand-caps"
4415
+ },
4416
+ {
4417
+ id: asHeaderStyleId("serif-line"),
4418
+ label: "Serif Line",
4419
+ description: "Typographic logo treatment with understated underline navigation.",
4420
+ supportedLayoutIds: supportedLayouts(["classic", "centered"]),
4421
+ navInteraction: "underline-grow",
4422
+ surface: "bordered",
4423
+ navTypography: "heading"
4424
+ },
4425
+ {
4426
+ id: asHeaderStyleId("flat-tabs"),
4427
+ label: "Flat Tabs",
4428
+ description: "Flat block hover and active states with a Swiss utility feel.",
4429
+ supportedLayoutIds: supportedLayouts(["classic", "centered"]),
4430
+ navInteraction: "flat-block",
4431
+ surface: "bordered",
4432
+ navTypography: "quiet-caps"
4433
+ },
4434
+ {
4435
+ id: asHeaderStyleId("glass"),
4436
+ label: "Glass",
4437
+ description: "Translucent chrome with frosted navigation backing.",
4438
+ supportedLayoutIds: supportedLayouts(["classic", "floating"]),
4439
+ navInteraction: "glass-backed",
4440
+ surface: "floating",
4441
+ navTypography: "plain"
4442
+ },
4443
+ {
4444
+ id: asHeaderStyleId("minimal-surface"),
4445
+ label: "Clear Split",
4446
+ description: "Floating logo with transparent navigation and no shared shell.",
4447
+ supportedLayoutIds: supportedLayouts(["floating"]),
4448
+ navInteraction: "color-change",
4449
+ surface: "floating",
4450
+ navTypography: "plain"
4451
+ },
4452
+ {
4453
+ id: asHeaderStyleId("soft-shell"),
4454
+ label: "Soft Shell",
4455
+ description: "Floating rounded shell with soft pill navigation states.",
4456
+ supportedLayoutIds: supportedLayouts(["floating"]),
4457
+ navInteraction: "pill-background",
4458
+ surface: "floating",
4459
+ navTypography: "plain"
4460
+ },
4461
+ {
4462
+ id: asHeaderStyleId("split-glass"),
4463
+ label: "Split Glass",
4464
+ description: "Logo floats independently while the navigation sits in a glass rail.",
4465
+ supportedLayoutIds: supportedLayouts(["floating"]),
4466
+ navInteraction: "glass-backed",
4467
+ surface: "floating",
4468
+ navTypography: "quiet-caps"
4469
+ },
4470
+ {
4471
+ id: asHeaderStyleId("split-pill"),
4472
+ label: "Split Pill",
4473
+ description: "Logo floats independently with a soft pill-backed navigation rail.",
4474
+ supportedLayoutIds: supportedLayouts(["floating"]),
4475
+ navInteraction: "pill-background",
4476
+ surface: "floating",
4477
+ navTypography: "heading"
4478
+ }
4479
+ ];
4480
+ var headerLayoutsById = new Map(
4481
+ headerLayoutCatalog.map((layout) => [layout.id, layout])
4482
+ );
4483
+ var headerStylesById = new Map(
4484
+ headerStyleCatalog.map((style) => [style.id, style])
4485
+ );
4486
+ var headerStyleCompatibilityOrder = /* @__PURE__ */ new Map([
4487
+ [
4488
+ asHeaderLayoutId("classic"),
4489
+ headerStyleRepairChain([
4490
+ "minimal",
4491
+ "glass",
4492
+ "fine-line",
4493
+ "soft-bar",
4494
+ "pill-nav",
4495
+ "brand-bar",
4496
+ "brand-underline",
4497
+ "brand-pill",
4498
+ "serif-line",
4499
+ "flat-tabs"
4500
+ ])
4501
+ ],
4502
+ [
4503
+ asHeaderLayoutId("centered"),
4504
+ headerStyleRepairChain([
4505
+ "minimal",
4506
+ "fine-line",
4507
+ "soft-bar",
4508
+ "pill-nav",
4509
+ "brand-bar",
4510
+ "brand-pill",
4511
+ "serif-line",
4512
+ "flat-tabs"
4513
+ ])
4514
+ ],
4515
+ [
4516
+ asHeaderLayoutId("floating"),
4517
+ headerStyleRepairChain([
4518
+ "glass",
4519
+ "minimal-surface",
4520
+ "split-glass",
4521
+ "split-pill",
4522
+ "soft-shell",
4523
+ "brand-pill"
4524
+ ])
4525
+ ]
4526
+ ]);
4527
+ function headerStyleRepairChain(values) {
4528
+ return values.map(asHeaderStyleId);
4529
+ }
4530
+ var headerStyleRepairOrder = /* @__PURE__ */ new Map(
4531
+ [
4532
+ [
4533
+ asHeaderStyleId("brand-bar"),
4534
+ headerStyleRepairChain(["brand-bar", "brand-pill", "minimal"])
4535
+ ],
4536
+ [
4537
+ asHeaderStyleId("brand-underline"),
4538
+ headerStyleRepairChain(["serif-line", "fine-line", "minimal"])
4539
+ ],
4540
+ [
4541
+ asHeaderStyleId("brand-pill"),
4542
+ headerStyleRepairChain(["brand-pill", "brand-bar", "minimal"])
4543
+ ],
4544
+ [
4545
+ asHeaderStyleId("pill-nav"),
4546
+ headerStyleRepairChain(["pill-nav", "soft-bar", "minimal"])
4547
+ ],
4548
+ [
4549
+ asHeaderStyleId("flat-tabs"),
4550
+ headerStyleRepairChain(["flat-tabs", "pill-nav", "minimal"])
4551
+ ],
4552
+ [
4553
+ asHeaderStyleId("serif-line"),
4554
+ headerStyleRepairChain(["serif-line", "fine-line", "minimal"])
4555
+ ],
4556
+ [
4557
+ asHeaderStyleId("glass"),
4558
+ headerStyleRepairChain(["glass", "minimal-surface", "minimal"])
4559
+ ],
4560
+ [
4561
+ asHeaderStyleId("soft-shell"),
4562
+ headerStyleRepairChain(["soft-shell", "soft-bar", "minimal"])
4563
+ ],
4564
+ [
4565
+ asHeaderStyleId("minimal-surface"),
4566
+ headerStyleRepairChain(["minimal-surface", "minimal"])
4567
+ ],
4568
+ [
4569
+ asHeaderStyleId("split-glass"),
4570
+ headerStyleRepairChain(["split-glass", "glass", "minimal-surface"])
4571
+ ],
4572
+ [
4573
+ asHeaderStyleId("split-pill"),
4574
+ headerStyleRepairChain(["split-pill", "soft-shell", "brand-pill"])
4575
+ ],
4576
+ [
4577
+ asHeaderStyleId("fine-line"),
4578
+ headerStyleRepairChain(["fine-line", "minimal"])
4579
+ ],
4580
+ [
4581
+ asHeaderStyleId("soft-bar"),
4582
+ headerStyleRepairChain(["soft-bar", "minimal"])
4583
+ ],
4584
+ [asHeaderStyleId("minimal"), headerStyleRepairChain(["minimal"])]
4585
+ ]
4586
+ );
4587
+ var legacyHeaderLookAliases = [
4588
+ {
4589
+ lookId: asHeaderLookId("clean-base"),
4590
+ selection: {
4591
+ layoutId: asHeaderLayoutId("classic"),
4592
+ styleId: asHeaderStyleId("minimal")
4593
+ }
4594
+ },
4595
+ {
4596
+ lookId: asHeaderLookId("brand-solid"),
4597
+ selection: {
4598
+ layoutId: asHeaderLayoutId("classic"),
4599
+ styleId: asHeaderStyleId("brand-bar")
4600
+ }
4601
+ },
4602
+ {
4603
+ lookId: asHeaderLookId("serif-line"),
4604
+ selection: {
4605
+ layoutId: asHeaderLayoutId("centered"),
4606
+ styleId: asHeaderStyleId("serif-line")
4607
+ }
4608
+ },
4609
+ {
4610
+ lookId: asHeaderLookId("centered-calm"),
4611
+ selection: {
4612
+ layoutId: asHeaderLayoutId("centered"),
4613
+ styleId: asHeaderStyleId("minimal")
4614
+ }
4615
+ },
4616
+ {
4617
+ lookId: asHeaderLookId("practical-utility"),
4618
+ selection: {
4619
+ layoutId: asHeaderLayoutId("classic"),
4620
+ styleId: asHeaderStyleId("flat-tabs")
4621
+ }
4622
+ },
4623
+ {
4624
+ lookId: asHeaderLookId("minimal-transparent"),
4625
+ selection: {
4626
+ layoutId: asHeaderLayoutId("classic"),
4627
+ styleId: asHeaderStyleId("minimal")
4628
+ }
4629
+ },
4630
+ {
4631
+ lookId: asHeaderLookId("transparent-overlay"),
4632
+ selection: {
4633
+ layoutId: asHeaderLayoutId("floating"),
4634
+ styleId: asHeaderStyleId("glass")
4635
+ }
4636
+ },
4637
+ {
4638
+ lookId: asHeaderLookId("floating-glass"),
4639
+ selection: {
4640
+ layoutId: asHeaderLayoutId("floating"),
4641
+ styleId: asHeaderStyleId("glass")
4642
+ }
4643
+ }
4644
+ ];
4645
+ var legacyHeaderLookAliasesById = new Map(legacyHeaderLookAliases.map((alias) => [alias.lookId, alias]));
4646
+ function getHeaderStyle(id) {
4647
+ return headerStylesById.get(id) ?? null;
4648
+ }
4649
+ function isHeaderStyleCompatibleWithLayout(style, layoutId) {
4650
+ return style.supportedLayoutIds.includes(layoutId);
4651
+ }
4652
+ function getHeaderStyleOrThrow(id) {
4653
+ const style = getHeaderStyle(id);
4654
+ if (!style) {
4655
+ throw new Error(`Unknown Theme V2 header style: ${id}`);
4656
+ }
4657
+ return style;
4658
+ }
4659
+ function resolveLegacyHeaderLookAlias(lookId) {
4660
+ return legacyHeaderLookAliasesById.get(lookId)?.selection ?? null;
4661
+ }
4662
+ function getCompatibleHeaderStyleIds(layoutId) {
4663
+ return (headerStyleCompatibilityOrder.get(layoutId) ?? []).filter(
4664
+ (styleId) => {
4665
+ const style = getHeaderStyleOrThrow(styleId);
4666
+ return isHeaderStyleCompatibleWithLayout(style, layoutId);
4667
+ }
4668
+ );
4669
+ }
4670
+ function solidBrandHeader(theme) {
4671
+ const ctaVariant = resolveHeaderCtaVariant(theme, "inverted");
4672
+ return {
4673
+ ...baseHeader(theme),
4674
+ variant: "classic",
4675
+ positioning: "sticky",
4676
+ shrinkOnScroll: true,
4677
+ background: {
4678
+ type: "color",
4679
+ color: "primary"
4680
+ },
4681
+ textColor: "primaryForeground",
4682
+ navColor: "primaryForeground",
4683
+ navStyle: "underline-grow",
4684
+ navWeight: "bold",
4685
+ navLinkStyle: {
4686
+ typography: "body",
4687
+ fontWeight: "bold",
4688
+ textTransform: "uppercase",
4689
+ italic: false,
4690
+ colorToken: "primaryForeground",
4691
+ hoverColorToken: "secondary",
4692
+ textSize: "sm",
4693
+ letterSpacing: "wider",
4694
+ padding: "compact",
4695
+ paddingX: "compact",
4696
+ borderRadius: "none",
4697
+ effects: {
4698
+ hover: [
4699
+ {
4700
+ effectId: "text-color-change",
4701
+ options: { hoverColorToken: "secondary" }
4702
+ },
4703
+ {
4704
+ effectId: "nav-underline",
4705
+ options: { style: "grow", colorToken: "secondary" }
4706
+ }
4707
+ ]
4708
+ }
4709
+ },
4710
+ dropdownStyle: {
4711
+ background: "primary-700",
4712
+ textColor: "primaryForeground",
4713
+ borderColor: null,
4714
+ shadow: "md",
4715
+ borderRadius: "md",
4716
+ hoverBackground: "primary-900",
4717
+ hoverTextColor: "secondary",
4718
+ textTransform: "uppercase",
4719
+ letterSpacing: "wider",
4720
+ fontWeight: "bold",
4721
+ textSize: "sm"
4722
+ },
4723
+ border: {
4724
+ style: "solid",
4725
+ width: "none",
4726
+ position: "none"
4727
+ },
4728
+ logoText: {
4729
+ hideOnShrink: true,
4730
+ mobileMaxWidth: "sm",
4731
+ mobileWrapLines: 2
4732
+ },
4733
+ ctaGap: "compact",
4734
+ ctaTreatment: "inverted",
4735
+ ...ctaVariant ? { ctaVariant } : {}
4736
+ };
4737
+ }
4738
+ function cleanBaseHeader(theme) {
4739
+ return {
4740
+ ...baseHeader(theme),
4741
+ variant: "classic",
4742
+ positioning: "sticky",
4743
+ shrinkOnScroll: false,
4744
+ background: {
4051
4745
  type: "color",
4052
4746
  color: "surface"
4053
4747
  },
@@ -4065,10 +4759,10 @@ function cleanBaseHeader(theme) {
4065
4759
  ctaGap: "default"
4066
4760
  };
4067
4761
  }
4068
- function editorialLineHeader(theme) {
4762
+ function serifLineHeader(theme) {
4069
4763
  return {
4070
4764
  ...baseHeader(theme),
4071
- variant: "editorial",
4765
+ variant: "centered",
4072
4766
  positioning: "sticky",
4073
4767
  shrinkOnScroll: false,
4074
4768
  background: {
@@ -4215,6 +4909,11 @@ var headerLookCatalog = [
4215
4909
  label: "Clean base",
4216
4910
  visualTreatment: "solid-neutral",
4217
4911
  layoutBehavior: "sticky",
4912
+ configuration: {
4913
+ structure: "inline-classic",
4914
+ treatment: "solid-neutral",
4915
+ behavior: "sticky"
4916
+ },
4218
4917
  openingRequirement: "none",
4219
4918
  compile: cleanBaseHeader
4220
4919
  },
@@ -4223,23 +4922,38 @@ var headerLookCatalog = [
4223
4922
  label: "Brand solid",
4224
4923
  visualTreatment: "solid-brand",
4225
4924
  layoutBehavior: "sticky-shrink",
4925
+ configuration: {
4926
+ structure: "inline-classic",
4927
+ treatment: "solid-brand",
4928
+ behavior: "sticky-shrink"
4929
+ },
4226
4930
  openingRequirement: "none",
4227
4931
  compile: solidBrandHeader
4228
4932
  },
4229
4933
  {
4230
- id: asHeaderLookId("editorial-line"),
4231
- label: "Editorial line",
4232
- visualTreatment: "light-editorial",
4934
+ id: asHeaderLookId("serif-line"),
4935
+ label: "Serif line",
4936
+ visualTreatment: "light-serif",
4233
4937
  layoutBehavior: "sticky",
4938
+ configuration: {
4939
+ structure: "centered-stack",
4940
+ treatment: "light-serif",
4941
+ behavior: "sticky"
4942
+ },
4234
4943
  openingRequirement: "none",
4235
4944
  maxRecommendedNavItems: 6,
4236
- compile: editorialLineHeader
4945
+ compile: serifLineHeader
4237
4946
  },
4238
4947
  {
4239
4948
  id: asHeaderLookId("centered-calm"),
4240
4949
  label: "Centered calm",
4241
- visualTreatment: "light-editorial",
4950
+ visualTreatment: "light-serif",
4242
4951
  layoutBehavior: "normal-flow",
4952
+ configuration: {
4953
+ structure: "centered-stack",
4954
+ treatment: "light-serif",
4955
+ behavior: "normal-flow"
4956
+ },
4243
4957
  openingRequirement: "none",
4244
4958
  maxRecommendedNavItems: 5,
4245
4959
  allowedLogoShapes: ["none", "text-only", "horizontal", "square"],
@@ -4250,6 +4964,11 @@ var headerLookCatalog = [
4250
4964
  label: "Practical utility",
4251
4965
  visualTreatment: "solid-neutral",
4252
4966
  layoutBehavior: "sticky-shrink",
4967
+ configuration: {
4968
+ structure: "inline-classic",
4969
+ treatment: "solid-neutral",
4970
+ behavior: "sticky-shrink"
4971
+ },
4253
4972
  openingRequirement: "none",
4254
4973
  requiresProminentCta: true,
4255
4974
  compile: practicalUtilityHeader
@@ -4259,6 +4978,11 @@ var headerLookCatalog = [
4259
4978
  label: "Minimal transparent",
4260
4979
  visualTreatment: "minimal-transparent",
4261
4980
  layoutBehavior: "normal-flow",
4981
+ configuration: {
4982
+ structure: "inline-classic",
4983
+ treatment: "minimal-transparent",
4984
+ behavior: "normal-flow"
4985
+ },
4262
4986
  openingRequirement: "reserved-space-ok",
4263
4987
  compile: minimalTransparentHeader
4264
4988
  },
@@ -4267,6 +4991,11 @@ var headerLookCatalog = [
4267
4991
  label: "Transparent overlay",
4268
4992
  visualTreatment: "transparent-overlay",
4269
4993
  layoutBehavior: "fixed-overlay",
4994
+ configuration: {
4995
+ structure: "inline-classic",
4996
+ treatment: "transparent-overlay",
4997
+ behavior: "fixed-overlay"
4998
+ },
4270
4999
  openingRequirement: "requires-image-hero-with-contrast-overlay",
4271
5000
  maxRecommendedNavItems: 5,
4272
5001
  allowedLogoShapes: ["none", "text-only", "horizontal"],
@@ -4277,6 +5006,11 @@ var headerLookCatalog = [
4277
5006
  label: "Floating glass",
4278
5007
  visualTreatment: "floating-glass",
4279
5008
  layoutBehavior: "fixed-floating",
5009
+ configuration: {
5010
+ structure: "floating-shell",
5011
+ treatment: "floating-glass",
5012
+ behavior: "fixed-floating"
5013
+ },
4280
5014
  openingRequirement: "requires-image-hero-with-contrast-overlay",
4281
5015
  maxRecommendedNavItems: 5,
4282
5016
  allowedLogoShapes: ["none", "text-only", "horizontal"],
@@ -4284,9 +5018,17 @@ var headerLookCatalog = [
4284
5018
  }
4285
5019
  ];
4286
5020
  var guaranteedFallbackHeaderLookId = asHeaderLookId("clean-base");
5021
+ var guaranteedFallbackHeaderLayoutId = asHeaderLayoutId("classic");
5022
+ var guaranteedFallbackHeaderStyleId = asHeaderStyleId("minimal");
5023
+ var allowedHeaderConfigurationKeys = new Set(
5024
+ headerLookCatalog.map((look) => headerConfigurationKey(look.configuration))
5025
+ );
4287
5026
  var headerLooksById = new Map(
4288
5027
  headerLookCatalog.map((look) => [look.id, look])
4289
5028
  );
5029
+ function headerConfigurationKey(configuration) {
5030
+ return `${configuration.structure}:${configuration.treatment}:${configuration.behavior}`;
5031
+ }
4290
5032
 
4291
5033
  // ../theme-core/src/site-styles/footerLooks.ts
4292
5034
  function asFooterLookId(value) {
@@ -4419,6 +5161,264 @@ var advancedDesignOptionCatalog = {
4419
5161
  detachedCustom: true
4420
5162
  };
4421
5163
 
5164
+ // ../theme-core/src/site-styles/typographyPresets.ts
5165
+ var bodyReadablePolicy = {
5166
+ recommendedCategories: ["sans-serif", "serif"],
5167
+ allowedCategories: ["sans-serif", "serif"],
5168
+ requiresItalicForBody: true,
5169
+ requiresBoldForBody: true
5170
+ };
5171
+ var headingFlexiblePolicy = {
5172
+ recommendedCategories: ["sans-serif", "serif", "display"],
5173
+ allowedCategories: ["sans-serif", "serif", "display"]
5174
+ };
5175
+ var displayHeadingPolicy = {
5176
+ recommendedCategories: ["display", "sans-serif", "serif"],
5177
+ allowedCategories: ["display", "sans-serif", "serif"]
5178
+ };
5179
+ function asTypographyPresetId(value) {
5180
+ if (!value.startsWith("typography-preset:")) {
5181
+ throw new Error(`TypographyPresetId must start with "typography-preset:". Received: ${value}`);
5182
+ }
5183
+ return value;
5184
+ }
5185
+ function defineTypographyPreset(preset) {
5186
+ return {
5187
+ ...preset,
5188
+ id: asTypographyPresetId(preset.id)
5189
+ };
5190
+ }
5191
+ var modernSansTypography = {
5192
+ body: {
5193
+ family: "Inter, system-ui, sans-serif",
5194
+ size: "md",
5195
+ weight: "regular",
5196
+ lineHeight: "relaxed",
5197
+ letterSpacing: "normal"
5198
+ },
5199
+ headings: {
5200
+ default: {
5201
+ family: "Inter, system-ui, sans-serif",
5202
+ weight: "semibold",
5203
+ lineHeight: "normal",
5204
+ letterSpacing: "tight",
5205
+ italic: null,
5206
+ case: null
5207
+ },
5208
+ h1: { size: "xl", weight: "bold", lineHeight: "normal", letterSpacing: "tight", italic: null },
5209
+ h2: { size: "lg", weight: "semibold", lineHeight: "normal", letterSpacing: "tight", italic: null },
5210
+ h3: { size: "md", weight: "semibold", lineHeight: "normal", letterSpacing: "normal", italic: null }
5211
+ },
5212
+ scale: "balanced"
5213
+ };
5214
+ var warmRoundedTypography = {
5215
+ body: {
5216
+ family: "Nunito Sans, system-ui, sans-serif",
5217
+ size: "lg",
5218
+ weight: "regular",
5219
+ lineHeight: "relaxed",
5220
+ letterSpacing: "normal"
5221
+ },
5222
+ headings: {
5223
+ default: {
5224
+ family: "Nunito Sans, system-ui, sans-serif",
5225
+ weight: "bold",
5226
+ lineHeight: "normal",
5227
+ letterSpacing: "normal",
5228
+ italic: null,
5229
+ case: null
5230
+ },
5231
+ h1: { size: "xl", weight: "bold", lineHeight: "normal", letterSpacing: "normal", italic: null },
5232
+ h2: { size: "lg", weight: "bold", lineHeight: "normal", letterSpacing: "normal", italic: null },
5233
+ h3: { size: "md", weight: "semibold", lineHeight: "relaxed", letterSpacing: "normal", italic: null }
5234
+ },
5235
+ scale: "balanced"
5236
+ };
5237
+ var editorialSerifTypography = {
5238
+ body: {
5239
+ family: "Lora, Georgia, serif",
5240
+ size: "lg",
5241
+ weight: "regular",
5242
+ lineHeight: "loose",
5243
+ letterSpacing: "normal"
5244
+ },
5245
+ headings: {
5246
+ default: {
5247
+ family: "Playfair Display, Georgia, serif",
5248
+ weight: "semibold",
5249
+ lineHeight: "normal",
5250
+ letterSpacing: "tight",
5251
+ italic: null,
5252
+ case: null
5253
+ },
5254
+ h1: { size: "2xl", weight: "semibold", lineHeight: "normal", letterSpacing: "tight", italic: null },
5255
+ h2: { size: "xl", weight: "semibold", lineHeight: "normal", letterSpacing: "normal", italic: null },
5256
+ h3: { size: "md", weight: "semibold", lineHeight: "relaxed", letterSpacing: "normal", italic: true }
5257
+ },
5258
+ scale: "spacious"
5259
+ };
5260
+ var classicSerifTypography = {
5261
+ body: {
5262
+ family: "Libre Baskerville, Georgia, serif",
5263
+ size: "md",
5264
+ weight: "regular",
5265
+ lineHeight: "relaxed",
5266
+ letterSpacing: "normal"
5267
+ },
5268
+ headings: {
5269
+ default: {
5270
+ family: "Cormorant Garamond, Georgia, serif",
5271
+ weight: "semibold",
5272
+ lineHeight: "normal",
5273
+ letterSpacing: "normal",
5274
+ italic: null,
5275
+ case: null
5276
+ },
5277
+ h1: { size: "2xl", weight: "semibold", lineHeight: "normal", letterSpacing: "normal", italic: null },
5278
+ h2: { size: "xl", weight: "semibold", lineHeight: "normal", letterSpacing: "normal", italic: null },
5279
+ h3: { size: "md", weight: "medium", lineHeight: "relaxed", letterSpacing: "normal", italic: null }
5280
+ },
5281
+ scale: "balanced"
5282
+ };
5283
+ var luxeContrastTypography = {
5284
+ body: {
5285
+ family: "Manrope, system-ui, sans-serif",
5286
+ size: "md",
5287
+ weight: "regular",
5288
+ lineHeight: "relaxed",
5289
+ letterSpacing: "normal"
5290
+ },
5291
+ headings: {
5292
+ default: {
5293
+ family: "Cormorant Garamond, Georgia, serif",
5294
+ weight: "semibold",
5295
+ lineHeight: "normal",
5296
+ letterSpacing: "tight",
5297
+ italic: null,
5298
+ case: null
5299
+ },
5300
+ h1: { size: "2xl", weight: "semibold", lineHeight: "normal", letterSpacing: "tight", italic: null },
5301
+ h2: { size: "xl", weight: "semibold", lineHeight: "normal", letterSpacing: "tight", italic: null },
5302
+ h3: { size: "md", weight: "medium", lineHeight: "relaxed", letterSpacing: "normal", italic: null }
5303
+ },
5304
+ scale: "spacious"
5305
+ };
5306
+ var boldDisplayTypography = {
5307
+ body: {
5308
+ family: "Manrope, system-ui, sans-serif",
5309
+ size: "lg",
5310
+ weight: "regular",
5311
+ lineHeight: "relaxed",
5312
+ letterSpacing: "normal"
5313
+ },
5314
+ headings: {
5315
+ default: {
5316
+ family: '"TAN - PEARL", sans-serif',
5317
+ weight: "bold",
5318
+ lineHeight: "normal",
5319
+ letterSpacing: "tight",
5320
+ colorToken: "primary",
5321
+ italic: null,
5322
+ case: null
5323
+ },
5324
+ h1: { size: "xl", weight: "bold", lineHeight: "normal", letterSpacing: "tight", italic: null },
5325
+ h2: { size: "lg", weight: "bold", lineHeight: "normal", letterSpacing: "normal", italic: null },
5326
+ h3: { size: "md", weight: "bold", lineHeight: "normal", letterSpacing: "normal", italic: null }
5327
+ },
5328
+ scale: "balanced"
5329
+ };
5330
+ var typographyPresets = [
5331
+ defineTypographyPreset({
5332
+ id: "typography-preset:modern-sans",
5333
+ name: "Modern Sans",
5334
+ description: "Crisp, neutral type for clear service pages and practical editorial structure.",
5335
+ defaultFonts: { body: "Inter, system-ui, sans-serif", heading: "Inter, system-ui, sans-serif" },
5336
+ recommendedFonts: {
5337
+ body: ["Inter", "Source Sans 3", "IBM Plex Sans"],
5338
+ heading: ["Inter", "Manrope", "Source Sans 3"]
5339
+ },
5340
+ slotPolicies: { body: bodyReadablePolicy, heading: headingFlexiblePolicy },
5341
+ typography: modernSansTypography
5342
+ }),
5343
+ defineTypographyPreset({
5344
+ id: "typography-preset:warm-rounded",
5345
+ name: "Warm Rounded",
5346
+ description: "Soft, friendly type for welcoming studios, classes, and community businesses.",
5347
+ defaultFonts: { body: "Nunito Sans, system-ui, sans-serif", heading: "Nunito Sans, system-ui, sans-serif" },
5348
+ recommendedFonts: {
5349
+ body: ["Nunito Sans", "Atkinson Hyperlegible", "Lato"],
5350
+ heading: ["Nunito Sans", "Quicksand", "Manrope"]
5351
+ },
5352
+ slotPolicies: { body: bodyReadablePolicy, heading: headingFlexiblePolicy },
5353
+ typography: warmRoundedTypography
5354
+ }),
5355
+ defineTypographyPreset({
5356
+ id: "typography-preset:editorial-serif",
5357
+ name: "Editorial Serif",
5358
+ description: "Story-led type with warm reading rhythm and expressive headings.",
5359
+ defaultFonts: { body: "Lora, Georgia, serif", heading: "Playfair Display, Georgia, serif" },
5360
+ recommendedFonts: {
5361
+ body: ["Lora", "Source Serif 4", "Libre Baskerville"],
5362
+ heading: ["Playfair Display", "Cormorant Garamond", "Fraunces"]
5363
+ },
5364
+ slotPolicies: { body: bodyReadablePolicy, heading: displayHeadingPolicy },
5365
+ typography: editorialSerifTypography
5366
+ }),
5367
+ defineTypographyPreset({
5368
+ id: "typography-preset:classic-serif",
5369
+ name: "Classic Serif",
5370
+ description: "Measured, polished type for premium and established offers.",
5371
+ defaultFonts: { body: "Libre Baskerville, Georgia, serif", heading: "Cormorant Garamond, Georgia, serif" },
5372
+ recommendedFonts: {
5373
+ body: ["Libre Baskerville", "Source Serif 4", "Lora"],
5374
+ heading: ["Cormorant Garamond", "Playfair Display", "Libre Baskerville"]
5375
+ },
5376
+ slotPolicies: { body: bodyReadablePolicy, heading: displayHeadingPolicy },
5377
+ typography: classicSerifTypography
5378
+ }),
5379
+ defineTypographyPreset({
5380
+ id: "typography-preset:luxe-contrast",
5381
+ name: "Luxe Contrast",
5382
+ description: "A restrained sans body paired with elegant high-contrast headings.",
5383
+ defaultFonts: { body: "Manrope, system-ui, sans-serif", heading: "Cormorant Garamond, Georgia, serif" },
5384
+ recommendedFonts: {
5385
+ body: ["Manrope", "Inter", "Source Sans 3"],
5386
+ heading: ["Cormorant Garamond", "Playfair Display", "Bodoni Moda"]
5387
+ },
5388
+ slotPolicies: { body: bodyReadablePolicy, heading: displayHeadingPolicy },
5389
+ typography: luxeContrastTypography
5390
+ }),
5391
+ defineTypographyPreset({
5392
+ id: "typography-preset:bold-display",
5393
+ name: "Bold Display",
5394
+ description: "Punchy display headings with readable sans body copy for branded launches.",
5395
+ defaultFonts: { body: "Manrope, system-ui, sans-serif", heading: '"TAN - PEARL", sans-serif' },
5396
+ recommendedFonts: {
5397
+ body: ["Manrope", "Inter", "Space Grotesk"],
5398
+ heading: ["Anton", "Bebas Neue", "Archivo Black"]
5399
+ },
5400
+ slotPolicies: { body: bodyReadablePolicy, heading: displayHeadingPolicy },
5401
+ typography: boldDisplayTypography,
5402
+ heroTypography: {
5403
+ headlineSize: "6xl",
5404
+ headlineLineHeight: "tight",
5405
+ subheadlineSize: "editorial",
5406
+ subheadlineLineHeight: "normal",
5407
+ microHeadlineSize: "6xl",
5408
+ microHeadlineLineHeight: "tight",
5409
+ microSubheadlineSize: "xl",
5410
+ microSubheadlineLineHeight: "normal",
5411
+ responsive: {
5412
+ tablet: { headlineSize: "5xl" },
5413
+ mobile: { headlineSize: "4xl", subheadlineSize: "xl" }
5414
+ }
5415
+ }
5416
+ })
5417
+ ];
5418
+ var typographyPresetsById = new Map(
5419
+ typographyPresets.map((preset) => [preset.id, preset])
5420
+ );
5421
+
4422
5422
  // ../theme-core/src/site-styles/curatedSiteStyles.ts
4423
5423
  var curatedSiteStyleIdValues = [
4424
5424
  "site-style:calm-studio",
@@ -4431,6 +5431,7 @@ var curatedSiteStyleIdValues = [
4431
5431
  "site-style:personal-retreat-journal",
4432
5432
  "site-style:tactile-workshop",
4433
5433
  "site-style:modern-wellness",
5434
+ "site-style:soft-earth",
4434
5435
  "site-style:bold-launch",
4435
5436
  "site-style:south-west-twerk-school"
4436
5437
  ];
@@ -4496,26 +5497,45 @@ var expressiveUnderlineInputs = {
4496
5497
  }
4497
5498
  };
4498
5499
  function uniqueContentFrameKinds() {
4499
- const kinds = [...new Set(
4500
- generatedDesignOptionCatalog.contentFrames.map((frame) => frame.kind)
4501
- )];
5500
+ const kinds = [
5501
+ ...new Set(
5502
+ generatedDesignOptionCatalog.contentFrames.map((frame) => frame.kind)
5503
+ )
5504
+ ];
4502
5505
  const firstKind = kinds[0];
4503
5506
  if (!firstKind) {
4504
- throw new Error("Expected generated design option catalog to expose at least one content frame kind.");
5507
+ throw new Error(
5508
+ "Expected generated design option catalog to expose at least one content frame kind."
5509
+ );
4505
5510
  }
4506
5511
  return [firstKind, ...kinds.slice(1)];
4507
5512
  }
4508
5513
  var generatedContentFrameKinds = uniqueContentFrameKinds();
4509
5514
  function defineCuratedSiteStyle(input) {
5515
+ const legacyHeaderLookIds = input.recommendedHeaderLookIds ?? ["clean-base"];
5516
+ const inferredHeaderCuration = inferHeaderCurationFromLegacyLooks(legacyHeaderLookIds);
5517
+ const typographyPresetChoices = input.typographyPresetChoices ?? defaultTypographyPresetChoicesForRecipe(input.tokenRecipes.typography);
5518
+ const defaultTypographyPresetId = input.defaultTypographyPresetId ? asTypographyPresetId(input.defaultTypographyPresetId) : typographyPresetChoices[0].id;
5519
+ if (!typographyPresetChoices.some(
5520
+ (choice) => choice.id === defaultTypographyPresetId
5521
+ )) {
5522
+ throw new Error(
5523
+ `Default typography preset ${defaultTypographyPresetId} is not curated for site style ${input.id}.`
5524
+ );
5525
+ }
4510
5526
  return {
4511
5527
  id: asSiteStyleId(input.id),
4512
5528
  name: input.name,
4513
5529
  description: input.description,
4514
5530
  generationBrief: input.generationBrief,
4515
5531
  selectionKeywordRules: input.selectionKeywordRules ?? [],
4516
- siteCreatorSelection: input.siteCreatorSelection ?? { kind: "explicit_only" },
5532
+ siteCreatorSelection: input.siteCreatorSelection ?? {
5533
+ kind: "explicit_only"
5534
+ },
4517
5535
  template: {
4518
- id: asDesignSystemTemplateId(`template:${input.id.replace("site-style:", "")}`),
5536
+ id: asDesignSystemTemplateId(
5537
+ `template:${input.id.replace("site-style:", "")}`
5538
+ ),
4519
5539
  name: input.name,
4520
5540
  version: 1,
4521
5541
  tokenRecipes: input.tokenRecipes,
@@ -4527,11 +5547,27 @@ function defineCuratedSiteStyle(input) {
4527
5547
  },
4528
5548
  ...input.themeOverrides ? { themeOverrides: input.themeOverrides } : {},
4529
5549
  recommendedAppearancePresetIds: (input.recommendedAppearancePresetIds ?? []).map(asAppearancePresetId),
4530
- recommendedHeaderLookIds: (input.recommendedHeaderLookIds ?? ["clean-base"]).map(asHeaderLookId),
5550
+ defaultHeaderSelection: input.defaultHeaderSelection ? {
5551
+ layoutId: asHeaderLayoutId(input.defaultHeaderSelection.layoutId),
5552
+ styleId: asHeaderStyleId(input.defaultHeaderSelection.styleId)
5553
+ } : inferredHeaderCuration.defaultHeaderSelection,
5554
+ recommendedHeaderLayoutChoices: input.recommendedHeaderLayoutChoices ?? inferredHeaderCuration.recommendedHeaderLayoutChoices,
5555
+ recommendedHeaderStyleChoicesByLayout: input.recommendedHeaderStyleChoicesByLayout ?? inferredHeaderCuration.recommendedHeaderStyleChoicesByLayout,
5556
+ discouragedHeaderSelections: input.discouragedHeaderSelections?.map(
5557
+ (selection) => ({
5558
+ layoutId: asHeaderLayoutId(selection.layoutId),
5559
+ styleId: asHeaderStyleId(selection.styleId)
5560
+ })
5561
+ ),
5562
+ recommendedHeaderLookIds: legacyHeaderLookIds.map(asHeaderLookId),
4531
5563
  // Empty is intentional: resolveFooterLook always appends its guaranteed fallback.
4532
- recommendedFooterLookIds: (input.recommendedFooterLookIds ?? []).map(asFooterLookId),
5564
+ recommendedFooterLookIds: (input.recommendedFooterLookIds ?? []).map(
5565
+ asFooterLookId
5566
+ ),
4533
5567
  buttonPersonalityChoices: input.buttonPersonalityChoices,
4534
- paletteVariantChoices: input.paletteVariantChoices
5568
+ paletteVariantChoices: input.paletteVariantChoices,
5569
+ typographyPresetChoices,
5570
+ defaultTypographyPresetId
4535
5571
  };
4536
5572
  }
4537
5573
  function buttonChoice(id, note) {
@@ -4540,6 +5576,87 @@ function buttonChoice(id, note) {
4540
5576
  function paletteChoice(id, note) {
4541
5577
  return note ? { id: asPaletteVariantId(id), note } : { id: asPaletteVariantId(id) };
4542
5578
  }
5579
+ function headerLayoutChoice(id, note) {
5580
+ return note ? { id: asHeaderLayoutId(id), note } : { id: asHeaderLayoutId(id) };
5581
+ }
5582
+ function headerStyleChoice(id, note) {
5583
+ return note ? { id: asHeaderStyleId(id), note } : { id: asHeaderStyleId(id) };
5584
+ }
5585
+ function unbrandHeaderLayoutId(id) {
5586
+ return id;
5587
+ }
5588
+ function uniqueHeaderLayoutChoices(choices) {
5589
+ const seen = /* @__PURE__ */ new Set();
5590
+ const unique = choices.filter((choice) => {
5591
+ if (seen.has(choice.id)) return false;
5592
+ seen.add(choice.id);
5593
+ return true;
5594
+ });
5595
+ const first = unique[0];
5596
+ if (!first) {
5597
+ throw new Error("Expected at least one curated header layout choice.");
5598
+ }
5599
+ return [first, ...unique.slice(1)];
5600
+ }
5601
+ function nonEmptyHeaderStyleChoices(choices, fallbackLayoutId) {
5602
+ const first = choices[0] ?? {
5603
+ id: getCompatibleHeaderStyleIds(fallbackLayoutId)[0] ?? asHeaderStyleId("minimal")
5604
+ };
5605
+ return [first, ...choices.slice(1)];
5606
+ }
5607
+ function inferHeaderCurationFromLegacyLooks(lookIds) {
5608
+ const selections = lookIds.map((lookId) => resolveLegacyHeaderLookAlias(asHeaderLookId(lookId))).filter(
5609
+ (selection) => Boolean(selection)
5610
+ );
5611
+ const defaultHeaderSelection = selections[0] ?? {
5612
+ layoutId: asHeaderLayoutId("classic"),
5613
+ styleId: asHeaderStyleId("minimal")
5614
+ };
5615
+ const layoutChoices = uniqueHeaderLayoutChoices(
5616
+ selections.map((selection) => headerLayoutChoice(selection.layoutId))
5617
+ );
5618
+ const stylesByLayout = {};
5619
+ for (const layoutChoice of layoutChoices) {
5620
+ const styleChoices = selections.filter((selection) => selection.layoutId === layoutChoice.id).map((selection) => headerStyleChoice(selection.styleId));
5621
+ stylesByLayout[unbrandHeaderLayoutId(layoutChoice.id)] = nonEmptyHeaderStyleChoices(styleChoices, layoutChoice.id);
5622
+ }
5623
+ return {
5624
+ defaultHeaderSelection,
5625
+ recommendedHeaderLayoutChoices: layoutChoices,
5626
+ recommendedHeaderStyleChoicesByLayout: stylesByLayout
5627
+ };
5628
+ }
5629
+ function typographyChoice(id, note) {
5630
+ return note ? { id: asTypographyPresetId(id), note } : { id: asTypographyPresetId(id) };
5631
+ }
5632
+ function defaultTypographyPresetChoicesForRecipe(recipe) {
5633
+ switch (recipe) {
5634
+ case "clean-sans":
5635
+ return [
5636
+ typographyChoice("typography-preset:modern-sans"),
5637
+ typographyChoice("typography-preset:luxe-contrast"),
5638
+ typographyChoice("typography-preset:bold-display")
5639
+ ];
5640
+ case "friendly-sans":
5641
+ return [
5642
+ typographyChoice("typography-preset:warm-rounded"),
5643
+ typographyChoice("typography-preset:modern-sans"),
5644
+ typographyChoice("typography-preset:editorial-serif")
5645
+ ];
5646
+ case "serif-editorial":
5647
+ return [
5648
+ typographyChoice("typography-preset:editorial-serif"),
5649
+ typographyChoice("typography-preset:classic-serif"),
5650
+ typographyChoice("typography-preset:warm-rounded")
5651
+ ];
5652
+ case "classic-serif":
5653
+ return [
5654
+ typographyChoice("typography-preset:classic-serif"),
5655
+ typographyChoice("typography-preset:luxe-contrast"),
5656
+ typographyChoice("typography-preset:editorial-serif")
5657
+ ];
5658
+ }
5659
+ }
4543
5660
  var curatedSiteStyles = [
4544
5661
  defineCuratedSiteStyle({
4545
5662
  id: "site-style:calm-studio",
@@ -4556,7 +5673,11 @@ var curatedSiteStyles = [
4556
5673
  motion: "subtle"
4557
5674
  },
4558
5675
  compositionBudget: quietBudget,
4559
- recommendedHeaderLookIds: ["centered-calm", "minimal-transparent", "clean-base"],
5676
+ recommendedHeaderLookIds: [
5677
+ "centered-calm",
5678
+ "minimal-transparent",
5679
+ "clean-base"
5680
+ ],
4560
5681
  buttonPersonalityChoices: [
4561
5682
  buttonChoice("soft-pill"),
4562
5683
  buttonChoice("pebble"),
@@ -4585,7 +5706,11 @@ var curatedSiteStyles = [
4585
5706
  motion: "subtle"
4586
5707
  },
4587
5708
  compositionBudget: balancedBudget,
4588
- recommendedHeaderLookIds: ["practical-utility", "brand-solid", "clean-base"],
5709
+ recommendedHeaderLookIds: [
5710
+ "practical-utility",
5711
+ "brand-solid",
5712
+ "clean-base"
5713
+ ],
4589
5714
  buttonPersonalityChoices: [
4590
5715
  buttonChoice("confident-chip"),
4591
5716
  buttonChoice("soft-pill"),
@@ -4612,7 +5737,11 @@ var curatedSiteStyles = [
4612
5737
  motion: "subtle"
4613
5738
  },
4614
5739
  compositionBudget: balancedBudget,
4615
- recommendedHeaderLookIds: ["editorial-line", "minimal-transparent", "centered-calm"],
5740
+ recommendedHeaderLookIds: [
5741
+ "serif-line",
5742
+ "minimal-transparent",
5743
+ "centered-calm"
5744
+ ],
4616
5745
  buttonPersonalityChoices: [
4617
5746
  buttonChoice("editorial-link"),
4618
5747
  buttonChoice("soft-pill"),
@@ -4640,7 +5769,11 @@ var curatedSiteStyles = [
4640
5769
  motion: "expressive"
4641
5770
  },
4642
5771
  compositionBudget: balancedBudget,
4643
- recommendedHeaderLookIds: ["brand-solid", "practical-utility", "clean-base"],
5772
+ recommendedHeaderLookIds: [
5773
+ "brand-solid",
5774
+ "practical-utility",
5775
+ "clean-base"
5776
+ ],
4644
5777
  buttonPersonalityChoices: [
4645
5778
  buttonChoice("pebble"),
4646
5779
  buttonChoice("brushed-wash"),
@@ -4657,7 +5790,10 @@ var curatedSiteStyles = [
4657
5790
  name: "Quiet Luxury",
4658
5791
  description: "Minimal, confident, and refined for premium experiences and private services.",
4659
5792
  generationBrief: "Use fewer claims, more specificity, and restrained sensory detail. Favor elegant media and low repetition over dense panels.",
4660
- siteCreatorSelection: { kind: "site_creator_keyword_heuristic", priority: 20 },
5793
+ siteCreatorSelection: {
5794
+ kind: "site_creator_keyword_heuristic",
5795
+ priority: 20
5796
+ },
4661
5797
  selectionKeywordRules: [
4662
5798
  { kind: "word", value: "luxury" },
4663
5799
  { kind: "word", value: "premium" },
@@ -4675,7 +5811,11 @@ var curatedSiteStyles = [
4675
5811
  motion: "none"
4676
5812
  },
4677
5813
  compositionBudget: quietBudget,
4678
- recommendedHeaderLookIds: ["minimal-transparent", "editorial-line", "clean-base"],
5814
+ recommendedHeaderLookIds: [
5815
+ "minimal-transparent",
5816
+ "serif-line",
5817
+ "clean-base"
5818
+ ],
4679
5819
  buttonPersonalityChoices: [
4680
5820
  buttonChoice("editorial-link"),
4681
5821
  buttonChoice("confident-chip"),
@@ -4711,7 +5851,11 @@ var curatedSiteStyles = [
4711
5851
  motion: "none"
4712
5852
  },
4713
5853
  compositionBudget: quietBudget,
4714
- recommendedHeaderLookIds: ["practical-utility", "brand-solid", "clean-base"],
5854
+ recommendedHeaderLookIds: [
5855
+ "practical-utility",
5856
+ "brand-solid",
5857
+ "clean-base"
5858
+ ],
4715
5859
  buttonPersonalityChoices: [
4716
5860
  buttonChoice("confident-chip"),
4717
5861
  buttonChoice("pebble"),
@@ -4738,7 +5882,11 @@ var curatedSiteStyles = [
4738
5882
  motion: "subtle"
4739
5883
  },
4740
5884
  compositionBudget: balancedBudget,
4741
- recommendedHeaderLookIds: ["centered-calm", "minimal-transparent", "clean-base"],
5885
+ recommendedHeaderLookIds: [
5886
+ "centered-calm",
5887
+ "minimal-transparent",
5888
+ "clean-base"
5889
+ ],
4742
5890
  buttonPersonalityChoices: [
4743
5891
  buttonChoice("soft-pill"),
4744
5892
  buttonChoice("pebble"),
@@ -4755,7 +5903,10 @@ var curatedSiteStyles = [
4755
5903
  name: "Quiet Practice",
4756
5904
  description: "Grounded, calm, and practical for small appointment-first practices.",
4757
5905
  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.",
4758
- siteCreatorSelection: { kind: "site_creator_keyword_heuristic", priority: 30 },
5906
+ siteCreatorSelection: {
5907
+ kind: "site_creator_keyword_heuristic",
5908
+ priority: 30
5909
+ },
4759
5910
  selectionKeywordRules: [
4760
5911
  { kind: "substring", value: "massage" },
4761
5912
  { kind: "word", value: "bodywork" },
@@ -4776,7 +5927,11 @@ var curatedSiteStyles = [
4776
5927
  motion: "subtle"
4777
5928
  },
4778
5929
  compositionBudget: quietBudget,
4779
- recommendedHeaderLookIds: ["practical-utility", "clean-base", "centered-calm"],
5930
+ recommendedHeaderLookIds: [
5931
+ "practical-utility",
5932
+ "clean-base",
5933
+ "centered-calm"
5934
+ ],
4780
5935
  buttonPersonalityChoices: [
4781
5936
  buttonChoice("pebble"),
4782
5937
  buttonChoice("soft-pill"),
@@ -4793,7 +5948,10 @@ var curatedSiteStyles = [
4793
5948
  name: "Personal Retreat Journal",
4794
5949
  description: "Warm, story-led, and readable for solo practitioners with mixed offers.",
4795
5950
  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.",
4796
- siteCreatorSelection: { kind: "site_creator_keyword_heuristic", priority: 40 },
5951
+ siteCreatorSelection: {
5952
+ kind: "site_creator_keyword_heuristic",
5953
+ priority: 40
5954
+ },
4797
5955
  selectionKeywordRules: [
4798
5956
  { kind: "substring", value: "retreat" },
4799
5957
  { kind: "phrase", value: "solo practitioner" },
@@ -4813,7 +5971,11 @@ var curatedSiteStyles = [
4813
5971
  motion: "subtle"
4814
5972
  },
4815
5973
  compositionBudget: balancedBudget,
4816
- recommendedHeaderLookIds: ["editorial-line", "centered-calm", "minimal-transparent"],
5974
+ recommendedHeaderLookIds: [
5975
+ "serif-line",
5976
+ "centered-calm",
5977
+ "minimal-transparent"
5978
+ ],
4817
5979
  buttonPersonalityChoices: [
4818
5980
  buttonChoice("editorial-link"),
4819
5981
  buttonChoice("soft-pill"),
@@ -4830,7 +5992,10 @@ var curatedSiteStyles = [
4830
5992
  name: "Tactile Workshop",
4831
5993
  description: "Bright, hands-on, and image-led for maker studios, workshops, and creative classes.",
4832
5994
  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.",
4833
- siteCreatorSelection: { kind: "site_creator_keyword_heuristic", priority: 50 },
5995
+ siteCreatorSelection: {
5996
+ kind: "site_creator_keyword_heuristic",
5997
+ priority: 50
5998
+ },
4834
5999
  selectionKeywordRules: [
4835
6000
  { kind: "substring", value: "ceramic" },
4836
6001
  { kind: "word", value: "pottery" },
@@ -4850,8 +6015,15 @@ var curatedSiteStyles = [
4850
6015
  motion: "subtle"
4851
6016
  },
4852
6017
  compositionBudget: balancedBudget,
4853
- recommendedHeaderLookIds: ["brand-solid", "practical-utility", "clean-base"],
4854
- recommendedFooterLookIds: ["site-footer-brand-two-band", "footer-muted-grounding"],
6018
+ recommendedHeaderLookIds: [
6019
+ "brand-solid",
6020
+ "practical-utility",
6021
+ "clean-base"
6022
+ ],
6023
+ recommendedFooterLookIds: [
6024
+ "site-footer-brand-two-band",
6025
+ "footer-muted-grounding"
6026
+ ],
4855
6027
  buttonPersonalityChoices: [
4856
6028
  buttonChoice("pebble"),
4857
6029
  buttonChoice("confident-chip"),
@@ -4866,101 +6038,178 @@ var curatedSiteStyles = [
4866
6038
  ]
4867
6039
  }),
4868
6040
  defineCuratedSiteStyle({
4869
- id: "site-style:bold-launch",
4870
- name: "Bold Launch",
4871
- description: "High-energy and punchy for launches, campaigns, and creative offers.",
4872
- generationBrief: "Use crisp positioning, bold hero structure, strong calls to action, and confident visual rhythm. Keep it precise, not shouty.",
4873
- siteCreatorSelection: { kind: "site_creator_keyword_heuristic", priority: 10 },
4874
- selectionKeywordRules: [
4875
- { kind: "substring", value: "launch" },
4876
- { kind: "substring", value: "campaign" },
4877
- { kind: "word", value: "preorder" },
4878
- { kind: "phrase", value: "pre-order" },
4879
- { kind: "substring", value: "waitlist" },
4880
- { kind: "word", value: "drop" }
4881
- ],
4882
- tokenRecipes: {
4883
- palette: "high-contrast",
4884
- contrast: "maximum",
4885
- radius: "pill",
4886
- shadow: "layered",
4887
- typography: "clean-sans",
4888
- spacing: "regular",
4889
- motion: "expressive"
6041
+ id: "site-style:soft-earth",
6042
+ name: "Soft Earth",
6043
+ description: "Warm, grounded, and editorial for yoga studios, retreats, and wellbeing communities.",
6044
+ 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.",
6045
+ siteCreatorSelection: {
6046
+ kind: "site_creator_keyword_heuristic",
6047
+ priority: 45
4890
6048
  },
4891
- compositionBudget: expressiveBudget,
4892
- recommendedHeaderLookIds: ["transparent-overlay", "floating-glass", "brand-solid"],
4893
- buttonPersonalityChoices: [
4894
- buttonChoice("ink-stamp"),
4895
- buttonChoice("confident-chip"),
4896
- buttonChoice("brushed-wash"),
4897
- buttonChoice("pebble")
6049
+ selectionKeywordRules: [
6050
+ { kind: "word", value: "meditation" },
6051
+ { kind: "word", value: "wellbeing" },
6052
+ { kind: "substring", value: "retreat" },
6053
+ { kind: "phrase", value: "yoga studio" },
6054
+ { kind: "phrase", value: "mindful movement" }
4898
6055
  ],
4899
- paletteVariantChoices: [
4900
- paletteChoice("high-contrast-monochrome"),
4901
- paletteChoice("high-contrast-ink"),
4902
- paletteChoice("brand-led-jewel"),
4903
- paletteChoice("brand-led-warm")
4904
- ]
4905
- }),
4906
- defineCuratedSiteStyle({
4907
- id: "site-style:south-west-twerk-school",
4908
- name: "South West Twerk School",
4909
- description: "Energetic, editorial, and high-contrast for a branded dance school presence.",
4910
- generationBrief: "Use confident rhythm, bold burgundy-and-gold accents, large editorial intro copy, strong booking routes, and dark feature sections where proof or forms need emphasis.",
4911
6056
  tokenRecipes: {
4912
- palette: "brand-led",
4913
- contrast: "maximum",
6057
+ palette: "warm-neutral",
6058
+ contrast: "standard",
4914
6059
  radius: "soft",
4915
- shadow: "layered",
4916
- typography: "clean-sans",
6060
+ shadow: "subtle",
6061
+ typography: "serif-editorial",
4917
6062
  spacing: "airy",
4918
- motion: "expressive"
6063
+ motion: "subtle"
4919
6064
  },
4920
- compositionBudget: expressiveBudget,
6065
+ compositionBudget: balancedBudget,
4921
6066
  themeOverrides: {
4922
6067
  typography: {
4923
6068
  body: {
4924
- family: "Manrope, system-ui, sans-serif",
4925
- size: "lg",
6069
+ family: "Inter, system-ui, sans-serif",
6070
+ size: "md",
4926
6071
  weight: "regular",
4927
6072
  lineHeight: "relaxed",
4928
6073
  letterSpacing: "normal"
4929
6074
  },
4930
6075
  headings: {
4931
6076
  default: {
4932
- family: '"TAN - PEARL", sans-serif',
4933
- weight: "bold",
6077
+ family: '"Cormorant Garamond", Georgia, serif',
6078
+ weight: "regular",
4934
6079
  lineHeight: "normal",
4935
- letterSpacing: "tight",
4936
- colorToken: "primary",
6080
+ letterSpacing: "normal",
6081
+ colorToken: "text",
4937
6082
  italic: null,
4938
6083
  case: null
4939
6084
  },
4940
6085
  h1: {
4941
6086
  size: "xl",
4942
- weight: "bold",
6087
+ weight: "regular",
4943
6088
  lineHeight: "normal",
4944
- letterSpacing: "tight",
6089
+ letterSpacing: "normal",
4945
6090
  italic: null
4946
6091
  },
4947
6092
  h2: {
4948
6093
  size: "lg",
4949
- weight: "bold",
6094
+ weight: "regular",
4950
6095
  lineHeight: "normal",
4951
6096
  letterSpacing: "normal",
4952
6097
  italic: null
4953
6098
  },
4954
6099
  h3: {
4955
6100
  size: "md",
4956
- weight: "bold",
6101
+ weight: "regular",
4957
6102
  lineHeight: "normal",
4958
6103
  letterSpacing: "normal",
4959
6104
  italic: null
4960
6105
  }
4961
6106
  },
4962
- scale: "balanced"
6107
+ scale: "majorThird"
4963
6108
  },
6109
+ bodyText: {
6110
+ intro: {
6111
+ paragraphSize: "default",
6112
+ headingSize: "editorial"
6113
+ }
6114
+ }
6115
+ },
6116
+ recommendedAppearancePresetIds: [
6117
+ "hero-brand-scrim",
6118
+ "intro-soft-earth-statement",
6119
+ "feature-cards-soft-earth-offerings",
6120
+ "testimonials-soft-earth-proof-band",
6121
+ "faq-soft-earth-two-column",
6122
+ "contact-form-panel"
6123
+ ],
6124
+ recommendedHeaderLookIds: [
6125
+ "centered-calm",
6126
+ "minimal-transparent",
6127
+ "serif-line"
6128
+ ],
6129
+ recommendedFooterLookIds: [
6130
+ "footer-muted-grounding",
6131
+ "site-footer-brand-two-band"
6132
+ ],
6133
+ buttonPersonalityChoices: [
6134
+ buttonChoice("earth-pill"),
6135
+ buttonChoice("soft-pill"),
6136
+ buttonChoice("pebble"),
6137
+ buttonChoice("editorial-link")
6138
+ ],
6139
+ paletteVariantChoices: [
6140
+ paletteChoice("warm-neutral-soft-earth"),
6141
+ paletteChoice("warm-neutral-clay"),
6142
+ paletteChoice("warm-neutral-forest"),
6143
+ paletteChoice("soft-natural-sage")
6144
+ ]
6145
+ }),
6146
+ defineCuratedSiteStyle({
6147
+ id: "site-style:bold-launch",
6148
+ name: "Bold Launch",
6149
+ description: "High-energy and punchy for launches, campaigns, and creative offers.",
6150
+ generationBrief: "Use crisp positioning, bold hero structure, strong calls to action, and confident visual rhythm. Keep it precise, not shouty.",
6151
+ siteCreatorSelection: {
6152
+ kind: "site_creator_keyword_heuristic",
6153
+ priority: 10
6154
+ },
6155
+ selectionKeywordRules: [
6156
+ { kind: "substring", value: "launch" },
6157
+ { kind: "substring", value: "campaign" },
6158
+ { kind: "word", value: "preorder" },
6159
+ { kind: "phrase", value: "pre-order" },
6160
+ { kind: "substring", value: "waitlist" },
6161
+ { kind: "word", value: "drop" }
6162
+ ],
6163
+ tokenRecipes: {
6164
+ palette: "high-contrast",
6165
+ contrast: "maximum",
6166
+ radius: "pill",
6167
+ shadow: "layered",
6168
+ typography: "clean-sans",
6169
+ spacing: "regular",
6170
+ motion: "expressive"
6171
+ },
6172
+ compositionBudget: expressiveBudget,
6173
+ recommendedHeaderLookIds: [
6174
+ "transparent-overlay",
6175
+ "floating-glass",
6176
+ "brand-solid"
6177
+ ],
6178
+ buttonPersonalityChoices: [
6179
+ buttonChoice("ink-stamp"),
6180
+ buttonChoice("confident-chip"),
6181
+ buttonChoice("brushed-wash"),
6182
+ buttonChoice("pebble")
6183
+ ],
6184
+ paletteVariantChoices: [
6185
+ paletteChoice("high-contrast-monochrome"),
6186
+ paletteChoice("high-contrast-ink"),
6187
+ paletteChoice("brand-led-jewel"),
6188
+ paletteChoice("brand-led-warm")
6189
+ ]
6190
+ }),
6191
+ defineCuratedSiteStyle({
6192
+ id: "site-style:south-west-twerk-school",
6193
+ name: "South West Twerk School",
6194
+ description: "Energetic, editorial, and high-contrast for a branded dance school presence.",
6195
+ generationBrief: "Use confident rhythm, bold burgundy-and-gold accents, large editorial intro copy, strong booking routes, and dark feature sections where proof or forms need emphasis.",
6196
+ tokenRecipes: {
6197
+ palette: "brand-led",
6198
+ contrast: "maximum",
6199
+ radius: "soft",
6200
+ shadow: "layered",
6201
+ typography: "clean-sans",
6202
+ spacing: "airy",
6203
+ motion: "expressive"
6204
+ },
6205
+ compositionBudget: expressiveBudget,
6206
+ typographyPresetChoices: [
6207
+ typographyChoice("typography-preset:bold-display"),
6208
+ typographyChoice("typography-preset:modern-sans"),
6209
+ typographyChoice("typography-preset:luxe-contrast")
6210
+ ],
6211
+ defaultTypographyPresetId: "typography-preset:bold-display",
6212
+ themeOverrides: {
4964
6213
  bodyText: {
4965
6214
  intro: {
4966
6215
  paragraphSize: "editorial",
@@ -4976,8 +6225,15 @@ var curatedSiteStyles = [
4976
6225
  "testimonials-accent-quote-proof",
4977
6226
  "contact-form-brand-depth-card"
4978
6227
  ],
4979
- recommendedHeaderLookIds: ["brand-solid", "transparent-overlay", "practical-utility"],
4980
- recommendedFooterLookIds: ["site-footer-brand-two-band", "footer-muted-grounding"],
6228
+ recommendedHeaderLookIds: [
6229
+ "brand-solid",
6230
+ "transparent-overlay",
6231
+ "practical-utility"
6232
+ ],
6233
+ recommendedFooterLookIds: [
6234
+ "site-footer-brand-two-band",
6235
+ "footer-muted-grounding"
6236
+ ],
4981
6237
  buttonPersonalityChoices: [
4982
6238
  buttonChoice("showtime-pill"),
4983
6239
  buttonChoice("confident-chip"),
@@ -8747,8 +10003,9 @@ var faqAccordionFragment = defineFragment({
8747
10003
  },
8748
10004
  fallback: "rb-faq-item"
8749
10005
  },
8750
- iconStyle: { $bind: { from: "theme.accordions.icon.style" } }
8751
- // Pass icon style from theme
10006
+ iconStyle: { $bind: { from: "theme.accordions.icon.style" } },
10007
+ // Legacy theme accordion style
10008
+ iconTreatment: { $bind: { from: "content._sectionStyles.accordionIconTreatment" } }
8752
10009
  },
8753
10010
  triggerFrom: "faqItem.question",
8754
10011
  contentFrom: "faqItem.answer"
@@ -9826,61 +11083,389 @@ function splitLayoutWith(children) {
9826
11083
  children
9827
11084
  }
9828
11085
  }),
9829
- // The split variants render the image as a real grid column, so suppress
9830
- // the default absolute background image layer while keeping color/overlay.
9831
- renderBackgroundImage: false,
9832
- baseClass: ""
9833
- });
9834
- }
9835
- var splitContentColumn = heroContentWrapper(heroContentNodes, "md", "rb-w-full rb-text-left");
9836
- var splitImageColumn = heroSplitImagePane();
9837
- var splitLayout = splitLayoutWith([
9838
- splitContentColumn,
9839
- splitImageColumn
9840
- ]);
9841
- var splitReverseLayout = splitLayoutWith([
9842
- splitImageColumn,
9843
- splitContentColumn
9844
- ]);
9845
- var heroConfig = {
9846
- id: "block.hero",
9847
- title: "Hero",
9848
- titleSource: "headline",
9849
- category: "layout",
9850
- includeContainerStyles: true,
9851
- promotedFields: ["_sectionStyles.background.image"],
9852
- fragments: [
9853
- { fragment: heroCopyFragment, fieldPriority: 0 },
9854
- { fragment: heroLayoutControlsFragment, fieldPriority: 1 },
9855
- { fragment: heroCtaRowFragment, fieldPriority: 2 }
9856
- ],
9857
- additionalFields: [
9858
- containerStylesField({
9859
- id: "_contentCardStyles",
9860
- label: "Content card",
9861
- renderInHeader: true,
9862
- intent: "style"
11086
+ // The split variants render the image as a real grid column, so suppress
11087
+ // the default absolute background image layer while keeping color/overlay.
11088
+ renderBackgroundImage: false,
11089
+ baseClass: ""
11090
+ });
11091
+ }
11092
+ var splitContentColumn = heroContentWrapper(heroContentNodes, "md", "rb-w-full rb-text-left");
11093
+ var splitImageColumn = heroSplitImagePane();
11094
+ var splitLayout = splitLayoutWith([
11095
+ splitContentColumn,
11096
+ splitImageColumn
11097
+ ]);
11098
+ var splitReverseLayout = splitLayoutWith([
11099
+ splitImageColumn,
11100
+ splitContentColumn
11101
+ ]);
11102
+ var heroConfig = {
11103
+ id: "block.hero",
11104
+ title: "Hero",
11105
+ titleSource: "headline",
11106
+ category: "layout",
11107
+ includeContainerStyles: true,
11108
+ promotedFields: ["_sectionStyles.background.image"],
11109
+ fragments: [
11110
+ { fragment: heroCopyFragment, fieldPriority: 0 },
11111
+ { fragment: heroLayoutControlsFragment, fieldPriority: 1 },
11112
+ { fragment: heroCtaRowFragment, fieldPriority: 2 }
11113
+ ],
11114
+ additionalFields: [
11115
+ containerStylesField({
11116
+ id: "_contentCardStyles",
11117
+ label: "Content card",
11118
+ renderInHeader: true,
11119
+ intent: "style"
11120
+ })
11121
+ ],
11122
+ layout: classicLayout,
11123
+ variants: {
11124
+ classic: classicLayout,
11125
+ micro: microLayout,
11126
+ split: splitLayout,
11127
+ splitReverse: splitReverseLayout
11128
+ },
11129
+ defaultVariant: "classic",
11130
+ description: "Hero section with headline, subtitle, and repeatable CTAs.",
11131
+ tags: ["header", "banner", "landing", "introduction", "welcome", "splash", "headline"],
11132
+ icon: "Sparkles",
11133
+ styleTokens: {
11134
+ typography: "display",
11135
+ spacing: "xl"
11136
+ }
11137
+ };
11138
+ var heroManifest = createBlockManifest(heroConfig);
11139
+ var heroBlockDefinition = {
11140
+ manifest: heroManifest
11141
+ };
11142
+
11143
+ // ../blocks/src/system/fields/aspectRatio.ts
11144
+ var standardAspectRatioOptions = [
11145
+ { value: "auto", label: "Auto (original)" },
11146
+ { value: "16/9", label: "16:9 (Landscape)" },
11147
+ { value: "4/3", label: "4:3 (Standard)" },
11148
+ { value: "1/1", label: "1:1 (Square)" },
11149
+ { value: "3/4", label: "3:4 (Portrait)" }
11150
+ ];
11151
+ function createAspectRatioField(options = {}) {
11152
+ return {
11153
+ id: options.id ?? "aspectRatio",
11154
+ type: "select",
11155
+ label: options.label ?? "Aspect ratio",
11156
+ ...options.description ? { description: options.description } : {},
11157
+ required: false,
11158
+ defaultValue: options.defaultValue ?? "auto",
11159
+ multiple: false,
11160
+ options: [...standardAspectRatioOptions],
11161
+ ui: {
11162
+ intent: options.uiIntent ?? "display",
11163
+ ...options.visibleWhen ? { visibleWhen: options.visibleWhen } : {}
11164
+ }
11165
+ };
11166
+ }
11167
+
11168
+ // ../blocks/src/system/fields/imageLayout.ts
11169
+ function createImageColSizeField(options = {}) {
11170
+ const {
11171
+ id = "imageColSize",
11172
+ label = "Image column size",
11173
+ description = "Controls how large the image/thumbnail column is at desktop breakpoints.",
11174
+ defaultValue = "1/3",
11175
+ uiIntent = "display",
11176
+ visibleWhen
11177
+ } = options;
11178
+ return {
11179
+ id,
11180
+ type: "select",
11181
+ label,
11182
+ description,
11183
+ required: false,
11184
+ defaultValue,
11185
+ multiple: false,
11186
+ options: [
11187
+ { value: "1/4", label: "Small (1/4)" },
11188
+ { value: "1/3", label: "Medium (1/3)" },
11189
+ { value: "2/5", label: "Large (2/5)" },
11190
+ { value: "1/2", label: "Extra large (1/2)" },
11191
+ { value: "2/3", label: "Huge (2/3)" }
11192
+ ],
11193
+ ui: {
11194
+ intent: uiIntent,
11195
+ ...visibleWhen ? { visibleWhen } : {}
11196
+ }
11197
+ };
11198
+ }
11199
+ function createImagePositionField(options = {}) {
11200
+ const {
11201
+ id = "imagePosition",
11202
+ label = "Image position",
11203
+ description = "Choose which side the image appears on.",
11204
+ defaultValue = "left",
11205
+ includeAlternate = false,
11206
+ uiIntent = "display",
11207
+ visibleWhen
11208
+ } = options;
11209
+ const positionOptions = [
11210
+ { value: "left", label: "Left" },
11211
+ { value: "right", label: "Right" },
11212
+ ...includeAlternate ? [{ value: "alternate", label: "Alternate" }] : []
11213
+ ];
11214
+ return {
11215
+ id,
11216
+ type: "select",
11217
+ label,
11218
+ description,
11219
+ required: false,
11220
+ defaultValue,
11221
+ multiple: false,
11222
+ // Spread to get a mutable array type without unsafe casts.
11223
+ options: [...positionOptions],
11224
+ ui: {
11225
+ intent: uiIntent,
11226
+ ...visibleWhen ? { visibleWhen } : {}
11227
+ }
11228
+ };
11229
+ }
11230
+
11231
+ // ../blocks/src/system/blocks/intro.ts
11232
+ function introHeading(className) {
11233
+ return text(
11234
+ {
11235
+ as: "h2",
11236
+ className
11237
+ },
11238
+ when("content.title"),
11239
+ bind("content.title")
11240
+ );
11241
+ }
11242
+ function introBody(className = "rb-prose rb-max-w-none") {
11243
+ return richText({ className }, bind("content.body"));
11244
+ }
11245
+ function introCtas(justify = "start") {
11246
+ return ctaRow({
11247
+ justify,
11248
+ gap: "md",
11249
+ containerClassName: "rb-mt-2"
11250
+ });
11251
+ }
11252
+ function introCopyStack(options = {}) {
11253
+ return stack(
11254
+ {
11255
+ gap: "md",
11256
+ className: options.className ?? "rb-intro-copy"
11257
+ },
11258
+ [
11259
+ introHeading(options.headingClassName ?? "rb-intro-title"),
11260
+ introBody(options.bodyClassName),
11261
+ introCtas(options.ctaJustify)
11262
+ ]
11263
+ );
11264
+ }
11265
+ var introMedia = media(
11266
+ {
11267
+ className: "rb-intro-media rb-w-full rb-h-auto rb-object-cover",
11268
+ style: {
11269
+ aspectRatio: { $bind: { from: "content.aspectRatio" } }
11270
+ }
11271
+ },
11272
+ bind("content.media")
11273
+ );
11274
+ var centeredCopyLayout = styledSection({
11275
+ children: styledContainer({
11276
+ rootType: "stack",
11277
+ rootProps: { gap: "lg" },
11278
+ children: [
11279
+ introCopyStack({
11280
+ className: "rb-intro-copy rb-mx-auto rb-max-w-3xl rb-text-center",
11281
+ headingClassName: "rb-intro-title rb-text-center",
11282
+ bodyClassName: "rb-prose rb-mx-auto rb-max-w-none",
11283
+ ctaJustify: "center"
11284
+ })
11285
+ ]
11286
+ }),
11287
+ baseClass: "",
11288
+ spacing: "medium"
11289
+ });
11290
+ var statementCopyLayout = styledSection({
11291
+ children: styledContainer({
11292
+ children: [
11293
+ el(
11294
+ "div",
11295
+ {
11296
+ className: "rb-intro rb-intro-statement rb-grid rb-grid-cols-1 rb-gap-8 rb-md-grid-cols-2 rb-md-items-start"
11297
+ },
11298
+ [
11299
+ introHeading("rb-intro-title rb-max-w-xl"),
11300
+ stack({ gap: "md", className: "rb-intro-copy rb-max-w-xl" }, [
11301
+ introBody(),
11302
+ introCtas("start")
11303
+ ])
11304
+ ]
11305
+ )
11306
+ ]
11307
+ }),
11308
+ baseClass: "",
11309
+ spacing: "medium"
11310
+ });
11311
+ var statementMediaLayout = styledSection({
11312
+ children: styledContainer({
11313
+ children: [
11314
+ el(
11315
+ "div",
11316
+ {
11317
+ 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"
11318
+ },
11319
+ [
11320
+ introHeading("rb-intro-title rb-max-w-xl"),
11321
+ stack({ gap: "md", className: "rb-intro-copy rb-max-w-xl" }, [
11322
+ introBody(),
11323
+ introCtas("start")
11324
+ ]),
11325
+ el("div", { className: "rb-intro-media-wrap rb-w-full" }, [introMedia], when("content.media"))
11326
+ ]
11327
+ )
11328
+ ]
11329
+ }),
11330
+ baseClass: "",
11331
+ spacing: "medium"
11332
+ });
11333
+ var mediaCopyLayout = styledSection({
11334
+ children: styledContainer({
11335
+ children: [
11336
+ responsiveTwoColumn({
11337
+ image: el("div", { className: "rb-intro-media-wrap rb-w-full" }, [introMedia]),
11338
+ text: introCopyStack({
11339
+ className: "rb-intro-copy rb-max-w-xl",
11340
+ headingClassName: "rb-intro-title"
11341
+ }),
11342
+ ratioFrom: "content.ratio",
11343
+ imagePositionFrom: "content.imagePosition",
11344
+ gapFrom: "content.gap",
11345
+ gapFallback: "comfortable",
11346
+ imageWrapperClassName: "rb-w-full rb-shrink-0",
11347
+ textWrapperClassName: "rb-w-full rb-min-w-0 rb-flex-1 rb-self-center"
11348
+ })
11349
+ ]
11350
+ }),
11351
+ baseClass: "",
11352
+ spacing: "medium"
11353
+ });
11354
+ var introConfig = {
11355
+ id: "block.intro",
11356
+ title: "Intro",
11357
+ category: "layout",
11358
+ includeContainerStyles: true,
11359
+ titleSource: "title",
11360
+ additionalFields: [
11361
+ {
11362
+ id: "title",
11363
+ type: "text",
11364
+ label: "Statement",
11365
+ required: false,
11366
+ multiline: true,
11367
+ maxLength: 160
11368
+ },
11369
+ {
11370
+ id: "body",
11371
+ type: "richText",
11372
+ label: "Text",
11373
+ required: true,
11374
+ ui: {
11375
+ richTextVariant: "limited"
11376
+ }
11377
+ },
11378
+ {
11379
+ id: "media",
11380
+ type: "media",
11381
+ label: "Media",
11382
+ required: false,
11383
+ mediaKinds: ["image"],
11384
+ ui: {
11385
+ intent: "content",
11386
+ visibleWhen: { field: "variant", notEquals: "statement-copy" }
11387
+ }
11388
+ },
11389
+ createImagePositionField({
11390
+ id: "imagePosition",
11391
+ label: "Image position",
11392
+ defaultValue: "left",
11393
+ uiIntent: "display",
11394
+ visibleWhen: { field: "variant", equals: "media-copy" }
11395
+ }),
11396
+ {
11397
+ id: "gap",
11398
+ type: "select",
11399
+ label: "Gap between media and text",
11400
+ required: false,
11401
+ defaultValue: "comfortable",
11402
+ multiple: false,
11403
+ options: [
11404
+ { value: "none", label: "None" },
11405
+ { value: "compact", label: "Compact" },
11406
+ { value: "cozy", label: "Cozy" },
11407
+ { value: "medium", label: "Medium" },
11408
+ { value: "comfortable", label: "Comfortable" },
11409
+ { value: "spacious", label: "Spacious" }
11410
+ ],
11411
+ ui: {
11412
+ intent: "display",
11413
+ visibleWhen: { field: "variant", equals: "media-copy" }
11414
+ }
11415
+ },
11416
+ createImageColSizeField({
11417
+ id: "ratio",
11418
+ label: "Media column size",
11419
+ defaultValue: "1/2",
11420
+ uiIntent: "display",
11421
+ visibleWhen: { field: "variant", equals: "media-copy" }
11422
+ }),
11423
+ createAspectRatioField({
11424
+ id: "aspectRatio",
11425
+ label: "Media aspect ratio",
11426
+ description: "Crop media to a consistent aspect ratio.",
11427
+ defaultValue: "auto",
11428
+ visibleWhen: { field: "media", notEquals: null }
11429
+ }),
11430
+ createCtasRepeater({
11431
+ label: "Calls to action",
11432
+ itemLabel: "CTA",
11433
+ maxItems: 2
9863
11434
  })
9864
11435
  ],
9865
- layout: classicLayout,
11436
+ layout: centeredCopyLayout,
9866
11437
  variants: {
9867
- classic: classicLayout,
9868
- micro: microLayout,
9869
- split: splitLayout,
9870
- splitReverse: splitReverseLayout
11438
+ "centered-copy": centeredCopyLayout,
11439
+ "statement-copy": statementCopyLayout,
11440
+ "statement-media": statementMediaLayout,
11441
+ "media-copy": mediaCopyLayout
9871
11442
  },
9872
- defaultVariant: "classic",
9873
- description: "Hero section with headline, subtitle, and repeatable CTAs.",
9874
- tags: ["header", "banner", "landing", "introduction", "welcome", "splash", "headline"],
9875
- icon: "Sparkles",
9876
- styleTokens: {
9877
- typography: "display",
9878
- spacing: "xl"
9879
- }
11443
+ defaultVariant: "statement-copy",
11444
+ variantOptions: {
11445
+ "centered-copy": {
11446
+ label: "Centered copy",
11447
+ description: "A focused intro with centered text and optional calls to action."
11448
+ },
11449
+ "statement-copy": {
11450
+ label: "Statement and copy",
11451
+ description: "A large statement on the left with supporting copy on the right."
11452
+ },
11453
+ "statement-media": {
11454
+ label: "Statement, copy and media",
11455
+ description: "A three-part intro with statement, copy and a small image."
11456
+ },
11457
+ "media-copy": {
11458
+ label: "Media and copy",
11459
+ description: "A compact media/text intro for softer transitions after a hero."
11460
+ }
11461
+ },
11462
+ description: "A flexible introductory section for statement copy, supporting text, media, and CTAs.",
11463
+ tags: ["intro", "introduction", "about", "welcome", "statement", "media", "text"],
11464
+ icon: "PanelTopOpen"
9880
11465
  };
9881
- var heroManifest = createBlockManifest(heroConfig);
9882
- var heroBlockDefinition = {
9883
- manifest: heroManifest
11466
+ var introManifest = createBlockManifest(introConfig);
11467
+ var introBlockDefinition = {
11468
+ manifest: introManifest
9884
11469
  };
9885
11470
 
9886
11471
  // ../blocks/src/system/blocks/body-text.ts
@@ -10726,6 +12311,37 @@ var faqComposition = composeFragments([
10726
12311
  { fragment: faqHeadingFragment, fieldPriority: 0 },
10727
12312
  { fragment: faqAccordionFragment, fieldPriority: 1 }
10728
12313
  ]);
12314
+ function fragmentLayoutNode(layout) {
12315
+ return isNodeDefinitionArray(layout) ? el("div", {}, [...layout]) : layout;
12316
+ }
12317
+ function isNodeDefinitionArray(layout) {
12318
+ return Array.isArray(layout);
12319
+ }
12320
+ var headingLayout = fragmentLayoutNode(faqHeadingFragment.layout);
12321
+ var accordionLayout = fragmentLayoutNode(faqAccordionFragment.layout);
12322
+ var defaultLayout = styledSection({
12323
+ children: styledContainer({
12324
+ baseClassName: "rb-relative rb-isolate",
12325
+ children: stack({ gap: "xl", className: "rb-w-full rb-max-w-4xl rb-mx-auto" }, faqComposition.layout)
12326
+ }),
12327
+ baseClass: ""
12328
+ });
12329
+ var twoColumnLayout = styledSection({
12330
+ children: styledContainer({
12331
+ baseClassName: "rb-relative rb-isolate",
12332
+ children: el(
12333
+ "div",
12334
+ {
12335
+ className: "rb-faq-two-column rb-grid rb-grid-cols-1 rb-gap-8 rb-lg-grid-cols-2 rb-lg-items-start"
12336
+ },
12337
+ [
12338
+ el("div", { className: "rb-faq-two-column-heading" }, [headingLayout]),
12339
+ el("div", { className: "rb-faq-two-column-accordion" }, [accordionLayout])
12340
+ ]
12341
+ )
12342
+ }),
12343
+ baseClass: ""
12344
+ });
10729
12345
  var faqManifest = createBlockManifest({
10730
12346
  id: "block.faq",
10731
12347
  title: "FAQ",
@@ -10742,13 +12358,22 @@ var faqManifest = createBlockManifest({
10742
12358
  label: "FAQ item styles"
10743
12359
  })
10744
12360
  ],
10745
- layout: styledSection({
10746
- children: styledContainer({
10747
- baseClassName: "rb-relative rb-isolate",
10748
- children: stack({ gap: "xl", className: "rb-w-full rb-max-w-4xl rb-mx-auto" }, faqComposition.layout)
10749
- }),
10750
- baseClass: ""
10751
- }),
12361
+ layout: defaultLayout,
12362
+ variants: {
12363
+ default: defaultLayout,
12364
+ "two-column": twoColumnLayout
12365
+ },
12366
+ defaultVariant: "default",
12367
+ variantOptions: {
12368
+ default: {
12369
+ label: "Default",
12370
+ description: "A centered heading above one FAQ accordion."
12371
+ },
12372
+ "two-column": {
12373
+ label: "Two column",
12374
+ description: "A left heading column with FAQ items on the right."
12375
+ }
12376
+ },
10752
12377
  description: "Accordion of frequently asked questions and answers.",
10753
12378
  tags: ["faq", "questions", "answers", "help", "support", "accordion", "q&a"],
10754
12379
  icon: "HelpCircle"
@@ -10891,15 +12516,21 @@ var mobileCta = ctaButton({
10891
12516
  var mobileToggleIcon = stack({ gap: "xs", className: "nav-mobile-icon" }, [
10892
12517
  {
10893
12518
  type: "div",
10894
- props: { className: "nav-mobile-bar nav-mobile-bar-top rb-h-0.5 rb-w-5 rb-rounded-full rb-bg-current" }
12519
+ props: {
12520
+ className: "nav-mobile-bar nav-mobile-bar-top rb-h-0.5 rb-w-5 rb-rounded-full rb-bg-current"
12521
+ }
10895
12522
  },
10896
12523
  {
10897
12524
  type: "div",
10898
- props: { className: "nav-mobile-bar nav-mobile-bar-middle rb-h-0.5 rb-w-5 rb-rounded-full rb-bg-current" }
12525
+ props: {
12526
+ className: "nav-mobile-bar nav-mobile-bar-middle rb-h-0.5 rb-w-5 rb-rounded-full rb-bg-current"
12527
+ }
10899
12528
  },
10900
12529
  {
10901
12530
  type: "div",
10902
- props: { className: "nav-mobile-bar nav-mobile-bar-bottom rb-h-0.5 rb-w-5 rb-rounded-full rb-bg-current" }
12531
+ props: {
12532
+ className: "nav-mobile-bar nav-mobile-bar-bottom rb-h-0.5 rb-w-5 rb-rounded-full rb-bg-current"
12533
+ }
10903
12534
  }
10904
12535
  ]);
10905
12536
  var mobileToggleButton = {
@@ -11082,31 +12713,12 @@ var floatingLayout = inline(
11082
12713
  ],
11083
12714
  when("$root.theme.header.variant", { equals: "floating" })
11084
12715
  );
11085
- var editorialLayout = stack(
11086
- {
11087
- gap: "md",
11088
- align: "center",
11089
- className: bindProp("$root.theme.header.maxWidth", {
11090
- transforms: pipe(
11091
- tx("layout.maxWidthClass", {
11092
- base: `rb-header-layout ${desktopOnlyDisplay("flex")} rb-w-full rb-flex-col rb-items-center rb-gap-6 rb-text-center`
11093
- })
11094
- ),
11095
- fallback: `rb-container rb-header-layout ${desktopOnlyDisplay("flex")} rb-w-full rb-flex-col rb-items-center rb-gap-6 rb-text-center`
11096
- })
11097
- },
11098
- [
11099
- centeredLogoRow,
11100
- createNavRow(
11101
- `${desktopOnlyDisplay("flex")} rb-flex-wrap rb-justify-center rb-gap-x-8 rb-gap-y-3`,
11102
- "center"
11103
- )
11104
- ],
11105
- when("$root.theme.header.variant", { equals: "editorial" })
11106
- );
11107
12716
  var headerLayout = headerSection(
11108
12717
  {
11109
- background: "background",
12718
+ background: bindProp("$root.theme.header", {
12719
+ transforms: pipe(tx("layout.headerSectionBackground")),
12720
+ fallback: "background"
12721
+ }),
11110
12722
  allowOverflow: true,
11111
12723
  className: bindProp("$root.theme.header", {
11112
12724
  transforms: pipe(tx("layout.headerRootClass")),
@@ -11114,10 +12726,7 @@ var headerLayout = headerSection(
11114
12726
  }),
11115
12727
  style: bindProp("$root.theme.header", {
11116
12728
  transforms: pipe(tx("layout.headerRootStyle")),
11117
- fallback: mergeStyles(
11118
- textColorStyle("text"),
11119
- borderColorStyle("border")
11120
- )
12729
+ fallback: mergeStyles(textColorStyle("text"), borderColorStyle("border"))
11121
12730
  })
11122
12731
  },
11123
12732
  [
@@ -11126,7 +12735,6 @@ var headerLayout = headerSection(
11126
12735
  centeredLayout,
11127
12736
  transparentLayout,
11128
12737
  floatingLayout,
11129
- editorialLayout,
11130
12738
  mobileOverlay
11131
12739
  ],
11132
12740
  props({
@@ -11941,79 +13549,298 @@ var collectionLayout = styledSection({
11941
13549
  { gap: "md" }
11942
13550
  ),
11943
13551
  baseClass: "",
11944
- spacing: "comfortable"
13552
+ spacing: "comfortable"
13553
+ });
13554
+ var collectionManifest = createBlockManifest({
13555
+ id: "block.collection",
13556
+ title: "Collection",
13557
+ category: "layout",
13558
+ additionalFields: [
13559
+ parseFieldDefinition({
13560
+ id: "layout",
13561
+ type: "select",
13562
+ label: "Layout",
13563
+ defaultValue: "grid",
13564
+ options: [
13565
+ { value: "grid", label: "Grid" },
13566
+ { value: "stack", label: "Stack" }
13567
+ ],
13568
+ ui: { intent: "display" }
13569
+ }),
13570
+ parseFieldDefinition({
13571
+ id: "columns",
13572
+ type: "select",
13573
+ label: "Columns",
13574
+ description: "Number of columns in the grid layout.",
13575
+ defaultValue: "3",
13576
+ options: [
13577
+ { value: "2", label: "2 columns" },
13578
+ { value: "3", label: "3 columns" },
13579
+ { value: "4", label: "4 columns" }
13580
+ ],
13581
+ ui: {
13582
+ intent: "display",
13583
+ visibleWhen: { field: "layout", equals: "grid" }
13584
+ }
13585
+ }),
13586
+ parseFieldDefinition({
13587
+ id: "gap",
13588
+ type: "select",
13589
+ label: "Gap",
13590
+ defaultValue: "medium",
13591
+ options: [
13592
+ { value: "none", label: "None" },
13593
+ { value: "compact", label: "Compact" },
13594
+ { value: "cozy", label: "Cozy" },
13595
+ { value: "medium", label: "Medium" },
13596
+ { value: "comfortable", label: "Comfortable" },
13597
+ { value: "spacious", label: "Spacious" }
13598
+ ],
13599
+ ui: { intent: "display" }
13600
+ }),
13601
+ fragmentsToRepeaterField(
13602
+ "items",
13603
+ "Items",
13604
+ collectionFragments,
13605
+ {
13606
+ minItems: 0,
13607
+ maxItems: 50,
13608
+ itemLabel: "Item",
13609
+ description: "Add items to this collection."
13610
+ }
13611
+ ),
13612
+ cardStylesField({
13613
+ id: "_cardStyles",
13614
+ label: "Item styles"
13615
+ })
13616
+ ],
13617
+ layout: collectionLayout,
13618
+ description: "Repeat items in a grid or stack layout.",
13619
+ tags: ["collection", "grid", "stack", "repeater"],
13620
+ icon: "LayoutList",
13621
+ styleTokens: { spacing: "lg" }
13622
+ });
13623
+ var collectionBlockDefinition = {
13624
+ manifest: collectionManifest
13625
+ };
13626
+
13627
+ // ../blocks/src/system/blocks/feature-cards.ts
13628
+ function grid3(props2, children) {
13629
+ return el("grid", props2 ?? void 0, children ?? void 0);
13630
+ }
13631
+ var sectionHeading = stack(
13632
+ { gap: "sm", className: "rb-feature-cards-heading rb-mx-auto rb-max-w-3xl rb-text-center" },
13633
+ [
13634
+ text(
13635
+ {
13636
+ as: "h2",
13637
+ className: "rb-feature-cards-title rb-text-center"
13638
+ },
13639
+ when("content.title"),
13640
+ bind("content.title")
13641
+ ),
13642
+ richText(
13643
+ {
13644
+ className: "rb-feature-cards-description rb-prose rb-mx-auto rb-max-w-none",
13645
+ style: textColorStyle("mutedText")
13646
+ },
13647
+ when("content.description"),
13648
+ bind("content.description")
13649
+ )
13650
+ ]
13651
+ );
13652
+ var featureCard = styledCard(
13653
+ [
13654
+ media(
13655
+ {
13656
+ className: "rb-feature-card-media rb-w-full rb-h-auto rb-object-cover",
13657
+ style: {
13658
+ aspectRatio: { $bind: { from: "card.aspectRatio" } }
13659
+ }
13660
+ },
13661
+ when("card.media"),
13662
+ bind("card.media")
13663
+ ),
13664
+ stack({ gap: "sm", className: "rb-feature-card-content rb-flex-1 rb-p-6" }, [
13665
+ text(
13666
+ {
13667
+ as: "h3",
13668
+ className: "rb-feature-card-title"
13669
+ },
13670
+ bind("card.title")
13671
+ ),
13672
+ richText(
13673
+ {
13674
+ className: "rb-feature-card-body rb-prose rb-max-w-none",
13675
+ style: textColorStyle("mutedText")
13676
+ },
13677
+ when("card.body"),
13678
+ bind("card.body")
13679
+ ),
13680
+ ctaRow({
13681
+ collectionPath: "ctas",
13682
+ itemName: "cta",
13683
+ gap: "sm",
13684
+ justify: "start",
13685
+ containerClassName: "rb-mt-auto"
13686
+ })
13687
+ ])
13688
+ ],
13689
+ {
13690
+ stylesFrom: "content._cardStyles",
13691
+ backgroundFrom: "content._cardStyles.background",
13692
+ baseClassName: "rb-feature-card rb-relative rb-isolate rb-overflow-hidden rb-border rb-flex rb-h-full rb-flex-col"
13693
+ },
13694
+ repeat("content.cards", "card")
13695
+ );
13696
+ var cardsLayout = styledSection({
13697
+ children: styledContainer({
13698
+ rootType: "stack",
13699
+ rootProps: { gap: "xl" },
13700
+ children: [
13701
+ sectionHeading,
13702
+ grid3(
13703
+ {
13704
+ cols: {
13705
+ $bind: {
13706
+ from: "content.columns",
13707
+ fallback: 3,
13708
+ coerce: "number"
13709
+ }
13710
+ },
13711
+ gap: "lg"
13712
+ },
13713
+ [featureCard]
13714
+ )
13715
+ ]
13716
+ }),
13717
+ baseClass: "",
13718
+ spacing: "medium"
11945
13719
  });
11946
- var collectionManifest = createBlockManifest({
11947
- id: "block.collection",
11948
- title: "Collection",
13720
+ var featureCardsConfig = {
13721
+ id: "block.feature-cards",
13722
+ title: "Feature Cards",
11949
13723
  category: "layout",
13724
+ includeContainerStyles: true,
13725
+ titleSource: "title",
11950
13726
  additionalFields: [
11951
- parseFieldDefinition({
11952
- id: "layout",
11953
- type: "select",
11954
- label: "Layout",
11955
- defaultValue: "grid",
11956
- options: [
11957
- { value: "grid", label: "Grid" },
11958
- { value: "stack", label: "Stack" }
11959
- ],
11960
- ui: { intent: "display" }
11961
- }),
11962
- parseFieldDefinition({
13727
+ {
13728
+ id: "title",
13729
+ type: "text",
13730
+ label: "Title",
13731
+ required: false,
13732
+ multiline: false,
13733
+ maxLength: 120
13734
+ },
13735
+ {
13736
+ id: "description",
13737
+ type: "richText",
13738
+ label: "Description",
13739
+ required: false,
13740
+ ui: {
13741
+ richTextVariant: "limited"
13742
+ }
13743
+ },
13744
+ {
11963
13745
  id: "columns",
11964
13746
  type: "select",
11965
13747
  label: "Columns",
11966
- description: "Number of columns in the grid layout.",
13748
+ required: false,
11967
13749
  defaultValue: "3",
13750
+ multiple: false,
11968
13751
  options: [
11969
13752
  { value: "2", label: "2 columns" },
11970
13753
  { value: "3", label: "3 columns" },
11971
13754
  { value: "4", label: "4 columns" }
11972
13755
  ],
11973
- ui: {
11974
- intent: "display",
11975
- visibleWhen: { field: "layout", equals: "grid" }
11976
- }
11977
- }),
11978
- parseFieldDefinition({
11979
- id: "gap",
11980
- type: "select",
11981
- label: "Gap",
11982
- defaultValue: "medium",
11983
- options: [
11984
- { value: "none", label: "None" },
11985
- { value: "compact", label: "Compact" },
11986
- { value: "cozy", label: "Cozy" },
11987
- { value: "medium", label: "Medium" },
11988
- { value: "comfortable", label: "Comfortable" },
11989
- { value: "spacious", label: "Spacious" }
11990
- ],
11991
13756
  ui: { intent: "display" }
11992
- }),
11993
- fragmentsToRepeaterField(
11994
- "items",
11995
- "Items",
11996
- collectionFragments,
11997
- {
11998
- minItems: 0,
11999
- maxItems: 50,
12000
- itemLabel: "Item",
12001
- description: "Add items to this collection."
13757
+ },
13758
+ {
13759
+ id: "cards",
13760
+ type: "repeater",
13761
+ label: "Cards",
13762
+ required: false,
13763
+ minItems: 1,
13764
+ maxItems: 8,
13765
+ itemLabel: "Card",
13766
+ itemLabelSource: "title",
13767
+ allowConversion: true,
13768
+ ui: {
13769
+ intent: "content"
13770
+ },
13771
+ schema: {
13772
+ fields: [
13773
+ {
13774
+ id: "media",
13775
+ type: "media",
13776
+ label: "Image",
13777
+ required: false,
13778
+ mediaKinds: ["image"]
13779
+ },
13780
+ createAspectRatioField({
13781
+ id: "aspectRatio",
13782
+ label: "Image aspect ratio",
13783
+ defaultValue: "4/3",
13784
+ visibleWhen: { field: "media", notEquals: null }
13785
+ }),
13786
+ {
13787
+ id: "title",
13788
+ type: "text",
13789
+ label: "Title",
13790
+ required: true,
13791
+ multiline: false,
13792
+ maxLength: 120
13793
+ },
13794
+ {
13795
+ id: "body",
13796
+ type: "richText",
13797
+ label: "Text",
13798
+ required: false,
13799
+ ui: {
13800
+ richTextVariant: "limited"
13801
+ }
13802
+ },
13803
+ createCtasRepeater({
13804
+ label: "Calls to action",
13805
+ itemLabel: "CTA",
13806
+ maxItems: 1,
13807
+ button: {
13808
+ variants: [
13809
+ { value: "primary", label: "Primary" },
13810
+ { value: "secondary", label: "Secondary" },
13811
+ { value: "outline", label: "Outline" },
13812
+ { value: "ghost", label: "Ghost" },
13813
+ { value: "link", label: "Link" }
13814
+ ],
13815
+ defaultVariant: "ghost"
13816
+ }
13817
+ })
13818
+ ]
12002
13819
  }
12003
- ),
13820
+ },
12004
13821
  cardStylesField({
12005
13822
  id: "_cardStyles",
12006
- label: "Item styles"
13823
+ label: "Card styles"
12007
13824
  })
12008
13825
  ],
12009
- layout: collectionLayout,
12010
- description: "Repeat items in a grid or stack layout.",
12011
- tags: ["collection", "grid", "stack", "repeater"],
12012
- icon: "LayoutList",
12013
- styleTokens: { spacing: "lg" }
12014
- });
12015
- var collectionBlockDefinition = {
12016
- manifest: collectionManifest
13826
+ layout: cardsLayout,
13827
+ variants: {
13828
+ cards: cardsLayout
13829
+ },
13830
+ defaultVariant: "cards",
13831
+ variantOptions: {
13832
+ cards: {
13833
+ label: "Cards",
13834
+ description: "A responsive grid of image cards with optional calls to action."
13835
+ }
13836
+ },
13837
+ description: "A card grid for offerings, services, classes, benefits, or featured links.",
13838
+ tags: ["cards", "features", "offerings", "services", "classes", "grid", "links"],
13839
+ icon: "PanelsTopLeft"
13840
+ };
13841
+ var featureCardsManifest = createBlockManifest(featureCardsConfig);
13842
+ var featureCardsBlockDefinition = {
13843
+ manifest: featureCardsManifest
12017
13844
  };
12018
13845
 
12019
13846
  // ../blocks/src/system/fields/carousel.ts
@@ -12101,69 +13928,6 @@ function createCarouselBehaviorFields(options = {}) {
12101
13928
  return fields3;
12102
13929
  }
12103
13930
 
12104
- // ../blocks/src/system/fields/imageLayout.ts
12105
- function createImageColSizeField(options = {}) {
12106
- const {
12107
- id = "imageColSize",
12108
- label = "Image column size",
12109
- description = "Controls how large the image/thumbnail column is at desktop breakpoints.",
12110
- defaultValue = "1/3",
12111
- uiIntent = "display",
12112
- visibleWhen
12113
- } = options;
12114
- return {
12115
- id,
12116
- type: "select",
12117
- label,
12118
- description,
12119
- required: false,
12120
- defaultValue,
12121
- multiple: false,
12122
- options: [
12123
- { value: "1/4", label: "Small (1/4)" },
12124
- { value: "1/3", label: "Medium (1/3)" },
12125
- { value: "2/5", label: "Large (2/5)" },
12126
- { value: "1/2", label: "Extra large (1/2)" },
12127
- { value: "2/3", label: "Huge (2/3)" }
12128
- ],
12129
- ui: {
12130
- intent: uiIntent,
12131
- ...visibleWhen ? { visibleWhen } : {}
12132
- }
12133
- };
12134
- }
12135
- function createImagePositionField(options = {}) {
12136
- const {
12137
- id = "imagePosition",
12138
- label = "Image position",
12139
- description = "Choose which side the image appears on.",
12140
- defaultValue = "left",
12141
- includeAlternate = false,
12142
- uiIntent = "display",
12143
- visibleWhen
12144
- } = options;
12145
- const positionOptions = [
12146
- { value: "left", label: "Left" },
12147
- { value: "right", label: "Right" },
12148
- ...includeAlternate ? [{ value: "alternate", label: "Alternate" }] : []
12149
- ];
12150
- return {
12151
- id,
12152
- type: "select",
12153
- label,
12154
- description,
12155
- required: false,
12156
- defaultValue,
12157
- multiple: false,
12158
- // Spread to get a mutable array type without unsafe casts.
12159
- options: [...positionOptions],
12160
- ui: {
12161
- intent: uiIntent,
12162
- ...visibleWhen ? { visibleWhen } : {}
12163
- }
12164
- };
12165
- }
12166
-
12167
13931
  // ../blocks/src/system/blocks/media-text.ts
12168
13932
  var mediaTextFrameCapability = defineFrameCapability([
12169
13933
  "plain",
@@ -12287,26 +14051,13 @@ var mediaTextManifest = createBlockManifest({
12287
14051
  },
12288
14052
  ui: { intent: "behavior" }
12289
14053
  }),
12290
- {
14054
+ createAspectRatioField({
12291
14055
  id: "aspectRatio",
12292
- type: "select",
12293
14056
  label: "Media aspect ratio",
12294
14057
  description: "Crop media to a consistent aspect ratio.",
12295
- required: false,
12296
14058
  defaultValue: "auto",
12297
- multiple: false,
12298
- options: [
12299
- { value: "auto", label: "Auto (original)" },
12300
- { value: "16/9", label: "16:9 (Landscape)" },
12301
- { value: "4/3", label: "4:3 (Standard)" },
12302
- { value: "1/1", label: "1:1 (Square)" },
12303
- { value: "3/4", label: "3:4 (Portrait)" }
12304
- ],
12305
- ui: {
12306
- intent: "display",
12307
- visibleWhen: { field: "images", notEquals: null }
12308
- }
12309
- },
14059
+ visibleWhen: { field: "images", notEquals: null }
14060
+ }),
12310
14061
  {
12311
14062
  id: "text",
12312
14063
  type: "richText",
@@ -12436,7 +14187,7 @@ var mediaTextManifest = createBlockManifest({
12436
14187
  whenImagesLength(0)
12437
14188
  );
12438
14189
  const defaultInner = el("div", {}, [defaultImagesLayout, defaultTextOnlyLayout]);
12439
- const defaultLayout = styledSection({
14190
+ const defaultLayout2 = styledSection({
12440
14191
  children: styledContainer({
12441
14192
  rootType: "stack",
12442
14193
  rootProps: { gap: "lg" },
@@ -12468,9 +14219,9 @@ var mediaTextManifest = createBlockManifest({
12468
14219
  spacing: "medium"
12469
14220
  });
12470
14221
  return {
12471
- layout: defaultLayout,
14222
+ layout: defaultLayout2,
12472
14223
  variants: {
12473
- default: defaultLayout
14224
+ default: defaultLayout2
12474
14225
  },
12475
14226
  defaultVariant: "default",
12476
14227
  variantOptions: {
@@ -15794,7 +17545,7 @@ var embedBlockDefinition = {
15794
17545
  };
15795
17546
 
15796
17547
  // ../blocks/src/system/blocks/image-gallery.ts
15797
- var grid3 = (props2, children, ...mods) => el("grid", props2 ?? void 0, children ?? void 0, ...mods);
17548
+ var grid4 = (props2, children, ...mods) => el("grid", props2 ?? void 0, children ?? void 0, ...mods);
15798
17549
  var galleryContainer = (children, opts) => {
15799
17550
  const gap = opts?.gap ?? "md";
15800
17551
  const withExtraClass = (baseClass) => opts?.className ? `${baseClass} ${opts.className}` : baseClass;
@@ -15874,7 +17625,7 @@ var galleryItem = (options) => stack(
15874
17625
  ],
15875
17626
  repeat("content.images", "item")
15876
17627
  );
15877
- var gridLayout3 = grid3(
17628
+ var gridLayout3 = grid4(
15878
17629
  {
15879
17630
  className: "rb-grid rb-grid-cols-1 rb-gap-4 rb-sm-grid-cols-2 rb-md-grid-cols-3"
15880
17631
  },
@@ -16477,7 +18228,7 @@ var imageGalleryBlockDefinition = {
16477
18228
  };
16478
18229
 
16479
18230
  // ../blocks/src/system/blocks/video-grid.ts
16480
- var grid4 = (props2, children, ...mods) => el("grid", props2 ?? void 0, children ?? void 0, ...mods);
18231
+ var grid5 = (props2, children, ...mods) => el("grid", props2 ?? void 0, children ?? void 0, ...mods);
16481
18232
  var videoItem = (options) => stack(
16482
18233
  { gap: "xs", className: options.containerClassName },
16483
18234
  [
@@ -16527,7 +18278,7 @@ var gridColumnsClass = (columns) => {
16527
18278
  return "rb-grid rb-grid-cols-1 rb-gap-6 rb-sm-grid-cols-2 rb-md-grid-cols-3";
16528
18279
  }
16529
18280
  };
16530
- var createGridLayout = (columns) => grid4(
18281
+ var createGridLayout = (columns) => grid5(
16531
18282
  {
16532
18283
  className: gridColumnsClass(columns)
16533
18284
  },
@@ -19691,6 +21442,40 @@ var systemBlockDefinitionsRaw = [
19691
21442
  })
19692
21443
  ]
19693
21444
  })),
21445
+ withDesignCapability("block.intro", introBlockDefinition, declareBlockDesignCapability({
21446
+ sectionSurfaces: "supported",
21447
+ contentFrames: ["plain", "panel"],
21448
+ itemSurfaces: "unsupported",
21449
+ headingDecorations: ["organic-squiggle"]
21450
+ }), defineBlockDesignMetadata({
21451
+ flow: bodyFlow,
21452
+ layoutProfiles: [
21453
+ layoutProfile({
21454
+ variantKey: "centered-copy",
21455
+ family: "centered",
21456
+ weight: "featured",
21457
+ bias: "soft"
21458
+ }),
21459
+ layoutProfile({
21460
+ variantKey: "statement-copy",
21461
+ family: "split",
21462
+ weight: "featured",
21463
+ bias: "merge"
21464
+ }),
21465
+ layoutProfile({
21466
+ variantKey: "statement-media",
21467
+ family: "media-text",
21468
+ weight: "featured",
21469
+ bias: "soft"
21470
+ }),
21471
+ layoutProfile({
21472
+ variantKey: "media-copy",
21473
+ family: "media-text",
21474
+ weight: "featured",
21475
+ bias: "soft"
21476
+ })
21477
+ ]
21478
+ })),
19694
21479
  withDesignCapability("block.body-text", bodyTextBlockDefinition, sectionOnly(), defineBlockDesignMetadata({
19695
21480
  flow: bodyFlow,
19696
21481
  layoutProfiles: [
@@ -19751,9 +21536,17 @@ var systemBlockDefinitionsRaw = [
19751
21536
  flow: conversionFlow,
19752
21537
  layoutProfiles: [layoutProfile({ variantKey: "default", family: "form", weight: "standard" })]
19753
21538
  })),
19754
- withDesignCapability("block.faq", faqBlockDefinition, withEyebrowCapability(panelAndItemsCapable(), standardEyebrowTreatments), defineBlockDesignMetadata({
21539
+ withDesignCapability("block.faq", faqBlockDefinition, withEyebrowCapability(declareBlockDesignCapability({
21540
+ sectionSurfaces: "supported",
21541
+ contentFrames: ["plain", "panel"],
21542
+ itemSurfaces: "supported",
21543
+ accordionIconSets: ["plus", "chevron", "caret", "minimal-cross"]
21544
+ }), standardEyebrowTreatments), defineBlockDesignMetadata({
19755
21545
  flow: bodyFlow,
19756
- layoutProfiles: [layoutProfile({ variantKey: "default", family: "stack", weight: "standard" })]
21546
+ layoutProfiles: [
21547
+ layoutProfile({ variantKey: "default", family: "stack", weight: "standard" }),
21548
+ layoutProfile({ variantKey: "two-column", family: "split", weight: "standard" })
21549
+ ]
19757
21550
  })),
19758
21551
  withDesignCapability("block.site-header", siteHeaderBlockDefinition, declareNoBlockDesignCapability("site-chrome"), defineBlockDesignMetadata({
19759
21552
  flow: siteChromeFlow,
@@ -19767,7 +21560,8 @@ var systemBlockDefinitionsRaw = [
19767
21560
  sectionSurfaces: "supported",
19768
21561
  contentFrames: ["plain", "panel"],
19769
21562
  itemSurfaces: "supported",
19770
- testimonialCardTreatments: ["default", "accent-quote"]
21563
+ testimonialCardTreatments: ["default", "accent-quote"],
21564
+ headingDecorations: ["short-center-rule"]
19771
21565
  }), defineBlockDesignMetadata({
19772
21566
  flow: proofFlow,
19773
21567
  layoutProfiles: [
@@ -19793,6 +21587,22 @@ var systemBlockDefinitionsRaw = [
19793
21587
  flow: offeringsFlow,
19794
21588
  layoutProfiles: [layoutProfile({ variantKey: "default", family: "grid", weight: "standard" })]
19795
21589
  })),
21590
+ withDesignCapability("block.feature-cards", featureCardsBlockDefinition, declareBlockDesignCapability({
21591
+ sectionSurfaces: "supported",
21592
+ contentFrames: ["plain", "panel"],
21593
+ itemSurfaces: "supported",
21594
+ headingDecorations: ["short-center-rule"]
21595
+ }), defineBlockDesignMetadata({
21596
+ flow: offeringsFlow,
21597
+ layoutProfiles: [
21598
+ layoutProfile({
21599
+ variantKey: "cards",
21600
+ family: "grid",
21601
+ weight: "standard",
21602
+ bias: "soft"
21603
+ })
21604
+ ]
21605
+ })),
19796
21606
  withDesignCapability("block.media-text", mediaTextBlockDefinition, mediaPanelCapable(), defineBlockDesignMetadata({
19797
21607
  flow: mediaFlow,
19798
21608
  layoutProfiles: [