@riverbankcms/sdk 0.76.0 → 0.77.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (144) hide show
  1. package/dist/{PreviewEditorSidebar-X2HWXFOL.mjs → PreviewEditorSidebar-XSX7QKHQ.mjs} +1019 -442
  2. package/dist/{PreviewEditorUI-AQXIXPOH.mjs → PreviewEditorUI-YZNEZ3QD.mjs} +2 -2
  3. package/dist/SdkPreviewModeRuntime-5FS5E6BI.mjs +8 -0
  4. package/dist/_dts/ai/src/contracts/proposals.d.ts +528 -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 +38 -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/constants/blockKinds.d.ts +1 -1
  24. package/dist/_dts/blocks/src/system/fields/aspectRatio.d.ts +30 -0
  25. package/dist/_dts/blocks/src/system/fields/boxStyles.d.ts +4 -1
  26. package/dist/_dts/blocks/src/system/fields/ctas.d.ts +7 -0
  27. package/dist/_dts/blocks/src/system/manifest/fieldValidation/index.d.ts +11 -2
  28. package/dist/_dts/blocks/src/system/node/validation-constants.d.ts +1 -1
  29. package/dist/_dts/blocks/src/system/runtime/nodes/accordion.d.ts +2 -0
  30. package/dist/_dts/blocks/src/system/runtime/nodes/accordion.server.d.ts +2 -0
  31. package/dist/_dts/blocks/src/system/runtime/nodes/accordionIconTreatment.d.ts +5 -0
  32. package/dist/_dts/blocks/src/system/transforms/registry/layout.d.ts +1 -0
  33. package/dist/_dts/blocks/src/system/transforms/typed.d.ts +2 -1
  34. package/dist/_dts/content-editor/src/controller/EntryControllerProvider.d.ts +2 -0
  35. package/dist/_dts/content-editor/src/hooks/blockDraftLifecycle.d.ts +48 -0
  36. package/dist/_dts/content-editor/src/hooks/invalidBlockSelectors.d.ts +4 -0
  37. package/dist/_dts/content-editor/src/hooks/publishability.d.ts +47 -0
  38. package/dist/_dts/content-editor/src/index.d.ts +1 -0
  39. package/dist/_dts/db/src/generated/supabase/database.types.d.ts +20 -0
  40. package/dist/_dts/editor-blocks/src/BlockEditor.d.ts +2 -1
  41. package/dist/_dts/editor-blocks/src/block-editor/SortableBlockItem.d.ts +2 -1
  42. package/dist/_dts/editor-blocks/src/block-editor/customBlockRegistry.d.ts +2 -0
  43. package/dist/_dts/editor-blocks/src/block-editor/sdkBlockMerger.d.ts +9 -37
  44. package/dist/_dts/editor-blocks/src/index.d.ts +2 -2
  45. package/dist/_dts/preview-next/src/client/index.d.ts +3 -0
  46. package/dist/_dts/preview-next/src/client/layout/PreviewLayoutContext.d.ts +5 -1
  47. package/dist/_dts/preview-next/src/client/preview/PreviewDesignCoordinatorContext.d.ts +20 -0
  48. package/dist/_dts/preview-next/src/client/preview/PreviewEditorSidebar.d.ts +7 -2
  49. package/dist/_dts/preview-next/src/client/preview/PreviewShell.d.ts +7 -2
  50. package/dist/_dts/preview-next/src/client/preview/PreviewShellLayout.d.ts +7 -2
  51. package/dist/_dts/preview-next/src/client/preview/PreviewThemedSiteDocument.d.ts +18 -0
  52. package/dist/_dts/preview-next/src/client/preview/SiteChromeCustomizeContext.d.ts +20 -3
  53. package/dist/_dts/preview-next/src/client/preview/StyleConfigurator.d.ts +6 -1
  54. package/dist/_dts/preview-next/src/client/preview/StyleConfigurator.state.d.ts +14 -4
  55. package/dist/_dts/preview-next/src/client/preview/previewDesignCoordinator.d.ts +73 -0
  56. package/dist/_dts/preview-next/src/client/preview/siteChromeLookRows.d.ts +12 -4
  57. package/dist/_dts/preview-next/src/client/preview/siteStylePreviewPlanner.d.ts +46 -0
  58. package/dist/_dts/preview-next/src/client/preview/styleConfiguratorSnapshot.d.ts +6 -1
  59. package/dist/_dts/preview-next/src/client/preview/typographySelectionInput.d.ts +14 -0
  60. package/dist/_dts/preview-next/src/client/sdk/SdkPreviewModeRuntime.d.ts +1 -1
  61. package/dist/_dts/sdk/src/cli/commands/style.d.ts +8 -0
  62. package/dist/_dts/sdk/src/client/management/types.d.ts +6 -1
  63. package/dist/_dts/sdk/src/client/types.d.ts +9 -0
  64. package/dist/_dts/sdk/src/client.d.ts +1 -1
  65. package/dist/_dts/sdk/src/contracts/system-block-content.d.ts +35 -0
  66. package/dist/_dts/sdk/src/index.d.ts +2 -1
  67. package/dist/_dts/sdk/src/public-api/contracts.d.ts +5 -0
  68. package/dist/_dts/sdk/src/types/block-kinds.d.ts +1 -1
  69. package/dist/_dts/sdk/src/version.d.ts +1 -1
  70. package/dist/_dts/site-commands/src/commands.d.ts +15 -0
  71. package/dist/_dts/theme-core/src/buttons/personalities/earth-pill.d.ts +16 -0
  72. package/dist/_dts/theme-core/src/buttons/personalities/index.d.ts +11 -0
  73. package/dist/_dts/theme-core/src/fonts/types.d.ts +1 -1
  74. package/dist/_dts/theme-core/src/mock-themes/all.d.ts +45 -0
  75. package/dist/_dts/theme-core/src/palette/variants/index.d.ts +15 -0
  76. package/dist/_dts/theme-core/src/palette/variants/warm-neutral.d.ts +16 -0
  77. package/dist/_dts/theme-core/src/schema.d.ts +280 -0
  78. package/dist/_dts/theme-core/src/site-styles/appearancePresetCatalog.d.ts +81 -0
  79. package/dist/_dts/theme-core/src/site-styles/appearancePresetTypes.d.ts +6 -4
  80. package/dist/_dts/theme-core/src/site-styles/blockAppearancePresets.d.ts +81 -0
  81. package/dist/_dts/theme-core/src/site-styles/curatedSiteStyles.d.ts +118 -2
  82. package/dist/_dts/theme-core/src/site-styles/footerLooks.d.ts +13 -0
  83. package/dist/_dts/theme-core/src/site-styles/generatedSchemas.d.ts +4 -2
  84. package/dist/_dts/theme-core/src/site-styles/headerLooks.d.ts +364 -5
  85. package/dist/_dts/theme-core/src/site-styles/headerOpeningSection.d.ts +6 -0
  86. package/dist/_dts/theme-core/src/site-styles/index.d.ts +2 -0
  87. package/dist/_dts/theme-core/src/site-styles/persistedIdParseResult.d.ts +9 -0
  88. package/dist/_dts/theme-core/src/site-styles/previewCompiler.d.ts +20 -4
  89. package/dist/_dts/theme-core/src/site-styles/types.d.ts +74 -2
  90. package/dist/_dts/theme-core/src/site-styles/typographyPresets.d.ts +189 -0
  91. package/dist/{chunk-Z7JLNTJR.mjs → chunk-6SMUFTXD.mjs} +2 -1
  92. package/dist/{chunk-V5VORNEJ.mjs → chunk-ANKDYZ2E.mjs} +1 -1
  93. package/dist/{chunk-Q4OLG66B.mjs → chunk-EAWHBECW.mjs} +476 -153
  94. package/dist/{chunk-TW2Y4RR5.mjs → chunk-GSQX43EZ.mjs} +383 -51
  95. package/dist/{chunk-LYI7TEMH.mjs → chunk-WLQBJN2Z.mjs} +3096 -354
  96. package/dist/cli/index.mjs +2023 -181
  97. package/dist/client/{accordion-2YHIBOZH.mjs → accordion-RZMQSYLR.mjs} +1 -1
  98. package/dist/client/{bookingForm-35IBDWAS.mjs → bookingForm-NF4ASVNV.mjs} +2 -2
  99. package/dist/client/bookings.mjs +92 -0
  100. package/dist/client/{carousel-K6XG7NZQ.mjs → carousel-LDX47ZIK.mjs} +1 -1
  101. package/dist/client/{cart-HCFYUTTU.mjs → cart-RGXDS5F4.mjs} +3 -3
  102. package/dist/client/{checkout-J3U4XR7K.mjs → checkout-P7WWSNNY.mjs} +3 -3
  103. package/dist/client/{chunk-BOIHIU7E.mjs → chunk-E2TDNXCL.mjs} +1 -1
  104. package/dist/client/{chunk-PFBX3IQL.mjs → chunk-GMVTOKYG.mjs} +2 -2
  105. package/dist/client/{chunk-FGUIVT2B.mjs → chunk-JNC7CGHX.mjs} +1 -1
  106. package/dist/client/{chunk-SNSWVZEP.mjs → chunk-L3DNHIJX.mjs} +3 -3
  107. package/dist/client/{chunk-7UOSCYY4.mjs → chunk-R56FQ3RR.mjs} +92 -0
  108. package/dist/client/{chunk-J227A3CQ.mjs → chunk-UFSWADAO.mjs} +1 -1
  109. package/dist/client/client.mjs +2134 -228
  110. package/dist/client/{courseRegistration-ZBXS7VGI.mjs → courseRegistration-7F65K5ZR.mjs} +2 -2
  111. package/dist/client/{eventCalendar-EQQZHJBA.mjs → eventCalendar-GLSC5KTL.mjs} +4 -4
  112. package/dist/client/{eventCombined-JCFTGBFQ.mjs → eventCombined-ZHK4WKUR.mjs} +4 -4
  113. package/dist/client/{eventDetails-HLUTQSYY.mjs → eventDetails-E3PJYBIN.mjs} +4 -4
  114. package/dist/client/{eventListing-FG4MICVB.mjs → eventListing-EMS3WC3E.mjs} +4 -4
  115. package/dist/client/{eventRegistration-GUEB7LBT.mjs → eventRegistration-NZOTVNPI.mjs} +4 -4
  116. package/dist/client/{form-YQEW4YIT.mjs → form-ETFZFATW.mjs} +1 -1
  117. package/dist/client/{headerSection-GTR3TTRM.mjs → headerSection-4LBP7ULT.mjs} +2 -2
  118. package/dist/client/hooks.mjs +1918 -293
  119. package/dist/client/{locationMap-SPC7VGUH.mjs → locationMap-5M655YSJ.mjs} +1 -1
  120. package/dist/client/{newsletterForm-4IW5BLID.mjs → newsletterForm-QOUYW44O.mjs} +1 -1
  121. package/dist/client/{productDetail-KP5H2WJO.mjs → productDetail-O4DOCWQG.mjs} +3 -3
  122. package/dist/client/{productList-3M3M72XZ.mjs → productList-A5RO5WIS.mjs} +3 -3
  123. package/dist/client/rendering/client.mjs +198 -32
  124. package/dist/client/rendering/islands.mjs +18 -18
  125. package/dist/client/rendering.mjs +2095 -208
  126. package/dist/client/{shop-ACQKVGOM.mjs → shop-L4MZH4I2.mjs} +3 -3
  127. package/dist/preview-next/client/runtime.mjs +4 -4
  128. package/dist/{sdk-runtime-K7HNB4U2.mjs → sdk-runtime-Q6MTR4KL.mjs} +5 -5
  129. package/dist/server/components.mjs +2046 -204
  130. package/dist/server/config-validation.mjs +1921 -293
  131. package/dist/server/config.mjs +1921 -293
  132. package/dist/server/data.mjs +1918 -293
  133. package/dist/server/index.mjs +31 -2
  134. package/dist/server/next.mjs +2067 -206
  135. package/dist/server/page-converter.mjs +1894 -281
  136. package/dist/server/prebuild.mjs +1 -1
  137. package/dist/server/rendering/server.mjs +2046 -204
  138. package/dist/server/rendering.mjs +2046 -204
  139. package/dist/server/routing.mjs +1963 -275
  140. package/dist/server/server.mjs +1932 -288
  141. package/dist/server/theme-bridge.mjs +158 -1
  142. package/dist/server/theme.mjs +158 -1
  143. package/package.json +1 -1
  144. 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,
@@ -3197,12 +3410,36 @@ var boxBackgroundSchema = z19.object({
3197
3410
  textColor: tokenOrCssColorValueSchema.nullable().optional(),
3198
3411
  headingColor: tokenOrCssColorValueSchema.nullable().optional()
3199
3412
  });
3413
+ var noHeadingDecorationSchema = z19.object({
3414
+ family: z19.literal("none"),
3415
+ placement: z19.literal("none")
3416
+ });
3417
+ var visibleHeadingDecorationSchema = z19.object({
3418
+ family: z19.enum(visibleHeadingDecorationFamilyValues),
3419
+ placement: z19.enum(visibleHeadingDecorationPlacementValues),
3420
+ colorToken: z19.enum(headingDecorationColorTokenValues).optional()
3421
+ });
3422
+ var headingDecorationSchema = z19.union([
3423
+ noHeadingDecorationSchema,
3424
+ visibleHeadingDecorationSchema
3425
+ ]);
3426
+ var accordionIconTreatmentSchema = z19.object({
3427
+ iconSet: z19.enum(accordionIconSetValues),
3428
+ colorToken: z19.enum(accordionIconColorTokenValues),
3429
+ openColorToken: z19.enum(accordionIconColorTokenValues).optional(),
3430
+ motion: z19.enum(accordionIconMotionValues)
3431
+ });
3200
3432
  var sectionStylesOverrideSchema = z19.object({
3201
3433
  background: boxBackgroundSchema.nullable().optional(),
3202
3434
  spacing: semanticSpacingSchema.nullable().optional(),
3203
3435
  minHeight: z19.enum(["none", "banner", "hero", "immersive"]).nullable().optional(),
3204
3436
  tileTreatment: z19.enum(tileTreatmentValues).nullable().optional(),
3205
- eyebrowTreatment: z19.enum(eyebrowTreatmentValues).nullable().optional()
3437
+ eyebrowTreatment: z19.enum(eyebrowTreatmentValues).nullable().optional(),
3438
+ headingDecoration: headingDecorationSchema.nullable().optional(),
3439
+ // Author-level override consumed by later block/editor rendering phases.
3440
+ // Keeping it in section styles lets existing block save APIs persist it.
3441
+ headingDecorationOverride: z19.enum(headingDecorationOverrideValues).nullable().optional(),
3442
+ accordionIconTreatment: accordionIconTreatmentSchema.nullable().optional()
3206
3443
  });
3207
3444
  var containerStylesOverrideSchema = z19.object({
3208
3445
  background: boxBackgroundSchema.nullable().optional(),
@@ -3910,6 +4147,28 @@ var warmNeutralCream = definePaletteVariant({
3910
4147
  { name: "border", hex: "#e0d2b8" }
3911
4148
  ]
3912
4149
  });
4150
+ var warmNeutralSoftEarth = definePaletteVariant({
4151
+ id: "warm-neutral-soft-earth",
4152
+ name: "Warm Neutral \u2014 Soft Earth",
4153
+ description: "Cream ground with terracotta primary, clay accents, and olive depth.",
4154
+ tags: { tone: "classic", energy: "calm", era: "organic" },
4155
+ mode: "light",
4156
+ colors: [
4157
+ { name: "primary", hex: "#a8573d" },
4158
+ { name: "secondary", hex: "#72765c" },
4159
+ { name: "accent", hex: "#c87557" },
4160
+ { name: "success", hex: "#687854" },
4161
+ { name: "warning", hex: "#b7863e" },
4162
+ { name: "destructive", hex: "#a54b3c" },
4163
+ { name: "background", hex: "#fbf6eb" },
4164
+ { name: "surface", hex: "#fffdf7" },
4165
+ { name: "surfaceAlt", hex: "#f0e4d3" },
4166
+ { name: "muted", hex: "#eadbc6" },
4167
+ { name: "text", hex: "#30281f" },
4168
+ { name: "primaryForeground", hex: "#fffaf3" },
4169
+ { name: "border", hex: "#d9c8b2" }
4170
+ ]
4171
+ });
3913
4172
  var warmNeutralForest = definePaletteVariant({
3914
4173
  id: "warm-neutral-forest",
3915
4174
  name: "Warm Neutral \u2014 Forest",
@@ -3943,6 +4202,7 @@ var paletteVariants = [
3943
4202
  // Warm-neutral family
3944
4203
  warmNeutralClay,
3945
4204
  warmNeutralCream,
4205
+ warmNeutralSoftEarth,
3946
4206
  warmNeutralForest,
3947
4207
  // High-contrast family
3948
4208
  highContrastInk,
@@ -3961,6 +4221,12 @@ var paletteVariantsById = new Map(
3961
4221
  function asHeaderLookId(value) {
3962
4222
  return value;
3963
4223
  }
4224
+ function asHeaderLayoutId(value) {
4225
+ return value;
4226
+ }
4227
+ function asHeaderStyleId(value) {
4228
+ return value;
4229
+ }
3964
4230
  function baseHeader(theme) {
3965
4231
  const {
3966
4232
  navLinkStyle: _navLinkStyle,
@@ -3979,6 +4245,309 @@ function baseHeader(theme) {
3979
4245
  navContainer: { type: "none", tint: null, opacity: 0.15 }
3980
4246
  };
3981
4247
  }
4248
+ var headerLayoutCatalog = [
4249
+ {
4250
+ id: asHeaderLayoutId("classic"),
4251
+ label: "Classic",
4252
+ description: "Logo and navigation in one practical horizontal row.",
4253
+ structure: "inline-classic",
4254
+ variant: "classic",
4255
+ defaultPositioning: "sticky",
4256
+ shrinkOnScroll: false
4257
+ },
4258
+ {
4259
+ id: asHeaderLayoutId("centered"),
4260
+ label: "Centered",
4261
+ description: "Logo centered above a balanced navigation row.",
4262
+ structure: "centered-stack",
4263
+ variant: "centered",
4264
+ defaultPositioning: "static",
4265
+ shrinkOnScroll: false,
4266
+ maxRecommendedNavItems: 5,
4267
+ allowedLogoShapes: ["none", "text-only", "horizontal", "square"]
4268
+ },
4269
+ {
4270
+ id: asHeaderLayoutId("editorial"),
4271
+ label: "Editorial",
4272
+ description: "A composed, magazine-like stacked header treatment.",
4273
+ structure: "editorial-stack",
4274
+ variant: "editorial",
4275
+ defaultPositioning: "static",
4276
+ shrinkOnScroll: false,
4277
+ maxRecommendedNavItems: 6
4278
+ },
4279
+ {
4280
+ id: asHeaderLayoutId("floating"),
4281
+ label: "Floating",
4282
+ description: "Detached header chrome that sits over the opening section.",
4283
+ structure: "floating-shell",
4284
+ variant: "floating",
4285
+ defaultPositioning: "fixed",
4286
+ shrinkOnScroll: true,
4287
+ maxRecommendedNavItems: 5,
4288
+ allowedLogoShapes: ["none", "text-only", "horizontal"]
4289
+ }
4290
+ ];
4291
+ function supportedLayouts(ids) {
4292
+ return ids.map(asHeaderLayoutId);
4293
+ }
4294
+ var headerStyleCatalog = [
4295
+ {
4296
+ id: asHeaderStyleId("minimal"),
4297
+ label: "Minimal",
4298
+ description: "Quiet surface with simple color-change navigation.",
4299
+ supportedLayoutIds: supportedLayouts(["classic", "centered", "editorial"]),
4300
+ navInteraction: "color-change",
4301
+ surface: "neutral"
4302
+ },
4303
+ {
4304
+ id: asHeaderStyleId("fine-line"),
4305
+ label: "Fine Line",
4306
+ description: "Light surface with a crisp lower rule and underline hover.",
4307
+ supportedLayoutIds: supportedLayouts(["classic", "centered", "editorial"]),
4308
+ navInteraction: "underline-grow",
4309
+ surface: "bordered"
4310
+ },
4311
+ {
4312
+ id: asHeaderStyleId("soft-bar"),
4313
+ label: "Soft Bar",
4314
+ description: "Soft tinted surface with gentle pill hover states.",
4315
+ supportedLayoutIds: supportedLayouts(["classic", "centered"]),
4316
+ navInteraction: "pill-background",
4317
+ surface: "soft"
4318
+ },
4319
+ {
4320
+ id: asHeaderStyleId("pill-nav"),
4321
+ label: "Pill Nav",
4322
+ description: "A calm pill navigation rail over a neutral header.",
4323
+ supportedLayoutIds: supportedLayouts(["classic", "centered"]),
4324
+ navInteraction: "pill-background",
4325
+ surface: "soft"
4326
+ },
4327
+ {
4328
+ id: asHeaderStyleId("brand-bar"),
4329
+ label: "Brand Bar",
4330
+ description: "Solid brand surface with high-contrast navigation.",
4331
+ supportedLayoutIds: supportedLayouts(["classic", "centered", "editorial"]),
4332
+ navInteraction: "color-change",
4333
+ surface: "brand-solid"
4334
+ },
4335
+ {
4336
+ id: asHeaderStyleId("brand-underline"),
4337
+ label: "Brand Underline",
4338
+ description: "Brand surface with underline-grow navigation.",
4339
+ supportedLayoutIds: supportedLayouts(["classic", "editorial"]),
4340
+ navInteraction: "underline-grow",
4341
+ surface: "brand-solid"
4342
+ },
4343
+ {
4344
+ id: asHeaderStyleId("brand-pill"),
4345
+ label: "Brand Pill",
4346
+ description: "Solid brand surface with rounded active and hover states.",
4347
+ supportedLayoutIds: supportedLayouts(["classic", "centered", "floating"]),
4348
+ navInteraction: "pill-background",
4349
+ surface: "brand-solid"
4350
+ },
4351
+ {
4352
+ id: asHeaderStyleId("editorial-line"),
4353
+ label: "Editorial Line",
4354
+ description: "Typographic logo treatment with understated underline navigation.",
4355
+ supportedLayoutIds: supportedLayouts(["classic", "centered", "editorial"]),
4356
+ navInteraction: "underline-grow",
4357
+ surface: "bordered"
4358
+ },
4359
+ {
4360
+ id: asHeaderStyleId("flat-tabs"),
4361
+ label: "Flat Tabs",
4362
+ description: "Flat block hover and active states with a Swiss utility feel.",
4363
+ supportedLayoutIds: supportedLayouts(["classic", "centered", "editorial"]),
4364
+ navInteraction: "flat-block",
4365
+ surface: "bordered"
4366
+ },
4367
+ {
4368
+ id: asHeaderStyleId("glass"),
4369
+ label: "Glass",
4370
+ description: "Floating translucent chrome with frosted navigation backing.",
4371
+ supportedLayoutIds: supportedLayouts(["floating"]),
4372
+ navInteraction: "glass-backed",
4373
+ surface: "floating",
4374
+ requiresFloatingLayout: true
4375
+ },
4376
+ {
4377
+ id: asHeaderStyleId("minimal-surface"),
4378
+ label: "Minimal Surface",
4379
+ description: "Floating chrome with a restrained translucent surface.",
4380
+ supportedLayoutIds: supportedLayouts(["floating"]),
4381
+ navInteraction: "color-change",
4382
+ surface: "floating",
4383
+ requiresFloatingLayout: true
4384
+ },
4385
+ {
4386
+ id: asHeaderStyleId("soft-shell"),
4387
+ label: "Soft Shell",
4388
+ description: "Floating rounded shell with soft pill navigation states.",
4389
+ supportedLayoutIds: supportedLayouts(["floating"]),
4390
+ navInteraction: "pill-background",
4391
+ surface: "floating",
4392
+ requiresFloatingLayout: true
4393
+ }
4394
+ ];
4395
+ var headerLayoutsById = new Map(
4396
+ headerLayoutCatalog.map((layout) => [layout.id, layout])
4397
+ );
4398
+ var headerStylesById = new Map(
4399
+ headerStyleCatalog.map((style) => [style.id, style])
4400
+ );
4401
+ var headerStyleCompatibilityOrder = /* @__PURE__ */ new Map([
4402
+ [
4403
+ asHeaderLayoutId("classic"),
4404
+ headerStyleRepairChain([
4405
+ "minimal",
4406
+ "fine-line",
4407
+ "soft-bar",
4408
+ "pill-nav",
4409
+ "brand-bar",
4410
+ "brand-underline",
4411
+ "brand-pill",
4412
+ "editorial-line",
4413
+ "flat-tabs"
4414
+ ])
4415
+ ],
4416
+ [
4417
+ asHeaderLayoutId("centered"),
4418
+ headerStyleRepairChain([
4419
+ "minimal",
4420
+ "fine-line",
4421
+ "soft-bar",
4422
+ "pill-nav",
4423
+ "brand-bar",
4424
+ "brand-pill",
4425
+ "editorial-line",
4426
+ "flat-tabs"
4427
+ ])
4428
+ ],
4429
+ [
4430
+ asHeaderLayoutId("editorial"),
4431
+ headerStyleRepairChain([
4432
+ "minimal",
4433
+ "fine-line",
4434
+ "soft-bar",
4435
+ "brand-bar",
4436
+ "brand-underline",
4437
+ "editorial-line",
4438
+ "flat-tabs"
4439
+ ])
4440
+ ],
4441
+ [
4442
+ asHeaderLayoutId("floating"),
4443
+ headerStyleRepairChain([
4444
+ "glass",
4445
+ "minimal-surface",
4446
+ "soft-shell",
4447
+ "brand-pill"
4448
+ ])
4449
+ ]
4450
+ ]);
4451
+ function headerStyleRepairChain(values) {
4452
+ return values.map(asHeaderStyleId);
4453
+ }
4454
+ var headerStyleRepairOrder = /* @__PURE__ */ new Map([
4455
+ [asHeaderStyleId("brand-bar"), headerStyleRepairChain(["brand-bar", "brand-pill", "minimal"])],
4456
+ [asHeaderStyleId("brand-underline"), headerStyleRepairChain(["editorial-line", "fine-line", "minimal"])],
4457
+ [asHeaderStyleId("brand-pill"), headerStyleRepairChain(["brand-pill", "brand-bar", "minimal"])],
4458
+ [asHeaderStyleId("pill-nav"), headerStyleRepairChain(["pill-nav", "soft-bar", "minimal"])],
4459
+ [asHeaderStyleId("flat-tabs"), headerStyleRepairChain(["flat-tabs", "pill-nav", "minimal"])],
4460
+ [asHeaderStyleId("editorial-line"), headerStyleRepairChain(["editorial-line", "fine-line", "minimal"])],
4461
+ [asHeaderStyleId("glass"), headerStyleRepairChain(["glass", "minimal-surface", "minimal"])],
4462
+ [asHeaderStyleId("soft-shell"), headerStyleRepairChain(["soft-shell", "soft-bar", "minimal"])],
4463
+ [asHeaderStyleId("minimal-surface"), headerStyleRepairChain(["minimal-surface", "minimal"])],
4464
+ [asHeaderStyleId("fine-line"), headerStyleRepairChain(["fine-line", "minimal"])],
4465
+ [asHeaderStyleId("soft-bar"), headerStyleRepairChain(["soft-bar", "minimal"])],
4466
+ [asHeaderStyleId("minimal"), headerStyleRepairChain(["minimal"])]
4467
+ ]);
4468
+ var legacyHeaderLookAliases = [
4469
+ {
4470
+ lookId: asHeaderLookId("clean-base"),
4471
+ selection: {
4472
+ layoutId: asHeaderLayoutId("classic"),
4473
+ styleId: asHeaderStyleId("minimal")
4474
+ }
4475
+ },
4476
+ {
4477
+ lookId: asHeaderLookId("brand-solid"),
4478
+ selection: {
4479
+ layoutId: asHeaderLayoutId("classic"),
4480
+ styleId: asHeaderStyleId("brand-bar")
4481
+ }
4482
+ },
4483
+ {
4484
+ lookId: asHeaderLookId("editorial-line"),
4485
+ selection: {
4486
+ layoutId: asHeaderLayoutId("editorial"),
4487
+ styleId: asHeaderStyleId("editorial-line")
4488
+ }
4489
+ },
4490
+ {
4491
+ lookId: asHeaderLookId("centered-calm"),
4492
+ selection: {
4493
+ layoutId: asHeaderLayoutId("centered"),
4494
+ styleId: asHeaderStyleId("minimal")
4495
+ }
4496
+ },
4497
+ {
4498
+ lookId: asHeaderLookId("practical-utility"),
4499
+ selection: {
4500
+ layoutId: asHeaderLayoutId("classic"),
4501
+ styleId: asHeaderStyleId("flat-tabs")
4502
+ }
4503
+ },
4504
+ {
4505
+ lookId: asHeaderLookId("minimal-transparent"),
4506
+ selection: {
4507
+ layoutId: asHeaderLayoutId("classic"),
4508
+ styleId: asHeaderStyleId("minimal")
4509
+ }
4510
+ },
4511
+ {
4512
+ lookId: asHeaderLookId("transparent-overlay"),
4513
+ selection: {
4514
+ layoutId: asHeaderLayoutId("floating"),
4515
+ styleId: asHeaderStyleId("glass")
4516
+ }
4517
+ },
4518
+ {
4519
+ lookId: asHeaderLookId("floating-glass"),
4520
+ selection: {
4521
+ layoutId: asHeaderLayoutId("floating"),
4522
+ styleId: asHeaderStyleId("glass")
4523
+ }
4524
+ }
4525
+ ];
4526
+ var legacyHeaderLookAliasesById = new Map(
4527
+ legacyHeaderLookAliases.map((alias) => [alias.lookId, alias])
4528
+ );
4529
+ function getHeaderStyle(id) {
4530
+ return headerStylesById.get(id) ?? null;
4531
+ }
4532
+ function isHeaderStyleCompatibleWithLayout(style, layoutId) {
4533
+ return style.supportedLayoutIds.includes(layoutId);
4534
+ }
4535
+ function getHeaderStyleOrThrow(id) {
4536
+ const style = getHeaderStyle(id);
4537
+ if (!style) {
4538
+ throw new Error(`Unknown Theme V2 header style: ${id}`);
4539
+ }
4540
+ return style;
4541
+ }
4542
+ function resolveLegacyHeaderLookAlias(lookId) {
4543
+ return legacyHeaderLookAliasesById.get(lookId)?.selection ?? null;
4544
+ }
4545
+ function getCompatibleHeaderStyleIds(layoutId) {
4546
+ return (headerStyleCompatibilityOrder.get(layoutId) ?? []).filter((styleId) => {
4547
+ const style = getHeaderStyleOrThrow(styleId);
4548
+ return isHeaderStyleCompatibleWithLayout(style, layoutId);
4549
+ });
4550
+ }
3982
4551
  function solidBrandHeader(theme) {
3983
4552
  const ctaVariant = resolveHeaderCtaVariant(theme, "inverted");
3984
4553
  return {
@@ -4215,6 +4784,11 @@ var headerLookCatalog = [
4215
4784
  label: "Clean base",
4216
4785
  visualTreatment: "solid-neutral",
4217
4786
  layoutBehavior: "sticky",
4787
+ configuration: {
4788
+ structure: "inline-classic",
4789
+ treatment: "solid-neutral",
4790
+ behavior: "sticky"
4791
+ },
4218
4792
  openingRequirement: "none",
4219
4793
  compile: cleanBaseHeader
4220
4794
  },
@@ -4223,6 +4797,11 @@ var headerLookCatalog = [
4223
4797
  label: "Brand solid",
4224
4798
  visualTreatment: "solid-brand",
4225
4799
  layoutBehavior: "sticky-shrink",
4800
+ configuration: {
4801
+ structure: "inline-classic",
4802
+ treatment: "solid-brand",
4803
+ behavior: "sticky-shrink"
4804
+ },
4226
4805
  openingRequirement: "none",
4227
4806
  compile: solidBrandHeader
4228
4807
  },
@@ -4231,6 +4810,11 @@ var headerLookCatalog = [
4231
4810
  label: "Editorial line",
4232
4811
  visualTreatment: "light-editorial",
4233
4812
  layoutBehavior: "sticky",
4813
+ configuration: {
4814
+ structure: "editorial-stack",
4815
+ treatment: "light-editorial",
4816
+ behavior: "sticky"
4817
+ },
4234
4818
  openingRequirement: "none",
4235
4819
  maxRecommendedNavItems: 6,
4236
4820
  compile: editorialLineHeader
@@ -4240,6 +4824,11 @@ var headerLookCatalog = [
4240
4824
  label: "Centered calm",
4241
4825
  visualTreatment: "light-editorial",
4242
4826
  layoutBehavior: "normal-flow",
4827
+ configuration: {
4828
+ structure: "centered-stack",
4829
+ treatment: "light-editorial",
4830
+ behavior: "normal-flow"
4831
+ },
4243
4832
  openingRequirement: "none",
4244
4833
  maxRecommendedNavItems: 5,
4245
4834
  allowedLogoShapes: ["none", "text-only", "horizontal", "square"],
@@ -4250,6 +4839,11 @@ var headerLookCatalog = [
4250
4839
  label: "Practical utility",
4251
4840
  visualTreatment: "solid-neutral",
4252
4841
  layoutBehavior: "sticky-shrink",
4842
+ configuration: {
4843
+ structure: "inline-classic",
4844
+ treatment: "solid-neutral",
4845
+ behavior: "sticky-shrink"
4846
+ },
4253
4847
  openingRequirement: "none",
4254
4848
  requiresProminentCta: true,
4255
4849
  compile: practicalUtilityHeader
@@ -4259,6 +4853,11 @@ var headerLookCatalog = [
4259
4853
  label: "Minimal transparent",
4260
4854
  visualTreatment: "minimal-transparent",
4261
4855
  layoutBehavior: "normal-flow",
4856
+ configuration: {
4857
+ structure: "inline-classic",
4858
+ treatment: "minimal-transparent",
4859
+ behavior: "normal-flow"
4860
+ },
4262
4861
  openingRequirement: "reserved-space-ok",
4263
4862
  compile: minimalTransparentHeader
4264
4863
  },
@@ -4267,6 +4866,11 @@ var headerLookCatalog = [
4267
4866
  label: "Transparent overlay",
4268
4867
  visualTreatment: "transparent-overlay",
4269
4868
  layoutBehavior: "fixed-overlay",
4869
+ configuration: {
4870
+ structure: "inline-classic",
4871
+ treatment: "transparent-overlay",
4872
+ behavior: "fixed-overlay"
4873
+ },
4270
4874
  openingRequirement: "requires-image-hero-with-contrast-overlay",
4271
4875
  maxRecommendedNavItems: 5,
4272
4876
  allowedLogoShapes: ["none", "text-only", "horizontal"],
@@ -4277,6 +4881,11 @@ var headerLookCatalog = [
4277
4881
  label: "Floating glass",
4278
4882
  visualTreatment: "floating-glass",
4279
4883
  layoutBehavior: "fixed-floating",
4884
+ configuration: {
4885
+ structure: "floating-shell",
4886
+ treatment: "floating-glass",
4887
+ behavior: "fixed-floating"
4888
+ },
4280
4889
  openingRequirement: "requires-image-hero-with-contrast-overlay",
4281
4890
  maxRecommendedNavItems: 5,
4282
4891
  allowedLogoShapes: ["none", "text-only", "horizontal"],
@@ -4284,9 +4893,17 @@ var headerLookCatalog = [
4284
4893
  }
4285
4894
  ];
4286
4895
  var guaranteedFallbackHeaderLookId = asHeaderLookId("clean-base");
4896
+ var guaranteedFallbackHeaderLayoutId = asHeaderLayoutId("classic");
4897
+ var guaranteedFallbackHeaderStyleId = asHeaderStyleId("minimal");
4898
+ var allowedHeaderConfigurationKeys = new Set(
4899
+ headerLookCatalog.map((look) => headerConfigurationKey(look.configuration))
4900
+ );
4287
4901
  var headerLooksById = new Map(
4288
4902
  headerLookCatalog.map((look) => [look.id, look])
4289
4903
  );
4904
+ function headerConfigurationKey(configuration) {
4905
+ return `${configuration.structure}:${configuration.treatment}:${configuration.behavior}`;
4906
+ }
4290
4907
 
4291
4908
  // ../theme-core/src/site-styles/footerLooks.ts
4292
4909
  function asFooterLookId(value) {
@@ -4419,6 +5036,264 @@ var advancedDesignOptionCatalog = {
4419
5036
  detachedCustom: true
4420
5037
  };
4421
5038
 
5039
+ // ../theme-core/src/site-styles/typographyPresets.ts
5040
+ var bodyReadablePolicy = {
5041
+ recommendedCategories: ["sans-serif", "serif"],
5042
+ allowedCategories: ["sans-serif", "serif"],
5043
+ requiresItalicForBody: true,
5044
+ requiresBoldForBody: true
5045
+ };
5046
+ var headingFlexiblePolicy = {
5047
+ recommendedCategories: ["sans-serif", "serif", "display"],
5048
+ allowedCategories: ["sans-serif", "serif", "display"]
5049
+ };
5050
+ var displayHeadingPolicy = {
5051
+ recommendedCategories: ["display", "sans-serif", "serif"],
5052
+ allowedCategories: ["display", "sans-serif", "serif"]
5053
+ };
5054
+ function asTypographyPresetId(value) {
5055
+ if (!value.startsWith("typography-preset:")) {
5056
+ throw new Error(`TypographyPresetId must start with "typography-preset:". Received: ${value}`);
5057
+ }
5058
+ return value;
5059
+ }
5060
+ function defineTypographyPreset(preset) {
5061
+ return {
5062
+ ...preset,
5063
+ id: asTypographyPresetId(preset.id)
5064
+ };
5065
+ }
5066
+ var modernSansTypography = {
5067
+ body: {
5068
+ family: "Inter, system-ui, sans-serif",
5069
+ size: "md",
5070
+ weight: "regular",
5071
+ lineHeight: "relaxed",
5072
+ letterSpacing: "normal"
5073
+ },
5074
+ headings: {
5075
+ default: {
5076
+ family: "Inter, system-ui, sans-serif",
5077
+ weight: "semibold",
5078
+ lineHeight: "normal",
5079
+ letterSpacing: "tight",
5080
+ italic: null,
5081
+ case: null
5082
+ },
5083
+ h1: { size: "xl", weight: "bold", lineHeight: "normal", letterSpacing: "tight", italic: null },
5084
+ h2: { size: "lg", weight: "semibold", lineHeight: "normal", letterSpacing: "tight", italic: null },
5085
+ h3: { size: "md", weight: "semibold", lineHeight: "normal", letterSpacing: "normal", italic: null }
5086
+ },
5087
+ scale: "balanced"
5088
+ };
5089
+ var warmRoundedTypography = {
5090
+ body: {
5091
+ family: "Nunito Sans, system-ui, sans-serif",
5092
+ size: "lg",
5093
+ weight: "regular",
5094
+ lineHeight: "relaxed",
5095
+ letterSpacing: "normal"
5096
+ },
5097
+ headings: {
5098
+ default: {
5099
+ family: "Nunito Sans, system-ui, sans-serif",
5100
+ weight: "bold",
5101
+ lineHeight: "normal",
5102
+ letterSpacing: "normal",
5103
+ italic: null,
5104
+ case: null
5105
+ },
5106
+ h1: { size: "xl", weight: "bold", lineHeight: "normal", letterSpacing: "normal", italic: null },
5107
+ h2: { size: "lg", weight: "bold", lineHeight: "normal", letterSpacing: "normal", italic: null },
5108
+ h3: { size: "md", weight: "semibold", lineHeight: "relaxed", letterSpacing: "normal", italic: null }
5109
+ },
5110
+ scale: "balanced"
5111
+ };
5112
+ var editorialSerifTypography = {
5113
+ body: {
5114
+ family: "Lora, Georgia, serif",
5115
+ size: "lg",
5116
+ weight: "regular",
5117
+ lineHeight: "loose",
5118
+ letterSpacing: "normal"
5119
+ },
5120
+ headings: {
5121
+ default: {
5122
+ family: "Playfair Display, Georgia, serif",
5123
+ weight: "semibold",
5124
+ lineHeight: "normal",
5125
+ letterSpacing: "tight",
5126
+ italic: null,
5127
+ case: null
5128
+ },
5129
+ h1: { size: "2xl", weight: "semibold", lineHeight: "normal", letterSpacing: "tight", italic: null },
5130
+ h2: { size: "xl", weight: "semibold", lineHeight: "normal", letterSpacing: "normal", italic: null },
5131
+ h3: { size: "md", weight: "semibold", lineHeight: "relaxed", letterSpacing: "normal", italic: true }
5132
+ },
5133
+ scale: "spacious"
5134
+ };
5135
+ var classicSerifTypography = {
5136
+ body: {
5137
+ family: "Libre Baskerville, Georgia, serif",
5138
+ size: "md",
5139
+ weight: "regular",
5140
+ lineHeight: "relaxed",
5141
+ letterSpacing: "normal"
5142
+ },
5143
+ headings: {
5144
+ default: {
5145
+ family: "Cormorant Garamond, Georgia, serif",
5146
+ weight: "semibold",
5147
+ lineHeight: "normal",
5148
+ letterSpacing: "normal",
5149
+ italic: null,
5150
+ case: null
5151
+ },
5152
+ h1: { size: "2xl", weight: "semibold", lineHeight: "normal", letterSpacing: "normal", italic: null },
5153
+ h2: { size: "xl", weight: "semibold", lineHeight: "normal", letterSpacing: "normal", italic: null },
5154
+ h3: { size: "md", weight: "medium", lineHeight: "relaxed", letterSpacing: "normal", italic: null }
5155
+ },
5156
+ scale: "balanced"
5157
+ };
5158
+ var luxeContrastTypography = {
5159
+ body: {
5160
+ family: "Manrope, system-ui, sans-serif",
5161
+ size: "md",
5162
+ weight: "regular",
5163
+ lineHeight: "relaxed",
5164
+ letterSpacing: "normal"
5165
+ },
5166
+ headings: {
5167
+ default: {
5168
+ family: "Cormorant Garamond, Georgia, serif",
5169
+ weight: "semibold",
5170
+ lineHeight: "normal",
5171
+ letterSpacing: "tight",
5172
+ italic: null,
5173
+ case: null
5174
+ },
5175
+ h1: { size: "2xl", weight: "semibold", lineHeight: "normal", letterSpacing: "tight", italic: null },
5176
+ h2: { size: "xl", weight: "semibold", lineHeight: "normal", letterSpacing: "tight", italic: null },
5177
+ h3: { size: "md", weight: "medium", lineHeight: "relaxed", letterSpacing: "normal", italic: null }
5178
+ },
5179
+ scale: "spacious"
5180
+ };
5181
+ var boldDisplayTypography = {
5182
+ body: {
5183
+ family: "Manrope, system-ui, sans-serif",
5184
+ size: "lg",
5185
+ weight: "regular",
5186
+ lineHeight: "relaxed",
5187
+ letterSpacing: "normal"
5188
+ },
5189
+ headings: {
5190
+ default: {
5191
+ family: '"TAN - PEARL", sans-serif',
5192
+ weight: "bold",
5193
+ lineHeight: "normal",
5194
+ letterSpacing: "tight",
5195
+ colorToken: "primary",
5196
+ italic: null,
5197
+ case: null
5198
+ },
5199
+ h1: { size: "xl", weight: "bold", lineHeight: "normal", letterSpacing: "tight", italic: null },
5200
+ h2: { size: "lg", weight: "bold", lineHeight: "normal", letterSpacing: "normal", italic: null },
5201
+ h3: { size: "md", weight: "bold", lineHeight: "normal", letterSpacing: "normal", italic: null }
5202
+ },
5203
+ scale: "balanced"
5204
+ };
5205
+ var typographyPresets = [
5206
+ defineTypographyPreset({
5207
+ id: "typography-preset:modern-sans",
5208
+ name: "Modern Sans",
5209
+ description: "Crisp, neutral type for clear service pages and practical editorial structure.",
5210
+ defaultFonts: { body: "Inter, system-ui, sans-serif", heading: "Inter, system-ui, sans-serif" },
5211
+ recommendedFonts: {
5212
+ body: ["Inter", "Source Sans 3", "IBM Plex Sans"],
5213
+ heading: ["Inter", "Manrope", "Source Sans 3"]
5214
+ },
5215
+ slotPolicies: { body: bodyReadablePolicy, heading: headingFlexiblePolicy },
5216
+ typography: modernSansTypography
5217
+ }),
5218
+ defineTypographyPreset({
5219
+ id: "typography-preset:warm-rounded",
5220
+ name: "Warm Rounded",
5221
+ description: "Soft, friendly type for welcoming studios, classes, and community businesses.",
5222
+ defaultFonts: { body: "Nunito Sans, system-ui, sans-serif", heading: "Nunito Sans, system-ui, sans-serif" },
5223
+ recommendedFonts: {
5224
+ body: ["Nunito Sans", "Atkinson Hyperlegible", "Lato"],
5225
+ heading: ["Nunito Sans", "Quicksand", "Manrope"]
5226
+ },
5227
+ slotPolicies: { body: bodyReadablePolicy, heading: headingFlexiblePolicy },
5228
+ typography: warmRoundedTypography
5229
+ }),
5230
+ defineTypographyPreset({
5231
+ id: "typography-preset:editorial-serif",
5232
+ name: "Editorial Serif",
5233
+ description: "Story-led type with warm reading rhythm and expressive headings.",
5234
+ defaultFonts: { body: "Lora, Georgia, serif", heading: "Playfair Display, Georgia, serif" },
5235
+ recommendedFonts: {
5236
+ body: ["Lora", "Source Serif 4", "Libre Baskerville"],
5237
+ heading: ["Playfair Display", "Cormorant Garamond", "Fraunces"]
5238
+ },
5239
+ slotPolicies: { body: bodyReadablePolicy, heading: displayHeadingPolicy },
5240
+ typography: editorialSerifTypography
5241
+ }),
5242
+ defineTypographyPreset({
5243
+ id: "typography-preset:classic-serif",
5244
+ name: "Classic Serif",
5245
+ description: "Measured, polished type for premium and established offers.",
5246
+ defaultFonts: { body: "Libre Baskerville, Georgia, serif", heading: "Cormorant Garamond, Georgia, serif" },
5247
+ recommendedFonts: {
5248
+ body: ["Libre Baskerville", "Source Serif 4", "Lora"],
5249
+ heading: ["Cormorant Garamond", "Playfair Display", "Libre Baskerville"]
5250
+ },
5251
+ slotPolicies: { body: bodyReadablePolicy, heading: displayHeadingPolicy },
5252
+ typography: classicSerifTypography
5253
+ }),
5254
+ defineTypographyPreset({
5255
+ id: "typography-preset:luxe-contrast",
5256
+ name: "Luxe Contrast",
5257
+ description: "A restrained sans body paired with elegant high-contrast headings.",
5258
+ defaultFonts: { body: "Manrope, system-ui, sans-serif", heading: "Cormorant Garamond, Georgia, serif" },
5259
+ recommendedFonts: {
5260
+ body: ["Manrope", "Inter", "Source Sans 3"],
5261
+ heading: ["Cormorant Garamond", "Playfair Display", "Bodoni Moda"]
5262
+ },
5263
+ slotPolicies: { body: bodyReadablePolicy, heading: displayHeadingPolicy },
5264
+ typography: luxeContrastTypography
5265
+ }),
5266
+ defineTypographyPreset({
5267
+ id: "typography-preset:bold-display",
5268
+ name: "Bold Display",
5269
+ description: "Punchy display headings with readable sans body copy for branded launches.",
5270
+ defaultFonts: { body: "Manrope, system-ui, sans-serif", heading: '"TAN - PEARL", sans-serif' },
5271
+ recommendedFonts: {
5272
+ body: ["Manrope", "Inter", "Space Grotesk"],
5273
+ heading: ["Anton", "Bebas Neue", "Archivo Black"]
5274
+ },
5275
+ slotPolicies: { body: bodyReadablePolicy, heading: displayHeadingPolicy },
5276
+ typography: boldDisplayTypography,
5277
+ heroTypography: {
5278
+ headlineSize: "6xl",
5279
+ headlineLineHeight: "tight",
5280
+ subheadlineSize: "editorial",
5281
+ subheadlineLineHeight: "normal",
5282
+ microHeadlineSize: "6xl",
5283
+ microHeadlineLineHeight: "tight",
5284
+ microSubheadlineSize: "xl",
5285
+ microSubheadlineLineHeight: "normal",
5286
+ responsive: {
5287
+ tablet: { headlineSize: "5xl" },
5288
+ mobile: { headlineSize: "4xl", subheadlineSize: "xl" }
5289
+ }
5290
+ }
5291
+ })
5292
+ ];
5293
+ var typographyPresetsById = new Map(
5294
+ typographyPresets.map((preset) => [preset.id, preset])
5295
+ );
5296
+
4422
5297
  // ../theme-core/src/site-styles/curatedSiteStyles.ts
4423
5298
  var curatedSiteStyleIdValues = [
4424
5299
  "site-style:calm-studio",
@@ -4431,6 +5306,7 @@ var curatedSiteStyleIdValues = [
4431
5306
  "site-style:personal-retreat-journal",
4432
5307
  "site-style:tactile-workshop",
4433
5308
  "site-style:modern-wellness",
5309
+ "site-style:soft-earth",
4434
5310
  "site-style:bold-launch",
4435
5311
  "site-style:south-west-twerk-school"
4436
5312
  ];
@@ -4507,6 +5383,15 @@ function uniqueContentFrameKinds() {
4507
5383
  }
4508
5384
  var generatedContentFrameKinds = uniqueContentFrameKinds();
4509
5385
  function defineCuratedSiteStyle(input) {
5386
+ const legacyHeaderLookIds = input.recommendedHeaderLookIds ?? ["clean-base"];
5387
+ const inferredHeaderCuration = inferHeaderCurationFromLegacyLooks(legacyHeaderLookIds);
5388
+ const typographyPresetChoices = input.typographyPresetChoices ?? defaultTypographyPresetChoicesForRecipe(input.tokenRecipes.typography);
5389
+ const defaultTypographyPresetId = input.defaultTypographyPresetId ? asTypographyPresetId(input.defaultTypographyPresetId) : typographyPresetChoices[0].id;
5390
+ if (!typographyPresetChoices.some((choice) => choice.id === defaultTypographyPresetId)) {
5391
+ throw new Error(
5392
+ `Default typography preset ${defaultTypographyPresetId} is not curated for site style ${input.id}.`
5393
+ );
5394
+ }
4510
5395
  return {
4511
5396
  id: asSiteStyleId(input.id),
4512
5397
  name: input.name,
@@ -4527,11 +5412,23 @@ function defineCuratedSiteStyle(input) {
4527
5412
  },
4528
5413
  ...input.themeOverrides ? { themeOverrides: input.themeOverrides } : {},
4529
5414
  recommendedAppearancePresetIds: (input.recommendedAppearancePresetIds ?? []).map(asAppearancePresetId),
4530
- recommendedHeaderLookIds: (input.recommendedHeaderLookIds ?? ["clean-base"]).map(asHeaderLookId),
5415
+ defaultHeaderSelection: input.defaultHeaderSelection ? {
5416
+ layoutId: asHeaderLayoutId(input.defaultHeaderSelection.layoutId),
5417
+ styleId: asHeaderStyleId(input.defaultHeaderSelection.styleId)
5418
+ } : inferredHeaderCuration.defaultHeaderSelection,
5419
+ recommendedHeaderLayoutChoices: input.recommendedHeaderLayoutChoices ?? inferredHeaderCuration.recommendedHeaderLayoutChoices,
5420
+ recommendedHeaderStyleChoicesByLayout: input.recommendedHeaderStyleChoicesByLayout ?? inferredHeaderCuration.recommendedHeaderStyleChoicesByLayout,
5421
+ discouragedHeaderSelections: input.discouragedHeaderSelections?.map((selection) => ({
5422
+ layoutId: asHeaderLayoutId(selection.layoutId),
5423
+ styleId: asHeaderStyleId(selection.styleId)
5424
+ })),
5425
+ recommendedHeaderLookIds: legacyHeaderLookIds.map(asHeaderLookId),
4531
5426
  // Empty is intentional: resolveFooterLook always appends its guaranteed fallback.
4532
5427
  recommendedFooterLookIds: (input.recommendedFooterLookIds ?? []).map(asFooterLookId),
4533
5428
  buttonPersonalityChoices: input.buttonPersonalityChoices,
4534
- paletteVariantChoices: input.paletteVariantChoices
5429
+ paletteVariantChoices: input.paletteVariantChoices,
5430
+ typographyPresetChoices,
5431
+ defaultTypographyPresetId
4535
5432
  };
4536
5433
  }
4537
5434
  function buttonChoice(id, note) {
@@ -4540,6 +5437,88 @@ function buttonChoice(id, note) {
4540
5437
  function paletteChoice(id, note) {
4541
5438
  return note ? { id: asPaletteVariantId(id), note } : { id: asPaletteVariantId(id) };
4542
5439
  }
5440
+ function headerLayoutChoice(id, note) {
5441
+ return note ? { id: asHeaderLayoutId(id), note } : { id: asHeaderLayoutId(id) };
5442
+ }
5443
+ function headerStyleChoice(id, note) {
5444
+ return note ? { id: asHeaderStyleId(id), note } : { id: asHeaderStyleId(id) };
5445
+ }
5446
+ function headerLayoutRecordKey(id) {
5447
+ return id;
5448
+ }
5449
+ function uniqueHeaderLayoutChoices(choices) {
5450
+ const seen = /* @__PURE__ */ new Set();
5451
+ const unique = choices.filter((choice) => {
5452
+ if (seen.has(choice.id)) return false;
5453
+ seen.add(choice.id);
5454
+ return true;
5455
+ });
5456
+ const first = unique[0];
5457
+ if (!first) {
5458
+ throw new Error("Expected at least one curated header layout choice.");
5459
+ }
5460
+ return [first, ...unique.slice(1)];
5461
+ }
5462
+ function nonEmptyHeaderStyleChoices(choices, fallbackLayoutId) {
5463
+ const first = choices[0] ?? {
5464
+ id: getCompatibleHeaderStyleIds(fallbackLayoutId)[0] ?? asHeaderStyleId("minimal")
5465
+ };
5466
+ return [first, ...choices.slice(1)];
5467
+ }
5468
+ function inferHeaderCurationFromLegacyLooks(lookIds) {
5469
+ const selections = lookIds.map((lookId) => resolveLegacyHeaderLookAlias(asHeaderLookId(lookId))).filter((selection) => Boolean(selection));
5470
+ const defaultHeaderSelection = selections[0] ?? {
5471
+ layoutId: asHeaderLayoutId("classic"),
5472
+ styleId: asHeaderStyleId("minimal")
5473
+ };
5474
+ const layoutChoices = uniqueHeaderLayoutChoices(
5475
+ selections.map((selection) => headerLayoutChoice(selection.layoutId))
5476
+ );
5477
+ const stylesByLayout = {};
5478
+ for (const layoutChoice of layoutChoices) {
5479
+ const styleChoices = selections.filter((selection) => selection.layoutId === layoutChoice.id).map((selection) => headerStyleChoice(selection.styleId));
5480
+ stylesByLayout[headerLayoutRecordKey(layoutChoice.id)] = nonEmptyHeaderStyleChoices(
5481
+ styleChoices,
5482
+ layoutChoice.id
5483
+ );
5484
+ }
5485
+ return {
5486
+ defaultHeaderSelection,
5487
+ recommendedHeaderLayoutChoices: layoutChoices,
5488
+ recommendedHeaderStyleChoicesByLayout: stylesByLayout
5489
+ };
5490
+ }
5491
+ function typographyChoice(id, note) {
5492
+ return note ? { id: asTypographyPresetId(id), note } : { id: asTypographyPresetId(id) };
5493
+ }
5494
+ function defaultTypographyPresetChoicesForRecipe(recipe) {
5495
+ switch (recipe) {
5496
+ case "clean-sans":
5497
+ return [
5498
+ typographyChoice("typography-preset:modern-sans"),
5499
+ typographyChoice("typography-preset:luxe-contrast"),
5500
+ typographyChoice("typography-preset:bold-display")
5501
+ ];
5502
+ case "friendly-sans":
5503
+ return [
5504
+ typographyChoice("typography-preset:warm-rounded"),
5505
+ typographyChoice("typography-preset:modern-sans"),
5506
+ typographyChoice("typography-preset:editorial-serif")
5507
+ ];
5508
+ case "serif-editorial":
5509
+ return [
5510
+ typographyChoice("typography-preset:editorial-serif"),
5511
+ typographyChoice("typography-preset:classic-serif"),
5512
+ typographyChoice("typography-preset:warm-rounded")
5513
+ ];
5514
+ case "classic-serif":
5515
+ return [
5516
+ typographyChoice("typography-preset:classic-serif"),
5517
+ typographyChoice("typography-preset:luxe-contrast"),
5518
+ typographyChoice("typography-preset:editorial-serif")
5519
+ ];
5520
+ }
5521
+ }
4543
5522
  var curatedSiteStyles = [
4544
5523
  defineCuratedSiteStyle({
4545
5524
  id: "site-style:calm-studio",
@@ -4865,6 +5844,102 @@ var curatedSiteStyles = [
4865
5844
  paletteChoice("warm-neutral-clay")
4866
5845
  ]
4867
5846
  }),
5847
+ defineCuratedSiteStyle({
5848
+ id: "site-style:soft-earth",
5849
+ name: "Soft Earth",
5850
+ description: "Warm, grounded, and editorial for yoga studios, retreats, and wellbeing communities.",
5851
+ 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.",
5852
+ siteCreatorSelection: { kind: "site_creator_keyword_heuristic", priority: 45 },
5853
+ selectionKeywordRules: [
5854
+ { kind: "word", value: "meditation" },
5855
+ { kind: "word", value: "wellbeing" },
5856
+ { kind: "substring", value: "retreat" },
5857
+ { kind: "phrase", value: "yoga studio" },
5858
+ { kind: "phrase", value: "mindful movement" }
5859
+ ],
5860
+ tokenRecipes: {
5861
+ palette: "warm-neutral",
5862
+ contrast: "standard",
5863
+ radius: "soft",
5864
+ shadow: "subtle",
5865
+ typography: "serif-editorial",
5866
+ spacing: "airy",
5867
+ motion: "subtle"
5868
+ },
5869
+ compositionBudget: balancedBudget,
5870
+ themeOverrides: {
5871
+ typography: {
5872
+ body: {
5873
+ family: "Inter, system-ui, sans-serif",
5874
+ size: "md",
5875
+ weight: "regular",
5876
+ lineHeight: "relaxed",
5877
+ letterSpacing: "normal"
5878
+ },
5879
+ headings: {
5880
+ default: {
5881
+ family: '"Cormorant Garamond", Georgia, serif',
5882
+ weight: "regular",
5883
+ lineHeight: "normal",
5884
+ letterSpacing: "normal",
5885
+ colorToken: "text",
5886
+ italic: null,
5887
+ case: null
5888
+ },
5889
+ h1: {
5890
+ size: "xl",
5891
+ weight: "regular",
5892
+ lineHeight: "normal",
5893
+ letterSpacing: "normal",
5894
+ italic: null
5895
+ },
5896
+ h2: {
5897
+ size: "lg",
5898
+ weight: "regular",
5899
+ lineHeight: "normal",
5900
+ letterSpacing: "normal",
5901
+ italic: null
5902
+ },
5903
+ h3: {
5904
+ size: "md",
5905
+ weight: "regular",
5906
+ lineHeight: "normal",
5907
+ letterSpacing: "normal",
5908
+ italic: null
5909
+ }
5910
+ },
5911
+ scale: "majorThird"
5912
+ },
5913
+ bodyText: {
5914
+ intro: {
5915
+ paragraphSize: "default",
5916
+ headingSize: "editorial"
5917
+ }
5918
+ }
5919
+ },
5920
+ recommendedAppearancePresetIds: [
5921
+ "hero-brand-scrim",
5922
+ "intro-soft-earth-statement",
5923
+ "feature-cards-soft-earth-offerings",
5924
+ "testimonials-soft-earth-proof-band",
5925
+ "faq-soft-earth-two-column",
5926
+ "contact-form-panel"
5927
+ ],
5928
+ recommendedHeaderLookIds: ["centered-calm", "minimal-transparent", "editorial-line"],
5929
+ recommendedFooterLookIds: ["footer-muted-grounding", "site-footer-brand-two-band"],
5930
+ buttonPersonalityChoices: [
5931
+ buttonChoice("earth-pill"),
5932
+ buttonChoice("soft-pill"),
5933
+ buttonChoice("pebble"),
5934
+ buttonChoice("editorial-link")
5935
+ ],
5936
+ paletteVariantChoices: [
5937
+ paletteChoice("warm-neutral-soft-earth"),
5938
+ paletteChoice("warm-neutral-clay"),
5939
+ paletteChoice("warm-neutral-forest"),
5940
+ paletteChoice("soft-natural-sage")
5941
+ ]
5942
+ }),
4868
5943
  defineCuratedSiteStyle({
4869
5944
  id: "site-style:bold-launch",
4870
5945
  name: "Bold Launch",
@@ -4918,49 +5993,13 @@ var curatedSiteStyles = [
4918
5993
  motion: "expressive"
4919
5994
  },
4920
5995
  compositionBudget: expressiveBudget,
5996
+ typographyPresetChoices: [
5997
+ typographyChoice("typography-preset:bold-display"),
5998
+ typographyChoice("typography-preset:modern-sans"),
5999
+ typographyChoice("typography-preset:luxe-contrast")
6000
+ ],
6001
+ defaultTypographyPresetId: "typography-preset:bold-display",
4921
6002
  themeOverrides: {
4922
- typography: {
4923
- body: {
4924
- family: "Manrope, system-ui, sans-serif",
4925
- size: "lg",
4926
- weight: "regular",
4927
- lineHeight: "relaxed",
4928
- letterSpacing: "normal"
4929
- },
4930
- headings: {
4931
- default: {
4932
- family: '"TAN - PEARL", sans-serif',
4933
- weight: "bold",
4934
- lineHeight: "normal",
4935
- letterSpacing: "tight",
4936
- colorToken: "primary",
4937
- italic: null,
4938
- case: null
4939
- },
4940
- h1: {
4941
- size: "xl",
4942
- weight: "bold",
4943
- lineHeight: "normal",
4944
- letterSpacing: "tight",
4945
- italic: null
4946
- },
4947
- h2: {
4948
- size: "lg",
4949
- weight: "bold",
4950
- lineHeight: "normal",
4951
- letterSpacing: "normal",
4952
- italic: null
4953
- },
4954
- h3: {
4955
- size: "md",
4956
- weight: "bold",
4957
- lineHeight: "normal",
4958
- letterSpacing: "normal",
4959
- italic: null
4960
- }
4961
- },
4962
- scale: "balanced"
4963
- },
4964
6003
  bodyText: {
4965
6004
  intro: {
4966
6005
  paragraphSize: "editorial",
@@ -8747,8 +9786,9 @@ var faqAccordionFragment = defineFragment({
8747
9786
  },
8748
9787
  fallback: "rb-faq-item"
8749
9788
  },
8750
- iconStyle: { $bind: { from: "theme.accordions.icon.style" } }
8751
- // Pass icon style from theme
9789
+ iconStyle: { $bind: { from: "theme.accordions.icon.style" } },
9790
+ // Legacy theme accordion style
9791
+ iconTreatment: { $bind: { from: "content._sectionStyles.accordionIconTreatment" } }
8752
9792
  },
8753
9793
  triggerFrom: "faqItem.question",
8754
9794
  contentFrom: "faqItem.answer"
@@ -9883,89 +10923,417 @@ var heroBlockDefinition = {
9883
10923
  manifest: heroManifest
9884
10924
  };
9885
10925
 
9886
- // ../blocks/src/system/blocks/body-text.ts
9887
- var bodyCopyComposition = composeFragments([{ fragment: bodyCopyFragment }]);
9888
- var proseLayout = styledSection({
9889
- children: stack({ className: "rb-container" }, bodyCopyComposition.layout),
9890
- spacing: "medium",
9891
- baseClass: ""
9892
- });
9893
- var introLayout = styledSection({
9894
- children: stack({ className: "rb-container" }, bodyCopyComposition.layout),
9895
- spacing: "medium",
9896
- baseClass: ""
9897
- });
9898
- var narrowLayout = styledSection({
9899
- children: stack({ className: "rb-container" }, bodyCopyComposition.layout),
9900
- spacing: "medium",
9901
- baseClass: ""
9902
- });
9903
- var bodyTextManifest = createBlockManifest({
9904
- id: "block.body-text",
9905
- title: "Body Text",
9906
- titleSource: "heading",
9907
- category: "content",
9908
- fragments: [
9909
- { fragment: bodyCopyFragment, fieldPriority: 0 }
9910
- ],
9911
- layout: proseLayout,
9912
- variants: {
9913
- prose: proseLayout,
9914
- intro: introLayout,
9915
- narrow: narrowLayout
9916
- },
9917
- defaultVariant: "prose",
9918
- variantOptions: {
9919
- prose: {
9920
- label: "Prose",
9921
- description: "Long-form rich text for pages and posts.",
9922
- icon: "Type"
9923
- },
9924
- intro: {
9925
- label: "Intro",
9926
- description: "Narrower, larger text for above-the-fold intros.",
9927
- icon: "AlignCenter"
9928
- },
9929
- narrow: {
9930
- label: "Narrow",
9931
- description: "Left-aligned lead copy with a shorter max width.",
9932
- icon: "AlignLeft"
10926
+ // ../blocks/src/system/fields/aspectRatio.ts
10927
+ var standardAspectRatioOptions = [
10928
+ { value: "auto", label: "Auto (original)" },
10929
+ { value: "16/9", label: "16:9 (Landscape)" },
10930
+ { value: "4/3", label: "4:3 (Standard)" },
10931
+ { value: "1/1", label: "1:1 (Square)" },
10932
+ { value: "3/4", label: "3:4 (Portrait)" }
10933
+ ];
10934
+ function createAspectRatioField(options = {}) {
10935
+ return {
10936
+ id: options.id ?? "aspectRatio",
10937
+ type: "select",
10938
+ label: options.label ?? "Aspect ratio",
10939
+ ...options.description ? { description: options.description } : {},
10940
+ required: false,
10941
+ defaultValue: options.defaultValue ?? "auto",
10942
+ multiple: false,
10943
+ options: [...standardAspectRatioOptions],
10944
+ ui: {
10945
+ intent: options.uiIntent ?? "display",
10946
+ ...options.visibleWhen ? { visibleWhen: options.visibleWhen } : {}
9933
10947
  }
9934
- },
9935
- description: "Simple text block with optional heading and alignment controls.",
9936
- tags: ["text", "paragraph", "content", "copy", "article", "writing", "rich-text"],
9937
- icon: "Type",
9938
- styleTokens: {
9939
- spacing: "md"
9940
- }
9941
- });
9942
- var bodyTextBlockDefinition = {
9943
- manifest: bodyTextManifest
9944
- };
10948
+ };
10949
+ }
9945
10950
 
9946
- // ../blocks/src/system/blocks/blog-post.tsx
9947
- import { z as z26 } from "zod";
9948
- var composition = composeFragments([{ fragment: blogFeaturedPostFragment }]);
9949
- var blogPostLayout = section(
9950
- { background: "background", className: "rb-px-6 rb-py-12" },
9951
- [...composition.layout]
9952
- );
9953
- var blogPostManifest = createBlockManifest({
9954
- id: "block.blog-post",
9955
- version: "0.1.0",
9956
- title: "Blog post",
9957
- description: "Highlights a single blog post with title, image, and excerpt.",
9958
- category: "blog",
9959
- contentTypes: ["post"],
9960
- tags: ["blog", "post", "featured", "highlight", "article", "single"],
9961
- icon: "FileText",
9962
- styleTokens: {
9963
- background: "surface",
9964
- typography: "body",
9965
- spacing: "md"
9966
- },
9967
- behaviours: {
9968
- supportsThemeSwitching: true,
10951
+ // ../blocks/src/system/fields/imageLayout.ts
10952
+ function createImageColSizeField(options = {}) {
10953
+ const {
10954
+ id = "imageColSize",
10955
+ label = "Image column size",
10956
+ description = "Controls how large the image/thumbnail column is at desktop breakpoints.",
10957
+ defaultValue = "1/3",
10958
+ uiIntent = "display",
10959
+ visibleWhen
10960
+ } = options;
10961
+ return {
10962
+ id,
10963
+ type: "select",
10964
+ label,
10965
+ description,
10966
+ required: false,
10967
+ defaultValue,
10968
+ multiple: false,
10969
+ options: [
10970
+ { value: "1/4", label: "Small (1/4)" },
10971
+ { value: "1/3", label: "Medium (1/3)" },
10972
+ { value: "2/5", label: "Large (2/5)" },
10973
+ { value: "1/2", label: "Extra large (1/2)" },
10974
+ { value: "2/3", label: "Huge (2/3)" }
10975
+ ],
10976
+ ui: {
10977
+ intent: uiIntent,
10978
+ ...visibleWhen ? { visibleWhen } : {}
10979
+ }
10980
+ };
10981
+ }
10982
+ function createImagePositionField(options = {}) {
10983
+ const {
10984
+ id = "imagePosition",
10985
+ label = "Image position",
10986
+ description = "Choose which side the image appears on.",
10987
+ defaultValue = "left",
10988
+ includeAlternate = false,
10989
+ uiIntent = "display",
10990
+ visibleWhen
10991
+ } = options;
10992
+ const positionOptions = [
10993
+ { value: "left", label: "Left" },
10994
+ { value: "right", label: "Right" },
10995
+ ...includeAlternate ? [{ value: "alternate", label: "Alternate" }] : []
10996
+ ];
10997
+ return {
10998
+ id,
10999
+ type: "select",
11000
+ label,
11001
+ description,
11002
+ required: false,
11003
+ defaultValue,
11004
+ multiple: false,
11005
+ // Spread to get a mutable array type without unsafe casts.
11006
+ options: [...positionOptions],
11007
+ ui: {
11008
+ intent: uiIntent,
11009
+ ...visibleWhen ? { visibleWhen } : {}
11010
+ }
11011
+ };
11012
+ }
11013
+
11014
+ // ../blocks/src/system/blocks/intro.ts
11015
+ function introHeading(className) {
11016
+ return text(
11017
+ {
11018
+ as: "h2",
11019
+ className
11020
+ },
11021
+ when("content.title"),
11022
+ bind("content.title")
11023
+ );
11024
+ }
11025
+ function introBody(className = "rb-prose rb-max-w-none") {
11026
+ return richText({ className }, bind("content.body"));
11027
+ }
11028
+ function introCtas(justify = "start") {
11029
+ return ctaRow({
11030
+ justify,
11031
+ gap: "md",
11032
+ containerClassName: "rb-mt-2"
11033
+ });
11034
+ }
11035
+ function introCopyStack(options = {}) {
11036
+ return stack(
11037
+ {
11038
+ gap: "md",
11039
+ className: options.className ?? "rb-intro-copy"
11040
+ },
11041
+ [
11042
+ introHeading(options.headingClassName ?? "rb-intro-title"),
11043
+ introBody(options.bodyClassName),
11044
+ introCtas(options.ctaJustify)
11045
+ ]
11046
+ );
11047
+ }
11048
+ var introMedia = media(
11049
+ {
11050
+ className: "rb-intro-media rb-w-full rb-h-auto rb-object-cover",
11051
+ style: {
11052
+ aspectRatio: { $bind: { from: "content.aspectRatio" } }
11053
+ }
11054
+ },
11055
+ bind("content.media")
11056
+ );
11057
+ var centeredCopyLayout = styledSection({
11058
+ children: styledContainer({
11059
+ rootType: "stack",
11060
+ rootProps: { gap: "lg" },
11061
+ children: [
11062
+ introCopyStack({
11063
+ className: "rb-intro-copy rb-mx-auto rb-max-w-3xl rb-text-center",
11064
+ headingClassName: "rb-intro-title rb-text-center",
11065
+ bodyClassName: "rb-prose rb-mx-auto rb-max-w-none",
11066
+ ctaJustify: "center"
11067
+ })
11068
+ ]
11069
+ }),
11070
+ baseClass: "",
11071
+ spacing: "medium"
11072
+ });
11073
+ var statementCopyLayout = styledSection({
11074
+ children: styledContainer({
11075
+ children: [
11076
+ el(
11077
+ "div",
11078
+ {
11079
+ className: "rb-intro rb-intro-statement rb-grid rb-grid-cols-1 rb-gap-8 rb-md-grid-cols-2 rb-md-items-start"
11080
+ },
11081
+ [
11082
+ introHeading("rb-intro-title rb-max-w-xl"),
11083
+ stack({ gap: "md", className: "rb-intro-copy rb-max-w-xl" }, [
11084
+ introBody(),
11085
+ introCtas("start")
11086
+ ])
11087
+ ]
11088
+ )
11089
+ ]
11090
+ }),
11091
+ baseClass: "",
11092
+ spacing: "medium"
11093
+ });
11094
+ var statementMediaLayout = styledSection({
11095
+ children: styledContainer({
11096
+ children: [
11097
+ el(
11098
+ "div",
11099
+ {
11100
+ 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"
11101
+ },
11102
+ [
11103
+ introHeading("rb-intro-title rb-max-w-xl"),
11104
+ stack({ gap: "md", className: "rb-intro-copy rb-max-w-xl" }, [
11105
+ introBody(),
11106
+ introCtas("start")
11107
+ ]),
11108
+ el("div", { className: "rb-intro-media-wrap rb-w-full" }, [introMedia], when("content.media"))
11109
+ ]
11110
+ )
11111
+ ]
11112
+ }),
11113
+ baseClass: "",
11114
+ spacing: "medium"
11115
+ });
11116
+ var mediaCopyLayout = styledSection({
11117
+ children: styledContainer({
11118
+ children: [
11119
+ responsiveTwoColumn({
11120
+ image: el("div", { className: "rb-intro-media-wrap rb-w-full" }, [introMedia]),
11121
+ text: introCopyStack({
11122
+ className: "rb-intro-copy rb-max-w-xl",
11123
+ headingClassName: "rb-intro-title"
11124
+ }),
11125
+ ratioFrom: "content.ratio",
11126
+ imagePositionFrom: "content.imagePosition",
11127
+ gapFrom: "content.gap",
11128
+ gapFallback: "comfortable",
11129
+ imageWrapperClassName: "rb-w-full rb-shrink-0",
11130
+ textWrapperClassName: "rb-w-full rb-min-w-0 rb-flex-1 rb-self-center"
11131
+ })
11132
+ ]
11133
+ }),
11134
+ baseClass: "",
11135
+ spacing: "medium"
11136
+ });
11137
+ var introConfig = {
11138
+ id: "block.intro",
11139
+ title: "Intro",
11140
+ category: "layout",
11141
+ includeContainerStyles: true,
11142
+ titleSource: "title",
11143
+ additionalFields: [
11144
+ {
11145
+ id: "title",
11146
+ type: "text",
11147
+ label: "Statement",
11148
+ required: false,
11149
+ multiline: true,
11150
+ maxLength: 160
11151
+ },
11152
+ {
11153
+ id: "body",
11154
+ type: "richText",
11155
+ label: "Text",
11156
+ required: true,
11157
+ ui: {
11158
+ richTextVariant: "limited"
11159
+ }
11160
+ },
11161
+ {
11162
+ id: "media",
11163
+ type: "media",
11164
+ label: "Media",
11165
+ required: false,
11166
+ mediaKinds: ["image"],
11167
+ ui: {
11168
+ intent: "content",
11169
+ visibleWhen: { field: "variant", notEquals: "statement-copy" }
11170
+ }
11171
+ },
11172
+ createImagePositionField({
11173
+ id: "imagePosition",
11174
+ label: "Image position",
11175
+ defaultValue: "left",
11176
+ uiIntent: "display",
11177
+ visibleWhen: { field: "variant", equals: "media-copy" }
11178
+ }),
11179
+ {
11180
+ id: "gap",
11181
+ type: "select",
11182
+ label: "Gap between media and text",
11183
+ required: false,
11184
+ defaultValue: "comfortable",
11185
+ multiple: false,
11186
+ options: [
11187
+ { value: "none", label: "None" },
11188
+ { value: "compact", label: "Compact" },
11189
+ { value: "cozy", label: "Cozy" },
11190
+ { value: "medium", label: "Medium" },
11191
+ { value: "comfortable", label: "Comfortable" },
11192
+ { value: "spacious", label: "Spacious" }
11193
+ ],
11194
+ ui: {
11195
+ intent: "display",
11196
+ visibleWhen: { field: "variant", equals: "media-copy" }
11197
+ }
11198
+ },
11199
+ createImageColSizeField({
11200
+ id: "ratio",
11201
+ label: "Media column size",
11202
+ defaultValue: "1/2",
11203
+ uiIntent: "display",
11204
+ visibleWhen: { field: "variant", equals: "media-copy" }
11205
+ }),
11206
+ createAspectRatioField({
11207
+ id: "aspectRatio",
11208
+ label: "Media aspect ratio",
11209
+ description: "Crop media to a consistent aspect ratio.",
11210
+ defaultValue: "auto",
11211
+ visibleWhen: { field: "media", notEquals: null }
11212
+ }),
11213
+ createCtasRepeater({
11214
+ label: "Calls to action",
11215
+ itemLabel: "CTA",
11216
+ maxItems: 2
11217
+ })
11218
+ ],
11219
+ layout: centeredCopyLayout,
11220
+ variants: {
11221
+ "centered-copy": centeredCopyLayout,
11222
+ "statement-copy": statementCopyLayout,
11223
+ "statement-media": statementMediaLayout,
11224
+ "media-copy": mediaCopyLayout
11225
+ },
11226
+ defaultVariant: "statement-copy",
11227
+ variantOptions: {
11228
+ "centered-copy": {
11229
+ label: "Centered copy",
11230
+ description: "A focused intro with centered text and optional calls to action."
11231
+ },
11232
+ "statement-copy": {
11233
+ label: "Statement and copy",
11234
+ description: "A large statement on the left with supporting copy on the right."
11235
+ },
11236
+ "statement-media": {
11237
+ label: "Statement, copy and media",
11238
+ description: "A three-part intro with statement, copy and a small image."
11239
+ },
11240
+ "media-copy": {
11241
+ label: "Media and copy",
11242
+ description: "A compact media/text intro for softer transitions after a hero."
11243
+ }
11244
+ },
11245
+ description: "A flexible introductory section for statement copy, supporting text, media, and CTAs.",
11246
+ tags: ["intro", "introduction", "about", "welcome", "statement", "media", "text"],
11247
+ icon: "PanelTopOpen"
11248
+ };
11249
+ var introManifest = createBlockManifest(introConfig);
11250
+ var introBlockDefinition = {
11251
+ manifest: introManifest
11252
+ };
11253
+
11254
+ // ../blocks/src/system/blocks/body-text.ts
11255
+ var bodyCopyComposition = composeFragments([{ fragment: bodyCopyFragment }]);
11256
+ var proseLayout = styledSection({
11257
+ children: stack({ className: "rb-container" }, bodyCopyComposition.layout),
11258
+ spacing: "medium",
11259
+ baseClass: ""
11260
+ });
11261
+ var introLayout = styledSection({
11262
+ children: stack({ className: "rb-container" }, bodyCopyComposition.layout),
11263
+ spacing: "medium",
11264
+ baseClass: ""
11265
+ });
11266
+ var narrowLayout = styledSection({
11267
+ children: stack({ className: "rb-container" }, bodyCopyComposition.layout),
11268
+ spacing: "medium",
11269
+ baseClass: ""
11270
+ });
11271
+ var bodyTextManifest = createBlockManifest({
11272
+ id: "block.body-text",
11273
+ title: "Body Text",
11274
+ titleSource: "heading",
11275
+ category: "content",
11276
+ fragments: [
11277
+ { fragment: bodyCopyFragment, fieldPriority: 0 }
11278
+ ],
11279
+ layout: proseLayout,
11280
+ variants: {
11281
+ prose: proseLayout,
11282
+ intro: introLayout,
11283
+ narrow: narrowLayout
11284
+ },
11285
+ defaultVariant: "prose",
11286
+ variantOptions: {
11287
+ prose: {
11288
+ label: "Prose",
11289
+ description: "Long-form rich text for pages and posts.",
11290
+ icon: "Type"
11291
+ },
11292
+ intro: {
11293
+ label: "Intro",
11294
+ description: "Narrower, larger text for above-the-fold intros.",
11295
+ icon: "AlignCenter"
11296
+ },
11297
+ narrow: {
11298
+ label: "Narrow",
11299
+ description: "Left-aligned lead copy with a shorter max width.",
11300
+ icon: "AlignLeft"
11301
+ }
11302
+ },
11303
+ description: "Simple text block with optional heading and alignment controls.",
11304
+ tags: ["text", "paragraph", "content", "copy", "article", "writing", "rich-text"],
11305
+ icon: "Type",
11306
+ styleTokens: {
11307
+ spacing: "md"
11308
+ }
11309
+ });
11310
+ var bodyTextBlockDefinition = {
11311
+ manifest: bodyTextManifest
11312
+ };
11313
+
11314
+ // ../blocks/src/system/blocks/blog-post.tsx
11315
+ import { z as z26 } from "zod";
11316
+ var composition = composeFragments([{ fragment: blogFeaturedPostFragment }]);
11317
+ var blogPostLayout = section(
11318
+ { background: "background", className: "rb-px-6 rb-py-12" },
11319
+ [...composition.layout]
11320
+ );
11321
+ var blogPostManifest = createBlockManifest({
11322
+ id: "block.blog-post",
11323
+ version: "0.1.0",
11324
+ title: "Blog post",
11325
+ description: "Highlights a single blog post with title, image, and excerpt.",
11326
+ category: "blog",
11327
+ contentTypes: ["post"],
11328
+ tags: ["blog", "post", "featured", "highlight", "article", "single"],
11329
+ icon: "FileText",
11330
+ styleTokens: {
11331
+ background: "surface",
11332
+ typography: "body",
11333
+ spacing: "md"
11334
+ },
11335
+ behaviours: {
11336
+ supportsThemeSwitching: true,
9969
11337
  inlineEditing: false,
9970
11338
  animation: false,
9971
11339
  paletteHidden: false
@@ -10726,6 +12094,37 @@ var faqComposition = composeFragments([
10726
12094
  { fragment: faqHeadingFragment, fieldPriority: 0 },
10727
12095
  { fragment: faqAccordionFragment, fieldPriority: 1 }
10728
12096
  ]);
12097
+ function fragmentLayoutNode(layout) {
12098
+ return isNodeDefinitionArray(layout) ? el("div", {}, [...layout]) : layout;
12099
+ }
12100
+ function isNodeDefinitionArray(layout) {
12101
+ return Array.isArray(layout);
12102
+ }
12103
+ var headingLayout = fragmentLayoutNode(faqHeadingFragment.layout);
12104
+ var accordionLayout = fragmentLayoutNode(faqAccordionFragment.layout);
12105
+ var defaultLayout = styledSection({
12106
+ children: styledContainer({
12107
+ baseClassName: "rb-relative rb-isolate",
12108
+ children: stack({ gap: "xl", className: "rb-w-full rb-max-w-4xl rb-mx-auto" }, faqComposition.layout)
12109
+ }),
12110
+ baseClass: ""
12111
+ });
12112
+ var twoColumnLayout = styledSection({
12113
+ children: styledContainer({
12114
+ baseClassName: "rb-relative rb-isolate",
12115
+ children: el(
12116
+ "div",
12117
+ {
12118
+ className: "rb-faq-two-column rb-grid rb-grid-cols-1 rb-gap-8 rb-lg-grid-cols-2 rb-lg-items-start"
12119
+ },
12120
+ [
12121
+ el("div", { className: "rb-faq-two-column-heading" }, [headingLayout]),
12122
+ el("div", { className: "rb-faq-two-column-accordion" }, [accordionLayout])
12123
+ ]
12124
+ )
12125
+ }),
12126
+ baseClass: ""
12127
+ });
10729
12128
  var faqManifest = createBlockManifest({
10730
12129
  id: "block.faq",
10731
12130
  title: "FAQ",
@@ -10742,13 +12141,22 @@ var faqManifest = createBlockManifest({
10742
12141
  label: "FAQ item styles"
10743
12142
  })
10744
12143
  ],
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
- }),
12144
+ layout: defaultLayout,
12145
+ variants: {
12146
+ default: defaultLayout,
12147
+ "two-column": twoColumnLayout
12148
+ },
12149
+ defaultVariant: "default",
12150
+ variantOptions: {
12151
+ default: {
12152
+ label: "Default",
12153
+ description: "A centered heading above one FAQ accordion."
12154
+ },
12155
+ "two-column": {
12156
+ label: "Two column",
12157
+ description: "A left heading column with FAQ items on the right."
12158
+ }
12159
+ },
10752
12160
  description: "Accordion of frequently asked questions and answers.",
10753
12161
  tags: ["faq", "questions", "answers", "help", "support", "accordion", "q&a"],
10754
12162
  icon: "HelpCircle"
@@ -11106,7 +12514,10 @@ var editorialLayout = stack(
11106
12514
  );
11107
12515
  var headerLayout = headerSection(
11108
12516
  {
11109
- background: "background",
12517
+ background: bindProp("$root.theme.header", {
12518
+ transforms: pipe(tx("layout.headerSectionBackground")),
12519
+ fallback: "background"
12520
+ }),
11110
12521
  allowOverflow: true,
11111
12522
  className: bindProp("$root.theme.header", {
11112
12523
  transforms: pipe(tx("layout.headerRootClass")),
@@ -11941,79 +13352,298 @@ var collectionLayout = styledSection({
11941
13352
  { gap: "md" }
11942
13353
  ),
11943
13354
  baseClass: "",
11944
- spacing: "comfortable"
13355
+ spacing: "comfortable"
13356
+ });
13357
+ var collectionManifest = createBlockManifest({
13358
+ id: "block.collection",
13359
+ title: "Collection",
13360
+ category: "layout",
13361
+ additionalFields: [
13362
+ parseFieldDefinition({
13363
+ id: "layout",
13364
+ type: "select",
13365
+ label: "Layout",
13366
+ defaultValue: "grid",
13367
+ options: [
13368
+ { value: "grid", label: "Grid" },
13369
+ { value: "stack", label: "Stack" }
13370
+ ],
13371
+ ui: { intent: "display" }
13372
+ }),
13373
+ parseFieldDefinition({
13374
+ id: "columns",
13375
+ type: "select",
13376
+ label: "Columns",
13377
+ description: "Number of columns in the grid layout.",
13378
+ defaultValue: "3",
13379
+ options: [
13380
+ { value: "2", label: "2 columns" },
13381
+ { value: "3", label: "3 columns" },
13382
+ { value: "4", label: "4 columns" }
13383
+ ],
13384
+ ui: {
13385
+ intent: "display",
13386
+ visibleWhen: { field: "layout", equals: "grid" }
13387
+ }
13388
+ }),
13389
+ parseFieldDefinition({
13390
+ id: "gap",
13391
+ type: "select",
13392
+ label: "Gap",
13393
+ defaultValue: "medium",
13394
+ options: [
13395
+ { value: "none", label: "None" },
13396
+ { value: "compact", label: "Compact" },
13397
+ { value: "cozy", label: "Cozy" },
13398
+ { value: "medium", label: "Medium" },
13399
+ { value: "comfortable", label: "Comfortable" },
13400
+ { value: "spacious", label: "Spacious" }
13401
+ ],
13402
+ ui: { intent: "display" }
13403
+ }),
13404
+ fragmentsToRepeaterField(
13405
+ "items",
13406
+ "Items",
13407
+ collectionFragments,
13408
+ {
13409
+ minItems: 0,
13410
+ maxItems: 50,
13411
+ itemLabel: "Item",
13412
+ description: "Add items to this collection."
13413
+ }
13414
+ ),
13415
+ cardStylesField({
13416
+ id: "_cardStyles",
13417
+ label: "Item styles"
13418
+ })
13419
+ ],
13420
+ layout: collectionLayout,
13421
+ description: "Repeat items in a grid or stack layout.",
13422
+ tags: ["collection", "grid", "stack", "repeater"],
13423
+ icon: "LayoutList",
13424
+ styleTokens: { spacing: "lg" }
13425
+ });
13426
+ var collectionBlockDefinition = {
13427
+ manifest: collectionManifest
13428
+ };
13429
+
13430
+ // ../blocks/src/system/blocks/feature-cards.ts
13431
+ function grid3(props2, children) {
13432
+ return el("grid", props2 ?? void 0, children ?? void 0);
13433
+ }
13434
+ var sectionHeading = stack(
13435
+ { gap: "sm", className: "rb-feature-cards-heading rb-mx-auto rb-max-w-3xl rb-text-center" },
13436
+ [
13437
+ text(
13438
+ {
13439
+ as: "h2",
13440
+ className: "rb-feature-cards-title rb-text-center"
13441
+ },
13442
+ when("content.title"),
13443
+ bind("content.title")
13444
+ ),
13445
+ richText(
13446
+ {
13447
+ className: "rb-feature-cards-description rb-prose rb-mx-auto rb-max-w-none",
13448
+ style: textColorStyle("mutedText")
13449
+ },
13450
+ when("content.description"),
13451
+ bind("content.description")
13452
+ )
13453
+ ]
13454
+ );
13455
+ var featureCard = styledCard(
13456
+ [
13457
+ media(
13458
+ {
13459
+ className: "rb-feature-card-media rb-w-full rb-h-auto rb-object-cover",
13460
+ style: {
13461
+ aspectRatio: { $bind: { from: "card.aspectRatio" } }
13462
+ }
13463
+ },
13464
+ when("card.media"),
13465
+ bind("card.media")
13466
+ ),
13467
+ stack({ gap: "sm", className: "rb-feature-card-content rb-flex-1 rb-p-6" }, [
13468
+ text(
13469
+ {
13470
+ as: "h3",
13471
+ className: "rb-feature-card-title"
13472
+ },
13473
+ bind("card.title")
13474
+ ),
13475
+ richText(
13476
+ {
13477
+ className: "rb-feature-card-body rb-prose rb-max-w-none",
13478
+ style: textColorStyle("mutedText")
13479
+ },
13480
+ when("card.body"),
13481
+ bind("card.body")
13482
+ ),
13483
+ ctaRow({
13484
+ collectionPath: "ctas",
13485
+ itemName: "cta",
13486
+ gap: "sm",
13487
+ justify: "start",
13488
+ containerClassName: "rb-mt-auto"
13489
+ })
13490
+ ])
13491
+ ],
13492
+ {
13493
+ stylesFrom: "content._cardStyles",
13494
+ backgroundFrom: "content._cardStyles.background",
13495
+ baseClassName: "rb-feature-card rb-relative rb-isolate rb-overflow-hidden rb-border rb-flex rb-h-full rb-flex-col"
13496
+ },
13497
+ repeat("content.cards", "card")
13498
+ );
13499
+ var cardsLayout = styledSection({
13500
+ children: styledContainer({
13501
+ rootType: "stack",
13502
+ rootProps: { gap: "xl" },
13503
+ children: [
13504
+ sectionHeading,
13505
+ grid3(
13506
+ {
13507
+ cols: {
13508
+ $bind: {
13509
+ from: "content.columns",
13510
+ fallback: 3,
13511
+ coerce: "number"
13512
+ }
13513
+ },
13514
+ gap: "lg"
13515
+ },
13516
+ [featureCard]
13517
+ )
13518
+ ]
13519
+ }),
13520
+ baseClass: "",
13521
+ spacing: "medium"
11945
13522
  });
11946
- var collectionManifest = createBlockManifest({
11947
- id: "block.collection",
11948
- title: "Collection",
13523
+ var featureCardsConfig = {
13524
+ id: "block.feature-cards",
13525
+ title: "Feature Cards",
11949
13526
  category: "layout",
13527
+ includeContainerStyles: true,
13528
+ titleSource: "title",
11950
13529
  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({
13530
+ {
13531
+ id: "title",
13532
+ type: "text",
13533
+ label: "Title",
13534
+ required: false,
13535
+ multiline: false,
13536
+ maxLength: 120
13537
+ },
13538
+ {
13539
+ id: "description",
13540
+ type: "richText",
13541
+ label: "Description",
13542
+ required: false,
13543
+ ui: {
13544
+ richTextVariant: "limited"
13545
+ }
13546
+ },
13547
+ {
11963
13548
  id: "columns",
11964
13549
  type: "select",
11965
13550
  label: "Columns",
11966
- description: "Number of columns in the grid layout.",
13551
+ required: false,
11967
13552
  defaultValue: "3",
13553
+ multiple: false,
11968
13554
  options: [
11969
13555
  { value: "2", label: "2 columns" },
11970
13556
  { value: "3", label: "3 columns" },
11971
13557
  { value: "4", label: "4 columns" }
11972
13558
  ],
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
13559
  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."
13560
+ },
13561
+ {
13562
+ id: "cards",
13563
+ type: "repeater",
13564
+ label: "Cards",
13565
+ required: false,
13566
+ minItems: 1,
13567
+ maxItems: 8,
13568
+ itemLabel: "Card",
13569
+ itemLabelSource: "title",
13570
+ allowConversion: true,
13571
+ ui: {
13572
+ intent: "content"
13573
+ },
13574
+ schema: {
13575
+ fields: [
13576
+ {
13577
+ id: "media",
13578
+ type: "media",
13579
+ label: "Image",
13580
+ required: false,
13581
+ mediaKinds: ["image"]
13582
+ },
13583
+ createAspectRatioField({
13584
+ id: "aspectRatio",
13585
+ label: "Image aspect ratio",
13586
+ defaultValue: "4/3",
13587
+ visibleWhen: { field: "media", notEquals: null }
13588
+ }),
13589
+ {
13590
+ id: "title",
13591
+ type: "text",
13592
+ label: "Title",
13593
+ required: true,
13594
+ multiline: false,
13595
+ maxLength: 120
13596
+ },
13597
+ {
13598
+ id: "body",
13599
+ type: "richText",
13600
+ label: "Text",
13601
+ required: false,
13602
+ ui: {
13603
+ richTextVariant: "limited"
13604
+ }
13605
+ },
13606
+ createCtasRepeater({
13607
+ label: "Calls to action",
13608
+ itemLabel: "CTA",
13609
+ maxItems: 1,
13610
+ button: {
13611
+ variants: [
13612
+ { value: "primary", label: "Primary" },
13613
+ { value: "secondary", label: "Secondary" },
13614
+ { value: "outline", label: "Outline" },
13615
+ { value: "ghost", label: "Ghost" },
13616
+ { value: "link", label: "Link" }
13617
+ ],
13618
+ defaultVariant: "ghost"
13619
+ }
13620
+ })
13621
+ ]
12002
13622
  }
12003
- ),
13623
+ },
12004
13624
  cardStylesField({
12005
13625
  id: "_cardStyles",
12006
- label: "Item styles"
13626
+ label: "Card styles"
12007
13627
  })
12008
13628
  ],
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
13629
+ layout: cardsLayout,
13630
+ variants: {
13631
+ cards: cardsLayout
13632
+ },
13633
+ defaultVariant: "cards",
13634
+ variantOptions: {
13635
+ cards: {
13636
+ label: "Cards",
13637
+ description: "A responsive grid of image cards with optional calls to action."
13638
+ }
13639
+ },
13640
+ description: "A card grid for offerings, services, classes, benefits, or featured links.",
13641
+ tags: ["cards", "features", "offerings", "services", "classes", "grid", "links"],
13642
+ icon: "PanelsTopLeft"
13643
+ };
13644
+ var featureCardsManifest = createBlockManifest(featureCardsConfig);
13645
+ var featureCardsBlockDefinition = {
13646
+ manifest: featureCardsManifest
12017
13647
  };
12018
13648
 
12019
13649
  // ../blocks/src/system/fields/carousel.ts
@@ -12101,69 +13731,6 @@ function createCarouselBehaviorFields(options = {}) {
12101
13731
  return fields3;
12102
13732
  }
12103
13733
 
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
13734
  // ../blocks/src/system/blocks/media-text.ts
12168
13735
  var mediaTextFrameCapability = defineFrameCapability([
12169
13736
  "plain",
@@ -12287,26 +13854,13 @@ var mediaTextManifest = createBlockManifest({
12287
13854
  },
12288
13855
  ui: { intent: "behavior" }
12289
13856
  }),
12290
- {
13857
+ createAspectRatioField({
12291
13858
  id: "aspectRatio",
12292
- type: "select",
12293
13859
  label: "Media aspect ratio",
12294
13860
  description: "Crop media to a consistent aspect ratio.",
12295
- required: false,
12296
13861
  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
- },
13862
+ visibleWhen: { field: "images", notEquals: null }
13863
+ }),
12310
13864
  {
12311
13865
  id: "text",
12312
13866
  type: "richText",
@@ -12436,7 +13990,7 @@ var mediaTextManifest = createBlockManifest({
12436
13990
  whenImagesLength(0)
12437
13991
  );
12438
13992
  const defaultInner = el("div", {}, [defaultImagesLayout, defaultTextOnlyLayout]);
12439
- const defaultLayout = styledSection({
13993
+ const defaultLayout2 = styledSection({
12440
13994
  children: styledContainer({
12441
13995
  rootType: "stack",
12442
13996
  rootProps: { gap: "lg" },
@@ -12468,9 +14022,9 @@ var mediaTextManifest = createBlockManifest({
12468
14022
  spacing: "medium"
12469
14023
  });
12470
14024
  return {
12471
- layout: defaultLayout,
14025
+ layout: defaultLayout2,
12472
14026
  variants: {
12473
- default: defaultLayout
14027
+ default: defaultLayout2
12474
14028
  },
12475
14029
  defaultVariant: "default",
12476
14030
  variantOptions: {
@@ -15794,7 +17348,7 @@ var embedBlockDefinition = {
15794
17348
  };
15795
17349
 
15796
17350
  // ../blocks/src/system/blocks/image-gallery.ts
15797
- var grid3 = (props2, children, ...mods) => el("grid", props2 ?? void 0, children ?? void 0, ...mods);
17351
+ var grid4 = (props2, children, ...mods) => el("grid", props2 ?? void 0, children ?? void 0, ...mods);
15798
17352
  var galleryContainer = (children, opts) => {
15799
17353
  const gap = opts?.gap ?? "md";
15800
17354
  const withExtraClass = (baseClass) => opts?.className ? `${baseClass} ${opts.className}` : baseClass;
@@ -15874,7 +17428,7 @@ var galleryItem = (options) => stack(
15874
17428
  ],
15875
17429
  repeat("content.images", "item")
15876
17430
  );
15877
- var gridLayout3 = grid3(
17431
+ var gridLayout3 = grid4(
15878
17432
  {
15879
17433
  className: "rb-grid rb-grid-cols-1 rb-gap-4 rb-sm-grid-cols-2 rb-md-grid-cols-3"
15880
17434
  },
@@ -16477,7 +18031,7 @@ var imageGalleryBlockDefinition = {
16477
18031
  };
16478
18032
 
16479
18033
  // ../blocks/src/system/blocks/video-grid.ts
16480
- var grid4 = (props2, children, ...mods) => el("grid", props2 ?? void 0, children ?? void 0, ...mods);
18034
+ var grid5 = (props2, children, ...mods) => el("grid", props2 ?? void 0, children ?? void 0, ...mods);
16481
18035
  var videoItem = (options) => stack(
16482
18036
  { gap: "xs", className: options.containerClassName },
16483
18037
  [
@@ -16527,7 +18081,7 @@ var gridColumnsClass = (columns) => {
16527
18081
  return "rb-grid rb-grid-cols-1 rb-gap-6 rb-sm-grid-cols-2 rb-md-grid-cols-3";
16528
18082
  }
16529
18083
  };
16530
- var createGridLayout = (columns) => grid4(
18084
+ var createGridLayout = (columns) => grid5(
16531
18085
  {
16532
18086
  className: gridColumnsClass(columns)
16533
18087
  },
@@ -19691,6 +21245,40 @@ var systemBlockDefinitionsRaw = [
19691
21245
  })
19692
21246
  ]
19693
21247
  })),
21248
+ withDesignCapability("block.intro", introBlockDefinition, declareBlockDesignCapability({
21249
+ sectionSurfaces: "supported",
21250
+ contentFrames: ["plain", "panel"],
21251
+ itemSurfaces: "unsupported",
21252
+ headingDecorations: ["organic-squiggle"]
21253
+ }), defineBlockDesignMetadata({
21254
+ flow: bodyFlow,
21255
+ layoutProfiles: [
21256
+ layoutProfile({
21257
+ variantKey: "centered-copy",
21258
+ family: "centered",
21259
+ weight: "featured",
21260
+ bias: "soft"
21261
+ }),
21262
+ layoutProfile({
21263
+ variantKey: "statement-copy",
21264
+ family: "split",
21265
+ weight: "featured",
21266
+ bias: "merge"
21267
+ }),
21268
+ layoutProfile({
21269
+ variantKey: "statement-media",
21270
+ family: "media-text",
21271
+ weight: "featured",
21272
+ bias: "soft"
21273
+ }),
21274
+ layoutProfile({
21275
+ variantKey: "media-copy",
21276
+ family: "media-text",
21277
+ weight: "featured",
21278
+ bias: "soft"
21279
+ })
21280
+ ]
21281
+ })),
19694
21282
  withDesignCapability("block.body-text", bodyTextBlockDefinition, sectionOnly(), defineBlockDesignMetadata({
19695
21283
  flow: bodyFlow,
19696
21284
  layoutProfiles: [
@@ -19751,9 +21339,17 @@ var systemBlockDefinitionsRaw = [
19751
21339
  flow: conversionFlow,
19752
21340
  layoutProfiles: [layoutProfile({ variantKey: "default", family: "form", weight: "standard" })]
19753
21341
  })),
19754
- withDesignCapability("block.faq", faqBlockDefinition, withEyebrowCapability(panelAndItemsCapable(), standardEyebrowTreatments), defineBlockDesignMetadata({
21342
+ withDesignCapability("block.faq", faqBlockDefinition, withEyebrowCapability(declareBlockDesignCapability({
21343
+ sectionSurfaces: "supported",
21344
+ contentFrames: ["plain", "panel"],
21345
+ itemSurfaces: "supported",
21346
+ accordionIconSets: ["plus", "chevron", "caret", "minimal-cross"]
21347
+ }), standardEyebrowTreatments), defineBlockDesignMetadata({
19755
21348
  flow: bodyFlow,
19756
- layoutProfiles: [layoutProfile({ variantKey: "default", family: "stack", weight: "standard" })]
21349
+ layoutProfiles: [
21350
+ layoutProfile({ variantKey: "default", family: "stack", weight: "standard" }),
21351
+ layoutProfile({ variantKey: "two-column", family: "split", weight: "standard" })
21352
+ ]
19757
21353
  })),
19758
21354
  withDesignCapability("block.site-header", siteHeaderBlockDefinition, declareNoBlockDesignCapability("site-chrome"), defineBlockDesignMetadata({
19759
21355
  flow: siteChromeFlow,
@@ -19767,7 +21363,8 @@ var systemBlockDefinitionsRaw = [
19767
21363
  sectionSurfaces: "supported",
19768
21364
  contentFrames: ["plain", "panel"],
19769
21365
  itemSurfaces: "supported",
19770
- testimonialCardTreatments: ["default", "accent-quote"]
21366
+ testimonialCardTreatments: ["default", "accent-quote"],
21367
+ headingDecorations: ["short-center-rule"]
19771
21368
  }), defineBlockDesignMetadata({
19772
21369
  flow: proofFlow,
19773
21370
  layoutProfiles: [
@@ -19793,6 +21390,22 @@ var systemBlockDefinitionsRaw = [
19793
21390
  flow: offeringsFlow,
19794
21391
  layoutProfiles: [layoutProfile({ variantKey: "default", family: "grid", weight: "standard" })]
19795
21392
  })),
21393
+ withDesignCapability("block.feature-cards", featureCardsBlockDefinition, declareBlockDesignCapability({
21394
+ sectionSurfaces: "supported",
21395
+ contentFrames: ["plain", "panel"],
21396
+ itemSurfaces: "supported",
21397
+ headingDecorations: ["short-center-rule"]
21398
+ }), defineBlockDesignMetadata({
21399
+ flow: offeringsFlow,
21400
+ layoutProfiles: [
21401
+ layoutProfile({
21402
+ variantKey: "cards",
21403
+ family: "grid",
21404
+ weight: "standard",
21405
+ bias: "soft"
21406
+ })
21407
+ ]
21408
+ })),
19796
21409
  withDesignCapability("block.media-text", mediaTextBlockDefinition, mediaPanelCapable(), defineBlockDesignMetadata({
19797
21410
  flow: mediaFlow,
19798
21411
  layoutProfiles: [