@riverbankcms/sdk 0.78.2 → 0.80.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 (230) hide show
  1. package/README.md +80 -0
  2. package/dist/PreviewEditorSidebar-QZG37QIF.mjs +2655 -0
  3. package/dist/{PreviewEditorUI-CS5P4N3P.mjs → PreviewEditorUI-AXIKSMZA.mjs} +27 -4
  4. package/dist/SdkPreviewModeRuntime-XE5M4UKM.mjs +8 -0
  5. package/dist/_dts/ai/src/contracts/proposals.d.ts +56 -0
  6. package/dist/_dts/api/src/endpoints.d.ts +79 -0
  7. package/dist/_dts/api/src/index.d.ts +6 -4
  8. package/dist/_dts/api/src/media.d.ts +8 -1
  9. package/dist/_dts/api/src/navigation/dashboardSettingsNav.d.ts +1 -1
  10. package/dist/_dts/api/src/navigation/dashboardSiteNav.d.ts +8 -8
  11. package/dist/_dts/api/src/navigation/identity.d.ts +59 -0
  12. package/dist/_dts/api/src/navigation.d.ts +2 -0
  13. package/dist/_dts/api/src/publicExperienceEndpoints.d.ts +4 -0
  14. package/dist/_dts/api/src/sdkContracts.d.ts +1 -0
  15. package/dist/_dts/api/src/siteIcons.d.ts +128 -0
  16. package/dist/_dts/api/src/siteInfrastructure.d.ts +124 -0
  17. package/dist/_dts/api/src/siteManagementEndpoints.d.ts +16 -0
  18. package/dist/_dts/api/src/siteOnboarding.d.ts +13 -0
  19. package/dist/_dts/api/src/sitePlatformEndpoints.d.ts +17 -1
  20. package/dist/_dts/api/src/siteRuntimeEndpoints.d.ts +6 -1
  21. package/dist/_dts/api/src/types.d.ts +1 -1
  22. package/dist/_dts/api/src/webhooks.d.ts +239 -0
  23. package/dist/_dts/block-form/src/client/index.d.ts +2 -0
  24. package/dist/_dts/block-form/src/index.d.ts +2 -0
  25. package/dist/_dts/block-form/src/utils/evaluateVisibility.d.ts +2 -1
  26. package/dist/_dts/blocks/src/client/header.d.ts +1 -1
  27. package/dist/_dts/blocks/src/client.d.ts +12 -12
  28. package/dist/_dts/blocks/src/index.d.ts +5 -1
  29. package/dist/_dts/blocks/src/system/blocks/appointment-booking.d.ts +288 -288
  30. package/dist/_dts/blocks/src/system/blocks/blog-listing.d.ts +288 -288
  31. package/dist/_dts/blocks/src/system/blocks/cart.d.ts +288 -288
  32. package/dist/_dts/blocks/src/system/blocks/checkout.d.ts +288 -288
  33. package/dist/_dts/blocks/src/system/blocks/collection.d.ts +288 -288
  34. package/dist/_dts/blocks/src/system/blocks/events/event-listing.d.ts +2 -2
  35. package/dist/_dts/blocks/src/system/blocks/events/event-spotlight.d.ts +2 -1
  36. package/dist/_dts/blocks/src/system/blocks/events/shared/types.d.ts +4 -1
  37. package/dist/_dts/blocks/src/system/blocks/faq.d.ts +294 -289
  38. package/dist/_dts/blocks/src/system/blocks/feature-card-icons.d.ts +57 -0
  39. package/dist/_dts/blocks/src/system/blocks/feature-cards.d.ts +4 -0
  40. package/dist/_dts/blocks/src/system/blocks/gifting.d.ts +288 -288
  41. package/dist/_dts/blocks/src/system/blocks/index.d.ts +1 -0
  42. package/dist/_dts/blocks/src/system/blocks/location-map.d.ts +1 -1
  43. package/dist/_dts/blocks/src/system/blocks/media-text.d.ts +22 -22
  44. package/dist/_dts/blocks/src/system/blocks/product-detail.d.ts +288 -288
  45. package/dist/_dts/blocks/src/system/blocks/product-list.d.ts +288 -288
  46. package/dist/_dts/blocks/src/system/blocks/shop.d.ts +288 -288
  47. package/dist/_dts/blocks/src/system/blocks/testimonials.d.ts +13 -1
  48. package/dist/_dts/blocks/src/system/customize/backgrounds.d.ts +179 -0
  49. package/dist/_dts/blocks/src/system/fields/boxStyles.d.ts +4 -2
  50. package/dist/_dts/blocks/src/system/fragments/library/faqHeading.d.ts +1 -0
  51. package/dist/_dts/blocks/src/system/fragments/library/testimonialsCarousel.d.ts +10 -0
  52. package/dist/_dts/blocks/src/system/helpers/resolveBackground.d.ts +3 -1
  53. package/dist/_dts/blocks/src/system/icons/ids.d.ts +13 -0
  54. package/dist/_dts/blocks/src/system/icons/index.d.ts +6 -0
  55. package/dist/_dts/blocks/src/system/icons/presets.d.ts +4 -0
  56. package/dist/_dts/blocks/src/system/icons/registry.d.ts +18 -0
  57. package/dist/_dts/blocks/src/system/icons/semantic.d.ts +239 -0
  58. package/dist/_dts/blocks/src/system/icons/value.d.ts +94 -0
  59. package/dist/_dts/blocks/src/system/index.d.ts +1 -0
  60. package/dist/_dts/blocks/src/system/manifest/fieldValidation/index.d.ts +4 -1
  61. package/dist/_dts/blocks/src/system/manifest/schema.d.ts +23 -0
  62. package/dist/_dts/blocks/src/system/node/fragments/headingDecoration.d.ts +1 -4
  63. package/dist/_dts/blocks/src/system/node/validation-constants.d.ts +1 -1
  64. package/dist/_dts/blocks/src/system/runtime/components/registry.client.d.ts +7 -7
  65. package/dist/_dts/blocks/src/system/runtime/components/runtime-backed-blocks.d.ts +3 -3
  66. package/dist/_dts/blocks/src/system/runtime/header/enhanceHeaderSection.d.ts +10 -2
  67. package/dist/_dts/blocks/src/system/runtime/nodes/events/EventListing.interactive.d.ts +5 -5
  68. package/dist/_dts/blocks/src/system/runtime/nodes/events/EventListing.server.d.ts +2 -2
  69. package/dist/_dts/blocks/src/system/runtime/nodes/events/EventSpotlight.d.ts +2 -2
  70. package/dist/_dts/blocks/src/system/runtime/nodes/events/shared/EventCard.d.ts +2 -2
  71. package/dist/_dts/blocks/src/system/runtime/nodes/events/shared/EventDetailModal.d.ts +2 -2
  72. package/dist/_dts/blocks/src/system/runtime/nodes/events/shared/EventModals.d.ts +2 -2
  73. package/dist/_dts/blocks/src/system/runtime/nodes/feature-card-icon.d.ts +13 -0
  74. package/dist/_dts/blocks/src/system/runtime/nodes/header-section.client.d.ts +2 -2
  75. package/dist/_dts/blocks/src/system/transforms/registry/boxStyles.d.ts +3 -0
  76. package/dist/_dts/blocks/src/system/transforms/registry/layout.d.ts +9 -0
  77. package/dist/_dts/blocks/src/system/transforms/typed.d.ts +14 -1
  78. package/dist/_dts/content-model/src/contentManifest.d.ts +3 -1
  79. package/dist/_dts/core/src/branded.d.ts +6 -0
  80. package/dist/_dts/db/src/generated/supabase/database.types.d.ts +200 -3
  81. package/dist/_dts/editor-blocks/src/block-editor/BlockCard.d.ts +8 -1
  82. package/dist/_dts/editor-blocks/src/block-editor/BlockCardBody.d.ts +8 -1
  83. package/dist/_dts/editor-blocks/src/block-editor/BlockCardHeader.d.ts +8 -2
  84. package/dist/_dts/editor-blocks/src/block-editor/FeatureCardIconsPanel.d.ts +17 -0
  85. package/dist/_dts/editor-blocks/src/block-editor/GeneratedIconSetDialog.d.ts +42 -0
  86. package/dist/_dts/editor-blocks/src/block-editor/SortableBlockItem.d.ts +7 -1
  87. package/dist/_dts/editor-blocks/src/block-editor/featureCardIconActions.d.ts +82 -0
  88. package/dist/_dts/editor-blocks/src/index.d.ts +2 -0
  89. package/dist/_dts/editor-blocks/src/widgets/icon-picker/IconPickerField.d.ts +1 -1
  90. package/dist/_dts/media-core/src/fileDomain.d.ts +8 -1
  91. package/dist/_dts/media-editor/src/MediaEditor.d.ts +3 -2
  92. package/dist/_dts/media-react/src/components/MediaLibrary.d.ts +2 -1
  93. package/dist/_dts/media-react/src/components/MediaPickerMini.d.ts +2 -1
  94. package/dist/_dts/preview-next/src/client/blocks/BlockToolbar.d.ts +5 -1
  95. package/dist/_dts/preview-next/src/client/blocks/previewCustomizeActions.d.ts +17 -0
  96. package/dist/_dts/preview-next/src/client/blocks/previewCustomizeControlPlan.d.ts +24 -0
  97. package/dist/_dts/preview-next/src/client/blocks/useBlockCustomizeControls.d.ts +34 -0
  98. package/dist/_dts/preview-next/src/client/preview/PageBlockEditorPanel.d.ts +2 -5
  99. package/dist/_dts/preview-next/src/client/preview/PageDesignEditorStateContext.d.ts +8 -1
  100. package/dist/_dts/preview-next/src/client/preview/PreviewBlockCustomizeSelectionContext.d.ts +20 -0
  101. package/dist/_dts/preview-next/src/client/preview/PreviewOpenEditorButton.d.ts +2 -0
  102. package/dist/_dts/preview-next/src/client/preview/SelectedBlockCustomizePanel.d.ts +13 -0
  103. package/dist/_dts/preview-next/src/client/preview/StyleConfigurator.state.d.ts +3 -2
  104. package/dist/_dts/preview-next/src/client/preview/previewCustomizeEditorDraftPatch.d.ts +13 -0
  105. package/dist/_dts/preview-next/src/client/preview/previewCustomizeHistory.d.ts +6 -0
  106. package/dist/_dts/preview-next/src/client/preview/previewCustomizeRuntimePatch.d.ts +2 -0
  107. package/dist/_dts/preview-next/src/client/preview/storeTypes.d.ts +4 -0
  108. package/dist/_dts/preview-next/src/client/widgets/widgetOverrides.d.ts +3 -1
  109. package/dist/_dts/sdk/src/cli/commands/webhooks.d.ts +44 -0
  110. package/dist/_dts/sdk/src/cli/navigationIdentity.d.ts +11 -0
  111. package/dist/_dts/sdk/src/cli/site-commands/navigationCommands.d.ts +4 -0
  112. package/dist/_dts/sdk/src/cli/site-commands/oneOffCommands.d.ts +1 -0
  113. package/dist/_dts/sdk/src/cli/sync/diff.d.ts +9 -0
  114. package/dist/_dts/sdk/src/client/management/index.d.ts +1 -1
  115. package/dist/_dts/sdk/src/client/management/types.d.ts +58 -0
  116. package/dist/_dts/sdk/src/client/management/webhooks.d.ts +3 -0
  117. package/dist/_dts/sdk/src/config/field-definitions.d.ts +3 -1
  118. package/dist/_dts/sdk/src/contracts/index.d.ts +1 -1
  119. package/dist/_dts/sdk/src/contracts/system-block-content.d.ts +24 -4
  120. package/dist/_dts/sdk/src/next/index.d.ts +1 -1
  121. package/dist/_dts/sdk/src/next/revalidate.d.ts +26 -5
  122. package/dist/_dts/sdk/src/next/static-params.d.ts +28 -3
  123. package/dist/_dts/sdk/src/public-api/contracts.d.ts +5 -1
  124. package/dist/_dts/sdk/src/public-api/runtime.d.ts +1 -1
  125. package/dist/_dts/sdk/src/version.d.ts +1 -1
  126. package/dist/_dts/sdk/src/webhooks/index.d.ts +1 -1
  127. package/dist/_dts/sdk/src/webhooks/verify.d.ts +6 -102
  128. package/dist/_dts/site-commands/src/commands.d.ts +3 -0
  129. package/dist/_dts/theme-core/src/accordions/siteStyleDefaults.d.ts +220 -0
  130. package/dist/_dts/theme-core/src/accordions/types.d.ts +45 -2
  131. package/dist/_dts/theme-core/src/blockOverrides.d.ts +8 -0
  132. package/dist/_dts/theme-core/src/blocks/types.d.ts +1 -1
  133. package/dist/_dts/theme-core/src/blocks/vars/testimonials.d.ts +4 -1
  134. package/dist/_dts/theme-core/src/buttons/personalities/types.d.ts +1 -1
  135. package/dist/_dts/theme-core/src/cards/core.d.ts +20 -0
  136. package/dist/_dts/theme-core/src/cards/generateDefaultCardSystem.d.ts +6 -3
  137. package/dist/_dts/theme-core/src/cards/siteStyleDefaults.d.ts +105 -0
  138. package/dist/_dts/theme-core/src/cards/types.d.ts +177 -0
  139. package/dist/_dts/theme-core/src/generated/containerResponsiveThemeCss.d.ts +1 -1
  140. package/dist/_dts/theme-core/src/mock-themes/all.d.ts +159 -21
  141. package/dist/_dts/theme-core/src/palette/variants/index.d.ts +15 -0
  142. package/dist/_dts/theme-core/src/palette/variants/soft-natural.d.ts +16 -0
  143. package/dist/_dts/theme-core/src/palette/variants/types.d.ts +1 -1
  144. package/dist/_dts/theme-core/src/schema.d.ts +451 -57
  145. package/dist/_dts/theme-core/src/site-styles/appearancePresetCatalog.d.ts +86 -17
  146. package/dist/_dts/theme-core/src/site-styles/appearancePresetTypes.d.ts +2 -3
  147. package/dist/_dts/theme-core/src/site-styles/blockAppearancePresets.d.ts +86 -17
  148. package/dist/_dts/theme-core/src/site-styles/curatedSiteStyles.d.ts +135 -3
  149. package/dist/_dts/theme-core/src/site-styles/designState.d.ts +5 -5
  150. package/dist/_dts/theme-core/src/site-styles/footerLooks.d.ts +20 -1
  151. package/dist/_dts/theme-core/src/site-styles/generatedSchemas.d.ts +8 -2
  152. package/dist/_dts/theme-core/src/site-styles/headerLooks.d.ts +286 -6
  153. package/dist/_dts/theme-core/src/site-styles/index.d.ts +2 -0
  154. package/dist/_dts/theme-core/src/site-styles/logoBranding.d.ts +193 -0
  155. package/dist/_dts/theme-core/src/site-styles/previewCompiler.d.ts +6 -12
  156. package/dist/_dts/theme-core/src/site-styles/rawStyleFields.d.ts +2 -0
  157. package/dist/_dts/theme-core/src/site-styles/runtimeCompiler.d.ts +10 -7
  158. package/dist/_dts/theme-core/src/site-styles/siteStyleThemeCompiler.d.ts +11 -0
  159. package/dist/_dts/theme-core/src/site-styles/sourceCatalogs.d.ts +2 -2
  160. package/dist/_dts/theme-core/src/site-styles/styleTags.d.ts +1 -1
  161. package/dist/_dts/theme-core/src/site-styles/testimonialQuotePresets.d.ts +15 -0
  162. package/dist/_dts/theme-core/src/site-styles/tokenRecipes.d.ts +1 -1
  163. package/dist/_dts/theme-core/src/site-styles/types.d.ts +7 -29
  164. package/dist/_dts/theme-core/src/tokens/themeColorTokens.d.ts +2 -0
  165. package/dist/_dts/ui/src/combobox.d.ts +1 -0
  166. package/dist/{PreviewEditorSidebar-4DXLYX2V.mjs → chunk-5NZGBSJF.mjs} +2215 -2566
  167. package/dist/{chunk-RGTOD4AJ.mjs → chunk-7PCYG6YV.mjs} +621 -108
  168. package/dist/{chunk-CR5HKAGU.mjs → chunk-BBLZSQEY.mjs} +79 -0
  169. package/dist/{chunk-MCRQMPET.mjs → chunk-GYXKAUFV.mjs} +4500 -912
  170. package/dist/{chunk-6HYXHRAI.mjs → chunk-HTB4BMKD.mjs} +267 -49
  171. package/dist/{chunk-OKMBEAXY.mjs → chunk-MPBNEVPB.mjs} +1 -1
  172. package/dist/cli/index.mjs +3255 -702
  173. package/dist/cli/init-docs/content/workflow-editor-workflows.md +2 -0
  174. package/dist/cli/init-docs/content/workflow-isr-revalidation.md +150 -0
  175. package/dist/client/{accordion-PLYNJIIM.mjs → accordion-QFZMNB7O.mjs} +1 -1
  176. package/dist/client/{bookingForm-BXAP6AO7.mjs → bookingForm-NCIXFWIG.mjs} +3 -3
  177. package/dist/client/bookings.mjs +1246 -323
  178. package/dist/client/{carousel-TRBXDHGF.mjs → carousel-EO4BJMWD.mjs} +2 -2
  179. package/dist/client/{cart-Z7H3HJRS.mjs → cart-FTYCLYUW.mjs} +5 -5
  180. package/dist/client/{checkout-WAFCUBIX.mjs → checkout-NFGLVCOX.mjs} +5 -5
  181. package/dist/client/{chunk-CWGTG37I.mjs → chunk-4W66ALYT.mjs} +1 -1
  182. package/dist/client/{chunk-JRDUHZCT.mjs → chunk-6GVVWSPU.mjs} +4 -4
  183. package/dist/client/{chunk-75OUS5MT.mjs → chunk-IWFZSQNZ.mjs} +1 -1
  184. package/dist/client/{chunk-JGXPTEI2.mjs → chunk-PUOELU4O.mjs} +95 -8
  185. package/dist/client/{chunk-FUXW6VW2.mjs → chunk-PYRBIURC.mjs} +4 -4
  186. package/dist/client/{chunk-ZI3LLBPZ.mjs → chunk-T6UIP6UZ.mjs} +1 -1
  187. package/dist/client/{chunk-DNRGY432.mjs → chunk-VDS5YFLX.mjs} +1 -1
  188. package/dist/client/{chunk-UVQEJJTN.mjs → chunk-Y37KDO7P.mjs} +1 -1
  189. package/dist/client/client.mjs +24277 -20796
  190. package/dist/client/{courseRegistration-AHFQHWIJ.mjs → courseRegistration-2EORROPS.mjs} +3 -3
  191. package/dist/client/{eventCalendar-LDXTV5R7.mjs → eventCalendar-WZI4VL6N.mjs} +5 -5
  192. package/dist/client/{eventCombined-A4JGTNJO.mjs → eventCombined-QCB2TCNL.mjs} +5 -5
  193. package/dist/client/{eventDetails-4YXTZ7EG.mjs → eventDetails-TFTATAPH.mjs} +5 -5
  194. package/dist/client/{eventListing-P72TPFFM.mjs → eventListing-A2CQEHEQ.mjs} +5 -5
  195. package/dist/client/{eventRegistration-LSYJHGMT.mjs → eventRegistration-OELPVLUY.mjs} +5 -5
  196. package/dist/client/{form-AOPYOKOW.mjs → form-NTIFD6WQ.mjs} +1 -1
  197. package/dist/client/{headerSection-5TFYDFVQ.mjs → headerSection-7TBNKCLA.mjs} +65 -24
  198. package/dist/client/hooks.mjs +3687 -2024
  199. package/dist/client/{locationMap-QSZ3ZVAZ.mjs → locationMap-LRLB5A3H.mjs} +1 -1
  200. package/dist/client/{newsletterForm-KTRHZY52.mjs → newsletterForm-XI52RZSN.mjs} +1 -1
  201. package/dist/client/{productDetail-N4E775RG.mjs → productDetail-GSNKBFLY.mjs} +5 -5
  202. package/dist/client/{productList-UGUQ2S45.mjs → productList-BGCGT4KZ.mjs} +5 -5
  203. package/dist/client/rendering/client.mjs +5274 -3030
  204. package/dist/client/rendering/islands.mjs +18 -18
  205. package/dist/client/rendering.mjs +6271 -2790
  206. package/dist/client/{shop-VHSZEEQ2.mjs → shop-RQHUCLNY.mjs} +5 -5
  207. package/dist/preview-next/before-render.mjs +79 -0
  208. package/dist/preview-next/client/runtime.mjs +5 -5
  209. package/dist/preview-next/middleware.mjs +79 -0
  210. package/dist/{sdk-runtime-WHPJEF5G.mjs → sdk-runtime-A4LHT2RS.mjs} +6 -6
  211. package/dist/server/components.mjs +6215 -3057
  212. package/dist/server/config-validation.mjs +3858 -2194
  213. package/dist/server/config.mjs +3858 -2194
  214. package/dist/server/data.mjs +3687 -2024
  215. package/dist/server/index.mjs +88 -1
  216. package/dist/server/next/revalidate.mjs +229 -34
  217. package/dist/server/next.mjs +6295 -3036
  218. package/dist/server/page-converter.mjs +3055 -1883
  219. package/dist/server/prebuild.mjs +1 -1
  220. package/dist/server/rendering/server.mjs +6220 -3062
  221. package/dist/server/rendering.mjs +6233 -3075
  222. package/dist/server/routing.mjs +4251 -2137
  223. package/dist/server/server.mjs +3705 -2042
  224. package/dist/server/theme-bridge.mjs +1617 -329
  225. package/dist/server/theme.mjs +411 -221
  226. package/dist/server/webhooks.mjs +129 -25
  227. package/dist/styles/index.css +355 -33
  228. package/package.json +2 -1
  229. package/dist/SdkPreviewModeRuntime-IJDHTW4W.mjs +0 -8
  230. package/dist/chunk-4QEGTLK6.mjs +0 -1175
@@ -2,7 +2,7 @@
2
2
  import * as React2 from "react";
3
3
 
4
4
  // ../theme-core/src/schema.ts
5
- import { z as z16 } from "zod";
5
+ import { z as z17 } from "zod";
6
6
 
7
7
  // ../theme-core/src/lib/media.ts
8
8
  import z from "zod";
@@ -146,7 +146,7 @@ var themeColorBaseTokenNames = [
146
146
  "accentForeground"
147
147
  ];
148
148
  var themeColorBaseTokenSet = new Set(themeColorBaseTokenNames);
149
- var SHADE_STEPS = [
149
+ var themeColorShadeSteps = [
150
150
  "50",
151
151
  "100",
152
152
  "200",
@@ -159,7 +159,7 @@ var SHADE_STEPS = [
159
159
  "900",
160
160
  "950"
161
161
  ];
162
- var shadeStepSet = new Set(SHADE_STEPS);
162
+ var shadeStepSet = new Set(themeColorShadeSteps);
163
163
  function isKnownBaseToken(value) {
164
164
  return themeColorBaseTokenSet.has(value);
165
165
  }
@@ -1221,8 +1221,15 @@ function getDefaultButtonVariants() {
1221
1221
 
1222
1222
  // ../theme-core/src/cards/types.ts
1223
1223
  import { z as z6 } from "zod";
1224
+ var cardVariantRoleValues = ["default", "alternative"];
1225
+ var boxlessCardVariantValue = "none";
1224
1226
  var cardSpacingSchema = z6.enum(["none", "compact", "cozy", "medium", "comfortable", "spacious"]);
1225
1227
  var gradientDirectionSchema2 = z6.enum(["to-r", "to-l", "to-t", "to-b", "to-tr", "to-tl", "to-br", "to-bl"]);
1228
+ var cardVariantRoleSchema = z6.enum(cardVariantRoleValues);
1229
+ var boxStylesCardVariantSchema = z6.enum([
1230
+ ...cardVariantRoleValues,
1231
+ boxlessCardVariantValue
1232
+ ]);
1226
1233
  var cardBackgroundSchema = z6.discriminatedUnion("type", [
1227
1234
  z6.object({ type: z6.literal("solid"), colorToken: themeColorTokenSchema }),
1228
1235
  z6.object({
@@ -1237,6 +1244,24 @@ var cardBorderSchema = z6.object({
1237
1244
  widthClass: z6.string(),
1238
1245
  colorToken: themeColorTokenSchema
1239
1246
  });
1247
+ var cardCornerValueSchema = z6.enum([
1248
+ "square",
1249
+ "soft",
1250
+ "rounded",
1251
+ "pill",
1252
+ "expressive"
1253
+ ]);
1254
+ var cardAccentEdgeSchema = z6.object({
1255
+ edge: z6.enum(["left", "top", "right", "bottom"]),
1256
+ colorToken: themeColorTokenSchema,
1257
+ width: z6.enum(["thin", "medium", "thick", "heavy"])
1258
+ });
1259
+ var cardCornerRadiiSchema = z6.object({
1260
+ topLeft: cardCornerValueSchema.optional(),
1261
+ topRight: cardCornerValueSchema.optional(),
1262
+ bottomLeft: cardCornerValueSchema.optional(),
1263
+ bottomRight: cardCornerValueSchema.optional()
1264
+ });
1240
1265
  var cardVariantSchema = z6.object({
1241
1266
  id: z6.string(),
1242
1267
  name: z6.string().min(1).max(20),
@@ -1245,6 +1270,8 @@ var cardVariantSchema = z6.object({
1245
1270
  // Appearance (token-based)
1246
1271
  background: cardBackgroundSchema,
1247
1272
  spacing: cardSpacingSchema,
1273
+ // Optional foreground (card text) color, for cards on a strong fill.
1274
+ foregroundToken: themeColorTokenSchema.optional(),
1248
1275
  // Optional overrides (uses theme defaults if not specified)
1249
1276
  shadow: z6.object({
1250
1277
  elevation: z6.enum(["none", "low", "medium", "high"]),
@@ -1252,8 +1279,12 @@ var cardVariantSchema = z6.object({
1252
1279
  position: z6.enum(["bottom", "bottom-right"]).default("bottom")
1253
1280
  }).optional(),
1254
1281
  corners: z6.enum(["square", "soft", "rounded", "pill"]).optional(),
1282
+ // Per-corner radius override; wins over `corners` when set.
1283
+ cornerRadii: cardCornerRadiiSchema.optional(),
1255
1284
  // Border (optional)
1256
- border: cardBorderSchema.optional()
1285
+ border: cardBorderSchema.optional(),
1286
+ // Single accent edge; replaces `border` when set.
1287
+ accentEdge: cardAccentEdgeSchema.optional()
1257
1288
  });
1258
1289
  var cardSystemSchema = z6.object({
1259
1290
  variants: z6.array(cardVariantSchema).min(1).max(3)
@@ -1272,6 +1303,33 @@ var BORDER_WIDTH_MAP3 = {
1272
1303
  medium: "2px",
1273
1304
  thick: "4px"
1274
1305
  };
1306
+ var PER_CORNER_RADIUS_MAP = {
1307
+ square: "0",
1308
+ soft: "0.5rem",
1309
+ rounded: "1rem",
1310
+ pill: "1.5rem",
1311
+ // A large block-radius multiple for expressive, asymmetric card corners.
1312
+ expressive: "calc(var(--rb-block-radius) * 3)"
1313
+ };
1314
+ var ACCENT_EDGE_WIDTH_MAP = {
1315
+ thin: "2px",
1316
+ medium: "3px",
1317
+ thick: "4px",
1318
+ heavy: "5px"
1319
+ };
1320
+ var ACCENT_EDGE_SIDE_MAP = {
1321
+ left: "border-left",
1322
+ top: "border-top",
1323
+ right: "border-right",
1324
+ bottom: "border-bottom"
1325
+ };
1326
+ function resolveCornerRadiiCss(cornerRadii, fallback) {
1327
+ const fallbackValue = CORNER_RADIUS_MAP3[fallback];
1328
+ const at = (value) => value ? PER_CORNER_RADIUS_MAP[value] : fallbackValue;
1329
+ return `${at(cornerRadii.topLeft)} ${at(cornerRadii.topRight)} ${at(
1330
+ cornerRadii.bottomRight
1331
+ )} ${at(cornerRadii.bottomLeft)}`;
1332
+ }
1275
1333
  var GRADIENT_DIRECTION_MAP4 = {
1276
1334
  "to-r": "to right",
1277
1335
  "to-l": "to left",
@@ -1319,11 +1377,25 @@ function generateVariantCss2(scopeId, variant, settings) {
1319
1377
  } else {
1320
1378
  containerRules.push("background: transparent");
1321
1379
  }
1322
- const borderWidth = variant.borderWidth ? BORDER_WIDTH_MAP3[variant.borderWidth] : variant.borderToken ? BORDER_WIDTH_MAP3[settings.borderWidth] : "0";
1323
- if (variant.borderToken && borderWidth !== "0") {
1324
- containerRules.push(`border: ${borderWidth} solid rgb(var(--tb-${variant.borderToken}))`);
1380
+ if (variant.foregroundToken) {
1381
+ containerRules.push(`color: rgb(var(--tb-${variant.foregroundToken}))`);
1382
+ }
1383
+ if (variant.accentEdge) {
1384
+ const side = ACCENT_EDGE_SIDE_MAP[variant.accentEdge.edge];
1385
+ const width = ACCENT_EDGE_WIDTH_MAP[variant.accentEdge.width];
1386
+ containerRules.push("border: 0");
1387
+ containerRules.push(
1388
+ `${side}: ${width} solid rgb(var(--tb-${variant.accentEdge.colorToken}))`
1389
+ );
1390
+ } else {
1391
+ const borderWidth = variant.borderWidth ? BORDER_WIDTH_MAP3[variant.borderWidth] : variant.borderToken ? BORDER_WIDTH_MAP3[settings.borderWidth] : "0";
1392
+ if (variant.borderToken && borderWidth !== "0") {
1393
+ containerRules.push(`border: ${borderWidth} solid rgb(var(--tb-${variant.borderToken}))`);
1394
+ }
1325
1395
  }
1326
- containerRules.push(`border-radius: ${CORNER_RADIUS_MAP3[settings.corners]}`);
1396
+ containerRules.push(
1397
+ `border-radius: ${variant.cornerRadii ? resolveCornerRadiiCss(variant.cornerRadii, settings.corners) : CORNER_RADIUS_MAP3[settings.corners]}`
1398
+ );
1327
1399
  if (settings.shadow !== "none") {
1328
1400
  containerRules.push(`box-shadow: ${SHADOW_VALUES2[settings.shadow]}`);
1329
1401
  }
@@ -1392,11 +1464,13 @@ var accordionIconSchema = z7.enum([
1392
1464
  // ⊕ becomes ⊖ (swap with fade)
1393
1465
  ]);
1394
1466
  var accordionSystemSchema = z7.object({
1395
- // Visual styling (solid color only - gradients can be added later if needed)
1467
+ // Visual styling (solid color only - gradients can be added later if needed).
1468
+ // null = no fill, so the accordion sits transparently on the section
1469
+ // surface (used by open, boxless "divided" looks).
1396
1470
  background: z7.object({
1397
1471
  type: z7.literal("solid"),
1398
1472
  colorToken: themeColorTokenSchema
1399
- }),
1473
+ }).nullable(),
1400
1474
  // Spacing (padding inside items)
1401
1475
  spacing: z7.enum(["none", "compact", "cozy", "medium", "comfortable", "spacious"]),
1402
1476
  // Border radius (null = inherit from theme.corners)
@@ -1423,8 +1497,16 @@ var accordionSystemSchema = z7.object({
1423
1497
  // Trigger (question) styling
1424
1498
  trigger: z7.object({
1425
1499
  textColorToken: themeColorTokenSchema,
1426
- fontWeight: z7.enum(["regular", "medium", "semibold", "bold"]).nullable()
1500
+ fontWeight: z7.enum(["regular", "medium", "semibold", "bold"]).nullable(),
1427
1501
  // null = inherit from theme
1502
+ // Question typography. Defaults keep the historical body-font look; set
1503
+ // fontFamily 'heading' + a larger scale to give questions real presence.
1504
+ fontFamily: z7.enum(["body", "heading"]).optional(),
1505
+ // default 'body'
1506
+ fontScale: z7.enum(["body", "md", "lg"]).optional(),
1507
+ // default 'body'
1508
+ letterSpacing: z7.enum(["normal", "tight", "wide"]).optional(),
1509
+ textTransform: z7.enum(["none", "uppercase"]).optional()
1428
1510
  }),
1429
1511
  // Hover state styling
1430
1512
  hover: z7.object({
@@ -1432,6 +1514,17 @@ var accordionSystemSchema = z7.object({
1432
1514
  textColorToken: themeColorTokenSchema.optional(),
1433
1515
  borderColorToken: themeColorTokenSchema.optional()
1434
1516
  }),
1517
+ // Open-state emphasis: how an expanded item is visually rewarded. All
1518
+ // optional; omit for the historical "only the text recolors" behaviour.
1519
+ openState: z7.object({
1520
+ backgroundColorToken: themeColorTokenSchema.optional(),
1521
+ triggerColorToken: themeColorTokenSchema.optional(),
1522
+ accent: z7.object({
1523
+ edge: z7.enum(["left", "top", "bottom"]),
1524
+ colorToken: themeColorTokenSchema,
1525
+ thickness: z7.enum(["thin", "medium", "thick"])
1526
+ }).optional()
1527
+ }).optional(),
1435
1528
  // Content (answer) styling
1436
1529
  content: z7.object({
1437
1530
  textColorToken: themeColorTokenSchema
@@ -1837,14 +1930,8 @@ var visibleHeadingDecorationFamilyValues = [
1837
1930
  "organic-squiggle",
1838
1931
  "short-center-rule"
1839
1932
  ];
1840
- var visibleHeadingDecorationPlacementValues = [
1841
- "after-heading",
1842
- "between-heading-and-body",
1843
- "under-centered-heading"
1844
- ];
1845
1933
  var headingDecorationOverrideValues = [
1846
1934
  "site-default",
1847
- "on",
1848
1935
  "off"
1849
1936
  ];
1850
1937
  var headingDecorationColorTokenValues = [
@@ -1855,6 +1942,9 @@ var headingDecorationColorTokenValues = [
1855
1942
  "border",
1856
1943
  "muted"
1857
1944
  ];
1945
+ var noHeadingDecoration = {
1946
+ family: "none"
1947
+ };
1858
1948
  var accordionIconSetValues = [
1859
1949
  "plus",
1860
1950
  "chevron",
@@ -1875,79 +1965,219 @@ var accordionIconMotionValues = [
1875
1965
  "swap"
1876
1966
  ];
1877
1967
 
1878
- // ../theme-core/src/utils/tokenOrColor.ts
1968
+ // ../theme-core/src/site-styles/logoBranding.ts
1879
1969
  import { z as z15 } from "zod";
1880
- var tokenOrCssColorValueSchema = z15.string();
1970
+ var logoTextConfidenceValues = ["low", "medium", "high"];
1971
+ var logoAssetShapeValues = [
1972
+ "none",
1973
+ "horizontal",
1974
+ "square",
1975
+ "portrait",
1976
+ "tall"
1977
+ ];
1978
+ var logoKindValues = [
1979
+ "mark",
1980
+ "wordmark",
1981
+ "lockup",
1982
+ "badge",
1983
+ "stacked-wordmark",
1984
+ "unknown"
1985
+ ];
1986
+ var logoDensityValues = ["simple", "detailed", "unknown"];
1987
+ var logoContainsTextSchema = z15.discriminatedUnion("kind", [
1988
+ z15.object({
1989
+ kind: z15.literal("contains-text"),
1990
+ confidence: z15.enum(logoTextConfidenceValues),
1991
+ text: z15.string().trim().min(1).max(200).optional()
1992
+ }),
1993
+ z15.object({
1994
+ kind: z15.literal("no-text"),
1995
+ confidence: z15.enum(logoTextConfidenceValues)
1996
+ }),
1997
+ z15.object({
1998
+ kind: z15.literal("unknown"),
1999
+ reason: z15.enum([
2000
+ "analysis-unavailable",
2001
+ "unsupported-file",
2002
+ "low-confidence"
2003
+ ])
2004
+ })
2005
+ ]);
2006
+ var logoAnalysisSourceSchema = z15.discriminatedUnion("kind", [
2007
+ z15.object({ kind: z15.literal("none") }),
2008
+ z15.object({
2009
+ kind: z15.literal("deterministic"),
2010
+ reason: z15.enum(["dimensions", "fallback"])
2011
+ }),
2012
+ z15.object({
2013
+ kind: z15.literal("llm"),
2014
+ model: z15.literal("gpt-5.4-mini"),
2015
+ analyzedAt: z15.string().trim().min(1).max(80).optional()
2016
+ }),
2017
+ z15.object({ kind: z15.literal("manual-override") })
2018
+ ]);
2019
+ var logoFactsSchema = z15.object({
2020
+ shape: z15.enum(logoAssetShapeValues),
2021
+ containsText: logoContainsTextSchema,
2022
+ kind: z15.enum(logoKindValues),
2023
+ density: z15.enum(logoDensityValues),
2024
+ source: logoAnalysisSourceSchema
2025
+ });
2026
+ var brandDisplayModeValues = [
2027
+ "auto",
2028
+ "logo-only",
2029
+ "logo-plus-title",
2030
+ "title-only"
2031
+ ];
2032
+ var logoAccommodationPatternValues = [
2033
+ "title-only",
2034
+ "inline-logo-only",
2035
+ "inline-wordmark",
2036
+ "inline-mark-with-title",
2037
+ "logo-plate",
2038
+ "centered-badge",
2039
+ "popout-badge",
2040
+ "centered-masthead",
2041
+ "hero-badge"
2042
+ ];
2043
+ var logoSizePolicyValues = [
2044
+ "auto",
2045
+ "compact",
2046
+ "standard",
2047
+ "generous",
2048
+ "display"
2049
+ ];
2050
+
2051
+ // ../theme-core/src/site-styles/rawStyleFields.ts
2052
+ var themeV2RuntimeStyleFieldNames = [
2053
+ "_frameStyles",
2054
+ "_sectionStyles",
2055
+ "_containerStyles",
2056
+ "_cardStyles",
2057
+ // styleGroup is legacy runtime transition wiring rather than a nested
2058
+ // override object, but normal editors should still never see it directly.
2059
+ "styleGroup"
2060
+ ];
2061
+ var themeV2BlockSpecificRawStyleFieldNames = [
2062
+ "_contentCardStyles",
2063
+ "_heroLayoutStyles",
2064
+ "_textCardStyles"
2065
+ ];
2066
+ var themeV2NormalEditorRawStyleFieldNames = [
2067
+ ...themeV2RuntimeStyleFieldNames,
2068
+ ...themeV2BlockSpecificRawStyleFieldNames
2069
+ ];
2070
+ var themeV2NormalEditorRawStyleFieldNameSet = new Set(
2071
+ themeV2NormalEditorRawStyleFieldNames
2072
+ );
2073
+ var themeV2CompilerOwnedFieldNames = [
2074
+ ...themeV2RuntimeStyleFieldNames,
2075
+ ...themeV2BlockSpecificRawStyleFieldNames
2076
+ ];
2077
+ var pageDesignEditorBackgroundOverrideOwner = "page-design-editor";
2078
+
2079
+ // ../theme-core/src/utils/tokenOrColor.ts
2080
+ import { z as z16 } from "zod";
2081
+
2082
+ // ../theme-core/src/utils/colorStyles.ts
2083
+ var COLOR_VAR_PREFIX = "--tb-";
2084
+ function parseToken(source) {
2085
+ const parts = parseColorTokenParts(source);
2086
+ if (parts.kind === "raw") {
2087
+ return { token: source, raw: parts.value };
2088
+ }
2089
+ if (parts.kind === "invalid") {
2090
+ return { token: source };
2091
+ }
2092
+ return {
2093
+ token: parts.token,
2094
+ alpha: parts.opacityPercent === null ? void 0 : parts.opacityPercent / 100
2095
+ };
2096
+ }
2097
+ function rgbColorValue(token) {
2098
+ const { token: baseToken, alpha, raw } = parseToken(token);
2099
+ if (raw) {
2100
+ return raw;
2101
+ }
2102
+ const cssVar = `${COLOR_VAR_PREFIX}${baseToken}`;
2103
+ if (alpha === void 0) {
2104
+ return `rgb(var(${cssVar}))`;
2105
+ }
2106
+ return `rgba(var(${cssVar}), ${alpha})`;
2107
+ }
2108
+
2109
+ // ../theme-core/src/utils/tokenOrColor.ts
2110
+ var tokenOrCssColorValueSchema = z16.string();
1881
2111
 
1882
2112
  // ../theme-core/src/schema.ts
1883
- var axesSchema = z16.object({
1884
- tone: z16.enum(["minimal", "classic", "bold"]),
1885
- energy: z16.enum(["calm", "vibrant"]),
1886
- density: z16.enum(["airy", "regular", "compact"]),
1887
- mediaBias: z16.enum(["text", "media", "mixed"]),
1888
- conversionBias: z16.enum(["low", "med", "high"]),
1889
- motion: z16.enum(["subtle", "standard", "expressive"])
2113
+ var axesSchema = z17.object({
2114
+ tone: z17.enum(["minimal", "classic", "bold"]),
2115
+ energy: z17.enum(["calm", "vibrant"]),
2116
+ density: z17.enum(["airy", "regular", "compact"]),
2117
+ mediaBias: z17.enum(["text", "media", "mixed"]),
2118
+ conversionBias: z17.enum(["low", "med", "high"]),
2119
+ motion: z17.enum(["subtle", "standard", "expressive"])
1890
2120
  });
1891
- var colourHexString = z16.string().regex(/^#([0-9A-Fa-f]{3}){1,2}$/);
1892
- var paletteColorSchema = z16.object({
1893
- name: z16.string().min(1),
2121
+ var colourHexString = z17.string().regex(/^#([0-9A-Fa-f]{3}){1,2}$/);
2122
+ var paletteColorSchema = z17.object({
2123
+ name: z17.string().min(1),
1894
2124
  hex: colourHexString
1895
2125
  });
1896
- var paletteMetaSchema = z16.object({
1897
- mode: z16.enum(["light", "dark"])
2126
+ var paletteMetaSchema = z17.object({
2127
+ mode: z17.enum(["light", "dark"])
1898
2128
  });
1899
- var paletteSchema = z16.object({
1900
- colors: z16.array(paletteColorSchema),
2129
+ var paletteSchema = z17.object({
2130
+ colors: z17.array(paletteColorSchema),
1901
2131
  meta: paletteMetaSchema
1902
2132
  });
1903
- var typographyStyleSchema = z16.object({
1904
- family: z16.string().min(1),
1905
- weight: z16.enum(["light", "regular", "medium", "semibold", "bold"]),
1906
- letterSpacing: z16.enum(["tight", "normal", "loose"]),
1907
- lineHeight: z16.enum(["normal", "relaxed", "loose"])
2133
+ var typographyStyleSchema = z17.object({
2134
+ family: z17.string().min(1),
2135
+ weight: z17.enum(["light", "regular", "medium", "semibold", "bold"]),
2136
+ letterSpacing: z17.enum(["tight", "normal", "loose"]),
2137
+ lineHeight: z17.enum(["normal", "relaxed", "loose"])
1908
2138
  });
1909
2139
  var bodyTypographyStyleSchema = typographyStyleSchema.extend({
1910
- size: z16.enum(["md", "lg", "xl"])
2140
+ size: z17.enum(["md", "lg", "xl"])
1911
2141
  });
1912
- var headingSizeSchema = z16.enum(["xs", "sm", "md", "lg", "xl", "2xl"]);
1913
- var headingTypographyOverridesSchema = z16.object({
1914
- weight: z16.enum(["light", "regular", "medium", "semibold", "bold"]).nullable().optional(),
1915
- letterSpacing: z16.enum(["tight", "normal", "loose"]).nullable().optional(),
2142
+ var headingSizeSchema = z17.enum(["xs", "sm", "md", "lg", "xl", "2xl"]);
2143
+ var headingTypographyOverridesSchema = z17.object({
2144
+ weight: z17.enum(["light", "regular", "medium", "semibold", "bold"]).nullable().optional(),
2145
+ letterSpacing: z17.enum(["tight", "normal", "loose"]).nullable().optional(),
1916
2146
  size: headingSizeSchema.nullable().optional(),
1917
- lineHeight: z16.enum(["normal", "relaxed", "loose"]).nullable().optional(),
1918
- italic: z16.boolean().nullable().optional(),
2147
+ lineHeight: z17.enum(["normal", "relaxed", "loose"]).nullable().optional(),
2148
+ italic: z17.boolean().nullable().optional(),
1919
2149
  colorToken: themeColorTokenSchema.nullable().optional()
1920
2150
  });
1921
2151
  var headingTypographyStyleSchema = typographyStyleSchema.extend({
1922
- case: z16.enum(["uppercase", "normal", "smallCaps"]).nullable(),
1923
- italic: z16.boolean().nullable(),
2152
+ case: z17.enum(["uppercase", "normal", "smallCaps"]).nullable(),
2153
+ italic: z17.boolean().nullable(),
1924
2154
  colorToken: themeColorTokenSchema.nullable().optional()
1925
2155
  });
1926
- var proseLinkUnderlineStyleSchema = z16.enum(["solid", "dotted", "dashed"]);
1927
- var proseLinkUnderlineThicknessSchema = z16.enum([
2156
+ var proseLinkUnderlineStyleSchema = z17.enum(["solid", "dotted", "dashed"]);
2157
+ var proseLinkUnderlineThicknessSchema = z17.enum([
1928
2158
  "auto",
1929
2159
  "fromFont",
1930
2160
  "thin",
1931
2161
  "medium",
1932
2162
  "thick"
1933
2163
  ]);
1934
- var proseLinkUnderlineOffsetSchema = z16.enum([
2164
+ var proseLinkUnderlineOffsetSchema = z17.enum([
1935
2165
  "auto",
1936
2166
  "tight",
1937
2167
  "normal",
1938
2168
  "loose"
1939
2169
  ]);
1940
- var proseLinkStyleSchema = z16.object({
2170
+ var proseLinkStyleSchema = z17.object({
1941
2171
  colorToken: themeColorTokenSchema.optional(),
1942
2172
  hoverColorToken: themeColorTokenSchema.optional(),
1943
- underline: z16.boolean().optional(),
2173
+ underline: z17.boolean().optional(),
1944
2174
  decorationColorToken: themeColorTokenSchema.optional(),
1945
2175
  hoverDecorationColorToken: themeColorTokenSchema.optional(),
1946
2176
  underlineStyle: proseLinkUnderlineStyleSchema.optional(),
1947
2177
  underlineThickness: proseLinkUnderlineThicknessSchema.optional(),
1948
2178
  underlineOffset: proseLinkUnderlineOffsetSchema.optional()
1949
2179
  });
1950
- var semanticSpacingSchema = z16.enum([
2180
+ var semanticSpacingSchema = z17.enum([
1951
2181
  "none",
1952
2182
  "compact",
1953
2183
  "cozy",
@@ -1955,91 +2185,108 @@ var semanticSpacingSchema = z16.enum([
1955
2185
  "comfortable",
1956
2186
  "spacious"
1957
2187
  ]);
1958
- var boxRoundedSchema = z16.enum(["none", "sm", "md", "lg", "xl", "2xl", "full"]);
1959
- var boxBackgroundOverlaySchema = z16.object({
1960
- type: z16.enum(["none", "color", "gradient"]).nullable().optional(),
2188
+ var boxRoundedSchema = z17.enum(["none", "sm", "md", "lg", "xl", "2xl", "full"]);
2189
+ var boxBackgroundOverlaySchema = z17.object({
2190
+ type: z17.enum(["none", "color", "gradient"]).nullable().optional(),
1961
2191
  color: tokenOrCssColorValueSchema.nullable().optional(),
1962
- gradient: z16.string().nullable().optional(),
1963
- opacity: z16.number().min(0).max(1).nullable().optional()
2192
+ gradient: z17.string().nullable().optional(),
2193
+ opacity: z17.number().min(0).max(1).nullable().optional()
1964
2194
  });
1965
- var boxBackgroundSchema = z16.object({
1966
- type: z16.enum(["color", "gradient", "image"]).optional(),
2195
+ var boxBackgroundSchema = z17.object({
2196
+ type: z17.enum(["color", "gradient", "image"]).optional(),
2197
+ contentOwner: z17.literal(pageDesignEditorBackgroundOverrideOwner).optional(),
1967
2198
  color: tokenOrCssColorValueSchema.nullable().optional(),
1968
- gradient: z16.string().nullable().optional(),
2199
+ gradient: z17.string().nullable().optional(),
2200
+ gradientPresetId: z17.string().min(1).nullable().optional(),
1969
2201
  image: mediaSchema.nullable().optional(),
1970
- objectFit: z16.enum(["fill", "fit", "original", "custom"]).nullable().optional(),
1971
- scale: z16.string().nullable().optional(),
1972
- position: z16.string().nullable().optional(),
1973
- opacity: z16.number().min(0).max(1).nullable().optional(),
1974
- motion: z16.enum(["static", "fixed-frame"]).nullable().optional(),
2202
+ objectFit: z17.enum(["fill", "fit", "original", "custom"]).nullable().optional(),
2203
+ scale: z17.string().nullable().optional(),
2204
+ position: z17.string().nullable().optional(),
2205
+ opacity: z17.number().min(0).max(1).nullable().optional(),
2206
+ motion: z17.enum(["static", "fixed-frame"]).nullable().optional(),
1975
2207
  overlay: boxBackgroundOverlaySchema.nullable().optional(),
1976
2208
  textColor: tokenOrCssColorValueSchema.nullable().optional(),
1977
2209
  headingColor: tokenOrCssColorValueSchema.nullable().optional()
1978
2210
  });
1979
- var noHeadingDecorationSchema = z16.object({
1980
- family: z16.literal("none"),
1981
- placement: z16.literal("none")
2211
+ var noHeadingDecorationSchema = z17.object({
2212
+ family: z17.literal("none")
1982
2213
  });
1983
- var visibleHeadingDecorationSchema = z16.object({
1984
- family: z16.enum(visibleHeadingDecorationFamilyValues),
1985
- placement: z16.enum(visibleHeadingDecorationPlacementValues),
1986
- colorToken: z16.enum(headingDecorationColorTokenValues).optional()
2214
+ var visibleHeadingDecorationSchema = z17.object({
2215
+ family: z17.enum(visibleHeadingDecorationFamilyValues),
2216
+ colorToken: z17.enum(headingDecorationColorTokenValues).optional()
1987
2217
  });
1988
- var headingDecorationSchema = z16.union([
2218
+ var headingDecorationSchema = z17.union([
1989
2219
  noHeadingDecorationSchema,
1990
2220
  visibleHeadingDecorationSchema
1991
2221
  ]);
1992
- var accordionIconTreatmentSchema = z16.object({
1993
- iconSet: z16.enum(accordionIconSetValues),
1994
- colorToken: z16.enum(accordionIconColorTokenValues),
1995
- openColorToken: z16.enum(accordionIconColorTokenValues).optional(),
1996
- motion: z16.enum(accordionIconMotionValues)
2222
+ var headingDecorationOverrideSchema = z17.union([
2223
+ z17.enum(headingDecorationOverrideValues),
2224
+ // Legacy authoring value from the earlier model. In the render-time model
2225
+ // "on" cannot force a fragment into a block, so it is equivalent to default.
2226
+ z17.literal("on").transform(() => "site-default")
2227
+ ]);
2228
+ var accordionIconTreatmentSchema = z17.object({
2229
+ iconSet: z17.enum(accordionIconSetValues),
2230
+ colorToken: z17.enum(accordionIconColorTokenValues),
2231
+ openColorToken: z17.enum(accordionIconColorTokenValues).optional(),
2232
+ motion: z17.enum(accordionIconMotionValues)
1997
2233
  });
1998
- var sectionStylesOverrideSchema = z16.object({
2234
+ var sectionStylesOverrideSchema = z17.object({
1999
2235
  background: boxBackgroundSchema.nullable().optional(),
2000
2236
  spacing: semanticSpacingSchema.nullable().optional(),
2001
- minHeight: z16.enum(["none", "banner", "hero", "immersive"]).nullable().optional(),
2002
- tileTreatment: z16.enum(tileTreatmentValues).nullable().optional(),
2003
- eventListTreatment: z16.enum(eventListTreatmentValues).nullable().optional(),
2004
- eyebrowTreatment: z16.enum(eyebrowTreatmentValues).nullable().optional(),
2237
+ minHeight: z17.enum(["none", "banner", "hero", "immersive"]).nullable().optional(),
2238
+ tileTreatment: z17.enum(tileTreatmentValues).nullable().optional(),
2239
+ eventListTreatment: z17.enum(eventListTreatmentValues).nullable().optional(),
2240
+ eyebrowTreatment: z17.enum(eyebrowTreatmentValues).nullable().optional(),
2005
2241
  headingDecoration: headingDecorationSchema.nullable().optional(),
2006
- // Author-level override consumed by later block/editor rendering phases.
2007
- // Keeping it in section styles lets existing block save APIs persist it.
2008
- headingDecorationOverride: z16.enum(headingDecorationOverrideValues).nullable().optional(),
2242
+ // Author-level opt-out consumed by render-time theme projection. Persisted
2243
+ // content may also carry legacy `headingDecoration` / `on` values; those are
2244
+ // tolerated at the schema boundary but the renderer treats the compiled theme
2245
+ // as the only source of the resolved signature.
2246
+ headingDecorationOverride: headingDecorationOverrideSchema.nullable().optional(),
2009
2247
  accordionIconTreatment: accordionIconTreatmentSchema.nullable().optional()
2010
2248
  });
2011
- var containerStylesOverrideSchema = z16.object({
2249
+ var containerStylesOverrideSchema = z17.object({
2012
2250
  background: boxBackgroundSchema.nullable().optional(),
2013
2251
  spacing: semanticSpacingSchema.nullable().optional(),
2014
- raised: z16.boolean().nullable().optional(),
2252
+ raised: z17.boolean().nullable().optional(),
2015
2253
  rounded: boxRoundedSchema.nullable().optional(),
2016
- fullWidth: z16.boolean().nullable().optional()
2254
+ fullWidth: z17.boolean().nullable().optional()
2017
2255
  });
2018
- var cardBorderOverrideSchema = z16.object({
2019
- enabled: z16.boolean().nullable().optional(),
2020
- width: z16.enum(["none", "1", "2", "3"]).nullable().optional(),
2256
+ var cardBorderOverrideSchema = z17.object({
2257
+ enabled: z17.boolean().nullable().optional(),
2258
+ width: z17.enum(["none", "1", "2", "3"]).nullable().optional(),
2021
2259
  colorToken: themeColorTokenSchema.nullable().optional()
2022
2260
  });
2023
- var cardStylesOverrideSchema = z16.object({
2261
+ var cardStylesOverrideSchema = z17.object({
2024
2262
  background: boxBackgroundSchema.nullable().optional(),
2025
2263
  border: cardBorderOverrideSchema.nullable().optional(),
2026
2264
  spacing: semanticSpacingSchema.nullable().optional(),
2027
- raised: z16.boolean().nullable().optional(),
2265
+ raised: z17.boolean().nullable().optional(),
2028
2266
  rounded: boxRoundedSchema.nullable().optional(),
2029
- treatment: z16.enum(["accent-quote"]).nullable().optional()
2267
+ treatment: z17.enum([
2268
+ "accent-quote",
2269
+ "editorial-rule",
2270
+ "soft-panel",
2271
+ "editorial-serif-quote",
2272
+ "editorial-open"
2273
+ ]).nullable().optional(),
2274
+ // Which site-style card variant the card adopts (emits a `.card-{id}` class).
2275
+ // 'none' is boxless. Driven by the block look via testimonialCardTreatment.
2276
+ cardVariant: boxStylesCardVariantSchema.nullable().optional()
2030
2277
  });
2031
- var blockStyleOverridesSchema = z16.object({
2278
+ var blockStyleOverridesSchema = z17.object({
2032
2279
  sectionStyles: sectionStylesOverrideSchema.nullable().optional(),
2033
2280
  containerStyles: containerStylesOverrideSchema.nullable().optional(),
2034
2281
  cardStyles: cardStylesOverrideSchema.nullable().optional()
2035
2282
  });
2036
- var blockThemeOverrideSchema = z16.object({
2037
- typography: z16.object({
2283
+ var blockThemeOverrideSchema = z17.object({
2284
+ typography: z17.object({
2038
2285
  proseLinkStyle: proseLinkStyleSchema.optional()
2039
2286
  }).optional(),
2040
2287
  styles: blockStyleOverridesSchema.optional()
2041
2288
  });
2042
- var typographyScaleSchema = z16.enum([
2289
+ var typographyScaleSchema = z17.enum([
2043
2290
  // New intuitive names
2044
2291
  "compact",
2045
2292
  // ratio 1.2 (was minorThird)
@@ -2052,9 +2299,9 @@ var typographyScaleSchema = z16.enum([
2052
2299
  "majorThird",
2053
2300
  "perfectFourth"
2054
2301
  ]);
2055
- var typographySchema = z16.object({
2302
+ var typographySchema = z17.object({
2056
2303
  body: bodyTypographyStyleSchema,
2057
- headings: z16.object({
2304
+ headings: z17.object({
2058
2305
  default: headingTypographyStyleSchema,
2059
2306
  h1: headingTypographyOverridesSchema,
2060
2307
  h2: headingTypographyOverridesSchema,
@@ -2067,41 +2314,41 @@ var typographySchema = z16.object({
2067
2314
  scale: typographyScaleSchema,
2068
2315
  proseLinkStyle: proseLinkStyleSchema.optional()
2069
2316
  });
2070
- var spaceSchema = z16.enum(["comfortable", "standard", "dense"]);
2071
- var corners = z16.enum(["square", "soft", "rounded", "pill"]);
2072
- var shadow = z16.object({
2073
- elevation: z16.enum(["none", "low", "medium", "high"]),
2074
- softness: z16.enum(["crisp", "soft", "hard"]).nullable(),
2075
- position: z16.enum(["bottom", "bottom-right"]).default("bottom")
2317
+ var spaceSchema = z17.enum(["comfortable", "standard", "dense"]);
2318
+ var corners = z17.enum(["square", "soft", "rounded", "pill"]);
2319
+ var shadow = z17.object({
2320
+ elevation: z17.enum(["none", "low", "medium", "high"]),
2321
+ softness: z17.enum(["crisp", "soft", "hard"]).nullable(),
2322
+ position: z17.enum(["bottom", "bottom-right"]).default("bottom")
2076
2323
  });
2077
- var border = z16.object({
2078
- width: z16.enum(["none", "hairline", "thin", "thick"]),
2079
- style: z16.enum(["solid", "dashed"])
2324
+ var border = z17.object({
2325
+ width: z17.enum(["none", "hairline", "thin", "thick"]),
2326
+ style: z17.enum(["solid", "dashed"])
2080
2327
  });
2081
- var motion = z16.object({
2082
- level: z16.enum(["off", "low", "medium", "high"]),
2083
- easing: z16.enum(["standard", "snappy", "gentle"]).nullable()
2328
+ var motion = z17.object({
2329
+ level: z17.enum(["off", "low", "medium", "high"]),
2330
+ easing: z17.enum(["standard", "snappy", "gentle"]).nullable()
2084
2331
  });
2085
- var buttonStyle = z16.object({
2332
+ var buttonStyle = z17.object({
2086
2333
  shape: corners
2087
2334
  // Used for --radius-control CSS variable
2088
2335
  });
2089
- var cardStyle = z16.object({
2090
- elevation: z16.enum(["none", "low", "medium", "high"]),
2091
- border: z16.enum(["none", "subtle", "defined"]),
2336
+ var cardStyle = z17.object({
2337
+ elevation: z17.enum(["none", "low", "medium", "high"]),
2338
+ border: z17.enum(["none", "subtle", "defined"]),
2092
2339
  shape: corners,
2093
- headerStyle: z16.enum(["plain", "accentBar", "subtleBg"]).nullable(),
2094
- mediaTreatment: z16.enum(["square", "rounded", "bleed"]).nullable()
2340
+ headerStyle: z17.enum(["plain", "accentBar", "subtleBg"]).nullable(),
2341
+ mediaTreatment: z17.enum(["square", "rounded", "bleed"]).nullable()
2095
2342
  });
2096
- var inputStyle = z16.object({
2343
+ var inputStyle = z17.object({
2097
2344
  shape: corners,
2098
- border: z16.enum(["subtle", "defined", "underline"]),
2099
- focus: z16.enum(["glow", "ring", "underline"]),
2100
- label: z16.enum(["inside", "above"])
2345
+ border: z17.enum(["subtle", "defined", "underline"]),
2346
+ focus: z17.enum(["glow", "ring", "underline"]),
2347
+ label: z17.enum(["inside", "above"])
2101
2348
  });
2102
- var headerVariant = z16.enum(["classic", "centered", "transparent", "floating"]);
2103
- var headerPositioning = z16.enum(["static", "sticky", "fixed"]);
2104
- var headerNavStyle = z16.enum([
2349
+ var headerVariant = z17.enum(["classic", "centered", "transparent", "floating"]);
2350
+ var headerPositioning = z17.enum(["static", "sticky", "fixed"]);
2351
+ var headerNavStyle = z17.enum([
2105
2352
  "minimal",
2106
2353
  "underline",
2107
2354
  "underline-grow",
@@ -2110,54 +2357,57 @@ var headerNavStyle = z16.enum([
2110
2357
  "frosted",
2111
2358
  "solid"
2112
2359
  ]);
2113
- var navFontWeight = z16.enum(["regular", "medium", "semibold", "bold"]);
2114
- var headerMaxWidth = z16.enum(["container", "full"]);
2115
- var headerContainerSchema = z16.object({
2116
- rounded: z16.enum(["none", "sm", "md", "lg", "xl", "2xl"]).default("xl"),
2117
- border: z16.boolean().default(true),
2118
- shadow: z16.boolean().default(true),
2119
- padding: z16.enum(["sm", "md", "lg"]).default("md"),
2120
- tint: z16.string().nullable().optional(),
2121
- opacity: z16.number().min(0).max(1).default(0.12)
2360
+ var navFontWeight = z17.enum(["regular", "medium", "semibold", "bold"]);
2361
+ var headerMaxWidth = z17.enum(["container", "full"]);
2362
+ var headerContainerSchema = z17.object({
2363
+ rounded: z17.enum(["none", "sm", "md", "lg", "xl", "2xl"]).default("xl"),
2364
+ border: z17.boolean().default(true),
2365
+ shadow: z17.boolean().default(true),
2366
+ padding: z17.enum(["sm", "md", "lg"]).default("md"),
2367
+ tint: z17.string().nullable().optional(),
2368
+ opacity: z17.number().min(0).max(1).default(0.12)
2122
2369
  }).optional();
2123
2370
  var headerBorderSchema = componentBorderSchema.extend({
2124
- position: z16.enum(["bottom", "top", "both", "none"]).default("bottom")
2371
+ position: z17.enum(["bottom", "top", "both", "none"]).default("bottom")
2125
2372
  }).optional();
2126
- var logoStyleSchema = z16.object({
2127
- fontFamily: z16.enum(["heading", "body"]).default("heading"),
2128
- letterSpacing: z16.enum(["normal", "wide", "wider", "widest"]).default("normal"),
2129
- gradient: z16.boolean().default(false)
2373
+ var logoStyleSchema = z17.object({
2374
+ fontFamily: z17.enum(["heading", "body"]).default("heading"),
2375
+ letterSpacing: z17.enum(["normal", "wide", "wider", "widest"]).default("normal"),
2376
+ gradient: z17.boolean().default(false),
2377
+ brandDisplay: z17.enum(brandDisplayModeValues).optional(),
2378
+ size: z17.enum(logoSizePolicyValues).optional(),
2379
+ accommodation: z17.enum(logoAccommodationPatternValues).optional()
2130
2380
  }).optional();
2131
- var headerLogoTextSchema = z16.object({
2132
- mobileWrapLines: z16.union([z16.literal(1), z16.literal(2)]).optional(),
2133
- mobileMaxWidth: z16.enum(["xs", "sm", "md"]).optional(),
2134
- hideOnShrink: z16.boolean().optional()
2381
+ var headerLogoTextSchema = z17.object({
2382
+ mobileWrapLines: z17.union([z17.literal(1), z17.literal(2)]).optional(),
2383
+ mobileMaxWidth: z17.enum(["xs", "sm", "md"]).optional(),
2384
+ hideOnShrink: z17.boolean().optional()
2135
2385
  }).optional();
2136
- var navEffectsSchema = z16.object({
2137
- underlineGradient: z16.boolean().default(false),
2138
- glow: z16.boolean().default(false),
2139
- glowColor: z16.string().optional(),
2140
- neumorphic: z16.boolean().default(false)
2386
+ var navEffectsSchema = z17.object({
2387
+ underlineGradient: z17.boolean().default(false),
2388
+ glow: z17.boolean().default(false),
2389
+ glowColor: z17.string().optional(),
2390
+ neumorphic: z17.boolean().default(false)
2141
2391
  }).optional();
2142
- var dropdownStyleSchema = z16.object({
2392
+ var dropdownStyleSchema = z17.object({
2143
2393
  // Container styling
2144
2394
  background: themeColorTokenSchema.default("surface"),
2145
2395
  textColor: themeColorTokenSchema.default("text"),
2146
2396
  borderColor: themeColorTokenSchema.nullable().default("border"),
2147
- shadow: z16.enum(["none", "sm", "md", "lg"]).default("md"),
2148
- borderRadius: z16.enum(["none", "sm", "md", "lg"]).default("md"),
2397
+ shadow: z17.enum(["none", "sm", "md", "lg"]).default("md"),
2398
+ borderRadius: z17.enum(["none", "sm", "md", "lg"]).default("md"),
2149
2399
  // Link hover states (explicit control)
2150
2400
  hoverBackground: themeColorTokenSchema.nullable().optional(),
2151
2401
  hoverTextColor: themeColorTokenSchema.nullable().optional(),
2152
2402
  // Typography
2153
- textTransform: z16.enum(["none", "uppercase", "capitalize"]).default("none"),
2154
- letterSpacing: z16.enum(["normal", "wide", "wider"]).default("normal"),
2155
- fontWeight: z16.enum(["regular", "medium", "semibold", "bold"]).optional(),
2403
+ textTransform: z17.enum(["none", "uppercase", "capitalize"]).default("none"),
2404
+ letterSpacing: z17.enum(["normal", "wide", "wider"]).default("normal"),
2405
+ fontWeight: z17.enum(["regular", "medium", "semibold", "bold"]).optional(),
2156
2406
  // optional = inherit from navWeight
2157
- textSize: z16.enum(["xs", "sm", "base", "lg"]).optional()
2407
+ textSize: z17.enum(["xs", "sm", "base", "lg"]).optional()
2158
2408
  // optional = no override (browser default)
2159
2409
  }).optional();
2160
- var headerCtaGapSchema = z16.enum([
2410
+ var headerCtaGapSchema = z17.enum([
2161
2411
  "none",
2162
2412
  "tight",
2163
2413
  "compact",
@@ -2165,7 +2415,7 @@ var headerCtaGapSchema = z16.enum([
2165
2415
  "relaxed",
2166
2416
  "spacious"
2167
2417
  ]);
2168
- var headerCtaTreatmentSchema = z16.enum([
2418
+ var headerCtaTreatmentSchema = z17.enum([
2169
2419
  "default",
2170
2420
  "primary",
2171
2421
  "secondary",
@@ -2173,22 +2423,22 @@ var headerCtaTreatmentSchema = z16.enum([
2173
2423
  "outline",
2174
2424
  "ghost"
2175
2425
  ]);
2176
- var navContainerSchema = z16.object({
2177
- type: z16.enum(["none", "pill", "glass"]).default("none"),
2178
- tint: z16.string().nullable().optional(),
2179
- opacity: z16.number().min(0).max(1).default(0.15)
2426
+ var navContainerSchema = z17.object({
2427
+ type: z17.enum(["none", "pill", "glass"]).default("none"),
2428
+ tint: z17.string().nullable().optional(),
2429
+ opacity: z17.number().min(0).max(1).default(0.15)
2180
2430
  }).default({ type: "none", tint: null, opacity: 0.15 });
2181
- var headerBackgroundSchema = z16.object({
2182
- type: z16.enum(["color", "gradient", "image"]),
2431
+ var headerBackgroundSchema = z17.object({
2432
+ type: z17.enum(["color", "gradient", "image"]),
2183
2433
  color: tokenOrCssColorValueSchema.nullable().optional(),
2184
2434
  gradient: gradientConfigSchema.nullable().optional(),
2185
2435
  image: mediaSchema.nullable().optional(),
2186
2436
  textColor: tokenOrCssColorValueSchema.nullable().optional()
2187
2437
  });
2188
- var headerSchema = z16.object({
2438
+ var headerSchema = z17.object({
2189
2439
  variant: headerVariant,
2190
2440
  positioning: headerPositioning,
2191
- shrinkOnScroll: z16.boolean(),
2441
+ shrinkOnScroll: z17.boolean(),
2192
2442
  maxWidth: headerMaxWidth,
2193
2443
  logoOverride: mediaSchema.nullable().optional(),
2194
2444
  background: headerBackgroundSchema.default({
@@ -2218,16 +2468,16 @@ var headerSchema = z16.object({
2218
2468
  // Optional theme-level CTA variant for header/nav CTA buttons.
2219
2469
  // Internal runtime bridge for the block renderer; prefer ctaTreatment in
2220
2470
  // authored Theme V2 concepts.
2221
- ctaVariant: z16.string().min(1).optional(),
2471
+ ctaVariant: z17.string().min(1).optional(),
2222
2472
  // Dropdown menu styling (nav dropdowns and mobile drawer)
2223
2473
  dropdownStyle: dropdownStyleSchema
2224
2474
  });
2225
- var footerVariant = z16.enum(["simple", "columns", "split"]);
2226
- var footerMaxWidth = z16.enum(["container", "full"]);
2227
- var footerMode = z16.enum(["default", "blocks", "default+blocks", "none"]);
2228
- var footerNavLayoutMode = z16.enum(["stack", "inline", "inline-wrap"]);
2229
- var footerNavLayoutAlign = z16.enum(["start", "center", "end", "space-between"]);
2230
- var footerSpacing = z16.enum([
2475
+ var footerVariant = z17.enum(["simple", "columns", "split"]);
2476
+ var footerMaxWidth = z17.enum(["container", "full"]);
2477
+ var footerMode = z17.enum(["default", "blocks", "default+blocks", "none"]);
2478
+ var footerNavLayoutMode = z17.enum(["stack", "inline", "inline-wrap"]);
2479
+ var footerNavLayoutAlign = z17.enum(["start", "center", "end", "space-between"]);
2480
+ var footerSpacing = z17.enum([
2231
2481
  "none",
2232
2482
  "tight",
2233
2483
  "compact",
@@ -2235,44 +2485,44 @@ var footerSpacing = z16.enum([
2235
2485
  "relaxed",
2236
2486
  "spacious"
2237
2487
  ]);
2238
- var footerLogoPlacement = z16.enum(["left", "right", "above", "below"]);
2239
- var footerLogoSize = z16.enum(["sm", "md", "lg", "xl"]);
2240
- var footerLogoMaxHeight = z16.enum(["sm", "md", "lg", "xl"]);
2241
- var footerBottomTextLinkStyleSchema = z16.object({
2488
+ var footerLogoPlacement = z17.enum(["left", "right", "above", "below"]);
2489
+ var footerLogoSize = z17.enum(["sm", "md", "lg", "xl"]);
2490
+ var footerLogoMaxHeight = z17.enum(["sm", "md", "lg", "xl"]);
2491
+ var footerBottomTextLinkStyleSchema = z17.object({
2242
2492
  colorToken: themeColorTokenSchema.optional(),
2243
2493
  hoverColorToken: themeColorTokenSchema.nullable().optional(),
2244
2494
  decorationColorToken: themeColorTokenSchema.nullable().optional(),
2245
- underline: z16.boolean().optional()
2495
+ underline: z17.boolean().optional()
2246
2496
  });
2247
- var footerBottomBarSchema = z16.object({
2248
- enabled: z16.boolean().optional(),
2249
- fullBleed: z16.boolean().optional(),
2497
+ var footerBottomBarSchema = z17.object({
2498
+ enabled: z17.boolean().optional(),
2499
+ fullBleed: z17.boolean().optional(),
2250
2500
  background: headerBackgroundSchema.optional(),
2251
2501
  textColor: themeColorTokenSchema.nullable().optional(),
2252
- textAlign: z16.enum(["left", "center", "right"]).optional(),
2502
+ textAlign: z17.enum(["left", "center", "right"]).optional(),
2253
2503
  paddingY: footerSpacing.optional(),
2254
2504
  paddingX: footerSpacing.optional(),
2255
- borderTop: z16.object({
2505
+ borderTop: z17.object({
2256
2506
  colorToken: themeColorTokenSchema.nullable().optional(),
2257
- width: z16.enum(["none", "thin", "medium", "thick"]).optional()
2507
+ width: z17.enum(["none", "thin", "medium", "thick"]).optional()
2258
2508
  }).optional()
2259
2509
  });
2260
- var footerNavLayoutSchema = z16.object({
2510
+ var footerNavLayoutSchema = z17.object({
2261
2511
  layout: footerNavLayoutMode.optional(),
2262
2512
  align: footerNavLayoutAlign.optional(),
2263
2513
  gapX: footerSpacing.optional(),
2264
2514
  gapY: footerSpacing.optional(),
2265
- columns: z16.number().int().min(1).max(6).optional()
2515
+ columns: z17.number().int().min(1).max(6).optional()
2266
2516
  });
2267
- var footerLogoSchema = z16.object({
2268
- showLogo: z16.boolean().default(true),
2269
- showLogoText: z16.boolean().optional(),
2517
+ var footerLogoSchema = z17.object({
2518
+ showLogo: z17.boolean().default(true),
2519
+ showLogoText: z17.boolean().optional(),
2270
2520
  placement: footerLogoPlacement.optional(),
2271
2521
  size: footerLogoSize.optional(),
2272
2522
  maxHeight: footerLogoMaxHeight.optional(),
2273
- align: z16.enum(["start", "center", "end"]).optional()
2523
+ align: z17.enum(["start", "center", "end"]).optional()
2274
2524
  });
2275
- var footerSchema = z16.object({
2525
+ var footerSchema = z17.object({
2276
2526
  /**
2277
2527
  * SDK-only footer rendering mode.
2278
2528
  *
@@ -2281,7 +2531,7 @@ var footerSchema = z16.object({
2281
2531
  mode: footerMode.optional(),
2282
2532
  variant: footerVariant,
2283
2533
  maxWidth: footerMaxWidth,
2284
- showLogoText: z16.boolean().optional(),
2534
+ showLogoText: z17.boolean().optional(),
2285
2535
  background: headerBackgroundSchema.default({
2286
2536
  type: "color",
2287
2537
  color: "surface"
@@ -2299,20 +2549,20 @@ var footerSchema = z16.object({
2299
2549
  logo: footerLogoSchema.optional(),
2300
2550
  bottomBar: footerBottomBarSchema.optional()
2301
2551
  });
2302
- var containerPaddingPresetSchema = z16.enum([
2552
+ var containerPaddingPresetSchema = z17.enum([
2303
2553
  "tight",
2304
2554
  "compact",
2305
2555
  "default",
2306
2556
  "relaxed"
2307
2557
  ]);
2308
- var layoutSchema = z16.object({
2309
- containerPadding: z16.object({
2558
+ var layoutSchema = z17.object({
2559
+ containerPadding: z17.object({
2310
2560
  mobile: containerPaddingPresetSchema.optional(),
2311
2561
  tablet: containerPaddingPresetSchema.optional(),
2312
2562
  desktop: containerPaddingPresetSchema.optional()
2313
2563
  }).optional()
2314
2564
  }).optional();
2315
- var heroTypographySizeSchema = z16.enum([
2565
+ var heroTypographySizeSchema = z17.enum([
2316
2566
  "sm",
2317
2567
  "base",
2318
2568
  "lg",
@@ -2324,19 +2574,19 @@ var heroTypographySizeSchema = z16.enum([
2324
2574
  "6xl",
2325
2575
  "editorial"
2326
2576
  ]);
2327
- var heroTypographyLineHeightSchema = z16.enum([
2577
+ var heroTypographyLineHeightSchema = z17.enum([
2328
2578
  "tight",
2329
2579
  "snug",
2330
2580
  "normal",
2331
2581
  "relaxed"
2332
2582
  ]);
2333
- var heroResponsiveTypographySchema = z16.object({
2583
+ var heroResponsiveTypographySchema = z17.object({
2334
2584
  headlineSize: heroTypographySizeSchema.optional(),
2335
2585
  headlineLineHeight: heroTypographyLineHeightSchema.optional(),
2336
2586
  subheadlineSize: heroTypographySizeSchema.optional(),
2337
2587
  subheadlineLineHeight: heroTypographyLineHeightSchema.optional()
2338
2588
  });
2339
- var heroTypographySchema = z16.object({
2589
+ var heroTypographySchema = z17.object({
2340
2590
  headlineSize: heroTypographySizeSchema.optional(),
2341
2591
  headlineLineHeight: heroTypographyLineHeightSchema.optional(),
2342
2592
  subheadlineSize: heroTypographySizeSchema.optional(),
@@ -2345,31 +2595,38 @@ var heroTypographySchema = z16.object({
2345
2595
  microHeadlineLineHeight: heroTypographyLineHeightSchema.optional(),
2346
2596
  microSubheadlineSize: heroTypographySizeSchema.optional(),
2347
2597
  microSubheadlineLineHeight: heroTypographyLineHeightSchema.optional(),
2348
- responsive: z16.object({
2598
+ responsive: z17.object({
2349
2599
  tablet: heroResponsiveTypographySchema.optional(),
2350
2600
  mobile: heroResponsiveTypographySchema.optional()
2351
2601
  }).optional()
2352
2602
  });
2353
- var heroSchema = z16.object({
2603
+ var heroSchema = z17.object({
2354
2604
  typography: heroTypographySchema.optional()
2355
2605
  }).optional();
2356
- var bodyTextIntroTypographySizeSchema = z16.enum(["default", "editorial"]);
2357
- var bodyTextSchema = z16.object({
2358
- intro: z16.object({
2606
+ var bodyTextIntroTypographySizeSchema = z17.enum(["default", "editorial"]);
2607
+ var bodyTextSchema = z17.object({
2608
+ intro: z17.object({
2359
2609
  paragraphSize: bodyTextIntroTypographySizeSchema.optional(),
2360
2610
  headingSize: bodyTextIntroTypographySizeSchema.optional()
2361
2611
  }).optional()
2362
2612
  }).optional();
2363
- var gradientsSchema = z16.object({
2364
- button: z16.string().min(1).nullable().optional(),
2365
- hero: z16.string().min(1).nullable().optional(),
2366
- background: z16.string().min(1).nullable().optional()
2613
+ var gradientsSchema = z17.object({
2614
+ button: z17.string().min(1).nullable().optional(),
2615
+ hero: z17.string().min(1).nullable().optional(),
2616
+ background: z17.string().min(1).nullable().optional()
2617
+ });
2618
+ var testimonialQuoteTreatmentSchema = z17.object({
2619
+ style: z17.enum(["serif-display", "accent-glyph", "none"]),
2620
+ fontFamily: z17.enum(["heading", "body"]).optional(),
2621
+ scale: z17.enum(["sm", "md", "lg", "xl"]).optional(),
2622
+ colorToken: themeColorTokenSchema.optional(),
2623
+ opacity: z17.number().min(0).max(1).optional()
2367
2624
  });
2368
- var themeSchema = z16.object({
2369
- name: z16.string().min(1).max(30),
2370
- description: z16.string().min(1).max(400),
2371
- rationale: z16.string().min(1).max(400),
2372
- siteStyleId: z16.string().min(1).transform((value) => asSiteStyleId(value)).optional(),
2625
+ var themeSchema = z17.object({
2626
+ name: z17.string().min(1).max(30),
2627
+ description: z17.string().min(1).max(400),
2628
+ rationale: z17.string().min(1).max(400),
2629
+ siteStyleId: z17.string().min(1).transform((value) => asSiteStyleId(value)).optional(),
2373
2630
  axes: axesSchema,
2374
2631
  palette: paletteSchema,
2375
2632
  typography: typographySchema,
@@ -2390,6 +2647,8 @@ var themeSchema = z16.object({
2390
2647
  // Card variant system (optional for backwards compatibility)
2391
2648
  accordions: accordionSystemSchema.optional(),
2392
2649
  // Accordion system (optional - generated if not provided)
2650
+ testimonialQuote: testimonialQuoteTreatmentSchema.optional(),
2651
+ // Testimonial quote-mark treatment (site-style-owned)
2393
2652
  inputs: inputSystemSchema.optional(),
2394
2653
  // Input system (optional - generated if not provided)
2395
2654
  inputStyle: inputStyle.optional(),
@@ -2397,15 +2656,19 @@ var themeSchema = z16.object({
2397
2656
  // Block-specific customization (Tier 3)
2398
2657
  // blockCustomVars: Per-block CSS variable overrides as bare values
2399
2658
  // Example: { "event-registration": { "--step-color": "#6d28d9" } }
2400
- blockCustomVars: z16.record(
2401
- z16.string(),
2659
+ blockCustomVars: z17.record(
2660
+ z17.string(),
2402
2661
  // block kind (matches data-block attribute)
2403
- z16.record(z16.string(), z16.string())
2662
+ z17.record(z17.string(), z17.string())
2404
2663
  // { '--var-name': 'value' }
2405
2664
  ).optional(),
2406
2665
  // Structured block-kind theme overrides (v1: typography prose-link style only)
2407
2666
  // Keyed by block kind (usually data-block value like "hero"; "block.hero" also accepted)
2408
- blockOverrides: z16.record(z16.string(), blockThemeOverrideSchema).optional(),
2667
+ blockOverrides: z17.record(z17.string(), blockThemeOverrideSchema).optional(),
2668
+ // Site-wide heading decoration signature (family + colour). Set once per Look
2669
+ // and projected transiently onto eligible block headings at render time.
2670
+ // Alignment is inherited from the heading, so no placement is stored.
2671
+ headingDecoration: headingDecorationSchema.optional(),
2409
2672
  // Structured custom CSS rules
2410
2673
  // Validated, scoped, and safe by construction - no @import, remote url(), or global selectors
2411
2674
  customCssRules: customCssRulesSchema,
@@ -2439,11 +2702,11 @@ var themeSchema = z16.object({
2439
2702
  * }
2440
2703
  * ```
2441
2704
  */
2442
- styleGroups: z16.record(z16.string(), z16.array(z16.string())).optional()
2705
+ styleGroups: z17.record(z17.string(), z17.array(z17.string())).optional()
2443
2706
  });
2444
- var themesTurnSchema = z16.object({
2445
- message: z16.string().min(1),
2446
- themes: z16.array(themeSchema).length(3)
2707
+ var themesTurnSchema = z17.object({
2708
+ message: z17.string().min(1),
2709
+ themes: z17.array(themeSchema).length(3)
2447
2710
  });
2448
2711
 
2449
2712
  // ../theme-core/src/fonts/uploadFormat.ts
@@ -2511,26 +2774,26 @@ function generateShadowCssVars(theme) {
2511
2774
  }
2512
2775
 
2513
2776
  // ../theme-core/src/palette/variants/types.ts
2514
- import { z as z17 } from "zod";
2777
+ import { z as z18 } from "zod";
2515
2778
  function asPaletteVariantId(value) {
2516
2779
  if (value.length === 0) {
2517
2780
  throw new Error("PaletteVariantId must be a non-empty string");
2518
2781
  }
2519
2782
  return value;
2520
2783
  }
2521
- var paletteVariantIdSchema = z17.string().min(1).transform((value) => asPaletteVariantId(value));
2784
+ var paletteVariantIdSchema = z18.string().min(1).transform((value) => asPaletteVariantId(value));
2522
2785
  var HEX_COLOR_REGEX = /^#[0-9a-f]{6}$/;
2523
- var hexColorSchema = z17.string().regex(HEX_COLOR_REGEX, "Hex must be #RRGGBB (lowercase)").transform((value) => value);
2786
+ var hexColorSchema = z18.string().regex(HEX_COLOR_REGEX, "Hex must be #RRGGBB (lowercase)").transform((value) => value);
2524
2787
  var variantPaletteColorSchema = paletteColorSchema.extend({
2525
2788
  name: paletteTokenNameSchema
2526
2789
  });
2527
- var paletteVariantSchema = z17.object({
2790
+ var paletteVariantSchema = z18.object({
2528
2791
  id: paletteVariantIdSchema,
2529
- name: z17.string().min(1),
2530
- description: z17.string().min(1),
2792
+ name: z18.string().min(1),
2793
+ description: z18.string().min(1),
2531
2794
  tags: styleTagsSchema,
2532
- mode: z17.enum(["light", "dark"]),
2533
- colors: z17.array(variantPaletteColorSchema).min(1)
2795
+ mode: z18.enum(["light", "dark"]),
2796
+ colors: z18.array(variantPaletteColorSchema).min(1)
2534
2797
  });
2535
2798
  function definePaletteVariant(input) {
2536
2799
  return {
@@ -2542,7 +2805,7 @@ function definePaletteVariant(input) {
2542
2805
  colors: input.colors
2543
2806
  };
2544
2807
  }
2545
- var paletteOverridesSchema = z17.object({
2808
+ var paletteOverridesSchema = z18.object({
2546
2809
  primary: hexColorSchema.optional(),
2547
2810
  primaryForeground: hexColorSchema.optional(),
2548
2811
  secondary: hexColorSchema.optional(),
@@ -2783,6 +3046,28 @@ var softNaturalWatercolor = definePaletteVariant({
2783
3046
  { name: "border", hex: "#d8c9a8" }
2784
3047
  ]
2785
3048
  });
3049
+ var softNaturalLilac = definePaletteVariant({
3050
+ id: "soft-natural-lilac",
3051
+ name: "Soft Natural \u2014 Lilac",
3052
+ description: "Watercolour periwinkle-lilac primary with warm ivory grounds and a sage accent.",
3053
+ tags: { tone: "classic", energy: "calm", era: "organic" },
3054
+ mode: "light",
3055
+ colors: [
3056
+ { name: "primary", hex: "#5c68a8" },
3057
+ { name: "secondary", hex: "#8189ad" },
3058
+ { name: "accent", hex: "#75835a" },
3059
+ { name: "success", hex: "#5f7d62" },
3060
+ { name: "warning", hex: "#a8884f" },
3061
+ { name: "destructive", hex: "#a3503e" },
3062
+ { name: "background", hex: "#faf9f6" },
3063
+ { name: "surface", hex: "#ffffff" },
3064
+ { name: "surfaceAlt", hex: "#f1f0f7" },
3065
+ { name: "muted", hex: "#e9e8f2" },
3066
+ { name: "text", hex: "#262633" },
3067
+ { name: "primaryForeground", hex: "#ffffff" },
3068
+ { name: "border", hex: "#d6d5e3" }
3069
+ ]
3070
+ });
2786
3071
 
2787
3072
  // ../theme-core/src/palette/variants/warm-neutral.ts
2788
3073
  var warmNeutralClay = definePaletteVariant({
@@ -2893,13 +3178,190 @@ var paletteVariants = [
2893
3178
  // Soft-natural family
2894
3179
  softNaturalSage,
2895
3180
  softNaturalStone,
2896
- softNaturalWatercolor
3181
+ softNaturalWatercolor,
3182
+ softNaturalLilac
2897
3183
  ];
2898
3184
  var paletteVariantsById = new Map(
2899
3185
  paletteVariants.map((v) => [v.id, v])
2900
3186
  );
2901
3187
 
2902
3188
  // ../theme-core/src/accordions/siteStyleDefaults.ts
3189
+ var editorialDividedAccordionSystem = {
3190
+ background: null,
3191
+ spacing: "comfortable",
3192
+ corners: "square",
3193
+ border: null,
3194
+ shadow: null,
3195
+ icon: {
3196
+ style: "plus-minus",
3197
+ position: "right",
3198
+ size: "md",
3199
+ colorToken: "primary"
3200
+ },
3201
+ trigger: {
3202
+ textColorToken: "text",
3203
+ fontWeight: "regular",
3204
+ fontFamily: "heading",
3205
+ fontScale: "lg"
3206
+ },
3207
+ hover: {
3208
+ textColorToken: "primary"
3209
+ },
3210
+ openState: {
3211
+ backgroundColorToken: "surfaceAlt",
3212
+ triggerColorToken: "primary",
3213
+ accent: {
3214
+ edge: "left",
3215
+ colorToken: "primary",
3216
+ thickness: "medium"
3217
+ }
3218
+ },
3219
+ content: {
3220
+ textColorToken: "neutral-700"
3221
+ }
3222
+ };
3223
+ var quietUnderlinedAccordionSystem = {
3224
+ background: null,
3225
+ spacing: "spacious",
3226
+ corners: "square",
3227
+ border: null,
3228
+ shadow: null,
3229
+ icon: {
3230
+ style: "chevron",
3231
+ position: "right",
3232
+ size: "sm",
3233
+ colorToken: "muted"
3234
+ },
3235
+ trigger: {
3236
+ textColorToken: "text",
3237
+ fontWeight: "regular",
3238
+ fontFamily: "heading",
3239
+ fontScale: "lg"
3240
+ },
3241
+ hover: {
3242
+ textColorToken: "primary"
3243
+ },
3244
+ openState: {
3245
+ triggerColorToken: "primary"
3246
+ },
3247
+ content: {
3248
+ textColorToken: "neutral-700"
3249
+ }
3250
+ };
3251
+ var calmPanelAccordionSystem = {
3252
+ background: {
3253
+ type: "solid",
3254
+ colorToken: "surface"
3255
+ },
3256
+ spacing: "comfortable",
3257
+ corners: "soft",
3258
+ border: {
3259
+ widthClass: "border",
3260
+ colorToken: "border"
3261
+ },
3262
+ shadow: {
3263
+ elevation: "low",
3264
+ softness: "soft",
3265
+ position: "bottom"
3266
+ },
3267
+ icon: {
3268
+ style: "chevron",
3269
+ position: "right",
3270
+ size: "md",
3271
+ colorToken: "primary"
3272
+ },
3273
+ trigger: {
3274
+ textColorToken: "text",
3275
+ fontWeight: "medium",
3276
+ fontFamily: "heading",
3277
+ fontScale: "md"
3278
+ },
3279
+ hover: {
3280
+ backgroundColorToken: "primary/5",
3281
+ textColorToken: "primary"
3282
+ },
3283
+ openState: {
3284
+ backgroundColorToken: "primary/5",
3285
+ triggerColorToken: "primary"
3286
+ },
3287
+ content: {
3288
+ textColorToken: "neutral-700"
3289
+ }
3290
+ };
3291
+ var boldBorderedAccordionSystem = {
3292
+ background: {
3293
+ type: "solid",
3294
+ colorToken: "surface"
3295
+ },
3296
+ spacing: "comfortable",
3297
+ corners: "soft",
3298
+ border: {
3299
+ widthClass: "border-2",
3300
+ colorToken: "border"
3301
+ },
3302
+ shadow: null,
3303
+ icon: {
3304
+ style: "plus-minus",
3305
+ position: "right",
3306
+ size: "lg",
3307
+ colorToken: "primary"
3308
+ },
3309
+ trigger: {
3310
+ textColorToken: "text",
3311
+ fontWeight: "bold",
3312
+ fontFamily: "heading",
3313
+ fontScale: "md"
3314
+ },
3315
+ hover: {
3316
+ backgroundColorToken: "primary/10",
3317
+ textColorToken: "primary"
3318
+ },
3319
+ openState: {
3320
+ backgroundColorToken: "primary/10",
3321
+ triggerColorToken: "primary",
3322
+ accent: {
3323
+ edge: "left",
3324
+ colorToken: "primary",
3325
+ thickness: "thick"
3326
+ }
3327
+ },
3328
+ content: {
3329
+ textColorToken: "neutral-700"
3330
+ }
3331
+ };
3332
+ var warmInsetAccordionSystem = {
3333
+ background: {
3334
+ type: "solid",
3335
+ colorToken: "surfaceAlt"
3336
+ },
3337
+ spacing: "comfortable",
3338
+ corners: "rounded",
3339
+ border: null,
3340
+ shadow: null,
3341
+ icon: {
3342
+ style: "circle-plus-minus",
3343
+ position: "right",
3344
+ size: "md",
3345
+ colorToken: "primary"
3346
+ },
3347
+ trigger: {
3348
+ textColorToken: "text",
3349
+ fontWeight: "semibold",
3350
+ fontFamily: "heading",
3351
+ fontScale: "md"
3352
+ },
3353
+ hover: {
3354
+ backgroundColorToken: "primary/5",
3355
+ textColorToken: "primary"
3356
+ },
3357
+ openState: {
3358
+ backgroundColorToken: "surface",
3359
+ triggerColorToken: "primary"
3360
+ },
3361
+ content: {
3362
+ textColorToken: "neutral-700"
3363
+ }
3364
+ };
2903
3365
  var softEarthAccordionSystem = {
2904
3366
  background: {
2905
3367
  type: "solid",
@@ -2917,16 +3379,96 @@ var softEarthAccordionSystem = {
2917
3379
  },
2918
3380
  trigger: {
2919
3381
  textColorToken: "text",
2920
- fontWeight: "medium"
3382
+ fontWeight: "medium",
3383
+ fontFamily: "heading",
3384
+ fontScale: "md"
2921
3385
  },
2922
3386
  hover: {
2923
3387
  textColorToken: "primary"
2924
3388
  },
3389
+ openState: {
3390
+ triggerColorToken: "primary"
3391
+ },
2925
3392
  content: {
2926
3393
  textColorToken: "neutral-700"
2927
3394
  }
2928
3395
  };
2929
3396
 
3397
+ // ../theme-core/src/cards/siteStyleDefaults.ts
3398
+ var southWestCardSystem = {
3399
+ variants: [
3400
+ {
3401
+ id: "default",
3402
+ name: "Default",
3403
+ enabled: true,
3404
+ priority: 1,
3405
+ background: { type: "solid", colorToken: "surface" },
3406
+ foregroundToken: "text",
3407
+ spacing: "comfortable",
3408
+ corners: "soft",
3409
+ shadow: { elevation: "low", softness: "soft", position: "bottom" }
3410
+ },
3411
+ {
3412
+ id: "alternative",
3413
+ name: "Statement",
3414
+ enabled: true,
3415
+ priority: 2,
3416
+ background: { type: "solid", colorToken: "primary-700" },
3417
+ foregroundToken: "primaryForeground",
3418
+ spacing: "comfortable",
3419
+ // No shadow on the variant itself: the elevation comes from the look's
3420
+ // 'raised' item surface (rb-shadow-md = var(--shadow-md)), reproducing the
3421
+ // legacy accent-quote card's shadow exactly.
3422
+ shadow: { elevation: "none", softness: null, position: "bottom" },
3423
+ accentEdge: { edge: "left", colorToken: "secondary", width: "heavy" },
3424
+ cornerRadii: {
3425
+ topLeft: "square",
3426
+ topRight: "expressive",
3427
+ bottomLeft: "square",
3428
+ bottomRight: "square"
3429
+ }
3430
+ }
3431
+ ]
3432
+ };
3433
+ var clarityZenCardSystem = {
3434
+ variants: [
3435
+ {
3436
+ id: "default",
3437
+ name: "Default",
3438
+ enabled: true,
3439
+ priority: 1,
3440
+ background: { type: "solid", colorToken: "surface" },
3441
+ // A filled card establishes its own text colour so it stays legible on a
3442
+ // coloured section band (which sets a contrasting section-text colour).
3443
+ foregroundToken: "text",
3444
+ spacing: "comfortable",
3445
+ corners: "rounded",
3446
+ shadow: { elevation: "low", softness: "soft", position: "bottom" }
3447
+ },
3448
+ {
3449
+ id: "alternative",
3450
+ name: "Statement",
3451
+ enabled: true,
3452
+ priority: 2,
3453
+ // Themed surfaceAlt tint + a touch more elevation so an emphasised
3454
+ // section reads as a deliberate "statement" against the default card.
3455
+ background: { type: "solid", colorToken: "surfaceAlt" },
3456
+ foregroundToken: "text",
3457
+ spacing: "comfortable",
3458
+ corners: "rounded",
3459
+ shadow: { elevation: "medium", softness: "soft", position: "bottom" }
3460
+ }
3461
+ ]
3462
+ };
3463
+
3464
+ // ../theme-core/src/site-styles/testimonialQuotePresets.ts
3465
+ var serifDisplayQuote = {
3466
+ style: "serif-display"
3467
+ };
3468
+ var accentGlyphQuote = {
3469
+ style: "accent-glyph"
3470
+ };
3471
+
2930
3472
  // ../theme-core/src/site-styles/headerCtaVariants.ts
2931
3473
  function hasButtonVariant(theme, variantId) {
2932
3474
  return theme.buttons?.variants.some((variant) => variant.enabled && variant.id === variantId) ?? false;
@@ -2961,6 +3503,89 @@ function asHeaderLayoutId(value) {
2961
3503
  function asHeaderStyleId(value) {
2962
3504
  return value;
2963
3505
  }
3506
+ var titleOnlyLogoAccommodation = {
3507
+ pattern: "title-only",
3508
+ supportedShapes: ["none", "horizontal", "square", "portrait", "tall"],
3509
+ supportedTextPresence: ["contains-text", "no-text", "unknown"],
3510
+ supportedDisplayModes: ["title-only"],
3511
+ size: "compact"
3512
+ };
3513
+ var inlineWordmarkLogoAccommodation = {
3514
+ pattern: "inline-wordmark",
3515
+ supportedShapes: ["horizontal"],
3516
+ supportedTextPresence: ["contains-text", "no-text", "unknown"],
3517
+ supportedDisplayModes: ["logo-only"],
3518
+ size: "standard",
3519
+ maxDensity: "detailed"
3520
+ };
3521
+ var inlineMarkWithTitleLogoAccommodation = {
3522
+ pattern: "inline-mark-with-title",
3523
+ supportedShapes: ["horizontal", "square", "portrait", "tall"],
3524
+ supportedTextPresence: ["no-text"],
3525
+ supportedDisplayModes: ["logo-plus-title"],
3526
+ size: "compact",
3527
+ maxDensity: "simple"
3528
+ };
3529
+ var logoPlateAccommodation = {
3530
+ pattern: "logo-plate",
3531
+ supportedShapes: ["square", "portrait", "tall"],
3532
+ supportedTextPresence: ["contains-text", "unknown"],
3533
+ supportedDisplayModes: ["logo-only"],
3534
+ size: "display",
3535
+ providesBacking: true
3536
+ };
3537
+ var centeredBadgeAccommodation = {
3538
+ pattern: "centered-badge",
3539
+ supportedShapes: ["square", "portrait", "tall"],
3540
+ supportedTextPresence: ["contains-text", "unknown"],
3541
+ supportedDisplayModes: ["logo-only"],
3542
+ size: "display",
3543
+ providesBacking: true
3544
+ };
3545
+ var popoutBadgeAccommodation = {
3546
+ pattern: "popout-badge",
3547
+ supportedShapes: ["square", "portrait", "tall"],
3548
+ supportedTextPresence: ["contains-text", "unknown"],
3549
+ supportedDisplayModes: ["logo-only"],
3550
+ size: "display",
3551
+ providesBacking: true
3552
+ };
3553
+ var centeredMastheadAccommodation = {
3554
+ pattern: "centered-masthead",
3555
+ supportedShapes: ["square", "portrait", "tall"],
3556
+ supportedTextPresence: ["contains-text", "unknown"],
3557
+ supportedDisplayModes: ["logo-only"],
3558
+ size: "display",
3559
+ providesBacking: true
3560
+ };
3561
+ var unbackedOverlayLogoAccommodation = {
3562
+ pattern: "inline-logo-only",
3563
+ supportedShapes: ["square"],
3564
+ supportedTextPresence: ["contains-text", "unknown"],
3565
+ supportedDisplayModes: ["logo-only"],
3566
+ size: "compact",
3567
+ providesBacking: false
3568
+ };
3569
+ var inlineClassicLogoAccommodations = [
3570
+ titleOnlyLogoAccommodation,
3571
+ inlineWordmarkLogoAccommodation,
3572
+ inlineMarkWithTitleLogoAccommodation,
3573
+ popoutBadgeAccommodation,
3574
+ logoPlateAccommodation
3575
+ ];
3576
+ var centeredLogoAccommodations = [
3577
+ titleOnlyLogoAccommodation,
3578
+ inlineWordmarkLogoAccommodation,
3579
+ inlineMarkWithTitleLogoAccommodation,
3580
+ centeredMastheadAccommodation,
3581
+ centeredBadgeAccommodation
3582
+ ];
3583
+ var overlayLogoAccommodations = [
3584
+ titleOnlyLogoAccommodation,
3585
+ inlineWordmarkLogoAccommodation,
3586
+ inlineMarkWithTitleLogoAccommodation,
3587
+ unbackedOverlayLogoAccommodation
3588
+ ];
2964
3589
  function baseHeader(theme) {
2965
3590
  const {
2966
3591
  navLinkStyle: _navLinkStyle,
@@ -3630,6 +4255,7 @@ var headerLookCatalog = [
3630
4255
  behavior: "sticky"
3631
4256
  },
3632
4257
  openingRequirement: "none",
4258
+ logoAccommodations: inlineClassicLogoAccommodations,
3633
4259
  compile: cleanBaseHeader
3634
4260
  },
3635
4261
  {
@@ -3643,6 +4269,7 @@ var headerLookCatalog = [
3643
4269
  behavior: "sticky-shrink"
3644
4270
  },
3645
4271
  openingRequirement: "none",
4272
+ logoAccommodations: inlineClassicLogoAccommodations,
3646
4273
  compile: solidBrandHeader
3647
4274
  },
3648
4275
  {
@@ -3657,6 +4284,7 @@ var headerLookCatalog = [
3657
4284
  },
3658
4285
  openingRequirement: "none",
3659
4286
  maxRecommendedNavItems: 6,
4287
+ logoAccommodations: centeredLogoAccommodations,
3660
4288
  compile: serifLineHeader
3661
4289
  },
3662
4290
  {
@@ -3671,7 +4299,7 @@ var headerLookCatalog = [
3671
4299
  },
3672
4300
  openingRequirement: "none",
3673
4301
  maxRecommendedNavItems: 5,
3674
- allowedLogoShapes: ["none", "text-only", "horizontal", "square"],
4302
+ logoAccommodations: centeredLogoAccommodations,
3675
4303
  compile: centeredCalmHeader
3676
4304
  },
3677
4305
  {
@@ -3686,6 +4314,7 @@ var headerLookCatalog = [
3686
4314
  },
3687
4315
  openingRequirement: "none",
3688
4316
  requiresProminentCta: true,
4317
+ logoAccommodations: inlineClassicLogoAccommodations,
3689
4318
  compile: practicalUtilityHeader
3690
4319
  },
3691
4320
  {
@@ -3699,6 +4328,7 @@ var headerLookCatalog = [
3699
4328
  behavior: "normal-flow"
3700
4329
  },
3701
4330
  openingRequirement: "reserved-space-ok",
4331
+ logoAccommodations: inlineClassicLogoAccommodations,
3702
4332
  compile: minimalTransparentHeader
3703
4333
  },
3704
4334
  {
@@ -3713,7 +4343,7 @@ var headerLookCatalog = [
3713
4343
  },
3714
4344
  openingRequirement: "requires-image-hero-with-contrast-overlay",
3715
4345
  maxRecommendedNavItems: 5,
3716
- allowedLogoShapes: ["none", "text-only", "horizontal"],
4346
+ logoAccommodations: overlayLogoAccommodations,
3717
4347
  compile: transparentOverlayHeader
3718
4348
  },
3719
4349
  {
@@ -3728,7 +4358,7 @@ var headerLookCatalog = [
3728
4358
  },
3729
4359
  openingRequirement: "requires-image-hero-with-contrast-overlay",
3730
4360
  maxRecommendedNavItems: 5,
3731
- allowedLogoShapes: ["none", "text-only", "horizontal"],
4361
+ logoAccommodations: overlayLogoAccommodations,
3732
4362
  compile: floatingGlassHeader
3733
4363
  }
3734
4364
  ];
@@ -3809,12 +4439,110 @@ function brandTwoBandFooter(theme) {
3809
4439
  }
3810
4440
  };
3811
4441
  }
4442
+ function centeredCalmFooter(theme) {
4443
+ return {
4444
+ ...theme.footer,
4445
+ variant: "simple",
4446
+ maxWidth: "container",
4447
+ background: {
4448
+ type: "color",
4449
+ color: "surfaceAlt"
4450
+ },
4451
+ navStyle: "minimal",
4452
+ navWeight: "regular",
4453
+ navColor: "text",
4454
+ navLinkStyle: {
4455
+ typography: "body",
4456
+ fontWeight: "regular",
4457
+ textTransform: "none",
4458
+ italic: false,
4459
+ colorToken: "text",
4460
+ hoverColorToken: "primary",
4461
+ padding: "none",
4462
+ borderRadius: "none"
4463
+ },
4464
+ navLayout: {
4465
+ layout: "inline-wrap",
4466
+ align: "center",
4467
+ gapX: "relaxed",
4468
+ gapY: "tight"
4469
+ },
4470
+ logo: {
4471
+ showLogo: true,
4472
+ showLogoText: false,
4473
+ placement: "above",
4474
+ size: "sm",
4475
+ align: "center"
4476
+ },
4477
+ bottomBar: {
4478
+ enabled: true,
4479
+ fullBleed: false,
4480
+ textAlign: "center",
4481
+ paddingX: "default",
4482
+ paddingY: "compact",
4483
+ borderTop: {
4484
+ width: "thin"
4485
+ }
4486
+ }
4487
+ };
4488
+ }
4489
+ function editorialColumnsFooter(theme) {
4490
+ return {
4491
+ ...theme.footer,
4492
+ variant: "columns",
4493
+ maxWidth: "container",
4494
+ background: {
4495
+ type: "color",
4496
+ color: "surface"
4497
+ },
4498
+ navStyle: "minimal",
4499
+ navWeight: "regular",
4500
+ navColor: "text",
4501
+ navLinkStyle: {
4502
+ typography: "body",
4503
+ fontWeight: "regular",
4504
+ textTransform: "none",
4505
+ italic: false,
4506
+ colorToken: "text",
4507
+ hoverColorToken: "primary",
4508
+ padding: "none",
4509
+ borderRadius: "none"
4510
+ },
4511
+ logo: {
4512
+ showLogo: true,
4513
+ showLogoText: true,
4514
+ placement: "left",
4515
+ size: "sm",
4516
+ align: "start"
4517
+ },
4518
+ bottomBar: {
4519
+ enabled: true,
4520
+ fullBleed: false,
4521
+ textAlign: "center",
4522
+ paddingX: "default",
4523
+ paddingY: "compact",
4524
+ borderTop: {
4525
+ width: "thin"
4526
+ }
4527
+ }
4528
+ };
4529
+ }
3812
4530
  var footerLookCatalog = [
3813
4531
  {
3814
4532
  id: asFooterLookId("footer-muted-grounding"),
3815
4533
  label: "Muted grounding footer",
3816
4534
  compile: mutedGroundingFooter
3817
4535
  },
4536
+ {
4537
+ id: asFooterLookId("footer-centered-calm"),
4538
+ label: "Centered calm footer",
4539
+ compile: centeredCalmFooter
4540
+ },
4541
+ {
4542
+ id: asFooterLookId("footer-editorial-columns"),
4543
+ label: "Editorial columns footer",
4544
+ compile: editorialColumnsFooter
4545
+ },
3818
4546
  {
3819
4547
  id: asFooterLookId("site-footer-brand-two-band"),
3820
4548
  label: "Two-band brand footer",
@@ -3844,7 +4572,7 @@ var generatedDesignOptionCatalog = {
3844
4572
  source: "generated",
3845
4573
  sectionSurfaces: ["base", "muted-band", "accent-band", "brand-depth-band", "hero-image"],
3846
4574
  contentFrames: generatedContentFrames,
3847
- itemSurfaces: ["none", "default", "flat", "outlined", "raised"],
4575
+ itemSurfaces: ["none", "default", "flat", "outlined", "raised", "inset", "editorial"],
3848
4576
  transitions: ["none", "soft-fade-short", "soft-fade-long"],
3849
4577
  emphases: ["low", "medium", "high"],
3850
4578
  detachedCustom: false
@@ -3853,11 +4581,7 @@ var userDesignOptionCatalog = {
3853
4581
  source: "user",
3854
4582
  sectionSurfaces: generatedDesignOptionCatalog.sectionSurfaces,
3855
4583
  contentFrames: userContentFrames,
3856
- itemSurfaces: [
3857
- ...generatedDesignOptionCatalog.itemSurfaces,
3858
- "inset",
3859
- "editorial"
3860
- ],
4584
+ itemSurfaces: generatedDesignOptionCatalog.itemSurfaces,
3861
4585
  transitions: [
3862
4586
  ...generatedDesignOptionCatalog.transitions,
3863
4587
  "wave-edge",
@@ -4250,6 +4974,10 @@ function defineCuratedSiteStyle(input) {
4250
4974
  supportedItemSurfaces: generatedDesignOptionCatalog.itemSurfaces,
4251
4975
  supportedTransitions: generatedDesignOptionCatalog.transitions
4252
4976
  },
4977
+ // Decoration is opt-in per style so it stays a distinguishing feature, not
4978
+ // wallpaper. Styles that want a mark set `headingDecoration` explicitly;
4979
+ // clean/minimal styles default to none.
4980
+ headingDecoration: input.headingDecoration ?? noHeadingDecoration,
4253
4981
  ...input.themeOverrides ? { themeOverrides: input.themeOverrides } : {},
4254
4982
  ...input.defaultBlockVariants ? { defaultBlockVariants: input.defaultBlockVariants } : {},
4255
4983
  recommendedAppearancePresetIds: (input.recommendedAppearancePresetIds ?? []).map(asAppearancePresetId),
@@ -4436,6 +5164,11 @@ var curatedSiteStyles = [
4436
5164
  defineCuratedSiteStyle({
4437
5165
  id: "site-style:calm-studio",
4438
5166
  name: "Calm Studio",
5167
+ themeOverrides: {
5168
+ accordions: calmPanelAccordionSystem,
5169
+ testimonialQuote: serifDisplayQuote
5170
+ },
5171
+ headingDecoration: { family: "short-center-rule", colorToken: "primary" },
4439
5172
  description: "Soft, measured, and spacious for intimate appointment or class businesses.",
4440
5173
  generationBrief: "Use calm pacing, concise copy, generous breathing room, and natural imagery. Keep calls to action steady rather than urgent.",
4441
5174
  tokenRecipes: {
@@ -4469,6 +5202,10 @@ var curatedSiteStyles = [
4469
5202
  defineCuratedSiteStyle({
4470
5203
  id: "site-style:clear-professional",
4471
5204
  name: "Clear Professional",
5205
+ themeOverrides: {
5206
+ accordions: calmPanelAccordionSystem,
5207
+ testimonialQuote: accentGlyphQuote
5208
+ },
4472
5209
  description: "Crisp, trustworthy, and direct for local services and consultancies.",
4473
5210
  generationBrief: "Prioritize clarity, proof, service detail, and easy next steps. Keep visuals polished and specific, with restrained decorative treatment.",
4474
5211
  tokenRecipes: {
@@ -4500,6 +5237,11 @@ var curatedSiteStyles = [
4500
5237
  defineCuratedSiteStyle({
4501
5238
  id: "site-style:warm-editorial",
4502
5239
  name: "Warm Editorial",
5240
+ themeOverrides: {
5241
+ accordions: editorialDividedAccordionSystem,
5242
+ testimonialQuote: serifDisplayQuote
5243
+ },
5244
+ headingDecoration: { family: "short-center-rule", colorToken: "primary" },
4503
5245
  description: "Story-led and textured for educators, makers, venues, and retreats.",
4504
5246
  generationBrief: "Let the copy feel thoughtful and grounded. Favor narrative sections, supporting media, and a small number of editorial panels.",
4505
5247
  tokenRecipes: {
@@ -4532,6 +5274,11 @@ var curatedSiteStyles = [
4532
5274
  defineCuratedSiteStyle({
4533
5275
  id: "site-style:bright-community",
4534
5276
  name: "Bright Community",
5277
+ themeOverrides: {
5278
+ accordions: warmInsetAccordionSystem,
5279
+ testimonialQuote: accentGlyphQuote
5280
+ },
5281
+ headingDecoration: { family: "short-center-rule", colorToken: "primary" },
4535
5282
  description: "Friendly, welcoming, and active for groups, classes, and neighborhood offers.",
4536
5283
  generationBrief: "Use welcoming language, clear event or booking routes, and optimistic imagery. Let accents appear, but avoid noisy decoration.",
4537
5284
  tokenRecipes: {
@@ -4563,6 +5310,10 @@ var curatedSiteStyles = [
4563
5310
  defineCuratedSiteStyle({
4564
5311
  id: "site-style:quiet-luxury",
4565
5312
  name: "Quiet Luxury",
5313
+ themeOverrides: {
5314
+ accordions: quietUnderlinedAccordionSystem,
5315
+ testimonialQuote: serifDisplayQuote
5316
+ },
4566
5317
  description: "Minimal, confident, and refined for premium experiences and private services.",
4567
5318
  generationBrief: "Use fewer claims, more specificity, and restrained sensory detail. Favor elegant media and low repetition over dense panels.",
4568
5319
  siteCreatorSelection: {
@@ -4605,6 +5356,10 @@ var curatedSiteStyles = [
4605
5356
  defineCuratedSiteStyle({
4606
5357
  id: "site-style:practical-services",
4607
5358
  name: "Practical Services",
5359
+ themeOverrides: {
5360
+ accordions: boldBorderedAccordionSystem,
5361
+ testimonialQuote: accentGlyphQuote
5362
+ },
4608
5363
  description: "Efficient, plainspoken, and conversion-focused for trades and everyday services.",
4609
5364
  generationBrief: "Make services, location, trust signals, and contact paths obvious. Keep copy brief and avoid ornate visual treatments.",
4610
5365
  siteCreatorSelection: { kind: "primary_goal_support" },
@@ -4645,6 +5400,11 @@ var curatedSiteStyles = [
4645
5400
  defineCuratedSiteStyle({
4646
5401
  id: "site-style:modern-wellness",
4647
5402
  name: "Modern Wellness",
5403
+ themeOverrides: {
5404
+ accordions: quietUnderlinedAccordionSystem,
5405
+ testimonialQuote: serifDisplayQuote
5406
+ },
5407
+ headingDecoration: { family: "short-center-rule", colorToken: "primary" },
4648
5408
  description: "Natural, current, and reassuring for practitioners, studios, and wellbeing offers.",
4649
5409
  generationBrief: "Keep the tone warm and practical. Use gentle section variation, natural materials, and inclusive copy without making medical claims.",
4650
5410
  tokenRecipes: {
@@ -4676,51 +5436,178 @@ var curatedSiteStyles = [
4676
5436
  defineCuratedSiteStyle({
4677
5437
  id: "site-style:quiet-practice",
4678
5438
  name: "Quiet Practice",
5439
+ themeOverrides: {
5440
+ accordions: quietUnderlinedAccordionSystem,
5441
+ testimonialQuote: serifDisplayQuote
5442
+ },
4679
5443
  description: "Grounded, calm, and practical for small appointment-first practices.",
4680
5444
  generationBrief: "Make services, practitioner trust, preparation notes, and booking routes easy to scan. Keep the tone warm and specific, with quiet confidence rather than spa cliches or medical claims.",
4681
5445
  siteCreatorSelection: {
4682
5446
  kind: "site_creator_keyword_heuristic",
4683
5447
  priority: 30
4684
5448
  },
4685
- selectionKeywordRules: [
4686
- { kind: "substring", value: "massage" },
4687
- { kind: "word", value: "bodywork" },
4688
- { kind: "phrase", value: "appointment practice" },
4689
- { kind: "phrase", value: "appointment-first" },
4690
- { kind: "substring", value: "practitioner" },
4691
- { kind: "substring", value: "therap" },
4692
- { kind: "substring", value: "clinic" },
4693
- { kind: "phrase", value: "wellness practice" }
4694
- ],
4695
- tokenRecipes: {
4696
- palette: "soft-natural",
4697
- contrast: "standard",
4698
- radius: "soft",
4699
- shadow: "subtle",
4700
- typography: "clean-sans",
4701
- spacing: "regular",
4702
- motion: "subtle"
5449
+ selectionKeywordRules: [
5450
+ { kind: "substring", value: "massage" },
5451
+ { kind: "word", value: "bodywork" },
5452
+ { kind: "phrase", value: "appointment practice" },
5453
+ { kind: "phrase", value: "appointment-first" },
5454
+ { kind: "substring", value: "practitioner" },
5455
+ { kind: "substring", value: "therap" },
5456
+ { kind: "substring", value: "clinic" },
5457
+ { kind: "phrase", value: "wellness practice" }
5458
+ ],
5459
+ tokenRecipes: {
5460
+ palette: "soft-natural",
5461
+ contrast: "standard",
5462
+ radius: "soft",
5463
+ shadow: "subtle",
5464
+ typography: "clean-sans",
5465
+ spacing: "regular",
5466
+ motion: "subtle"
5467
+ },
5468
+ compositionBudget: quietBudget,
5469
+ recommendedHeaderLookIds: [
5470
+ "practical-utility",
5471
+ "clean-base",
5472
+ "centered-calm"
5473
+ ],
5474
+ buttonPersonalityChoices: [
5475
+ buttonChoice("pebble"),
5476
+ buttonChoice("soft-pill"),
5477
+ buttonChoice("editorial-link")
5478
+ ],
5479
+ paletteVariantChoices: [
5480
+ paletteChoice("soft-natural-stone"),
5481
+ paletteChoice("soft-natural-sage"),
5482
+ paletteChoice("warm-neutral-clay")
5483
+ ]
5484
+ }),
5485
+ defineCuratedSiteStyle({
5486
+ id: "site-style:clarity-zen-blue",
5487
+ name: "Clarity Zen",
5488
+ headingDecoration: { family: "short-center-rule", colorToken: "primary" },
5489
+ description: "Calm, editorial, and reassuring for therapy, counselling, and wellbeing support practices.",
5490
+ generationBrief: "Use a calm, soft palette, editorial serif headings, warm grounded copy, rounded cards, calm proof sections, and clear booking routes. Keep the tone compassionate and straightforward, with professional trust rather than hard-sell wellness language.",
5491
+ siteCreatorSelection: {
5492
+ kind: "site_creator_keyword_heuristic",
5493
+ priority: 25
5494
+ },
5495
+ selectionKeywordRules: [
5496
+ { kind: "substring", value: "psychotherap" },
5497
+ { kind: "phrase", value: "mental health" },
5498
+ { kind: "phrase", value: "talk therapy" },
5499
+ { kind: "phrase", value: "therapy and wellbeing" }
5500
+ ],
5501
+ tokenRecipes: {
5502
+ palette: "brand-led",
5503
+ contrast: "standard",
5504
+ radius: "rounded",
5505
+ shadow: "subtle",
5506
+ typography: "serif-editorial",
5507
+ spacing: "airy",
5508
+ motion: "subtle"
5509
+ },
5510
+ compositionBudget: balancedBudget,
5511
+ themeOverrides: {
5512
+ accordions: editorialDividedAccordionSystem,
5513
+ cards: clarityZenCardSystem,
5514
+ testimonialQuote: serifDisplayQuote,
5515
+ typography: {
5516
+ body: {
5517
+ family: "Roboto, system-ui, sans-serif",
5518
+ size: "md",
5519
+ weight: "regular",
5520
+ lineHeight: "relaxed",
5521
+ letterSpacing: "normal"
5522
+ },
5523
+ headings: {
5524
+ // Forum ships a single 400 weight; keep every heading weight
5525
+ // 'regular' so the Google Fonts request stays valid.
5526
+ default: {
5527
+ family: "Forum, Georgia, serif",
5528
+ weight: "regular",
5529
+ lineHeight: "normal",
5530
+ letterSpacing: "normal",
5531
+ colorToken: "text",
5532
+ italic: null,
5533
+ case: null
5534
+ },
5535
+ h1: {
5536
+ size: "xl",
5537
+ weight: "regular",
5538
+ lineHeight: "normal",
5539
+ letterSpacing: "normal",
5540
+ italic: null
5541
+ },
5542
+ h2: {
5543
+ size: "xl",
5544
+ weight: "regular",
5545
+ lineHeight: "normal",
5546
+ letterSpacing: "normal",
5547
+ italic: null
5548
+ },
5549
+ h3: {
5550
+ size: "md",
5551
+ weight: "regular",
5552
+ lineHeight: "normal",
5553
+ letterSpacing: "normal",
5554
+ italic: null
5555
+ }
5556
+ },
5557
+ scale: "majorThird"
5558
+ },
5559
+ bodyText: {
5560
+ intro: {
5561
+ paragraphSize: "default",
5562
+ headingSize: "editorial"
5563
+ }
5564
+ }
5565
+ },
5566
+ defaultBlockVariants: {
5567
+ "block.faq": "split-heading-columns"
4703
5568
  },
4704
- compositionBudget: quietBudget,
5569
+ recommendedAppearancePresetIds: [
5570
+ "hero-split-editorial",
5571
+ "intro-portrait-bio",
5572
+ "intro-organic-statement",
5573
+ "feature-cards-soft-panels",
5574
+ "feature-cards-editorial-columns",
5575
+ "feature-cards-photo-tiles",
5576
+ "media-text-quiet-story",
5577
+ "testimonials-non-carded",
5578
+ "faq-contained-help",
5579
+ "contact-form-panel"
5580
+ ],
4705
5581
  recommendedHeaderLookIds: [
4706
- "practical-utility",
4707
- "clean-base",
4708
- "centered-calm"
5582
+ "centered-calm",
5583
+ "serif-line",
5584
+ "minimal-transparent"
5585
+ ],
5586
+ recommendedFooterLookIds: [
5587
+ "footer-centered-calm",
5588
+ "footer-editorial-columns",
5589
+ "footer-muted-grounding"
4709
5590
  ],
4710
5591
  buttonPersonalityChoices: [
4711
- buttonChoice("pebble"),
4712
5592
  buttonChoice("soft-pill"),
5593
+ buttonChoice("pebble"),
4713
5594
  buttonChoice("editorial-link")
4714
5595
  ],
4715
5596
  paletteVariantChoices: [
5597
+ paletteChoice("soft-natural-lilac"),
5598
+ paletteChoice("soft-natural-watercolor"),
4716
5599
  paletteChoice("soft-natural-stone"),
4717
- paletteChoice("soft-natural-sage"),
4718
- paletteChoice("warm-neutral-clay")
5600
+ paletteChoice("warm-neutral-cream")
4719
5601
  ]
4720
5602
  }),
4721
5603
  defineCuratedSiteStyle({
4722
5604
  id: "site-style:personal-retreat-journal",
4723
5605
  name: "Personal Retreat Journal",
5606
+ themeOverrides: {
5607
+ accordions: editorialDividedAccordionSystem,
5608
+ testimonialQuote: serifDisplayQuote
5609
+ },
5610
+ headingDecoration: { family: "short-center-rule", colorToken: "primary" },
4724
5611
  description: "Warm, story-led, and readable for solo practitioners with mixed offers.",
4725
5612
  generationBrief: "Center the practitioner as the guide, then make private sessions, classes, retreats, and resources feel like clear pathways. Keep retreat copy grounded and practical, with enough editorial warmth for longer reading.",
4726
5613
  siteCreatorSelection: {
@@ -4765,6 +5652,11 @@ var curatedSiteStyles = [
4765
5652
  defineCuratedSiteStyle({
4766
5653
  id: "site-style:tactile-workshop",
4767
5654
  name: "Tactile Workshop",
5655
+ themeOverrides: {
5656
+ accordions: warmInsetAccordionSystem,
5657
+ testimonialQuote: accentGlyphQuote
5658
+ },
5659
+ headingDecoration: { family: "organic-squiggle", colorToken: "primary" },
4768
5660
  description: "Bright, hands-on, and image-led for maker studios, workshops, and creative classes.",
4769
5661
  generationBrief: "Lead with objects, materials, studio process, and practical booking detail. Keep the tone warm and direct, with useful mess, clear dates, and enough gallery rhythm to feel like a real creative studio.",
4770
5662
  siteCreatorSelection: {
@@ -4815,6 +5707,7 @@ var curatedSiteStyles = [
4815
5707
  defineCuratedSiteStyle({
4816
5708
  id: SOFT_EARTH_SITE_STYLE_ID,
4817
5709
  name: "Soft Earth",
5710
+ headingDecoration: { family: "organic-squiggle", colorToken: "primary" },
4818
5711
  description: "Warm, grounded, and editorial for yoga studios, retreats, and wellbeing communities.",
4819
5712
  generationBrief: "Use cream space, terracotta CTAs, olive quote bands, natural imagery, generous but composed spacing, and editorial serif headings. Prefer a real intro section, image-led offering cards, warm community quotes, and an FAQ with a full-width intro above two columns of questions when content allows.",
4820
5713
  siteCreatorSelection: {
@@ -4887,7 +5780,8 @@ var curatedSiteStyles = [
4887
5780
  headingSize: "editorial"
4888
5781
  }
4889
5782
  },
4890
- accordions: softEarthAccordionSystem
5783
+ accordions: softEarthAccordionSystem,
5784
+ testimonialQuote: accentGlyphQuote
4891
5785
  },
4892
5786
  defaultBlockVariants: {
4893
5787
  "block.faq": "question-columns"
@@ -4897,7 +5791,7 @@ var curatedSiteStyles = [
4897
5791
  "intro-organic-statement",
4898
5792
  "feature-cards-raised-rule",
4899
5793
  "events-lined-panel",
4900
- "testimonials-brand-background-quotes",
5794
+ "testimonials-non-carded",
4901
5795
  "contact-form-panel"
4902
5796
  ],
4903
5797
  recommendedHeaderLookIds: [
@@ -4925,6 +5819,11 @@ var curatedSiteStyles = [
4925
5819
  defineCuratedSiteStyle({
4926
5820
  id: "site-style:bold-launch",
4927
5821
  name: "Bold Launch",
5822
+ themeOverrides: {
5823
+ accordions: boldBorderedAccordionSystem,
5824
+ testimonialQuote: accentGlyphQuote
5825
+ },
5826
+ headingDecoration: { family: "short-center-rule", colorToken: "primary" },
4928
5827
  description: "High-energy and punchy for launches, campaigns, and creative offers.",
4929
5828
  generationBrief: "Use crisp positioning, bold hero structure, strong calls to action, and confident visual rhythm. Keep it precise, not shouty.",
4930
5829
  siteCreatorSelection: {
@@ -4970,6 +5869,7 @@ var curatedSiteStyles = [
4970
5869
  defineCuratedSiteStyle({
4971
5870
  id: "site-style:south-west-twerk-school",
4972
5871
  name: "South West Twerk School",
5872
+ headingDecoration: { family: "organic-squiggle", colorToken: "primary" },
4973
5873
  description: "Energetic, editorial, and high-contrast for a branded dance school presence.",
4974
5874
  generationBrief: "Use confident rhythm, bold burgundy-and-gold accents, large editorial intro copy, strong booking routes, and dark feature sections where proof or forms need emphasis.",
4975
5875
  tokenRecipes: {
@@ -4989,6 +5889,9 @@ var curatedSiteStyles = [
4989
5889
  ],
4990
5890
  defaultTypographyPresetId: "typography-preset:bold-display",
4991
5891
  themeOverrides: {
5892
+ accordions: boldBorderedAccordionSystem,
5893
+ cards: southWestCardSystem,
5894
+ testimonialQuote: accentGlyphQuote,
4992
5895
  bodyText: {
4993
5896
  intro: {
4994
5897
  paragraphSize: "editorial",
@@ -5001,7 +5904,7 @@ var curatedSiteStyles = [
5001
5904
  "hero-brand-scrim-fixed-frame",
5002
5905
  "body-text-editorial-intro",
5003
5906
  "schedule-details-brand-depth",
5004
- "testimonials-accent-quote-cards",
5907
+ "testimonials-statement-cards",
5005
5908
  "contact-form-brand-depth-card"
5006
5909
  ],
5007
5910
  recommendedHeaderLookIds: [
@@ -5704,14 +6607,77 @@ ${root} {
5704
6607
  }
5705
6608
 
5706
6609
  // ../theme-core/src/blocks/vars/testimonials.ts
5707
- function generateTestimonialsVars({ themeId }) {
6610
+ var QUOTE_SCALE_SIZE = {
6611
+ sm: "2.5rem",
6612
+ md: "3.5rem",
6613
+ // 4.375rem == 3.5rem * 1.25, matching the legacy accent-quote mark size.
6614
+ lg: "4.375rem",
6615
+ xl: "clamp(3.5rem, 2rem + 4vw, 5.5rem)"
6616
+ };
6617
+ function resolveTestimonialQuoteVars(treatment) {
6618
+ if (!treatment) {
6619
+ return {
6620
+ size: QUOTE_SCALE_SIZE.md,
6621
+ opacity: "0.08",
6622
+ color: "rgb(var(--tb-primary))",
6623
+ font: "inherit",
6624
+ weight: "700",
6625
+ display: "block"
6626
+ };
6627
+ }
6628
+ if (treatment.style === "none") {
6629
+ return {
6630
+ size: QUOTE_SCALE_SIZE.md,
6631
+ opacity: "0",
6632
+ color: "rgb(var(--tb-primary))",
6633
+ font: "inherit",
6634
+ weight: "700",
6635
+ display: "none"
6636
+ };
6637
+ }
6638
+ const base = treatment.style === "serif-display" ? {
6639
+ fontFamily: "heading",
6640
+ scale: "xl",
6641
+ colorToken: "primary",
6642
+ opacity: 1
6643
+ } : {
6644
+ // accent-glyph
6645
+ fontFamily: "body",
6646
+ scale: "lg",
6647
+ colorToken: "secondary",
6648
+ opacity: 1
6649
+ };
6650
+ const fontFamily = treatment.fontFamily ?? base.fontFamily;
6651
+ const scale = treatment.scale ?? base.scale;
6652
+ const colorToken = treatment.colorToken ?? base.colorToken;
6653
+ const opacity = treatment.opacity ?? base.opacity;
6654
+ return {
6655
+ size: QUOTE_SCALE_SIZE[scale],
6656
+ opacity: String(opacity),
6657
+ color: rgbColorValue(colorToken),
6658
+ font: fontFamily === "heading" ? "var(--font-heading)" : "var(--font-body, inherit)",
6659
+ // Heading-font display marks render at the family's natural weight (Forum
6660
+ // ships a single 400) to avoid synthetic bold; glyph marks stay heavy.
6661
+ weight: fontFamily === "heading" ? "400" : "700",
6662
+ display: "block"
6663
+ };
6664
+ }
6665
+ function generateTestimonialsVars({
6666
+ themeId,
6667
+ theme
6668
+ }) {
5708
6669
  const root = `:where([data-theme-scope="${themeId}"]) :where([data-block="testimonials"])`;
6670
+ const quote = resolveTestimonialQuoteVars(theme.testimonialQuote);
5709
6671
  return `
5710
6672
  ${root} {
5711
6673
  --rb-testimonial-avatar-size: 3rem;
5712
6674
  --rb-testimonial-avatar-border-radius: 9999px;
5713
- --rb-testimonial-quote-size: 3.5rem;
5714
- --rb-testimonial-quote-opacity: 0.08;
6675
+ --rb-testimonial-quote-size: ${quote.size};
6676
+ --rb-testimonial-quote-opacity: ${quote.opacity};
6677
+ --rb-testimonial-quote-color: ${quote.color};
6678
+ --rb-testimonial-quote-font: ${quote.font};
6679
+ --rb-testimonial-quote-weight: ${quote.weight};
6680
+ --rb-testimonial-quote-display: ${quote.display};
5715
6681
 
5716
6682
  /* Carousel arrows (defaults: primary background + onPrimary icon) */
5717
6683
  --rb-testimonial-carousel-arrow-bg: rgb(var(--tb-primary));
@@ -7508,41 +8474,52 @@ var containerResponsiveThemeCss = `/*
7508
8474
  }
7509
8475
 
7510
8476
  .rb-container-pad-none {
7511
- padding: 0;
8477
+ --rb-card-pad: 0rem;
8478
+ padding: var(--rb-card-pad);
7512
8479
  }
7513
8480
  .rb-container-pad-compact {
7514
- padding: 1rem;
8481
+ --rb-card-pad: 1rem;
8482
+ padding: var(--rb-card-pad);
7515
8483
  }
7516
8484
  .rb-container-pad-cozy {
7517
- padding: 1.5rem;
8485
+ --rb-card-pad: 1.5rem;
8486
+ padding: var(--rb-card-pad);
7518
8487
  }
7519
8488
  .rb-container-pad-medium {
7520
- padding: 1.5rem;
8489
+ --rb-card-pad: 1.5rem;
8490
+ padding: var(--rb-card-pad);
7521
8491
  }
7522
8492
  .rb-container-pad-comfortable {
7523
- padding: 2rem;
8493
+ --rb-card-pad: 2rem;
8494
+ padding: var(--rb-card-pad);
7524
8495
  }
7525
8496
  .rb-container-pad-spacious {
7526
- padding: 2.5rem;
8497
+ --rb-card-pad: 2.5rem;
8498
+ padding: var(--rb-card-pad);
7527
8499
  }
7528
8500
 
7529
8501
  @container rb-site (min-width: 640px) {
7530
8502
 
7531
8503
  @scope ([data-rb-responsive-mode="container"]) to (:scope [data-rb-responsive-mode]) {
7532
8504
  .rb-container-pad-compact {
7533
- padding: 1.5rem;
8505
+ --rb-card-pad: 1.5rem;
8506
+ padding: var(--rb-card-pad);
7534
8507
  }
7535
8508
  .rb-container-pad-cozy {
7536
- padding: 2rem;
8509
+ --rb-card-pad: 2rem;
8510
+ padding: var(--rb-card-pad);
7537
8511
  }
7538
8512
  .rb-container-pad-medium {
7539
- padding: 2rem;
8513
+ --rb-card-pad: 2rem;
8514
+ padding: var(--rb-card-pad);
7540
8515
  }
7541
8516
  .rb-container-pad-comfortable {
7542
- padding: 2.5rem;
8517
+ --rb-card-pad: 2.5rem;
8518
+ padding: var(--rb-card-pad);
7543
8519
  }
7544
8520
  .rb-container-pad-spacious {
7545
- padding: 3.5rem;
8521
+ --rb-card-pad: 3.5rem;
8522
+ padding: var(--rb-card-pad);
7546
8523
  }
7547
8524
  }
7548
8525
 
@@ -7717,8 +8694,15 @@ var containerResponsiveThemeCss = `/*
7717
8694
  /* Shared: Site document overlay header clearance */
7718
8695
  /* -------------------------------------------------------------------------- */
7719
8696
 
7720
- :where(.theme-scope) :where([data-site-document-overlay-content='true']) :where([data-block]):first-of-type > :where([data-slot='section']) > :where(.rb-container) {
7721
- padding-top: calc(var(--site-overlay-header-clearance, 0px) + var(--site-overlay-opening-content-extra-pad, 0px));
8697
+ :where(.theme-scope)
8698
+ :where([data-site-document-overlay-content='true'])
8699
+ :where([data-block]):first-of-type
8700
+ > :where([data-slot='section'])
8701
+ > :where(.rb-container) {
8702
+ padding-top: calc(
8703
+ var(--site-overlay-header-clearance, 0px) +
8704
+ var(--site-overlay-opening-content-extra-pad, 0px)
8705
+ );
7722
8706
  }
7723
8707
 
7724
8708
  /* -------------------------------------------------------------------------- */
@@ -7804,6 +8788,22 @@ var containerResponsiveThemeCss = `/*
7804
8788
  }
7805
8789
  }
7806
8790
 
8791
+ /* -------------------------------------------------------------------------- */
8792
+ /* Header: Mobile floating/glass backing */
8793
+ /* -------------------------------------------------------------------------- */
8794
+
8795
+ :where(.theme-scope) .header-variant-floating .header-mobile-bar {
8796
+ align-items: flex-start;
8797
+ margin-top: 0.75rem;
8798
+ }
8799
+
8800
+ :where(.theme-scope) .header-variant-floating .nav-mobile-toggle {
8801
+ border: 1px solid rgb(var(--tb-border) / 0.82);
8802
+ background: rgb(var(--tb-surface) / 0.96);
8803
+ color: rgb(var(--tb-text));
8804
+ box-shadow: 0 10px 28px rgb(var(--tb-neutral-950) / 0.12);
8805
+ }
8806
+
7807
8807
  /*
7808
8808
  * Theme Scope Styles
7809
8809
  *
@@ -8740,6 +9740,56 @@ var containerResponsiveThemeCss = `/*
8740
9740
  transition: height 300ms var(--motion-ease, ease);
8741
9741
  }
8742
9742
 
9743
+ :where(.theme-scope) .header-logo-size-compact.rb-header-logo-sm {
9744
+ height: 2rem;
9745
+ }
9746
+ :where(.theme-scope) .header-logo-size-compact.rb-header-logo-lg {
9747
+ height: 2.5rem;
9748
+ }
9749
+ :where(.theme-scope) .header-logo-size-standard.rb-header-logo-sm {
9750
+ height: 2.5rem;
9751
+ }
9752
+ :where(.theme-scope) .header-logo-size-standard.rb-header-logo-lg {
9753
+ height: 3rem;
9754
+ }
9755
+ :where(.theme-scope) .header-logo-size-generous.rb-header-logo-sm {
9756
+ height: 3.5rem;
9757
+ }
9758
+ :where(.theme-scope) .header-logo-size-generous.rb-header-logo-lg {
9759
+ height: 4.5rem;
9760
+ }
9761
+ :where(.theme-scope) .header-logo-size-display.rb-header-logo-sm {
9762
+ height: 7.5rem;
9763
+ }
9764
+ :where(.theme-scope) .header-logo-size-display.rb-header-logo-lg {
9765
+ height: 8rem;
9766
+ }
9767
+
9768
+ :where(.theme-scope) .header-logo-accommodation-plate,
9769
+ :where(.theme-scope) .header-logo-accommodation-centered-badge,
9770
+ :where(.theme-scope) .header-logo-accommodation-popout-badge,
9771
+ :where(.theme-scope) .header-logo-accommodation-centered-masthead {
9772
+ border-radius: var(--radius-md, 0.5rem);
9773
+ background: var(--color-surface, #fff);
9774
+ box-shadow: var(--shadow-sm, 0 1px 2px rgb(0 0 0 / 0.08));
9775
+ padding: 0.5rem;
9776
+ }
9777
+
9778
+ :where(.theme-scope) .header-logo-accommodation-popout-badge {
9779
+ position: relative;
9780
+ z-index: 1;
9781
+ margin-block: -0.35rem -0.9rem;
9782
+ }
9783
+
9784
+ :where(.theme-scope)
9785
+ .header-logo-size-display.header-logo-accommodation-popout-badge {
9786
+ margin-block: -0.75rem -2rem;
9787
+ }
9788
+
9789
+ :where(.theme-scope) .header-logo-accommodation-centered-masthead {
9790
+ padding: 0.75rem 1rem;
9791
+ }
9792
+
8743
9793
  /* Site title base font size (replaces rb-text-lg / rb-text-xl utilities) */
8744
9794
  :where(.theme-scope) .header-logo-text {
8745
9795
  font-size: 1.125rem; /* matches rb-text-lg */
@@ -8778,13 +9828,45 @@ var containerResponsiveThemeCss = `/*
8778
9828
  :where(.theme-scope) .rb-header-shrink.header-scrolled .rb-header-logo-lg {
8779
9829
  height: 2.5rem;
8780
9830
  }
9831
+ :where(.theme-scope)
9832
+ .rb-header-shrink.header-scrolled
9833
+ .header-logo-size-generous.rb-header-logo-sm {
9834
+ height: 2.75rem;
9835
+ }
9836
+ :where(.theme-scope)
9837
+ .rb-header-shrink.header-scrolled
9838
+ .header-logo-size-generous.rb-header-logo-lg {
9839
+ height: 3.25rem;
9840
+ }
9841
+ :where(.theme-scope)
9842
+ .rb-header-shrink.header-scrolled
9843
+ .header-logo-size-display.rb-header-logo-sm,
9844
+ :where(.theme-scope)
9845
+ .rb-header-shrink.header-scrolled
9846
+ .header-logo-size-display.rb-header-logo-lg {
9847
+ height: 5rem;
9848
+ }
8781
9849
  :where(.theme-scope) .rb-header-shrink.header-scrolled .header-logo-text {
8782
9850
  font-size: 0.875rem;
8783
9851
  }
8784
9852
 
8785
9853
  @container rb-site (max-width: 767px) {
8786
9854
  @scope ([data-rb-responsive-mode="container"]) to (:scope [data-rb-responsive-mode]) {
8787
- :where(.theme-scope) .rb-header-shrink.header-scrolled .header-logo-text {
9855
+ :where(.theme-scope) .header-logo-size-generous.rb-header-logo-sm,
9856
+ :where(.theme-scope) .header-logo-size-generous.rb-header-logo-lg {
9857
+ height: 3rem;
9858
+ }
9859
+
9860
+ :where(.theme-scope) .header-logo-size-display.rb-header-logo-sm,
9861
+ :where(.theme-scope) .header-logo-size-display.rb-header-logo-lg {
9862
+ height: 5.5rem;
9863
+ }
9864
+
9865
+ :where(.theme-scope) .header-logo-accommodation-popout-badge {
9866
+ margin-block: 0;
9867
+ }
9868
+
9869
+ :where(.theme-scope) .rb-header-shrink.header-scrolled .header-logo-text {
8788
9870
  font-size: 0.75rem;
8789
9871
  }
8790
9872
  }
@@ -13574,11 +14656,13 @@ var containerResponsiveThemeCss = `/*
13574
14656
  }
13575
14657
 
13576
14658
  :where(.theme-scope) :where([data-block="testimonials"]) .rb-testimonial-quote {
14659
+ display: var(--rb-testimonial-quote-display, block);
14660
+ font-family: var(--rb-testimonial-quote-font, inherit);
13577
14661
  font-size: var(--rb-testimonial-quote-size);
13578
14662
  line-height: 1;
13579
- font-weight: 700;
14663
+ font-weight: var(--rb-testimonial-quote-weight, 700);
13580
14664
  opacity: var(--rb-testimonial-quote-opacity);
13581
- color: rgb(var(--tb-primary));
14665
+ color: var(--rb-testimonial-quote-color, rgb(var(--tb-primary)));
13582
14666
  }
13583
14667
 
13584
14668
  :where(.theme-scope) :where([data-block="testimonials"]) .rb-card-treatment-accent-quote .rb-testimonial-quote {
@@ -13587,6 +14671,61 @@ var containerResponsiveThemeCss = `/*
13587
14671
  opacity: 1;
13588
14672
  }
13589
14673
 
14674
+ /* Open editorial testimonial card: boxless, with a hairline rule before the
14675
+ * attribution, an accent ring on the avatar, and comfortable prose. The quote
14676
+ * mark itself is owned by the site-style quote treatment (see the
14677
+ * --rb-testimonial-quote-* vars), not by these rules.
14678
+ *
14679
+ * \`editorial-open\` is the current non-carded look; \`editorial-serif-quote\` is
14680
+ * retained for content saved before the decomposition. */
14681
+ :where(.theme-scope) :where([data-block="testimonials"]) .rb-testimonial-card.rb-card-treatment-editorial-open,
14682
+ :where(.theme-scope) :where([data-block="testimonials"]) .rb-testimonial-card.rb-card-treatment-editorial-serif-quote {
14683
+ background: transparent;
14684
+ border: 0;
14685
+ border-radius: 0;
14686
+ padding: 0.25rem clamp(0.5rem, 1.5vw, 1.5rem);
14687
+ }
14688
+
14689
+ /* styledCard always renders an inner white rb-bg-surface fill layer; a boxless
14690
+ * card must clear it so the section band shows through (otherwise: white box). */
14691
+ :where(.theme-scope) :where([data-block="testimonials"]) .rb-card-treatment-editorial-open > .rb-bg-surface,
14692
+ :where(.theme-scope) :where([data-block="testimonials"]) .rb-card-treatment-editorial-serif-quote > .rb-bg-surface {
14693
+ background: transparent;
14694
+ }
14695
+
14696
+ :where(.theme-scope) :where([data-block="testimonials"]) .rb-card-treatment-editorial-open .rb-prose,
14697
+ :where(.theme-scope) :where([data-block="testimonials"]) .rb-card-treatment-editorial-serif-quote .rb-prose {
14698
+ font-size: 1.0625rem;
14699
+ line-height: 1.7;
14700
+ }
14701
+
14702
+ :where(.theme-scope) :where([data-block="testimonials"]) .rb-card-treatment-editorial-open .rb-testimonial-attribution,
14703
+ :where(.theme-scope) :where([data-block="testimonials"]) .rb-card-treatment-editorial-serif-quote .rb-testimonial-attribution {
14704
+ margin-top: 1.25rem;
14705
+ padding-top: 1.25rem;
14706
+ border-top: 1px solid rgba(var(--tb-border), 0.75);
14707
+ }
14708
+
14709
+ :where(.theme-scope) :where([data-block="testimonials"]) .rb-card-treatment-editorial-open .rb-testimonial-avatar,
14710
+ :where(.theme-scope) :where([data-block="testimonials"]) .rb-card-treatment-editorial-serif-quote .rb-testimonial-avatar {
14711
+ box-shadow:
14712
+ 0 0 0 2px rgb(var(--tb-surface)),
14713
+ 0 0 0 4px rgba(var(--tb-primary), 0.3);
14714
+ }
14715
+
14716
+
14717
+ /* Split grid: title column + cards. On desktop the title takes one quarter and
14718
+ * the cards fill the remaining three quarters (so title + 3 cards each read as
14719
+ * a quarter). Stacks on mobile. */
14720
+ @container rb-site (min-width: 1024px) {
14721
+ @scope ([data-rb-responsive-mode="container"]) to (:scope [data-rb-responsive-mode]) {
14722
+ :where(.theme-scope) :where([data-block="testimonials"]) .rb-testimonials-split-grid {
14723
+ grid-template-columns: minmax(0, 1fr) minmax(0, 3fr);
14724
+ align-items: start;
14725
+ }
14726
+ }
14727
+ }
14728
+
13590
14729
 
13591
14730
  /* Testimonials carousel tweaks: arrow styling + gutters + equal-height cards */
13592
14731
  :where(.theme-scope) :where([data-block="testimonials"]) .rb-testimonials-carousel.carousel-root .carousel-nav-btn {
@@ -15072,10 +16211,10 @@ var containerResponsiveThemeCss = `/*
15072
16211
 
15073
16212
  :where(.theme-scope) .event-compact-row {
15074
16213
  display: grid;
15075
- grid-template-columns: clamp(5.5rem, 8vw, 8rem) minmax(0, 1fr) clamp(15rem, 24vw, 21rem);
16214
+ grid-template-columns: clamp(5rem, 7vw, 7rem) minmax(0, 1fr) clamp(15rem, 24vw, 21rem);
15076
16215
  align-items: center;
15077
- min-height: 8.75rem;
15078
- padding: 1.55rem clamp(1.5rem, 3vw, 2.6rem);
16216
+ min-height: 6.75rem;
16217
+ padding: 1.35rem clamp(1.5rem, 3vw, 2.6rem);
15079
16218
  border-bottom: 1px solid var(--event-compact-divider-color);
15080
16219
  transition: background-color 150ms ease;
15081
16220
  }
@@ -15114,10 +16253,10 @@ var containerResponsiveThemeCss = `/*
15114
16253
  :where(.theme-scope) .event-compact-row-date-day {
15115
16254
  display: grid;
15116
16255
  place-items: center;
15117
- min-block-size: clamp(2.7rem, 4.5vw, 3.7rem);
16256
+ min-block-size: clamp(2rem, 3vw, 2.6rem);
15118
16257
  color: rgb(var(--tb-text, 17 24 39));
15119
16258
  font-family: var(--font-heading, var(--font-body, inherit));
15120
- font-size: clamp(2.3rem, 4.2vw, 3.35rem);
16259
+ font-size: clamp(1.7rem, 1.35rem + 1.1vw, 2.35rem);
15121
16260
  font-weight: 400;
15122
16261
  line-height: 1;
15123
16262
  }
@@ -15137,9 +16276,10 @@ var containerResponsiveThemeCss = `/*
15137
16276
  margin: 0;
15138
16277
  color: rgb(var(--tb-text, 17 24 39));
15139
16278
  font-family: var(--font-heading, var(--font-body, inherit));
15140
- font-size: clamp(1.55rem, 2.6vw, 2.4rem);
16279
+ /* Row titles sit at the theme's h3 scale so section headings stay dominant */
16280
+ font-size: var(--fs-h3-fluid, clamp(1.1rem, 1rem + 0.7vw, 1.5rem));
15141
16281
  font-weight: 400;
15142
- line-height: 1.05;
16282
+ line-height: 1.2;
15143
16283
  overflow: hidden;
15144
16284
  text-overflow: ellipsis;
15145
16285
  white-space: nowrap;
@@ -15252,7 +16392,7 @@ var containerResponsiveThemeCss = `/*
15252
16392
  }
15253
16393
 
15254
16394
  :where(.theme-scope) .event-compact-row-date-day {
15255
- font-size: 2.35rem;
16395
+ font-size: 1.85rem;
15256
16396
  }
15257
16397
 
15258
16398
  :where(.theme-scope) .event-compact-row-content {
@@ -15262,7 +16402,7 @@ var containerResponsiveThemeCss = `/*
15262
16402
  }
15263
16403
 
15264
16404
  :where(.theme-scope) .event-compact-row-title {
15265
- font-size: clamp(1.35rem, 8vw, 1.9rem);
16405
+ font-size: clamp(1.15rem, 5vw, 1.35rem);
15266
16406
  white-space: normal;
15267
16407
  }
15268
16408
 
@@ -15342,19 +16482,23 @@ var containerResponsiveThemeCss = `/*
15342
16482
  * =============================================================================
15343
16483
  */
15344
16484
 
15345
- :where(.theme-scope) .rb-heading-decoration {
16485
+ /*
16486
+ * The mark sits inside a full-width block row so it inherits the heading group's
16487
+ * \`text-align\`: a centred heading centres the mark, a left-aligned heading keeps
16488
+ * it at the start. The heading stacks are flexbox, where \`text-align\` positions
16489
+ * inline content but not flex items \u2014 so the row (a stretched block flex item)
16490
+ * is what carries the alignment, and the inline-block mark follows it. Alignment
16491
+ * is never configured directly; it follows the heading.
16492
+ */
16493
+ :where(.theme-scope) .rb-heading-decoration-row {
15346
16494
  display: block;
15347
- flex: 0 0 auto;
15348
- pointer-events: none;
15349
- }
15350
-
15351
- :where(.theme-scope) .rb-heading-decoration-placement-after-heading {
16495
+ width: 100%;
15352
16496
  margin-top: 0.35rem;
16497
+ pointer-events: none;
15353
16498
  }
15354
16499
 
15355
- :where(.theme-scope) .rb-heading-decoration-placement-under-centered-heading {
15356
- margin-left: auto;
15357
- margin-right: auto;
16500
+ :where(.theme-scope) .rb-heading-decoration {
16501
+ display: inline-block;
15358
16502
  }
15359
16503
 
15360
16504
  :where(.theme-scope) .rb-heading-decoration-organic-squiggle {
@@ -15396,6 +16540,150 @@ var containerResponsiveThemeCss = `/*
15396
16540
 
15397
16541
  :where(.theme-scope) .rb-heading-decoration-color-muted {
15398
16542
  color: rgb(var(--tb-mutedText));
16543
+ }
16544
+
16545
+ /* =============================================================================
16546
+ * Block: Feature Card Icons
16547
+ * =============================================================================
16548
+ */
16549
+
16550
+ :where(.theme-scope) .rb-feature-card-icon-zone {
16551
+ display: inline-flex;
16552
+ align-items: center;
16553
+ justify-content: center;
16554
+ flex: 0 0 auto;
16555
+ margin-bottom: 0.125rem;
16556
+ color: rgb(var(--tb-primary));
16557
+ }
16558
+
16559
+ :where(.theme-scope) .rb-feature-card-icon-zone--empty {
16560
+ visibility: hidden;
16561
+ }
16562
+
16563
+ :where(.theme-scope) .rb-feature-card-icon-zone--plain {
16564
+ width: 1.5rem;
16565
+ height: 1.5rem;
16566
+ }
16567
+
16568
+ :where(.theme-scope) .rb-feature-card-icon-zone--soft-badge,
16569
+ :where(.theme-scope) .rb-feature-card-icon-zone--utility-badge {
16570
+ width: 2.5rem;
16571
+ height: 2.5rem;
16572
+ border-radius: var(--rb-block-radius, 0.75rem);
16573
+ }
16574
+
16575
+ :where(.theme-scope) .rb-feature-card-icon-zone--soft-badge {
16576
+ background-color: rgb(var(--tb-primary) / 10%);
16577
+ }
16578
+
16579
+ :where(.theme-scope) .rb-feature-card-icon-zone--utility-badge {
16580
+ background-color: rgb(var(--tb-surface));
16581
+ border: 1px solid rgb(var(--tb-border));
16582
+ box-shadow: 0 1px 2px rgba(var(--tb-shadow), 0.08);
16583
+ }
16584
+
16585
+ :where(.theme-scope) .rb-feature-card-icon {
16586
+ width: 1.25rem;
16587
+ height: 1.25rem;
16588
+ }
16589
+
16590
+ :where(.theme-scope) .rb-feature-card-icon--generated {
16591
+ object-fit: contain;
16592
+ }
16593
+
16594
+ :where(.theme-scope) .rb-feature-card-icon-zone--plain .rb-feature-card-icon {
16595
+ width: 1.5rem;
16596
+ height: 1.5rem;
16597
+ }
16598
+
16599
+ /* =============================================================================
16600
+ * Shared: Card treatments
16601
+ *
16602
+ * Visual treatments referenced from \`_cardStyles.treatment\` (see
16603
+ * cardStylesOverrideSchema). Class names are emitted by the boxStyles
16604
+ * transform in @riverbankcms/blocks.
16605
+ *
16606
+ * Also contains feature-card media/padding behaviour shared by all looks:
16607
+ * - card images bleed to the card edges (flush photo tops)
16608
+ * - card-level padding replaces the content stack's fallback padding so the
16609
+ * two never stack up
16610
+ * ============================================================================= */
16611
+
16612
+ /* --- Feature card media + padding behaviour (all looks) -------------------- */
16613
+
16614
+ /*
16615
+ * When a look gives the card real padding (rb-container-pad-*), the image
16616
+ * bleeds to the card edges and the inner content stack drops its fallback
16617
+ * padding so insets don't double up.
16618
+ */
16619
+ :where(.theme-scope) .rb-feature-card[class*="rb-container-pad-"]:not(.rb-container-pad-none) > .rb-feature-card-media {
16620
+ width: calc(100% + 2 * var(--rb-card-pad, 0rem));
16621
+ max-width: none;
16622
+ margin: calc(-1 * var(--rb-card-pad, 0rem)) calc(-1 * var(--rb-card-pad, 0rem)) 0;
16623
+ }
16624
+
16625
+ :where(.theme-scope) .rb-feature-card[class*="rb-container-pad-"]:not(.rb-container-pad-none) > .rb-feature-card-media + .rb-feature-card-content {
16626
+ margin-top: 1.4rem;
16627
+ }
16628
+
16629
+ :where(.theme-scope) .rb-feature-card[class*="rb-container-pad-"]:not(.rb-container-pad-none) > .rb-feature-card-content {
16630
+ padding: 0;
16631
+ }
16632
+
16633
+ /* --- Soft panel ------------------------------------------------------------ */
16634
+
16635
+ :where(.theme-scope) .rb-card-treatment-soft-panel {
16636
+ transition: transform 250ms ease, box-shadow 250ms ease;
16637
+ }
16638
+
16639
+ @media (prefers-reduced-motion: no-preference) {
16640
+ :where(.theme-scope) .rb-card-treatment-soft-panel:hover {
16641
+ transform: translateY(-3px);
16642
+ box-shadow: 0 0.875rem 1.875rem rgba(var(--tb-shadow, 0 0 0), 0.1);
16643
+ }
16644
+ }
16645
+
16646
+ :where(.theme-scope) .rb-card-treatment-soft-panel .cta-row .button-ghost {
16647
+ padding-inline: 0;
16648
+ }
16649
+
16650
+ /* --- Editorial rule --------------------------------------------------------- */
16651
+
16652
+ /*
16653
+ * Boxless open column: no background, no border box, a short brand rule
16654
+ * sitting on a full-width hairline at the top of the column.
16655
+ */
16656
+ :where(.theme-scope) .rb-card-treatment-editorial-rule {
16657
+ margin-top: 1rem;
16658
+ border-top: 1px solid
16659
+ color-mix(in oklab, rgb(var(--tb-border, 229 231 235)), transparent 25%);
16660
+ }
16661
+
16662
+ :where(.theme-scope) .rb-card-treatment-editorial-rule > .rb-bg-surface {
16663
+ background: transparent;
16664
+ }
16665
+
16666
+ :where(.theme-scope) .rb-card-treatment-editorial-rule::before {
16667
+ content: "";
16668
+ position: absolute;
16669
+ top: 0;
16670
+ left: 0;
16671
+ width: 2.75rem;
16672
+ height: 2px;
16673
+ background: rgb(var(--tb-primary, 0 0 0));
16674
+ }
16675
+
16676
+ :where(.theme-scope) .rb-card-treatment-editorial-rule > .rb-feature-card-media {
16677
+ margin-top: 1.6rem;
16678
+ border-radius: calc(var(--rb-block-radius, 0.75rem) * 0.5);
16679
+ }
16680
+
16681
+ :where(.theme-scope) .rb-card-treatment-editorial-rule > .rb-feature-card-content {
16682
+ padding: 1.6rem 0 0.25rem;
16683
+ }
16684
+
16685
+ :where(.theme-scope) .rb-card-treatment-editorial-rule .cta-row .button-ghost {
16686
+ padding-inline: 0;
15399
16687
  }`;
15400
16688
 
15401
16689
  // ../theme-core/src/ThemeScopeCore.tsx
@@ -15590,7 +16878,7 @@ var SITE_CHROME_VISIBLE_HEADER_SELECTOR = `[${SITE_CHROME_VISIBLE_HEADER_ATTR}="
15590
16878
  import { Fragment as Fragment2, jsx as jsx4, jsxs as jsxs3 } from "react/jsx-runtime";
15591
16879
 
15592
16880
  // ../theme-core/src/runtime/buildThemeRuntimeFromBridge.ts
15593
- import { z as z18 } from "zod";
16881
+ import { z as z19 } from "zod";
15594
16882
 
15595
16883
  // ../theme-core/src/inputs/core.ts
15596
16884
  var CORNER_RADIUS_MAP4 = {
@@ -15783,33 +17071,33 @@ var CSS_DECLARATION_PROPERTY_PATTERN = /^(?:-[a-zA-Z][a-zA-Z0-9-]*|[a-zA-Z][a-zA
15783
17071
  var UNSAFE_CSS_MARKUP_PATTERN = /[{}<>]|<\/|<script/i;
15784
17072
  var EXTERNAL_URL_PATTERN = /url\s*\(\s*['"]?(?:https?:|\/\/)/i;
15785
17073
  var JAVASCRIPT_URL_PATTERN2 = /javascript\s*:/i;
15786
- var themeBridgeConfigSchema = z18.object({
15787
- tokens: z18.record(z18.string(), z18.string()),
15788
- typography: z18.object({
15789
- headingFamily: z18.string().optional(),
15790
- bodyFamily: z18.string().optional(),
15791
- headingWeight: z18.number().optional(),
15792
- bodyWeight: z18.number().optional()
17074
+ var themeBridgeConfigSchema = z19.object({
17075
+ tokens: z19.record(z19.string(), z19.string()),
17076
+ typography: z19.object({
17077
+ headingFamily: z19.string().optional(),
17078
+ bodyFamily: z19.string().optional(),
17079
+ headingWeight: z19.number().optional(),
17080
+ bodyWeight: z19.number().optional()
15793
17081
  }).optional(),
15794
- spacing: z18.enum(["comfortable", "standard", "dense"]).optional(),
15795
- corners: z18.enum(["square", "soft", "rounded", "pill"]).optional(),
15796
- shadows: z18.enum(["none", "low", "medium", "high"]).optional(),
15797
- components: z18.object({
15798
- buttons: z18.union([
15799
- z18.boolean(),
15800
- z18.object({
15801
- variants: z18.array(z18.enum(["primary", "secondary", "outline", "ghost"])).optional()
17082
+ spacing: z19.enum(["comfortable", "standard", "dense"]).optional(),
17083
+ corners: z19.enum(["square", "soft", "rounded", "pill"]).optional(),
17084
+ shadows: z19.enum(["none", "low", "medium", "high"]).optional(),
17085
+ components: z19.object({
17086
+ buttons: z19.union([
17087
+ z19.boolean(),
17088
+ z19.object({
17089
+ variants: z19.array(z19.enum(["primary", "secondary", "outline", "ghost"])).optional()
15802
17090
  })
15803
17091
  ]).optional(),
15804
- cards: z18.union([
15805
- z18.boolean(),
15806
- z18.object({
15807
- variants: z18.array(z18.enum(["default", "elevated", "outlined"])).optional()
17092
+ cards: z19.union([
17093
+ z19.boolean(),
17094
+ z19.object({
17095
+ variants: z19.array(z19.enum(["default", "elevated", "outlined"])).optional()
15808
17096
  })
15809
17097
  ]).optional(),
15810
- inputs: z18.boolean().optional()
17098
+ inputs: z19.boolean().optional()
15811
17099
  }).optional(),
15812
- overrides: z18.record(z18.string(), z18.string()).optional()
17100
+ overrides: z19.record(z19.string(), z19.string()).optional()
15813
17101
  }).passthrough();
15814
17102
  var TOKEN_ALIASES = [
15815
17103
  { source: "text", target: "foreground" },